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: 20416
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 2820
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP
Curtiu: 2 vezes

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: 3109
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: 2820
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP
Curtiu: 2 vezes

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: 20416
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 1912
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