Recent

Author Topic: REGISTROS BLOQUEADOS ACCES/ACCESS BLOCKED REGISTRATION  (Read 517 times)

csandoval

  • Newbie
  • Posts: 1
REGISTROS BLOQUEADOS ACCES/ACCESS BLOCKED REGISTRATION
« on: February 22, 2019, 02:00:26 pm »
Muy buen dia.

Soy nuevo en la comunidad y como todos me acerco a ustedes en busca de conocimiento, actualmente me encuentro desarrollando una aplicacion para la oficina misma que es utilza por al menos 5 usuarios de forma simultanea, estoy utilizando como base de datos MICROSOFT ACCES debido a que es la base que tienen instalados todos los quipos pero al momento de escribir de forma concurrente en la base esta se bloquea por el primer usuario que lo intenta.

he abierto el archivo de la base de datos directamente desde ACCES y escrito en el de forma simultanea en mas de un quipo, por lo que concluyo que el problema esta en mi forma de interactuar ACCES desde LAZARUS, enseguida les comparto un extracto del programa donde se pueden ver las interacciones que tengo con la base de datos y las configuracones generales:

-La conexion se realza mediante ODBC.
-Se inicializa el ODBCConn con un DSN de sistema que apunta al archivo .accdb.
-los componentes transaction y query tienen como DATABASE al ODBCConn.
-La propiedad Action del transaction tiene como parametro caCommit.
-El Query tiene inhabilitado el campo UsePrimaryKey.

Enseguida parte del codigo:

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
     ODBCConnection1.Connected:=False;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
     ODBCConnection1.Connected:=True;
end;


//La siguiente funcion busca un ndice y s no exste lo registra.

Function TForm1.fncBDObtieneID(strTabla : String; strCampo : String; strValor : String) : Integer;
var
  bolEncontrado : Boolean;
begin
  fncBDObtieneID := -1;
  While(fncBDObtieneID = -1) do
  begin
       SQLQuery1.SQL.Text := 'SELECT * FROM ' + strTabla + ' WHERE ' + strCampo + ' = :VALOR;';
       SQLQuery1.Prepare;
       SQLQuery1.Params.ParamByName('VALOR').AsString := strValor;
       SQLQuery1.Open;
       bolEncontrado := False;
       while not SQLQuery1.Eof do
       begin
            If SQLQuery1.FieldByName(strCampo).AsString = strValor Then
            begin
                 bolEncontrado := True;
                 fncBDObtieneID := SQLQuery1.FieldByName('ID').AsInteger;
            end;
            SQLQuery1.Next;
       end;
       SQLQuery1.Close;
       SQLQuery1.Clear;
       If Not bolEncontrado Then
       begin
            SQLQuery1.SQL.Text := 'INSERT INTO ' + strTabla + '(' + strCampo + ') VALUES(:VALOR);';
            SQLQuery1.Prepare;
            SQLQuery1.Params.ParamByName('VALOR').AsString := strValor;
            SQLQuery1.ExecSQL;
            SQLQuery1.Close;
       end;
  end;
end;


//

procedure TfrmPrincipalSHMC.btnCarrpsPruebasProcesarClick(Sender: TObject);
var
     strTren : String;
     lstDatosDeTren : TStringList;
     intFor : Integer;
begin
     lstDatosDeTren := TStringList.Create;
     lstDatosDeTren.CommaText:=fncBuscaTrenQueSitue(tbxCarrosSituarEstacion.Text);
     strTren := lstDatosDeTren.Strings[0] + ' ' + lstDatosDeTren.Strings[1];
     If fncSituaListaConTren(strTren,lstDatosDeTren.Strings[2],tbxCarrosSituarEstacion.Text,tbxCarrosSituaZVP.Text,tblCarrosSituarUnidades) Then
     begin

     end;
     for intFor := 0 To (tblCarrosSituarUnidades.RowCount -2) do begin
         If (fncObtieneCodigoDeCarro(tblCarrosSituarUnidades.Cells[0,intFor + 1], tblCarrosSituarUnidades.Cells[1,intFor + 1]) = 'SC') Or (fncObtieneCodigoDeCarro(tblCarrosSituarUnidades.Cells[0,intFor + 1], tblCarrosSituarUnidades.Cells[1,intFor + 1]) = 'DT') Then
         begin
              tblCarrosSituarUnidades.Cells[2,intFor + 1] := 'OK';
              intIDCarro := fncCarroObtieneID(tblCarrosSituarUnidades.Cells[0,intFor + 1] + tblCarrosSituarUnidades.Cells[1,intFor + 1]);
              SQLQuery1.SQL.Text := 'INSERT INTO UCARROSSITUADOS(IDFUSUARIO, IDFCARRO) VALUES(:intUsuario, :intCarro);';
              SQLQuery1.Prepare;
              SQLQuery1.Params.ParamByName('intUsuario').AsInteger := intIDUsuario;
              SQLQuery1.Params.ParamByName('intCarro').AsInteger :=  intIDCarro;
              SQLQuery1.ExecSQL;
              SQLQuery1.Close;
         end
         else
         begin
            tblCarrosSituarUnidades.Cells[2,intFor + 1] := 'ERROR';
         end;
     end;
end;


Las anteriores son las funciones con las que interactuo con la base de datos, les explico nuevamente el flujo de eventos que produce el bloqueo.

Usuario 1 inicia la aplicacion y ejecuta el evento click antes mencionado.
Usuario 2 ejecuta la aplicacon y ejecuta el evento click antes mencionado obteniendo como resultado un mensaje de error que indica que Usuario 1 tiene bloquada la base de datos.

Espero les sea de utilidad la informacion proporcionada y de ser necesario algo mas se los proporcionare con gusto.

Quedo en espera de sus amables respuestas.