Ця стаття стосується microsoft Dynamics NAV для угорської мови (hu).
Ознаки
Припустімо, що ви використовуєте метод оплати з рахунку округлення точність параметр у угорській версії Microsoft Dynamics NAV 2009 R2. Крім того, для типу округлення встановлено значення Найближче. У цій ситуації округлення неправильний і остаточний обсяг неправильний.
Спосіб усунення проблеми
Відомості про виправлення
Від корпорації Майкрософт доступне виправлення, що підтримується. Однак вона призначена лише для виправлення проблеми, описаної в цій статті. Застосуйте її лише до систем, у яких виникла ця проблема. Це виправлення може отримати додаткове тестування. Таким чином, якщо ви не серйозно постраждали від цієї проблеми, ми радимо дочекатися наступного Microsoft Dynamics NAV 2009 пакет оновлень або наступної версії Microsoft Dynamics NAV, яка містить це виправлення.
Примітка У особливих випадках стягнення плати, які зазвичай понесені для викликів підтримки, може бути скасовано, якщо спеціаліст служби технічної підтримки Microsoft Dynamics і пов'язані продукти визначать, що конкретне оновлення вирішить вашу проблему. Звичайні витрати на підтримку застосовуватимуться до додаткових запитань і питань підтримки, які не відповідають вимогам для конкретного оновлення, про яке йде мова.
Відомості про інсталяцію
Корпорація Майкрософт надає приклади програмування лише для ілюстрації без жодних гарантій, явних або неявних. Це стосується зокрема неявних гарантій щодо придатності до продажу чи придатності для певної мети. У цій статті припускається, що ви знайомі з мовою програмування, яка демонструється, і з інструментами, які використовуються для створення і налагодження процедур. Спеціалісти служби підтримки Microsoft можуть пояснити вам функціональні можливості певної процедури. Однак вони не змінюватимуть ці приклади, щоб надавати додаткові функції або конструювати процедури відповідно до ваших конкретних вимог.
Примітка. Перш ніж інсталювати це виправлення, переконайтеся, що всі користувачі клієнта Microsoft Navision, вийти із системи. Це стосується користувачів клієнтських служб Microsoft Navision (NAS). Ви повинні бути єдиним клієнтом користувача, який ввійшов, коли ви впроваджуєте це виправлення.
Щоб реалізувати це виправлення, потрібно мати ліцензію розробника.
Радимо призначити обліковому запису користувача у вікні "Вхід у Windows" або у вікні "Вхід до бази даних" ідентифікатор ролі "SUPER". Якщо обліковому запису користувача не вдалося призначити ідентифікатор ролі SUPER, переконайтеся, що обліковий запис має такі дозволи:
- Дозвіл на змінення об'єкта, який буде змінюватися.
- Дозвіл Execute для об'єкта System Object ID 5210 і для об'єкта System Object ID 9015.
Примітка. Ви не повинні мати права на зберігання даних, якщо не потрібно відновлювати дані.
Зміни коду
Примітка. Завжди перевіряйте виправлення коду в контрольованому середовищі, перш ніж застосовувати виправлення до робочих комп'ютерів.
Щоб вирішити цю проблему, виконайте такі дії:
Додати новий prepmtAmtToDeduct( PricesIncludingVAT: Boolean; PrepaymentPct: Decimal) : decimal function in the Sales Line table (37). Ось як це зробити:
Додайте локальну змінну, а потім укажіть змінну в такий спосіб:
- Ім'я: VATFactor
- Тип даних: десяткове число
Додайте код, як виконайте наведені нижче дії.
IF PricesIncludingVAT THEN VATFactor := (1 + "VAT %" / 100) ELSE VATFactor := 1; EXIT( ROUND( ROUND( ROUND( ROUND("Unit Price" * "Qty. to Invoice",Currency."Amount Rounding Precision") * (1 - ("Line Discount %" / 100)),Currency."Amount Rounding Precision") * (PrepaymentPct / 100) / VATFactor,Currency."Amount Rounding Precision") * VATFactor,Currency."Amount Rounding Precision"));
Змініть функцію CalcPrepaymentToDeduct у таблиці "Рядок продажів" (37). Ось як це зробити:
Видаліть такі локальні змінні:
PrepmtPct: Decimal; AbsoluteAdvCorrection: Boolean;Додайте такі локальні змінні:
TotalPrepmtAmtToDeduct: Decimal; HundredPct: Decimal;Замініть код таким станом:
IF (Quantity - "Quantity Invoiced") <> 0 THEN BEGIN TotalPrepmtAmtToDeduct := "Prepmt. Amt. Inv." - "Prepmt Amt Deducted"; GetSalesHeader; IF SalesHeader."Prepayment Type" = SalesHeader."Prepayment Type"::Advance THEN BEGIN VATPostingSetup.GET("VAT Bus. Posting Group","VAT Prod. Posting Group"); CASE VATPostingSetup."Adv. Invoice Correction Type" OF VATPostingSetup."Adv. Invoice Correction Type"::Percentage: "Prepmt Amt to Deduct" := ROUND("Qty. to Invoice" / (Quantity - "Quantity Invoiced") * TotalPrepmtAmtToDeduct,Currency."Amount Rounding Precision"); VATPostingSetup."Adv. Invoice Correction Type"::Absolute: BEGIN HundredPct := 100; "Prepmt Amt to Deduct" := PrepmtAmtToDeduct(SalesHeader."Prices Including VAT",HundredPct); IF "Prepmt Amt to Deduct" > TotalPrepmtAmtToDeduct THEN "Prepmt Amt to Deduct" := TotalPrepmtAmtToDeduct; END; VATPostingSetup."Adv. Invoice Correction Type"::"Fully Invoiced": IF "Qty. to Invoice" = Quantity - "Quantity Invoiced" THEN "Prepmt Amt to Deduct" := TotalPrepmtAmtToDeduct ELSE "Prepmt Amt to Deduct" := 0; END; END ELSE "Prepmt Amt to Deduct" := PrepmtAmtToDeduct(SalesHeader."Prices Including VAT","Prepayment %"); END ELSE "Prepmt Amt to Deduct" := 0
Додати новий prepmtAmtToDeduct( PricesIncludingVAT: Boolean; PrepaymentPct: Decimal) : decimal function in the Purchase Line table (39). Ось як це зробити:
Додайте локальну змінну, а потім укажіть змінну в такий спосіб:
- Ім'я: VATFactor
- Тип даних: десяткове число
Додайте код, як виконайте наведені нижче дії.
IF PricesIncludingVAT THEN VATFactor := (1 + "VAT %" / 100) ELSE VATFactor := 1; EXIT( ROUND( ROUND( ROUND( ROUND("Unit Cost" * "Qty. to Invoice",Currency."Amount Rounding Precision") * (1 - ("Line Discount %" / 100)),Currency."Amount Rounding Precision") * (PrepaymentPct / 100) / VATFactor,Currency."Amount Rounding Precision") * VATFactor,Currency."Amount Rounding Precision"));
Змініть функцію CalcPrepaymentToDeduct у таблиці "Рядок продажів" (37). Ось як це зробити:
Видаліть такі локальні змінні:
PrepmtPct: Decimal; AbsoluteAdvCorrection: Boolean;Додайте такі локальні змінні:
TotalPrepmtAmtToDeduct: Decimal; HundredPct: Decimal;Замініть код таким станом:
IF (Quantity - "Quantity Invoiced") <> 0 THEN BEGIN TotalPrepmtAmtToDeduct := "Prepmt. Amt. Inv." - "Prepmt Amt Deducted"; GetPurchHeader; IF PurchHeader."Prepayment Type" = PurchHeader."Prepayment Type"::Advance THEN BEGIN VATPostingSetup.GET("VAT Bus. Posting Group","VAT Prod. Posting Group"); CASE VATPostingSetup."Adv. Invoice Correction Type" OF VATPostingSetup."Adv. Invoice Correction Type"::Percentage: "Prepmt Amt to Deduct" := ROUND("Qty. to Invoice" / (Quantity - "Quantity Invoiced") * TotalPrepmtAmtToDeduct,Currency."Amount Rounding Precision"); VATPostingSetup."Adv. Invoice Correction Type"::Absolute: BEGIN HundredPct := 100; "Prepmt Amt to Deduct" := PrepmtAmtToDeduct(PurchHeader."Prices Including VAT",HundredPct); IF "Prepmt Amt to Deduct" > TotalPrepmtAmtToDeduct THEN "Prepmt Amt to Deduct" := TotalPrepmtAmtToDeduct; END; VATPostingSetup."Adv. Invoice Correction Type"::"Fully Invoiced": IF "Qty. to Invoice" = Quantity - "Quantity Invoiced" THEN "Prepmt Amt to Deduct" := TotalPrepmtAmtToDeduct ELSE "Prepmt Amt to Deduct" := 0; END; END ELSE "Prepmt Amt to Deduct" := PrepmtAmtToDeduct(PurchHeader."Prices Including VAT","Prepayment %"); END ELSE "Prepmt Amt to Deduct" := 0
Змініть код у функції InitInvoiceRoundingLine у коді Sales-Post Передплати (442), як виконайте наведені нижче дії.
Наявний код... IF SalesHeader."Currency Code" = '' THEN Currency.InitRoundingPrecision ELSE Currency.GET(SalesHeader."Currency Code"); ...Код заміни
... IF SalesHeader."Currency Code" = '' THEN BEGIN Currency.SetDocumentType(SalesHeader."Document Type"); Currency.SetPaymentMethod(SalesHeader."Payment Method Code"); Currency.InitRoundingPrecision; END ELSE Currency.GET(SalesHeader."Currency Code"); ...Змініть код у функції InsertLineRelation у коді Sales-Post Передплати (442), як виконайте наведені нижче дії.
Наявний код... IF SalesHeader."Currency Code" = '' THEN Currency.InitRoundingPrecision ELSE Currency.GET(SalesHeader."Currency Code"); ...Код заміни
... IF SalesHeader."Currency Code" = '' THEN BEGIN Currency.SetDocumentType(SalesHeader."Document Type"); Currency.SetPaymentMethod(SalesHeader."Payment Method Code"); Currency.InitRoundingPrecision; END ELSE Currency.GET(SalesHeader."Currency Code"); ...Змініть код у функції InsertInvoiceRounding у коді Sales-Post Передплати (442), як виконайте наведені нижче дії.
Наявний код... "G/L Account No." := SalesLine."No."; "Dimension Entry No." := InsertInDimBuffer(TempDocDim,SalesLine); ...Код заміни
... "G/L Account No." := SalesLine."No."; // Add the following line Description := SalesLine.Description; "Dimension Entry No." := InsertInDimBuffer(TempDocDim,SalesLine); ...Змініть код у функції InsertInvoiceRounding у коді Purchase-Post Prepayments codeunit (444), як виконайте наведені нижче дії.
Наявний код... "G/L Account No." := PurchLine."No."; "Dimension Entry No." := InsertInDimBuffer(TempDocDim,PurchLine); ...Код заміни
... "G/L Account No." := PurchLine."No."; // Add the following line. Description := PurchLine.Description; "Dimension Entry No." := InsertInDimBuffer(TempDocDim,PurchLine); ...Змініть код у функції InitInvoiceRoundingLine у коді 444(444) Purchase-Post prepayments, як виконайте наведені нижче дії.
Наявний код... IF PurchHeader."Currency Code" = '' THEN Currency.InitRoundingPrecision ELSE Currency.GET(PurchHeader."Currency Code"); ...Код заміни
... IF PurchHeader."Currency Code" = '' THEN BEGIN Currency.SetDocumentType(PurchHeader."Document Type"); Currency.SetPaymentMethod(PurchHeader."Payment Method Code"); Currency.InitRoundingPrecision; END ELSE Currency.GET(PurchHeader."Currency Code"); ...Змініть код у функції InsertLineRelation у коді Purchase-Post Передплати (444), як виконайте наведені нижче дії.
Наявний код... IF PurchHeader."Currency Code" = '' THEN Currency.InitRoundingPrecision ELSE Currency.GET(PurchHeader."Currency Code"); ...Код заміни
... IF PurchHeader."Currency Code" = '' THEN BEGIN Currency.SetDocumentType(PurchHeader."Document Type"); Currency.SetPaymentMethod(PurchHeader."Payment Method Code"); Currency.InitRoundingPrecision; END ELSE Currency.GET(PurchHeader."Currency Code"); ...Додайте нову функцію LineRelationExists(LetterLine: Record 26586) : Boolean (логічна функція) у коді Sales-Post Advances (26585). Ось як це зробити:
Додайте локальну змінну, а потім укажіть змінну в такий спосіб:
- Ім'я: Зв'язок між рядками
- Тип даних: запис 26592
Додайте код, як виконайте наведені нижче дії.
WITH LineRelation DO BEGIN SETRANGE(Type,Type::Sale); SETRANGE("Letter No.",LetterLine."Letter No."); SETRANGE("Letter Line No.",LetterLine."Line No."); EXIT(NOT ISEMPTY); END;
Додати нове оновленняAmountToApply( LetterLine: Record 26592; Vat LinkedAdvanceEntry: Record 21) (Запис 21) (функція Sales-Post Advances codeunit (26585). Ось як це зробити:
Додайте локальну змінну, а потім укажіть змінну в такий спосіб:
- Ім'я: посилання
- Тип даних: запис 26590
Додайте локальну змінну, а потім укажіть змінну в такий спосіб:
- Ім'я: CustLedgEntry
- Тип даних: запис 21
Додайте код, як виконайте наведені нижче дії.
WITH Link DO BEGIN SETRANGE("Entry Type","Entry Type"::"Link To Letter"); SETRANGE("Document No.",LetterLine."Letter No."); SETRANGE("Line No.",LetterLine."Line No."); IF FINDSET THEN REPEAT IF CustLedgEntry.GET("CV Ledger Entry No.") THEN BEGIN CustLedgEntry.CALCFIELDS("Remaining Amount"); IF CustLedgEntry."Remaining Amount" <> -LinkedAdvanceEntry."Amount to Apply" THEN IF LinkedAdvanceEntry.GET(CustLedgEntry."Entry No.") THEN BEGIN LinkedAdvanceEntry."Amount to Apply" := LinkedAdvanceEntry."Amount to Apply" + Amount; LinkedAdvanceEntry.MODIFY; END ELSE BEGIN LinkedAdvanceEntry := CustLedgEntry; LinkedAdvanceEntry."Amount to Apply" := Amount; LinkedAdvanceEntry."Currency Code" := "Currency Code"; LinkedAdvanceEntry.INSERT; END; END; UNTIL NEXT = 0; END;
Додати нову лінію addRoundingLine(LetterLine: Record 26586; SalesInvHeader: Record 112; VAR LinkedAdvanceEntry: Record 21; LastLetterNo: код [20]) : Вираховуваний_обсяг: десятковий
у Sales-Post Advances codeunit (26585), як виконайте наведені нижче дії.LetterLine.SETRANGE("Letter No.",LetterLine."Letter No."); LetterLine.SETFILTER("Line No.",'>%1',LetterLine."Line No."); LetterLine.SETFILTER("Amount To Deduct",'<>0'); IF LetterLine.FINDSET(TRUE) THEN REPEAT IF NOT LineRelationExists(LetterLine) THEN BEGIN DeductedAmount := DeductedAmount + LetterLine."Amount To Deduct"; LetterLine."Amount Deducted" := LetterLine."Amount Deducted" + LetterLine."Amount To Deduct"; LetterLine."Amount To Deduct" := 0; LetterLine.MODIFY(TRUE); UpdateAmountToApply(LetterLine,LinkedAdvanceEntry); AddPrepmtSalesInvLine(LetterLine,SalesInvHeader,LetterLine."Amount Deducted",LetterLine."VAT Amount",LastLetterNo); END; UNTIL LetterLine.NEXT = 0;Змініть код у функції PostInvoiceCorrection у Sales-Post Advances codeunit (26585), як виконайте такі дії:
Наявний код... FullyDeducted := FullyDeductedCustPrepmt(SalesLine); // Delete the following lines. IF FullyDeducted THEN DeductRndLetterLines(SalesHeader."No."); // End of thelines. ...Код заміни
... FullyDeducted := FullyDeductedCustPrepmt(SalesLine); ...Змініть код у функції DeductRndLetterLines у коді 26585 Sales-Post Advances codeunit (26585).
Наявний код... AddPrepmtSalesInvLine(LetterLine,SalesInvHeader,AmountToDeduct,VATAmount,LastLetterNo); END; UNTIL LineRelation.NEXT = 0;Код заміни
... AddPrepmtSalesInvLine(LetterLine,SalesInvHeader,AmountToDeduct,VATAmount,LastLetterNo); // Add the following lines. IF SalesLine."Prepmt Amt to Deduct" + SalesLine."Prepmt Amt Deducted" = SalesLine."Prepmt. Amt. Inv." THEN InvoicedAmount := InvoicedAmount + AddRoundingLine(LetterLine,SalesInvHeader,LinkedAdvanceEntry,LastLetterNo); // End of the lines. END; UNTIL LineRelation.NEXT = 0; ...Додайте нову функцію LineRelationExists(LetterLine: Record 26588) у коді Purchase-Post Advances (26586). Ось як це зробити:
Додайте локальну змінну, а потім укажіть змінну в такий спосіб:
- Ім'я: Зв'язок між рядками
- Тип даних: запис 26592
Додайте код, як виконайте наведені нижче дії.
WITH LineRelation DO BEGIN SETRANGE(Type,Type::Purchase); SETRANGE("Letter No.",LetterLine."Letter No."); SETRANGE("Letter Line No.",LetterLine."Line No."); EXIT(NOT ISEMPTY); END;
Додати нове оновленняAmountToApply( LetterLine: Record 26588; VAR LinkedAdvanceEntry: Record 25) (Функція VAR LinkedAdvanceEntry: Record 25) у коді Purchase-Post Advances codeunit (26586). Ось як це зробити:
Додайте локальну змінну, а потім укажіть змінну в такий спосіб:
- Ім'я: LetterLine
- Тип даних: запис 26588
Додайте локальну змінну, а потім укажіть змінну в такий спосіб:
- Ім'я: VendorLedgEntry
- Тип даних: запис 25
Додайте код, як виконайте наведені нижче дії.
WITH Link DO BEGIN SETRANGE("Entry Type","Entry Type"::"Link To Letter"); SETRANGE("Document No.",LetterLine."Letter No."); SETRANGE("Line No.",LetterLine."Line No."); IF FINDSET THEN REPEAT IF VendorLedgEntry.GET("CV Ledger Entry No.") THEN BEGIN VendorLedgEntry.CALCFIELDS("Remaining Amount"); IF VendorLedgEntry."Remaining Amount" <> -LinkedAdvanceEntry."Amount to Apply" THEN IF LinkedAdvanceEntry.GET(VendorLedgEntry."Entry No.") THEN BEGIN LinkedAdvanceEntry."Amount to Apply" := LinkedAdvanceEntry."Amount to Apply" + Amount; LinkedAdvanceEntry.MODIFY; END ELSE BEGIN LinkedAdvanceEntry := VendorLedgEntry; LinkedAdvanceEntry."Amount to Apply" := Amount; LinkedAdvanceEntry."Currency Code" := "Currency Code"; LinkedAdvanceEntry.INSERT; END; END; UNTIL NEXT = 0; END;
Додати нову надбудову AddRoundingLine(LetterLine: Record 26588; PurchInvHeader: Record 122; VAR LinkedAdvanceEntry: Record 25; LastLetterNo: Код [20]) : DeductedAmount: Decimal (функція Decimal) у коді 26586 Purchase-Post Advances codeunit (26586), як описано нижче.
LetterLine.SETRANGE("Letter No.",LetterLine."Letter No."); LetterLine.SETFILTER("Line No.",'>%1',LetterLine."Line No."); LetterLine.SETFILTER("Amount To Deduct",'<>0'); IF LetterLine.FINDSET(TRUE) THEN REPEAT IF NOT LineRelationExists(LetterLine) THEN BEGIN DeductedAmount := DeductedAmount + LetterLine."Amount To Deduct"; LetterLine."Amount Deducted" := LetterLine."Amount Deducted" + LetterLine."Amount To Deduct"; LetterLine."Amount To Deduct" := 0; LetterLine.MODIFY(TRUE); UpdateAmountToApply(LetterLine,LinkedAdvanceEntry); AddPrepmtPurchInvLine(LetterLine,PurchInvHeader,LetterLine."Amount Deducted",LetterLine."VAT Amount",LastLetterNo); END; UNTIL LetterLine.NEXT = 0;Змініть код у функції PostInvoiceCorrection у коді 26586 Purchase-Post Advances codeunit (26586):
Наявний код... FullyDeducted := FullyDeductedVendPrepmt(PurchLine); // Delete the following lines. IF FullyDeducted THEN DeductRndLetterLines(PurchHeader."No."); // End of the lines. PurchLine.SETFILTER("Prepmt Amt to Deduct",'<>0'); ...Код заміни
... FullyDeducted := FullyDeductedVendPrepmt(PurchLine); PurchLine.SETFILTER("Prepmt Amt to Deduct",'<>0'); ...Видаліть функцію DeductRndLetterLines у коді 26586 Purchase-Post Advances codeunit (26586).
Змініть код у функції PostInvLineCorrection у коді 26586 Purchase-Post Advances codeunit (26586):
Наявний код... AddPrepmtPurchInvLine(LetterLine,PurchInvHeader,AmountToDeduct,VATAmount,LastLetterNo); END; UNTIL LineRelation.NEXT = 0; ...Код заміни
... AddPrepmtPurchInvLine(LetterLine,PurchInvHeader,AmountToDeduct,VATAmount,LastLetterNo); // Add the following lines. IF PurchLine."Prepmt Amt to Deduct" + PurchLine."Prepmt Amt Deducted" = PurchLine."Prepmt. Amt. Inv." THEN InvoicedAmount := InvoicedAmount + AddRoundingLine(LetterLine,PurchInvHeader,LinkedAdvanceEntry,LastLetterNo); // End of the lines. END; UNTIL LineRelation.NEXT = 0; ...
Попередні вимоги
Щоб застосувати це виправлення, потрібно мати угорську версію Microsoft Dynamics NAV 2009 R2.
Відомості про видалення
Не можна видалити це виправлення.
Стан
Корпорація Microsoft підтвердила, що це одна з проблем з продуктами Microsoft, перелічених у розділі "Застосовується до".
Примітка. Це стаття "FAST PUBLISH", створена безпосередньо з організації підтримки Корпорації Майкрософт. Інформація, що міститься в цьому документі, надається як у відповідь на нові проблеми. В результаті швидкості її використання матеріали можуть включати друкарські помилки і можуть бути переглянуті в будь-який час без попередження. Інші зауваження див. в розділі Умови використання .