Un importo di arrotondamento di grandi dimensioni viene generato in modo non corretto quando si registra una fattura per un cliente che usa una categoria di registrazione IVA in cui il campo "Adv. Tipo di correzione fattura" è impostato su Assoluto nella versione ungherese di Microsoft Dynamics NAV 2009 R2

Si applica a
Microsoft Dynamics NAV 2009 R2

Questo articolo si applica a Microsoft Dynamics NAV per le impostazioni locali della lingua ungherese (hu).

Sintomi

Si consideri lo scenario seguente nella versione ungherese di Microsoft Dynamics NAV 2009 R2:

  • Si applica l'aggiornamento dei pagamenti anticipati per la versione ungherese di Microsoft Dynamics NAV 2009 R2.
  • Il campo Tipo di pagamento anticipato viene impostato su Avanzamento nel modulo Setup contabilità generale.
  • Impostare il campo Tipo di correzione fatturaadv . su Assoluto per una categoria di registrazione IVA.
  • Si crea un ordine di vendita per un cliente che usa la categoria di registrazione IVA.
  • Si registra un acconto e una fattura anticipata per il cliente.
  • Spedire e fatturare l'ordine cliente.

In questo scenario viene creato in modo imprevisto un movimento di arrotondamento fatture di grandi dimensioni.

Risoluzione

Informazioni sull'aggiornamento rapido

È ora disponibile un hotfix supportato da Microsoft. Tuttavia, è destinato solo a correggere il problema descritto in questo articolo. Applicala solo ai sistemi che stanno riscontrando questo problema specifico. Questo hotfix potrebbe ricevere ulteriori test. Pertanto, se non sei gravemente interessato da questo problema, ti consigliamo di attendere il prossimo Service Pack di Microsoft Dynamics NAV 2009 o la prossima versione di Microsoft Dynamics NAV che contiene questo hotfix.

Nota In casi speciali, gli addebiti normalmente sostenuti per le chiamate al supporto tecnico possono essere annullati se un professionista del supporto tecnico per Microsoft Dynamics e i prodotti correlati determinano che un aggiornamento specifico risolverà il problema. I soliti costi del supporto verranno applicati a domande e problemi di supporto aggiuntivi che non sono idonei per l'aggiornamento specifico in questione.

            
          

Informazioni sull'installazione

Microsoft fornisce esempi di programmazione a titolo puramente illustrativo, senza alcuna garanzia espressa o implicita. Ciò include, a titolo esemplificativo e non esaustivo, le garanzie implicite di commerciabilità o idoneità a uno scopo particolare. Questo articolo presuppone che si abbia familiarità con il linguaggio di programmazione oggetto della dimostrazione e con gli strumenti utilizzati per la creazione e il debug delle procedure. I tecnici del supporto Tecnico Microsoft possono spiegare le funzionalità di una particolare procedura, ma non modificarli per fornire funzionalità aggiuntive o creare procedure in base a specifici requisiti.

Nota Prima di installare questo hotfix, verificare che tutti gli utenti client di Microsoft Navision siano disconnessi dal sistema. Sono inclusi gli utenti client di Microsoft Navision Application Services (NAS). Dovresti essere l'unico utente client connesso quando implementi questo hotfix.

Per implementare questo hotfix, è necessario disporre di una licenza per sviluppatori.

È consigliabile assegnare l'ID ruolo "SUPER" all'account utente nella finestra Accessi di Windows o nella finestra Accessi database. Se all'account utente non è possibile assegnare l'ID ruolo "SUPER", è necessario verificare che l'account utente disponga delle autorizzazioni seguenti:

  • Autorizzazione modifica per l'oggetto che si desidera modificare.
  • Autorizzazione Execute per l'oggetto System Object ID 5210 e per l'oggetto System Object ID 9015.

                
Nota: non è necessario disporre dei diritti per gli archivi dati a meno che non sia necessario eseguire il ripristino dei dati.

Modifiche al codice

Nota Verifica sempre le correzioni del codice in un ambiente controllato prima di applicare le correzioni ai computer di produzione.
Per risolvere il problema, attenersi alla procedura seguente:

  1. Modificare il codice nella funzione CalcRndDiffAmt nella codeunit "Sales-Post" (80) come segue:
    Codice esistente

    ...
    // Delete the following lines.
    PROCEDURE CalcRndDiffAmt@1360025(InvAmt@1360007 : Decimal;Currency@1360000 : Record 4) : Decimal;
    BEGIN
    EXIT(CalcTotalAmtInclVAT(Currency) - (InvAmt + CalcPostedAmtInclVAT));
    // End of the lines.
    
    END;
    ...
    

    Codice sostitutivo

    ...
    // Add the following lines.
    LOCAL PROCEDURE CalcRndDiffAmt@1360025(InvAmt@1360007 : Decimal;Currency@1360000 : Record 4) : Decimal;
    VAR
    TotalAmtInclVAT@1360001 : Decimal;
    BEGIN
    TotalAmtInclVAT :=
    CalcTotalAmtInclVAT(Currency);
    IF TotalAmtInclVAT = InvAmt THEN
    EXIT(0);
    EXIT(TotalAmtInclVAT - (InvAmt + CalcPostedAmtInclVAT));
    // End of the lines.
    
    END;
    ...
    
  2. Modificare il codice nella funzione IsFinalInvoice nella codeunit "Sales-Post" (80) come segue:
    Codice esistente

    ...
    SETRANGE("Document No.",SalesHeader."No.");
    
    // Delete the following line.
    EXIT(SalesPostAdvances.FullyDeductedCustPrepmt(SalesOrderLine));
    
    END;
    ...
    

    Codice sostitutivo

    ...
    SETRANGE("Document No.",SalesHeader."No.");
    
    // Add the following line.
    EXIT(SalesPostAdvances.IsFinalCustInvoice(SalesOrderLine));
    
    END;
    ...
    
  3. Modificare il codice nella funzione CalcRndDiffAmt nella codeunit "Purch-Post" (90) come segue:
    Codice esistente

    ...
    // Delete the following lines.
    PROCEDURE CalcRndDiffAmt@1360025(InvAmt@1360007 : Decimal;Currency@1360000 : Record 4) : Decimal;
    BEGIN
    EXIT(CalcTotalAmtInclVAT(Currency) - (InvAmt - CalcPostedAmtInclVAT));
    // End of the lines.
    
    END;
    ...
    

    Codice sostitutivo

    ...
    // Add the following lines.
    LOCAL PROCEDURE CalcRndDiffAmt@1360025(InvAmt@1360007 : Decimal;Currency@1360000 : Record 4) : Decimal;
    VAR
    TotalAmtInclVAT@1360001 : Decimal;
    BEGIN
    TotalAmtInclVAT :=
    CalcTotalAmtInclVAT(Currency);
    IF TotalAmtInclVAT = InvAmt THEN
    EXIT(0);
    EXIT(TotalAmtInclVAT - (InvAmt - CalcPostedAmtInclVAT));
    // End of the lines.
    
    END;
    ...
    
  4. Modificare il codice nella funzione IsFinalInvoice nella codeunit "Purch-Post" (90) come segue:
    Codice esistente

    ...
    SETRANGE("Document No.",PurchHeader."No.");
    
    // Delete the following line.
    EXIT(PurchPostAdvances.FullyDeductedVendPrepmt(PurchOrderLine));
    
    END;
    ...
    

    Codice sostitutivo

    ...
    SETRANGE("Document No.",PurchHeader."No.");
    
    // Add the following line.
    EXIT(PurchPostAdvances.IsFinalVendInvoice(PurchOrderLine));
    
    END;
    ...
    
  5. Modificare il codice nella funzione SalesOrderProcessing nella codeunit "Sales-Post Advances" (26585) come segue:
    Codice esistente 1

    ...
    VAR
    
    // Delete the following lines.
    FullyDeducted@1360007 : Boolean;
    DocNoForVATCorr@1360006 : Code[20];
    BEGIN
    WITH SalesHeader DO BEGIN
    FullyDeducted := FullyDeductedCustPrepmt(SalesLine);
    IF FullyDeducted THEN
    // End of the lines.
    
    InvoicedAmount :=
    ...
    

    Codice di sostituzione 1

    ...
    VAR
    
    // Add the following lines.
    IsFinalInvoice@1360007 : Boolean;
    DocNoForVATCorr@1360006 : Code[20];
    BEGIN
    WITH SalesHeader DO BEGIN
    IsFinalInvoice := IsFinalCustInvoice(SalesLine);
    IF IsFinalInvoice THEN
    // End of the lines.
    
    InvoicedAmount :=
    ...
    

    Codice esistente 2

    ...
    SalesLine,SalesInvHeader,LinkedAdvanceEntry,DocNoForVATCorr,
    
    // Delete the following line.
    FullyDeducted,TempJnlLineDim,InvoicedAmount,Post);
    
    UNTIL SalesLine.NEXT = 0;
    ...
    

    Codice di sostituzione 2

    ...
    SalesLine,SalesInvHeader,LinkedAdvanceEntry,DocNoForVATCorr,
    
    // Add the following line.
    IsFinalInvoice,TempJnlLineDim,InvoicedAmount,Post);
    
    UNTIL SalesLine.NEXT = 0;
    ...
    
  6. Modificare il codice nella funzione FullyDeductedCustPrepmt della codeunit "Sales-Post Advances" (26585) come segue:
    Codice esistente 1

    ...
    // Delete the following line.
    PROCEDURE FullyDeductedCustPrepmt@1470047(VAR SalesLine@1470000 : Record 37) : Boolean;
    
    BEGIN
    ...
    
    

    Codice di sostituzione 1

    ...
    // Add the following line.
    PROCEDURE IsFinalCustInvoice@1470047(VAR SalesLine@1470000 : Record 37) : Boolean;
    
    BEGIN
    ...
    

    Codice esistente 2

    ...
    SetSalesLineToPost(SalesLine);
    
    // Delete the following line.
    IF SalesLine."Prepmt Amt to Deduct" + SalesLine."Prepmt Amt Deducted" <> SalesLine."Prepmt. Amt. Inv." THEN
    
    EXIT(FALSE);
    ...
    

    Codice di sostituzione 2

    ...
    SetSalesLineToPost(SalesLine);
    
    // Add the following line.
    IF SalesLine."Qty. to Invoice" + SalesLine."Quantity Invoiced" <> SalesLine.Quantity THEN
    
    EXIT(FALSE);
    ...
    
  7. Modificare il codice nella funzione CollectFullyDeductedOrders nella codeunit "Sales-Post Advances" (26858) come segue:
    Codice esistente 1

    ...
    TempSalesOrderLine@1360003 : TEMPORARY Record 37;
    
    // Delete the following line.
    FullyDeducted@1360004 : Boolean;
    
    BEGIN
    ...
    

    Codice di sostituzione 1

    ...
    TempSalesOrderLine@1360003 : TEMPORARY Record 37;
    
    // Add the following line.
    IsFinalInvoice@1360004 : Boolean;
    
    BEGIN
    ...
    

    Codice esistente 2

    ...
    FilterSalesOrderLineWithHeader(SalesOrderLine,FullyDeductedOrder);
    
    // Delete the following lines.
    FullyDeducted := FullyDeductedOrder.FIND;
    IF NOT FullyDeducted THEN BEGIN
    FullyDeducted := FullyDeductedCustPrepmt(SalesOrderLine);
    IF FullyDeducted THEN
    FullyDeductedOrder.INSERT;
    END;
    IF FullyDeducted THEN BEGIN
    // End of the lines.
    
    FillSalesOrderLineFromSalesInv(TempSalesOrderLine,SalesOrderLine);
    ...
    

    Codice di sostituzione 2

    ...
    FilterSalesOrderLineWithHeader(SalesOrderLine,FullyDeductedOrder);
    
    // Add the following lines.
    IsFinalInvoice := FullyDeductedOrder.FIND;
    IF NOT IsFinalInvoice THEN BEGIN
    IsFinalInvoice := IsFinalCustInvoice(SalesOrderLine);
    IF IsFinalInvoice THEN
    FullyDeductedOrder.INSERT;
    END;
    IF IsFinalInvoice THEN BEGIN
    // End of the lines.
    
    FillSalesOrderLineFromSalesInv(TempSalesOrderLine,SalesOrderLine);
    ...
    
  8. Modificare il codice nella funzione PurchOrderProcessing nella codeunit "Purchace-Post Advances" (26586) come segue:
    Codice esistente 1

    ...
    VAR
    
    // Delete the following lines.
    FullyDeducted@1360007 : Boolean;
    DocNoForVATCorr@1360006 : Code[20];
    BEGIN
    WITH PurchHeader DO BEGIN
    FullyDeducted := FullyDeductedVendPrepmt(PurchLine);
    IF FullyDeducted THEN
    // End of the lines.
    
    InvoicedAmount :=
    ...
    

    Codice di sostituzione 1

    ...
    VAR
    
    // Add the following lines.
    IsFinalInvoice@1360007 : Boolean;
    DocNoForVATCorr@1360006 : Code[20];
    BEGIN
    WITH PurchHeader DO BEGIN
    IsFinalInvoice := IsFinalVendInvoice(PurchLine);
    IF IsFinalInvoice THEN
    // End of the lines.
    
    InvoicedAmount :=
    ...
    

    Codice esistente 2

    ...
    PurchLine,PurchInvHeader,LinkedAdvanceEntry,DocNoForVATCorr,
    
    // Delete the following line.
    FullyDeducted,TempJnlLineDim,InvoicedAmount,Post);
    
    UNTIL PurchLine.NEXT = 0;
    ...
    

    Codice di sostituzione 2

    ...
    PurchLine,PurchInvHeader,LinkedAdvanceEntry,DocNoForVATCorr,
    
    // Add the following line.
    IsFinalInvoice,TempJnlLineDim,InvoicedAmount,Post);
    
    UNTIL PurchLine.NEXT = 0;
    ...
    
  9. Modificare il codice nella funzione FullyDeductedVendPrepmt nella codeunit "Purchace-Post Advances" (26586) come segue:
    Codice esistente 1

    ...
    // Delete the following line.
    PROCEDURE FullyDeductedVendPrepmt@1470047(VAR PurchLine@1470000 : Record 39) : Boolean;
    
    BEGIN
    ...
    

    Codice di sostituzione 1

    ...
    // Add the following line.
    PROCEDURE IsFinalVendInvoice@1470047(VAR PurchLine@1470000 : Record 39) : Boolean;
    
    BEGIN
    ...
    

    Codice esistente 2

    ...
    SetPurchLineToPost(PurchLine);
    
    // Delete the following line.
    IF PurchLine."Prepmt Amt to Deduct" + PurchLine."Prepmt Amt Deducted" <> PurchLine."Prepmt. Amt. Inv." THEN
    
    EXIT(FALSE);
    ...
    

    Codice di sostituzione 2

    ...
    SetPurchLineToPost(PurchLine);
    
    // Add the following line.
    IF PurchLine."Qty. to Invoice" + PurchLine."Quantity Invoiced" <> PurchLine.Quantity THEN
    
    EXIT(FALSE);
    ...
    
  10. Modificare il codice nella funzione CollectFullyDeductedOrders nella codeunit "Purchace-Post Advances" (26586) come segue:
    Codice esistente 1

    ...
    TempPurchOrderLine@1360003 : TEMPORARY Record 39;
    
    // Delete the following line.
    FullyDeducted@1360004 : Boolean;
    
    BEGIN
    ...
    

    Codice di sostituzione 1

    ...
    TempPurchOrderLine@1360003 : TEMPORARY Record 39;
    
    // Add the following line.
    IsFinalInvoice@1360004 : Boolean;
    
    BEGIN
    ...
    

    Codice esistente 2

    ...
    FilterPurchOrderLineWithHeader(PurchOrderLine,FullyDeductedOrder);
    
    // Delete the following lines.
    FullyDeducted := FullyDeductedOrder.FIND;
    IF NOT FullyDeducted THEN BEGIN
    FullyDeducted := FullyDeductedVendPrepmt(PurchOrderLine);
    IF FullyDeducted THEN
    FullyDeductedOrder.INSERT;
    END;
    IF FullyDeducted THEN BEGIN
    // End of the lines.
    
    FillPurchOrderLineFromPurchInv(TempPurchOrderLine,PurchOrderLine);
    ...
    

    Codice di sostituzione 2

    ...
    FilterPurchOrderLineWithHeader(PurchOrderLine,FullyDeductedOrder);
    
    // Add the following lines.
    IsFinalInvoice := FullyDeductedOrder.FIND;
    IF NOT IsFinalInvoice THEN BEGIN
    IsFinalInvoice := IsFinalVendInvoice(PurchOrderLine);
    IF IsFinalInvoice THEN
    FullyDeductedOrder.INSERT;
    END;
    IF IsFinalInvoice THEN BEGIN
    // End of the lines.
    
    FillPurchOrderLineFromPurchInv(TempPurchOrderLine,PurchOrderLine);
    ...
    

Prerequisiti

Per applicare questo hotfix, è necessario avere la versione ungherese di Microsoft Dynamics NAV 2009 R2 con l'aggiornamento Prepayments.

Informazioni sulla rimozione

Non è possibile rimuovere questo hotfix.

Stato

Microsoft ha confermato che si tratta di un problema relativo ai prodotti elencati nella sezione "Si applica a".

Nota Questo è un articolo "FAST PUBLISH" creato direttamente dall'organizzazione di supporto Microsoft. Le informazioni contenute nel presente documento vengono fornite così come sono in risposta ai problemi emergenti. A causa della velocità di reso disponibile, i materiali possono includere errori tipografici e possono essere modificati in qualsiasi momento senza preavviso. Per altre considerazioni, vedere Condizioni per l'utilizzo .