Mestre/Detalhe (era... Senão é bug oq que é então?)
a mais de uma semana que estava tenando fazer um relacionamento Master/Detalhe usando FB+DbExpress+SqlDataSet+ClientDataSet mais não conseguia de nenhuma maneira apenas com duas tabelas do meu sistema, onde no mesmo sistema já tinha feito o relacionamento entre outras duas tabelas, mais vamos lá, estou usando o relacionamento através da criação do campo DataSetField na tabela Pai e vinculando esse campo a um outro ClientDataSet, para navegação dos dados funciona perfeitamente, mais, se alterar ou incluir algum novo registro na tabela filha ele apresenta um erro informando que o registro não está mais presente como se ele tivesse sumido, mesmo estando lá na tela...
Somente por questão de esclarecimento estou criando o relacionamento como na ilustração abaixo...
CommandText do sdtMASTER
CommandText do sdtFILHO
O DFM do DataModule está assim:
estou afirmando que é um bug, pq quando uso relacionamento onde os nomes dos campos chaves não são iguais funciona perfeitamente, mais quando existe a igualdade ele apresenta esse erro...
chave primaria da tabela Master CODIGO*
chave primaria da tabela Detail CODIGO*
chave estangeira da tabela Detail LOCACAO <- que deveria receber o valor do código da tabela MASTER...
receber até recebe mais quando vai dar o post não grava...
conto com ajuda de vc´s um abraço
Somente por questão de esclarecimento estou criando o relacionamento como na ilustração abaixo...
CommandText do sdtMASTER
select * from LOCACAO where cod_filial=:pFilial
CommandText do sdtFILHO
select * from DETLOCACAO where LOCACAO=:CODIGO
O DFM do DataModule está assim:
object DataModule2: TDataModule2
OldCreateOrder = False
Height = 337
Width = 399
object sConn: TSQLConnection
ConnectionName = ´FB_SAFPE´
DriverName = ´Interbase´
GetDriverFunc = ´getSQLDriverINTERBASE´
LibraryName = ´dbxint30.dll´
LoginPrompt = False
Params.Strings = (
´DriverName=Interbase´
´Database=F:\Delphi\Projetos\Locadora(SAFPE)\conversao\DBLOC7023.´ +
´FDB´
´RoleName=RoleName´
´User_Name=sysdba´
´Password=masterkey´
´ServerCharSet=WIN1252´
´SQLDialect=3´
´BlobSize=-1´
´CommitRetain=False´
´WaitOnLocks=True´
´ErrorResourceFile=´
´LocaleCode=0000´
´Interbase TransIsolation=ReadCommited´
´Trim Char=False´)
VendorLib = ´fbClient.dll´
Left = 144
Top = 24
end
object sdtMASTER: TSQLDataSet
CommandText = ´select * from LOCACAO where CODIGO<0´
MaxBlobSize = -1
Params = <>
SQLConnection = sConn
Left = 40
Top = 88
end
object dspMASTER: TDataSetProvider
DataSet = sdtMASTER
Options = [poCascadeDeletes, poCascadeUpdates, poAutoRefresh, poPropogateChanges, poUseQuoteChar]
BeforeUpdateRecord = dspMASTERBeforeUpdateRecord
Left = 104
Top = 160
end
object cdsMASTER: TClientDataSet
Aggregates = <>
Params = <>
ProviderName = ´dspLOCACAO´
AfterInsert = cdsMASTERAfterInsert
AfterPost = cdsMASTERAfterPost
Left = 48
Top = 240
object cdsMASTERCOD_FILIAL: TIntegerField
FieldName = ´COD_FILIAL´
end
object cdsMASTERCODIGO: TIntegerField
FieldName = ´CODIGO´
Required = True
end
object cdsMASTERCLIENTE: TIntegerField
FieldName = ´CLIENTE´
end
object cdsMASTERLOCATARIO: TStringField
FieldName = ´LOCATARIO´
Size = 52
end
object cdsMASTERDATA: TDateField
FieldName = ´DATA´
end
object cdsMASTERDATARETORNO: TDateField
FieldName = ´DATARETORNO´
end
object cdsMASTERPAGO: TStringField
FieldName = ´PAGO´
Size = 3
end
object cdsMASTERATRASO: TIntegerField
FieldName = ´ATRASO´
end
object cdsMASTERREAJUSTE: TFloatField
FieldName = ´REAJUSTE´
end
object cdsMASTERENTREGUE: TStringField
FieldName = ´ENTREGUE´
Size = 3
end
object cdsMASTERDATAENTREGUA: TSQLTimeStampField
FieldName = ´DATAENTREGUA´
end
object cdsMASTERTOTAL: TFloatField
FieldName = ´TOTAL´
end
object cdsMASTEROBS: TBlobField
FieldName = ´OBS´
Size = 1
end
object cdsMASTERLOGUSU: TStringField
FieldName = ´LOGUSU´
Size = 12
end
object cdsMASTERLOGDATA: TSQLTimeStampField
FieldName = ´LOGDATA´
end
object cdsMASTERLOGHORA: TSQLTimeStampField
FieldName = ´LOGHORA´
end
object cdsMASTERLOGOPER: TStringField
FieldName = ´LOGOPER´
Size = 12
end
object cdsMASTERVALOR_ANTIGO: TFloatField
FieldName = ´VALOR_ANTIGO´
end
object cdsMASTERPAGAMENTOS: TStringField
FieldName = ´PAGAMENTOS´
Size = 80
end
object cdsMASTERsdtDETLOCACAO: TDataSetField
FieldName = ´sdtDETLOCACAO´
end
end
object sdtFILHO: TSQLDataSet
SchemaName = ´sysdba´
CommandText = ´select * from DETLOCACAO where LOCACAO=:CODIGO´
DataSource = dsRELACIONA
MaxBlobSize = -1
Params = <
item
DataType = ftInteger
Name = ´CODIGO´
ParamType = ptInput
end>
SQLConnection = sConn
Left = 256
Top = 98
end
object dsRELACIONA: TDataSource
DataSet = sdtMASTER
Left = 184
Top = 160
end
object cdsFILHO: TClientDataSet
Aggregates = <>
AggregatesActive = True
DataSetField = cdsMASTERsdtDETLOCACAO
Params = <>
AfterInsert = cdsFILHOAfterInsert
Left = 256
Top = 232
object cdsFILHOCODIGO: TIntegerField
FieldName = ´CODIGO´
Required = True
end
object cdsFILHOLOCACAO: TIntegerField
FieldName = ´LOCACAO´
end
object cdsFILHOFILME: TIntegerField
FieldName = ´FILME´
end
object cdsFILHODIARIA: TIntegerField
FieldName = ´DIARIA´
end
object cdsFILHONOME_FILME: TStringField
FieldName = ´NOME_FILME´
Size = 52
end
object cdsFILHOCOD_FILME: TIntegerField
FieldName = ´COD_FILME´
end
object cdsFILHOVALOR_FILME: TFloatField
FieldName = ´VALOR_FILME´
end
object cdsFILHONOVO_VALOR: TFloatField
FieldName = ´NOVO_VALOR´
end
object cdsFILHOBONUS: TStringField
FieldName = ´BONUS´
Size = 3
end
object cdsFILHODEVOLVIDO: TStringField
FieldName = ´DEVOLVIDO´
Size = 1
end
object cdsFILHODIAS_ATRASO: TIntegerField
FieldName = ´DIAS_ATRASO´
end
object cdsFILHODATADEVOLVIDO: TSQLTimeStampField
FieldName = ´DATADEVOLVIDO´
end
object cdsFILHOUSERINCLUIU: TStringField
FieldName = ´USERINCLUIU´
Size = 10
end
object cdsFILHOUSERDATAINCLUIU: TSQLTimeStampField
FieldName = ´USERDATAINCLUIU´
end
object cdsFILHOUSERALTEROU: TStringField
FieldName = ´USERALTEROU´
Size = 10
end
object cdsFILHOUSERDATAALTEROU: TSQLTimeStampField
FieldName = ´USERDATAALTEROU´
end
object cdsFILHOmax_cod: TAggregateField
FieldName = ´max_cod´
Active = True
DisplayName = ´max_cod´
Expression = ´max(codigo)´
end
end
end
estou afirmando que é um bug, pq quando uso relacionamento onde os nomes dos campos chaves não são iguais funciona perfeitamente, mais quando existe a igualdade ele apresenta esse erro...
chave primaria da tabela Master CODIGO*
chave primaria da tabela Detail CODIGO*
chave estangeira da tabela Detail LOCACAO <- que deveria receber o valor do código da tabela MASTER...
receber até recebe mais quando vai dar o post não grava...
conto com ajuda de vc´s um abraço
Paullsoftware
Curtidas 0
Respostas
Marco Salles
09/09/2006
é , comigo funciona bemmm
mas eu não faço assim:
eu so faço isso:
CommandText do sdtMASTER
Citação:
select * from LOCACAO
a nivel é claro de relacionamentos... A não ser que eu quira restringuir os dados da Matriz .. Ai sim eu uso uma Where com condição... Mas na hora que estou inderindo dados eu não faço nenhuma restrição...
O que posso perguntar é sobre os paramentros... Quando voce definiu
este Sql no Editor de propriedades , voce criou ou melhor ativou os paramentros que aparecem automaticamente ????
Outra...
execute o codigo abaixo e, prencha os dados da tabela Detalhe.. O Unico
campo que voce não ira alterar e nen deve é o campo LOCACAO
grave dando um Post e finalmente um ClientDataSet1.ApplyUpdates(0);
na Tabela MASTER... Acredito que não deve dar erro nenhum....
Qualquer coisa reporte o resultado...
procedure TForm1.ClientDataSet2AfterInsert(DataSet: TDataSet);
begin
ClientDataSet2LOCACAO.AsInteger:=ClientDataSet1CODIGO.AsInteger;
end;
mas eu não faço assim:
CommandText do sdtMASTER
Citação:
select * from LOCACAO where cod_filial=:pFilial
eu so faço isso:
CommandText do sdtMASTER
Citação:
select * from LOCACAO
a nivel é claro de relacionamentos... A não ser que eu quira restringuir os dados da Matriz .. Ai sim eu uso uma Where com condição... Mas na hora que estou inderindo dados eu não faço nenhuma restrição...
O que posso perguntar é sobre os paramentros... Quando voce definiu
este Sql no Editor de propriedades , voce criou ou melhor ativou os paramentros que aparecem automaticamente ????
Outra...
execute o codigo abaixo e, prencha os dados da tabela Detalhe.. O Unico
campo que voce não ira alterar e nen deve é o campo LOCACAO
grave dando um Post e finalmente um ClientDataSet1.ApplyUpdates(0);
na Tabela MASTER... Acredito que não deve dar erro nenhum....
Qualquer coisa reporte o resultado...
procedure TForm1.ClientDataSet2AfterInsert(DataSet: TDataSet);
begin
ClientDataSet2LOCACAO.AsInteger:=ClientDataSet1CODIGO.AsInteger;
end;
GOSTEI 0
Paullsoftware
09/09/2006
continua do mesmo jeito Marcos, eu esqueci de dizer está apresentando esse erro quando dou um insert e depois vou dar o POST na tabela DETAIL...
para navegação, funciona perfeitamente, mais na hora da inclusão apresenta o erro...
para navegação, funciona perfeitamente, mais na hora da inclusão apresenta o erro...
GOSTEI 0
Marco Salles
09/09/2006
Paulo , vejo pelas imagems , que o registro Mestre ainda esta em Modo de Edição /Ou Inserção... Neste caso voce tera erro de relacionamentos
Antes da Inclusão , no registro Detalhe , acho que o Regsitro Mestre deve estar salvo .. Parece que voce não esta fazendo isto. [b:6031bfc017]Pelo menos a imagem mostra que não[/b:6031bfc017]
Antes da Inclusão , no registro Detalhe , acho que o Regsitro Mestre deve estar salvo .. Parece que voce não esta fazendo isto. [b:6031bfc017]Pelo menos a imagem mostra que não[/b:6031bfc017]
GOSTEI 0
Paullsoftware
09/09/2006
[quote:038c9b3a6f=´Marco Salles´]Paulo , vejo pelas imagems , que o registro Mestre ainda esta em Modo de Edição /Ou Inserção... Neste caso voce tera erro de relacionamentos
Antes da Inclusão , no registro Detalhe , acho que o Regsitro Mestre deve estar salvo .. Parece que voce não esta fazendo isto. [b:038c9b3a6f]Pelo menos a imagem mostra que não[/b:038c9b3a6f][/quote:038c9b3a6f]
não Marcos, deixa eu tentar te explicar se vc trabalha com relacionamento usando Master Source e criando o campo do tipo DataSetField vai saber do que estou falando...
Quando pesso para incluir um novo registro na tabela Detalhe e Registro Master entra automaticamente em modo de edição, pois, a tabela Detalhe nada mais é do que um campo da tabela master, então quando eu dou um insert na tabela Master e depois dou um post na mesma ele salva e gera o Código(Chave Primaria), depois quando dou um insert na tabela Detalhe a tabela Master entra novamente em estado de edição entendeu?
vou te mandar um exemplo funcionando para que vc possa ver na prática, o exemplo foi feito em Delphi 7...
no exemplo que te mandei, vj que o relacionamento está correto, mais ele ignora o relacionamento que fiz e manda o valor do ID da tabela Master para o campo ID da tabela Detalhe...
Antes da Inclusão , no registro Detalhe , acho que o Regsitro Mestre deve estar salvo .. Parece que voce não esta fazendo isto. [b:038c9b3a6f]Pelo menos a imagem mostra que não[/b:038c9b3a6f][/quote:038c9b3a6f]
não Marcos, deixa eu tentar te explicar se vc trabalha com relacionamento usando Master Source e criando o campo do tipo DataSetField vai saber do que estou falando...
Quando pesso para incluir um novo registro na tabela Detalhe e Registro Master entra automaticamente em modo de edição, pois, a tabela Detalhe nada mais é do que um campo da tabela master, então quando eu dou um insert na tabela Master e depois dou um post na mesma ele salva e gera o Código(Chave Primaria), depois quando dou um insert na tabela Detalhe a tabela Master entra novamente em estado de edição entendeu?
vou te mandar um exemplo funcionando para que vc possa ver na prática, o exemplo foi feito em Delphi 7...
[url=http://www.safpe.com.br/externo/Exmplo (Marcos Salles).rar]Exemplo Marco Salles[/url]
no exemplo que te mandei, vj que o relacionamento está correto, mais ele ignora o relacionamento que fiz e manda o valor do ID da tabela Master para o campo ID da tabela Detalhe...
GOSTEI 0
Marco Salles
09/09/2006
Quando pesso para incluir um novo registro na tabela Detalhe e Registro Master entra automaticamente em modo de edição
é verdade...
vou te mandar um exemplo funcionando para que vc possa ver na prática, o exemplo foi feito em Delphi 7...
Citação:
[url=http://www.safpe.com.br/externo/Exmplo (Marcos Salles).rar]Exemplo Marco Salles[/url
da pagina não encontrada.. e manda comunicar o erro a equioe de Dedenvolvimento
GOSTEI 0
Paullsoftware
09/09/2006
não, eu creio que vc copiou o trecho do endereço errado, eu abri normalmente aqui...
[url=http://www.safpe.com.br/externo/Exmplo (Marcos Salles).rar]
[b:e1774906b3]www.safpe.com.br/externo/Exmplo (Marcos Salles).rar[/b:e1774906b3]
[/url]
tenta agora...
é que tags não estão funcionando aqui comigo...
[url=http://www.safpe.com.br/externo/Exmplo (Marcos Salles).rar]
[b:e1774906b3]www.safpe.com.br/externo/Exmplo (Marcos Salles).rar[/b:e1774906b3]
[/url]
tenta agora...
é que tags não estão funcionando aqui comigo...
GOSTEI 0
Marco Salles
09/09/2006
não consigo descompacta-lo .. Da erro.
Mande-me como arquivo Zip e não com .rar
Mande-me como arquivo Zip e não com .rar
GOSTEI 0
Paullsoftware
09/09/2006
[quote:9b4074fe7a=´Marco Salles´]não consigo descompacta-lo .. Da erro.
Mande-me como arquivo Zip e não com .rar[/quote:9b4074fe7a]
Pronto o endereço é o mesmo, basta apenas mudar a extensão..
[b:9b4074fe7a]www.safpe.com.br/externo/Exmplo (Marcos Salles).zip[/b:9b4074fe7a]
Mande-me como arquivo Zip e não com .rar[/quote:9b4074fe7a]
Pronto o endereço é o mesmo, basta apenas mudar a extensão..
[b:9b4074fe7a]www.safpe.com.br/externo/Exmplo (Marcos Salles).zip[/b:9b4074fe7a]
GOSTEI 0
Marco Salles
09/09/2006
quando eu dou este endereço , ja começa a descarregar o arquivo , sem me perguntar aonde < qual o caminho para fazer o DonwLoad>
o pior é que não para ... so fica mostrando que esta fazendo o DownLoad , mas nada acontece... :cry: :cry: :cry:
verifique ai...
o pior é que não para ... so fica mostrando que esta fazendo o DownLoad , mas nada acontece... :cry: :cry: :cry:
verifique ai...
GOSTEI 0
Paullsoftware
09/09/2006
[quote:a6977363c9=´Marco Salles´]quando eu dou este endereço , ja começa a descarregar o arquivo , sem me perguntar aonde < qual o caminho para fazer o DonwLoad>
o pior é que não para ... so fica mostrando que esta fazendo o DownLoad , mas nada acontece... :cry: :cry: :cry:
verifique ai...[/quote:a6977363c9]
o endereço está ok, mais por via das duvidas mudei pra vc...
o pior é que não para ... so fica mostrando que esta fazendo o DownLoad , mas nada acontece... :cry: :cry: :cry:
verifique ai...[/quote:a6977363c9]
o endereço está ok, mais por via das duvidas mudei pra vc...
[url]www.safpe.com.br/externo/Exmplo.zip[/url]
GOSTEI 0
Marco Salles
09/09/2006
consegui , conentar .. De fato é igual ao que eu uso...
to estranhando que no Interbase não tenho este problema...
Tente fazer um teste usando o interbase e verifique se o problema persiste... Pode ser erro do Driver de conexão
no aguardo...
to estranhando que no Interbase não tenho este problema...
Tente fazer um teste usando o interbase e verifique se o problema persiste... Pode ser erro do Driver de conexão
no aguardo...
GOSTEI 0
Paullsoftware
09/09/2006
é por isso que eu acho que deve ser uma falha...
mais tive conversando com um pessoal eles falaram que por padrão as regras de relacionamentos usam os campos que possuem o mesmo nome nas duas tabelas automático, isso eu já sabia mais eu estou forçando ele a se relacionar com outro campo e ele não aceita, é isso que estou achando estranho, pois, trabalhai normal com esse sistema usando driver do Interbase tb, mais quando não usava DbExpress e sim componentes nativos da paleta IB... valeu pela atenção, vou continuar procurando, mais pelo menos já sei que em projetos futuros não poderei criar campos iguais em duas tabelas para não ter essa mesma dor de cabeça novamente... :wink:
mais tive conversando com um pessoal eles falaram que por padrão as regras de relacionamentos usam os campos que possuem o mesmo nome nas duas tabelas automático, isso eu já sabia mais eu estou forçando ele a se relacionar com outro campo e ele não aceita, é isso que estou achando estranho, pois, trabalhai normal com esse sistema usando driver do Interbase tb, mais quando não usava DbExpress e sim componentes nativos da paleta IB... valeu pela atenção, vou continuar procurando, mais pelo menos já sei que em projetos futuros não poderei criar campos iguais em duas tabelas para não ter essa mesma dor de cabeça novamente... :wink:
GOSTEI 0
Godzilla_xf
09/09/2006
Olá, olha eu naum tenho certeza, mas eu ja tive um problema como estes e resolvi assim
Tab_Mae
<--[b:12a4ff0c74]ID_MAE[/b:12a4ff0c74]
|
|
|
| Tab_Filha
| [b:12a4ff0c74][i:12a4ff0c74]ID_FILHA[/i:12a4ff0c74]
--> ID_MAE[/b:12a4ff0c74]
espero que isso possa te ajudar, caso não ajude desconcidere. Ok, té +++
Tab_Mae
<--[b:12a4ff0c74]ID_MAE[/b:12a4ff0c74]
|
|
|
| Tab_Filha
| [b:12a4ff0c74][i:12a4ff0c74]ID_FILHA[/i:12a4ff0c74]
--> ID_MAE[/b:12a4ff0c74]
espero que isso possa te ajudar, caso não ajude desconcidere. Ok, té +++
GOSTEI 0
Godzilla_xf
09/09/2006
E o parametro da tabela filha tem que ser igual ao campo da tabela Mae:
Tab_Mae
select ID_CLIENTE, NOME, ETC from tab_clientes Order By Nome
Tab_Filha
select * from tab_clientes
where
ID_CLIENTE = :ID_CLIENTE
blz, té +++
Tab_Mae
select ID_CLIENTE, NOME, ETC from tab_clientes Order By Nome
Tab_Filha
select * from tab_clientes
where
ID_CLIENTE = :ID_CLIENTE
blz, té +++
GOSTEI 0
Paullsoftware
09/09/2006
E o parametro da tabela filha tem que ser igual ao campo da tabela Mae:
Tab_Mae
select ID_CLIENTE, NOME, ETC from tab_clientes Order By Nome
Tab_Filha
select * from tab_clientes
where
ID_CLIENTE = :ID_CLIENTE
blz, té +++
Ae amigão, valeu pela participação... Eu sei que o nome do parametro da tabela filha deve ser igual ao nome do campo da tabela Pai, se vc baixar o exemplo que disponibilizei vai ver está tudo correto. O que estamos discutindo aqui é que existe uma falha que deveria ser corrigida, pois, dou como exemplo o meu caso, quando iniciei o meu Projeto ´Sistema para Controle de Locadoras´ ele funcionava em access e funcionava perfeitamente, passei para Interbase continuou funciona enquanto usei componentes nativos (os da paleta interbase) mais, agora que estou migrando para Multi-Camadas me deparei com essa pedra no meu caminho, mais sou como aquele refrão do Marcelo D2 ´[b:dc291a7ec8]Botam barreiras no caminho,mas sou persistente. Posso cair, mas me levanto e sigo em frente.Seguro a bronca, dou um 2 e mantenho a calma[/b:dc291a7ec8]´...
Eu resolvi o meu problema fazendo o relacionamento ´forçado´, quando inicia uma nova locação o meu sistema joga o valor campo ´Chave Primaria´ daí eu pego esse valor e uso ele no evento AffterInsert da tabela Filha, e somente para garantir que tudo vai correr bem, também passo os mesmos valores no evento BeforePost da mesma Tabela, está funcionando perfeitamente, eu abri esse Post para tentar saber do Pessoa se isso Ocorre por calsa de uma Falha ou Segue um determinado Padrão, se Segue um Padrão eu gostaria que alguns colegas aqui do Fórum me dissesse qual!
Agradeço a ajuda e colaboração de todos, e, estamos ai :wink:
GOSTEI 0
Godzilla_xf
09/09/2006
Opa, e ai blz, valeu, eu naum li todo o post, acho que foi por isso que postei assim. blz
obrigado pela atenção, até +.
obrigado pela atenção, até +.
GOSTEI 0