242 lines
12 KiB
C#
242 lines
12 KiB
C#
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<string> ListaEnsamblados, List<string> ListaParametros, List<string> ListaEspacioNombres, List<string> 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<string>();
|
|
// 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<string>();
|
|
// 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<string>();
|
|
// 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);
|
|
//}
|
|
|
|
|
|
|
|
}
|
|
} |