Siga-nos no Facebook Siga-nos no Instagram Siga-nos no LinkedIn Venha estudar Protheus
 
Bem Vindo Visitante Lista de Usuários

 Todos os Fórums
  Base de Dados

Enviar para a impressoraImprimir   

Subject Select para SG1010
Mensagem do Enviar e-mail Abrir o Perfil do usu�rio LUZCORJR LUZCORJR em 25/02/2019 as 07:33 hs
Local: SP   Membro desde: 22/01/2019  Postagem: 1
Ol Pessoal. Algum tem um select que visualize em SG1010 a estrutura de um item linha por linha?
Quero um SELECT que me traga todos os itens filhos, netos, bisnetos de um item de venda, organizados conforme v-se na tela de consulta de ESTRUTURA (ao entrar para editar a estrutura).
A idia um select que me traga em nveis os pais, filhos, netos, bisnetos, etc...conforme se v na edio da estrutura de itens.
Um Exemplo:

Nvel codigo Item                      Qtde
0001 123456 ARMRIO TESTE             1
0002 777755     BASE MAL.SUPERIOR     1
0003 888881        MDF               0,5
0002 777756     BASE MAL.INFERIOR     1
0003 888881        MDF               0,5
0002 777757     BASE GAV.SUPERIOR     1
0003 888881        MDF               0,5

Neste exemplo temos o nvel 00001 que o Produto de Venda, seguido do nvel 0002 (itens filhos do ARMRIO TESTE: contendo 3 elementos - BASE MAL.SUPERIOR, BASE MAL.INFERIOR e BASE GAV.SUPERIOR), e em seguida temos o nvel 0003 (contendo 3 elementos, sendo o MDF, este filho de BASE MAL.SUPERIOR, BASE MAL.INFERIOR e BASE GAV.SUPERIOR).
A minha dificuldade por eles neste layout, ou seja, nvel 0002 aps o 0001 e nvel 0003 aps o 0002, e se houver um nvel 0004, 0005, 0006, etc...quero tambm inser-los conforme sua hierarquia dentro da sua estrutura.

Desde j grato.

Mensagem do Enviar e-mail Abrir o Perfil do usu�rio RAMPAGER RAMPAGER em 25/02/2019 as 09:42 hs
Local: PR   Membro desde: 17/08/2006  Postagem: 6
Opa,
Segue uma query que eu utilizo para a mesma finalidade (SqlServer).
Deve ser informada uma data de referencia, para saber se o item est ativo ou no na estrutura de acordo com a data de inicio e fim dele no cadastro e tambm o cdigo do produto pai.

WITH NIVEIS AS (
-- Membro ncora
SELECT
CASE WHEN '20190225' BETWEEN G1_INI AND G1_FIM THEN 'S' ELSE 'N' END AS ATIVO,
RTRIM(G1_COD) AS G1_COD , RTRIM(G1_COMP) AS G1_COMP , CAST(1 AS FLOAT) AS QTDE_PAI, G1_QUANT, G1_QUANT*1 AS QTDE_MULT, G1_INI, G1_FIM, SG1010.D_E_L_E_T_ AS DELET,
CAST(RTRIM(G1_COMP) AS VARCHAR(255)) AS Path,
1 AS NIVEL -- nvel 0
FROM SG1010
WHERE G1_COD ='000100006'
AND SG1010.D_E_L_E_T_ <> '*'
UNION ALL
-- Filhos
SELECT
NIVEIS.ATIVO AS ATIVO,
Rtrim(F.G1_COD) as G1_COD , RTRIM(F.G1_COMP) AS G1_COMP , NIVEIS.G1_QUANT AS QTDE_PAI, F.G1_QUANT, F.G1_QUANT * NIVEIS.G1_QUANT AS QTDE_MULT, F.G1_INI, F.G1_FIM, F.D_E_L_E_T_ AS DELET,
CAST(Path + '.' + CAST(RTRIM(F.G1_COMP) AS VARCHAR(255)) AS VARCHAR(255)),
NIVEL+1 -- demais nveis
FROM SG1010 F
INNER JOIN NIVEIS ON RTRIM(F.G1_COD) = RTRIM(NIVEIS.G1_COMP)
WHERE F.D_E_L_E_T_ <> '*'
)
SELECT ATIVO, Replicate(' ', (NIVEL-1) * 7)+'------>' as NIV, DELET,
CASE WHEN NIVEL = 1 THEN RTRIM(G1_COMP) ELSE rtrim(G1_COD) END AS COD_ORDER,
CAST(G1_INI AS SMALLDATETIME) AS DATA_INI, CAST(G1_FIM AS SMALLDATETIME) AS DATA_FIM,
rtrim(G1_COD) AS COD_PAI, RTRIM(G1_COMP) AS COD_ITEM, RTRIM(B1_COD_CLI) AS COD_CLI,
RTRIM(B1_DESC) AS PRODUTO,
QTDE_PAI, G1_QUANT AS QTDE_ESTRUTURA, QTDE_MULT, NIVEL , Path
FROM NIVEIS INNER JOIN SB1010 ON B1_COD = G1_COMP AND SB1010.D_E_L_E_T_ <> '*'
ORDER BY Path, COD_ORDER, NIVEL, COD_PAI, COD_ITEM




Espero ter ajudado
Att
Juliano

Mensagem do Enviar e-mail Abrir o Perfil do usu�rio JOSINEY JOSINEY em 27/02/2019 as 09:46 hs
Local: MT   Membro desde: 26/10/2007  Postagem: 13
Bom dia

Nos desenvolvemos essa procedure abaixo para fazer isso.

Porm aqui utilizamos o processo de opcionais, que se vc no o utiliza vc vai ter que ajustar.

Aqui tambem no verifique a validade do produto na estrutura o que o Julioano acima fala, o qual vamos implementar nessa procedure em breve.

USE [PROTHEUS]
GO
/****** Object: StoredProcedure [dbo].[SP_ESTRUT_PRODUTO]    Script Date: 27/02/2019 07:56:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[SP_ESTRUT_PRODUTO]
@cCodProd VARCHAR(15),
@cGrupOpc VARCHAR(300),
@cOpc VARCHAR(320),
@nQuant float
AS
BEGIN

     CREATE TABLE #TABAUX01 (
     G1_COD1 VARCHAR(15),
     G1_COMP1 VARCHAR(15),
     G1_QUANT1 FLOAT,
     G1_GROPC1 VARCHAR(3),
     G1_OPC1 VARCHAR(4),
     RECNO1 INT
     );

     CREATE TABLE #TABAUX02 (
     G1_COD2 VARCHAR(15),
     G1_COMP2 VARCHAR(15),
     G1_QUANT2 FLOAT,
     G1_GROPC2 VARCHAR(3),
     G1_OPC2 VARCHAR(4),
     RECNO2 INT
     );

     CREATE TABLE #TABAUX03 (
     [G1_COD3] [varchar](15) ,
     [G1_QUANT3] [float] ,
     [G1_GROPC3] [varchar](3) ,
     [G1_OPC3] [varchar](4) ,
     RECNO3 INT
     );

     CREATE TABLE #TABAUX4 (
     GRUPO VARCHAR(3) collate Latin1_General_BIN )

     CREATE TABLE #TABAUX5 (
     OPC VARCHAR(4) collate Latin1_General_BIN);

     declare @nX int = 1;
     declare @nTam int;
     declare @cCod varchar(4);
     declare @cLetra char(1);
     set @nTam = len(lTrim(rTrim(@cGrupOpc)));
     set @cCod = ''
     while @nX <= @nTam
     begin
          set @cLetra = SUBSTRING(@cGrupOpc,@nX,1)
          if @cLetra <> '/' and @cLetra <> ' '
          begin
               set @cCod += @cLetra;
          end
          else
          begin
               insert into #TABAUX4 values (@cCod);
               set @cCod = '';
          end
          set @nX += 1;
     end
     insert into #TABAUX4 values (@cCod);
     set @cCod = '';
     insert into #TABAUX4 values (@cCod);

     set @nX = 1
     set @nTam = len(lTrim(rTrim(@cOpc)));
     set @cCod = ''
     while @nX <= @nTam
     begin
          set @cLetra = SUBSTRING(@cOpc,@nX,1);
          if @cLetra <> '/' and @cLetra <> ' '
          begin
               set @cCod += @cLetra;
          end
          else
          begin
               print @cCod;
               insert into #TABAUX5 values(@cCod);
               set @cCod = '';
          end
          set @nX += 1;
     end
     insert into #TABAUX5 values(@cCod);
     set @cCod = '';
     insert into #TABAUX5 values(@cCod);

     declare     @g1_cod varchar(15),
               @g1_comp varchar(15),
               @g1_quant float,
               @g1_gropc varchar(3),
               @g1_opc varchar(4),
               @cContinua char(1),
               @recno int,
               @G1_COD1 VARCHAR(15),
               @G1_COMP1 VARCHAR(15),
               @G1_QUANT1 FLOAT,
               @G1_GROPC1 VARCHAR(3),
               @G1_OPC1 VARCHAR(4),
               @RECNO1 INT,
               @G1_COD2 VARCHAR(15),
               @G1_COMP2 VARCHAR(15),
               @G1_QUANT2 FLOAT,
               @G1_GROPC2 VARCHAR(3),
               @G1_OPC2 VARCHAR(4),
               @RECNO2 INT;


     insert into #TABAUX01
        (G1_COD1,
          G1_COMP1,
          G1_QUANT1,
          G1_GROPC1,
          G1_OPC1,
          RECNO1
          )
     SELECT     A.G1_COD,
               A.G1_COMP,
               A.G1_QUANT,
               A.G1_GROPC,
               A.G1_OPC,
               A.R_E_C_N_O_
     FROM     SG1030 A
               JOIN SB1030 B     ON ( B.B1_COD = A.G1_COD
                                         AND B.D_E_L_E_T_ = '')
               JOIN SB1030 C     ON ( C.B1_COD = A.G1_COMP
                                         AND C.D_E_L_E_T_ = '')
     WHERE     A.D_E_L_E_T_ = ''
               AND LTRIM(RTRIM(A.G1_COD)) = LTRIM(RTRIM(@cCodProd))
               AND (LTRIM(RTRIM(A.G1_GROPC)) IN (SELECT DISTINCT GRUPO FROM #TABAUX4) )
               AND (LTRIM(RTRIM(A.G1_OPC)) IN (SELECT DISTINCT OPC FROM #TABAUX5))
               AND C.B1_FANTASM <> 'S'
               AND C.B1_TIPO IN ('PA','PI','PP');
     print @cOpc;
     declare c1 cursor for
     SELECT     G1_COD1,
               G1_COMP1,
               G1_QUANT1,
               G1_GROPC1,
               G1_OPC1,
               RECNO1
     FROM     #TABAUX01;
     open c1;
     fetch next from c1 into     @g1_cod,
                                   @g1_comp,
                                   @g1_quant,
                                   @g1_gropc,
                                   @g1_opc,
                                   @recno;

          insert into #TABAUX03          
          (G1_COD3,
           G1_QUANT3,
           RECNO3)
          values
          (@g1_cod,
           @nQuant,
           @recno );

     while @@FETCH_STATUS = 0
     begin
          insert into #TABAUX03          
          (G1_COD3,
           G1_QUANT3,
           G1_GROPC3,
           G1_OPC3,
           RECNO3)
           values
          (@g1_comp,
           @g1_quant * @nQuant,
           @g1_gropc,
           @g1_opc,
           @recno);

          insert into #TABAUX02
          (G1_COD2,
           G1_COMP2,
           G1_QUANT2,
           G1_GROPC2,
           G1_OPC2,
           RECNO2
          )
          SELECT     A.G1_COD,
                    A.G1_COMP,
                    A.G1_QUANT,
                    A.G1_GROPC,
                    A.G1_OPC,
                    A.R_E_C_N_O_               
          FROM     SG1030 A
                    JOIN SB1030 B     ON (B.B1_COD = A.G1_COMP
                                             AND B.D_E_L_E_T_ = '')
          WHERE     A.D_E_L_E_T_ = ''
                    AND A.G1_COD = @g1_comp
                    AND (LTRIM(RTRIM(A.G1_GROPC)) IN (SELECT DISTINCT GRUPO FROM #TABAUX4))
                    AND (LTRIM(RTRIM(A.G1_OPC)) IN (SELECT DISTINCT OPC FROM #TABAUX5))
                    AND B.B1_FANTASM <> 'S'
                    AND B.B1_TIPO IN ('PA','PI','PP')

          declare c2 cursor for
          SELECT     DISTINCT C.G1_COD2,
                    C.G1_COMP2,
                    C.G1_QUANT2,
                    C.G1_GROPC2,
                    C.G1_OPC2,
                    C.RECNO2
          FROM     #TABAUX02 C
          open c2;
          fetch next from c2 into     @G1_COD2,
                                        @G1_COMP2,
                                        @G1_QUANT2,
                                        @G1_GROPC2,
                                        @G1_OPC2,
                                        @RECNO2;
          while @@FETCH_STATUS = 0
          begin
               insert into #TABAUX01
               (G1_COD1,
                G1_COMP1,
                G1_QUANT1,
                G1_GROPC1,
                G1_OPC1,
                RECNO1
               )
               values
               (@G1_COD2,
                @G1_COMP2,
                @G1_QUANT2,
                @G1_GROPC2,
                @G1_OPC2,
                @RECNO2
               );

               fetch next from c2 into     @G1_COD2,
                                             @G1_COMP2,
                                             @G1_QUANT2,
                                             @G1_GROPC2,
                                             @G1_OPC2,
                                             @RECNO2;
          end
          close c2;
          deallocate c2;
          delete from #TABAUX02;

          fetch next from c1 into     @g1_cod,
                                        @g1_comp,
                                        @g1_quant,
                                        @g1_gropc,
                                        @g1_opc,
                                        @recno;
     end
     close c1;
     deallocate c1;

     SELECT     X3.G1_COD3,
               X3.G1_GROPC3,
               X3.G1_OPC3,
               SUM(X3.G1_QUANT3) G1_QUANT3
     FROM     #TABAUX03 X3
     GROUP BY     X3.G1_COD3,
                    X3.G1_GROPC3,
                    X3.G1_OPC3
                    
     drop table #TABAUX01;
     drop table #TABAUX02;
     drop table #TABAUX03;
     drop table #TABAUX4;
     drop table #TABAUX5;
     
END

Mensagem do Enviar e-mail Abrir o Perfil do usu�rio KANAAMLRR KANAAMLRR em 27/02/2019 as 10:36 hs
Local: SP   Membro desde: 21/09/2010  Postagem: 212
Voc pode tentar assim:

WITH CTE (G1_COD, G1_COMP, NIVEL, G1_QUANT)
AS (

SELECT G1_COD, G1_COMP, G1_NIV AS NIVEL, G1_QUANT*1000 AS G1_QUANT
FROM SG1080 SG1 WHERE D_E_L_E_T_ <> '*' AND G1_FILIAL = '01' AND G1_COD = 'PRODUTO001'

UNION ALL
SELECT SG1.G1_COD, SG1.G1_COMP, G1_NIV AS NIVEL, SG1.G1_QUANT*C.G1_QUANT
FROM SG1080 SG1 INNER JOIN CTE C ON SG1.G1_COD = C.G1_COMP
WHERE D_E_L_E_T_ <> '*' AND G1_FILIAL = '01'

)

SELECT * FROM CTE

At.,
Kanam L. R. Rodrigues.

Para participar do Fórum você precisa efetuar login primeiro
Caso você não esteja registrado registre-se para participar do fórum

 Mudar para Fórum