 
       
   
Você está em: Soluções » CONNECTware » Qualquer linguagem trata arquivo COBOL a custo zero.
Qualquer linguagem trata arquivo COBOL a custo zero.
Uma dica para os caros colegas COBOLeiros, recomendo ter paciência para ler  tudo. A área de TI de muitas empresas pode mudar “da água para o vinho” quando  mais profissionais dominarem essa técnica no Brasil.
      
    Não sei se já repararam mas todos os comandos de operação de I/O são convertidos  pelo compilador em chamadas a um manipulador padrão de arquivos o EXFFH no caso  de acessos locais e o FHRDIR para acesso via Fileshare, bem eu particularmente  uso somente o FHREDIR pois ele é mais versátil já que por configuração também  acessa arquivos locais, isso é feito com a diretiva de compilação CallFH que define qual manipulador o  compilador deve utilizar (CallFH”FHREDIR”).
  
    Bem, isso torna a base de dados da arquitetura do Micro Focus COBOL aberta  (vale também para Microsoft COBOL a partir da versão 3), sendo possível então  que terceiros possam escrever manipuladores para acessarem outras bases de  dados, com os programas permanecendo inalterados a exemplo do que foi feito  para BTRIEVE.
  
    Para atender a demanda por acesso a bancos de dados dos clientes da COBOLware,  escrevi o manipulador CWSQLC, utilizado da diretiva CallFH “CWSQLC” que no momento da  abertura dos arquivos verifica em uma tabela se o arquivo deve ser tratado em  ISAM, em Oracle ou em DB2, repassando a tarefa para o manipulador apropriado  para o arquivo ou tabela isso me proporcionou a oportunidade de conhecer melhor  o processo de tratamento de arquivos e gostaria de compartilhar um pouco desse  conhecimento que me parece bem valioso.
  
  No caso de tratamento em ISAM o CWSQLC  repassa as tarefas os manipuladores FHREDIR ou EXTFH evitando que o servidor FIleshare trate arquivos de trabalho em  memória (Heap files) que ao meu ver devem ser  tratados pelas estações e nunca pelo servidor como o FHRDIR faz, realizando de  forma configurável e opcional o tratamento automático de erros de File Status.  De quebra, os relatórios são capturados e direcionados para spool automaticamente, inspirado no  VSE/POWER.
  
Desse modo, na mesma compilação e com a forma de programar tradicional do  COBOL, um programa pode ser utilizado por empresas que tenham Oracle ou DB2 ou  não tenham banco nenhum.
O interessante é que este FHREDIR é uma DLL de 32-bit que pode então ser usada também por qualquer “linguagem Windows” Isso é aberto e bem documentado pela Micro Focus, mas creio que por dificuldades com a língua inglesa fazem com que os programadores COBOL e o mesmo de outras linguagens que gostariam ter acesso as bases de dados COBOL em sua maioria desconheçam esse recurso.
Gostaria de fazer uma contribuição para os colegas COBOLeiros e para os interessados em acessar bases COBOL nativas utilizando a FHRDIR.DLL (é isso que faz o Connectware, U/SQL, Relativity e CObjects) com um resumo com dicas e exemplos.
As chamadas a um manipulador padrão  Micro Focus (EXTFH, FHREDIR, CWSQLC) são especificados assim:
    
CALL “manipulador” USING OPCODE FCD
OPCODE é o código da operação a ser realizada e FCD é a File Control Description (uma compilação das declarações da  SELECT do arquivo).
Quando o um programa tem  declarado por exemplo:
OPEN  I-O FileName
O compilador Micro Focus passa para o runtime o equivalente:
SET OP-OPEN-IO TO TRUE
CALL “FHREDIR” USING OPCODE FileName
Repare que o nome do arquivo (FileName) está sendo passado como parâmetro  para a chamada ao manipulador, isso equivale a FCD, um programa COBOL pode  então passar uma FCD para outro programa COBOL que pode então usar uma lógica  padrão para tratar o arquivos sem conhecer previamente a sua estrutura (sem  declarações SELECT/FD), coisa normalmente considerada impossível pelos  programadores COBOL.
Tendo em mente que COBOL é um assembler disfarçado remova da sua “memória  principal” o conceito de que “não dá para fazer isso ou aquilo em COBOL”, dá  sim, qualquer coisa que um computador possa fazer pode ser codificada em COBOL,  se quiséssemos poderíamos escrever o Window, o Linux, o Delphi, compilador C#,  o próprio compilador COBOL, enfim a gente pode não saber fazer ou não valer a  pena fazer mas que é possível fazer em COBOL é, as limitações estão na  utilização e não na linguagem, talvez seja necessário atualizar sua versão de  compilador e/ou seus conhecimentos, mudar de linguagem é tempo  perdido.
    
Feito isso  observe esse outro detalhe:
A LINKAGE SECTION, seção de ligação é normalmente utilizada para trocar  parâmetros entre programas COBOL <=> COBOL e COBOL <=> outras  linguagens, mas a LINKAGE SECTION também pode ser usada para que o programa  chamado acesse qualquer posição da memória basta que o programa chamado tenha  conhecimento do endereço e do tamanho do que se deseja manipular (isso é assembler) e com esse recurso você pinta e  borda na memória e vira qualquer computador do avesso.
Note que o campo FCD-RECORD-ADDRESS  tem a USAGE POINTER isso indica que ele é capaz de armazenar o endereço de uma  variável, pois bem, quando um campo é definido na LINKAGE SECTION ele é apenas  um LAYOUT ele não existe fisicamente na memória da rotina (termo “rotina”  apenas porque chamador é muito parecido com chamado), ele existe de fato  somente na memória do programa chamador, a cláusula USING utilizada no comando  CALL passa os endereços das variáveis do programa chamador para a rotina que  com o USING de sua PROCEDURE DIVISION “endereça” seus parâmetros, que passam  então a serem acessíveis pelo programa chamado.
      
    Quando uma rotina precisa acessar uma variável pelo endereço já que o nome e o  tamanho são definidos somente em tempo de execução definimos então a variável  na LINKAGE SECTION com qualquer tamanho, PIC X(1) por exemplo, nesse caso a  variável nem precisa ser citada no USING da PROCEDURE DIVISION da rotina nem  será referenciada no CALL do programa chamador.
Serão referenciados normalmente é claro as variáveis que contenham o endereço e o tamanho dos itens “indefinidos” a serem tratados.
Um manipulador (Micro Focus pelo menos  pois não tenho conhecimento de que outros ambientes ou linguagens usem ou não  definições nesse formato) recebe então pela FCD os parâmetros de Identificação  da abertura, buffer da FD, label(nome externo do arquivo) e definição das  chaves na forma de endereços.
Não é difícil em COBOL obter o endereço de uma variável, utiliza-se o comando  SET e a função LENGTH para se obter o tamanho do registro.  Quando um manipulador precisa acessar por  exemplo o buffer da FD ele faz algo como:
LINKAGE SECTION.
01 OPCODE vide descrição acima.
01 FCD vide descrição acima.
01 REGISTRO PIC X.
ROCEDURE DIVISION USING OPCODE FCD.
SET ADDRESS OF REGISTRO TO FCD-RECORD-ADDRESS
A partir daqui a referencia REGISTRO passa a ser válida para referenciar o  buffer da FD do programa chamador
por exemplo; MOVE REGISTRO (1: FCD-CURRENT-REC-LEN) TO ...., registro tem PIC X  mas a referencia posicionada é autorizada a acessar toda a memória disponível a  partir do endereço, por isso se deve ter cuidado ao se utilizar referencias  posicionadas para não invadir memória não autorizada (o famigerado erro  114).
Já o programa que está chamando o manipulador em ”low-level” teria algo como:
SET FCD-RECORD-ADRESS TO ADDRESS OF CADSTRO-REG 
MOVE LENGTH CADSTRO-REG TO FCD-CURRENT-REC-LEN
SET OP-operação-desejada TO TRUE
CALL “manipulador” USING OPCODE CADASTRO
Nunca me envolvi com outras linguagens o suficiente para poder ajudar os programadores de outras linguagem a acessarem arquivos ISAM Micro Focus, sempre achei mais prático recomendar o Connectware que via ODBC trata as bases ISAM via SQL que está mais de acordo com a cultura desses programadores. Então indico aqui a documentação em inglês da Micro Focus que detalha como chamar um manipulador de arquivos (File Handler) inclusive com um exemplo em C, bem creio que nessas linguagens mais científicas ou tecnocráticas a forma de chamar o manipulador seja bem parecido com a forma do C.
Exemplo em C:
#define XFH_CLOSE_FILE           0xFA80 
    #define XFH_OPEN_NEW_INDEX      0x0007 
    #define XFH_GET_NEXT_REC        0x0008 
    #define XFH_ADD_KEY_VALUE       0x0009
    main() 
    {
    put2ws(op_code,XFH_OPEN_NEW_INDEX);     
    EXTFH(op_code,&fcd);
    put2ws(op_code,XFH_GET_NEXT_REC);
    EXTFH(op_code,&fcd);
    while(status[0] == '0');
      {
        get2ws(fcd.key_count,num_keys);
        i=0;
      while(i  num_keys  && status[0] == '0')  
          {
            put2ws(fcd.key_id,i++);
            put2ws(op_code,XFH_ADD_KEY_VALUE);
            EXTFH(op_code,&fcd);  
          }
        put2ws(op_code,XFH_GET_NEXT_REC);
        EXTFH(op_code,&fcd);     
      }
    put2ws(op_code,XFH_CLOSE_FILE);
    EXTFH(op_code,&fcd); 
    }
Dizem que sou defensor do COBOL ou  vendedor de COBOL, não é bem isso eu apenas e francamente lamento pelo  desperdício de inteligência quando um programador opta por outra linguagem  “mais moderna” mas que o limita castrando a sua carreira profissional umas  porque não rodam no Windows, outras porque não rodam no Linux, outras porque  não rodam em Maiframes, e outras porque são muito lentas  no tratamento de grandes volumes de dados, outras porque ninguém entendo o  programa escrito e na hora da manutenção acaba sendo jogado fora, e COBOL está  aí a meio século, oferecendo embrenhado em tudo isso de forma veloz, legível,  portável, configurável e durável.
      
    Deixam de conhecer ou até mesmo abandonam a linguagem por falta de conhecimento  por que pensam que a linguagem não tem orientação a objetos, ou interface  gráfica, ou não acessa bancos de dados ou não tem integração com a Internet o  que não faz isso ou aquilo, mas faz e faz bem antes e melhor do que as outras e  com várias opções de fornecedor, só o que não “sabe fazer” é se auto-promover, não precisa é a linguagem de  programação mais importante, quem perde não é a linguagem COBOL o perdedor é o  programador que não a conhece ou a empresa que não teve a sorte de optar por  ela.