Parametros com CDS

Delphi

06/01/2007

olha só meu problema, estou usando um ClientDataSet para fazer select mim trazer resultados baseados nas informaçoes de alguns paramentros, vejam , estou usando cada consulta em um botão diferente:

procedure TFrmMatriculas.BitBtn1Click(Sender: TObject); begin with DmConsultas.CDS_Consulta do begin Close; Params.Clear; CommandText:=´´; CommandText:=´Select COD_ALUN, NOME_ALUNO, CURSO, SERIE, TURMA, TURNO, ´+ ´SEXO, DATA_NASCIMENTO, NATURALIDADE, ESTADO_NATURALIDADE, ´+ ´NACIONALIDADE, ESCOLA_ANTERIOR, CIDADE_ESCO_ANT, ESTADO_ESCO_ANT, ´+ ´UF_ESCO_ANT, NOME_PAI, NOME_MAE, NOME_RESP, SITUACAO_ALUNO from ALUNOS where ´+ ´SERIE = :Serie and ´+ ´TURMA = :Turma and ´+ ´TURNO = :Turno and ´+ ´SITUACAO_ALUNO = :Situacao´; FetchParams; Params.ParamByName(´Serie´).AsString:= CBox_Serie.Text; Params.ParamByName(´Turma´).AsString:= CBox_Turma.Text; Params.ParamByName(´Turno´).AsString:= CBox_Turno.Text; Params.ParamByName(´Situacao´).AsString:= ´PRÉ-MATRICULADO´; Open; end; end;


e no outro:

with DmConsultas.CDS_Consulta do begin Close; Params.Clear; CommandText:=´´; CommandText:=´Select COD_ALUN, NOME_ALUNO, CURSO, SERIE, TURMA, TURNO, ´+ ´SEXO, DATA_NASCIMENTO, NATURALIDADE, ESTADO_NATURALIDADE, ´+ ´NACIONALIDADE, ESCOLA_ANTERIOR, CIDADE_ESCO_ANT, ESTADO_ESCO_ANT, ´+ ´UF_ESCO_ANT, NOME_PAI, NOME_MAE, NOME_RESP, SITUACAO_ALUNO from ALUNOS where ´+ ´CURSO = :Curso and ´+ ´SITUACAO_ALUNO = :Situacao´; Params.Clear; FetchParams; Params.ParamByName(´Curso´).AsString:= CBox_Curso.Text; Params.ParamByName(´Situacao´).AsString:= ´PRÉ-MATRICULADO´; Open; end;


quando executo qualquer uma das consultas acima dar tudo normal mas quando tento executar a outra consulta, dar um erro ´ Parameter not found ´

O q será que não estou fechando galera?


Erivando

Erivando

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

06/01/2007

exclua as linhas onde você tem FetchParams e Params.Clear
procedure TFrmMatriculas.BitBtn1Click(Sender: TObject); 
begin 
  with DmConsultas.CDS_Consulta do 
  begin 
    Close; 
    CommandText := 
      ´Select COD_ALUN, NOME_ALUNO, CURSO, SERIE, TURMA, TURNO, ´+ 
      ´SEXO, DATA_NASCIMENTO, NATURALIDADE, ESTADO_NATURALIDADE, ´+ 
      ´NACIONALIDADE, ESCOLA_ANTERIOR, CIDADE_ESCO_ANT, ESTADO_ESCO_ANT, ´+ 
      ´UF_ESCO_ANT, NOME_PAI, NOME_MAE, NOME_RESP, SITUACAO_ALUNO ´+
      ´from ALUNOS where ´+ 
      ´SERIE = :Serie and ´+ 
      ´TURMA = :Turma and ´+ 
      ´TURNO = :Turno and ´+ 
      ´SITUACAO_ALUNO = :Situacao´; 
    Params.ParamByName(´Serie´).AsString := CBox_Serie.Text; 
    Params.ParamByName(´Turma´).AsString := CBox_Turma.Text; 
    Params.ParamByName(´Turno´).AsString := CBox_Turno.Text; 
    Params.ParamByName(´Situacao´).AsString := ´PRÉ-MATRICULADO´;
    Open; 
  end; 
end;
nessa instrução não há necessidade do FetchParams e nem do Params.Clear, porque você está criando esses parâmetros, e não trazendo do dataset principal.

e no outro:
with DmConsultas.CDS_Consulta do 
begin 
  Close; 
  CommandText :=
    ´Select COD_ALUN, NOME_ALUNO, CURSO, SERIE, TURMA, TURNO, ´+ 
    ´SEXO, DATA_NASCIMENTO, NATURALIDADE, ESTADO_NATURALIDADE, ´+ 
    ´NACIONALIDADE, ESCOLA_ANTERIOR, CIDADE_ESCO_ANT, ESTADO_ESCO_ANT, ´+ 
    ´UF_ESCO_ANT, NOME_PAI, NOME_MAE, NOME_RESP, SITUACAO_ALUNO ´+
    ´from ALUNOS where ´+ 
    ´CURSO = :Curso and ´+ 
    ´SITUACAO_ALUNO = :Situacao´; 
  Params.ParamByName(´Curso´).AsString:= CBox_Curso.Text; 
  Params.ParamByName(´Situacao´).AsString:= ´PRÉ-MATRICULADO´; 
  Open; 
end;
e nesse outro você criava os parametros - na instrução - e depois excluía-os, com o Params.Clear.


GOSTEI 0
Erivando

Erivando

06/01/2007

Obrigado emerson.en pela ajuda mas...

eu somente retirei o
// FetchParams;
nas duas consultas ACIMA e deu tudo certo, então ficou assim:

with DmConsultas.CDS_Consulta do begin Close; Params.Clear; CommandText:=´´; CommandText:=´Select ....´; Params.ParamByName(´....´).AsString:= ´.,.´; Open; edn;


mas porque não precisa do FetchParams? , já que eu eu estou criando tando a consulta quanto os parametros em tempo de execução!!!?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

06/01/2007

só pra constar:
[b:bbcd966c13]Params.Clear é desnecessário[/b:bbcd966c13], pois quando você altera o commandtext, os parâmetros são excluídos e recriados automaticamente conforme a instrução do commantext.

[b:bbcd966c13]CommandText:=´´ é redundante[/b:bbcd966c13], pois quando você altera o commandtext, o novo valor já é assumido, sem necessidade de excluir o conteúdo anterior. imagine uma variável numérica, de nome [i:bbcd966c13]valor[/i:bbcd966c13], com conteúdo 25. daí você quer alterar esse conteúdo da variável para 55.
você faz simplesmente [i:bbcd966c13]valor := 55[/i:bbcd966c13]:
valor := 25;
//novo valor
valor := 55;
e não:
valor := 25;
//novo valor
valor := 0; // isso é tão desnecessário quanto CommandText:=´´
valor := 55;

e, quanto à sua pergunta:
FetchParams serve para restaurar os parâmetros do provider ligado ao clientdataset. como a sua instrução é montada diretamente no clientdataset, esse método não deve ser usado.


GOSTEI 0
Erivando

Erivando

06/01/2007

blz emerson, valeu a força!


GOSTEI 0
POSTAR