SqlRdd

Forum sobre SQL.

Moderador: Moderadores

nasouza
Usuário Nível 1
Usuário Nível 1
Mensagens: 37
Registrado em: 20 Jul 2009 17:57
Localização: Santa Isabel do Ivai - Pr

SqlRdd

Mensagem por nasouza »

Boa Tarde,

Como substituir o arquivo dbsetrelation(), pela ajuda vi que seria o SR_SETJOIN(), mas nao estou conseguindo acertar a sintaxe.
Esta seria a estrutura :

Código: Selecionar todos

IF Use_Arq('LOCPROD','LOC',.T.,.F.,.F.)=.F.
   Return
END

IF Use_Arq('PEDPEN_','PEN',.T.,.F.,.F.)=.F.
   Return
else
   //dbsetrelation("loc",{||codi_pro},"codi_pro")
   SR_SetJoin( <nTargetArea>, <cField>, [<nOrignArea>], [<nTargetOrder>] )
END
usando o dbsetrelation() funciona, mas gostaria de poder utilizar o SR_SETJOIN().

Agradeço.
Editado pela última vez por JoséQuintas em 27 Mar 2021 17:41, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

SqlRdd

Mensagem por JoséQuintas »

Não sei a resposta à sua pergunta, mas por coincidência estou alterando um aplicativo que usa muito abre_Arq() no mesmo estilo desse use_arq()

Sugestão básica para o fonte:

Código: Selecionar todos

IF ! Use_Arq('LOCPROD','LOC',.T.,.F.,.F.)
   Return
ENDIF

IF ! Use_Arq('PEDPEN_','PEN',.T.,.F.,.F.)
   Return
ENDIF
//dbsetrelation("loc",{||codi_pro},"codi_pro")
SR_SetJoin( , , [], [] )
E sugestão não tão básica, pra uso geral no aplicativo:

Código: Selecionar todos

IF ! AbreArquivos( "locprod", "pedpen" )
   RETURN
ENDIF
SELECT pen
//dbsetrelation("loc",{||codi_pro},"codi_pro")
SR_SetJoin( , , [], [] )
...
FUNCTION AbreArquivos( ... )
   LOCAL aList

   aList := hb_AParams()
   FOR EACH cFile IN aList
       IF ! AbreDBF( cFile )
          CLOSE DATABASES
         MsgStop( "Arquivo " + cFile + " não pode ser aberto" )
          RETURN .F.
      ENDIF
   NEXT
   RETURN .T.

FUNCTION AbreDBF( cFile )

   cFile := Lower( cFile )
   DO CASE
   CASE cFile == "locprod"
      IF ! Use_Arq('LOCPROD','LOC',.T.,.F.,.F.)
         Return .F.
      ENDIF
   CASE cFile == "pedpen"
      IF ! Use_Arq('PEDPEN_','PEN',.T.,.F.,.F.)
         Return .F.
      ENDIF
   ENDCASE

   RETURN .T.
A vantagem em trocar para o aplicativo inteiro seria reduzir fonte repetido, e evitar que cada fonte abra o mesmo arquivo com índices diferentes, por exemplo.
No aplicativo que estou mexendo tem muito disso, e com índice errado.
Conforme a opção aberta pela primeira vez, o índice vai ser diferente.

Também facilita futuras mudanças de DBF/NTX pra DBF/CDX ou HBNETIO ou outras.

No fonte em questão, isto:

Código: Selecionar todos

IF ! Use_Arq('LOCPROD','LOC',.T.,.F.,.F.)
   Return
ENDIF

IF ! Use_Arq('PEDPEN_','PEN',.T.,.F.,.F.)
   Return
ENDIF
se altera pra isto:

Código: Selecionar todos

IF ! AbreArquivos( "locprod", "pedpen" )
   RETURN
ENDIF
E quanto mais arquivos, mais economia de fonte, o que se traduz em fonte mais limpo e aplicativo mais fácil de gerenciar.
E cuidado com essa abreviação de ALIAS. procurar LOC e PEN nos fontes do aplicativo vai ser complicado.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
jmsilva
Usuário Nível 1
Usuário Nível 1
Mensagens: 5
Registrado em: 29 Mar 2019 14:28
Localização: Caraguatatuba/sp

SqlRdd

Mensagem por jmsilva »

Eu fiz vários testes e pesquisa sobre a Sr_Setjoin, não funcionou, acredito que a lib que uso ela está com bug.
Set relation funciona bem, porém faz muita requisições no banco de dados.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

SqlRdd

Mensagem por JoséQuintas »

Código: Selecionar todos

 //dbsetrelation("loc",{||codi_pro},"codi_pro")
	   SR_SetJoin( <nTargetArea>, <cField>, [<nOrignArea>], [<nTargetOrder>] )
Olhando os parâmetros de SR_SetJoin, são:

<nTargetArea> número da área destino
<cField> caractere, campo

opcionais
<nOrignArea> número da área origem
<nTargetOrder> número da ordem destino

Isso sugere

Código: Selecionar todos

SR_SetJoin( Select( "loc" ), "codi_pro" )
ou

Código: Selecionar todos

Sr_SetJoin( Select( "loc" ), "codi_pro", Select(), 1 )
Considerando que 1 é o primeiro índice
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
nasouza
Usuário Nível 1
Usuário Nível 1
Mensagens: 37
Registrado em: 20 Jul 2009 17:57
Localização: Santa Isabel do Ivai - Pr

SqlRdd

Mensagem por nasouza »

SELE PE_
//dbsetrelation("loc",{||codi_pro},"codi_pro")
SR_SetJoin( "LOC", "CODI_PRO","PE_",1)
SELE CLI
cAlias := Select()
OrdSetFocus(2)
dbgotop()

ERRO:
Error SQLRDD/0 SR_SetJoin() is no longer supported - RollBack executed.: SQLRDD
Called from ->THROW(0)
Called from ..\source\utils.prg->SR_RUNTIMEERR(1241)
Called from ..\source\utils.prg->SR_SETJOIN(811)
Called from CLIPED.PRG->CLIPED1(20)
Called from GERENC.PRG->(b)MAIN(98)
Called from source\hwindow.prg->ONCOMMAND(883)
Called from source\hwindow.prg->(b)HMAINWINDOW(250)
Called from source\hwindow.prg->HMAINWINDOW:ONEVENT(474)
Called from ->HWG_ACTIVATEMAINWINDOW(0)
Called from source\hwindow.prg->HMAINWINDOW:ACTIVATE(430)
Called from GERENC.PRG->MAIN(196)

HwGUI 2.17 xHarbour 1.2.3 Intl. (SimpLex) (Build 20140807)
Date:25/06/2021
Time:13:09:58
Responder