oribeiro Posted July 19, 2018 Author Report Share Posted July 19, 2018 Até eu que criei o código acho difícil de entender. Risos. Vou tentar montar um código pequeno que apresente o problema de perder o relacionamento. Quote Link to comment Share on other sites More sharing options...
oribeiro Posted July 23, 2018 Author Report Share Posted July 23, 2018 Sputnik, Esse código está mais simples: Se eu as duas linhas abaixo funciona, caso contrário ele não traz os dados do cliente: // (DbCliM)->NR_CL = (DbCliM)->NR_CL // INSERIDO PARA CORRIGIR ERRO DE RELACIONAMENTO COM SQL // (DBCLIE)->NR_CL = (DBCLIE)->NR_CL // INSERIDO PARA CORRIGIR ERRO DE RELACIONAMENTO COM SQL Veja o código: Local DbCliE, DbCliM, DbNFM, DbTest Local iData[02], FData[02], CUF[2], NINT[2], nEst[02] // Filtro para o banco de dados: iData[02] := CTOD("01/06/2017") FData[02] := CTOD("30/06/2017") CUF[2] := "" NINT[2] := 1 nEst[02] := 1 // Cria tabela para Teste // DBCREATE("_TESTE",{{"CAMPO","C",72,0}},"SQLRDD") USE _TESTE SHARED NEW VIA "SQLRDD" DbTest := Alias() // Seleciona as Tabelas e os Relacionamentos // USE FTCLIEND SHARED NEW VIA "SQLRDD" DbCliE := Alias() DbSetOrder(1) USE FTCLIMES SHARED NEW VIA "SQLRDD" DbCliM := Alias() DbSetOrder(1) Set Relation To (DbCliM)->NR_CL+(DbCliM)->LOC_FATU Into (DbCliE) USE FTNFMES SHARED NEW VIA "SQLRDD" DbNFM := Alias() DbSetOrder(1) Set Relation To (DbNfM)->NR_CL Into (DbCliM) Set Filter To (DbNfM)->Dt_Emiss>=iData[02] .AND.; (DbNfM)->Dt_Emiss<=fData[02] DbGoTop() Do While !Eof() // (DbCliM)->NR_CL = (DbCliM)->NR_CL // INSERIDO PARA CORRIGIR ERRO DE RELACIONAMENTO COM SQL // (DBCLIE)->NR_CL = (DBCLIE)->NR_CL // INSERIDO PARA CORRIGIR ERRO DE RELACIONAMENTO COM SQL IF (cUF[02]==(DbCLIE)->Estado) .OR.; (nInt[02]=1.AND.(DbCLIE)->Estado<>pEstado).OR.; (nEst[02]=1.AND.(DbCLIE)->Estado==pEstado) Select(DbTest) OADbAppend() REPLACE CAMPO WITH PADR(ALLTRIM(mmSerie) ,03) +; // serie subserie STRZERO(VAL(LEFT(StrNum((DBNFM)->NR_NF,.f.),6)),06) +; // Numero da NF (inicial) STRZERO(VAL(LEFT(StrNum((DBNFM)->NR_NF,.f.),6)),06) +; // Numero da NF (final) PADR(" UF + NOME => " ,16) +; PADR((DbCliE)->Estado ,02) +; // Estado PADR((DbCliM)->Nome ,34) // Nome Endif Select(DbNfM) DbSkip() Enddo Select(DbTest) DbCommit() DbGoTop() Browse() DbCloseAll() FnErase("_TESTE") Quote Link to comment Share on other sites More sharing options...
oribeiro Posted July 23, 2018 Author Report Share Posted July 23, 2018 Nesse exemplo acima, notei que funciona se eu fizer o relacionamento consolidado no último arquivo, assim: // Seleciona as Tabelas e os Relacionamentos // USE FTCLIEND SHARED NEW VIA "SQLRDD" DbCliE := Alias() DbSetOrder(1) USE FTCLIMES SHARED NEW VIA "SQLRDD" DbCliM := Alias() DbSetOrder(1) USE FTNFMES SHARED NEW VIA "SQLRDD" DbNFM := Alias() DbSetOrder(1) Set Relation To (DbNfM)->NR_CL Into (DbCliM),; To (DbCliM)->NR_CL+(DbCliM)->LOC_FATU Into (DbCliE) em vez de: // Seleciona as Tabelas e os Relacionamentos // USE FTCLIEND SHARED NEW DbCliE := Alias() DbSetOrder(1) USE FTCLIMES SHARED NEW DbCliM := Alias() DbSetOrder(1) Set Relation To (DbCliM)->NR_CL+(DbCliM)->LOC_FATU Into (DbCliE) USE FTNFMES SHARED NEW DbNFM := Alias() DbSetOrder(1) Set Relation To (DbNfM)->NR_CL Into (DbCliM) Só não entendi porque. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted July 23, 2018 Report Share Posted July 23, 2018 https://vivaclipper.wordpress.com/2014/02/17/set-relation/ https://vivaclipper.wordpress.com/tag/set-relation/ Quote Link to comment Share on other sites More sharing options...
sistem Posted July 23, 2018 Report Share Posted July 23, 2018 oribeiro, não vejo erro no seu código veja assim: USE (cTabela) SHARED NEW ALIAS (cAlias) VIA "SQLRDD" cAlias->(DBSETORDER("NomeDoIndice")) ex: Esti->(DBSETORDER("Esti1")) hoje a noite irei criar um exemplo com base no seu. com 3 tabelas e seus relacionamentos... dai vc ver Quote Link to comment Share on other sites More sharing options...
oribeiro Posted July 23, 2018 Author Report Share Posted July 23, 2018 Em vez de DBSetOrder(1) eu coloquei DBSetOrder("FTCLIM01") -> coloquei os nomes dos indices. E a situação foi a mesma. Aguardo seu exemplo, obrigado pela ajuda. Quote Link to comment Share on other sites More sharing options...
sistem Posted July 23, 2018 Report Share Posted July 23, 2018 altera oS use já colocando os alias na abertura da tabela para: USE (cTabela) SHARED NEW ALIAS (cAlias) VIA "SQLRDD" dai vou preparar aqui o exemplo Quote Link to comment Share on other sites More sharing options...
oribeiro Posted July 23, 2018 Author Report Share Posted July 23, 2018 Assim? Local DbCliE, DbCliM, DbNFM, DbTest Local iData[02], FData[02], CUF[2], NINT[2], nEst[02] // Filtro para o banco de dados: iData[02] := CTOD("01/06/2017") FData[02] := CTOD("30/06/2017") CUF[2] := "SP" NINT[2] := 1 nEst[02] := 1 // Cria tabela para Teste // FnErase("_TESTE") DBCREATE("_TESTE",{{"CAMPO","C",72,0}}) USE _TESTE SHARED NEW ALIAS "_TESTE" DbTest := Alias() // Seleciona as Tabelas e os Relacionamentos // USE FTCLIEND SHARED NEW ALIAS "FTCLIEND" DbCliE := Alias() DbSetOrder("FTCLIE01") USE FTCLIMES SHARED NEW ALIAS "FTCLIMES" DbCliM := Alias() DbSetOrder("FTCLIM01") Set Relation To (DbCliM)->NR_CL+(DbCliM)->LOC_FATU Into (DbCliE) //// ->> TIREI DAQUI USE FTNFMES SHARED NEW ALIAS "FTNFMES" DbNFM := Alias() DbSetOrder("FTNFM01") Set Relation To (DbNfM)->NR_CL Into (DbCliM) ,; To (DbCliM)->NR_CL+(DbCliM)->LOC_FATU Into (DbCliE) //// <<- COLOQUEI AQUI Set Filter To (DbNfM)->Dt_Emiss>=iData[02] .AND.; (DbNfM)->Dt_Emiss<=fData[02] DbGoTop() Do While !Eof() If (cUF[02]==(DbCLIE)->Estado) .OR.; (nInt[02]=1.AND.(DbCLIE)->Estado<>pEstado).OR.; (nEst[02]=1.AND.(DbCLIE)->Estado==pEstado) Select(DbTest) OADbAppend() REPLACE CAMPO WITH PADR(ALLTRIM(mmSerie) ,03) +; // serie subserie STRZERO(VAL(LEFT(StrNum((DBNFM)->NR_NF,.f.),6)),06) +; // Numero da NF (inicial) STRZERO(VAL(LEFT(StrNum((DBNFM)->NR_NF,.f.),6)),06) +; // Numero da NF (final) PADR(" UF + NOME => " ,16) +; PADR((DbCliE)->Estado ,02) +; // Estado PADR((DbCliM)->Nome ,34) // Nome EndIf Select(DbNfM) DbSkip() Enddo Select(DbTest) DbCommit() DbGoTop() xBrowse() DbCloseAll() FnErase("_TESTE") Quote Link to comment Share on other sites More sharing options...
sistem Posted July 23, 2018 Report Share Posted July 23, 2018 USE FTCLIEND SHARED NEW ALIAS "FTCLIEND" DbCliE := Alias() fica .. faz pra todos // remover Local DbCliE, DbCliM, DbNFM, DbTest USE FTCLIEND SHARED NEW ALIAS "DbCliE" // DbCliE := Alias() // remove essa Quote Link to comment Share on other sites More sharing options...
oribeiro Posted July 26, 2018 Author Report Share Posted July 26, 2018 Decidi colocar todos os relacionamentos na tabela principal no SQLRDD em vez de fazer um relacionamento em cascata como eu costumava usar no DBFCDX e está tudo funcionando. Fica aqui a dica para caso alguém venha ter o mesmo problema ao migrar para SQLRDD. Obrigado a todos que me ajudaram a desvendar essa diferença no funcionamento do DBF em relação ao SQL. Agora vou explorar mais os comandos nativos do SQL para agilizar os processos. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.