Meus queridos, essa é a segunda parte desta série de artigos explicando como é possível aplicar POO em arquivos do tipo fixo-blocado :-)

No artigo anterior, vimos que o elemento base deste tipo de arquivo é a definição de cada campo de um registro, definição esta que inclui o tipo de dado, a máscara, a quantidade de posições, a posição inicial na linha entre outros.

Uma linha de um arquivo, é uma coleção destes campos, ou seja, deve haver um atributo que indique os campos pertencentes à linha.

Vamos criar então uma classe que represente cada linha do arquivo, chamaremos-a com o nome sugestivo de TRegistroEDI

public class TRegistroEDI
{
     protected TTipoRegistroEDI _TipoRegistro;
     protected int _TamanhoMaximo = 0;
     protected char _CaracterPreenchimento = ' ';
     private string _LinhaRegistro;
     protected List _CamposEDI = new List();
  
     public virtual void CodificarLinha()
     {
         this._LinhaRegistro = "";
         foreach (TCampoRegistroEDI campos in this._CamposEDI)

             campos.CodificarNaturalParaEDI();
             this._LinhaRegistro += campos.ValorFormatado;
         }
     }
  
     public virtual void DecodificarLinha()
     {
         foreach (TCampoRegistroEDI campos in this._CamposEDI)
         {
             if (this._TamanhoMaximo > 0)
             {
                 this._LinhaRegistro = this._LinhaRegistro.PadRight(this._TamanhoMaximo, this._CaracterPreenchimento);
             }
             campos.ValorFormatado = this._LinhaRegistro.Substring(campos.PosicaoInicial, campos.TamanhoCampo);
             campos.DecodificarEDIParaNatural();
         }
     }
 }

Acima, declaramos resumidamente a classe que compõe cada linha do registro em um arquivo. Note que eu omiti a parte de variáveis públicas...

As propriedades públicas são LinhaRegistro, TipoRegistro e CamposEDI, que correspondem às variáveis protegidas com o mesmo nome, precedidas de underline.

Ah, notou a presença de um objeto do tipo TTipoRegistroEDI? Sim, ele trata-se de uma enumeração que indica os tipos possíveis em um arquivo EDI: Header, Detalhe e Trailler.

De caráter meramente informativo, claro, dependendo da sua implementação.

A propriedade mais importante, é a coleção CamposEDI, que trata-se de uma impelemtação do objeto List, implementando uma lista de objetos do tipo TCampoRegistroEDI.

Note também que há dois métodos virtuais (notou? se o método é declarado como virtual, ele pode ser sobreescrito - override - em uma classe descendente né?), CodificarLinha e DecodificarLinha.

O primeiro, como o nome já diz, codifica um conjunto de campos EDI em uma única linha, que representa o registro do arquivo. O mecanismo é simples: A função varre a lista contendo os campos do registro; Em cada campo, é chamado o método CodificarNaturalParaEDI(), que aplica a máscara ao valor contido na propriedade ValorNatural (lembra,um object que pode receber qualquer tipo de dado?) e concatena-a na variável _LinhaRegistro. Após varrer todos os campos, é obtida uma linha completa, na propriedade

LinhaRegistro do objeto do tipo TRegistroEDI.

Analogamente, o método DecodificarLinha, faz a operação inversa: Varre cada campo do registro EDI (os objetos que estão definidos na lista _CamposEDI, já com as configurações),

acrescenta o caracter de preenchimento definido na variável _CaracterPreenchimento até completar a quantidade de caracteres que está definido no campo _TamanhoMaximo.

Em seguida, atribui uma substring da linha que vem do arquivo (na propriedade LinhaRegistro) na propriedade ValorFormatado no campo, substring esta que é iniciada no caracter correspondente ao valor inicial do campo e com tamanho definido como o tamanho do campo. Feito isso, é chamado o método de decodificação deste campo, transformando-o em um objeto que será atribuído na propriedade ValorNatural de cada campo.

Este é o funcionamento básico, mas aí você pode perguntar: Mas como e onde eu atribuo os valores?

Bem, isto é assunto para não o seguinte artigo, pois nele vamos construir a estrutura básica de um arquivo, juntando o conteúdo deste e do artigo anterior. No próximo, aí sim,

iremos implementar um layout utilizando isso tudo!

Mas se quiser, pode fazer o seguinte teste, seja com uma aplicação console, windows forms, web, com um layout de dois campos.

public void TesteLayout()
{
 //Teste de formatação de um campo EDI:
 TCampoRegistroEDI campo1 = new TCampoRegistroEDI(TTiposDadoEDI.ediInteiro, 8, 0, 0, null, null, 1);
 TCampoRegistroEDI campo2 = new TCampoRegistroEDI(TTiposDadoEDI.ediDDMMAA, 6, 0, 0, null, null, 9);
 
 campo1.ValorNatural = 12;
 campo2.ValorNatural = DateTime.Now();

 //Veja o resultado das variáveis abaixo!
 string campo1formatado1 = campo1.CodificarNaturalParaEDI();
 string campo1formatado2 = campo2.CodificarNaturalParaEDI();

 //Teste de montagem de linha de registro
 TRegistroEDI reg = new TRegistroEDI();
 reg.CamposEDI.Add(campo1);
 reg.CamposEDI.Add(campo2);
 reg.CodificarLinha();
 //Veja o resultado da variável abaixo!
 string linha = reg.LinhaRegistro;
}

Com esse pequeno código, até já se pode fazer um trabalho pontual... mas o objetivo da série de artigos é construir uma classe que represente um arquivo INTEIRO, onde você só precisará carregá-lo para interpretar (ele já montará a coleção com todas as linhas, todos os campos em um único método), ou atribuir dados em campos e adicionar para montá-lo!

Abraço a todos!

Classe Base para Arquivos EDI (Zip - 5 KiB)

[Atualização 10/02/2011]: O leitor Pinho apontou um erro no link acima, que era um arquivo .cs e o servidor não deixou baixar. Zipei este arquivo, agora ele estará disponível :).
Também aproveitei a deixa para transformar os trechos de código para utilizar o Code Insight em JavaScript que é utilizado no blog, limpando bem o HTML deste post ;).