falha na impressão

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Glauco Cruz Costa
Usuário Nível 3
Usuário Nível 3
Mensagens: 102
Registrado em: 15 Dez 2005 22:02
Localização: Brasília/DF
Contato:

falha na impressão

Mensagem 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
Editado pela última vez por Glauco Cruz Costa em 12 Jan 2006 23:35, em um total de 1 vez.
Alessandro
Usuário Nível 3
Usuário Nível 3
Mensagens: 141
Registrado em: 07 Jul 2004 09:39
Localização: Santo Antonio da Platina-PR

Mensagem 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
Glauco Cruz Costa
Usuário Nível 3
Usuário Nível 3
Mensagens: 102
Registrado em: 15 Dez 2005 22:02
Localização: Brasília/DF
Contato:

Mensagem 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.
Lopes
Usuário Nível 1
Usuário Nível 1
Mensagens: 22
Registrado em: 12 Dez 2005 16:27

Mensagem 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.
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem 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
Glauco Cruz Costa
Usuário Nível 3
Usuário Nível 3
Mensagens: 102
Registrado em: 15 Dez 2005 22:02
Localização: Brasília/DF
Contato:

Mensagem 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.
Responder