Olá pessoal…
Na aula de hoje vou mostrar como fazer pontos de entrada em MVC.
Abaixo o código fonte do ponto de entrada MATA070:
//Bibliotecas
#Include "Protheus.ch"
/*---------------------------------------------------------------------------------------------------------------------------*
| P.E.: MATA070 |
| Autor: Daniel Atilio |
| Data: 23/10/2016 |
| Desc: Ponto de entrada MVC no cadastro de Bancos |
| Obs.: Ao criar um P.E. em MVC com o mesmo nome do ModelDef, deixe o nome do prw com outro nome, por exemplo, |
| MATAXXX_pe.prw |
| Ref.: http://tdn.totvs.com/display/public/mp/Pontos+de+Entrada+para+fontes+Advpl+desenvolvidos+utilizando+o+conceito+MVC |
*---------------------------------------------------------------------------------------------------------------------------*/
User Function MATA070()
Local aParam := PARAMIXB
Local xRet := .T.
Local oObj := Nil
Local cIdPonto := ''
Local cIdModel := ''
Local nOper := 0
Local cCampo := ''
Local cTipo := ''
//Se tiver parâmetros
If aParam <> NIL
ConOut("> "+aParam[2])
//Pega informações dos parâmetros
oObj := aParam[1]
cIdPonto := aParam[2]
cIdModel := aParam[3]
//Valida a abertura da tela
If cIdPonto == "MODELVLDACTIVE"
nOper := oObj:nOperation
//Se for Exclusão, não permite abrir a tela
If nOper == 5
xRet := .F.
EndIf
//Pré configurações do Modelo de Dados
ElseIf cIdPonto == "MODELPRE"
xRet := .T.
//Pré configurações do Formulário de Dados
ElseIf cIdPonto == "FORMPRE"
nOper := oObj:GetModel(cIdPonto):nOperation
cTipo := aParam[4]
cCampo := aParam[5]
//Se for Alteração
If nOper == 4
//Não permite alteração dos campos chave
If cTipo == "CANSETVALUE" .And. Alltrim(cCampo) $ ("A6_COD.A6_AGENCIA.A6_NUMCON")
xRet := .F.
EndIf
EndIf
//Adição de opções no Ações Relacionadas dentro da tela
ElseIf cIdPonto == 'BUTTONBAR'
xRet := {}
aAdd(xRet, {"* Titulo 1", "", {|| Alert("Botão 1")}, "Tooltip 1"})
aAdd(xRet, {"* Titulo 2", "", {|| Alert("Botão 2")}, "Tooltip 2"})
aAdd(xRet, {"* Titulo 3", "", {|| Alert("Botão 3")}, "Tooltip 3"})
//Pós configurações do Formulário
ElseIf cIdPonto == 'FORMPOS'
xRet := .T.
//Validação ao clicar no Botão Confirmar
ElseIf cIdPonto == 'MODELPOS'
//Se o campo de contato estiver em branco, não permite prosseguir
If Empty(M->A6_CONTATO)
Aviso('Atenção', 'Por favor, informe um Contato!', {'OK'}, 03)
xRet := .F.
EndIf
//Pré validações do Commit
ElseIf cIdPonto == 'FORMCOMMITTTSPRE'
//Pós validações do Commit
ElseIf cIdPonto == 'FORMCOMMITTTSPOS'
//Commit das operações (antes da gravação)
ElseIf cIdPonto == 'MODELCOMMITTTS'
//Commit das operações (após a gravação)
ElseIf cIdPonto == 'MODELCOMMITNTTS'
nOper := oObj:nOperation
//Se for inclusão, mostra mensagem de sucesso
If nOper == 3
Aviso('Atenção', 'Banco criado com sucesso!', {'OK'}, 03)
EndIf
EndIf
EndIf
Return xRet
Abaixo o código fonte do ponto de entrada OS010BTN:
//Bibliotecas
#Include "Protheus.ch"
/*--------------------------------------------------------------------------*
| P.E.: OS010BTN |
| Autor: Daniel Atilio |
| Data: 27/08/2016 |
| Descr.: Função que adiciona Ações Relacionadas dentro da Tabela de Preço |
*--------------------------------------------------------------------------*/
User Function OS010BTN()
Local aArea := GetArea()
Local aButtons := {}
//Adicionando o botão no Ações Relacionadas
aAdd(aButtons,{ "* Atualiza Produtos", {|| u_zAtuGrid()}, "* Atualiza Produtos" })
RestArea(aArea)
Return aButtons
/*/{Protheus.doc} zAtuGrid
Função para atualizar a DA1 - MVC
@type function
@author Atilio
@since 27/08/2016
@version 1.0
/*/
User Function zAtuGrid()
Local aArea := GetArea()
Local nJanAltu := 100
Local nJanLarg := 700
Local oFontPad := TFont():New("Arial", , -14)
Private lNovo := .F.
Private oDlgAtu
Private cMaskDA1 := PesqPict('DA1', 'DA1_PRCVEN')
//Carregando os modelos de dados do cabeçalho e grid
Private oModelPad := FWModelActive()
Private oModelGrid := oModelPad:GetModel('DA1DETAIL')
Private nOperacao := oModelPad:nOperation
//Pegando posições do aHeader
Private nPosProd := aScan(oModelGrid:aHeader, {|x| AllTrim(x[2]) == AllTrim("DA1_CODPRO")})
Private nPosDesc := aScan(oModelGrid:aHeader, {|x| AllTrim(x[2]) == AllTrim("DA1_DESCRI")})
Private nPosPrcV := aScan(oModelGrid:aHeader, {|x| AllTrim(x[2]) == AllTrim("DA1_PRCVEN")})
//Linha Atual
Private nLinAtu := oModelGrid:nLine
//Linha encontrada
Private nLinEnc := 0
//Gets
Private oGetCod, cGetCod := Space(TamSX3('B1_COD')[01])
Private oGetDes, cGetDes := Space(TamSX3('B1_DESC')[01])
Private oGetPrc, nGetPrc := 0
Private oGetMsg, cGetMsg := ""
//Montando a janela
DEFINE MSDIALOG oDlgAtu TITLE "Atualização Preço" FROM 000, 000 TO nJanAltu, nJanLarg COLORS 0, 16777215 PIXEL
//Produto
nColAux := 3
@ 007, nColAux SAY oSayCod PROMPT "Produto: " SIZE 050, 007 OF oDlgAtu COLORS 0, 16777215 PIXEL
@ 004, nColAux+40 MSGET oGetCod VAR cGetCod SIZE 060, 010 OF oDlgAtu COLORS 0, 16777215 F3 'SB1' VALID (fPesqSB1()) PIXEL
//Descrição
nColAux += 103
@ 007, nColAux SAY oSayDes PROMPT "Descrição: " SIZE 050, 007 OF oDlgAtu COLORS 0, 16777215 PIXEL
@ 004, nColAux+40 MSGET oGetDes VAR cGetDes SIZE 100, 010 OF oDlgAtu COLORS 0, 16777215 PIXEL
oGetDes:lActive := .F.
//Preço Venda
nColAux += 143
@ 007, nColAux SAY oSayPrc PROMPT "Preço Venda: " SIZE 050, 007 OF oDlgAtu COLORS 0, 16777215 PIXEL
@ 004, nColAux+40 MSGET oGetPrc VAR nGetPrc SIZE 060, 010 OF oDlgAtu COLORS 0, 16777215 PICTURE cMaskDA1 PIXEL
//Get de Log
@ 023, 003 MSGET oGetMsg VAR cGetMsg SIZE (nJanLarg/2)-12, 012 OF oDlgAtu COLORS 0, 16777215 NO BORDER FONT oFontPad PIXEL
oGetMsg:lActive := .F.
oGetMsg:setCSS("QLineEdit{color:#FF0000; background-color:#FEFEFE;}")
//Botão confirmar
If nOperacao == 3 .Or. nOperacao == 4
@ (nJanAltu/2)-24, (nJanLarg/2)-53 BUTTON oBtnCon PROMPT "Confirmar" SIZE 048, 018 OF oDlgAtu ACTION(fConfirmar() ) PIXEL
EndIf
ACTIVATE MSDIALOG oDlgAtu CENTERED
//Volta pra primeira linha
oModelGrid:nLine := 1
RestArea(aArea)
Return
/*---------------------------------------------------------------------*
| Func: fPesqSB1 |
| Autor: Daniel Atilio |
| Data: 27/08/2016 |
| Desc: Função que valida o código do produto digitado |
*---------------------------------------------------------------------*/
Static Function fPesqSB1()
Local lRet := .T.
DbSelectArea('SB1')
SB1->(DbSetOrder(1)) //B1_FILIAL + B1_COD
//Se conseguir posicionar no produto
If SB1->(DbSeek(FWxFilial('SB1') + cGetCod))
cGetDes := SB1->B1_DESC
lRet := .T.
//Busca a linha
nLinEnc := aScan(oModelGrid:aCols, {|x| AllTrim(x[nPosProd]) == AllTrim(cGetCod)})
//Caso não encontre
If nLinEnc == 0
cGetMsg := "Item Novo"
nGetPrc := 0
lNovo := .T.
Else
cGetMsg := "Item Existente"
nGetPrc := oModelGrid:aCols[nLinEnc][nPosPrcV]
lNovo := .F.
EndIf
Else
lRet := .F.
MsgAlert("Produto não encontrado!", "Atenção")
EndIf
Return lRet
/*---------------------------------------------------------------------*
| Func: fConfirmar |
| Autor: Daniel Atilio |
| Data: 27/08/2016 |
| Desc: Função chamada pelo botão confirmar |
*---------------------------------------------------------------------*/
Static Function fConfirmar()
Local nLin
//Se for novo, adiciona uma nova linha
If lNovo
oModelGrid:AddLine()
nLin := Len(oModelGrid:aCols)
//Senão pega a linha encontrada
Else
nLin := nLinEnc
EndIf
//Define a linha que será utilizada
oModelGrid:nLine := nLin
oModelPad:SetValue('DA1DETAIL', 'DA1_CODPRO', cGetCod)
oModelPad:SetValue('DA1DETAIL', 'DA1_DESCRI', cGetDes)
oModelPad:SetValue('DA1DETAIL', 'DA1_PRCVEN', nGetPrc)
//Atualiza os textos
cGetCod := Space(TamSX3('B1_COD')[01])
cGetDes := Space(TamSX3('B1_DESC')[01])
nGetPrc := 0
cGetMsg := ""
oGetCod:Refresh()
oGetDes:Refresh()
oGetPrc:Refresh()
oGetMsg:Refresh()
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.