Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Pasar campos de la tabla localidad a un combobox de el form paciente... (https://www.clubdelphi.com/foros/showthread.php?t=77179)

y_a_p 29-12-2011 21:05:42

Pasar campos de la tabla localidad a un combobox de el form paciente...
 
Hola a todos, estoy haciendo un sistema para un consultorio pediatrico con delphi 7, BD SQL Manager 2008 y motor Firebird, en la parte de la consulta necesito pasar a un combobox el campo de una tabla ajena a paciente, va en realidad estan relacionadas, la tabla es localidad y lo logre, pero los campos se repiten por lo tantome han proporcionado aqui una ayuda, la cual agradezco q dice q tengo q agrupar los campos por el nombre de dicha localidad pero me tira un error de id, el cod. es el siguiente:
Código Delphi [-]
procedure TPacientes.ConsultaShow(Sender: TObject);
begin
DM.Q_loc.SQL.Clear;
DM.Q_loc.SQL.Add('select LOCALIDAD from LOCALIDADES GROUP BY LOCALIDAD');
DM.Q_loc.Open;
while not DM.Q_loc.Eof do  // a lo que entiendo es mientras el query no haya llegado al ultimo registro
  begin
    loc_cons_pac.Items.Add(DM.Q_loc.Fields[2].Text); //le asigna a items del combo el texto que existe en el campo 2 (en ntro caso, nom_localidad esta en posicion 2, xq id_loc(0), cod_postal(1) fijate en BD)
    DM.Q_loc.Next; // pasa al siguiente registro
  end;
DM:Data_module.
Q_loc:es el query de la tabla localidad.

El error me tira cuando abro la consulta...

Agradezco su ayuda!!!, Gracias...

marcoszorrilla 29-12-2011 22:30:36

Código Delphi [-]
procedure TPacientes.ConsultaShow(Sender: TObject); begin
DM.Q_loc.Close;
DM.Q_loc.SQL.Clear;
 DM.Q_loc.SQL.Add('select LOCALIDAD from LOCALIDADES GROUP BY LOCALIDAD');
 DM.Q_loc.Open; while not DM.Q_loc.Eof do  // a lo que entiendo es mientras el query no haya llegado al ultimo registro
   begin     
loc_cons_pac.Items.Add(DM.Q_loc.Fields[2].Text); //le asigna a items del combo el texto que existe en el campo 2 (en ntro caso, nom_localidad esta en posicion 2, xq id_loc(0), cod_postal(1) fijate en BD)     DM.Q_loc.Next; // pasa al siguiente registro
   end;

Un Saludo.

y_a_p 29-12-2011 22:41:28

Agradezco mucho tu ayuda, pero he probado el código q me mandaste y me sigue tirando el error del id en la linea en la q agrupo, me podrías proporcionar alguna otra solución, muchas gracias!!!

Cañones 29-12-2011 23:12:41

Para mi el error está en
Fields[2] y según esa consulta sebería ser Fields[0]

Saludos.

y_a_p 29-12-2011 23:35:32

No, disculpa te corrija, el 2 es para indicarle q campo de la BD se le asigna al combobox, se considera al primer campo de la DB=0, el primero=1 y asi sucesivamente, en mi caso quiero mostrar el nombre de la localidad q vendría a ser el campo nº 2, igual agradezco tu predisposición.
El error radica cuando agrupo, hago el seguimiento y me lo marca ahí...

Cañones 29-12-2011 23:52:57

Esa es una consulta de ejemplo nomás?
Sin agrupar funciona?

y_a_p 29-12-2011 23:56:13

Si, funciona... Es mas la consulta sin agrupar funciona bien si selecciono todos los campos de localidad y yo quiero buscar solo por el nombre para poder agruparlo por q sino me muestra los nombres pero repetidos...

Cañones 30-12-2011 00:01:10

Con la consulta

Código Delphi [-]
DM.Q_loc.SQL.Add('select LOCALIDAD from LOCALIDADES GROUP BY LOCALIDAD');

y Fields[0] no funciona?

Delphius 30-12-2011 03:28:11

A ver... aclaremos algunas cosas:
1) La consulta de ejemplo solamente está mostrando UN CAMPO por lo que en Fields[] sólo es posible el índice 0, cualquier otro debería arrojar una excepción porque no hay más campos que mostrar.

2) Confundes los conceptos CAMPOS con REGISTROS. Repasa la teoría de base de datos. Tu dices que la consulta te arroja muchos campos... ¡Wrong! querrás decir que te arroja varios registros. ¿Repasemos, dale? registros = filas de la tabla, campos = columnas de la tabla.

3) Dices que te arroja un error. ¿Porqué no te tomas la molestias de decirnos el error textual? ¿O pretendes que adivinemos? Navidad ya pasó por lo que no le puedo pedir a Papá Noel que me traiga de regalo una bola de cristal nueva... Lástima, tendrás que esperar a Reyes Magos :D

3) ¿Group by? ¿Localidades duplicadas? ¡WTF! Si a cada Localidad le corresponde un PK ¿Que sentido tiene agrupar? Digo no... Una tabla Localidad debería ser muy simple, algo como esto seguramente:

PK - Nombre
1 - Localidad1
2 - Localidad2
...
N - Localidadn

Por tanto no debería haber localidad duplicada (no al menos en el valor PK), el contexto está sugiriendo que no debería haberla. Si la idea es tener en una tabla la lista de localidades...

Agrupar por algo que no admite repetidos, es redundante. Debería bastar con un

Código SQL [-]
SELECT LOCALIDAD FROM LOCALIDADES ORDER BY 1 ASC

Para tener dicho listado.

Si nos explicas mejor en que consiste esa tabla quizá podríamos pillar al toro. ¿Digo no?

Saludos,

Cañones 30-12-2011 03:58:02

Cita:

Empezado por y_a_p (Mensaje 422166)
Si, funciona... Es mas la consulta sin agrupar funciona bien si selecciono todos los campos de localidad y yo quiero buscar solo por el nombre para poder agruparlo por q sino me muestra los nombres pero repetidos...

Ahora que estoy en casa y con más tiempo....
Creo entender que estás confundido en la parte de los campos de la tabla y los campos del dataset.
La tabla de la db puede tener varios campos. IDLOCALIDAD, NOMBRE_LOCALIDAD, IDPROVINCIA, NRO_CODIGOPOSTAL .....
Pero la consulta del dataset solo trae un campo, LOCALIDAD por lo que Fields[] solo puede ser 0.
La prueba que haces y que funciona, es porque el dataset trae al menos 3 o mas campos, entonces Fields[2] te muestra lo que está en la tercer columna.
Creo que antes de decir que Fields[0] no funciona, tenías que probar y si de hecho no funciona ahí si repreguntar.
Tampoco es tan grave, el tiempo te va a forjar la paciencia que hace falta para programar, y por otro lado si en el club no se encuentra una solución a algo, es porque no existe.
Si estás trabajando con FireBird y dbx o ibx te puedo pasar unos apuntes que te van a ayudar.

Por otro lado y fuera del tema del tema principal, las localidades no se deberían repetir a menos que se llamen igual pero pertenezcan a distintas provincias/estado ... y si así lo fuese no se deberían agrupar tampoco.
No se si tu idea es programar todo a mano por el tipo de consulta, pero hay componentes que si le indicas el dataset, cargan los datos automativamente, pero también es otro tema.

Saludos.

ecfisa 30-12-2011 17:19:14

Cita:

Empezado por y_a_p (Mensaje 422164)
No, disculpa te corrija, el 2 es para indicarle q campo de la BD se le asigna al combobox, se considera al primer campo de la DB=0, el primero=1 y asi sucesivamente, en mi caso quiero mostrar el nombre de la localidad q vendría a ser el campo nº 2, igual agradezco tu predisposición.
El error radica cuando agrupo, hago el seguimiento y me lo marca ahí...

Hola.

Me parece más claro utilizar la función FieldByName en lugar de la propiedad vectorial Fields. No existe lugar a dudas de que campo estamos hablando si la instrucción se escribe:
Código Delphi [-]
  loc_cons_pac.Items.Add(DM.Q_loc.FieldByName('LOCALIDAD').AsString);
Como ya te han explicado, hay que usar con cuidado la propiedad Fields, ya que si alteras el órden o el número de los campos en una consulta sin tomarlo en cuenta, puede devolverte un valor inesperado.

Saludos.

Cañones 31-12-2011 02:41:38

Usar FieldByName sería lo correcto, pero no creo que estén declarados los campos.

y_a_p 12-01-2012 21:55:45

Agradezco mucho su colaboración a todos, y quiero comentarles q ya probe con todas las opciones q me dijeron, pero me sigue tirando el mismo error, para ser más clara el error me tira cuando en la linea:
Código Delphi [-]
DM.Q_loc.SQL.Add('select LOCALIDAD from LOCALIDADES');
De lo contrario si yo modifico esa linea de código a:
Código Delphi [-]
DM.Q_loc.SQL.Add('select * from LOCALIDADES');
No me lo tira más, pero me muestra las localidades agrupadas, para q se entienda mejor hago esto:
Código Delphi [-]
begin
DM.Q_loc.Close;
DM.Q_loc.SQL.Clear;
DM.Q_loc.SQL.Add('select * from LOCALIDADES');
DM.Q_loc.Open;
while not DM.Q_loc.Eof do  
begin
loc_cons_pac.Items.Add(DM.Q_loc.FieldByName('LOCALIDAD').AsString); 
DM.Q_loc.Next;
end;
Que debería hacer para q no me las muestre más repetidas... ya q no puedo agruparlas porq no puedo seleccionarlas por localidad, desde ya muchas gracias!!!...

ecfisa 12-01-2012 23:04:16

Cita:

Empezado por y_a_p (Mensaje 422805)
Agradezco mucho su colaboración a todos, y quiero comentarles q ya probe con todas las opciones q me dijeron, pero me sigue tirando el mismo error

Hola y_a_p.

Ayudaría mucho que nos pusieses literalmente el mensaje de error que te arroja. (Ctr+C para copiarlo y Ctrl+V para pegarlo aquí en el mensaje)

Saludos.

y_a_p 12-01-2012 23:06:49

---------------------------
Debugger Exception Notification
---------------------------
Project Project_tesis.exe raised exception class EDatabaseError with message 'Q_loc: Field 'ID_LOC' not found'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

ecfisa 12-01-2012 23:28:02

Cita:

Empezado por y_a_p (Mensaje 422819)
---------------------------
Debugger Exception Notification
---------------------------
Project Project_tesis.exe raised exception class EDatabaseError with message 'Q_loc: Field 'ID_LOC' not found'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

Hola y_a_p.

Revisá si te está pasando algo parecido a esto.

Saludos.

y_a_p 12-01-2012 23:37:33

Si, estamos haciendo lo mismo porq somos compañeras de tesis...

Chris 12-01-2012 23:56:12

Cita:

Empezado por y_a_p (Mensaje 422819)
---------------------------
Project Project_tesis.exe raised exception class EDatabaseError with message 'Q_loc: Field 'ID_LOC' not found'. Process stopped. Use Step or Run to continue.
---------------------------

SUPONGO: El componente de conexión está buscando el campo ID_LOC, el cual no estás trayendo con la consulta:
Código Delphi [-]
DM.Q_loc.SQL.Add('select LOCALIDAD from LOCALIDADES');

Para solucionarlo tienes que traer el campo necesario desde la consulta con una sql como esta:
Código Delphi [-]
DM.Q_loc.SQL.Add('select ID_LOC, LOCALIDAD from LOCALIDADES');

Este tipo de problemas es común si tienes una relación maestro detalle.

Por otro lado, a cómo te ha apuntado ya antes el compañero Delphius, no puedes hacer una agrupación así por así. El código SQL que tenías (select LOCALIDAD from LOCALIDADES GROUP BY LOCALIDAD) -por lo menos en Firebird- no te funcionará. Necesitas un campo "agregador/agrupador" que no existe en la consulta citada.

Para obtener una única copia de un valor repetido o no repetido, utiliza la clausula "DISTINCT" de SQL. Ya que no has mencionado el motor de base de datos que estás utilizando, desconozco si está soportada esa clausula. Lo más probable es que sí porque es muy común. Entonces tu consulta debería quedar así:
Código Delphi [-]
DM.Q_loc.SQL.Add('select distinct ID_LOC, LOCALIDAD from LOCALIDADES');

Ya que estás utilizando el valor del campo ID_LOC para no sé que, ignoro las consecuencias que pueda tener la clausula DISTINCT en el comportamiento de tu aplicación.

Saludos,
Chris.

ecfisa 12-01-2012 23:58:32

Cita:

Empezado por y_a_p (Mensaje 422831)
Si, estamos haciendo lo mismo porq somos compañeras de tesis...

Eso supuse y por eso es que te mencioné el enlace, allí se lo está tratando y ya hay varias sugerencias.

Saludos. :)

y_a_p 14-01-2012 18:39:28

Bueno muchas gracias y ya con mi compañera lo estamos estudiando en conjunto, gracias!!!:)


La franja horaria es GMT +2. Ahora son las 06:14:35.

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