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:
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. :)
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
Curtir tópico
+ 0
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.
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
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.
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
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
Agora tb não achei nenhuma solução para o problema, alguem se habilita a dar uma ajuda?
Ederson
Responder
Clique aqui para fazer login e interagir na Comunidade :)