| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			Трюки программирования (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; Кажется, что запись копируется, запись стирается и на ее место вставляется только что скопированная запись. Казалось бы, код совершенно лишний. В чём тонкость и что делает этот кусок кода?  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			> // А вот что это за цирк: 
		
		
		
		
		
		
		
	Все очень просто. Таблица 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 уже существует просто обновлять ее. Но по каким-то причинам разработчики решили сделать именно так.  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Изначально опубликовано 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 уже существует просто обновлять ее. Но по каким-то причинам разработчики решили сделать именно так.  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Эти таблицы различны. Они имеют одинаковую структуру, но на этом их сходство заканчивается. 
		
		
		
		
		
		
		
	DoubleEntryBuffer - запись, которая ссылается на реально существующую в БД таблицу. DoubleEntryBufferTemp - запись, которая ссылается на временную таблицу (посморти свойства этой переменной). И изначально, при инициализации переменной, пуста. Ее записи формируются в процедуре UpdateBuffer.  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Выгрузил код этого Codeunit в текстовый файл. Там, действительно, указано что это временная таблица. Спасибо.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
	
	 | 
	
			 
			Похожие темы
		 | 
	||||
| Тема | Ответов | |||
| Navisioin 3.7 -> 3.6 | 4 | |||
| Управление складом->Подборы->Корректировка | 0 | |||
| Import Consolidation from File <Attain> | 1 | |||
| Товар - > формула расчета прибыли? | 0 | |||
| String->Decimal | 8 | |||
		
  |