При попытке изменить значение в поле "Предоплата %" в заказе на продажу в восточно-европейской версии Microsoft Dynamics NAV 2009

Применяется к
Microsoft Dynamics NAV 2009 R2 Dynamics NAV 2009 Service Pack 1

Эта статья относится к Microsoft Dynamics NAV для языкового стандарта языка Восточной Европы (EE).

Проблема

Рассмотрим следующий сценарий в восточно-европейской версии Microsoft Dynamics NAV 2009 с пакетом обновления 1 (SP1) и Microsoft Dynamics NAV 2009 R2:

  • У вас есть заказ на продажу, в котором используется предоплата.
  • Вы создаете предварительное письмо. Затем вы публикуете и выставляете счет на заранеее письмо.
  • Вы снова открываете заказ на продажу, а затем пытаетесь изменить значение в поле Процент предоплаты в заголовке.

В этом случае появляется следующее сообщение об ошибке:

Примечание

Таблица буфера строк предоплаты пуста.

Эта проблема возникает после применения исправлений в следующих кб: KB2543219, KB2546451, KB2546490 и KB2546498.
  Для получения дополнительных сведений щелкните следующий номер статьи, чтобы просмотреть статью в базе знаний Майкрософт:

2543219 Вы не можете обработать излишние предоплаты, как ожидалось в восточно-европейской версии Microsoft Dynamics NAV 2009 R2. Дополнительные сведения см. в следующей статье базы знаний Майкрософт:

2546451 сообщение об ошибке "В фильтре нет записи в реестре" при попытке опубликовать оставшееся количество заказа на продажу в восточноевропейской версии Microsoft Dynamics NAV 2009 Для получения дополнительных сведений щелкните следующий номер статьи, чтобы просмотреть статью в базе знаний Майкрософт:

2546490 "Cust. Ledger Entry Entry No. ' [Число]' уже существует" сообщение об ошибке при попытке разместить заказ на продажу, в котором используется предоплата в восточно-европейской версии Microsoft Dynamics NAV 2009. Дополнительные сведения щелкните следующий номер статьи, чтобы просмотреть статью в базе знаний Майкрософт:

2546498 размещенная предоплата остается открытой после размещения окончательного счета на покупку в версии Microsoft Dynamics NAV 2009 для Восточной Европы

Решение

Сведения об исправлении

Поддерживаемое исправление теперь доступно в корпорации Майкрософт. Однако он предназначен только для устранения проблемы, описанной в этой статье. Применяйте его только к системам, в которых возникла эта конкретная проблема. Это исправление может пройти дополнительное тестирование. Поэтому, если вы не пострадали от этой проблемы, рекомендуется дождаться следующего пакета обновления Microsoft Dynamics NAV 2009 или следующей версии Microsoft Dynamics NAV, содержащей это исправление.

Примечание. В особых случаях плата, которая обычно взимается за звонки в службу поддержки, может быть отменена, если специалист по технической поддержке Microsoft Dynamics и связанных продуктов определит, что конкретное обновление поможет устранить вашу проблему. Обычные расходы на поддержку будут применяться к дополнительным вопросам и проблемам поддержки, которые не относятся к конкретному обновлению.

            
          

Сведения об установке

Корпорация Майкрософт предоставляет примеры программирования только для иллюстрации, без явных или подразумеваемых гарантий. Это включает подразумеваемые гарантии товарного состояния или пригодности для конкретной цели, но не ограничивается ими. В этой статье предполагается, что вы знакомы с демонстрируемым языком программирования и инструментами, используемыми для создания и отладки процедур. Инженеры службы поддержки Майкрософт могут помочь объяснить функциональность конкретной процедуры, но они не будут изменять эти примеры, чтобы предоставить дополнительные функциональные возможности или создать процедуры в соответствии с вашими конкретными требованиями.

Примечание. Перед установкой этого исправления убедитесь, что все пользователи клиента Microsoft Navision вышли из системы. Сюда входят пользователи клиентов Служб приложений Microsoft Navision (NAS). Вы должны быть единственным пользователем клиента, который вошел в систему при реализации этого исправления.

Чтобы реализовать это исправление, у вас должна быть лицензия разработчика.

Рекомендуется назначить учетной записи пользователя в окне Входа Windows или в окне Входа базы данных идентификатор роли SUPER. Если учетной записи пользователя не удается назначить идентификатор роли SUPER, необходимо убедиться, что учетная запись пользователя имеет следующие разрешения:

  • Разрешение Изменить для объекта, который вы будете изменять.
  • Разрешение Execute для объекта System Object ID 5210 и для объекта System Object ID 9015.

                
Примечание. Вы не должны иметь права на хранилища данных, если только вам не нужно выполнить восстановление данных.

Изменения кода

Примечание. Перед применением исправлений на рабочих компьютерах всегда тестируйте исправления кода в управляемой среде.
Чтобы устранить эту неполадку, выполните следующие действия:

  1. Измените код функции UpdateVATOnLines в коде Sales-Post предоплаты (442) следующим образом:
    Существующий код

    ...
         ROUND(NewAmountIncludingVAT,Currency."Amount Rounding Precision");
      "Prepmt. VAT Base Amt." := NewVATBaseAmount;
    
    // Delete the following lines.  
      IF SalesHeader."Prices Including VAT" THEN
        "Prepmt. Line Amount" := "Prepmt. Amt. Incl. VAT"
      ELSE
        "Prepmt. Line Amount" :=
          ROUND(
            "Prepmt. Amt. Incl. VAT" / (1 + "VAT %" / 100),
            Currency."Amount Rounding Precision");
    // End of the deleted lines.
    
      IF (VATAmountLine."Line Amount" - VATAmountLine."Invoice Discount Amount") = 0 THEN
        VATDifference := 0
      ELSE
    ...
    

    Код замены

    ...
       ROUND(NewAmountIncludingVAT,Currency."Amount Rounding Precision");
      "Prepmt. VAT Base Amt." := NewVATBaseAmount;
    
      IF (VATAmountLine."Line Amount" - VATAmountLine."Invoice Discount Amount") = 0 THEN
        VATDifference := 0
      ELSE
    ...
    
  2. Измените код функции UpdateVATOnLines в коде Purchase-Post предоплаты (444) следующим образом:
    Существующий код

    ...
         ROUND(NewAmountIncludingVAT,Currency."Amount Rounding Precision");
      "Prepmt. VAT Base Amt." := NewVATBaseAmount;
    
    // Delete the following lines.  
      IF PurchHeader."Prices Including VAT" THEN
        "Prepmt. Line Amount" := "Prepmt. Amt. Incl. VAT"
      ELSE
        "Prepmt. Line Amount" :=
          ROUND(
            "Prepmt. Amt. Incl. VAT" / (1 + "VAT %" / 100),
            Currency."Amount Rounding Precision");
    // End of the deleted lines.
    
      IF (VATAmountLine."Line Amount" - VATAmountLine."Invoice Discount Amount") = 0 THEN
        VATDifference := 0
      ELSE
    ...
    

    Код замены

    ...
       ROUND(NewAmountIncludingVAT,Currency."Amount Rounding Precision");
      "Prepmt. VAT Base Amt." := NewVATBaseAmount;
    
      IF (VATAmountLine."Line Amount" - VATAmountLine."Invoice Discount Amount") = 0 THEN
        VATDifference := 0
      ELSE
    ...
    
  3. Измените код в функции PostInvoiceCorrection в Sales-Post Advances codeunit (26585) следующим образом:
    Удалите следующую глобальную переменную:

    • Имя: SumAmountToApply
    • DataType: Decimal

    Добавьте следующую глобальную переменную:

    • Имя: TempLineRelation
    • DataType:TEMPORARY Record (26592)

    :
    Существующий код

    ...
     GLSetup.GET;
      SalesSetup.GET;
      LinkedAdvanceEntry.DELETEALL;
    
      SalesLine.RESET;
      SalesLine.SETRANGE("Document Type",SalesHeader."Document Type"); 
    ...
    

    Код замены

    ...
      GLSetup.GET;
      SalesSetup.GET;
      LinkedAdvanceEntry.DELETEALL;
    
    // Add the following line.        
      TempLineRelation.DELETEALL;
    
      SalesLine.RESET;
      SalesLine.SETRANGE("Document Type",SalesHeader."Document Type");
    ...
    
  4. Измените код в функции PostInvLineCorrection в Sales-Post Advances codeunit (26585) следующим образом:
    Существующий код

    ...
     LineRelation."Deducted Amount" := LineRelation."Deducted Amount" + AmountToDeduct;
      LineRelation.MODIFY;
    
    // Delete the following line.  
      CalcLinkedPmtAmountToApply(LetterLine,AmountToDeduct,LinkedAdvanceEntry);
      IF LetterLine."VAT Amount" <> 0 THEN // NO VAT handling
        PostVATCorrection(
          LetterLine,SalesInvHeader,AmountToDeduct,DocNoForVATCorr,VATAmount,GenJnlPostLine,TempJnlLineDim); 
    ...
    

    Код замены

    ...
     LineRelation."Deducted Amount" := LineRelation."Deducted Amount" + AmountToDeduct;
      LineRelation.MODIFY;
    
    // Add the following lines.
      CalcLinkedPmtAmountToApply(
        LetterLine,
        AmountToDeduct,
        LinkedAdvanceEntry,
        RetrieveSumAmountToApply(LineRelation,AmountToDeduct));
    //End of the added lines. 
    
      IF LetterLine."VAT Amount" <> 0 THEN // NO VAT handling
        PostVATCorrection(
          LetterLine,SalesInvHeader,AmountToDeduct,DocNoForVATCorr,VATAmount,GenJnlPostLine,TempJnlLineDim);
    ...
    
  5. Измените код функции CalcLinkedPmtAmountToApply в Sales-Post Advances codeunit (26585) следующим образом:
    Добавьте следующий параметр:

    • Имя: SumAmountToApply
    • DataType: Decimal

    Существующий код

    ...
     // Delete the following line .      
      SumAmountToApply := SumAmountToApply + TotalAmountToApply;
    
      IF TotalAmountToApply = 0 THEN
        EXIT;
      SetCurrencyPrecision(LetterLine."Currency Code");
    ...
    

    Код замены

    ...
     IF TotalAmountToApply = 0 THEN
        EXIT;
      SetCurrencyPrecision(LetterLine."Currency Code");
    ...
    
  6. Измените код в функции UpdateOrderLine в Sales-Post Advances codeunit (26585) следующим образом:
    Существующий код 1

    ...
       LineRelation.SETRANGE(Type,LineRelation.Type::Sale);
      LineRelation.SETRANGE("Order No.",SalesLine."Document No.");
      LineRelation.SETRANGE("Order Line No.",SalesLine."Line No.");
    // Delete the following line        
      LineRelation.CALCSUMS("Invoiced Amount","Deducted Amount");
    
      SalesLine."Prepmt. Amount Inv. Incl. VAT" := LineRelation."Invoiced Amount";
      IF PricesInclVAT THEN BEGIN
    ...
    

    Код замены 1

    ...
     LineRelation.SETRANGE(Type,LineRelation.Type::Sale);
      LineRelation.SETRANGE("Order No.",SalesLine."Document No.");
      LineRelation.SETRANGE("Order Line No.",SalesLine."Line No.");
    // Add the following line        
      LineRelation.CALCSUMS("Invoiced Amount","Deducted Amount",Amount,"Requested Amount");
    
      SalesLine."Prepmt. Amount Inv. Incl. VAT" := LineRelation."Invoiced Amount";
      IF PricesInclVAT THEN BEGIN
    ...
    

    Существующий код 2

    ...
            SalesLine."Prepayment VAT %" / (100 + SalesLine."Prepayment VAT %"),
            Currency."Amount Rounding Precision");
      END ELSE BEGIN
    // Delete the following lines.        
        SalesLine."Prepmt. Amt. Inv." :=
          ROUND(LineRelation."Invoiced Amount" / (1 + SalesLine."Prepayment VAT %" / 100),
            Currency."Amount Rounding Precision");
    // End of the deleted lines.
        SalesLine."Prepmt. VAT Amount Inv." :=
          SalesLine."Prepmt. Amount Inv. Incl. VAT" - SalesLine."Prepmt. Amt. Inv.";
      END;
    ...
    

    Код замены 2

    ...
            SalesLine."Prepayment VAT %" / (100 + SalesLine."Prepayment VAT %"),
            Currency."Amount Rounding Precision");
      END ELSE BEGIN
    // Add the following lines.        
        IF LineRelation."Invoiced Amount" = LineRelation.Amount THEN
          SalesLine."Prepmt. Amt. Inv." := LineRelation."Requested Amount"
        ELSE
          SalesLine."Prepmt. Amt. Inv." :=
            ROUND(LineRelation."Invoiced Amount" / (1 + SalesLine."Prepayment VAT %" / 100),
              Currency."Amount Rounding Precision");
    //End of the added lines. 
        SalesLine."Prepmt. VAT Amount Inv." :=
          SalesLine."Prepmt. Amount Inv. Incl. VAT" - SalesLine."Prepmt. Amt. Inv.";
      END;
    ...
    
  7. Измените код функции UpdateLineRelations в Sales-Post Advances codeunit (26585) следующим образом:
    Существующий код

    ...
       LineRelation.SETRANGE("Letter No.",LetterLine."Letter No.");
      LineRelation.SETRANGE("Letter Line No.",LetterLine."Line No.");
      LineRelation.CALCSUMS("Invoiced Amount","Deducted Amount");
    ...
    

    Код замены

    ...
    // Add the following line
      LineRelation.SETRANGE(Type,LineRelation.Type::Sale);
    
      LineRelation.SETRANGE("Letter No.",LetterLine."Letter No.");
      LineRelation.SETRANGE("Letter Line No.",LetterLine."Line No.");
      LineRelation.CALCSUMS("Invoiced Amount","Deducted Amount");
    ...
    
  8. Создайте процедуру RetrieveSumAmountToApply в Sales-Post Advances codeunit (26585) следующим образом:

    LOCAL PROCEDURE RetrieveSumAmountToApply@1470050(LineRelation@1470000 : Record 26592;AmountToDeduct@1470001 : Decimal) : Decimal;
      BEGIN
        WITH TempLineRelation DO BEGIN
          RESET;
          SETRANGE("Order No.",LineRelation."Order No.");
          SETRANGE("Letter No.",LineRelation."Letter No.");
          IF NOT FINDFIRST THEN BEGIN
            INIT;
            "Order No." := LineRelation."Order No.";
            "Letter No." := LineRelation."Letter No.";
            Amount := AmountToDeduct;
            INSERT;
          END ELSE BEGIN
            Amount := Amount + AmountToDeduct;
            MODIFY;
          END;
          EXIT(Amount);
        END;
      END;
    
    
  9. Измените код функции PostInvoiceCorrection в Purchase-Post Advances codeunit (26586) следующим образом:
    Удалите следующую глобальную переменную:

    • Имя: SumAmountToApply
    • DataType: Decimal

    Добавьте следующую глобальную переменную:

    • Имя: TempLineRelation
    • DataType: ВРЕМЕННАЯ запись (26592)

    Существующий код

    ...
     GLSetup.GET;
      PurchSetup.GET;
      LinkedAdvanceEntry.DELETEALL;
    
      PurchLine.RESET;
      PurchLine.SETRANGE("Document Type",PurchHeader."Document Type");
    ...
    

    Код замены

    ...
      GLSetup.GET;
      PurchSetup.GET;
      LinkedAdvanceEntry.DELETEALL;
    // Add the following line        
      TempLineRelation.DELETEALL;
    
      PurchLine.RESET;
      PurchLine.SETRANGE("Document Type",PurchHeader."Document Type");
    ...
    
  10. Измените код функции PostInvLineCorrection в Purchase-Post Advances codeunit (26586) следующим образом:
    Существующий код

    ...
       LineRelation."Deducted Amount" := LineRelation."Deducted Amount" + AmountToDeduct;
      LineRelation.MODIFY;
    // Delete the following line.
      CalcLinkedPmtAmountToApply(LetterLine,AmountToDeduct,LinkedAdvanceEntry);
      IF LetterLine."VAT Amount" <> 0 THEN // NO VAT handling
        PostVATCorrection(
          LetterLine,PurchInvHeader,AmountToDeduct,DocNoForVATCorr,VATAmount,GenJnlPostLine,TempJnlLineDim);
    ...
    

    Код замены

    ...
     LineRelation."Deducted Amount" := LineRelation."Deducted Amount" + AmountToDeduct;
      LineRelation.MODIFY;
    // Add the following lines.              
      CalcLinkedPmtAmountToApply(
        LetterLine,
        AmountToDeduct,
        LinkedAdvanceEntry,
        RetrieveSumAmountToApply(LineRelation,AmountToDeduct));
    //End of the added lines. 
      IF LetterLine."VAT Amount" <> 0 THEN // NO VAT handling
        PostVATCorrection(
          LetterLine,PurchInvHeader,AmountToDeduct,DocNoForVATCorr,VATAmount,GenJnlPostLine,TempJnlLineDim);
    ...
    
  11. Измените код в функции CalcLinkedPmtAmountToApply в Purchase-Post Advances codeunit (26586) следующим образом:
    Добавьте следующий параметр в функцию:

    • Имя: SumAmountToApply
    • DataType: Decimal

    Существующий код

    ...
       IF TotalAmountToApply = 0 THEN
        EXIT;
    // Delete the following lines.
      SumAmountToApply := SumAmountToApply + TotalAmountToApply;
    // End of the deleted lines.
    
      SetCurrencyPrecision(LetterLine."Currency Code");
      Link.SETRANGE("Entry Type",Link."Entry Type"::"Link To Letter");
    ...
    

    Код замены

    ...
     IF TotalAmountToApply = 0 THEN
        EXIT;
    
      SetCurrencyPrecision(LetterLine."Currency Code");
      Link.SETRANGE("Entry Type",Link."Entry Type"::"Link To Letter");
    ...
    
  12. Измените код в функции UpdateOrderLine в Purchase-Post Advances codeunit (26586) следующим образом:
    Существующий код 1

    ...
       LineRelation.SETRANGE(Type,LineRelation.Type::Purchase);
      LineRelation.SETRANGE("Order No.",PurchLine."Document No.");
      LineRelation.SETRANGE("Order Line No.",PurchLine."Line No.");
    // Delete the following line.       
      LineRelation.CALCSUMS("Invoiced Amount","Deducted Amount");
    
      PurchLine."Prepmt. Amount Inv. Incl. VAT" := LineRelation."Invoiced Amount";
      IF PricesInclVAT THEN BEGIN
    ...
    

    Код замены 1

    ...
      LineRelation.SETRANGE(Type,LineRelation.Type::Purchase);
      LineRelation.SETRANGE("Order No.",PurchLine."Document No.");
      LineRelation.SETRANGE("Order Line No.",PurchLine."Line No.");
    // Add the following line.        
      LineRelation.CALCSUMS("Invoiced Amount","Deducted Amount",Amount,"Requested Amount");
    
      PurchLine."Prepmt. Amount Inv. Incl. VAT" := LineRelation."Invoiced Amount";
      IF PricesInclVAT THEN BEGIN
    ...
    

    Существующий код 2

    ...
             PurchLine."Prepayment VAT %" / (100 + PurchLine."Prepayment VAT %"),
            Currency."Amount Rounding Precision");
      END ELSE BEGIN
    // Delete the following lines.        
        PurchLine."Prepmt. Amt. Inv." :=
          ROUND(LineRelation."Invoiced Amount" / (1 + PurchLine."Prepayment VAT %" / 100),
            Currency."Amount Rounding Precision");
    // End of the deleted lines.
        PurchLine."Prepmt. VAT Amount Inv." :=
          PurchLine."Prepmt. Amount Inv. Incl. VAT" - PurchLine."Prepmt. Amt. Inv.";
      END;
    ...
    

    Код замены 2

    ...
           PurchLine."Prepayment VAT %" / (100 + PurchLine."Prepayment VAT %"),
            Currency."Amount Rounding Precision");
      END ELSE BEGIN
    // Add the following lines.        
        IF LineRelation."Invoiced Amount" = LineRelation.Amount THEN
          PurchLine."Prepmt. Amt. Inv." := LineRelation."Requested Amount"
        ELSE
          PurchLine."Prepmt. Amt. Inv." :=
            ROUND(LineRelation."Invoiced Amount" / (1 + PurchLine."Prepayment VAT %" / 100),
              Currency."Amount Rounding Precision");
    // End of the added lines. 
        PurchLine."Prepmt. VAT Amount Inv." :=
          PurchLine."Prepmt. Amount Inv. Incl. VAT" - PurchLine."Prepmt. Amt. Inv.";
      END;
    ...
    
  13. Измените код в функции UpdateLineRelations в Purchase-Post Advances codeunit (26586) следующим образом:
    Существующий код

    ...
      LineRelation.SETRANGE("Letter No.",LetterLine."Letter No.");
      LineRelation.SETRANGE("Letter Line No.",LetterLine."Line No.");
      LineRelation.CALCSUMS("Invoiced Amount","Deducted Amount");
    ...
    

    Код замены

    ...
    // Add the following line.
      LineRelation.SETRANGE(Type,LineRelation.Type::Purchase);
    // End of the added line.
    
      LineRelation.SETRANGE("Letter No.",LetterLine."Letter No.");
      LineRelation.SETRANGE("Letter Line No.",LetterLine."Line No.");
      LineRelation.CALCSUMS("Invoiced Amount","Deducted Amount");
    ...
    
  14. Создайте процедуру RetrieveSumAmountToApply в Purchase-Post Advances codeunit (26586) следующим образом:

     LOCAL PROCEDURE RetrieveSumAmountToApply@1470048(LineRelation@1470000 : Record 26592;AmountToDeduct@1470001 : Decimal) : Decimal;
      BEGIN
        WITH TempLineRelation DO BEGIN
          RESET;
          SETRANGE("Order No.",LineRelation."Order No.");
          SETRANGE("Letter No.",LineRelation."Letter No.");
          IF NOT FINDFIRST THEN BEGIN
            INIT;
            "Order No." := LineRelation."Order No.";
            "Letter No." := LineRelation."Letter No.";
            Amount := AmountToDeduct;
            INSERT;
          END ELSE BEGIN
            Amount := Amount + AmountToDeduct;
            MODIFY;
          END;
          EXIT(Amount);
        END;
      END;
    

          

Необходимые условия

Для применения этого исправления необходимо установить один из следующих продуктов:

  • Версия Microsoft Dynamics NAV 2009 с пакетом обновления 1 (SP1) для Восточной Европы
  • Версия Microsoft Dynamics NAV 2009 R2 для Восточной Европы

Примечание. Чтобы применить это исправление, необходимо применить исправления в следующих базах знаний: KB2543219, KB2546451, KB2546490 и KB2546498.

Сведения об удалении

Удалить это исправление невозможно.

Состояние

Корпорация Майкрософт подтвердила, что это проблема продуктов Microsoft, перечисленных в разделе «Относится к».

Ссылки

VSTF DynamicsNAV SE: 261669

Примечание. Это статья "FAST PUBLISH", созданная непосредственно в организации поддержки Майкрософт. Информация, содержащаяся в настоящем документе, предоставляется как есть в ответ на возникающие проблемы. В результате быстрой доступности материалы могут содержать опечатки и могут быть пересмотрены в любое время без уведомления. Дополнительные рекомендации см. в разделе Условия использования .