This repository has been archived on 2024-12-02. You can view files and clone it, but cannot push or open issues or pull requests.
FactuGES/Sincronizacion/SincronizarCalendario.pas
2007-06-26 08:08:27 +00:00

248 lines
6.7 KiB
ObjectPascal

unit SincronizarCalendario;
interface
uses
Classes, IBCustomDataSet, CETools, DB;
type
TSincCalendario = class(TComponent)
private
FCalendarioBD : TIBDataSet;
FCEApp : TCEAppointments;
FUltimaSincronizacion: TDateTime;
FListaID : TStringList;
function InsertarCitaBD: boolean;
function InsertarCitaPPC: boolean;
function ActualizarCitaBD: boolean;
function ActualizarCitaPPC: boolean;
procedure OnFilterIDNulo(DataSet: TDataSet; var Accept: Boolean);
procedure OnFilterIDNoNulo(DataSet: TDataSet; var Accept: Boolean);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Sincronizar;
published
property CalendarioBD : TIBDataSet read FCalendarioBD write FCalendarioBD;
property UltimaSincronizacion : TDateTime read FUltimaSincronizacion write FUltimaSincronizacion;
end;
implementation
uses
SysUtils, BaseDatos, TablaAgenda, DateUtils, Variants;
{ TSincCalendario }
function TSincCalendario.ActualizarCitaBD: boolean;
var
Visita: TDatosVisita;
begin
Result := False;
Visita := TDatosVisita.Create(FCalendarioBD.FieldByName('CODIGO').AsInteger);
try
Visita.Descripcion := FCEApp.Appointment.SUBJECT;
Visita.FechaIni := DateOf(FCEApp.Appointment.DATE);
Visita.HoraIni := TimeOf(FCEApp.Appointment.DATE);
Visita.FechaFin := IncMinute(FCEApp.Appointment.DATE, FCEApp.Appointment.LEN);
Visita.HoraFin := TimeOf(Visita.FechaFin);
Visita.FechaFin := DateOf(Visita.FechaFin);
Visita.EntryID := FCEApp.RecordID;
Visita.SalvarDatos;
finally
Visita.Free;
Visita := NIL;
end;
end;
function TSincCalendario.ActualizarCitaPPC: boolean;
var
Visita: TDatosVisita;
CEApp: TCEAppointmentRecord;
FechaAux : TDateTime;
begin
Result := False;
Visita := TDatosVisita.Create(FCalendarioBD.FieldByName('CODIGO').AsInteger);
FillChar(CEApp, SizeOf(TCEAppointmentRecord), 0);
try
CEApp := FCEApp.Appointment;
CEApp.SUBJECT := Visita.Descripcion;
CEApp.DATE := Visita.FechaIni;
ReplaceTime(CEApp.DATE, Visita.HoraIni);
FechaAux := Visita.FechaFin;
ReplaceTime(FechaAux, Visita.HoraFin);
CEApp.LEN := MinutesBetween(CEApp.DATE, FechaAux);
FCEApp.Appointment := CEApp;
FCEApp.Write;
finally
Visita.Free;
Visita := NIL;
end;
end;
constructor TSincCalendario.Create(AOwner: TComponent);
begin
inherited;
FCalendarioBD := NIL;
FUltimaSincronizacion := dmBaseDatos.DarFecha;
FCEApp := TCEAppointments.Create(Self);
FListaID := TStringList.Create;
end;
destructor TSincCalendario.Destroy;
begin
FCEApp.Free;
FCEApp := NIL;
FListaID.Free;
FListaID := NIL;
FCalendarioBD := NIL;
inherited;
end;
function TSincCalendario.InsertarCitaBD: boolean;
var
Visita: TDatosVisita;
begin
Result := False;
Visita := TDatosVisita.Create;
try
Visita.Usuario := dmBaseDatos.Usuario;
Visita.Descripcion := FCEApp.Appointment.SUBJECT;
Visita.FechaIni := DateOf(FCEApp.Appointment.DATE);
Visita.HoraIni := TimeOf(FCEApp.Appointment.DATE);
Visita.FechaFin := IncMinute(FCEApp.Appointment.DATE, FCEApp.Appointment.LEN);
Visita.HoraFin := TimeOf(Visita.FechaFin);
Visita.FechaFin := DateOf(Visita.FechaFin);
Visita.EntryID := FCEApp.RecordID;
Visita.SalvarDatos;
finally
Visita.Free;
Visita := NIL;
end;
end;
function TSincCalendario.InsertarCitaPPC: boolean;
var
Visita: TDatosVisita;
CEApp: TCEAppointmentRecord;
FechaAux : TDateTime;
begin
Result := False;
Visita := TDatosVisita.Create(FCalendarioBD.FieldByName('CODIGO').AsInteger);
FillChar(CEApp, SizeOf(TCEAppointmentRecord), 0);
try
CEApp.SUBJECT := Visita.Descripcion;
CEApp.DATE := Visita.FechaIni;
ReplaceTime(CEApp.DATE, Visita.HoraIni);
FechaAux := Visita.FechaFin;
ReplaceTime(FechaAux, Visita.HoraFin);
CEApp.LEN := MinutesBetween(CEApp.DATE, FechaAux);
CEApp.STATUS := APPSTATUS_BUSY;
FCEApp.Append;
FCEApp.Appointment := CEApp;
FCEApp.Write;
Visita.EntryID := FCEApp.RecordID;
Visita.SalvarDatos;
finally
Visita.Free;
Visita := NIL;
end;
end;
procedure TSincCalendario.OnFilterIDNoNulo(DataSet: TDataSet;
var Accept: Boolean);
begin
Accept := not VarIsNull(DataSet.FieldByName('ENTRYID').AsVariant);
end;
procedure TSincCalendario.OnFilterIDNulo(DataSet: TDataSet; var Accept: Boolean);
begin
Accept := VarIsNull(DataSet.FieldByName('ENTRYID').AsVariant);
end;
procedure TSincCalendario.Sincronizar;
var
Continuar : Boolean;
begin
if not Assigned(FCalendarioBD) then
raise Exception.Create('Falta indicar la tabla de BD');
try
FCalendarioBD.Open;
FCalendarioBD.First;
FCEApp.Open;
FCEApp.First;
Continuar := (FCEApp.NumRecords > 0);
while Continuar do
begin
FCEApp.Read;
if not FCalendarioBD.Locate('ENTRYID', FCEApp.RecordID, []) then
InsertarCitaBD
else begin
if (FCalendarioBD.FieldByName('BORRADO').AsString = CITA_BORRADA) then
begin
FCalendarioBD.Delete;
FCEApp.Delete;
end
else begin
if (FCEApp.LastModified > FUltimaSincronizacion) or
(FCalendarioBD.FieldByName('ULTIMOCAMBIO').AsDateTime > FUltimaSincronizacion) then
begin
if (FCEApp.LastModified > FCalendarioBD.FieldByName('ULTIMOCAMBIO').AsDateTime) then
ActualizarCitaBD
else
ActualizarCitaPPC;
end;
end;
end;
FListaID.Add(IntToStr(FCEApp.RecordID));
Continuar := FCEApp.Next;
end;
// Borrar de la BD las citas que se han borrado en el PPC
FCalendarioBD.Filtered := False;
FCalendarioBD.OnFilterRecord := OnFilterIDNoNulo;
FCalendarioBD.Filtered := True;
FCalendarioBD.First;
while not FCalendarioBD.EOF do
begin
if FListaID.IndexOf(FCalendarioBD.FieldByName('ENTRYID').AsString) = -1 then
FCalendarioBD.Delete
else
FCalendarioBD.Next;
end;
// Insertar en el PPC las citas nuevas
FCalendarioBD.Filtered := False;
FCalendarioBD.OnFilterRecord := OnFilterIDNulo;
FCalendarioBD.Filtered := True;
FCalendarioBD.First;
while not FCalendarioBD.EOF do
begin
if (FCalendarioBD.FieldByName('BORRADO').AsString = CITA_BORRADA) then
FCalendarioBD.Delete
else begin
InsertarCitaPPC;
FCalendarioBD.Next;
end;
end;
FCalendarioBD.Filtered := False;
FCalendarioBD.Filter := '';
finally
FCalendarioBD.Close;
FCalendarioBD.OnFilterRecord := NIL;
FCEApp.Close;
end;
end;
end.