oribeiro Posted June 5, 2018 Report Share Posted June 5, 2018 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? Quote Link to comment Share on other sites More sharing options...
oribeiro Posted June 6, 2018 Author Report Share Posted June 6, 2018 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()? Quote Link to comment Share on other sites More sharing options...
emotta Posted June 6, 2018 Report Share Posted June 6, 2018 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. Quote Link to comment Share on other sites More sharing options...
oribeiro Posted June 6, 2018 Author Report Share Posted June 6, 2018 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. Quote Link to comment Share on other sites More sharing options...
emotta Posted June 6, 2018 Report Share Posted June 6, 2018 nReg := 999 aResult := {} cSelect := "SELECT * FROM NOME_DA_TABLE WHERE SR_RECNO = "+Sr_cDbValue(nReg) SR_GetConnection():Exec(cSelect,,.t.,@aResult) // aqui apresenta os resultados MsgStop(Sr_ShowVector(aResult)) Quote Link to comment Share on other sites More sharing options...
oribeiro Posted July 6, 2018 Author Report Share Posted July 6, 2018 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. Quote Link to comment Share on other sites More sharing options...
sistem Posted July 6, 2018 Report Share Posted July 6, 2018 amigo não tenho esse problema. isso não acontece comigo. Quote Link to comment Share on other sites More sharing options...
oribeiro Posted July 6, 2018 Author Report Share Posted July 6, 2018 Qual banco você usa? Estou com o MariaDB Quote Link to comment Share on other sites More sharing options...
sistem Posted July 7, 2018 Report Share Posted July 7, 2018 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 configuracao ? FWVERSION+" "+Version()+CRLF+hb_compiler()+CRLF+SR_GetConnectionInfo(, SQL_DBMS_NAME )+; Alltrim(SR_GetConnectionInfo(, SQL_DBMS_VER ))+" "+SR_Version() Quote Link to comment Share on other sites More sharing options...
oribeiro Posted July 10, 2018 Author Report Share Posted July 10, 2018 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? Quote Link to comment Share on other sites More sharing options...
kapiaba Posted July 10, 2018 Report Share Posted July 10, 2018 Baixou o xHarbour daqui? http://forums.fivetechsupport.com/viewtopic.php?f=16&t=33542&start=15 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted July 10, 2018 Report Share Posted July 10, 2018 https://groups.google.com/forum/#!msg/comp.lang.xharbour/LFhCZXNN4fE/drSsDsyock8J http://www.devsuperpage.com/search/Articles.aspx?G=7&ArtID=679429 https://pt.scribd.com/document/256651796/Sqlrdd-Manual http://compgroups.net/comp.lang.xharbour/dynamic-indices-sqlrdd/2979671 Quote Link to comment Share on other sites More sharing options...
oribeiro Posted July 10, 2018 Author Report Share Posted July 10, 2018 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? Quote Link to comment Share on other sites More sharing options...
oribeiro Posted July 10, 2018 Author Report Share Posted July 10, 2018 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.? Quote Link to comment Share on other sites More sharing options...
sistem Posted July 11, 2018 Report Share Posted July 11, 2018 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 Quote Link to comment Share on other sites More sharing options...
oribeiro Posted July 11, 2018 Author Report Share Posted July 11, 2018 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 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted July 11, 2018 Report Share Posted July 11, 2018 baixe o manual, quem sabe não ajuda: https://kupdf.net/download/sqlrdd-manual_58bed82ae12e894771add374_pdf Quote Link to comment Share on other sites More sharing options...
oribeiro Posted July 11, 2018 Author Report Share Posted July 11, 2018 Valeu João. Vou continuar estudando. Obrigado. Quote Link to comment Share on other sites More sharing options...
oribeiro Posted July 12, 2018 Author Report Share Posted July 12, 2018 Alguém tem um exemplo do comando SR_SETJOIN() ? Quote Link to comment Share on other sites More sharing options...
oribeiro Posted July 12, 2018 Author Report Share Posted July 12, 2018 Não consegui usar o SR_SETJOIN então decidi usar o SELECT / JOIN mas também não está dando certo. Onde estou errando? Quote Link to comment Share on other sites More sharing options...
oribeiro Posted July 19, 2018 Author Report Share Posted July 19, 2018 Estou tentando trocar SET RELATION TO por SR_SETJOIN mas não estou conseguindo. Alguém pode me fornecer uma ajuda? Quote Link to comment Share on other sites More sharing options...
sistem Posted July 19, 2018 Report Share Posted July 19, 2018 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) Quote Link to comment Share on other sites More sharing options...
oribeiro Posted July 19, 2018 Author Report Share Posted July 19, 2018 Segue: Quote Link to comment Share on other sites More sharing options...
emotta Posted July 19, 2018 Report Share Posted July 19, 2018 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 Quote Link to comment Share on other sites More sharing options...
sistem Posted July 19, 2018 Report Share Posted July 19, 2018 oribeiro olhei o código e deu vontade de sair correndo (tipo forrest gump) brincadeira como disse o emotta um pequeno exemplo (pensei que o relatório fosse menor) 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.