Criar SC EXECAUTO

Boa tarde Amigos e Amigas.

Estou desenvolvendo um programa que deve realizar SC com centenas de itens.

Premissa: Importa um arquivo TXT ou CSV, criado pelo usuário e apartir desse arquivo monta a SC.

Porém estou tendo um problema, creio que na lógica.

Ele lê o arquivo e todos os dados dentro do arquivo, porém no momento de montar a SC ele monta com apenas um item que no caso será o último lido.

Eu preciso que a cada loop do While ele pule para a próxima linha na grid do Proteheus, Segue o trecho em que estou tendo problemas:


    //Se o arquivo pode ser aberto
    If (oArquivo:Open())

        //Se não for fim do arquivo
        If ! (oArquivo:EoF())

            //Definindo o tamanho da régua
            aLinhas := oArquivo:GetAllLines()
            nTotLinhas := Len(aLinhas)
            ProcRegua(nTotLinhas)

            //Método GoTop não funciona (dependendo da versão da LIB), deve fechar e abrir novamente o arquivo
            oArquivo:Close()
            oArquivo := FWFileReader():New(cArqSel)
            oArquivo:Open()

            //Iniciando controle de transação
            Begin Transaction

                aCabec      := {}
                cDoc := GetSXENum("SC1","C1_NUM")
                SC1->(dbSetOrder(1))
                While SC1->(dbSeek(xFilial("SC1")+cDoc))
                    ConfirmSX8()
                    cDoc := GetSXENum("SC1","C1_NUM")
                EndDo

                aadd(aCabec,{"C1_NUM"       ,   cDoc        })
                aadd(aCabec,{"C1_SOLICIT"   ,   __cUserID   })
                aadd(aCabec,{"C1_EMISSAO"   ,   dDataBase   })
                aadd(aCabec,{"C1_FILIAL"    ,   xFilial("SC1")})

                //Enquanto tiver linhas
                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  := Separa(cLinAtu, ';')

                    //Se houver posições no array
                    If Len(aLinha) > 0
                        aDados      := {}
                        aItens      := {}

                        nx := 1

                        aadd(aDados, {"C1_ITEM"     ,   StrZero(nx,len(SC1->C1_ITEM)),Nil})
                        aAdd(aDados, {"C1_PRODUTO"  ,   aLinha[1]       , Nil})
                        aAdd(aDados, {"C1_QUANT"    ,   VAL(aLinha[2])  , Nil})
                        aadd(aDados, {"C1_OBS"      ,   "TESTE"         , Nil})

                        aadd(aItens,aDados)
                    EndIf
                EndDo

                If !Empty(aItens)
                    lMsErroAuto := .F.
                    MSExecAuto({|x,y| mata110(x,y)},aCabec,aItens, 3)

                        //Se houve erro, gera o log
                    If lMsErroAuto
                            cPastaErro := '\x_logs\'
                            cNomeErro  := 'erro_' + cAliasImp + '_' + dToS(Date()) + '_' + StrTran(Time(), ':', '-') + '.txt'

                            //Se a pasta de erro não existir, cria ela
                            If ! ExistDir(cPastaErro)
                                MakeDir(cPastaErro)
                            EndIf

                            //Pegando log do ExecAuto, percorrendo e incrementando o texto
                            aLogErro := GetAutoGRLog()
                            For nLinhaErro := 1 To Len(aLogErro)
                                cTextoErro += aLogErro[nLinhaErro] + CRLF
                            Next

                            //Criando o arquivo txt e incrementa o log
                            MemoWrite(cPastaErro + cNomeErro, cTextoErro)
                        EndIf
                Endif

            End Transaction

            //Se tiver log, mostra ele
            If ! Empty(cLog)
                MemoWrite(cDirTmp + cArqLog, cLog)
                ShellExecute('OPEN', cArqLog, '', cDirTmp, 1)
            EndIf

        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

1 curtida

Boa tarde!

Acredito que o problema esteja ocorrendo pois você está limpando a variável aItens juntamente com a variável aDados. Faça a limpeza da variável aItens apenas após execução do ExecAuto. Dessa forma:


// Preenchendo a variável aItens
If Len(aLinha) > 0

    nx := 1
    aDados := {}

    aAdd(aDados, {"C1_ITEM"     ,   StrZero(nx,len(SC1->C1_ITEM)),Nil})
    aAdd(aDados, {"C1_PRODUTO"  ,   aLinha[1]       , Nil})
    aAdd(aDados, {"C1_QUANT"    ,   VAL(aLinha[2])  , Nil})
    aAdd(aDados, {"C1_OBS"      ,   "TESTE"         , Nil})

    aAdd(aItens,aDados)

EndIf


If(!Empty(aItens))

    lMsErroAuto := .F.

    MsExecAuto({ |x,y| MATA110(x,y)}, aCabec, aItens, 3)

    If(lMsErroAuto)

        // realizar processos em caso de erro

    EndIf

    // limpar as variáveis após execução do ExecAuto
    aCabec    := {}
    aItens    := {}

Endif

1 curtida

Era isso mesmo Xavier, muito obrigado pelo Help Deu certo.

1 curtida

Olá!

Você ainda tem esse fonte? Se tiver poderia compartilhar?

Estou tentando fazer, mas está ocorrendo um erro no código do comprador.

1 curtida