VK Video
Зачем нужно пересчитывать строки?
Что бы обновить в них данные. Например:
У вас две таблицы привязанные к третей — стартовой. Все это простые таблицы.
Привязаны через указание в поле key
в ведомых id
строки из ведущей.
Эти ведомые таблицы берут какие-то данные кодами из стартовой.
Если м изменим что-то в ведущей таблице — данные в строках ведомых не обновятся пока мы их не пересчитаем:
a1=: recalculate(table: 'slave_1'; where: 'key' = #id)
a2=: recalculate(table: 'slave_2'; where: 'key' = #id)
Почему при пересчете данных в расчетной таблице она будет пересчитана вся независимо от where?
Она всегда рассчитывается целиком, поэтому расчетные таблицы можно пересчитывать так:
=: recalculate(table: 'table')
Как пересчитать только хэдер простой таблицы?
Так же как и расчетную таблицу, без указания where
:
=: recalculate(table: 'table')
Как пересчитать все строки в простой таблице?
Все строки у который id
неравен 0
:
=: recalculate(table: 'table'; where: 'id' != 0)
Как пересчитать строки и заново выполнить поля с кодами только при добавлении?
Если у кодов стоит исполнять только при добавлении, то при пересчете они не будут выполнять код заново.
Например это нужно если вы добавляете товар в заказ и берете ео цену кодом из прайса и эта цена должна остаться неизменной в этом заказе навсегда.
Но иногда требуется сделать так, что бы такие коды выполнились повторно.
В этом случае используется параметр field
функции recalculate
— он сообщает, что код в поле должен быть выполнен при этом пересчете, даже если он только при добавлении
.
=: recalculate(table: 'table'; where: 'id' = $#nfv; field: 'code_only_on_add_field_1'; field: 'code_only_on_add_field_1')
Зачем функция recalculate работает из кода?
Да — функция recalculate работает из кода, несмотря на то, что это функция действия. Сделано это для того, чтобы в очень редких случаях пересчитать таблицу-источник перед тем, как брать из нее данные:
=: while(action: $rec; action: $select)
rec: recalculate(table: 'table'; where: 'id' = $#nfv)
select: select(table: 'table'; field: 'field'; where: 'id' = $#nfv)
while тоже работает в коде и в качестве значения возвращает последний action
или postaction
.