Página 2 de 3
Enviado: 28 Dez 2005 20:55
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
Enviado: 28 Dez 2005 21:21
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
Enviado: 28 Dez 2005 21:35
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
Enviado: 28 Dez 2005 21:39
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.
Enviado: 28 Dez 2005 21:44
por filizola
vc inseriu no programa principal o set exclusive off

Enviado: 28 Dez 2005 21:51
por Glauco Cruz Costa
Fiz tudo como me pediu.
Enviado: 28 Dez 2005 22:01
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.
Enviado: 28 Dez 2005 22:20
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...
Enviado: 28 Dez 2005 22:24
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.
Enviado: 28 Dez 2005 22:26
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...
Enviado: 28 Dez 2005 23:32
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
Enviado: 28 Dez 2005 23:50
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 :?)
Enviado: 29 Dez 2005 00:06
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...
Enviado: 29 Dez 2005 00:53
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
Enviado: 29 Dez 2005 11:45
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.