unit ESTSESIONES;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.CheckLst, Vcl.Grids,
  Vcl.DBGrids, Vcl.ExtCtrls, Data.DB, ZAbstractRODataset, ZDataset,datos,principal,
  ZAbstractDataset,excel2000,Vcl.ComCtrls, Vcl.ImgList, frxExportCSV, frxClass, frxExportPDF, frxDBSet,
  Vcl.DBCtrls,comobj, frxExportBaseDialog;

type
  TFESTSESIONES = class(TForm)
    Panel2: TPanel;
    dsqprofesores: TDataSource;
    qprofesores: TZQuery;
    qprofesoresnombre: TWideStringField;
    qprofesoresactivo: TIntegerField;
    qprofesoresseleccionado: TIntegerField;
    qprofesoreside: TIntegerField;
    qprofesoresid: TIntegerField;
    Panel1: TPanel;
    DBGrid2: TDBGrid;
    fdesde: TDateTimePicker;
    fhasta: TDateTimePicker;
    Panel3: TPanel;
    Panel4: TPanel;
    Button2: TButton;
    DBGrid1: TDBGrid;
    Label1: TLabel;
    Label2: TLabel;
    dsqdatos: TDataSource;
    qdatos: TZReadOnlyQuery;
    qaux: TZQuery;
    qdatosnomprofesor: TWideStringField;
    qdatosnomgrupo: TWideStringField;
    qdatosfecha: TDateField;
    qdatoshora_inicio: TTimeField;
    qdatoshora_fin: TTimeField;
    qdatoshoras: TFloatField;
    btimprimir: TButton;
    todosprofesores: TCheckBox;
    informedb: TfrxDBDataset;
    frxPDFExport1: TfrxPDFExport;
    informe: TfrxReport;
    SaveDialog1: TSaveDialog;
    procedure Button2Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure DBGrid2DblClick(Sender: TObject);
    procedure dsqprofesoresDataChange(Sender: TObject; Field: TField);
    procedure fdesdeChange(Sender: TObject);
    procedure DBGrid2DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure btimprimirClick(Sender: TObject);
    procedure todosprofesoresClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure ExportaraExcel(FileNameXLS, SheetName: String; DBGrid: TDBGrid; ProgressBarXls: TProgressBar = nil);

  end;

var
  FESTSESIONES: TFESTSESIONES;

implementation

{$R *.dfm}
procedure TFESTSESIONES.DBGrid2DblClick(Sender: TObject);
var idp:integer;
begin
    idp:=qprofesoresid.Asinteger;
    qprofesores.Edit;
    if qprofesoresseleccionado.AsInteger=0 then
    begin
    qprofesoresseleccionado.Value:=1;
    end else     qprofesoresseleccionado.Value:=0;
    qprofesores.Post;
    qprofesores.Refresh;
    qprofesores.Locate('id',idp,[locaseinsensitive,lopartialkey]);
end;

procedure TFESTSESIONES.DBGrid2DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
    if qprofesoresseleccionado.Asinteger=1 then
    begin
        DBGrid2.Canvas.brush.Color := verde;
    end;
    DBGrid2.DefaultDrawColumnCell(Rect, DataCol, Column, State);

end;

procedure TFESTSESIONES.dsqprofesoresDataChange(Sender: TObject; Field: TField);
begin
    qdatos.Refresh;
end;

procedure TFESTSESIONES.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;

procedure TFESTSESIONES.fdesdeChange(Sender: TObject);
var anyo,mes,dia:word;
    desde,hasta:string;
begin
   decodedate(fdesde.Date,anyo,mes,dia);
   desde:=''''+inttostr(anyo)+'/'+inttostr(mes)+'/'+inttostr(dia)+'''';
   decodedate(fhasta.Date,anyo,mes,dia);
   hasta:=''''+inttostr(anyo)+'/'+inttostr(mes)+'/'+inttostr(dia)+'''';
   qdatos.Close;
   qdatos.SQL.Clear;
   qdatos.SQL.Add('select e.nombre_completo as nomprofesor,g.nombre as nomgrupo,s.fecha,s.hora_inicio,s.hora_fin,s.horas from sesiones s,empleados e,grupos g where e.ide=s.ide and s.idp=e.id and s.ide=g.ide and s.idg=g.id and e.seleccionado=1 ');
   qdatos.SQL.Add(' and fecha>='+desde+' and fecha <='+hasta);
   qdatos.SQL.Add(' order by nomprofesor,fecha,horainicio');
   qdatos.Open;
end;

procedure TFESTSESIONES.FormShow(Sender: TObject);
var anyo,mes,dia:word;
    desde,hasta:string;
begin
   decodedate(fdesde.Date,anyo,mes,dia);
   desde:=''''+inttostr(anyo)+'/'+inttostr(mes)+'/'+inttostr(dia)+'''';
   decodedate(fhasta.Date,anyo,mes,dia);
   hasta:=''''+inttostr(anyo)+'/'+inttostr(mes)+'/'+inttostr(dia)+'''';
    qaux.SQL.Clear;
    qaux.SQL.Add('update empleados set seleccionado=0');
    qaux.ExecSQL;
    qdatos.Close;
    qdatos.SQL.Clear;
    qdatos.SQL.Add('select e.nombre_completo as nomprofesor,g.nombre as nomgrupo,s.fecha,s.hora_inicio,s.hora_fin,s.horas from sesiones s,empleados e,grupos g where e.ide=s.ide and s.idp=e.id and s.ide=g.ide and s.idg=g.id and e.seleccionado=1 ');
    qdatos.SQL.Add(' and fecha>='+desde+' and fecha <='+hasta);
    qdatos.SQL.Add(' order by nomprofesor,fecha,horainicio');
    qdatos.Open;
    qprofesores.Open;
    fdesde.Date:=date;
    fhasta.Date:=date;
end;

procedure TFESTSESIONES.todosprofesoresClick(Sender: TObject);
begin

    qaux.SQL.Clear;
    if todosprofesores.Checked then     qaux.SQL.Add('update empleados set seleccionado=1')
         else qaux.SQL.Add('update empleados set seleccionado=0');
    qaux.ExecSQL;
    qprofesores.Refresh;
end;

procedure TFESTSESIONES.btimprimirClick(Sender: TObject);
begin


    informedb.Datasource:=dsqdatos;
    informe.Report.Clear;
    informe.LoadFromFile('c:\formagest\informes\sesionesprofesor.fr3');

//    informes.Report.FileName:=TMES.Text+' ' + qjornalestrabajador.asstring;
    informe.PrintOptions.Printer:=tprinter2;
    informe.ShowReport();
    informe.Clear;

end;

procedure TFESTSESIONES.Button2Click(Sender: TObject);
var  archivo:string;
begin
    savedialog1.FileName:='SesionesProfesores.xlsx';
    savedialog1.Execute();
    archivo:=savedialog1.FileName;
//    archivo:='c:\formagest\profesoresgrupo.xlsx';

    try
    Exportaraexcel(archivo,'SESIONESPROFESOR',DBGRID1);
    finally
      showmessage('Los datos han sido exportados correctamente a '+archivo);
    end;
end;

end.
