PDA

Ver la Versión Completa : Retomar control en Edit


Jose Carlos Rey
28-11-2014, 01:06:37
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.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.
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