1. Puntos de Entrada en fuente
2. Puntos de entrada en MVC (Estándares)
ID DEL PUNTO DE ENTRADA | MOMENTO DE EJECUCIÓN DEL PUNTO DE ENTRADA |
MODELPRE | Antes de la alteración de cualquier campo del modelo. 1 O Objeto del formulario ó del modelo, conforme el caso. Retorno: |
MODELPOS | En la validación total del modelo 1 O Objeto del formulario o del modelo, conforme el caso. Retorno: |
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. Retorno: |
FORMPOS | En la validación total del formulario. Parámetros recibidos: 1 O Objeto del formulario o del modelo, conforme el caso. Retorno: |
FORMLINEPRE | Antes de la alteración de la línea del formulario FWFORMGRID. 1 O Objeto del formulario o del modelo, conforme al caso. Retorno: |
FORMLINEPOS | En la validación total de la línea del formulario FWFORMGRID. 1 O Objeto do formulário ou do modelo, conforme o caso Retorno: |
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. 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. 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. 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. Retorno: |
MODELCANCEL | El botón de cancelar. Parámetros recibidos: 1 O Objeto del formulario o del modelo, conforme el caso. 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. Parâmetros Recebidos: 1 O Objeto del formulario o del modelo, conforme el caso. Retorno: |
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:
|
Punto de entrada MVC | Descripcíon | |||||||||||||||||||||||||||||
FORMPRE | Punto de entrada con la finalidad de habilitar o deshabilitar el campo Cobrador (FJT_COBRAD) de la tabla Encabezado de Recibo (FJT) y no permitir su edición.
| |||||||||||||||||||||||||||||
FORMLINEPOS | Punto de entrada para VALIDAR los datos de retenciones en la rutina de cobros diversos.
| |||||||||||||||||||||||||||||
MODELCOMMITNTTS | Punto de entrada para MÓDIFICAR los datos de retenciones en la rutina de cobros diversos.
|
Generales:
México:
Perú:
Sentencia When
General:
Argentina/Colombia
Chile/Perú
México
Ejemplo:
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 |
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
