Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

Índice

Índice
stylenone

1. Puntos de Entrada en fuente

...

User Function FINA887()
Local aParam    := PARAMIXB
Local oModel    := Nil
Local oModelFJT := Nil
Local oModelSEL := Nil
Local cIdPonto  := ""
Local cIdModel  := ""
Local nLineas   := 0
Local nX        := 0
Local lRet      := .T.
 
 
    If aParam <> NIL
        oModel      := aParam[1]
        oModelFJT   := oModel:GetModel("FJT_MASTER") //Datos del encabezado
        oModelSEL   := oModel:GetModel("SEL_DETAIL") //Datos correspondientes a los registros de la tabla SEL
        cIdPonto    := aParam[2]
        cIdModel    := aParam[3]
 
        If cIdPonto == 'MODELPOS'
            If Len(AllTrim(oModelFJT:GetValue("FJT_RECIBO"))) < 12
                Help(Nil,Nil,'Help',Nil,'Tamaño del número de recibo',1,0,Nil,Nil,Nil,Nil,Nil,{"Debe introducir un numero menor a 12"})                      
lRet:= .F.
            EndIf
            nLineas := oModelSEL:Length()
            For nX := 1 To nLineas
               If Empty(oModelSEL:GetValue("EL_NUMERO",nX)) .AND. lRet
                   lRet := .F.
                  Help(Nil,Nil,'Help',Nil,'Numero no informado',1,0,Nil,Nil,Nil,Nil,Nil,{"Debe introducir un numero"})
                EndIf
            Next nX
        ElseIf cIdPonto == 'MODELCOMMITTTS'
            //'Llamada después de la grabación total del modelo y dentro de la transacción (MODELCOMMITTTS).'
        ElseIf cIdPonto == 'MODELCOMMITNTTS'
            //'Llamada después de la grabación total del modelo y fuera de la transacción (MODELCOMMITNTTS).'
        ElseIf cIdPonto == 'FORMCOMMITTTSPOS'
            //'Llamada después de la grabación de la tabla del formulario (FORMCOMMITTTSPOS).
        EndIf
    EndIf
 
Return lRet


2.3 Ejemplo de "Carga Masiva" de formas de pago (SEL) utilizando PE BUTTONBAR:

FINA887.PRX

User Function FINA887()
Local aParam    := PARAMIXB
Local oModel    := Nil
Local cIdPonto  := ""
Local cIdModel  := ""
Local lRet      := .T.
 
 
    If aParam <> NIL
        oModel      := aParam[1]
        cIdPonto    := aParam[2]
        cIdModel    := aParam[3]
 
        If cIdPonto == 'BUTTONBAR'
            lRet := {{'Carga', 'CARGA', {|x| U_FN998CARGA(oModel)}, 'Carga Masiva' }}
        EndIf
    EndIf
 
Return lRet

FN998CARGA.PRW

#Include "protheus.ch"

//Importación de formas de pago a partir de archivo .CSV al modelo SEL_DETAIL (formas de pago de la tabla SEL)
//Ejemplo de registro en el archivo .CSV : NUMTITULO;BANCODESCRIPCION;;;20/09/2024;21/09/2024;01000

User Function FN998CARGA(oModel)

//Nota: En Totvs Recibo (FINA998), las variables aHeaders y aCols nao existen como private, por lo que la función gdFieldPos no se puede utilizar
//Se extrae la variable aHeader del modelo SEL_DETAIL controla los registros de la pantalla de formas de pagos de la tabla SEL
//Se construye la variable aCols y después se actualiza al modelo SEL_DETAIL para que aparezcan las formas de pago visualmente en pantalla

Local aArea := getArea()
Local oModelSEL := oModel:GetModel("SEL_DETAIL")
Local aHeader   := oModelSEL:aHeader
Local aCols     := {}
Local nC := 1
Local nH := 1
Local nPosNro     := aScan(aHeader,{|x| AllTrim(x[2])=="EL_NUMERO"    })

    //Inicializa la variable aCols con valores por defecto a partir del tamaño de aHeader
    addLine(aHeader, @aCols)

    If MsgYesNo("Deseja importar arquivo .csv ?", "Cheques")    
        fLoadCsv(@aCols, aHeader)
    EndIf

    //Actualización al modelo SEL_DETAIL en grid
    for nC:= 1 to Len(aCols)
        If !Empty(oModelSEL:GetValue("EL_NUMERO")) // Se agrega una línea nueva al modelo en caso de que el exista el campo EL_NUMERO ya informado en la línea actual
            oModelSEL:AddLine()
        EndIf

        If !Empty(aCols[nC][nPosNro]) // Se verifica que el campo EL_NUMERO no este vacío para identificar que el registro de aCols es válido
            for nH := 1 to Len(aHeader)
                oModelSEL:loadValue(aHeader[nH][2],aCols[nC][nH]) // Se carga la información de aCols en el modelo SEL_DETAIL de la vista en grid
            Next nH
            If !oModelSEL:VldData()
                Help( ,,"Error de Modelo",,oModel:GetModel():GetErrorMessage()[6], 1, 0) // Mensaje de error en caso de que la línea del modelo no sea válida
                Exit
            EndIf
        EndIf
    Next nC

restArea(aArea)

RETURN 

****************************************************
Static Function fLoadCsv(aCols, aHeader)

Local nLinha   := 0
Local aDados := {}
Local aColsV := ACLONE(aCols[1])
//Se obtiene la posición de cada campo de la tabla SEL para reemplazar el uso de gdFieldPos
Local nPosNro     := aScan(aHeader,{|x| AllTrim(x[2])=="EL_NUMERO"    })
Local nPosBco     := aScan(aHeader,{|x| AllTrim(x[2])=="EL_BCOCHQ"    })
Local nPosAge     := aScan(aHeader,{|x| AllTrim(x[2])=="EL_AGECHQ"    })
Local nPosPos     := aScan(aHeader,{|x| AllTrim(x[2])=="EL_POSTAL"    })
Local nPosTipo     := aScan(aHeader,{|x| AllTrim(x[2])=="EL_TIPO"      })
Local nPosPref    := aScan(aHeader,{|x| AllTrim(x[2])=="EL_PREFIXO"   })
Local nPosValor    := aScan(aHeader,{|x| AllTrim(x[2])=="EL_VALOR"     })
Local nPosEmiss    := aScan(aHeader,{|x| AllTrim(x[2])=="EL_EMISSAO"   })
Local nPosVnto    := aScan(aHeader,{|x| AllTrim(x[2])=="EL_DTVCTO"    })
Local nPosBanc    := aScan(aHeader,{|x| AllTrim(x[2])=="EL_BANCO"     })
Local nPosAgen    := aScan(aHeader,{|x| AllTrim(x[2])=="EL_AGENCIA"   })
Local nPosCont    := aScan(aHeader,{|x| AllTrim(x[2])=="EL_CONTA"     })
Local nPosObs    := aScan(aHeader,{|x| AllTrim(x[2])=="EL_OBSBCO"     })

//Se lee el archivo .csv
cFOpen := cGetFile("Arquivos |*.CSV",OemToAnsi("Selecione o arquivo para Importação: "))

If Len(cFOpen) > 0 .And. FILE(cFOpen)
    
    //Abre o arquivo selecionado
    nHandle := FT_FUse(cFOpen)
    
    If nHandle == -1
        MsgAlert("Erro de abertura do arquivo ")
        Return
    EndIf

    nNumReg := FT_FLastRec()
    FT_FGoTop()
    FT_FSkip()
    While !FT_FEof()
        
        nLinha++

        If nLinha+1 == nNumReg
            Exit
        Endif

        aDados := Separa(FT_FReadln(),';')

        cValor := StrTran(Substr(aDados[7],2),".","")
        cValor := StrTran(cValor,",",".")

        aBcoCh := fRetBcoCh(aDados[2])
        
        If nLinha > 1
            AADD(aCols,Aclone(aColsV))
        EndIf
        
        aCols[nLinha][nPosTipo] := "CHD"
        aCols[nLinha][nPosNro] := padr(aDados[1],TamSx3("EL_NUMERO")[1])
        aCols[nLinha][nPosValor] := Val(cValor)            
        aCols[nLinha][nPosEmiss] := ctod(aDados[5])    
        aCols[nLinha][nPosVnto] := ctod(aDados[6])    
        aCols[nLinha][nPosBanc] := Padr("001",TamSx3("EL_BANCO")[1])
        aCols[nLinha][nPosAgen] :=  Padr("00001",TamSx3("EL_AGENCIA")[1])
        aCols[nLinha][nPosCont] :=  Padr("0000000001",TamSx3("EL_CONTA")[1])
        
        aCols[nLinha][nPosBco] := Padr(aBcoCh[1],TamSx3("EL_BCOCHQ")[1])
        aCols[nLinha][nPosPref] := Padr(aBcoCh[1],TamSx3("EL_PREFIXO")[1])
        aCols[nLinha][nPosAge] := Padr(aBcoCh[2],TamSx3("EL_AGECHQ")[1])
        aCols[nLinha][nPosPos] := Padr(aBcoCh[3],TamSx3("EL_POSTAL")[1])

        aCols[nLinha][nPosObs] := aDados[2]
        
        FT_FSkip()
    EndDo
    FCLose(nHandle)
EndIf

Return

************************************
Static Function fRetBcoCh(pDescri)

Local cQuery := "", aRet := {"","",""}

cQuery := "SELECT FJN_COD, FJN_AGENCI, FJN_POSTAL, FJO_NOME "
cQuery += "FROM "+RetSqlName("FJN")+" (NOLOCK) FJN JOIN "+RetSqlName("FJO")+" (NOLOCK) FJO ON FJN_FILIAL=FJO_FILIAL AND FJN_COD=FJO_COD "
cQuery += "WHERE FJN.D_E_L_E_T_ = ' ' AND FJO.D_E_L_E_T_ = ' ' "
cQuery += "AND FJO_NOME LIKE '%"+Alltrim(pDescri)+"%' "

If Select("QRY") <> 0
    QRY->(dbCloseArea())
End

dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),"QRY",.T.,.T.)
QRY->(dbGoTop())

If !QRY->(Eof())
    aRet[1] := QRY->FJN_COD
    aRet[2] := QRY->FJN_AGENCI
    aRet[3] := QRY->FJN_POSTAL
else
    aRet[1] := "005"
    aRet[2] := "00001"
    aRet[3] := "1000"    
EndIf

QRY->(dbCloseArea())

Return(aRet)

/*/{Protheus.doc} addLine
    Agrega una nueva línea a aCols en base a los campos en aHeader
/*/
Static function addLine(aHeader, aCols)
    Local nX, nY

    Aadd(aCols,    Array(Len(aHeader)))
                
    nX    := Len(aCols)
    For nY := 1 to Len(aHeader)
        If !(aHeader[nY][2] $ "EL_BANCOS|EL_BCOCHQS") // EL_BANCOS y EL_BCOCHQS son campos virtuales de la forma de pago sin grid, estos se dejan como vacío
            aCols[nX][nY] := CriaVar(aHeader[nY][2])
        Else
            aCols[nX][nY] := ""
        EndIf
    Next nY
Return nX

Nota: 

El cIdPonto igual a BUTTONBAR adiciona un nuevo botón en la pantalla de carga de formas de pago y detona una función, para esto es necesario habilitar el parámetro MV_FPADVPL igual a .T. para utilizar la pantalla ADVPL de carga de formas de pago. Para más información véase el siguiente documento: https://tdn.totvs.com/x/kBNdMg

Image Added