Ver Mensaje Individual
  #1  
Antiguo 17-10-2021
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 599
Reputación: 21
mRoman Va por buen camino
StartTransaction, funciona solo en el equipo donde se hizo los movimientos.

Hola amigos.

Trabajo con: IBX, WIN10, FB 2.0, DELPHI6

El tema que quiero q me auxilien es sobre TRANSACTION. Tengo el siguiente código que me funciona en 1 equipo, pero si se quiere consultar en otro equipos los datos que se capturaron, no se muestran....el código funciona pero solo en el equipo donde se hizo los movimientos.
Código Delphi [-]
procedure TfrmRegComanda.sBtnEnviarClick(Sender: TObject);
var
   i,NvaComanda:Integer;
   f:TForm;
begin
    sBtnEnviar.Enabled:=False;
    frmMeseroMain.btnCancelClick:=0;
    if frmMeseroMain.nRegID=0 then //CUANDO ES NUEVA COMANDA nRegID SERÁ IGUAL A CERO
    begin
        frmMeseroMain.qryGenerator.Close;
        frmMeseroMain.qryGenerator.Open;
        frmMeseroMain.nRegID:=frmMeseroMain.qryGenerator.FieldByName('ID').AsInteger;
        NvaComanda:=1;
        dsCM.Open;
        dsCM.Append;
        dsCM.FieldByName('COMANDA_ID').AsInteger:=frmMeseroMain.qryGenerator.FieldByName('ID').AsInteger;
        dsCM.FieldByName('COMANDA_NUM_MESA').AsString:=IntToStr( frmMeseroMain.NumMesa );
        dsCM.FieldByName('COMANDA_MESA_LETRA').AsString:='';//frmAbrirMesas.cbxLetra.Text; //sLetra;
        dsCM.FieldByName('COMANDA_ESTATUS').AsString:='A';
        dsCM.FieldByName('COMANDA_EMP_ID').AsString:=frmMeseroMain.vNumEmpl;
        dsCM.FieldByName('COMANDA_N_PERSONAS').AsString:='0';//frmAbrirMesas.mskNumPersonas.Text;
        dsCM.Post;
    end;

    for i:=1 to SG.RowCount-1 do
    begin
      if SG.Cells[6,i]='*' then
      begin
          dsCD.Open;
          dsCD.Append;
          dsCD.FieldByName('COMANDA_ID').AsInteger:=frmMeseroMain.nRegID;
          dsCD.FieldByName('COMANDA_D_CONSEC').AsString:=SG.Cells[0,i];
          dsCD.FieldByName('PRODUCTO_ID').AsString:=SG.Cells[1,i];
          dsCD.FieldByName('COMANDA_DESCR_PROD').AsString:=SG.Cells[2,i];
          dsCD.FieldByName('COMANDA_D_CANT').AsString:=SG.Cells[3,i];
          dsCD.FieldByName('COMANDA_D_PRECIO').AsFloat:=0.0;
          dsCD.FieldByName('COMANDA_STAT_COCINA').AsString:='*';
          dsCD.FieldByName('COMANDA_DESCR_PROD_MODIF').AsString:=SG.Cells[2,i];
          dsCD.Post;
      end;
    end;

    if not(DM.trsComanda.InTransaction) then
    begin
        DM.trsComanda.StartTransaction;
    end;
    try
        if NvaComanda=1 then
            dsCM.ApplyUpdates;
        dsCD.ApplyUpdates;
        DM.trsComanda.Commit;

        {*********************************************************************
         ***    PROCESO PARA IMPRIMIR EL TICKER A LAS DIFERENTES COCINAS   ***
         ***    EN 3 DIFERENTES IMPRESORAS TERMICAS                        ***
         *********************************************************************}
        qryCocina.Close;
        qryCocina.ParamByName('COMANDA_ID').AsInteger:=frmMeseroMain.nRegID;
        qryCocina.Open;

        if not(qryCocina.IsEmpty) then
        begin
            qryCocina.First;
            While not(qryCocina.Eof) do
            begin
                qryImpresora.Close;
                qryImpresora.SQL.Clear;
                qryImpresora.SQL.Add('select * '+
                                     'from impresora i '+
                                     'where i.impresora_id=:impresora');
                qryImpresora.ParamByName('IMPRESORA').AsInteger:=qryCocina.FieldByName('TIPO_COCINA').AsInteger;
                qryImpresora.Open;
                qrTCKCaliente.QuickRep1.PrinterSettings.PrinterIndex:=Printer.Printers.IndexOf(qryImpresora.FieldByN  ame('IMPRESORA_NOMBRE').AsString);
                qrTCKCaliente.qryDatos.Close;
                qrTCKCaliente.qryDatos.ParamByName('COMANDA').AsInteger:=frmMeseroMain.nRegID;
                qrTCKCaliente.qryDatos.ParamByName('TIPO_COCINA').AsInteger:=qryCocina.FieldByName('TIPO_COCINA').As  Integer;
                qrTCKCaliente.qryDatos.Open;
                qrTCKCaliente.QuickRep1.Print;
                qryCocina.Next;
            end;
        end;
        DM.trsComanda.Active:=False;
        DM.trsComanda.StartTransaction;
        spActualizaCocina.Prepare;
        spActualizaCocina.ParamByName('I_COMANDA_ID').AsInteger:=frmMeseroMain.nRegID;
        spActualizaCocina.ExecProc;
        Application.MessageBox('Comanda enviada a COCINA','Aviso', mb_ok+mb_IconInformation);
        DM.trsComanda.Commit;
        Close;
    except
        on E:Exception do
        begin
           DM.trsComanda.Rollback;
           Application.MessageBox('No se pudo grabar la comanda, por favor tome nota del mensaje que a continuación se mostrará y repórtelo con el técnico programador.','Aviso',mb_ok+mb_IconError);
           ShowMessage(E.Message);
           Close;
        end;
    end;
end;

Los registros son grabados, pero no se muestran en otros equipos...solo si se desconectan de la B.D y se vuelven a conectar.

He consultado varios hilos, y he hecho los cambios que en ellos comentan, los cuales ya los aplique y efectivamente, ya graba los datos....pero no puedo verlos en otro equipo.

Tengo el componente IBTransaction (con la B.D. asignada correctamente en "DefaultDatabase") en su propiedad "AutoStopAction:=saCommit" y el "DefaultAction = TACommit". Tengo montado una Red LAN en casa de 3 equipos, 1 que funge como servidor y 2 equipos cliente que son lo que estoy usando para las pruebas.

Sinceramente no entiendo porque los movimientos no se pueden ver de manera inmediata si ya se están grabados en la BD.

Espero me puedan ayudar.

Saludos.
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!

Última edición por mRoman fecha: 17-10-2021 a las 19:20:34.
Responder Con Cita