Не прекращайте учебу с
LOKAD TV
table
и extend
, которые представлены следующим образом:
table T = extend.range(Orders.42)Здесь важно не путать ключевое слово
table
с типом файла, как в show table
. После этого таблицу T
можно использовать в сценарии, как любую таблицу, загруженную из файла.
show table "Number of lines" with sum(T.1)
extend.range()
: для каждой строки исходной таблицы создается и нумеруется N строк. Расширение диапазона необходимо использовать, когда нужно вставить в таблицу новые строки.table T = extend.range(Orders.K) T.Quantity = Orders.Quantity // косвенная проекция show table "Line numbers" with T.N, T.QuantityАргумент должен быть целым числом, которое может различаться в разных строках исходной таблицы. Это позволяет контролировать количество добавляемых строк.
T
вводится как расширение таблицы, изначально заданной как аргумент. Таким образом, как видно из строки 2 выше, простые связи между таблицами работают, потому что все строки в T
привязаны к соответствующим строкам в Orders
. Поле T.N
заполнено по умолчанию, и в нем показан номер строки. Первое значение в этом поле — 1, и все последующие значения увеличиваются на 1.extend.range()
может создавать очень большое количество строк. Во-первых, создание очень больших таблиц отнимает много времени, во-вторых, данная операция может быть невыполнима из-за ограничений вашей учетной записи Lokad. На практике, если K
превышает среднее значение более чем на 10 единиц, то лучше не использовать функцию extend.range()
.read "/sample" all expect Grid[*] table G = extend.range(Grid.Min == 0 ? 2 : 1) G.Min = Grid.Min // привязка 'G' к 'Grid' G.Max = Grid.Max G.Probability = Grid.Probability G.Probability = 0 where G.N == 2 show table "My Grid" with Id, G.Probability, G.Min, G.Max
extend.distrib()
преобразует вектор распределения в таблицу, как показано в следующем сценарии:
table T = extend.distrib(D) show table "Distribution details" with Id, T.Min, T.Max, T.ProbabilityАргумент
D
должен представлять собой обычный вектор распределения, создаваемый системой вероятностного прогнозирования Lokad. Таблица T
вводится как расширение оригинальных таблиц — скрытой таблицы Items
в сценарии выше. Таблица T
заполняется тремя полями:T.Min
: нижняя граница сегмента, выраженная целым числом и включающая егоT.Max
: верхняя граница сегмента, выраженная целым числом и включающая егоT.Probability
: сумма распределения по диапазону с включением крайних значенийProbability
отражает сумму распределений по возвращенному диапазону.T.Min == T.Max
. Тем не менее, если распределение идет по более высоким значениям, то использование сегментов длиной в 1 приведет к созданию миллионов строк, обработка которых нецелесообразна. Именно поэтому при работе с такими случаями распределения Envision автоматически объединяет значения по более крупным сегментам. Алгоритмы прописаны таким образом, чтобы размеры таблиц оставались в разумных пределах.extend.distrib()
всегда выделяет нулевой сегмент. Как следствие, сегмент [0;0] всегда получает отдельную строку в созданной таблице. Это полезно во многих ситуациях, связанных с бизнесом, когда нулевой спрос является крайним случаем (как и безграничное покрытие запасами), для которого требуется отдельный алгоритм.extend.distrib()
, чтобы лучше контролировать детализацию созданной таблицы.table T = extend.distrib(D, S)Первый аргумент
D
был описан выше. Второй аргумент S
должен представлять собой целое число. При наличии второго аргумента создаваемая таблица всегда будет включать две строки, предназначенные для двух сегментов [0;0] и [1;S]. Остальные сегменты создаются автоматически, начиная с S+1, как описано выше. Значение по умолчанию для данного аргумента, если он не указан, равно нулю.S
часто задается как сумма наличных запасов и заказанных товаров. При размещении заказов нужно рассматривать вероятности возникновения только таких уровней спроса, которые превышают текущий уровень запасов.table T = extend.distrib(D, S, M)Аргументы
D
и S
были описаны выше. Третий аргумент M
должен представлять собой целое число. Он отражает желаемую длину сегмента. Таким образом, таблица включает в себя список сегментов [0;0], [1;S], [S+1;S+M] [S+M+1;S+2M] и т. д. Если аргумент M
равен нулю, то функция автоматически выбирает размер сегментов.M
. Использование кратных значений обеспечивает стабильную работу алгоритма коэффициента заказа. При этом число создаваемых строк ограничено до разумных пределов.M
на ноль для всех наименований с определенными коэффициентами заказа.table T = extend.distrib(D, S, M, R)Аргументы
D
, S
и M
были описаны выше. Четвертый аргумент R
должен представлять собой неотрицательное целое число. Он представляет собой искомое максимальное значение, которого можно достичь с помощью решетки. Иначе говоря, есть строка, где значение T.Max
больше или равно R
. Значение по умолчанию для данного аргумента, если он не указан, равно нулю.R
должно быть как можно меньшим. Малое значение R
не мешает таблице T
достигать более высоких значений, а лишь обеспечивает получение большего количества значений.extend.billOfMaterials()
предназначена как раз для таких ситуаций:
table T = extend.billOfMaterials( Item: J.Id Part: B.PartId Quantity: B.Quantity DemandId: O.OrderId DemandValue: O.Quantity) T.DemandDate by T.DemandId = same(O.Date) by O.OrderId // показывает, как получить дату show table "Details" with Id, T.DemandDate, T.QuantityВы должны получить три таблицы:
J
, B
и O
. Таблица J
обычно представляет собой таблицу наименований, однако это необязательное требование. Таблица B
— это таблица спецификации, и она должна быть расширением таблицы J
, то есть типа (Id, *)
, если J
является таблицей наименований. Таблица O
должна отражать историю спроса, обычно она привязана к таблице заказов. Таблица O
также должна быть расширением таблицы J
.J
со всеми соответствующими привязками. Таблица T
содержит два поля, которые уже заполнены:
T.DemandId
— позволяет в таблице T
найти исходные строки из таблицы O
.T.Quantity
— значения берутся из таблицы спецификации.T
. Это можно сделать с помощью оператора left-by, как показано в строке под блоком billOfMaterials()
в примере выше.extend.billOfMaterials()
поддерживает рекурсивную сборку, то есть наименование может появляться в таблице B
и как компонент, и как набор. Функция выдает ошибку, если в таблице спецификации обнаруживаются циклические зависимости.Quantity
представляет собой количество единиц B.PartId
, которые участвуют в продаже или обслуживании набора, указанного в J.Id
.