Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   FireMonkey (https://www.clubdelphi.com/foros/forumdisplay.php?f=50)
-   -   Consulta con muchos if (https://www.clubdelphi.com/foros/showthread.php?t=96185)

giantonti1801 05-04-2023 00:05:18

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;

pgranados 05-04-2023 00:53:14

¿Estas recorriendo tu tabla para verificar los demás registros?

giantonti1801 05-04-2023 01:49:38

Cita:

Empezado por pgranados (Mensaje 550991)
¿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

mamcx 05-04-2023 04:25:21

No se si entendi, pero esto no es un simple

Código SQL [-]
SELECT * FROM tratamientos WHERE cliente = ?

Neftali [Germán.Estévez] 05-04-2023 10:24:22

Cita:

Empezado por pgranados (Mensaje 550991)
¿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;

Neftali [Germán.Estévez] 05-04-2023 10:58:09

Cita:

Empezado por giantonti1801 (Mensaje 550990)
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. ;)

pgranados 05-04-2023 16:55:55

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 551000)
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.

Neftali [Germán.Estévez] 05-04-2023 17:20:39

Cita:

Empezado por pgranados (Mensaje 551006)
Maestro, usted que todo lo sabe.

Ni mucho menos, me queda muuuuucho por aprender... :o

Cita:

Empezado por pgranados (Mensaje 551006)
¿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... :D:D

Casimiro Notevi 05-04-2023 18:44:10

Cita:

Empezado por pgranados (Mensaje 551006)
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 ;)

giantonti1801 06-04-2023 14:10:54

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 551000)
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;

Casimiro Notevi 06-04-2023 14:59:44

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;

pgranados 06-04-2023 16:32:52

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;

Casimiro Notevi 06-04-2023 17:31:06

Es que si solamente muestra un registro es porque ¡¡¡sólo hay un registro!!!
Comprueba el select, a ver cuántos registros te devuelve.

giantonti1801 06-04-2023 20:20:51

Cita:

Empezado por Casimiro Notevi (Mensaje 551016)
Es que si solamente muestra un registro es porque ¡¡¡sólo hay un registro!!!
Comprueba el select, a ver cuántos registros te devuelve.

no funciona ahora con la solución propuesta con el programador ahora solo me retorna el ultimo registro, le envio consulta realizada por sql donde me retorna los 3 registros:
Código SQL [-]
select * from FICHADOC where INSTRUT = '27080020-6' and REGFICHA = '5' and REGPAC = '2'

Código SQL [-]
REG         REGPAC                                             TIPODOCUMENTO                                      MEDPRES                                            REGFICHA                                           INSTRUT
----------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------------------------------
56          2                                                  LABORATORIO                                        GIANFRANCO TONTI                                   5                                                  27080020-6
52          2                                                  EXAMEN                                             GIANFRANCO TONTI                                   5                                                  27080020-6
60          2                                                  FICHA MEDICA                                       GIANFRANCO TONTI                                   5                                                  27080020-6

(3 rows affected)


Completion time: 2023-04-06T14:29:05.7620326-04:00

pgranados 06-04-2023 20:29:31

¿Cómo que solo te retorna el ultimo registro?

Vamos a hacer esto, tu sentencia SQL
Código SQL [-]
select * from FICHADOC where INSTRUT = '27080020-6' and REGFICHA = '5' and REGPAC = '2'

Ponla directamente en el código para ver que hace.

giantonti1801 06-04-2023 20:32:10

Cita:

Empezado por pgranados (Mensaje 551018)
¿Cómo que solo te retorna el ultimo registro?

Vamos a hacer esto, tu sentencia SQL
Código SQL [-]
select * from FICHADOC where INSTRUT = '27080020-6' and REGFICHA = '5' and REGPAC = '2'

Ponla directamente en el código para ver que hace.

ya lo hice
Código Delphi [-]
procedure TFormReportes.StringGrid1CellClick(const Column: TColumn;
  const Row: Integer);
 var
 Filtro :string;
 i:integer;
 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.Text := 'select REGPAC, TIPODOCUMENTO,REGFICHA, INSTRUT, FICPAC from fichadoc where instrut = :INSTRUT and REGFICHA = :REGFICHA and REGPAC = :REGPAC ';
       DataModule1.UniQueryConsultaDOC.ParamByName('INSTRUT').AsString := datamodule1.InstRut;
       DataModule1.UniQueryConsultaDOC.ParamByName('REGFICHA').AsString := '5';
       DataModule1.UniQueryConsultaDOC.ParamByName('REGPAC').AsString := '2';
      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;

pgranados 06-04-2023 20:34:16

Hazlo directamente así:
Código Delphi [-]
var Query:string;
begin
Query:= 'select * from FICHADOC where INSTRUT = ''27080020-6'' and REGFICHA = ''5'' and REGPAC = ''2'' ' ;
DataModule1.UniQueryConsultaDOC.Open(Query);
end;

Casimiro Notevi 06-04-2023 20:35:51

Usa el código que te he puesto antes, el tuyo no está bien.

Código Delphi [-]
DataModule1.UniQueryConsultaDOC.Open;
DataModule1.UniQueryConsultaDOC.First;   // > sobra esto
for i:= 0 to DataModule1.UniQueryConsultaDOC.RecordCount-1 do    //  Esto dependiendo del tipo de dataset no te devuelve los registros que hay en el select, sino 1 !!!!!!!!!!
Repito, usar el código que te hemos indicado.

giantonti1801 06-04-2023 20:43:37

1 Archivos Adjunto(s)
Cita:

Empezado por Casimiro Notevi (Mensaje 551021)
Usa el código que te he puesto antes, el tuyo no está bien.

Código Delphi [-]
DataModule1.UniQueryConsultaDOC.Open;
DataModule1.UniQueryConsultaDOC.First;   // > sobra esto
for i:= 0 to DataModule1.UniQueryConsultaDOC.RecordCount-1 do    //  Esto dependiendo del tipo de dataset no te devuelve los registros que hay en el select, sino 1 !!!!!!!!!!
Repito, usar el código que te hemos indicado.

es el mismo codigo que estoy usando incluso le estoy colocando los valore manueale
Código Delphi [-]
procedure TFormReportes.StringGrid1CellClick(const Column: TColumn;
  const Row: Integer);
 var
 Filtro :string;
 i:integer;
 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.Text := 'select REGPAC, TIPODOCUMENTO,REGFICHA, INSTRUT, FICPAC from fichadoc where instrut = :INSTRUT and REGFICHA = :REGFICHA and REGPAC = :REGPAC ';
       DataModule1.UniQueryConsultaDOC.ParamByName('INSTRUT').AsString := datamodule1.InstRut;
       DataModule1.UniQueryConsultaDOC.ParamByName('REGFICHA').AsString := '5';
       DataModule1.UniQueryConsultaDOC.ParamByName('REGPAC').AsString := '2';
      DataModule1.UniQueryConsultaDOC.Open;
//DataModule1.UniQueryConsultaDOC.First;   // > sobra esto
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;

egostar 06-04-2023 20:50:36

Hola

Intenta con esto:

Código Delphi [-]
      :::::
      DataModule1.UniQueryConsultaDOC.Open;
      // Agrega estas dos líneas ***********************
      DataModule1.UniQueryConsultaDOC.Last; 
      DataModule1.UniQueryConsultaDOC.First; 
     // *******************************************
     for i:= 0 to DataModule1.UniQueryConsultaDOC.RecordCount-1 do
     begin
        ::::::

Saludos

Casimiro Notevi 06-04-2023 20:55:53

He puesto:
Código Delphi [-]
DataModule1.UniQueryConsultaDOC.open;    
while not DataModule1.UniQueryConsultaDOC.eof do

egostar 06-04-2023 21:00:09

Cita:

Empezado por Casimiro Notevi (Mensaje 551024)
He puesto:
Código Delphi [-]
DataModule1.UniQueryConsultaDOC.open;    
while not DataModule1.UniQueryConsultaDOC.eof do

Así es, esa es la mejor forma de evitarse el problema, pero si insiste en usar el FOR, pues....

Saludos

Casimiro Notevi 06-04-2023 21:19:47

Cita:

Empezado por egostar (Mensaje 551025)
Así es, esa es la mejor forma de evitarse el problema, pero si insiste en usar el FOR, pues....
Saludos

Claro, con el for debe usar lo que tú has puesto para que devuelva correctamente el número de registros ^\||/

giantonti1801 06-04-2023 21:44:03

Cita:

Empezado por egostar (Mensaje 551023)
Hola

Intenta con esto:

Código Delphi [-]
      :::::
      DataModule1.UniQueryConsultaDOC.Open;
      // Agrega estas dos líneas ***********************
      DataModule1.UniQueryConsultaDOC.Last; 
      DataModule1.UniQueryConsultaDOC.First; 
     // *******************************************
     for i:= 0 to DataModule1.UniQueryConsultaDOC.RecordCount-1 do
     begin
        ::::::

Saludos

nada amigo ni con esta dos lineas funciona ahora bien habra otra forma de hacer esta consulta y obtener los resultado que si es verdadero se habilite el boton?

cloayza 06-04-2023 22:49:42

Estimado colega, le propongo esta alternativa
Código Delphi [-]
   
   {Esta función se encarga de habilitar el boton y la opacidad}
   procedure EnableButton(boton:TMSFMXToolBarButton; AEnable:Boolean);
   begin
        boton.Enable:=AEnable;
    if Boton.Enable then
       Boton.Opacity := 1
    else
       Boton.Opacity := 0.3;
   end;
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
     EnableButton(TMSFMXToolBarButton5, SameText(DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString,'TRATAMIENTO') );
               
     EnableButton(TMSFMXToolBarButton6, SameText(DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString,'EXAMEN'));
               
     EnableButton(TMSFMXToolBarButton13, SameText(DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString,'LABORATORIO'));
     
     EnableButton(TMSFMXToolBarButton17, SameText(DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString,'FICHA MEDICA'));
 
        DataModule1.UniQueryConsultaDOC.Next; 
   end;
end;

Saludos y buena fortuna

giantonti1801 07-04-2023 01:04:07

Cita:

Empezado por cloayza (Mensaje 551028)
Estimado colega, le propongo esta alternativa
Código Delphi [-]
   
   {Esta función se encarga de habilitar el boton y la opacidad}
   procedure EnableButton(boton:TMSFMXToolBarButton; AEnable:Boolean);
   begin
        boton.Enable:=AEnable;
    if Boton.Enable then
       Boton.Opacity := 1
    else
       Boton.Opacity := 0.3;
   end;
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
     EnableButton(TMSFMXToolBarButton5, SameText(DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString,'TRATAMIENTO') );
               
     EnableButton(TMSFMXToolBarButton6, SameText(DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString,'EXAMEN'));
               
     EnableButton(TMSFMXToolBarButton13, SameText(DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString,'LABORATORIO'));
     
     EnableButton(TMSFMXToolBarButton17, SameText(DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString,'FICHA MEDICA'));
 
        DataModule1.UniQueryConsultaDOC.Next; 
   end;
end;

Saludos y buena fortuna

gracias amigo pero donde coloco esta funcion ya que puedo ver que debo crear un proceso para eso o lo puedo colocar en el evento onClickCeld?

cloayza 07-04-2023 03:33:22

Veamos...
Supongamos que tu formulario es TForm1.

Código Delphi [-]
 
type
  TForm1 = class(TForm)
  ....
  private
  public
    ...
    procedure xxxx;
    procedure EnableButton(boton:TMSFMXToolBarButton; AEnable:Boolean);
 End;

{Esta función se encarga de habilitar el boton y la opacidad}
//Declarara en la sección public...

procedure TForm1.EnableButton(boton:TMSFMXToolBarButton; AEnable:Boolean);
begin
        boton.Enable:=AEnable;
    if Boton.Enable then
       Boton.Opacity := 1
    else
       Boton.Opacity := 0.3;
end;

procedure TForm1.xxxx
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
     EnableButton(TMSFMXToolBarButton5, SameText(DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString,'TRATAMIENTO') );
               
     EnableButton(TMSFMXToolBarButton6, SameText(DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString,'EXAMEN'));
               
     EnableButton(TMSFMXToolBarButton13, SameText(DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString,'LABORATORIO'));
     
     EnableButton(TMSFMXToolBarButton17, SameText(DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString,'FICHA MEDICA'));
 
        DataModule1.UniQueryConsultaDOC.Next; 
   end;
end;
Espero que ahora este claro.

Saludos cordiales

giantonti1801 07-04-2023 14:46:21

Cita:

Empezado por cloayza (Mensaje 551038)
Veamos...
Supongamos que tu formulario es TForm1.

Código Delphi [-]
 
type
  TForm1 = class(TForm)
  ....
  private
  public
    ...
    procedure xxxx;
    procedure EnableButton(boton:TMSFMXToolBarButton; AEnable:Boolean);
 End;

{Esta función se encarga de habilitar el boton y la opacidad}
//Declarara en la sección public...

procedure TForm1.EnableButton(boton:TMSFMXToolBarButton; AEnable:Boolean);
begin
        boton.Enable:=AEnable;
    if Boton.Enable then
       Boton.Opacity := 1
    else
       Boton.Opacity := 0.3;
end;

procedure TForm1.xxxx
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
     EnableButton(TMSFMXToolBarButton5, SameText(DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString,'TRATAMIENTO') );
               
     EnableButton(TMSFMXToolBarButton6, SameText(DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString,'EXAMEN'));
               
     EnableButton(TMSFMXToolBarButton13, SameText(DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString,'LABORATORIO'));
     
     EnableButton(TMSFMXToolBarButton17, SameText(DataModule1.UniQueryConsultaDOCTIPODOCUMENTO.AsString,'FICHA MEDICA'));
 
        DataModule1.UniQueryConsultaDOC.Next; 
   end;
end;
Espero que ahora este claro.

Saludos cordiales

Gracias amigo funciona perfecto la funcion de habilitar los bottones pero aun sigue sucediendo igual que solo me muestra un resultado, es decir solo se habilita un solo botton.
Verifique tabla
Verifique las condiciones
hice la consulta en labla en sql
coloque en el where los valores manueales
incluso coloque un
Código Delphi [-]
ShowMessage(DataModule1.UniQueryConsultaDOC.RecordCount.ToString);
para verificar que en efecto encontrara la misma cantidad de registro y perfectamente conicide.
Tambien le coloque un
Código Delphi [-]
DataModule1.UniQueryConsultaDOC.First;
para obligarlo a irse al primer registro y tampoco con eso me funciona
Al parecer no está respetando el NEXT, es decir haga como haga la consulta solo se habilita un solo boton.
lo hice con while tambien lo hice con el for y nada

giantonti1801 07-04-2023 15:47:03

La solucion temporal que encontre es la siguiente funciona perfecto pero como podra imaginarse la consulta se vuelve muy lenta :

Código Delphi [-]
procedure TFormReportes.StringGrid1CellClick(const Column: TColumn;
  const Row: Integer);
 var
 Filtro :string;
 i:integer;
 begin
 DataModule1.UniQueryConsultaDOC.Close;
  DataModule1.UniQueryConsultaDOC.sql.Clear;
  DataModule1.UniQueryConsultaDOC.sql.Add('select REGFICHA, TIPODOCUMENTO,REGPAC, INSTRUT from fichadoc');
  DataModule1.UniQueryConsultaDOC.SQL.Add('where instrut = :INSTRUT and REGFICHA = :REGFICHA and regpac =:regpac and TIPODOCUMENTO =:TIPODOCUMENTO');
  DataModule1.UniQueryConsultaDOC.ParamByName('INSTRUT').AsString := datamodule1.InstRut;
  DataModule1.UniQueryConsultaDOC.ParamByName('REGFICHA').AsString := Label1.text;
  DataModule1.UniQueryConsultaDOC.ParamByName('REGPAC').AsString := Label2.text;
  DataModule1.UniQueryConsultaDOC.ParamByName('TIPODOCUMENTO').AsString := 'TRATAMIENTO';
  DataModule1.UniQueryConsultaDOC.open;
  if not DataModule1.UniQueryConsultaDOC.eof then
  begin
      TMSFMXToolBarButton5.Enabled := true;
      TMSFMXToolBarButton5.Opacity := 1;
    end
    else
    begin
      TMSFMXToolBarButton5.Enabled := False;
      TMSFMXToolBarButton5.Opacity := 0.3;
    end;
    begin
     DataModule1.UniQueryConsultaDOC.Close;
      DataModule1.UniQueryConsultaDOC.sql.Clear;
      DataModule1.UniQueryConsultaDOC.sql.Add('select REGFICHA, TIPODOCUMENTO,REGPAC, INSTRUT from fichadoc');
      DataModule1.UniQueryConsultaDOC.SQL.Add('where instrut = :INSTRUT and REGFICHA = :REGFICHA and regpac =:regpac and TIPODOCUMENTO =:TIPODOCUMENTO');
      DataModule1.UniQueryConsultaDOC.ParamByName('INSTRUT').AsString := datamodule1.InstRut;
      DataModule1.UniQueryConsultaDOC.ParamByName('REGFICHA').AsString := Label1.text;
      DataModule1.UniQueryConsultaDOC.ParamByName('REGPAC').AsString := Label2.text;
      DataModule1.UniQueryConsultaDOC.ParamByName('TIPODOCUMENTO').AsString := 'LABORATORIO';
      DataModule1.UniQueryConsultaDOC.open;
      if not DataModule1.UniQueryConsultaDOC.eof then
      begin
          TMSFMXToolBarButton13.Enabled := true;
          TMSFMXToolBarButton13.Opacity := 1;
        end
        else
        begin
          TMSFMXToolBarButton13.Enabled := False;
          TMSFMXToolBarButton13.Opacity := 0.3;
        end;
     end;
    begin
     DataModule1.UniQueryConsultaDOC.Close;
      DataModule1.UniQueryConsultaDOC.sql.Clear;
      DataModule1.UniQueryConsultaDOC.sql.Add('select REGFICHA, TIPODOCUMENTO,REGPAC, INSTRUT from fichadoc');
      DataModule1.UniQueryConsultaDOC.SQL.Add('where instrut = :INSTRUT and REGFICHA = :REGFICHA and regpac =:regpac and TIPODOCUMENTO =:TIPODOCUMENTO');
      DataModule1.UniQueryConsultaDOC.ParamByName('INSTRUT').AsString := datamodule1.InstRut;
      DataModule1.UniQueryConsultaDOC.ParamByName('REGFICHA').AsString := Label1.text;
      DataModule1.UniQueryConsultaDOC.ParamByName('REGPAC').AsString := Label2.text;
      DataModule1.UniQueryConsultaDOC.ParamByName('TIPODOCUMENTO').AsString := 'EXAMEN';
      DataModule1.UniQueryConsultaDOC.open;
      if not DataModule1.UniQueryConsultaDOC.eof then
      begin
          TMSFMXToolBarButton6.Enabled := true;
          TMSFMXToolBarButton6.Opacity := 1;
        end
        else
        begin
          TMSFMXToolBarButton6.Enabled := False;
          TMSFMXToolBarButton6.Opacity := 0.3;
        end;
     end;
     begin
     DataModule1.UniQueryConsultaDOC.Close;
      DataModule1.UniQueryConsultaDOC.sql.Clear;
      DataModule1.UniQueryConsultaDOC.sql.Add('select REGFICHA, TIPODOCUMENTO,REGPAC, INSTRUT from fichadoc');
      DataModule1.UniQueryConsultaDOC.SQL.Add('where instrut = :INSTRUT and REGFICHA = :REGFICHA and regpac =:regpac and TIPODOCUMENTO =:TIPODOCUMENTO');
      DataModule1.UniQueryConsultaDOC.ParamByName('INSTRUT').AsString := datamodule1.InstRut;
      DataModule1.UniQueryConsultaDOC.ParamByName('REGFICHA').AsString := Label1.text;
      DataModule1.UniQueryConsultaDOC.ParamByName('REGPAC').AsString := Label2.text;
      DataModule1.UniQueryConsultaDOC.ParamByName('TIPODOCUMENTO').AsString := 'FICHA MEDICA';
      DataModule1.UniQueryConsultaDOC.open;
      if not DataModule1.UniQueryConsultaDOC.eof then
      begin
          TMSFMXToolBarButton17.Enabled := true;
          TMSFMXToolBarButton17.Opacity := 1;
        end
        else
        begin
          TMSFMXToolBarButton17.Enabled := False;
          TMSFMXToolBarButton17.Opacity := 0.3;
        end;
     end;

Neftali [Germán.Estévez] 11-04-2023 08:41:08

Cita:

Empezado por Casimiro Notevi (Mensaje 551008)
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 ;)

:D:D:D:D
Me he reído mucho...

Neftali [Germán.Estévez] 11-04-2023 08:48:18

En estos casos el error o la solución suele ser un detalle muy tonto sobre el que no hemos caído.

Te recomiendo que crees un pequeño proyecto con esa porción de código donde se reproduce el problema y para los datos uses un TClientDataset y grabes los datos en un fichero. De esa forma cualquiera puede probarlo y reproducir el error y el comportamiento que tienes.

Lo subes y lo revisamos. Seguro que encontramos la lógica e incluso te podemos dar algún consejo de mejora.

aposi 21-04-2023 17:45:16

El problema en el for lo tienes en que desactivas los botones en cada paso del for




Por ejemplo e un registro que no es TRATAMIENTO desactivas el boton5, aunque en el registro anterior lo actives.
Lo que puedes hacer es desactivar todos los botones fuera del for y una vez dentro activar los botones




Código Delphi [-]
TMSFMXToolBarButton5.Enabled := False;
 TMSFMXToolBarButton5.Opacity := 0.3;
TMSFMXToolBarButton6.Enabled := False;
 TMSFMXToolBarButton6.Opacity := 0.3;

TMSFMXToolBarButton13.Enabled := False;
 TMSFMXToolBarButton13.Opacity := 0.3;

TMSFMXToolBarButton17.Enabled := False;
TMSFMXToolBarButton17.Opacity := 0.3;
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;
     if DataModule1.UniQueryConsultaDOC.FieldByName('TIPODOCUMENTO').value = 'EXAMEN' then
     begin
       TMSFMXToolBarButton6.Enabled := true;
       TMSFMXToolBarButton6.Opacity := 1;
     end;
     if DataModule1.UniQueryConsultaDOC.FieldByName('TIPODOCUMENTO').value = 'LABORATORIO' then
     begin
       TMSFMXToolBarButton13.Enabled := true;
       TMSFMXToolBarButton13.Opacity := 1;
     end;
           if DataModule1.UniQueryConsultaDOC.FieldByName('TIPODOCUMENTO').value = 'FICHA MEDICA' then
     begin
       TMSFMXToolBarButton17.Enabled := true;
       TMSFMXToolBarButton17.Opacity := 1;
     end;
    DataModule1.UniQueryConsultaDOC.Next;
   end;


La franja horaria es GMT +2. Ahora son las 16:39:52.

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