View atualizavel
Como posso fazer essa view se atualizavél:
A princiap tabela é a cep_rua, que faz ligação para outras como, bairro cidade, uf, tipo.
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
Curtidas 0
Respostas
Sistemald
17/05/2005
Tentei da seguinte maneira
Mas o seguinte erro ocorreu:
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´.
GOSTEI 0
Gandalf.nho
17/05/2005
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:
Pronto, agora sua view será atualizável. Não esqueça que vc se refere apenas aos campos da tabela principal referenciada na view.
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.
GOSTEI 0
Sistemald
17/05/2005
Dessa forma poderei usar a view no IBDataSet como se fosse uma tabela?
GOSTEI 0
Gandalf.nho
17/05/2005
Dessa forma poderei usar a view no IBDataSet como se fosse uma tabela?
Sim.
GOSTEI 0
Sistemald
17/05/2005
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:
modifysql:
InsertSql
DeleteSQL
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
GOSTEI 0
Gandalf.nho
17/05/2005
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.
GOSTEI 0
Sistemald
17/05/2005
Valeu pelas dicas, vou fazer os teste e posto aqui.
GOSTEI 0
Sistemald
17/05/2005
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?
GOSTEI 0
Gandalf.nho
17/05/2005
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?
Vc montou a sua view exatamente como a query do post inicial?
GOSTEI 0
Sistemald
17/05/2005
Eu fechei os parenteses, confira a minha trigger:
Escrive ela no IBExpert, o erro foi ao chamar o metodo POST do MDODataSet, no comando inset acima esta na ordem correta.
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.
GOSTEI 0
Sistemald
17/05/2005
Esta é a minha InsertSQL do MDODataSet:
Coloquei apenas os campos que fazem parte da tabela CEP_RUA.
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.
GOSTEI 0
Gandalf.nho
17/05/2005
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?
GOSTEI 0
Sistemald
17/05/2005
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.
GOSTEI 0
Sistemald
17/05/2005
Quando dou append, fica lento tanto na hora de dar o post quanto o cancel
GOSTEI 0
Sistemald
17/05/2005
Fiz o teste usando a paleta ibx e obtive o mesmo problema
GOSTEI 0
Sistemald
17/05/2005
Ao invés de de dar o comando [b:50094a20c0]append[/b:50094a20c0] dei [b:50094a20c0]insert[/b:50094a20c0], e o problema não ocorreu.
Qual a diferença entres os dois comandos(ibDataset ou MDODataset)?
Qual a diferença entres os dois comandos(ibDataset ou MDODataset)?
GOSTEI 0
Gandalf.nho
17/05/2005
Só uma coisa, vc está fazendo um SELECT * FROM VIEW direto? Sem usar WHERE? Isso tb prejudica e muito o desempenho.
GOSTEI 0
Sistemald
17/05/2005
Sim, fiz alguns teste e observei o seguinte:
Com a seguinte [b:64780f44af]selectSQL[/b:64780f44af]:
Ao chamar o metodo Append, fazia tudo normal os campos ficavam em branco sem demora nenhuma, mas ao salvar ou cancelar, ocorria um Fecth All, e demorava um bom tempo.
se ao invés de chamar o metodo Append eu chamasse [b:64780f44af]Insert[/b:64780f44af] tudo ocoree bem, até na hora de salvar ou cancelar.
Agora com a seguinte selectSQL:
Chamando ambos os metodos tudo ocorre bem.
[b:64780f44af]Duvida[/b:64780f44af]
O estranho é o Fecth all que ocorre, e não me preocupei em delimitar a pesquisa com a [b:64780f44af]where[/b:64780f44af], por causa da propriedade Buffers Chunks está definido com um valor baixo(100).
Com a seguinte [b:64780f44af]selectSQL[/b:64780f44af]:
select * from V_CEP
Ao chamar o metodo Append, fazia tudo normal os campos ficavam em branco sem demora nenhuma, mas ao salvar ou cancelar, ocorria um Fecth All, e demorava um bom tempo.
se ao invés de chamar o metodo Append eu chamasse [b:64780f44af]Insert[/b:64780f44af] tudo ocoree bem, até na hora de salvar ou cancelar.
Agora com a seguinte selectSQL:
select * from V_CEP where codigo = :codigo
Chamando ambos os metodos tudo ocorre bem.
[b:64780f44af]Duvida[/b:64780f44af]
O estranho é o Fecth all que ocorre, e não me preocupei em delimitar a pesquisa com a [b:64780f44af]where[/b:64780f44af], por causa da propriedade Buffers Chunks está definido com um valor baixo(100).
GOSTEI 0
Gandalf.nho
17/05/2005
De acordo com o help do Delphi, o método Append posiciona o cursor no final do dataset antes de abrir o registro em branco. Deve ser por isso o FetchAll
GOSTEI 0
Sistemald
17/05/2005
é isso mesmo, você matou a cacharada do fecth all, valeu cara, meu problema foi resolvido de forma satisfatória.
Obrigado.
Obrigado.
GOSTEI 0