Hola buen día a todos, espero me puedan ayudar o detectar mi error de antemano gracias por permitir poner este tema. Estoy realizando un pool de impresiones pero tengo el problema de que no imprime completo la orden de la comanda; es decir que desde un dispositivo móvil genera la orden y envía a MySQL a una tabla llamada p_POOL_CMDA y entonces una vez llegada la información tengo un programa que realice con un thread para estar recibiendo las ordenes y de ahí enviarlas a sus respectivas direcciones (cocina, bebidas, etc). Pero resulta que cuando llegan algunas ordenes llegan un retarde de 1 milesegundo y mi programa ya tomo la información inicial y no envía completo:
Cita:
MOVIL
1 HAMBURGUESA
CON QUESO
SIN CEBOLLA
|
Cita:
MI PROGRAMA RECIBE
1 HAMBURGUESA
CON QUESO (LLEGA UN 1MILESEGUNDO MAS TARDE Y MI SELECT YA NO LO CONSIDERA Y LO ENVIA EN LA SIGUIENTE ORDEN )
SIN CEBOLLA
|
Mi programa de ej.
Código:
procedure TForm1.btnRefreshClick(Sender: TObject);
begin
btnRefresh.Enabled := False;
tmPrint.Enabled := False;
t := TThread.CreateAnonymousThread(procedure
var
x : integer;
SavePlace : TBookmark;
begin
x := 1;
SQLExecute.SQL.Text := 'DELETE FROM p_POOL_CMDAS WHERE ESTATUS = "EN" ';
SQLExecute.ExecSQL();
qry_geral.Close;
qry_geral.SQL.Text := 'SELECT PC.ID, ID_COMANDA, FCH_HORA, ID_CODSKU, ' +
'DESCRIP, QTY, PRECIO, ID_CUENTA, ID_MESERO, TOT_COMENSAL,'+
'ID_SECC_PREPAR, TIPSKU, DESCRIP_OLD, ID_GRUPO, MESAUNIDA,' +
'ESTATUS,US.NOMBRE AS NAME_MESERO ' +
'FROM p_POOL_CMDAS PC ' +
'JOIN m_USUARIOS US ON PC.ID_MESERO = US.CVE ' +
'WHERE ESTATUS <> "EN" ' +
'ORDER BY ID_GRUPO, ID ';
sleep(500);
qry_geral.Open();
qry_geral.First;
while NOT qry_geral.Eof do
begin
etapa := 'Selección de Comandas';
TThread.Synchronize(nil, procedure
begin
lbl.Caption := x.ToString;
Add_Cmdas_Print(qry_geral.FieldByName('ID_COMANDA').AsInteger,
qry_geral.FieldByName('FCH_HORA').AsString,
qry_geral.FieldByName('ID_CODSKU').AsString,
qry_geral.FieldByName('DESCRIP').AsString,
qry_geral.FieldByName('QTY').AsFloat,
qry_geral.FieldByName('PRECIO').AsFloat,
qry_geral.FieldByName('ID_CUENTA').AsString,
qry_geral.FieldByName('ID_MESERO').AsInteger,
qry_geral.FieldByName('TOT_COMENSAL').AsInteger,
qry_geral.FieldByName('ID_SECC_PREPAR').AsInteger,
qry_geral.FieldByName('TIPSKU').AsString,
qry_geral.FieldByName('DESCRIP_OLD').AsString,
qry_geral.FieldByName('ID_GRUPO').AsInteger,
qry_geral.FieldByName('MESAUNIDA').AsBoolean,
qry_geral.FieldByName('ESTATUS').AsString,
qry_geral.FieldByName('NAME_MESERO').AsString,
qry_geral.FieldByName('ID').AsInteger
);
end);
x := x + 1;
qry_geral.Next;
end; // END WHILE
etapa := 'Impresión de comandas';
pkFOLIO := '';
if mmOrden.RecordCount > 0 then
begin
mmOrden.DisableControls;
mmOrden.First;
while not( mmOrden.Eof) do
begin
if mmOrdenESTATUS.AsString <> 'EN' then
begin
TThread.Synchronize(nil, procedure
begin
lbl.Caption := x.ToString;
(* OBTIENE EL NUMERO DE COMANDA *)
pkFOLIO := mmOrdenID_COMANDA.AsString;
(* ENVIAR IMPRESION *)
PrintComanda(pkFOLIO);
SavePlace := mmOrden.GetBookmark;
ChangeStatus();
(* GUARDAR LA COMANDA *)
SaveComanda();
mmOrden.GotoBookmark( SavePlace );
sleep(300);
end);
end;
mmOrden.Next;
end; // END WHILE
mmOrden.EnableControls;
end;
etapa := 'API';
mmOrden.EmptyDataSet;
mmOrden.Refresh;
tmPrint.Enabled := True;
end);
//t.FreeOnTerminate := true;
t.OnTerminate := ThreadEnd;
t.Start;
end;
Les agradecería mucho que me puedan ayudar.