Array
(
)

Mestre/Detalhe dbExpress

Marco Salles
   - 18 mar 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

Então pela biografia faço assim :


Citação:
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


Relacionamento


Citação:
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;


Aqui finalizo e faço

#Código

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
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


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...

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

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

Obrigado...


Marco Salles
   - 18 mar 2006

na pressa escrevi o titulo errado

Mestre Detalhes DbExpress...

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


Martins
   - 18 mar 2006


Citação:
na pressa escrevi o titulo errado

Mestre Detalhes DbExpress...

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


Marco, qual é a mensagem de erro, vc poderia postá-la para nós?

valew!!!


Marco Salles
   - 18 mar 2006

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

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


Martins
   - 18 mar 2006

Interessante, vou ver o q consigo aqui...

Tentar decobrir pq essa violação.

bom fds, vc tá merecendo.


Vinicius2k
   - 18 mar 2006

Marco,

Observe parte da definição da tabela SALES:
#Código

/* 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 QTY_ORDERED que você irá conseguir.

Sobre o erro ´Unable do find record. No key specified´, é quase o mesmo problema que mencionei no seu [url=http://forum.clubedelphi.net/viewtopic.php?t=75031]outro tópico[/url]: configurações das ProviderFlags.
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].

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.


Marco Salles
   - 19 mar 2006


Citação:
Marco,

Observe parte da definição da tabela SALES:


muito obrigado por ter alertado sobre este ponto ... 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


Citação:
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


Mas a observação sobre ter doutrina de ter execuções mais eficientes, é persistente e totalmente Recomendavel....


Citação:
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


Martins
   - 19 mar 2006

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, Marco, conseguiu rodar a aplicação agora, depois das dicas importantes do Vinicius :?: