Mestre/Detalhe (era... Senão é bug oq que é então?)

Delphi

09/09/2006

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

Paullsoftware

Curtidas 0

Respostas

Marco Salles

Marco Salles

09/09/2006

é , comigo funciona bemmm

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

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


GOSTEI 0
Marco Salles

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]


GOSTEI 0
Paullsoftware

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

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

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


GOSTEI 0
Marco Salles

Marco Salles

09/09/2006

não consigo descompacta-lo .. Da erro.

Mande-me como arquivo Zip e não com .rar


GOSTEI 0
Paullsoftware

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]


GOSTEI 0
Marco Salles

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


GOSTEI 0
Paullsoftware

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...
[url]www.safpe.com.br/externo/Exmplo.zip[/url]



GOSTEI 0
Marco Salles

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


GOSTEI 0
Paullsoftware

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:


GOSTEI 0
Godzilla_xf

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


GOSTEI 0
Godzilla_xf

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


GOSTEI 0
Paullsoftware

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

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


GOSTEI 0
POSTAR