Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-02-2017
GOG GOG is offline
Miembro
 
Registrado: abr 2008
Posts: 17
Poder: 0
GOG Va por buen camino
Gracias Agustín por tu respuesta y tus observaciones, las voy a tener en cuenta !!!
El tema del error es así, cuando graba el primero (de los dos usuarios con los que probé) sale todo bien, termina el proceso y cierra el formulario como se esperaba, pero cuando graba el otro, hace el ADOConection1.CommitTrans, dice que terminó el proceso, pero luego aparece el error: "Ha intentado confirmar o deshacer una transacción sin iniciar una antes"...
Responder Con Cita
  #2  
Antiguo 27-02-2017
GOG GOG is offline
Miembro
 
Registrado: abr 2008
Posts: 17
Poder: 0
GOG Va por buen camino
Cita:
Empezado por GOG Ver Mensaje
Gracias Agustín por tu respuesta y tus observaciones, las voy a tener en cuenta !!!
El tema del error es así, cuando graba el primero (de los dos usuarios con los que probé) sale todo bien, termina el proceso y cierra el formulario como se esperaba, pero cuando graba el otro, hace el ADOConection1.CommitTrans, dice que terminó el proceso, pero luego aparece el error: "Ha intentado confirmar o deshacer una transacción sin iniciar una antes"...
Agrego el código (espero que más fácil de leer...)


Código Delphi [-]
procedure TFIng.BGrabarClick(Sender: TObject);
var largoCod: Integer;
begin
  FAguarde.Show;
  FAguarde.Refresh;
  DM1.Movim.Active:= true;
  DM1.Ingresos.Active:= true;
  DM1.Stock.Active:= true;

  LargoCod:= Length(Table1TM1CHR1.AsString) - 9;
  Table1.First;
  if DM1.ADOConnection1.InTransaction = false then
  begin
    If MessageDlg('Confirma el Ingreso? ',mtConfirmation,[mbYes,mbNo],0) = mrYes then
    begin
      try
        DM1.Ingresos.IndexFieldNames:= 'INGNRO';
        DM1.Ingresos.Last;
        EdNro.Text:= InttoStr(DM1.IngresosINGNRO.AsInteger + 1);
      except
        EdNro.Text:= '1';
      end;
      try
        DM1.ADOConnection1.BeginTrans;
        while not Table1.Eof do
        begin
          FAguarde.L1.Caption:= 'Grabando datos en Ingresos...';
          FAguarde.L1.Refresh;
          DM1.Ingresos.Append;
          DM1.IngresosINGNRO.AsInteger:=  StrToInt(EdNro.Text);
          DM1.IngresosINGNIV.AsInteger:=  Nivel;
          DM1.IngresosINGOPE.AsInteger:=  Opera;
          DM1.IngresosINGFEC.AsDateTime:= StrToDate(EdFec.Text);
          DM1.IngresosINGHOR.AsDateTime:= Time;
          DM1.IngresosINGLOT.AsString:=   LeftStr(Table1TM1CHR1.AsString, 5);
          DM1.IngresosINGCOD.AsString:=   MidStr(Table1TM1CHR1.AsString, 6, LargoCod);
          DM1.IngresosINGCMCT.AsString:=  Table1TM1CHR1.AsString;
          DM1.IngresosINGCOS1.AsFloat:=   Table1TM1PRE1.AsFloat;
          if Depo = 1 then
             DM1.IngresosINGCAN1.AsFloat:= Table1TM1NUM1.AsFloat;
          if Depo = 2 then
             DM1.IngresosINGCAN2.AsFloat:= Table1TM1NUM1.AsFloat;
          DM1.Ingresos.Post;

          if DM1.Stock.Locate('ARTCMCT',Table1TM1CHR1.AsString,[]) = true then
          begin
             FAguarde.L1.Caption:= 'Actualizando Stock...                 ';
             FAguarde.L1.Refresh;
             DM1.Stock.Edit;
             DM1.StockARTFEC1.AsDateTime:=  StrToDate(EdFec.Text);
             if Depo = 1 then
               DM1.StockARTEX1.AsFloat:= DM1.StockARTEX1.AsFloat + Table1TM1NUM1.AsFloat;
             if Depo = 2 then
               DM1.StockARTEX2.AsFloat:= DM1.StockARTEX2.AsFloat + Table1TM1NUM1.AsFloat;
             DM1.StockARTFEC1.AsDateTime:=  StrToDate(EdFec.text);
             DM1.Stock.Post;
          END;


          FAguarde.L1.Caption:= 'Actualizando en Movimientos...              ';
          FAguarde.L1.Refresh;
          DM1.Movim.Append;
          DM1.MovimMOVFEC.AsDateTime:= Date;
          DM1.MovimMOVHOR.AsDateTime:= Time();
          DM1.MovimMOVLOT.AsString:=   LeftStr(Table1TM1CHR1.AsString, 5);
          DM1.MovimMOVCOD.AsString:=   MidStr(Table1TM1CHR1.AsString, 6, LargoCod);
          DM1.MovimMOVCMCT.AsString:=  Table1TM1CHR1.AsString;
          if Depo = 1 then
            DM1.MovimMOVCAN1.AsFloat:= Table1TM1NUM1.AsFloat;
          if Depo = 2 then
            DM1.MovimMOVCAN2.AsFloat:= Table1TM1NUM1.AsFloat;
          DM1.MovimMOVNRO.AsInteger:=  StrToInt(EdNro.Text);
          DM1.MovimMOVTIP.AsString:=   'I';
          DM1.MovimMOVOBS.AsString:=   'Por Ingreso Nro. ' + EdNro.Text;
          DM1.Movim.Post;

          Table1.Next;
        end;

        DM1.ADOConnection1.CommitTrans;
        FAguarde.Close;
        ShowMessage('Proceso Terminado.');
        RB1.Checked:= false;
        RB2.Checked:= false;
        BCerrarClick(nil);
      except
        DM1.ADOConnection1.RollbackTrans;
        FAguarde.Close;
        ShowMessage('No se pudo completar el proceso.');
      end;
    end;  // del si confirma...
  end else begin //del InTransaction
    ShowMessage('Archivo ocupado... Aguarde un insante e intente nuevamente.');
  end;

  FAguarde.Close;

end;

Última edición por Neftali [Germán.Estévez] fecha: 27-02-2017 a las 08:47:21. Razón: Añadir TAG's
Responder Con Cita
  #3  
Antiguo 27-02-2017
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.310
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por GOG Ver Mensaje
Agrego el código (espero que más fácil de leer...)
Para colocar TAG's al código revisa este enlace.
Te recomiendo también que revises la Guía de estilo de los foros, ya que eres nuevo por aquí.

Un saludo.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 27-02-2017
GOG GOG is offline
Miembro
 
Registrado: abr 2008
Posts: 17
Poder: 0
GOG Va por buen camino
Cita:
Empezado por Neftali Ver Mensaje
Para colocar TAG's al código revisa este enlace.
Te recomiendo también que revises la Guía de estilo de los foros, ya que eres nuevo por aquí.

Un saludo.
Gracias Neftali, desde ya pido disculpas... Espero que me puedan guiar en lo que me estoy equivocando y cual es el error en mi código. Desde ya se los agradezco.
Responder Con Cita
  #5  
Antiguo 27-02-2017
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.310
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por GOG Ver Mensaje
El tema del error es así, cuando graba el primero (de los dos usuarios con los que probé) sale todo bien, termina el proceso y cierra el formulario como se esperaba, pero cuando graba el otro, hace el ADOConection1.CommitTrans, dice que terminó el proceso, pero luego aparece el error: "Ha intentado confirmar o deshacer una transacción sin iniciar una antes"...
Siempre puedes preguntar utilizando el Intransaction, antes de realizar el Commit. De todas formas, en ese caso, habría que saber es qué momento se está cerrando la transacción.
Para eso deberías "debuggar" el código e ir ejecutándolo línea a línea. Tal vez en algún otro evento que se lanza desde aquí, o en algún otro sitio se esté cerrando esa transacción.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 27-02-2017 a las 11:05:54.
Responder Con Cita
  #6  
Antiguo 27-02-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
No estoy de acuerdo con lo de preguntar por la transacción. De hacerlo habría que hacerlo antes porque ya modifico los datos de la BD fuera de una transacción y perdes la seguridad que te garantiza y la posibilidad de hacer rollback. Más bien lo justo sería abortar todo si falla el BeginTransaction
Responder Con Cita
  #7  
Antiguo 27-02-2017
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.310
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por AgustinOrtu Ver Mensaje
...Más bien lo justo sería abortar todo si falla el BeginTransaction
Correcto, pero yo estaba pensando en el caso de que le funciona el Begin, pero le falle en Rollback o el Commit. Eso hay que controlarlo, sea con una excepción o preguntarlo antes.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 27-02-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Cita:
Empezado por Neftali Ver Mensaje
Correcto, pero yo estaba pensando en el caso de que le funciona el Begin, pero le falle en Rollback o el Commit. Eso hay que controlarlo, sea con una excepción o preguntarlo antes.


La forma correcta de hacerlo es esta, y es universal para cualquier componente de acceso a datos (puede haber errores de sintaxis porque estoy escribiendo de memoria)

Código Delphi [-]
  if not ADOConnection.BeginTransaction then
    // politica ante errores: reintentar, lanzar excepcion, mandar a una cola y procesar mas tarde

  try
    // editar o insertar campos
    ADOConnection.CommitTransaction;
  except
    ADOConnection.RollbackTransaction;
    raise;
  end;


Es importantisimo que la sentencia que inicia la transaccion este fuera del bloque try, ya que si se pone dentro del try-except y la transaccion no puede iniciar, y se produce una excepcion por cualquier motivo, el flujo pasa al bloque except y ejecutariamos un Rollback cuando no hay ninguna transaccion

Tambien el Commit suele ser la ultima sentencia del bloque try, aunque puede haber cosas despues de esto (como escribir en un log). Obviamente tiene que estar despues de realizar todas las inserciones, modificaciones, borrados, o ejecucion de cualquier SQL

Y por ultimo el bloque except captura todas las excepciones, realiza el rollback correspondiente (ya que si entramos dentro del try se asegura que estamos en una transaccion) y luego vuelve a elevar la excepcion (no la oculta), para que se propague
Responder Con Cita
  #9  
Antiguo 27-02-2017
GOG GOG is offline
Miembro
 
Registrado: abr 2008
Posts: 17
Poder: 0
GOG Va por buen camino
Muchas Gracias por su tiempo y ayuda!!!
Otra pregunta (si suena a abuso avisen por favor...) si debiera mandarlo a una cola, o volver a intentarlo por que no se haya podido completar el proceso, ¿cómo sería la instrucción o el código?
Responder Con Cita
  #10  
Antiguo 01-03-2017
GOG GOG is offline
Miembro
 
Registrado: abr 2008
Posts: 17
Poder: 0
GOG Va por buen camino
Cita:
Empezado por AgustinOrtu Ver Mensaje


La forma correcta de hacerlo es esta, y es universal para cualquier componente de acceso a datos (puede haber errores de sintaxis porque estoy escribiendo de memoria)

Código Delphi [-]
  if not ADOConnection.BeginTransaction then
    // politica ante errores: reintentar, lanzar excepcion, mandar a una cola y procesar mas tarde

  try
    // editar o insertar campos
    ADOConnection.CommitTransaction;
  except
    ADOConnection.RollbackTransaction;
    raise;
  end;


Es importantisimo que la sentencia que inicia la transaccion este fuera del bloque try, ya que si se pone dentro del try-except y la transaccion no puede iniciar, y se produce una excepcion por cualquier motivo, el flujo pasa al bloque except y ejecutariamos un Rollback cuando no hay ninguna transaccion

Tambien el Commit suele ser la ultima sentencia del bloque try, aunque puede haber cosas despues de esto (como escribir en un log). Obviamente tiene que estar despues de realizar todas las inserciones, modificaciones, borrados, o ejecucion de cualquier SQL

Y por ultimo el bloque except captura todas las excepciones, realiza el rollback correspondiente (ya que si entramos dentro del try se asegura que estamos en una transaccion) y luego vuelve a elevar la excepcion (no la oculta), para que se propague

Gracias Bitbow, creo que con esto que decía Agustín funciona bien... Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Error Interbase Access violation The code attempted to access a virtual ryderMX Firebird e Interbase 3 21-11-2015 11:11:46
Ado y Access jocey Conexión con bases de datos 2 25-02-2008 17:58:25
access con la pda joel20 Conexión con bases de datos 0 08-01-2007 13:30:30
ado + access gustavoh Conexión con bases de datos 3 03-10-2005 05:30:49
Access!! PTW Conexión con bases de datos 5 15-04-2004 02:00:10


La franja horaria es GMT +2. Ahora son las 04:03:01.


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
Copyright 1996-2007 Club Delphi