PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 25 → Exemplo Relatório Curva ABC também conhecido como Relatório Regra 80/20 ou Análise de Pareto
Exemplo Relatório Curva ABC também conhecido como Relatório Regra 80/20 ou Análise de Pareto
Iniciado por BOLLER, jan., 07 2020 6:26 PM - 1 resposta
Membro registado
3.651 mensagems
Popularité : +175 (223 votes)
Publicado em janeiro, 07 2020 - 6:26 PM
Exemplo Relatório Curva ABC também conhecido como Relatório Regra 80/20 ou Análise de Pareto

Procedure UI_Curva_ABC_PorAno()

//CURVA ABC OU RELATORIO 80/20

// Saidas dos produtos
//==================//
// A = 75-100% = +25%
// B = 25-75% =+-50%
// C = 0-25% = -25%
//==================//
// Analisar por Qtde
// Analisar por Valor
//==================//

//1 : OK
//2 : Cancelar
gAno is string = ""
//1 : OK
//2 : Cancelar
SWITCH Input("Informe o Ano (0000) do Exercício a ser analisado",gAno)
// OK
CASE 1
nMes is int = 0
LOOP(12)
nMes += 1
UI_Curva_ABC_Processamento(NumToString(nMes,"02.00")+"/"+gAno)
END
// Cancelar
CASE 2
//FIM
END



Procedure UI_Curva_ABC_PorMesAno()

//CURVA ABC OU RELATORIO 80/20

// Saidas dos produtos
//==================//
// A = 75-100% = +25%
// B = 25-75% =+-50%
// C = 0-25% = -25%
//==================//
// Analisar por Qtde
// Analisar por Valor
//==================//

//1 : OK
//2 : Cancelar
gMesAno is string
SWITCH Input("Informe o Ano (0000) do Exercício a ser analisado:",gMesAno)
// OK
CASE 1
UI_Curva_ABC_Processamento(gMesAno)
// Cancelar
CASE 2

END



Procedure UI_Curva_ABC_Processamento(gMesAno)

HourGlass(True)
//zerar valores do abc do mes e ano a ser processado
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

//processar leitura do mes ano a ser processado
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

//atribuicao ao cabecalho de dados
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

//verifica se o cab existe ou nao
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

//atribuicao ao cabecalho de dados
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

//atribui os valores
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//Porc_Qtde
T010_CURVA_ABC.T010_PORC_VALOR = 0//Porc_Valor
T010_CURVA_ABC.T010_TIPO_ES = "E"

IF bAchou = False THEN
HAdd(T010_CURVA_ABC)
ELSE
HModify(T010_CURVA_ABC)
END

END

END

END

//Calcula o maximo
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


//Atribui as porcentagens
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)


-- Script generated by WINDEV on 07/01/2020 14:30:19
-- Tables of SIIS_ANA.wda analysis
-- for Oracle

-- Deleting the T010_CURVA_ABC table
DROP TABLE T010_CURVA_ABC CASCADE CONSTRAINTS ;
-- Creating the T010_CURVA_ABC table
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
Membro registado
3.651 mensagems
Popularité : +175 (223 votes)
Publicado em janeiro, 07 2020 - 7:38 PM
//Busca com HBuildKeyValue

HReset(F029_CURVA_ABC)
bAchou is boolean
BufBuscaValor is Buffer = HBuildKeyValue(F029_CURVA_ABC,F029_UNICO,F008_APS_NFE_ITENS.F008_ID_PRODUTO,Middle(F007_APS_NFE.F007_DT_ENTRADA,5,2) +"/"+ Middle(F007_APS_NFE.F007_DT_ENTRADA,1,4),F008_APS_NFE_ITENS.F008_UND_PROD_ESTOQUE)
IF HReadSeek(F029_CURVA_ABC,F029_UNICO,BufBuscaValor,hIdentical) = False THEN
bAchou = False
ELSE
bAchou = True
END


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/