Jump to content
Fivewin Brasil

Migrando o dbf para sql


edutraini

Recommended Posts

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

Link to comment
Share on other sites

 

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






 

Link to comment
Share on other sites

 

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

 

Link to comment
Share on other sites

 

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,

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

 

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

 

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,

Link to comment
Share on other sites

 

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.

 

 

 

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

 

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.

 

 

 

Link to comment
Share on other sites

 

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,

Link to comment
Share on other sites

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.

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