Не вдаваясь в составной индекс нескольких полей в VFP, я бы посоветовал как минимум, ваша таблица l_itran имеет индекс только для поля it_dtedelv.Может быть составным, но это выглядит как составная строка и dtot () для процессов дат и других полей.
Далее, VFP не может оптимизировать запрос по датам, если вы запускаете функцию в другой месяц /части года.Вместо этого создайте две переменные, которые попадают в начало текущего месяца, а затем в начало следующего месяца.Например: 1 февраля 2019 года и 1 марта 2019 года. Таким образом, вы можете получить все БОЛЬШЕ ИЛИ РАВНО до 1 февраля, но МЕНЬШЕ, чем 1 марта, что включает последний день февраля до 23:59:59, если в поле даты указановключает в себя время.
Кроме того, вам не нужно вкладывать запросы, запрашивая все записи, а затем суммируя результаты.Это должно быть выполнимо в течение одного, как я имею ниже.Последнее замечание / вопрос к вам.Почему у вас есть левое соединение с таблицей заголовков для транзакций.Я думаю, что ВСЕГДА должен быть заголовок, но это только я.
fromDate = TTOD( DATETIME()) - DAY( DATETIME()) + 1
toDate = GOMONTH(x,1)
SELECT ;
iH.ih_terrtry Terr,;
Sum(it.it_exvat) / 100 AS orderTotal, ;
Sum(it.it_cost * it.it_qtydelv) / 1000 AS orderCost;
FROM;
l_itran it ;
LEFT OUTER JOIN l_ihead ih ;
ON it.it_doc = ih.ih_doc ;
WHERE;
it.it_dtedelv >= fromDate;
AND it.it_dtedelv < toDate ;
AND it.it_status = 'X' ;
GROUP BY ;
iH.ih_terrtry