Acest articol se aplică la Microsoft Dynamics NAV pentru setările regionale de limbă indiană (in).
Simptome
Să presupunem că aveți o comandă de vânzări care are activată taxa pe preț inclus în versiunea indiană de Microsoft Dynamics NAV 2009. După ce rulați funcția Calculare valori structură , valorile Inv. Discount Amount, Unit Price excl VAT (Preț unitar fără TVA și Valoare linie fără TVA ) sunt incorecte.
Această problemă apare în cazul următoarelor produse:
- Versiunea indiană de Microsoft Dynamics NAV 2009 R2
- Versiunea indiană de Microsoft Dynamics NAV 2009 Service Pack 1 (SP1)
Rezolvare
Informații despre remedierea rapidă
O remediere rapidă acceptată este acum disponibilă de la Microsoft. Însă, scopul său este doar să corecteze problema descrisă în acest articol. Aplicați-o doar sistemelor care se confruntă cu această problemă specifică. Această remediere rapidă poate fi testată suplimentar. De aceea, dacă nu sunteți grav afectat de această problemă, vă recomandăm să așteptați următorul pachet Service Pack Microsoft Dynamics NAV sau următoarea versiune Microsoft Dynamics NAV care conține această remediere rapidă.
Notă În cazuri speciale, costurile implicate de obicei pentru apelurile de asistență pot fi revocate dacă un specialist în asistență tehnică pentru Microsoft Dynamics și produsele asociate stabilește că o anumită actualizare va rezolva problema. Costurile uzuale de suport se vor aplica pentru întrebări suplimentare de suport și pentru probleme ce nu fac obiectul actualizării în chestiune.
Informații despre instalare
Microsoft oferă exemple de programare numai în scop ilustrativ, fără nicio garanție explicită sau implicită. Aceasta include, dar nu se limitează la, garanțiile implicite de vandabilitate sau adecvare pentru un anumit scop. Acest articol presupune că sunteți familiarizat cu limbajul de programare prezentat și cu instrumentele utilizate pentru a crea și a depana proceduri. Inginerii de asistență Microsoft pot ajuta la explicarea funcționalității unei anumite proceduri, însă nu vor modifica aceste exemple pentru a furniza funcționalitate suplimentară și nu vor construi proceduri pentru a răspunde cerințelor dvs. specifice.
Notă Înainte de a instala această remediere rapidă, verificați dacă toți utilizatorii clientului Microsoft Navision sunt deconectați de la sistem. Printre aceștia se numără utilizatorii clienților Microsoft Navision Application Services (NAS). Ar trebui să fiți singurul utilizator client conectat atunci când implementați această remediere rapidă.
Pentru a implementa această remediere rapidă, trebuie să aveți o licență de dezvoltator.
Recomandăm ca contului de utilizator din fereastra Conectări Windows sau din fereastra Conectări bază de date să primească ID-ul de rol "SUPER". În cazul în care contului de utilizator nu i se poate atribui ID-ul de rol "SUPER", trebuie să verificați dacă acel cont de utilizator are următoarele permisiuni:
- Permisiunea Modificare pentru obiectul pe care îl veți modifica.
- Permisiunea de executare pentru obiectul cu ID obiect de sistem 5210 și pentru obiectul ID obiect de sistem 9015.
Notă: nu trebuie să aveți drepturi asupra depozitelor de date decât dacă trebuie să efectuați repararea datelor.
Modificări de cod
Notă: testați întotdeauna remedierile de cod într-un mediu controlat înainte de a aplica remedierile la computerele de producție.
Pentru a rezolva această problemă, urmați acești pași:
Modificați codul din declanșatorul Line Discount % - OnValidate din tabelul Linie de vânzări (37), după cum urmează:
Cod existent... "Line Discount %" := 100; // Delete the following line. IF NOT "Price Inclusive of Tax" THEN "Line Discount Amount" := ROUND(ROUND(Quantity * "Unit Price",Currency."Amount Rounding Precision") * "Line Discount %" / 100, Currency."Amount Rounding Precision") // Delete the following lines. ELSE "Line Discount Amount" := ROUND(ROUND(Quantity * "Unit Price Incl. of Tax",Currency."Amount Rounding Precision") * "Line Discount %" / 100,Currency."Amount Rounding Precision"); // End of the lines. ...Codul de înlocuire
... "Line Discount %" := 100; "Line Discount Amount" := ROUND(ROUND(Quantity * "Unit Price",Currency."Amount Rounding Precision") * "Line Discount %" / 100, Currency."Amount Rounding Precision"); ...Modificați codul din declanșatorul Line Discount Amount - OnValidate din tabelul Linie de vânzări (37), după cum urmează:
Cod existent... TESTFIELD(Quantity); // Delete the following line. IF NOT "Price Inclusive of Tax" THEN IF ROUND(Quantity * "Unit Price",Currency."Amount Rounding Precision") <> 0 THEN "Line Discount %" := ROUND( "Line Discount Amount" / ROUND(Quantity * "Unit Price",Currency."Amount Rounding Precision") * 100, 0.00001) ELSE "Line Discount %" := 0 // Delete the following lines. ELSE IF ROUND(Quantity * "Unit Price Incl. of Tax",Currency."Amount Rounding Precision") <> 0 THEN "Line Discount %" := ROUND( "Line Discount Amount" / ROUND(Quantity * "Unit Price Incl. of Tax",Currency."Amount Rounding Precision") * 100, 0.00001) ELSE "Line Discount %" := 0; // End of the lines. "Inv. Discount Amount" := 0; ...Codul de înlocuire
... TESTFIELD(Quantity); IF ROUND(Quantity * "Unit Price",Currency."Amount Rounding Precision") <> 0 THEN "Line Discount %" := ROUND( "Line Discount Amount" / ROUND(Quantity * "Unit Price",Currency."Amount Rounding Precision") * 100, 0.00001) ELSE "Line Discount %" := 0; "Inv. Discount Amount" := 0; ...Modificați codul din funcția GetSalesPriceExclusiveTaxes din tabelul Linie de vânzări (37) după cum urmează:
Cod existent... IF StrOrderDetails."Include Base" THEN BaseAmountVariable := BaseAmountVariable + Quantity; // Delete the following lines. IF StrOrderDetails."Include Line Discount" THEN BaseAmountFixed := BaseAmountFixed - "Line Discount Amount"; IF StrOrderDetails."Include Invoice Discount" THEN BEGIN BaseAmountFixed := BaseAmountFixed + "Inv Discount Fixed"; BaseAmountVariable := BaseAmountVariable - "Inv Discount Variable"; END; // End of the lines. IF SalesHeader."Currency Factor" <> 0 THEN ...Codul de înlocuire
... IF StrOrderDetails."Include Base" THEN BaseAmountVariable := BaseAmountVariable + Quantity; IF SalesHeader."Currency Factor" <> 0 THEN ...Modificați codul din funcția CalculateStructuresPIT din tabelul Linie de vânzări (37) după cum urmează:
Cod existent... SalesLine.MODIFY; // Delete the following lines. IF i < 3 THEN BEGIN FixedAmt := 0; VariableAmt := 0; AdjustedAmt := 0; DiffAdjustmentAmt := 0; FixedAmt := SalesLine."Unit Price Incl. of Tax" * SalesLine.Quantity; VariableAmt := SalesLine.Quantity; StrOrderLineDetails.RESET; StrOrderLineDetails.SETCURRENTKEY(Type,"Document Type","Document No.","Structure Code","Item No.","Line No."); StrOrderLineDetails.SETRANGE(Type,StrOrderLineDetails.Type::Sale); StrOrderLineDetails.SETRANGE("Document Type",SalesLine."Document Type"); StrOrderLineDetails.SETRANGE("Document No.",SalesLine."Document No."); StrOrderLineDetails.SETRANGE("Structure Code",SalesLine."PIT Structure"); StrOrderLineDetails.SETRANGE("Item No.",SalesLine."No."); StrOrderLineDetails.SETRANGE("Line No.",SalesLine."Line No."); StrOrderLineDetails.SETRANGE("Include PIT Calculation",TRUE); IF StrOrderLineDetails.FIND('-') THEN REPEAT FixedAmt -= StrOrderLineDetails.Amount; AdjustedAmt := AdjustedAmt + StrOrderLineDetails.Amount; UNTIL StrOrderLineDetails.NEXT = 0; SalesLine."Unit Price" := 0; IF VariableAmt <> 0 THEN BEGIN SalesLine."Unit Price" := ROUND((FixedAmt / VariableAmt),GetRoundingPrecisionUnitPrice); IF SalesLine."Unit Price" < 0 THEN SalesLine.FIELDERROR("Unit Price"); IF (i = 2) AND (FixedAmt <> 0) AND (SalesLine.Quantity <> 0) THEN BEGIN AdjustedAmt := AdjustedAmt + (SalesLine."Unit Price" * SalesLine.Quantity); FixedAmt := SalesLine."Unit Price Incl. of Tax" * SalesLine.Quantity; DiffAdjustmentAmt := ((FixedAmt - AdjustedAmt)/SalesLine.Quantity) * (SalesLine."Unit Price" * SalesLine.Quantity) / (FixedAmt ); SalesLine."Unit Price" := ROUND(SalesLine."Unit Price" - DiffAdjustmentAmt,GetRoundingPrecisionUnitPrice); IF SalesLine."Unit Price" < 0 THEN SalesLine.FIELDERROR("Unit Price"); END; SalesLine.ValidateUnitPrice; SalesLine.ChkQtyUpdatioAfterDDPLA; SalesLine.MODIFY; IF SalesHeader."Calc. Inv. Discount (%)" THEN CalcInvDis.CalculateWithSalesHeader(SalesHeader,SalesLine); SalesLine.GET(SalesLine."Document Type",SalesLine."Document No.",SalesLine."Line No."); END; END; // End of the lines. ...Codul de înlocuire
... SalesLine.MODIFY; ...Modificați codul din funcția UpdateSalesLinesPIT din tabelul Linie de vânzări (37) după cum urmează:
Cod existent... "Service Tax Amount" + "Service Tax eCess Amount" + "Service Tax SHE Cess Amount"; MODIFY; ...Codul de înlocuire
... "Service Tax Amount" + "Service Tax eCess Amount" + "Service Tax SHE Cess Amount"; // Add the following lines. "Amount To Customer UPIT" := "Line Amount" - "Inv. Discount Amount" + "Excise Amount" + "Tax Amount" + "Charges To Customer"; // End of the lines. MODIFY; ...Modificați codul din funcția PrețUnitar validat din tabelul Linie de vânzări (37) după cum urmează:
Cod existent... "Line Discount %" := 100; // Delete the following line. IF NOT "Price Inclusive of Tax" THEN "Line Discount Amount" := ROUND(ROUND(Quantity * "Unit Price",Currency."Amount Rounding Precision") * "Line Discount %" / 100, Currency."Amount Rounding Precision") // Delete the following lines. ELSE "Line Discount Amount" := ROUND(ROUND(Quantity * "Unit Price Incl. of Tax",Currency."Amount Rounding Precision") * "Line Discount %" / 100,Currency."Amount Rounding Precision"); // End of the lines. "Inv. Discount Amount" := 0; ...Codul de înlocuire
... "Line Discount %" := 100; "Line Discount Amount" := ROUND(ROUND(Quantity * "Unit Price",Currency."Amount Rounding Precision") * "Line Discount %" / 100, Currency."Amount Rounding Precision"); "Inv. Discount Amount" := 0; ...Modificați codul din funcția DivideAmount din Vânzări - Cod poștal (80) după cum urmează:
Cod existent 1... IF SalesLineQty <> Quantity THEN // Delete the following lines. IF "Price Inclusive of Tax" THEN "Line Discount Amount" := ROUND((SalesLineQty * "Unit Price Incl. of Tax") * "Line Discount %" / 100,Currency."Amount Rounding Precision") ELSE // End of the lines. "Line Discount Amount" := ROUND("Line Amount" * "Line Discount %" / 100,Currency."Amount Rounding Precision"); "Line Amount" := "Line Amount" - "Line Discount Amount"; ...Cod de înlocuire 1
... IF SalesLineQty <> Quantity THEN "Line Discount Amount" := ROUND("Line Amount" * "Line Discount %" / 100,Currency."Amount Rounding Precision"); "Line Amount" := "Line Amount" - "Line Discount Amount"; ...Cod existent 2
... "Bal. TDS/TCS Including SHECESS",Currency."Amount Rounding Precision"); // Delete the following lines. IF "Price Inclusive of Tax" THEN BEGIN "Amount To Customer UPIT" := SalesLineQty * "Unit Price"; GLSetup.GET; StrOrdLineDetails2.RESET; StrOrdLineDetails2.SETRANGE(Type,StrOrdLineDetails2.Type::Sale); StrOrdLineDetails2.SETRANGE("Document Type","Document Type"); StrOrdLineDetails2.SETRANGE("Document No.","Document No."); StrOrdLineDetails2.SETRANGE("Line No.","Line No."); StrOrdLineDetails2.SETRANGE("Include PIT Calculation",TRUE); IF StrOrdLineDetails2.FINDSET THEN REPEAT SalesLine2.GET("Document Type","Document No.","Line No."); IF StrOrdLineDetails2."Tax/Charge Type" = StrOrdLineDetails2."Tax/Charge Type"::Excise THEN "Amount To Customer UPIT" += "Excise Amount"; IF StrOrdLineDetails2."Tax/Charge Type" = StrOrdLineDetails2."Tax/Charge Type"::"Sales Tax" THEN "Amount To Customer UPIT" += "Tax Amount"; IF StrOrdLineDetails2."Tax/Charge Type" = StrOrdLineDetails2."Tax/Charge Type"::Charges THEN BEGIN IF QuantityType = QuantityType::General THEN "Amount To Customer UPIT" += ROUND(StrOrdLineDetails2.Amount * SalesLineQty / Quantity, Currency."Amount Rounding Precision"); IF QuantityType = QuantityType::Invoicing THEN "Amount To Customer UPIT" += ROUND(StrOrdLineDetails2.Amount * SalesLine2."Qty. to Invoice" / SalesLine2.Quantity, Currency."Amount Rounding Precision"); IF QuantityType = QuantityType::Shipping THEN "Amount To Customer UPIT" += ROUND(StrOrdLineDetails2.Amount * SalesLine2."Qty. to Ship" / SalesLine2.Quantity, Currency."Amount Rounding Precision"); END; UNTIL StrOrdLineDetails2.NEXT = 0; "Total UPIT Amount" := ROUND("Total UPIT Amount" * SalesLineQty / Quantity,Currency."Amount Rounding Precision"); END; // End of the lines. END; END; ...Codul de înlocuire 2
... "Bal. TDS/TCS Including SHECESS",Currency."Amount Rounding Precision"); // Add the following lines. IF "Price Inclusive of Tax" THEN "Amount To Customer UPIT" := ROUND("Line Amount" - "Inv. Discount Amount" + "Excise Amount" + "Tax Amount" + "Charges To Customer", Currency."Amount Rounding Precision"); // End of the lines. END; END; ...Modificați codul din funcția RoundAmount din Vânzări - Codul de poștă (80) după cum urmează:
Cod existent... TotalSalesLineLCY."Amount To Customer"; "Charges To Customer" := ...Codul de înlocuire
... TotalSalesLineLCY."Amount To Customer"; // Add the following lines. "Amount To Customer UPIT" := ROUND( CurrExchRate.ExchangeAmtFCYToLCY( UseDate,SalesHeader."Currency Code", TotalSalesLine."Amount To Customer UPIT",SalesHeader."Currency Factor")) - TotalSalesLineLCY."Amount To Customer UPIT"; "Total UPIT Amount" := ROUND( CurrExchRate.ExchangeAmtFCYToLCY( UseDate,SalesHeader."Currency Code", TotalSalesLine."Total UPIT Amount",SalesHeader."Currency Factor")) - TotalSalesLineLCY."Total UPIT Amount"; // End of the lines. "Charges To Customer" := ...Modificați codul din funcția ReverseAmount din unitatea de cod Vânzări - Cod poștal (80) după cum urmează:
Cod existent... "Amount To Customer" := -"Amount To Customer"; "Charges To Customer" := -"Charges To Customer"; ...Codul de înlocuire
... "Amount To Customer" := -"Amount To Customer"; // Add the following lines. Amount To Customer UPIT" := -"Amount To Customer UPIT"; Total UPIT Amount" := -"Total UPIT Amount"; // End of the lines. "Charges To Customer" := -"Charges To Customer"; ...Modificați codul din funcția InvoiceUPITRounding din Vânzări - Cod poștal (80), după cum urmează:
Cod existent 1... EXIT; // Delete the following line. UPITRoundingAmount := TotalSalesLine."Total UPIT Amount" - ROUND(TotalSalesLine."Amount To Customer UPIT"); IF UPITRoundingAmount <> 0 THEN BEGIN ...Cod de înlocuire 1
... EXIT; // Add the following line. UPITRoundingAmount := TotalSalesLine."Amount To Customer UPIT" - ROUND(TotalSalesLine."Amount To Customer UPIT"); IF UPITRoundingAmount <> 0 THEN BEGIN ...Cod existent 2
... "UPIT Rounding Inserted" := TRUE; // Delete the following line. IF SalesHeader."Prices Including VAT" THEN VALIDATE("Unit Price",UPITRoundingAmount) ...Codul de înlocuire 2
... "UPIT Rounding Inserted" := TRUE; // Add the following line. IF SalesHeader."Price Inclusive of Taxes" THEN VALIDATE("Unit Price",UPITRoundingAmount) ...
Cerințe preliminare
Trebuie să aveți instalat unul dintre următoarele produse pentru a aplica această remediere rapidă:
- Versiunea indiană de Microsoft Dynamics NAV 2009 R2
- Versiunea indiană de Microsoft Dynamics NAV 2009 Service Pack 1 (SP1)
Eliminarea informațiilor
Nu puteți elimina această remediere rapidă.
Stare
Microsoft a confirmat că aceasta este o problemă în produsele Microsoft care sunt listate în secțiunea „Se aplică la”.
Notă: Acesta este un articol "PUBLICARE RAPIDĂ" creat direct din cadrul organizației de asistență Microsoft. Informațiile din acest document sunt furnizate ca atare ca răspuns la problemele apărute. Ca urmare a vitezei de punere la dispoziție, materialele pot include erori tipografice și pot fi revizuite în orice moment fără preaviz. Consultați Condițiile de utilizare pentru alte considerente.