Ver Mensaje Individual
  #7  
Antiguo 23-02-2017
koalasoft koalasoft is offline
Miembro
 
Registrado: oct 2004
Ubicación: Tenosique Tabasco
Posts: 86
Reputación: 20
koalasoft Va por buen camino
Cita:
Empezado por AgustinOrtu Ver Mensaje
Yo encontraba este tipo de problemas cuando habia varios usuarios usando la misma aplicacion contra la misma BD. Para reproducir:

1. Usuario 1 abre el query
2. Usuario 2 abre el query y se va a hacer un cafe
3. Usuario 1 modifica datos (edit + post)
4. Usuario 2 termina su cafe, vuelve e intenta modificar datos --> se produce la excepcion

Una solucion era refrescar el query (en caso de ADO si mal no recuerdo hay un metodo Requery). Ten en cuenta que puede provocar que el registro seleccionado cambie (por lo general sucede que se posiciona en el primero). Asi que tendrias que guardarte algun dato, como la clave primaria, del registro en donde estas parado, luego lanzar el Requery, volverte a posicionar usando algun metodo como Locate y luego realizar la modificacion

Ya que estamos, como se ve tu codigo para realizar la edicion?
Este es lo que hago para actualizar ..

Código Delphi [-]
with ADOQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM ONTs ');
    SQL.Add('WHERE MAC_ONT LIKE ' +quotedstr('%' + Edit1.Text + '%')+' ');
    Open;
  if isEmpty Then
    begin
    AdoQuery1.Close;            // cierro la tabla.
    AdoQuery1.Open;             // abro la Tabla
    msError('No se encuentra registrado, Favor verifica los datos.','ERROR: ID MAC');
    ADOQuery1.Active := False;
    Edit1.SetFocus;
    exit;
  End
  Else   // En caso de Si haber un resultado
   Begin
    If MessageDlg('¿Está seguro que desea ACTUALIZAR el registro? ',mtConfirmation,[mbYes,mbNo],0) = mrYes then
      begin
      Alta_ONT.Cursor:= crSQLWait;
      DMod1.ADOConnection1.BeginTrans;   // Inicio la Transacción
       try
       ADOQuery1.Edit;           // Editar la Tabla
       ADOQuery1.FieldByName('MOD_ONT').AsString := ComboBox1.Text;
       ADOQuery1.FieldByName('SERIE_ONT').AsString := Edit2.Text;
       ADOQuery1.FieldByName('PON_ONT').AsString := Edit3.Text;
       ADOQuery1.FieldByName('ONT_S').AsString := Edit4.Text;
       ADOQuery1.FieldByName('SSID_ONT').AsString := Edit5.Text;
       ADOQuery1.FieldByName('KEYWIFI_ONT').AsString := Edit6.Text;
       ADOQuery1.FieldByName('IP_ONT').AsString := Edit7.Text;
       ADOQuery1.FieldByName('ESTATUS_ONT').AsString := ComboBox2.Text;
       ADOQuery1.Post;            // Guardo Datos;
       if DMod1.ADOConnection1.InTransaction then
       Begin
        DMod1.AdoConnection1.CommitTrans; // actualizo la BD
        Alta_ONT.Cursor:= crDefault;
        AdoQuery1.Close;            // cierro la tabla.
        AdoQuery1.Open;             // abro la Tabla
        MSG:='EL Registro ONU [MAC: '+ Edit1.Text + ' - MODELO: ' + ComboBox1.Text + ' - SERIE: '+ Edit2.Text +' - ONT/s: ' + Edit4.Text + ' ] - SE MODIFICO/ACTUALIZO Satisfactoriamente';
        Application.MessageBox(PChar(MSG), 'Atención',MB_ICONINFORMATION );
        LimpiarCampos([Edit1,Edit2,Edit3,Edit4,Edit5,Edit6,Edit7,ComboBox1,Combobox2]);
        DesactivarCampos([Edit1,Edit2,Edit3,Edit4,Edit5,Edit6,Edit7,ComboBox1,Combobox2]);
        // -- Inicio Botones
        CargarBotonesInicio;
        // -- Fin Botones
        Alta_ONT.Cursor:= crDefault;
        ADOQuery1.Active := False;
        bnuevo.SetFocus;
       End;
    except
      on E:Exception do      // Si hay Error de Conexión
      begin
        DMod1.AdoConnection1.RollbackTrans;
        Alta_ONT.Cursor:= crDefault;
        ADOQuery1.Active := False;
        MSG:='Ocurrió un error al guardar los datos: ' + E.Message;
        Application.MessageBox(PChar(MSG),'ERROR !!!', MB_ICONSTOP );
        Abort;
        exit;
      end;  // on
       End; // try
     End
    Else
      Begin
      AdoQuery1.Close;            // cierro la tabla.
      AdoQuery1.Open;             // abro la Tabla
      Alta_ONT.Cursor:= crDefault;
      ADOQuery1.Active := False;
      msInfo('¡CANCELADO POR EL USUARIO!.','Atención Proceso Cancelado..');
      BCancelar.SetFocus;
      exit;
      End;
   End;
End;

Última edición por ecfisa fecha: 04-03-2017 a las 10:58:30. Razón: Cambiar etiquetas PHP por Delphi
Responder Con Cita