public static object EjecutarCodigo(string sCodigo, params object[] aParametros) { if (oCodigoDin == null) oCodigoDin = new CodigoDinamico(); string sMetodo = "Ejecutar"; sCodigo = string.Format("public object {0}(params object[] aParametros) {\n{1}\n}", sMetodo, sCodigo); var oInstancia = CodigoDinamico.oCodigoDin.GenerarInstancia(sCodigo); return CodigoDinamico.EjecutarMetodo(oInstancia, sMetodo, aParametros); }
public static object EjecutarCodigo(string sCodigo, params object[] aParametros) { if (oCodigoDin == null) { oCodigoDin = new CodigoDinamico(); } string sMetodo = "Ejecutar"; sCodigo = string.Format("public object {0}(params object[] aParametros) {\n{1}\n}", sMetodo, sCodigo); var oInstancia = CodigoDinamico.oCodigoDin.GenerarInstancia(sCodigo); return(CodigoDinamico.EjecutarMetodo(oInstancia, sMetodo, aParametros)); }
public object Ejecutar(string sMetodo, params object[] aParametros) { return(CodigoDinamico.EjecutarMetodo(this.Instancia, sMetodo, aParametros)); }
private void CalcularMaxMinFilas(int iSucursalID, CodigoDinamico oDin, IEnumerable<ParteMaxMinRegla> oReglas, int iFilaDesde, int iIncremento) { pauPartesMaxMin_Res oParte; DataGridViewRow oFila; int iFilaHasta = (iFilaDesde + iIncremento); for (int iFila = iFilaDesde; iFila <= iFilaHasta; iFila++) { oFila = this.dgvDetalle.Rows[iFila]; // Si no está marcado, no se calcula if (!Util.Logico(oFila.Cells["colProcesar"].Value)) continue; // Si es fijo, se pasan los datos actuales tal cual if (Util.Logico(oFila.Cells["Fijo"].Value)) { oFila.Cells["Maximo"].Value = oFila.Cells["MaximoActual"].Value; oFila.Cells["Minimo"].Value = oFila.Cells["MinimoActual"].Value; continue; } oParte = (oFila.Tag as pauPartesMaxMin_Res); // Se generan los parámetros var oParams = new object[] { oParte.ProveedorID, oParte.MarcaParteID, oParte.LineaID, oParte.UnidadEmpaque, oParte.VentasTotal , oParte.CantidadMaxDia, oParte.CantidadMaxSem, oParte.CantidadMaxMes, oParte.Maximo, oParte.Minimo , oParte.EsPar , oParte.AbcDeVentas, oParte.AbcDeUtilidad, oParte.AbcDeNegocio, oParte.AbcDeProveedor, oParte.AbcDeLinea , oParte.VentasAnt1, oParte.VentasAnt2, oParte.VentasAnt3 }; // Se establece el Max y el Min con cero oParte.Maximo = 0; oParte.Minimo = 0; // Se inicializan los datos extra MaxMinFunciones.Inicializar(oParte.ParteID, iSucursalID); // Se procesan la regla correspondiente, o todas si no se tiene una asignada string sReglasAp = this.ProcesarReglas(oDin, oReglas, ref oParte, oParams); // Si Maximo es cero, se vuelven a correr las reglas con las ventas globales, si aplica if (oParte.VentasGlobales && oParte.Maximo.Valor() == 0 && iSucursalID == Cat.Sucursales.Matriz) { // Se traen los datos globales var oParamsProc = new Dictionary<string, object>(); oParamsProc.Add("ParteID", oParte.ParteID); oParamsProc.Add("Desde", this.Desde); oParamsProc.Add("Hasta", this.Hasta); var oParteGlobal = Datos.ExecuteProcedure<pauParteMaxMinDatosVentas_Result>("pauParteMaxMinDatosVentas", oParamsProc).FirstOrDefault(); oParams = new object[] { oParte.ProveedorID, oParte.MarcaParteID, oParte.LineaID, oParte.UnidadEmpaque, oParteGlobal.Ventas , oParteGlobal.CantidadMaxDia, oParteGlobal.CantidadMaxSem, oParteGlobal.CantidadMaxMes, oParte.Maximo, oParte.Minimo , oParte.EsPar , oParte.AbcDeVentas, oParte.AbcDeUtilidad, oParte.AbcDeNegocio, oParte.AbcDeProveedor, oParte.AbcDeLinea , oParte.VentasAnt1, oParte.VentasAnt2, oParte.VentasAnt3 }; MaxMinFunciones.Inicializar(oParte.ParteID, null); // Se procesan las reglas sReglasAp = this.ProcesarReglas(oDin, oReglas, ref oParte, oParams); } // Se escriben los cambios en el grid oFila.Cells["Maximo"].Value = oParte.Maximo; oFila.Cells["Minimo"].Value = oParte.Minimo; if (Util.Decimal(oFila.Cells["MaximoActual"].Value) == oParte.Maximo && Util.Decimal(oFila.Cells["MinimoActual"].Value) == oParte.Minimo) { oFila.DefaultCellStyle.ForeColor = this.dgvDetalle.DefaultCellStyle.ForeColor; } else { oFila.DefaultCellStyle.ForeColor = Color.Brown; oFila.DefaultCellStyle.Font = new Font(this.dgvDetalle.DefaultCellStyle.Font, FontStyle.Bold); } oFila.Cells["Condiciones"].Value = sReglasAp; } }
private void CalcularMaxMin() { Cargando.Mostrar(); int iSucursalID = Util.Entero(this.cmbSucursal.SelectedValue); // Se obtiene la lista de reglas var oReglas = Datos.GetListOf<ParteMaxMinRegla>(q => q.SucursalID == iSucursalID && q.Estatus).OrderBy(q => q.Orden); // Se cargan las reglas a una clase, para ser compiladas string sParamsMetodo = ( "int IdProveedor, int IdMarca, int IdLinea, decimal UDE, int VentasTotal" + ", decimal CantidadMaxDia, decimal CantidadMaxSem, decimal CantidadMaxMes, decimal Maximo, decimal Minimo" + ", bool EsPar" + ", string AbcDeVentas, string AbcDeUtilidad, string AbcDeNegocio, string AbcDeProveedor, string AbcDeLinea" + ", int VentasAnioAnt1, int VentasAnioAnt2, int VentasAnioAnt3" ); // Se genera el código dinámico var oDin = new CodigoDinamico(); oDin.Referencias.AddRange(new string[] { "System.dll", "THEOS.exe", "LibUtil.dll" }); oDin.Usings.AddRange(new string[] { "System", "Refaccionaria.App", "LibUtil" }); var oCodigo = new StringBuilder(); foreach (var oRegla in oReglas) { oCodigo.AppendFormat("public object Regla{0}_Condicion({1}) {{ return ({2}); }}", oRegla.ParteMaxMinReglaID, sParamsMetodo, oRegla.Condicion); oCodigo.AppendFormat("public object Regla{0}_Maximo({1}) {{ return ({2}); }}", oRegla.ParteMaxMinReglaID, sParamsMetodo, oRegla.Maximo); oCodigo.AppendFormat("public object Regla{0}_Minimo({1}) {{ return ({2}); }}", oRegla.ParteMaxMinReglaID, sParamsMetodo, oRegla.Minimo); } // Se agrega la función para el múltiplo de la Unidad de Empaque oCodigo.AppendLine("public decimal MultiploSup(decimal mNumero, decimal mMultiplo) { if (mMultiplo == 0) return 0; decimal mResiduo = (mNumero % mMultiplo);" + " if (mResiduo == 0) return mNumero; else return (mNumero + (mMultiplo - mResiduo)); }"); // Se agrega función para redondeo oCodigo.AppendLine("public decimal Redondear(decimal mNumero, int iDecimales) { return Math.Round(mNumero, iDecimales); }"); // Se agrega función para promedio oCodigo.AppendLine("public decimal Promedio(params decimal[] aNumeros) { return Util.Promedio(aNumeros); }"); // Se agregan funciones para cantidades máximas por períodos de tiempo oCodigo.AppendLine("public decimal MaxSem(int iOrden) { return MaxMinFunciones.MaxSem(iOrden); }"); oCodigo.AppendLine("public decimal MaxMes(int iOrden) { return MaxMinFunciones.MaxMes(iOrden); }"); // Se manda generar la instancia con el código oDin.GenerarInstancia(oCodigo.ToString()); if (oDin.Instancia == null) { Cargando.Cerrar(); return; } // Se inicia el cálculo, por partes int iFilaActual = 0, iTotalFilas = this.dgvDetalle.Rows.Count, iIncremento = 300; while (iFilaActual < iTotalFilas) { if ((iFilaActual + iIncremento) > iTotalFilas) iIncremento = (iTotalFilas - iFilaActual - 1); UtilLocal.MostrarNotificacion(string.Format("Procesando filas de la {0} a la {1}..", iFilaActual, iIncremento)); Application.DoEvents(); this.CalcularMaxMinFilas(iSucursalID, oDin, oReglas, iFilaActual, iIncremento); iFilaActual += (iIncremento + 1); } // Se hace el filtro de Cambios, si aplica this.FiltroDeCambios(); Cargando.Cerrar(); }
private string ProcesarReglas(CodigoDinamico oDin, IEnumerable<ParteMaxMinRegla> oReglas, ref pauPartesMaxMin_Res oParte, object[] oParams) { string sReglasAp = ""; // Se ejecuta la regla correspondiente si ya está asignada, si no, se ejecutan todas las reglas int iReglaID = oParte.ParteMaxMinReglaID.Valor(); if (iReglaID > 0 && Datos.Exists<ParteMaxMinRegla>(c => c.ParteMaxMinReglaID == iReglaID && c.Estatus)) { string sReglaID = oParte.ParteMaxMinReglaID.ToString(); string sPrefijoMet = ("Regla" + sReglaID + "_"); oParte.Maximo = Util.Decimal(oDin.Ejecutar((sPrefijoMet + "Maximo"), oParams)); oParams[8] = oParte.Maximo; oParte.Minimo = Util.Decimal(oDin.Ejecutar((sPrefijoMet + "Minimo"), oParams)); // oParams[9] = oParte.Minimo; sReglasAp += (", " + sReglaID); } else { foreach (var oRegla in oReglas) { string sReglaID = oRegla.ParteMaxMinReglaID.ToString(); string sPrefijoMet = ("Regla" + sReglaID + "_"); bool bProcesar = Util.Logico(oDin.Ejecutar((sPrefijoMet + "Condicion"), oParams)); if (bProcesar) { oParte.Maximo = Util.Decimal(oDin.Ejecutar((sPrefijoMet + "Maximo"), oParams)); oParams[8] = oParte.Maximo; oParte.Minimo = Util.Decimal(oDin.Ejecutar((sPrefijoMet + "Minimo"), oParams)); oParams[9] = oParte.Minimo; sReglasAp += (", " + sReglaID); } } } // Se ejecutan las reglas básicas finales if (oParte.Maximo == 0) { oParte.Minimo = 0; } else if (oParte.Minimo > 0) { if (oParte.Minimo < 1) oParte.Minimo = 1; if (oParte.Minimo > oParte.Maximo) oParte.Minimo = (oParte.Maximo - 1); if (oParte.Minimo == oParte.Maximo) oParte.Minimo--; } return (sReglasAp.Length > 1 ? sReglasAp.Substring(2) : ""); }