Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Formula creada por el usuario. (https://www.clubdelphi.com/foros/showthread.php?t=67361)

NeoNew 13-04-2010 19:24:54

Formula creada por el usuario.
 
Hola amigos
He buscado en el foro y no encentro como hacer lo siguiente:

Necesito que el usuario defina una formula (X) con los campos que se encuentren en una base de datos.

bd.resultadodeformula = ( (bd.campo1 * bd.campo2) / bd.campo3 ) * 100

o

db.resultadodeformula = ((bd.campo1 + bd.campo2 ) / bd.campo3) * 100

Es decir que el usuario final pueda definir la formula que mejor crea con los campo de una base de datos para después en otro proceso capturar esos campos y poder entregar el resultado de la formula.

Gracias por los consejos.

NeoNew

Caral 13-04-2010 19:26:55

Hola
Y cual es el problema?????.
Saludos

NeoNew 13-04-2010 19:30:42

Cita:

Empezado por Caral (Mensaje 360331)
Hola
Y cual es el problema?????.
Saludos

Quiero que el usuario en una caja meta la formula haciendo referencia a los campo de la base de datos y no se como hacer eso.

Caral 13-04-2010 19:38:43

Hola
Voy a tratar de entender, solo tratar.
Tienes una base de datos (la cual algun dia nos diras cual es).
Tienes 3 campos (los cuales suponemos son o integer o float), solo suponemos.
Tienes una Caja (no sabemos si es un edit un memo o de carton).
Te recomiendo que nos des datos, hacer lo que quieres es tan sencillo que no se por donde empezar.
Danos detalles, recuerda que las bases de datos varían en su manera de entregar la información, cuando pides algo genérico nunca te va a funcionar, seria muy raro.
Saludos
PD: Con gusto te hago un ejemplo si me ayudas

Caral 13-04-2010 19:56:42

Hola
Empecemos algo generico:
Coloquemos los datos de los campos:
Código Delphi [-]
QTemp.SQL.Text := 'Select campo1 From BD';
   QTemp.Active := True;
   While not QTemp.Eof do
   begin
      Combobox1.Items.Add(QTemp.Fields[0].Text);
      QTemp.Next;
   end;
   QTemp.Active := False;
   QTemp.SQL.Text := 'Select campo2 From BD';
   QTemp.Active := True;
   While not QTemp.Eof do
   begin
      Combobox2.Items.Add(QTemp.Fields[0].Text);
      QTemp.Next;
   end;
   QTemp.Active := False;
   QTemp.SQL.Text := 'Select campo3 From BD';
   QTemp.Active := True;
   While not QTemp.Eof do
   begin
      Combobox3.Items.Add(QTemp.Fields[0].Text);
      QTemp.Next;
   end;
   QTemp.Active := False;
Bien, ahora que sigue?.
Saludos

Caral 13-04-2010 20:05:39

Hola
Entremos los datos:
Código Delphi [-]
 Edit1.Text := FloatToStr(StrToFloat(ComboBox1.Text) * StrToFloat(ComboBox2.Text) / StrToFloat(ComboBox3.Text) * IntToStr(100) );
Ahora, esto en que evento se hará?.
Si me voy equivocando me dices....
Saludos

Caral 13-04-2010 20:14:02

Hola
Tambien podemos hacer esto mas interesante colocando unos edit que nos definan la operacion:
Código Delphi [-]
Edit1.Text := FloatToStr(StrToFloat(ComboBox1.Text) +Edit2.Text+ StrToFloat(ComboBox2.Text)+
Edit3.Text+ StrToFloat(ComboBox3.Text) +Edit4.Text+ IntToStr(100) );
Con esto el usuario podra definir la operacion.
Como estoy aprendiendo.....
Saludos
PD: Me gustaria saber que es lo que tratamos de hacer:D

NeoNew 13-04-2010 20:30:33

Ops. (siento regañado)
Pido disculpas

Tratare de explicar nuevamente.
Estoy en la etapa de análisis de como podre hacer lo que quiero.

Defino una pantalla para capturar una formula la cual tendrá un código, un nombre, unas variables o campos integer que van de 1 a 10 y un resultado.
En el resultado quiero poder hacer que el usuario final pueda definir que operaciones quiere y que campos para obtener dicho resultado.

-Captura de Formula-----------------------------------------------

Codigo Formula....[729501]
Nombre Formula.. [Promedio de visitas]

NombreCampo1... [Visitas realizadas] ...Valor [ 57]
NombreCampo2... [Visitas esperadas]... Valor [200]
NombreCampo3... [promedio ]............. Valor [100]
. .
. .
. .
NombreCampoN Valor


NombreFormula... [Promedio visitas ]
Formulacion........ [
(Visitas realizadas / Visitas esperadas)*promedio ]

Resultado [28.5]

----------------------------------------------------------------

Explico: Codigo de formula: Se Capturado
Nombre formula : Se Captura

NombreCampo1 : Se captura
Valor : Se captura y es el valor asociado al campo1.
NombreCampo2 : Se captura
Valor : Se captura y es el valor asociado al campo2.
NombreCampo3 : Se captura
Valor : Se captura y es el valor asociado al campo3.
NombreCampoN : Se captura
Valor : Se captura y es el valor asociado al campoN.

NombreFormula : Es una nombre que el usuario da a la formula.
Formulacion : Es donde el usuario da la formula escogiendo que campos quiere usar y que operaciones quiere realizar con ellos para obtener un resultado.

Resultado :Es el resultado que el sistema debe dar al aplicar la formula dada por el usuario.

Que quiero: Quiero saber como hacer referencia a los campos para que el usuario los escoja y pueda hacer su formula, lógicamente previa validación de los signos utilizados(validar los signos en codigo o colocando botones para cada signo en fin eso es otro tema)


Gracias y disculpas nuevamente.

Caral 13-04-2010 20:38:07

Hola
No te preocupes, la verdad lo anterior fue broma, nada mas.
Disculpa pero me faltan datos o no entiendo.
Dices que los datos de los campos los capturas, en donde?.
Dices que el usuario escoje la formula, que significa, los campos o las operaciones matematicas?.
Dices que colocando botones, para las operaciones?.
Disculpa hoy estoy lento.
Saludos
PD: Que BD usas?

Chris 13-04-2010 20:41:30

Según entiendo, lo que quiere es un método o forma de interpretar la formula introducida por el usuario. Hacer los cálculos respectivos y presentar el resultado. Lamentablemente, directamente desde Delphi no puedes interpretar o evaludar una formula matemática intruducida en tiempo de ejecución así por así. Pero como siempre, los componente de terceros vienen al rescate. Creo que los componente JEDI traen un interprete de formulas. Otro que conozco, es FastScript.

También existe la posibilidad de ejecutar la fomula intruducida directamente en el servidor de base de datos, si es que estás utilizando uno. La formula solo se ejecutaría en el registro activo o en el grupo de registros que corresponda al caso. Para aclarar lo anterior, te dejo el siguiente código:

Código Delphi [-]
var
    formula_del_usuario: String; // ((campo_1 * campo_2) * 0.20)
begin

    formula_del_usuario := TextInput.Text;
    
    // ejecutar en el servidor la formula intruducida por el usuario.
    ComponenteDeConexion.SQL := 'select (' + formula_del_usuario + ') as resultado_formula ' + 
                                'from TablaUno where TablaUno.RecordID = ' RegistroActivo;
    
    // ... ejecuar la consulta y presentar el resultado ..

Espero haberte ayudado.

Saludos,
Chris

Caral 13-04-2010 20:54:42

Hola
Voy a hacer un ejemplo sencillo.
Working...............
Saludos

Caral 13-04-2010 21:31:55

Hola
Cita:

Empezado por NeoNew (Mensaje 360346)
Que quiero: Quiero saber como hacer referencia a los campos para que el usuario los escoja y pueda hacer su formula, lógicamente previa validación de los signos utilizados(validar los signos en codigo o colocando botones para cada signo en fin eso es otro tema)

Segun lo que entiendo el primer código que puse servirá, el segundo no funciona.
Aqui tienes un ejemplo con BD Access.
Hay 5 combo, en tres de ellos se reciben los datos de la tabla, los otros dos son para indicar la operación matemática.
Espero te sirva de ejemplo.
Saludos

yapt 13-04-2010 22:58:45

Yo también entiendo que lo que quiere es que el usuario pueda "modificar" una parte concreata del código Delphi.

Quiza es matar moscas a cañonazos, pero aqui tienes:

http://www.remobjects.com/ps.aspx

Con esto, puedes dejar que un usuario introduzca el código de una función y luego llamar a esa función desde dentro de tu propio código.

Bueno, creo que leyendo el texto del enlace te aclarará las cosas mucho más.

Saludos.

fjcg02 13-04-2010 23:06:51

Puedes usar la unidad PREXPR.PAS, que está incluida en el programa de contabilidad que está publicado en el ftp del Club.

Una vez tienes la fórmula, la puedes enviar alas funciones que te devuelven el resultado

Te adjunto la forma de realizar las llamadas. Puedes observar que las formulas las obtengo de una variable y los valores también de la bbdd pasándole el nombre del campo, concretamente del registro activo.

En las jedi tienes un interprete de pascal incorporado, que además viene en los programas de ejemplo, pero nunca lo he utilizado. Puede ser una buena opción también. Lo que no recuerdo es cómo se llama el componente ni cómo se usa.

Espero que te sirva de ayuda.

Saludos

Código Delphi [-]
procedure TForm.CDSVistaReciboCalcFields(DataSet: TDataSet);
begin
  inherited;
  if  CDSVistaRecibo.FieldByName('COBRAPOLIZA').AsString = 'AGENTE' then
  begin
    DataSet.FieldByName('TOTCOMISION').AsFloat:= CalcularFormula(WFormulaComisionAgente);
    DataSet.FieldByName('TOTLIQUIDACION').AsFloat:= CalcularFormula(WFormulaLiquidacionAgente);
  end;
  if  CDSVistaRecibo.FieldByName('COBRAPOLIZA').AsString = 'COMPAÑIA' then
  begin
    DataSet.FieldByName('TOTCOMISION').AsFloat:= CalcularFormula(WFormulaComisionCIA);
    DataSet.FieldByName('TOTLIQUIDACION').AsFloat:= CalcularFormula(WFormulaLiquidacionCIA);
  end;
end;

function TForm.CalcularFormula(Formula:String): Double;
var
     E: TExpression;
begin
Result:= 0;
E:= CreateExpression(Formula, ValoresFunc);
if Assigned(E) then
  Result:= E.AsFloat;
end;

function TForm.ValoresFunc( const Identifier: String;
                              ParameterList: TParameterList): TExpression;
begin
    Result:= TFloatLiteral.Create(CDSVistaRecibo.fieldByName(Identifier).AsFloat);
end;

NeoNew 14-04-2010 15:41:53

Gracia a todos voy aprobar y seguimos en contacto.


La franja horaria es GMT +2. Ahora son las 11:29:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi