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..
..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
//=====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);
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:&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
- String que desejamos realizar a procura - variável &Arquivo;
- Caractere(s) que estamos procurando - caractere ponto ".";
- 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!