perdendo pedaço do aquivo

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

clebervn
Usuário Nível 3
Usuário Nível 3
Mensagens: 286
Registrado em: 12 Jun 2007 10:49
Localização: Florianópolis/SC

perdendo pedaço do aquivo

Mensagem por clebervn »

Estou lendo um arquivo XML, contendo 388 itens, ele ta lendo até o 385 e despresando o resto, segue abaixo pedaõ do código referente a leitura do mesmo :

Código: Selecionar todos

    //  PEGA O NOME DO ARQUIVO A SER PROCESSADO DA MATRIZ
    xArquivo:= xDiretorio+aMatXml[jk]
    nHandle := FOPEN(xArquivo,2)
    nFim    := FSEEK(nHandle,0,2)
    FCLOSE(nHandle)

    //  LEITURA DO ARQUIVO XML
    xTexto   := MEMOREAD(xArquivo)
tem algo errado ou limitação ????
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: perdendo pedaço do aquivo

Mensagem por Toledo »

Olá Cleber, campo memo tem um limite de 64 Kb. Mas dê uma olhada nesta função do Pablo, pode ser que lhe ajude:

https://pctoledo.org/forum/viewto ... 848#p41848

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
alxsts
Colaborador
Colaborador
Mensagens: 3110
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: perdendo pedaço do aquivo

Mensagem por alxsts »

Olá!

Explore os recursos da ferramenta. Veja o que consegue com o objetoTXmlDocument() e outros associados.

Boa sorte!
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: perdendo pedaço do aquivo

Mensagem por Toledo »

Só complementando a mensagem do Alexandre, segue um exemplo:

Código: Selecionar todos

Private aProds:={}
cNFe:="C:\PASTA\ARQUIVO.XML"

oXmlDoc:= TXmlDocument():new()
oXMlDoc:read( Memoread( cNFe ) )

oXmlNode:= oXmlDoc:findFirst( "det" )
e=1
DO WHILE oXmlNode <> NIL
    oXmlDetPro := TXmlIteratorScan():new( oXmlNode )

    vCod:= STRTRAN(oXmlDetPro:find( 'cProd' ):cData," ","")
    vDesc:= oXmlDetPro:find( 'xProd' ):cData
    AADD(aProds,{vCod,vDesc,"","","",0,0,0,0,0,0,0,0,""})

    aProds[e,4]:= oXmlDetPro:find( 'CFOP' ):cData
    aProds[e,5]:= oXmlDetPro:find( 'uCom' ):cData
    aProds[e,6]:= VAL(oXmlDetPro:find( 'qCom' ):cData)
    aProds[e,7]:= VAL(oXmlDetPro:find( 'vUnCom' ):cData)
    aProds[e,8]:= VAL(oXmlDetPro:find( 'vProd' ):cData)

    if valtype(oXmlDetPro:find( 'infAdProd' ))!="U"
     aProds[e,14]:= oXmlDetPro:find( 'infAdProd' ):cData
    endif

    oXmlNode := oXmlDoc:findNext()
    e+=1
ENDDO
Bom, estou apenas dando um exemplo de como usar o objeto TXmlDocument(), mas como neste exemplo estou usando a função MEMOREAD() (ver linha 5), acho que não vai resolver o problema do Cleber.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
alxsts
Colaborador
Colaborador
Mensagens: 3110
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: perdendo pedaço do aquivo

Mensagem por alxsts »

Olá!

O método :read() aceita como parâmetros uma string ou um file handler. Assim, o limite de 64Kb pode ser superado:

Código: Selecionar todos

#include "fileio.ch"

   LOCAL nHandle

   Private aProds:={}

   cNFe:="C:\PASTA\ARQUIVO.XML"

   oXmlDoc:= TXmlDocument():new()
   //oXMlDoc:read( Memoread( cNFe ) )

   IF nHandle := ( FOPEN( cNFe, FO_READ ) ) == 0
      oXMlDoc:read( nHandle )
   
      oXmlNode:= oXmlDoc:findFirst( "det" )
      e=1
      DO WHILE oXmlNode <> NIL
         oXmlDetPro := TXmlIteratorScan():new( oXmlNode )
      
         vCod:= STRTRAN(oXmlDetPro:find( 'cProd' ):cData," ","")
         vDesc:= oXmlDetPro:find( 'xProd' ):cData
         AADD(aProds,{vCod,vDesc,"","","",0,0,0,0,0,0,0,0,""})
      
         aProds[e,4]:= oXmlDetPro:find( 'CFOP' ):cData
         aProds[e,5]:= oXmlDetPro:find( 'uCom' ):cData
         aProds[e,6]:= VAL(oXmlDetPro:find( 'qCom' ):cData)
         aProds[e,7]:= VAL(oXmlDetPro:find( 'vUnCom' ):cData)
         aProds[e,8]:= VAL(oXmlDetPro:find( 'vProd' ):cData)
      
         if valtype(oXmlDetPro:find( 'infAdProd' ))!="U"
            aProds[e,14]:= oXmlDetPro:find( 'infAdProd' ):cData
         endif
      
         oXmlNode := oXmlDoc:findNext()
         e+=1
      ENDDO
   ELSE
      Alert( "Arquivo não encontrato." )
   ENDIF   
[]´s
Alexandre Santos (AlxSts)
clebervn
Usuário Nível 3
Usuário Nível 3
Mensagens: 286
Registrado em: 12 Jun 2007 10:49
Localização: Florianópolis/SC

Re: perdendo pedaço do aquivo

Mensagem por clebervn »

vlw pela dica pessoal.

vou procurar usar e ver se resolve meu problema

obg
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: perdendo pedaço do aquivo

Mensagem por Toledo »

Alexandre, muito bem observado!
alxsts escreveu:IF nHandle := ( FOPEN( cNFe, FO_READ ) ) == 0
Mas fiz um teste aqui e com a linha acima não estava funcionando, então alterei para:

Código: Selecionar todos

#include "fileio.ch"

FUNC MAIN()
LOCAL nHandle

Private aProds:={}

cNFe:="135100017434998_v1.10-procNFe.xml"
nHandle:=FOPEN( cNFe, FO_READ )

IF FError() == 0
  oXmlDoc:= TXmlDocument():new()

  oXMlDoc:read( nHandle )
   
  oXmlNode:= oXmlDoc:findFirst( "det" )
  e=1
  DO WHILE oXmlNode <> NIL
    oXmlDetPro := TXmlIteratorScan():new( oXmlNode )
      
    vCod:= STRTRAN(oXmlDetPro:find( 'cProd' ):cData," ","")
    vDesc:= oXmlDetPro:find( 'xProd' ):cData
    AADD(aProds,{vCod,vDesc,"","","",0,0,0,0,0,0,0,0,""})
      
    aProds[e,4]:= oXmlDetPro:find( 'CFOP' ):cData
    aProds[e,5]:= oXmlDetPro:find( 'uCom' ):cData
    aProds[e,6]:= VAL(oXmlDetPro:find( 'qCom' ):cData)
    aProds[e,7]:= VAL(oXmlDetPro:find( 'vUnCom' ):cData)
    aProds[e,8]:= VAL(oXmlDetPro:find( 'vProd' ):cData)
      
    if valtype(oXmlDetPro:find( 'infAdProd' ))!="U"
      aProds[e,14]:= oXmlDetPro:find( 'infAdProd' ):cData
    endif
      
    oXmlNode := oXmlDoc:findNext()
    e+=1
  ENDDO
  FOR i=1 TO LEN(aProds)
   ? aProds[i,1], aProds[i,2], aProds[i,4], aProds[i,5], aProds[i,8]
  NEXT
ELSE
  Alert( "Arquivo não encontrato." )
ENDIF
RETU NIL
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
alxsts
Colaborador
Colaborador
Mensagens: 3110
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: perdendo pedaço do aquivo

Mensagem por alxsts »

Olá!

Eu errei. O código teria que ser:

Código: Selecionar todos

IF ( nHandle := FOPEN( cNFe, FO_READ ) ) > 0
ao invés de

Código: Selecionar todos

IF ( nHandle := FOPEN( cNFe, FO_READ ) ) == 0
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1309
Registrado em: 06 Jul 2004 00:44
Contato:

Re: perdendo pedaço do aquivo

Mensagem por ANDRIL »

Pessoal, tenho quase certeza que li em algum tópico que a função MEMOREAD, MEMOEDIT e outros MEMOs, não tinha o limite de 64k no [x]harbour. Voces já comprovaram isso?

Não estou com [x]harbour aqui instalado para fazer o teste, mais já estava contente em saber que este limite tinha sido extinto.

Ate+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Re: perdendo pedaço do aquivo

Mensagem por fladimir »

Andril, eu migrei a poucos dias para o Harbour e no meu editor de relatorios (texto) eu abri um arquivo de 0,99MB (1020KB) sem problemas não houve perca de dados do arquivo, isto via MemoEdit.

Sds.

Sucesso!!!

:)Pos
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: perdendo pedaço do aquivo

Mensagem por Toledo »

Andril, bem lembrado... no Harbour não existe este limite em campos memos.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Paredes01
Usuário Nível 2
Usuário Nível 2
Mensagens: 55
Registrado em: 20 Mai 2012 11:22
Localização: Mérida, Yucatán, México

perdendo pedaço do aquivo

Mensagem por Paredes01 »

hola a todos

Puedes checar este link:
http://forums.fivetechsupport.com/viewtopic.php?t=4116

Saludos
Ariel
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20420
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

perdendo pedaço do aquivo

Mensagem por JoséQuintas »

Teste assim:

Código: Selecionar todos

xArquivo := xDiretorio + aMatXml[ jk ]
cXml := MemoRead( xArquivo )
? Len( cXml )
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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/
Responder