Ir al contenido


Foto

consulta sql y pintar fila de un dbgrid


  • Por favor identifícate para responder
6 respuestas en este tema

#1 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 07 febrero 2013 - 08:14

Imagen Enviada

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?
  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

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:

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
  1. procedure TForm1.DBGrid1DrawColumnCell
  2.   (Sender: TObject; const Rect: TRect;
  3.     DataCol: Integer; Column: TColumn;
  4.     State: TGridDrawState);
  5. begin
  6. if Consulta.FieldByName('Status').AsString ='PENDIENTE' then
  7.   DBGrid1.Canvas.Brush.Color:=clRed;
  8. DBGrid1.DefaultDrawColumnCell
  9.   (Rect, DataCol, Column, State);
  10. end;



Saludos
  • 0

#3 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

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  (y)



  • 0

#4 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

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í

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
  • 0

#5 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

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):


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
  1. procedure TForm1.DBGrid1DrawColumnCell
  2.   (Sender: TObject; const Rect: TRect;
  3.     DataCol: Integer; Column: TColumn;
  4.     State: TGridDrawState);
  5. begin
  6. if Consulta.FieldByName('TOTAL_PENDIENTES').AsInteger > 0 then
  7.   DBGrid1.Canvas.Brush.Color:=clRed;
  8. DBGrid1.DefaultDrawColumnCell
  9.   (Rect, DataCol, Column, State);
  10. end;



Saludos

Archivos adjuntos


  • 0

#6 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

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.  (y)

  • 0

#7 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

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
  • 0




IP.Board spam blocked by CleanTalk.