Imprimi Página | Fechar janela

Importação CSV

Impresso de: Helpfacil - Portal do conhecimento
Nome do Forum: ADVPL
Descrição do Forum: Dúvidas sobre a programação em ADVPL
URL:http://www.helpfacil.com.br/display_topic_threads.asp?ForumID=1&TopicID=43738
Data da Impressão: quinta-feira, 18 de abril de 2024 at 21:53


Topico: Importação CSV

Postado por: ADVPL_OS
Assunto: Importação CSV
Data Postagem: terça-feira, 10 de agosto de 2021 at 05:56

Bom dia galera, sou novato no ADVPL e com base em alguns fontes estou tentando fazer a importação de um arquivo de retorno que recebo em csv.

Quero fazer esse arquivo pegar o índice 3 da minha SZB e atualizar campos específicos com os dados do arquivo. Porém ele não cai no bloco do Reclock de alteração.


Alguém consegue me dar uma ajuda????????



User Function TIMPCSV()

Processa({||IMPSZB()},"Importando CSV. Aguarde...")

Return


Static Function IMPSZB()

Local nx := 0
Local cCodFunc := ""

Private aTxt        := {}
Private aRet        := {}



If ParamBox({     {6,"Arquivo",SPACE(50),"","FILE(mv_par01)","", 55 ,.T.,"Arquivo .CSV |*.CSV"}},;
     "Importa Retorno Ticket",@aRet,,)
     //{1,"Importar .CSV",SPACE(10),"","dbSeek(xFilial(‘AF8‘)+AllTrim(mv_par03))","AF8","", 45 ,.F.},;
     //{3,"Versao do Project",1 ,{"Portugues","Ingles"},70,,.F.},;
     
     If (nHandle := FT_FUse(AllTrim(aRet[1])))== -1
          Help(" ",1,"NOFILEIMPOR")
          Return
     EndIf
     
     
     FT_FGOTOP()
     While !FT_FEOF()
          PmsIncProc(.T.)
          cLinha := FT_FREADLN()
          AADD(aTxt,{})
          nCampo := 1
          While At(";",cLinha)>0
               aAdd(aTxt[Len(aTxt)],Substr(cLinha,1,At(";",cLinha)-1))
               nCampo ++
               cLinha := StrTran(Substr(cLinha,At(";",cLinha)+1,Len(cLinha)-At(";",cLinha)),‘"‘,‘‘)
          Enddo
          If Len(AllTrim(cLinha)) > 0
               aAdd(aTxt[Len(aTxt)],StrTran(Substr(cLinha,1,Len(cLinha)),‘"‘,‘‘) )
          Else
               aAdd(aTxt[Len(aTxt)],"")
          Endif
          FT_FSKIP()
     Enddo
     FT_FUSE()

     
          DBSELECTAREA("SZB")
          DBSETORDER(3)
          DBGOTOP()
          cFilSZB := xFilial("SZB")

     For nX := 2 to Len(aTxt)
          cZBMat      := PADL(aTxt[nx][07],6,"0")
          cZBData := aTxt[nx][02]
          cZBPedi := aTxt[nx][01]
          cZBGSTT := aTxt[nx][34]
          cZBOBST := aTxt[nx][38]
          cZBVlPr     := aTxt[nx][29]
          cZBVLOt := aTxt[nx][35]
                    
          // *** Filtra os registros da Tabela *** //
          //SET FILTER TO (ZB_FILIAL+ZB_MAT+ZB_COMP) = (cFilSZB+cZBMat+cZBData)                                                                                                                       
          //DBGOTOP()

          IF DBSeek(xFilial("SZB")+ZB_MAT+ZB_COMP)     

          // *** Se o Registro não for encontrado, ele abre um novo Registro em Branco e Grava as Informações da Importação *** //
          While !EOF() .AND. xFilial("SZB") == SZB->ZB_FILIAL .AND. SZB->ZB_MAT == cZBMat .AND. SZB->ZB_COMP == cZBData
               Reclock("SZB", .F.)
               SZB->ZB_PED1      := cZBPedi
               SZB->ZB_VLPRC1    := cZBVlPr
               SZB->ZB_SALDO1    := cZBVLOt
               SZB->ZB_GSTT      := cZBGSTT
               SZB->ZB_OBST       := cZBOBST
               SZB->(MsUnlock())
          Enddo
          Set Filter To // *** Encerra o Filtro
          EndIF
     Next Nx
     
     ApMsgInfo("Importação concluída com sucesso!","Sucesso!")

Endif

Return



Respostas:

Postado Por: LABAMBAMOG
Data Postagem: quarta-feira, 18 de agosto de 2021 at 21:59

#Include "Protheus.ch"

User Function TIMPCSV()

Processa({||IMPSZB()},"Importando CSV. Aguarde...")

Return


Static Function IMPSZB()

Local nx := 0
Local nHandle := 0
Local aTxt := {}
Local aRet := {}
Local lExiste,cLinha,nAtual,nTotReg,cZBPedi,cZBData,cZBMat,cZBVlPr,cZBGSTT,cZBVLOt,cZBOBST

//Cuidado com o uso de funções não disponibilizadas pela nave-mãe...
//https://centraldeatendimento.totvs.com/hc/pt-br/articles/360026045651-MP-ADVPL-Fun%C3%A7%C3%A3o-parambox-gera-erro-em-ponto-de-entrada
//http://www.blacktdn.com.br/2012/05/para-quem-precisar-desenvolver-uma.html
//https://terminaldeinformacao.com/knowledgebase/parambox/

If ParamBox({ {6,"Arquivo",SPACE(50),"","FILE(mv_par01)","", 55 ,.T.,"Arquivo .CSV |*.CSV"} },;
     "Importa Retorno Ticket",@aRet,,)
     //{1,"Importar .CSV",SPACE(10),"","dbSeek(xFilial('AF8')+AllTrim(mv_par03))","AF8","", 45 ,.F.},;
     //{3,"Versao do Project",1 ,{"Portugues","Ingles"},70,,.F.},;
     
    If (nHandle := FT_FUse(AllTrim(aRet[1])))== -1
        Help(" ",1,"NOFILEIMPOR")
        Return
    EndIf
     
    // Posiciona na primeira linha
    FT_FGoTop()
    nAtual := 0
    nTotReg := FT_FLastRec()
    ProcRegua(nTotReg)

    While !FT_FEof()
        nAtual++
        IncProc("Lendo arq. linha "+cValToChar(nAtual)+" de "+cValToChar(nTotReg)+"...")

        cLinha := FT_FReadLn()
        AADD(aTxt,{})
          
        While At(";",cLinha) > 0
            aAdd(aTxt[Len(aTxt)],Substr(cLinha,1,At(";",cLinha)-1))
            cLinha := Substr(cLinha,At(";",cLinha)+1,Len(cLinha))
        Enddo
       
        aAdd(aTxt[Len(aTxt)],cLinha)

        FT_FSkip()
     Enddo

    // Fecha o arquivo
    FT_FUse()
     
    dbSSelectArea("SZB")
    dbSetOrder(3)
    nAtual := 0

    For nX := 2 to Len(aTxt)
        nAtual++
        IncProc("Atualizando registro "+cValToChar(nAtual)+" de "+cValToChar(nTotReg)+"...")

        cZBPedi := aTxt[nx][01]
        cZBData := aTxt[nx][02]
        cZBMat := PADL(aTxt[nx][07],6,"0")
        cZBVlPr := aTxt[nx][29]
        cZBGSTT := aTxt[nx][34]
        cZBVLOt := aTxt[nx][35]
        cZBOBST := aTxt[nx][38]
       
        //Cara, baseado na sua linha do while (que não é necessária) "SZB->ZB_COMP == cZBData",
        //imagino que a chave 3 do SZB seja por matrícula e DtoC(data)), apesar de achar estranho o nome do campo "ZB_COMP"
        //parece mais como "componente", mas como não tenho como adivinhar, se a análise estiver errada, faça as
        //correções aqui e na atribuição do campo "SZB->ZB_COMP := CtoD(cZBData)"
       
        lExiste := dbSeek(xFilial("SZB")+cZBMat+DtoC(CtoD(cZBData)))
        Reclock("SZB", !lExiste)
       
        SZB->ZB_FILIAL := xFilial("SZB")
        SZB->ZB_PED1 := cZBPedi
        SZB->ZB_COMP := CtoD(cZBData)   //Aqui imagino que no arq. csv o formato seja dd/mm/yy
        SZB->ZB_MAT := cZBMat
        SZB->ZB_VLPRC1 := cZBVlPr
        SZB->ZB_GSTT := cZBGSTT
        SZB->ZB_SALDO1 := cZBVLOt
        SZB->ZB_OBST := cZBOBST
        SZB->(MsUnlock())
       
     Next Nx
     
     ApMsgInfo("Importação concluída com sucesso!","Sucesso!")
Endif

Return

Boa sorte, t+




Postado Por: WALTERFCAR
Data Postagem: quinta-feira, 19 de agosto de 2021 at 10:03

bom dia no suturo considere usar o

FWFileReader()

Vai ficar mais simples seu código

https://tdn.totvs.com/display/framework/FWFileReader




Imprimir Página | Fechar Janela