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