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).
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.

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.
Obrigado pelo comentário Rodrigo.
Depois irei adicionar na base de conhecimento.
Um grande abraço.
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.