Exemplo Relatório Curva ABC também conhecido como Relatório Regra 80/20 ou Análise de Pareto
Procedure UI_Curva_ABC_PorAno()
gAno is string = ""
SWITCH Input("Informe o Ano (0000) do Exercício a ser analisado",gAno)
CASE 1
nMes is int = 0
LOOP(12)
nMes += 1
UI_Curva_ABC_Processamento(NumToString(nMes,"02.00")+"/"+gAno)
END
CASE 2
END
Procedure UI_Curva_ABC_PorMesAno()
gMesAno is string
SWITCH Input("Informe o Ano (0000) do Exercício a ser analisado:",gMesAno)
CASE 1
UI_Curva_ABC_Processamento(gMesAno)
CASE 2
END
Procedure UI_Curva_ABC_Processamento(gMesAno)
HourGlass(True)
FOR EACH T010_CURVA_ABC
IF T010_CURVA_ABC.T010_MES_ANO_MOVI = gMesAno
T010_CURVA_ABC.T010_QTDE = 0
T010_CURVA_ABC.T010_VALOR = 0
T010_CURVA_ABC.T010_PORC_QTDE = 0
T010_CURVA_ABC.T010_PORC_VALOR = 0
T010_CURVA_ABC.T010_ABC_QTDE = ""
T010_CURVA_ABC.T010_ABC_VLR = ""
HModify(T010_CURVA_ABC)
END
END
FOR EACH F008_APS_NFE_ITENS
HReset(F007_APS_NFE)
IF HReadSeek(F007_APS_NFE,F007_ID_NFE,F008_APS_NFE_ITENS.F008_ID_NFE,hIdentical) = True
IF Middle(F007_APS_NFE.F007_DT_ENTRADA,5,2) +"/"+ Middle(F007_APS_NFE.F007_DT_ENTRADA,1,4) = gMesAno
T010_CURVA_ABC.T010_MES_ANO_MOVI =Middle(F007_APS_NFE.F007_DT_ENTRADA,5,2) +"/"+ Middle(F007_APS_NFE.F007_DT_ENTRADA,1,4)
T010_CURVA_ABC.F003_PROD_ID =F008_APS_NFE_ITENS.F008_ID_PRODUTO
T010_CURVA_ABC.T010_NOME_COMERCIAL=F008_APS_NFE_ITENS.F008_NOME_COMERCIAL
T010_CURVA_ABC.T010_UND_ESTOQUE =F008_APS_NFE_ITENS.F008_UND_PROD_ESTOQUE
HReset(T010_CURVA_ABC)
bAchou is boolean
BufBuscaValor is Buffer = HBuildKeyValue(T010_CURVA_ABC,T010_UNICO,F008_APS_NFE_ITENS.F008_ID_PRODUTO,F008_APS_NFE_ITENS.F008_NOME_COMERCIAL,F008_APS_NFE_ITENS.F008_UND_PROD_ESTOQUE)
IF HReadSeek(T010_CURVA_ABC,T010_UNICO,BufBuscaValor,hIdentical) = False THEN
bAchou = False
ELSE
bAchou = True
END
T010_CURVA_ABC.T010_MES_ANO_MOVI =Middle(F007_APS_NFE.F007_DT_ENTRADA,5,2) +"/"+ Middle(F007_APS_NFE.F007_DT_ENTRADA,1,4)
T010_CURVA_ABC.F003_PROD_ID =F008_APS_NFE_ITENS.F008_ID_PRODUTO
T010_CURVA_ABC.T010_NOME_COMERCIAL=F008_APS_NFE_ITENS.F008_NOME_COMERCIAL
T010_CURVA_ABC.T010_UND_ESTOQUE =F008_APS_NFE_ITENS.F008_UND_PROD_ESTOQUE
T010_CURVA_ABC.T010_QTDE += F008_APS_NFE_ITENS.F008_QTDE_PROD_ESTOQUE
T010_CURVA_ABC.T010_VALOR += F008_APS_NFE_ITENS.F008_VLR_UNIT_PROD_ESTOQUE
T010_CURVA_ABC.T010_PORC_QTDE = 0
T010_CURVA_ABC.T010_PORC_VALOR = 0
T010_CURVA_ABC.T010_TIPO_ES = "E"
IF bAchou = False THEN
HAdd(T010_CURVA_ABC)
ELSE
HModify(T010_CURVA_ABC)
END
END
END
END
rMaximoQtde is real
rMaximoVlr is real
FOR EACH T010_CURVA_ABC
IF T010_CURVA_ABC.T010_MES_ANO_MOVI = gMesAno
IF T010_CURVA_ABC.T010_QTDE > rMaximoQtde THEN
rMaximoQtde = T010_CURVA_ABC.T010_QTDE
END
IF T010_CURVA_ABC.T010_VALOR > rMaximoVlr THEN
rMaximoVlr = T010_CURVA_ABC.T010_VALOR
END
END
END
FOR EACH T010_CURVA_ABC
IF T010_CURVA_ABC.T010_MES_ANO_MOVI = gMesAno THEN
T010_CURVA_ABC.T010_PORC_QTDE = (T010_CURVA_ABC.T010_QTDE * 100) / rMaximoQtde
T010_CURVA_ABC.T010_PORC_VALOR = (T010_CURVA_ABC.T010_VALOR * 100) / rMaximoVlr
IF T010_CURVA_ABC.T010_PORC_QTDE <= 25 THEN
T010_CURVA_ABC.T010_ABC_QTDE = "C"
ELSE IF T010_CURVA_ABC.T010_PORC_QTDE > 25 AND T010_CURVA_ABC.T010_PORC_QTDE <= 75
T010_CURVA_ABC.T010_ABC_QTDE = "B"
ELSE IF T010_CURVA_ABC.T010_PORC_QTDE > 75
T010_CURVA_ABC.T010_ABC_QTDE = "A"
END
IF T010_CURVA_ABC.T010_PORC_VALOR <= 25 THEN
T010_CURVA_ABC.T010_ABC_VLR = "C"
ELSE IF T010_CURVA_ABC.T010_PORC_VALOR > 25 AND T010_CURVA_ABC.T010_PORC_VALOR < 75
T010_CURVA_ABC.T010_ABC_VLR = "B"
ELSE IF T010_CURVA_ABC.T010_PORC_VALOR >= 75
T010_CURVA_ABC.T010_ABC_VLR = "A"
END
HModify(T010_CURVA_ABC)
END
END
HourGlass(False)
DROP TABLE T010_CURVA_ABC CASCADE CONSTRAINTS ;
CREATE TABLE T010_CURVA_ABC (
F003_PROD_ID NUMERIC(19,0) Default 0,
T010_NOME_COMERCIAL VARCHAR2(550) ,
T010_MES_ANO_MOVI VARCHAR2(7) ,
T010_QTDE NUMERIC(38,6) Default 0,
T010_VALOR NUMERIC(38,6) Default 0,
T010_PORC_QTDE NUMERIC(38,6) Default 0,
T010_PORC_VALOR NUMERIC(38,6) Default 0,
T010_ABC_QTDE VARCHAR2(1) ,
T010_UND_ESTOQUE VARCHAR2(20) ,
T010_TIPO_ES VARCHAR2(1) ,
T010_ABC_VLR VARCHAR2(1) );
CREATE INDEX WDIDX_T010_CURVA_ABC_F00300000 ON T010_CURVA_ABC (F003_PROD_ID);
CREATE INDEX WDIDX_T010_CURVA_ABC_F02900001 ON T010_CURVA_ABC (T010_NOME_COMERCIAL);
CREATE INDEX WDIDX_T010_CURVA_ABC_F02900002 ON T010_CURVA_ABC (T010_MES_ANO_MOVI);
CREATE INDEX WDIDX_T010_CURVA_ABC_T010_QTDE ON T010_CURVA_ABC (T010_QTDE);
CREATE INDEX WDIDX_T010_CURVA_ABC_F02900003 ON T010_CURVA_ABC (T010_VALOR);
CREATE INDEX WDIDX_T010_CURVA_ABC_F02900004 ON T010_CURVA_ABC (T010_PORC_QTDE);
CREATE INDEX WDIDX_T010_CURVA_ABC_F02900005 ON T010_CURVA_ABC (T010_PORC_VALOR);
CREATE INDEX WDIDX_T010_CURVA_ABC_F02900006 ON T010_CURVA_ABC (T010_ABC_QTDE);
CREATE INDEX WDIDX_T010_CURVA_ABC_F02900007 ON T010_CURVA_ABC (T010_UND_ESTOQUE);
CREATE INDEX WDIDX_T010_CURVA_ABC_F02900008 ON T010_CURVA_ABC (T010_TIPO_ES);
CREATE INDEX WDIDX_T010_CURVA_ABC_F02900009 ON T010_CURVA_ABC (T010_ABC_VLR);
CREATE INDEX WDIDX_T010_CURVA_ABC_F02900010 ON T010_CURVA_ABC (F003_PROD_ID,T010_MES_ANO_MOVI,T010_UND_ESTOQUE);
Existe várias formas de fazer ou usando uma tabela temporária ou um array multidimensional, vai do gosto!!!
--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/Mensagem modificada, janeiro, 07 2020 - 6:43 PM