Criar SqlDataSet Dinamico dentro da função
:?:
Olá a todos.
Uso Delphi 7 + Firebird + Dbexpress
Preciso validar dados dentro de uma função global do sistema.
Esta função verifica se o registro existe no banco de dados ou não (recordcount=0).
O problema ocorre quando executo a SQL dentro da função.
// --- ao sair do campo descrição preciso validar.....
procedure TFrC0300.EdtDescricaoExit(Sender: TObject);
Var
Texto : String;
begin
inherited;
If M_TipoOperacao = 0 then exit;
Texto := ´Select Und_Cod, Und_Descricao From UNIDADEMEDIDA Where Und_Descricao = :Campo ´;
If VarificaRestringeChave( Texto, EdtCodigo.Text , ´Und_Cod´, EdtDescricao.Text ,
false, M_TipoOperacao ) = false then
begin
EdtDescricao.SetFocus;
end;
end;
=========== função
// ---
// Validar campo - impedir que tenhamos mais de hum registro com
// o mesmo valor da chave tipo - CPF, RG, P/N, etc...
//
// Parametros: CadeiaTxt > Instrução select - SQL
// Conteudo > Código do lancto, sequencial do sistema
// usado quando na alteração para saber se
// localizou o mesmo registro ou é outro.
// NmCampo > Nome do Campo para comparar os valores
// Codigo X NmCampo
// Parametro > Campo Edit a ter o conteúdo validado
// VazioOk > Se aceita o campo vazio ou não
//
// ------
function VarificaRestringeChave( CadeiaTxt, Conteudo , NmCampo, Parametro : String;
VazioOk:Boolean; Operacao:Integer ) : Boolean;
Var
Cds : TClientDataSet;
SDs : TSqlDataSet;
Dts : TDataSource;
begin
Cds := TClientDataSet.Create( Application );
Sds := TSqlDataSet.Create( Application );
Dts := TDataSource.Create( Application );
Result := true;
If Empty( Parametro ) then
begin
If VazioOk = false then // testa pela negativa -> Se vazio não pode......
Begin
Result := false;
end;
end;
Cds.Close;
Sds.CommandText := CadeiaTxt; // conteúdo SQL passado/parametro
Sds.ParamByName(´Campo´).Value := Parametro; // ERRO: Parameter ´Campo´ not found
Cds.Open;
If Operacao = 1 then // inclusao - não pode existir
begin
If cds.RecordCount > 0 then
begin
M_Aux := ´Inclusão! ´ + chr(13) + chr(13) + chr(13);
M_Aux := M_Aux + ´ Campo Chave já Existente!!! ´;
M_Aux := M_Aux + chr(13) + chr(13);
M_Aux := M_Aux + ´ Registro: ´ + Cds.FieldByName(NmCampo).AsString;
M_Aux := M_Aux + chr(13) + chr(13);
ShowMessage( M_Aux );
Result := false;
end;
end;
if Operacao = 2 then // alteração
With Cds do
begin
if RecordCount > 0 then // existente
begin
If (FieldByName(NmCampo).AsString <> Conteudo) then // Registro diferente do posicionado
begin
M_Aux := ´Alteração! ´ + chr(13) + chr(13) + chr(13);
M_Aux := M_Aux + ´ Campo Chave já Existente!!! ´;
M_Aux := M_Aux + chr(13) + chr(13);
M_Aux := M_Aux + ´ Registro: ´ + Cds.FieldByName(NmCampo).AsString;
M_Aux := M_Aux + chr(13) + chr(13);
ShowMessage( M_Aux );
Result := false;
end;
end;
end;
end;
Abraços a todos
Neto
Olá a todos.
Uso Delphi 7 + Firebird + Dbexpress
Preciso validar dados dentro de uma função global do sistema.
Esta função verifica se o registro existe no banco de dados ou não (recordcount=0).
O problema ocorre quando executo a SQL dentro da função.
// --- ao sair do campo descrição preciso validar.....
procedure TFrC0300.EdtDescricaoExit(Sender: TObject);
Var
Texto : String;
begin
inherited;
If M_TipoOperacao = 0 then exit;
Texto := ´Select Und_Cod, Und_Descricao From UNIDADEMEDIDA Where Und_Descricao = :Campo ´;
If VarificaRestringeChave( Texto, EdtCodigo.Text , ´Und_Cod´, EdtDescricao.Text ,
false, M_TipoOperacao ) = false then
begin
EdtDescricao.SetFocus;
end;
end;
=========== função
// ---
// Validar campo - impedir que tenhamos mais de hum registro com
// o mesmo valor da chave tipo - CPF, RG, P/N, etc...
//
// Parametros: CadeiaTxt > Instrução select - SQL
// Conteudo > Código do lancto, sequencial do sistema
// usado quando na alteração para saber se
// localizou o mesmo registro ou é outro.
// NmCampo > Nome do Campo para comparar os valores
// Codigo X NmCampo
// Parametro > Campo Edit a ter o conteúdo validado
// VazioOk > Se aceita o campo vazio ou não
//
// ------
function VarificaRestringeChave( CadeiaTxt, Conteudo , NmCampo, Parametro : String;
VazioOk:Boolean; Operacao:Integer ) : Boolean;
Var
Cds : TClientDataSet;
SDs : TSqlDataSet;
Dts : TDataSource;
begin
Cds := TClientDataSet.Create( Application );
Sds := TSqlDataSet.Create( Application );
Dts := TDataSource.Create( Application );
Result := true;
If Empty( Parametro ) then
begin
If VazioOk = false then // testa pela negativa -> Se vazio não pode......
Begin
Result := false;
end;
end;
Cds.Close;
Sds.CommandText := CadeiaTxt; // conteúdo SQL passado/parametro
Sds.ParamByName(´Campo´).Value := Parametro; // ERRO: Parameter ´Campo´ not found
Cds.Open;
If Operacao = 1 then // inclusao - não pode existir
begin
If cds.RecordCount > 0 then
begin
M_Aux := ´Inclusão! ´ + chr(13) + chr(13) + chr(13);
M_Aux := M_Aux + ´ Campo Chave já Existente!!! ´;
M_Aux := M_Aux + chr(13) + chr(13);
M_Aux := M_Aux + ´ Registro: ´ + Cds.FieldByName(NmCampo).AsString;
M_Aux := M_Aux + chr(13) + chr(13);
ShowMessage( M_Aux );
Result := false;
end;
end;
if Operacao = 2 then // alteração
With Cds do
begin
if RecordCount > 0 then // existente
begin
If (FieldByName(NmCampo).AsString <> Conteudo) then // Registro diferente do posicionado
begin
M_Aux := ´Alteração! ´ + chr(13) + chr(13) + chr(13);
M_Aux := M_Aux + ´ Campo Chave já Existente!!! ´;
M_Aux := M_Aux + chr(13) + chr(13);
M_Aux := M_Aux + ´ Registro: ´ + Cds.FieldByName(NmCampo).AsString;
M_Aux := M_Aux + chr(13) + chr(13);
ShowMessage( M_Aux );
Result := false;
end;
end;
end;
end;
Abraços a todos
Neto
Neto
Curtidas 0
Respostas
Dor_poa
18/01/2008
Esta dando erro porque vc nao esta setando os DSP do TClientDataSet
vou dar um exemplo
Var
sqlTemp : TSQLDataSet;
dspTemp : TDataSetProvider;
cdsTemp : TClientDataSet;
Begin
try
sqlTemp := TSQLDataSet.Create(Application);
sqlTemp.SQLConnection := ?????????;
dspTemp := TDataSetProvider.Create(Application);
dspTemp.DataSet := sqlTemp;
dspTemp.Options := [poAllowCommandText];
cdsTemp := TClientDataSet.Create(Application);
cdsTemp.SetProvider(dspTemp);
cdsTemp.CommandText := XXXXXXX
finally
FreeAndNil(sqlTemp);
FreeAndNil(dspTemp);
FreeAndNil(cdsTemp);
end;
End;
Prontooo.. dessa forma com certeza funciona
Obs.: nao esqueça de DESTRUIR todos os objetos que executem o Create, pois eles continuao em uso mesmo após sair da função!!.
vou dar um exemplo
Var
sqlTemp : TSQLDataSet;
dspTemp : TDataSetProvider;
cdsTemp : TClientDataSet;
Begin
try
sqlTemp := TSQLDataSet.Create(Application);
sqlTemp.SQLConnection := ?????????;
dspTemp := TDataSetProvider.Create(Application);
dspTemp.DataSet := sqlTemp;
dspTemp.Options := [poAllowCommandText];
cdsTemp := TClientDataSet.Create(Application);
cdsTemp.SetProvider(dspTemp);
cdsTemp.CommandText := XXXXXXX
finally
FreeAndNil(sqlTemp);
FreeAndNil(dspTemp);
FreeAndNil(cdsTemp);
end;
End;
Prontooo.. dessa forma com certeza funciona
Obs.: nao esqueça de DESTRUIR todos os objetos que executem o Create, pois eles continuao em uso mesmo após sair da função!!.
GOSTEI 0