Хорошо, вот метод старой школы с двойным проходом, который работает хорошо и должен хорошо масштабироваться (я однажды использовал этот подход против многомиллионной базы данных записей, это заняло время, но дало точные результаты).
- Скачать и установить Turbo Power
SysTools - двигатель сортировки
работает очень хорошо для этого процесса.
- создать сортировку с фиксированной записью
номера телефона, который вы будете использовать
это сортировать.
- Зацикливайте свои записи, в каждом заказе добавляйте
номер телефона для сортировки.
- Как только первая итерация завершена, начните
выскакивают телефонные номера из
сортировать, увеличивать счетчик, если
номер телефона такой же, как последний
один читать, в противном случае сообщить
номер и очистить счетчик.
Этот процесс также можно выполнить с любой базой данных SQL, но мой опыт показывает, что метод сортировки быстрее, чем управление временной таблицей, и выдает те же результаты.
РЕДАКТИРОВАТЬ - Вы заявили, что это база данных BTrieve, почему бы просто не создать ключ по номеру телефона, отсортировать по этому ключу, а затем применить шаг 4 к этой таблице (следующий вместо всплывающего окна) , В любом случае вам нужно будет коснуться каждой записи в вашей базе данных для подсчета, индекс / сортировка просто облегчит процесс принятия решения.
Например, предположим, что у вас есть две таблицы, одна таблица покупателя, где будут храниться результаты, а другая таблица заказов. Сортировать оба по одному номеру телефона. Затем наведите курсор вверху обоих списков и примените следующий псевдокод:
Count := 0;
While (CustomerTable <> eof) and (OrderTable <> eof) do
begin
comp = comparetext( customer.phone, order.phone );
while (comp = 0) and (not orderTable eof) do
begin
inc( Count );
order.next;
comp = comparetext( customer.phone, order.phone );
end;
if comp < 0 then
begin
Customer.TotalCount = count;
save customer;
count := 0;
Customer.next;
end
else if (Comp > 0) and (not OrderTable EOF) then
begin
Order.Next; // order no customer
end;
end;
// handle case where end of orders reached
if (OrdersTable EOF) and (not CustomersTable EOF) then
begin
Customer.TotalCount = count;
save customer;
end;
Преимущество этого кода состоит в том, что он выполняет оба списка один раз. Нет необходимости в поиске, так как оба списка отсортированы одинаково, их можно перемещать сверху вниз, предпринимая действия только при необходимости. Единственное требование состоит в том, что оба списка имеют что-то общее (в этом примере номер телефона), и оба списка могут быть отсортированы.
Я не справился со случаем, когда есть заказ и нет покупателя. Я предполагал, что заказы не существуют без клиентов и будут пропущены для подсчета.