Árvore de páginas

Versões comparadas

Chave

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

...

Produto:

Solucoes_totvs_cross
SolucaoCrossTOTVS Backoffice

Linha de Produto:

Linhas_totvs
LinhaLinha Protheus

Segmento:

Segmentos_totvs
SegmentoBackoffice

Módulo:SIGACRM - Customer Relationship Management
Função:FATN600  Funções Auxiliares da Proposta ComercialCRMA980 - Cadastro de Clientes (MVC)
Abrangências:Microsiga Protheus 12
Versões:Microsiga Protheus 12
Compatível Países:Todos
Sistemas Operacionais:Todos
Compatível com as Bases de Dados:Todos
Nível de Acesso:Nível 1 (Acesso Clientes)
Idiomas:Todos

02. DESCRIÇÃO

Ponto Pontos de Entrada executado padrões MVC executados pela rotina do Cadastro de Clientes (MVC).

...

Consulte o exemplo abaixo.

04. PARÂMETROS

Não há.MV_MVCSA1

05. RETORNO

RetornoTipoDescriçãoObrigatório
xRetVáriosO retorno do Ponto de Entrada CRMA980 irá depender de qual ID estará sendo executado no momento.Não

...

Totvs custom tabs box
tabsExemplo 01
idsExemplo01
Totvs custom tabs box items
defaultyes
referenciaExemplo01

Este é o exemplo básico para a montagem do seu ponto de entrada:.

Da forma como este exemplo básico foi construído, você poderá baixá-lo e compilá-lo em seu ambiente. Com isso, você conseguirá interagir com a execução de cada um dos Pontos de Entrada padrões MVC do Cadastro de Clientes. Inclusive, o exemplo abaixo lhe proporcionará a geração de um LOG referente à execução de cada um destes Pontos de Entrada padrões MVC do Cadastro de Clientes.


Bloco de código
linenumberstrue
#include "Protheus.ch"
#include "FWMVCDEF.CH"  

Static __LogTela
Bloco de código
linenumberstrue
#include "Protheus.ch"
#include "FWMVCDEF.CH"  

Static __LogExec    := NIL

//-------------------------------------------------------------------
/*/{Protheus.doc} CRMA980
Ponto de Entrada do Cadastro de Clientes (MVC)
@param      Não há
@return     Vários. Dependerá de qual PE está sendo executado.
@author 	Faturamento
@version	12.1.17 / Superior
@since		Mai/2021
/*/
//-------------------------------------------------------------------
User Function CRMA980() ///cXXX1,cXXX2,cXXX3,cXXX4,cXXX5,cXXX6

Local aParam        := PARAMIXB
Local xRet          := .T.
Local lIsGrid       := .F.
Local nLinha        := 0
Local nQtdLinhas    := 0
Local cRotMVC       := "CRMA980"
Local cIDPonto      := ''
Local cIDModel      := ''
Local cIDForm       := ''
Local cEvento       := ''
Local cCampoNIL

//-------------------------------------------------------------------
/*/{Protheus.doc} CRMA980
Ponto de Entrada do Cadastro de Clientes (MVC)
@param         := ''
Local cConteudoNão há
@return      := ''
Local cMsg          := ''
Local cClasse       := ''
Local oObj          := NIL

If __LogExec == NIL
    __LogExec   := ApMsgYesNo("A geração do 'LOG de processamento' dos PE 'CRMA989' (MVC) será exibido em TELA ?" + CRLF + CRLF +;
 Vários. Dependerá de qual PE está sendo executado.
@author 	Faturamento
@version	12.1.17 / Superior
@since		Mai/2021
/*/
//-------------------------------------------------------------------
User Function CRMA980() ///cXXX1,cXXX2,cXXX3,cXXX4,cXXX5,cXXX6

Local aParam        := PARAMIXB
Local xRet          := .T.
Local lIsGrid       := .F.
Local nLinha        := 0
Local nQtdLinhas    := 0
Local cRotMVC      'SIM := TELA' + CRLF +;
"CRMA980"
Local cIDPonto      := ''
Local cIDModel      := ''
Local cIDForm       := ''
Local cEvento       := 'NÃO = CONSOLE do AppServer')
EndIf

If aParam <> NIL


Local cCampo       oObj := ''
Local cConteudo     := aParam[1]
 ''
Local cMsg   cIDPonto       := aParam[2]
''
Local oObj      cIDModel    := aParam[3]
    lIsGrid  NIL

If __LogTela == NIL
    __LogTela   := (Len(aParam) > 3)

    If cIDPonto == 'FORMPRE'

        cEvento     := aParam[4]
ApMsgYesNo("A geração do 'LOG de processamento' dos PE 'CRMA989' (MVC) será exibido em TELA ?" + CRLF + CRLF +;
             cCampo      := aParam[5]
        cConteudo  'SIM := If( ValType(aParam[6]) == 'C',;
TELA' + CRLF +;
                             "'" + aParam[6] + "'",; 'NÃO = CONSOLE do AppServer')
EndIf

If aParam <> NIL

    oObj        := aParam[1]
    cIDPonto    := aParam[2]
    cIDModel    If(:= ValType(aParam[63])
 == 'N',;
  lIsGrid     := (Len(aParam) > 3)

    If cIDPonto == 'FORMPRE'

        cEvento     := AllTrim(Str(aParam[64])),;
        cCampo         := aParam[5]
        cConteudo     := If( ValType(aParam[6]) == 'DC',;
                                   DtoC("'" + aParam[6]) + "'",;
                                   If( ValType(aParam[46]) == 'LN',;
                               AllTrim(Str(aParam[6])),;
          If(aParam[4], '.T.', '.F.'),;
                     If( ValType(aParam[6])   == 'D',;
                     ''))))
        cIDForm     := oObj:GetID()
DtoC(aParam[6]),;
    ElseIf cIDPonto == 'FORMPOS'

        cIDForm     := oObj:GetID()

    ElseIf cIDPonto == 'FORMCOMMITTTSPRE' .OR. cIDPonto == 'FORMCOMMITTTSPOS'

        cConteudo   := If( ValType(aParam[4]) == 'L',;
,;
                                      If( aParam[4], '.T.', '.F.'),;
                                      '')))

)
        cIDForm  EndIf

   := ShwParamoObj:GetID(aParam)

    IfElseIf cIDPonto == 'MODELVLDACTIVEFORMPOS'

        ApMsgInfo("ValidacIDForm se o Modelo do Cadastro de Clientes pode ou não ser exibido ao usuário (PE '" + cIDPonto + "')." + CRLF +;
        := oObj:GetID()

    ElseIf cIDPonto == 'FORMCOMMITTTSPRE' .OR. cIDPonto == 'FORMCOMMITTTSPOS'

        cConteudo  "ID '" + cIDModel + "'")

:= If( ValType(aParam[4]) == 'L',;
           If (xRet    := ApMsgYesNo("Valida se a opção escolhida pelo usuário poderá abrir o Modelo da rotina." + CRLF +If( aParam[4], '.T.', '.F.'),;
                           '')

    EndIf

   "Continua ?")) ShwParam(aParam)

    If cIDPonto == 'MODELVLDACTIVE'

        ApMsgInfo("O PE '" + cIDPonto + "' doValida se o Modelo do Cadastro de Clientes pode ou não ser exibido ao usuário (PE '" + cRotMVCcIDPonto + "' retornará .T).")

 + CRLF +;
         // Como a tela do Modelo será exibida ao usuário, então, por exemplo, pode-se customizar a sua exibição..."ID '" + cIDModel + "'")

        If (xRet    If:= ApMsgYesNo("DesejaValida se customizara oopção Modeloescolhida ?pelo -usuário IDpoderá '"abrir +o cIDModelModelo +da "'rotina.")
 + CRLF +;
             ModifModel(oObj, cIDPonto, cIDModel)
            EndIf

        Else
  "Continua ?"))
         Help( ,, 'Help',, ApMsgInfo("O PE '" + cIDPonto + "' do '" + cRotMVC + "' retornará .FT.", 1, 0 )
        EndIf

    ElseIf cIDPonto == 'MODELPRE'

     // Como ApMsgInfo("Antes da alteração de qualquer campo do Modelo. (PE '" + cIDPonto + "')." + CRLF +;
a tela do Modelo será exibida ao usuário, então, por exemplo, pode-se customizar a sua exibição...
            If ApMsgYesNo("Deseja customizar o Modelo ? - "ID '" + cIDModel + "'")

    ElseIf cIDPonto == 'FORMPRE'

        ApMsgInfo("Antes da alteração de qualquer campo do Formulário. (PE '" + cIDPonto + "' / Evento '" + cEvento + "' no campo '" + cCampo + "')." + CRLF +;
    ModifModel(oObj, cIDPonto, cIDModel)
            EndIf

        Else
            Help( ,, 'Help',, "IDO PE '" + cIDModelcIDPonto + "' - FormIDdo '" + cIDFormcRotMVC + "'")

    retornará .F.", 1, 0 )
     cMsg   EndIf

 := "Execução do ('"ElseIf + cIDPonto +== "' / Evento '" + cEvento + "' no campo '" + cCampo + "'" + If(cEvento == "SETVALUE", " Conteúdo = " + cConteudo, "") + "MODELPRE'

       ApMsgInfo("Antes da alteração de qualquer campo do Modelo. (PE '" + cIDPonto + "')." + CRLF +;
          If  (xRet    := ApMsgYesNo(cMsg +"ID CRLF'" + cIDModel permitido+ ?"'"))

    ElseIf cIDPonto == 'FORMPRE'

        ApMsgInfo("O Antes da alteração de qualquer campo do Formulário. (PE '" + cIDPonto + "' / Evento '" + cEvento + "' no docampo '" + cRotMVCcCampo + "')." + retornará .T.")CRLF +;
        Else
          "ID '" + cIDModel  Help( ,, 'Help',, "O PE + "' - FormID '" + cIDForm + "'")

        cMsg    := "Execução do ('" + cIDPonto + "' / Evento '" + cEvento + "' no docampo '" + cRotMVCcCampo + "' retornará .F." + If(cEvento == "SETVALUE", 1," 0Conteúdo )
= " + cConteudo, "") + ")." + EndIf
CRLF
    ElseIf cIDPonto == 'BUTTONBAR'

 If (xRet    :=  ApMsgInfoApMsgYesNo("AdicionandocMsg um+ botãoCRLF na+ barra de botões da rotina (PE '" + cIDPonto + "')." + CRLF +;
permitido ?'))
            ApMsgInfo("O PE '" + cIDPonto + "' / Evento '" + cEvento + "ID' do '" + cIDModelcRotMVC + "' retornará .T.")

        xRetElse
    := {{'Rotina Especifica',;      Help( ,, 'Help',, "O PE '" + cIDPonto + "' / Evento '" + cEvento + "' do '" + cRotMVC + "'  //Titulo para o botãoretornará .F.", 1, 0 )
        EndIf

    ElseIf cIDPonto == 'BUTTONBAR'

      'SALVAR',;  ApMsgInfo("Adicionando um botão na barra de botões da rotina (PE '" + cIDPonto + "')." + CRLF +;
                  "ID '" + cIDModel //Nome do Bitmap para exibição
+ "'")

        xRet    := {{'Rotina Especifica',;          {|| Alert('Executou uma rotina específica!')},;      //CodeBlock a ser executado
        //Titulo para o botão
          'Este botão executa uma rotina específica.'}}      //ToolTip (Opcional)

'SALVAR',;     ElseIf cIDPonto == 'FORMPOS'

        cMsg := "Chamada na validação final do formulário (PE '" + cIDPonto + "')." + CRLF +;
         //Nome do Bitmap para exibição
   "ID '" + cIDModel + "' - FormID '" + cIDForm + "'" + CRLF

    {|| Alert('Executou uma  SetField(oObj, cIDPonto, cIDModel, cIDForm)

    rotina específica!')},;    //CodeBlock a ser executado
    If cClasse == 'FWFORMGRID'
            cMsg += 'ÉEste botão umexecuta FORMGRIDuma comrotina específica.'}}   + Alltrim(Str(nQtdLinhas)) + '//ToolTip linha(sOpcional).'

 + CRLF +;
 ElseIf cIDPonto == 'FORMPOS'

        cMsg := "Chamada na validação final do formulário (PE 'Posicionado" na+ linhacIDPonto ' + Alltrim(Str(nLinha))"')." + CRLF +;
        ElseIf cClasse == 'FWFORMFIELD'
     "ID '" + cIDModel + "' - cMsgFormID '" += cIDForm um+ FORMFIELD"'" + CRLF

        EndIf SetField(oObj, cIDPonto, cIDModel, cIDForm)

        If (xRet    := ApMsgYesNo(cMsg + CRLF + 'Continua ?'))
            ApMsgInfo("O PE '" + cIDPonto + "' do PE '" + cRotMVC + "' retornará .T.")
        Else
            Help( ,, 'Help',, "O PE '" + cIDPonto + "' do '" + cRotMVC + "' retornará .F.", 1, 0 )
        EndIf
 
    ElseIf  cIDPonto == 'MODELPOS'

        cMsg := "Chamada na validação total do modelo (PE '" + cIDPonto + "')." + CRLF +;
                "ID '" + cIDModel + "'" + CRLF

        If (xRet    := ApMsgYesNo(cMsg + CRLF + 'Continua ?'))
            ApMsgInfo("O PE '" + cIDPonto + "' do '" + cRotMVC + "' retornará .T.")
        Else
            Help( ,, 'Help',, "O PE '" + cIDPonto + "' do '" + cRotMVC + "' retornará .F.", 1, 0 )
        EndIf

    ElseIf cIDPonto == 'FORMCOMMITTTSPRE'

        ApMsgInfo("Chamada antes da gravação da tabela do formulário (PE '" + cIDPonto + "')." + CRLF +;
                  "ID " + cIDModel)
        xRet    := MyFTTSPre(oObj, cIDPonto, cIDModel, cConteudo)

    ElseIf cIDPonto == 'FORMCOMMITTTSPOS'

        ApMsgInfo("Chamada após a gravação da tabela do formulário (PE '" + cIDPonto + "')." + CRLF +;
                  "ID " + cIDModel)
        xRet    := MyFTTSPos(oObj, cIDPonto, cIDModel, cConteudo)

    ElseIf cIDPonto == 'MODELCOMMITTTS'

        ApMsgInfo("Chamada após a gravação total do modelo e dentro da transação (PE '" + cIDPonto + "')." + CRLF +;
                  "ID " + cIDModel)
        xRet    := MyMTTS(oObj, cIDPonto, cIDModel, cConteudo)

    ElseIf cIDPonto == 'MODELCOMMITNTTS'

        ApMsgInfo("Chamada após a gravação total do modelo e fora da transação (PE '" + cIDPonto + "')." + CRLF +;
                  "ID " + cIDModel)
        xRet        := MyMNTTS(oObj, cIDPonto, cIDModel, cConteudo)
        __LogExecLogTela   := NIL

    ElseIf cIDPonto == 'MODELCANCEL'

        If (xRet := ApMsgYesNo("O botão 'FECHAR' foi acionado no modelo do Cadastro de Clientes (PE '" + cIDPonto + "')." + CRLF +;
                              'Deseja realmente sair ?'))
            ApMsgInfo("O PE '" + cIDPonto + "' do '" + cRotMVC + "' retornará .T.")
            __LogExecLogTela   := NIL
        Else
            ApMsgInfo("O PE '" + cIDPonto + "' do '" + cRotMVC + "' retornará .F.")
        EndIf

    EndIf

EndIf

Return xRet


//-------------------------------------------------------------------
/*/{Protheus.doc} ShwParam
Exibe os parâmetros do Ponto de Entrada do Cadastro de Clientes (MVC)
@param      aParam
@return     NIL
@author 	Faturamento
@version	12.1.17 / Superior
@since		Mai/2021
/*/
//-------------------------------------------------------------------
Static Function ShwParam(aParam)

Local nInd          := 1
Local cAuxMsg       := ''
Local cAuxMsg2      := ''
Local cSeparador    := Repl('-', 40)
Local cMsg          := Iif( !(aParam[2] $ 'FORMPRE//FORMPOS//FORMCOMMITTTSPRE//FORMCOMMITTTSPOS'),;
                            'OPERATION = ' + AllTrim(Str(aParam[01]:NOPERATION)) + CRLF,;
                            '')

For nInd := 1 to Len(aParam)

    cAuxMsg     := ''
    cAuxMsg2    := ''

    If ValType(aParam[nInd]) == 'U'
        cAuxMsg2         := '= ' + ' NIL'
    ElseIf ValType(aParam[nInd]) == 'O'
        cAuxMsg2         := ' (OBJETO)'
    ElseIf ValType(aParam[nInd]) == 'C'
        cAuxMsg2         := "= '" + aParam[nInd] + "'"
    ElseIf ValType(aParam[nInd]) == "N"
        cAuxMsg2         := '= ' + AllTrim(Str(aParam[nInd]))
    ElseIf ValType(aParam[nInd]) == "D"
        cAuxMsg2         := '= ' + DtoC(aParam[nInd])
    ElseIf ValType(aParam[nInd]) == 'L'
        cAuxMsg2         := '= ' + If(aParam[4], '.T.', '.F.')
    EndIf

    If nInd == 2
        cAuxMsg        := 'IDPonto (Evento)'
    ElseIf nInd == 3
        cAuxMsg        := 'IDModelo'
    ElseIf (nInd == 4 .OR. nInd == 5 .OR. nInd == 6)
        If aParam[2] == 'FORMPRE'
            If nInd == 4
                cAuxMsg    := 'Evento'
            ElseIf nInd == 5
                cAuxMsg    := 'Campo'
            ElseIf nInd == 6 .AND. aParam[4] == 'SETVALUE'
                cAuxMsg    := 'Conteúdo'
            EndIf
        ElseIf (aParam[2] $ 'FORMCOMMITTTSPRE//FORMCOMMITTTSPOS') .AND. nInd == 6
            cAuxMsg        := 'Conteúdo'
        EndIf
    EndIf

    cMsg    += 'PARAMIXB[' + StrZero(nInd,2) + '] => ' + If(!Empty(cAuxMsg),cAuxMsg + ' ', '') + cAuxMsg2 + CRLF

Next nInd

If __LogExecLogTela
    ApMsgInfo("Segue a descrição dos parâmetros recebidos no PE CRMA980 MVC conforme o 'IDPonto' que está sendo executado no momento:" +;
              CRLF + CRLF +;
              cMsg)
Else
    ConOut(cMsg + cSeparador)
EndIf
Return NIL


//-------------------------------------------------------------------
/*/{Protheus.doc} ModifModel
Customizações nas propriedades dos campos do Modelo do Cadastro de Clientes (MVC)
@param      oObj, cIDPonto, cIDModel
@return     NIL
@author 	Faturamento
@version	12.1.17 / Superior
@since		Mai/2021
/*/
//-------------------------------------------------------------------
Static Function ModifModel(oObj, cIDPonto, cIDModel)

If ApMsgYesNo("Vamos bloquear a digitação do campo 'A1_TELEX' no IDPonto '" + cIDPonto + "' - Modelo '" + cIDModel + "' ?")

    // Bloqueando a edição de um campo no Modelo...
    ApMsgInfo("Como a tela do Modelo será exibida ao usuário, vamos bloquear a edição do campo 'A1_TELEX'")
//  MODELO     -> SUBMODELO -> ESTRUTURA -> PROPRIEDADE                             -> BLOCO DE CÓDIGO                 -> X3_WHEN := .F.
    oObj:GetModel("SA1MASTER"):GetStruct():SetProperty("A1_TELEX", MODEL_FIELD_WHEN, FwBuildFeature(STRUCT_FEATURE_WHEN , ".F."))
    //

EndIf
Return NIL

//-------------------------------------------------------------------
/*/{Protheus.doc} SetField
Exemplo de preenchimento de um campo do Modelo do Cadastro de Clientes (MVC)
@param      oObj, cIDPonto, cIDModel, cIDForm
@return     NIL
@author 	Faturamento
@version	12.1.17 / Superior
@since		Mai/2021
/*/
//-------------------------------------------------------------------
Static Function SetField(oObj, cIDPonto, cIDModel, cIDForm)

If cIDModel == 'SA1MASTER'
    If oObj:GetValue('A1_EST') $ 'AC/AL/AM/AP/BA/CE/DF/ES/GO/MA/MG/MS/MT/PA/PB/PE/PI/PR/RJ/RN/RO/RR/RS/SC/SE/SP/TO' .AND.;
       Empty(oObj:GetValue('A1_PAIS'))

        If ApMsgYesNo("Foi informado o campo 'A1_EST' com uma Unidade Federativa do Brasil, e não foi informado o código do país." + CRLF +;
                      "Então, vamos preencher o campo 'A1_PAIS' no IDPonto '" +;
                      cIDPonto + "' - Modelo '" + cIDModel + "' ?")
            oObj:SetValue('A1_PAIS', '105')
        EndIf

    EndIf
EndIf
Return NIL

//-------------------------------------------------------------------
/*/{Protheus.doc} MyFTTSPre
Função específica que será executada no momento FORM COMMIT TTS PRE
@param      oObj, cIDPonto, cIDModel, cConteudo
@return     NIL
@author 	Faturamento
@version	12.1.17 / Superior
@since		Mai/2021
/*/
//-------------------------------------------------------------------
Static Function MyFTTSPre(oObj, cIDPonto, cIDModel, cConteudo)

ApMsgInfo("Esta é a minha função específica que será executada no momento 'FORM COMMIT TTS PRE'.")
Return NIL

//-------------------------------------------------------------------
/*/{Protheus.doc} MyFTTSPos
Função específica que será executada no momento FORM COMMIT TTS POS
@param      oObj, cIDPonto, cIDModel, cConteudo
@return     NIL
@author 	Faturamento
@version	12.1.17 / Superior
@since		Mai/2021
/*/
//-------------------------------------------------------------------
Static Function MyFTTSPos(oObj, cIDPonto, cIDModel, cConteudo)

ApMsgInfo("Esta é a minha função específica que será executada no momento 'FORM COMMIT TTS POS'.")
Return NIL

//-------------------------------------------------------------------
/*/{Protheus.doc} MyMTTS
Função específica que será executada no momento MODEL COMMIT TTS
@param      oObj, cIDPonto, cIDModel, cConteudo
@return     NIL
@author 	Faturamento
@version	12.1.17 / Superior
@since		Mai/2021
/*/
//-------------------------------------------------------------------
Static Function MyMTTS(oObj, cIDPonto, cIDModel, cConteudo)

ApMsgInfo("Esta é a minha função específica que será executada no momento 'MODEL COMMIT TTS'.")
Return NIL

//-------------------------------------------------------------------
/*/{Protheus.doc} MyMNTTS
Função específica que será executada no momento MODEL COMMIT NÃO TTS
@param      oObj, cIDPonto, cIDModel, cConteudo
@return     NIL
@author 	Faturamento
@version	12.1.17 / Superior
@since		Mai/2021
/*/
//-------------------------------------------------------------------
Static Function MyMNTTS(oObj, cIDPonto, cIDModel, cConteudo)

ApMsgInfo("Esta é a minha função específica que será executada no momento 'MODEL COMMIT NÃO TTS'.")
Return NIL

07. DEMAIS INFORMAÇÕES

Não há.

08. ASSUNTOS RELACIONADOS

Consulte em MATA030 - Cadastro de Clientes - Descontinuada em 04/04/22.

08. ASSUNTOS RELACIONADOS


Templatedocumentos


HTML
<style>
div.theme-default .ia-splitter #main {
    margin-left: 0px;
}
.ia-fixed-sidebar, .ia-splitter-left {
    display: none;
}
#main {
    padding-left: 10px;
    padding-right: 10px;
    overflow-x: hidden;
}

.aui-header-primary .aui-nav,  .aui-page-panel {
    margin-left: 0px !important;
}
.aui-header-primary .aui-nav {
    margin-left: 0px !important;
}

.aui-tabs.horizontal-tabs>.tabs-menu>.menu-item.active-tab a::after { 
	background: #FF9900; !important 
}

.menu-item.active-tab { 
	border-bottom: none !important; 
}

</style>