O NeoMatrix Tech está de casa nova!

Você deverá ser redirecionado em 6 segundos. Se não, visite:
http://www.leonelfraga.com/neomatrixtech
e atualize seus favoritos.

Aviso IMPORTANTÍSSIMO!

Aviso aos navegantes:

O NeoMatrix Tech mudou de casa!!!

A partir de agora, acessem pelo novo endereço:

http://www.leonelfraga.com/neomatrixtech

Ué... mas é só o domínio mudou de lugar?

R: Na verdade, não é bem assim hehe. Este domínio que você acessa agora aponta para um blog hospedado no Blogger, enquanto no novo, aponta para um blog na plataforma Wordpress, hospedagem própria, muito mais rápida e com um layout mais agradável de ler ;)

Não vou fechar este domínio igual ao que eu fiz com o NM Light (que já está 100% na nova plataforma). Talvez beeeeeeem depois eu faça isso.

Todos os posts daqui se encontram lá, e novos posts serão colocados somente no novo endereço.
A única coisa que não consegui importar foram os comentários. Mas em breve vai ter um post contando sobre a epopéia que foi migrar o NeoMatrix Tech!

Somente vou fechar a área de comentários daqui. Caso queiram comentar, favor ver o post correspondente no "Novo NeoMatrix Tech" e comentem por lá. É bem melhor! (pena que os permalinks "amigáveis para SEO" não funcionam lá, dá erro 404 e não consigo fazer a configuração funcionar. E olha que eu já vi vários artigos falando desse assunto :( ).

Quem assina o feed, já está lendo o conteúdo do novo NeoMatrix Tech!

quarta-feira, 24 de junho de 2009

Fazendo Arquivos EDI com C# aplicando POO Parte 3

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...

   1: public class TEDIFile
   2: {
   3:     #region Variáveis Privadas e Protegidas
   4:     #endregion
   5:  
   6:     #region Propriedades
   7:     public List<TRegistroEDI> Lines = new List<TRegistroEDI>();
   8:     #endregion
   9:  
  10:     #region Métodos Privados e Protegidos
  11:     /// <summary>
  12:     /// Decodifica a linha do registro EDI para os campos; O tipo de campo/registro EDI depende
  13:     /// do layout especificado.
  14:     /// </summary>
  15:     /// <param name="Line">Linha do arquivo a ser decodificada</param>
  16:     protected virtual void DecodeLine(string Line)
  17:     {
  18:     
  19:     }
  20:     #endregion
  21:  
  22:     #region Métodos Públicos
  23:     /// <summary>
  24:     /// Carrega um arquivo EDI
  25:     /// </summary>
  26:     /// <param name="FileName">Nome do arquivo a ser carregado</param>
  27:     public virtual void LoadFromFile(string FileName)
  28:     {
  29:         StreamReader sr = new StreamReader(FileName);
  30:         this.Lines.Clear();
  31:         while (!sr.EndOfStream)
  32:         {
  33:             this.DecodeLine(sr.ReadLine());
  34:         }
  35:         sr.Close();
  36:         sr.Dispose();
  37:     }
  38:  
  39:     public virtual void LoadFromStream(Stream s)
  40:     {
  41:         this.Lines.Clear();
  42:         StreamReader sr = new StreamReader(s);
  43:         while (!sr.EndOfStream)
  44:         {
  45:             this.DecodeLine(sr.ReadLine());
  46:         }
  47:         sr.Close();
  48:         sr.Dispose();
  49:     }
  50:  
  51:     /// <summary>
  52:     /// Grava um arquivo EDI em disco
  53:     /// </summary>
  54:     /// <param name="FileName">Nome do arquivo EDI a ser salvo</param>
  55:     public virtual void SaveToFile(string FileName)
  56:     {
  57:         StreamWriter sw = new StreamWriter(FileName);
  58:         foreach (TRegistroEDI linha in this.Lines)
  59:         {
  60:             linha.CodificarLinha();
  61:             sw.WriteLine(linha.LinhaRegistro);
  62:         }
  63:         sw.Close();
  64:         sw.Dispose();
  65:     }
  66:     #endregion
  67: }

Veja que como principal propriedade, temos um objeto List<TRegistroEDI>, 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?

   1: public void TesteLayout()
   2: {
   3:     //Teste de formatação de um campo EDI:
   4:     TCampoRegistroEDI campo1 = new TCampoRegistroEDI(TTiposDadoEDI.ediInteiro, 8, 0, 0, null, null, 1);
   5:     TCampoRegistroEDI campo2 = new TCampoRegistroEDI(TTiposDadoEDI.ediDDMMAA, 6, 0, 0, null, null, 9);
   6:    
   7:     campo1.ValorNatural = 12;
   8:     campo2.ValorNatural = DateTime.Now();
   9:  
  10:     //Veja o resultado das variáveis abaixo!
  11:     string campo1formatado1 = campo1.CodificarNaturalParaEDI();
  12:     string campo1formatado2 = campo2.CodificarNaturalParaEDI();
  13:  
  14:     //Teste de montagem de linha de registro
  15:     TRegistroEDI reg = new TRegistroEDI();
  16:     reg.CamposEDI.Add(campo1);
  17:     reg.CamposEDI.Add(campo2);
  18:     reg.CodificarLinha();
  19:     //Veja o resultado da variável abaixo!
  20:     string linha = reg.LinhaRegistro;
  21:  
  22:     //Testando o salvamento do arquivo
  23:     TEDIFile arq = new TEDIFile();
  24:     arq.Lines.Add(campo1);
  25:     arq.Lines.Add(campo2);
  26:     arq.SaveToFile("C:\MeuArq.txt");
  27:  
  28:     //Testando a carga do arquivo
  29:     TEDIFIle arq2 = new TEDIFile();
  30:     arq.LoadFromFile("C:\MeuArq.txt");
  31:     //agora, dê um "watch" na variável Arq e veja o conteúdo dela...
  32: }

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

Até lá!

0 comentários:


Postar um comentário

Para tornar este artigo ainda mais interessante, escreva suas críticas (desde que construtivas e sem ofenças), elogios, sugestões, complementos, dúvidas, etc, etc, etc!!!

  © Blogger templates ProBlogger Template by Ourblogtemplates.com 2008 - Editado e configurado por Leonel F.

Voltar ao TOPO