Я пытаюсь соответствовать порядку сортировки фрагмента кода. Поля и сравнения в следующих двух операциях FOR EACH одинаковы, за исключением того, что Item.PID запрашивает определенное значение в одном запросе, а Item.Bill запрашивает определенное значение в другом. Однако два запроса возвращают записи в другом порядке.Два разных цикла FOR EACH (BREAK BY with JOIN) дают неожиданные результаты?
Основной индекс для таблицы товаров - Comp, PID, ItemID, IndNum. Основным уникальным индексом для таблицы пациентов является идентификатор PatID - Comp, ID.
FOR EACH Item
WHERE Item.Comp = 1
AND Item.Bill > 0
AND Item.PID = 123
AND Item.Store <> ?
AND Item.SecNum > 0
AND Item.TerNum <> ?
AND Item.Desc <> ?
AND Item.Date <> ?
AND Item.Code <> ""
AND Item.Type = "P"
AND Item.BillDate = 09/14/2016
AND Item.Method = "P"
NO-LOCK,
FIRST Patient USE-INDEX PatID
WHERE Patient.Comp = Item.Comp
AND Patient.ID = Item.PID
NO-LOCK
BREAK BY Item.Comp
BY Item.Bill
BY Patient.LName
BY Patient.FName
BY Item.PID
BY Item.Store
BY Item.SecNum
BY Item.TerNum
BY Item.Desc
BY Item.Date
BY Item.Code:
DISPLAY Amt.
END.
FOR EACH Item
WHERE Item.Comp = 1
AND Item.Bill = 456
AND Item.PID > 0
AND Item.Store <> ?
AND Item.SecNum > 0
AND Item.TerNum <> ?
AND Item.Desc <> ?
AND Item.Date <> ?
AND Item.Code <> ""
AND Item.Type = "P"
AND Item.BillDate = 09/14/2016
AND Item.Method = "P"
NO-LOCK,
FIRST Patient USE-INDEX PatID
WHERE Patient.Comp = Item.Comp
AND Patient.ID = Item.PID
NO-LOCK
BREAK BY Item.Comp
BY Item.Bill
BY Patient.LName
BY Patient.FName
BY Item.PID
BY Item.Store
BY Item.SecNum
BY Item.TerNum
BY Item.Desc
BY Item.Date
BY Item.Code:
DISPLAY Amt.
END.
Первый запрос возвращает четыре записи, в которых значение в поле Item.Amt находится в следующем порядке:
827, 1124, 300, 102.
второй возвращает четыре записи, в которых значение в поле Item.Amt находится в порядок:
827, 1124, 102, 300.
Удаление Patient.LName из второго запроса разберет спички рода первого запроса, но, очевидно, не будет правильно сортировать мои результаты (для нескольких пациентов). Я просто подумал, что это может быть проблема.
Редактировать - указано поле 'Amt' принадлежит к таблице 'Item'. Добавлен индекс для таблицы «Пациент».
Вы уверены, что используете один и тот же набор результатов для обоих запросов? Я не знаю, как бы я это знал - я вижу одно значение поля, которое может быть из множества разных исходных записей для всего, что я знаю. В частности, мне было бы интересно узнать, что вы получаете, когда добавляете patient.LName в инструкцию DISPLAY. На самом деле было бы интересно увидеть ВСЕ возвращаемые поля DISPLAYed. –