Histórico da Página
...
- MODELPRE
- MODELPOS
- FORMPRE
- FORMPOS
- FORMLINEPRE
- FORMLINEPOS
- MODELCOMMITTTS
- MODELCOMMITNTTS
- FORMCOMMITTTSPRE
- FORMCOMMITTTSPOS
- MODELCANCEL
- BUTTONBAR
- 2.1 Usos de los Puntos de Entrada de MVC
- 2.2 Campos de validaciones para el punto de entrada
- 2.3 Ejemplo de "Carga Masiva" de formas de pago (SEL) utilizando PE BUTTONBAR:
2. Puntos de entrada en MVC (Estándares)
...
- EL_CEPCAD = Cadena CEP.
- EL_CEPCER = Certificado CEP.
- EL_CEPSEL = Sello CEP.
- EL_CEPTIP = Tipo CEP.
- EL_CTABEN = Cuenta beneficiario.
- EL_CTAORD = Cuenta ord.
- EL_RFCEMI = RFC Emisor.
- EL_TPCRED = Tipo de crédito.
Ejemplo:
Bloco de código | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
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
Bloco de código | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
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
...
Bloco de código | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
#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