unit SQLRepo;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  DBTables, Db, Grids, DBGrids, StdCtrls, Buttons, ExtCtrls,Checa,Printers,Dialogos;

type
  TFormaSQL = class(TForm)
    Codigo: TMemo;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    Query1: TQuery;
    Label1: TLabel;
    Label2: TLabel;
    Panel3: TPanel;
    Bevel20: TBevel;
    Bevel21: TBevel;
    Bevel22: TBevel;
    Label10: TLabel;
    Label11: TLabel;
    Panel4: TPanel;
    Shape1: TShape;
    TablaFiltros: TStringGrid;
    NombreTabla: TComboBox;
    Label3: TLabel;
    Bevel1: TBevel;
    Bevel2: TBevel;
    Bevel3: TBevel;
    Imprimir: TPrintDialog;
    BitBtn4: TBitBtn;
    DialogoGuarda: TSaveDialog;
    BotonAnterior: TSpeedButton;
    BotonSiguiente: TSpeedButton;
    procedure BitBtn1Click(Sender: TObject);
    procedure Label11MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Panel4Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure NombreTablaChange(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure TablaFiltrosDblClick(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn4Click(Sender: TObject);
    procedure BotonAnteriorClick(Sender: TObject);
    procedure BotonSiguienteClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormaSQL: TFormaSQL;
  factorancho,factorlargo,cuenta:integer;
  encabezado:Array[0..35] of String;
implementation

{$R *.DFM}
procedure PaginaAvance(direccion:Char);
var
actual:longint;
begin

With FormaSQL do
begin
actual:=Query1.RecNo;
case direccion of

'+':begin
    Query1.MoveBy(50);
    end;

'-':begin
    Query1.MoveBy(-50);

    end;
end;

    if Query1.EOF then
    BotonSiguiente.Enabled:=False
    else
    BotonSiguiente.Enabled:=True;

   if Query1.BOF then
   BotonAnterior.Enabled:=False
   else
   BotonAnterior.Enabled:=True;;


end;

end;

{***procedimientos para exportar*****}
procedure AsciiDelimitado(DetaImpr:TDBGrid;Archivo:string);
var
archi:TextFile;
aux:string;
i:integer;
begin

FormaSQL.Query1.First;
AssignFile(archi,Archivo);
Rewrite(archi);

while not FormaSQL.Query1.Eof do
begin
aux:='';
for i:=0 to FormaSQL.Query1.FieldCount-1 do
begin
aux:=aux+FormaSQL.Query1.Fields[i].AsString+Char(9);
end;
{MuestraMensaje(aux);}
writeln(archi,aux);
FormaSQL.Query1.Next;

end;

CloseFile(archi)
{*****findel procedure*****}

end;



{****************************************}

procedure ActualizaEncabezados(DetaImpr:TDBGrid);
var
anchocolumna,numecampos,i,k,linea,paginasxancho,numerodepagina:integer;
tamoletra,sumaancho,ultimo,anchopagina,maximodelineas,ultimapagina:integer;
limites:Array[1..15] of integer;
rec:TRect;

begin
numecampos:=DetaImpr.FieldCount;
for i:=0 to numecampos-1 do
begin
DetaImpr.Columns.Items[i].Title.Caption:=encabezado[i];
{DetaImpr.Columns.Items[i].DisplayName:=DetaImpr.Columns.Items[i].DisplayName+encabezado[i];}
{ShowMessage(encabezado[i]);}
end;

end;



function CalculaAncho:integer;
begin
if Printer.Orientation=poPortrait then
CalculaAncho:=110
else
Calculaancho:=150;


end;


function CalculaNumeroPaginas(campos:longint):integer;
var
pag:integer;
begin

if CalculaAncho=110 then
begin
Pag:=Trunc(campos/50);
if  campos Mod 50 <>0 then
Pag:=Pag+1;

end
else
begin
Pag:=Trunc(campos/38);
if  campos Mod 38 <>0 then
Pag:=Pag+1;

end;

CalculaNumeroPaginas:=Pag;

end;



procedure DibujaCelda(inicio,linea,ancho,tamoletra:integer;texto:string;relleno,colorletra:TColor;nombreletra:string;tipo:TFieldType);
var
rec:TRect;
alfa:integer;
num:Real;
codigo:integer;
begin
rec.Left:=inicio*factorancho;
rec.Top:=10+(tamoletra*factorlargo);
rec.Right:=(inicio+ancho)*factorancho;
rec.Bottom:=10+factorlargo+(tamoletra*factorlargo);
{Printer.Canvas.Brush.Style:=bsDiagCross;}

{****parametros de cuadro y texto para impresion*****}
{Printer.Canvas.Brush.Color:=clYellow;}
Printer.Canvas.Pen.Width:=2;
Printer.Canvas.Font.Color:=colorletra;
Printer.Canvas.Font.Size:=tamoletra;
Printer.Canvas.Font.Name:=nombreletra;
{****terminan los parametros de impresion********}

{******calcula el ajuste para fflotantes*****}
alfa:=0;
if (tipo=ftFloat)or(tipo=ftCurrency) then
begin
val(texto,num,codigo);
if codigo=0 then
begin
alfa:=((inicio+ancho)*factorancho)-inicio*factorancho;
texto:=FormatCurr('###,###,##0.00',StrToCurr(texto));
alfa:=alfa-Printer.Canvas.TextWidth(texto);
alfa:=alfa-15;
end;
end;

{Printer.Canvas.TextRect(rec,1,3,texto);}
Printer.Canvas.Rectangle(inicio*factorancho,10+(linea*factorlargo),(inicio+ancho)*factorancho,10+factorlargo+(linea*factorlargo));
Printer.Canvas.TextOut((inicio*factorancho+10)+alfa,10+factorlargo+(linea*factorlargo)-60,texto);

end;


procedure DibujaCeldaCanvas(inicio,tamoletra,ancho:integer;texto:string;relleno:TColor);
var
rec:TRect;
begin

rec.Left:=inicio*factorancho;
rec.Top:=10+(tamoletra*factorlargo);
rec.Right:=(inicio+ancho)*factorancho;
rec.Bottom:=10+factorlargo+(tamoletra*factorlargo);

{Printer.Canvas.Brush.Style:=bsDiagCross;}

end;



procedure ImprimeDetalle(DetaImpr:TDBGrid;inicio,fin:integer);
var
anchocolumna,numecampos,i,k,linea,paginasxancho,numerodepagina:integer;
tamoletra,sumaancho,ultimo,anchopagina,maximodelineas,ultimapagina:integer;
limites:Array[1..15] of integer;
rec:TRect;

begin
if inicio-1>=0 then
inicio:=inicio-1;
{****parametros globales de pagina***********}

Printer.BeginDoc;
numerodepagina:=0;
factorancho:=Trunc(Printer.PageWidth/CalculaAncho());
anchopagina:=Trunc(Printer.PageWidth);
factorlargo:=Trunc(Printer.PageHeight/50);
if CalculaAncho()=110 then
maximodelineas:=50
else
maximodelineas:=38;

ultimapagina:=fin;

{***************************}

numecampos:=DetaImpr.FieldCount;

for i:=2 to 15 do
limites[i]:=numecampos-1;

{******calcula las paginas******}
sumaancho:=0;
k:=2;
limites[1]:=0;

for i:=0 to numecampos-1 do
begin
sumaancho:=sumaancho+DetaImpr.Fields[i].DisplayWidth;
{ShowMessage(IntToStr(i)+'  '+IntToStr(sumaancho));}
if sumaancho>=CalculaAncho() then
begin
{ShowMessage(IntToStr(sumaancho));}
DetaImpr.Columns.Items[i].Color:=clred;
{DetaImpr.Columns.Items[i].Title:=DetaImpr.Columns.Items.Title;}
DetaImpr.Columns.Items[i].DisplayName:=DetaImpr.Columns.Items[i].DisplayName+' >';
{DetaImpr.Columns.Items[i].DisplayName:=Encabezado[i];}

sumaancho:=DetaImpr.Fields[i].DisplayWidth;
limites[k]:=i;
k:=k+1;
end;
end;
{limites[k]:=numecampos-1;}
{limites[k+1]:=numecampos-1;}

{*********termina calculo de paginas**************************** }

sumaancho:=0;
ultimo:=0;
linea:=0;
{DibujaCelda(0,0,0,'');}

{********inicia impresion por paginas******}

paginasxancho:=k;
{ShowMessage(IntToStr(k));}
for k:=2 to paginasxancho do
begin
numerodepagina:=0;
sumaancho:=0;
ultimo:=0;
linea:=0;

{***pone el cursor en la pagina coorecta****}
FormaSQL.Query1.First;
if CalculaAncho()=110 then
FormaSQL.Query1.MoveBy(inicio*50)
else
FormaSQL.Query1.MoveBy(inicio*38);
{*****termina la posicion*******************}

While (not FormaSQL.Query1.Eof)and(numerodepagina<ultimapagina) do
begin
sumaancho:=0;
ultimo:=0;
{showmessage(IntToStr(limites[k]));}
for i:=limites[k-1] to limites[k] do
begin
sumaancho:=sumaancho+DetaImpr.Fields[i].DisplayWidth;

if sumaancho<CalculaAncho() then
begin
{ShowMessage(DetaImpr.Fields[i].AsString);}
if linea=0 then
begin
DibujaCelda(ultimo,linea,DetaImpr.Fields[i].DisplayWidth,DetaImpr.Font.Size,DetaImpr.Columns.Items[i].Title.Caption,clGray,clBlack,'Arial',DetaImpr.Fields[i].DataType);
{linea:=linea+1;}
end
else

DibujaCelda(ultimo,linea,DetaImpr.Fields[i].DisplayWidth,DetaImpr.Font.Size,DetaImpr.Fields[i].AsString,clGray,clBlack,'Arial',DetaImpr.Fields[i].DataType);
end;
{DibujaCeldaCanvas(ultimo,linea,DetaImpr.Fields[i].DisplayWidth,DetaImpr.Font.Size,DetaImpr.Fields[i].AsString,clGray);}
ultimo:=sumaancho;
DetaImpr.SelectedIndex:=i;
end;
if linea<>0 then
FormaSQL.Query1.Next;
linea:=linea+1;
{******checa por nueva pagina*****}
if linea=maximodelineas then
begin
Printer.NewPage;
linea:=0;
numerodepagina:=numerodepagina+1;
end;
{*********************************}

end;

{***checa si no ha cambiado de pagina*****}
if linea<>0 then
Printer.NewPage;
{*****************************************}
end;

Printer.EndDoc;
end;




{****************************************}


function tipotabla:string;
begin
with FormaSQL do
begin
if NombreTabla.Text='Clientes' then
tipotabla:='cliente.dbf';

if NombreTabla.Text='Proveedores' then
tipotabla:='proveedo.dbf';

if NombreTabla.Text='Vendedores' then
tipotabla:='vendedor.dbf';

if NombreTabla.Text='Facturación' then
tipotabla:='facturae.dbf';

if NombreTabla.Text='Compras' then
tipotabla:='comprase.dbf';

if NombreTabla.Text='Cuentas x Cobrar' then
tipotabla:='CuCobrar.dbf';

if NombreTabla.Text='Cuentas x pagar' then
tipotabla:='CuePagar.dbf';

if NombreTabla.Text='Inventario' then
tipotabla:='inventar.dbf';

if NombreTabla.Text='Movimientos al Inventario' then
tipotabla:='Movinven.DBF';

end;

end;


function condiciones:string;
var
i:integer;
aux:string;
begin
with FormaSQL do
begin
aux:='';
for i:=1 to TablaFiltros.RowCount do
begin

{ShowMessage(TablaFiltros.Cells[2,i]);}
if TablaFiltros.Cells[2,i]<>'' then
begin
aux:=aux+TablaFiltros.Cells[0,i]+'*'+TablaFiltros.Cells[2,i]+'*'+TablaFiltros.Cells[3,i]+'*'+TablaFiltros.Cells[4,i]+'*';

end;

end;
condiciones:=aux;
end;
end;

procedure ponecampos(tabla:string);
var
inicio,fin,i,cuenta:integer;

begin
with FormaSQL do
begin
inicio:=Trunc(rangoscampos(tabla)/1000);
fin:=rangoscampos(tabla)-(inicio*1000);
{ShowMessage(intToStr(inicio)+'  '+intToStr(fin));}
cuenta:=1;
TablaFiltros.RowCount:=2;
for i:=inicio to fin do
begin
TablaFiltros.Cells[0,cuenta]:=leecampos(i,1);
TablaFiltros.Cells[1,cuenta]:=leecampos(i,2);
TablaFiltros.Cells[2,cuenta]:='';
TablaFiltros.Cells[3,cuenta]:='';
TablaFiltros.Cells[4,cuenta]:=leecampos(i,3);;
TablaFiltros.RowCount:=TablaFiltros.RowCount+1;
if (leecampos(i,2)<>'')and (leecampos(i,2)<>'No Disponible') then
cuenta:=cuenta+1;
end;

end;
end;




procedure TFormaSQL.BitBtn1Click(Sender: TObject);
begin
try

if Query1.State in [dsBrowse] then
begin
Query1.Close;
Query1.SQL.Clear;
end;


Query1.SQL.Text:=Codigo.Text;
Query1.Open;
ActualizaEncabezados(DBGrid1);
except
Query1.Close;
Query1.SQL.Clear;
end;

end;


procedure TFormaSQL.Label11MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
SendMessage(FormaSQL.Handle, WM_SYSCOMMAND, $F012, 0);
end;

procedure TFormaSQL.Panel4Click(Sender: TObject);
begin
Close;
end;

procedure TFormaSQL.FormCreate(Sender: TObject);
begin
cuenta:=0;
TablaFiltros.ColWidths[0]:=45;
TablaFiltros.ColWidths[1]:=120;
TablaFiltros.ColWidths[2]:=60;
TablaFiltros.ColWidths[3]:=60;
TablaFiltros.ColWidths[4]:=1;

TablaFiltros.Cells[0,0]:='Clave';
TablaFiltros.Cells[1,0]:='Campo';
TablaFiltros.Cells[2,0]:='Condición';
TablaFiltros.Cells[3,0]:='Valor';

end;

procedure TFormaSQL.NombreTablaChange(Sender: TObject);
begin
if NombreTabla.Text='Clientes' then

ponecampos('clientes.cmp');

if NombreTabla.Text='Proveedores' then
ponecampos('proveedo.cmp');

if NombreTabla.Text='Vendedores' then
ponecampos('vendedor.cmp');

if NombreTabla.Text='Facturación' then
ponecampos('facturae.cmp');

if NombreTabla.Text='Compras' then
ponecampos('comprase.cmp');

if NombreTabla.Text='Cuentas x Cobrar' then
ponecampos('cxp.cmp');

if NombreTabla.Text='Cuentas x pagar' then
ponecampos('cxc.cmp');

if NombreTabla.Text='Inventario' then
ponecampos('inventar.cmp');

if NombreTabla.Text='Movimientos al Inventario' then
ponecampos('movinven.cmp');

end;

procedure TFormaSQL.BitBtn2Click(Sender: TObject);
begin
cuenta:=0;
Codigo.Clear;
Codigo.Lines.Add('Select');
Codigo.Lines.Add('');
Codigo.Lines.Add('');
Codigo.Lines.Add('');
Codigo.Lines.Add('From "'+ruta(8)+'\'+tipotabla()+'"');

end;

procedure TFormaSQL.TablaFiltrosDblClick(Sender: TObject);
var
Rec:TRect;
i:word;
begin
i:=Codigo.Lines.Count-2;
if Codigo.Lines[i-1]<> '' then
Codigo.Lines[i-1]:=Codigo.Lines[i-1]+',';
Codigo.Lines.Insert(i,TablaFiltros.Cells[0,TablaFiltros.Selection.Top]);
encabezado[cuenta]:=TablaFiltros.Cells[1,TablaFiltros.Selection.Top];
cuenta:=cuenta+1;
end;

procedure TFormaSQL.BitBtn3Click(Sender: TObject);
var
inicio,fin:integer;
begin
{inicio:=0;
fin:=Trunc(Query1.RecordCount);
if Query1.RecordCount mod 50 <>0 then
fin:=fin+1;}

if ImpresoraLista then
begin
Imprimir.MinPage:=1;
Imprimir.MaxPage:=CalculaNumeroPaginas(DBGrid1.DataSource.DataSet.RecordCount);
Imprimir.FromPage:=1;
Imprimir.ToPage:=CalculaNumeroPaginas(DBGrid1.DataSource.DataSet.RecordCount);

if Imprimir.Execute then
begin
ImprimeDetalle(DBGrid1,Imprimir.FromPage,Imprimir.ToPage);
end;

end;




{ImprimeDetalle(DBGrid1,0,1);}
end;


procedure TFormaSQL.BitBtn4Click(Sender: TObject);
var
arch2:TextFile;
fuente,destino:PChar;
nombre,nombre2:String[125];
f:longbool;
begin

if DialogoGuarda.Execute then
begin
{if FileExists(PChar(FormaConsulta.Destino.Text)) then
DeleteFile(PChar(FormaConsulta.Destino.Text));}
AsciiDelimitado(DBGrid1,DialogoGuarda.FileName);
{
CopyFile(PChar(FormaConsulta.Destino.Text),PChar(DialogoGuarda.FileName),F);}
end;




end;

procedure TFormaSQL.BotonAnteriorClick(Sender: TObject);
begin
PaginaAvance('-');
end;

procedure TFormaSQL.BotonSiguienteClick(Sender: TObject);
begin
PaginaAvance('+');
end;

end.
