Página 1 de 1

Criando relatorio com duas variárias ordenadas

Enviado: 24 Mai 2005 15:15
por Gelson
Olá, pessoal

Estou trabalhando no meu segundo relatório em clipper, e estou esbarrando na seguinte dificuldade.

Preciso que o relatório seja impresso primeiro por ordem de data e depois por ordem de manifesto. Só que está saindo por ordem de data e depois notas.
Exemplo: data manifesto
01/05, 001010
01/05, 001011
01/05, 001012
02/05, 002040
02/05, 008040, etc.
Se alguém puder me dar uma luz, fico muito grato. segue baixo meu fonte:

SET CONSOLE OFF
SET PRINT ON
?? CHR(27) + '8'
SET PRINT OFF
SET CONSOLE ON

USE NOTAS INDEX NOTAS_2
DO WHILE .T.
CLEAR
mlote = SPACE(3)
mdata = CTOD(' / / ')
mfatura = SPACE(10)
mlinha = 2
mquantt = 0
mtotal = 0.00
mpag = 1
@10,10 SAY 'INFORME LOTE' GET mlote
@18,04 SAY '999 PARA ENCERRAR'
READ
IF mlote = '999'
EXIT
ENDIF
SEEK mlote
IF EOF()
@20,1 SAY 'LOTE NAO ENCONTRADO'
WAIT ' ENTER PARA CONTINUAR'
LOOP
ENDIF
@12,10 SAY 'INFORME DATA PARA INICIO IMPRESSAO';
GET mdata
READ
SEEK mlote + STR(YEAR(mdata),4) + STR(MONTH(mdata),2) +;
STR(DAY(mdata),2)
IF EOF()
@20,1 SAY 'DATA NAO ENCONTRADA'
WAIT ' ENTER PARA CONTINUAR'
LOOP
ENDIF

@14,10 SAY 'INFORME FATURA' GET mfatura
READ
SET DEVICE TO PRINT
@mlinha,62 SAY mpag PICTURE '999'
mlinha = mlinha + 2
@mlinha,57 SAY mfatura
mlinha = mlinha + 4
DO WHILE mlote = LOTE .AND. .NOT. EOF()
@mlinha, 15 SAY DATA
@mlinha, 27 SAY NOTA
@mlinha, 36 SAY MANIF
@mlinha, 46 SAY PLACA
IF QUANT # 0
@mlinha, 55 SAY QUANT PICTURE '9,999.999'
ENDIF
@mlinha, 63 SAY CONVERTE(VALOR)
mlinha = mlinha + 1
mquantt = mquantt + QUANT
mtotal = mtotal + VALOR

IF mlinha = 68
mlinha = mlinha + 1
@mlinha,27 SAY mpag PICTURE '999'
@mlinha,43 SAY mfatura
@mlinha,54 SAY mquantt PICTURE '99,999.999'
mpag = mpag + 1
mquantt = 0
SET DEVICE TO SCREEN
SET CONSOLE OFF
SET PRINT ON
??CHR(27) + CHR(15)
SET PRINT OFF
SET CONSOLE ON
SET DEVICE TO PRINT
@mlinha,70 SAY mtotal PICTURE '999,999,999.99'
EJECT
mtotal = 0.00
WAIT 'COLOQUE OUTRA FOLHA, <ENTER>'
SET DEVICE TO SCREEN
SET CONSOLE OFF
SET PRINT ON
??CHR(27) + '@'
??CHR(27) + '8'
SET PRINT OFF
SET CONSOLE ON
SET DEVICE TO PRINT
mlinha = 2
@mlinha,62 SAY mpag PICTURE '999'
mlinha = mlinha + 2
@mlinha,57 SAY mfatura
mlinha = mlinha + 4
ENDIF
SKIP
ENDDO

mlinha = 69
@mlinha,27 SAY mpag PICTURE '999'
@mlinha,43 SAY mfatura
@mlinha,54 SAY mquantt PICTURE '99,999.999'
SET DEVICE TO SCREEN
SET CONSOLE OFF
SET PRINT ON
??CHR(27) + CHR(15)
SET PRINT OFF
SET CONSOLE ON
SET DEVICE TO PRINT
@mlinha,70 SAY mtotal PICTURE '999,999,999.99'
EJECT
SET DEVICE TO SCREEN
SET CONSOLE OFF
SET PRINT ON
??CHR(27) + '@'
??CHR(27) + '8'
SET PRINT OFF
SET CONSOLE ON
ENDDO

USE
SET DEVICE TO SCREEN
SET CONSOLE OFF
SET PRINT ON
?? CHR(27) + '@'
SET PRINT OFF
SET CONSOLE ON
EJECT
CLEAR
RETURN

Enviado: 25 Mai 2005 07:39
por Clipper
Prezado Colega

Basta você criar um indice temporário ou fixo da seguinte maneira :

USE NOTAS
INDEX ON DTOS(DATA)+MANIF TO NOTAS_3
*** isso se MANIF for do tipo caractere

USE NOTAS
INDEX ON DTOS(DATA)+STR(MANIF,6)
*** se MANIF for do tipo numérico

Agora é só usar este indice ao invés do NOTAS_2 que acredito que este por ordem de NOTA.

Ps. Tenho observado em várias postagens de colegas o uso do SET PRINTER ON e SET PRINTER OFF - Esses comandos não são necessários se for utilizado @ SAY para impressão, desta forma é melhor trocar o ??por @ SAY e assim pode se abdicar do uso dos comandos SET PRINTER e SET CONSOLE.

Até logo.

Marcelo

Enviado: 25 Mai 2005 08:41
por Gelson
Olá, Marcelo

Obrigado pela dica funcionou 100%.

um abraço.