Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > FireMonkey
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-04-2023
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 3
giantonti1801 Va por buen camino
Consulta con muchos if

amigo tengo una situación: debo hacer una consulta a una tabla de la base de dato sql Server donde puede haber varios resultado y todos pueden ser valido: a ver si logro explicarme bien:
En una tabla tengo una columna la cual se almacena una información: (TRATAMIENTO, EXAMEN, LABORATORIO, FICHA MEDICA) en otra columna de este misma está el número de cliente. Ahora bien: Partimos de un principio que un cliente puede tener un TRATAMIENTO o un EXAMEN, o un LABORATORIO o FICHA MEDICA pero en muchos casos un solo cliente puede tener 3 o incluso todas las condiciones. me problema es que si el cliente tiene un solo caso me funciona perfecto pero cuando tienes varios casos siempre me trae solo uno. Le muestro un ejemplo de la tabla:

Código SQL [-]
CLIENTE       TIPO
    1              Tratamiento
    1              Laboratorio
    1              EXAMEN
    2              Tratamiento

Espero se pueda entender bien y finalmente esta es el codigo que estoy usando:
Código Delphi [-]
var
 Filtro :string;
 begin
      DataModule1.UniQueryFichaDoc.Filtered := False;
      Filtro := 'INSTRUT = '''+DataModule1.InstRut+'''and REGFICHA = '''+label1.Text+'''';
      DataModule1.UniQueryFichaDoc.Filter := Filtro;
      DataModule1.UniQueryFichaDoc.Filtered := True;
      DataModule1.UniQueryFichaDoc.Active := true;
      begin
          if DataModule1.UniQueryFichaDocTIPODOCUMENTO.AsString = 'TRATAMIENTO' then
                begin
                TMSFMXToolBarButton5.Enabled := true;
                TMSFMXToolBarButton5.Opacity := 1;
                end
                else
                begin
                TMSFMXToolBarButton5.Enabled := False;
                TMSFMXToolBarButton5.Opacity := 0.3;
                end;
            if DataModule1.UniQueryFichaDocTIPODOCUMENTO.AsString = 'EXAMEN' then
                begin
                TMSFMXToolBarButton6.Enabled := true;
                TMSFMXToolBarButton6.Opacity := 1;
                end
                else
                begin
                TMSFMXToolBarButton6.Enabled := False;
                TMSFMXToolBarButton6.Opacity := 0.3;
                end;
            if DataModule1.UniQueryFichaDocTIPODOCUMENTO.AsString = 'LABORATORIO' then
                begin
                TMSFMXToolBarButton13.Enabled := true;
                TMSFMXToolBarButton13.Opacity := 1;
                end
                else
                begin
                TMSFMXToolBarButton13.Enabled := False;
                TMSFMXToolBarButton13.Opacity := 0.3;
                end;
            if DataModule1.UniQueryFichaDocTIPODOCUMENTO.AsString = 'FICHA MEDICA' then
                begin
                TMSFMXToolBarButton17.Enabled := true;
                TMSFMXToolBarButton17.Opacity := 1;
                end
                else
                begin
                TMSFMXToolBarButton17.Enabled := False;
                TMSFMXToolBarButton17.Opacity := 0.3;
                end;

          end;


 end;
Responder Con Cita
  #2  
Antiguo 05-04-2023
Avatar de pgranados
pgranados pgranados is offline
Miembro
 
Registrado: sep 2022
Ubicación: México
Posts: 299
Poder: 3
pgranados Va por buen camino
¿Estas recorriendo tu tabla para verificar los demás registros?
Responder Con Cita
  #3  
Antiguo 05-04-2023
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 3
giantonti1801 Va por buen camino
Cita:
Empezado por pgranados Ver Mensaje
¿Estas recorriendo tu tabla para verificar los demás registros?
almeno eso es lo que quiero hacer pero talvez por novato y desconocimiento no lo estoy haciendo correctamente
Responder Con Cita
  #4  
Antiguo 05-04-2023
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.927
Poder: 26
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
No se si entendi, pero esto no es un simple

Código SQL [-]
SELECT * FROM tratamientos WHERE cliente = ?
__________________
El malabarista.
Responder Con Cita
  #5  
Antiguo 05-04-2023
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.586
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Unhappy

Cita:
Empezado por pgranados Ver Mensaje
¿Estas recorriendo tu tabla para verificar los demás registros?
Yo creo que es esto.
En tu código sólo estás realizando los cambios sobre el registro actual (que debería ser el primero), pero en ningún momento estás haciendo un recorrido por todos los registros de un cliente.

Una vez hecho el Active, que ejecuta la consulta o abre la tabla, debería haber algo así:

Código Delphi [-]
// Activar el dataset (se posiciona en el primero)
DataModule1.UniQueryFichaDoc.Active := true; 
// mientras haya registros en el dataset...
while not DataModule1.UniQueryFichaDoc.eof do begin

  // hacer lo que sea con el regiustro activo...
  ... 
  // siguiente registro
  DataModule1.UniQueryFichaDoc.Next;
end;
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 05-04-2023
Avatar de pgranados
pgranados pgranados is offline
Miembro
 
Registrado: sep 2022
Ubicación: México
Posts: 299
Poder: 3
pgranados Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
Yo creo que es esto.
En tu código sólo estás realizando los cambios sobre el registro actual (que debería ser el primero), pero en ningún momento estás haciendo un recorrido por todos los registros de un cliente.

Una vez hecho el Active, que ejecuta la consulta o abre la tabla, debería haber algo así:

Código Delphi [-]
// Activar el dataset (se posiciona en el primero)
DataModule1.UniQueryFichaDoc.Active := true; 
// mientras haya registros en el dataset...
while not DataModule1.UniQueryFichaDoc.eof do begin

  // hacer lo que sea con el regiustro activo...
  ... 
  // siguiente registro
  DataModule1.UniQueryFichaDoc.Next;
end;
OFFTopic:

Maestro, usted que todo lo sabe.

¿Por qué mucha gente prefiere utilizar un while en lugar de un For?

Saludos.

Última edición por pgranados fecha: 05-04-2023 a las 17:59:10.
Responder Con Cita
  #7  
Antiguo 05-04-2023
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.586
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por pgranados Ver Mensaje
Maestro, usted que todo lo sabe.
Ni mucho menos, me queda muuuuucho por aprender...

Cita:
Empezado por pgranados Ver Mensaje
¿Por qué mucha gente prefiere utilizar un while en lugar de un For?
WHILE cuando no sabes el número de elementos a procesar, pero puedes evaluar una condición.
FOR cuando sabes de antemano el número de elementos a procesar.

Es cierto que donde puedes usar un FOR, también puedes usar un WHILE (llevando tú el contador), pero no al contrario.

Y luego supongo que están las preferencias, manías, costumbres de cada uno...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 05-04-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por pgranados Ver Mensaje
Maestro, usted que todo lo sabe.
Realmente, [Neftali] es el nombre del bot de la I.A. de clubdelphi, puedes preguntarle lo que quieras porque siempre te dará una respuesta automática y funcional
Responder Con Cita
  #9  
Antiguo 11-04-2023
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.586
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Realmente, [Neftali] es el nombre del bot de la I.A. de clubdelphi, puedes preguntarle lo que quieras porque siempre te dará una respuesta automática y funcional

Me he reído mucho...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #10  
Antiguo 06-04-2023
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 3
giantonti1801 Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
Yo creo que es esto.
En tu código sólo estás realizando los cambios sobre el registro actual (que debería ser el primero), pero en ningún momento estás haciendo un recorrido por todos los registros de un cliente.

Una vez hecho el Active, que ejecuta la consulta o abre la tabla, debería haber algo así:

Código Delphi [-]
// Activar el dataset (se posiciona en el primero)
DataModule1.UniQueryFichaDoc.Active := true; 
// mientras haya registros en el dataset...
while not DataModule1.UniQueryFichaDoc.eof do begin

  // hacer lo que sea con el regiustro activo...
  ... 
  // siguiente registro
  DataModule1.UniQueryFichaDoc.Next;
end;
Hola amigos realice todo tipo de pruebas pero con el mismo resultado solo me trae el primer registro por alguna razón el filtro no esta buscando el siguiente registro para evaluarlo. envio el codigo a ver si ustedes me ayudan a edintificar el porque siempre hace la consulta al primer registro:
Código Delphi [-]
 begin
      //DataModule1.UniQueryFichaDoc.Filtered := False;
      //Filtro := 'INSTRUT = '''+DataModule1.InstRut+'''and REGFICHA = '''+label1.Text+'''';
      //DataModule1.UniQueryFichaDoc.Filter := Filtro;
      //DataModule1.UniQueryFichaDoc.Filtered := True;
      //DataModule1.UniQueryFichaDoc.Active := true;
      //
      DataModule1.UniQueryConsultaDOC.Close;
      DataModule1.UniQueryConsultaDOC.sql.Clear;
      DataModule1.UniQueryConsultaDOC.sql.Add('select REGPAC, TIPODOCUMENTO,REGFICHA, INSTRUT, FICPAC from fichadoc');
      DataModule1.UniQueryConsultaDOC.SQL.Add('where instrut = :INSTRUT and REGFICHA = :REGFICHA');
      DataModule1.UniQueryConsultaDOC.ParamByName('INSTRUT').AsString := datamodule1.InstRut;
      DataModule1.UniQueryConsultaDOC.ParamByName('REGFICHA').AsString := Label1.text;
      //**DataModule1.UniQueryConsultaDOC.ParamByName('TIPODOCUMENTO').AsString := 'TRATAMIENTO';
      //**DataModule1.UniQueryConsultaDOC.ParamByName('TIPODOCUMENTO').AsString := 'EXAMEN';
      //**DataModule1.UniQueryConsultaDOC.ParamByName('TIPODOCUMENTO').AsString := 'LABORATORIO';
      //**DataModule1.UniQueryConsultaDOC.ParamByName('TIPODOCUMENTO').AsString := 'FICHA MEDICA';
      DataModule1.UniQueryConsultaDOC.open;
      DataModule1.UniQueryConsultaDOC.First;
      while not DataModule1.UniQueryConsultaDOC.eof do


         begin
           if DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString = 'TRATAMIENTO' then
                begin
                TMSFMXToolBarButton5.Enabled := true;
                TMSFMXToolBarButton5.Opacity := 1;
                end
                else
                begin
                TMSFMXToolBarButton5.Enabled := False;
                TMSFMXToolBarButton5.Opacity := 0.3;
                end;
         //DataModule1.UniQueryConsultaDOC.Next;
         //end;

         //begin
            if DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString = 'EXAMEN' then
                begin
                TMSFMXToolBarButton6.Enabled := true;
                TMSFMXToolBarButton6.Opacity := 1;
                end
                else
                begin
                TMSFMXToolBarButton6.Enabled := False;
                TMSFMXToolBarButton6.Opacity := 0.3;
                end;
         //       DataModule1.UniQueryConsultaDOC.Next;
         //end;

         //begin
            if DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString = 'LABORATORIO' then
                begin
                TMSFMXToolBarButton13.Enabled := true;
                TMSFMXToolBarButton13.Opacity := 1;
                end
                else
                begin
                TMSFMXToolBarButton13.Enabled := False;
                TMSFMXToolBarButton13.Opacity := 0.3;
                end;
         //       DataModule1.UniQueryConsultaDOC.Next;
         //end;

         //begin
            if DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString = 'FICHA MEDICA' then
                begin
                TMSFMXToolBarButton17.Enabled := true;
                TMSFMXToolBarButton17.Opacity := 1;
                end
                else
                begin
                TMSFMXToolBarButton17.Enabled := False;
                TMSFMXToolBarButton17.Opacity := 0.3;
                end;

            DataModule1.UniQueryConsultaDOC.Next;
         end;
           //
      //end;
         //      DataModule1.UniQueryConsultaDOC.Next;
 end;
Responder Con Cita
  #11  
Antiguo 06-04-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Según tu código:

Código Delphi [-]
begin 
  DataModule1.UniQueryConsultaDOC.Close; 
  DataModule1.UniQueryConsultaDOC.sql.Clear; 
  DataModule1.UniQueryConsultaDOC.sql.Add('select REGPAC, TIPODOCUMENTO,REGFICHA, INSTRUT, FICPAC from fichadoc'); 
  DataModule1.UniQueryConsultaDOC.SQL.Add('where instrut = :INSTRUT and REGFICHA = :REGFICHA'); 
  DataModule1.UniQueryConsultaDOC.ParamByName('INSTRUT').AsString := datamodule1.InstRut; 
  DataModule1.UniQueryConsultaDOC.ParamByName('REGFICHA').AsString := Label1.text; 
  DataModule1.UniQueryConsultaDOC.open; 
  while not DataModule1.UniQueryConsultaDOC.eof do 
  begin 
    if DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString = 'TRATAMIENTO' then 
    begin 
      TMSFMXToolBarButton5.Enabled := true; 
      TMSFMXToolBarButton5.Opacity := 1; 
    end 
    else 
    begin 
      TMSFMXToolBarButton5.Enabled := False; 
      TMSFMXToolBarButton5.Opacity := 0.3; 
    end; 
          
    if DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString = 'EXAMEN' then 
    begin 
      TMSFMXToolBarButton6.Enabled := true; 
      TMSFMXToolBarButton6.Opacity := 1; 
    end 
    else 
    begin 
      TMSFMXToolBarButton6.Enabled := False; 
      TMSFMXToolBarButton6.Opacity := 0.3; 
    end; 
 
    if DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString = 'LABORATORIO' then 
    begin 
      TMSFMXToolBarButton13.Enabled := true; 
      TMSFMXToolBarButton13.Opacity := 1; 
    end 
    else 
    begin 
      TMSFMXToolBarButton13.Enabled := False; 
      TMSFMXToolBarButton13.Opacity := 0.3; 
    end; 
 
    if DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString = 'FICHA MEDICA' then 
    begin 
      TMSFMXToolBarButton17.Enabled := true; 
      TMSFMXToolBarButton17.Opacity := 1; 
    end 
    else 
    begin 
      TMSFMXToolBarButton17.Enabled := False; 
      TMSFMXToolBarButton17.Opacity := 0.3; 
    end; 
 
    DataModule1.UniQueryConsultaDOC.Next; 
end;
Responder Con Cita
  #12  
Antiguo 06-04-2023
Avatar de pgranados
pgranados pgranados is offline
Miembro
 
Registrado: sep 2022
Ubicación: México
Posts: 299
Poder: 3
pgranados Va por buen camino
Intenta con:

Código Delphi [-]
var i:integer;
begin 
  DataModule1.UniQueryConsultaDOC.Close; 
  DataModule1.UniQueryConsultaDOC.SQL.Text('select REGPAC, TIPODOCUMENTO,REGFICHA, INSTRUT, FICPAC from fichadoc where instrut = :INSTRUT and REGFICHA = :REGFICHA ');
  DataModule1.UniQueryConsultaDOC.ParamByName('INSTRUT').AsString := datamodule1.InstRut; 
  DataModule1.UniQueryConsultaDOC.ParamByName('REGFICHA').AsString := Label1.text; 
  DataModule1.UniQueryConsultaDOC.Open; 
  DataModule1.UniQueryConsultaDOC.First; 
  for i:= 0 to DataModule1.UniQueryConsultaDOC.RecordCount-1 do 
  begin 
    if DataModule1.UniQueryConsultaDOC.FieldByName('TIPODOCUMENTO').value = 'TRATAMIENTO' then 
    begin 
      TMSFMXToolBarButton5.Enabled := true; 
      TMSFMXToolBarButton5.Opacity := 1; 
    end 
    else 
    begin 
      TMSFMXToolBarButton5.Enabled := False; 
      TMSFMXToolBarButton5.Opacity := 0.3; 
    end; 
          
    if DataModule1.UniQueryConsultaDOC.FieldByName('TIPODOCUMENTO').value = 'EXAMEN' then 
    begin 
      TMSFMXToolBarButton6.Enabled := true; 
      TMSFMXToolBarButton6.Opacity := 1; 
    end 
    else 
    begin 
      TMSFMXToolBarButton6.Enabled := False; 
      TMSFMXToolBarButton6.Opacity := 0.3; 
    end; 
 
    if DataModule1.UniQueryConsultaDOC.FieldByName('TIPODOCUMENTO').value = 'LABORATORIO' then 
    begin 
      TMSFMXToolBarButton13.Enabled := true; 
      TMSFMXToolBarButton13.Opacity := 1; 
    end 
    else 
    begin 
      TMSFMXToolBarButton13.Enabled := False; 
      TMSFMXToolBarButton13.Opacity := 0.3; 
    end; 
 
    if DataModule1.UniQueryConsultaDOC.FieldByName('TIPODOCUMENTO').value = 'FICHA MEDICA' then 
    begin 
      TMSFMXToolBarButton17.Enabled := true; 
      TMSFMXToolBarButton17.Opacity := 1; 
    end 
    else 
    begin 
      TMSFMXToolBarButton17.Enabled := False; 
      TMSFMXToolBarButton17.Opacity := 0.3; 
    end; 
    DataModule1.UniQueryConsultaDOC.Next;
  end;
end;

Última edición por Casimiro Notevi fecha: 06-04-2023 a las 18:30:21.
Responder Con Cita
  #13  
Antiguo 06-04-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Es que si solamente muestra un registro es porque ¡¡¡sólo hay un registro!!!
Comprueba el select, a ver cuántos registros te devuelve.
Responder Con Cita
  #14  
Antiguo 05-04-2023
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.586
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por giantonti1801 Ver Mensaje
Espero se pueda entender bien y finalmente esta es el codigo que estoy usando:
Ese código con tantos IF habría que refactorizarlo para no tener tanto Copy&Paste.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Mostrar en un DBGRID Relacion Muchos Muchos dmassive SQL 6 12-02-2009 19:55:19
Guardar muchos muchos Tedit el-mono OOP 4 30-09-2008 07:40:33
Problemas con generadores en relacion Muchos-a-Muchos Hagen Firebird e Interbase 3 30-10-2006 17:47:51
Consulta en SQL con muchos parámetros Aprendiendo SQL 5 05-04-2005 23:30:13
Consulta SQl, relacion 1 a muchos Walter SQL 3 15-07-2003 04:13:28


La franja horaria es GMT +2. Ahora son las 19:57:24.


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
Copyright 1996-2007 Club Delphi