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