Olá, galera,
Estou com um probleminha em uma rotina de inclusão. É que quando pressiono ESC durante um GET, o programa, mesmo assim, inclui os dados digitados ou em branco. A rotina inclui os dados sempre que se pressionar ENTER duas vezes. Uma é para inlcuir e a outra, para sair. Só que se o usuário pressiona acidentalmente dois ENTERs na última inclusão, já era, pois ao se pressionar ESC para sair, o programa inclui o registro, pois ele já está esperando novo registro. Assim, nessas duas ocasiões, o programa inclui dados não desejados. Se alguém puder cooperar nessa comigo, agradeço.
Eu já tentei várias alternativas, mas não consegui. Eu gostaria de poder pressionar ESC em qualquer momento e o programa não incluir nada no banco de dados.
Aí vai o fonte da rotina de inclusão para que possam analizar o que acontece e me dar um parecer.
// INCLUSAO DE NOVOS DADOS
PROCEDURE INCLUIR
SET CONFIRM ON
SET ESCAPE ON
MED = SPACE(15) // MEDICO
CLI = SPACE(10) // CLINICA
DAT = CTOD(" / / ") // DATA
PRO = SPACE(7) // PRONTUARIO
CLS
@ 07,03 CLEAR TO 17,70
@ 07,03 TO 17,70
@ 03,25 SAY "CADASTRANDO"
@ 20,19 SAY " NAO DESEJANDO INCLUIR MAIS REGISTROS,"
@ 22,19 SAY "PRESSIONE 'ESC' PARA VOLTAR AO MENU PRINCIPAL"
@ 18,19 SAY " NAO USE ACENTOS NEM CEDILHA! "
@ 09,06 say "MEDICO.......:" GET MED PICT "@!" valid testaGet( MED )
@ 11,06 SAY "CLINICA......:" GET CLI PICT "@!" valid testaGet( CLI )
@ 13,06 SAY "DATA ........:" GET DAT
@ 15,06 SAY "PRONTUARIO ..:" GET PRO PICT "9999999" // VALID !EMPT(PRO)
READ
@ 24,25 SAY "REGISTRO INCLUIDO: CONTINUAR <ENTER> OU SAIR <ESC>"
INKEY(0)
APPEND BLANK
REPLACE MEDICO WITH MED
REPLACE CLINICA WITH CLI
REPLACE DATA WITH DAT
REPLACE PRONTUARIO WITH PRO
DBUNLOCK() // LIBERA O REGISTRO PARA USO
DBCOMMIT() // DESCARREGA O CACHE DO DISCO DEPOIS DO DBUNLOCK()
DO WHILE .T.
@ 24,25 SAY " "
IF LASTKEY() = 27
RETURN
ENDIF
PRO = SPACE(7) // PRONTUARIO
@ 15,06 SAY "PRONTUARIO ..:" GET PRO PICT "9999999" VALID !EMPT(PRO)
READ
@ 24,25 SAY "REGISTRO INCLUIDO: CONTINUAR <ENTER> OU SAIR <ESC>"
INKEY(0)
APPEND BLANK
REPLACE MEDICO WITH MED
REPLACE CLINICA WITH CLI
REPLACE DATA WITH DAT
REPLACE PRONTUARIO WITH PRO
DBUNLOCK() // LIBERA O REGISTRO PARA USO
DBCOMMIT() // DESCARREGA O CACHE DO DISCO DEPOIS DO DBUNLOCK()
ENDDO
GO TOP
WHILE .NOT. EOF()
IF PRONTUARIO = SPACE(7)
DELE
PACK
ENDIF
SKIP
ENDDO
RETURN
function testaGet( cVar )
for i := 1 to len( alltrim( cVar ) )
if isDigit( substr( cVar, i, 1 ) )
return .f.
endif
next
return .t.
inclusão involuntária de dados
Moderador: Moderadores
-
Glauco Cruz Costa
- Usuário Nível 3

- Mensagens: 102
- Registrado em: 15 Dez 2005 22:02
- Localização: Brasília/DF
- Contato:
inclusão involuntária de dados
Editado pela última vez por Glauco Cruz Costa em 05 Jan 2006 20:14, em um total de 1 vez.
Só uma pequena melhoria e que servirá para a rotina de manutenção.
if lastkey() = 27 .OR. .NOT. UPDATED()
close all
return
endif
Dessa forma se não hover nenhuma modificação nos gets não será feita nenhuma atualização.
Até logo.
Marcelo
if lastkey() = 27 .OR. .NOT. UPDATED()
close all
return
endif
Dessa forma se não hover nenhuma modificação nos gets não será feita nenhuma atualização.
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)
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)
-
Glauco Cruz Costa
- Usuário Nível 3

- Mensagens: 102
- Registrado em: 15 Dez 2005 22:02
- Localização: Brasília/DF
- Contato:
Tive problemas, pois eu colocava, no início do programa, o comando USE RETORNO SHARED NEW. Só que agora ele fecha o arquivo, dando erro, quando acesso outra procedure.rochinha escreveu:Amiguinho
Após o read coloque:
if lastkey() = 27
close all
return
endif
@braços :?)
Tentei, colocando este comando no início de cada procedure. Também deu erro. Acho que ele não aceita este mesmo comando repetido no mesmo programa. E agora, o que posso fazer para corrigir isso? Obrigado.
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Amiguinho
Sua rotina deve ser reescrita:
Toda rotina deve possuir o seguinte esquema
Abre arquivos SHARED NEW
seleciona arquivo a ser incluido
zera variaveis
pegas as informações
critica a inclusão
inclui os dados
fecha os arquivos
Então:
PROCEDURE INCCLIENTE
USE CLIENTES
SET CONFIRM ON
SET ESCAPE ON
GO BOTTOM
SKIP
MED = CLIENTES->MEDICO // SPACE(15) // MEDICO
CLI = CLIENTES->CLINICA // SPACE(10) // CLINICA
DAT = CLIENTES->DATA // CTOD(" / / ") // DATA
PRO = CLIENTES->PRONTUARIO // SPACE(7) // PRONTUARIO
CLS
@ 07,03 CLEAR TO 17,70
@ 07,03 TO 17,70
@ 03,25 SAY "CADASTRANDO"
@ 20,19 SAY " NAO DESEJANDO INCLUIR MAIS REGISTROS,"
@ 22,19 SAY "PRESSIONE 'ESC' PARA VOLTAR AO MENU PRINCIPAL"
@ 18,19 SAY " NAO USE ASSENTOS NEM CEDILHA! "
@ 09,06 say "MEDICO.......:" GET MED PICT "@!" valid testaGet( MED )
@ 11,06 SAY "CLINICA......:" GET CLI PICT "@!" valid testaGet( CLI )
@ 13,06 SAY "DATA ........:" GET DAT
@ 15,06 SAY "PRONTUARIO ..:" GET PRO PICT "9999999" // VALID !EMPT(PRO)
READ
IF LASTKEY() <> 27 .OR. UPDATED()
APPEND BLANK
REPLACE MEDICO WITH MED
REPLACE CLINICA WITH CLI
REPLACE DATA WITH DAT
REPLACE PRONTUARIO WITH PRO
DBUNLOCK() // LIBERA O REGISTRO PARA USO
DBCOMMIT() // DESCARREGA O CACHE DO DISCO DEPOIS DO DBUNLOCK()
@ 24,25 SAY "REGISTRO INCLUIDO: CONTINUAR <ENTER> OU SAIR <ESC>"
ENDIF
//DO WHILE .T.
//@ 24,25 SAY " "
//IF LASTKEY() = 27
//RETURN
//ENDIF
//PRO = SPACE(7) // PRONTUARIO
//@ 15,06 SAY "PRONTUARIO ..:" GET PRO PICT "9999999" VALID !EMPT(PRO)
//READ
//@ 24,25 SAY "REGISTRO INCLUIDO: CONTINUAR <ENTER> OU SAIR <ESC>"
//INKEY(0)
//APPEND BLANK
//REPLACE MEDICO WITH MED
//REPLACE CLINICA WITH CLI
//REPLACE DATA WITH DAT
//REPLACE PRONTUARIO WITH PRO
//DBUNLOCK() // LIBERA O REGISTRO PARA USO
//DBCOMMIT() // DESCARREGA O CACHE DO DISCO DEPOIS DBUNLOCK
//ENDDO
//GO TOP
//WHILE .NOT. EOF()
//IF PRONTUARIO = SPACE(7)
//DELE
//PACK
//ENDIF
//SKIP
//ENDDO
RETURN
Analise a rotina acima e refaça o seu codigo.
Quanto ao .DBF RETORNO verifique se vc não colocou uma variavel publica de nome RETORNO em seu aplicativo.
@braços :?)
Sua rotina deve ser reescrita:
Toda rotina deve possuir o seguinte esquema
Abre arquivos SHARED NEW
seleciona arquivo a ser incluido
zera variaveis
pegas as informações
critica a inclusão
inclui os dados
fecha os arquivos
Então:
PROCEDURE INCCLIENTE
USE CLIENTES
SET CONFIRM ON
SET ESCAPE ON
GO BOTTOM
SKIP
MED = CLIENTES->MEDICO // SPACE(15) // MEDICO
CLI = CLIENTES->CLINICA // SPACE(10) // CLINICA
DAT = CLIENTES->DATA // CTOD(" / / ") // DATA
PRO = CLIENTES->PRONTUARIO // SPACE(7) // PRONTUARIO
CLS
@ 07,03 CLEAR TO 17,70
@ 07,03 TO 17,70
@ 03,25 SAY "CADASTRANDO"
@ 20,19 SAY " NAO DESEJANDO INCLUIR MAIS REGISTROS,"
@ 22,19 SAY "PRESSIONE 'ESC' PARA VOLTAR AO MENU PRINCIPAL"
@ 18,19 SAY " NAO USE ASSENTOS NEM CEDILHA! "
@ 09,06 say "MEDICO.......:" GET MED PICT "@!" valid testaGet( MED )
@ 11,06 SAY "CLINICA......:" GET CLI PICT "@!" valid testaGet( CLI )
@ 13,06 SAY "DATA ........:" GET DAT
@ 15,06 SAY "PRONTUARIO ..:" GET PRO PICT "9999999" // VALID !EMPT(PRO)
READ
IF LASTKEY() <> 27 .OR. UPDATED()
APPEND BLANK
REPLACE MEDICO WITH MED
REPLACE CLINICA WITH CLI
REPLACE DATA WITH DAT
REPLACE PRONTUARIO WITH PRO
DBUNLOCK() // LIBERA O REGISTRO PARA USO
DBCOMMIT() // DESCARREGA O CACHE DO DISCO DEPOIS DO DBUNLOCK()
@ 24,25 SAY "REGISTRO INCLUIDO: CONTINUAR <ENTER> OU SAIR <ESC>"
ENDIF
//DO WHILE .T.
//@ 24,25 SAY " "
//IF LASTKEY() = 27
//RETURN
//ENDIF
//PRO = SPACE(7) // PRONTUARIO
//@ 15,06 SAY "PRONTUARIO ..:" GET PRO PICT "9999999" VALID !EMPT(PRO)
//READ
//@ 24,25 SAY "REGISTRO INCLUIDO: CONTINUAR <ENTER> OU SAIR <ESC>"
//INKEY(0)
//APPEND BLANK
//REPLACE MEDICO WITH MED
//REPLACE CLINICA WITH CLI
//REPLACE DATA WITH DAT
//REPLACE PRONTUARIO WITH PRO
//DBUNLOCK() // LIBERA O REGISTRO PARA USO
//DBCOMMIT() // DESCARREGA O CACHE DO DISCO DEPOIS DBUNLOCK
//ENDDO
//GO TOP
//WHILE .NOT. EOF()
//IF PRONTUARIO = SPACE(7)
//DELE
//PACK
//ENDIF
//SKIP
//ENDDO
RETURN
Analise a rotina acima e refaça o seu codigo.
Quanto ao .DBF RETORNO verifique se vc não colocou uma variavel publica de nome RETORNO em seu aplicativo.
@braços :?)
