- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- subir arquivo csv - erro na leitura
Perguntas subir arquivo csv - erro na leitura
- CZL1
- Autor do Tópico
- Desconectado
- Membro Júnior
Menos
Mais
- Postagens: 21
- Obrigados Recebidos: 0
2 anos 6 meses atrás #33263
por CZL1
subir arquivo csv - erro na leitura foi criado 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
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.
- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- subir arquivo csv - erro na leitura
Tempo para a criação da página:0.098 segundos