AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.12.2014, 13:45   #1  
Art_Tanis is offline
Art_Tanis
Участник
 
225 / 36 (2) +++
Регистрация: 04.02.2014
Импорт информации по спланированным заказа на производство из экселя в АХ
Добрый день!
В виду извращенности бизнес логики необходимо импортировать data из Эксель и преобразовать ее в виде спланированных заказов на производство.
В принципе ничего сложного. Формат таблицы импорта:
Столбец1 Столбец2 Столбец3
Код номенклатуры Маршрут Колличество

Вот джоб он это сделает:
X++:
static void _HTC_EXCELIMPORT_DataImportToAXFromExcel(Args _args)
{
    SysExcelApplication              xlsApplication;
    SysExcelWorkBooks         xlsWorkBookCollection;
    SysExcelWorkBook                    xlsWorkBook;
    SysExcelWorksheets       xlsWorkSheetCollection;
    SysExcelWorksheet                  xlsWorkSheet;
    SysExcelRange                          xlsRange;
    SysExcelCells                             Cells;
    SysExcelCell                              RCell;
    CommaIO                                  inFile;
    int                                      nRow,i;
    DialogField                          dialogPath;
    DialogField                         dlgFilepath;
    DialogField                        dlgReqPlanId;
    DialogField                          dlgRefType;
    DialogField                     dlgInventSiteId;
    Dialog                                   dialog;
    Filename                               filename;

    ItemId                                    ItemId;
    ItemGroupId                          ItemGroupId;
    ItemBomId                              ItemBomId;
    ItemRouteId                          itemRouteId;

    ReqPO                                      ReqPo;

    ReqPlanId                              ReqPlanId;
    ReqRefType                               RefType;
    InventSiteId                        inventSiteId;

    ReqDate                                                                 ReqDate;
    ReqDateOrder                                                       ReqDateOrder;
    Qty                                                                         Qty;
    //FormStringControl                   FormStringControl = new FormStringControl();
        ;


    dialog = new Dialog("Import");
    dialogPath = dialog.addField(typeid(Filenameopen), "File Name");

    dlgRefType   = dialog.addField(typeid(ReqRefType), "Ref Type");
    dlgReqPlanId = dialog.addField(typeid(ReqPlanId), "Plan Id");
    dialog.run();
    if (dialog.run())
    {
        filename = (dialogPath.value());
        ReqPlanId = dlgReqPlanId.value();
        RefType   = dlgRefType.value();
    }
    inFile = new CommaIO (filename, 'R');

    if (!inFile || infile.status() != IO_Status::Ok )
    {
        throw error (strfmt("@SYS19312",filename));
    }
     try
    {
        xlsApplication          = SysExcelApplication::construct();
        xlsWorkBookCollection   = xlsApplication.workbooks();
        xlsWorkBookCollection.open(filename);
        xlsWorkSheetCollection  = xlsApplication.worksheets();
        xlsWorkSheet            = xlsWorkSheetCollection.itemFromNum(1);
        Cells                   = xlsWorkSheet.Cells();
        nRow = 2;
        RCell = Cells.Item(nRow, 1);

        while(RCell.value().bStr() != "")
        {
            ItemId                   = RCell.value().bStr();
            RCell                      = Cells.item(nRow,2);
            ItemRouteId                  = RCell.value().bStr();
            RCell                      = Cells.item(nRow,3);
            Qty                      = RCell.value().double();

            ReqDate                  = today();
            
            ttsbegin;
            
            ReqPo.initValue();
            ReqPo.ItemId                           = ItemId;
            ReqPo.ReqDate                         = ReqDate;
            ReqPo.ItemRouteId                     = ItemRouteId;
            ReqPo.ReqPlanId                                                      = ReqPlanId;
            ReqPo.ReqPOStatus                                        = ReqPOStatus::Approved;
            ReqPo.RefType                                                          = RefType;
            ReqPO.Qty                                                               =    Qty;
            ReqPo.CovInventDimId                                                     ="4799";

            ReqPo.insert();
            
            ttscommit;

            nRow++;
            RCell = Cells.Item(nRow, 1);
        }
        xlsApplication.quit();
        xlsApplication.finalize();
        info("Imported completed");
    }
    catch( Exception::Error)
    {
        //Close Excel.
        xlsApplication.quit ();
        xlsApplication.finalize ();
        ttsabort;
        info("Unable to process the excel import ");
    }

}
Но вот проблема - мне необходимо подтянуть действующую активную спецификацию.
И разумеется возник вопрос - А как это сделать??
Когда создается через форму то используется метод InventTable lookupBOMId одним из агрументов которого является FormStringControl. Но я планирую просто сделать класс для запуска импорта с точкой входа.
Старый 15.12.2014, 13:57   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
InventTable.BomId()
Старый 15.12.2014, 16:58   #3  
Art_Tanis is offline
Art_Tanis
Участник
 
225 / 36 (2) +++
Регистрация: 04.02.2014
Да спасибо. С этим я разобрался но вот проблема. Смотрите - спланированный заказ нормально занесся - на форме тоже отображаться, но калькуляция по спецификации и следовательно калькуляция того что нужно закупить - спланированных заказов на покупку не происходит. Не подскажите в чем дело?
X++:
 ttsbegin;
            ReqPO.ReqPlanId     = ReqPlanId;
            ReqPO.RefType       = ReqRefType::BOMPlannedOrder;

            ReqPO.initFromItemId(ItemId);

            ReqPO.Qty   = Qty;
            ReqPo.BOMRouteCreated                                         = ReqBOMRouteCreated::BOMRoute;
            Reqpo.CovInventDimId =                        InventDim::findOrCreate(inventDim).inventDimId;
            ReqPO.PurchUnit = inventTableModule::find(ItemId,moduleInventPurchSales::Invent).UnitId;
            ReqPo.ReqTime       = timenow();
            ReqPo.insert();
            ReqTrans.initFromReqPo(ReqPo);
        
            ReqTrans.insert();

            ttscommit;
Старый 15.12.2014, 18:39   #4  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Потому как взорвать еще надо:
ReqPlannedOrder::construct().insertFromForm()
Цитата:
reqCalcExplodePo = this.getReqCalcExplode(reqTransPo);
reqCalcExplodePo.parmRecalculateBomLevels(_recalculateBomLevels);
reqCalcExplodePo.run();
Старый 15.12.2014, 21:05   #5  
Art_Tanis is offline
Art_Tanis
Участник
 
225 / 36 (2) +++
Регистрация: 04.02.2014
Итог! Будет все так::
X++:
static void _HTC_EXCELIMPORT_DataImportToAXFromExcel(Args _args)
{
    SysExcelApplication              xlsApplication;
    SysExcelWorkBooks         xlsWorkBookCollection;
    SysExcelWorkBook                    xlsWorkBook;
    SysExcelWorksheets       xlsWorkSheetCollection;
    SysExcelWorksheet                  xlsWorkSheet;
    SysExcelRange                          xlsRange;
    SysExcelCells                             Cells;
    SysExcelCell                              RCell;
    CommaIO                                  inFile;
    int                                      nRow,i;
    DialogField                          dialogPath;
    DialogField                         dlgFilepath;
    DialogField                        dlgReqPlanId;
   
    DialogField                     dlgInventSiteId;
   

    Dialog                                   dialog;
    Filename                               filename;

    ItemId                                    ItemId;
    ItemGroupId                          ItemGroupId;
    ItemBomId                              ItemBomId;
    ItemRouteId                          itemRouteId;
    InventSiteId                        inventSiteId;

    ReqPO                                      ReqPo;
    ReqTrans                                   ReqTrans;

    ReqPlanId                                    ReqPlanId;
    ReqCalcExplodePo                                   reqCalcExplodePo;
    


    ReqDate                                                                 ReqDate;
    ReqDateOrder                                                       ReqDateOrder;
    Qty                                                                         Qty;
    
    InventDim   InventDim;

        ;


    dialog = new Dialog("Import");
    dialogPath = dialog.addField(typeid(Filenameopen), "File Name");

    dlgReqPlanId = dialog.addField(typeid(ReqPlanId), "Plan Id");
    dlgInventSiteId = dialog.addField(typeid(InventSiteId), "Site");
    dialog.run();
    if (dialog.run())
    {
        filename = (dialogPath.value());
        ReqPlanId = dlgReqPlanId.value();
       
        InventSiteId = dlgInventSiteId.value();
    }
    inFile = new CommaIO (filename, 'R');

    if (!inFile || infile.status() != IO_Status::Ok )
    {
        throw error (strfmt("@SYS19312",filename));
    }
     try
    {
        xlsApplication          = SysExcelApplication::construct();
        xlsWorkBookCollection   = xlsApplication.workbooks();
        xlsWorkBookCollection.open(filename);
        xlsWorkSheetCollection  = xlsApplication.worksheets();
        xlsWorkSheet            = xlsWorkSheetCollection.itemFromNum(1);
        Cells                   = xlsWorkSheet.Cells();
        nRow = 2;
        RCell = Cells.Item(nRow, 1);
       
        InventDim.InventSiteId = InventSiteId;
        while(RCell.value().bStr() != "")
        {
            ItemId                   = RCell.value().bStr();
            RCell                      = Cells.item(nRow,2);
            Qty                      = RCell.value().double();

            ttsbegin;
            ReqPO.ReqPlanId     = ReqPlanId;
            ReqPO.RefType       = ReqRefType::BOMPlannedOrder;

            ReqPO.initFromItemId(ItemId);

            ReqPo.setBOMCreated(true);
            ReqPo.setRouteCreated(true);




            ReqPO.Qty   = Qty;
            ReqPo.BOMRouteCreated                                         = ReqBOMRouteCreated::BOMRoute;
            Reqpo.CovInventDimId =                        InventDim::findOrCreate(inventDim).inventDimId;
            ReqPO.PurchUnit      = inventTableModule::find(ItemId,moduleInventPurchSales::Invent).UnitId;
            ReqPo.ReqTime                                                                    = timenow();
            ReqPo.ReqDateDlv     = today();
            ReqPo.ReqDateOrder   = today();

             ReqPo.insert();

            ReqTrans.insertFromReqPo(ReqPo,True);
          
            ttscommit;

            reqCalcExplodePo = ReqCalcExplode::newReqTrans(ReqTrans, null);
            ReqCalcExplodePo.run();

            nRow++;
            RCell = Cells.Item(nRow, 1);
        }
        xlsApplication.quit();

        xlsApplication.finalize();
        info("Imported completed");
    }
    catch( Exception::Error)
    {
        //Close Excel.
        xlsApplication.quit ();
        xlsApplication.finalize ();
        ttsabort;
        info("Unable to process the excel import ");
    }

}
Для 2009 это работает. Вопрос. А вот теперь я хочу разумеется сделать кнопку все дела чтобы пользователь выбирал и грузил. А как лучше сделать? Вот я сделаю класс, надо ли наследовать RunBase класс? Выполнять Batch Job мне ненадо - это редкие загрузки будут ... что мне даст Runbase? Только сохранение параметров на параметров на вызываемой форме диалога?
Старый 15.12.2014, 22:49   #6  
Art_Tanis is offline
Art_Tanis
Участник
 
225 / 36 (2) +++
Регистрация: 04.02.2014
Class_DryRuImportPOFromExcel.xpo
Сделал на базе RunBaseBatch.
За это сообщение автора поблагодарили: AlGol (1).
Старый 17.12.2014, 12:46   #7  
Art_Tanis is offline
Art_Tanis
Участник
 
225 / 36 (2) +++
Регистрация: 04.02.2014
Выявилась одна проблема: Дело в том что в экселе когда я хочу подгружать, код номенклатуры может иметь значение как 411509 - и это будет типа даннных string, так и 411509_1 а вот это почему то всегда число в экселе. Разумеется из за этого просходить сбой экспорта. Так как ожидалось получить стринг а получен был int. Может есть какой то способ проверить типа данных и в зависимости от этого выполнить преобразование или нет?
Старый 17.12.2014, 13:29   #8  
Art_Tanis is offline
Art_Tanis
Участник
 
225 / 36 (2) +++
Регистрация: 04.02.2014
В общем то вроде как мне нужен метод который возвращает тип переменной. Должно же быть что то такое да?
Старый 18.12.2014, 18:30   #9  
Art_Tanis is offline
Art_Tanis
Участник
 
225 / 36 (2) +++
Регистрация: 04.02.2014
Правильный ответ необходимо использовать функцию typeof() в методе run
typeof(RCell.value().bStr()) == Types::String ? RCell.value().bStr() : int2str(RCell.value().int());

Однако появился очень интересный баг. Когда я запускаю через класс - то есть щелкаю на класс то все подгружается нормально. Но я сделал кнопку и к ней прикрутил Menu item и назначил исполнение мой класс. И стала выпадать странная ошибка:
Method 'value' in COM object of class 'Range' returned error code 0x80020005 (DISP_E_TYPEMISMATCH) which means: One or more of the arguments could not be coerced.

Причины я не могу понять - если не сложно подскажите?? Когда запускаешь через класс - то все хорошо погружается.
Старый 18.12.2014, 18:33   #10  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Классика. Зависит, кажется от места исполнения (клиента/сервера) и от того, есть ли ProgressBar и/или startLengthyOperation().
Старый 18.12.2014, 18:36   #11  
Art_Tanis is offline
Art_Tanis
Участник
 
225 / 36 (2) +++
Регистрация: 04.02.2014
startLengthyOperation() использую, но все исполняю на сервере. Как то я не догоняю связь. Объясните пожалуйста.
Старый 18.12.2014, 18:38   #12  
Art_Tanis is offline
Art_Tanis
Участник
 
225 / 36 (2) +++
Регистрация: 04.02.2014
startLengthyOperation() - убрал все работает. Исполняется на сервере. Не понимаю почему?
Старый 18.12.2014, 18:42   #13  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Когда вы выводите "песочные часы", Windows начинает как-то особенно чутко реагировать на длительные автономные процессы и считает, что AX или Excel "зависли". Как-то так.
Старый 29.12.2014, 10:10   #14  
Art_Tanis is offline
Art_Tanis
Участник
 
225 / 36 (2) +++
Регистрация: 04.02.2014
Вот еще интересная штука. Смотрите: Загружаю данных из того же экселя в таблицу ForecastSales.
Все загружается но при этом при первом обновлении формы забавных глюк:
За место одной записи 5 штук.
Нажмите на изображение для увеличения
Название: 1.png
Просмотров: 414
Размер:	76.5 Кб
ID:	9107
Если форму закрыть и снова открыть то все нормально.
Нажмите на изображение для увеличения
Название: 2.png
Просмотров: 207
Размер:	72.1 Кб
ID:	9108

Проект:
__0150_HTC_DryRuImportForecastSalesExcel.xpo
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Импорт из Эксель через АДО и обновление ячеек Экселя Sada DAX: Программирование 0 23.07.2014 15:43
Финансовый квит производственного заказа. Ах 2009 Rimantas DAX: Программирование 1 07.10.2013 19:58
Импорт КЛАДР Ах 3.0 СП2 HouseNumber Sada DAX: Программирование 5 17.10.2012 16:26
Импорт в АХ через ODBC AXbeginer DAX: Программирование 14 02.10.2009 08:12
Производство: проблема при обработке производственного заказа Asp DAX: Функционал 2 15.04.2004 15:48

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 19:52.