campo-sirio/include/reputils.cpp

181 lines
4.1 KiB
C++
Raw Normal View History

#include <applicat.h>
#include <diction.h>
#include <reputils.h>
#include <textset.h>
///////////////////////////////////////////////////////////
// TAS400_report
///////////////////////////////////////////////////////////
TRecordset* TAS400_report::recordset() const
{
return _set != NULL ? _set : TReport::recordset();
}
bool TAS400_report::set_recordset(TRecordset* rs)
{
if (_set != NULL && _owned)
delete _set;
_set = rs;
_owned = true;
const TAS400_recordset& recset = *(TAS400_recordset*)_set;
TReport_section& body = section('B', 1);
body.destroy();
const int reclen = recset.record_length();
const int keypos = recset.key_position();
const int keylen = recset.key_length();
const int tabstop = 10;
// Genera sfondo solo per colonne dispari
for (int x = tabstop; x < reclen; x += 2*tabstop)
{
TReport_field* b = new TReport_field(&body);
b->set_type('R');
b->set_pos(x*100, 0);
b->set_size(tabstop*100, 100);
b->set_pattern(PAT_SOLID);
b->set_back_color(XVT_MAKE_COLOR(192,255,255)); // Light Cyan
body.add(b);
}
// Genera sfondo per la chiave se presente
if (keylen > 0)
{
TReport_field* b = new TReport_field(&body);
b->set_type('R');
b->set_pos(keypos*100, 0);
b->set_size(keylen*100, 100);
b->set_pattern(PAT_SOLID);
b->set_back_color(XVT_MAKE_COLOR(255,192,192)); // Light Fucsia
body.add(b);
}
// Genera campi a passo fisso per evitare errori di arrotondamento font
TString16 src; // Nome della sorgente di ogni colonna
for (int k = 0; k < reclen; k += tabstop)
{
TReport_field* f = new TReport_field(&body);
f->set_type('S');
src.format("A[%d,%d]", k+1, k+tabstop);
f->set_field(src);
f->set_pos(k*100, 0);
f->set_size(tabstop*100, 100);
body.add(f);
}
return true;
}
bool TAS400_report::set_recordset(const TString& query)
{
TAS400_recordset* rs = (TAS400_recordset*)recordset();
if (rs == NULL || !_owned)
{
rs = new TAS400_recordset(query);
TAS400_report::set_recordset(rs);
}
else
rs->exec(query);
return true;
}
TAS400_report::TAS400_report(const char* query)
: _set(NULL), _owned(false)
{
set_recordset(TFixed_string(query));
}
TAS400_report::TAS400_report(TRecordset& asr)
: _set(NULL), _owned(false)
{
set_recordset(&asr);
_owned = false; // il metodo precedente forza _owned = true
}
///////////////////////////////////////////////////////////
// TLog_report
///////////////////////////////////////////////////////////
void TLog_report::set_title(const char* title)
{
_title = title;
if (_title.blank())
_title = main_app().title();
}
bool TLog_report::get_usr_val(const TString& name, TVariant& var) const
{
if (name == "#TITLE")
{
var = _title;
return true;
}
return TReport::get_usr_val(name, var);
}
bool TLog_report::set_usr_val(const TString& name, const TVariant& var)
{
if (name == "#TITLE")
{
set_title(var.as_string());
return true;
}
return TReport::set_usr_val(name, var);
}
void TLog_report::reset()
{
TText_recordset* csv = (TText_recordset*)recordset();
if (csv)
csv->destroy();
_msg = _war = _err = 0;
}
bool TLog_report::log(int sev, const char* msg)
{
TText_recordset* csv = (TText_recordset*)recordset();
bool ok = csv != NULL;
if (ok)
{
//controlla se la stringa esiste gia'
if (_kill_duplicates)
{
for (bool go = csv->move_last(); go; go = csv->move_prev())
{
const TString& m = csv->get(1).as_string();
if (m == msg)
return true; // ignoro messaggio duplicato
}
}
//aggiunge il messaggio
ok = csv->new_rec() >= 0;
if (ok)
{
csv->set(0u, TVariant((long)sev));
csv->set(1, TVariant(msg));
switch (sev)
{
case 0: _msg++; break;
case 1: _war++; break;
default: _err++; break;
}
}
}
return ok;
}
TLog_report::TLog_report(const char* title, const char* name) : _kill_duplicates(false), _msg(0), _war(0), _err(0)
{
load(name);
if (recordset() == NULL)
{
TCSV_recordset* csv = new TCSV_recordset("CSV(\"\t\")"); // tab separated
set_recordset(csv);
}
set_title(title);
}