Não reconhece o parâmetro informado (ClientDataSet)

07/10/2004

0

Caros colegas,

Estou com um problema estranho e curioso.
Tenho um sistema de orçamentos e preciso gerar um arquivo dbf para ser lido por um sistema de terceiro.
Utilizo SQLDataSet -> DataSetProvider -> ClientDataSet.
As instrução são simples.
Primeiro insiro a instrução de seleção no SQLDataSet para me retornar os ítens do orçamento, para assim gerar o arquivo de ítens, e nesta seleção eu passo dois parâmetros: ´DataValidade´ e ´Loja´
Em seguida, altero a instrução SQL para selecionar o corpo principal do orçamento, para então gerar o arquivo correspondente, e para este também passo os mesmos parâmetros da seleção anterior: ´DataValidade´ e ´Loja´.
O que ocorre é que na primeira instrução o sistema funciona corretamente, porém na segunda ocorre o erro ´No value for parameter DataValidade´, o estranho é que estou informando o valor para o parâmetro, da mesma forma que na primeira instrução.

O código é o seguinte:
DataModule.SQLDataSet.CommandText := ´Select * from TB_ORCAMENTO inner join TB_ITEMORC where ORC_VALIDADE >= :DataValidade and ORC_LOJA = :Loja´;
DataModule.ClientDataSet.FetchParams;
DataModule.ClientDataSet.Params.ParamByName(´DataValidade´).AsDate := Date;
DataModule.ClientDataSet.Params.ParamByName(´Loja´).AsString := DataModule.pbNumLoja; // variável com o código da loja
DataModule.ClientDataSet.Open;
while not DataModule.ClientDataSet.EOF do
begin
// Aqui gera o arquivo dbf para os ítens do orçamento
end;
DataModule.ClientDataSet.Close;
DataModule.SQLDataSet.CommandText := ´Select * from TB_ORCAMENTO where ORC_VALIDADE >= :DataValidade and ORC_LOJA = :Loja´;
DataModule.ClientDataSet.FetchParams;
DataModule.ClientDataSet.Params.ParamByName(´DataValidade´).AsDate := Date;
DataModule.ClientDataSet.Params.ParamByName(´Loja´).AsString := DataModule.pbNumLoja; // variável com o código da loja
DataModule.ClientDataSet.Open; // <-- OCORRE ERRO AO TENTAR ABRIR O CDS
while not DataModule.ClientDataSet.EOF do
begin
// Aqui gera o arquivo do corpo dos orçamentos
end;
DataModule.ClientDataSet.Close;

Tenho este mesmo problema em duas partes do sistema e descobri que ocorre sempre que tenho o mesmo valor para o parâmetro (Aqui neste caso a data é a mesma, assim como o código da loja)
E em um dos testes eu alterei o nome do parâmetro da segunda instrução e o sistema aceitou perfeitamente.
Nesta parte do sistema eu posso alterar o nome do parâmetro, mas na outra parte onde tenho o mesmo problema não posso.
Alguém já passou por situação semelhante e conseguiu uma solução para o problema?

Desde já agradecido.

PS. Desculpem-me pelo tamanho da mensagem, mas tentei resumir ao máximo sem eliminar pontos importantes. :)


Rafs

Rafs

Responder

Post mais votado

09/08/2005

Normalmente temos o costume de não definir o tipo de dado do parâmetro, quando utilizamos outras tecnologias de conexão... no caso do DBX, é necessário defini-lo para que funcione corretamente... no caso de campos data ftTimeStamp e assim por diante...

Importante: toda alteração deve ser feita no DataSet...

Outra coisa importante é clicar com o botão direito do mouse sobre o ClientDataSet e selecionar fetch params, para que os parâmetros sejam transportados do DataSet para ele.


Kotho

Kotho
Responder

Mais Posts

08/10/2004

Rafs

Amigos,

Consegui simplificar o código e tornar o problema mais visível.
Criei um formulário com um edit, dois botões, um DBGrid e o DataSource. E um DataModule com SQLConection, SQLDataSet, DataSetProvider e ClientDataSet. Estabeleci a conexão com o servidor e linquei os componentes sem alterar nenhuma propriedade.
No OnClick dos botôes coloquei os seguintes códigos.
procedure TForm1.Button1Click(Sender: TObject);
begin
  dm.cds.Close;
  dm.sql.CommandText :=
    ´Select CLI_NOME from TB_CLIENTE where CLI_NOME like :NOME´;
  dm.cds.FetchParams;
  dm.cds.Params.ParamByName(´NOME´).AsString := ´¬´+Edit1.Text+´¬´;
  dm.cds.Open;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  dm.cds.Close;
  dm.sql.CommandText :=
    ´Select PRO_COD from TB_PRODUTO where PRO_NOME like :NOME´;
  dm.cds.FetchParams;
  dm.cds.Params.ParamByName(´NOME´).AsString := ´¬´+Edit1.Text+´¬´;
  dm.cds.Open;
end;

Após inserir um conteúdo na caixa Edit1 eu clico no Button1 e o sistema executa perfeitamente, mas se clicar, em seguida, no Button2 ocorre o erro ´No value for parameter ´NOME´´. Clicando no Button2 e depois no Button1, ocorre a mesma coisa.

Obrigado a todos


Responder

08/08/2005

Eselvati

Tb estou com este problema com o delphi 7 sp1, estou praticamente concluindo q é bug do delphi.

Agora tb não achei nenhuma solução para o problema, alguem se habilita a dar uma ajuda?




Ederson


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar