Página 1 de 1

Erro no CLOSE DATA quando tem relacionamento

Enviado: 11 Out 2021 15:40
por ssflavio
Boa tarde amigos!

Quando utilizo o comando CLOSE DATA da erro se tiver algum arquivo com relacionamento.
Utilizo a versão 3.20 do Harbour.
No clipper não dava esse erro!
Alguem tem uma solução fácil para isso?
eu estava tirando o relacionamento manualmente antes de usar o CLOSE DATA.
Só que implementei o fechamento do sistema depois de 30 minutos sem uso e ele utiliza o a função __Quit() ai não tenho controle do que esta aberto e da erro.

>>> MEU AGRADECIMENTO AO NOSSO COLEGA JAIRO MAIA QUE ENSINOU COMO FAZER O ENCERRAMENTO APÓS UM TEMPO DE INATIVIDADE <<<

Erro no CLOSE DATA quando tem relacionamento

Enviado: 11 Out 2021 16:19
por JoséQuintas
Nunca ouvi falar sobre esse tipo de erro.
Qual a mensagem de erro?

Note que certas LIBs usam PROCEDURES de entrada e saída. (INIT PROCEDURE e acho que END PROCEDURE).
Essas rotinas são obrigatoriamente executadas no início e no final do aplicativo, não importa aonde estejam, e não importa quantas sejam.
Existe a possibilidade de ser uma delas.

Erro no CLOSE DATA quando tem relacionamento

Enviado: 11 Out 2021 17:36
por ssflavio
Error BASE/1002 Alias não existe: PED
Called from SGC42.PRG/(b)SGC42(90)
Called from /DBCLOSEALL(0)
Called from SGC42.PRG/SGC42(182) <<< LINHA DO CLOSE DATA
Called from SGC4.PRG/SGC4(52)
Called from sgc.prg/MAIN(201)

No inicio do programa abro os arquivos desta forma (só um exemplo, tem mais arquivos abertos)

Código: Selecionar todos

if !net_use('PED')    && PEDIDOS
   return
endif
set order to 3
set rela to CODCLI_PED into CLI

if !net_use('PPE')    && PRODUTOS DOS PEDIDOS
   return
endif
set relation to CODPRO_PPE into PRO,;
             to CODMOE_PPE+dtos(PED->DTACAM_PED) into COT   <<< LNHA 90
.
.
.
no final do programa tenho que fechar os relacionamentos na mão antes

Código: Selecionar todos

sele PPE
use
close data   <<< LINHA 182

Erro no CLOSE DATA quando tem relacionamento

Enviado: 11 Out 2021 17:45
por ssflavio
analisando o erro, agora na hora de postar a resposta anterior, percebi que da 2 erros no programa sgc42, um na linha 182 e outro na linha 90
na linha 90 o segundo relacionamento usa um campo do arquivo anterior (PED)
esse programa é muito velho, talvez tenha que reescrever algumas partes
esse relacionamento é meio estranho

Erro no CLOSE DATA quando tem relacionamento

Enviado: 12 Out 2021 03:00
por Jairo Maia
ssflavio escreveu:eu estava tirando o relacionamento manualmente antes de usar o CLOSE DATA.
Quando usa __Quit() e se você usa uma EXIT PROCEDURE, ela será executada, mas não se aplica nesse caso, já que uma EXIT PROCEDURE não herda nada (absolutamente nada) do sistema, assim, não é possível evitar esse Runtime Error com ela.

Porém, uma sugestão é você trocar o __Quit() da tarefa de fechamento e substituir por exemplo por EncerrarSistema(), assim, se atingido o tempo de inatividade, a tarefa não executa o __Quit() diretamente, mas sim sua função. Em sua função trate os fechamentos de relacionamentos e termine com QUIT.

Erro no CLOSE DATA quando tem relacionamento

Enviado: 19 Nov 2021 16:21
por ssflavio
teria como saber quantos arquivos estão abertos no momento???
se tiver como, seria simples varrer todos os arquivos abertos e remover os relacionamentos antes de efetuar o comando CLOSE DATA

Erro no CLOSE DATA quando tem relacionamento

Enviado: 19 Nov 2021 17:54
por alxsts
Olá!

Veja se funciona:

Código: Selecionar todos

//--------------------------------------------------------------------------------------------------

FUNCTION DbClearRelationAll()

   LOCAL nArea

   For nArea := 1 To 255
      If Used()
         (nArea)->( DbClearRelation() )
      Endif
   Next

RETURN NIL
//--------------------------------------------------------------------------------------------------
Só escrevi o código. Não testei.

Erro no CLOSE DATA quando tem relacionamento

Enviado: 19 Nov 2021 22:57
por Jairo Maia
alxsts escreveu:Só escrevi o código. Não testei.
Também não testei a função do Alexandre, mas caso não funcione, tente dessa forma:

Código: Selecionar todos

FUNCTION DbClearRelationAll()

   LOCAL nArea

   For nArea := 1 To 255
      If !Empty( Alias( nArea ) )
         Select( Alias( nArea ) )
         DbClearRelation()
      Endif
   Next

RETURN NIL

Erro no CLOSE DATA quando tem relacionamento

Enviado: 19 Nov 2021 23:18
por JoséQuintas
Procure nos fontes aonde faz o relacionamento, pra saber quais relacionamentos precisa desligar.
Mas... fecha os arquivos só no final do aplicativo?
Eu costumo abrir/fechar em cada módulo, até pra ter certeza de que tudo está salvo.

SET RELATION eu nunca usei, porque sempre existiu a história de que ele não é 100% eficaz.
Já tentou verificar se realmente precisa disso?

Erro no CLOSE DATA quando tem relacionamento

Enviado: 24 Nov 2021 12:05
por Kapiaba
Bom dia. Não entendi isso:

sele PPE

use // Você Fechou o banco.

aqui você tenta fechar o que já fechou?
close data <<< LINHA 182 -> CLOSE DATABASES or DBCLOSEALL()

Retire o USE e use: CLOSE( PPE ) // só ele, não todos os .DBFs.

Não me faz sentido.

Regards, saludos.

Erro no CLOSE DATA quando tem relacionamento

Enviado: 26 Nov 2021 17:14
por ssflavio
obrigado pela ajuda amigos!
a ideia do Jairo caiu como uma luva para a minha necessidade!

GRATIDÃO!