Perguntas subir arquivo csv - erro na leitura

Mais
2 anos 3 semanas atrás #33263 por CZL1
Boa tarde pessoal. Eu tenho um codigo para subir um arquivo csv para subir um inventário. Porem, em certo momento do processamento, ele lê colunas a menos e dá erro.
Tipo assim: Há 10 colunas na tabela no csv, mas em certo momento ele lê apenas 9 colunas. Para testar, garanti que todas as células estão preenchidas e vejo que os campos são válidos. Mas, não consigo entender por que isso acontace.
Podem me ajudar? Segue o fonte:

#include "protheus.ch"
#include "topconn.ch"
/*
Programa utilizado para subir tabela csv para iventario.
*/

User Function SOBEINV()
Local aSays := {}
Local aButtons := {}
Local lOk
Local cArquivo := ""

AADD( aSays, "Este programa ira ler o conteudo de um arquivo CSV")
AADD( aSays, "e incluir como inventário" )
AADD( aButtons, { 01, .T., {|| lOk := .T.,(cArquivo := cGetFile("Arquivo CSV | *.CSV","Selecione o arquivo CSV",,,.T.)) ,Iif( File(cArquivo), FechaBatch(), msgStop("Arquivo CSV: " + cArquivo + " não localizado") ) } } )
AADD( aButtons, { 02, .T., {|| lOk := .F., FechaBatch() } } )
;FormBatch( "Inventário", aSays, aButtons )

If lOk
Begin Transaction
Processa({|| A009Im( cArquivo ) }, "Verificando arquivo CSV" )
End Transaction
EndIf

Return

Static Function A009Im(cArquivo)
Local aDados := {}
Local cPerg := Padr("SOBEINV",Len(SX1->X1_GRUPO))
Local cFilSB1 := xFilial("SB1")
Local cFilSB7 := xFilial("SB7")
Local nLenSB1 := Len(SB1->B1_COD)
Local cLog
Local dData
Local nCont := 1
Local nTotLinha

If !File(cArquivo)
MsgAlert("Arquivo texto: " + cArquivo + " não localizado")
Return
Endif

PutSx1(cPerg, "01","Documento "," "," ","mv_ch1","C",09,0,0,"G"," ","mv_par01","","","","","",""," ","","","" ,"","","","","","","",""," ")

If !Pergunte(cPerg,.T.)
Return
EndIf

cLog := "Processo inicializado em " + DToC( MSDate() ) + " às " + Time() + CRLF

SB1->(DbSetOrder(1)) //B1_FILIAL + B1_COD
SB7->(DbSetOrder(3)) //B7_FILIAL +B7_DOC + B7_COD + B7_LOCAL

If SB7->(DbSeek( cFilSB7 + mv_par01 )) .And. Empty(SB7->B7_STATUS)
If MsgYesNo("Inventário " + mv_par01 + " já incluido" + CRLF + " Deseja continuar?( o inventário será sobreposto)","Bem Estar")
If TcSqlExec( "Delete From " + RetSqlName("SB7") + " Where B7_FILIAL='" + cFilSB7 + "' And B7_DOC='" + mv_par01 + "'") <> 0
MsgStop("Erro ao excluir inventário " + mv_par01,"Bem Estar")

Return
EndIf
Else
Return
EndIf
EndIf

FT_FUSE(cArquivo) //ABRIR
FT_FGOTOP() //PONTO NO TOPO
ProcRegua(nTotLinha := FT_FLASTREC())
// FT_FGOTOP()
FT_FSKIP() //Pular a primeira linha(cabecaho)

Do While !FT_FEOF() //FACA ENQUANTO NAO FOR FIM DE ARQUIVO

// Capturar dados
cBuffer := FT_FREADLN() //LENDO LINHA
cBuffer := StrTran(cBuffer,'"',"")
aDados := Separa(cBuffer,";")

IF Len(aDados) < 11
MsgAlert("menos de 11", "menos de 11")
endif

IncProc("Linha:" + StrZero(++nCont,5) + " de " + StrZero(nTotLinha,5) + " Produto " + aDados[1])
aDados[1] := Padr(AllTrim(aDados[1]),nLenSB1)
aDados[5] := StrTran(aDados[5],".","")

If !Empty(aDados[1])
If SB1->(DbSeek(cFilSB1 + aDados[1]))
RecLock("SB7",.T.)
SB7->B7_FILIAL := '0101' // FIXO
SB7->B7_COD := aDados[1] // CODIGO ATUALIZADO = 1
SB7->B7_LOCAL := '01' // FIXO
SB7->B7_TIPO := POSICIONE("SB1", 1, xFilial("SB1") + aDados[1], "B1_TIPO") // Tipo = 11
SB7->B7_DOC := 'CARGAINV' // FIXO
SB7->B7_QUANT := Val(aDados[8]) // Estoque = 8
// SB7->B7_QTSEGUM := Val(aDados[10]) // Estoque = 10
SB7->B7_DATA := MsDate() // FIXO
SB7->B7_LOTECTL := aDados[9] // Lote = 9
SB7->B7_LOCALIZ := aDados[5] // LOCALIZACAO = 5
SB7->B7_STATUS := '1' // FIXO

dData := LastDate(CTOD("01/" + LEFT(aDados[10],3) + "20" + RIGHT(aDados[10],2)))
SB7->B7_DTVALID := dData // VALIDADE = 10
SB7->(MsUnLock())
Else
cLog+="Produto " + aDados[1] + " linha " + StrZero(nCont,5) + " não encontrado" + CRLF
EndIf
EndIf
FT_FSKIP() //próximo registro no arquivo txt
EndDo

FT_FUSE() //fecha o arquivo txt


cLog += "Processo finalizado em " + DToC( MSDate() ) + " às " + Time()
MsgInfo(cLog)
Return

User Function MoviINT()

Local aSays:={}
Local aButtons:={}
Local lOk
Local cArquivo:=""
Local aDados :={"01","02"}
RpcSetType(3)
RpcSetEnv(aDados[1],aDados[2])

AADD( aSays, "Este programa ira ler o conteudo de um arquivo CSV")
AADD( aSays, "e realizar movimento interno" )
AADD( aSays, "Layout=Tipo;Produto;Quant;Local,Doc" )
AADD( aButtons, { 01, .T., {|| lOk := .T.,(cArquivo:=cGetFile("Arquivo CSV | *.CSV","Selecione o arquivo CSV",,,.T.)) ,Iif( File(cArquivo), FechaBatch(), msgStop("Arquivo CSV: "+cArquivo+" não localizado") ) } } )
AADD( aButtons, { 02, .T., {|| lOk := .F., FechaBatch() } } )
;FormBatch( "Movimento Interno", aSays, aButtons )

If lOk
Begin Transaction
Processa({|| A009Exe( cArquivo ) }, "Verificando arquivo CSV" )
End Transaction
EndIf

RETURN

Static Function A009Exe(cArquivo)
Local aDados := {}
Local cFilSB1 := xFilial("SB1")
// Local cFilSD3 := xFilial("SD3")
// Local nLenSB1 := Len(SB1->B1_COD)
// Local nLenDOC := Len(SD3->D3_DOC)
Local cLog
Local nCont :=1
Local nTotLinha
Local aSd3

cLog := "Processo inicializado em " + DToC( MSDate() ) + " às " + Time()+CRLF

SB1->(DbSetOrder(1))//B1_FILIAL+B1_COD
SD3->(DbSetOrder(2))//D3_FILIAL+D3_DOC+D3_COD

FT_FUSE(cArquivo) //ABRIR
FT_FGOTOP() //PONTO NO TOPO
ProcRegua(nTotLinha := FT_FLASTREC())
// FT_FGOTOP()
FT_FSKIP()//Pular a primeira linha(cabecaho)

Do While !FT_FEOF() //FACA ENQUANTO NAO FOR FIM DE ARQUIVO

// Capturar dados
cBuffer := FT_FREADLN() //LENDO LINHA
cBuffer := StrTran(cBuffer,'"',"")
aDados := Separa(cBuffer,";")

IncProc("Linha:"+StrZero(++nCont,5) + " de " + StrZero(nTotLinha,5) + " Produto " + aDados[1])

aDados[1]:=AllTrim(aDados[1])
aDados[2]:=Val(aDados[2])
//aDados[3]:=alltrim(aDados[3])
//aDados[4]:=alltrim(aDados[4])

If Empty(aDados[2])
Loop
EndIf

cDoc := 'CARGAINV'

If SB1->(DbSeek(cFilSB1+aDados[1]))
aSd3 := {}
aAdd(aSd3, {"D3_TM" , '499' , NIL})
aAdd(aSd3, {"D3_COD" , aDados[1] , NIL})
aAdd(aSd3, {"D3_QUANT" , Val(aDados[8]) , NIL})
// aAdd(aSd3, {"D3_QTSEGUM" , Val(aDados[9]) , NIL})
aAdd(aSd3, {"D3_LOCAL" , '01' , NIL})
aAdd(aSd3, {"D3_DOC" , cDoc , NIL})
aAdd(aSd3, {"D3_EMISSAO" , MsDate() , NIL})
aAdd(aSd3, {"D3_LOTECTL" , aDados[9] , NIL})
aAdd(aSd3, {"D3_LOCALIZ" , aDados[6] , NIL})

lMsErroAuto := .F.
MSExecAuto({|x,y| mata240(x,y)},aSd3,3)
If lMsErroAuto
MostraErro()
ELSE
nSequem:=cvaltochar(SD3->D3_NUMSEQ)
cAlias := getNextAlias()
BeginSql Alias cAlias
SELECT
DA_PRODUTO,DA_LOCAL,DA_NUMSEQ,D3_LOCALIZ,D3_LOTECTL,DA_SALDO
FROM
%TABLE:SD3% SD3
INNER JOIN %TABLE:SDA% SDA ON
D3_NUMSEQ = DA_NUMSEQ
WHERE
D3_DOC = %Exp:cDoc% AND DA_SALDO > 0 AND DA_NUMSEQ = %Exp:nSequem%
EndSQl

incProc('Produto: ' + allTrim((cAlias)->DA_PRODUTO) + ' – Sequencial: ' + (cAlias)->DA_NUMSEQ )


SDA->(dbGoTop()) // posiciona o cabeçalho
if SDA->(dbSeek( xfilial('SDA') + (cAlias)->DA_PRODUTO + (cAlias)->DA_LOCAL + (cAlias)->DA_NUMSEQ))
if SDA->DA_SALDO > 0
lMsErroAuto := .F.

aCabSDA := {}
aAdd( aCabSDA, {'DA_PRODUTO' ,SDA->DA_PRODUTO, Nil} )
aAdd( aCabSDA, {'DA_NUMSEQ' ,SDA->DA_NUMSEQ , Nil} )

aItSDB := {}
aAdd( aItSDB, {'DB_ITEM' , '0001' , Nil} )
aAdd( aItSDB, {'DB_ESTORNO', '' , Nil} )
aAdd( aItSDB, {'DB_LOCALIZ', '', Nil} )
aAdd( aItSDB, {'DB_DATA' , dDataBase , Nil} )
aAdd( aItSDB, {'DB_QUANT' , SDA->DA_SALDO , Nil} )

aItensSDB := {}
aadd( aItensSDB, aitSDB )
lMsErroAuto := .F.
MATA265( aCabSDA, aItensSDB, 3)

If lMsErroAuto
DisarmTransaction()
ENDIF
endif
endif
EndIf

Else
cLog += "Produto " + aDados[1] + " linha " + StrZero(nCont,5) + " não encontrado" + CRLF
EndIf

FT_FSKIP() //próximo registro no arquivo txt
EndDo

FT_FUSE() //fecha o arquivo txt
MsgInfo(cLog)


Return

Por favor Acessar ou Registrar para participar da conversa.

Tempo para a criação da página:0.093 segundos
Joomla templates by a4joomla