Page 1 of 1

Exportação de dados historiados

Posted: Fri Feb 26, 2016 11:53 am
by vagnerpardinho
Em minha aplicação tenho alguns objetos tipo Plot e gráficos de relatórios os quais são gerados a partir de consultas a dados historiados em BD, a ideia é colocar um botão próximo a esses objetos que permita a exportação dos dados mostrados, para um arquivo csv, como fazer isso?
Para os relatórios a função já existe teoricamente, mas não funciona para os dados em forma de gráfico e eu não tenho tabelas.
Poderiam nos dar um exemplo de como implementar isso?

Grato,
Vagner

Re: Exportação de dados historiados

Posted: Tue Mar 01, 2016 1:29 pm
by heber.augusto
Bom dia Vagner, estamos montando um exemplo e enviaremos a resposta ainda hoje.

Obrigado

Re: Exportação de dados historiados

Posted: Wed Mar 02, 2016 1:34 pm
by Matheus Arthus
Olá Vagner, desculpa a demora.

Fiz aqui um exemplo de aplicação onde se é plotado uma curva em função de uma consulta no banco e também o salvamento dessa mesma consulta - que é a que está gerando o plot, em um formato csv.

A dinâmica é bastante simples, um botão faz a consulta no banco, armazena esses valores resgatados em uma tabela lua e depois utiliza dessa tabela para gerar o plot. Outro botão realiza a mesma consulta (que vale lembrar, está limitado pelos tags de data de início e fim na tela), também converte esses valores em uma tabela lua e depois formata essa tabela lua para o formato .csv, que nada mais é do que pegar cada ele elemento da tabela lua e separá-los por um ";".

No entanto, o que está fazendo essa conversão para o .csv é um módulo Lua, criado aqui na HI, que nada mais é do que um trecho de código Lua - que fica armazenado como um arquivo .Lua sempre numa pasta chamada lua que está localizada dentro da pasta do projeto (C:\Users\Public\Documents\HI_tecnologia\HIscada_Pro\1.4\SCADA_1\Kernel\Projects\Exemplo_Arquivo_CSV\publ), e que funciona como uma função externa que você pode chamar a qualquer momento dentro de qualquer script. No arquivo de exemplo que estou te passando você pode acessar esses módulos lua e abri-los como bloco de notas para visualizar o código, não vou entrar em detalhes aqui de como o código está exatamente fazendo a conversão, mas qualquer dúvida você pode me perguntar.

O módulo que faz a conversão se chama "ConvTabCsv.lua", e ele funciona como uma função que recebe dois tipos de parâmetros primeiro o caminho do local onde será armazenado o arquivo.csv e segundo a tabela lua com os valores que serão convertidos, o processo funciona de seguinte forma:

Code: Select all

-- Primeiro você de declara o módulo, lembrando de usar o mesmo nome do arquivo Lua 

  AdicionaModuloConvTabCsv = require "ConvTabCsv"

-- Depois você pode chamar a função junto com os parâmetros 

 local ret = ConvTabCsv("Endereço do local do arquivo","tabela lua para converter")
Na variável ret será retornado alguns valores relativos a erros que podem ser tratados se quiser.

Então basta você converter a consulta em uma tabela lua e enviar essa tabela junto com o endereço do local onde será salvo o arquivo. Importante notar que no caso do botão que plota o gráfico a conversão da consulta para uma tabela lua está sendo feito "à mão", outra forma de fazer é utilizando um módulo criado para isso. Então, no caso do script que gera o arquivo csv, a conversão da consulta para a tabela lua está sendo feito com o módulo "CursorTab.lua", que funciona de maneira similar ao outro módulo, só mudando os parâmetros:

Code: Select all

-- Primeiro você declara o módulo

  AdicionaModuloConvTabCsv = require "CursorTab"

-- Depois você chama a função com seus parâmetros

  tabela_dados_arquivo_csv = CursorTab("cursor retornada da consulta", "titulo das colunas separado por vírgula")
Os parâmetros necessários são: o cursor retornado da consulta "local cursor,error = retOpenDB:Execute(CmdSQL)", e o nome das colunas retornadas na consulta ao banco.

Outro detalhe é sobre a função "flag_selected":

Code: Select all

  local flag_selected, file1 = FileDialog(
        2,    -- opcao para SALVAR um arquivo
        "Selecione arquivos para exportar",                     -- Titulo da janela de solicitação do arquivo
        "csv",                                                  -- Extensão padrão para os arquivos
        UnidadeSalvaRelatorio,                                  -- Diretorio inicial para seleção dos arquivos
        NomeArquivo .. ".csv", -- Nome Inicial para o arquivo
        filtro,                                                 -- Especificação dos filtros dos arquivos
        1);                                                     -- Seleção do filtro 2 como filtro inicial
Essa função ela abre um diretório para o usuário escolher e retorna como valor uma string com o endereço do diretório escolhido. E é esse resultado que está sendo enviado para o módulo que faz a conversão para o arquivo csv. Para mais informações http://doc.hitecnologia.com.br/hiscada_ ... iledialog1. Caso você não queira dar essa opção para o usuário basta fixar o endereço do local onde sempre será salvo o arquivo gerado.

Espero ter conseguido ser claro, qualquer coisa estou a disposição.

OBS: Para testar o exemplo que estou enviando, que já tem alguns dados armazenados no banco User.db, utilize as seguinte datas de início e fim: 01/03/2016 00:00:00 e 02/03/2016 09:50:00.