unit ESTGRUPOS;

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;

type
  TFESTGRUPOS = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    DBGrid23: TDBGrid;
    Button2: TButton;
    DBGrid1: TDBGrid;
    dsqdatos: TDataSource;
    qdatos: TZReadOnlyQuery;
    dsqgrupos: TDataSource;
    qgrupos: TZQuery;
    qgruposnombre: TWideStringField;
    qgruposactivo: TIntegerField;
    qgruposseleccionado: TIntegerField;
    DBGrid2: TDBGrid;
    dsqprofesores: TDataSource;
    qprofesores: TZQuery;
    qprofesoresnombre: TWideStringField;
    qprofesoresactivo: TIntegerField;
    qprofesoresseleccionado: TIntegerField;
    qprofesoreside: TIntegerField;
    qprofesoresid: TIntegerField;
    qgruposide: TIntegerField;
    qgruposid: TIntegerField;
    qdatoscurso: TWideStringField;
    qdatosnomprofesor: TWideStringField;
    qdatosnomgrupo: TWideStringField;
    qdatosdias: TWideStringField;
    qdatoshorainicio: TTimeField;
    qdatoshorafin: TTimeField;
    qdatosplazas: TIntegerField;
    qdatosplazas_libres: TIntegerField;
    qdatosplazas_ocupadas: TIntegerField;
    qdatospreciomensual: TFloatField;
    qdatoshorassemanales: TIntegerField;
    qalumnos: TZReadOnlyQuery;
    dsqalumnos: TDataSource;
    Panel4: TPanel;
    Button1: TButton;
    DBGrid3: TDBGrid;
    qalumnoscurso: TWideStringField;
    qalumnosnomprofesor: TWideStringField;
    qalumnosnomgrupo: TWideStringField;
    qalumnosnomalumno: TWideStringField;
    qalumnosfechabaja: TDateField;
    Panel5: TPanel;
    todosprofesores: TCheckBox;
    todosgrupos: TCheckBox;
    qaux: TZQuery;
    SaveDialog1: TSaveDialog;
    qalumnosdireccion: TWideStringField;
    qalumnospoblacion: TWideStringField;
    qalumnoscod_post: TWideStringField;
    qalumnosprovincia: TWideStringField;
    Button3: TButton;
    listaimpresion: TComboBox;
    informedb: TfrxDBDataset;
    informes: TfrxReport;
    qalumnosida: TIntegerField;
    qalumnosinf: TZReadOnlyQuery;
    WideStringField1: TWideStringField;
    WideStringField2: TWideStringField;
    WideStringField3: TWideStringField;
    WideStringField4: TWideStringField;
    DateField1: TDateField;
    WideStringField5: TWideStringField;
    WideStringField6: TWideStringField;
    WideStringField7: TWideStringField;
    WideStringField8: TWideStringField;
    IntegerField1: TIntegerField;
    dsqalumnosinf: TDataSource;
    infgrupos: TfrxDBDataset;
    procedure DBGrid2DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure DBGrid2DblClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure dsqprofesoresDataChange(Sender: TObject; Field: TField);
    procedure DBGrid23DblClick(Sender: TObject);
    procedure DBGrid23DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure dsqgruposDataChange(Sender: TObject; Field: TField);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure todosprofesoresClick(Sender: TObject);
    procedure todosgruposClick(Sender: TObject);
    procedure i(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }

//    procedure AppMessage(var Msg: Tmsg; var Handled:Boolean);
    procedure ExportaraExcel(FileNameXLS, SheetName: String; DBGrid: TDBGrid; ProgressBarXls: TProgressBar = nil);

  end;

var
  FESTGRUPOS: TFESTGRUPOS;

implementation

{$R *.dfm}
procedure TFESTGRUPOS.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 TFESTGRUPOS.Button1Click(Sender: TObject);
var  archivo:string;
begin
    savedialog1.FileName:='AlumnosGrupos.xlsx';
    savedialog1.Execute();
    archivo:=savedialog1.FileName;
    try
    Exportaraexcel(archivo,'ALUMNOSGRUPO',DBGRID3);
    finally
      showmessage('Los datos han sido exportados correctamente a '+archivo);
    end;
end;

procedure TFESTGRUPOS.Button2Click(Sender: TObject);
var  archivo:string;
begin
    savedialog1.FileName:='ProfesoresGrupos.xlsx';
    savedialog1.Execute();
    archivo:=savedialog1.FileName;
//    archivo:='c:\formagest\profesoresgrupo.xlsx';
    try
    Exportaraexcel(archivo,'PROFESORESGRUPO',DBGRID1);
    finally
      showmessage('Los datos han sido exportados correctamente a '+archivo);
    end;
end;

procedure TFESTGRUPOS.i(Sender: TObject);
var i:integer;
begin
    qalumnosinf.Close;
    qaux.close;
    qaux.SQL.Clear;
    qaux.SQL.Add('update alumnos set seleccionado=0 where seleccionado=1');
    qaux.Execsql;
    qaux.close;
    qaux.SQL.Clear;
    qaux.SQL.Add('update alumnos set seleccionado=1 where id=:ID');
    qaux.Prepare;
    if dbgrid3.SelectedRows.Count>0 then
      for i := 0 to dbgrid3.Selectedrows.Count - 1 do
      begin
        qalumnos.GotoBookmark ((dbgrid3.selectedrows[i]));
        qaux.ParamByName('ID').AsInteger:=qalumnosida.asinteger;
        qaux.Execsql;
      end
    else
    begin
      qalumnos.First;
      while not qalumnos.Eof do
      begin
        qaux.ParamByName('ID').AsInteger:=qalumnosida.asinteger;
        qaux.Execsql;
        qalumnos.Next;
      end
    end;
    qalumnosinf.open;

    case listaimpresion.ItemIndex of
        0:begin
            informedb.Datasource:=dsqalumnosinf;
            informes.Report.Clear;
            informes.LoadFromFile('c:\formagest\informes\tarjeta_libros.fr3');
            informes.ShowReport();
;

        end;
        1:begin
            informedb.Datasource:=dsqalumnosinf;
            informes.Report.Clear;
            informes.LoadFromFile('c:\formagest\informes\tarjeta3.fr3');
            informes.ShowReport();
        end;
        2:begin
            qgrupos.Filtered:=false;
            qgrupos.Filter:='seleccionado=1';
            qgrupos.filtered:=true;
            infgrupos.DataSource:=dsqgrupos;
            informedb.Datasource:=dsqalumnosinf;
            informes.Report.Clear;
            informes.LoadFromFile('c:\formagest\informes\calificaciones.fr3');
            informes.PrintOptions.Printer:=tprinter2;
            informes.ShowReport();
            informes.Clear;
            qgrupos.Filtered:=false;

        end;



    end;
    qaux.close;
    qaux.SQL.Clear;
    qaux.SQL.Add('update alumnos set seleccionado=0 where seleccionado=1');
    qaux.Execsql
end;

procedure TFESTGRUPOS.DBGrid23DblClick(Sender: TObject);
var idg:integer;
begin
    idg:=qgruposid.Asinteger;
    qgrupos.Edit;
    if qgruposseleccionado.AsInteger=0 then
    begin
    qgruposseleccionado.Value:=1;
    end else     qgruposseleccionado.Value:=0;
    qgrupos.Post;
    qgrupos.Refresh;
    qgrupos.Locate('id',idg,[locaseinsensitive,lopartialkey]);


end;

procedure TFESTGRUPOS.DBGrid23DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
    if qgruposseleccionado.Asinteger=1 then
    begin
        DBGrid23.Canvas.brush.Color := verde;
    end;
    DBGrid23.DefaultDrawColumnCell(Rect, DataCol, Column, State);

end;

procedure TFESTGRUPOS.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 TFESTGRUPOS.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 TFESTGRUPOS.dsqgruposDataChange(Sender: TObject; Field: TField);
begin
   qdatos.Refresh;
   qalumnos.Refresh;

end;

procedure TFESTGRUPOS.dsqprofesoresDataChange(Sender: TObject; Field: TField);
begin
    qgrupos.SQL.Clear;
    qgrupos.SQL.Add('select ide,id,nombre,activo, seleccionado from grupos where activo=1 and id in');
    qgrupos.SQL.Add('(select idg from impartir where idp in (select id from empleados where seleccionado=1 and activo=1)) order by nombre');
    qgrupos.Open;
end;

procedure TFESTGRUPOS.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    qprofesores.close;
    qgrupos.close;
    qdatos.close;
    qalumnos.open;


end;

procedure TFESTGRUPOS.FormShow(Sender: TObject);
begin
    qaux.SQL.Clear;
    qaux.SQL.Add('update grupos set seleccionado=0 where seleccionado=1 and activo=1');
    qaux.ExecSQL;
    qaux.SQL.Clear;
    qaux.SQL.Add('update empleados set seleccionado=0 where seleccionado=1 and activo=1');
    qaux.ExecSQL;

    qdatos.Open;
    qalumnos.Open;
    qgrupos.Open;
    qprofesores.Open;
end;

procedure TFESTGRUPOS.todosgruposClick(Sender: TObject);
begin
    qaux.SQL.Clear;
    if todosgrupos.Checked then     qaux.SQL.Add('update grupos set seleccionado=1')
         else qaux.SQL.Add('update grupos set seleccionado=0');
    qaux.ExecSQL;
    qprofesores.Close;
    qprofesores.Open;
end;

procedure TFESTGRUPOS.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;

end.
