Niektóre zapisy księgi głównej są księgowane nieprawidłowo, gdy w portugalskiej wersji systemu Microsoft Dynamics NAV 2009 księgowany jest jednocześnie dziennik paragonów z fakturą i fakturą odrzuconą

Dotyczy
Dynamics NAV 2009

Ten artykuł dotyczy systemu Microsoft Dynamics NAV dla ustawień regionalnych języka portugalskiego (pt).

Objawy

Podczas księgowania arkusza przyjęć gotówkowych jednocześnie z fakturą i fakturą odrzuconą w portugalskiej wersji systemu Microsoft Dynamics NAV 2009 wszystkie zaksięgowane zapisy księgi głównej są księgowane przy użyciu konta Odrzuć rachunki. Do wystawienia faktury należy jednak użyć konta Należności, a dla odrzuconego dokumentu konta odrzuconych rachunków. Ten problem występuje w następujących produktach:

  • Portugalska wersja systemu Microsoft Dynamics NAV 2009 R2
  • Portugalska wersja systemu Microsoft Dynamics NAV 2009 z dodatkiem Service Pack 1

Rozwiązanie

Informacje o poprawkach

Firma Microsoft udostępnia obsługiwaną poprawkę. Jednak jego celem jest tylko rozwiązanie problemu opisanego w tym artykule. Stosuj ją tylko do systemów, w których występuje ten specyficzny problem. Ta poprawka może zostać poddana dodatkowym testom. Dlatego jeśli ten problem nie dotyczy użytkownika, zaleca się zaczekanie na następny dodatek Service Pack dla systemu Microsoft Dynamics NAV 2009 lub wersję systemu Microsoft Dynamics NAV zawierającą tę poprawkę.

Uwaga W wyjątkowych przypadkach użytkownik telefonujący do pomocy technicznej może zostać zwolniony z opłaty, jeśli specjalista pomocy technicznej ds. oprogramowania Microsoft Dynamics i produktów pokrewnych ustali, że określona aktualizacja rozwiązuje zgłoszony problem. Normalne koszty pomocy technicznej będą dotyczyć dodatkowych pytań oraz problemów, których rozwiązanie nie jest objęte określoną aktualizacją.

          

Informacje dotyczące instalacji

Firma Microsoft udostępnia przykłady programowania wyłącznie w celach ilustracyjnych, bez gwarancji wyrażonej lub dorozumianej. To obejmuje między innymi dorozumiane gwarancje przydatności handlowej lub przydatności do określonego celu. W tym artykule założono, że znasz język programowania, który jest demonstrowany, oraz narzędzia, które są używane do tworzenia i debugowania procedur. Inżynierowie pomocy technicznej firmy Microsoft mogą pomóc w wyjaśnieniu funkcjonalności danej procedury. Nie będą jednak modyfikować tych przykładów, aby zapewnić dodatkową funkcjonalność lub konstruować procedur spełniających specyficzne wymagania użytkownika.

Uwaga Przed zainstalowaniem tej poprawki należy sprawdzić, czy wszyscy użytkownicy klienta Microsoft Navision są wylogowywani z systemu. Dotyczy to również użytkowników klientów usług Microsoft Navision Application Services (NAS). Użytkownik powinien być jedynym użytkownikiem klienckim, który będzie zalogowany po zaimplementowaniu tej poprawki.

Aby zaimplementować tę poprawkę, musisz mieć licencję dewelopera.

Zalecamy, aby do konta użytkownika w oknie Logowanie do systemu Windows lub w oknie Loginy bazy danych był przypisany identyfikator roli "SUPER". Jeśli kontu użytkownika nie można przypisać identyfikatora roli "SUPER", należy sprawdzić, czy konto użytkownika ma następujące uprawnienia:

  • Uprawnienie do modyfikowania obiektu, który będzie modyfikowany.
  • Uprawnienie Wykonywanie dla obiektu o identyfikatorze obiektu 5210 i dla obiektu o identyfikatorze obiektu obiektu systemowego 9015.

                
Uwaga: Nie musisz mieć praw do magazynów danych, chyba że musisz przeprowadzić naprawę danych.

Zmiany w kodzie

Uwaga: przed zastosowaniem poprawek na komputerach produkcyjnych zawsze należy testować poprawki kodu w środowisku kontrolowanym.
Aby rozwiązać ten problem, należy zmienić kod w pliku Gen. Jnl.-Post Jednostka kodowa wiersza (12) . W tym celu wykonaj następujące czynności:

  1. Dodaj następującą zmienną globalną:

    TempRejCustLedgEntry@1100047 : TEMPORARY Record 21;
    
  2. Zmień kod w funkcji PostCust w następujący sposób:
    Istniejący kod 1

    ...
              DiscRiskFactAmountLCY := 0;
              DiscUnriskFactAmountLCY := 0;
              CollFactAmountLCY := 0;
            //--------
    
              IF Cust."No." <> "Account No." THEN
                Cust.GET("Account No.");
              Cust.CheckBlockedCustOnJnls(Cust,"Document Type",TRUE);
    
              IF "Posting Group" = '' THEN BEGIN
    ...
    
    

    Kod zastępczy 1

    ...
              DiscRiskFactAmountLCY := 0;
              DiscUnriskFactAmountLCY := 0;
              CollFactAmountLCY := 0;
            //--------
    
    // Add the following lines. 
             TempRejCustLedgEntry.RESET;
             TempRejCustLedgEntry.DELETEALL;
    // End of the lines.
    
              IF Cust."No." <> "Account No." THEN
                Cust.GET("Account No.");
              Cust.CheckBlockedCustOnJnls(Cust,"Document Type",TRUE);
    
              IF "Posting Group" = '' THEN BEGIN
    ...
    
    

    Istniejący kod 2

    ...
                END;
    
              // Post the application
              ApplyCustLedgEntry(
                CVLedgEntryBuf,DtldCVLedgEntryBuf,GenJnlLine,GLSetup."Appln. Rounding Precision");
    
    // Delete the following lines.
             IF GenJnlLine."Applies-to Doc. Type" = GenJnlLine."Applies-to Doc. Type"::" " THEN
               GenJnlLine."Applies-to Doc. Type" := AppliesToDocType;
    // End of the lines.
    
              IF AppManagement.AccessToCartera AND NOT GenJnlLine.Prepayment THEN BEGIN
                IF "Document Type" = "Document Type"::Bill THEN BEGIN
                  DocPost.CreateReceivableDoc(GenJnlLine,CVLedgEntryBuf);
                  CustLedgEntry."Document Situation" := CustLedgEntry."Document Situation"::Cartera;
    ...
    
    

    Kod zastępczy 2

    ...
                END;
    
              // Post the application
              ApplyCustLedgEntry(
                CVLedgEntryBuf,DtldCVLedgEntryBuf,GenJnlLine,GLSetup."Appln. Rounding Precision");
    
    // Add the following lines.
             IF ("Applies-to ID" = '') AND ("Applies-to Doc. Type" = "Applies-to Doc. Type"::" ") THEN
               "Applies-to Doc. Type" := AppliesToDocType;
    // End of the lines.
    
              IF AppManagement.AccessToCartera AND NOT GenJnlLine.Prepayment THEN BEGIN
                IF "Document Type" = "Document Type"::Bill THEN BEGIN
                  DocPost.CreateReceivableDoc(GenJnlLine,CVLedgEntryBuf);
                  CustLedgEntry."Document Situation" := CustLedgEntry."Document Situation"::Cartera;
    ...
    
    
  3. Zmień kod w funkcji PostVend w następujący sposób:
    Istniejący kod

    ...
              // Post the application
              ApplyVendLedgEntry(
                CVLedgEntryBuf,DtldCVLedgEntryBuf,GenJnlLine,
                GLSetup."Appln. Rounding Precision");
    
    // Delete the following lines.
             IF GenJnlLine."Applies-to Doc. Type" = GenJnlLine."Applies-to Doc. Type"::" " THEN
               GenJnlLine."Applies-to Doc. Type" := AppliesToDocType;
    // End of the lines.
    
              IF AppManagement.AccessToCartera AND NOT GenJnlLine.Prepayment THEN BEGIN
                IF "Document Type" = "Document Type"::Bill THEN BEGIN
                  DocPost.CreatePayableDoc(GenJnlLine,CVLedgEntryBuf);
                  VendLedgEntry."Document Situation" := VendLedgEntry."Document Situation"::Cartera;
    ...
    
    

    Kod zastępczy

    ...
              // Post the application
              ApplyVendLedgEntry(
                CVLedgEntryBuf,DtldCVLedgEntryBuf,GenJnlLine,
                GLSetup."Appln. Rounding Precision");
    
    // Add the following lines.
             IF ("Applies-to ID" = '') AND ("Applies-to Doc. Type" = "Applies-to Doc. Type"::" ") THEN
               "Applies-to Doc. Type" := AppliesToDocType;
    // End of the lines.
    
              IF AppManagement.AccessToCartera AND NOT GenJnlLine.Prepayment THEN BEGIN
                IF "Document Type" = "Document Type"::Bill THEN BEGIN
                  DocPost.CreatePayableDoc(GenJnlLine,CVLedgEntryBuf);
                  VendLedgEntry."Document Situation" := VendLedgEntry."Document Situation"::Cartera;
    ...
    
    
  4. Zmień kod w funkcji ApplyCustLedgEntry w następujący sposób:
    Istniejący kod

    ...
                    OldCustLedgEntry."Document Situation"::"Closed Documents",
                    OldCustLedgEntry."Document Situation"::"Closed BG/PO"]) THEN
                    FromClosedDoc := TRUE
                  ELSE
                    FromClosedDoc := FALSE;
                  DocPost.UpdateReceivableDoc(
                    OldCustLedgEntry,GenJnlLine,AppliedAmountLCY + DeltaUnrealAmount + DeltaAmountLCY,
                    DocAmountLCY,RejDocAmountLCY,DiscDocAmountLCY,CollDocAmountLCY,
                    DiscRiskFactAmountLCY,DiscUnriskFactAmountLCY,CollFactAmountLCY);
                END;
    ...
    
    

    Kod zastępczy

    ...
                    OldCustLedgEntry."Document Situation"::"Closed Documents",
                    OldCustLedgEntry."Document Situation"::"Closed BG/PO"]) THEN
                    FromClosedDoc := TRUE
                  ELSE
                    FromClosedDoc := FALSE;
    
    // Add the following lines.
                 IF OldCustLedgEntry."Document Status" = OldCustLedgEntry."Document Status"::Rejected THEN BEGIN
                   TempRejCustLedgEntry := OldCustLedgEntry;
                   TempRejCustLedgEntry."Remaining Amount (LCY) stats." := AppliedAmountLCY + DeltaUnrealAmount + DeltaAmountLCY;
                   TempRejCustLedgEntry.INSERT;
                 END;
    // End of the lines.
    
                  DocPost.UpdateReceivableDoc(
                    OldCustLedgEntry,GenJnlLine,AppliedAmountLCY + DeltaUnrealAmount + DeltaAmountLCY,
                    DocAmountLCY,RejDocAmountLCY,DiscDocAmountLCY,CollDocAmountLCY,
                    DiscRiskFactAmountLCY,DiscUnriskFactAmountLCY,CollFactAmountLCY);
                END;
    ...
    
    
  5. Zmień kod w funkcji PostDtldCustLedgEntries w następujący sposób:
    Istniejący kod

    ...
                  AccNo := CustPostingGr."Bills Account";
                END ELSE BEGIN
                  CustPostingGr.TESTFIELD("Receivables Account");
                  AccNo := CustPostingGr."Receivables Account";
                END;
    
    // Delete the following lines.
               IF DiscDocAmountLCY <> 0 THEN BEGIN
                 CustPostingGr.TESTFIELD("Discted. Bills Acc.");
                 AccNo := CustPostingGr."Discted. Bills Acc.";
               END;
               IF CollDocAmountLCY <> 0 THEN BEGIN
                 CustPostingGr.TESTFIELD("Bills on Collection Acc.");
                 AccNo := CustPostingGr."Bills on Collection Acc.";
               END;
               IF RejDocAmountLCY <> 0 THEN BEGIN
                 CASE GenJnlLine."Applies-to Doc. Type" OF
                   GenJnlLine."Applies-to Doc. Type"::Bill:
                     BEGIN
                       CustPostingGr.TESTFIELD("Rejected Bills Acc.");
                       AccNo := CustPostingGr."Rejected Bills Acc.";
                     END;
                   GenJnlLine."Applies-to Doc. Type"::Invoice:
                     BEGIN
                       CustPostingGr.TESTFIELD("Rejected Factoring Acc.");
                       AccNo := CustPostingGr."Rejected Factoring Acc.";
                     END;
                   ELSE
                     IF (GenJnlLine."Document Type" IN [GenJnlLine."Document Type"::"Credit Memo",GenJnlLine."Document Type"::Payment]) AND
                       (OldCVLedgEntryBuf4."Applies-to ID" <> '') THEN BEGIN
                       CASE OldCVLedgEntryBuf4."Document Type" OF
                         OldCVLedgEntryBuf4."Document Type"::Bill:
                           BEGIN
                             CustPostingGr.TESTFIELD("Receivables Account");
                             AccNo := CustPostingGr."Receivables Account";
                           END;
                         OldCVLedgEntryBuf4."Document Type"::Invoice:
                           BEGIN
                             CustPostingGr.TESTFIELD("Receivables Account");
                             AccNo := CustPostingGr."Receivables Account";
                           END;
                       END;
                     END;
                 END;
               END;
               IF (DiscRiskFactAmountLCY <> 0) OR (DiscUnriskFactAmountLCY <> 0) THEN BEGIN
                 CustPostingGr.TESTFIELD("Factoring for Discount Acc.");
                 AccNo := CustPostingGr."Factoring for Discount Acc.";
               END;
               IF CollFactAmountLCY <> 0 THEN BEGIN
                 CustPostingGr.TESTFIELD("Factoring for Collection Acc.");
                 AccNo := CustPostingGr."Factoring for Collection Acc.";
               END;
    // End of the lines.
    
                ReceivableAccAmtLCY :=
                  TotalAmountLCY -
                  (DocAmountLCY + DiscDocAmountLCY +
                   CollDocAmountLCY + RejDocAmountLCY + DiscRiskFactAmountLCY +
    ...
    
    

    Kod zastępczy

    ...
                  AccNo := CustPostingGr."Bills Account";
                END ELSE BEGIN
                  CustPostingGr.TESTFIELD("Receivables Account");
                  AccNo := CustPostingGr."Receivables Account";
                END;
    
                ReceivableAccAmtLCY :=
                  TotalAmountLCY -
                  (DocAmountLCY + DiscDocAmountLCY +
                   CollDocAmountLCY + RejDocAmountLCY + DiscRiskFactAmountLCY +
    ...
    
    
  6. Zmień kod w funkcji PostReceivableDocs w następujący sposób:
    Istniejący kod

    ...
              GLEntry."Bal. Account Type" := GenJnlLine."Bal. Account Type";
              GLEntry."Bal. Account No." := GenJnlLine."Bal. Account No.";
              InsertGLEntry(TRUE);
            END;
            IF RejDocAmountLCY <> 0 THEN BEGIN
    
    // Delete the following lines.
             CASE GenJnlLine."Applies-to Doc. Type" OF
               GenJnlLine."Applies-to Doc. Type"::Bill:
                 BEGIN
                   CustPostingGr.TESTFIELD("Rejected Bills Acc.");
                   InitGLEntry(CustPostingGr."Rejected Bills Acc.",RejDocAmountLCY,DocAmtCalcAddCurrency(RejDocAmountLCY),TRUE,TRUE);
                   GLEntry."Bal. Account Type" := GenJnlLine."Bal. Account Type";
                   GLEntry."Bal. Account No." := GenJnlLine."Bal. Account No.";
                   InsertGLEntry(TRUE);
                 END;
               GenJnlLine."Applies-to Doc. Type"::Invoice:
                 BEGIN
                   CustPostingGr.TESTFIELD("Rejected Factoring Acc.");
                   InitGLEntry(CustPostingGr."Rejected Factoring Acc.",RejDocAmountLCY,DocAmtCalcAddCurrency(RejDocAmountLCY),TRUE,TRUE);
                   GLEntry."Bal. Account Type" := GenJnlLine."Bal. Account Type";
                   GLEntry."Bal. Account No." := GenJnlLine."Bal. Account No.";
                   InsertGLEntry(TRUE);
                 END;
               ELSE
                 IF (GenJnlLine."Document Type" IN [GenJnlLine."Document Type"::"Credit Memo",GenJnlLine."Document Type"::Payment]) AND
                   (OldCVLedgEntryBuf4."Applies-to ID" <> '') THEN BEGIN
                   CASE OldCVLedgEntryBuf4."Document Type" OF
                     OldCVLedgEntryBuf4."Document Type"::Bill:
                       BEGIN
                         CustPostingGr.TESTFIELD("Rejected Bills Acc.");
                         InitGLEntry(CustPostingGr."Rejected Bills Acc.",RejDocAmountLCY,DocAmtCalcAddCurrency(RejDocAmountLCY),TRUE,TRUE);
                         GLEntry."Bal. Account Type" := GenJnlLine."Bal. Account Type";
                         GLEntry."Bal. Account No." := GenJnlLine."Bal. Account No.";
                         InsertGLEntry(TRUE);
                       END;
                     OldCVLedgEntryBuf4."Document Type"::Invoice:
                       BEGIN
                         CustPostingGr.TESTFIELD("Rejected Factoring Acc.");
                         InitGLEntry(CustPostingGr."Rejected Factoring Acc.",RejDocAmountLCY,DocAmtCalcAddCurrency(RejDocAmountLCY),TRUE,TRUE
           );
    
                         GLEntry."Bal. Account Type" := GenJnlLine."Bal. Account Type";
                         GLEntry."Bal. Account No." := GenJnlLine."Bal. Account No.";
                         InsertGLEntry(TRUE);
                       END;
                   END;
                 END;
    // End of the lines.
    
              END;
            END;
            IF DiscRiskFactAmountLCY <> 0 THEN BEGIN
              CustPostingGr.TESTFIELD("Factoring for Discount Acc.");
              InitGLEntry(CustPostingGr."Factoring for Discount Acc.",
    ...
    
    

    Kod zastępczy

    ...
              GLEntry."Bal. Account Type" := GenJnlLine."Bal. Account Type";
              GLEntry."Bal. Account No." := GenJnlLine."Bal. Account No.";
              InsertGLEntry(TRUE);
            END;
            IF RejDocAmountLCY <> 0 THEN BEGIN
    
    // Add the following lines.
             WITH TempRejCustLedgEntry DO BEGIN
               RESET;
               SETCURRENTKEY("Customer No.","Document Type","Document Situation","Document Status");
               SETRANGE("Document Type","Document Type"::Bill);
               CALCSUMS("Remaining Amount (LCY) stats.");
               IF "Remaining Amount (LCY) stats." <> 0 THEN BEGIN
                 CustPostingGr.TESTFIELD("Rejected Bills Acc.");
                 InitGLEntry(
                   CustPostingGr."Rejected Bills Acc.","Remaining Amount (LCY) stats.",
                   DocAmtCalcAddCurrency("Remaining Amount (LCY) stats."),TRUE,TRUE);
                 GLEntry."Bal. Account Type" := GenJnlLine."Bal. Account Type";
                 GLEntry."Bal. Account No." := GenJnlLine."Bal. Account No.";
                 InsertGLEntry(TRUE);
               END;
               SETRANGE("Document Type","Document Type"::Invoice);
               CALCSUMS("Remaining Amount (LCY) stats.");
               IF "Remaining Amount (LCY) stats." <> 0 THEN BEGIN
                 CustPostingGr.TESTFIELD("Rejected Factoring Acc.");
                 InitGLEntry(
                   CustPostingGr."Rejected Factoring Acc.","Remaining Amount (LCY) stats.",
                   DocAmtCalcAddCurrency("Remaining Amount (LCY) stats."),TRUE,TRUE);
                 GLEntry."Bal. Account Type" := GenJnlLine."Bal. Account Type";
                 GLEntry."Bal. Account No." := GenJnlLine."Bal. Account No.";
                 InsertGLEntry(TRUE);
               END;
    // End of the lines.
    
              END;
            END;
            IF DiscRiskFactAmountLCY <> 0 THEN BEGIN
              CustPostingGr.TESTFIELD("Factoring for Discount Acc.");
              InitGLEntry(CustPostingGr."Factoring for Discount Acc.",
    ...
    
    

Wymagania wstępne

Aby zastosować tę poprawkę, musisz mieć zainstalowany jeden z następujących produktów:

  • Portugalska wersja systemu Microsoft Dynamics NAV 2009 R2
  • Portugalska wersja systemu Microsoft Dynamics NAV 2009 z dodatkiem Service Pack 1

Informacje o usuwaniu

Tej poprawki nie można usunąć.

Stan

Firma Microsoft potwierdziła, że jest to problem dotyczący produktów firmy Microsoft wymienionych w sekcji „Dotyczy”.

Uwaga: to jest artykuł z grupy szybko publikowanej zawartości (FAST PUBLISH) utworzony bezpośrednio w ramach organizacji pomocy technicznej firmy Microsoft. Informacje w nim zawarte są udostępniane "takie, jakie są" jako reakcja na wyłaniające się problemy. Ze względu na szybkość ich udostępniania, materiały mogą zawierać błędy typograficzne i mogą zostać zmienione w dowolnym momencie bez powiadomienia. Inne kwestie zostały omówione w warunkach użytkowania .