mastersource com registros desconectados??

13/01/2006

bom pessoal é o seguinte ...

´frequentemente vc precisa relacionar tabelas, as quais tem um relacionamento de um para muitos, isso significa que para um unico registro da tabela1 vc pode ter N registros na tabela2 ... ´

o delphi oferece suporte a isso com as estruturas mestre-detalhe ...

no ado, creio que a propriedade que corresponde a isso é o mastersource ...

imaginem a seguinte estrutura ..

[b:3b2029b6e9]tabela tbcliente[/b:3b2029b6e9]

codcliente
nmcliente

[b:3b2029b6e9]tabela tbtelefones[/b:3b2029b6e9]

codtelefone
codcliente
numtelefone

na tabela [b:3b2029b6e9]tbtelefones[/b:3b2029b6e9] eu configuro a propriedade mastersource com o datasource que esta ligado a [b:3b2029b6e9]tbcliente[/b:3b2029b6e9]

logo apos configuro a propriedade masterfields com o valor ´codcliente´ pq é o campo comum as 2 tabelas ...

dessa forma o delphi faz todo o trabalho para mim .. quando eu inserir um cliente na tabela tbcliente e logo depois inserir seus respctivos telefones o delphi ja faz o relacionamento e insere o codigo do cliente na tabela de telefones ... até aqui tudo bem ...

para que o esquema acima funcione tenho que estar conectado o tempo todo no BD ...

mas se eu pro exemplo, quiser trabalhar com registros desconectados essa tecnica nao funciona ...

imaginem as mesmas tabelas acima ,só que configuradas com a propriedade locktype como i[b:3b2029b6e9]tbatchoptmistcic[/b:3b2029b6e9] e no evento oncreate do form eu inserisse o seguinte codigo ...


 CONEXAO.Connected:= TRUE;
  CLIENTE.Active:= TRUE;
  TELEFONE.Active:= TRUE;

  CLIENTE.Connection:=NIL;
  TELEFONE.Connection:= NIL;
  CONEXAO.CONNECTED:= FALSE;



e teria um botao com o seguinte codigo para aplicar as alteracoes ...

  CONEXAO.Connected:= TRUE;
  CLIENTE.Connection:=  CONEXAO;
  TELEFONE.Connection:= CONEXAO;

  TRY
    CLIENTE.UpdateBatch;
    TELEFONE.UpdateBatch;
  FINALLY
     CLIENTE.Connection:=NIL;
     TELEFONE.Connection:= NIL;
     CONEXAO.CONNECTED:= FALSE;
  END;



dessa forma eu conecto apenas para gravar os dados alterados ...
porem, estando desconectado o campo codcliente da tabela cliente nao recebe nenhum valor pois é do tipo autoincremento .. ele somente recebe valor quando eu aplico as alteracoes no banco ... isso impossibilita de gravar o campo codcliente na tabela telefone fazendo com que o registro fique perdido ...

nao ficando conectado como mostrei acima, como posso utilizar da propriedade mastersource???

[]ss


Rafael Gomes

Respostas

13/01/2006

Andrew

Não sou o Martins, mas vou me intrometer um pouco ok! :)

Eu particularmente acredito que sem está conectado com Banco de Dados é meio complicado de se fazer, nunca fiz nada parecido, mas lhe pergunto uma coisa, vc já trrabalhou com Inner Join, acho que com ADOQuery daria para fazer algo assim.

Martins aquele código de consulta usando ADOQuery que você passou para nós pelo MSN não daria para ser adaptado para esta finalidade?

Pessoal usando ADOQuery daria para fazer o q o colega deseja? Sim ou Não?


Só minha opnião!!

PS: Martins nosso provedor (internet via rádio) tá horrível hoje hein.


Responder Citar

13/01/2006

Rafael Gomes

opa, nao se preocupe, espero a contibuico de todos para resolver o problema ...

a respeito dos registros desconectados, eu acho que é possivel sim, porem gostaria de saber se alguem ja fez isso ... ou se olhando o que eu disse teria alguma ideia para faze-lo ...

tenho interesse em fazer isso por questoes de desempenho da rede ... pq vou estar conectado somente na hora de atualizar os dados ...

enfim, aguardo contribuicoes dos colegas do forum!! 8)


Responder Citar

13/01/2006

Rafael Gomes

só para completar ... nao estou usando ADOQuery pois o componente nao possui a propriedade MasterSource nem a masterfields

estou usando ADOTable ...

[]ss


Responder Citar

13/01/2006

Martins

Andew, aquele caso era meio diferente desses, vcs ali precisavam obter dados de três tabelas para exibir em um grid ou relatório nao lembro bem.

Vejamos, vc vai se conectar a base de dados somente para gravar informações, editar, excluir é isso, e vc está usando Master-Detail, é mais ou menos isso?

Quase não usei Master-Detail, pois sempre preferi trabalhar com SQL, mas podemos tentar encontrar uma solução para esse caso.


Responder Citar

16/01/2006

Rafael Gomes

certo martins, voce poderia me dar uma luz?
para usar SQL terei que usar ADOQuery??
e que instrucao seria essa?? veja, usando mastersource eu automatizo as operacoes entre as 3 tabelas, e quem controla isso é o proprio delphi ... como eu faria mesmo atraves de instrucoes SQL??

alias, aproveitando o topico ... qual a diferença entre o ADODataSet e a ADOQuery ... ambos me permitem executar instrucoes SQL??


[]sss


Responder Citar

17/01/2006

Rafael Gomes

up,

pessoal deem um help ai ....

abraços!!


Responder Citar