Показать сообщение отдельно
Старый 24.07.2018, 15:48   #13  
БАХ43 is offline
БАХ43
Участник
 
92 / 54 (2) ++++
Регистрация: 15.02.2013
Адрес: г.Москва, г. Зеленоград
Ну где-то так:
X++:
static void BAH029(Args _args)
{
    InventTrans         inventTrans;
    InventDim           inventDim;
    InventSum           inventSum;
    TmpPalletItemQty    tmpTable;

// считать ячейки для номенклатур из файла

    void importFromFile(FilenameOpen _fileName)
    {
        #avifiles
        #define.ItemIdCol(0)
        #define.WMSLocationIdCol(1)
        #define.FirstRow(1)   //подразумевается, что в табличке есть строка заголовка. Если нет, поставить 0

        CCADOConnection         cn          = new CCADOConnection();
        CCADOCommand            command     = new CCADOCommand();
        CCADORecordSet          recordSet   = new CCADORecordSet();
        ComExcelDocument_RU     comExcel;
        str                     sheetName;
        SysOperationProgress    progressFile;
        counter                 itemCount;
        ;

        comExcel  = new ComExcelDocument_RU();
        comExcel.open(_fileName, false);
        sheetName = comExcel.getActiveSheetName_AC();
        comExcel.closeDocument();
        comExcel.finalize();

        cn.open(strfmt('Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%1;Extended Properties="Excel 12.0;HDR=YES;IMEX=1";', _fileName));
        command.activeConnection(cn);

        command.commandText(strfmt('SELECT count(*) FROM [%1$]', sheetName));
        recordSet   = command.execute();

        progressFile = SysOperationProgress::newGeneral(#aviUpdate,
                    strfmt("Импорт данных из файла %1", _fileName),
                    recordSet.fields().itemIdx(0).value());
        command.commandText(strfmt('SELECT * FROM [%1$]', sheetName));
        recordSet   = command.execute();

        ttsbegin;

        while (!recordSet.EOF())
        {
            progressFile.incCount();
            itemCount++;
            if (itemCount >= #FirstRow)
            {
                tmpTable.clear();
                tmpTable.ItemId           = recordSet.fields().itemIdx(#ItemIdCol).value();
                tmpTable.WMSLocationId    = recordSet.fields().itemIdx(#WMSLocationIdCol).value();
                tmpTable.insert();
                
                progressFile.setText(strfmt("Код %1", tmpTable.ItemId));
            }
            recordSet.moveNext_AC();
        }

        ttscommit;

        cn.close();

        progressFile.kill();

        info(strfmt("Импорт файла завершен. Обработано строк: %1", itemCount));

    }

    importFromFile("D:\\номенклатуры.xlsx");

    ttsbegin;
    while select inventSum
        where inventSum.PhysicalInvent
            && inventSum.ItemId == "Ставка за обработку"    //тест для одной номенклатуры
    {
        while select forupdate inventTrans
            where inventSum.ItemId      == inventTrans.ItemId   &&
                  inventSum.InventDimId == inventTrans.inventDimId
        {
            select firstonly tmpTable
                    where   tmpTable.ItemId         == inventTrans.ItemId;
            if (tmpTable)                   //если номенклатуры не было в файле, то ничего не меняем.
            {
                inventDim = InventDim::find(inventTrans.inventDimId);
                inventDim.wMSLocationId = tmpTable.WMSLocationId;    //считанная из файла ячейка для данной номенклатуры
                inventDim = InventDim::findOrCreate(InventDim);
                inventTrans.inventDimId = inventDim.inventDimId;
                inventTrans.update();       // по умолчанию dropInventOnHand= NoYes::No, значит пересчитает InventSum и нам ее пересчитывать не нужно
            }
        }
    }
    ttscommit;
}
там есть методы с суффиксом _AC, это кажись какие-то наши доработки. Ну не суть, думаю, что считать данные из файла сами сможете.
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат!