Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   StartTransaction, funciona solo en el equipo donde se hizo los movimientos. (https://www.clubdelphi.com/foros/showthread.php?t=95433)

mRoman 17-10-2021 19:17:30

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.

Casimiro Notevi 17-10-2021 21:12:24

En tu código hay un "mejunje" que no podemos descifrar si no tenemos acceso a ver todos los parámetros de cada dataset, componente, transacción, etc.
Te aconsejo que hagas un simple programa de pruebas con un dataset.
Cuando lo tengas controlado entonces podrás implementarlo en tu programa.

mRoman 18-10-2021 16:07:46

Cita:

Empezado por Casimiro Notevi (Mensaje 543548)
En tu código hay un "mejunje" que no podemos descifrar si no tenemos acceso a ver todos los parámetros de cada dataset, componente, transacción, etc.
Te aconsejo que hagas un simple programa de pruebas con un dataset.
Cuando lo tengas controlado entonces podrás implementarlo en tu programa.

Ok. Gracias Casimiro.

ASAPLTDA 08-11-2021 22:03:42

commit solo funciona en un equipo
 
No Conosco los componentes ibx, pero de pronto este comentario te sirve
el computador "A" ejecuta la consulta select tabla xxxy y la tiene en l pantalla
el computador "B" hace cambios en la tabla xxxy
para que el computador "A" vea los cambios realizados en el computador "B" debe cerrar la consulta (query close, commit,rollback) si no tienes autocommit y abrir de nuevo la consulta
saludes desde Cali


La franja horaria es GMT +2. Ahora son las 21:51:25.

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