Criando dois browses com relacionamento através da FWBrwRelation – Maratona AdvPL e TL++ 208

Nesse vídeo demonstraremos a utilização da classe FWBrwRelation, que serve para criar um relacionamento entre dois browses (FWMBrowse).

Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:

//Bibliotecas
#Include "Totvs.ch"
#Include "FWMVCDef.ch"

Static lEmExecucao   := .F.

/*/{Protheus.doc} User Function zExe208
Exemplo de tela com 2 browses de cadastro usando FWBrwRelation
@type  Function
@author Atilio
@since 20/02/2023
@obs 
    
    **** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/

User Function zExe208()
	Local aArea   := GetArea()
    Local cFunBkp := FunName()
	Local aCoors  := FWGetDialogSize( oMainWnd )
	Local cIdGrupo
	Local cIdProdut
	Local oPanelUp
	Local oTela
	Local oPanelDown
	Local oRelaction

	//Tratativa para impedir que seja aberta a mesma janela por cima da original do browse
	If ! lEmExecucao
		SetFunName("MATA035")
		DbSelectArea("SBM")
		DbSelectArea("SB1")

		//Cria a janela principal
		Define MsDialog oDlgPrinc Title "Grupos x Produtos" From aCoors[1], aCoors[2] To aCoors[3], aCoors[4] OF oMainWnd Pixel

			//Divide a tela em dois containers, um de 30% e outro de 68%
			oTela     := FWFormContainer():New( oDlgPrinc )
			cIdGrupo  := oTela:CreateHorizontalBox( 30 )
			cIdProdut := oTela:CreateHorizontalBox( 68 )
			oTela:Activate( oDlgPrinc, .F. )

			//Cria os painéis
			oPanelUp  	:= oTela:GetPanel( cIdGrupo )
			oPanelDown  := oTela:GetPanel( cIdProdut )

			//Cria o browse superior trazendo dados da SBM
			oBrowseUp:= FWmBrowse():New()
			oBrowseUp:SetOwner(oPanelUp)
			oBrowseUp:SetDescription("Grupos")
			oBrowseUp:SetAlias('SBM')
			oBrowseUp:DisableDetails()
			oBrowseUp:SetProfileID('1')
			oBrowseUp:ExecuteFilter(.T.)
			oBrowseUp:SetMainProc("MATA010")
			oBrowseUp:ForceQuitButton()
			oBrowseUp:SetMenuDef('MATA035')
			oBrowseUp:SetCacheView (.F.)
			oBrowseUp:SetOnlyFields({'BM_GRUPO', 'BM_DESC'})
			oBrowseUp:Activate()

			//Cria o browse inferior, que irá trazer todos os produtos
			aRotina := FWLoadMenuDef("MATA010")
			oBrowseDwn:= FWMBrowse():New()
			oBrowseDwn:SetOwner(oPanelDown)
			oBrowseDwn:SetDescription("Produtos")
			oBrowseDwn:SetMenuDef('MATA010')
			oBrowseDwn:DisableDetails()
			oBrowseDwn:SetAlias('SB1')
			oBrowseDwn:SetProfileID('2')
			oBrowseDwn:SetMainProc("MATA035")
			oBrowseDwn:SetCacheView (.F.)
			oBrowseDwn:SetOnlyFields({'B1_COD', 'B1_DESC'})

			//Faz o relacionamento entre os dois browses
			oRelaction:= FWBrwRelation():New()
			oRelaction:AddRelation( oBrowseUp  , oBrowseDwn , { { 'B1_GRUPO' , 'BM_GRUPO' } } )
			oRelaction:Activate()
			oBrowseDwn:Activate()

			//Atualiza os browses e cria a janela na tela
			oBrowseUp:Refresh()
			oBrowseDwn:Refresh()
			lEmExecucao := .T.
		Activate MsDialog oDlgPrinc Center

		lEmExecucao := .F.
        SetFunName(cFunBkp)
	EndIf

	RestArea(aArea)
Return

Static Function MenuDef()
	Local aRotina := FWLoadMenuDef("MATA035")
Return aRotina

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.

2 Responses

  1. Pablo Henrique Ribeiro da Silva disse:

    Boa noite tenho uma duvida, é possivel criar uma relação com FWBrwRelation de duas grid que foram montadas com tabelas temporarias?

    • Bom dia Pablo, tudo joia?

      Via FWBrwRelation, nunca fiz com duas temporárias. Mas preparamos um exemplo, que vai ao ar agora em Agosto do Ti Responde, que são duas browse comuns, cada uma com FWTemporaryTable e ao alternar uma, a outra é atualizada (igual o comportamento do FWBrwRelation).

      Se você acha que esse exemplo vai te atender e você for Assinante Premium, nos mande um eMail que lhe enviamos o prw antecipadamente.

      Um grande abraço.

Deixe uma resposta

Terminal de Informação