none
Function - Não consigo pegar um campo STRING, como Valor RRS feed

  • Pergunta

  • Bom dia a todos...

    Tenho um cursor onde é montado 48 colunas com a quantidade em estoque de produtos (VE1, VE2,VE3...VE48) Para nao precisar fazer 48 concatenações pensei em fazer um while, onde seto a quantidade de tamanhos usados, e armo um laço pegando os mesmos...

    Conforme abaixo, o MSSQL monta corretamente a variavel @xVar, mas, ao fazer a concatenação com a String, o retorno fica sendo o valor string, ou seja "@VE1", "@VE2", ...,"@VE48" e nao como @VE1, @VE2...

    set @i = 0
    while @NUMERO_TAMANHOS > @i
    begin
    set @i += 1
    set @xVar = '@VE' + cast(@i as varchar(5))

    INSERT INTO @GERA_HTML(
    instrucao

    SELECT
    '<td>' + (ltrim(rtrim(@xVar))) + '</td>

    <td>' + (ltrim(rtrim(@VE1))) + '</td>'
    end

    Resultado:

    <td>@VE1</td>       <td>10</td>

    <td>@VE2</td>       <td>10</td>

    <td>@VE3</td>       <td>10</td>

    Na primeira parte, queria que trouxe o valor 10 e nao @VE1, @VE2...

    Grato pela atencao

    Jeft Souza Junior

    quarta-feira, 11 de fevereiro de 2015 12:21

Respostas

  • Boa tarde,

    Jeft, acho que talvez você consiga executar a operação desejada utilizando Unpivot. Ex:

    eclare @Tabela table 
    (VE1 varchar(10), VE2 varchar(10), VE3 varchar(10));
    
    insert into @Tabela values
    ('abc', 'def', 'ghi');
    
    select
        Coluna, 
        Valor
    from @Tabela
    unpivot
    (
        Valor for Coluna in (VE1, VE2, VE3)
    ) as u

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 11 de fevereiro de 2015 17:06
  • Jeft, segue mais um  script com Unpivot para teste:

    declare @Tabela table 
    (
        ES1 int,  ES2 int,  ES3 int,  ES4 int,  ES5 int,  ES6 int,  ES7 int,  ES8 int,  ES9 int,  ES10 int, 
        ES11 int, ES12 int, ES13 int, ES14 int, ES15 int, ES16 int, ES17 int, ES18 int, ES19 int, ES20 int, 
        ES21 int, ES22 int, ES23 int, ES24 int, ES25 int, ES26 int, ES27 int, ES28 int, ES29 int, ES30 int, 
        ES31 int, ES32 int, ES33 int, ES34 int, ES35 int, ES36 int, ES37 int, ES38 int, ES39 int, ES40 int, 
        ES41 int, ES42 int, ES43 int, ES44 int, ES45 int, ES46 int, ES47 int, ES48 int
    );
    
    insert into @Tabela values
    (
        101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 
        111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
        121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
        131, 132, 133, 134, 135, 136, 137, 138, 139, 140,
        141, 142, 143, 144, 145, 146, 147, 148
    );
    
    with CTE_Unpivot as
    (
        select
            Valor
        from @Tabela
        unpivot
        (
            Valor for Coluna in 
                        (ES1, ES2, ES3, ES4, ES5, ES6, ES7, ES8, ES9, ES10,
                         ES11, ES12, ES13, ES14, ES15, ES16, ES17, ES18, ES19, ES20,
                         ES21, ES22, ES23, ES24, ES25, ES26, ES27, ES28, ES29, ES30,
                         ES31, ES32, ES33, ES34, ES35, ES36, ES37, ES38, ES39, ES40,
                         ES41, ES42, ES43, ES44, ES45, ES46, ES47, ES48)
        ) as u
    )
    
    select
        (SELECT '<td>' + CAST(Valor as varchar(10)) + '</td>'
         FROM CTE_Unpivot
         FOR XML PATH(''), TYPE).value('.', 'varchar(max)')

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 12 de fevereiro de 2015 13:22

Todas as Respostas

  • Jeff, boa tarde!

    Por quê você não altera a ordem depois do SELECT?

    Deixe assim:

    set @i = 0
    while @NUMERO_TAMANHOS > @i
    begin
    set @i += 1
    set @xVar = '@VE' + cast(@i as varchar(5))
    
    INSERT INTO @GERA_HTML(
    instrucao
    ) 
    SELECT  
    '<td>' + (ltrim(rtrim(@VE1))) + '</td>'
    
    '<td>' + (ltrim(rtrim(@xVar))) + '</td>'
    
    end

    O resultado vai ser:

    <td>10</td>         <td>@VE1</td>
    
    <td>10</td>         <td>@VE2</td>
    
    <td>10</td>         <td>@VE3</td>
    Seria isso que você quer?


    Willian Barreto O perfeito é desumano, porque o humano é imperfeito! Antes de imprimir, pense em sua responsabilidade e compromisso com o Meio Ambiente.

    quarta-feira, 11 de fevereiro de 2015 14:09
  • Opa... boa tarde obrigado pela resposta...

    Nao seria isso nao meu querido... ali coloquei apenas como exemplo...

    O meu loop vai ter até 48 posições... para nao precisar fazer 48 vezes "<td>' + ltrim(rtrim(convert(varchar(10),@VE1))) + '</td>", "<td>' + ltrim(rtrim(convert(varchar(10),@VE2))) + '</td>", "<td>' + ltrim(rtrim(convert(varchar(10),@VE3))) + '</td>" e fazer a validação de cada campo (48 vezes), verificando se o mesmo tem valor, eu quero colocar num loop onde vai criar as 48 vezes a instrução... 

    Nem sempre haverá 48... isso dependerá do produto e a quantidade de tamanhos que ele terá...

    O @VE1, @VE2, @VE3... @VE48 são variáveis que estao em um cursor... Assim quero pegar o valor do cursor, e nao a string "@VE1", "@VE2"..., "@VE48".

    Desde já agradeco a atencao disponibilizada...

    Att

    Jeft

    quarta-feira, 11 de fevereiro de 2015 15:39
  • Jeff,

    Posta a função completa, assim temos mais detalhe da função, podendo ajudar na solução!


    Willian Barreto O perfeito é desumano, porque o humano é imperfeito! Antes de imprimir, pense em sua responsabilidade e compromisso com o Meio Ambiente.

    quarta-feira, 11 de fevereiro de 2015 17:01
  • Boa tarde,

    Jeft, acho que talvez você consiga executar a operação desejada utilizando Unpivot. Ex:

    eclare @Tabela table 
    (VE1 varchar(10), VE2 varchar(10), VE3 varchar(10));
    
    insert into @Tabela values
    ('abc', 'def', 'ghi');
    
    select
        Coluna, 
        Valor
    from @Tabela
    unpivot
    (
        Valor for Coluna in (VE1, VE2, VE3)
    ) as u

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 11 de fevereiro de 2015 17:06
  •      Boa tarde Willian... Segue a funcao simplificada... Sem algumas instruções que só enchem linguica por causa da solicitação do cliente....

    /****** Object:  UserDefinedFunction [dbo].[FX_EXP_SAP_INT_SAFX993_CAPA_CUPOM_FISCAL]    Script Date: 02/06/2015 14:17:14 ******/
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO


    alter FUNCTION [dbo].[FX_GERA_HTMLxx] ()
    RETURNS     

     @GERA_HTML TABLE (    
    instrucao text
     )     
    AS    
    BEGIN

     INSERT INTO @GERA_HTML(
    instrucao
     ) 
     SELECT  
    '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
     <head>
      <title> New Document </title>
     </head>
     <body>
      <TABLE border="1">
    <tr align="center">
    <td>VENDA ESTOQUE AGRUPADO FAMILIA</td>
    </tr>
    <tr>
    <td>&nbsp;</td>
    </tr>
    <tr>
    <td>FAMILIA ZIG 1 A 3 MENINA</td>
    </tr>
    <tr>
    <td>ARTIGO CONJUNTO</td>
    </tr>
    <tr>
    <td>&nbsp;</td>
    </tr>
    '

    DECLARE
    @PRODUTO char(12),
    @DESC_PRODUTO varchar(40),
    @COR_PRODUTO char(10),
    @DESC_COR_PRODUTO varchar(40),
    @FILIAL varchar(25),
    @ES1 int,
    @ES2 int,
    @ES3 int,
    @ES4 int,
    @ES5 int,
    @ES6 int,
    @ES7 int,
    @ES8 int,
    @ES9 int,
    @ES10 int,
    @ES11 int,
    @ES12 int,
    @ES13 int,
    @ES14 int,
    @ES15 int,
    @ES16 int,
    @ES17 int,
    @ES18 int,
    @ES19 int,
    @ES20 int,
    @ES21 int,
    @ES22 int,
    @ES23 int,
    @ES24 int,
    @ES25 int,
    @ES26 int,
    @ES27 int,
    @ES28 int,
    @ES29 int,
    @ES30 int,
    @ES31 int,
    @ES32 int,
    @ES33 int,
    @ES34 int,
    @ES35 int,
    @ES36 int,
    @ES37 int,
    @ES38 int,
    @ES39 int,
    @ES40 int,
    @ES41 int,
    @ES42 int,
    @ES43 int,
    @ES44 int,
    @ES45 int,
    @ES46 int,
    @ES47 int,
    @ES48 int


    DECLARE curDados CURSOR FOR
    select DISTINCT
    EP.PRODUTO,
    P.DESC_PRODUTO,
    EP.COR_PRODUTO,
    PC.DESC_COR_PRODUTO,
    EP.FILIAL,
    EP.ES1,
    EP.ES2,
    EP.ES3,
    EP.ES4,
    EP.ES5,
    EP.ES6,
    EP.ES7,
    EP.ES8,
    EP.ES9,
    EP.ES10,
    EP.ES11,
    EP.ES12,
    EP.ES13,
    EP.ES14,
    EP.ES15,
    EP.ES16,
    EP.ES17,
    EP.ES18,
    EP.ES19,
    EP.ES20,
    EP.ES21,
    EP.ES22,
    EP.ES23,
    EP.ES24,
    EP.ES25,
    EP.ES26,
    EP.ES27,
    EP.ES28,
    EP.ES29,
    EP.ES30,
    EP.ES31,
    EP.ES32,
    EP.ES33,
    EP.ES34,
    EP.ES35,
    EP.ES36,
    EP.ES37,
    EP.ES38,
    EP.ES39,
    EP.ES40,
    EP.ES41,
    EP.ES42,
    EP.ES43,
    EP.ES44,
    EP.ES45,
    EP.ES46,
    EP.ES47,
    EP.ES48
    from 
    PRODUTOS P
    left join ESTOQUE_PRODUTOS EP on EP.PRODUTO = P.PRODUTO
    left join W_LOJA_RESUMO_PRODUTO RP on RP.PRODUTO = P.PRODUTO AND RP.FILIAL = EP.FILIAL AND RP.COR_PRODUTO = EP.COR_PRODUTO
    left join PRODUTOS_TAMANHOS PT on P.GRADE = PT.GRADE
    where 
    P.PRODUTO = 'AD43'
    and PC.cor_produto in ('03123')

    order by 
    EP.PRODUTO, EP.COR_PRODUTO, FILIAL


    -- Abrindo Cursor para leitura
    OPEN curDados

    -- Lendo a próxima linha
    FETCH NEXT FROM curDados INTO @PRODUTO, @DESC_PRODUTO, @COR_PRODUTO, @DESC_COR_PRODUTO, @FILIAL, 
    @ES1, @ES2, @ES3, @ES4, @ES5, @ES6, @ES7, @ES8, @ES9, @ES10, @ES11, @ES12, @ES13, @ES14, @ES15, @ES16, @ES17,
    @ES18,@ES19,@ES20,@ES21,@ES22,@ES23,@ES24,@ES25,@ES26,@ES27,@ES28,@ES29,@ES30,@ES31,@ES32,@ES33,@ES34,@ES35,
    @ES36,@ES37,@ES38,@ES39,@ES40,@ES41,@ES42,@ES43,@ES44,@ES45,@ES46,@ES47,@ES48


    declare @xProduto char(12), @xCorProduto char(10), @i int, @NUMERO_TAMANHOS int, @xVar varchar(10)
    set @xProduto = ''
    set @xCorProduto = ''
    set @i = 0
    set @NUMERO_TAMANHOS = 40
    set @xVar = ''

    -- Percorrendo linhas do cursor (enquanto houverem)
    WHILE @@FETCH_STATUS = 0
    BEGIN

    set @i = 0
    while @NUMERO_TAMANHOS > @i
    begin
    set @i += 1
    set @xVar = '@ES' + cast(@i as varchar(5))

    INSERT INTO @GERA_HTML(
    instrucao

    SELECT
    '<td>' + (ltrim(rtrim(@xVar))) + '</td>
    <td>' + ltrim(rtrim(convert(varchar(10),@ES1))) + '</td>'

    /* Nao que quero ter que fazer o abaixo... Gostaria que o LOOP criase 
    as linhas abaixos pegando o valor do cursor
    <td>' + ltrim(rtrim(convert(varchar(10),@ES1))) + '</td>
    <td>' + ltrim(rtrim(convert(varchar(10),@ES2))) + '</td>
    <td>' + ltrim(rtrim(convert(varchar(10),@ES3))) + '</td>
    <td>' + ltrim(rtrim(convert(varchar(10),@ES4))) + '</td>
    <td>' + ltrim(rtrim(convert(varchar(10),@ES5))) + '</td>
    <td>' + ltrim(rtrim(convert(varchar(10),@ES6))) + '</td>
    <td>' + ltrim(rtrim(convert(varchar(10),@ES7))) + '</td>
    <td>' + ltrim(rtrim(convert(varchar(10),@ES8))) + '</td>
    <td>' + ltrim(rtrim(convert(varchar(10),@ES9))) + '</td>
    <td>' + ltrim(rtrim(convert(varchar(10),@ES10))) + '</td> */


    end

    -- Lendo a próxima linha
    FETCH NEXT FROM curDados INTO @PRODUTO, @DESC_PRODUTO, @COR_PRODUTO, @DESC_COR_PRODUTO, @FILIAL, 
    @ES1, @ES2, @ES3, @ES4, @ES5, @ES6, @ES7, @ES8, @ES9, @ES10, @ES11, @ES12, @ES13, @ES14, @ES15, @ES16, @ES17,
    @ES18,@ES19,@ES20,@ES21,@ES22,@ES23,@ES24,@ES25,@ES26,@ES27,@ES28,@ES29,@ES30,@ES31,@ES32,@ES33,@ES34,@ES35,
    @ES36,@ES37,@ES38,@ES39,@ES40,@ES41,@ES42,@ES43,@ES44,@ES45,@ES46,@ES47,@ES48
    end


    -- Fecha cursor
    CLOSE curDados

    -- Desalocando o cursor
    DEALLOCATE curDados 

     RETURN    
    END    

    GO



    quarta-feira, 11 de fevereiro de 2015 18:29
  • Jeft, segue mais um  script com Unpivot para teste:

    declare @Tabela table 
    (
        ES1 int,  ES2 int,  ES3 int,  ES4 int,  ES5 int,  ES6 int,  ES7 int,  ES8 int,  ES9 int,  ES10 int, 
        ES11 int, ES12 int, ES13 int, ES14 int, ES15 int, ES16 int, ES17 int, ES18 int, ES19 int, ES20 int, 
        ES21 int, ES22 int, ES23 int, ES24 int, ES25 int, ES26 int, ES27 int, ES28 int, ES29 int, ES30 int, 
        ES31 int, ES32 int, ES33 int, ES34 int, ES35 int, ES36 int, ES37 int, ES38 int, ES39 int, ES40 int, 
        ES41 int, ES42 int, ES43 int, ES44 int, ES45 int, ES46 int, ES47 int, ES48 int
    );
    
    insert into @Tabela values
    (
        101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 
        111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
        121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
        131, 132, 133, 134, 135, 136, 137, 138, 139, 140,
        141, 142, 143, 144, 145, 146, 147, 148
    );
    
    with CTE_Unpivot as
    (
        select
            Valor
        from @Tabela
        unpivot
        (
            Valor for Coluna in 
                        (ES1, ES2, ES3, ES4, ES5, ES6, ES7, ES8, ES9, ES10,
                         ES11, ES12, ES13, ES14, ES15, ES16, ES17, ES18, ES19, ES20,
                         ES21, ES22, ES23, ES24, ES25, ES26, ES27, ES28, ES29, ES30,
                         ES31, ES32, ES33, ES34, ES35, ES36, ES37, ES38, ES39, ES40,
                         ES41, ES42, ES43, ES44, ES45, ES46, ES47, ES48)
        ) as u
    )
    
    select
        (SELECT '<td>' + CAST(Valor as varchar(10)) + '</td>'
         FROM CTE_Unpivot
         FOR XML PATH(''), TYPE).value('.', 'varchar(max)')

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 12 de fevereiro de 2015 13:22
  • Boa tarde Jeft,

    Marquei as respostas do gapimex pois as dicas dele parecem ser suficientes para resolver seu problema. Caso não tenha resolvido, desmarque a resposta que continuaremos ajudando ok?

    Obrigado,

    Abraço! 


    Eduardo Romero

    Esse conteudo e fornecido sem garantias de qualquer tipo, seja expressa ou implicita.

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais facil para os outros visitantes encontrarem a resolucao mais tarde.

    sexta-feira, 13 de fevereiro de 2015 17:59