Exportar para CSV um relatório à partir de um botão


#1

Boa tarde,

Existe alguma forma de criar um botão para exportar um relatório em CSV, evitando dessa forma ir à página de relatórios do ScadaBR?

Muito Obrigado


#2

Olá,
Acredito que seja possível via script servidor, porem, isso é meio complexo.


#3

Muito Obrigado jrcassa, vamos tentando.


#4

Dependendo do que deve ser incluído nesse arquivo CSV, se for apenas um histórico dos valores de um data point por exemplo, talvez seja até mais fácil usar um script para servidor que gere esses dados, uma vez que é possível usar um “método paralelo”, sem necessariamente acessar a parte do código que gera as instâncias de relatórios…


#5

Boas Celso, sim seria apenas para histórico dos valores. eu vou tentar pesquisar mais um bocado para tentar encontrar uma solução.

Muito Obrigado


#6

Acho que consegui escrever um código parecido com o que você precisa. Primeiramente, é necessário criar um componente HTML com o seguinte código:

<script>
function downloadCSV(text) {
    var element = document.createElement('a');
    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + text);
    element.setAttribute('download', 'Relatório.csv');
    element.style.display = 'none';
    document.body.appendChild(element);
    element.click();
    document.body.removeChild(element);
}
</script>

Depois crie um script para servidor com o código:

// Variáveis de configuração:

// Texto a ser exibido no botão
var label = "Botão relatório";
// Id ou Xid dos seus datapoints
var id_ou_xid  = [1, "DP_701704"]; 
// Tempo do relatório
var horas = 5 * 24; // Últimos 5 dias (5 x 24 horas)


// NÃO ALTERE A PARTIR DAQUI


// Conversão para milissegundos
var startTime = new Date().getTime() - (horas * 60 * 60 * 1000);

// Código HTML a ser criado na página
var s =  "<input type='button' value='" + label + "' onclick='downloadCSV(&quot;" + createFinalCSV(id_ou_xid, startTime) + "&quot;);'>";
return s;

// Função para formatar o CSV final
function createFinalCSV(idArray, startTime) {
	var csv = encodeURIComponent("Datasource: Datapoint,Valor,Horário") + "%0A";
    
    for (var i in idArray) {
	    var pointInfo = getDataPointInfo(idArray[i]);
	    csv += createCSVHistory(pointInfo, startTime);
    }
    
    return csv;
}

// Função para criar um histórico CSV p/ cada datapoint
function createCSVHistory(point, startTime) {
	var pvDAO = new com.serotonin.mango.db.dao.PointValueDao();
	var history = pvDAO.getPointValues(point.id, startTime);
	var sdf = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
	
	var length = history.size() - 1;
	var csv = "";
	
	for (var i = length; i >= 0; i--) {
	    var data = point.source + ": " + point.name + "," + history.get(i).value + "," + sdf.format(history.get(i).time);
	    csv += encodeURIComponent(data) + "%0A";
    }
    
    return csv;
}

// Função para obter dados do Datapoint
function getDataPointInfo(identifier) {
    var dpDAO = new com.serotonin.mango.db.dao.DataPointDao();
    var dp = dpDAO.getDataPoint(identifier);

    var pointId = dp.getId();
    var pointXid = String(dp.getXid());
    var pointName = String(dp.getName());
    var sourceName = String(dp.getDataSourceName());
    return { id: pointId, xid: pointXid, name: pointName, source: sourceName };
}

Para configurar quais data points serão incluídos no relatório, além de outros parâmetros, basta alterar o valor nas “variáveis de configuração” nas primeiras linhas do script.

Espero ter ajudado, boa noite!


#7

Boa tarde Celso,

Desde já muito obrigado, e peço imensa desculpa por só responder agora, tenho estado fora em obra, e com acesso limitado à net.

Aparentemente é uma excelente solução, vou tentar implementar, e assim que possível deixo o feedback.

Muito Obrigado

Abraço