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
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.