Árvore de páginas


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:

  1. 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;
  2. 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:

NomeTipoDescriçãoDefaultObrigatórioReferência
ParamIXBArray

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

TMF76DIN
#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á.