Problemas ao Mudar o CommandText do CDS, 3 camadas
Olá, estou usando um sistema em 3 camadas, e no servidor no meu DSP, eu cooquei o AlowCommandText := True, certo, porem quando vou via codigo e altero meu CommandText ele nao funciona, fica sempre o SQL anterior.... o que pode ser?
[]s
[]s
Titanius
Curtidas 0
Respostas
Kotho
18/05/2005
Será que você não esqueceu de compilar o servidor??? Porque esse esquema funciona perfeitamente....
Que tipo de alteração você está fazendo no CommandText??? você precisa colocar o SQL inteiro...
Que tipo de alteração você está fazendo no CommandText??? você precisa colocar o SQL inteiro...
GOSTEI 0
Titanius
18/05/2005
Olá,
Já recompilei o servidor e tudo, o que estou fazendo é o seguinte:
tenho de inicio:
e assim por diante, entao.. nao vejo problemas em usar isso :(
[]s
Já recompilei o servidor e tudo, o que estou fazendo é o seguinte:
tenho de inicio:
select * from produto[/code aih eu troco na media que o cliente quer: [code] select * from produto where descricao like ´cce¬´ ou select * from produto where descricao like ´¬cce¬´
e assim por diante, entao.. nao vejo problemas em usar isso :(
[]s
GOSTEI 0
Kotho
18/05/2005
Que estranho... eu nunca tive problemas com isso...
Não estou afirmando que seja isso... mas não custa tentar...
Eu ouvi falar que o DBXpress tem problemas com nomes de objetos em minúsculo... eu, para evitar qualquer problema, só utilizo maiúsculas...
tenta mudar o sql para MAIÚSCULA...
Não estou afirmando que seja isso... mas não custa tentar...
Eu ouvi falar que o DBXpress tem problemas com nomes de objetos em minúsculo... eu, para evitar qualquer problema, só utilizo maiúsculas...
tenta mudar o sql para MAIÚSCULA...
GOSTEI 0
Titanius
18/05/2005
hum, vou testar isso...
GOSTEI 0
Titanius
18/05/2005
amigo nao funcionou,
eh o seguinte parece que ele nao limpa o CDS, pois a ultima consulta sempre fica lah, independente qual consulta seja...
estranho mesmo..
[]s
eh o seguinte parece que ele nao limpa o CDS, pois a ultima consulta sempre fica lah, independente qual consulta seja...
estranho mesmo..
[]s
GOSTEI 0
Kotho
18/05/2005
Qual o componente de conexão você está usando?
GOSTEI 0
Kotho
18/05/2005
Cara, tava olhando outro post teu... para funcionar o commandtext, você tem que usar SQLQuery... Pelo jeito, você tá usando SQLTable
GOSTEI 0
Titanius
18/05/2005
Amigo, realmente estava usando SQLDataSet, porem mudei pro SQLQuery mesmo...
Estou usando o DBX... bem, consegui fazer a ligação, realmente apareceu o campo lá bonitinho :D :D :D, to feliz pacas... porem.. (tudo na vida tem um porem)
Tenho que trazer apenas um registro, por isso acrescentei no Pedido a clausula WHERE,
where pedido = :pedido
certo, criou o parametro, mas ele nao vai pro CDS no cliente... ou fiz algo de errado? Como chamo apenas o registro que eu quero, ao invez de todos?
Se eu trouxer meu registro, os itens automaticamente serao trazidos tbm?
Desde ja agradeco
[]s
Estou usando o DBX... bem, consegui fazer a ligação, realmente apareceu o campo lá bonitinho :D :D :D, to feliz pacas... porem.. (tudo na vida tem um porem)
Tenho que trazer apenas um registro, por isso acrescentei no Pedido a clausula WHERE,
where pedido = :pedido
certo, criou o parametro, mas ele nao vai pro CDS no cliente... ou fiz algo de errado? Como chamo apenas o registro que eu quero, ao invez de todos?
Se eu trouxer meu registro, os itens automaticamente serao trazidos tbm?
Desde ja agradeco
[]s
GOSTEI 0
Mmoreira
18/05/2005
Titanius
Bom tudo o que vc fez parece estar certo, era pra estar funcionando ...
Agora volto a te perguntar o que o Kotho já te perguntou antes: Voce esta enviando o código sql inteiro ??? Ou esta enviando apenas o final: where .......
Tem que mandar tudo depois dar um close no ClientDataSet e depois um open
Bom tudo o que vc fez parece estar certo, era pra estar funcionando ...
Agora volto a te perguntar o que o Kotho já te perguntou antes: Voce esta enviando o código sql inteiro ??? Ou esta enviando apenas o final: where .......
Tem que mandar tudo depois dar um close no ClientDataSet e depois um open
GOSTEI 0
Titanius
18/05/2005
mMOREIRA,
Aproveitei o que o amigo Kotho disse, no outro topico, e agora nao estou mandando mais o CommandText, fiz tudo lah no proprio servidor:
Select * from pedidos
where pedido = :pedido
ou seja, eu deveria passar este parametro no client, e ele me traria somente um registro, ou eu posso passar o CommandText normalmente, que o vinculo que eu fiz permanecerá?
So que este parametro nao esta aparecendo no Params do meu CDS. :(
[]s
Aproveitei o que o amigo Kotho disse, no outro topico, e agora nao estou mandando mais o CommandText, fiz tudo lah no proprio servidor:
Select * from pedidos
where pedido = :pedido
ou seja, eu deveria passar este parametro no client, e ele me traria somente um registro, ou eu posso passar o CommandText normalmente, que o vinculo que eu fiz permanecerá?
So que este parametro nao esta aparecendo no Params do meu CDS. :(
[]s
GOSTEI 0
Mmoreira
18/05/2005
Titanius
vc poderia fazer das 2 maneiras como vc mensionou na sua ultima mensagem ....
agora se vc colocou no servidor:
o parametro só vai aparecer no cliente depois que vc dar um fetch Params no ClientDataSet da aplicação cliente .... tenta fazer isso e diz se o parametro apareceu ...
vc poderia fazer das 2 maneiras como vc mensionou na sua ultima mensagem ....
agora se vc colocou no servidor:
Select * from pedidos where pedido = :pedido
o parametro só vai aparecer no cliente depois que vc dar um fetch Params no ClientDataSet da aplicação cliente .... tenta fazer isso e diz se o parametro apareceu ...
GOSTEI 0
Titanius
18/05/2005
FUNCIONOU!!!!!
Mas... (coitadinho de voces, deve estar cheio dos meus mais :D );
quando eu abro o meu ItensPedido, fala [b:4facafcf46]Cannot perform this operation on a close dataset[/b:4facafcf46]
Pois bem, este erro é porque lah no meu servidor o SQLQuery referente ao Pedido, esta fechado, quando eu lá no servidor ativo ele, e ativo o ItensPedido, ele funciona, pois bem, eis minha pergunta, meu CDS não abre meu SQLQuery não? pois sem ele abrir, a relacao master-detail que eu fiz nao funciona, ou estou errado?
Obrigado + uma vez.
[]s
Mas... (coitadinho de voces, deve estar cheio dos meus mais :D );
quando eu abro o meu ItensPedido, fala [b:4facafcf46]Cannot perform this operation on a close dataset[/b:4facafcf46]
Pois bem, este erro é porque lah no meu servidor o SQLQuery referente ao Pedido, esta fechado, quando eu lá no servidor ativo ele, e ativo o ItensPedido, ele funciona, pois bem, eis minha pergunta, meu CDS não abre meu SQLQuery não? pois sem ele abrir, a relacao master-detail que eu fiz nao funciona, ou estou errado?
Obrigado + uma vez.
[]s
GOSTEI 0
Kotho
18/05/2005
Para o parâmetro ir do Servidor para o Cliente... clique com o botão direito do mouse sobre o ClientDataSet, e selecione Fetch Params...
GOSTEI 0
Titanius
18/05/2005
funcionou, eskeci de dar p fetch params no itenspedido, e depois marcar la o DataSetField.... agora está trazendo tudo..
Muitissimo obrigado a todos... :D
So uma ultima perguntinha, ao dar um insert no registro itenspedido, ele insere automaticamente o codigo do pedido, ou tenho q fazer na mao?
[]s
Muitissimo obrigado a todos... :D
So uma ultima perguntinha, ao dar um insert no registro itenspedido, ele insere automaticamente o codigo do pedido, ou tenho q fazer na mao?
[]s
GOSTEI 0
Mmoreira
18/05/2005
Como vc fez o relacionamento ???
A propósito desta consulta é porque vc esta querendo emitir um relatorio ?? Será que não dá para usar apenas um SqlDs ???
A propósito desta consulta é porque vc esta querendo emitir um relatorio ?? Será que não dá para usar apenas um SqlDs ???
GOSTEI 0
Kotho
18/05/2005
Tem que fazer na mão... tem um evento chamado OnNewRecord, e outro, OnAfterInsert, que podem ser usados para esse fim...
GOSTEI 0
Titanius
18/05/2005
beleza intaum, vou tentar aqui...
qualquer coisa eu volto aki...
[]s
qualquer coisa eu volto aki...
[]s
GOSTEI 0
Titanius
18/05/2005
seguinte... funcionou parte...
quando vou deletar aparece: unable to find record.
faço assim:
cdsItemsPedido.First;
while not cdsItensPedido.EOF do
begin
cdsItensPedido.Delete;
cdsItensPedido.Next;
end;
cdsItemsPedido.ApplyUpdates(0);
cdsPedido.Delete;
cdsPedido.ApplyUpdates(0);
Já coloquei os itens lá o InKey no Provider Flags..e nada.. no meu banco esta com o OnDelete - Cascade, porem quando tento dar o delete so no pedido, fala que tem filho e nao pode ser deletado.. e jah coloquei laj no Provider o AllowCascadeDelete como True...
e agora? como arrumo isso?
quando vou deletar aparece: unable to find record.
faço assim:
cdsItemsPedido.First;
while not cdsItensPedido.EOF do
begin
cdsItensPedido.Delete;
cdsItensPedido.Next;
end;
cdsItemsPedido.ApplyUpdates(0);
cdsPedido.Delete;
cdsPedido.ApplyUpdates(0);
Já coloquei os itens lá o InKey no Provider Flags..e nada.. no meu banco esta com o OnDelete - Cascade, porem quando tento dar o delete so no pedido, fala que tem filho e nao pode ser deletado.. e jah coloquei laj no Provider o AllowCascadeDelete como True...
e agora? como arrumo isso?
GOSTEI 0
Titanius
18/05/2005
olhando o grid, tenho 10 itens, e eu percebi que ele apaga alguns, quando chega nos primeiros da este erro... será q esta perdendo o ponteiro?
[]s
[]s
GOSTEI 0
Titanius
18/05/2005
consegui resolver o problema do Key... foi colocando o InKey no servidor tambem..
agora voltei a estaca zero.. ele nao da erro, mas o registro continua la, nao deleta.. como disse coloquei um reconcileerror e nada...
meu codigo do reconcile esta assim:
Action := HandleReconcileError(DataSet, UpdateKind, E);
e nada... o que pode ser?
[]s
agora voltei a estaca zero.. ele nao da erro, mas o registro continua la, nao deleta.. como disse coloquei um reconcileerror e nada...
meu codigo do reconcile esta assim:
Action := HandleReconcileError(DataSet, UpdateKind, E);
e nada... o que pode ser?
[]s
GOSTEI 0
Kotho
18/05/2005
Você já tentou debugar o server???
se não souber como... [url=http://forum.clubedelphi.net/viewtopic.php?t=62922]da uma olhada aqui [/url]
Você sabe como funciona o evento OnUpdateRecord que se encontra no DataSetProvider???
se não souber como... [url=http://forum.clubedelphi.net/viewtopic.php?t=62922]da uma olhada aqui [/url]
Você sabe como funciona o evento OnUpdateRecord que se encontra no DataSetProvider???
GOSTEI 0
Titanius
18/05/2005
Como funciona este evento?
GOSTEI 0
Kotho
18/05/2005
Quando se execute o ApplyUpdates no lado cliente, é transferido uma parte do ClientDataSet chamada de Delta para o Server... esse cara tem todas as atualizações (insert, delete e update) que foram realizadas no ClientDataSet...
Pode haver mais de um registro no Delta...
Depois esse evento é executado para cada linha desse delta... lá tem um parâmetro chamado DeltaDS, que são os dados alterados... (detalhe: os dados não alterados estarão vazios, mas você pode acessar o valor antigo com .OldValue)... Tem um outro parâmetro chamado UpdateKind, que pode conter os valores ukInsert, ukModify e ukDelete...
Ou seja, esse evento é muito bom para debugar... você pode, se não quizer executar o debug, gerar arquivos texto para verificar os valores...
É muito útil para disparar processos semelhantes a triggers dos SGBD´s.
Pode haver mais de um registro no Delta...
Depois esse evento é executado para cada linha desse delta... lá tem um parâmetro chamado DeltaDS, que são os dados alterados... (detalhe: os dados não alterados estarão vazios, mas você pode acessar o valor antigo com .OldValue)... Tem um outro parâmetro chamado UpdateKind, que pode conter os valores ukInsert, ukModify e ukDelete...
Ou seja, esse evento é muito bom para debugar... você pode, se não quizer executar o debug, gerar arquivos texto para verificar os valores...
É muito útil para disparar processos semelhantes a triggers dos SGBD´s.
GOSTEI 0
Titanius
18/05/2005
lçarguei o delete pra la, agora to tentando com o insert mesmo..
quando dou o applyupdates(0) ele retorna no reconcileerror: cannot modify read only dataset...
todos os meus dataset estao como readonly = false, e todos os meus campos do FK, estao com o providerflags zerados...
o que fazer?
quando dou o applyupdates(0) ele retorna no reconcileerror: cannot modify read only dataset...
todos os meus dataset estao como readonly = false, e todos os meus campos do FK, estao com o providerflags zerados...
o que fazer?
GOSTEI 0
Kotho
18/05/2005
Por acaso tem algum select em que você está fazendo join???
GOSTEI 0
Titanius
18/05/2005
tem.. a do pedido e do itenspedido
porem, eu lah no server coloquei os 2 campos join do cliente, e tirei o Update do ProviderFlags, e o mesmo eu fiz com o itens do pedido, bem como o mesmo no lado do cliente... e mesmo assim nada... ou estou fazendo algo errado.
[]s
porem, eu lah no server coloquei os 2 campos join do cliente, e tirei o Update do ProviderFlags, e o mesmo eu fiz com o itens do pedido, bem como o mesmo no lado do cliente... e mesmo assim nada... ou estou fazendo algo errado.
[]s
GOSTEI 0
Kotho
18/05/2005
Não é que esteja errado... é que vai dar mais trabalho do que se fizesse utilizando Master/Detail, e o resultado vai ser praticamente o mesmo... porém você pode testar uma coisa... no Provider, tem um evento chamado OnGetTableName... atribua o nome da tabela na variável TableName...
GOSTEI 0
Titanius
18/05/2005
Certo, fui la e passei a tabela, e continua o erro...
Li aqui mesmo no Clube delphi, que uma pessoa arrumou isso colocando a propriedade ResolveToDataset para False, tentei isso tambem e nada, dá [b:dc068b4756]erro desconhecido[/b:dc068b4756].
Como faço isso no esquema que você falou de Master-Detail....?
[]s
Fellipe H.
Li aqui mesmo no Clube delphi, que uma pessoa arrumou isso colocando a propriedade ResolveToDataset para False, tentei isso tambem e nada, dá [b:dc068b4756]erro desconhecido[/b:dc068b4756].
Como faço isso no esquema que você falou de Master-Detail....?
[]s
Fellipe H.
GOSTEI 0
Kotho
18/05/2005
Funciona assim: para cada tabela, você coloca um SQLQuery... tem um que será o Master, e outro(ou outros) que serão Detail... Para ligar um ao outro, é necessário colocar um DataSource... vamos dar nomes aos bois...
SQLPedido (SQLQuery)
SQLItemPedido (SQLQuery)
LNKPedido (DataSource)
em LNKPedido.DataSet coloque o SQLPedido
em SQLItemPedido.DataSource coloque o LNKPedido
o Select de SQLItemPedido tem que ter como parametro o(s) nome(s) de campo(s) de SQLPedido (por exemplo :NRPEDIDO).
Depois de compilar a aplicação servidora, abra a cliente...
coloque dois ClientDataSet´s
CDSPedido
CDSItemPedido
... o CDSPedido ligue ao SQLPedido... adicione todos os fields... vai aparecer um campo chamado SQLItemPedido
em CDSItemPedido selecione em DataSetField o Field que apareceu...
A grande vantagem de se utilizar isso, é que o ApplyUpdate é dado somente para o Master, e todos os Details estarão na transação...
no OnUpdateRecord, muda um pouco... para saber qual tabela está sendo disparado, é preciso testar if SourceDS.name = ´SQLPedido´...
SQLPedido (SQLQuery)
SQLItemPedido (SQLQuery)
LNKPedido (DataSource)
em LNKPedido.DataSet coloque o SQLPedido
em SQLItemPedido.DataSource coloque o LNKPedido
o Select de SQLItemPedido tem que ter como parametro o(s) nome(s) de campo(s) de SQLPedido (por exemplo :NRPEDIDO).
Depois de compilar a aplicação servidora, abra a cliente...
coloque dois ClientDataSet´s
CDSPedido
CDSItemPedido
... o CDSPedido ligue ao SQLPedido... adicione todos os fields... vai aparecer um campo chamado SQLItemPedido
em CDSItemPedido selecione em DataSetField o Field que apareceu...
A grande vantagem de se utilizar isso, é que o ApplyUpdate é dado somente para o Master, e todos os Details estarão na transação...
no OnUpdateRecord, muda um pouco... para saber qual tabela está sendo disparado, é preciso testar if SourceDS.name = ´SQLPedido´...
GOSTEI 0
Titanius
18/05/2005
fiz tudo que você falou...
o relacionamento funcionou blz.. mas no ApplyUpdates, da o seguinte erro:
DBX Error: No Mapping for Error Code Found
tem mais alguma dica? Estou começando a desistir.... nao consigo fazer isso funcionar.. :cry: :cry: :cry:
o relacionamento funcionou blz.. mas no ApplyUpdates, da o seguinte erro:
DBX Error: No Mapping for Error Code Found
tem mais alguma dica? Estou começando a desistir.... nao consigo fazer isso funcionar.. :cry: :cry: :cry:
GOSTEI 0
Kotho
18/05/2005
Cara... nós somos brasileiros... não desistimos nunca... hehehe
Acho que o que está faltando é definir os campos chave no provider flags como Key
Acho que o que está faltando é definir os campos chave no provider flags como Key
GOSTEI 0
Titanius
18/05/2005
Amigo, seguinte... :cry:
Coloquei o Key em todos os campos, inclusive no campo NrPedido, no ItensPedido, e nao funciona, continua o mesmo erro..
não sei mesmo onde esta o erro! eu poderia lhe enviar os forms, aih vc daria uma olhada, poderia?
[]s
Coloquei o Key em todos os campos, inclusive no campo NrPedido, no ItensPedido, e nao funciona, continua o mesmo erro..
não sei mesmo onde esta o erro! eu poderia lhe enviar os forms, aih vc daria uma olhada, poderia?
[]s
GOSTEI 0
Kotho
18/05/2005
opa... pode mandar...
manda para alessandro.goncalves@jshayeb.com.br
manda o banco tbém... pode ser só com alguns registros...
manda para alessandro.goncalves@jshayeb.com.br
manda o banco tbém... pode ser só com alguns registros...
GOSTEI 0
Titanius
18/05/2005
enviei...
GOSTEI 0
Kotho
18/05/2005
vc não mandou o banco né... posta o DDL dele aqui para eu poder cria-lo vazio mesmo...
GOSTEI 0
Titanius
18/05/2005
recebeu aih?
GOSTEI 0
Kotho
18/05/2005
Uma tentativa... o select do pedido está em minúsculo... tente mudar, da mesma forma que você fez com o Item...
Um conselho... usa o SQLQuery... é bem melhor para visualizar o Select, e ele é mais leve...
Um conselho... usa o SQLQuery... é bem melhor para visualizar o Select, e ele é mais leve...
GOSTEI 0
Titanius
18/05/2005
cara.. vc nao vai acreditar!!!!!
era isso mesmo, a porcaria do maiusculo... nao acredito... sacanagem mesmo...
isso eu algum bug do DBX?
Cara, valeu mesmo, mesmo sua ajuda foi importantissima para o sucesso deste problema!!
[]s
Fellipe H.
era isso mesmo, a porcaria do maiusculo... nao acredito... sacanagem mesmo...
isso eu algum bug do DBX?
Cara, valeu mesmo, mesmo sua ajuda foi importantissima para o sucesso deste problema!!
[]s
Fellipe H.
GOSTEI 0