Página 1 de 1

falha na impressão

Enviado: 12 Jan 2006 14:08
por Glauco Cruz Costa
:( Olá, amigos clipeiros. Tô com um problemão em minha rotina de impressão por data.

use primeira shared new
...

// IMPRESSAO DE AGENDAS POR DATA

PROCEDURE IMPDATAA
SET CONFIRM ON // PARA DAR ENTER APOS PREENCHER UM GET
SET ESCAPE ON // PARA INTERRROMPER UM GET COM ESC
SAVE SCREEN TO IMPN
CLS
SET CONFIRM ON
IF LASTKEY() = 27
RETURN
ENDIF
DAT = CTOD(" / / ")
@ 02,20 SAY "IMPRESSAO DE AGENDAS POR DATA"
@ 05,03 TO 09,29
@ 07,05 SAY "DIGITE A DATA:" GET DAT
READ
IF LASTKEY() = 27
RETURN
ENDIF
CLS
@ 24,15 SAY " PRESSIONE QUALQUER TECLA PARA IMPRIMIR "
INKEY(0)
@ 24,15 SAY " IMPRIMINDO. AGUARDE... "
LIN=12
SET DEVICE TO PRINTER
IF .NOT. ISPRINTER()
@ 24,15 SAY "ERRO NA IMPRESSORA. PRESSIONE QUALQUER TECLA."
INKEY(0)
RETURN
ENDIF
C=0 // PARA PASSAR NO PRIMEIRO WHILE
CR=1 // ||
GO TOP
LOCATE FOR DATA = DAT .AND. PROF = "R"
IF FOUND()
REC = RECNO()
DO WHILE .NOT. EOF()
IF DAT = DATA .AND. C <> CRM
REC = RECNO() // pega a posição atual para voltar nela posteriormente
CR = MEDICO // cr recebe o nome do medico do apontador atual
@ 01,01 SAY REPLICATE('.',130)
@ 03,01 SAY "* U.S: 01.05.01 *" + " *" + " CRM *" + " NOME DO PROFISSIONAL *" + " ATIVIDADE *" + " CLINICA *" + " TURNO *"
@ 04,01 SAY "* HBDF *" + " AGENDA DE CONSULTAS *" + " *" + " *" + " *" + " *" + " *"
@ 05,01 SAY "* *" + " *" + " " + CRM + " *" + " " +MEDICO + " *" + " " + ATIVIDADE + " *" + " " + CLINICA + " *" + " " + TURNO + " *"
@ 07,01 SAY REPLICATE('.',130)
@ 10,05 SAY "PRONTUARIO:"
@ 10,20 SAY "PACIENTE:"
DO WHILE .NOT. EOF()
IF CR = CRM .AND. DAT = DATA .AND. PROF = "R" // procura-se os pacientes do médico tal
@ LIN,05 SAY PRONTUARIO
@ LIN,20 SAY PACIENTE
LIN = LIN + 2
SKIP
ENDIF
ENDDO
C = CR // recebe-se o CRM do apontador atual
EJECT
ENDIF
GO REC // volta-se a posição de pesquisa anterior, pois o 2o while saiu dela
SKIP // anda-se um registro a frente
REC = RECNO() // rec armazena esse próximo registro
ENDDO
ELSE
SET DEVICE TO SCREEN
@ 23,10 SAY "DATA INEXISTENTE <ENTER>"
@ 24,15 SAY " "
INKEY(0)
RETURN
ENDIF
SET DEVICE TO SCREEN
EJECT
RETURN
Os campos do dbf são CRM, ATIVIDADE, CLINICA, MEDICO, PROF, DATA ...
Apesar de no CRM e na ATIVIDADE se digitar somente número, o campo é string no dbf. Todos são, exceto, data.
A idéia é ir percorrendo o banco de dados e imprimir as agendas com suas respectivas consultas.
Para que não repita os médicos, criei a variavel CR para receber o CRM onde o apontador de registro parou. Mas, acho que não funcionou, pois a rotina imprime apenas a primeira agenda com os pacientes do primeiro médico e para. Não sai mais. Eu tenho que dar CTRL+BREAK para sair do programa. E me vem uma mensagem que o programa parou na linha onde está IF CR = CRM .AND. DAT = DATA .AND. PROF = "R".
O propósito é imprimir as agendas de uma determinada data, sendo que, em cada folha, saísse um médico de cada vez.
Obrigado pela cooperação.
Abraços

Enviado: 12 Jan 2006 17:28
por Alessandro
Caro colega.

Não analisei sua rotina, mas vou sugerir o seguinte.

Vc tem um cadastro de médicos?
Se tiver fica mais simples, faça da seguinte forma.
Faça um while do cad. de médicos, e a cada registro verifique na agenda quais as suas consultas.

Valeu

Alessandro

Enviado: 12 Jan 2006 19:14
por Glauco Cruz Costa
Alessandro escreveu:Caro colega.

Não analisei sua rotina, mas vou sugerir o seguinte.

Vc tem um cadastro de médicos?
Se tiver fica mais simples, faça da seguinte forma.
Faça um while do cad. de médicos, e a cada registro verifique na agenda quais as suas consultas.

Valeu

Alessandro

Para mim, é melhor trabalhar com um só dbf. Mas, vou tentar... Obrigado.

Enviado: 13 Jan 2006 09:36
por Lopes
Kra, pelo que vi rapidamente do seu código me parece que o problema é que vc colocou o SKIP dentro do IF "IF DAT = DATA .AND. C <> CRM ", daí se não atender a condição nunca vai chegar no EOF pois não vai estar pulando os registros..
Tenta só colocar esse SKIP pra fora do IF e ver se resolve seu problema. Qquer coisa avisa que confiro novamente seu código.

Enviado: 13 Jan 2006 09:52
por gvc
Crie um indice por data + crm
Vc procura na data com o dbseek e pula a página quanto trocar de crm
Com o dbseek na data vc já verifica se existe alguma coisa cadastrada para o dia e não usa o locate.
Se vc for fazer a lista por nome, use o cadastro de médicos por ordem de nome e procure na data + crm para ver se tem algo marcado para o mesmo.

Alem de:

WHILE !EOF()
IF CR = CRM .AND. DAT = DATA .AND. PROF = "R"
@ LIN,05 SAY PRONTUARIO
@ LIN,20 SAY PACIENTE
LIN += 2
end
dbskip() <===
end

Enviado: 15 Jan 2006 11:26
por Glauco Cruz Costa
Lopes escreveu:Kra, pelo que vi rapidamente do seu código me parece que o problema é que vc colocou o SKIP dentro do IF "IF DAT = DATA .AND. C <> CRM ", daí se não atender a condição nunca vai chegar no EOF pois não vai estar pulando os registros..
Tenta só colocar esse SKIP pra fora do IF e ver se resolve seu problema. Qquer coisa avisa que confiro novamente seu código.
:xau Valeu, amigão. Era esse mesmo o principal proglema. Um detalhe bobo. Fiz outros ajustes e deu tudo certo.
Abs.