Fórum inner join é atualizável ? #46723

16/09/2004

0

Olá

Tenho uma ibquery devidamente ligada a um datasource e um ibipdatesql.
Quando abro o form, ativo a query que faz uma consulta em duas tabelas(que não estão relacionadas com chve estrangeira). Mas no código do ibupdatesql, eu exclui os campos da segunda tabela para atualizar só o que é preciso, porém dá erro dizendo que o dataset está fechado, mas está aberto. O código sql tem inner join, será que é por isso que não atualiza? inner join é atualizável ?

Obrigado
Sanses


Sanses

Sanses

Responder

Posts

16/09/2004

Gandalf.nho

Não é diretamente atualizável, no meu caso, eu crio uma view e crio as triggers necessárias na view (BEFORE INSERT, BEFORE UPDATE e BEFORE DELETE) que atualizam a tabela base da view. Aí funciona legal. Inclusive eu tirei essa idéia da própria documentação do Interbase.


Responder

Gostei + 0

17/09/2004

Afarias

A citação da gandalf.nho é uma solução, mas da forma q vc está fazendo tb funciona (para atualização de apenas 1 das tabelas).

Então, qual a menssagem de erro exatamente q ocorre e qual o seu código de update (SQL)?



T+


Responder

Gostei + 0

18/09/2004

Sanses

Olá A.Farias

O código da query qemprestimos é o seguinte:´

select E.IDEMPRESTIMO, E.ENCHEUQUE, E.EMDESCRICAO, E.EMESPECIE, E.EMVALOR, E.IDCLIENTE,
C.NOME, C.ID FROM EMPRESTIMO E INNER JOIN CLIENTES C ON 
E.IDCLIENTE = C.ID


E o código do ibupdatesql para inserir, atualizar e etc eu exclui os itens da tabela clientes, ficando assim:

insert into EMPRESTIMO
  (IDEMPRESTIMO, EMCHEQUE, EMDESCRICAO, EMESPECIE, EMVALOR, IDCLIENTE)
values  (:IDEMPRESTIMO, :EMCHEQUE, :EMDESCRICAO, :EMESPECIE, :EMVALOR, :IDCLIENTE)

/////////////////////////

update EMPRESTIMO
set
  IDEMPRESTIMO = :IDEMPRESTIMO,
  EMCHEQUE = :EMCHEQUE,
  EMDESCRICAO = :EMDESCRICAO,
  EMESPECIE = :EMESPECIE,
  EMVALOR = :EMVALOR,
  IDCLIENTE = :IDCLIENTE
where
  IDEMPRESTIMO = :OLD_IDEMPRESTIMO



Se puder me ajudar agradeço. Não consegui resolver sozinho.
Sanses


Responder

Gostei + 0

18/09/2004

Sanses

Ah sim, acabei esquecendo. O erro que dá diz que a query qemprestimos está fechada(not edit or insert mode). Mas eu a abro junto com o formulário para realizar a pesquisa. Outra coisa uso tedits e não dbedits, portanto paso os valores a serem atualizados manualmente, mas esta parte esta correta.

Sanses


Responder

Gostei + 0

18/09/2004

Afarias

quanto aos comandos SQL está tudo OK, post aqui o seu código Delphi da gravação para ver...

...mas pra adiantar, verifique se o DataSet não está realmente fechado, colocando um código tipo: ´if not IBDataSet1.Active then ...´

e lembre q quando vc usa COMMIT ou ROLLBACK, todos os DataSets da transação em questão são fechados.


T+


Responder

Gostei + 0

19/09/2004

Sanses

Olá AFarias

Bem, quando abro o form, a query já inicia a transaçãocom o sql dela. Esta transação só é finalizada quando o form é fechado. para gravar os dados uso:

dm.qemprestimo.insert;
dm.qemprestimoemdescricao.value:=edit1.text;
...
...
dm.qemprestimo.post;
dm.ibtransaction1.commitretaining;

Se estivesse usando apenas commit, poderia fechar e ai receberia a mensagens de erro. mas não é o caso. E mesmo que fosse, aconteceria da segunda vez em diante pois na primeira vez que atualizo inicio a transação e não a fecho até que a primeir atualização seja efetuada.

Obrigado pela atenção!
Sanses


Responder

Gostei + 0

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

Aceitar