using System; using System.CodeDom.Compiler; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using bdGrupoSanchoToro; using bdGrupoSanchoToro.db; using Microsoft.VisualBasic; using Microsoft.VisualBasic.CompilerServices; namespace bdGrupoSanchoToro { public class CalculosDinamicos { private System.Reflection.Assembly oEnsamblado; public bool PrecompilarFuncion(string Funcion, List ListaEnsamblados, List ListaParametros, List ListaEspacioNombres, List AccionesIniciales = null) { try { string mStrings; string mParametros = ""; // Definimos un objeto de tipo StringBuilder que contendra el código a compilar var CodigoFuente = new StringBuilder(); // Agregamos los Imports necesarios a nuestro codigo fuente // CodigoFuente.Append("Option Explicit Off" & vbCr) foreach (var currentMStrings in ListaEspacioNombres) { mStrings = currentMStrings; CodigoFuente.Append("Imports " + mStrings + Constants.vbCr); } // Preparamos un string con los parametros que usará el metodo Eval // de de la clase EvalClase if (ListaParametros is not null) { foreach (var currentMStrings1 in ListaParametros) { mStrings = currentMStrings1; mParametros += ", " + mStrings; } } mParametros = Strings.Trim(mParametros); if (mParametros.Length > 0) { mParametros = Strings.Trim(Strings.Mid(mParametros, 2)); } // Terminamos de construir la clase a compilar CodigoFuente.Append("Public Class EvalClase" + Constants.vbCr); CodigoFuente.Append(" Public Shared Function Eval(" + mParametros + ") as Double" + Constants.vbCr); CodigoFuente.Append("Try" + Constants.vbCr); if (!(AccionesIniciales == null)) { foreach (var currentMStrings2 in AccionesIniciales) { mStrings = currentMStrings2; CodigoFuente.Append(mStrings + Constants.vbCr); } } CodigoFuente.Append(" Return " + Funcion + Constants.vbCr); CodigoFuente.Append("Catch ex as Exception" + Constants.vbCr); CodigoFuente.Append(" Throw New Exception(ex.Message, ex)" + Constants.vbCr); CodigoFuente.Append("End Try" + Constants.vbCr); CodigoFuente.Append("End Function " + Constants.vbCr); CodigoFuente.Append("End Class " + Constants.vbCr); var oCProvider = new VBCodeProvider(); CodeDomProvider oCompiler = oCProvider; var oCParam = new CompilerParameters(); oCParam.GenerateInMemory = true; foreach (var ens in ListaEnsamblados) oCParam.ReferencedAssemblies.Add(ens); // oCParam.ReferencedAssemblies.Add("Cablin.dll") // oCParam.ReferencedAssemblies.Add("FuncionesTsl4.dll") // oCParam.ReferencedAssemblies.Add("System.dll") // oCParam.ReferencedAssemblies.Add("System.Data.dll") // oCParam.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll") // Creamos un objeto CompilerResult que obtendrá los resultados de la compilación CompilerResults oCResult; // Comprobamos que no existan errores de compilación. oCResult = oCompiler.CompileAssemblyFromSource(oCParam, CodigoFuente.ToString()); string sErrores = ""; if (oCResult.Errors.Count > 0) { // Si existen errores los mostramos. // Si bien, podriamos implementar un mejor método para visualizar // los errores de compilación, este nos servirá por los momentos. foreach (CompilerError oCError in oCResult.Errors) // MsgBox(oCError.ErrorText.ToString) sErrores += oCError.ErrorText.ToString() + " --- "; throw new Exception(sErrores); } else { // Como el ensamblado se generó en memoria, debemos obtener // una referencia al ensamblado generado, para esto usamos // la propiedad CompiledAssembly oEnsamblado = oCResult.CompiledAssembly; return true; } } catch (Exception EX) { throw new Exception("Errores en Compilacion:" + EX.Message, EX); } } public double Evaluar(params object[] Parametros) { if (oEnsamblado is null) { throw new Exception("La función no está compilada"); } else { var oClass = oEnsamblado.GetType("EvalClase"); return Conversions.ToDouble(oClass.GetMethod("Eval").Invoke(null, Parametros)); } } //public static double FNTabla(tscGrupoSanchoToro bd, string CodigoTabla, double Valor, int? ParametroNumerico = default, string ParametroAlfabetico = "") //{ // valorestablas vt; // var iqvt = bd.valorestablas.Where(x => (x.idTablaNavigation.Codigo ?? "") == (CodigoTabla ?? "") && x.ValorInicial <= Valor && x.ValorFinal >= Valor); // if (ParametroNumerico.HasValue) // { // iqvt = iqvt.Where(x => x.ParametroNumerico == ParametroNumerico.Value); // } // if (!string.IsNullOrEmpty(ParametroAlfabetico)) // { // iqvt = iqvt.Where(x => (x.ParametroAlfabetico ?? "") == (ParametroAlfabetico ?? "")); // } // vt = iqvt.FirstOrDefault(); // if (vt is null) // { // return 0d; // } // else // { // return vt.Factor; // } //} //public static double CalculaPrecioServicio(tscGrupoSanchoToro bd, presupuestos Presupuesto, detallepresupuesto DetPresupuesto, productos servicio, ref double cantidad) //{ // preciosservicio precio; // switch (DetPresupuesto.productos.Tipo) // servicio.Tipo // { // case (int)productos.TipoProductoEnum.TRIBUNA: // { // int NumFilas = (int)Math.Round((double)DetPresupuesto.Bloques.Sum(x => x.productos.NumeroFilas) / (double)DetPresupuesto.Bloques.Count); // // precio = servicio.preciosservicioidProductoNavigation.FirstOrDefault(x => x.KmsDesde <= Presupuesto.Kilometros && x.KmsHasta >= Presupuesto.Kilometros && x.NumeroFilasDesde >= NumFilas && x.NumeroFilasHasta <= NumFilas && x.NumeroAsientosDesde <= DetPresupuesto.NumeroAsientos.Value && x.NumeroAsientosHasta >= DetPresupuesto.NumeroAsientos.Value && x.DiasAlquilerDesde <= Presupuesto.DiasAlquiler && x.DiasAlquilerHasta >= Presupuesto.DiasAlquiler && x.MesDesde <= Presupuesto.MesAlquiler && x.MesHasta >= Presupuesto.MesAlquiler && x.idProducto == DetPresupuesto.idProducto); // precio = servicio.preciosservicioidProductoServicioNavigation.FirstOrDefault(x => x.KmsDesde <= Presupuesto.Kilometros && x.KmsHasta >= Presupuesto.Kilometros && x.NumeroFilasDesde <= NumFilas && x.NumeroFilasHasta >= NumFilas && x.NumeroAsientosDesde <= DetPresupuesto.NumeroAsientos.Value && x.NumeroAsientosHasta >= DetPresupuesto.NumeroAsientos.Value && x.idProducto == DetPresupuesto.idProductoNavigation.idProducto); // break; // } // default: // { // int Ancho = DetPresupuesto.productos.Ancho; // int Largo = DetPresupuesto.productos.Largo; // //precio = servicio.preciosservicioidProductoNavigation.FirstOrDefault(x => x.AnchoDesde <= Ancho && x.AnchoHasta >= Ancho && x.LargoDesde <= Ancho && x.LargoHasta >= Ancho && x.KmsDesde <= Presupuesto.Kilometros && x.KmsHasta >= Presupuesto.Kilometros && x.DiasAlquilerDesde <= Presupuesto.DiasAlquiler && x.DiasAlquilerHasta >= Presupuesto.DiasAlquiler && x.MesDesde <= Presupuesto.MesAlquiler && x.MesHasta >= Presupuesto.MesAlquiler && x.idProducto == DetPresupuesto.idProducto); // string Codigo = DetPresupuesto.idProductoNavigation.Codigo.Split(".")[0]; // precio = servicio.preciosservicioidProductoServicioNavigation.FirstOrDefault(x => x.AnchoDesde <= Ancho && x.AnchoHasta >= Ancho && x.LargoDesde <= Ancho && x.LargoHasta >= Ancho && x.KmsDesde <= Presupuesto.Kilometros && x.KmsHasta >= Presupuesto.Kilometros && x.idProductoNavigation.Codigo == Codigo); // break; // } // } // // If precio Is Nothing Then Throw New Exception("No existen precios del servicio " & servicio.Descripcion & " con los datos indicados") // if (precio is not null) // { // cantidad = precio.CantidadCalculada; // double pr = precio.PrecioFijo; // if (servicio.PrecioPorDia) // pr = pr * (double)Presupuesto.DiasAlquiler; // if (servicio.PrecioPorKm) // pr = pr * Presupuesto.Kilometros; // if (servicio.PrecioPorAsiento) // pr = (double)(pr * DetPresupuesto.NumeroAsientos); // return Math.Max(servicio.PrecioMinimo, pr); // } // else // { // // PENDIENTE DE ADVERTENCIA // cantidad = 1d; // return servicio.PrecioMinimo; // } //} //private static double CalculaPrecioProducto(tscGrupoSanchoToro bd, detallepresupuesto DetPresupuesto, desgloseproductos dproServicio) //{ // string formula = dproServicio.idFormulaNavigation.Formula; // var parametros = DetPresupuesto.parametrosdetallepresupuesto; // foreach (var p in parametros) // formula = formula.Replace("!P(" + p.idParametroNavigation.Codigo + ")", p.Valor.ToString()); // formula = formula.Replace("!T(", "CalculosDinamicos.FNTabla(bd,"); // formula = formula.Replace("!TF(", "CalculosDinamicos.FNTablaPorFilas(bd,"); // // formula = formula.Replace("!V(NUMFIL)", DetPresupuesto.productos.NumeroFilas.ToString) // formula = formula.Replace("!V(NUMASI)", DetPresupuesto.NumeroAsientos.Value.ToString()); // formula = formula.Replace("!V(KM)", DetPresupuesto.idPresupuestoNavigation.Kilometros.ToString()); // formula = formula.Replace("!V(CPR)", '"' + dproServicio.idProductoNavigation.Codigo.ToString() + '"'); // var cd = new CalculosDinamicos(); // var las = new List(); // las.Add("System.dll"); // las.Add("System.Data.dll"); // las.Add("System.Data.Entity.dll"); // las.Add("dll"); // las.Add("tsWPF.dll"); // las.Add("tsUtilidades.dll"); // var lp = new List(); // lp.Add("bd As tscGrupoSanchoToro"); // // For Each p In parametros // // Dim spar As String = p.parametros.Codigo & " as " // // Select Case p.parametros.Tipo // // Case TipoParametroEnum.ENTERO // // End Select // // lp.Add(p.parametros.Codigo) & " as " // // Next // var le = new List(); // le.Add("System"); // le.Add("System.Text"); // le.Add("bdGrupoSanchoToro"); // le.Add("tscGrupoSanchoToro"); // le.Add("Utilidades"); // cd.PrecompilarFuncion(formula, las, lp, le); // var pars = new object[1]; // pars[0] = bd; // return cd.Evaluar(pars); //} } }