Função para pegar a descrição de um campo Combo em AdvPL

Olá pessoal…

Hoje vou mostrar uma função desenvolvida que retorna a descrição da opção de um campo Combo em AdvPL (por exemplo, S=Sim, ele retorna Sim).


AdvPL

AdvPL

A função recebe 3 parâmetros, o primeiro é a chave de pesquisa (por exemplo ‘S’, ‘N’, ‘1’, etc), o segundo parâmetro é o campo do configurador (por exemplo ‘A1_TIPO’, ‘C5_TIPO’, ‘B1_RASTRO’, etc), e o terceiro parâmetro é o conteúdo do combo (essa opção só é utilizada, caso você não use o campo).

Abaixo um exemplo utilizando o campo:

u_zCmbDesc( "D",;        //Chave Pesquisada
            "C5_TIPO",;  //Campo
            "")          //Conteúdo

Abaixo um exemplo utilizando o conteúdo:

u_zCmbDesc( "S",;           //Chave Pesquisada
            "",;            //Campo
            "S=Sim;N=Nao")  //Conteúdo

Abaixo o fonte completo da rotina.

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zCmbDesc
Função que retorna a descrição da opção do Combo selecionada
@type function
@author Atilio
@since 28/08/2016
@version 1.0
	@param cChave, character, Chave de pesquisa dentro do combo
	@param cCampo, character, Campo do tipo combo
	@param cConteudo, character, Conteúdo no formato de combo
	@return cDescri, Descrição da opção do combo
	@example
	u_zCmbDesc("D", "C5_TIPO", "") //Utilizando por Campo
	u_zCmbDesc("S", "", "S=Sim;N=Não;A=Ambos;") //Utilizando por Conteúdo
/*/

User Function zCmbDesc(cChave, cCampo, cConteudo)
	Local aArea       := GetArea()
	Local aCombo      := {}
	Local nAtual      := 1
	Local cDescri     := ""
	Default cChave    := ""
	Default cCampo    := ""
	Default cConteudo := ""
	
	//Se o campo e o conteúdo estiverem em branco, ou a chave estiver em branco, não há descrição a retornar
	If (Empty(cCampo) .And. Empty(cConteudo)) .Or. Empty(cChave)
		cDescri := ""
	Else
		//Se tiver campo
		If !Empty(cCampo)
			aCombo := RetSX3Box(GetSX3Cache(cCampo, "X3_CBOX"),,,1)
			
			//Percorre as posições do combo
			For nAtual := 1 To Len(aCombo)
				//Se for a mesma chave, seta a descrição
				If cChave == aCombo[nAtual][2]
					cDescri := aCombo[nAtual][3]
				EndIf
			Next
			
		//Se tiver conteúdo
		ElseIf !Empty(cConteudo)
			aCombo := StrTokArr(cConteudo, ';')
			
			//Percorre as posições do combo
			For nAtual := 1 To Len(aCombo)
				//Se for a mesma chave, seta a descrição
				If cChave == SubStr(aCombo[nAtual], 1, At('=', aCombo[nAtual])-1)
					cDescri := SubStr(aCombo[nAtual], At('=', aCombo[nAtual])+1, Len(aCombo[nAtual]))
				EndIf
			Next
		EndIf
	EndIf
	
	RestArea(aArea)
Return cDescri

Bom pessoal, por hoje é só.
Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

4 Responses

  1. Olá Danilo..

    Parabéns pelos artigos. Ajudam bastante a comunidade.
    Há também a função não documentada chamada X3COMBO(“campo”,conteudo)

    Exemplo
    X3COMBO(“A1_PESSOA”,”F”) – Retorna Física.

    Toda vez que preciso dela, esqueço o nome da função.
    E quando pesquiso sempre aparece este seu post nos resultados.
    Agora fica mais fácil lembrar através do seu post

    Abraços e sucesso.

  2. Paulo disse:

    Boa tarde , alguém tem um exemplo de MODEL_FIELD_VALUES

    • Boa tarde Paulo, tudo joia?

      Nos perguntaram recentemente no nosso grupo do WhatsApp, até enviamos um prw de exemplo, segue a resposta que enviamos na época:
      […]
      Montamos um exemplo, que vai ao ar daqui uns meses no Terminal de Informação (após acabar a série de Maratona no YouTube).

      Nele nós mostramos como manipular o MODEL_FIELD_VALUES junto com o COMBOVALUES, segue o código prw completo, veja o trecho das linhas 126 a 162.

      Mas basicamente, seria o seguinte, crie um SetAfterViewActivate acionando uma função estática (no nosso exemplo está como fAtuCombo), depois disso, dentro dessa função, ai você manipula um array para ser as opções do combo e atualiza na Model e na View (abaixo um resumo do trecho citado acima):

      //Define as opções do campo
      aOpcoes := {}
      aAdd(aOpcoes, “1=Novo Registro”)
      aAdd(aOpcoes, “2=Inclusão Teste”)

      //Define direto no Model
      oModelZD1:GetStruct():SetProperty(“ZD1_TIPO”, MODEL_FIELD_VALUES, aOpcoes)

      //E agora define na View
      oView:SetFieldProperty(“ZD1MASTER”, “ZD1_TIPO”, “COMBOVALUES”, { aOpcoes })

      //Atualiza a tela
      oView:Refresh()
      […]

      Um grande abraço.

Deixe uma resposta

Terminal de Informação