"A transação não pode ser concluída porque causará inconsistências na tabela de entrada G/L" ao tentar postar uma transação de fatura com um desconto de 100 linhas percentuais na versão em português do Microsoft Dynamics NAV

Aplica-se a
Dynamics NAV 2009

Este artigo se aplica ao Microsoft Dynamics NAV para a localidade do idioma português (pt).

Sintomas

Suponha que você tenha aplicado o hotfix no KB 983245 na versão em português do Microsoft Dynamics NAV. Ao tentar postar uma transação de fatura com um desconto de 100 linhas percentuais, você recebe a seguinte mensagem de erro:

Observação

A transação não pode ser concluída porque causará inconsistências na tabela Entrada G/L. Verifique onde e como a função CONSISTENT é usada na transação para encontrar o motivo do erro. Contate o administrador do sistema. As tabelas podem ser marcadas como inconsistentes durante tarefas abrangentes, como postar. Isso impede que os dados sejam atualizados incorretamente.

Para obter mais informações, clique no número abaixo para ler o artigo da Base de Dados de Conhecimento Microsoft:

983245 entradas de razão geral estão incorretas quando você publica transações de fatura com um desconto de 100 linhas percentuais no Microsoft Dynamics NAV 2009 SP1
Esse problema ocorre nos seguintes produtos:

  • A versão em português do Microsoft Dynamics NAV 2009 Service Pack 1 (SP1)
  • A versão em português do Microsoft Dynamics NAV 2009 R2

Resolução

Informações sobre o hotfix

Um hotfix com suporte agora está disponível na Microsoft. No entanto, ele destina-se apenas a corrigir o problema descrito neste artigo. Aplique-o somente a sistemas que estão enfrentando esse problema específico. Esse hotfix pode receber testes adicionais. Portanto, se você não for severamente afetado por esse problema, é recomendável aguardar o próximo pacote de serviços do Microsoft Dynamics NAV 2009 ou a próxima versão do Microsoft Dynamics NAV que contém esse hotfix.

Observação Em casos especiais, os encargos que normalmente são incorridos para chamadas de suporte podem ser cancelados se um profissional de suporte técnico do Microsoft Dynamics e produtos relacionados determinar que uma atualização específica resolve seu problema. Os custos de suporte em geral aplicam-se a questões e problemas de suporte adicionais que não se enquadrem na atualização específica em questão.

            
          

Informações de instalação

A Microsoft fornece exemplos de programação apenas para ilustração, sem garantia expressa ou implícita. Isso inclui, mas não se limita a, as garantias implícitas de comercialização ou adequação a uma finalidade específica. Este artigo pressupõe que você esteja familiarizado com a linguagem de programação que está sendo demonstrada e com as ferramentas usadas para criar e depurar procedimentos. Os engenheiros de suporte da Microsoft podem ajudá-lo, fornecendo a explicação da funcionalidade de determinado procedimento, mas não modificarão estes exemplos para fornecer funcionalidade adicional nem criarão procedimentos específicos para atender às suas necessidades específicas.

Observação Antes de instalar esse hotfix, verifique se todos os usuários cliente do Microsoft Navision estão conectados ao sistema. Isso inclui usuários cliente do NAS (Microsoft Navision Application Services). Você deve ser o único usuário cliente que está conectado ao implementar esse hotfix.

Para implementar esse hotfix, você deve ter uma licença de desenvolvedor.

Recomendamos que a conta de usuário na janela Logons do Windows ou na janela Logons de Banco de Dados seja atribuída à ID da função "SUPER". Se a conta de usuário não puder ser atribuída à ID da função "SUPER", você deverá verificar se a conta de usuário tem as seguintes permissões:

  • A permissão Modificar para o objeto que você estará alterando.
  • A permissão Executar para o objeto System Object ID 5210 e para o objeto System Object ID 9015.

                
Observação Você não precisa ter direitos para os armazenamentos de dados, a menos que precise executar o reparo de dados.

Alterações de código

Observação Sempre teste correções de código em um ambiente controlado antes de aplicar as correções aos computadores de produção.
Para resolver este problema, execute as seguintes etapas:

  1. Altere o código na função UpdInvPostingBuffer na Sales-Post codeunit (80) da seguinte maneira:

    Código existente

    ...
                 FALineNo := FALineNo + 1;
              InvPostingBuffer[1]."Fixed Asset Line No." := FALineNo;
            END;
    // Delete the following line. 
            InvPostingBuffer[2] := InvPostingBuffer[1];
    
            IF InvPostingBuffer[2].FIND THEN BEGIN
              InvPostingBuffer[2].Amount := InvPostingBuffer[2].Amount + InvPostingBuffer[1].Amount;
    ...
    

    Código de substituição

    ...
               FALineNo := FALineNo + 1;
              InvPostingBuffer[1]."Fixed Asset Line No." := FALineNo;
            END;
    // Add the following lines.
           IF SalesLine."Line Discount %" = 100 THEN BEGIN
             InvPostingBuffer[1]."VAT Base Amount" := 0;
             InvPostingBuffer[1]."VAT Base Amount (ACY)" := 0;
             InvPostingBuffer[1]."VAT Amount" := 0;
             InvPostingBuffer[1]."VAT Amount (ACY)" := 0;
           END;
    // End of the added lines.
            InvPostingBuffer[2] := InvPostingBuffer[1];
            IF InvPostingBuffer[2].FIND THEN BEGIN
              InvPostingBuffer[2].Amount := InvPostingBuffer[2].Amount + InvPostingBuffer[1].Amount;
    ...
    
  2. Altere o código na função DivideAmount no Sales-Post codeunit (80) da seguinte maneira:

    Código 1 existente

    ...
              IF RoundingLineInserted AND (RoundingLineNo = SalesLine."Line No.") THEN
              EXIT;
            WITH SalesLine DO
    // Delete the following line. 
             IF (SalesLineQty = 0) OR ("Unit Price" = 0) OR ("Line Discount %" = 100) THEN BEGIN
                "Line Amount" := 0;
                "Line Discount Amount" := 0;
                "Inv. Discount Amount" := 0;
    ...
    

    Código de substituição 1

    ...
             IF RoundingLineInserted AND (RoundingLineNo = SalesLine."Line No.") THEN
              EXIT;
            WITH SalesLine DO
    // Add the following line.
             IF (SalesLineQty = 0) OR ("Unit Price" = 0) THEN BEGIN
    
                "Line Amount" := 0;
                "Line Discount Amount" := 0;
                "Inv. Discount Amount" := 0;
    ...
    

    Código 2 existente

    ...
                         (TempVATAmountLine."Line Amount" - TempVATAmountLine."Invoice Discount Amount" -
                      TempVATAmountLine."Pmt. Disc. Given Amount");
                  END;
    // Delete the following lines. 
                 "Amount Including VAT" :=
                   ROUND(TempVATAmountLineRemainder."Amount Including VAT",Currency."Amount Rounding Precision");
    // End of the deleted lines.
    
                  Amount :=
                    ROUND("Amount Including VAT",Currency."Amount Rounding Precision") -
            //--PT----
    ...
    

    Código de substituição 2

    ...
                       (TempVATAmountLine."Line Amount" - TempVATAmountLine."Invoice Discount Amount" -
                      TempVATAmountLine."Pmt. Disc. Given Amount");
                  END;
    // Add the following lines.
                 IF "Line Discount %" <>100 THEN
                   "Amount Including VAT" :=
                     ROUND(TempVATAmountLineRemainder."Amount Including VAT",Currency."Amount Rounding Precision")
                 ELSE
                   "Amount Including VAT" := 0;
    // End of the added lines.
    
                  Amount :=
                    ROUND("Amount Including VAT",Currency."Amount Rounding Precision") -
            //--PT----
    ...
    

    Código 3 existente

    ...
                       TempVATAmountLineRemainder."VAT Amount" - "Amount Including VAT" + Amount;
                END ELSE BEGIN
                  IF "VAT Calculation Type" = "VAT Calculation Type"::"Full VAT" THEN BEGIN
    // Delete the following line. 
                   "Amount Including VAT" := "Line Amount" - "Inv. Discount Amount";
                    Amount := 0;
                    "VAT Base Amount" := 0;
                  END ELSE BEGIN
    ...
    

    Código de substituição 3

    ...
                    TempVATAmountLineRemainder."VAT Amount" - "Amount Including VAT" + Amount;
                END ELSE BEGIN
                  IF "VAT Calculation Type" = "VAT Calculation Type"::"Full VAT" THEN BEGIN
    // Add the following lines.
                   IF "Line Discount %" <>100 THEN
                     "Amount Including VAT" := "Line Amount" - "Inv. Discount Amount"
                   ELSE
                     "Amount Including VAT" := 0;
    // End of the added lines.
    
                    Amount := 0;
                    "VAT Base Amount" := 0;
                  END ELSE BEGIN
    ...
    

    Código 4 existente

    ...
                           TempVATAmountLine."VAT Amount" *
                         ("Line Amount" - "Inv. Discount Amount") /
                         (TempVATAmountLine."Line Amount" - TempVATAmountLine."Invoice Discount Amount");
    // Delete the following lines. 
                     "Amount Including VAT" :=
           //--PT----
           //          Amount + ROUND(TempVATAmountLineRemainder."VAT Amount",Currency."Amount Rounding Precision");
                       Amount + ROUND(TempVATAmountLineRemainder."VAT Amount" + TempVATAmountLine."ND Amount",
                       Currency."Amount Rounding Precision",Currency.VATRoundingDirection);
    // End of the deleted lines.
            //--------
                    TempVATAmountLineRemainder."VAT Amount" :=
                      TempVATAmountLineRemainder."VAT Amount" - "Amount Including VAT" + Amount; 
    ...
    

    Código de substituição 4

    ...
                         TempVATAmountLine."VAT Amount" *
                         ("Line Amount" - "Inv. Discount Amount") /
                         (TempVATAmountLine."Line Amount" - TempVATAmountLine."Invoice Discount Amount");
    // Add the following lines.
                   IF "Line Discount %" <> 100 THEN
                     "Amount Including VAT" :=
           //--PT----
           //          Amount + ROUND(TempVATAmountLineRemainder."VAT Amount",Currency."Amount Rounding Precision");
                       Amount + ROUND(TempVATAmountLineRemainder."VAT Amount" + TempVATAmountLine."ND Amount",
                       Currency."Amount Rounding Precision",Currency.VATRoundingDirection)
                   ELSE
                     "Amount Including VAT" := 0;
    // End of the added lines.
            //--------
                    TempVATAmountLineRemainder."VAT Amount" :=
                      TempVATAmountLineRemainder."VAT Amount" - "Amount Including VAT" + Amount;
    ...
    
  3. Altere o código na função UpdInvPostingBuffer na codeunit Purch.-Post (90) da seguinte maneira:

    Código existente

    ...
                 FALineNo := FALineNo + 1;
              InvPostingBuffer[1]."Fixed Asset Line No." := FALineNo;
            END;
            InvPostingBuffer[2] := InvPostingBuffer[1];
            IF InvPostingBuffer[2].FIND THEN BEGIN
              InvPostingBuffer[2].Amount :=
    ...
    

    Código de substituição

    ...
               FALineNo := FALineNo + 1;
              InvPostingBuffer[1]."Fixed Asset Line No." := FALineNo;
            END;
    // Add the following lines.
           IF PurchLine."Line Discount %" = 100 THEN BEGIN
             InvPostingBuffer[1]."VAT Base Amount" := 0;
             InvPostingBuffer[1]."VAT Base Amount (ACY)" := 0;
             InvPostingBuffer[1]."VAT Amount" := 0;
             InvPostingBuffer[1]."VAT Amount (ACY)" := 0;
           END;
    // End of the added lines.
            InvPostingBuffer[2] := InvPostingBuffer[1];
            IF InvPostingBuffer[2].FIND THEN BEGIN
              InvPostingBuffer[2].Amount :=
    ...
    
  4. Altere o código na função DivideAmount na codeunit Purch.-Post (90) da seguinte maneira:

    Código 1 existente

    ...
              IF RoundingLineInserted AND (RoundingLineNo = PurchLine."Line No.") THEN
              EXIT;
            WITH PurchLine DO
    // Delete the following line. 
             IF (PurchLineQty = 0) OR ("Direct Unit Cost" = 0) OR ("Line Discount %" = 100) THEN BEGIN
    
                "Line Amount" := 0;
                "Line Discount Amount" := 0;
                "Inv. Discount Amount" := 0;
    ...
    

    Código de substituição 1

    ...
             IF RoundingLineInserted AND (RoundingLineNo = PurchLine."Line No.") THEN
              EXIT;
            WITH PurchLine DO
    // Add the following line.
             IF (PurchLineQty = 0) OR ("Direct Unit Cost" = 0) THEN BEGIN
    
                "Line Amount" := 0;
                "Line Discount Amount" := 0;
                "Inv. Discount Amount" := 0;
    ...
    

    Código 2 existente

    ...
                         TempVATAmountLine."Pmt. Disc. Given Amount");
    
                  END;
    // Delete the following lines.
    .             "Amount Including VAT" :=
                   ROUND(TempVATAmountLineRemainder."Amount Including VAT",Currency."Amount Rounding Precision");
    // End of the deleted lines.
    
                  Amount :=
                    ROUND("Amount Including VAT",Currency."Amount Rounding Precision") -
            //--PT----
    ...
    

    Código de substituição 2

    ...
                       TempVATAmountLine."Pmt. Disc. Given Amount");
    
                  END;
    // Add the following lines.
                 IF "Line Discount %" <> 100 THEN
                   "Amount Including VAT" :=
                     ROUND(TempVATAmountLineRemainder."Amount Including VAT",Currency."Amount Rounding Precision")
                 ELSE
                   "Amount Including VAT" := 0;
    // End of the added lines.
    
                  Amount :=
                    ROUND("Amount Including VAT",Currency."Amount Rounding Precision") -
            //--PT----
    ...
    

    Código 3 existente

    ...
                     TempVATAmountLineRemainder."VAT Amount" - "Amount Including VAT" + Amount;
                END ELSE BEGIN
                  IF "VAT Calculation Type" = "VAT Calculation Type"::"Full VAT" THEN BEGIN
    // Delete the following line.
                   "Amount Including VAT" := "Line Amount" - "Inv. Discount Amount";
                    Amount := 0;
                    "VAT Base Amount" := 0;
                  END ELSE BEGIN  
    ...
    

    Código de substituição 3

    ... 
                    TempVATAmountLineRemainder."VAT Amount" - "Amount Including VAT" + Amount;
                END ELSE BEGIN
                  IF "VAT Calculation Type" = "VAT Calculation Type"::"Full VAT" THEN BEGIN
    // Add the following lines.
                   IF "Line Discount %" <> 100 THEN
                     "Amount Including VAT" := "Line Amount" - "Inv. Discount Amount"
                   ELSE
                     "Amount Including VAT" := 0;
    // End of the added lines.
                    Amount := 0;
                    "VAT Base Amount" := 0;
                  END ELSE BEGIN
    ...
    

    Código 4 existente

    ...
                              (TempVATAmountLine."Line Amount" - TempVATAmountLine."Invoice Discount Amount");
                       END;
            //--------
    // Delete the following lines. 
                   "Amount Including VAT" :=
    
                     Amount + ROUND(TempVATAmountLineRemainder."VAT Amount" + TempVATAmountLineRemainder."ND Amount",
                     Currency."Amount Rounding Precision",Currency.VATRoundingDirection);
    // End of the deleted lines.
    
                    TempVATAmountLineRemainder."VAT Amount" :=
                      TempVATAmountLineRemainder."VAT Amount" - "Amount Including VAT" + Amount;
                  END;
    ...
    

    Código de substituição 4

    ...
                            (TempVATAmountLine."Line Amount" - TempVATAmountLine."Invoice Discount Amount");
                       END;
            //--------
    // Add the following lines.
                   IF "Line Discount %" <> 100 THEN
                     "Amount Including VAT" :=
                       Amount + ROUND(TempVATAmountLineRemainder."VAT Amount" + TempVATAmountLineRemainder."ND Amount",
                       Currency."Amount Rounding Precision",Currency.VATRoundingDirection)
                   ELSE
                     "Amount Including VAT" := 0;
    // End of the added lines.
                    TempVATAmountLineRemainder."VAT Amount" :=
                      TempVATAmountLineRemainder."VAT Amount" - "Amount Including VAT" + Amount;
                  END;
    ...
    
  5. Altere o código na função FillInvPostingBuffer no Serv-Amounts Mgt. codeunit (5986) da seguinte maneira:
    Código 1 existente

    ...
                    TotalVATACY,
                  TotalAmount,
                  TotalAmountACY);
                UpdInvPostingBuffer(InvPostingBuffer,TempDocDim);
              END;
            END; 
    ...
    

    Código de substituição 1

    ...
                  TotalVATACY,
                  TotalAmount,
                  TotalAmountACY);
    // Add the following lines.
               IF ServiceLine."Line Discount %" = 100 THEN BEGIN
                 InvPostingBuffer[1]."VAT Base Amount" := 0;
                 InvPostingBuffer[1]."VAT Base Amount (ACY)" := 0;
                 InvPostingBuffer[1]."VAT Amount" := 0;
                 InvPostingBuffer[1]."VAT Amount (ACY)" := 0;
               END;
    // End of the added lines.
                UpdInvPostingBuffer(InvPostingBuffer,TempDocDim);
              END;
            END;
    ...
    

    Código 2 existente

    ...
                    TotalVATACY,
                  TotalAmount,
                  TotalAmountACY);
                UpdInvPostingBuffer(InvPostingBuffer,TempDocDim);
             END;
            END;
    ...
    

    Código de substituição 2

    ...
                  TotalVATACY,
                  TotalAmount,
                  TotalAmountACY);
    // Add the following lines.
               IF ServiceLine."Line Discount %" = 100 THEN BEGIN
                 InvPostingBuffer[1]."VAT Base Amount" := 0;
                 InvPostingBuffer[1]."VAT Base Amount (ACY)" := 0;
                 InvPostingBuffer[1]."VAT Amount" := 0;
                 InvPostingBuffer[1]."VAT Amount (ACY)" := 0;
               END;
    // End of the added lines.
                UpdInvPostingBuffer(InvPostingBuffer,TempDocDim);
             END;
            END;
    ...
    

    Código 3 existente

    ...
                   TotalVATACY,
                  TotalAmount,
                  TotalAmountACY);
                UpdInvPostingBuffer(InvPostingBuffer,TempDocDim);
              END;
            END;
    ...
    

    Código de substituição 3

    ...
                  TotalVATACY,
                  TotalAmount,
                  TotalAmountACY);
    // Add the following lines.
               IF ServiceLine."Line Discount %" = 100 THEN BEGIN
                 InvPostingBuffer[1]."VAT Base Amount" := 0;
                 InvPostingBuffer[1]."VAT Base Amount (ACY)" := 0;
                 InvPostingBuffer[1]."VAT Amount" := 0;
                 InvPostingBuffer[1]."VAT Amount (ACY)" := 0;
               END;
    // End of the added lines.
    
                UpdInvPostingBuffer(InvPostingBuffer,TempDocDim);
              END;
            END;
    ...
    

    Código 4 existente

    ...
                 END;
              END;
            END;
    
            UpdInvPostingBuffer(InvPostingBuffer,TempDocDim);
          END;
    ...
    

    Código de substituição 4

    ...
                END;
              END;
            END;
    // Add the following lines.
           IF ServiceLine."Line Discount %" = 100 THEN BEGIN
             InvPostingBuffer[1]."VAT Base Amount" := 0;
             InvPostingBuffer[1]."VAT Base Amount (ACY)" := 0;
             InvPostingBuffer[1]."VAT Amount" := 0;
             InvPostingBuffer[1]."VAT Amount (ACY)" := 0;
           END;
    // End of the added lines.
    
            UpdInvPostingBuffer(InvPostingBuffer,TempDocDim);
          END;
    ...
    
  6. Altere o código na função DivideAmount no Serv-Amounts Mgt. codeunit (5986) da seguinte maneira:
    Código 1 existente

    ...
                       (TempVATAmountLine."Line Amount" - TempVATAmountLine."Invoice Discount Amount" -
                      TempVATAmountLine."Pmt. Disc. Given Amount");
                  END;
    // Delete the following lines. 
                 "Amount Including VAT" :=
                   ROUND(TempVATAmountLineRemainder."Amount Including VAT",Currency."Amount Rounding Precision");
    // End of the deleted lines.
                  Amount :=
                    ROUND("Amount Including VAT",Currency."Amount Rounding Precision") -
                    ROUND(TempVATAmountLineRemainder."VAT Amount",Currency."Amount Rounding Precision");
    ...
    

    Código de substituição 1

    ...
                      (TempVATAmountLine."Line Amount" - TempVATAmountLine."Invoice Discount Amount" -
                      TempVATAmountLine."Pmt. Disc. Given Amount");
                  END;
    // Add the following lines.
                 IF "Line Discount %" <> 100 THEN
                   "Amount Including VAT" :=
                     ROUND(TempVATAmountLineRemainder."Amount Including VAT",Currency."Amount Rounding Precision")
                 ELSE
                   "Amount Including VAT" := 0;
    // End of the added lines.
                  Amount :=
                    ROUND("Amount Including VAT",Currency."Amount Rounding Precision") -
                    ROUND(TempVATAmountLineRemainder."VAT Amount",Currency."Amount Rounding Precision");
    ...
    

    Código 2 existente

    ...
                    TempVATAmountLineRemainder."VAT Amount" - "Amount Including VAT" + Amount;
                END ELSE BEGIN
                  IF "VAT Calculation Type" = "VAT Calculation Type"::"Full VAT" THEN BEGIN
    // Delete the following line. 
                   "Amount Including VAT" := "Line Amount" - "Inv. Discount Amount";
    
                    Amount := 0;
                    "VAT Base Amount" := 0;
                  END ELSE BEGIN
    ...
    

    Código de substituição 2

    ...
                   TempVATAmountLineRemainder."VAT Amount" - "Amount Including VAT" + Amount;
                END ELSE BEGIN
                  IF "VAT Calculation Type" = "VAT Calculation Type"::"Full VAT" THEN BEGIN
    // Add the following lines.
                   IF "Line Discount %" <> 100 THEN
                     "Amount Including VAT" := "Line Amount" - "Inv. Discount Amount"
                   ELSE
                     "Amount Including VAT" := 0;
    // End of the added lines.
                    Amount := 0;
                    "VAT Base Amount" := 0;
                  END ELSE BEGIN
    ...
    

    Código 3 existente

    ...
                      ("Line Amount" - "Inv. Discount Amount" - "Pmt. Disc. Given Amount") /
                      (TempVATAmountLine."Line Amount" - TempVATAmountLine."Invoice Discount Amount" -
                      TempVATAmountLine."Pmt. Disc. Given Amount");
    // Delete the following lines. 
                   "Amount Including VAT" :=
                     Amount + ROUND(TempVATAmountLineRemainder."VAT Amount",Currency."Amount Rounding Precision")
                     + ROUND(TempVATAmountLineRemainder."ND Amount",Currency."Amount Rounding Precision");
    // End of the deleted lines.
    
                    TempVATAmountLineRemainder."VAT Amount" :=
                      TempVATAmountLineRemainder."VAT Amount" - "Amount Including VAT" + Amount;
                  END;
    ...
    

    Código de substituição 3

    ...
                    ("Line Amount" - "Inv. Discount Amount" - "Pmt. Disc. Given Amount") /
                      (TempVATAmountLine."Line Amount" - TempVATAmountLine."Invoice Discount Amount" -
                      TempVATAmountLine."Pmt. Disc. Given Amount");
    // Add the following lines.
                   IF "Line Discount %" <> 100 THEN
                     "Amount Including VAT" :=
                       Amount + ROUND(TempVATAmountLineRemainder."VAT Amount",Currency."Amount Rounding Precision")
                       + ROUND(TempVATAmountLineRemainder."ND Amount",Currency."Amount Rounding Precision")
                   ELSE
                     "Amount Including VAT" := 0;
    // End of the added lines.
                    TempVATAmountLineRemainder."VAT Amount" :=
                      TempVATAmountLineRemainder."VAT Amount" - "Amount Including VAT" + Amount;
                  END;
    ...
    

Pré-requisitos

Você deve ter um dos seguintes produtos instalados para aplicar este hotfix:

  • A versão em português do Microsoft Dynamics NAV 2009 Service Pack 1 (SP1)
  • A versão em português do Microsoft Dynamics NAV 2009 R2

                
              

Informações sobre remoção

Você não pode remover esse hotfix.

Status

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na seção "Aplica-se a".

Referências

VSTF DynamicsNAV SE: 255528

Observação Este é um artigo "FAST PUBLISH" criado diretamente na organização de suporte da Microsoft. As informações contidas aqui são fornecidas como resposta aos problemas possíveis. Como resultado da prontidão de disponibilizá-lo, os materiais pode conter erros tipográficos e podem ser revisados a qualquer momento são aviso prévio. Consulte Termos de Uso para obter outras considerações.