Hoje vou mostrar como quebrar um campo com separações (como por exemplo, por vírgula), e transformá-lo em várias linhas.
Como exemplo, vamos pegar a condição de pagamento no Protheus, nela é possível separar os dias que o cliente vai pagar, então por exemplo, “10,20,30” seriam 10 dias, 20 dias e 30 dias.
A ideia da lógica para quebrar é simples, pegar a expressão, fazer um laço de repetição, e a cada vírgula (ou caractere de separação), gravar uma linha em uma tabela temporária, e depois utilizar a tabela temporária com um join.
Abaixo um print, de como é o campo na Condição de Pagamento, e como ficou o resultado com o script:
E abaixo, o código desenvolvido:
--Declarando variáveis Declare @Pedido Varchar(6) Declare @CondPag Varchar(3) Declare @Condicao Varchar(60) Declare @Proxima Varchar(10) Declare @Separa Varchar(1) --Definindo o pedido e a condição de pagamento Set @Pedido = '159284' Set @CondPag = '002' Set @Separa = ',' --Selecionando a condição Set @Condicao = (SELECT RTRIM(E4_COND) FROM SE4010 WHERE E4_CODIGO = @CondPag) --Criando uma tabela temporária CREATE TABLE #EXEC_TMP (COD_CONDICAO Varchar(3), CONDICAO Varchar(10)) --Enquanto houver texto na variável de condição WHILE @Condicao != '' BEGIN --Se tiver uma vírgula, pega o resto do texto até ela If CharIndex(@Separa, @Condicao) != 0 Set @Proxima = SUBSTRING(@Condicao, 1, CharIndex(@Separa, @Condicao)-1) --Senão, o resto do texto será o que está faltando Else Begin Set @Proxima = @Condicao Set @Condicao = '' End --Insere a condição na temporária Insert Into #EXEC_TMP VALUES (@CondPag, @Proxima) --Atualiza a variável, retirando a condição que já foi adicionada na temporária Set @Condicao = SUBSTRING(@Condicao, CharIndex(@Separa, @Condicao)+1, Len(@Condicao)) END --Agora, fazemos uma consulta no pedido, fazendo um join com a temporária para ver o resultado SELECT C5_NUM, CONDICAO FROM SC5010 SC5 INNER JOIN #EXEC_TMP ON ( C5_CONDPAG = COD_CONDICAO ) WHERE C5_FILIAL = '01' AND C5_NUM = @Pedido AND SC5.D_E_L_E_T_ = ' ' --Por fim, dropamos a temporária DROP TABLE #EXEC_TMP
Bom pessoal, por hoje é só.
Abraços e até a próxima.