Finalmente vamos à 3ª e penúltima parte desta série de artigos sobre EDI com POO. Sim, porque vamos descrever agora como implementar uma classe que representa um arquivo em si.

Como falamos em artigos passados, um arquivo EDI é uma coleção de registros EDI, não é?
Vou colocar a definição da classe base de um arquivo e vamos comentá-la para o assunto não ficar "maçante", como na primeira parte...

    public class TEDIFile
    {
        #region Variáveis Privadas e Protegidas
        #endregion
     
        #region Propriedades
        public List Lines = new List();
        #endregion
     
       #region Métodos Privados e Protegidos
       /// 
       /// Decodifica a linha do registro EDI para os campos; O tipo de campo/registro EDI depende
       /// do layout especificado.
       /// 
       /// Linha do arquivo a ser decodificada
       protected virtual void DecodeLine(string Line)
       {
       
       }
       #endregion
    
       #region Métodos Públicos
       /// 
       /// Carrega um arquivo EDI
       /// 
       /// Nome do arquivo a ser carregado
       public virtual void LoadFromFile(string FileName)
       {
           StreamReader sr = new StreamReader(FileName);
           this.Lines.Clear();
           while (!sr.EndOfStream)
           {
               this.DecodeLine(sr.ReadLine());
           }
           sr.Close();
           sr.Dispose();
       }
    
       public virtual void LoadFromStream(Stream s)
       {
           this.Lines.Clear();
           StreamReader sr = new StreamReader(s);
           while (!sr.EndOfStream)
           {
               this.DecodeLine(sr.ReadLine());
           }
           sr.Close();
           sr.Dispose();
       }
    
       /// 
       /// Grava um arquivo EDI em disco
       /// 
       /// Nome do arquivo EDI a ser salvo
       public virtual void SaveToFile(string FileName)
       {
           StreamWriter sw = new StreamWriter(FileName);
           foreach (TRegistroEDI linha in this.Lines)
           {
               linha.CodificarLinha();
               sw.WriteLine(linha.LinhaRegistro);
           }
           sw.Close();
           sw.Dispose();
       }
       #endregion
   }

Veja que como principal propriedade, temos um objeto List, que representa uma coleção de objetos TRegistroEDI. Nesta propriedade teremos acesso a todos os registros de um arquivo, ou seja, esta classe representa o arquivo em si.

Temos o método virtual DecodeLine, recebendo uma string como parâmetro. Esta string é uma linha do arquivo gravado/a ser gravado no disco. Notaram que este método não faz nada?

Calma lá! Lembre-se que esta é uma classe base, ou seja, o arquivo EDI em si é derivado dela, usaremos herança e sobreescrevemos o método DecodeLine de acordo com o tipo de layout!

Para adiantar um pouco, é nele que iremos atribuir a linha do arquivo na propriedade LinhaRegistro de um objeto TRegistroEDI e chamamos a rotina de decodificação do mesmo e em seguida é feita a adição do um objeto TRegistroEDI decodificado na propriedade Lines..

Os métodos LoadFromFile e LoadFromStream têm funcionamento semelhante (a diferença é que o LoadFromFile cria um stream dentro do método, e em seguida executa a mesma coisa que o LoadFromStream, recebendo diretamente um stream): É feita a leitura linha a linha do arquivo EDI, onde a mesma passa pelo método DecodeLine (sim, ele mesmo, o que não tem implementação na classe TEDIFile!).

O método SaveToFile possui funcionamento "inverso" dos métodos de carga: A propriedade Lines é lida elemento por elemento, e cada elemento é codificado peo método CodificarLinha da classe TRegistroEDI e é adicionado a um StreamWriter. Em seguida, este stream é salvo em um arquivo no disco.

Que tal alterarmos um pouco o nosso método de teste do artigo anterior?

    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;
    
       //Testando o salvamento do arquivo
       TEDIFile arq = new TEDIFile();
       arq.Lines.Add(campo1);
       arq.Lines.Add(campo2);
       arq.SaveToFile("C:MeuArq.txt");
    
       //Testando a carga do arquivo
       TEDIFIle arq2 = new TEDIFile();
       arq.LoadFromFile("C:MeuArq.txt");
       //agora, dê um "watch" na variável Arq e veja o conteúdo dela...
   }

No próximo artigo desta série, teremos uma aplicação completa de desenvolvimento de um layout, usando este conjunto de classes!
Até lá!