Hola a todos, necesito una ayuda con el siguiente tema:
Tengo que adaptar un sistema desarrollado en Delphi6 con una base de datos en Access para que funcione en red. Pueden llegar a ser hasta 6 usuarios que se conecten a la vez y no más de tres que realicen el mismo proceso a la vez. Utilizo ADOConnection, ADOTable, etc... He adaptado el código iniciando transacciones al momento de grabar los datos en las tablas pero algo no está bien... lo he probado con dos usuarios, el proceso de uno lo termina bien y en el otro da un error. Agrego el código desarrollado para una tarea de ingresos de artículos a una tabla INGRESOS, actualizar una tabla STOCK y agregar los datos en otra tabla MOVIM... Desde ya, muchas gracias !!!
Código Delphi
[-]
procedure TFIng.BGrabarClick(Sender: TObject); var largoCod: Integer;
begin
FAguarde.Show;
FAguarde.Refresh;
if DM1.Movim.Active = false then DM1.Movim.Active:= true;
if DM1.Ingresos.Active = false then
DM1.Ingresos.Active:= true;
if DM1.Stock.Active = false then
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
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;
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);
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;
Table1.Next;
end;
DM1.Stock.Post;
DM1.Ingresos.Post;
DM1.Movim.Post;
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; end else begin ShowMessage('Archivo ocupado... Aguarde un insante e intente nuevamente.');
end;
try
FAguarde.Close;
except
end;
end;