Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   TQuery y calcular campo (https://www.clubdelphi.com/foros/showthread.php?t=58651)

HombreGordo 27-07-2008 19:49:50

TQuery y calcular campo
 
:) Buenas. El problema es el siguiente, tengo un TQuery y me gustaría crear una nueva columna que calculase la multiplicación de una columna llamada "UNIDAD" con un TEdit que contiene multiplicador. Intenté hacer algo como esto (parecido):
Código SQL [-]
SELECT *, UNIDAD * '+#39+editMultiplicador.Text+#39' AS RESULTADO FROM mitabla;
Pero no funciona, y a veces da un error de "Invalid use of keyword" o "Invalid Token".

Básicamente lo que deseo es que la columna UNIDAD se multiplique por un entero en común y despliegue un resultado con respecto a su fila correspondiente, pero es lo que no he logrado resolver. :confused:

Gracias de antemano. Si alguien conoce una manera mejor de resolver esto, también se lo agradecería.

Caral 27-07-2008 20:06:39

Hola

Código SQL [-]
SELECT UNIDAD * +'editMultiplicador.Text'+ AS RESULTADO FROM mitabla;

Saludos

coso 27-07-2008 20:37:01

hola, ten en cuenta de distinguir tambien el caso en que el texto este vacio o no sea un numero. saludos.

Delphius 27-07-2008 20:44:45

Hola, si estoy entendiendo bien... lo que se busca multiplicar una columna (mejor dicho campo) por un valor.

El problema es que el multiplicador que se pasa está en formato string, por tanto deben pasarlo a integer.

No se que base de datos usas pero una solución es emplear cast (1):

Código SQL [-]
select tu_campos, el_campo * cast('5' as integer) as resultado from tu_tabla;

Otra opción es lanzar la consulta desde Delphi, empleando parámetros.

(1) Debes ver si el motor de base de datos que usas soporta cast.

Saludos,

marcoszorrilla 27-07-2008 21:33:30

Igual resulta más fácil utilizar una variable:

Código Delphi [-]
var
n:Integer;
begin
try
n:=StrToInt(Edit1.Text);
select tu_campos, el_campo * n as resultado from tu_tabla;
Except
ShowMessage('Atención:Se ha producido un error en la conversión.');
end;
end;
Un Saludo.

mzell 28-07-2008 00:42:12

Hola.
Esta es otra alternativa (además sirve para extender lo comentado por el compañero Delphius sobre los parámetros).
Empleando el componente ADODataset:

Código Delphi [-]
ADODataSet1.CommandText := 'SELECT *, UNIDAD * :Multiplicador AS RESULTADO FROM mitabla';
ADODataSet1.Parameters.ParamByName('Multiplicador').Value := strtoint(Edit1.Text);

Caral 28-07-2008 00:48:38

Hola
Código Delphi [-]
Table1.Sql.Text := 'SELECT *, UNIDAD * :Multiplicador AS RESULTADO FROM mitabla';
Table1.Parameters.ParamByName('Multiplicador').Value := strtoint(Edit1.Text);
Los parámetros son buenos, sobre todo cuando hay varios datos que quieres sacar de la sentencia, pero para sacar un solo dato, pues.....
Saludos

HombreGordo 29-07-2008 05:58:46

:( Parece no funcionar, casi siempre recibo el error de "Invalid use of keyword" refieriéndose al "SELECT" o al "AS". Estuve pensando en que si la inexistencia del campo "RESULTADO" tiene algo que ver, debido a que solo la quiero para mostrar, pero actualmente no existe en la tabla como tal. :confused:

coso 29-07-2008 08:39:00

Hola, creo que esto deberia funcionarte :

Código Delphi [-]
   ...
   try 
     strtofloat(editMultiplicador.Text);
   except
     Editmultiplicador.SelectAll;
     Editmultiplicador.SetFocus;
     exit;
   end;

   SQL.Text := 'SELECT *, UNIDAD * '+ editMultiplicador.Text + ' AS RESULTADO FROM mitabla';
   ...

HombreGordo 30-07-2008 14:01:59

:) Bueno en parte funciona, pero ahora el query debe cumplir ciertos requerimientos. Algo así como:
Código SQL [-]
SELECT * FROM mitabla WHERE ALGO = 'ejemplo' AND TIPO = 'TIPO1';

Pero no muestra la nueva columna, he probado también poniendo los query (y sus datasets) en cadena y tampoco funciona bien. :confused:

Debe haber alguna manera de hacer que los dos querys (el de multiplicación y el de seleccionar líneas con cierto criterio) funcionen a la vez, o por qué no, meter los 2 en la misma línea. Les agradecería mucho si me ayudaran con este problemilla. :o

coso 30-07-2008 16:50:08

Hola,

si cada consulta necesita un filtro diferente, tendras que usar diferentes consultas..si no es el caso, entonces con

Código Delphi [-]
'select *, unidades * ' + editmult.text + ' as resultado from tabla where --condiciones--'

te tendria que dar tanto la multiplicacion como el resto de campos que forman la tabla dentro de las condiciones (unidades, claro esta, tambien seran tansolo las que cumplan las condiciones).
Cita:

Estuve pensando en que si la inexistencia del campo "RESULTADO" tiene algo que ver, debido a que solo la quiero para mostrar,
en principio no, pues lo que estas haciendo con la consulta es crear ese campo, que permanecera en el query hasta su proximo cambio. Lo que creo que te ocurria es que llamabas a la sentencia sql sin tener en editmult algo valido (si editmult = '', entonces la consulta te quedaba 'select *, unidades * as resultado...', y te sale el 'as' como invalid keyword.)

coso 30-07-2008 16:59:58

en el segundo caso, en la consulta ya no creas un campo 'resultado', por lo que este desaparece del query

HombreGordo 01-08-2008 06:01:34

Gracias... peeero
 
¡Hey! Gracias por guiarme en el arduo camino de la programación, por fin funcionó, estoy sumamente agradecido con Uds. :)

Pero la cosa no termina aquí... Ahora viene algo más complejo (para ahorrar threads creo que conviene usar este mismo). ¿Cómo sería el procedimiento para crear una columna que según una condición multiplique por un determinado multiplicador, y si cumple con otra condición, multiplique por otro?

Algo como esto:
Código SQL [-]
SELECT * FROM mitabla WHERE (Cond1 = 'Bonito' AND  Cond2 = 'Barato') OR (Cond1 = 'Feo' AND Cond2 = 'Costoso');

Es decir, si se cumple la primera condición, que multiplique por un número, si se cumple lo que está después del "OR" que multiplique por otro. Creo que este sí es un problema que me está anonadando la cabeza. :confused: Y el resultado de la multiplicación, a la misma columna. Creo que la solución sería algo como hacer que la tabla dependa de 2 querys, o que muestre uno al mismo tiempo el otro, sin importar el orden de los resultados, pero poco conozco acerca de bases de datos y por eso os pido ayuda.

EDITADO: Creo que he dado con la solución de alguna forma, primero procesamos un query con el cálculo, y luego intercambiamos el query del DataSource, con la otra operación, sin embargo, lo que me temo es que vaya a borrar la otra columna, creo que no conservaría los resultados del primer query. Ahora la cuestión es hacer que se conserven los datos de los 2 querys en el mismo DBGrid. Creo que con esto sí me pueden ayudar más fácil. :) (Aún no he probado, sólo estoy lanzando este razonamiento a ver que me pueden aconsejar).

Gracias de antemano. :)

OTRA VEZ EDITADO: Ya resolví el problema... puse 1 DBGrid por cada operación que necesitaba hacer, y todo el mundo ha quedado satisfecho hasta ahora. :) Gracias por la ayuda en impartida en este hilo.

rgstuamigo 08-08-2008 17:51:25

Hola HombreGordo por que no te haces procedimientos almacenados en tu Base de datos , y solamente te dedicas a llamarlo, tu procedimiento puede ser dinamico, ya que el servidor te cosina la respuesta y te la da todo como se dice en bandeja, y vos solamente en tu aplicacion, mostras los datos.
Espero que te sirva........"Es un consejo de un conejo"


La franja horaria es GMT +2. Ahora son las 09:57:21.

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