Salvando Tabela Filho e Perdendo dados do pai alguem ???
: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
Curtidas 0
Respostas
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+
Que componentes está usando??
Como estão configurados/´conectados´??
Como é seu código de inclusão??
T+
GOSTEI 0
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
para salvar estou dando um
post
commitretaling
conexao tcp/ip
GOSTEI 0
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+
Más, pelo menos atualize seu IBX. O q vem com o Delphi tem *bugs*
T+
GOSTEI 0
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);
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
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+
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
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;
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
22/07/2003
As chaves primarias do ambulatorio são
AMPA -> PACIENTE
AMCD -> CHAVE PRIMARIA
AMPA -> PACIENTE
AMCD -> CHAVE PRIMARIA
GOSTEI 0
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+
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
22/07/2003
como ou poderial fazer isto com um generator neste caso ?
pac 1
amb1
2
3
pac 2
amb1
2
3
.......
??????
pac 1
amb1
2
3
pac 2
amb1
2
3
.......
??????
GOSTEI 0
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+
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
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
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+
|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
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 ???
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
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+
Leia atentamente e procure refletir um pouco q consiguirá implementar a solução corretamente.
T+
GOSTEI 0
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
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+
|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