ASSIGN — различия между версиями

Материал из GB wiki
Перейти к: навигация, поиск
 
Строка 26: Строка 26:
 
<br/>Assign( `DataSet.Heap.xxx`, 1 ) &ndash; изменит хиповое поле
 
<br/>Assign( `DataSet.Heap.xxx`, 1 ) &ndash; изменит хиповое поле
 
<br/>Assign( `launchform:HeapSet.@FullName`, HeapSet.FullName ) &ndash; изменит поле родительской формы
 
<br/>Assign( `launchform:HeapSet.@FullName`, HeapSet.FullName ) &ndash; изменит поле родительской формы
 +
 +
В целях оптимизации перед записью нового значения оно вначале сравнивается с прежним, а запись производится только при их неравенстве. При этой проверке старое значение приводится к типу нового значения.
 +
<br/>Пример. Нужно преобразовать значения "01", "02" и т.п. в строковом поле Type в значения без ведущих нулей. Если использовать функцию так:
 +
Assign( `*dsDocs.Type`, `StrToFloat( Type )` )
 +
то запись изменённых значений не произойдёт, поскольку при проверке старое значение будет приведено к типу нового значения, т.е. "01" -> 1, после чего будет сравнение с новым значением (1=1) и, поскольку равенство выполнится, записи не будет.
 +
<br/>Чтобы произвести запись, нужно для нового значения принудительно указать тип старого значения, тогда будет сравнение значений с одинаковым типом, т.е. в примере строки со строкой "01"<>"1":
 +
Assign( `*dsDocs.Type`, `""+StrToFloat( Type )` )
 
}}
 
}}

Текущая версия на 13:18, 27 февраля 2025

Изменяет одно поле текущей записи датасета.

Синтаксис

ASSIGN (Датасет и поле, Значение)

Аргументы

Датасет и поле
строка, которая состоит из имени одного из датасетов электронной или печатной формы и имени поля этого датасета, разделенных точкой.
Можно указать через ";" сразу несколько полей данного датасета: датасет.поле1;поле2;поле3;...

Особыe режимы:

  • Если перед именем датасета указан символ "*", то поле изменяется во всех записях датасета. В этом случае второй аргумент - всегда выражение, потому записывается в кавычках.
  • Если вместо имени поля указан символ "*", то изменятся все данные датасета. В этом случае значением должны быть данные другого датасета, либо 1/0 (тогда датасет будет закрыт).
  • Имя поля может иметь вид Heap.XXX, в этом случае модифицируется одна строка поля Heap
  • Префикс EMBEDDED:Имя_контейнера: означает, что датасет нужно искать в форме, внедренной в указанный контейнер
  • Префикс EMBEDDING: означает, что датасет нужно искать в форме, в которую внедрена текущая форма
  • Префикс LAUNCHFORM: означает, что датасет нужно искать в форме, с которой запущена текущая форма
Значение
значение произвольного типа данных для записи в поле. Если изменяется сразу несколько полей датасета, то их значения перечисляются через ",".
В режиме изменения всех записей датасета – строка с формулой.

Тип результата

Нет

Примеры

Assign( `Goodies.Price`, 1 ) – изменит текущую запись
Assign( `Dataset.Document;Articul;Certificate;BarCode`, :Id, :Art, :Cert, :BC ) – изменит сразу несколько полей
Assign( `*Goodies.Price`, `Price*2` ) – изменит все записи (удвоит цену)
Assign( `*dsGds.Qty;New`, `1,0` ) – инициализация двух полей во всех записях датасета (в данном случае значения полей - это выражение, поэтому записываются в кавычках)
Assign( `*dsLines.Name;Note`, `'Имя','Комментарий'` ) – то же самое с текстовыми значениями
Assign( `*ds.f1;f2;f3`, `IIF( f1=11,f1*5,f1),0,IIF( f1=55,'b',f3 )` ) – то же самое с выражениями для каждого поля (вычисление значений полей производится в порядке их следования)
Assign( `DataSet.Heap.xxx`, 1 ) – изменит хиповое поле
Assign( `launchform:HeapSet.@FullName`, HeapSet.FullName ) – изменит поле родительской формы

В целях оптимизации перед записью нового значения оно вначале сравнивается с прежним, а запись производится только при их неравенстве. При этой проверке старое значение приводится к типу нового значения.
Пример. Нужно преобразовать значения "01", "02" и т.п. в строковом поле Type в значения без ведущих нулей. Если использовать функцию так:

Assign( `*dsDocs.Type`, `StrToFloat( Type )` )

то запись изменённых значений не произойдёт, поскольку при проверке старое значение будет приведено к типу нового значения, т.е. "01" -> 1, после чего будет сравнение с новым значением (1=1) и, поскольку равенство выполнится, записи не будет.
Чтобы произвести запись, нужно для нового значения принудительно указать тип старого значения, тогда будет сравнение значений с одинаковым типом, т.е. в примере строки со строкой "01"<>"1":

Assign( `*dsDocs.Type`, `""+StrToFloat( Type )` )