Página 1 de 1

Outras arquivos são fechados com comando Use arquivo shared

Enviado: 30 Ago 2017 20:15
por porter
Olá pessoal,
Tenho 22 arquivos abertos, quando tento abrir por exemplo o ARQUIVO18, ele abre normalmente, mas os arquivos anteriores são fechados, ou seja do ARQUIVO17 ate o ARQUIVO01, são fechados, pelo Debugador, verifiquei que eles fecham na linha USE ARQUIVO18 SHARED, não sei o que há de errado com essa função, em outras partes do sistema, quando há menos arquivos abertos, esse problema não acontece, não creio que aja uma quantidade excessiva de arquivos abertos.

HARBOUR 3.2.0(dev)

ARQUIVO1.DBF
.
.
.
ARQUIVO22.DBF

FUNCTION ABRE_18
SELECT 18
USE ARQUIVO18 SHARED <--- Nessa linha, os arquivos anteriores a ele, são fechados...
RETURN

Outras arquivos são fechados com comando Use arquivo shared

Enviado: 30 Ago 2017 20:22
por Itamar M. Lins Jr.
Ola!
Cadê o parâmetro "NEW" ?

Código: Selecionar todos

NEW opens <xcDatabase> in the next available work area making it the
     current work area.  If this clause is not specified, <xcDatabase> is
     opened in the current work area.
Saudações,
Itamar M. Lins Jr.

Outras arquivos são fechados com comando Use arquivo shared

Enviado: 31 Ago 2017 08:47
por Jairo Maia
Olá Pessoal,

Porter, quando você seleciona uma área e abre um arquivo, o arquivo aberto nessa área é fechado. Porém, não é seu caso, pois você está selecionando a área 18 e abrindo o arquivo, não deveria fechar nenhum outro. Você disse que somente nesse caso acontece isso, acho que há algo errado antes de você chamar essa função que está fechando os arquivos antes.

É que não sei se seu sistema trabalha chamando a área diretamente pelo número, se for (aliás desaconselhável), então fica complicado alterar, mas se não for o caso, ou seja, se você seleciona a área pelo nome do ALIAS, sugiro alterar sua função dessa forma:

Código: Selecionar todos

FUNCTION ABRE_18
IF SELECT(  ARQUIVO18 ) = 0
 USE ARQUIVO18 SHARED NEW
ELSE
 SELECT ARQUIVO18
ENDIF
RETURN

Outras arquivos são fechados com comando Use arquivo shared

Enviado: 31 Ago 2017 09:08
por JoséQuintas
Uma observação no fonte do Jairo, que até me deixou na dúvida.
Sempre usei com aspas

Código: Selecionar todos

Select( "arquivo18" )
Não confundir o comando SELECT com a função Select(), é o mesmo nome, mas são coisas diferentes.

Uma coisa que uso no meu aplicativo é isto:

Código: Selecionar todos

SELECT  ( Select( "ARQUIVO18" ) )
USE arquivo18
Se estiver aberto, retorna o número da área e já seleciona a área.
Se estiver fechado, retorna 0, e seleciona uma área nova.

Só cuidado com coisas deste tipo:

Código: Selecionar todos

SELECT( CLIENTE )
GOTO TOP
Isso não vai selecionar a área CLIENTE, isso apenas vai retornar o número da área e vai continuar na atual.
O espaço depois de select e antes dos parêntesis é que vai definir se é comando ou função.
Veja se não fez isso no seu fonte.

E como já foi dito pelo Itamar, outra opção é usar o NEW no comando USE.

Nota: O primeiro caso é pra se criar uma rotina de abrir arquivos, no uso normal basta o NEW, ou SELECT 0 antes de abrir.

Outras arquivos são fechados com comando Use arquivo shared

Enviado: 31 Ago 2017 09:20
por Jairo Maia
Tem razão José, é entre aspas:

Código: Selecionar todos

IF SELECT(  "ARQUIVO18" ) = 0

Outras arquivos são fechados com comando Use arquivo shared

Enviado: 31 Ago 2017 09:24
por JoséQuintas
Cadê o parâmetro "NEW" ?
Itamar, tá no fonte, área 18, é um jeito ruim de programar, mas também funciona.... rs

Código: Selecionar todos

SELECT 18
USE ARQUIVO18 SHARED 
E aproveitando:

Se possível, não use número de área ou número pra índice.

Código: Selecionar todos

SELECT 0
USE CLIENTES
INDEX ON codcli TAG codigo
SET INDEX TO CLIENTES
SELECT 0
USE ESTOQUE
INDEX ON codpro TAG produto
SET INDEX TO ESTOQUE
SELECT CLIENTES
OrdSetFocus( "código" )
SELECT ESTOQUE
OrdSetFocus( "produto" )
Ao invés de decorar números, pode usar o nome, melhor pra conferir o fonte. - no caso de índice, vale pra CDX
Quanto ao SELECT 0, ou isso, ou a cláusula NEW, os dois tem o mesmo efeito.

Mesmo assim, isso não explica fechar todos os arquivos, no máximo fecharia o último.
A não ser que tenha feito a mesma coisa em todos os arquivos, sem selecionar área nova.
ou tenha um CLOSE DATABASES em algum ponto do fonte.