delphi
procedure TFAstGen.btn1Click(Sender: TObject); var i,e,j,k: integer; FechaIni,FechaFin,EventIni,EventFin: Tdatetime; Fecha: string; begin //Obtenemos el log completo QGetLogs.Close; QGetLogs.SQL.Clear; QGetLogs.SQL.Text := 'SELECT * FROM LOG_ASISTENCIA'; QGetLogs.Open; if QGetLogs.RecordCount > 0 then begin {*** REGISTRAMOS TODAS LAS FECHAS A PARTIR DE UN RANGO DE FECHA ***} ShortDateFormat := 'dd/mm/yyyy'; fechaIni := Primero; fechaFin := Ultimo; //Obtenemos los empleados activos QGetEmp.Close; QGetEmp.SQL.Clear; QGetEmp.SQL.Text := 'SELECT * FROM EMPLEADOS WHERE EMP_STATUS = 3'; QGetEmp.Open; while not QGetEmp.eof do begin e := QGetEmp.fieldbyname('EMP_ID').Value; for i := trunc(fechaIni) to trunc(FechaFin) do begin QGetDates.Close; QGetDates.SQL.Clear; QGetDates.SQL.Text := 'INSERT INTO ASISTENCIA(EMP_ID, AST_FECHA) VALUES(:EMP,:FECHA)'; QGetDates.ParamByName('EMP').AsInteger := e; QGetDates.ParamByName('FECHA').AsDate := i; QGetDates.ExecSQL; end; QGetEmp.Next; end; {*** FIN ***} {*** LLENAMOS LAS ENTRADAS Y SALIDAS ***} while not QGetLogs.Eof do begin if QGetLogs.FieldByName('LOG_STATUS').AsInteger = 1 then begin QGetLogData.Close; QGetLogData.SQL.Clear; QGetLogData.SQL.Text := 'UPDATE ASISTENCIA SET AST_ENT = :ENT WHERE EMP_ID = :EMP AND AST_FECHA = :FECHA'; QGetLogData.ParamByName('ENT').Value := QGetLogs.FieldByName('LOG_TIME').Value; QGetLogData.ParamByName('EMP').Value := QGetLogs.FieldByName('EMP_ID').AsInteger; QGetLogData.ParamByName('FECHA').Value := QGetLogs.FieldByName('LOG_FECHA').Value; QGetLogData.ExecSQL; end else if QGetLogs.FieldByName('LOG_STATUS').AsInteger <> 1 then begin //Obtenemos el último registro de salida QGetRows.Close; QGetRows.SQL.Clear; QGetRows.SQL.Text := 'SELECT MAX(LOG_TIME) FROM LOG_ASISTENCIA WHERE EMP_ID = :EMP AND LOG_FECHA = :FECHA'; QGetRows.ParamByName('EMP').Value := QGetLogs.FieldByName('EMP_ID').AsInteger; QGetRows.ParamByName('FECHA').Value := QGetLogs.FieldByName('LOG_FECHA').Value; QGetRows.Open; //registramos las salidas QGetLogData.Close; QGetLogData.SQL.Clear; QGetLogData.SQL.Text := 'UPDATE ASISTENCIA SET AST_SAL = :SAL WHERE EMP_ID = :EMP AND AST_FECHA = :FECHA'; QGetLogData.ParamByName('SAL').Value := QGetRows.Fields[0].Value; QGetLogData.ParamByName('EMP').Value := QGetLogs.FieldByName('EMP_ID').AsInteger; QGetLogData.ParamByName('FECHA').Value := QGetLogs.FieldByName('LOG_FECHA').Value; QGetLogData.ExecSQL; end; QGetLogs.Next; end; {*** FIN ***} {*** CALCULAMOS LAS AUSENCIAS Y LOS QUE NO SALIERON ***} QGetRows.Close; QGetRows.SQL.Clear; QGetRows.SQL.Text := 'SELECT AST_ENT, AST_SAL FROM ASISTENCIA'; QGetRows.Open; while not QGetRows.Eof do begin if (QGetRows.Fields[0].IsNull) and (QGetRows.Fields[1].IsNull) then begin QGetLogUpdate.Close; QGetLogUpdate.SQL.Clear; QGetLogUpdate.SQL.Text := 'UPDATE ASISTENCIA SET CA_ID = 5 WHERE AST_ENT IS NULL AND AST_SAL IS NULL'; QGetLogUpdate.ExecSQL; end else if (QGetRows.Fields[0].Value <> null ) and (QGetRows.Fields[1].IsNull) then begin QGetLogUpdate.Close; QGetLogUpdate.SQL.Clear; QGetLogUpdate.SQL.Text := 'UPDATE ASISTENCIA SET CA_ID = 6 WHERE AST_ENT IS NOT NULL AND AST_SAL IS NULL'; QGetLogUpdate.ExecSQL; end; QGetRows.Next; end; {*** FIN ***} {*** GENERAMOS LOS EVENTOS PROGRAMADOS ***} //Obtenemos los empleados activos QGetEmp.Close; QGetEmp.SQL.Clear; QGetEmp.SQL.Text := 'SELECT * FROM EMPLEADOS WHERE EMP_STATUS = 3'; QGetEmp.Open; while not QGetEmp.Eof do begin e := QGetRows.FieldByName('EMP_ID').AsInteger; //Buscamos causas de este empleado QGetRows.Close; QGetRows.SQL.Clear; QGetRows.SQL.Text := 'SELECT EMP_ID, CA_ID, CA_DESDE, CA_HASTA FROM LOG_CAUSAS WHERE EMP_ID = :EMP'; QGetRows.ParamByName('EMP').Value := e; QGetRows.Open; if QGetRows.RecordCount > 0 then begin EventIni := QGetRows.Fields[2].AsDateTime; EventFin := QGetRows.Fields[3].AsDateTime; for j := Trunc(EventIni) to Trunc(EventFin) do begin QGetDates.Close; QGetDates.SQL.Clear; QGetDates.SQL.Text := 'SELECT * FROM ASISTENCIA WHERE EMP_ID = :EMP AND AST_FECHA = :FECHA'; QGetDates.ParamByName('EMP').Value := e; QGetDates.ParamByName('FECHA').Value := j; QGetDates.Open; if QGetDates.RecordCount > 0 then begin QGetLogUpdate.Close; QGetLogUpdate.SQL.Clear; QGetLogUpdate.SQL.Text := 'UPDATE ASISTENCIA SET CA_ID = :CA WHERE EMP_ID = :EMP AND AST_FECHA = :FECHA'; QGetLogUpdate.ParamByName('CA').Value := QGetDates.FieldByName('CA_ID').AsInteger; QGetLogUpdate.ParamByName('EMP').Value := e; QGetLogUpdate.ParamByName('fecha').Value := j; QGetLogUpdate.ExecSQL; end; end; end; QGetEmp.Next; end; {*** FIN ***} end; //primer if DM.ZData.Commit; end;
Éste es el error que me da:
delphi
--------------------------- Debugger Exception Notification --------------------------- Project TimerPunch.exe raised exception class EZSQLException with message 'SQL Error: deadlock update conflicts with concurrent update concurrent transaction number is 3231. Error Code: -913. deadlock The SQL: UPDATE ASISTENCIA SET AST_ENT = ? WHERE EMP_ID = ? AND AST_FECHA = ?; '. Process stopped. Use Step or Run to continue. --------------------------- OK Help ---------------------------
EL error me lo causa en el último bloque, así que no sé a que se debe. ¿Una manita?
