Criando relatorio com duas variárias ordenadas

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Criando relatorio com duas variárias ordenadas

Mensagem 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
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem 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
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Mensagem por Gelson »

Olá, Marcelo

Obrigado pela dica funcionou 100%.

um abraço.
Responder