Questo articolo si applica a Microsoft Dynamics NAV per tutti i paesi e tutte le impostazioni locali della lingua.
Sintomi
Si supponga di generare un ordine cliente con un costo di addebito articolo in Microsoft Dynamics NAV 2009 Service Pack 1 (SP1). Quando si esegue il report Statistiche vendite (112), il report "Vendite cliente/articolo" (113), "Inventario - Report Vendite clienti (713) o il modulo Statistiche cliente (151), il profitto non è corretto. Il costo di addebito articolo non è incluso in questi report.
Causa
Questo problema si verifica perché il sistema calcola l'importo del costo usando la voce con il tipo di origine Cliente in questi report.
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:
Modificare il codice nel report Vendite cliente/articolo (113) nel modo seguente:
Codice esistente 1OnPreReport=BEGIN CustFilter := Customer.GETFILTERS; ItemLedgEntryFilter := "Value Entry".GETFILTERS; PeriodText := "Value Entry".GETFILTER("Posting Date"); IF PrintToExcel THEN MakeExcelInfo; END;Codice di sostituzione 1
OnPreReport=BEGIN CustFilter := Customer.GETFILTERS; ItemLedgEntryFilter := "Item Ledger Entry".GETFILTERS; PeriodText := "Item Ledger Entry".GETFILTER("Posting Date"); IF PrintToExcel THEN MakeExcelInfo; END;Codice esistente 2
{ 10 ;TextBox ;0 ;0 ;18150;423 ;SourceExpr="Value Entry".TABLECAPTION + ': ' + ItemLedgEntryFilter; DataSetFieldName=Value_Entry__TABLECAPTION__________ItemLedgEntryFilter }Codice di sostituzione 2
{ 10 ;TextBox ;0 ;0 ;18150;423 ;SourceExpr="Item Ledger Entry".TABLECAPTION + ': ' + ItemLedgEntryFilter; DataSetFieldName=Value_Entry__TABLECAPTION__________ItemLedgEntryFilter }Codice esistente 3
DataItemIndent=1; DataItemTable=Table5802; DataItemTableView=SORTING(Source Type,Source No.,Item No.,Posting Date) WHERE(Source Type=CONST(Customer)); OnPreDataItem=BEGIN ValueEntryBuffer.RESET; ValueEntryBuffer.DELETEALL; NextEntryNo := 1; END; OnAfterGetRecord=BEGIN ValueEntryBuffer.SETRANGE("Item No.", "Item No."); IF NOT ValueEntryBuffer.FIND('-') THEN BEGIN ValueEntryBuffer.INIT; ValueEntryBuffer."Entry No." := NextEntryNo; ValueEntryBuffer."Item No." := "Item No."; ValueEntryBuffer.INSERT; NextEntryNo := NextEntryNo + 1; END; ValueEntryBuffer."Invoiced Quantity" := ValueEntryBuffer."Invoiced Quantity" + "Invoiced Quantity"; ValueEntryBuffer."Sales Amount (Actual)" := ValueEntryBuffer."Sales Amount (Actual)" + "Sales Amount (Actual)"; ValueEntryBuffer."Cost Amount (Actual)" := ValueEntryBuffer."Cost Amount (Actual)" + "Cost Amount (Actual)"; ValueEntryBuffer."Discount Amount" := ValueEntryBuffer."Discount Amount" + "Value Entry"."Discount Amount"; ValueEntryBuffer."Cost Amount (Non-Invtbl.)" := ValueEntryBuffer."Cost Amount (Non-Invtbl.)" + "Cost Amount (Non-Invtbl.)"; ValueEntryBuffer.MODIFY; END; ReqFilterFields=Item No.,Inventory Posting Group,Posting Date; DataItemLink=Source No.=FIELD(No.), Posting Date=FIELD(Date Filter), Global Dimension 1 Code=FIELD(Global Dimension 1 Filter), Global Dimension 2 Code=FIELD(Global Dimension 2 Filter);Codice di sostituzione 3
DataItemIndent=1; DataItemTable=Table32; DataItemTableView=SORTING(Source Type,Source No.,Item No.,Variant Code,Posting Date) WHERE(Source Type=CONST(Customer)); OnPreDataItem=BEGIN ValueEntryBuffer.RESET; ValueEntryBuffer.DELETEALL; NextEntryNo := 1; END; OnAfterGetRecord=BEGIN ValueEntryBuffer.SETRANGE("Item No.", "Item No."); IF NOT ValueEntryBuffer.FIND('-') THEN BEGIN ValueEntryBuffer.INIT; ValueEntryBuffer."Entry No." := NextEntryNo; ValueEntryBuffer."Item No." := "Item No."; ValueEntryBuffer.INSERT; NextEntryNo := NextEntryNo + 1; END; CALCFIELDS("Sales Amount (Actual)","Cost Amount (Actual)","Cost Amount (Non-Invtbl.)"); ValueEntryBuffer."Invoiced Quantity" := ValueEntryBuffer."Invoiced Quantity" + "Invoiced Quantity"; ValueEntryBuffer."Sales Amount (Actual)" := ValueEntryBuffer."Sales Amount (Actual)" + "Sales Amount (Actual)"; ValueEntryBuffer."Cost Amount (Actual)" := ValueEntryBuffer."Cost Amount (Actual)" + "Cost Amount (Actual)"; ValueEntry.SETCURRENTKEY("Item Ledger Entry No."); ValueEntry.SETRANGE("Item Ledger Entry No.","Entry No."); IF ValueEntry.FINDSET THEN REPEAT ValueEntryBuffer."Discount Amount" := ValueEntryBuffer."Discount Amount" + ValueEntry."Discount Amount"; UNTIL ValueEntry.NEXT = 0; ValueEntryBuffer."Cost Amount (Non-Invtbl.)" := ValueEntryBuffer."Cost Amount (Non-Invtbl.)" + "Cost Amount (Non-Invtbl.)"; ValueEntryBuffer.MODIFY; END; ReqFilterFields=Item No.,Posting Date; DataItemLink=Source No.=FIELD(No.), Posting Date=FIELD(Date Filter), Global Dimension 1 Code=FIELD(Global Dimension 1 Filter), Global Dimension 2 Code=FIELD(Global Dimension 2 Filter);Modificare il codice nella funzione MakeExcelInfo@5 nel report Vendite cliente/articolo (113) nel modo seguente:
Codice esistenteBEGIN ExcelBuf.AddInfoColumn("Value Entry".GETFILTERS,FALSE,'',FALSE,FALSE,FALSE,'');Codice sostitutivo
BEGIN ExcelBuf.AddInfoColumn("Item Ledger Entry".GETFILTERS,FALSE,'',FALSE,FALSE,FALSE,'');Aggiungere una nuova variabile locale nella funzione Registra nel report Inventario - Vendite clienti (713) e quindi specificare la variabile nel modo seguente:
- Nome: ItemLedgerEntry@1001
- DataType: record
- Lunghezza: 32
Modificare il codice nel trigger Movimento valore - OnAfterGetRecord nel report Inventario - Vendite clienti (713) nel modo seguente:
Codice esistenteIF "Expected Cost" THEN CurrReport.SKIP; Profit := "Sales Amount (Actual)" + "Cost Amount (Actual)" + "Cost Amount (Non-Invtbl.)"; IF ISSERVICETIER THEN IF "Source No." <> '' THENCodice sostitutivo
IF "Expected Cost" THEN CurrReport.SKIP; //Add the following lines. WITH ItemLedgerEntry DO BEGIN SETRANGE("Entry No.","Item Ledger Entry No."); IF FINDFIRST THEN BEGIN CALCFIELDS("Sales Amount (Actual)","Cost Amount (Actual)","Cost Amount (Non-Invtbl.)"); Profit := "Sales Amount (Actual)" + "Cost Amount (Actual)" + "Cost Amount (Non-Invtbl.)"; END; END; //End of the lines. IF ISSERVICETIER THEN IF "Source No." <> '' THENModificare il codice nella funzione NonInvtblCostAmt nella codeunit gestione calcoli costi (5836) come segue:
Codice esistenteEND; END; //Delete the following lines. PROCEDURE NonInvtblCostAmt@29(VAR Customer@1001 : Record 18) : Decimal; VAR ValueEntry@1000 : Record 5802; BEGIN WITH ValueEntry DO BEGIN //End of the lines. SETCURRENTKEY("Source Type","Source No."); SETRANGE("Source Type","Source Type"::Customer); SETRANGE("Source No.",Customer."No.");Codice sostitutivo
END; END; //Add the following lines. PROCEDURE NonInvtblCostAmt@29(VAR Customer@1001 : Record 18) CostAmtNonInvtbl : Decimal; VAR ItemLedgerEntry@1000 : Record 32; BEGIN WITH ItemLedgerEntry DO BEGIN //End of the lines. SETCURRENTKEY("Source Type","Source No."); SETRANGE("Source Type","Source Type"::Customer); SETRANGE("Source No.",Customer."No.");Modificare il codice nella funzione NonInvtblCostAmt nella codeunit gestione calcoli costi (5836) come segue:
Codice esistenteSETFILTER("Global Dimension 1 Code",Customer."Global Dimension 1 Filter"); SETFILTER("Global Dimension 2 Code",Customer."Global Dimension 2 Filter"); //Delete the following lines. CALCSUMS("Cost Amount (Non-Invtbl.)"); EXIT("Cost Amount (Non-Invtbl.)"); //End of the lines. END; END;Codice sostitutivo
SETFILTER("Global Dimension 1 Code",Customer."Global Dimension 1 Filter"); SETFILTER("Global Dimension 2 Code",Customer."Global Dimension 2 Filter"); //Add the following lines. IF FINDSET THEN REPEAT CALCFIELDS("Cost Amount (Non-Invtbl.)"); CostAmtNonInvtbl += "Cost Amount (Non-Invtbl.)"; UNTIL NEXT = 0; EXIT(CostAmtNonInvtbl); //End of the lines. END; END;
Prerequisiti
Per applicare questo hotfix, è necessario che microsoft Dynamics NAV 2009 Service Pack 1 sia installato.
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 .