cancel
Showing results for 
Search instead for 
Did you mean: 

Modelo Curva ABC em Crystal

former_member209021
Active Participant
0 Kudos

Bom dia a todos!

Alguem dispoe de algum modelo de curva ABC no Crystal reports?

Accepted Solutions (0)

Answers (1)

Answers (1)

Former Member
0 Kudos

Olá Wagner, tenho um modelo, talvez possa ajudá-lo.

COMANDO:

SELECT T0.ItemCode as 'Codigo do Produto',
             T2.ItemName as 'Descricao do Produto',
             T0.unitMsr as 'Unid.Medida',
             SUM(T0.Quantity) as 'Quantidade',
             SUM(T0.LineTotal) as 'Valor',
             T3.ItmsGrpNam as 'Familia'
FROM IGE1 T0
INNER JOIN OIGE T1 ON T0.DocEntry = T1.DocEntry
INNER JOIN OITM T2 ON T0.ItemCode = T2.ItemCode
INNER JOIN OITB T3 ON T2.ItmsGrpCod = T3.ItmsGrpCod
AND T1.DocDate BETWEEN {?DataDocIni} AND {?DataDocFin}
GROUP BY T0.ItemCode,T2.ItemName, T0.unitMsr, T3.ItmsGrpNam
ORDER BY 4 DESC

Parâmetros: Data Inicial e Final (DataDocIni e DataDocFin respectivamente).

fbio_bilicki
Active Contributor
0 Kudos

Bom dia,

Eu fiz usando alguns funções do SQL Server 2008, só achei estranho que a função ROWCOUNT_BIG() funciona somente a partir da 2a execução (pressione 2x executar que vai).

Segue abaixo SQL separado em 20%, 30% e 50%

-- SQL Server 2008 - Curva ABC, 20%, 30% e 50%

SELECT

ROW_NUMBER() OVER (ORDER BY Sum(T0.[LineTotal]) DESC) as Seq

, T0.ItemCode

, T1.ItemName

, T1.InvntryUom

, sum(T0.[Quantity]) as Qtde

, sum(T0.[LineTotal]) as ValorTotal 

, ROWCOUNT_BIG() as TotalLinhas

, CASE

     WHEN (ROW_NUMBER() OVER (ORDER BY Sum(T0.[LineTotal]) DESC)) <= ROUND(ROWCOUNT_BIG() * 0.20,0) THEN 'A'

     WHEN (ROW_NUMBER() OVER (ORDER BY Sum(T0.[LineTotal]) DESC)) <= ROUND(ROWCOUNT_BIG() * 0.50,0) THEN 'B'

     ELSE 'C'

   END AS CurvaABC    

FROM IGE1 T0

INNER JOIN OITM T1 ON T0.ItemCode = T1.ItemCode

INNER JOIN OIGE T2 ON T0.DocEntry = T2.DocEntry

WHERE (T2.[DocDate] >=[%0] and T2.[DocDate] <=[%1])

GROUP BY T0.[ItemCode], T1.[ItemName], T1.InvntryUom

Abraço,

Fabio

SAP 8.82 PL8

Former Member
0 Kudos

Olá Fábio,

Executei seu modelo em SAP 8.82 PL05 direto (sem clicar 2x), mas ele apresenta apenas o valor 'C' na coluna CurvaABC, para todos os itens. Já quando executado dentro do Crystal (sem qq mudança no código) ele apresenta os valores A, B e C normalmente, conforme condição testada. Algum problema com o comando CASE, como se as funções internas do SQL não fossem totalmente compatíveis ou completamente ignoradas (no CASE) dentro do B1.

At., Sergio Augusto

fbio_bilicki
Active Contributor
0 Kudos

Boa tarde,

Também estou com o mesmo problema nesse SQL que criei, pra resolver usei somente a função ROW_NUMBER().

SELECT

ROW_NUMBER() OVER (ORDER BY Sum(T0.[LineTotal]) DESC) as Seq

, T0.ItemCode

, T1.ItemName

, T1.InvntryUom

, sum(T0.[Quantity]) as Qtde

, sum(T0.[LineTotal]) as ValorTotal

FROM IGE1 T0

INNER JOIN OITM T1 ON T0.ItemCode = T1.ItemCode

INNER JOIN OIGE T2 ON T0.DocEntry = T2.DocEntry

WHERE (T2.[DocDate] >={?Dataini} and T2.[DocDate] <={?Datafim})

GROUP BY T0.[ItemCode], T1.[ItemName], T1.InvntryUom

ORDER BY Sum(T0.[LineTotal]) DESC

E fiz uma variavel dentro do Crystal Reports usando a formula abaixo (variavel "CurvaABC" )

Local NumberVar CurvaA;

Local NumberVar CurvaB;

Local NumberVar CurvaC;

CurvaA := Int(count({Comando.ItemCode}) * 0.20);

CurvaB := Int(count({Comando.ItemCode}) * 0.30);

CurvaC := count({Comando.ItemCode}) - CurvaA - CurvaB;

IF {Comando.Seq} <= CurvaA then

  'A'

ELSE IF {Comando.Seq} <= (CurvaB+CurvaA) then

  'B'

ELSE

  'C';

Só não consegui quebrar por grupo (estou testando pra isso as "funções personalizadas do relatório" mas até o momento ainda não consegui).

Abraço,

Fabio

SAP 8.82 PL8