A de hoje é sobre abrir arquivos.
É normal abrir arquivos em todos os programas.
Mas são sempre os mesmos, no máximo o que acontece é ser em ordem diferente.
Então porque não uma função pra isso.
Vamos lá:
Código: Selecionar todos
PROCEDURE Main
SELECT 0
IF .NOT. Net_Use( "CLIENTES" )
RETURN
ENDIF
SELECT 0
IF .NOT. Net_Use( "FORNEC" )
RETURN
ENDIF
SELECT 0
IF .NOT. Net_Use( "PEDIDOS" )
RETURN
ENDIF
...
Por enquanto pular testes de arquivos, índices, etc.
Tem gente que usa assim em todos os fontes.
Somado à checagem de existir ou não o arquivo, fica maior ainda.
Já usei assim também.
Numa determinada época deixei numa função fixa no próprio fonte, só pra separar em blocos.
IMPORTANTE: Tem gente que ainda não entende sobre variáveis locais, parâmetros na função, e funções/procedures STATIC. Isso facilita muito.
Então o fonte virou isto:
PROCEDURE Main
IF .NOT. AbreArquivos()
RETURN
ENDIF
...
STATIC FUNCTION AbreArquivos()
// E o conteúdo do fonte anterior
RETURN .T.
[/code]
Em todos os fontes, pode ser usado exatamente o mesmo nome, já que é estática, visível somente no fonte. Cada fonte tem sua função AbreArquivos().
Isso é pouco, mas já deixa o fonte de sua rotina menor, por separar a parte de abrir arquivos.
Mas olhando a parte de abrir arquivos, são todas iguais, tem o SELECT 0, e depois o NET_USE()
Então simplificar, vamos criar AbreUmArquivo() que vai abrir só um arquivo.
Já poderemos ter uma única função AbreUmArquivo() para o sistema inteiro.
Código: Selecionar todos
PROCEDURE Main
IF .NOT. AbreUmArquivo( "clientes" )
RETURN
ENDIF
IF .NOT. AbreUmArquivo( "fornec" )
RETURN
ENDIF
IF .NOT. AbreUmArquivo( "pedidos" )
RETURN
ENDIF
...
FUNCTION AbreUmArquivo( cNome )
SELECT 0
IF .NOT. Net_Use( cNome )
RETURN .F.
ENDIF
RETURN .T.
Economizou o SELECT 0. É pouco, mas já evita com que esqueça disso.
Bom, é sempre igual, só altera o nome.
E se... a função aceitasse uma lista de arquivos?
Já temos pra abrir um arquivo, falta pra uma lista de arquivos.
Vamos lá, se é lista... array
Código: Selecionar todos
PROCEDURE Main
IF .NOT. AbreArquivos( { "clientes", "fornec", "pedidos" } )
RETURN
ENDIF
...
FUNCTION AbreArquivos( acLista )
LOCAL nCont
FOR nCont = 1 TO Len( acLista )
IF .NOT. AbreUmArquivo( acLista[ nCont ] )
CLOSE DATABASES
RETURN .F.
ENDIF
NEXT
RETURN .T.
FUNCTION AbreUmArquivo( cNome )
RETURN Net_Use( cNome )
Pronto.
Uma função que recebe uma lista, e que chama a nossa rotina de abrir um único arquivo para cada nome da lista.
Lembrando: não precisa mais AbreUmArquivo() ou AbreArquivos() em cada fonte. Basta uma função dessa pro sistema inteiro (ou pra todos os sistemas).
E se quiser testar se arquivo existe?
Só acrescentar em AbreUmArquivo()
E se quiser também abrir os índices?
Só mexer em AbreUmArquivo().
Pode identificar qual é o arquivo, e já acrescentar os índices.
Pode até criar AbreCdx(), pra aceitar a lista igual foi feito pra DBFs.
Vantagem: menos digitação, e certeza de que os arquivos serão abertos com o/os índices corretos.
Precisa usar determinado arquivo em outra ordem?
Ok. Depois de abrir seleciona.
Código: Selecionar todos
IF .NOT. AbreArquivos( { "clientes", "fornec", "pedidos" } )
RETURN
ENDIF
SELECT clientes
OrdSetFocus( "nome" )
// SET ORDER TO 2
Ah sim... selecionar arquivo pelo NOME, e índice também pelo NOME ou TAG, facilita. Identifica mais rápido a ordem que está sendo usada, sem ter que ficar vasculhando fonte.
Importante:
Como digo sempre, são sugestões.
Cada um pode criar um jeito até melhor de usar, ou pra atender o seu uso.
E se precisar alias conforme módulo?
Só acrescentar um parâmetro a mais pra AbreArquivos() e pra AbreUmArquivo()
E se precisar exclusivo?
Também poderia acrescentar um parâmetro pra isso.
Vantagens?
Menos digitação pra novos fontes.
Mais seguro: vai ter certeza que está sempre certa a abertura de arquivos, porque sempre é igual
Menos fonte pra trabalhar, o que deixa mais visível o restante do fonte.
Etc. etc.
E pode aperfeiçoar as aberturas, colocar mensagens de aviso, etc, alterando uma única função, a AbreUmArquivo().