Jump to content
Fivewin Brasil

SQRRDD Set Relation To


oribeiro

Recommended Posts

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

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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
 

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...