Erro no CLOSE DATA quando tem relacionamento

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

ssflavio
Usuário Nível 2
Usuário Nível 2
Mensagens: 86
Registrado em: 10 Jul 2008 09:57
Localização: São Paulo / SP

Erro no CLOSE DATA quando tem relacionamento

Mensagem 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 <<<
Flávio dos Santos Szelbracikowski
ssflavio@osite.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Erro no CLOSE DATA quando tem relacionamento

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
ssflavio
Usuário Nível 2
Usuário Nível 2
Mensagens: 86
Registrado em: 10 Jul 2008 09:57
Localização: São Paulo / SP

Erro no CLOSE DATA quando tem relacionamento

Mensagem 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
Flávio dos Santos Szelbracikowski
ssflavio@osite.com.br
ssflavio
Usuário Nível 2
Usuário Nível 2
Mensagens: 86
Registrado em: 10 Jul 2008 09:57
Localização: São Paulo / SP

Erro no CLOSE DATA quando tem relacionamento

Mensagem 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
Flávio dos Santos Szelbracikowski
ssflavio@osite.com.br
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Erro no CLOSE DATA quando tem relacionamento

Mensagem 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.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
ssflavio
Usuário Nível 2
Usuário Nível 2
Mensagens: 86
Registrado em: 10 Jul 2008 09:57
Localização: São Paulo / SP

Erro no CLOSE DATA quando tem relacionamento

Mensagem 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
Flávio dos Santos Szelbracikowski
ssflavio@osite.com.br
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Erro no CLOSE DATA quando tem relacionamento

Mensagem 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.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Erro no CLOSE DATA quando tem relacionamento

Mensagem 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
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Erro no CLOSE DATA quando tem relacionamento

Mensagem 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?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Erro no CLOSE DATA quando tem relacionamento

Mensagem 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.
ssflavio
Usuário Nível 2
Usuário Nível 2
Mensagens: 86
Registrado em: 10 Jul 2008 09:57
Localização: São Paulo / SP

Erro no CLOSE DATA quando tem relacionamento

Mensagem por ssflavio »

obrigado pela ajuda amigos!
a ideia do Jairo caiu como uma luva para a minha necessidade!

GRATIDÃO!
Flávio dos Santos Szelbracikowski
ssflavio@osite.com.br
Responder