Cita:
Empezado por AgustinOrtu
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; AdoQuery1.Open; msError('No se encuentra registrado, Favor verifica los datos.','ERROR: ID MAC');
ADOQuery1.Active := False;
Edit1.SetFocus;
exit;
End
Else Begin
If MessageDlg('¿Está seguro que desea ACTUALIZAR el registro? ',mtConfirmation,[mbYes,mbNo],0) = mrYes then
begin
Alta_ONT.Cursor:= crSQLWait;
DMod1.ADOConnection1.BeginTrans; try
ADOQuery1.Edit; 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; if DMod1.ADOConnection1.InTransaction then
Begin
DMod1.AdoConnection1.CommitTrans; Alta_ONT.Cursor:= crDefault;
AdoQuery1.Close; AdoQuery1.Open; 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]);
CargarBotonesInicio;
Alta_ONT.Cursor:= crDefault;
ADOQuery1.Active := False;
bnuevo.SetFocus;
End;
except
on E:Exception do 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; End; End
Else
Begin
AdoQuery1.Close; AdoQuery1.Open; Alta_ONT.Cursor:= crDefault;
ADOQuery1.Active := False;
msInfo('¡CANCELADO POR EL USUARIO!.','Atención Proceso Cancelado..');
BCancelar.SetFocus;
exit;
End;
End;
End;