Mestre/Detalhe dbExpress

18/03/2006

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

Respostas

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 Citar

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 Citar

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 Citar

18/03/2006

Martins

Interessante, vou ver o q consigo aqui...

Tentar decobrir pq essa violação.

bom fds, vc tá merecendo.


Responder Citar

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 Citar

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 Citar

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 Citar