Imprimir uma loja ou todas

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
Anderson J. Freitas
Usuário Nível 1
Usuário Nível 1
Mensagens: 46
Registrado em: 19 Fev 2005 10:34
Localização: Caratinga-MG

Imprimir uma loja ou todas

Mensagem por Anderson J. Freitas »

Olá,

Estou montando um relatório com base nos dados abaixo :

Código: Selecionar todos

loja codigo quantidade
01   00002             10
02   00002             20
03   00002             30
Se digitar loja='02', será impresso :

Código: Selecionar todos

loja codigo quantidade
02   00002             20
Até aqui tudo bem, porém eu gostaria de fazer o seguinte : digitar loja='99' (não tem no banco de dados) e imprimir o somatório de todas as lojas. Assim :

Código: Selecionar todos

loja codigo quantidade
99   00002             60
Eu até consegui usando setscope, criando dois índices (loja+codigo)(codigo) e um arquivo temporário (CMV). Mas existem outros 50 relatórios semelhantes e não estava querendo criar dois índices ou arquivos temporários. Tem outro jeito ?

Parte do relatório :

Código: Selecionar todos

    mloja='99'
    mdata := mdataf := date()
   @ 15,11 say 'Loja     ¦ ' get mloja
   @ 16,11 say 'Periodo  ¦ ' get mdata
   @ 16,col()+1 get mdataf valid lastkey() = K_UP .or. mdataf >= mdata
   read
    select ep200504
    if mloja='99'
       sx_settag('L')     //ordem de codigo+dtos(data)
       sx_setscope(0,qcodigo+dtos(mdata))
       sx_setscope(1,qcodigo+dtos(mdataf))
    else
       sx_settag('D')     //ordem de loja+codigo+dtos(data)
       sx_setscope(0,mloja+qcodigo+dtos(mdata))
       sx_setscope(1,mloja+qcodigo+dtos(mdataf))
    endif
    go top
    do while !eof()
       @18,11 say loja+' '+dtoc(data)+' '+nota+' '+codigo
       mquant = quant
       if mquant > 0
          select cmv    //arquivo temporário
          seek qcodigo
          if !found()
             adireg(0)
          endif
          reglock(0)
          replace loja with mloja,codigo with qcodigo,quant with mquant
          select ep200504
       endif
       skip
    enddo
Pitbull

Clipper 5.2e, Exospace, Six2, DBMax
Avatar do usuário
Anderson J. Freitas
Usuário Nível 1
Usuário Nível 1
Mensagens: 46
Registrado em: 19 Fev 2005 10:34
Localização: Caratinga-MG

Mensagem por Anderson J. Freitas »

Sem respostas... E eu até estava gostando daqui!

:(
Pitbull

Clipper 5.2e, Exospace, Six2, DBMax
ROMARIO
Usuário Nível 1
Usuário Nível 1
Mensagens: 35
Registrado em: 06 Jul 2004 11:25
Localização: AGUDO - RS

Mensagem por ROMARIO »

Calma Dr. Anderson !!

O mais difícil já foi feito.

If loja == "99"
Rotina que soma todos os produtos... etc...
Imprime....
Endif.

Para fazer a soma use o DBEval() que percorre o arquivo uma unica vez. è bem rápido.
Dê uma olhada no ajuda do Clipper (NG)

Abraços

Romario
Avatar do usuário
Anderson J. Freitas
Usuário Nível 1
Usuário Nível 1
Mensagens: 46
Registrado em: 19 Fev 2005 10:34
Localização: Caratinga-MG

Mensagem por Anderson J. Freitas »

Caro Romário!

Agradeço de coração a ajuda, pois já estava pensando em ir para outra "praia".

A ajuda é boa, porém não existe a loja "99". É como se o campo loja ficasse em branco, então irá somar todos os itens, se não ficar, somar somente os da loja informada.

Talvez por isso não ser muito claro não obtive resposta.

O banco de dados é igualzinho ao exposto no ínicio do tópico, viu ? Não existe a loja "99". Como disse, não queria ter que criar outro índice sem o campo loja ou arquivos temporários. Tente usar :

Código: Selecionar todos

sx_setscope(0,'01'+codigo)
sx_setscope(0,'03'+codigo)
Mas não funcionou. Com set filter funcionou mas ficou lento.
Pitbull

Clipper 5.2e, Exospace, Six2, DBMax
ROMARIO
Usuário Nível 1
Usuário Nível 1
Mensagens: 35
Registrado em: 06 Jul 2004 11:25
Localização: AGUDO - RS

Mensagem por ROMARIO »

Caro Anderson !

Eu faço mais ou menos assim:

Quando quero imprimir tudo crio uma variável onde entro com o código "99"., ou uma função específica para imprimir tudo(tipo se for uma barra de menu: (Imprimir loja 01, Imprimir loja 02, Imprimir todas).
Se for via código da loja:

Do while seucodigo <> 99..

Vai tentando, tentando até que dá certo. O melhor é você mesmo achar um jeito de fazer as coisas. Aí quando aprendido tá bem aprendido. Nunca mais tu esquece. Mas se não tiver jeito me mande o teu e-mail que te mando um exemplinho, pra te ajudar.

Um abraço Tche.

Romario
Avatar do usuário
Anderson J. Freitas
Usuário Nível 1
Usuário Nível 1
Mensagens: 46
Registrado em: 19 Fev 2005 10:34
Localização: Caratinga-MG

Mensagem por Anderson J. Freitas »

Está muito lento, mas funcionado. Tem como melhorar ?

Código: Selecionar todos

#include 'sixnsx.ch'
rddsetdefault('sixnsx')
clear
set date french
set cent on
set score off
set epoch to 1980
wlojaf := wlojai :=space(2)
wdatai := wdataf :=date()
@10,20 get wlojai
@10,col()+1 get wlojaf
@11,20 get wdatai
@11,col()+1 get wdataf
read
path = 'f:\ols\teste\'
wvetorarq = vetorperio(wdatai,wdataf)
wnumelem = len(wvetorarq)
wevetorsel = {}
for x = 1 to wnumelem
    newabremov('S',wvetorarq[x],.f.,path)
    aadd(wevetorsel,select())
next
plin2 := plin := 1
new_abre('item',path,.f.,'gif')
go top
do while !eof()
   qcodigo = codigo
   qquant = 0
   for xvez = 1 to wnumelem
       select(wevetorsel[xvez])
       sx_settag('D')
       sx_setscope(0,wlojai)
       sx_setscope(1,wlojaf)
       set filter to qcodigo=codigo
       go top
       do while !eof()
          if data>=wdatai .and. data<=wdataf
             @plin2,45 say loja+' '+codigo+' '+str(quant,8)+' '+dtoc(data)
             plin2++
             qquant+= quant
          endif
          if plin2 > 21
             inkey(0)
             plin2=1
          endif
          skip
       enddo
       sx_clrscope(0)
       sx_clrscope(1)
       @ plin,2 say qcodigo+' '+str(qquant,10)
       plin++
       if plin > 21
          inkey(0)
          plin=1
       endif
   next
   select item
   skip
enddo

function vetorperio(vinicio,vfim,vshow)
*-------
local ret:={},vloop:=pdmes(vinicio),vptela,vplin
do while vloop <= pdmes(vfim)
   aadd(ret,strzero(year(vloop),4,0)+strzero(month(vloop),2,0))
   vloop := udmes(vloop)+1
enddo
return ret

function newabremov(namtipo,namanomes,nammodo,namdir)
*-------
namarq = namtipo+'P'+namanomes
ret = 1
if file(namdir+namarq+'.gif')
   ret = 0
   new_abre(namarq,namdir,nammodo,'gif')
endif
return ret
Pitbull

Clipper 5.2e, Exospace, Six2, DBMax
Avatar do usuário
Anderson J. Freitas
Usuário Nível 1
Usuário Nível 1
Mensagens: 46
Registrado em: 19 Fev 2005 10:34
Localização: Caratinga-MG

Mensagem por Anderson J. Freitas »

Como ninguém responde, respondo eu mesmo.


Tem como melhorar e muito....

Código: Selecionar todos


#include 'sixnsx.ch' 
rddsetdefault('sixnsx') 
clear 
set date french 
set cent on 
set score off 
set epoch to 1980 
wlojaf := wlojai :=space(2) 
wdatai := wdataf :=date() 
@10,20 get wlojai 
@10,col()+1 get wlojaf 
@11,20 get wdatai 
@11,col()+1 get wdataf 
read 
path = 'f:\ols\teste\' 
wvetorarq = vetorperio(wdatai,wdataf) 
wnumelem = len(wvetorarq) 
wevetorsel = {} 
for x = 1 to wnumelem 
    newabremov('S',wvetorarq[x],.f.,path) 
    aadd(wevetorsel,select()) 
next 
plin2 := plin := 1 
new_abre('loja',path,.f.,'gif')
new_abre('item',path,.f.,'gif') 
go top 
do while !eof() 
    qcodigo = codigo 
    qquant = 0 
    select loja
    loja->(sx_setscope(0,wlojai))
    loja->(sx_setscope(1,wlojaf))
    go top
    do while !eof()
        for xvez = 1 to wnumelem 
             select(wevetorsel[xvez]) 
             sx_settag('D') 
             sx_setscope(0,loja->codigo+qcodigo)
             sx_setscope(1,loja->codigo+qcodigo)
             go top
             dbeval({||qquant+= quant},{||data>=wdatai .and. data<=wdataf})
             sx_clrscope(0)
             sx_clrscope(1)
             @ plin,2 say qcodigo+' '+str(qquant,10) 
             plin++ 
             if plin > 21 
                inkey(0) 
                plin=1 
             endif 
        next 
        select loja
        skip 
    enddo 
    loja->(sx_clrscope(0))
    loja->(sx_clrscope(1))
    select item 
    skip 
enddo 
Processados 40.000 itens -> 5 loja -> 185.000 saidas em 00:03:30

function vetorperio(vinicio,vfim,vshow)
*-------
local ret:={},vloop:=pdmes(vinicio),vptela,vplin
do while vloop <= pdmes(vfim)
aadd(ret,strzero(year(vloop),4,0)+strzero(month(vloop),2,0))
vloop := udmes(vloop)+1
enddo
return ret

function newabremov(namtipo,namanomes,nammodo,namdir)
*-------
namarq = namtipo+'P'+namanomes
ret = 1
if file(namdir+namarq+'.gif')
ret = 0
new_abre(namarq,namdir,nammodo,'gif')
endif
return ret
Pitbull

Clipper 5.2e, Exospace, Six2, DBMax
Responder