Cálculo Demorado...

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
acelconsultoria
Usuário Nível 3
Usuário Nível 3
Mensagens: 231
Registrado em: 10 Jan 2006 17:05
Localização: Itápolis-SP

Cálculo Demorado...

Mensagem por acelconsultoria »

Amigos do Fórum,

Meu sistema possui relatórios gerenciais de curva ABC. Porém, para gerá-los, o sistema está com uma certa lentidão, ainda mais quando se trata de arquivos grandes.

Eu utilizo o Clipper 5.2e e Blinker 7, com RDD CDX.

Possuo 4 tipos de curva ABC no meu sistema.

1. Curva ABC pelo volume de vendas: ou seja, classifica em ABC os produtos que mais participam quantitativamente nas vendas. Aqui eu sei quais são os produtos que vendem mais ou menos, independente do quanto eles rendem.

2. Curva ABC pela margem de ganho: classifica em ABC os produtos que geram valores financeiros na comparação custo/preço líquido de venda. Aqui eu sei quais são os produtos mais rentáveis.

3. Curva ABC pelo saldo do almoxarife: classifica em ABC os produtos que estão em estoque, e o quanto eles valem individualmente. Aqui, eu sei se meu estoque está valendo mais ou menos, independente da quantidade de produtos estocados, ou seja, às vezes posso ter menos quantidade e mais valor ou posso ter mais quantidade e menos valor, ou, ainda, a combinação dos dois.

4. Curva ABC por cliente: que classifica em ABC a participação dos principais clientes no faturamento periódico da empresa.


A problematização:

Para gerar o 1o. e o 2o. relatório, o sistema leva muito tempo para calcular os dados desejados, atualmente, estou trabalhando na seguinte sequencia:

- Abrir os arquivos a serem utilizados;
- Filtrar o arquivo de vendas pelo período desejado; (acho que deve ser aqui o motivo da lentidão)
- Jogar num arquivo temporário os produtos, com suas quantidades vendidas, custos, preços realizados e a margem de ganho para gerar o relatório.

Por exemplo:
Depois de pegar as datas iniciais e finais do período e armazená-las em IDATA e FDATA respectivamente:

FUNCTION CALC_ABC()
LOCAL XVALOR := 0

*ABRE é uma função para tratamento e abertura de arquivos

ABRE("PRODUTOS") // arq. produtos
ABRE("TABVEN") // tabela de vendas
ABRE("TMP_ABC") // arq. temporário

SELE PRODUTOS
DO WHILE !EOF()
SELE TABEN
SUM TABVEN->QUANTIDADE TO XVALOR FOR;
TABVEN->PRODUTO = PRODUTOS->CODIGO .AND.;
DATA >= IDATA .AND. DATA <= FDATA
IF TABVEN->QUANTIDADE != 0
SELE TMP_ABC
APPEND BLANK
REPLACE PRODUTO WITH PRODUTOS->CODIGO
REPLACE QUANTIDADE WITH XVALOR
ENDIF
SELE PRODUTOS
SKIP ; LOOP
ENDDO

RETURN

- Sei que não está completinho, mas é só pra ter uma idéia como tá funcionando a rotina de cálculo. Se alguém puder ter o saco de ler tudo isso e me dar uma dica, agradeço mesmo!!!
Adm. Maickon Sato
Consultoria e Projetos
-------------------------------------------------------
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

Olá,

Esta sua função me parece bem otimizada já, não tem muito o q mexer mesmo, mas só me tire uma dúvida: pra q jogar em arquivo temporário?
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar do usuário
acelconsultoria
Usuário Nível 3
Usuário Nível 3
Mensagens: 231
Registrado em: 10 Jan 2006 17:05
Localização: Itápolis-SP

Mensagem por acelconsultoria »

Stanis...


Eu jogo num arquivo temporário porque eu utilizo uma função que gera relatório e fornece uma opção de visualizar, imprimir ou exportar para arquivo. Por isso gero um arquivo temporário, pois é esse arquivo que vai para a função.
Adm. Maickon Sato
Consultoria e Projetos
-------------------------------------------------------
Avatar do usuário
C Leonam
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 22 Nov 2005 17:40
Localização: Maceió

Mensagem por C Leonam »

Oi amigo,

Não sei qual a sua estrutura de dados e os seus indices. Mas se no seu TABVEN tiver algum indice que tenha o campo PRODUTO como chave, tente dar um TABVEN->(DBSEEK(PRODUTO)) antes de efetuar o SUM.

Se não tiver o índice crie um com PRODUTO+DTOS(DATA) e faça um DBSEEK também com a DATA só que desta vez lembre de só aceitar datas com vendas ou de usar um SOFTSEEK ON.


:xau
Clp52e, Blinker 5.1
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Va até a sessão codigo fonte e analise o codigo de relatorio que la coloquei.

É um codigo padronizado e bem explicado, com aquela estrutura voce pode criar não só relatorios mas rotinas de calculos em arquivos.

De uma especial atenção para:

Código: Selecionar todos

   /* USAR COM RESUMO */ 
   IF M->RESUMIR 
      M->QUEBRA_1=dtos(DATA) 
      M->SUM_0001=0 
      DO WHILE M->QUEBRA_1=dtos(DATA) // Faz enquanto nao QUEBRA 
            M->SUM_0001=M->SUM_0001+VALOR 
            SKIP 
      ENDDO 
      SKIP -1 
   ENDIF 
No exemplo eu uso um indice com campo data, uso este campo como ponto de quebra, uso esta quebra para parar a contagem de um determinado item e iniciar uma nova contagem.

Se voce usar este método em sua rotina seu tempo de calculo caira drasticamente, pois quando voce evoca o sum, este comando lerá do inicio ao fim da tabela para te dar o resultado e se este comando for evocado cem vezes sua tabela sera lida do inicio ao fim cem vezes, é muito tempo pra esperar.

@braços :?)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
acelconsultoria
Usuário Nível 3
Usuário Nível 3
Mensagens: 231
Registrado em: 10 Jan 2006 17:05
Localização: Itápolis-SP

Mensagem por acelconsultoria »

Obrigado, galera !!!

Rochinha, um amigo daqui do Forum já havia me enviado uma rotina por e-mail, semelhante ao seu raciocínio. Peguei a idéia e adaptei para o meu sistema. Já está tudo blz.

Mas, em suma, é o mesmo raciocínio da rotina que vc postou acima.

Valeu mesmo...
Adm. Maickon Sato
Consultoria e Projetos
-------------------------------------------------------
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Aproveita e me manda uma foto da Sabrina autografado, hehehe...

@braços :?)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem por janio »

Rochinha,

Por que o 'SKIP -1' na sua rotina???


Janio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Veja o raciocionio pois eu também levei tempo pra assimilar:

Neste ponto voce pega uma determinada data, exemplo 20/01/2006
...
M->QUEBRA_1=dtos(DATA)
...

Aqui voce faz com que o laco rode enquanto a quebra for 20/01/2006, soma e salta para o proximo registro
...
DO WHILE M->QUEBRA_1=dtos(DATA) // Faz enquanto nao QUEBRA
M->SUM_0001=M->SUM_0001+VALOR
SKIP
ENDDO
...

Ao salta para o proximo registro, supondo que pegou a data 21/01/2006 o laço é terminado porque a nova data nao é a mesma criticada no laço. Veja que foi dado um SKIP isto que dizer que o registro agora contem outra data.

Se ao sair do loop eu não der um SKIP -1 o laço pode começar no segundo registro no novo conjunto de datas ocasionando um furo.

Analise o restante do código colocado na sessão codigo fonte e voce entenderá melhor.

@braços :?)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder