Problemas ao Mudar o CommandText do CDS, 3 camadas

Delphi

18/05/2005

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


Titanius

Titanius

Curtidas 0

Respostas

Kotho

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...


GOSTEI 0
Titanius

Titanius

18/05/2005

Olá,

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

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...


GOSTEI 0
Titanius

Titanius

18/05/2005

hum, vou testar isso...


GOSTEI 0
Titanius

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


GOSTEI 0
Kotho

Kotho

18/05/2005

Qual o componente de conexão você está usando?


GOSTEI 0
Kotho

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

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


GOSTEI 0
Mmoreira

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


GOSTEI 0
Titanius

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


GOSTEI 0
Mmoreira

Mmoreira

18/05/2005

Titanius

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

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


GOSTEI 0
Kotho

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

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


GOSTEI 0
Mmoreira

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 ???


GOSTEI 0
Kotho

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

Titanius

18/05/2005

beleza intaum, vou tentar aqui...

qualquer coisa eu volto aki...


[]s


GOSTEI 0
Titanius

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?


GOSTEI 0
Titanius

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


GOSTEI 0
Titanius

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


GOSTEI 0
Kotho

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???


GOSTEI 0
Titanius

Titanius

18/05/2005

Como funciona este evento?


GOSTEI 0
Kotho

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.


GOSTEI 0
Titanius

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?


GOSTEI 0
Kotho

Kotho

18/05/2005

Por acaso tem algum select em que você está fazendo join???


GOSTEI 0
Titanius

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


GOSTEI 0
Kotho

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

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.


GOSTEI 0
Kotho

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´...


GOSTEI 0
Titanius

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:


GOSTEI 0
Kotho

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


GOSTEI 0
Titanius

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


GOSTEI 0
Kotho

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...


GOSTEI 0
Titanius

Titanius

18/05/2005

enviei...


GOSTEI 0
Kotho

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

Titanius

18/05/2005

recebeu aih?


GOSTEI 0
Kotho

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...


GOSTEI 0
Titanius

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.


GOSTEI 0
POSTAR