01. DADOS GERAIS
Linha de Produto: | Microsiga Protheus® |
---|---|
Segmento: | Logística |
Módulo: | SIGATMS - Gestão de Transportes |
02. DESCRIÇÃO
Através deste ponto de entrada é possível a criação de filtros específicos na tela da rotina de Painel de Agendamentos.
Sempre que este ponto de entrada estiver compilado no repositório de fontes, o sistema irá exibir um botão na parte superior da tela, indicando que os filtros específicos estão ativos.
O ponto de entrada está localizado nas funções TMSAF76, TMSF76Din e TMSF76Qry do fonte TMSAF76 (Painel de Agendamentos) e possui duas ações que devem ser consideradas:
- Exibir uma tela com os campos que deverão ser preenchidos pelo usuário para filtragem dos registros, sempre que o botão de filtros específicos for acionado;
- Realizar filtro via query nas tabelas envolvidas conforme campos exibidos pela ação 1, após a confirmação da tela de filtros específicos.
Parâmetros:
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
---|---|---|---|---|---|
ParamIXB | Array | Variáveis que serão utilizadas na montagem da tela e do filtro Posição 1: Ação a ser tomada (1=Montagem da tela e 2=Execução do filtro) Posição 2: Vetor com as tabelas "filhas" contidas nas abas inferiores Posição 3: Vetor com as tabelas "pai" (relacionamento superior) das tabelas "filhas" | Sim |
Retorno:
Se a ação da primeira posição do ParamIXB = 1, o xRet será o retorno lógico igual a .T. quando o usuário optar por confirmar a tela de filtros, e será o retorno lógico igual a .F. quando o usuário optar por cancelar a tela de filtros.
Se a ação da primeira posição do ParamIXB = 2, o xRet será um vetor com os campos e filtros selecionados quando o usuário optar por confirmar a tela de filtros, e será um vetor vazio quando o usuário optar por cancelar a tela de filtros
03. EXEMPLO DE UTILIZAÇÃO
#Include 'Protheus.ch' Static aStruFil1 := {} Static aCposFil1 := {} Static aValsFil1 := {} Static aCposDef1 := {{"DF0_DATCAD","Inclusão De","DATCAD_DE"} ,{"DF0_DATCAD","Inclusão Até","DATCAD_ATE"},; {"DF1_DATPRC","Prev.Coleta De","DATPRC_DE"},{"DF1_DATPRC","Prev.Coleta Até","DATPRC_ATE"},; {"DT6_DOC" ,"Número CT-e",""} ,{"DTY_NUMCTC",RetTitle("DTY_NUMCTC"),""},; {"DTQ_VIAGEM",RetTitle("DTQ_VIAGEM"),""} ,{"DF0_NUMAGE",RetTitle("DF0_NUMAGE"),""},; {"DF1_CODNEG",RetTitle("DF1_CODNEG"),""} ,{"DF1_DESNEG",RetTitle("DF1_DESNEG"),""},; {"DF1_SERVIC",RetTitle("DF1_SERVIC"),""} ,{"DF1_DESSER",RetTitle("DF1_DESSER"),""},; {"DT6_NUM" ,RetTitle("DT6_NUM"),""} ,{"DTC_NUMNFC",RetTitle("DTC_NUMNFC"),""},; {"DF1_FILORI",RetTitle("DF1_FILORI"),""} ,{"DT5_NUMSOL","Número Sol Coleta",""}} Static aStruFil2 := {} Static aCposFil2 := {} Static aValsFil2 := {} Static aCposDef2 := {{"DF1_CLIREM",RetTitle("DF1_CLIREM"),""} ,{"DF1_LOJREM",RetTitle("DF1_LOJREM"),""},; {"DF1_NOMREM",RetTitle("DF1_NOMREM"),""} ,{"DTC_CLICON",RetTitle("DTC_CLICON"),""},; {"DTC_LOJCON",RetTitle("DTC_LOJCON"),""} ,{"DTC_NOMCON",RetTitle("DTC_NOMCON"),""},; {"DF1_CLIDES",RetTitle("DF1_CLIDES"),""} ,{"DF1_LOJDES",RetTitle("DF1_LOJDES"),""},; {"DF1_NOMDES",RetTitle("DF1_NOMDES"),""} ,{"DF1_CLIDEV",RetTitle("DF1_CLIDEV"),""},; {"DF1_LOJDEV",RetTitle("DF1_LOJDEV"),""} ,{"DF1_NOMDEV",RetTitle("DF1_NOMDEV"),""} } //------------------------------------------------------------------- /*/{Protheus.doc} TMF76Din Ponto de Entrada TMF76Din @author Totvs @obs Ponto de entrada para chamar a funcao que cria e executa os filtros especificos no painel /*/ //------------------------------------------------------------------- User Function TMF76Din() Local nAcao := ParamIXB[1] Local aAliasFil := ParamIXB[2] Local aAliasSup := ParamIXB[3] Local xRet If FindFunction("u_FS03362B") xRet := u_FS03362B(nAcao,Aclone(aAliasFil),Aclone(aAliasSup)) Endif Return xRet //-------------------------------------------------------------------------- /*{Protheus.doc} FS03362A @author Totvs @param aParam - PARAMIXB do P.E @obs Monta vetor com a estrutura dos campos dos filtros especificos */ //-------------------------------------------------------------------------- User Function FS03362A() Local nCntFor1 := 0 SX3->(dbSetOrder(2)) For nCntFor1 := 1 to Len(aCposDef1) If SX3->(DbSeek(aCposDef1[nCntFor1,1])) Aadd(aCposFil1,Iif(Empty(aCposDef1[nCntFor1,3]),aCposDef1[nCntFor1,1],aCposDef1[nCntFor1,3])) Aadd(aStruFil1,{aCposDef1[nCntFor1,2],; Iif(Empty(aCposDef1[nCntFor1,3]),aCposDef1[nCntFor1,1],aCposDef1[nCntFor1,3]),; SX3->X3_TIPO,; SX3->X3_TAMANHO,; SX3->X3_DECIMAL,; SX3->X3_PICTURE,; {|| U_FS03362C()},; .F.,; SX3->X3_NIVEL,; SX3->X3_RELACAO,; Iif(SX3->X3_CAMPO == "DF1_CODNEG","DDB",Iif(SX3->X3_CAMPO == "DF1_SERVIC","DLJ",Iif(SX3->X3_CAMPO == "DF1_FILORI","DLB",""))),; Iif(SX3->X3_CAMPO $ "DF1_DESNEG:DF1_DESSER",{|| .F.},""),; .F.,; .F.,; SX3->X3_CBOX,; Val(SX3->X3_FOLDER),; .F.,; SX3->X3_PICTVAR,; }) EndIf Next nCntFor1 For nCntFor1 := 1 to Len(aCposDef2) If SX3->(DbSeek(aCposDef2[nCntFor1,1])) Aadd(aCposFil2,Iif(Empty(aCposDef2[nCntFor1,3]),aCposDef2[nCntFor1,1],aCposDef2[nCntFor1,3])) Aadd(aStruFil2,{aCposDef2[nCntFor1,2],; Iif(Empty(aCposDef2[nCntFor1,3]),aCposDef2[nCntFor1,1],aCposDef2[nCntFor1,3]),; SX3->X3_TIPO,; SX3->X3_TAMANHO,; SX3->X3_DECIMAL,; SX3->X3_PICTURE,; {|| U_FS03362C()},; .F.,; SX3->X3_NIVEL,; SX3->X3_RELACAO,; Iif(SubStr(SX3->X3_CAMPO,4,4) == "_CLI","SA1",""),; Iif(SX3->X3_CAMPO $ "DF1_NOMREM:DTC_NOMCON:DF1_NOMDES:DF1_NOMDEV",{|| .F.},""),; .F.,; .F.,; SX3->X3_CBOX,; Val(SX3->X3_FOLDER),; .F.,; SX3->X3_PICTVAR,; }) EndIf Next nCntFor1 Return //-------------------------------------------------------------------------- /*{Protheus.doc} FS03362B @author Totvs @return aRet @obs Cria e executa os filtros especificos no painel */ //-------------------------------------------------------------------------- User Function FS03362B(nAcao,aAliasFil,aAliasSup) Local aAreas := {SX3->(GetArea()),GetArea()} Local aButtons := {} Local aSize := {} Local aObjects := {} Local aInfo := {} Local aPosObj := {} Local nCntFor1 := 0 Local nOpca := 0 Local cRet := "" Local bOldF5 := SetKey(VK_F5) Local xRet Local nPosDF0,nPosDF1,nPosDTC,nPosDTQ,nPosDT5,nPosDT6,nPosDTY Private oDlgFil Private oEncFil1 Private oEncFil2 DEFAULT nAcao := 0 DEFAULT aAliasFil := {} DEFAULT aAliasSup := {} If nAcao == 1 //-- Exibe tela de filtros If Empty(aStruFil1) U_FS03362A() EndIf //-- Desliga teclas de atalho do painel SetKey(VK_F5 ,{|| }) SetKey(VK_F6 ,{|| }) SetKey(VK_F7 ,{|| }) SetKey(VK_F12 ,{|| }) aSize := MsAdvSize() Aadd(aObjects,{050,050,.T.,.T.}) Aadd(aObjects,{050,050,.T.,.T.}) aInfo := {aSize[1],aSize[2],aSize[3],aSize[4],5,5} aPosObj := MsObjSize( aInfo, aObjects,.T.) If Empty(aValsFil1) aEval(aCposDef1,{|x,y| Iif(Empty(x[3]),M->&(X[1]) := CriaVar(x[1],.F.),M->&(X[3]) := CToD(" / / "))}) aEval(aCposDef2,{|x,y| Iif(Empty(x[3]),M->&(X[1]) := CriaVar(x[1],.F.),M->&(X[3]) := CToD(" / / "))}) Else For nCntFor1 := 1 To Len(aCposDef1) If Empty(aCposDef1[nCntFor1,3]) M->&(aCposDef1[nCntFor1,1]) := aValsFil1[nCntFor1] Else M->&(aCposDef1[nCntFor1,3]) := aValsFil1[nCntFor1] EndIf Next nCntFor1 For nCntFor1 := 1 To Len(aCposDef2) If Empty(aCposDef2[nCntFor1,3]) M->&(aCposDef2[nCntFor1,1]) := aValsFil2[nCntFor1] Else M->&(aCposDef2[nCntFor1,3]) := aValsFil2[nCntFor1] EndIf Next nCntFor1 EndIf If Empty(M->DF1_FILORI) M->DF1_FILORI := cFilAnt EndIf AAdd(aButtons,{'RPMNEW',{|| U_FS03362D(),oDlgFil:Refresh()},"F5-Limpa Filtros","F5-Limpa Filtros"}) SetKey(VK_F5 ,{|| U_FS03362D(),oDlgFil:Refresh()}) DEFINE MSDIALOG oDlgFil TITLE "Filtros Especificos" From aSize[7],00 TO aSize[6],aSize[5] OF oMainWnd PIXEL oEncFil1 := MsMGet():New(,,3,,,,aCposFil1,aPosObj[1],,1,,,,oDlgFil,,,,,,,aStruFil1) oEncFil2 := MsMGet():New(,,3,,,,aCposFil2,aPosObj[2],,1,,,,oDlgFil,,,,,,,aStruFil2) ACTIVATE MSDIALOG oDlgFil ON INIT EnchoiceBar(oDlgFil,{|| (nOpca := 1, oDlgFil:End())},{|| oDlgFil:End()},,aButtons) If nOpca == 1 xRet := .T. aValsFil1 := {} For nCntFor1 := 1 To Len(aCposDef1) Aadd(aValsFil1,M->&(aCposFil1[nCntFor1])) Next nCntFor1 aValsFil2 := {} For nCntFor1 := 1 To Len(aCposDef2) Aadd(aValsFil2,M->&(aCposFil2[nCntFor1])) Next nCntFor1 Else xRet := .F. EndIf //-- Recupera teclas de atalho do painel SetKey(VK_F5 ,{||TMSF76Age(.T.,.T.,.F.,,)}) SetKey(VK_F6 ,{||TMSF76Fil(.T.,.T.,.T.)}) SetKey(VK_F7 ,{||TMSF76Din()}) SetKey(VK_F12 ,{||TMSF76F12()}) ElseIf nAcao == 2 //-- Altera vetor de filtros xRet := {} For nCntFor1 := 1 To Len(aAliasFil) Aadd(xRet,{aAliasFil[nCntFor1,1],"","",aAliasSup[nCntFor1],.F.}) Next nCntFor1 nPosDF0 := aScan(aAliasFil,{|x| x[1] == 'DF0'}) nPosDF1 := aScan(aAliasFil,{|x| x[1] == 'DF1'}) nPosDTC := aScan(aAliasFil,{|x| x[1] == 'DTC'}) nPosDTQ := aScan(aAliasFil,{|x| x[1] == 'DTQ'}) nPosDT5 := aScan(aAliasFil,{|x| x[1] == 'DT5'}) nPosDT6 := aScan(aAliasFil,{|x| x[1] == 'DT6'}) nPosDTY := aScan(aAliasFil,{|x| x[1] == 'DTY'}) //-- Tabela DF0 cRet := Iif(!Empty(aValsFil1[01])," AND DF0_DATCAD >= '" + DToS(aValsFil1[01]) + "'","") cRet += Iif(!Empty(aValsFil1[02])," AND DF0_DATCAD <= '" + DToS(aValsFil1[02]) + "'","") cRet += Iif(!Empty(aValsFil1[08])," AND DF0_NUMAGE = '" + aValsFil1[08] + "'","") If !Empty(cRet) cRet := SubStr(cRet,6) xRet[nPosDF0] := {"DF0",MontDescr("DF0",cRet,.T.),cRet,"",.F.} EndIf //-- Tabela DF1 cRet := Iif(!Empty(aValsFil1[03])," AND DF1_DATPRC >= '" + DToS(aValsFil1[03]) + "'","") cRet += Iif(!Empty(aValsFil1[04])," AND DF1_DATPRC <= '" + DToS(aValsFil1[04]) + "'","") cRet += Iif(!Empty(aValsFil1[09])," AND DF1_CODNEG = '" + aValsFil1[09] + "'","") cRet += Iif(!Empty(aValsFil1[11])," AND DF1_SERVIC = '" + aValsFil1[11] + "'","") cRet += Iif(!Empty(aValsFil1[16])," AND DF1_FILORI = '" + aValsFil1[15] + "'","") cRet += Iif(!Empty(aValsFil2[01])," AND DF1_CLIREM = '" + aValsFil2[01] + "'","") cRet += Iif(!Empty(aValsFil2[02])," AND DF1_LOJREM = '" + aValsFil2[02] + "'","") cRet += Iif(!Empty(aValsFil2[07])," AND DF1_CLIDES = '" + aValsFil2[07] + "'","") cRet += Iif(!Empty(aValsFil2[08])," AND DF1_LOJDES = '" + aValsFil2[08] + "'","") cRet += Iif(!Empty(aValsFil2[10])," AND DF1_CLIDEV = '" + aValsFil2[10] + "'","") cRet += Iif(!Empty(aValsFil2[11])," AND DF1_LOJDEV = '" + aValsFil2[11] + "'","") If !Empty(cRet) cRet := SubStr(cRet,6) xRet[nPosDF1] := {"DF1",MontDescr("DF1",cRet,.T.),cRet,"",.F.} EndIf //-- Tabela DT6 cRet := Iif(!Empty(aValsFil1[05])," AND DT6_DOC = '" + aValsFil1[05] + "'","") cRet += Iif(!Empty(aValsFil1[13])," AND DT6_NUM = '" + aValsFil1[13] + "'","") If !Empty(cRet) cRet := SubStr(cRet,6) xRet[nPosDT6] := {"DT6",MontDescr("DT6",cRet,.T.),cRet,"DTC",.F.} EndIf //-- Tabela DT5 cRet := Iif(!Empty(aValsFil1[16])," AND DT5_NUMSOL = '" + aValsFil1[16] + "'","") If !Empty(cRet) cRet := SubStr(cRet,6) xRet[nPosDT5] := {"DT5",MontDescr("DT5",cRet,.T.),cRet,"DF1",.F.} EndIf //-- Tabela DTY cRet := Iif(!Empty(aValsFil1[06])," AND DTY_NUMCTC = '" + aValsFil1[06] + "'","") If !Empty(cRet) cRet := SubStr(cRet,6) xRet[nPosDTY] := {"DTY",MontDescr("DTY",cRet,.T.),cRet,"DTQ",.F.} EndIf //-- Tabela DTQ cRet := Iif(!Empty(aValsFil1[07])," AND DTQ_VIAGEM = '" + aValsFil1[07] + "'","") If !Empty(cRet) cRet := SubStr(cRet,6) xRet[nPosDTQ] := {"DTQ",MontDescr("DTQ",cRet,.T.),cRet,"DUD",.F.} EndIf //-- Tabela DTC cRet := Iif(!Empty(aValsFil1[14])," AND DTC_NUMNFC = '" + aValsFil1[14] + "'","") cRet += Iif(!Empty(aValsFil2[04])," AND DTC_CLICON = '" + aValsFil2[04] + "'","") cRet += Iif(!Empty(aValsFil2[05])," AND DTC_LOJCON = '" + aValsFil2[05] + "'","") If !Empty(cRet) cRet := SubStr(cRet,6) xRet[nPosDTC] := {"DTC",MontDescr("DTC",cRet,.T.),cRet,"DT5",.F.} EndIf EndIf SetKey(VK_F5,bOldF5) AEval(aAreas,{|x,y| RestArea(x) }) Return xRet //-------------------------------------------------------------------------- /*{Protheus.doc} FS03362C @author Totvs @return lRet @obs Valida digitacao dos campos na tela */ //-------------------------------------------------------------------------- User Function FS03362C() Local lRet := .T. Local cCampo := ReadVar() Local aAreas := {DDB->(GetArea()),GetArea()} If "DATCAD_ATE" $ cCampo If DATCAD_ATE < DATCAD_DE Aviso("Atencao...","A data de inclusão final é menor que a inicial.",{"Ok"}) lRet := .F. EndIf ElseIf "DATPRC_ATE" $ cCampo If DATPRC_ATE < DATPRC_DE Aviso("Atencao...","A data de previsão de coleta final é menor que a inicial.",{"Ok"}) lRet := .F. EndIf ElseIf "DF1_CODNEG" $ cCampo If !Empty(M->DF1_CODNEG) DDB->(DbSetOrder(1)) If DDB->(DbSeek(xFilial("DDB") + M->DF1_CODNEG)) M->DF1_DESNEG := DDB->DDB_DESCRI Else Aviso("Atencao...","Código de negociação não encontrada.",{"Ok"}) lRet := .F. EndIf Else M->DF1_DESNEG := Space(Len(DF1_DESNEG)) EndIf ElseIf "DF1_SERVIC" $ cCampo If !Empty(M->DF1_SERVIC) DC5->(DbSetOrder(1)) If DC5->(DbSeek(xFilial("DC5") + M->DF1_SERVIC)) M->DF1_DESSER := Tabela("L4",DF1_SERVIC,.F.) Else Aviso("Atencao...","Serviço de negociação não encontrado.",{"Ok"}) lRet := .F. EndIf Else M->DF1_DESSER := Space(Len(DF1_DESSER)) EndIf ElseIf "DF1_CLIREM" $ cCampo .Or. "DF1_LOJREM" $ cCampo If !Empty(M->DF1_CLIREM) .And. !Empty(M->DF1_LOJREM) SA1->(DbSetOrder(1)) If SA1->(DbSeek(xFilial("SA1") + M->DF1_CLIREM + M->DF1_LOJREM)) M->DF1_NOMREM := SA1->A1_NOME Else Aviso("Atencao...","Remetente não encontrado.",{"Ok"}) lRet := .F. EndIf Else M->DF1_NOMREM := Space(Len(DF1_NOMREM)) EndIf ElseIf "DF1_CLICON" $ cCampo .Or. "DF1_LOJCON" $ cCampo If !Empty(M->DF1_CLICON) .And. !Empty(M->DF1_LOJCON) SA1->(DbSetOrder(1)) If SA1->(DbSeek(xFilial("SA1") + M->DF1_CLICON + M->DF1_LOJCON)) M->DF1_NOMCON := SA1->A1_NOME Else Aviso("Atencao...","Consignatario não encontrado.",{"Ok"}) lRet := .F. EndIf Else M->DF1_NOMCON := Space(Len(DF1_NOMCON)) EndIf ElseIf "DF1_CLIDES" $ cCampo .Or. "DF1_LOJDES" $ cCampo If !Empty(M->DF1_CLIDES) .And. !Empty(M->DF1_LOJDES) SA1->(DbSetOrder(1)) If SA1->(DbSeek(xFilial("SA1") + M->DF1_CLIDES + M->DF1_LOJDES)) M->DF1_NOMDES := SA1->A1_NOME Else Aviso("Atencao...","Destinatário não encontrado.",{"Ok"}) lRet := .F. EndIf Else M->DF1_NOMDES := Space(Len(DF1_NOMDES)) EndIf ElseIf "DF1_CLIDEV" $ cCampo .Or. "DF1_LOJDEV" $ cCampo If !Empty(M->DF1_CLIDEV) .And. !Empty(M->DF1_LOJDEV) SA1->(DbSetOrder(1)) If SA1->(DbSeek(xFilial("SA1") + M->DF1_CLIDEV + M->DF1_LOJDEV)) M->DF1_NOMDEV := SA1->A1_NOME Else Aviso("Atencao...","Devedor não encontrado.",{"Ok"}) lRet := .F. EndIf Else M->DF1_NOMDEV := Space(Len(DF1_NOMDEV)) EndIf EndIf AEval(aAreas,{|x,y| RestArea(x) }) Return lRet //-------------------------------------------------------------------------- /*{Protheus.doc} FS03362D @author Totvs @return Nil @obs Limpa os campos da tela */ //-------------------------------------------------------------------------- User Function FS03362D() aEval(aCposDef1,{|x,y| Iif(Empty(x[3]),M->&(X[1]) := CriaVar(x[1],.F.),M->&(X[3]) := CToD(" / / "))}) aEval(aCposDef2,{|x,y| Iif(Empty(x[3]),M->&(X[1]) := CriaVar(x[1],.F.),M->&(X[3]) := CToD(" / / "))}) Return
04. DEMAIS INFORMAÇÕES
Não há.
05. ASSUNTOS RELACIONADOS
Não há.