Modelo3 com gatilho entre Enchoice e GetDados


Já tentou usar um gatilho utilizando o modelo3? Por padrão, o objeto que monta o getdados do modelo 3 não é do tipo PRIVATE, e para resolver isso, você terá que montar seu próprio modelo3. Você poderá criar uma função do tipo User ou Static, utilizar a do tipo USER é mais eficiente caso você trabalhe muito com modelo3. A ideia deste exemplo é mostrar o uso de gatilho entre a enchoice e o getdados, no exemplo abaixo irei trabalhar com o MsGet para minha enchoice e o MsGetDados para montar o meu grid (pode utilizar o MsNewGetDados também). No meu exemplo, tenho duas tabelas, onde uma será a minha enchoice (cabeçalho) e a outra tabela o meu getdados (itens). No cabeçalho terei um campo chamado grupo, este campo foi criado na tabela SA1. Para o gatilho funcionar eu informei o grupo na tabela de clientes. Criando o Modelo3 Criei com base no fonte padrão, porém acrescentei algumas opção como por exemplo colocando os objetos que montam a Enchoice e o GetDados como PRIVATE.

Static Function Modelo3(cTitulo,cAlias1,cAlias2,aMyEncho,cLinOk,cTudoOk,nOpcE,nOpcG,cFieldOk,lVirtual,nLinhas,aAltEnchoice,nFreeze,aButtons,aCordW,nSizeHeader,aAlGetDad,cIniCpos,cSuperDel,cDelOk)
	Local lRet, nOpca := 0,cSaveMenuh,nReg:=(cAlias1)->(Recno()),oDlg
	Local nDlgHeight   
	Local nDlgWidth
	Local nDiffWidth := 0          
	Local nDiffHeight := 0 
	Local lMDI := .F.      
	Local lPlugin := .F.
	Local nTop := 32
	Local aSize := {}
	Local cTela := ""
	Local aCampos := {}
	Local aFieldFill := {}
	
	Private oEnchoice, oGetDados
	Private Altera:=.t.,Inclui:=.t.,lRefresh:=.t.,aTELA:=Array(0,0),aGets:=Array(0),bCampo:={|nCPO|Field(nCPO)},nPosAnt:=9999,nColAnt:=9999
	Private cSavScrVT,cSavScrVP,cSavScrHT,cSavScrHP,CurLen,nPosAtu:=0

	If IsPlugin() 
		lPlugin := .T.
	EndIf

	nOpcE := If(nOpcE==Nil,3,nOpcE)
	nOpcG := If(nOpcG==Nil,3,nOpcG)
	lVirtual := Iif(lVirtual==Nil,.F.,lVirtual)
	nLinhas:=Iif(nLinhas==Nil,99,nLinhas)
	
	Default cLinOk	 := "AllwaysTrue"
	Default cTudoOk	 := "AllwaysTrue"
	Default cFieldOk := "AllwaysTrue"
	
	If SetMDIChild()
		oMainWnd:ReadClientCoors()
		nDlgHeight := oMainWnd:nHeight
		nDlgWidth := oMainWnd:nWidth
		lMdi := .T.
		nDiffWidth := 2
		If lPlugin
			nDiffHeight := 25
		EndIf
	Else           
		If lPlugin
			nDlgHeight := oMainWnd:nHeight-55
			nDlgWidth	:= oMainWnd:nWidth-12
			nDiffHeight := 80
			nTop := 10
		Else		
			nDlgHeight := oMainWnd:nHeight-50
			nDlgWidth	:= oMainWnd:nWidth-27
		Endif
		nDiffWidth := 7
	EndIf

	Default aCordW := {nTop,000,nDlgHeight,nDlgWidth}
	Default nSizeHeader := 110

	Aadd(aSize,nSizeHeader)

	DEFINE MSDIALOG oDlg TITLE cTitulo From aCordW[1],aCordW[2] to aCordW[3],aCordW[4] Pixel of oMainWnd STYLE nOR( WS_VISIBLE, WS_POPUP )
	oDlg:lMaximized := .T.

	oEnchoice := Msmget():New(cAlias1,nReg,nOpcE,,,,aMyEncho,{13,1,(nSizeHeader/2)+13,If(lMdi, (oMainWnd:nWidth/2)-2,__DlgWidth(oDlg)-nDiffWidth)},aAltEnchoice,3,,,,oDlg,,lVirtual,,,,,,,,.F.)       

	oGetDados := MsGetDados():New((nSizeHeader/2)+13+2,1,(oMainWnd:nHeight/2)-nDiffHeight,oMainWnd:nWidth/2-nDiffWidth,nOpcG,cLinOk,cTudoOk,cIniCpos,.T.,aAlGetDad,nFreeze,,nLinhas,cFieldOk,cSuperDel,,cDelOk,oDlg)
	
	ACTIVATE MSDIALOG oDlg ON INIT (EnchoiceBar(oDlg,{||nOpca:=1,If(oGetDados:TudoOk(),If(!obrigatorio(aGets,aTela),nOpca := 0,oDlg:End()),nOpca := 0)},{||oDlg:End()},,aButtons),AlignObject(oDlg,{oEnchoice:oBox,oGetDados:oBrowse},1,,aSize))

	lRet:=(nOpca==1)
Return lRet
Criando o gatilho A ideia do meu gatilho é que quando eu informar um grupo, ele irá selecionar todos os meus clientes pertencentes ao grupo selecionado e preencher no meu getdados.
User Function EXP923(cGrupo)
	Local i := 0
	Local aCliente := {}
	Local cQuery := ""
	Local nCont := 0
	
	if(!Empty(cGrupo))
		cQuery := "SELECT A1_COD,A1_LOJA,A1_NOME,A1_CONTATO,A1_EST FROM " + RetSqlName("SA1") + " WHERE D_E_L_E_T_='' AND A1_FILIAL='" + XFILIAL("SA1") + "' AND A1_ZGRUPO = '"+ cGrupo +"'"
		If ( SELECT("TMP") ) > 0
			dbSelectArea("TMP")
			TMP->(dbCloseArea())
		EndIf
		
		TCQUERY cQuery NEW ALIAS "TMP"	                      
		
	    if TMP->(!EOF())	        
	    	While TMP->(!EOF())	        
			    Aadd(aCliente, {TMP->A1_COD,TMP->A1_LOJA,TMP->A1_NOME,TMP->A1_CONTATO,TMP->A1_EST} )
			    TMP->(dbSkip())
			EndDo
		Endif		

	Endif
	
	RegToMemory("Z01",.F.,.F.)
		
	if(Empty(aCols[1,GdFieldPos("Z01_CLIENT")]))
	
		For i := 1 To Len(aCliente)

			aCols[i,GdFieldPos("Z01_CLIENT")]:= aCliente[i,1]
			aCols[i,GdFieldPos("Z01_LOJA")]  := aCliente[i,2]
			aCols[i,GdFieldPos("Z01_NOME")]  := aCliente[i,3]
			aCols[i,GdFieldPos("Z01_CONTAT")]:= aCliente[i,4]
			aCols[i,GdFieldPos("Z01_UF")]    := aCliente[i,5]
			
			If ExistTrigger("Z01_CLIENT")
				RunTrigger(2,len(aCols),Nil,,"Z01_CLIENT")
			Endif  

			oGetDados:addLine()
		Next
	Else
		
		For i := 1 To Len(aCliente)
			nCont := Len(aCols)
			
			aCols[nCont,GdFieldPos("Z01_CLIENT")]:= aCliente[i,1]
			aCols[nCont,GdFieldPos("Z01_LOJA")]  := aCliente[i,2]
			aCols[nCont,GdFieldPos("Z01_NOME")]  := aCliente[i,3]
			aCols[nCont,GdFieldPos("Z01_CONTAT")]:= aCliente[i,4]
			aCols[nCont,GdFieldPos("Z01_UF")]    := aCliente[i,5]

			If ExistTrigger("Z01_CLIENT")
				RunTrigger(2,len(aCols),Nil,,"Z01_CLIENT")
			Endif  

			oGetDados:addLine()

		Next
	Endif


	oGetDados:ForceRefresh()
	oGetDados:oBrowse:Refresh()

Return(cGrupo)
Fonte completo baixe aqui EXP0923