Fórum Salvando Tabela Filho e Perdendo dados do pai alguem ??? #37520

22/07/2003

0

:arrow: Tenho uma tabela pai e outra filho mas de vez em quando quendo tento salvar os dados da tabela filho eu perco alguns dados da pai, já tentei de tudo para ver este erro mas não da nada :-)


Sremulador

Sremulador

Responder

Posts

22/07/2003

Afarias

Humm... com o nível de informação q vc está fornecendo fica difícil.

Que componentes está usando??
Como estão configurados/´conectados´??
Como é seu código de inclusão??


T+


Responder

Gostei + 0

23/07/2003

Sremulador

Estou fazendo acessoa com o ibx, o que acmpanha do delphi
para salvar estou dando um
post
commitretaling
conexao tcp/ip


Responder

Gostei + 0

23/07/2003

Afarias

Humm.. sem informações detalhadas não dá pra ajudar muito... Só sei q isso não é normal.

Más, pelo menos atualize seu IBX. O q vem com o Delphi tem *bugs*


T+


Responder

Gostei + 0

23/07/2003

Sremulador

Ai esta meu cod, o delphi que uso e o 7.0

if (e0.Text <> ´´) and (e11.Text <> ´´) and (e3.Text <> ´´) and (e5.Text <> ´´) then begin
dmc.Ambulatorio.FieldByName(´AMPA´).Text:= dmc.PACIENTES.FieldByName(´PACD´).Text;
dmc.Ambulatorio.FieldByName(´AMCD´).AsInteger := dmc.PACIENTES.FieldByName(´PAAM´).AsInteger + 1; dmc.Ambulatorio.FieldByName(´AMCV´).Text:= e0.Text; //
dmc.Ambulatorio.FieldByName(´AMPR´).Text:= e11.Text; //
dmc.Ambulatorio.FieldByName(´AMEP´).Text:= e3.Text; //
dmc.Ambulatorio.FieldByName(´AMTA´).Text:= e9.Text;
dmc.Ambulatorio.FieldByName(´AMFC´).AsInteger := principal.Tag; dmc.Ambulatorio.FieldByName(´AMST´).AsInteger := 1;

dmc.PACIENTES.Edit;
dmc.PACIENTES.FieldByName(´PAAM´).AsInteger:= dmc.Ambulatorio.FieldByName(´AMCD´).AsInteger;
dmc.PACIENTES.Post;

principal.sb.Panels[2].Text:= ´Status: ´ + men (09);
dmc.Ambulatorio.Post;
dmc.Transacao.CommitRetaining;
FAA;
Close;
end else
messagedlg (men (2), mterror, [mbok], 0);


Responder

Gostei + 0

23/07/2003

Afarias

Quem é a tabela Mestre (Pai) e a Detalhe (Filho) ??
Qual é a chave primária da mestre e a chave estrangeira da detalhe??

o que seria isso::

--------------------------------------------------------------------------

dmc.Ambulatorio.FieldByName(´AMCD´).AsInteger := dmc.PACIENTES.FieldByName(´PAAM´).AsInteger + 1;
{...}
dmc.PACIENTES.Edit;
dmc.PACIENTES.FieldByName(´PAAM´).AsInteger:= dmc.Ambulatorio.FieldByName(´AMCD´).AsInteger;
dmc.PACIENTES.Post;

--------------------------------------------------------------------------

Se este código/campos acima mantêm sua relação mestre-detalhe, acredito q ai está seu problema.

No mais, vc não recebe nenuma exceção do sistema??
Vc tem definido no banco de dados suas ´constraints´??


T+


Responder

Gostei + 0

23/07/2003

Sremulador

Os componentes são o ibquery, ibtrasation, ibdatabase do datasource.
Tabela pai - Pacientes
Tabela Filha Ambulatorio.

Os cods acima mantem relacionamento sim.

no caso deste abaixo ele vai abrir a tabela do pai e modificar um item.
dmc.PACIENTES.Edit;
dmc.PACIENTES.FieldByName(´PAAM´).AsInteger:= dmc.Ambulatorio.FieldByName(´AMCD´).AsInteger;
dmc.PACIENTES.Post;


Responder

Gostei + 0

23/07/2003

Sremulador

As chaves primarias do ambulatorio são
AMPA -> PACIENTE
AMCD -> CHAVE PRIMARIA


Responder

Gostei + 0

23/07/2003

Afarias

Então, se PACIENTES é ´PAI´ e AMBULATÓRIOS ´FILHO´ quer dizer q vc quer ter uma associação onde 1 paciente está relacionado com N (muitos) ambulatórios.

Bom, acho q com o código abaixo:

dmc.Ambulatorio.FieldByName(´AMCD´).AsInteger := dmc.PACIENTES.FieldByName(´PAAM´).AsInteger + 1;

vc está tentando gerar uma nova ´chave´ para AMBULATÓRIOS... isto não está correto, não funciona numa rede com +1 usuário. Vc devia usar generators ai!

Acho q aqui:

dmc.PACIENTES.Edit;
dmc.PACIENTES.FieldByName(´PAAM´).AsInteger:= dmc.Ambulatorio.FieldByName(´AMCD´).AsInteger;
dmc.PACIENTES.Post;

Vc quer informar na tabela PACIENTEs qual o último ambulatório, faça isso após o POST da tabela filho (ambulatório)


No mais, olha... eu acho q vc está meio confuso sobre relacionamentos Mester/Detalhe (ou Pai/Filho) ... se bem estou entendendo o q vc está tentando fazer *na minha opnião* eu diria q vc deveria avaliar melhor seu modelo de dados.

T+


Responder

Gostei + 0

24/07/2003

Sremulador

como ou poderial fazer isto com um generator neste caso ?

pac 1
amb1
2
3
pac 2
amb1
2
3
.......
??????


Responder

Gostei + 0

24/07/2003

Afarias

o que vc quer não é exatemente mestre/detalhe ... é mais uma ´agregação´ -- um relacionamento muitos-para-muitos (pelo q entendi)


tabela: pacientes
--------------------
codigo (pk)
nome
{...}
--------------------
+ generator: gn_paciente_codigo


tabela: ambulatórios
------------------------
codigo (pk)
nome
{...}
-------------------------
+ generator: gn_ambulatorio_codigo


tabela: amb_pac (?? ou consultas, ou sei lá!!)
------------------------
paciente (fk) <-- recebe os códigos de pacientes
ambulatorio (fk) <-- recebe os códigos de ambulatórios
{...}
-------------------------


vc usa o generator ´gn_paciente_codigo´ no cadastro de pacientes (tabela Pacientes) e usa o ´gn_ambulatorio_codigo´ no cadastro de ambulatórios (tabela Ambulatorios)

Para associar os ambulatórios aos clientes (os ambulatórios já devem estar cadastrados) ... vc usa a 3ª tabela (amb_pac)

onde o campo ´paciente´ recebe o código do paciente que está sendo cadastrado (ou alterado), e o campo ´ambulatorio´ recebe o código do ambulatório selecionado pelo usuário.

Para cada novo ambulatório associado ao paciente, vc cria um novo registro nesta 3ª tabela.


Espero q isso ajude,

T+


Responder

Gostei + 0

25/07/2003

Sremulador

meu relacionamento e de 1 para muitos, isto é eu posso ter um paciente com vários amb mas não vários amb para um paciente, por isso que eu criei este tipo de gereção de chave para o amb eu dou um incremento no paciente somando com o que já esta lá.


Responder

Gostei + 0

25/07/2003

Afarias

|meu relacionamento e de 1 para muitos, isto é eu posso ter um paciente
|com vários amb mas não vários amb para um paciente, por isso que eu

NÃO. seu relacionamento é de muitos-para-muitos (preste atenção no exemplo q vc colocou):

pac 1
amb1
2
3
pac 2
amb1
2
3

sendo assim, temos:

Pac1 - (Amb1, Amb2, Amb3)
Pac2 - (Amb1, Amb2, Amb3)

isto implica que:

Amb1 - (Pac1, Pac2)
Amb2 - (Pac1, Pac2)
Amb3 - (Pac1, Pac2)

Resumindo:

1 paciente pode estar relacionado a muitos ambulatórios, e 1 ambulatório pode ser relacionado a muitos pacientes.

Além de ser o exemplo q vc postou, pra mim é a mais pura lógica. Nunca vi um Ambulatório q atendesse a 1 só Paciente.


T+


Responder

Gostei + 0

28/07/2003

Sremulador

O que eu quis dizer e que o paciente nº 1 podera ter o ambulatório 1,2,3,4 relacionado mas o paciente nº 2 também poderá ter o 1,2,3,4,5... relacionado ao 2
tipo
Paciente Ambulatorio
1
|________> 1
|________> 2
|________> 3
|________> 4 ......

............................................................................................
2
|________> 1
|________> 2
|________> 3
|________> 4 ......

mas o ambulatorio com o cdpa 2 não enchergará o cdpa 1 que e o cod do paciente, por isso que eu acho complicado fazer este tipo de generator, pos como o generator sabera que eu passei para o ambulatorio do próximo paciente ???


Responder

Gostei + 0

28/07/2003

Afarias

Por favor, leia com atenção minhas mensagens anteriores. Eu já entendi o q vc quer fazer -- seu relacionamento é MUITOS-PARA-MUITOS!!

Leia atentamente e procure refletir um pouco q consiguirá implementar a solução corretamente.

T+


Responder

Gostei + 0

28/07/2003

Sremulador

Tudo bem, mas acho que descobri a causa do problema de perca de dados, isso só esta acontecendo quando estou com o delphi aberto e rodo meu aplicativo, outra coisa qual seria seu modelo de 1 para muitos ???


Responder

Gostei + 0

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

Aceitar