unit fpartes_asistencia;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, Data.DB,
  ZAbstractRODataset, ZDataset, frxClass, frxDBSet, Vcl.Grids, Vcl.DBGrids,excel2000,comobj,
  Vcl.ExtDlgs, Vcl.DBCtrls;

type
  Tpartes_asistencia = class(TForm)
    fdesde: TDateTimePicker;
    fhasta: TDateTimePicker;
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    qpartesasistencia: TZReadOnlyQuery;
    informe: TfrxReport;
    partes: TfrxDBDataset;
    qpartesasistenciaide: TIntegerField;
    qpartesasistenciaidp: TIntegerField;
    qpartesasistenciaidg: TIntegerField;
    qpartesasistenciafecha: TDateField;
    qpartesasistenciaobservaciones: TWideStringField;
    qpartesasistenciahora_inicio: TTimeField;
    qpartesasistenciahora_fin: TTimeField;
    qpartesasistenciahoras: TFloatField;
    qpartesasistencianombre_completo: TWideStringField;
    qpartesasistencianombre: TWideStringField;
    dsqpartesasistencia: TDataSource;
    DBGrid1: TDBGrid;
    Button2: TButton;
    SaveDialog1: TSaveDialog;
    qpartesasistenciaasiste: TIntegerField;
    qempleados: TZReadOnlyQuery;
    dsqempleados: TDataSource;
    qempleadoside: TIntegerField;
    qempleadosid: TIntegerField;
    qempleadosnombre_completo: TWideStringField;
    DBLookupComboBox1: TDBLookupComboBox;
    Label3: TLabel;
    qpartesasistenciasemana: TIntegerField;
    qpartesasistenciaTURNO: TWideStringField;
    Button3: TButton;
    Button4: TButton;
    qfaltasasistencia: TZReadOnlyQuery;
    dsqfaltasasistencia: TDataSource;
    DBGrid2: TDBGrid;
    qfaltasasistenciaIDP: TIntegerField;
    qfaltasasistenciaEMPLEADO: TWideStringField;
    qfaltasasistenciaFECHA: TDateField;
    qfaltasasistenciaJUSTIFICADA: TIntegerField;
    qfaltasasistenciaMOTIVO: TWideStringField;
    qfaltasasistenciaSUSTITUTO: TWideStringField;
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
     procedure ExportaraExcel(FileNameXLS, SheetName: String; DBGrid: TDBGrid; ProgressBarXls: TProgressBar = nil);
  end;

var
  partes_asistencia: Tpartes_asistencia;

implementation

{$R *.dfm}

uses principal;

procedure Tpartes_asistencia.Button1Click(Sender: TObject);
var periodo,vempleado:string;

begin
    if qempleadosid.asinteger=-1 then vempleado:='%' else vempleado:=qempleadosid.asstring;

    qpartesasistencia.Close;
    qpartesasistencia.Prepare;
    qpartesasistencia.ParamByName('DESDE').AsDate:=fdesde.Date;
    qpartesasistencia.ParamByName('HASTA').AsDate:=fhasta.Date;
    qpartesasistencia.ParamByName('EMPLEADO').AsString:=vempleado;
    qpartesasistencia.Open;
    periodo:='Partes de asistencia desde el '+datetostr(fdesde.Date)+' hasta el '+datetostr(fhasta.Date);
//    informedb.DataSet:=qpartesasistencia;
//    informe.Report.Clear;
    partes.DataSet:=qpartesasistencia;
    informe.LoadFromFile('c:\formagest\informes\partes.fr3');
    informe.Variables.Variables['PERIODO']:=QUOTEDSTR(periodo);
//    informes.Report.FileName:=TMES.Text+' ' + qjornalestrabajador.asstring;
    informe.ShowReport();
    informe.Clear;
end;

procedure Tpartes_asistencia.Button2Click(Sender: TObject);
var archivo,vempleado:string;
begin
    if qempleadosid.asinteger=-1 then vempleado:='%' else vempleado:=qempleadosid.asstring;
    qpartesasistencia.Close;
    qpartesasistencia.Prepare;
    qpartesasistencia.ParamByName('DESDE').AsDate:=fdesde.Date;
    qpartesasistencia.ParamByName('HASTA').AsDate:=fhasta.Date;
    qpartesasistencia.ParamByName('EMPLEADO').AsString:=vempleado;
    qpartesasistencia.Open;
    savedialog1.FileName:='Partes de asistencia.xlsx';
    savedialog1.Execute();
    archivo:=savedialog1.FileName;
//    archivo:='c:\formagest\profesoresgrupo.xlsx';
    try
    Exportaraexcel(archivo,'PARTES DE ASISTENCIA',dbgrid1);
    finally
      showmessage('Los datos han sido exportados correctamente a '+archivo);
    end;

end;

procedure Tpartes_asistencia.Button3Click(Sender: TObject);
var periodo,vempleado:string;

begin
    if qempleadosid.asinteger=-1 then vempleado:='%' else vempleado:=qempleadosid.asstring;

    qfaltasasistencia.Close;
    qfaltasasistencia.Prepare;
    qfaltasasistencia.ParamByName('DESDE').AsDate:=fdesde.Date;
    qfaltasasistencia.ParamByName('HASTA').AsDate:=fhasta.Date;
    qfaltasasistencia.ParamByName('EMPLEADO').AsString:=vempleado;
    qfaltasasistencia.Open;
    periodo:='Faltas de asistencia desde el '+datetostr(fdesde.Date)+' hasta el '+datetostr(fhasta.Date);
    partes.DataSet:=qfaltasasistencia;
    //informe.DataSet:=qfaltasasistencia;
//    informe.Report.Clear;
    informe.LoadFromFile('c:\formagest\informes\faltasasistencia.fr3');
    informe.Variables.Variables['PERIODO']:=QUOTEDSTR(periodo);
//    informes.Report.FileName:=TMES.Text+' ' + qjornalestrabajador.asstring;
    informe.ShowReport();
    informe.Clear;
end;

procedure Tpartes_asistencia.Button4Click(Sender: TObject);
var archivo,vempleado:string;
begin
    if qempleadosid.asinteger=-1 then vempleado:='%' else vempleado:=qempleadosid.asstring;
    qfaltasasistencia.Close;
    qfaltasasistencia.Prepare;
    qfaltasasistencia.ParamByName('DESDE').AsDate:=fdesde.Date;
    qfaltasasistencia.ParamByName('HASTA').AsDate:=fhasta.Date;
    qfaltasasistencia.ParamByName('EMPLEADO').AsString:=vempleado;
    qfaltasasistencia.Open;
    savedialog1.FileName:='faltas de asistencia.xlsx';
    savedialog1.Execute();
    archivo:=savedialog1.FileName;
//    archivo:='c:\formagest\profesoresgrupo.xlsx';
    try
    Exportaraexcel(archivo,'faltas DE ASISTENCIA',dbgrid2);
    finally
      showmessage('Los datos han sido exportados correctamente a '+archivo);
    end;


end;

procedure Tpartes_asistencia.FormShow(Sender: TObject);
begin
    fdesde.Date:=date();
    fhasta.Date:=date();
    qempleados.Open;
end;
procedure Tpartes_asistencia.ExportaraExcel(FileNameXLS, SheetName: String; DBGrid: TDBGrid; ProgressBarXls: TProgressBar);

  procedure ProgressBarInit;
  begin
    ProgressBarXls.Max := DBGrid.DataSource.DataSet.RecordCount;
    ProgressBarXls.Position := 0;
    ProgressBarXls.Visible := True;
  end;

const
  xlWBATworksheet = -4167;
var
  Excel, WorkBook, WorkSheet: OleVariant;
  I, J: Integer;
  PBookmark: TBookmark;
begin
  // Guardar la posición en la DB y desactivar que se mueva el registro
  PBookmark := DBGrid.DataSource.DataSet.GetBookmark;
  DBGrid.DataSource.DataSet.DisableControls;
  DBGrid.DataSource.DataSet.First;

  // Comprobar si existe el component TProgressBar
  if (ProgressBarXls <> nil) then
    ProgressBarInit;

  // Crear instancia de la aplicación Excel
  Excel := CreateOleObject('Excel.Application');

  // Evitar que nos pregunte si deseamos sobreescribir el archivo
  Excel.DisplayAlerts := False;

  // Agregar libro de trabajo
  WorkBook := Excel.Workbooks.Add(xlWBATWorksheet);

  // Tomar una referencia a la hoja creada
  WorkSheet := WorkBook.WorkSheets[1];

  // Se  describe el nombre de la hoja
  WorkSheet.Name := SheetName;

  // Llenamos las celdas
  //    Toma en cuenta que las columnas y filas empiezan en 1, y que en el
  // WorkSheet.Cells[I, J], I es la fila y J es la columna.

  //   Extrae los nombres de los campos del DBGrid y los coloca en el primer registro,
  // excluyendo los campos que están ocultos
  for J := 0 to DBGrid.FieldCount -1 do
    if DBGrid.Fields[J].Visible then
    begin
      // Poner la fuente de letra en Negrita
      WorkSheet.Cells[1, J +1].Font.Bold := True;
      // Centrar la celda
//      WorkSheet.Cells[1, J +1].HorizontalAlignment := xlCenter;
      // Asignamos Valor del titulo del DBrid
      WorkSheet.Cells[1, J +1] := DBGrid.Columns[J].Title.Caption;
    end;

  // Guardar los registros
  for I := 0 to DBGrid.DataSource.DataSet.RecordCount -1 do
  begin
    // Identificamos los campos y lo grabamos según su tipo
    for J := 0 to DBGrid.FieldCount -1 do
      case DBGrid.Fields[J].DataType of
        ftAutoInc, ftBytes, ftInteger, ftSmallint, ftWord: // Auto o Numérico
          WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsInteger;
        ftBCD, ftFloat, ftCurrency: // Numérico con decimales
          WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsFloat;
        ftDateTime, ftDate, ftTime: // Fecha y Hora
          WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsDateTime;
        else // Todo lo demas caracteres
          WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsString;
      end;

    // Saltamos de registro
    DBGrid.DataSource.DataSet.Next;

    // Comprobar si existe el component TProgressBar
    if (ProgressBarXls <> nil) then
      ProgressBarXls.Position := ProgressBarXls.Position +1;
  end;

  // Comprobar si existe el component TProgressBar
  if (ProgressBarXls <> nil) then
    ProgressBarXls.Visible := False;

  // Redimensionar todas las celdas para que esten según su tamaño
  WorkSheet.Cells.Columns.AutoFit;

  // Guardar el archivo
  WorkBook.SaveAs(FileNameXLS);

  // Cierra el archivo
  WorkBook.Close(FileNameXLS);

  // Salir de Excel
  Excel.Quit;

  // posicionar el registro donde estaba
  DBGrid.DataSource.DataSet.GotoBookmark(PBookmark);
  DBGrid.DataSource.DataSet.FreeBookmark(PBookmark);
  DBGrid.DataSource.DataSet.EnableControls;
end;

end.
