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:
ao invés de
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
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 )