Buscar en este blog

lunes, 25 de diciembre de 2017

Como validar que una cuenta exista en una estructura contable en Microsoft Dynamics Ax 2012


Para saber si una cuenta existe o no en una estructura contable podemos usar la clase DimensionHierarchy y el método getAccountStructure, si este método nos devuelve un valor quiere decir que si existe en alguna estructura contable configurada en Ax, aquí el siguiente código:


static void Job42(Args _args)
{
    LedgerRecId         ledgerRecId;
    DimensionHierarchyId  dimensionHierarchyId;
    MainAccount         mainAccount;
    ledgerRecId = Ledger::current();

    mainAccount = mainAccount::findByMainAccountId("001000");
    dimensionHierarchyId = DimensionHierarchy::getAccountStructure(mainAccount.RecId, ledgerRecId);
   
    if(!dimensionHierarchyId)
    {
        throw error(strFmt("@SYS4009834", MainAccount::find(mainAccount.RecId).MainAccountId));
    }
    else
    {
        info(strFmt("La cuenta %1 si existe en la estructura %2.", MainAccount::find(mainAccount.RecId).MainAccountId, DimensionHierarchy::find(dimensionHierarchyId).Name));

    }




Post relacionados:
Crear una entrada de presupuesto por código - Microsoft Dynamics Ax 2012
The request failed with HTTP status 401: Unauthorized. Enterprise Portal Dynamics Ax 2012
Usuario actual, nombre de usuario, moneda de la empresa Dynamics Ax 2012


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. 

domingo, 8 de octubre de 2017

Crear una entrada de presupuesto por código - Microsoft Dynamics Ax 2012

Aquí como hacer una entrada de presupuesto:

static void createBudgetHeaderAndLine(Args _args)
{
    BudgetTransactionHeader         header;
    BudgetTransactionLine           line;

    AxBudgetTransactionHeader       axHeader;
    AxBudgetTransactionLine         axLine;

    header.initValue();
    header.Date = 18\09\2017;
    header.BudgetModelId = PurchParameters::find().GRWModelId;
    header.BudgetTransactionCode = BudgetTransactionCode::findByBudgetTransactionCode(PurchParameters::find().GRWBudgetTransactionCode).RecId;

    axHeader = AxBudgetTransactionHeader::newBudgetTransactionHeader(header);
    axHeader.save();

    axLine = AxBudgetTransactionLine::construct();
    axLine.parmBudgetTransactionHeader(axHeader.parmRecId());
    axLine.parmLedgerDimension(5637146826);
    axLine.parmDate(18\09\2017);
    axLine.parmTransactionCurrencyAmount(30);
    axLine.parmBudgetType(BudgetType::Expense);
    axLine.parmTransactionCurrency("MXN");
    axLine.save();

    info(strFmt("Entrada de presupuesto creada: %1", header.TransactionNumber));

}

Y en Ax se ve algo como esto:




Post relacionados:
Autoliquidación de transacciones (Auto settlement) por código X++ - Dynamics Ax 2012
Validar si existe un archivo y la extensión del mismo por código - Dynamics Ax 2012
Lista de remisiones asociadas a una factura por código X++ en Dynamics Ax 2012


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. 



viernes, 6 de octubre de 2017

Autoliquidación de transacciones (Auto settlement) por código X++ - Dynamics Ax 2012

Para hacer la liquidación en automático de dos transacciones podemos usar el siguiente código:

static void autoSettlementExWill(Args _args)
{
    VendTrans                   vendTransFrom, vendTransTO;
    VendTransOpen               vendTransOpenFrom, vendTransOpenTo;
    CustVendOpenTransManager    SettleManager;
    Common                      originator;
    boolean                     settled;

    try
    {
        vendTransFrom = vendTrans::find(5637155127);
        vendTransTO = vendTrans::find(5637155128);
               
        //Revisando que no esten erradas las transacciones
        if(!vendTransFrom.Closed && !vendTransTo.Closed)
        {
            select firstonly vendTransOpenFrom
                where vendTransOpenFrom.RefRecId == vendTransFrom.RecId
                && vendTransOpenFrom.AccountNum == vendTransFrom.AccountNum;

            select firstonly vendTransOpenTo
                where vendTransOpenTo.RefRecId == vendTransTo.RecId
                && vendTransOpenTo.AccountNum == vendTransTo.AccountNum;

            originator = vendTransFrom.vendInvoiceJour().vendTable_InvoiceAccount();
            SettleManager = custVendOpenTransManager::construct(originator);  //en el originator solo hay custtable y vendtable en el swicht
            SettleManager.updateTransMarked(vendTransOpenFrom, true);
            SettleManager.updateTransMarked(vendTransOpenTo, true);
            settled = SettleManager.settleMarkedTrans();
           
            info(strFmt("Asiento liquidado: %1, con %2", vendTransFrom.Voucher, vendTransTO.Voucher));
        }
        else
            warning(strFmt("Las transacciones de los asientos: %1 y %2, no estan abiertas.", vendTransFrom.Voucher, vendTransTO.Voucher));
    }
    catch
    {
        error(strFmt("No fue posible liquidar las transacciones de proveedor. Asientos no liquidados: %1, con %2",
        vendTransFrom.Voucher, vendTransTO.Voucher));
    }

}




Post relacionados:
Crear y postear un LedgerVoucher en Ax 2012
Usuario actual, nombre de usuario, moneda de la empresa Dynamics Ax 2012
Lookup para dimensiones financieras personalizadas - Microsoft Dynamics Ax 2012 R2



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. 




martes, 12 de septiembre de 2017

Validar si existe un archivo y la extensión del mismo por código - Dynamics Ax 2012


Cuando se requiere validar si un archivo aún existe en una ruta y/o validar el tipo de archivo de acuerdo a la extensión, se puede usar dos opciones. Con una de ellas se debe tener cuidado porque no funciona si se requiere para un proceso batch.


static void ValidateFile(Args _args)
{
Contracts contract;
boolean existe;
System.IO.FileInfo fileInfo;
container datosArchivo;
str extArchivo;

//se busca un registro de una tabla que en uno de sus campos contiene un path completo del tipo c:\\carpeta1\archivo.docx
contract = Contracts::find("CONTRATO 050717");

//Opción 1: del lado del server, si funciona en procesos batch
new InteropPermission(InteropKind::ClrInterop).assert();
fileInfo = new System.IO.FileInfo(contract.AttachmentPath);
extArchivo = fileInfo.get_Extension();
existe = fileInfo.get_Exists();
CodeAccessPermission::revertAssert();

if (existe)
{
  info("si existe");

  //Valida si es un word
  if(strStartsWith(extArchivo, ".do"))
    info("si es doc");
  else
    info("no es doc");
}
else
{
  info("no existe");
}

//Opción 2 - del lado del cliente, no funciona bajo procesos batch
if (WinAPI::fileExists(itsContract.AttachmentPath))
{
  info("si existe 2");

  //Valida si es un word
  new InteropPermission(InteropKind::ClrInterop).assert();
  datosArchivo = Global::fileNameSplit(contract.AttachmentPath);
  CodeAccessPermission::revertAssert();

  if(strStartsWith(conPeek(datosArchivo, 3), ".do"))
    info("si es doc 2");
  else
    info("no es doc 2");
}
else
{
  info("no existe 2");
}

}



Post relacionados:
Registrar diario de producción por código, Dynamics Ax 2009, X++
Métodos display y métodos edit en un datasource o tablas temporales, Dynamics Ax 2012
Imprimir factura electrónica (México) a partir de una CustInvoiceJour por código - Dynamics Ax 2012



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. 


martes, 15 de agosto de 2017

Métodos display y métodos edit en un datasource o tablas temporales, Dynamics Ax 2012


Formularios: se debe poner el datasource como parámetro en caso de usar el display o edit en formularios.
Tablas temporales: se debe pasar como parámetro la tabla misma.


display str dispDebitor(simtcotetmp _simtcotetmp)
{
    simtDebitor deb;
    ;

    select nume, prenume from deb where deb.Ident == _simtcotetmp.IdDebitor; 
    return deb.Nume;
}

edit NoYes MarkSKUs(boolean set,
InventTable Invent,
NoYes _markSKUs)
{

if (set)
{
MarkMap.insert(Invent.RecId,_markSKUs);
MarkMap.valueSet();

else
{
if (MarkMap.exists(Invent.RecId))
{
_markSKUs = MarkMap.lookup(Invent.RecId);
}


return _MarkSKUs;
}



Post relacionados:
Crear un campo edit en un control de usuario en Enterprise Portal de Dynamics Ax 2012 R2
Crear búsquedas por nombre de producto en métodos display
Cómo crear un proyecto con todos los elementos de una capa - Microsoft Dynamics Ax 2012



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. 


sábado, 22 de julio de 2017

Imprimir factura electrónica (México) a partir de una CustInvoiceJour por código - Dynamics Ax 2012

Les comparto cómo mandar a PDF una factura electrónica a partir de la custInvoiceJour

static void SaveReportToPDFFromController(Args _args)
{
    EInvoiceCFDISalesController_MX salesInvoiceController;
    EInvoiceCFDIReportContract_MX salesInvoiceContract;
    Args                    args = new Args();
    SrsReportRunImpl        srsReportRun;
    CustInvoiceJour         custInvoiceJour;
    ReportName              reportName = "EInvoiceCFDIReport_MX.Report";
    EInvoiceJour_MX         eInvoiceJour_MX;
    SrsPrintMgmtExecutionInfo   srsPrintMgmtExecutionInfo;
    srsPrintMgmtExecutionInfo = new srsPrintMgmtExecutionInfo();
    select firstOnly custInvoiceJour where custInvoiceJour.RecId == 5637322330;
    select eInvoiceJour_MX
        where eInvoiceJour_MX.RefRecId == custInvoiceJour.RecId &&
              eInvoiceJour_MX.RefTableId == custInvoiceJour.TableId;
    args.record(eInvoiceJour_MX);
    salesInvoiceController = new EInvoiceCFDISalesController_MX();
    salesInvoiceController.parmReportName(reportName);
    salesInvoiceContract = salesInvoiceController.parmReportContract().parmRdpContract();
    salesInvoiceContract.parmRecordId(eInvoiceJour_MX.RecId);
    salesInvoiceController.parmArgs(args);
    srsReportRun = salesInvoiceController.parmReportRun() as SrsReportRunImpl;
    salesInvoiceController.parmReportRun(srsReportRun);
    salesInvoiceController.parmReportContract().parmPrintSettings().printMediumType(SRSPrintMediumType::File);
    salesInvoiceController.parmReportContract().parmPrintSettings().overwriteFile(true);
    salesInvoiceController.parmReportContract().parmPrintSettings().fileFormat(SRSReportFileFormat::PDF);
    salesInvoiceController.parmReportContract().parmPrintSettings().fileName(@"C:\Users\xxx\aloha.pdf");
    salesInvoiceController.parmReportContract().parmReportExecutionInfo(srsPrintMgmtExecutionInfo);
    salesInvoiceController.runReport();

}





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, 19 de abril de 2017

The request failed with HTTP status 401: Unauthorized. Enterprise Portal Dynamics Ax 2012

Hay veces que tratando de implementar paginas, menu items o web controls en el Enterprise Portal (EP) llegamos a ver el error The request failed with HTTP status 401: Unauthorized.



La solución es sobre el IIS

Claro, además de validar que el usuario tenga permisos de administrador y cumplir con los requerimientos técnicos que definidos Microsoft.

Referencia:
https://msdn.microsoft.com/en-us/library/dd261467.aspx

The account specified in Microsoft Dynamics AX to use for the Business Connector Proxy must be the same account that is used to run the application pool for the SharePoint site that is used for Enterprise Portal. If two different accounts are used, the AxUpdatePortal utility operations will not complete successfully.
To successfully deploy Enterprise Portal resources, you must have the following roles and permissions:
  • Administrator role in Microsoft Dynamics AX.
  • Administrator for SharePoint. To verify this, open SharePoint Central Administration on the Enterprise Portal server. If you cannot access SharePoint Central Administration, a SharePoint administrator must open SharePoint Central Administration > Security > Manage the farm administrators group and add you as an administrator.
  • Site collection administrator for the Enterprise Portal site. To verify this, open SharePoint Central Administration > Application Management. Click Site Collections > Change site collection administrators. Verify that you are listed as the primary or secondary site collection administrator.
  • Privileges to access the file locations on the Enterprise Portal server where files will be put. One way to guarantee this is by running the command prompt that is used to call AxUpdatePortal.exe with administrative privileges.


Post relacionados:
Enterprise Portal Dynamics Ax 2012 – Crear List Pages y PartPreview Pane
Crear un campo edit en un control de usuario en Enterprise Portal de Dynamics Ax 2012 R2
Modificar un control de usuario en el Enterprise Portal de Dynamics Ax


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. 



jueves, 23 de marzo de 2017

Cannot edit a record in Print journal (LedgerJournalTmp) Dynamics Ax 2012


Cuando llegues a ver el error Cannot edit a record in Print journal (LedgerJournalTmp) al tratar de imprimir un diario, a lo que se refiere es que el dato extendido del campo AccountName no es de la misma longitud que el campo del que hereda, la solucion es que se cambie el dato extendido de ese campo (AccountName) al DirPartyName.

"Cannot edit a record in Print journal (LedgerJournalTmp).
The SQL database has issued an error."

"[Microsoft][SQL Server Native Client 10.0][SQL Server]String or binary data would be truncated."
and the third line is.
"SQL statement: UPDATE T1 SET ACCOUNTNAME=T4.NAME,ACCOUNTNUM=T2.DISPLAYVALUE,RECVERSION=? FROM tempdb."DBO".t10841_69B3F7D1F031409EBC810A2C719FD5DB T1 CROSS JOIN DIMENSIONATTRIBUTEVALUECOMBINATION T2 CROSS JOIN CUSTTABLE T3 CROSS JOIN DIRPARTYTABLE T4 WHERE ((T1.PARTITION=?) AND (T1.ACCOUNTTYPE=?)) AND ((T2.PARTITION=?) AND (T2.RECID=T1.LEDGERDIMENSION)) AND (((T3.PARTITION=?) AND (T3.DATAAREAID=?)) AND (T3.ACCOUNTNUM=T2.DISPLAYVALUE)) AND ((T4.PARTITION=?) AND (T4.RECID=T3.PARTY))"




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 marzo de 2017

Service Unavailable 503 en Dynamics Ax 365

Al trabajar en Ax 365, cuando se están haciendo modificaciones, pueden haber algunas causas bajo las cuales extrañamente el servicio de Ax365 se cae y solo se ve un Service Unavailable,Http Erro 503.

Para conocer las causas de esto, podemos ir al event viewer y tratar de saber el origen para solucionarlo de fondo, pero mientras tanto, la solución es ir al IIS y arrancar el servicio que se cayo




Post relacionados:
No se muestra ningún elemento en Visual Studio 2015 con Dynamics Ax365
Crear lookup en clase dialog en Ax 2012
Crear búsquedas por nombre de producto en métodos display en Ax 2012



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 marzo de 2017

No se muestra ningún elemento en Visual Studio 2015 con Dynamics Ax365

Empezando con Ax365, lo primero que me tope cuando abrí el Visual Studio 2015 para comenzar los primeros pasos fue este error:

Discovery of best practices extensions failed with error 'Given directory 'C:\AOSService\Packages\Bin\BPExtensions' does not exist. It must exist when discovering extensions from a single directory'. Best practices checks may not function correctly.



Y una vez dándole click aceptar, no se muestra ningún elemento en el AOT en la vista modelo.



La solución... solo es abrir el VS en modo administrador.


Post relacionados:
Service Unavailable 503 en Dynamics Ax 365

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. 


jueves, 2 de marzo de 2017

Registrar diario de producción por código, Dynamics Ax 2009, X++

Si solo se quiere registrar un diario de producción del tipo "Notificar como terminado" podemos usar este código.

static void postJournalReportAsFinished(Args _args)
{
    ProdJournalTable prodJournalTable = ProdJournalTable::find("000496_098", true);
    ;
    ProdJournalCheckPostProd::newPostJournal(prodJournalTable.JournalId, true).run();
 
    info("termino");
}


En caso de que se quiera validar antes el diario del mismo tipo:


static void checkJournalReportAsFinished(Args _args)
{
    JournalCheckPost journalCheckPost;
    ProdJournalTable prodJournalTable = ProdJournalTable::find("000494_098", true);
    ;
    // Check/Post journal
    journalCheckPost = ProdJournalCheckPostProd::newJournalCheckPost(true,
                                                                    true,
                                                                    JournalCheckPostType::Check,
                                                                    prodJournalTable.TableId,
                                                                    prodJournalTable.JournalId);
    journalCheckPost.run();
 
    info("termino");
}


Post relacionados:
Crear una orden de producción en Dyamics Ax 2009 por código x++
Crear diario de transferir Dynamics Ax 2009 por código x++
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. 


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.