Pular para o conteúdo
Visualizando 5 posts - 1 até 5 (de 5 do total)
  • Autor
    Posts
  • #90759
    Shiono
    Participante

      Pessoal estou fazendo uma query que le duas tabelas
      A SB1010 – é a de produtos
      A SYP010 – é a de descricao para importação
      O problema esta no fato do YP_SEQ poder varia de 001 a NNN

      Como eu faço para pegar a informação da tabela SYP010, sem me importar com a quantidade de linhas que virao

      select
      b1.B1_COD AS Codigo_Produto
      ,b1.B1_DESC AS Descricao_Produto
      ,b1.B1_POSIPI AS NCM
      ,rtrim(y1.YP_TEXTO) || ‘, ‘ ||
      rtrim(y2.YP_TEXTO) || ‘, ‘ ||
      rtrim(y3.YP_TEXTO) || ‘, ‘ ||
      rtrim(y4.YP_TEXTO) || ‘, ‘ ||
      rtrim(y5.YP_TEXTO) AS Descricao_LI
      from siga.sb1010 b1
      left join
      siga.syp010 y1
      on B1_DESC_GI = y1.YP_CHAVE
      and y1.YP_SEQ = ‘001’
      left join
      siga.syp010 y2
      on y1.YP_CHAVE = y2.YP_CHAVE
      and y2.YP_SEQ = ‘002’
      left join
      siga.syp010 y3
      on y2.YP_CHAVE = y3.YP_CHAVE
      and y3.YP_SEQ = ‘003’
      left join
      siga.syp010 y4
      on B1_DESC_GI = y4.YP_CHAVE
      and y4.YP_SEQ = ‘004’
      left join
      siga.syp010 y5
      on B1_DESC_GI = y5.YP_CHAVE
      and y5.YP_SEQ = ‘005’
      where b1.D_E_L_E_T_ != ‘*’
      and y1.D_E_L_E_T_ != ‘*’
      and y2.D_E_L_E_T_ != ‘*’
      and y3.D_E_L_E_T_ != ‘*’
      and y4.D_E_L_E_T_ != ‘*’
      and y5.D_E_L_E_T_ != ‘*’
      and b1.b1_import = ‘S’
      and b1.b1_fl != ‘S’
      union
      select
      b1.B1_COD AS Codigo_Produto
      ,b1.B1_DESC AS Descricao_Produto
      ,b1.B1_POSIPI AS NCM
      ,’ ‘ AS Descricao_LI
      from siga.sb1010 b1
      where not exists (select YP_TEXTO from siga.syp010 where b1.B1_DESC_GI = YP_CHAVE)
      and b1.D_E_L_E_T_ != ‘*’
      and b1.b1_import = ‘S’
      and b1.b1_fl != ‘S’
      Order by Codigo_Produto;

      #90764
      burga
      Participante

        Oi Shiono,

        Não sei se entendi direito, você quer uma consulta que retorne todas as descrições sem ter que ficar escrevendo vários joins?

        Se for isso, já tentou fazer com SQL Dinâmico? Se você puder usar PL/SQL seria uma solução.

        🙂

        #90766
        Shiono
        Participante

          Eu ainda estou me adaptando com isto pois, antigamente eu resolveria isto no codigo do programa, mas agora tenho que resolver no banco ainda tomo alguns bailes,

          Se você puder me indicar como eu faço isto da query dinamica eu agradeço, eu posso usar pl/sql

          #90767
          burga
          Participante

            Oi Shiono,

            No SQL dinâmico você executa qualquer comando SQL que pode ser montado em tempo de execução.

            Assim você pode organizar a lógica do procedimento/função pra montar seu SQL em uma String, executar o comando SQL montado e retornar o valor buscado (no caso de ser um SELECT).

            Segue um exemplo:

            DECLARE
            TYPE CUR_TYP IS REF CURSOR;
            c_cursor CUR_TYP;
            fila PAISES%ROWTYPE;
            v_query VARCHAR2(255);
            BEGIN
            v_query := 'SELECT * FROM PAISES';

            OPEN c_cursor FOR v_query;
            LOOP
            FETCH c_cursor INTO fila;
            EXIT WHEN c_cursor%NOTFOUND;
            dbms_output.put_line(fila.DESCRIPCION);
            END LOOP;
            CLOSE c_cursor;
            END;

            Note que
            v_query := 'SELECT * FROM PAISES';
            é o SQL em forma de uma String, que pode ser montada dinamicamente.

            Aí vai o link de onde eu tirei o bloco de código do exemplo e mais outros links que explicam melhor o recurso:
            http://www.devjoker.com/asp/ver_contenidos.aspx?co_contenido=66
            http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96590/adg09dyn.htm
            http://download-uk.oracle.com/docs/cd/B28359_01/appdev.111/b28370/dynamic.htm

            #90771
            Shiono
            Participante

              Muito obrigado vou esudar os links, valeu pela ajuda.

            Visualizando 5 posts - 1 até 5 (de 5 do total)
            • Você deve fazer login para responder a este tópico.