Salvando Tabela Filho e Perdendo dados do pai alguem ???

Firebird

22/07/2003

: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

Curtidas 0

Respostas

Afarias

Afarias

22/07/2003

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+


GOSTEI 0
Sremulador

Sremulador

22/07/2003

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


GOSTEI 0
Afarias

Afarias

22/07/2003

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+


GOSTEI 0
Sremulador

Sremulador

22/07/2003

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


GOSTEI 0
Afarias

Afarias

22/07/2003

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+


GOSTEI 0
Sremulador

Sremulador

22/07/2003

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;


GOSTEI 0
Sremulador

Sremulador

22/07/2003

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


GOSTEI 0
Afarias

Afarias

22/07/2003

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+


GOSTEI 0
Sremulador

Sremulador

22/07/2003

como ou poderial fazer isto com um generator neste caso ?

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


GOSTEI 0
Afarias

Afarias

22/07/2003

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+


GOSTEI 0
Sremulador

Sremulador

22/07/2003

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


GOSTEI 0
Afarias

Afarias

22/07/2003

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


GOSTEI 0
Sremulador

Sremulador

22/07/2003

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


GOSTEI 0
Afarias

Afarias

22/07/2003

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+


GOSTEI 0
Sremulador

Sremulador

22/07/2003

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


GOSTEI 0
Afarias

Afarias

22/07/2003

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


[nota fiscal]
numero (pk)
data
{..}

[itens]
numero_nota (fk) <-- nota fiscal.numero
produto
quantidade
{...}


1 ítem nunca pode pertencer a mais q 1 nota!


T+


GOSTEI 0
POSTAR