Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-04-2010
NeoNew NeoNew is offline
Miembro
 
Registrado: mar 2009
Ubicación: Bogotá
Posts: 49
Poder: 0
NeoNew Va por buen camino
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
__________________
Pre-Alpha
Responder Con Cita
  #2  
Antiguo 13-04-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Y cual es el problema?????.
Saludos
__________________
Siempre Novato
Responder Con Cita
  #3  
Antiguo 13-04-2010
NeoNew NeoNew is offline
Miembro
 
Registrado: mar 2009
Ubicación: Bogotá
Posts: 49
Poder: 0
NeoNew Va por buen camino
Cita:
Empezado por Caral Ver Mensaje
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.
__________________
Pre-Alpha
Responder Con Cita
  #4  
Antiguo 13-04-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #5  
Antiguo 13-04-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #6  
Antiguo 13-04-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #7  
Antiguo 13-04-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #8  
Antiguo 13-04-2010
NeoNew NeoNew is offline
Miembro
 
Registrado: mar 2009
Ubicación: Bogotá
Posts: 49
Poder: 0
NeoNew Va por buen camino
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.
__________________
Pre-Alpha
Responder Con Cita
  #9  
Antiguo 13-04-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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?
__________________
Siempre Novato
Responder Con Cita
  #10  
Antiguo 13-04-2010
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
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
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #11  
Antiguo 13-04-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Voy a hacer un ejemplo sencillo.
Working...............
Saludos
__________________
Siempre Novato
Responder Con Cita
  #12  
Antiguo 13-04-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Cita:
Empezado por NeoNew Ver Mensaje
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
__________________
Siempre Novato

Última edición por Caral fecha: 22-04-2010 a las 03:49:13.
Responder Con Cita
  #13  
Antiguo 13-04-2010
Avatar de yapt
yapt yapt is offline
Miembro
 
Registrado: sep 2006
Ubicación: España
Posts: 258
Poder: 18
yapt Va por buen camino
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.
Responder Con Cita
  #14  
Antiguo 13-04-2010
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
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;
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #15  
Antiguo 14-04-2010
NeoNew NeoNew is offline
Miembro
 
Registrado: mar 2009
Ubicación: Bogotá
Posts: 49
Poder: 0
NeoNew Va por buen camino
Gracia a todos voy aprobar y seguimos en contacto.
__________________
Pre-Alpha
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ayuda con formula paladincubano Varios 13 13-12-2008 06:58:57
formula.. truequeman Varios 3 20-01-2007 19:12:09
formula en dbgrid federicorl Varios 4 07-08-2006 18:58:36
Formula en Firebird jwmoreira Firebird e Interbase 4 17-05-2005 17:49:57
Almacenar una formula en una tabla jgutti Firebird e Interbase 1 09-09-2004 15:41:46


La franja horaria es GMT +2. Ahora son las 00:28:14.


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
Copyright 1996-2007 Club Delphi