Este é um exemplo de consulta padrão personalizada.
#include "Protheus.ch" #include "Topconn.ch" //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³Consulta Especifica de Marcas - ZZY³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ User Function ConsZZY() Local bRet := .F. Private nPosProd := aScan(aHeader, {|x| alltrim(x[2]) == "C1_PRODUTO"}) Private nPosMarca := aScan(aHeader, {|x| alltrim(x[2]) == "C1_MARCA"}) Private cCodigo := Alltrim(&(ReadVar())) bRet := FiltraZZY() Return(bRet) Static Function FiltraZZY() Local cQuery Local oLstSB1 := nil Private oDlgZZY := nil Private _bRet := .F. Private aDadosZZY := {} //Query de marca x produto x referencia cQuery := " SELECT ZZY_CODPRO, ZZY_ITEM, ZZY_CODMAR, ZZZ_DESC, ZZY_CODREF, ZZX_DESC " cQuery += " FROM "+RetSQLName("ZZY") + " AS ZZY WITH (NOLOCK) " cQuery += " INNER JOIN "+RetSQLName("ZZZ") + " AS ZZZ WITH (NOLOCK) ON ZZY.ZZY_CODMAR = ZZZ.ZZZ_COD " cQuery += " INNER JOIN "+RetSQLName("ZZX") + " AS ZZX WITH (NOLOCK) ON ZZY.ZZY_CODREF = ZZX.ZZX_COD " cQuery += " WHERE ZZY_FILIAL = '" + xFilial("ZZY") + "' AND ZZY_CODPRO = '" + aCols[n,nPosProd ] + "'" cQuery += " AND ZZY.D_E_L_E_T_= ' ' " cQuery += " ORDER BY ZZY_FILIAL, ZZY_CODPRO " cAlias1:= CriaTrab(Nil,.F.) DbUseArea(.T.,"TOPCONN", TCGENQRY(,,cQuery),cAlias1, .F., .T.) (cAlias1)->(DbGoTop()) If (cAlias1)->(Eof()) Aviso( "Cadastro de Produtos x Marca X Referencia", "Não existe dados a consultar", {"Ok"} ) Return .F. Endif Do While (cAlias1)->(!Eof()) aAdd( aDadosZZY, { (cAlias1)->ZZY_CODPRO, (cAlias1)->ZZY_ITEM, (cAlias1)->ZZY_CODMAR, (cAlias1)->ZZZ_DESC, (cAlias1)->ZZY_CODREF, (cAlias1)->ZZX_DESC} ) (cAlias1)->(DbSkip()) Enddo DbCloseArea(cAlias1) nList := aScan(aDadosZZY, {|x| alltrim(x[3]) == alltrim(cCodigo)}) iif(nList = 0,nList := 1,nList) //--Montagem da Tela Define MsDialog oDlgZZY Title "Busca de Produtos x Marca X Referencia" From 0,0 To 280, 500 Of oMainWnd Pixel @ 5,5 LISTBOX oLstZZY ; VAR lVarMat ; Fields HEADER "Cod. Produto", "Item", "Cod. Marca", "Desc. Marca", "Cod. Ref.", "Desc. Ref" ; SIZE 245,110 On DblClick ( ConfZZY(oLstZZY:nAt, @aDadosZZY, @_bRet) ) ; OF oDlgZZY PIXEL oLstZZY:SetArray(aDadosZZY) oLstZZY:nAt := nList oLstZZY:bLine := { || {aDadosZZY[oLstZZY:nAt,1], aDadosZZY[oLstZZY:nAt,2], aDadosZZY[oLstZZY:nAt,3], aDadosZZY[oLstZZY:nAt,4], aDadosZZY[oLstZZY:nAt,5], aDadosZZY[oLstZZY:nAt,6]}} DEFINE SBUTTON FROM 122,5 TYPE 1 ACTION ConfZZY(oLstZZY:nAt, @aDadosZZY, @_bRet) ENABLE OF oDlgZZY DEFINE SBUTTON FROM 122,40 TYPE 2 ACTION oDlgZZY:End() ENABLE OF oDlgZZY Activate MSDialog oDlgZZY Centered Return _bRet Static Function ConfZZY(_nPos, aDadosZZY, _bRet) cCodigo := aDadosZZY[_nPos,3] aCols[n,nPosMarca] := cCodigo aCpoRet[1] := cCodigo //Não esquecer de alimentar essa variável quando for f3 pois ela e o retorno e se estiver com valor diferente complica. _bRet := .T. oDlgZZY:End() Return