quinta-feira, 27 de dezembro de 2012

Genexus CSV - Parte II

Nessa segunda parte sobre criação e leitura de arquivos CSV, iremos visualizar como podemos realizar a leitura  de um arquivo exemplo (figura abaixo), criado anteriormente a partir do post Genexus CSV - Parte I.

Genexus CVS

Vamos imaginar que o nosso cliente contratou um novo software de frente de caixa, esse novo software oferece um relatório diário de todas as vendas realizadas na loja, e este relatório pode ser extraído no formato CSV. Em determinados períodos, o cliente precisará importar estes dados para o seu sistema gerencial.

Pois bem, agora precisamos criar em nossa aplicação uma tela que permita ao usuário importar o relatório desejado e gravar em nossa base de dados estas informações. Como faremos isso.. veremos a seguir..

Criação da Web Panel Importadora

Primeiro, iremos adicionar a variável &Blob à nossa web panel..

Genexus CSV


..e um botão "Importar Arquivo" que realizará o seguinte evento:
Event 'ImportarArquivo'
   //=====Chama Procedure de leitura passando o caminho da variável blob como parâmetro===
   LeArquivoCSV.Call(&Blob.ToString())
EndEvent

Ao utilizar uma variável do tipo blob os arquivos selecionados através desta variável são abertos a partir da pasta "PrivateTempStorage", definida nas propriedades do nosso gerador. Portanto, quando utilizamos a função "ToString()" estamos na verdade trabalhando com o caminho (source) do arquivo selecionado.

Criação de Procedure de Leitura dos Arquivos Importados

Agora precisamos programar nossa Procedure "LeArquivoCSV" criada.

Esta procedure irá receber como parâmetro o caminho (source) do arquivo importado na web panel.
//=====Variável Arquivo = Varchar, caminho do arquivo recebido=====
parm(in:&Arquivo);

Na aba Source da nossa Procedure iremos adicionar o seguinte código.

Obs.: Quando uma determinada variável Blob não é usada junto a algum registro da base de dados, não é possível capturar a sua extensão através da função "FileType()". Logo, para capturarmos a extensão desta variável, teremos que pegá-la através do seu caminho completo...
//=====Captura extensão do arquivo recebido como parâmetro=====
&PosicaoInicial = StrSearchRev(&Arquivo,'.',&Arquivo.Trim().Length())
&PosicaoInicial += 1
&Extensao = SubStr(&Arquivo,&PosicaoInicial,5)

//=====Se a extesão nao for csv, envia mensagem=====
if &Extensao.ToLower() <> 'csv'
msg('Arquivo Incorreto!')
else

//=====Abre Arquivo recebido como parâmetro=====
&retorno = dfrOpen(&Arquivo,,',','"','utf-8')

//=====Realizar a seguinte rotina enquanto não chegar ao fim do arquivo=====
do while dfrNext() = 0

//=====Leitura dos registros contidos=====
&retorno = dfrGNum(&LivroCodigo)
&retorno = dfrGTxt(&LivroNome)
&retorno = dfrGTxt(&LivroEdicao)
&retorno = dfrGNum(&LivroValor)
&retorno = dfrGTxt(&EditoraNome)
&retorno = dfrGDate(&NotaFiscalData,'dmy','/')
&retorno = dfrGTxt(&Hora)
&NotaFiscalHora.FromString(&Hora)
&retorno = dfrGNum(&NotaFiscalNSU)
&retorno = dfrGTxt(&PagamentoTipo)
&retorno = dfrGNum(&PagamentoId)
enddo

//=====Fechar arquivo=====
&retorno = dfrClose()
endif
A função StrSearchRev() serve para procurarmos a posição de um determinado caractere de trás para frente. Esta função recebe como parâmetros:

  1. String que desejamos realizar a procura - variável &Arquivo;
  2. Caractere(s) que estamos procurando - caractere ponto ".";
  3. Posição inicial da procura - fim do caminho do arquivo.

Note que não é possível capturarmos o registro hora de forma direta, o genexus não fornece uma função específica para este tipo de formato. Portanto, precisamos primeiro capturá-lo como uma String para após associá-lo a varíável hora (DateTime, propriedades: picture Date format = none).

Bom pessoal, pretendo postar mais alguns exemplos de desenvolvimento nos próximos posts. Bom ano novo pra todos, abraço!

3 comentários:

  1. Parabéns pelo blog, muita informação e isso ajuda muito.

    ResponderExcluir
    Respostas
    1. Obrigado pela visita Jean. Bora tenta crescer com a comunidade Genexus!

      Excluir
  2. When I try to open the file using DFROpen, the &return variable value is -2 (mean the file does not exist). The code &Blob.ToString() return "gxupload:cb849a4ac4d2427caaca1e5358d9178e" which I don't think it's the path of the file on the server. What I do wrong here? Please help !

    ResponderExcluir