Jump to content
Fivewin Brasil

SQRRDD Set Relation To


oribeiro

Recommended Posts

Pessoal,

Converti todo o meu sistema para MariaDB usando o SQLRDD.

Hoje notei que alguns relatórios que utilizan SET RELATION TO não fazem mais a relação entre as tabelas como faziam usando DBFCDX.

Alguém já passou por isso? Existe alguma forma de usar o mesmo SET RELATION TO no SQLRDD sem ter que user instrução SQL?

 

 

 

Link to comment
Share on other sites

Notei que o comando DBGOTO() não traz os relacionamentos da tabela, então, precisei fazer uma gambiarra montando um DBSEEK() sobre o registro que já estava ativo. Assim:

   Select (DbCliM)
   Set Order To 1
   DbGoTop()
   *****
   * Relacionamentos Mestre x Endereços
   *
   Select (DbCliE)
   Set Order To 1
   DbGoTop()
   Set Relation To (DbCliE)->NR_CL Into (DbCliM)
   ...
   ...
      *****
      * REGISTRO PONTEIRO DE IMPRESSAO
      *
      Select SRT && --> Registros Classificados
      SRT->(DBSKIP())
      STOR SRT->registro TO wregistro

      Select(DbCliE)
      (DbCliE)->(DBGOTO( wregistro ))
      (DbCliE)->(DbSeek( (DbCliE)->NR_CL )) // 06/06/18: Linha necessária porque o comando DBGOTO() não traz os relacionamentos da tabela.

 

Alguém tem outra idéia para que eu não precise alterar todos os programas que utilizo o DBGOTO()?

Link to comment
Share on other sites

Eu lembro na escola, em 94, quando a professora ensinando clipper foi explicar o SET RELATION, ela disse, NUNCA USEM QUE ISSO NÃO FUNCIONA DIREITO.

Na verdade não é que não funciona mas sim que isso depois pode gerar um pepino gigante, enfim, quem já está acostumado a usar é uma maravilha mas eu como nunca usei não sinto falta...

Mas falando da sua questão acredito que a melhor solução pode ser criar um translate e colocar em algum .CH que vc já tem ou criar um novo. E ai em todos relatórios vc colocar o include para este CH fazendo assim:

#xtranslate DbGoto()     => My_DbGoto()

Function My_DbGoto()
Local xRet
Local cFunc := "DbGotop()"
xRet := &cFunc
DbSkip(0)
Return xRet

Foi uma idéia que pensei agora, veja se seria viavel pra vc.

Link to comment
Share on other sites

Obrigado pela dica.

Eu fiz o seguinte: Coloquei um skip() e logo em seguida um skip(-1) logo após o DbGoTo() e funcionou. Parece que o SQL carregou novamente os relacionamentos.

Você sabe qual é o comando nativo em SQL que eu posso dar em SQLRDD para fazer um GO TO num determinado registro? Quero fazer essa tentativa para ver o resultado.

Select(DbCliE)
DBGOTO( wregistro )
( DbSkip(), DbSkip(-1) ) // Essa gambiarra resolveu o problema do Set Relation após um GoTo.
Link to comment
Share on other sites

  • 5 weeks later...

Pessoal,

Consegui identificar claramente o problema com SET RELATION usando SQLRDD.

É o seguinte?

Se eu tenho apenas um SET RELATION funciona muito bem, do tipo:

USE CLIENTES NEW
USE ENDERECOS NEW
SET RELATION TO numcli INTO CLIENTES

Mas se eu tenho múltiplos relacionamentos, daí não funciona com SQLRDD (onde com DBF funcionava perfeitamente), assim:

USE VENDEDORES NEW
USE CLIENTES NEW
SET RELATION TO numven INTO VENDEDORES
USE ENDERECOS NEW
SET RELATION TO numcli INTO CLIENTES

// Com SQLRDD Ele perde o relacionamento do cliente com o vendedor.

Alguém já encontrou uma solução? Senão vou ter que remover o SET RELATION de todos os meus programas e usar DBSEEK() em cada tabela. 

 

Link to comment
Share on other sites

 

Qual banco você usa? Estou com o MariaDB

mysql na maioria dos clientes com windows e mariadb no linux debian em alguns clientes

no exemplo abaixo com base no que o senhor disse, causaria problema em seu programa? 

  dbSelectAreaSql("Prod")
  Prod->(OrdSetFocus("Prod1"))
  Prod->(dbSetRelation( "Pres", {|| Prod->Fam_Prod+Prod->Cod_Prod} ))

  dbSelectAreaSql("Pedm")
  Pedm->(OrdSetFocus("Pedm2"))
  dbSetRelation( "Clie", {|| Pedm->Cli_Pedm} )
  dbSetRelation( "Agen", {|| Pedm->Age_Pedm} )
  dbSetRelation( "Tran", {|| Pedm->Tra_Pedm} )
  dbSetRelation( "Cond", {|| Pedm->Con_Pedm} )
  dbSetRelation( "Natu", {|| Pedm->Nat_Pedm} )
  dbSetRelation( "Vend", {|| Pedm->Ven_Pedm} )
  dbSetRelation( "Caxa", {|| Pedm->Cax_Pedm} )
  dbSetRelation( "Cent", {|| Pedm->Cen_Pedm} )
  dbSetRelation( "Ctcx", {|| Pedm->Cen_Pedm+Pedm->Ctc_Pedm} )

aqui não ocorre ... estranho os erros que acontece ai no seu programa

minha configuracaosqlrddversao.jpg?1530953508

? FWVERSION+" "+Version()+CRLF+hb_compiler()+CRLF+SR_GetConnectionInfo(, SQL_DBMS_NAME )+;
  Alltrim(SR_GetConnectionInfo(, SQL_DBMS_VER ))+" "+SR_Version()

 

Link to comment
Share on other sites

Eu estou com:

FWH18.02 xHarbour 1.2.3 Intl. (Simplex) (Build 20180311)
Borland/Embarcadero C++ 7.3 (32-bit)
MSSQL NATIVE50505 SQLRDD(EX) 9.0, Build 0015, MGMNT 1.72

 

Minhas LIBs estão sendo carregadas na seguinte ordem:

LIBFILES = $(FWH)\lib\fivehx.lib $(FWH)\lib\fivehc.lib lang.lib vm.lib rtl.lib rdd.lib macro.lib pp.lib dbfntx.lib dbfcdx.lib dbffpt.lib common.lib gtgui.lib codepage.lib ct.lib libeay32.lib ssleay32.lib tipssl.lib tip.lib pcrepos.lib hsx.lib hbsix.lib zlib.lib hbzip.lib png.lib hbzebra.lib $(CC_DIR)\lib\import32.lib $(CC_DIR)\lib\cw32.lib $(CC_DIR)\lib\psdk\msimg32.lib $(CC_DIR)\lib\psdk\psapi.lib $(CC_DIR)\lib\psdk\shell32.lib $(SQL)\sqlbcc70.lib $(SQL)\libpq.lib $(SQL)\odbccp32.lib $(SQL)\libmysql.lib $(SQL)\oci.lib $(SQL)\fbclient_bc.lib $(CC_DIR)\lib\psdk\odbc32.lib
 

O que será que está dando errado?

 

Link to comment
Share on other sites

Pessoal,

Para tirar a desconfiança do SET RELATION eu fiz o seguinte teste:

USE TBCST    SHARED NEW
USE TBCLASSI SHARED NEW
USE MTGRUPOS SHARED NEW
USE FTPRODUT SHARED NEW
SET RELATION TO CST            INTO TBCST   ,;
             TO CF             INTO TBCLASSI,;
             TO LEFT(PROD,2)   INTO MTGRUPOS

USE FTGRUPOS SHARED NEW
USE FTCLIEND SHARED NEW
USE FTCLIMES SHARED NEW
SET RELATION TO NR_GR          INTO FTGRUPOS,;
             TO NR_CL+LOC_FATU INTO FTCLIEND

USE FTVENDED SHARED NEW
USE TBNAT    SHARED NEW
USE FTTRANSP SHARED NEW
USE FTPEDMES SHARED NEW
SET RELATION TO NR_VD          INTO FTVENDED,;
             TO NAT            INTO TBNAT   ,;
             TO NR_TR          INTO FTTRANSP,;
             TO NR_CL          INTO FTCLIMES

USE FTPEDITE SHARED NEW
SET RELATION TO NR_PD          INTO FTPEDMES,;
             TO PROD           INTO FTPRODUT
DBGOTOP()

oPara := TTxtFile():New( "k:\sqlrela.txt" )
if oPara:Open()
   for n = 1 to 1000
      oPara:Add( FTPEDMES->NR_PD   +", "+;
                 FTCLIMES->ABREV   +", "+;
                 FTTRANSP->ABREV   +", "+;
                 FTVENDED->ABREV   +", "+;
                 FTCLIEND->ENDERECO+", "+;
                 FTGRUPOS->DESCR   +", "+;
                 FTPRODUT->PROD    +", "+;
                 TBCLASSI->CLASSIF +", "+;
                 TBCST->DESCR      +", "+;
                 MTGRUPOS->DESCR   +", "+;
                 TBNAT->CFOP             )
      FTPEDITE->(DBSKIP())
   next
   oPara:Close()
endif

Primeiro eu rodei esse código numa base DBF e gerei um arquivo texto com o nome DBFRELA.TXT.

Depois eu rodei esse mesmo código numa base SQL com os mesmos dados da base DBF e gerei o arquivo SQLRELAT.TXT

Comparando os arquivos, eles estão exatamente iguais. Não entendo porque quando gero relatórios com esses mesmos relacionamentos, na base DBF sai certo e na base SQL ele perde os relacionamentos?

 

Link to comment
Share on other sites

Pessoal,

Com SQLRDD, se eu avançar o registro e voltar ele funciona redondinho. 

Assim:

Select PEDIDOS
DbSkip()
DbSkip(-1)

Parece que ele não consegue trazer os registros do banco para a memória a tempo de fazer os relacionamentos.

Será que é alguma configuração no banco? É necessário dar algum comando de refresh no registro a cada DBSkip(), DBGoto(), etc.?

Link to comment
Share on other sites

order libs

   echo $(HBDIR)\lib\rtl.lib + >> b32.bc
   echo $(HBDIR)\lib\vm.lib + >> b32.bc
   echo $(HBDIR)\lib\gtgui.lib + >> b32.bc
   echo $(HBDIR)\lib\lang.lib + >> b32.bc
   echo $(HBDIR)\lib\macro.lib + >> b32.bc
   echo $(HBDIR)\lib\rdd.lib + >> b32.bc
   echo $(HBDIR)\lib\dbfntx.lib + >> b32.bc
   echo $(HBDIR)\lib\dbfcdx.lib + >> b32.bc
   echo $(HBDIR)\lib\dbffpt.lib + >> b32.bc
   echo $(HBDIR)\lib\hbsix.lib + >> b32.bc
   echo $(HBDIR)\lib\debug.lib + >> b32.bc
   echo $(HBDIR)\lib\common.lib + >> b32.bc
   echo $(HBDIR)\lib\pp.lib + >> b32.bc
   echo $(HBDIR)\lib\pcrepos.lib + >> b32.bc
   echo $(HBDIR)\lib\ct.lib + >> b32.bc
   echo $(HBDIR)\lib\zlib.lib + >> b32.bc
   echo $(HBDIR)\lib\hbzip.lib + >> b32.bc
   echo $(HBDIR)\lib\libmisc.lib + >> b32.bc
   echo $(HBDIR)\lib\tip.lib + >> b32.bc
   echo $(HBDIR)\lib\png.lib + >> b32.bc
   echo $(HBDIR)\lib\hbcomm.lib + >> b32.bc
   echo $(HBDIR)\lib\cw32.lib + >> b32.bc
   echo $(HBDIR)\lib\import32.lib + >> b32.bc
   echo $(HBDIR)\lib\codepage.lib + >> b32.bc
   echo $(SQLRDD)\lib\sql.lib + >> b32.bc
   echo $(SQLRDD)\lib\libmysql.lib + >> b32.bc
   echo $(SQLRDD)\lib\oci.lib + >> b32.bc
   echo $(FWDIR)\multisql\qscanner\lib\twain.lib + >> b32.bc
   echo $(BCDIR)\lib\psdk\msimg32.lib + >> b32.bc
   echo $(BCDIR)\lib\psdk\psapi.lib + >> b32.bc
   echo $(BCDIR)\lib\psdk\gdiplus.lib + >> b32.bc
   echo $(BCDIR)\lib\psdk\shell32.lib + >> b32.bc
   echo $(BCDIR)\lib\psdk\iphlpapi.lib, >> b32.bc

minha inicialização:

#include "fivewin.ch"
#include "Image.ch"
#include "xbrowse.ch"
#include "ord.ch"
#include "sqlrdd.ch"
#include "mysql.ch"
#include "directry.ch"

REQUEST SQLRDD
REQUEST SR_MYSQL

EXTERNAL OrdKeyCount, OrdKeyGoTo, OrdKeyNo
EXTERNAL DBPACK, DBZAP

#define HKEY_LOCAL_MACHINE      2147483650
#define HKEY_CURRENT_USER       2147483649

REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_PT850
REQUEST DBFCDX, DBFFPT, DTOS

FUNCTION Main( lParStart )

   RDDSETDEFAULT( "DBFCDX" )

   SET SCORE OFF
   SET DATE brit
   SET CONFIRM ON
   SET DELETED ON
   SET EXCLUSIVE OFF
   SET CENTURY ON
   SET EPOCH TO 1950
   SET DATE FORMAT "dd/mm/yyyy"
   SET multiple ON

   HB_LANGSELECT( "PT" )
   HB_SETCODEPAGE( "PT850" )
   FWSetLanguage(4)

   SR_UseDeleteds( .F. )               // NÃO MANTER REGISTROS DELETADOS NAS TABELAS = .f.
   SR_SetBaseLang( 2 )                 // portugues
   SR_Msg( 2 )                         // portugues
   SR_SetGoTopOnScope( .F. )           // NÃO EXECUTA O DBGOTOP() AUTOMATICO NOS ORDSCOPE
   SR_SetFastOpen( .T. )               // ABRE AS TABELAS EM MODO COMPARTILHADO
// SR_MaxRowCache( 10 )                // Quantidade máxima de linhas mantidas em cache em tabelas do SQLRDD. O Default é 1000.
// SR_FetchSize( 10 )                  //
// SR_AllInCache(.t.)                  // TRAZ TODOS OS REGISTRO NA ABERTURA DA TABELA
// SR_SETSYNTHETICINDEX(.F.)           // vale o que for configurado pela função SR_SetSyntheticIndexMinimun().
// SR_SETSYNTHETICINDEXMINIMUN(10)     // Quant.mínima de colunas na chave de índice para criá-lo como Sintético. Os valores aceitos são entre 0 e 10.

   SetHandleCount( 150 )
...
..
.

veja se ajuda 

Link to comment
Share on other sites

Sputnik,

Obrigado pela sua disposição em ajudar.

Coloquei exatamente os mesmos parâmetros que você e não resolveu.

Também tentei com o REQUEST SQLEX e sem ele e não notei nenhuma diferença.

Talvez seja alguma configuração no banco de dados. Vou continuar estudando o problema aqui para ver se descubro o motivo.

Por favor, se possível, me envie o seu SQL.LIB para oscar.oasys@gmail.com

 

Link to comment
Share on other sites

 

Pessoal,

Converti todo o meu sistema para MariaDB usando o SQLRDD.

Hoje notei que alguns relatórios que utilizan SET RELATION TO não fazem mais a relação entre as tabelas como faziam usando DBFCDX.

Alguém já passou por isso? Existe alguma forma de usar o mesmo SET RELATION TO no SQLRDD sem ter que user instrução SQL?

 

 

 

Oscar, mostra o código de um relatório aqui (seu prg do relatório inteiro)

Link to comment
Share on other sites

ORibeiro, a melhor maneira de ser ajudado a resolver é fazer um exemplo pequeno simulando a situação de erro. Neste exemplo pequeno bastaria a pessoa que quer lhe ajudar rodar o programa que simula a situação. 

No programa vc já cria as tabelas necessárias, popula as informações e simula o erro. Eu procuro fazer isso quando preciso de um HELP de alguem, pois postando um código enorme assim fica MUITO dificil olhar e ver o que está errado, principalmente pq não se consegue executar o desejado.

E também no exemplo deixe fácil a parte da string de conexão com o banco para quem for lhe ajudar só mudar a parte que seja relativa ao ambiente dele, por exemplo, IP do SQL, nome do database, etc.

Quanto mais automatico for o seu exemplo simulando a situação mais você conseguirá ser ajudado. Você tem um trabalho pra montar esse exemplo simulando a situação mas garanto que muita gente vai conseguir lhe ajudar de maneira mais efetiva.

Isso é apenas uma dica pra conseguir melhor ajuda, nem sempre é possivel montar esse exemplo simulando o erro. 

PS: Vou citar apenas um caso pessoal que ocorreu conosco aqui na EMotta. Certa vez identificamos um BUG no xHarbour nas funcões que leem XML. Após dar RELEASE na variavel ela continuava acumulando memória. Eu mencionei nos foruns, falei com CULIK, RON PINKAS, etc, e todos falavam que não ocorria o problema com eles.

Então montem um pequeno exemplo que criava um XML qualquer e ficava em LOOP abrindo esse XML e dando release na variavel, e montei uma receita de bolo (no proprio fonte) explicando como simular o problema. Dois dias depois o RON PINKAS corrigiu o problema e mandou email agradecendo o BUG relatado.

Abraços

 

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