segunda-feira, 17 de dezembro de 2012

Genexus CSV - Parte I

Dando continuidade aos nossos posts, a partir de hoje iremos aprender como criar e ler arquivos CSV. Quase todos os analistas genexus em algum momento já se depararam com a necessidade de trabalhar com este tipo de arquivos. Como sabem, assim como o XML, o CSV é muito utilizado para transmitir registros e informações, porém quando estes registros e informações são muito extensos, o CSV torna-se mais adequado.

Este tipo de arquivo é padrão de bancos, administradoras de cartões de crédito e sistemas ERP, entre outros. Como as transações ocorrem diariamente em uma grande quantidade, os bancos, por exemplo, disponibilizam estes arquivos diariamente, junto com um manual de leitura, e dessa forma, torna-se mais fácil às empresas realizar um programa de leituras destas informações e por fim, registrá-las em seu próprio sistema.

O que vem a ser este tipo de arquivo?

CSV significa Coma Separator Value, traduzindo: Valores Separados por Vírgula. De forma padrão um arquivo CSV, contém diversos valores, campos (ou colunas de tabelas), separados por vírgulas. Porém não necessariamente estes valores necessitam estar separados por este tipo de caractere (vírgula), através do genexus qualquer caractere que definirmos realizará esta separação, eu particularmente prefiro o ponto e vírgula. Principalmente quando um destes campos contém um valor (onde se utiliza a vírgula).

Exemplo de criação de arquivos CSV

Para começar este assunto, daremos continuidade ao nosso exemplo de uma aplicação para controle de uma livraria digital. Um novo ERP foi adquirido pela empresa, e precisamos criar um arquivo CSV diariamente com todas as vendas realizadas para que o ERP possa importá-las. Cada campo do CSV representará uma coluna da tabela de vendas, e cada linha representará uma venda, logo...

O nosso exemplo de arquivo contém:
  1. código do livro vendido;
  2. nome do livro vendido;
  3. edição;
  4. valor bruto;
  5. editora;
  6. data da venda;
  7. hora da venda;
  8. número único da transação;
  9. forma de pagamento;
  10. código de pagamento;
Genexus CSV

Vamos lá então, primeiro passo, em uma Web Panel inserimos uma variável Varchar(40) e um botão ao lado. Através desta variável, o usuário poderá determinar em qual pasta este arquivo será gerado. Veja figura abaixo:

Genexus Web Panel

Ao clicar sobre o botão o seguinte evento é executado:
Event 'GeraArquivo'
if not &Destino.IsEmpty()
GeraArquivoCSV.Call(&Destino)
else
msg('Informe o Destino do arquivo!')
endif
EndEvent
Agora, na procedure "GeraArquivoCSV" criada, iremos definir a propriedade "commit on exit: no".

Incluir em suas Regras o recebimento do parâmetro, variável Destino:
parm(in:&Destino);
E, em seu Source, o seguinte código:
//=====Captura Ano/Mes/Dia=====
&Ano = Year(ServerDate())
&Mes = Month(ServerDate())
&Dia = Day(ServerDate())

/*=====Monta Nome do Arquivo=====
O nome irá conter:
1º Caminho (pasta a ser gravado)
2º Nome do Arquivo (Data de Geração - Ano/Mes/Dia)
Exemplo: VendaDiaria_20121215
3º Extensão (.csv)
*/
&NomeArquivo = &Destino.Trim()+'VendaDiaria_'
&NomeArquivo += &Ano.ToString().Trim()+&Mes.ToString().Trim()+&Dia.ToString().Trim()
&NomeArquivo += '.csv'

/*=====Cria novo arquivo=====
Parâmetro:
1º Nome do Arquivo completo
2º Delimitador de registros (, - vírgula)
3º Delimitador de conteúdo (" - aspas duplas)
4º Anexar = false (caso exista outro arquivo com o mesmo nome, irá sobrescrever)
5º Encoding (utf-8)
*/
&retorno = dfwOpen(&NomeArquivo,',','"',0,'utf-8')

//=====Percorre tabela de notas fiscais====
for each NotaFiscalData NotaFiscalHora

/*Inserir registros (os delimitadores se inserem automaticamente)
quando utilizarmos "dfwPNum" precisamos informar um parâmetro: quantidade de decimais
quando utilizarmos "dfwPTxt" o ideal é utilizarmos a função .Trim()
quando utilizarmos "dfwPDate" precisamos informar dois parâmetros:
  1º formato da data, "d" para dia, "m" para mês e "y" para ano
  2º separador dos caracteres dia,mês e ano

os registros inseridos com "dfwPNum" e "dfwPDate", por não serem Strings não irão ficar entre aspas duplas "
*/
&retorno = dfwPNum(LivroCodigo,0)
&retorno = dfwPTxt(LivroNome.Trim())
&retorno = dfwPTxt(LivroEdicao.Trim())
&retorno = dfwPNum(LivroValor,2)
&retorno = dfwPTxt(EditoraNome.Trim())
&retorno = dfwPDate(NotaFiscalData,'dmy','/')
&retorno = dfwPTxt(NotaFiscalHora.ToString().Trim())
&retorno = dfwPNum(NotaFiscalNSU,0)
&retorno = dfwPTxt(PagamentoTipo.Trim())
&retorno = dfwPNum(PagamentoId,0)

//=====Ir para a próxima linha=====
&retorno = dfwNext()
endfor

//=====Fechar arquivo=====
&retorno = dfwClose()

Ao trabalhar com arquivos csv, utilizamos as funções

  • dfw...(Delimited File Write) - para escrever arquivos;
  • dfr...(Delimited File Read) - para ler arquivos;

Por hoje era isso, no próximo post entraremos na função de leitura de arquivos .csv, e para facilitar, continuaremos utilizando este mesmo exemplo. Grande abraço.

4 comentários:

  1. Excelente solução e documentação. Utilizei e tudo funcionou para gerar CSV.

    ResponderExcluir
  2. Olá! Fiquei sabendo sobre esta promissora ferramenta e me interessei, já possuo conhecimento básico em C e C++

    Tem algum link aqui do seu blog refencial para eu saber pode onde começar a estudar GENEXUS? obrigado.

    ResponderExcluir