Fórum View atualizavel #51052

17/05/2005

0

Como posso fazer essa view se atualizavél:

select Cep_rua.codigo, Cep_rua.tipo_codigo, Cep_rua.bairro_codigo, Cep_rua.cidade_codigo,
Cep_rua.uf_codigo, cep_tipo.TSIGLA, cep_rua.cep, Cep_rua.NOME, cep_bairro.BNOME,
cep_cidade.CNOME, cep_uf.USIGLA
from cep_rua
left join  cep_Tipo on (tipo_codigo = Tcodigo)
left join CEP_BAIRRO on (bairro_codigo = Bcodigo)
left join CEP_CIDADE on (cidade_codigo = Ccodigo)
left join CEP_UF on (uf_codigo=Ucodigo)
;


A princiap tabela é a cep_rua, que faz ligação para outras como, bairro cidade, uf, tipo.


Sistemald

Sistemald

Responder

Posts

17/05/2005

Sistemald

Tentei da seguinte maneira
create view V_Cep2 (
codigo,
cep,
tipoSigla,
nome,
bairro,
cidade,
uf,
tipo_codigo,
bairro,
cidade_codigo,
uf_codigo
 )
as
select cep_rua.codigo,
cep_rua.cep,
(select cep_TIpo.tsigla from cep_tipo where cep_tipo.tcodigo = cep_rua.tipo_codigo) as TipoSigla,
cep_rua.nome,
(select cep_bairro.bnome from cep_bairro where cep_bairro.bcodigo = cep_rua.bairro_codigo) as Bairro,
(select cep_Cidade.cnome from cep_cidade where cep_cidade.Ccodigo = cep_rua.Cidade_codigo) as Cidade,
(select cep_UF.usigla from cep_Uf where cep_uf.ucodigo = cep_rua.uf_codigo) as UF,
cep_rua.tipo_codigo, cep_rua.bairro_codigo, cep_rua.cidade_codigo , cep_rua.uf_codigo
from cep_rua


Mas o seguinte erro ocorreu:
IbExpert - This operation is not defined for system tables. unsuccessful metadata update. STORE RDB$RELATION_FIELDS failed. attempt to store duplicate value (visible to active transactions) in unique index ´RDB$INDEX_15´.



Responder

Gostei + 0

17/05/2005

Gandalf.nho

Crie sua view normalmente. O segredo para torná-la atualizável é usar triggers, uma para cada evento do tipo BEFORE na view. Se a view for a query do primeiro post, as triggers seriam assim:

SET TERM ^;

CREATE TRIGGER V_CEP_BI FOR V_CEP
BEFORE INSERT
AS
BEGIN
INSERT INTO Cep_rua VALUES(NEW.codigo, NEW.tipo_codigo, NEW.bairro_codigo, NEW.cidade_codigo, NEW.uf_codigo, NEW.cep, NEW.NOME;
END ^

CREATE TRIGGER V_CEP_BU FOR V_CEP
BEFORE UPDATE
AS
BEGIN
UPDATE Cep_rua SET codigo = NEW.codigo, tipo_codigo = NEW.tipo_codigo, bairro_codigo = NEW.bairro_codigo, cidade_codigo = NEW.cidade_codigo, uf_codigo = NEW.uf_codigo, cep = NEW.cep, NOME = NEW.NOME WHERE OLD.codigo;
END ^

CREATE TRIGGER V_CEP_BD FOR V_CEP
BEFORE DELETE
AS
BEGIN
    DELETE FROM Cep_rua WHERE OLD.codigo;
END ^

SET TERM ;^


Pronto, agora sua view será atualizável. Não esqueça que vc se refere apenas aos campos da tabela principal referenciada na view.


Responder

Gostei + 0

18/05/2005

Sistemald

Dessa forma poderei usar a view no IBDataSet como se fosse uma tabela?


Responder

Gostei + 0

18/05/2005

Gandalf.nho

Dessa forma poderei usar a view no IBDataSet como se fosse uma tabela?


Sim.


Responder

Gostei + 0

18/05/2005

Sistemald

Em outras tentativas que eu estava fazendo, tentei o seguinte, em select sql ´select * from V_CEP´

mas em updatesql, insertsql e deletesql, montei em cima da principal(cep_rua), tem algum proble nisto.

Explicando melhor:

SelectSql:
select * from V_CEP


modifysql:
UPDATE CEP_RUA
SET
  CODIGO = :CODIGO,
  CEP = :CEP,
  TIPO_CODIGO = :TIPO_CODIGO,
  NOME = :NOME,
  BAIRRO_CODIGO = :BAIRRO_CODIGO,
  CIDADE_CODIGO = :CIDADE_CODIGO,
  UF_CODIGO = :UF_CODIGO
WHERE
  CODIGO = :OLD_CODIGO


InsertSql
INSERT INTO CEP_RUA
  (CODIGO, CEP, TIPO_CODIGO, NOME, BAIRRO_CODIGO, CIDADE_CODIGO, UF_CODIGO)
VALUES
  (:CODIGO, :CEP, :TIPO_CODIGO, :NOME, :BAIRRO_CODIGO, :CIDADE_CODIGO, 
   :UF_CODIGO)


DeleteSQL
DELETE FROM CEP_RUA
WHERE
  CODIGO = :OLD_CODIGO



Responder

Gostei + 0

18/05/2005

Gandalf.nho

Eu sempre montei as querys em cima da view toda, usando o próprio wizard do IBDataset, não sei se do jeito acima funciona.


Responder

Gostei + 0

18/05/2005

Sistemald

Valeu pelas dicas, vou fazer os teste e posto aqui.


Responder

Gostei + 0

19/05/2005

Sistemald

Do jeito que eu falei não funcionou corretamente, então partir para o seu jeito, crie as triggers, todas funcionou menos a de insert, da o seguinte erro, [b:304801ba4f]out of memory[/b:304801ba4f], O que pode ser?


Responder

Gostei + 0

19/05/2005

Gandalf.nho

Estranho, esse erro ocorre ao criar a trigger ou quando ela é chamada? Eu conferi as triggers que te passei conforme teu modelo e o único problema que encontrei foi que faltou o parêntese de fechamento na primeira trigger (mas isso ele acusaria o erro já na hora de compilar).
Vc montou a sua view exatamente como a query do post inicial?


Responder

Gostei + 0

19/05/2005

Sistemald

Eu fechei os parenteses, confira a minha trigger:
AS
begin
INSERT INTO Cep_rua VALUES(NEW.codigo, NEW.cep, NEW.tipo_codigo, NEW.NOME, NEW.bairro_codigo, NEW.cidade_codigo, NEW.uf_codigo);
end


Escrive ela no IBExpert, o erro foi ao chamar o metodo POST do MDODataSet, no comando inset acima esta na ordem correta.


Responder

Gostei + 0

19/05/2005

Sistemald

Esta é a minha InsertSQL do MDODataSet:

INSERT INTO V_CEP
  (CODIGO, CEP,  TIPO_CODIGO, NOME, BAIRRO_CODIGO, CIDADE_CODIGO, UF_CODIGO)
VALUES
  (:CODIGO, :CEP, :TIPO_CODIGO, :NOME, :BAIRRO_CODIGO, :CIDADE_CODIGO, :UF_CODIGO)


Coloquei apenas os campos que fazem parte da tabela CEP_RUA.


Responder

Gostei + 0

20/05/2005

Gandalf.nho

Não sei como funciona no MDO, mas no IBX nas propriedades SQL eu incluo todos os campos da view, não só o da tabela central. Tente incluir os outros campos tb. Notei tb que na sua trigger INSERT a ordem dos campos está diferente do meu exemplo, vc alterou a ordem na view?


Responder

Gostei + 0

20/05/2005

Sistemald

Sim a ordem da view é diferente da tabela central, montei de acordo, fiz algumas alterações no meu projeto, e funcionou, porém, ao dar o comando, append, ocorre um fetch all, e a tabela tem mais de 500.000 registro, ou estranho é que se eu pressionar o botão ´insert´ do teclado quando o focu está no DBGrid funciona perfeitamente.


Responder

Gostei + 0

20/05/2005

Sistemald

Quando dou append, fica lento tanto na hora de dar o post quanto o cancel


Responder

Gostei + 0

20/05/2005

Sistemald

Fiz o teste usando a paleta ibx e obtive o mesmo problema


Responder

Gostei + 0

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

Aceitar