Vídeo Aula – AdvPL 022 – MarkBrowse em MVC

Olá pessoal…

Na aula de hoje vou mostrar como fazer um MarkBrowse em MVC (browse com opção de flagar / checar um registro).

Abaixo o código fonte completo usado na aula:

//Bibliotecas
#Include 'Protheus.ch'
#Include 'FwMVCDef.ch'

/*/{Protheus.doc} zMkMVC
MarkBrow em MVC da tabela de Artistas
@author Atilio
@since 03/09/2016
@version 1.0
@obs Criar a coluna ZZ1_OK com o tamanho 2 no Configurador e deixar como não usado
/*/

User Function zMkMVC()
	Private oMark
	
	//Criando o MarkBrow
	oMark := FWMarkBrowse():New()
	oMark:SetAlias('ZZ1')
	
	//Setando semáforo, descrição e campo de mark
	oMark:SetSemaphore(.T.)
	oMark:SetDescription('Seleção do Cadastro de Artistas')
	oMark:SetFieldMark( 'ZZ1_OK' )
	
	//Setando Legenda
	oMark:AddLegend( "ZZ1->ZZ1_COD <= '000005'", "GREEN",	"Menor ou igual a 5" )
	oMark:AddLegend( "ZZ1->ZZ1_COD >  '000005'", "RED",	"Maior que 5" )
	
	//Ativando a janela
	oMark:Activate()
Return NIL

/*---------------------------------------------------------------------*
 | Func:  MenuDef                                                      |
 | Autor: Daniel Atilio                                                |
 | Data:  03/09/2016                                                   |
 | Desc:  Criação do menu MVC                                          |
 *---------------------------------------------------------------------*/
 
Static Function MenuDef()
	Local aRotina := {}
	
	//Criação das opções
	ADD OPTION aRotina TITLE 'Visualizar' ACTION 'VIEWDEF.zModel1' OPERATION 2 ACCESS 0
	ADD OPTION aRotina TITLE 'Alterar'    ACTION 'VIEWDEF.zModel1' OPERATION 4 ACCESS 0
	ADD OPTION aRotina TITLE 'Processar'  ACTION 'u_zMarkProc'     OPERATION 2 ACCESS 0
	ADD OPTION aRotina TITLE 'Legenda'    ACTION 'u_zMod1Leg'      OPERATION 2 ACCESS 0
Return aRotina

/*---------------------------------------------------------------------*
 | Func:  ModelDef                                                     |
 | Autor: Daniel Atilio                                                |
 | Data:  03/09/2016                                                   |
 | Desc:  Criação do modelo de dados MVC                               |
 *---------------------------------------------------------------------*/
 
Static Function ModelDef()
Return FWLoadModel('zModel1')

/*---------------------------------------------------------------------*
 | Func:  ViewDef                                                      |
 | Autor: Daniel Atilio                                                |
 | Data:  03/09/2016                                                   |
 | Desc:  Criação da visão MVC                                         |
 *---------------------------------------------------------------------*/
 
Static Function ViewDef()
Return FWLoadView('zModel1')

/*/{Protheus.doc} zMarkProc
Rotina para processamento e verificação de quantos registros estão marcados
@author Atilio
@since 03/09/2016
@version 1.0
/*/

User Function zMarkProc()
	Local aArea    := GetArea()
	Local cMarca   := oMark:Mark()
	Local lInverte := oMark:IsInvert()
	Local nCt      := 0
	
	//Percorrendo os registros da ZZ1
	ZZ1->(DbGoTop())
	While !ZZ1->(EoF())
		//Caso esteja marcado, aumenta o contador
		If oMark:IsMark(cMarca)
			nCt++
			
			//Limpando a marca
			RecLock('ZZ1', .F.)
				ZZ1_OK := ''
			ZZ1->(MsUnlock())
		EndIf
		
		//Pulando registro
		ZZ1->(DbSkip())
	EndDo
	
	//Mostrando a mensagem de registros marcados
	MsgInfo('Foram marcados <b>' + cValToChar( nCt ) + ' artistas</b>.', "Atenção")
	
	//Restaurando área armazenada
	RestArea(aArea)
Return NIL

Bom pessoal, por hoje é só.
Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

10 Responses

  1. Paulo Marcelo Alencar de Oliveira disse:

    Boa Tarde, como eu poderia neste exemplo colocar na parte superior ou inferior da tela uma variável que eu pudesse colocar a quantidade de títulos selecionadas e outra a soma dos valores selecionados, tipo o que existe na tela padrão do protheus de liberação automática de títulos a pagar no financeiro.

    • Dan_Atilio disse:

      Boa noite Paulo, tudo bem?

      Rapaz, com o FWMarkBrowse eu nunca vi (apenas com o MSSelect mesmo), mas talvez o que você poderia fazer, é criar uma Dialog, e criar um Panel e vincular o seu mark com esse panel através do médoto SetOwner.

      Ai você criaria gets em outro panel, e nos métodos de marcar os registros, você poderia incrementar as variáveis desses gets.

      Qualquer dúvida, fico à disposição.

      Um grande abraço.

  2. Wexlei disse:

    Boa tarde.
    Preciso criar um markbrowse como este na mesma tela onde terá um formulário, de forma que eu teria um formulário acima, e um markbrowse abaixo.
    Como eu consigo fazer isso em MVC?

    Obrigado desde já.

    • Dan_Atilio disse:

      Bom dia Wexlei, tudo bem?
      Na verdade você teria que criar um fonte MVC normal (sem ser markbrowse), e no viewdef dele, teria que criar uma struct de uma tabela, e nessa struct criar um campo tipo check, futuramente irei fazer uma vídeo aula sobre esse assunto.
      Um grande abraço.

      • Wexlei disse:

        Obrigado pela resposta.

        Consegui fazer dessa forma, porém não carrega nada na inclusão. Precisaria que carregasse nessa grid as informações de uma tabela independente de ser inclusão, alteração ou exclusão, porque o usuário irá selecionar alguns dos registros dela que será associado ao que estiver sendo incluído no formulário de cima.

  3. Maria de Barrps disse:

    Boa tarde, gostaria de saber como fazer este markbrowse com tela modelo 3, onde no cabeçalho tenho o titulo e no detalhe tenho os produtos da NF que deu origem ao titulo.
    Obrigada

  4. wanderson disse:

    Bom dia Dan_Atilo,

    Estou usando este fonte que voce disponibilizou porem usando uma tabela fora do protheus, carregada os dados corretamente, quando excluo um dado ele não atualiza a tela, já usei o refresh() e não atualiza os dados o oMark

Deixe uma resposta

Terminal de Informação