Á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

...

ID DEL PUNTO DE ENTRADA

MOMENTO DE EJECUCIÓN DEL PUNTO DE ENTRADA

MODELPRE

Antes de la alteración de cualquier campo del modelo.
Parámetros recibidos:

1     O        Objeto del formulario ó del modelo, conforme el caso.
2     C        ID del local de ejecución del punto de entrada.
3     C        ID del formulario.

Retorno:
Requiere un retorno lógico.
 

MODELPOS

En la validación total del modelo
Parámetros recibidos:

1     O        Objeto del formulario o del modelo, conforme el caso.
2     C        ID del local de ejecución del punto de entrada.
3     C        ID del formulario.

Retorno:
Requiere un retorno lógico.

FORMPRE

Antes de la alteración de cualquier campo del formulario.

Parámetros recibidos:

1     O        Objeto del formulario o del modelo, conforme el caso.
2     C        ID del local de ejecución del punto de entrada.
3     C        ID del formulario.
4     C        Acción del FWFORMGRID.
5     C        ID del Campo.


Retorno:
Requiere un retorno lógico.

FORMPOS

En la validación total del formulario.

Parámetros recibidos:

1     O        Objeto del formulario o del modelo, conforme el caso.
2     C        ID del local de ejecución del punto de entrada.
3     C        ID del formulario.

Retorno:
Requiere un retorno lógico.

FORMLINEPRE

Antes de la alteración de la línea del formulario FWFORMGRID.
Parámetros recibidos:

1     O        Objeto del formulario o del modelo, conforme al caso.
2     C        ID del local de ejecución del punto de entrada.
3     C        ID del formulario.
4     N        Numero de linea del FWFORMGRID
5     C        Acción del FWFORMGRID
6     C        Id del campo

Retorno:
Requiere un retorno lógico.

FORMLINEPOS

En la validación total de la línea del formulario  FWFORMGRID.
Parámetros recibidos:

1     O        Objeto do formulário ou do modelo, conforme o caso
2     C        ID do local de execução do ponto de entrada
3     C        ID do formulário
4     N        Número da Linha da FWFORMGRID

Retorno:
Requiere un retorno lógico.

MODELCOMMITTTS

Despúes de la grabación total del modelo y dentro de la transacción.

Parámetros Recibidos:

1     O        Objeto del formulario  del modelo, conforme el caso.
2     C        ID del local de ejecución del punto de entrada.
3     C        ID del formulario.

Retorno:
No espera retorno.

MODELCOMMITNTTS

Después de la grabación total del modelo y fuera de la transacción.

Parámetros recibidos:

1     O        Objeto del formulario o del modelo, conforme el caso.
2     C        ID del local de ejecución del punto de entrada.
3     C        ID del formulario.

Retorno:
No espera retorno

FORMCOMMITTTSPRE

Antes da gravação da tabela do formulário.

Parâmetros Recebidos:

1     O        Objeto del formulario o del modelo, conforme el caso.
2     C        ID del local de ejecución del punto de entrada.
3     C        ID del formulario.
4     L        Si es .T. indica nuevo registro (inclusión) si es .F. registro ya existente (Alteración/ Exclusión)

Retorno:
No espera retorno.

FORMCOMMITTTSPOS

Después de la grabación de la tabla del formulario.

Parâmetros Recebidos:

1     O        Objeto del formulario o del modelo, conforme el caso.
2     C        ID del local de ejecución del punto de entrada.
3     C        ID del formulario.
4     L        Si es .T. indica nuevo registro (inclusión) si es .F. registro ya existente (Alteración/ Exclusión)

Retorno:
No espera retorno.

MODELCANCEL

El botón de cancelar.

Parámetros recibidos:

1     O        Objeto del formulario o del modelo, conforme el caso.
2     C        ID del local de ejecución del punto de entrada.
3     C        ID del formulario.

Retorno:
No espera retorno.

BUTTONBAR

Incluir botones en el  ControlBar.

Para crear los botones se debe retornar un array bidimensional con la siguiente estructura de cada ítem:

1     C        Titulo para el botón.
2     C        Nombre del Bitmap para mostrar.
3     B        CodeBlock a ser ejecutado.
4     C        ToolTip (Opcional)

Parâmetros Recebidos:

1     O        Objeto del formulario o del modelo, conforme el caso.
2     C        ID del local de ejecución del punto de entrada.
3     C        ID del formulario.

Retorno:
Array con la estructura pre-definida.

2.1 Usos de los Puntos de Entrada

...

de  MVC 


Aviso
titleImportante

Al utilizar uno de los siguientes Puntos de Entrada MVC, y al tener configurado un mensaje personalizado de error (HELP), este mensaje del Punto de Entrada será priorizado sobre el mensaje de error o información (HELP) descrito desde el módulo configurador (SIGACFG). En caso de no contar con ninguno de los dos mensajes (HELP), se mostrará vacío el detalle del mensaje. Este comportamiento también se aplica al título del mensaje configurado en el HELP.


Ejemplos:

...

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