GARANTIR DESCONTO

Fórum Criar SqlDataSet Dinamico dentro da função #352074

18/01/2008

0

:?:
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

Neto

Responder

Posts

15/02/2008

Dor_poa

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!!.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar