Всем, добрый день!
Задача:
На основе имеющегося в SalesTable заказа с типом «Журнал» необходимо создать собственно заказы. Имеем класс extends RunBase, в нем метод run, который и привожу.
На обработку по переменным _days, td, DateBegin и DateEnd не обращайте внимания, суть не в этом.
Проблема:
Алгоритм проходит на ура в 2-хзвенке. В 3-хзвенке тоже, если обрабатываемые «журналы» содержат одну строку, т.е. одну запись в SalesLine, и ОДНУ И ТУ ЖЕ НОМЕНКЛАТУРУ. Но если в «журнале» две и более строки или в следующем журнале ДРУГАЯ НОМЕНКЛАТУРА, то Аксапта выдает ошибку:
«Идентификатор номенклатуры не может быть заменен при наличии складских проводок
Модификации были отменены.»
Причем возникает она после salesLineNew.insert(); на ВТОРОЙ строке или на ПЕРВОЙ с НОВОЙ НОМЕНКЛАТУРОЙ в следующем «журнале», короче: когда меняется номенклатура!
В чем причина ошибки?
К сожалению человека, писавшего этот код нет сейчас в нашей команде. Да и если он откликнется, то, вряд ли сможет помочь, нет у него Аксапты под рукой
PHP код:
public void run()
{
SalesTable salesTable, salesTableNew;
SalesLine salesLine, salesLineNew;
boolean queryRunEmpty = true;
QueryBuildDataSource qbd;
Date td;
M039_SalePatternDayOfWeek _sale;
int i;
container _days;
DictTable dictTable;
DictField dictField;
SalesIDBase salesIdBase;
;
//добавлем в условие аналитику продавца
qbd = queryRun.query().dataSourceNo(1);
qbd.addRange(fieldId2Ext(fieldnum(SalesTable,dimension),1)).value(division.value());
// info (qbd.toString());
//пробегаем по выборке
while (queryRun.next())
{
queryRunEmpty = false;
salesTable = queryRun.get(tablenum(SalesTable));//преобразуем строку запроса к виду таблицы
_sale = salesTable.M039_SalePatternDayOfWeek;
_days = connull();
for (i=1; i<=7; i +=1)
{
if (_sale[i])
_days = conins(_days,conLen(_days)+1,i);//заполняем контейнер номерами дней недели из шаблона
}
td = DateBegin.value();
while (td <= DateEnd.value())
{
if (confind(_days,dayofwk(td)))//нашли искомое
{
// info (date2str(td,123,2,2,2,2,4)+" "+int2str(dayofwk(td)));
ttsbegin;
salesTableNew.clear();
//перепишем все поля из шаблона
dictTable = new DictTable(tablenum(SalesTable));
for (i=1;i<=dictTable.fieldCnt();i++)
{
dictField = dictTable.fieldObject(dictTable.fieldCnt2Id(i));
salesTableNew.(dictField.id()) = salesTable.(dictField.id());
}
salesTableNew.initValue();
salesIdBase = NumberSeq::newGetNum(SalesParameters::numRefSalesId()).num();
salesTableNew.salesId = salesIdBase;
salesTableNew.salesType = SalesType::Sales;
for (i=1; i<=7; i +=1)
{
salesTableNew.M039_SalePatternDayOfWeek[i] = false;
}
salesTableNew.M039_SalePatternDayOfWeek[dayofwk(td)] = true;
salesTableNew.DeliveryDate = td;
salesTableNew.insert();
// ttscommit;
//перепишем все строки шаблона
while select salesLine where salesLine.SalesId == salesTable.SalesId /*order by LineNum*/
{
// ttsbegin;
SalesLineNew.clear();
//перепишем все поля из строк шаблона
dictTable = new DictTable(tablenum(SalesLine));
for (i=1;i<=dictTable.fieldCnt();i++)
{
dictField = dictTable.fieldObject(dictTable.fieldCnt2Id(i));
salesLineNew.(dictField.id()) = salesLine.(dictField.id());
}
salesLineNew.initValue();
salesLineNew.initFromSalesTable(salesTableNew);
salesLineNew.M039_PatternQty = salesLine.SalesQty;
// salesLineNew.salesId = salesIdBase;
// info (salesIdBase);
salesLineNew.insert();
// ttscommit;
}
ttscommit;
}
td = td + 1;
}
}
if (queryRunEmpty)
{
info ("Неправильно заданы условия выбора шаблона по созданию заказов. Шаблон не найден.");
}
}