Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Retomar control en Edit (https://www.clubdelphi.com/foros/showthread.php?t=87205)

Jose Carlos Rey 28-11-2014 01:06:37

Retomar control en Edit
 
Que tal, buen día a todos. Saludándoles y aprovechando de su conocimiento les pido ayuda para un detalle que tengo con un ciclo While que debería de recorrer una consulta SQL, hace el recorrido a medias y se queda ciclado.
Lo que pretendo hacer es posterior a una consulta SQL. En un Edit de un Form se captura con lector de código EAN13 y al termino se ingresa un ENTER en el evento Edit1KeyPress en esta consulta SQL selecciono Factura,articulo,cantidad,código EAN13,usuario,área y nivel. Los datos principales son los 3 primeros. Se ingresa un numero de factura y esto por consecuencia tiene "X" cantidad de productos que a su vez tienen "Y" cantidad de piezas o unidades. Pretendo que se posicione en numero "Factura" luego haga la búsqueda del código EAN13 y tome como variable la cantidad de piezas para que valide atraves del EDIT y el lector de codigo con el mismo producto y la misma factura. Con la programacion que tengo hace solo una parte, encuentra la factura, el código y piezas y hace el loop según la cantidad. pero después ya no retoma el control en el Edit de la Form. para nuevamente hacer el ciclo y así sucesivamente.
Código Delphi [-]
procedure TForm5_suite_factura.Edit1KeyPress(Sender: TObject;
  var Key: Char);
begin
  if (key = #13) then
    begin
      Nprod:=Edit1.Text;
      DataModule1.ADOQuery8.Close;
      DataModule1.ADOQuery8.Open;
      DataModule1.ADOQuery8.SQL.Clear;
      DataModule1.ADOQuery8.Close;
      DataModule1.ADOQuery8.SQL.Add('SELECT CVE_DOC,NUM_PAR,CVE_ART,CANT,CVE_ALTER,USUARIO,AREA,NIVEL');
      DataModule1.ADOQuery8.SQL.Add('FROM PAR_FACTF_CLASS');
      DataModule1.ADOQuery8.SQL.Add('WHERE CVE_DOC=:Fact');
      DataModule1.ADOQuery8.Parameters.ParamByName('Fact').Value:=Nfact;
      DataModule1.ADOQuery8.ExecSQL;
      DataModule1.ADOQuery8.Open;
      DataModule1.ADOQuery8.First;
      DBGrid1.Columns[0].Visible:= True;
      DBGrid1.Columns[1].Visible:= True;
      DBGrid1.Columns[2].Visible:= True;
      DBGrid1.Columns[3].Visible:= False;
      DBGrid1.Columns[4].Visible:= False;
      DBGrid1.Columns[5].Visible:= False;
      DBGrid1.Columns[6].Visible:= False;
      DBGrid1.Columns[7].Visible:= False;
      Cuser:='NOMBRE USUARIO';
      Carea:='SISTEMAS';
      Nnivel:=0;
      Ncuenta:=0;
      While Not DataModule1.ADOQuery8.Eof Do
        Begin
          DataModule1.ADOQuery8.DisableControls;
            If Not (DataModule1.ADOQuery8.Fields[0].Value<>Nfact) Then
              Begin
                Nprod:=DataModule1.ADOQuery8.Fields[4].AsString;
                  If Not (DataModule1.ADOQuery8.Fields[4].Value<>Nprod) Then
                    Begin
                      Ncant:=DataModule1.ADOQuery8.Fields[3].Asinteger;
                      If (DataModule1.ADOQuery8.Fields[3].Value<>Ncuenta) Then
                        Begin
                          Ncuenta:=Ncuenta+1;
                        End
                      Else
                        Begin
                          DataModule1.ADOQuery8.Next;
                          Edit1.Clear;
                          ShowMessage('Siguiente');
                          Edit1.SetFocus;
                        End
                    End;
              End // Fin de While Nfact=Nfact
        End // Fin de While EOf
    end;
end;

Espero haya sido clara la explicacion.
De antemano Gracias

Caminante 28-11-2014 15:51:46

Hola

Veo que pones disablecontrols pero no enablecontrols no se si tenga que ver pero solo queria hacerlo notar.

Saludos

Jose Carlos Rey 28-11-2014 18:46:02

Hola Caminante, tienes razón en que tengo DisableControls, lo probé activo e inactivo. Pero sigue en lo mismo. Inclusive en el código actual ya lo elimine por si fuese algo que estuviera provocando falla; pero no, no retoma el control al edit de la form para continuar escaneando el siguiente articulo.

Gracias

Caminante 28-11-2014 20:45:20

Hola de nuevo

¿Y has probado sacando el ADOQuery8.Next fuera de las condicionales, es decir al final del while??


Saludos

Jose Carlos Rey 29-11-2014 00:34:29

No, no lo he sacado. Aunque no se exactamente a que refieres con sacarlo! puedo parecer neófito (realmente lo soy) en ese tema. Podrias si no es molestia con el código que deje dar un ejemplo de lo que refieres?

Gracias y saludos

Jose Carlos Rey 29-11-2014 00:35:43

Caminante, disculpa no lei correctamente lo del ADOQuery8.next de sacarlo del while. mm deja lo intento y comento.

Jose Carlos Rey 29-11-2014 01:22:42

Que tal, he sacado el ADOQuery8.next del ciclo while. Pero no esta funcionando como pretendo se queda ciclado y el edit no permite ingresar ningún valor. La intención es que regrese el control a manera de los lectores de las cajas registradoras en el supermercado que se queda en espera del siguiente producto. Solo que a diferencia si hay mas de un producto lo cheque cuantas veces sea la Ncant, para luego pasar al siguiente producto y repetir el ciclo con todos y cada uno de los productos hasta terminar el total de la nota de compra. No tengo idea de que otro código implementar para este efecto.

Gracias nuevamente

Caminante 29-11-2014 15:27:38

Hola
Me referia a ponerlo al final como ultima sentencia del bloque while no sacarlo del while. Es decir despues de hacer todas las comparaciones (los if's) hacer next. Sino quedarias atrapado en un bucle infinito.

Saludos

Jose Carlos Rey 01-12-2014 18:09:52

Caminante, que tal haciendo lo que comentabas de sacar la sentencia next fuera de los condicionales If termina en la primer lectura del lector de codigo.
Código Delphi [-]
  if (key = #13) then
    begin
      Nprod:=Edit1.Text;
      DataModule1.ADOQuery8.Close;
      DataModule1.ADOQuery8.Open;
      DataModule1.ADOQuery8.SQL.Clear;
      DataModule1.ADOQuery8.Close;
      DataModule1.ADOQuery8.SQL.Add('SELECT CVE_DOC,NUM_PAR,CVE_ART,CANT,CVE_ALTER,USUARIO,AREA,NIVEL');
      DataModule1.ADOQuery8.SQL.Add('FROM PAR_FACTF_CLASS');
      DataModule1.ADOQuery8.SQL.Add('WHERE CVE_DOC=:Fact');
      DataModule1.ADOQuery8.Parameters.ParamByName('Fact').Value:=Nfact;
      DataModule1.ADOQuery8.ExecSQL;
      DataModule1.ADOQuery8.Open;
      DataModule1.ADOQuery8.First;
      DBGrid1.Columns[0].Visible:= True;
      DBGrid1.Columns[1].Visible:= True;
      DBGrid1.Columns[2].Visible:= True;
      DBGrid1.Columns[3].Visible:= False;
      DBGrid1.Columns[4].Visible:= False;
      DBGrid1.Columns[5].Visible:= False;
      DBGrid1.Columns[6].Visible:= False;
      DBGrid1.Columns[7].Visible:= False;
      Cuser:='NOMBRE USUARIO';
      Carea:='SISTEMAS';
      Nnivel:=0;
      Ncuenta:=0;
      While Not DataModule1.ADOQuery8.Eof Do
        Begin
            If Not (DataModule1.ADOQuery8.Fields[0].Value<>Nfact) Then
              Begin
                Nprod:=DataModule1.ADOQuery8.Fields[4].Value;
                  If (DataModule1.ADOQuery8.Fields[4].Value=Nprod) Then
                    Begin
                      Ncant:=DataModule1.ADOQuery8.Fields[3].Asinteger;
                      If (DataModule1.ADOQuery8.Fields[3].Value<>Ncuenta) Then
                        Begin
                          Ncuenta:=Ncuenta+1;
                        End
                    End;
              End; // Fin de While Nfact=Nfact
                DataModule1.ADOQuery8.Next;
                Ncuenta:=0;
                Nprod:=DataModule1.ADOQuery8.Fields[4].Value;
                Form5_suite_factura.Show;
                Form5_suite_factura.Edit1.Clear;
                Form5_suite_factura.Edit1.SetFocus;
        End; // Fin de While EOf
        Form5_suite_factura.Close;
        ShowMessage('Se termino la lectura de productos para su salida.');
    end;
end;

como podras observar ya esta fuera de los If solo dentro de While Eof pero se sale inmediatamente.
Gracias

Caminante 01-12-2014 22:11:32

Eso si que esta raro

¿Y el codigo que esta depues de DataModule1.ADOQuery8.Next? En el codigo anterior no estaba.

Jose Carlos Rey 02-12-2014 01:03:53

Caminante, no; no lo tenia en el código anterior. Este lo agregue con la intención de retomar el setfocus en el Edit de la Form5 en la cual es donde debe de estar el cursor solicitando el ingreso del código EAN13 a través del lector de código. Pero aun así no funciona. Simplemente muestra la forma y en el edit solo aparece el código EAN13 que se acaba de ingresar ( parece entrar en un bucle).
Alguien que me de una idea de donde puede estar mal o una ayudadita con el código. No se me ocurre en donde puede estar la falla o muy posiblemente estoy en todo mal. Cabe mencionar que este código lo estoy haciendo en el evento de OnKeyPress del Edit1.

Gracias


La franja horaria es GMT +2. Ahora son las 01:26:07.

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