Buenos días.
Quiero compartir una pequeña aplicación que he realizado para hacer un backups a una bd y exportarlo a excel, ya que muchos en sentido general hemos querido hacer esto de alguna forma y no lo hemos logrado.
Esto es un aporte que quiero dar a esta comunidad.
Nota: el programa funciona a la perfección, pero lo pueden usar para mejorarlo, ya que solamente he hecho que el programa me exporte a excel todo lo que tiene una bd en especifico, en este caso una bd de sql server.
Adjunto una imagen de los formularios que necesito.
Aquí vemos que hay dos form, el form principal se llama "form1" y el 2 se llama "Form_esperar".
El Form_esperar tiene un progressbar el cual lo utilizaremos para que valla llenándose al elegir todos los registros que contiene una tabla.
En el form1 hay varias cosas:
- 1 - TExcelApplication
- 1 - Adoconecction
- 4 - Adoquery
- 3 - Dbgrid
- 2 - Botones
- 6 - Labels
Pasos para crear esta app explicado en detalle:
Primero creé mi conección en modo de diseño y activé el adoconecction.
Luego procedí a crear un procedimiento llamado "calcularlacantidadderegistros();" para que automaticamente al cambiar de tabla, este me busque todos los registros que tiene esa tabla, así como tambien los campos que contiene la misma.
Código Delphi
[-]
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
TabControl2: TTabControl;
Panel2: TPanel;
btnExportaraexcel: TBitBtn;
BitBtn2: TBitBtn;
Excel: TExcelApplication;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Label5: TLabel;
Label_cant_registros: TLabel;
query_tablas_bd: TADOQuery;
query_campos_tabla_bd: TADOQuery;
query_info_tablas_bd: TADOQuery;
DBGrid2: TDBGrid;
DBGrid3: TDBGrid;
DataSource2: TDataSource;
DataSource3: TDataSource;
Label19: TLabel;
query_cant_registros: TADOQuery;
Label1: TLabel;
Label_cant_registros_campos: TLabel;
Label6: TLabel;
Label_cant_registros_registros: TLabel;
procedure btnExportaraexcelClick(Sender: TObject);
procedure calcularlacantidadderegistros();
private
public
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.calcularlacantidadderegistros();
begin
query_campos_tabla_bd.SQL.Clear;
query_campos_tabla_bd.SQL.Text:= 'SELECT TABLE_CATALOG, TABLE_NAME, COLUMN_NAME FROM AuditoriaDB.INFORMATION_SCHEMA.COLUMNS where TABLE_NAME= :tabla ORDER BY TABLE_NAME asc';
query_campos_tabla_bd.Parameters.ParamByName('tabla').Value := query_tablas_bd.Fieldbyname('TABLE_NAME').Asstring;
query_campos_tabla_bd.Open;
query_info_tablas_bd.SQL.Clear;
query_info_tablas_bd.SQL.Text:= 'select * from ' + query_tablas_bd.Fieldbyname('TABLE_NAME').Asstring;
query_info_tablas_bd.open;
query_cant_registros.Close;
query_cant_registros.SQL.Clear;
query_cant_registros.SQL.Text := 'select count(*) as count from INFORMATION_SCHEMA.TABLES';
query_cant_registros.open;
Label_cant_registros.Caption := query_cant_registros.Fieldbyname('count').Asstring;
query_cant_registros.SQL.Clear;
query_cant_registros.SQL.Text:= 'SELECT count(COLUMN_NAME) as count FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME= :tabla';
query_cant_registros.Parameters.ParamByName('tabla').Value := query_tablas_bd.Fieldbyname('TABLE_NAME').Asstring;
query_cant_registros.Open;
Label_cant_registros_campos.Caption := query_cant_registros.Fieldbyname('count').Asstring;
query_cant_registros.SQL.Clear;
query_cant_registros.SQL.Text:= 'select count(*) as count from ' + query_tablas_bd.Fieldbyname('TABLE_NAME').Asstring;
query_cant_registros.open;
Label_cant_registros_registros.Caption := query_cant_registros.Fieldbyname('count').Asstring;
end;
El primer dbGrid están todas las tablas de la base de datos.
El segundo contiene todas las columnas.
El tercero contiene todos los registros de esa tabla en especifico.
En este sentido los query los llamé de la seguiente manera:
1) query_cant_registros: para que me cuente las tablas, los campos y todos los registros de esa tabla.
2) query_tablas_bd: que me obtiene todas las tablas de mi base de datos de SQL Server.
3) query_campos_tabla_bd: contiene todos los campos que compone una tabla en especifico.
4) query_info_tablas_bd: contiene todos los registros que tiene la tabla seleccionada.
Adjunto el código completo del form1.
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, OleServer, ExcelXP, StdCtrls, Buttons,
ComCtrls, ExtCtrls, ADODB;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
TabControl2: TTabControl;
Panel2: TPanel;
btnExportaraexcel: TBitBtn;
BitBtn2: TBitBtn;
Excel: TExcelApplication;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Label5: TLabel;
Label_cant_registros: TLabel;
query_tablas_bd: TADOQuery;
query_campos_tabla_bd: TADOQuery;
query_info_tablas_bd: TADOQuery;
DBGrid2: TDBGrid;
DBGrid3: TDBGrid;
DataSource2: TDataSource;
DataSource3: TDataSource;
Label19: TLabel;
query_cant_registros: TADOQuery;
Label1: TLabel;
Label_cant_registros_campos: TLabel;
Label6: TLabel;
Label_cant_registros_registros: TLabel;
procedure btnExportaraexcelClick(Sender: TObject);
procedure calcularlacantidadderegistros();
private
public
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.calcularlacantidadderegistros();
begin
query_campos_tabla_bd.SQL.Clear;
query_campos_tabla_bd.SQL.Text:= 'SELECT TABLE_CATALOG, TABLE_NAME, COLUMN_NAME FROM AuditoriaDB.INFORMATION_SCHEMA.COLUMNS where TABLE_NAME= :tabla ORDER BY TABLE_NAME asc';
query_campos_tabla_bd.Parameters.ParamByName('tabla').Value := query_tablas_bd.Fieldbyname('TABLE_NAME').Asstring;
query_campos_tabla_bd.Open;
query_info_tablas_bd.SQL.Clear;
query_info_tablas_bd.SQL.Text:= 'select * from ' + query_tablas_bd.Fieldbyname('TABLE_NAME').Asstring;
query_info_tablas_bd.open;
query_cant_registros.Close;
query_cant_registros.SQL.Clear;
query_cant_registros.SQL.Text := 'select count(*) as count from INFORMATION_SCHEMA.TABLES';
query_cant_registros.open;
Label_cant_registros.Caption := query_cant_registros.Fieldbyname('count').Asstring;
query_cant_registros.SQL.Clear;
query_cant_registros.SQL.Text:= 'SELECT count(COLUMN_NAME) as count FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME= :tabla';
query_cant_registros.Parameters.ParamByName('tabla').Value := query_tablas_bd.Fieldbyname('TABLE_NAME').Asstring;
query_cant_registros.Open;
Label_cant_registros_campos.Caption := query_cant_registros.Fieldbyname('count').Asstring;
query_cant_registros.SQL.Clear;
query_cant_registros.SQL.Text:= 'select count(*) as count from ' + query_tablas_bd.Fieldbyname('TABLE_NAME').Asstring;
query_cant_registros.open;
Label_cant_registros_registros.Caption := query_cant_registros.Fieldbyname('count').Asstring;
end;
procedure TForm1.btnExportaraexcelClick(Sender: TObject);
var
Libro: _WORKBOOK;
cantidad_tablas, numerohoja, columna, fila:integer;
Hoja: Array[1..1000] of _WORKSHEET;
begin
query_tablas_bd.Open;
calcularlacantidadderegistros();
numerohoja:=0;
Excel.connect;
Libro:= Excel.workbooks.add(EmptyParam,0);
Hoja[numerohoja]:= Excel.sheets[Libro.Sheets.Count] as _WORKSHEET;
Libro.Sheets.Add(NULL, Hoja[numerohoja], strtoint(Label_cant_registros.Caption) - 3 ,NULL,0);
with query_tablas_bd do
begin
first; calcularlacantidadderegistros();
while not EOF Do
begin
numerohoja:=numerohoja+1;
Hoja[numerohoja]:= Excel.sheets[numerohoja] as _WORKSHEET;
Hoja[numerohoja].Name:=query_tablas_bd.Fieldbyname('TABLE_NAME').Asstring;
columna:=0;
fila:=1;
query_campos_tabla_bd.First;
while not query_campos_tabla_bd.Eof do
begin
columna:=columna+1;
Hoja[numerohoja].Cells.Item[fila,columna]:=query_campos_tabla_bd.Fieldbyname('COLUMN_NAME').Asstring;
query_campos_tabla_bd.Next;
end;
Form_esperar.show;
Form_esperar.ProgressBar1.Max := strtoint(Label_cant_registros_registros.Caption);
Form_esperar.ProgressBar1.Position:= 0;
query_info_tablas_bd.First;
while not query_info_tablas_bd.Eof do
begin
fila:=fila+1;
columna:=0;
for columna:= 0 to strtoint(Label_cant_registros_campos.Caption)-1 do
begin
Hoja[numerohoja].Cells.Item[fila,columna+1]:=DBGrid3.Fields[columna].AsString;
end;
query_info_tablas_bd.Next;
Form_esperar.ProgressBar1.Position:= Form_esperar.ProgressBar1.Position+1;
end;
Next; calcularlacantidadderegistros();
Form_esperar.Close;
end;end;
Excel.visible[0]:=true;
ShowMessage('Exportado con exito!');
Excel.disconnect;
end;
end.
Aquí está el programa en funcionamiento:
Adjunto agregué el proyecto.
Espero les sea util como a mi.
Y Cualquier comentario me escriben porque lo que mas deseo es seguir aprendiendo.
Saludos.