El valor del campo "Importe pendiente" del movimiento que se crea para una factura es incorrecto, a pesar de aplicar el hotfix 975264 en Microsoft Dynamics NAV 2009


En este artículo se aplica a Microsoft Dynamics NAV para todos los países y todas las configuraciones regionales.

Síntomas


Considere la situación siguiente en Microsoft Dynamics NAV 2009:
  • Aplicar el hotfix 975264.
    Para obtener más información acerca de la revisión 975264, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
    El valor del campo "Importe pendiente" del movimiento que se crea para un pago de 975264 es incorrecto en Microsoft Dynamics NAV
  • Introduzca un valor en el configuración Appln. Precisión de redondeo campo en la ficha de aplicación en el cuadro de diálogo de Configuración de contabilidad .
  • Registrar una factura de venta.
  • Registrar un diario de cobros para la factura de venta.
En este escenario, el valor en el campo Importe pendiente en el movimiento correspondiente es incorrecto. Ningún valor se visualizará en el campo Importe pendiente .
Este problema se produce en los siguientes productos:
  • Microsoft Dynamics NAV 2009 R2
  • Microsoft Dynamics NAV 2009 Service Pack 1 (SP1)

Solución


Información de la revisión

Ahora hay una revisión compatible de Microsoft. Sin embargo, sólo se diseñó para corregir el problema que se describe en este artículo. Aplíquela sólo a sistemas que experimenten este problema específico. Esta revisión puede ser sometida a comprobaciones adicionales. Por lo tanto, si no se ve muy afectado por este problema, recomendamos que espere al próximo service pack de Microsoft Dynamics NAV o de la próxima versión de Microsoft Dynamics NAV que contenga esta revisión.

Nota: En casos especiales, los costos derivados normalmente de las llamadas pueden cancelarse si un profesional de soporte técnico de Microsoft Dynamics y productos relacionados de soporte determina que una actualización específica resolverá el problema. Los costos habituales de soporte se aplicarán a las preguntas de soporte técnico adicionales y problemas que no guarden relación con la actualización en cuestión.


Información sobre la instalación

Microsoft proporciona ejemplos de programación únicamente con fines ilustrativos, sin ninguna garantía expresa o implícita. Esto incluye, pero no se limita, a las garantías implícitas de comerciabilidad o idoneidad para un propósito particular. Este artículo asume que está familiarizado con el lenguaje de programación que se muestra y con las herramientas que se utilizan para crear y depurar procedimientos. Los ingenieros de soporte técnico de Microsoft pueden explicarle la funcionalidad de un determinado procedimiento, pero no modificarán estos ejemplos para ofrecer mayor funcionalidad ni crearán procedimientos que cumplan sus requisitos específicos.

Nota: Antes de instalar este hotfix, compruebe que todos los usuarios del cliente Microsoft Navision han salido del sistema. Esto incluye a los usuarios del cliente Microsoft Navision Application Services (NAS). Debe ser el único usuario del cliente conectado cuando implemente este hotfix.

Para implementar esta revisión, debe tener una licencia de desarrollador.

Recomendamos que la cuenta de usuario en la ventana Conexiones Windows o en la ventana Conexiones base de datos se asigne el identificador de rol "SUPER". Si la cuenta de usuario no se puede asignar el identificador de rol "SUPER", debe comprobar que la cuenta de usuario tiene los permisos siguientes:
  • El permiso de modificación para el objeto que se va a cambiar.
  • El permiso de ejecución para el objeto System Object ID 5210 y System Object ID 9015 del objeto.


Nota: No es necesario tener derechos para los almacenes de datos a menos que deba realizar reparaciones de datos.

Cambios de código

Nota: Siempre pruebe correcciones de código en un entorno controlado antes de aplicar las revisiones a los equipos de producción.
Para resolver este problema, siga estos pasos:
  1. Cambie el código del disparador PostCust en el gen.-línea Post codeunit (12) como sigue:
    Código existente
    ...// Post the application
    ApplyCustLedgEntry(

    // Delete the following line.
    CVLedgEntryBuf,DtldCVLedgEntryBuf,GenJnlLine,GLSetup."Appln. Rounding Precision");

    // Post customer entry
    ...
    Código de sustitución
    ...// Post the application
    ApplyCustLedgEntry(

    // Add the following line.
    CVLedgEntryBuf,DtldCVLedgEntryBuf,GenJnlLine);

    // Post customer entry
    ...
  2. Cambie el código del disparador PostVend en el gen.-línea Post codeunit (12) como sigue:
    Código existente
    ...// Post the application
    ApplyVendLedgEntry(

    // Delete the following lines.
    CVLedgEntryBuf,DtldCVLedgEntryBuf,GenJnlLine,
    GLSetup."Appln. Rounding Precision");
    // End of the lines.

    // Post Vendor entry
    ...
    Código de sustitución
    ...// Post the application
    ApplyVendLedgEntry(

    // Add the following line.
    CVLedgEntryBuf,DtldCVLedgEntryBuf,GenJnlLine);

    // Post Vendor entry
    ...
  3. Agregar un nuevo parámetro local en la función ApplyCustLedgEntry en el gen.-línea Post codeunit (12) y, a continuación, especifique el parámetro como sigue:
    • Var: No
    • Nombre: ApplnRoundingPrecision
    • Tipo de datos: Decimal
  4. Agregar una nueva variable local en la función ApplyCustLedgEntry en el gen.-línea Post codeunit (12) y, a continuación, especificar la variable como sigue:
    • Nombre: ApplnRoundingPrecision
    • Tipo de datos: Decimal
  5. Cambie el código de la función ApplyCustLedgEntry en el gen.-línea Post codeunit (12) como sigue:
    Código existente 1
    ...NewCVLedgEntryBuf2 := NewCVLedgEntryBuf;

    // Delete the following lines.
    IF NewCVLedgEntryBuf."Currency Code" <> '' THEN BEGIN
    Management of application of already posted entries
    IF NewCVLedgEntryBuf."Currency Code" <> ApplnCurrency.Code THEN
    ApplnCurrency.GET(NewCVLedgEntryBuf."Currency Code");
    ApplnRoundingPrecision := ApplnCurrency."Appln. Rounding Precision";
    END ELSE
    ApplnRoundingPrecision := GLSetup."Appln. Rounding Precision";
    // End of the lines.

    ApplyingDate := GenJnlLine."Posting Date";

    IF GenJnlLine."Applies-to Doc. No." <> '' THEN BEGIN
    ...
    Código nuevo 1
    ...NewCVLedgEntryBuf2 := NewCVLedgEntryBuf;

    ApplyingDate := GenJnlLine."Posting Date";

    IF GenJnlLine."Applies-to Doc. No." <> '' THEN BEGIN
    ...
    Código existente 2
    ...// Management of posting in multiple currencies
    OldCVLedgEntryBuf2 := OldCVLedgEntryBuf;
    OldCVLedgEntryBuf.COPYFILTER(Positive,OldCVLedgEntryBuf2.Positive);

    IF NewCVLedgEntryBuf."Currency Code" <> OldCVLedgEntryBuf2."Currency Code" THEN BEGIN

    ...
    Código nuevo 2
    ...// Management of posting in multiple currencies
    OldCVLedgEntryBuf2 := OldCVLedgEntryBuf;
    OldCVLedgEntryBuf.COPYFILTER(Positive,OldCVLedgEntryBuf2.Positive);

    // Add the following line.
    GetApplnRoundPrecision(ApplnRoundingPrecision,NewCVLedgEntryBuf,OldCVLedgEntryBuf);

    IF NewCVLedgEntryBuf."Currency Code" <> OldCVLedgEntryBuf2."Currency Code" THEN BEGIN
    ...
  6. Cambie el código de la función CustPostApplyCustLedgEntry en el gen.-línea Post codeunit (12) como sigue:
    Código existente
    ...// Post the application
    CustLedgEntry.CALCFIELDS(
    Amount,"Amount (LCY)","Remaining Amount","Remaining Amt. (LCY)",
    "Original Amount","Original Amt. (LCY)");
    TransferCustLedgEntry(CVLedgEntryBuf,CustLedgEntry,TRUE);
    ApplyCustLedgEntry(

    // Delete the following line.
    CVLedgEntryBuf,DtldCVLedgEntryBuf,GenJnlLine,GLSetup."Appln. Rounding Precision");

    TransferCustLedgEntry(CVLedgEntryBuf,CustLedgEntry,FALSE);
    CustLedgEntry.MODIFY;
    ...
    Código de sustitución
    ...// Post the application
    CustLedgEntry.CALCFIELDS(
    Amount,"Amount (LCY)","Remaining Amount","Remaining Amt. (LCY)",
    "Original Amount","Original Amt. (LCY)");
    TransferCustLedgEntry(CVLedgEntryBuf,CustLedgEntry,TRUE);
    ApplyCustLedgEntry(

    // Add the following line.
    CVLedgEntryBuf,DtldCVLedgEntryBuf,GenJnlLine);

    TransferCustLedgEntry(CVLedgEntryBuf,CustLedgEntry,FALSE);
    CustLedgEntry.MODIFY;
    ...
  7. Agregar un nuevo parámetro local en la función ApplyVendLedgEntry en el gen.-línea Post codeunit (12) y, a continuación, especifique el parámetro como sigue:
    • Var: No
    • Nombre: ApplnRoundingPrecision
    • Tipo de datos: Decimal
  8. Agregar una nueva variable local en la función ApplyVendLedgEntry en el gen.-línea Post codeunit (12) y, a continuación, especificar la variable como sigue:
    • Nombre: ApplnRoundingPrecision
    • Tipo de datos: Decimal
  9. Cambie el código de la función ApplyVendLedgEntry en el gen.-línea Post codeunit (12) como sigue:
    Código existente 1
    ...NewCVLedgEntryBuf2 := NewCVLedgEntryBuf;

    // Delete the following lines.
    IF NewCVLedgEntryBuf."Currency Code" <> '' THEN BEGIN
    // Management of application of already posted entries
    IF NewCVLedgEntryBuf."Currency Code" <> ApplnCurrency.Code THEN
    ApplnCurrency.GET(NewCVLedgEntryBuf."Currency Code");
    ApplnRoundingPrecision := ApplnCurrency."Appln. Rounding Precision";
    END ELSE
    ApplnRoundingPrecision := GLSetup."Appln. Rounding Precision";
    // End of the lines.

    ApplyingDate := GenJnlLine."Posting Date";

    IF GenJnlLine."Applies-to Doc. No." <> '' THEN BEGIN
    ...
    Código nuevo 1
    ...NewCVLedgEntryBuf2 := NewCVLedgEntryBuf;

    ApplyingDate := GenJnlLine."Posting Date";

    IF GenJnlLine."Applies-to Doc. No." <> '' THEN BEGIN
    ...
    Código existente 2
    ...// Management of posting in multiple currencies
    OldCVLedgEntryBuf2 := OldCVLedgEntryBuf;
    OldCVLedgEntryBuf.COPYFILTER(Positive,OldCVLedgEntryBuf2.Positive);

    IF NewCVLedgEntryBuf."Currency Code" <> OldCVLedgEntryBuf2."Currency Code" THEN BEGIN
    ...
    Código nuevo 2
    ...// Management of posting in multiple currencies
    OldCVLedgEntryBuf2 := OldCVLedgEntryBuf;
    OldCVLedgEntryBuf.COPYFILTER(Positive,OldCVLedgEntryBuf2.Positive);

    // Add the following line.
    GetApplnRoundPrecision(ApplnRoundingPrecision,NewCVLedgEntryBuf,OldCVLedgEntryBuf);

    IF NewCVLedgEntryBuf."Currency Code" <> OldCVLedgEntryBuf2."Currency Code" THEN BEGIN
    ...
  10. Cambie el código de la función VendPostApplyVendLedgEntry en el gen.-línea Post codeunit (12) como sigue:
    Código existente
    ...// Post the application
    VendLedgEntry.CALCFIELDS(
    Amount,"Amount (LCY)","Remaining Amount","Remaining Amt. (LCY)",
    "Original Amount","Original Amt. (LCY)");
    TransferVendLedgEntry(CVLedgEntryBuf,VendLedgEntry,TRUE);
    ApplyVendLedgEntry(

    // Delete the following line.
    CVLedgEntryBuf,DtldCVLedgEntryBuf,GenJnlLine,GLSetup."Appln. Rounding Precision");

    TransferVendLedgEntry(CVLedgEntryBuf,VendLedgEntry,FALSE);
    ...
    Código de sustitución
    ...// Post the application
    VendLedgEntry.CALCFIELDS(
    Amount,"Amount (LCY)","Remaining Amount","Remaining Amt. (LCY)",
    "Original Amount","Original Amt. (LCY)");
    TransferVendLedgEntry(CVLedgEntryBuf,VendLedgEntry,TRUE);
    ApplyVendLedgEntry(

    // Add the following line.
    CVLedgEntryBuf,DtldCVLedgEntryBuf,GenJnlLine);

    TransferVendLedgEntry(CVLedgEntryBuf,VendLedgEntry,FALSE);
    ...
  11. Crear una nueva función de GetApplnRoundPrecision en el gen.-línea Post codeunit (12). Para crear la función, siga estos pasos:
    1. Agregar un nuevo parámetro local en la función GetApplnRoundPrecision en el gen.-línea Post codeunit (12) y, a continuación, especifique el parámetro como sigue:
      • Var:
      • Nombre: ApplnRoundingPrecision
      • Tipo de datos: Decimal
    2. Agregar un nuevo parámetro local en la función GetApplnRoundPrecision en el gen.-línea Post codeunit (12) y, a continuación, especifique el parámetro como sigue:
      • Var: No
      • Nombre: NewCVLedgEntryBuf
      • Tipo de datos: registro
      • Subtipo: búfer de entrada contable CV
    3. Agregar un nuevo parámetro local en la función GetApplnRoundPrecision en el gen.-línea Post codeunit (12) y, a continuación, especifique el parámetro como sigue:
      • Var: No
      • Nombre: OldCVLedgEntryBuf
      • Tipo de datos: registro de
      • Subtipo: CV contabilidad INTER.
    4. Agregar una nueva variable local en la función GetApplnRoundPrecision en el gen.-línea Post codeunit (12) y, a continuación, especificar la variable como sigue:
      • Nombre: CurrencyExistInledger
      • Tipo de datos: Boolean
    5. Agregar una nueva variable local en la función GetApplnRoundPrecision en el gen.-línea Post codeunit (12) y, a continuación, especificar la variable como sigue:
      • Nombre: CurrencyCode
      • Tipo de datos: código
      • Longitud: 20
    6. Agregue el código siguiente en la función GetApplnRoundPrecision en el gen.-línea Post codeunit (12):
      IF NewCVLedgEntryBuf."Currency Code" <> '' THENCurrencyCode := NewCVLedgEntryBuf."Currency Code"
      ELSE
      CurrencyCode := OldCVLedgEntryBuf."Currency Code";
      IF CurrencyCode <> ApplnCurrency.Code THEN
      CurrencyExistInledger := ApplnCurrency.GET(CurrencyCode);

      IF CurrencyExistInledger THEN BEGIN
      IF ApplnCurrency."Appln. Rounding Precision" <> 0 THEN
      ApplnRoundingPrecision := ApplnCurrency."Appln. Rounding Precision"
      ELSE
      ApplnRoundingPrecision := GLSetup."Appln. Rounding Precision";
      END;

Requisitos previos

Debe tener uno de los siguientes productos instalados para aplicar esta revisión:
  • Microsoft Dynamics NAV 2009 R2
  • Microsoft Dynamics NAV 2009 Service Pack 1 (SP1)

Información de eliminación

No se puede quitar este hotfix.

Estado


Microsoft ha confirmado que se trata de un problema de los productos de Microsoft que se enumeran en la sección "Aplicable a".
Nota: Es un artículo "Publicación rápida" creado directamente desde dentro de la organización de soporte técnico de Microsoft. La información contenida en este documento se proporciona como está en respuesta a nuevos problemas. Como consecuencia de la velocidad en la puesta a disposición, los materiales pueden incluir errores tipográficos y podrán revisarse en cualquier momento sin previo aviso. Para obtener información adicional, consulte Condiciones de uso.