Поиск инвентарной аналитики

Я пытаюсь получить запись inventDim, если она существует, или создать новую в противном случае.

InventDim inventDim;

inventDim.InventLocationId = "220";
inventDim = InventDim::findOrCreate(inventDim);
info(inventDim.inventDimId);

Я уверен, что InventLocationId со значением "220" уже есть, но все равно добавляется новый.

Если я снова запущу приведенные выше строки, я получу последнее созданное значение, так что на этот раз все в порядке.

Проверяя SQL с помощью:

SELECT *
FROM INVENTDIM
WHERE INVENTLOCATIONID = '220'

обе строки возвращаются.

Я могу удалить добавленную строку со следующими строками:

 select forUpdate inventDim 
    where inventDim.inventDimId == 'the new id';
 inventDim.delete(true);

Я не могу понять, что я делаю неправильно здесь..


person Olaru Mircea    schedule 04.01.2016    source источник


Ответы (3)


Таблица InventDim содержит значения складских аналитик. Каждая запись уникальна, так как ни одна запись не имеет точно такой же комбинации измерений.

Это означает, что если вы ищете запись с InventLocationId == "220", может быть много записей, одна с InventColorId == "Red" и одна с InventColorId == "Blue". Вы получите дополнительные комбинации, когда объедините другие измерения, например, у вас могут быть еще две записи, где цвет — синий, местоположение — 220, а InventSizeId — 5 см или 3 см.

Итак, в приведенном выше примере вы принимаете во внимание только одно измерение и игнорируете остальные. Совершенно нормально иметь более одной записи с InventLocationId, установленным на 220, поскольку одно или несколько других измерений запасов будут отличаться.

Если вы имели в виду, что вам нужна запись, в которой все другие измерения пусты, а InventLocationId равен 220, вы должны указать, что другие измерения должны быть пустыми, прежде чем пытаться найти запись.

InventDim          inventDim;
InventDim          inventDimNew;
select inventDim
    where inventDim.InventLocationId == "220"
    && inventDim.ConfigId == ""
    && inventDim.InventSizeId == "";
    //Add more blank dimensions depending on the dimensions active in your system.

buf2Buf(inventDim, inventDimNew);
inventDimNew.inventDimId = '';

info(InventDim::findOrCreate(inventDimNew).inventDimId);
person Tina van der Vyver    schedule 04.01.2016
comment
Спасибо за ваш ответ. Думаю, я понял. В моем случае понадобился InventSiteId. У меня есть вопрос, можете ли вы объяснить необходимость этого метода buf2Buf? - person Olaru Mircea; 05.01.2016
comment
buf2buf(_from, _to) берет два буфера записей одного и того же типа или базового типа, затем перебирает каждое поле из _from и копирует его в _to, если это не поле SYSTEM. Посмотрите на \Classes\Global\buf2Buf источник. - person Alex Kwitny; 05.01.2016

Похоже, вы не совсем понимаете, как работает InventDim, или может возникнуть проблема с кэшированием параметра Все пустые.

Решение состоит в том, чтобы отладить метод \Data Dictionary\Tables\InventDim\Methods\findDim, чтобы увидеть, как он пытается найти измерение, прежде чем принимать решение о его создании.

inventDim.inventLocationId == '220'

отличается от другой записи с двумя заполненными полями:

inventDim.inventLocationId == '220'

inventDim.inventSiteId == '1'

Я видел проблемы с кэшированием с измерением AllBlank. Изучите эти два метода в отладчике, чтобы увидеть, не заметите ли вы каких-либо странностей. Один использует константу AllBlank, а другой использует глобальный кеш объектов.

InventDim::inventDimIdBlank();

InventDim::findOrCreateBlank();

person Alex Kwitny    schedule 04.01.2016

Что касается лицензионных кодов, ключей конфигурации, настройки, модуля и группы продуктов, с которыми вы работаете, у вас могут быть разные активные измерения для двух разных продуктов.

Например, вы можете отслеживать футболки с указанием размера и цвета, а также кепки с указанием цвета и стиля. У вас есть аналогичные вопросы относительно складских аналитик.

В зависимости от продукта вы можете не искать один и тот же набор размеров. Вы найдете хороший пример того, как его использовать в PriceDisc.findPrice().

Таким образом, в вашем случае место изобретения 220, возможно, уже использовалось, и поэтому у вас может быть запись с ним. Но, похоже, он никогда не использовался сам по себе, а с другими размерами (размер, цвет, партия, серия и т. Д.). Перед запуском метода InventDim::findOrCreate() обязательно установите все соответствующие размеры.

person Geoffrey DELMEE    schedule 04.01.2016
comment
Кроме того, никогда не обновляйте и не удаляйте запись inventdim, она управляется системой. Поскольку запись inventdim представляет собой набор измерений, если один и тот же набор используется для разных транзакций с разными продуктами (например, цвет = красный и размер = S), он будет изменен для всех транзакций, ссылающихся на inventtransid. - person Geoffrey DELMEE; 05.01.2016