PDA

Ver la Versión Completa : Reporte (Desde : Hasta)


magnu9
14-11-2006, 14:41:06
Buen Días a todos.

Una pequeña duda, tengo un form desde el cual pido cierta manera de reporte. Al decirles que me busque dese un codigo hasta otro, me lo hace muy bien, pero cuando les digo desde el nombre tal hasta nombre x, no resulta nada.

magnu9
14-11-2006, 15:49:23
Código Delphi [-] (http://www.clubdelphi.com/foros/#) FreportCliente.qryCliente.SQL.Add(' Select codcli,nomcli,apelcli, dircli, telcli,cedcli, fecha, estado, codzon, facturacredito, balcli, direc_envio From cliente ');


FreportCliente.qryCliente.SQL.Add(' WHERE cliente.codcli >='''+(edCodigo1.Text)+''' AND cliente.codcli <= '''+(edCodigo2.Text)+'''');





Osea si cambio a este codigo codcli es el codigo del cliente, nombre_cli nombre del cliente..


Código Delphi [-] (http://www.clubdelphi.com/foros/#) FreportCliente.qryCliente.SQL.Add(' Select codcli,nomcli,apelcli, dircli, telcli,cedcli, fecha, estado, codzon, facturacredito, balcli, direc_envio From cliente ');
FreportCliente.qryCliente.SQL.Add(' WHERE cliente.NOMCLI >='''+(edNombre1.Text)+''' AND cliente.nombre_CLI <= '''+(edNombre2.Text)+'''');





Osea "Desde codigo x hasta codigo y" muy bien", pero "Desde nombre x hasta nombre y" no me hace nada,

Nota: si colocó el mismo nombre si lo hace bien...

Caral
14-11-2006, 15:56:55
Hola magnu9
Mira la diferencia:
Hecho por ti, fijate en el campo rojo:

FreportCliente.qryCliente.SQL.Add(' WHERE cliente.NOMCLI >='''+(edNombre1.Text)+''' AND cliente.nombre_CLI <= '''+(edNombre2.Text)+'''');

Creo que son dos campos diferentes, deberia ser asi:
Fijate en los campos verdes.

FreportCliente.qryCliente.SQL.Add(' WHERE cliente.nombre_CLI >='''+(edNombre1.Text)+''' AND cliente.nombre_CLI <= '''+(edNombre2.Text)+'''');

Supongo que esto es lo que pasa.
Saludos

AzidRain
14-11-2006, 16:44:15
Podria quedar mejor y mas manejable tu consulta si usas parametros, por ejemplo:


FreportCliente.qryCliente.SQL.Add(' SELECT codcli,nomcli,apelcli, dircli, te lcli,cedcli, fecha, estado, codzon, facturacredito, balcli, direc_envio From cliente ');

FreportCliente.qryCliente.SQL.Add(' WHERE cliente.codcli >=:desde AND cliente.codcli <= :hasta');

FreportCliente.qryCliente.ParamByName('desde').AsString :=EdNombre1.Text;
FreportCliente.qryCliente.ParamByName('hasta').AsString :=EdNombre2.Text;



otra variante es usar BETWEEN en vez de >= <=:


FreportCliente.qryCliente.SQL.Add(' SELECT codcli,nomcli,apelcli, dircli, te lcli,cedcli, fecha, estado, codzon, facturacredito, balcli, direc_envio From cliente ');

FreportCliente.qryCliente.SQL.Add(' where codcli BETWEEN :desde AND :hasta');

FreportCliente.qryCliente.ParamByName('desde').AsString :=EdNombre1.Text;
FreportCliente.qryCliente.ParamByName('hasta').AsString :=EdNombre2.Text;



El error en tu query es que usas dos campos distintos en la comparacion cuando solo debe ser uno. Si traducimos a lenguaje "humano" tu query queda:

"Dame todos los registros en donde codcli es mayor al numero que te doy y el nombre sea menor o igual al otro numero que te doy"

Obviamente en esta condicion pueden caer muchos registros, por ejemplo si aplicas tu query a una tabla como esta y en Edtext1='1' EdText2='5':

codcli nombre_cli
1 Alfa
2 Algaguara
3 Bravo
4 Charlie
5 Delta


no te devuelve nada porque no hay ningun registro cuyo codigo sea mayor que uno y al mismo tiempo el nombre sea "menor" que 5...

En el query que te puse puedes cambiar el campo sobre el que quieres hacer la búsqueda sin ningun problema ya que los parametros te garantizan que se construya correctamente la instruccion SQL.

magnu9
15-11-2006, 15:50:32
He intentado la anterior respuesta, me es imposible utilizar los parametros.. seria bueno que me dieran una mano en este caso de como lo uso...

Estuve leyendo sobre parameters en el libro la Cara Oculta 4, pero entiendo que debo hacer una funcion ParaByName()...

En mis intentos, cuando coloco FreportCliente.qryCliente.ParamByName esta propiedad no
me sale al colocar el punto solo me da opción de Parameters,
si coloco FreportCliente.qryCliente.Parameters.ParamByName(),
en este caso si me da a escoger el ParamByName(),
luego el asString pero no me da esta opcion sale el asString..
Saludos a todos.

Caral
15-11-2006, 19:00:55
Hola magnu9
Pon codigo, a ver que hago, no se de que se trata.
Saludos

magnu9
15-11-2006, 19:05:16
Es el que coloco AsiRaid, antes de mis dudas observaras el codigo.

AzidRain
15-11-2006, 21:59:54
No me dices que reporteador ocupas (QReport, FastReport, etc.), de todas formas cualquier descendiente de TQuery contiene la propiedad "Parameters" y el metodo ParamByName(name:string) que devuelve el parametro con el nombre especificado. Notese que no puedes poner solo ParamByName().AsString...es necesario indicar que parametro quieres accesar.

Por ejemplo: Si haces este query:


FreportCliente.qryCliente.SQL.Clear; // Es necesario asegurarse que queda en blanco
FreportCliente.qryCliente.SQL.Add(' select * from cliente where codcli=:codigoabuscar');

Delphi en automático crea el parametro "codigoabuscar" y lo agrega al Query, Por ejemplo digamos que quieres buscar el codigo de cliente 100; entonces hacemos esto:

FreportCliente.qryCliente.ParamByName('codigoabuscar').AsInteger :=100;

Cuando corras el Query, Delphi en realidad genera la siguiente instruccion SQL

SELECT * FROM CLIENTE WHERE CODCLI=100

Es decir, sustituye el parametro que habiamos puesto por el valor que le dimos.
Si quisieras otra consulta nueva con otro numero, solo necesitas volver a cambiar el parametro con ParamByNAme..el query ya no lo tocas.

Ventajas? Te evitas esos engorros de concatenar cadenas 'select * from cli where nombre='+ mydato + ' and' + myotrodato...etc.

Además no necesitas hacer la conversion a texto para poder concatenar la instruccion ni escribir varias veces el mismo query.

Solo usas AsString, AsDateTime, AsInteger, AsCurrency, etc.. segun el tipo de datos que quieras guardar en tu parametro. Delphi hace cualquier conversion al generar la sentencia SQL

Si pones mas datos te podemos ayudar mejor

Caral
15-11-2006, 22:16:17
Hola magnu9
Esto de los parametros no tiene gran ciencia.
AzidRain te esta dando una opcion de hacerlo, creo, si no me equivoco depende de la base de datos que uses.
Por ejemplo:
AzidRain lo hace asi:

FreportCliente.qryCliente.SQL.Add(' SELECT codcli,nomcli,apelcli, dircli, te lcli,cedcli, fecha, estado, codzon, facturacredito, balcli, direc_envio From cliente ');

FreportCliente.qryCliente.SQL.Add(' WHERE cliente.codcli >=:desde AND cliente.codcli <= :hasta');

FreportCliente.qryCliente.ParamByName('desde').AsString :=EdNombre1.Text;
FreportCliente.qryCliente.ParamByName('hasta').AsString :=EdNombre2.Text;

Esta bastante claro.
Particularmente uso los parametros diferente, insisto creo que es por la base de datos que uso (access).
Lo hago asi:

FreportCliente.qryCliente.SQL.Add(' SELECT codcli,nomcli,apelcli, dircli, te lcli,cedcli, fecha, estado, codzon, facturacredito, balcli, direc_envio From cliente ');

FreportCliente.qryCliente.SQL.Add(' WHERE cliente.codcli >=[desde] AND cliente.codcli <=[hasta]');

FreportCliente.qryCliente.Parameters[0].Value :=EdNombre1.Text;
FreportCliente.qryCliente.Parameters[1].Value :=EdNombre2.Text;

Ademas coloco en el inspector de objetos en el query (qryCliente) en parameters los dos parametros.
Desde. parametro 0 y hasta parametro 1.
Creo que esto te saldra, revisalo y me cuentas.
Saludos

magnu9
16-11-2006, 18:36:19
Me salio muy bien lo que me dijiste anteriormente... no envio la manera que me quedaron, por que he dejado todo en casa hoy... veremos si luego hay dudas... ya que no tuve mucho tiempo para revisarlo bien ayer.