quinta-feira, 31 de janeiro de 2008

O segredo do External File Handler

Aprendendo sobre alguns recursos do compilador Microfocus, é possível acessar bancos de dados sem mexer numa única linha de código dos seus programas que acessam arquivos indexados. Sim, isso é possível. Continue usando "read", "start", "open", mas tenha em suas mãos o banco de dados de sua preferência.

Esse artigo foi escrito baseado na versão 3.0 e 3.1 do NetExpress.

Conhecendo o External File Handler
Quando escrevemos em nossos programas comandos de acesso a um arquivo, um "open", um "read" ou um "start", o compilador converte esses comandos em chamadas para o executável EXTFH.EXE. Esse é o executável do runtime que realiza todas as operações de arquivos no compilador Microfocus. As chamadas são feitas exatamente como no código a seguir:

call "EXTFH" using Operacao DadosDoArquivo

Um código específico é enviado ao EXTFH quando efetuamos, por exemplo, um "open" em um arquivo. Além do código específico da operação, os dados do arquivo são passados através de uma estrutura de dados, que se encontra no arquivo XFHFCD.CPY, um "copybook file" que pode ser copiado em qualquer fonte Cobol. Esse arquivo encontra-se na pasta SOURCE, dentro da pasta de instalação do NetExpress.

A estrutura de dados XFHFCD.CPY
No arquivo de ajuda do Microfocus NetExpress não existem muitas informações sobre a estrutura de dados encontrada no arquivo XFHFCD.CPY, infelizmente. Porém, com um pouco de paciência, o desenvolvedor vai encontrar a descrição de alguns dos campos dessa estrutura, além da relação completa dos códigos que identificam as operações de arquivos passadas para o EXTFH.

Criando seu próprio External File Handler
O compilador Microfocus permite que o desenvolvedor crie seu próprio External File Handler. Assim, todas as chamadas das operações de arquivos serão feitas para esse programa. Com esse recurso, o desenvolvedor pode "interceptar" as operações de um determinado arquivo e intepretá-las da forma que desejar. A diretiva CALLFH indica qual programa deve ser chamado para interpretar as operações de arquivo:

$SET CALLFH"MEUFH"

Com essa diretiva definida em um programa, todas as operações de arquivos nesse programa serão convertidas para o código a seguir:

call "MEUFH" using Operacao DadosDoArquivo

O programa MEUFH.CBL
No exemplo a seguir, o programa MEUFH.CBL recebe os dados do programa chamador e simplesmente faz a chamada para o EXTFH, que é o External File Handler padrão da Microfocus, sem fazer qualquer alteração nas operações de arquivos:

program-id. MEUFH.

linkage section.
01 lnkOperacao pic xx.
01 lnkDadosDoArquivo.
copy "XFHFCD.CPY".

procedure division using lnkOperacao lnkDadosDoArquivo.

....call "EXTFH" using lnkOperacao lnkDadosDoArquivo
....exit program.

Obtendo outras informações do arquivo
Adicionando algumas linhas, poderíamos obter outras informações do arquivo:

program-id. MEUFH.

working-storage section.
77 wsTamanhoDoRegistro pic 9(09) comp-5.

linkage section.
01 lnkOperacao pic xx.
01 lnkDadosDoArquivo.
copy "XFHFCD.CPY".

01 lnkNomeDoArquivo pic x(1024).
01 lnkRegistro pic x(32767).

procedure division using lnkOperacao lnkDadosDoArquivo.
....*> Para saber o nome do arquivo
....set address of lnkNomeDoArquivo to fcd-filename-address

....*> Para saber o tamanho do registro
....move fcd-current-rec-len to wsTamanhoDoRegistro

....*> Para pegar o conteúdo do registro que foi passado
....set address of lnkRegistro to fcd-record-address

....call "EXTFH" using lnkOperacao lnkDadosDoArquivo
....exit program.

Acessando tabelas de um banco de dados
Com as informações básicas descritas acima, o desenvolvedor poderia identificar qual operação foi requisitada e em qual arquivo essa operação seria efetuada. Identificada a operação, bastaria efetuar no mesmo programa MEUFH.CBL, chamadas a parágrafos ou rotinas que processariam a operação específica, porém, utilizando a tabela correspondente em um banco de dados. utilizando e atualizando a variável que corresponde ao registro do arquivo, ao retornar para o programa chamador, todos os dados estariam devidamente atualizados, sem a necessidade real de qualquer alteração no programa que contém os comandos "open", "read" ou "start".

Exemplos práticos
Aos desenvolvedores que pesquisarem sobre esse assunto e conseguirem resultados práticos, sintam-se à vontade para enviarem seus materiais, projetos e programas, para que eu possa publicá-los e assim ajudar a outros desenvolvedores que desejam utilizar os mesmos recursos. Compartilhando a informação, teremos sempre o melhor do que a linguagem pode nos oferecer. Estarei sempre contando com a colaboração de vocês.

Um comentário:

Unknown disse...

Utilizamos esse método para prestar servições de adaptação de aplicativos COBOL, Ao utilizar a diretiva CALLFH"CWSQLC" os aplicatvivos passam a acessar banco de dados (Oracle ou DB2) de acordo com uma configuração externa opcional, assim o aplicativo opera com ou sem banco seletivamente por tabela.

http://www.cobolware.com/integracao.html