Buscar en este blog

miércoles, 15 de abril de 2015

Cancelar una orden de orden de venta y su remisión por código x++ en Dynamics Ax 2012

En los post anteriores vimos cómo crear una orden de venta, después vimos cómo crear su confirmación y su remisión, pero qué pasa si queremos cancelar la orden? tenemos que empezar por cancelar su remisión, el siguiente código funciona pasando como argumentos el ID de la orden de venta (SalesId) y la remisión (PackingSlipId), esto se hace por el siguiente código:

private void cancelaRemision(SalesId _salesId, PackingSlipId _remision)
{
    SalesTable _salesTable = SalesTable::find(_salesId);
    CustPackingSlipJour custPackingSlipJour;
    SalesFormLetter salesFormLetter;

    try
    {
        select firstOnly custPackingSlipJour
        where custPackingSlipJour.PackingSlipId == _remision;

        salesFormLetter = SalesFormLetter::construct(DocumentStatus::PackingSlip);

        salesFormLetter.parmVersioningUpdateType(VersioningUpdateType::Cancel);
        salesFormLetter.parmCallerTable(custPackingSlipJour);

        salesFormLetter.allowEmptyTable( true);
        salesFormLetter.initAllowEmptyTable( true);
        salesFormLetter.multiForm( true);
        salesFormLetter.update( _salesTable, systemDateget());
    }
    catch
    {
        throw error("No se cancelo la remisión." );
    }

}

Una vez que tenemos la cancelación de la remisión, vamos con la cancelación de ov

private void cancelOrden(SalesId _salesId)
{
    SalesTable _salesTable = SalesTable::find(_salesId);

    SalesUpdateRemain::cancelRemainderOnOpenSalesLines(_salesTable);  

}



En los post anteriores:
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.


Post relacionados:
Cómo crear una orden de compra.
Cómo crear la confirmación y la recepción de una orden de compra.
Cómo cancelar una orden de compra y su recepció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. 


lunes, 13 de abril de 2015

Crear una confirmación y remisión de orden de venta por código X++ en Dynamics Ax 2012 R2

Cuando ya tenemos la ov creada, generalmente necesitamos la remisión, para esto es requisito crear la confirmación de la misma, lo hacemos de la siguiente forma pasando como parámetro la SalesTable que es el encabezado de la orden de venta que se quiere confirmar.

public PackingSlipId creaRemision(SalesTable _salesTable)
{
    CustPackingSlipJour custPackingSlipJour;
    SalesFormLetter     salesFormLetter;

     //OV confirmación
    salesFormLetter = salesFormLetter::construct(DocumentStatus::Confirmation);
    salesFormLetter.update(_salesTable, header.ShippingDateRequested); 

    //OV packing slip
    salesFormLetter = salesFormLetter::construct(DocumentStatus::PackingSlip);
    salesFormLetter.update(_salesTable, header.ShippingDateRequested);

    select firstOnly custPackingSlipJour
    where custPackingSlipJour.SalesId == _salesTable.SalesId;

    packingSlipId = custPackingSlipJour.PackingSlipId;

    return packingSlipId;

}


Aquí los links relacionados:
Cómo crear una orden de venta por código.
Cómo cancelar la orden de venta y su remisión.


Algunos post de utilidad:
Cómo crear una orden de compra.
Cómo crear la confirmación y la recepción de una orden de compra.
Cómo cancelar una orden de compra y su recepció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. 

miércoles, 8 de abril de 2015

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

Y siguiendo con la serie de creación de ordenes, en este post se muestra cómo crear una orden de venta por código x++ donde se puedan considerar sus dimensiones financieras en las líneas.

public SalesTable createOV()
{
    SalesTable          salesTable;
    AxSalesTable        axSalesTable;
    CustTable           custTable;
    SalesLine           salesLine;
    AxSalesLine         axSalesLine;

    //Inicializando a partir del cliente
    custTable = custTable::find( "NumeroCliente" );
    salesTable.CustAccount  = "NumeroCliente" ;
    salesTable.initFromCustTable();

    //Llenando campos nuevos si hubiera en la tabla de ov
    salesTable.PurchOrderFormNum    = "ReferenciaCliente" ;
    salesTable.CampoNuevo1          = "ValorCampoNuevo1" ;
      
    axSalesTable = axSalesTable::newSalesTable(salesTable);
    axSalesTable.parmCustAccount( "NumeroCliente" );
    axSalesTable.parmSalesType(SalesType::Sales);
    axSalesTable.parmDocumentStatus(DocumentStatus::None);
    axSalesTable.parmReceiptDateRequested( 30\03\2015 );
    axSalesTable.parmShippingDateRequested( 30\03\2015 );
    axSalesTable.parmCurrencyCode( "MXN" );
    axSalesTable.doSave();
   
    // Esta sección se repite por cuantas líneas tenga la orden
    salesLine.clear();
    salesLine.initFromSalesTable(_salesTable);

    //lenando campos nuevos
    salesLine.Cajas               = "ValorCampoNuevo2" ;
    salesLine.ClaveRechazo        = "ValorCampoNuevo3" ;                      

    axSalesLine = null ;
    axSalesLine = AxSalesLine::newSalesLine(salesLine);
    axSalesLine.parmItemId( "CodigoArticulo" );
    axSalesLine.parmSalesQty( 10 );
    axSalesLine.parmQtyOrdered( 10 );
    axSalesLine.parmSalesUnit( "pza" );
    axSalesLine.parmSalesPrice( 18.00 );
    axSalesLine.parmLineAmount( 180.00 );
    //axSalesLine.parmTaxGroup(lines.TaxGroup); //Si no se llena, toma el del cliente
    //axSalesLine.parmTaxItemGroup(lines.TaxItemGroup); //Si no se llena, toma el del artículo
    axSalesLine.parmReceiptDateRequested( 30\03\2015 );
    axSalesLine.parmShippingDateRequested( 30\03\2015 );
    axSalesLine.axInventDim().parmInventSiteId( "100" );
    axSalesLine.parmDefaultDimension(this.getDefaultDimension( "valorDimension1" "valorDimension2" ,"valorDimension3"));

    axSalesLine.save();

    salesId = salesTable.SalesId;

    return salesTable;
}


Y para el DefaultDimension, se tiene el método getDefaultDimension:

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 remisión de una orden de venta.
Cómo cancelar la orden de venta y su remisión.


Post anteriores relacionados:
Cómo crear una orden de compra.
Cómo crear la confirmación y la recepción de una orden de compra.
Cómo cancelar una orden de compra y su recepció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. 



lunes, 6 de abril de 2015

Cancelar una orden de orden de compra y su recepción por código x++ en Dynamics Ax 2012

En los post anteriores vimos cómo crear una orden de compra, después vimos cómo crear su confirmación y su recepción, pero qué pasa si queremos cancelar la orden? tenemos que empezar por cancelar su recepción, el siguiente código funciona pasando como argumentos el ID de la orden de compra (PurchId) y la recepción (PackingSlipId), esto se hace por el siguiente código:

private void cancelaRecepcion(PurchId _purchId, PackingSlipId _numeroRecepcion)
{
    PurchTable _purchTable = PurchTable::find(_purchId);
    VendPackingSlipJour vendPackingSlipJour;
    PurchFormLetter purchFormLetter;

    select firstOnly vendPackingSlipJour
    where vendPackingSlipJour.PackingSlipId == _numeroRecepcion;

    purchFormLetter = PurchFormLetter::construct(DocumentStatus::PackingSlip);

    PurchFormLetter.parmVersioningUpdateType(VersioningUpdateType::Cancel);
    PurchFormLetter.parmCallerTable(vendPackingSlipJour);

    PurchFormLetter.allowEmptyTable( true);
    PurchFormLetter.initAllowEmptyTable( true);
    PurchFormLetter.multiForm( true);
    purchFormLetter.update( _purchTable,
                            vendPackingSlipJour.PackingSlipId,
                            VendPackingSlipJour.DeliveryDate,
                            PurchUpdate::ReceiveNow,
                            AccountOrder::None,
                            NoYes::No,
                            NoYes::No,
                            NoYes::Yes);

}

Para confirmar que se haya cancelado, vamos al diario de recepciones y el botón "Cancelar" va a aparecer inhabilitado, esto indica que la recepción fue cancelada. Posteriormente se debe cancelar la orden, que no es otra cosa mas que poner las cantidades a cero.

private void cancelOrden(PurchId _purchId)
{
    PurchLine   purchLine;
    PurchTable purchTable;
    boolean     hayLineas = false ;

    try
    {
        ttsBegin ;
        purchTable = PurchTable::find(_purchIdtrue );

        if (purchTable.ChangeRequestRequired && purchTable.DocumentState >= VersioningDocumentState::Approved)
        {
            if (!purchTable.selectForUpdate())
            {
                purchTable = PurchTable::findRecId(purchTable.RecId, true );
            }
            VersioningPurchaseOrder::newPurchaseOrder(purchTable).createChangeRequest();
        }
        else if (!VersioningPurchaseOrder::newPurchaseOrder(purchTable).isLastVersionArchived() && purchTable.DocumentState == VersioningDocumentState::Confirmed)
        {
            // force archiving to avoid it during line cancellation as that would lead to update conflicts.
            purchTable.update();
        }

        //Mientras no haya cargos varios
        while select forUpdate purchLine
        where purchLine.PurchId         == PurchTable.PurchId
              && purchLine.IsDeleted    == NoYes::No
        {
            hayLineas = true ;
            purchLine.PurchQty      = 0 ;
            purchLine.LineAmount    = 0 ;
            purchLine.PdsCWQty      = 0 ;
            purchLine.PurchStatus = PurchStatus::Canceled;

            InventMovement::bufferSetTransQtyUnit(purchLine);
            InventMovement::bufferSetRemainQty(purchLine);

            purchLine.update();
        }
       
        if (!hayLineas)
        {
            purchTable.PurchStatus = PurchStatus::Canceled;
            purchTable.update();
        }

        ttsCommit ;

    }
    catch
    {
        ttsAbort ;        
        throw error("No fue posible cancelar la orden. " );
    }

}




Aquí los links relacionados:
Cómo crear una orden de compra
Cómo crear su confirmación 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.