Você está na página 1de 5

unit ProcurarCampos;

{
*************************************************************************************
* Autor: Mauricio Vicente * *
* Data : 23/08/2012 * *
**************************** *
* *
* FORMAULÁRIO PADRÃO PARA CONSULTAS DE ATÉ 3 TABELAS DETALHES *
* *
* Parâmetro de entrada: (AOwner: TComponent; Dataset,DatasetDT1,DatasetDT2, *
* DatasetDT3:TDataset;DatasetProc: TSimpleDataset; Titulo: String; *
* Campos: array of string); *
* *
* Dataset : Tabela Mestre. *
* DatasetDT1,DatasetDT2,DatasetDT3 : Tabelas Detalhes. *
* DatasetProc : SimpleDataset com script SQL (menos clausula WHERE). *
* Titulo : Título do formulário de consulta. *
* Campos : Campos que serão usados para as pesquisas. *
* *
* Exemplo: *
* (Self, cdsOS,cdsTECNICO,nil,nil,sdtProcurarOS,'Procurar OS',['ID_OS','DATA']); *
* *
*************************************************************************************
}

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, Grids, DBGrids, StdCtrls, Buttons, ComCtrls, SimpleDS, Mask, SqlExpr, Provider;

type
TfmProcurarCampos = class(TForm)
stBar: TStatusBar;
btnOk: TBitBtn;
btnCancelar: TBitBtn;
Grade: TDBGrid;
DtSrc: TDataSource;
Label1: TLabel;
cbxCampos: TComboBox;
btnProcurar: TBitBtn;
cbxForma: TComboBox;
DtSrcProc: TDataSource;
edtProcurar: TMaskEdit;
DtSrcDT1: TDataSource;
DtSrcDT2: TDataSource;
DtSrcDT3: TDataSource;
procedure FormShow(Sender: TObject);
procedure cbxCamposClick(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure GradeTitleClick(Column: TColumn);
procedure btnProcurarClick(Sender: TObject);
private
CamposPesq: array of string;
CampoSel, Tabela_Campo, TabMestre:string;
TipoCampoSel:TFieldType;
DtSrcDet : array of TDataSource;
procedure GetFieldNames(DataSet : TDataSet; Items : TStrings);
function StrProviderNameToSqlDataset(sProviderName: string): TSqldataset;
function Retorna_Nome_Tabela(DS : TDataSet): string;
public
constructor Create (AOwner:TComponent; Dataset:TDataset; DatasetDet: array of TDataset;
DatasetProc: TSimpleDataset; Titulo: String;
Campos: array of string);reintroduce;
end;

var
fmProcurarCampos: TfmProcurarCampos;

implementation

uses DBClient, ModCadastros, ModServidor;

{$R *.dfm}

{Converte o nome do ProviderName em TSQLDataset (usado na função Retorna_Nome_Tabela )}


function TfmProcurarCampos.StrProviderNameToSqlDataset(sProviderName: string): TSqldataset;
var
i : Integer;
Begin
Result := Nil;
for i:=0 to dmServidor.ComponentCount-1 do
begin
if (dmServidor.Components[i] is TDataSetProvider) and (dmServidor.Components[i].Name =
sProviderName) then
begin
Result := (TDataSetProvider(dmServidor.Components[i]).DataSet as TSQLDataSet);
Continue;
end;
end;
if not(Assigned(Result)) then
Abort;
end;

{Retorna nome da tabela pelo TDataset (TClientDataset, TSimpleDataset)}


function TfmProcurarCampos.Retorna_Nome_Tabela(DS : TDataSet): string;
var
s_Provider : string;
d_dataset : TSQLDataSet;
begin
s_Provider := TClientDataSet(DS).ProviderName; //Pega nome ProviderName
d_Dataset := StrProviderNameToSqlDataset(s_Provider); //Converte ProviderName em
TSQLDataset
if assigned(d_dataset) then
result := IProviderSupport(d_Dataset).PSGetTableName;//Pega o nome da tabela
end;

{função para carregar os campos no combobox cbxCampos}


procedure TfmProcurarCampos.GetFieldNames(DataSet : TDataSet; Items : TStrings);
var
I, F: Integer;
begin
Items.BeginUpdate;
try
for F := 0 to Length(CamposPesq)-1 do
for I := 0 to DataSet.FieldCount - 1 do
begin
if (DataSet.Fields[I].FieldName = CamposPesq[F]) then
begin
Items.AddObject(DataSet.Fields[I].DisplayName, DataSet.Fields[I]);
end;
end;
finally
Items.EndUpdate;
end;
end;
procedure TfmProcurarCampos.FormShow(Sender: TObject);
begin
DtSrcProc.DataSet.Close;
{carrega os campos dos Datasets no cbxCampos}
GetFieldNames(DtSrc.DataSet, cbxCampos.Items);
if DtSrcDT1.DataSet <> nil then
GetFieldNames(DtSrcDT1.DataSet, cbxCampos.Items);
if DtSrcDT2.DataSet <> nil then
GetFieldNames(DtSrcDT2.DataSet, cbxCampos.Items);
if DtSrcDT3.DataSet <> nil then
GetFieldNames(DtSrcDT3.DataSet, cbxCampos.Items);
cbxForma.ItemIndex:=0;
cbxCampos.ItemIndex:=0;
cbxCamposClick(Self);
end;

constructor TfmProcurarCampos.Create (AOwner:TComponent; Dataset:TDataset; DatasetDet: array


of TDataset; DatasetProc: TSimpleDataset; Titulo: String;
Campos: array of string);
var
I,F : integer;
begin
inherited create(AOWner);
DtSrc.DataSet:=Dataset;
{DtSrcDT1.DataSet:= DatasetDT1;
DtSrcDT2.DataSet:= DatasetDT2;
DtSrcDT3.DataSet:= DatasetDT3;}
DtSrcProc.DataSet:=DatasetProc;
TabMestre := Copy(DtSrc.Dataset.Name,4,Length(DtSrc.Dataset.Name));
{ if DtSrcDT1.DataSet <> nil then
TabDet1 := Retorna_Nome_Tabela(DtSrcDT1.DataSet); //
Copy(DtSrcDT1.Dataset.Name,4,Length(DtSrcDT1.Dataset.Name));
if DtSrcDT2.DataSet <> nil then
TabDet2 := Retorna_Nome_Tabela(DtSrcDT1.DataSet); //
Copy(DtSrcDT2.Dataset.Name,4,Length(DtSrcDT2.Dataset.Name));
if DtSrcDT3.DataSet <> nil then
TabDet3 := Retorna_Nome_Tabela(DtSrcDT1.DataSet); //
Copy(DtSrcDT3.Dataset.Name,4,Length(DtSrcDT3.Dataset.Name)); }
Caption:=Titulo;
{dimensiona o array CamposPesq para qtd de campos no DtSrc e qtd DtScrDet}
SetLength(CamposPesq,Length(Campos)+1);
SetLength(DtSrcDet, length(DatasetDet)+1);
{carrega os campos informados na pesquisa p/ o array CamposPes}
{$R-}
for I := 0 to Length(Campos) do
CamposPesq[I] := Campos[I];
for F := 0 to Length(DatasetDet) do
DtSrcDet[F].DataSet := DatasetDet[F];
end;

procedure TfmProcurarCampos.cbxCamposClick(Sender: TObject);


begin
{nome campo para pesquisar}
CampoSel := TField(cbxCampos.Items.Objects[cbxCampos.ItemIndex]).FieldName;
{tipo do campo na pesquisa}
TipoCampoSel := TField(cbxCampos.Items.Objects[cbxCampos.ItemIndex]).DataType;
{tabela ao qual o campo pertence}
//Tabela_Campo := TField(cbxCampos.Items.Objects[cbxCampos.ItemIndex]).DataSet.Name;
Tabela_Campo :=
Retorna_Nome_Tabela(TField(cbxCampos.Items.Objects[cbxCampos.ItemIndex]).DataSet);
edtProcurar.EditMask:='';
edtProcurar.Clear;
if TipoCampoSel = ftDate then
edtProcurar.EditMask:='!99/99/00;1;_';
edtProcurar.SetFocus;
end;

procedure TfmProcurarCampos.btnProcurarClick(Sender: TObject);


var
SQLant, SQL, Procurar, DataVenc:string;
begin
with (DtSrcProc.DataSet as TSimpleDataset) do
begin
try
Procurar := edtProcurar.Text;
if (edtProcurar.Text<>'')and(Length(edtProcurar.Text)>=1) then
begin
Close;
SQLant := DataSet.CommandText;
if SQLant='' then
SQLant := 'Select * from '+TabMestre;
SQL := SQLant + ' where ';
case TipoCampoSel of
ftString:
begin
SQL := SQL + 'Upper('+Tabela_Campo+'.'+CampoSel+')';
case cbxForma.ItemIndex of
0: SQL := SQL+ ' like Upper ('+QuotedStr('%'+Procurar+'%')+')';
1: SQL := SQL+ ' like Upper ('+QuotedStr(Procurar+'%')+')';
2: SQL := SQL+ ' like Upper ('+QuotedStr(Procurar)+')';
end;
end;
ftDate:
begin
DataVenc := FormatDateTime('dd.mm.yy',StrToDate(Procurar));
SQL := SQL + (CampoSel+' = '+ QuotedStr(DataVenc));
end;
ftInteger:
begin
SQL := SQL + (Tabela_Campo+'.'+CampoSel+' = '+ Procurar);
end;
end;
DataSet.CommandText:=SQL;
//ShowMessage(SQL);
Open;
btnOk.Enabled:=not IsEmpty;
if IsEmpty then StBar.Panels[0].Text:=Format('Nenhum registro foi encontrado'+
' com "%s"',[edtProcurar.Text])
else
begin
stBar.Panels[0].Text:=Format('%d registros encontrados com "%s"',
[RecordCount,edtProcurar.Text]);
Grade.SetFocus;
end;
end
else MessageDlg('Digite no mínimo 1 caracteres para a consulta',mtError,[mbOk],0);
finally
DataSet.CommandText := SQLant;
end;
end;
end;

procedure TfmProcurarCampos.FormKeyDown(Sender: TObject; var Key: Word;


Shift: TShiftState);
begin
if key=13 then
if edtProcurar.Focused then btnProcurarClick(self) else ModalResult:=mrOk;
if key=27 then
if Grade.Focused then edtProcurar.SetFocus else Close;
end;

procedure TfmProcurarCampos.GradeTitleClick(Column: TColumn);


begin
with DtSrc.DataSet as TSimpleDataset do
IndexFieldNames:=Column.FieldName;
end;

end.

Você também pode gostar