Problemas com ClientDataSet no BDS2006...

Delphi

19/06/2006

Amigos, estou migrando um ssitema meu que usa CDS... pois bem.. no Delphi 7 funcionava legal..

IBQuery -> DSP -> CDS

O DSP tá como AllowCommandText...

e no CDS:

cds.close;
cds.commandtext := ´select * from cliente´;
cds.open;



Pois bem, no BDS2006 dá [b:7cfddda6de]Empty SQL Statement[/b:7cfddda6de]

Pow, to passando o CommandText... o que pode ser? Bug do BDS2006? Alguem mais ta passando por isso? Já estou usando o Update 1 dele...

Desde já agradeço

[]s


Titanius

Titanius

Curtidas 0

Respostas

Adriano Santos

Adriano Santos

19/06/2006

cds.close;
cds.commandtext := ´select * from cliente´;
cds.open;


Tinanius use maiúsculas na query, não sei se é isso, mas já tive outros tipos de problemas relacionados a maiúsculas.

cds.close;
cds.commandtext := ´SELECT * FROM CLIENTE´;
cds.open;



GOSTEI 0
Titanius

Titanius

19/06/2006

Amigo, não é isso nao... :(

Como eu também tive este ´probleminha´ todas minhas querys são maiusculas desde entao...


Muito doido.... será que é BUG?


GOSTEI 0
Paullsoftware

Paullsoftware

19/06/2006

Não, não é um bug....

Vamos fazer um teste bem básico pq as vezes as configurações estão lá é bem simples, mais não há vemos então:

Adicione um SqlConnection, um SqlDataSet, um DataSetProvider e um ClientDataSet...

> Crie a conexão no SqlConnection para sua conexão
> Vincule o SqlDataSet ao SqlConnection e deixe a propriedade CommandText em branco
> Vincule o DataSetProvider ao SqlDataSet e altere a propriedade AllowCommandText para [b:01fefa1445]TRUE[/b:01fefa1445]
> vincule o ClientDataSet ao DataSetProvider através da ProviderName e coloque a propriedade CommandText do ClientDataSet como: ´select * from TABELA´ e mude Active para [b:01fefa1445]TRUE[/b:01fefa1445] veja se o erro ocorre!

se o erro ocorrer configure a propriedade CommandText do SqlDataSet igual a do ClientDataSet (´select * from TABELA´) e dê um Fech Params no ClientDataSet sei que é somente para carregar os paramentros né, mais vai lá saber 8) já resolveu alguns problemas meus...
espero ter ajudado :wink:


GOSTEI 0
Titanius

Titanius

19/06/2006

tentei e nada... :(

o que resolveu foi passar a sql pro IBQuery tbm.. doidera.. nunca fiz isso e sempre funcionou...


[]s


GOSTEI 0
Paullsoftware

Paullsoftware

19/06/2006

tentei e nada... :( o que resolveu foi passar a sql pro IBQuery tbm.. doidera.. nunca fiz isso e sempre funcionou... []s

Realmente é estranho, eu uso BDS2006 e funciona perfeitamente...


GOSTEI 0
Titanius

Titanius

19/06/2006

Parece que este erro acontece com a seguinte mescla:

IBX + DSP + CDS

Com

DBX + DSP + CDS, me parece nao ter tido problema...

alguem confirma?


Como no meu caso é o prim eiro.. tá aih o erro!!

[]s


GOSTEI 0
Paullsoftware

Paullsoftware

19/06/2006

É, realmente eu uso numa boa os componentes DbExpress + DSP + CDS e funciona perfeitamente, não posso falar a respeito sobre isso com IBx, pois, não uso...


GOSTEI 0
Adriano Santos

Adriano Santos

19/06/2006

[b:ccdb26839f]Titanius[/b:ccdb26839f], agora entendi perfeitamente seu problema, porém existe um erro de utilização dos componentes. Veja, a lógica correta na utilização da MIDAS é passar para o componente acima do DataSetProvider todos os comandos SQL e seus parâmetros e abrir o ClientDataSet, pois ele que vai trazer os dados para o cliente.

procedure TForm1.Button1Click(Sender: TObject);
begin
  IBDatabase1.Connected := True;

  IBQuery1.SQL.Clear;
  IBQuery1.SQL.Add(´SELECT * FROM CLIENTES´);

  ClientDataSet1.Open;
end;


Então não irá conseguir mesmo abrir desta maneira. Este erro ocorre, pois não há comando SQL no IBQuery, mesmo marcando o DSP como AllowCommandText. Não sou expert nisso, talvez outros colegas possam responder com mais exatidão.


GOSTEI 0
Titanius

Titanius

19/06/2006

Justamente [b:c0ce4ec3ce]Adriano[/b:c0ce4ec3ce], é o que estou tentando entender.. pois no Delphi 7 eu passo direto pro CDS o SQL e pronto... funciona perfeitamente, agora no BDS2006 não.. eu tenho que passar pra Query... achei estranho isso...


[]s


GOSTEI 0
Adriano Santos

Adriano Santos

19/06/2006

Justamente [b:321da3f3ee]Adriano[/b:321da3f3ee], é o que estou tentando entender.. pois no Delphi 7 eu passo direto pro CDS o SQL e pronto... funciona perfeitamente, agora no BDS2006 não.. eu tenho que passar pra Query... achei estranho isso... []s


[b:321da3f3ee]titanius[/b:321da3f3ee] fiz um teste no Delphi 6.0 pq não tenho 7.0 aqui, acontece como vc disse, ou seja, funciona. Véio, acho que vai ter que mudar a programação. Puts, num sei. :wink:


GOSTEI 0
Miuuudo

Miuuudo

19/06/2006

oi adriano...

eu tb não posso te ajudar
mas vim deixar um comentário...

eu deixei de usar o commandtext do ClientDataSet e usei diretamente o do SQLQuery pois, em alguns selects com UNION se não tivesse um espaço em branco antes do select ele dava um erro de sintaxe que não existia. Quando eu colocava um espaço em branco no inicio funcionava.

Jogando diretamente para o SQLQuery e funciona tudo beleza.

Estou em fase de aprendizado ainda mas é sempre bom falar alguma coisa.

um abraço


GOSTEI 0
Titanius

Titanius

19/06/2006

Realmente, se você procurar na literatura, o certo é jogar na Query... estranho no Delphi 7 funcionar sem... :roll: vai entender...

Obrigado a todos

[]s


GOSTEI 0
Adriano Santos

Adriano Santos

19/06/2006

Realmente, se você procurar na literatura, o certo é jogar na Query... estranho no Delphi 7 funcionar sem... :roll: vai entender... Obrigado a todos []s


Eu acredito que no Delphi 2005 e 2006 isso tenha se tornado mais evidente talvez por uma atualização na MIDAS. Sei lá, to chutando.


GOSTEI 0
Carlos_braz

Carlos_braz

19/06/2006

Olá Pessoal

Também estou tendo esse problema ao tentar passar algumas aplicações para D2006.

Preciso migrar algumas aplicações de Delphi 7 para 2006 ou 2007 e algumas coisas não estão funcionando como no deveria.
No D7 funciona beleza e no 2006 não. Aparentemente coisa simples...O codigo abaixo deveria funcionar em ambos:
Eu tento passar os parametros da pesquisa nessa sequencia.

-Fecho o ClientDataSet
-Passo os parametros
-E ativo

Tem esse procedimento em vários lugares, mais ou menos dessa forma. Como tá logo abaixo funciona só no Delphi7 e 2006 não.

begin ClientDataSet_cts_receber.Close; SQLQuery_cts_receber.Params[0].Value := ClientDataSet_pedidoscodigousuario.AsString; SQLQuery_cts_receber.Params[1].Value := ´N´+ClientDataSet_pedidoscodigopedido.AsString; SQLQuery_cts_receber.Params[2].Value := 1; // nos pedidos somente 1 parcela. ClientDataSet_cts_receber.Active := true; if (ClientDataSet_cts_receberCodigo.IsNull) then begin ClientDataSet_cts_receber.Close; SQLQuery_cts_receber.Params[0].Value := ClientDataSet_pedidoscodigousuario.AsString; SQLQuery_cts_receber.Params[1].Value := ´P´+ClientDataSet_pedidoscodigopedido.AsString; SQLQuery_cts_receber.Params[2].Value := 1; // nos pedidos somente 1 parcela. ClientDataSet_cts_receber.Active := true; end; end;

Para funcionar em ambos experimentei mudar a seqüência:
-Passo os parametros
-Fecho o ClientDataSet
-E ativo

Como mostro logo abaixo:
ClientDataSet_cts_receber.Params[0].Value := ClientDataSet_pedidoscodigousuario.AsString; ClientDataSet_cts_receber.Params[1].Value := ´N´+ClientDataSet_pedidoscodigopedido.AsString; ClientDataSet_cts_receber.Params[2].Value := 1; // nos pedidos somente 1 parcela. ClientDataSet_cts_receber.Close; ClientDataSet_cts_receber.Active := true;

Funciona beleza assim, só que exige uma revisão de todo os códigos. Alguem aí tem uma idéia de como manipular o componente sem que se exija essa revisão?


GOSTEI 0
Carlos_braz

Carlos_braz

19/06/2006

Uma correção para a ultima citação:

ClientDataSet_cts_receber.Params[0].Value := ClientDataSet_pedidoscodigousuario.AsString; ClientDataSet_cts_receber.Params[1].Value := ´N´+ClientDataSet_pedidoscodigopedido.AsString; ClientDataSet_cts_receber.Params[2].Value := 1; // nos pedidos somente 1 parcela. ClientDataSet_cts_receber.Close; ClientDataSet_cts_receber.Active := true;


Deve ser:
SQLQuery_cts_receber.Params[0].Value :=ClientDataSet_pedidoscodigousuario.AsString; SQLQuery_cts_receber.Params[1].Value :=´P´+ClientDataSet_pedidoscodigopedido.AsString; SQLQuery_cts_receber.Params[2].Value := 1; // nos pedidos somente 1 parcela. ClientDataSet_cts_receber.Close; ClientDataSet_cts_receber.Active := true;



GOSTEI 0
POSTAR