oribeiro Posted March 12, 2018 Report Share Posted March 12, 2018 Estou importando dados do DBF para o SQL e toda vez que ele termina de importar uma tabela com muitos registros, dá esse erro: 12/03/2018 11:11:24: SQLExecDirect Error (-1) MySQL server has gone away - MySQL server has gone away Command sent to database : CREATE TABLE `cep` ( `cep` CHAR (9) , `endereco` CHAR (40) , `compl` CHAR (40) , `cidade` CHAR (25) , `estado` CHAR (2) , `sr_recno` BIGINT (15) NOT NULL UNIQUE AUTO_INCREMENT , `sr_deleted` CHAR (1) NOT NULL ) Engine=InnoDb Steatment handle : Connection handle : RetCode : -1 SR_MYSQL:RUNTIMEERR Linha : 904 SR_MYSQL:EXEC Linha : 394 SR_WORKAREA:SQLCREATE Linha : 5408 DBCREATE Linha : 0 CRIA_MODIF Linha : 3556 F_DBFS Linha : 60 ORGANIZA1 Linha : 382 ORGANIZA Linha : 219 (b)F_ORGA Linha : 108 TBUTTONBMP:CLICK Linha : 179 TBUTTON:HANDLEEVENT Linha : 1685 TBUTTONBMP:HANDLEEVENT Linha : 264 _FWH Linha : 3368 SENDMESSAGE Linha : 0 TDIALOG:COMMAND Linha : 426 TWINDOW:HANDLEEVENT Linha : 0 TDIALOG:HANDLEEVENT Linha : 924 DIALOGBOX Linha : 0 TDIALOG:ACTIVATE Linha : 296 F_ORGA Linha : 138 (b)BUILDMENU Linha : 583 TMENU:COMMAND Linha : 1548 TWINDOW:COMMAND Linha : 1087 TMDIFRAME:COMMAND Linha : 262 TMDIFRAME:HANDLEEVENT Linha : 0 _FWH Linha : 3368 WINRUN Linha : 0 TMDIFRAME:ACTIVATE Linha : 1043 MAIN Linha : 421 Com tabelas com poucos registros ele não reclama! Risos Quote Link to comment Share on other sites More sharing options...
emotta Posted March 12, 2018 Report Share Posted March 12, 2018 Valeu a dica. Vou trocar os comandos Set Filter por SR_SETFILTER. Pelo que notei será apenas trocar tirar os pontos do .AND. e do .OR. e o resto é igual no filtro. Esse comando aceita Field-> ou devo remover? Aproveitando, notei que o SQLRDD usa MySQL 4.1 e Postgres 9.0 e o LocalWeb hospeda bancos nas versões: MySQL 5.6: bases ilimitadas com até 1 GB cada (10 por site) PostgreSQL 9.5: bases ilimitadas com até 10 GB cada (3 por site) Vou ter problema com essas versões do LocalWeb? Obrigado. Não é igual não, embora pareça... O SR_SETFILTER é igual o WHERE no SELECT do SQL, portanto nele não pode ter variavel alem do FIELD-> vou tentar colocar um exemplo abaixo: Onde vc fazia: cCidade := "RIO DE JANEIRO" Set Filter CLIENTE->CIDADE == cCidade .and. CLIENTE->ESTADO = "RJ" Terá que ficar: EXEMPLO 01 CLIENTE->(Sr_SetFilter("CIDADE = "+Sr_cDbValue(cCidade)+" AND ESTADO = "+SR_cDbValue("RJ") )) ou EXEMPLO 02 cFiltro := "CIDADE = "+Sr_cDbValue(cCidade)+" AND ESTADO = "+SR_cDbValue("RJ") CIDADE->(Sr_SetFilter(cFiltro)) EXEMPLO 03 Se vc fizer: cFiltro := "CIDADE = cCidade AND ESTADO = cEstado" CIDADE->(Sr_SetFilter(cFiltro)) ou EXEMPLO 04 CIDADE->(Sr_SetFilter("CIDADE = cCidade AND ESTADO = cEstado")) ** Fazendo estes dois exemplos (03 E 04) acima vai dar erro pois o filtro é executado no server do SQL e ele não "entende" o que é cCidade e cEstado então você tem que mandar para o filtro o conteudo, como nos exemplos 01 e 02 Quote Link to comment Share on other sites More sharing options...
oribeiro Posted March 12, 2018 Report Share Posted March 12, 2018 Entendi! Valeu a dica. Alias, esse SR_cDbValue() que você usa é bem interessante. Obrigado. Quote Link to comment Share on other sites More sharing options...
oribeiro Posted March 12, 2018 Report Share Posted March 12, 2018 Se eu utilizo o filtro: A.TIPO="P" o sistema funciona normalmente com o SR_SETFILTER() Mas se eu incluo a comparação de valores numéricos, assim: A.TIPO="P" AND A.VRDOC > A.VRREC O sistema trava. Existe alguma regra para filtrar campos de valor numérico? Quote Link to comment Share on other sites More sharing options...
emotta Posted March 12, 2018 Report Share Posted March 12, 2018 Entendi! Valeu a dica. Alias, esse SR_cDbValue() que você usa é bem interessante. Obrigado. essa funcao serve pra fazer o seguinte: cCidade := "RIO DE JANEIRO" cFiltro := "cidade = '"+cCidade+"'" // copie e cole no bloco de notas pois tem " e ' fica dificil de ver aqui Agora a mesma coisa com SR_cDbValue cCidade := "RIO DE JANEIRO" cFiltro := "cidade = "+Sr_cDbValue(cCidade) Deu pra entender a diferença? Ele já coloca as aspas na string do filtro de acordo com o banco de dados conectado Quote Link to comment Share on other sites More sharing options...
Jorge Andrade Posted March 12, 2018 Report Share Posted March 12, 2018 Estou importando dados do DBF para o SQL e toda vez que ele termina de importar uma tabela com muitos registros, dá esse erro: 12/03/2018 11:11:24: SQLExecDirect Error (-1) MySQL server has gone away - MySQL server has gone away Command sent to database : CREATE TABLE `cep` ( `cep` CHAR (9) , `endereco` CHAR (40) , `compl` CHAR (40) , `cidade` CHAR (25) , `estado` CHAR (2) , `sr_recno` BIGINT (15) NOT NULL UNIQUE AUTO_INCREMENT , `sr_deleted` CHAR (1) NOT NULL ) Engine=InnoDb Steatment handle : Connection handle : RetCode : -1 SR_MYSQL:RUNTIMEERR Linha : 904 SR_MYSQL:EXEC Linha : 394 SR_WORKAREA:SQLCREATE Linha : 5408 DBCREATE Linha : 0 CRIA_MODIF Linha : 3556 F_DBFS Linha : 60 ORGANIZA1 Linha : 382 ORGANIZA Linha : 219 (b)F_ORGA Linha : 108 TBUTTONBMP:CLICK Linha : 179 TBUTTON:HANDLEEVENT Linha : 1685 TBUTTONBMP:HANDLEEVENT Linha : 264 _FWH Linha : 3368 SENDMESSAGE Linha : 0 TDIALOG:COMMAND Linha : 426 TWINDOW:HANDLEEVENT Linha : 0 TDIALOG:HANDLEEVENT Linha : 924 DIALOGBOX Linha : 0 TDIALOG:ACTIVATE Linha : 296 F_ORGA Linha : 138 (b)BUILDMENU Linha : 583 TMENU:COMMAND Linha : 1548 TWINDOW:COMMAND Linha : 1087 TMDIFRAME:COMMAND Linha : 262 TMDIFRAME:HANDLEEVENT Linha : 0 _FWH Linha : 3368 WINRUN Linha : 0 TMDIFRAME:ACTIVATE Linha : 1043 MAIN Linha : 421 Com tabelas com poucos registros ele não reclama! Risos Oscar, resolveu este problema???? pq eu fiz uma rotina para criar arquivo com a estrutura DBF para uma tabela Postgres e importação dos dados. []s, Quote Link to comment Share on other sites More sharing options...
oribeiro Posted March 12, 2018 Report Share Posted March 12, 2018 Olá Jorge, A minha rotina faz isso, mas depois de importar um arquivo grande da erro. Só no LocalWeb. Com Postgres instalado na rede local não dá erro. Se você puder me enviar a sua rotina eu testo aqui e vejo se estou fazendo algo errado. Obrigado. Quote Link to comment Share on other sites More sharing options...
oribeiro Posted March 13, 2018 Report Share Posted March 13, 2018 Tenho um arquivo grande de contas que contém todos os registros (recebidos e a receber) tem registros antigos que estão em aberto e com o sr_setfilter() eles não aparecem. Com o DBFCDX funciona normal. O que devo fazer para que o sr_setfilter() leia o arquivo inteiro e traga todos os registros que estão em aberto VRORIGINAL > VRRECEBIDO. Quote Link to comment Share on other sites More sharing options...
sygecom Posted March 13, 2018 Report Share Posted March 13, 2018 Tenho um arquivo grande de contas que contém todos os registros (recebidos e a receber) tem registros antigos que estão em aberto e com o sr_setfilter() eles não aparecem. Com o DBFCDX funciona normal. O que devo fazer para que o sr_setfilter() leia o arquivo inteiro e traga todos os registros que estão em aberto VRORIGINAL > VRRECEBIDO. Post o codigo que não está funcionando, as vez é um detalhe. Quote Link to comment Share on other sites More sharing options...
oribeiro Posted March 13, 2018 Report Share Posted March 13, 2018 Esse é o código dentro do programa onde o usuário define se verá todas as contas ou somente as que estão em aberto: REDEFINE CHECKBOX NRTudo[01] VAR NRTudo[02] ID 103 OF oDlgP UPDATE; ON CHANGE (mReg[01]:=(cDbfNR[01])->(RECN()),mReg[02]:=(cDbfNR[01])->(ORDNUMBER()),Filtro_Contas(cDbfNR[01],NRTudo[02],"R"),DBSETORDER(mReg[02]),DBGOTO(mReg[01]),Atualiza_Campos(),oScb:goBottom()) REDEFINE SAY PROMPT "Não &mostra as contas recebidas." ID 119 COLOR CLR_RED OF oDlgP UPDATE Essas são as funções que filtram as contas: ****************************************************************************************** FUNCTION Filtro_Contas() // usada em CCREC, CCPAG ****************************************************************************************** PARAM cDbfCta,lAberto,cTipo,cCL_FO Local cFiltro := [Field->TIPO="] + cTipo + ["] if cCL_FO<>nil // Filtra Cliente/Fornecedor cFiltro = cFiltro + [.and.Field->CL_FO="]+cCL_FO+["] endif if (lAberto) // Filtra contas recebidas/pagas cFiltro = cFiltro + [.and.Field->VRDOCUM>Field->VRPgRc] endif if pFlag="*" // Se ativado o (FLAG="*") cFiltro = cFiltro + [.and.!EMPTY(Field->NR_NF+Field->CUPOM)] endif Select(cDbfCta) OASetFilter( cFiltro ) Return nil ******************************************************************************************** FUNCTION OASetFilter( cFiltro ) // Usa o filtro do SQLRDD ******************************************************************************************** Default cFiltro := "" if BDPAD="SQLRDD" cFiltro := Upper( cFiltro ) cFiltro := StrTran(cFiltro, "FIELD->", "A." ) cFiltro := StrTran(cFiltro, "==", "=" ) cFiltro := StrTran(cFiltro, ".AND.", " AND ") cFiltro := StrTran(cFiltro, ".OR.", " OR " ) SR_SetFilter( cFiltro ) else SET FILTER TO &cFiltro endif Return nil Essa função funciona dom DBFCDX, mas não funciona com SQLRDD. Quote Link to comment Share on other sites More sharing options...
emotta Posted March 13, 2018 Report Share Posted March 13, 2018 Está travando em que ponto? Antes do SR_SETFILTER dê uma msg e depois dê outra, assim: if BDPAD="SQLRDD" cFiltro := Upper( cFiltro ) cFiltro := StrTran(cFiltro, "FIELD->", "A." ) cFiltro := StrTran(cFiltro, "==", "=" ) cFiltro := StrTran(cFiltro, ".AND.", " AND ") cFiltro := StrTran(cFiltro, ".OR.", " OR " ) MsgStop("Antes") SR_SetFilter( cFiltro ) MsgStop("Depois") else SET FILTER TO &cFiltro endif Quote Link to comment Share on other sites More sharing options...
oribeiro Posted March 13, 2018 Report Share Posted March 13, 2018 Descobri o problema, só não sei como resolver. Quando importei os dados do DBF para o SQL, os campos numéricos que estavam com ZERO foram para o banco como NULL. Daí, o sistema não consegue comparar um campo que tem um valor numérico com esse que está com NULL e não retorna os registros. Como faço para gravar ZERO no campo em vez de NULL na importação? Quote Link to comment Share on other sites More sharing options...
Jorge Andrade Posted March 13, 2018 Report Share Posted March 13, 2018 Descobri o problema, só não sei como resolver. Quando importei os dados do DBF para o SQL, os campos numéricos que estavam com ZERO foram para o banco como NULL. Daí, o sistema não consegue comparar um campo que tem um valor numérico com esse que está com NULL e não retorna os registros. Como faço para gravar ZERO no campo em vez de NULL na importação? Oscar, boa noite Saí o dia todo e cheguei somente agora. Vou alterar a minha rotina para para conectar o Mysql e te repasso. []s, Quote Link to comment Share on other sites More sharing options...
cnavarro Posted March 14, 2018 Report Share Posted March 14, 2018 Quizás el problema lo puedes tener al crear la tabla: clausulas NULL o DEFAULT Quote Link to comment Share on other sites More sharing options...
emotta Posted March 14, 2018 Report Share Posted March 14, 2018 Descobri o problema, só não sei como resolver. Quando importei os dados do DBF para o SQL, os campos numéricos que estavam com ZERO foram para o banco como NULL. Daí, o sistema não consegue comparar um campo que tem um valor numérico com esse que está com NULL e não retorna os registros. Como faço para gravar ZERO no campo em vez de NULL na importação? Você terá que importar tudo novamente. O segredo é na criação da tabela, você precisa passar um para parâmetro no array da estrutura da tabela indicando que aquele campo nao deve aceitar NULL. É a quitna coluna do array que define o nome do campo, tamanho, decimais, etc Exemplo: aStrutura := {{"CODIGO","C",06,0,.T.},{"NOME","C",40,0}} Neste caso o campo CODIGO nunca será NULO porem o campo NOME quando em branco fica como nulo. Quote Link to comment Share on other sites More sharing options...
oribeiro Posted March 14, 2018 Report Share Posted March 14, 2018 Eu estou tendo problemas com Campos que armazenam valor numérico. Então, se eu colocar .T. na quinta coluna ele irá gravar Zero nesse campo quando não tiver conteúdo como faz o DBF? Em campos caractere ele gravará brancos em vez de null quando não tiver conteúdo? Quote Link to comment Share on other sites More sharing options...
emotta Posted March 14, 2018 Report Share Posted March 14, 2018 Eu estou tendo problemas com Campos que armazenam valor numérico. Então, se eu colocar .T. na quinta coluna ele irá gravar Zero nesse campo quando não tiver conteúdo como faz o DBF? Em campos caractere ele gravará brancos em vez de null quando não tiver conteúdo? A regra é mais ou menos assim, todo campo EMPTY ele grava como NULL... Eu não sei o motivo. Pra mim funciona sem problemas, nunca tive problema com isso. Vc pode ter como regra sempre colocar .T. nessa quinta coluna do array para nenhum campo gravar NULO nunca. Fica a seu critério. Quote Link to comment Share on other sites More sharing options...
Jorge Andrade Posted March 14, 2018 Report Share Posted March 14, 2018 Oscar, boa noite Saí o dia todo e cheguei somente agora. Vou alterar a minha rotina para para conectar o Mysql e te repasso. []s, Oscar boa tarde, ainda não achei os fontes da rotina. Eu fiz em modo console de forma que conectasse a qualquer SGBD que pudesse ser gerenciado pela SQLRDD, inclusive, agora não consigo nem conectar o Mysql ahuahauahua com a minha função de conexões..É muita zica mano. mas vou continuar procurando e espero ainda hoje te chamar no skype se vc não tiver o meu, adicione por favor.jorge.fnl. []s, Quote Link to comment Share on other sites More sharing options...
oribeiro Posted March 15, 2018 Report Share Posted March 15, 2018 Eu criei a seguinte rotina para testar .T. na quinta coluna: MatVrf := {{"CAR0","C",015,000,.T.},; {"CAR1","C",015,000,.T.},; {"LOG0","L",001,000,.T.},; {"LOG1","L",001,000,.T.},; {"NUM0","N",015,002,.T.},; {"NUM1","N",015,002,.T.},; {"DAT0","D",008,000,.T.},; {"DAT1","D",008,000,.T.},; {"MEM0","M",010,000,.T.},; {"MEM1","M",010,000,.T.}} DbCreate(Net_Local( pDado + ArqMod ),MatVrf) if net_use("XXXXXX") for i=1 to 10 SR_BeginTransaction() OADbAppend() // só gravei os campos que terminam com ZERO para ver como ficam os que terminam com UM // replace car0 with strzero(i,15) replace log0 with .T. replace num0 with 15 replace dat0 with date() replace mem0 with "teste memo" SR_CommitTransaction() // SR_EndTransaction() next use endif Mas os campos que eu não dei um replace continuam a gravar NULL. Quote Link to comment Share on other sites More sharing options...
oribeiro Posted March 15, 2018 Report Share Posted March 15, 2018 Por favor, desconsidere o email anterior. Deu certo sim. Obrigado. É que em vez de colocar .F. na quinta coluna eu havia colocado .T. Excelente. Onde encontro a sintaxe completa desse comando DBCreate para SQLRDD? Não conhecia essa quinta coluna. 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.