SET()

PS> Здравствуйте, люди!
PS> Хочу выбрать из большого файла записи со значением полей: code_doc=8 и
PS> gBegDate<=data_last и data_last<=gEndDate. Чтобы не просматривать весь файл,
PS> я решил создать ключ из code_doc и data_last, потом установить режим прохода
PS> по файлу по этому ключу и прыгнуть на первую запись, у которой нужный
PS> code_doc (8). Как это сделать? Насколько я понял, с помощью оператора SET().

PS>   Строчка из описания файла:
PS> code_date_key KEY(MOV:code_doc,MOV:data_last),DUP,NOCASE,OPT

PS>   Кусочек программы:
PS>   OPEN(moving)
PS>   MOV:code_date_key=8
PS>   SET(MOV:code_date_key, < ? > )
PS>   LOOP UNTIL EOF(moving) OR (MOV:code_date_key<>8)
PS>      NEXT(moving)
PS>      ….
PS>   END
PS>   Что здесь неправильно и что должно стоять в качестве второго параметра
PS> SET? Надо ли присваивать что-то MOV:data_last ? Ну тогда уж минимальное
PS> возможное значение, т.к. меня интересуют все даты с этим code_doc. А какое
PS> оно?

Практически на все вопросы данного письма коллеги уже дали ответы. Но, кажется, остался один вопрос без ответа — см. последний абзац. Для присвоения какой-либо переменной наименьшего, возможного для данного типа, значения достаточно выполнить:

 Clear(Var,-1)

Для присвоения максимального возможного значения:

 Clear(Var,1).

Таким образом, если тебя интересуют ВСЕ записи с заданным кодом MOV:Code_Doc (независимо от остальных полей ключа):

Clear(MOV:Record,-1)
MOV:Code_Doc = 8
SET(MOV:Code_Date_Key,MOV:Code_Date_Key)
Loop
  Next(Moving); if ErrorCode() then Break.
  ...
.

Если интересуют записи с заданным кодом, ДО конкретной даты:

Clear(MOV:Record,-1)
! Применительно к полю типа DATE, здесь можно было бы
! использовать и просто Clear(MOV:Record).
! Но использование Clear(MOV:Record,-1) более универсально.
MOV:Code_Doc = 8
SET(MOV:Code_Date_Key,MOV:Code_Date_Key)
Loop
  Next(Moving); if ErrorCode() then Break.
  if MOV:Data_Last > gEndDate then Break.
  ...
.

Если интересуют записи с заданным кодом, ОТ конкретной даты и до конца:

Clear(MOV:Record,-1)
! В данном случае можно было-бы и не использовать Clear()
! так как для обоих ключевых полей идет прямое присваивание.
! Но, так - более универсально.
MOV:Code_Doc = 8
MOV:Data_Last = gBegDate
SET(MOV:Code_Date_Key,MOV:Code_Date_Key)
Loop
  Next(Moving); if ErrorCode() then Break.
  ...
.

Ну, и в конце — выборка с последней записи заданного интервала:

Clear(MOV:Record,1)          ! заметь - не (-1) а (+1)
MOV:Code_Doc = 8
SET(MOV:Code_Date_Key,MOV:Code_Date_Key)
Loop
  Previous(Moving); if ErrorCode() then Break.
  ...
.