Beispiel #1
0
        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);
        }
Beispiel #2
0
        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));
        }
Beispiel #3
0
 public object Ejecutar(string sMetodo, params object[] aParametros)
 {
     return(CodigoDinamico.EjecutarMetodo(this.Instancia, sMetodo, aParametros));
 }
Beispiel #4
0
        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;
            }
        }
Beispiel #5
0
        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();
        }
Beispiel #6
0
        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) : "");
        }