Página 1 de 1

Imprimir uma loja ou todas

Enviado: 03 Mai 2005 11:14
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

Enviado: 04 Mai 2005 11:38
por Anderson J. Freitas
Sem respostas... E eu até estava gostando daqui!

:(

Enviado: 04 Mai 2005 14:59
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

Enviado: 04 Mai 2005 16:50
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.

Enviado: 04 Mai 2005 17:48
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

Enviado: 05 Mai 2005 11:42
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

Enviado: 06 Mai 2005 21:53
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