AX 2012 R2: Error al eliminar Historial de facturas y coincidencias de Orden de compra.
Escenario
En un ambiente con el control presupuestario activado establece una serie de controles que se aplican a los documentos, este control ha presentado varios problemas al momento de eliminar y registrar una factura de OC que en un principio generó algún error estándar y por su naturaleza no implica que el proceso estándar realice el control de presupuestos al documento.
El mensaje de error es el siguiente:
Descripción de error SQL: [Microsoft][SQL Server Native Client 10.0][SQL Server]BudgetControlProcessProc ( in SysRaiseErrorProc): Trying:exec BudgetControlCheckBudgetProc :BudgetControlCheckBudgetProc: Trying:No BudgetSource rows for BudgetCheckGroup = 5637151459: at line unknown at line 67
Análisis del problema
Durante el seguimiento y análisis del problema se pudo identificar que el control presupuestario ejecuta un procedimiento almacenado (store procedure BudgetControlCheckBudgetProc) el cual se encarga de aplicar los controles que los documentos deben reunir antes de realizar cualquier operación en Axapta.
El procedimiento almacenado BudgetControlCheckBudgetProc realiza la consulta a las siguientes tablas:
[BUDGETSOURCETRACKINGDETAIL]
[BUDGETSOURCETRACKING]
[BUDGETSOURCE]
[BUDGETCONTROLCONFIGURATION]
[BUDGETCONTROLRULE]
[BudgetControlCycleView] (Vista SQL)
[BUDGETGROUPMEMBER]
[BUDGETGROUP]
El sistema al no encontrar información de la consulta provoca que se emita el error reportado.
Solución
Modificación de la clase estándar BudgetControlProcessor, esta modificación debe permitir realizar la consulta a la tabla BUDGETSOURCETRACKINGDETAIL y verificar si tiene información de seguimiento del presupuesto, en caso de no encontrar información no deberá realizar el control del presupuesto del documento.
- Crear método checkBudgetFix
- Modificar método estándar processForBudgetControl para invocar al nuevo método.
/// <summary> /// Ismael Utitiaj A. /// consulta para identificar si el documento debe realizar control presupuestario. /// </summary> /// <returns> /// /// </returns> /// <remarks> /// /// </remarks> private boolean checkBudgetFix() { BudgetSourceTracking sourceTracking; BudgetSourceTrackingDetail sourceTrackingDetail; ; //consulta detalle de seguimiento select RecId from sourceTrackingDetail join sourceTracking where sourceTracking.RecId == sourceTrackingDetail.BudgetSourceTracking && sourceTracking.BudgetSource == budgetCheckGroup; return sourceTrackingDetail.RecId; } /// <summary> /// Ismael Utitiaj A. /// llamada verificacion de control presupuestario en documentos con error y que no debe realizar /// la comprobacion de presupuesto /// Invokes the stored procedure for performing the budget check. /// </summary> /// <returns> /// A Boolean that indicates whether the stored procedure completed successfully. /// </returns> protected boolean processForBudgetControl() { boolean isStoredProcedureSuccessful = true; // The stored procedure must be called in the case where pending deletions are prepared or return details or // relieving details are prepared regardless of whether there are control details to be checked //if (this.areProcessingDetailsPrepared()) //.oldLine if (this.areProcessingDetailsPrepared() && this.checkBudgetFix()) //linenew { isStoredProcedureSuccessful = BudgetControlProcessor::invokeBudgetCheckStoredProcedure( budgetCheckGroup, areRelievingDetailsPrepared || areRelievingPendingDeletionsPrepared); } return isStoredProcedureSuccessful; }
*This post is locked for comments