Página 1 de 1

perdendo pedaço do aquivo

Enviado: 04 Ago 2010 17:45
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 ????

Re: perdendo pedaço do aquivo

Enviado: 04 Ago 2010 18:28
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,

Re: perdendo pedaço do aquivo

Enviado: 04 Ago 2010 18:32
por alxsts
Olá!

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

Boa sorte!

Re: perdendo pedaço do aquivo

Enviado: 05 Ago 2010 08:56
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,

Re: perdendo pedaço do aquivo

Enviado: 05 Ago 2010 09:29
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   

Re: perdendo pedaço do aquivo

Enviado: 05 Ago 2010 09:40
por clebervn
vlw pela dica pessoal.

vou procurar usar e ver se resolve meu problema

obg

Re: perdendo pedaço do aquivo

Enviado: 05 Ago 2010 10:38
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,

Re: perdendo pedaço do aquivo

Enviado: 05 Ago 2010 12:22
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

Re: perdendo pedaço do aquivo

Enviado: 05 Ago 2010 14:40
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+

Re: perdendo pedaço do aquivo

Enviado: 05 Ago 2010 15:54
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

Re: perdendo pedaço do aquivo

Enviado: 05 Ago 2010 16:11
por Toledo
Andril, bem lembrado... no Harbour não existe este limite em campos memos.

Abraços,

perdendo pedaço do aquivo

Enviado: 01 Jun 2016 13:16
por Paredes01
hola a todos

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

Saludos
Ariel

perdendo pedaço do aquivo

Enviado: 01 Jun 2016 19:13
por JoséQuintas
Teste assim:

Código: Selecionar todos

xArquivo := xDiretorio + aMatXml[ jk ]
cXml := MemoRead( xArquivo )
? Len( cXml )