Buscar en este blog

jueves, 23 de febrero de 2017

Crear diario de transferir Dynamics Ax 2009 por código x++

Aquí muestro cómo crear un diario de transferir en Dynamics Ax 2009


static void ISSinventtransferjournal(Args _args)
{
    InventJournalTable inventJournalTable;
    InventJournalTrans inventJournalTrans;
    InventJournalCheckPost inventJournalCheckPost;
    NumberSeq num;
    InventDim frominventDim,ToinventDim;
    ;
    ttsbegin;
    inventJournalTable.clear();
    num = new NumberSeq();
    num = NumberSeq::newGetNum(InventParameters::numRefTransferId());

    inventJournalTable.initFromInventJournalName(InventJournalName::find(InventParameters::find().TransferJournalNameId));
    inventJournalTable.Description = InventJournalName::find(InventParameters::find().TransferJournalNameId).Description;
    inventJournalTable.SystemBlocked = true;
    inventJournalTable.insert();

    //línea 1
    inventJournalTrans.clear();
    inventJournalTrans.initFromInventJournalTable(inventJournalTable);

    inventJournalTrans.ItemId = "AAA";

    //frominventDim.wMslocationid = "";
    frominventDim.inventSiteId ="CAD";
    frominventdim.InventLocationId = "FABRICA";
    frominventdim.inventBatchId = "1a";


    //Toinventdim.wmslocationid = "";
    ToinventDim.InventSiteId = "CAD";
    ToinventDim.InventLocationId = "FERT";
    ToinventDim.inventBatchId = "1a";

    ToinventDim = InventDim::findOrCreate(ToinventDim);
    frominventDim = InventDim::findOrCreate(frominventDim);
    inventJournalTrans.InventDimId = frominventDim.inventDimId;
    inventJournalTrans.initFromInventTable(InventTable::find("AAA"));
    inventJournalTrans.Qty = 1;
    inventJournalTrans.ToInventDimId = ToinventDim.inventDimId;
    inventJournalTrans.TransDate = SystemDateget();
    inventJournalTrans.insert();

    inventJournalTable.NumOfLines = 1;
    inventJournalCheckPost = InventJournalCheckPost::newJournalCheckPost(JournalCheckpostType::Post,inventJournalTable);
    inventJournalCheckPost.run();
    inventJournalTable.SystemBlocked = false;
    inventJournalTable.update();
    ttscommit;

    info(strfmt("Diario: %1 creado.", inventJournalTable.JournalId));
}


Post relacionados:
Reserva de inventario por línea de venta por código x++, Dynamics Ax 2009
Dialogo para seleccionar nombre de archivo FileName
Crear una orden de producción en Dyamics Ax 2009 por código x++



No olvides que te puedes unir a la página en Facebook Aprendiendo Dynamics Ax donde únicamente se tratan temas de desarrollo y se busca crear una comunidad de desarrollador@s de Ax en nuestro idioma. 


miércoles, 15 de febrero de 2017

Crear una orden de producción en Dyamics Ax 2009 por código x++

Ejemplo para crear una orden de producción y llevarla por los distintos estados: la estimación, la lista de selección, el inicio, reportar como terminada y el fin.

static void createProductionOrder(Args _args)
{
    ProdQty         qty     = 2;
    ItemId          item    = 'AAA-PT';

    ProdTable       prodtable;
    InventTable     inventTable;
    InventDim       inventDim;

    ProdMultiCostEstimation         prodMultiCostEstimation;
    ProdMultiScheduling             prodMultiScheduling;
    ProdMultiRelease                prodMultiRelease;
    ProdMultiStartUp                prodMultiStartUp;
    ProdMultiReportFinished         prodMultiReportFinished;
    ProdMultiHistoricalCost         prodMultiHistoricalCost;
    Args                            args   = new Args();

    ProdParmStartUp                 prodParmStartUp;
    ;

    // Inicializar InventTable
    inventTable = inventTable::find(item);

    prodtable.initValue();
    prodtable.initFromInventTable(inventTable);

    prodtable.ItemId                = inventTable.ItemId;
    prodtable.DlvDate               = today();
    prodtable.DlvTime               = DateTimeUtil::time(DateTimeUtil::utcNow());
    prodtable.QtySched              = qty;
    prodtable.RemainInventPhysical  = qty;

    // Inicializar InventDim
    inventDim.initValue();

    prodtable.BOMId = BOMVersion::findActive(prodtable.ItemId,
                                             prodtable.BOMDate,
                                             prodtable.QtySched,
                                             inventDim).BOMId;

    prodtable.RouteId = RouteVersion::findActive(prodtable.ItemId,
                                                 prodtable.BOMDate,
                                                 prodtable.QtySched,
                                                 inventDim).RouteId;

    // Inicializar BOMVersion
    prodtable.initBOMVersion();
    // Inicializar RouteVersion
    prodtable.initRouteVersion();

    //Personalizar lote
    inventDim = inventDim::find(prodtable.InventDimId);
    inventDim.inventBatchId = "2011-302005";
    inventDim = inventDim::findOrCreate(inventDim);
    prodtable.InventDimId = inventDim.inventDimId;

    //Dependiendo de la configuración, esto puede ser necesario o no
    ProdTable.ProdGroupId = "AGR";

    //Usando ProdTable para crear la orden
    prodtable.type().insert();

    // Indica la orden de producción que se creo
    setPrefix( 'Número de orde de producción');
    info(prodtable.ProdId);


    // Estimation
    prodMultiCostEstimation = ProdMultiCostEstimation::construct(args);
    runBaseMultiParm::initParm(ProdMultiCostEstimation);
    prodMultiCostEstimation.insert(prodTable, ProdMultiCostEstimation.defaultParmBuffer());
    prodMultiCostEstimation.run();

    // Scheduling
    prodMultiScheduling = ProdMultiScheduling::construct(ProdSchedMethod::OperationScheduling);
    runBaseMultiParm::initParm(prodMultiScheduling);
    prodMultiScheduling.insert(prodTable, prodMultiScheduling.defaultParmBuffer());
    prodMultiScheduling.run();

    // Release
    prodMultiRelease = ProdMultiRelease::construct(args);
    runBaseMultiParm::initParm(ProdMultiRelease);
    prodMultiRelease.insert(prodTable, prodMultiRelease.defaultParmBuffer());
    prodMultiRelease.run();

    // Start up
    prodMultiStartup = ProdMultiStartUp::construct(args);
    runBaseMultiParm::initParm(prodMultiStartup);
    prodMultiStartup.insert(prodTable, prodMultiStartup.defaultParmBuffer());
    prodMultiStartup.runISS();

    // Report as Finished
    prodMultiReportFinished = ProdMultiReportFinished::construct(args);
    runBaseMultiParm::initParm(ProdMultiReportFinished);
    prodMultiReportFinished.insert(prodTable, ProdMultiReportFinished.defaultParmBuffer());
    prodMultiReportFinished.runISS();

    // End the Order
    prodMultiHistoricalCost = ProdMultiHistoricalCost::construct(args);
    runBaseMultiParm::initParm(ProdMultiHistoricalCost);
    prodMultiHistoricalCost.insert(prodTable, ProdMultiHistoricalCost.defaultParmBuffer());
    prodMultiHistoricalCost.run();

}




Post relacionados:
Reserva de inventario por línea de venta por código x++, Dynamics Ax 2009
Dialogo para seleccionar nombre de archivo FileName
Crear búsquedas por nombre de producto en métodos display



No olvides que te puedes unir a la página en Facebook Aprendiendo Dynamics Ax donde únicamente se tratan temas de desarrollo y se busca crear una comunidad de desarrollador@s de Ax en nuestro idioma. 

miércoles, 8 de febrero de 2017

Reserva de inventario por línea de venta por código x++, Dynamics Ax 2009

Este es un ejemplo para simular la reserva de productos con dimensión financiera especifica, en este caso, un número de lote y número de serie en Dynamics Ax 2009.

Nota: este ejemplo ejecutado desde un job te puede mandar un error de "El cursor no es válido para crear una instancia recordViewCache." o "The cursor is invalid for instantiating recordViewCache." esto se debe a que la clase desde donde lo ejecutes debe tener la propiedad RunOn en Server.

static void reserveInventoryForSalesLine(Args _args)
{
    SalesLine               salesLine;
    InventUpd_Reservation   reservation;
    InventDim               inventDimCriteria;
    InventDimParm           inventDimParm;
    InventMovement          inventMovement;
    InventQty               qty;
    ;
    salesLine = salesLine::findRecId(5637148606); // RecId de la línea de venta

    if (!salesLine)
    {
        return;
    }

    inventMovement                  = InventMovement::construct(salesLine);

    inventDimCriteria               = InventDim::find(salesLine.inventDimId);
    inventDimCriteria.inventBatchId = '202023';//número de lote especifico de donde se quiere hacer la reserva
    inventDimCriteria.inventSerialId = '1234512'; //número de serie especifico de donde se quiere hacer la reserva

    inventDimParm                   = inventMovement.initDimParmAutoReserv(inventDimCriteria);

    reservation = InventUpd_Reservation::newMovement(inventMovement, -1, false);
    reservation.parmInventDimFixed(InventDimFixedClass::inventDimParm2InventDimFixed(inventDimParm));
    reservation.parmInventDimCriteria(inventDimCriteria);
    reservation.parmInventDimParm(inventDimParm);
    reservation.updateNow();

    info("termino");

}



Post relacionados:
Consultas en tablas con ValidTimeState
Crear lookup en clase dialog
Crear búsquedas por nombre de producto en métodos display



No olvides que te puedes unir a la página en Facebook Aprendiendo Dynamics Ax donde únicamente se tratan temas de desarrollo y se busca crear una comunidad de desarrollador@s de Ax en nuestro idioma. 


miércoles, 1 de febrero de 2017

Dialogo para seleccionar nombre de archivo FileName


Este es un ejemplo de cómo hacer un job que lance un dialogo y se pueda seleccionar el nombre del archivo.

static void DialogFilePath(Args _args)
{
    Dialog          dialog;
    Filename        filename;
    DialogField     dialogFilename;
    //Definiendo filtro de ciertos tipos de archivos
    container      conFilter = ["Microsoft Excel 97-2003 Worksheet (.xls)" ,"*.xlsx"];
    //container    conFilter = ["Comma Seperated Value .txt ", "*.csv"];
     ;

    dialog = new dialog();
    dialog.caption("Importar archivo");
    dialogFilename = dialog.addField(typeId(FilenameOpen));//extendedTypeStr(FilenameOpen));  //extendedTypeStr es para 2012
    //Aplicando filtro de archivos
    dialog.filenameLookupFilter(conFilter);
    dialog.run();

    if(dialog.closedOk())
    {
        filename = dialogFileName.value();
        info(filename);
    }

}

Este es el resultado:



No olvides que te puedes unir a la página en Facebook Aprendiendo Dynamics Ax donde únicamente se tratan temas de desarrollo y se busca crear una comunidad de desarrollador@s de Ax en nuestro idioma.