Mestre/Detalhe dbExpress

18/03/2006

0

To fazendo um exemplo com mestre detalhes usando o Banco Employee e dele as tabelas CUSTORME e SALES . Que se relacionam atraves da Chave CUST_NO

[b:6635b8ed6b]Então pela biografia faço assim :[/b:6635b8ed6b]

SQLConnetion -->>> Conecto com o Banco SqlQuery a)Connection --->> SqlConnection1 b)Propriedade Sql digito : Select * From CUSTOMER 3)DataSetProvinder a)Connection --->> SqlConnection1 b)DataSet -->> SqlQuery1 4)ClinteDataSet1 a)ProviderName -->> DataSetProvider 5) DataSorce1 a)Dataser -->> ClientDataSet1 6)DbGri1 DataSorce --->> DataSet1 7)DbNavigator DataSouce -->> Dataset1


[color=darkblue:6635b8ed6b][b:6635b8ed6b]Relacionamento[/b:6635b8ed6b][/color:6635b8ed6b]

DataSorce2 a)DataSet -->>> SqlQuery1 SqlQuer2 a)Connection --->> SqlConnection1 b)DataSouce --->> DataSorce2; c)Propriedade Sql digito : Select * From SALES WHERE CUST_NO=:CUST_NO Clintdataset2 a)DataSetFields -->> ClientDataSet1SQLQuery2 DataSource3 a)DataSet -->> ClintDataSet2; DbGrid2 a)DataSouce -->> Datasorce3; DbNavegator2 a)DataSource---DataSouce3;


[color=darkblue:6635b8ed6b][b:6635b8ed6b]Aqui finalizo e faço[/b:6635b8ed6b][/color:6635b8ed6b]

ClientDataSet1
a)Active igual a True
b)Dois clichs no COmponente e Adiciono All
c)No Final aparece um campo (Nested Dataset) que é o Relacionamento em si

ClintDataset2
a)Active igual a True

Tenho ainda um Botão
ApplicarDelta
DM.ClientDataSet1.ApplyUpdates(0);


:P :P :P :P
[b:6635b8ed6b]Rodo a aplicaçao e o relacionamento se comporta bem.. Altero as propriedade do Mestre (Que nesse caso é a tabela CUSTOMER) e clico no Delta e fica tudo bem[/b:6635b8ed6b]

:cry: :cry: :cry: :cry:
[color=darkred:6635b8ed6b][b:6635b8ed6b]O Problema é quando faço qualquer alteração no Escravo(SALES) , para atualizar , pelas biografias , deveria ser também o método
DM.ClientDataSet1.ApplyUpdates(0); , Porem quando faço isto me retorna um Erro... [/b:6635b8ed6b][/color:6635b8ed6b]

:?: :?: :?: :?: :?:
[b:6635b8ed6b]Em outras palavras não conseguo salvar dados alterados na tabela Escravo , numa estrutura Mestre -->> Detalhe ,usando o DBEXPRESS [/b:6635b8ed6b]

Alguem sabe aonde eu estou errando... :?: :?: :?: :?:

Obrigado...


Marco Salles

Marco Salles

Responder

Posts

18/03/2006

Marco Salles

na pressa escrevi o titulo errado

[b:7e4cacd728]Mestre Detalhes DbExpress...[/b:7e4cacd728]

Se pudessem alterar esse titulo , seria bom , por causa de alguma pesquisa no futuro

:arrow: :arrow:
Titulo errado não parece nas boas intençoes de Busca


Responder

18/03/2006

Martins

[quote:472ff4bd4d=´Marco Salles´]na pressa escrevi o titulo errado

[b:472ff4bd4d]Mestre Detalhes DbExpress...[/b:472ff4bd4d]

Se pudessem alterar esse titulo , seria bom , por causa de alguma pesquisa no futuro

:arrow: :arrow:
Titulo errado não parece nas boas intençoes de Busca[/quote:472ff4bd4d]

[b:472ff4bd4d]Marco[/b:472ff4bd4d], qual é a mensagem de erro, vc poderia postá-la para nós?

valew!!!


Responder

18/03/2006

Marco Salles

Rodo o programa e as duas tabelas funcionam de maneura com deveriam :

[URL=http://imageshack.us][img:00d43c86aa]http://img488.imageshack.us/img488/2213/mestredetalhe6yd.png[/img:00d43c86aa][/URL]


Tento alterar Um Campo Da Tabela Detalhe

[URL=http://imageshack.us][img:00d43c86aa]http://img150.imageshack.us/img150/8044/mestredetalhe17zc.png[/img:00d43c86aa][/URL]

Dou um ApllyUpdates(0) e uma exceção é gerada:

[URL=http://imageshack.us][img:00d43c86aa]http://img224.imageshack.us/img224/4677/mestredetalhe22wf.png[/img:00d43c86aa][/URL]

E por fim , mando continuar a exceução e recebo esta mensagem :

[URL=http://imageshack.us][img:00d43c86aa]http://img224.imageshack.us/img224/6941/mestredetalhe32ku.png[/img:00d43c86aa][/URL]

Sera qiue isso tb É so comigo :cry: :cry: :cry:

Tive uma semana do Cão .. Deu tudo errado..


Responder

18/03/2006

Martins

Interessante, vou ver o q consigo aqui...

Tentar decobrir pq essa violação.

bom fds, vc tá merecendo.


Responder

18/03/2006

Vinicius2k

Marco,

Observe parte da definição da tabela SALES:
/* Check constraints definition */
ALTER TABLE SALES ADD CHECK (order_status in
                            (´new´, ´open´, ´shipped´, ´waiting´));
ALTER TABLE SALES ADD CHECK (ship_date >= order_date OR ship_date IS NULL);
ALTER TABLE SALES ADD CHECK (date_needed > order_date OR date_needed IS NULL);
ALTER TABLE SALES ADD CHECK (paid in (´y´, ´n´));
ALTER TABLE SALES ADD CHECK (qty_ordered >= 1);
ALTER TABLE SALES ADD CHECK (total_value >= 0);
ALTER TABLE SALES ADD CHECK (discount >= 0 AND discount <= 1);
ALTER TABLE SALES ADD CHECK (NOT (order_status = ´shipped´ AND ship_date IS NULL));
ALTER TABLE SALES ADD CHECK (NOT (order_status = ´shipped´ AND
            EXISTS (SELECT on_hold FROM customer
                    WHERE customer.cust_no = sales.cust_no
                    AND customer.on_hold = ´*´)));

/* Primary keys definition */
ALTER TABLE SALES ADD PRIMARY KEY (PO_NUMBER);

/* Foreign keys definition */
ALTER TABLE SALES ADD  FOREIGN KEY (CUST_NO) REFERENCES CUSTOMER (CUST_NO);
ALTER TABLE SALES ADD  FOREIGN KEY (SALES_REP) REFERENCES EMPLOYEE (EMP_NO);


É normal que algumas informações no Detalhe você não consiga alterar, pois estaria violando integridade referencial ou constraints de validação. Este é o motivo do primeiro erro. Tente, por exemplo, alterar [b:2de44cd088]QTY_ORDERED[/b:2de44cd088] que você irá conseguir.

Sobre o erro [i:2de44cd088]´Unable do find record. No key specified´[/i:2de44cd088], é quase o mesmo problema que mencionei no seu [url=http://forum.clubedelphi.net/viewtopic.php?t=75031]outro tópico[/url]: configurações das [b:2de44cd088]ProviderFlags[/b:2de44cd088].
Como o UpdateMode do seu TDataSetProvider está configurado para [b:2de44cd088]upWhereKeyOnly[/b:2de44cd088], no [b:2de44cd088]SQLQuery2[/b:2de44cd088] você precisa definir ´quem é´ a chave.
Seguindo a mesma doutrina de ter execuções mais eficientes, defina ProviderFlags de [b:2de44cd088]PO_NUMBER[/b:2de44cd088] (chave primária de SALES) como [pfInUpdate, pfInWhere, pfInKey]. Para os demais TFields apenas [pfInUpdate].

Não desanime pois você está aprendendo uma das tecnologias mais interessantes presentes no Delphi: Midas. E é bom que você tenha em mente que, apesar do dbExpress quase ter forçar a trabalhar com ela -- a Midas --, ela independe da camada de acesso e pode ser utilizada com *quase* todas (quase porque, por exemplo, a ZeosDBO ainda não suporta IProvider).
Além disso, Nested DataSets não é muito fácil de ser compreendido na primeira vez.

Sugestão: estude o help do Delphi tudo que se refere a TDataSetProvider e TClientDataSet para que você realmente compreenda para que servem suas propriedades e como utilizar corretamente seus métodos.


Responder

19/03/2006

Marco Salles

Marco, Observe parte da definição da tabela SALES:


[b:d7a642b165]muito obrigado por ter alertado sobre este ponto[/b:d7a642b165] ... Realmente pela definiçao se ve o que se pode mudar , o que não se pode e auqles que são limitados< são os valores permitidos pelos constraints de validação >...Obrigado mesmo

Sobre o erro ´Unable do find record. No key specified´, é quase o mesmo problema que mencionei no seu outro tópico: configurações das ProviderFlags.


O segundo erro é uma continuaçao do primeiro , apesar de ter conatação bem diferente... Quer dizer , corrindo o primeiro , nesse caso não é uma correção , mas sim de não editar dados que não sejam permitidos , a segunda mensagem de erro , nen aparece.. Porque inicialmente o Meu UpdateMode do DataSetProvinder estava configurado para upWhereAll


[b:d7a642b165]Mas a observação sobre ter doutrina de ter execuções mais eficientes, é persistente e totalmente Recomendavel.... [/b:d7a642b165]

Como o UpdateMode do seu TDataSetProvider está configurado para upWhereKeyOnly, no SQLQuery2 você precisa definir ´quem é´ a chave. Seguindo a mesma doutrina de ter execuções mais eficientes, defina ProviderFlags de PO_NUMBER (chave primária de SALES) como [pfInUpdate, pfInWhere, pfInKey]. Para os demais TFields apenas [pfInUpdate].


Esta recomendação é fundamental e uma base de distinção muito grande do DbExpress quando comparado ao Acesso feito pelo BDE


Responder

19/03/2006

Martins

Este tópico está sendo muito importante, estamos esclarecendo dúvidas e aprendendo uns com os outros, muito bom mesmo, DbExpress é uma ótima tecnológia, mas temos q ter atenção para linkarmos e preparamos nossa camada de acesso para não termos transtornos futuros e isso é muito positivo, [b:5830520db4]Marco[/b:5830520db4], conseguiu rodar a aplicação agora, depois das dicas importantes do [b:5830520db4]Vinicius[/b:5830520db4] :?:


Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

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

Aceitar