Показать сообщение отдельно
Старый 12.03.2003, 19:12   #3  
SlavaShevtsov is offline
SlavaShevtsov
Участник
 
9 / 10 (1) +
Регистрация: 25.02.2003
Цитата:
Изначально опубликовано Grizzly
> // А вот что это за цирк:

Все очень просто. Таблица DoubleEntryBuffer обновляется записями из DoubleEntryBufferTemp. Если в DoubleEntryBuffer есть запись одноименная с DoubleEntryBufferTemp, то она обновляет, иначе создается новая.

> WITH DoubleEntryBuffer DO BEGIN
> LOCKTABLE();
> REPEAT

Если находим в таблице DoubleEntryBuffer запись, у которой значение первичного ключа совпадает со значением первичного ключа текущей записи в DoubleEntryBufferTemp, то удаляем ее.

> DoubleEntryBuffer := DoubleEntryBufferTemp;
> IF FIND THEN
> DELETE;

Добавляем в DoubleEntryBuffer текущую запись из DoubleEntryBufferTemp.

> DoubleEntryBuffer := DoubleEntryBufferTemp;
> INSERT;
> UNTIL DoubleEntryBufferTemp.NEXT = 0;
> END;
> END;

Конечно, можно было бы, если запись в DoubleEntryBuffer с таким же значением первичного ключа как и у текущей записи в DoubleEntryBufferTemp уже существует просто обновлять ее. Но по каким-то причинам разработчики решили сделать именно так.
Это было бы так, если бы таблицы DoubleEntryBuffer и DoubleEntryBufferTemp были различны. Но как я писал выше, это одна и та же таблица. В том-то и непонятка - зачем копировать запись из таблицы в ту же таблицу, попутно удаляя запись-оригинал?