Вот вам пример рабочего кода (Аксапта 3.0 SP 2.0), выполняющего импорт в журнал инвентаризации строк из внешнего (текстового) файла:
PHP код:
// Created on 22 Ноя 2004 at 12:22:09 by Dozer
void importInventoryQty()
{
AsciiIO io = new AsciiIO( Path + "invent.dat", "R" ); // открываем файл для чтения
InventJournalTrans _inventJTrans, newtrans, _temp; // строки номенклатур
// InventJournalTable _inventJTable; // типа журналы тут все
WMSPallet _wmsPallet;
WMSLocation _wmsLocation;
InventLocation _invLocation;
JournalTransMap journalTrans_orig, journalTrans;
FormDataSource journalTrans_ds,
journalTable_ds,
inventDim_ds;
InventColor _inventColor;
Args _args;
Barcode barcode;
container barCont;
ItemBarcode itemBarcode;
Object InventTrans_ds,
_transFormCaller,
_tableFormCaller;
//FormRun
container cnt;
ItemId ItemId;
TmpItemQty ItemQty;
InventQty QtyToLoad, delta;
int linenum;
real qty;
boolean _isAllLinesPassed = false,
_isError = false,
_isErrorRet = true;
JournalTableData journalTableData;
JournalTransData journalTransData;
InventJournalFormTable _inventJFTable;
Dialog _dBox = new Dialog('Выбор инвентаризационной единицы.');
DialogField _fldInvLoc = _dBox.addField( typeId( inventLocationId ), 'Склад', 'Укажите склад для инвенторизации' );
DialogField _fldWMSLoc = _dBox.addField( typeId( wMSLocationId ), 'Ячейка', 'Укажите ячейку для инвенторизации' );
DialogField _fldPallet = _dBox.addField( typeId( wMSPalletId ), 'Палета', 'Укажите палету для инвентаризации' );
InventDim dim, newDim;
InventDimID dimID;
;
if ( _dBox.run() )
if ( _fldPallet.value() )
{
select _wmsPallet where _wmsPallet.wMSPalletId == _fldPallet.value();
if ( !_fldWMSLoc.value() ) select _wmsLocation where _wmsLocation.wMSLocationId == _wmsPallet.wMSLocationId;
else select _wmsLocation where _wmsLocation.wMSLocationId == _fldWMSLoc.value();
if ( !_fldInvLoc.value() ) select _invLocation where _invLocation.InventLocationId == _wmsPallet.inventLocationId;
else select _invLocation where _invLocation.InventLocationId == _fldInvLoc.value();
}
else if ( _fldWMSLoc.value() && _fldInvLoc.value() )
{
select _wmsLocation where _wmsLocation.wMSLocationId == _fldWMSLoc.value();
select _invLocation where _invLocation.InventLocationId == _fldInvLoc.value();
} else if ( _fldInvLoc.value() )
{
select _invLocation where _invLocation.InventLocationId == _fldInvLoc.value();
}
else throw error( 'Вы должны что нибудь выбрать!' );
else return;
// init
_temp = args.record();
if (!_temp.JournalId) throw error ( 'Не выбран журнал инвентаризации!' );
_transFormCaller = args.caller();
_args = _transFormCaller.args();
_tableFormCaller = _args.caller();
InventTrans_ds = _temp.dataSource();
_inventJFTable = _tableFormCaller.journalForm();
journalTableData = _inventJFTable.JournalTableData();
journalTable_ds = _inventJFTable.journalTable_DS();
// Закачиваем данные из файла
io.inFieldDelimiter( "," );
ttsbegin;
while ( true )
{
cnt = io.read();
if ( io.status() != IO_Status::Ok )
break;
ItemId = conpeek( cnt, 2 );
qty = str2num( conpeek( cnt, 6 ) );
ItemQty.ItemId = ItemId;
ItemQty.Qty = qty;
itemBarcode = conpeek( cnt, 1 ); // Dozer добавочка
info( ItemId );
info( itemBarcode );
barcode = Barcode::constructByUniqueStr( itemBarcode );
barCont = barcode.findInventItem();
dimID = conPeek( barCont, 4 );
ItemQty.InventDimID = dimID;
ItemQty.insert();
}
ttscommit;
// Сворачиваем всю эту фигню и начинаем умопомрачительный процесс загрузки данных
ttsbegin;
select maxof( lineNum ) from _inventJTrans where _inventJTrans.journalId == _temp.journalId;
lineNum = _inventJTrans.lineNum + 1;
// сюда вставляем всякие дефолты для новой строки
while select InventDimID, sum( Qty ) from ItemQty group by InventDimID, ItemId
{
QtyToLoad = ItemQty.Qty;
_isAllLinesPassed = false;
newDim.clear();
newDim = InventDim::find( ItemQty.InventDimID );
// если такой номенклатуры нету, то добавляем строку
if ( _wmsPallet )
{
select _inventJTrans where _inventJTrans.journalId == _temp.journalId &&
_inventJTrans.itemId == ItemQty.ItemId
exists Join dim where dim.inventDimId == _inventJTrans.InventDimId &&
dim.wMSPalletId == _wmsPallet.wMSPalletId &&
dim.InventColorId == newDim.InventColorId &&
dim.InventSizeId == newDim.InventSizeId &&
dim.configId == newDim.configId;
} else if ( _wmsLocation && _invLocation )
{
select _inventJTrans where _inventJTrans.journalId == _temp.journalId &&
_inventJTrans.itemId == ItemQty.ItemId
exists Join dim where dim.inventDimId == _inventJTrans.InventDimId &&
dim.wMSLocationId == _wmsLocation.wMSLocationId &&
dim.InventLocationId == _invLocation.InventLocationId &&
dim.InventColorId == newDim.InventColorId &&
dim.InventSizeId == newDim.InventSizeId &&
dim.configId == newDim.configId;
} else if ( _invLocation )
{
select _inventJTrans where _inventJTrans.journalId == _temp.journalId &&
_inventJTrans.itemId == ItemQty.ItemId
exists Join dim where dim.inventDimId == _inventJTrans.InventDimId &&
dim.InventLocationId == _invLocation.InventLocationId &&
dim.InventColorId == newDim.InventColorId &&
dim.InventSizeId == newDim.InventSizeId &&
dim.configId == newDim.configId;
}
else
throw error( "Укажите склад!" );
if ( !_inventJTrans )
{
info( 'Отсутствуют строки по номенклатуре ' + ItemQty.ItemId );
journalTrans = newTrans;
newdim.wMSLocationId = _wmsLocation.wMSLocationId;
newdim.InventLocationId = _invLocation.InventLocationId;
newdim.wMSPalletId = _wmsPallet.wMSPalletId;
// _inventColor = InventColor::find( 'Норма', ItemQty.ItemId );
// newDim.InventColorId = _inventColor.InventColorId;
newDim = InventDim::findOrCreate( newDim );
newtrans.clear();
newtrans.journalId = _temp.JournalId; // ---- mod
newtrans.lineNum = lineNum; // ---- mod
newtrans.JournalType = InventJournalType::Count;
lineNum++;
journalTransData = new JournalTransData( newtrans, journalTableData);
journalTransData.initFromJournalTable();
journalTrans.TransDate = systemDateGet();
journalTransData.initFromJournalTable();
newTrans.initValue();
if (JournalTableData)
{
// journalTrans.transDate = journalTrans_last.recId ? journalTrans_last.transDate : systemdateGet();
if (journalTableData.journalVoucherNum() && journalTableData.journalTable().voucherDraw == JournalVoucherDraw::Entering)
journalTransData.initVoucher(journalTrans.voucher,true);
}
newtrans.InventDimId = newDim.inventDimId;
// конец создания. Дальше модифицируем.
newtrans.itemId = ItemQty.ItemId; // ---- mod
newTrans.inventMovement().JournalSetItemId(newDim);
// newDim.initFromInventTable(newTrans.inventMovement().InventTable());
if (journalTableData.journalVoucherNum() && journalTableData.journalTable().voucherDraw == JournalVoucherDraw::Entering)
journalTransData.initVoucher(journalTrans.voucher,true);
newTrans.ProjLinePropertyId = ProjLinePropertySetup::findLinePropertyId(newTrans.ProjId, newTrans.ProjCategoryId);
newTrans.ProjTaxItemGroupId = ProjParameters::taxItemGroupItem(newTrans.ProjCategoryId,newTrans.ItemId);
newtrans.inventMovement().journalSetInventDimField(newDim);
// ---------- end mod
// validate
if (! journalTrans.RecId && journalTableData.journalVoucherNum() &&
journalTableData.journalVoucherNum().voucherFetched() &&
journalTableData.journalVoucherNum().voucherFetched() != journalTrans.voucher &&
!journalTableData.journalVoucherNum().checkChangeNumber(journalTrans.Voucher))
{
journalTrans.Voucher = journalTableData.journalVoucherNum().voucherFetched();
// journalTrans_ds.refresh();
_isErrorRet = false;
if (InventItemLocation::isCountingStarted(newTrans.ItemId, newDim, newtrans.JournalId))
_isErrorRet = checkFailed(strFmt("@SYS59534", newTrans.itemId, newDim.inventLocationId));
}
if ( !_isErrorRet )
throw error( 'Ошибка при попытке создать новую строку.' );
// end of validate!
// -- а теперь запишем.
newtrans.inventDimId = InventDim::findOrCreate(newDim).inventDimId;
// journalTrans_orig = journalTrans.recId ? journalTrans.orig() : null;
if (journalTableData.journalTable().posted)
throw error("@SYS21497");
if (journalTableData.journalVoucherNum())
{
if (! journalTableData.journalVoucherList().find(journalTrans.voucher))
journalTableData.journalVoucherList().addJournalTransData(journalTransData,journalTrans.voucher != journalTableData.journalVoucherNum().voucherFetched());
}
InventMovement::SetAutoReserving(newtrans);
newtrans.insert(); // -----------------------------------
if (journalTableData.journalVoucherNum())
{
if (journalTrans.voucher)
{
if (journalTrans.voucher == journalTableData.journalVoucherNum().voucherFetched())
journalTableData.journalVoucherNum().used(journalTrans.voucher);
else
journalTableData.journalVoucherNum().reserve(journalTrans.voucher);
}
if (journalTrans.voucher && journalTableData.journalVoucherList().find(journalTrans.voucher))
journalTableData.journalVoucherList().item().addTotal(journalTrans,false);
}
journalTableData.addTotal(journalTrans,false);
// journalFormTable.updateFormCacheCurrent(journalTableData.journalTable(),true);
_inventJFTable.updateFormCacheCurrent(journalTableData.journalTable(),true);
// info( int2str(_inventJTable.NumOfLines) );
// _inventJTable.NumOfLines += 1;
// _inventJTable.update();
// info( int2str(_inventJTable.NumOfLines) );
// _inventJTable.data( journalTableData.journalTable() );
// _inventJTable.update();
// journalTable_ds.setCurrent();
// journalTable_ds.refresh();
// if (newTrans.inventDimId != newDim.inventDimId)
// {
// newDim.data(InventDim::find(newTrans.inventDimId));
// inventDim_ds.setCurrent();
// }
// --- записали...
}
// а теперь разноска количества наменклатуры по строкам
do
{
if ( _wmsPallet )
{
select forupdate _inventJTrans where _inventJTrans.journalId == _temp.journalId &&
_inventJTrans.itemId == ItemQty.ItemId
exists Join dim where dim.inventDimId == _inventJTrans.InventDimId &&
dim.wMSPalletId == _wmsPallet.wMSPalletId &&
dim.InventColorId == newDim.InventColorId &&
dim.InventSizeId == newDim.InventSizeId &&
dim.configId == newDim.configId;
} else if ( _wmsLocation && _invLocation )
{
select forupdate _inventJTrans where _inventJTrans.journalId == _temp.journalId &&
_inventJTrans.itemId == ItemQty.ItemId
exists Join dim where dim.inventDimId == _inventJTrans.InventDimId &&
dim.wMSLocationId == _wmsLocation.wMSLocationId &&
dim.InventLocationId == _invLocation.InventLocationId &&
dim.InventColorId == newDim.InventColorId &&
dim.InventSizeId == newDim.InventSizeId &&
dim.configId == newDim.configId;
} else if ( _invLocation )
{
select forupdate _inventJTrans where _inventJTrans.journalId == _temp.journalId &&
_inventJTrans.itemId == ItemQty.ItemId
exists Join dim where dim.inventDimId == _inventJTrans.InventDimId &&
dim.InventLocationId == _invLocation.InventLocationId &&
dim.InventColorId == newDim.InventColorId &&
dim.InventSizeId == newDim.InventSizeId &&
dim.configId == newDim.configId;
}
else
throw error( "Укажите склад!" );
while ( _inventJTrans )
{
journalTransData = new JournalTransData( _inventJTrans, journalTableData);
journalTrans = _inventJTrans;
dim = InventDim::find( _inventJTrans.InventDimId );
if ( _inventJTrans.Counted < _inventJTrans.InventOnHand )
{
// Будем добивать эту строку
if ( _inventJTrans.InventOnHand - _inventJTrans.Counted >= QtyToLoad )
delta = QtyToLoad;
else delta = _inventJTrans.InventOnHand - _inventJTrans.Counted;
_inventJTrans.Counted += delta;
// .......................... modif
if (!_inventJTrans.EmplId)
_inventJTrans.EmplId = _inventJTrans.InventJournalTable().EmplId;
_inventJTrans.inventMovement().JournalSetCounted();
// .......................... end modif; start write
_inventJTrans.inventDimId = InventDim::findOrCreate(dim).inventDimId;
journalTrans_orig = journalTrans.recId ? journalTrans.orig() : null;
if (journalTableData.journalTable().posted)
throw error("@SYS21497");
if (journalTableData.journalVoucherNum())
{
if (journalTrans_orig.recId)
{
if (! journalTableData.journalVoucherList().find(journalTrans.voucher))
journalTableData.journalVoucherList().addJournalTransData(journalTransData,true);
if (journalTrans.voucher != journalTrans_orig.voucher && journalTrans_orig.voucher)
{
if (! journalTableData.journalVoucherList().find(journalTrans_orig.voucher))
journalTableData.journalVoucherList().addJournalTransData(journalTransData.newJournalTransDataOrig(journalTrans_orig),true);
}
}
else
{
if (! journalTableData.journalVoucherList().find(journalTrans.voucher))
journalTableData.journalVoucherList().addJournalTransData(journalTransData,journalTrans.voucher != journalTableData.journalVoucherNum().voucherFetched());
}
}
InventMovement::SetAutoReserving(_inventJTrans);
_inventJtrans.update(); // -----------------------------------
if (journalTableData.journalVoucherNum())
{
if (journalTrans.voucher)
{
if (journalTrans.voucher == journalTableData.journalVoucherNum().voucherFetched())
journalTableData.journalVoucherNum().used(journalTrans.voucher);
else
journalTableData.journalVoucherNum().reserve(journalTrans.voucher);
}
if (journalTrans_orig.recId) // update
{
if (journalTrans.voucher != journalTrans_orig.voucher && journalTrans_orig.voucher)
journalTableData.journalVoucherNum().Release(journalTrans_orig.voucher);
if (journalTrans_orig.voucher && journalTableData.journalVoucherList().find(journalTrans_orig.voucher))
journalTableData.journalVoucherList().item().addTotal(journalTrans_orig,true);
}
if (journalTrans.voucher && journalTableData.journalVoucherList().find(journalTrans.voucher))
journalTableData.journalVoucherList().item().addTotal(journalTrans,false);
}
// --------------------------------------
QtyToLoad -= delta;
}
else
{
// в строке уже ровно или перебор,
// соответственно если еще что-то осталось сгрузить, сливаем в нее
if ( QtyToLoad > 0 && _isAllLinesPassed )
{
_inventJTrans.Counted += QtyToLoad;
if (!_inventJTrans.EmplId)
_inventJTrans.EmplId = _inventJTrans.InventJournalTable().EmplId;
_inventJTrans.inventMovement().JournalSetCounted();
// ..........................
_inventJTrans.inventDimId = InventDim::findOrCreate(dim).inventDimId;
journalTrans_orig = journalTrans.recId ? journalTrans.orig() : null;
if (journalTableData.journalTable().posted)
throw error("@SYS21497");
if (journalTableData.journalVoucherNum())
{
if (journalTrans_orig.recId)
{
if (! journalTableData.journalVoucherList().find(journalTrans.voucher))
journalTableData.journalVoucherList().addJournalTransData(journalTransData,true);
if (journalTrans.voucher != journalTrans_orig.voucher && journalTrans_orig.voucher)
{
if (! journalTableData.journalVoucherList().find(journalTrans_orig.voucher))
journalTableData.journalVoucherList().addJournalTransData(journalTransData.newJournalTransDataOrig(journalTrans_orig),true);
}
}
else
{
if (! journalTableData.journalVoucherList().find(journalTrans.voucher))
journalTableData.journalVoucherList().addJournalTransData(journalTransData,journalTrans.voucher != journalTableData.journalVoucherNum().voucherFetched());
}
}
InventMovement::SetAutoReserving(_inventJTrans);
_inventJtrans.update(); // -----------------------------------
if (journalTableData.journalVoucherNum())
{
if (journalTrans.voucher)
{
if (journalTrans.voucher == journalTableData.journalVoucherNum().voucherFetched())
journalTableData.journalVoucherNum().used(journalTrans.voucher);
else
journalTableData.journalVoucherNum().reserve(journalTrans.voucher);
}
if (journalTrans_orig.recId) // update
{
if (journalTrans.voucher != journalTrans_orig.voucher && journalTrans_orig.voucher)
journalTableData.journalVoucherNum().Release(journalTrans_orig.voucher);
if (journalTrans_orig.voucher && journalTableData.journalVoucherList().find(journalTrans_orig.voucher))
journalTableData.journalVoucherList().item().addTotal(journalTrans_orig,true);
}
if (journalTrans.voucher && journalTableData.journalVoucherList().find(journalTrans.voucher))
journalTableData.journalVoucherList().item().addTotal(journalTrans,false);
}
// --------------------------------------
// Кошмар! Если это заработает, значит есть все таки у программеров ангел хранитель...
QtyToLoad = 0;
}
}
_isAllLinesPassed = true;
if ( QtyToLoad <= 0 )
break;
next _inventJTrans;
}
} while ( QtyToLoad != 0 );
}
if ( _isError ) throw error( "Загрузка отменена!" );
ttscommit;
info( "Загрузка закончена успешно." );
// journalTableData.updateBlock(JournalBlockLevel::None, JournalBlockLevel::None);
// _inventJFTable.updateFormCacheCurrent(journalTableData.journalTable(), true);
InventTrans_ds.research();
}