AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.03.2003, 11:23   #1  
SlavaShevtsov is offline
SlavaShevtsov
Участник
 
9 / 10 (1) +
Регистрация: 25.02.2003
Трюки программирования (A->B->A)
В Codeunit 12404 есть такой фрагмент:

LOCAL PROCEDURE CheckTransaction@6();
BEGIN
{
Уничтожаются все записи во временной таблице "Фин. Корресп. Буфер Учета" [12402], для которых поля "Фин. Книга Сумма" и "Фин. Корресп. Сумма" не равны. Если были потерты все записи, то выход.
}
WITH DoubleEntryBufferTemp DO BEGIN
IF NOT FIND('-') THEN
EXIT;
REPEAT
IF "G/L Amount" = "G/L Corresp. Amount" THEN
DELETE;
UNTIL NEXT = 0;
IF NOT FIND('-') THEN
EXIT;
END;

// А вот что это за цирк:

WITH DoubleEntryBuffer DO BEGIN
LOCKTABLE();
REPEAT
DoubleEntryBuffer := DoubleEntryBufferTemp;
IF FIND THEN
DELETE;
DoubleEntryBuffer := DoubleEntryBufferTemp;
INSERT;
UNTIL DoubleEntryBufferTemp.NEXT = 0;
END;
END;

Кажется, что запись копируется, запись стирается и на ее место вставляется только что скопированная запись. Казалось бы, код совершенно лишний. В чём тонкость и что делает этот кусок кода?
Старый 12.03.2003, 12:30   #2  
Grizzly is offline
Grizzly
Участник
 
85 / 10 (1) +
Регистрация: 30.01.2003
Адрес: Омск
> // А вот что это за цирк:

Все очень просто. Таблица 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 уже существует просто обновлять ее. Но по каким-то причинам разработчики решили сделать именно так.
Старый 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 были различны. Но как я писал выше, это одна и та же таблица. В том-то и непонятка - зачем копировать запись из таблицы в ту же таблицу, попутно удаляя запись-оригинал?
Старый 13.03.2003, 07:48   #4  
Grizzly is offline
Grizzly
Участник
 
85 / 10 (1) +
Регистрация: 30.01.2003
Адрес: Омск
Эти таблицы различны. Они имеют одинаковую структуру, но на этом их сходство заканчивается.

DoubleEntryBuffer - запись, которая ссылается на реально существующую в БД таблицу.

DoubleEntryBufferTemp - запись, которая ссылается на временную таблицу (посморти свойства этой переменной). И изначально, при инициализации переменной, пуста. Ее записи формируются в процедуре UpdateBuffer.
Старый 13.03.2003, 09:18   #5  
SlavaShevtsov is offline
SlavaShevtsov
Участник
 
9 / 10 (1) +
Регистрация: 25.02.2003
Выгрузил код этого Codeunit в текстовый файл. Там, действительно, указано что это временная таблица. Спасибо.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Navisioin 3.7 -> 3.6 Кактус NAV: Администрирование 4 04.12.2006 16:39
Управление складом->Подборы->Корректировка vasiok NAV: Функционал 0 10.03.2005 16:36
Import Consolidation from File <Attain> uk NAV: Программирование 1 26.03.2004 17:13
Товар - > формула расчета прибыли? Timur Kaumov NAV: Функционал 0 22.07.2003 14:37
String->Decimal Кактус NAV: Программирование 8 14.04.2003 11:08

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:22.