Thumbnail image

Líneas De Propuesta De Factura Duplicadas en Dynamics AX 2012

!
Warning: This post is over 365 days old. The information may be out of date.

Hace unas semanas encontramos y reportamos a Microsoft un error en el estándar de Microsoft Dynamics AX 2012 que provoca que las líneas se repitan al crear propuestas de factura y también al registrarlas posteriormente. Aunque Microsoft me confirmó entonces que está solucionado en Microsoft Dynamics AX 2012 R2, publico aquí el código que utilicé para solucionarlo ya que la pregunta ha aparecido en los foros de El Rincón Dynamics.

Poniendo “infos” en el código se puede detectar rápidamente que hay una función estándar que, aunque funciona correctamente, se ejecuta más veces de las necesarias. Concretamente se ejecuta para todas las líneas, una vez por línea, provocando que aparezca cada línea, tantas veces como líneas tenga la propuesta. Aquí se ve mas claro:

Esto se soluciona modificando el método doSalesLine de la clase estándar PSAProjProposalSelection como indico a continuación:

´´´ protected void doSalesLine() { SalesLine salesLine; SalesTable salesTable; SalesQuantity salesQuantity = SalesQuantity::construct(DocumentStatus::Invoice); SalesQty deliverNow, remainBefore, remainAfter; Query saleQuery; QueryBuildDataSource saleQbds; QueryBuildRange salesIdQbr; QueryRun saleQueryRun;

// JAEE 20121022 begin 
// salesTable = m\_oQueryRun.get(tablenum(SalesTable));
salesLine = m\_oQueryRun.get(tablenum(SalesLine));
// JAEE 20121022 end

// JAEE 20121022 begin 
//if (salesTable && salesOrderLine)
if (salesLine && salesOrderLine)
// JAEE 20121022 end
{
    // JAEE 20121022 begin 
    // 
    // saleQuery = new Query();
    // saleQbds = saleQuery.addDataSource(tableNum(SalesLine));
    // saleQbds.addSortIndex(indexNum(SalesLine, SalesLineIdx));
    // 
    // salesIdQbr = saleQbds.addRange(fieldNum(SalesLine,SalesId));
    // salesIdQbr.value(salesTable.SalesId);
    // this.addSalesLineRange(saleQbds);
    // saleQueryRun = new QueryRun(saleQuery);
    // while (saleQueryRun.next())
    // {
        // salesLine = saleQueryRun.get(tableNum(SalesLine));
    // JAEE 20121022 end
        salesLine.selectForUpdate(true);

        if (salesLine.canBeInvoiced())
        {
            \[deliverNow, RemainBefore, RemainAfter\] = salesQuantity.qtySales(salesLine, salesUpdate);

            if (deliverNow)
            {
                m\_tProjProposalTrans.clear();
                m\_tProjProposalTrans.initFromSalesLine(salesLine, deliverNow);
                m\_tProjProposalTrans.insert();
            }
        }
    // } // JAEE 20121022 commented 
}

} ´´´

Con este cambio se corrige la creación de propuestas de factura haciendo que la función correspondiente se ejecute para cada pedido, no para cada línea. Pero en el siguiente paso, al ir a registrar estas propuestas, el código sigue fallando de la misma manera:

Esto lo solucionamos modificando el método doProposal de la clase ProjInvoiceChooseNormal de esta manera:

´´´ protected void doProposal() { super();

// //  Don't create proposals for Cap projects
if (isConfigurationkeyEnabled(configurationkeynum(Project3)) && pProjTable.PSAInvoiceMethod == PSAInvoiceMethod::cap && !m\_bUseTmpProjProjProposal)
{
    return;
}
// 

if (queryEmpl & queryRun.changed(tablenum(ProjEmplTrans)))
{
    this.doEmpl();
}

if (queryCost && queryRun.changed(tablenum(ProjCostTrans)))
{
    this.doCost();
}

if ((queryRevenue || querySubscription) && queryRun.changed(tablenum(ProjRevenueTrans)))
{
    this.doRevenue();
}

if (queryItem && queryRun.changed(tablenum(ProjItemTrans)))
{
    this.doItem();
}

/\* 
if (querySalesLine && queryRun.changed(tablenum(SalesTable)))
 \*/

// JAEE 20121022 (deleted) begin
// //if (querySalesLine &&
//    (isConfigurationkeyEnabled(configurationkeynum(Project3)) ? queryRun.changed(tablenum(SalesLine)) : queryRun.changed(tablenum(SalesTable))))
// 
// JAEE 20121022 (deleted) end

if (querySalesLine && queryRun.changed(tablenum(SalesTable))) // JAEE 20121022 Original code commented by  (!?)
{
    this.doSalesLine();
}

} ´´´

Evitando de nuevo un bucle interno que se repita para cada línea. Y así, de momento, todo está funcionando. Es importante decir que esta es MI solución y que por tanto puede no ser la definitiva ya que este funcionamiento no está documentado y está solucionado mediante ensayo-error-debug. Cualquier comentario lo podéis dejar en los comentarios a la espera de que se publique el hotfix definitivo. Cualquier uso que se dé a este código debe ser probado en un entorno de validación antes de ponerlo en producción.

Se puede consultar el ticket (cerrado) sobre esta incidencia en Microsoft Connect

Descargar código