Buscar en este blog

martes, 31 de marzo de 2015

Crear una orden de compra por código X++ en Dynamics Ax 2012 R2

Muchas veces necesitamos crear ordenes de compra mediante código x++, además de confirmar y recepcionar, y muchas otras mas es necesario cancelar las recepciones y las ordenes, así que aquí van un par de post, uno para crear la orden de compra donde se puedan considerar sus dimensiones financieras en las líneas y el siguiente va a ser para cancelar:

Para crear la orden con una línea:

static void creaOC(Args _args)
{   
    PurchTable              purchTable;
    AxPurchTable            axPurchTable;
    VendTable               vendTable; 
    PurchLine               purchLine;
    AxPurchLine             axPurchLine;
    PurchId                 purchId;

    //Inicializando a partir de datos del proveedor
    vendTable = vendTable::find( "CodigoProveedor1");
    purchTable.initFromVendTable(vendTable);

    //Llenando campos nuevos si hubiera en la tabla de oc
    purchTable.CampoNuevo1 = "valorCampoNuevo1";
    purchTable.CampoNuevo2 = "valorCampoNuevo2";

    axPurchTable = axPurchTable::newPurchTable(purchTable);
    axPurchTable.parmPurchaseType(PurchaseType::Purch);
    axPurchTable.parmDocumentStatus(DocumentStatus::PurchaseOrder);
    axPurchTable.parmCurrencyCode( "MXN");
    axPurchTable.parmDeliveryDate( 30\03\2015);
    axPurchTable.parmInventSiteId( "100");
    axPurchTable.parmAccountingDate( 30\03\2015);
    axPurchTable.parmPurchStatus(PurchStatus::Backorder);
    axPurchTable.doSave();
   

    // Esta sección se repite por cuantas líneas tenga la orden
    purchLine.clear();
    purchLine.initFromPurchTable(purchTable);
   
    //lenando campos nuevos
    purchLine.CampoNuevo1 = "valorCampoNuevo3";
    purchLine.CampoNuevo2   = "valorCampoNuevo4";          

    axPurchLine = null ;
    axPurchLine = AxPurchLine::newPurchLine(purchLine);
    axpurchLine.parmItemId( "Articulo1");
    axPurchLine.parmPurchQty( 10);
    axPurchLine.parmQtyOrdered( 10);
    axPurchLine.parmPurchUnit( "pza");
    axPurchLine.parmPurchPrice( 14.35);
    axPurchLine.parmLineAmount( 143.50);
    //axPurchLine.parmTaxItemGroup("grupo de impuestos 1");  //Si no se llena, toma el del artículo
    //axPurchLine.parmTaxGroup("grupo de impuestos 2"); //Si no se llena, toma el del cliente
    axPurchLine.parmDeliveryDate( 30\03\2015);
    axPurchLine.parmConfirmedDlv( 30\03\2015);
    axPurchLine.axInventDim().parmInventSiteId( "100");
    axPurchLine.parmDefaultDimension(this.getDefaultDimension( "valorDimension1", "valorDimension2" , "valorDimension3"));

    axPurchLine.save();

    // en esta variable almacenamos el ID de la orden de compra
    purchId = purchTable.PurchId;

}



Y para las dimensiones financieras, uso el método getDefaultDimension como sigue:

static void getDefaultDimension(str _valor1, str _valor2, str valor3)
{
    DimensionAttributeValueSetStorage   setStorage  =   new DimensionAttributeValueSetStorage();
    DimensionAttribute                  dimAttribute;
    DimensionAttributeValue             dimAttrValue;
    int                                 idx;
   
    //Aquí van los nombres de las dimensiones de nuestro Ax
    container       conAttr = [ "REGION", "CEDIS" , "CENTROCOSTO"];
    container       conValue = [_valor1, _valor2, valor3];

    for(idx= 1; idx<=conLen (_dimNames); idx++)
    {
        dimAttribute    =   DimensionAttribute::findByName( conPeek(conAttr, idx));
        dimAttrValue    =   DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttribute,conPeek(conValue, idx),false,true );
        setStorage.addItem(dimAttrValue);
    }

    return  setStorage.save();   

}





En los siguientes post, viene:
Cómo crear la confirmación y la recepción.
Cómo cancelar una orden de compra y su recepción.


Post relacionados:
Cómo crear una orden de venta por código.
Cómo crear la confirmación y la remisión de una orden de venta.
Cómo cancelar la orden de venta y su remisión.



Y por cierto, acuérdate de darle click a algún anuncio si el post te sirvió de algo.


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. 




4 comentarios:

  1. Hola soy nuevo en ax y tengo una duda en las lineas

    purchTable.camponuevo1 = "valordelcampo1"

    No entiendo a que te refieres.

    ResponderBorrar
    Respuestas
    1. Esto es únicamente para cuando tienes campos extras en PurchTable, por ejemplo que te hayan pedido que en el encabezado de la orden de compra agregues el campo llamado "camponuevo1", entonces puedes asignarle el valor antes de usar axpurchtable para asignarle el valor.

      Borrar
  2. Hola gracias por este post. Me pregunto algo, podria usar este codigo para cargar varias Ordenes de Compra que vienen en un archivo plano? Soy algo nuevo en este tema de AX y de programacion en X++.

    Gracias de antemano

    ResponderBorrar
  3. Hola!,
    Soy bastante nueva en X++, mi duda es, si es posible crear varias ordenes de compra, utilizando el código, y como sería el mismo?, por ejemplo si tengo q tomar datos de un excel o un .csv.
    Muchas Gracias!

    ResponderBorrar