Função que busca a descrição de um ComboBox via SQL Server

No artigo de hoje, vamos mostrar uma query SQL que busca a descrição de uma opção de um campo ComboBox.

Recentemente meu amigo Israel ( LinkedIn ), criou uma query que traz a descrição de uma opção de um campo ComboBox.

Quem já precisou trazer a descrição de uma opção do combobox direto numa query, essa função criada em SQL Server, é uma mão na roda para agilizar.

Segue o código fonte da função em SQL Server:

/*============================================================
    FUNÇÃO........: FN_GETSX3CBOX_DESC
    VERSÃO........: 1.0
    AUTOR.........: Israel Elias
    DATA..........: 10/06/2026

    BANCO DE DADOS: Microsoft SQL Server
    AMBIENTE......: TOTVS Protheus

    DESCRIÇÃO
    Retorna a descrição correspondente a um código armazenado
    no campo X3_CBOX da tabela SX3010.

    Campos do Protheus que usam X3_CBOX armazenam opções no
    formato Código=Descrição separadas por ";". Como as tabelas
    gravam apenas o código, esta função faz a conversão
    automaticamente.

    Exemplo:
        Campo : C5_TPFRETE
        Valor : F
        Retorno: FOB

    Se o código não existir, retorna string vazia.
============================================================*/

CREATE FUNCTION dbo.FN_GETSX3CBOX_DESC
	(
		@CAMPO VARCHAR(50),  /* Campo na SX3 (ex: 'B1_TIPO') */
		@VALOR VARCHAR(50)   /* Chave no CBOX (ex: 'PA')     */
	)
	RETURNS VARCHAR(100)
	AS
	BEGIN
		/* Rejeita entradas nulas */
		IF @CAMPO IS NULL OR @VALOR IS NULL
			RETURN ''

		/* Busca a lista de opções do campo (ex: 'CH=Chapa;PA=Parafuso') */
		DECLARE @CBOX VARCHAR(1000)

		SELECT @CBOX = LTRIM(RTRIM(X3_CBOX))
		FROM   SX3010
		WHERE  X3_CAMPO = @CAMPO

		IF @CBOX IS NULL OR @CBOX = ''
			RETURN ''

		/* CBOX dinâmico (ex: '#U_FUNCTION'): não resolvível via SQL */
		IF @CBOX LIKE '#%'
			RETURN ''

		/* Remove ';' final para evitar token vazio no STRING_SPLIT */
		IF RIGHT(@CBOX, 1) = ';'
			SET @CBOX = LEFT(@CBOX, LEN(@CBOX) - 1)

		/* Divide por ';', extrai a descrição onde a chave = @VALOR */
		DECLARE @DESC VARCHAR(100)

		SELECT @DESC = LTRIM(RTRIM(SUBSTRING(value, CHARINDEX('=', value) + 1, LEN(value))))
		FROM   STRING_SPLIT(@CBOX, ';')
		WHERE  CHARINDEX('=', value) > 0
		  AND  UPPER(LTRIM(RTRIM(LEFT(value, CHARINDEX('=', value) - 1))))
				   = UPPER(LTRIM(RTRIM(@VALOR)))

		/* Retorna vazio se @VALOR não encontrado */
		RETURN ISNULL(@DESC, '')
	END

E abaixo um print do resultado, buscando a descrição do campo A1_TIPO.

Exemplo do resultado da Query
Exemplo do resultado da Query

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.

Deixe uma resposta

Terminal de Informação