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,OPTPS> Кусочек программы:
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. ... .