consulta sql y pintar fila de un dbgrid
Comenzado por
luk2009
, feb 07 2013 08:14
6 respuestas en este tema
#1
Escrito 07 febrero 2013 - 08:14
Uploaded with ImageShack.us
Tengo dos tablas una es la servicios y otra la tabla de clientes. Suponiendo que la tabla Servicios tenga los campos:
ServID
Csid
ProblemaRep
Estatus
y la tabla clientes tenga los campos:
Csid
Cliente
Telefono
Direccion
Lo que quiero hacer es realizar una consulta a la tabla clientes segun el parametro introducido en los edits csid o cliente de la foto que pongo arriba. Pero que si en el campo Estatus de la tabla servicios el valor es 'PENDIENTE' se marque en rojo en el dbgrid.
Lo que hice hasta ahora es realizar una consulta a la tabla clientes unida a la tabla servicios y en el evento ondrawcolumncell pintar la fila.
Problema: Hecho asi me van a llegar todos los regitros de servicios del cliente en la tabla servicios y me aparecera el cliente varias veces en el dbgrid, ya que pueden existir muchos servicios con ESTATUS= 'RESUELTO'.
Lo que quier es que salgan solo una vez todos los clientes que cumplan con el parametro de busqueda y que los que tengan un servicio pendiente la fila se pinte de rojo.
IDEAS?
#2
Escrito 07 febrero 2013 - 09:16
Asumiendo que el campo CSID es único y quizá la clave primaria en la tabla Clientes, las consultas serían más o menos así:
Consultar por CSID:
Consultar por Cliente:
Y la pintada del dbGrid, como de costumbre:
Saludos
Consultar por CSID:
SELECT DISTINCT S.*, C.CLIENTE, C.TELEFONO, C.DIRECCION
FROM SERVICIOS S INNER JOIN CLIENTES C
ON S.CSID = C.CSID
WHERE CSID = :CSID
Consultar por Cliente:
SELECT DISTINCT S.*, C.CLIENTE, C.TELEFONO, C.DIRECCION
FROM SERVICIOS S INNER JOIN CLIENTES C
ON S.CSID = C.CSID
WHERE C.CLIENTE = :CLIENTE
Y la pintada del dbGrid, como de costumbre:
delphi
procedure TForm1.DBGrid1DrawColumnCell (Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if Consulta.FieldByName('Status').AsString ='PENDIENTE' then DBGrid1.Canvas.Brush.Color:=clRed; DBGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State); end;
Saludos
#3
Escrito 07 febrero 2013 - 10:23
Wilson gracias por responder
la consulta me hace lo mismo que la que tenia antes debido a que ServID es la llave primaria de la tabla servicios y es un campo autoincrementable. por lo tanto al decirle que busque distintos valores me va a repetir a los clientes, ya que estos pueden tener varios servicios con estatus diferentes.
por ejemplo cuando busco los clientes cuyo CSID comience con 001 saldria como sigue ahora ejemplo:
ServID CSID Cliente Estatus
NULL 0010 WILSON NULL
NULL 0011 Luciano De Leon NULL
0222 0012 Embajada De Mexico Resuelto
0311 0012 Embajada De Mexico Resuelto
0512 0012 Embajada De Mexico Pendiente
y deberia ser
ServID CSID Cliente Estatus
NULL 0010 WILSON NULL
NULL 0011 Luciano De Leon NULL
0512 0012 Embajada De Mexico Pendiente
En la lista solo debe salir uno de ellos y debe ser el que esta pendiente, pero ademas deben salir los clientes que no tienen servicios pendientes y los que nunca han tenido ningun servicio.
Espero haberme explicado un poco mejor ahora
la consulta me hace lo mismo que la que tenia antes debido a que ServID es la llave primaria de la tabla servicios y es un campo autoincrementable. por lo tanto al decirle que busque distintos valores me va a repetir a los clientes, ya que estos pueden tener varios servicios con estatus diferentes.
por ejemplo cuando busco los clientes cuyo CSID comience con 001 saldria como sigue ahora ejemplo:
ServID CSID Cliente Estatus
NULL 0010 WILSON NULL
NULL 0011 Luciano De Leon NULL
0222 0012 Embajada De Mexico Resuelto
0311 0012 Embajada De Mexico Resuelto
0512 0012 Embajada De Mexico Pendiente
y deberia ser
ServID CSID Cliente Estatus
NULL 0010 WILSON NULL
NULL 0011 Luciano De Leon NULL
0512 0012 Embajada De Mexico Pendiente
En la lista solo debe salir uno de ellos y debe ser el que esta pendiente, pero ademas deben salir los clientes que no tienen servicios pendientes y los que nunca han tenido ningun servicio.
Espero haberme explicado un poco mejor ahora
#4
Escrito 08 febrero 2013 - 01:07
De lo que se trata es de devolver sólo los campos necesarios para que no se te dupliquen filas con el distinct, algo así
De esta manera sólo se te duplicarán filas en el caso de que tengas distintos estatus
Nos leemos
select
distinct c.csid, c.cliente, c.telefono, s.estatus
from clientes c
inner join servicios s on s.csid = c.csid
where condiciones
De esta manera sólo se te duplicarán filas en el caso de que tengas distintos estatus
Nos leemos
#5
Escrito 08 febrero 2013 - 05:49
La siguiente consulta te lista todos los clientes y te totaliza los servicios por cliente (ver imagen al final):
Ahora bien podrías crea una nueva consulta de detalles relacionada por el csid que se dispare al hacer dobleClik sobre un registro de la actual consulta, entonces esta mostraría los diferentes servicios si los hay.
Puedes pintar de rojo las filas cuyo campo TOTAL_PENDIENTES sea mayor que cero.
Saludos
SELECT
SUM(PENDIENTES) AS TOTAL_PENDIENTES,
SUM(RESUELTOS) AS TOTAL_RESUELTOS,
COUNT(TODOS) AS TOTAL_SERVICIOS, NOMBRE_CLIENTE
FROM
(SELECT
IIF(SERVICIOS.STATUS = 'PENDIENTE', 1, 0) AS PENDIENTES,
IIF(SERVICIOS.STATUS = 'RESUELTO', 1, 0) AS RESUELTOS ,
SERVICIOS.SERVID AS TODOS,
CLIENTES.CLIENTE AS NOMBRE_CLIENTE
FROM SERVICIOS RIGHT JOIN CLIENTES
ON SERVICIOS.CSID = CLIENTES.CSID )
GROUP BY NOMBRE_CLIENTE
Ahora bien podrías crea una nueva consulta de detalles relacionada por el csid que se dispare al hacer dobleClik sobre un registro de la actual consulta, entonces esta mostraría los diferentes servicios si los hay.
Puedes pintar de rojo las filas cuyo campo TOTAL_PENDIENTES sea mayor que cero.
delphi
procedure TForm1.DBGrid1DrawColumnCell (Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if Consulta.FieldByName('TOTAL_PENDIENTES').AsInteger > 0 then DBGrid1.Canvas.Brush.Color:=clRed; DBGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State); end;
Saludos
Archivos adjuntos
#6
Escrito 08 febrero 2013 - 06:49
Gracias Cadetill por responder.
con tu consulta no recibiria todos los clientes, ya que solo recibiria los que cumplen con cierta condicion en cuanto al estatus en la tabla de servicios.
Gracias Wilson
Me gusta tu idea y voy a realizar algunas pruebas. La idea es que con tu consulta puedo ver todos los clientes y pintar de rojo los que tengan alguno pendiente. Al presionar el boton ver o crear, realizar otra consulta dependiendo de si hay servicio pendiente o no, que me daria los registros que quiero.
Voy a probar y les digo.
con tu consulta no recibiria todos los clientes, ya que solo recibiria los que cumplen con cierta condicion en cuanto al estatus en la tabla de servicios.
Gracias Wilson
Me gusta tu idea y voy a realizar algunas pruebas. La idea es que con tu consulta puedo ver todos los clientes y pintar de rojo los que tengan alguno pendiente. Al presionar el boton ver o crear, realizar otra consulta dependiendo de si hay servicio pendiente o no, que me daria los registros que quiero.
Voy a probar y les digo.
#7
Escrito 12 febrero 2013 - 03:33
Gracias Cadetill por responder.
con tu consulta no recibiria todos los clientes, ya que solo recibiria los que cumplen con cierta condicion en cuanto al estatus en la tabla de servicios.
Si quieres todos los clientes sólo tienes que hacer un left outer join en lugar de un inner join
Nos leemos