Error log ao incluir itens na grid do pedido de vendas

Boa tarde amigos,

Estou desenvolvendo um programa para importar os itens de um pedido de venda à partir de um arquivo CSV, o processo de leitura do arquivo está funcionando legal. O problema é quando ele vai inserir os itens na grid apresenta um error log que eu não lembro de visto antes. Alguém poderia me ajudar?


/*/{Protheus.doc} ImpItens
Rotina de importacao dos pedidos de compra
@type function
@version 1.0.1
@author marcos.sanches
@since 12/21/2023
/*/
Static Function ImpItens()
   Local cTmp :="C:\"
   Local cArquivo := "" 

   if MSGYESNO("Iniciar importacao dos itens?", "TOTVS" )
      cArquivo := tFileDialog( "Arquivos CSV (*.csv) ", 'Selecao de Arquivos',, cTmp, .F.,)
      LeArquivo(cArquivo)
   EndIf
Return

/*/{Protheus.doc} LeArquivo
Funcao para leitura do arquivo e importacao dos itens do pedido de venda
@type function
@version 1.0.1
@author marcos.sanches
@since 12/22/2023
@param Caminho, character, Caminho e nome do arquivo csv a ser importado
/*/
Static Function LeArquivo(Caminho)
   If !Empty(Caminho)
      If File(caminho) .And. Upper(SubStr(Caminho,RAt(".",Caminho) + 1,3)) == "CSV"
         Processa({|| Importa(Caminho)},"Importando itens")
      Else
         MSGSTOP("Arquivo com extensao invalida", "TOTVS" )
      EndIf
   Endif
Return

/*/{Protheus.doc} Importa
Processa a importacao do arquivo
@type function
@version 1.0.1 
@author marcos.sanches
@since 12/22/2023
@param Arquivo, array, arquivo CSV
/*/
Static Function Importa(Arquivo)
   Local aArea       := GetArea()
   Local nTotLinhas  := 0
   Local cLinAtu     := ""
   Local nLinhaAtu   := 0
   Local aLinha      := {}
   Local aItens      := {}
   Local i           := 1
   Local oArquivo
   Local aLinhas
   Local nValUni     := 0
   Local nQtd        := 0
   Local nValTot     := 0

   oArquivo := FWFileReader():New(Arquivo)

   If (oArquivo:Open())
      If ! (oArquivo:EoF())
         //Definindo o tamanho da régua
         aLinhas := oArquivo:GetAllLines()
         nTotLinhas := Len(aLinhas)

         ProcRegua(nTotLinhas)

         oArquivo:Close()
         oArquivo := FWFileReader():New(Arquivo)
         oArquivo:Open()

         While (oArquivo:HasLine())
            //Incrementa na tela a mensagem
            nLinhaAtu++
            IncProc("Analisando linha " + cValToChar(nLinhaAtu) + " de " + cValToChar(nTotLinhas) + "...")

            //Pegando a linha atual e transformando em array
            cLinAtu := oArquivo:GetLine()
            aLinha  := StrTokArr(cLinAtu, ";")
            aadd(aItens,aLinha)
         EndDo

         For i := 1 to len(aItens)

            IncProc("Importando linha " + cValToChar(i) + " de " + cValToChar(len(aItens)) + "...")

            acols[Len(Acols)][aScan(aHeader,{|x|Alltrim(x[2])=="C6_ITEM"})] := aItens[i][1]
            acols[Len(Acols)][aScan(aHeader,{|x|Alltrim(x[2])=="C6_PRODUTO"})] := aItens[i][2]

            DbSelectArea("SB1")
            SB1->(DbSetOrder((1)))
            SB1->(dbSeek(FwxFilial('SB1') + aItens[i][2]))

            nValUni := Val(StrTran(aItens[i][5],",","."))
            nQtd := Val(StrTran(aItens[i][4],",","."))
            nValTot := nQtd * nValUni

            acols[Len(Acols)][aScan(aHeader,{|x|Alltrim(x[2])=="C6_DESCRI"})] := SB1->B1_DESC
            acols[Len(Acols)][aScan(aHeader,{|x|Alltrim(x[2])=="C6_UM"})] := aItens[i][3]
            acols[Len(Acols)][aScan(aHeader,{|x|Alltrim(x[2])=="C6_QTDVEN"})] := Val(StrTran(aItens[i][4],",","."))
            acols[Len(Acols)][aScan(aHeader,{|x|Alltrim(x[2])=="C6_PRCVEN"})] := Val(StrTran(aItens[i][5],",","."))
            acols[Len(Acols)][aScan(aHeader,{|x|Alltrim(x[2])=="C6_VALOR"})] := nValTot
            acols[Len(Acols)][aScan(aHeader,{|x|Alltrim(x[2])=="C6_QTDLIB"})] := Val(StrTran(aItens[i][4],",","."))

            aadd(aCols,Array(Len(aHeader)+1))
         Next
      Else
         MsgStop("Arquivo não tem conteúdo!", "Atenção")
      EndIf

      //Fecha o arquivo
      oArquivo:Close()
   Else
      MsgStop("Arquivo não pode ser aberto!", "Atenção")
   EndIf
   RestArea(aArea)
Return

:warning: Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.

O erro em si é relacionado ao tipo de campo quando realizado uma inserção, atualização, etc. Se você debugar o seu fonte, colocando ponto de parada nas linhas que o fonte está percorrendo, é possível ver em qual dos campos que está 'estourando' o erro.

Um adicional aqui, você está tentando criar um pedido de venda com os itens do CSV ou tentando adicionar os itens à um pedido de venda já existente? Pois, não encontrei dados do cabeçalho do pedido.

Também não encontrei a chamada da rotina de inclusão/alteração do pedido de venda no seu fonte.

Aqui uma documentação da própria Totvs mostrando como gerar o pedido de venda, você pode adaptar para a leitura do seu arquivo CSV:

Rotina Automática de Criação de Pedido de Venda

Espero ter ajudado.

Boa tarde,

O objetivo do programa não é gerar o pedido de venda e sim popular a grid com os itens, por este motivo não existe a necessidade de preenchimento do cabeçalho. Já realizamos o debug do fonte e não verificamos nenhum comportamento anormal.

a chamada da rotina é realizada através de um botão adicionado através do P.E A410Cons.

Em qual momento que, pelo debug, você identifica que estoura o errorlog? Pelo que entendi também, você quer adicionar itens em um pedido de venda, é isso? Se for isso, você pode fazer um teste chamando a rotina automática do pedido de venda, passando a opção de alteração ao invés da inserção. De qualquer forma, é necessário você passar qual pedido você está querendo vincular. Sobre o PE, a documentação dele diz que é feito para adicionar mais BOTÔES.