MENSAGEM DE ERRO

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
filizola
Usuário Nível 3
Usuário Nível 3
Mensagens: 421
Registrado em: 19 Ago 2003 20:10
Localização: Belo Horizonte/MG

Mensagem por filizola »

bem, para ajustar-mos definitivamente a rotina.

no programa principal inclua a linha
SET EXCLUSIVE OFF

na inclusao:
APPEND BLANK
REPLA CAMPO WITH VARIAVEL
UNLOCK

na alteracao:
RLOCK() - Nao gosto do rlock() tenho uma rotina que trata melhor o travamento do registro, tentando algumas vezes.
REPLA CAMPO WITH VARIAVEL
UNLOCK

na exclusao:
RLOCK()
DELETE
UNLOCK
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 »

NÃO DÁ CERTO. O PROGRAMA NÃO ABRE PARA EXCLUIR SEM SER EXCLUSIVO. VEJA OUTRA MENSAGEM POSTADA NO PCTOLEDO EM:
https://pctoledo.org/forum/viewto ... d970978ad4
Avatar do usuário
filizola
Usuário Nível 3
Usuário Nível 3
Mensagens: 421
Registrado em: 19 Ago 2003 20:10
Localização: Belo Horizonte/MG

Mensagem por filizola »

tente assim entao

retire esta linha no programa principal
SET EXCLUSIVE OFF

na inclusao:
APPEND BLANK
REPLA CAMPO WITH VARIAVEL

na alteracao:
REPLA CAMPO WITH VARIAVEL

na exclusao:
DELETE
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 »

CONTINUA DANDO O ERRO 'EXCLUSIVE REQUIRED'.
O ERRO ESTÁ APONTANDO PARA O COMDANDO PACK, APÓS DELETE.
PRECISA HAVER UM JEITO DE SE PODER, NO MESMO PROGRAMA, ABRIR O DBF HORA EM SHARED, HORA EM EXCLUSIVE, POIS O PROGRAMA É MULTIUSUÁRIO, E NÃO PODE SER SEMPRE EXCLUSIVE.
Avatar do usuário
filizola
Usuário Nível 3
Usuário Nível 3
Mensagens: 421
Registrado em: 19 Ago 2003 20:10
Localização: Belo Horizonte/MG

Mensagem por filizola »

vc inseriu no programa principal o set exclusive off ???
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 »

Fiz tudo como me pediu.
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 »

FIZ UMA PERGUNTA LÁ, NAQUELE ENDEREÇO QUE TE INDIQUEI ANTERIORMENTE E VEJA O QUE ME RESPONDERAM:

"Use o mesmo arquivo no modo shared e da só um dbDelete() para marcar como deletado e use o SET DELETED ON para não processar os deletados... Depois crie uma rotina (que pode ser executada diariamente ou semanalmente, dependendo da necessidade) apenas para dar um PACK geral e compactar os arquivos. Essa rotina sim deve ser no EXCLUSIVE."

MAS, FICOU-ME UMAS DÚVIDAS, QUE ESTOU ESPERANDO RESPOSTA.
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

Glauco Cruz Costa escreveu:FIZ UMA PERGUNTA LÁ, NAQUELE ENDEREÇO QUE TE INDIQUEI ANTERIORMENTE E VEJA O QUE ME RESPONDERAM:

"Use o mesmo arquivo no modo shared e da só um dbDelete() para marcar como deletado e use o SET DELETED ON para não processar os deletados... Depois crie uma rotina (que pode ser executada diariamente ou semanalmente, dependendo da necessidade) apenas para dar um PACK geral e compactar os arquivos. Essa rotina sim deve ser no EXCLUSIVE."

Hahaha, eu que escrevi e reintero...

Não é necessário abrir o arquivo duas vezes em seguida.

Outra coisa é que eu tambem não tenho o costume de usar o select ANTES de abrir um arquivo e sim de abrir com a clausula NEW.

Por últmo posso te dizer que um arquivo ou é aberto como compartilhado (SHARED) ou como exclusivo (EXCLUSIVE), os dois ao mesmo tempo não né... Por mais que vc tente enganar o compilador trocando de área com o select, o arquico é um só, e o DOS não cai no truque...

Ok...
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
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 »

Stanis Luksys escreveu:
Glauco Cruz Costa escreveu:FIZ UMA PERGUNTA LÁ, NAQUELE ENDEREÇO QUE TE INDIQUEI ANTERIORMENTE E VEJA O QUE ME RESPONDERAM:

"Use o mesmo arquivo no modo shared e da só um dbDelete() para marcar como deletado e use o SET DELETED ON para não processar os deletados... Depois crie uma rotina (que pode ser executada diariamente ou semanalmente, dependendo da necessidade) apenas para dar um PACK geral e compactar os arquivos. Essa rotina sim deve ser no EXCLUSIVE."

Hahaha, eu que escrevi e reintero...

Não é necessário abrir o arquivo duas vezes em seguida.

Outra coisa é que eu tambem não tenho o costume de usar o select ANTES de abrir um arquivo e sim de abrir com a clausula NEW.

Por últmo posso te dizer que um arquivo ou é aberto como compartilhado (SHARED) ou como exclusivo (EXCLUSIVE), os dois ao mesmo tempo não né... Por mais que vc tente enganar o compilador trocando de área com o select, o arquico é um só, e o DOS não cai no truque...

Ok...

A AÍ, COLEGA. CONSEGUIU CHEGAR AQUI, HEIM!
VEJA A VIAJEM QUE FIZEMOS COM ESSA DÚVIDA.
MAS, FOI BOM. ESTOU AGORA ORGANIZANDO MEU PROGRAMA.
NÃO SOU PROGRAMADOR PROFISSIONAL. APENAS APRENDI CLIPPER BÁSICO NO PASSADO E AGORA ESTOU FAZENDO UM PROGRAMA PARA FACILITAR MEU TRABALHO NO HOSPITAL, DE FORMA QUE NÃO PRECISEMOS PERDER TEMPO PREENCHENDO FORMULÁRIOS A MÃO, QUANDO O SISTEMA DE LÁ DÁ PAU, O QUE ACONTECE SEMPRE.
OBRIGADO.
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 »

Stanis Luksys escreveu:
Glauco Cruz Costa escreveu:FIZ UMA PERGUNTA LÁ, NAQUELE ENDEREÇO QUE TE INDIQUEI ANTERIORMENTE E VEJA O QUE ME RESPONDERAM:

"Use o mesmo arquivo no modo shared e da só um dbDelete() para marcar como deletado e use o SET DELETED ON para não processar os deletados... Depois crie uma rotina (que pode ser executada diariamente ou semanalmente, dependendo da necessidade) apenas para dar um PACK geral e compactar os arquivos. Essa rotina sim deve ser no EXCLUSIVE."

Hahaha, eu que escrevi e reintero...

Não é necessário abrir o arquivo duas vezes em seguida.

Outra coisa é que eu tambem não tenho o costume de usar o select ANTES de abrir um arquivo e sim de abrir com a clausula NEW.

Por últmo posso te dizer que um arquivo ou é aberto como compartilhado (SHARED) ou como exclusivo (EXCLUSIVE), os dois ao mesmo tempo não né... Por mais que vc tente enganar o compilador trocando de área com o select, o arquico é um só, e o DOS não cai no truque...

Ok...
EU TENTEI ANTES USAR SEM SELECT, MAS O PROGRAMA ACUSOU A FALTA DO MESMO. E AÍ, TIVE QUE USAR E ME COMPLICAR...
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 »

ESTOU COM OUTRO PROBLEMA, AGORA.
VEJA SE PODE ME AJUDAR.
A MENSAGEM DE ERRO É:
Workarea not in use: DBGOTOP (a mesma inicialmente)
A MESMA MENSAGEM NOVAMENTE.
VEJA COMO ESTÁ MINHA PROCEDURE. ELA FUNCIONA ASSIM: PRIMEIRO EU APAGO O RETORNO2 PARA DEPOIS COPIAR O QUE INTERESSA DO RETORNO1 PARA ELE. DEPOIS, USO O RETORNO2 PARA IMPRIMIR. EU PODERIA TER FEITO A IMPRESSÃO A PARTIR DO RETORNO1, MAS NÃO CONSEGUI. ASSIM, CRIEI ESSA ROTINA TODA. MAS, EIS A PROCEDURE:

SELECT 1
USE RETORNO SHARED NEW
SELECT 2
USE RETORNO2
...

// IMPRESSAO POR DATA

PROCEDURE IMPDATA
SELECT 2
SET CONFIRM ON // PARA DAR ENTER APOS PREENCHER UM GET
SET ESCAPE ON // PARA INTERRROMPER UM GET COM ESC
SAVE SCREEN TO IMPN
ZAP
CLOSE DATABASE
SELECT 1
CLS
SET CONFIRM ON
IF LASTKEY() = 27
QUIT
ENDIF
DAT = CTOD(" / / ")
@ 05,05 SAY "DIGITE A DATA:" GET DAT
READ
GO TOP
COPY TO RETORNO2 FOR DATA = DAT
CLOSE DATABASE
/* USE MEDICO
COPY TO RETORNO2
ZAP
CLOSE DATABASE */
SELECT 2
SET CONFIRM ON // PARA DAR ENTER APÓS PREENCHER UM GET
SET ESCAPE ON // PARA INTERRROMPER UM GET COM ESC
SAVE SCREEN TO IMPN
CLS
@ 24,15 SAY " PRESSIONE QUALQUER TECLA PARA IMPRIMIR "
INKEY(0)
@24,15 SAY " IMPRIMINDO. AGUARDE... "
LIN=1
EJ=1
SET DEVICE TO PRINTER
IF .NOT. ISPRINTER()
@ 24,15 SAY "ERRO NA IMPRESSORA. PRESSIONE QUALQUER TECLA."
INKEY(0)
RETURN
ENDIF
GO TOP
DO WHILE .NOT. EOF()
LIN = LIN + 2
@ LIN,02 SAY PRONTUARIO
LIN = LIN + 2
@ LIN,02 SAY MEDICO
@ LIN,50 SAY CLINICA
LIN = LIN + 2
@ LIN,02 SAY CLINICA
LIN = LIN + 2
@ LIN,02 SAY DATA
LIN = LIN + 2
@LIN,02 SAY REPLICATE('.',60)
EJ = EJ + 1
IF EJ = 7
EJECT
EJ = 1
LIN = 1
ENDIF
SKIP
ENDDO
SET DEVICE TO SCREEN
CLOSE DATABASE
EJECT
RETURN
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

O problema todo esta em utilizar o programa em modo mono ou rede.

Se for usar um .DBF em modo mono voce nem precisa abrir com exclusividade pois por padrão este é o modo de abertura dos mesmos.

Em modo mono voce nem precisa travar o arquivo para dar PACK, REPLACE ALL, etc.

Se for usar em modo rede voce terá de acrescentar algumas linhas no seu programa.

No .PRG principal acrescente a seguinte linha logo no inicio:

SET EXCLUSIVE OFF

Este comando diz ao aplicativo que estara trabalhando em modo compartilhado.

Quanto ao tratamento dos registros voce deverá a partir de agora travar e destravar em cada REPLACE e DELETE:

Exemplo:

Vai incluir

USE arquivo SHARED // Necessário pois agora esta em modo rede
...
APPEND BLANK // Quando em modo rede trava sozinho
REPLACE ...
COMMIT // Usado para salvar o buffer de dados no registro, não precisa UNLOCK // Só por precaução

Vai salvar

USE arquivo SHARED
...
RLOCK() // Necessario travar o registro quando em modo rede
REPLACE ...
COMMIT // Idem ao anterior
UNLOCK // idem ao anterior

Somente use o EXCLUSIVE quando for INDEXar, PACKear, RECALL ALL, REPLACE ALL ou ZAPear.

Espero ter ajudado.

@braços :?)
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 »

COLEGA. O MEU PROGRAMA É NO MODO MULTIUSUÁRIO (REDE). O RETORNO1 É COMPARTILHADO. O RETORNO2 NÃO É.
ESSA PROCEDURE ESTÁ DANDO AQUELE ERRO (WORKAREA NOT IN USE: DBGOTOP).
ACHO QUE O PROBLEMA É NOS SELECTS QUE USO. TUDO QUE COLOCOU JÁ ME FORA PASSADO, COMO PODERÁ VERIFICAR NAS MENSAGENS ANTERIORES. ASSIM, SE PUDER ME AJUDAR...
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

Glauco Cruz Costa escreveu:SELECT 1
USE RETORNO SHARED NEW
SELECT 2
USE RETORNO2
Prezado Glauco,

É neste exato ponto que sua rotina está errada, pois quando você abre o RETORNO2 vc está fechando o RETORNO, pois não informou a cláusula NEW. Altere estas quatro linhas para o seguinte o código de duas linhas:

USE RETORNO SHARED NEW
USE RETORNO2 SHARED NEW

Bem mais simples e prático, e para melhor visualização do seu prg procure não utilizar o select com numeros, neste caso quando você precisar alterar a área corrente use assim:

SELECT RETORNO
ou
SELECT RETORNO2

Pode testar que vai funcionar
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
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 »

COLEGA. CONTINUA O MESMO ERRO. FIZ MAIS OU MENOS PEDIU. SÓ NÃO PUDE TIRAR OS SELECTS, POIS O PROGRAMA ACUSA A SUA FALTA. VEJA:

NO INÍCIO DO PROGRAMA:

SELECT 1
USE RETORNO SHARED NEW
SELECT 2
USE RETORNO2 SHARED NEW


DEPOIS, NA PROCEDURE IMPRIMIR POR DATA:

PROCEDURE IMPDATA
SELECT 2
SET CONFIRM ON // PARA DAR ENTER APOS PREENCHER UM GET
SET ESCAPE ON // PARA INTERRROMPER UM GET COM ESC
SAVE SCREEN TO IMPN
GO TOP
DO WHILE .NOT. EOF()
RLOCK()
DBDELETE()
SKIP
ENDDO
DBUNLOCK()
DBCOMMIT()
// ZAP
CLOSE DATABASE
SELECT 1
CLS
SET CONFIRM ON
IF LASTKEY() = 27
RETURN
ENDIF
DAT = CTOD(" / / ")
@ 05,05 SAY "DIGITE A DATA:" GET DAT
READ
GO TOP
COPY TO RETORNO2 FOR DATA = DAT
CLOSE DATABASE
SELECT 2
SET CONFIRM ON // PARA DAR ENTER APÓS PREENCHER UM GET
SET ESCAPE ON // PARA INTERRROMPER UM GET COM ESC
SAVE SCREEN TO IMPN
CLS
@ 24,15 SAY " PRESSIONE QUALQUER TECLA PARA IMPRIMIR "
INKEY(0)
@24,15 SAY " IMPRIMINDO. AGUARDE... "
LIN=1
EJ=1
SET DEVICE TO PRINTER
IF .NOT. ISPRINTER()
@ 24,15 SAY "ERRO NA IMPRESSORA. PRESSIONE QUALQUER TECLA."
INKEY(0)
RETURN
ENDIF
GO TOP
DO WHILE .NOT. EOF()
LIN = LIN + 2
@ LIN,02 SAY PRONTUARIO
LIN = LIN + 2
@ LIN,02 SAY MEDICO
@ LIN,50 SAY CLINICA
LIN = LIN + 2
@ LIN,02 SAY CLINICA
LIN = LIN + 2
@ LIN,02 SAY DATA
LIN = LIN + 2
@LIN,02 SAY REPLICATE('.',60)
EJ = EJ + 1
IF EJ = 7
EJECT
EJ = 1
LIN = 1
ENDIF
SKIP
ENDDO
SET DEVICE TO SCREEN
CLOSE DATABASE
EJECT
RETURN

SÓ TIVE QUE TIRAR O ZAP E SUBSTITUIR POR UMA ROTINA QUE DÁ DELETE UM POR UM NOS REGISTROS.
EU TAMBÉM TENTEI COLOCAR COMO VOCÊ DISSE, SUBSTITUINDO AS 4 LINHAS PELAS DUAS, E AO SE CHAMAR OS DBFS COLOQUEI
SELECT RETORNO e
SELECT RETORNO2
MAS, DEU UM ERRO DE 'ALIAS'...

EU SÓ USO O RETORNO2.DBF NA ROTINA DE IMPRESSÃO, POIS NÃO OBTIVE SUCESSO COM SOMENTE O RETORNO.DBF. ASSIM, COMO EU PODERIA AJUSTAR ESSA PROCEDURE PARA NÃO PRECISAR USAR O SEGUNDO DBF E IMPRIMIR LEGAL? SE PUDER ME AJUDAR NISSO, NÃO PRECISAREI USAR MAIS DE UM DBF, E, ACHO, TUDO FICARÁ RESOLVIDO.
Responder