campo-sirio/pr/pr1400.cpp
alex 3a770ee656 Patch level : XX.648
Files correlati     :
Ricompilazione Demo : [ ]
Commento            : Riportata la versione 01.05 patch 648


git-svn-id: svn://10.65.10.50/trunk@8633 c028cbd2-c16b-5b4b-a496-9718f37d4682
1999-10-22 10:00:18 +00:00

255 lines
7.4 KiB
C++
Executable File

// Stampa statistiche temporali per agente
#include <applicat.h>
#include <form.h>
#include <mask.h>
#include <printer.h>
#include <sheet.h>
#include "provv.h"
#include "agenti.h"
#include "pr1400.h"
#include "pr1400a.h"
class TForm_stampaprstat:public TForm
{
//TSorted_cursor *_cur;
TString_array _month_description;
public:
//virtual TCursor* cursor() const { return (TCursor*)_cur; }
//void set_cursor(TSorted_cursor* c) { _cur = c; }
void set_month_descriptions(const TString_array& d) { _month_description = d; }
virtual bool validate(TForm_item& fld, TToken_string& val);
TForm_stampaprstat(const char *name,const char *code) ;
virtual ~TForm_stampaprstat();
};
TForm_stampaprstat::TForm_stampaprstat(const char *name,const char *code)
: TForm(name,code)
{
}
TForm_stampaprstat::~TForm_stampaprstat()
{
}
bool TForm_stampaprstat::validate(TForm_item& fld, TToken_string& val)
{
const TString code(val.get(0)); // Codice del messaggio
if (code == "_MONTHRANGE") // Per settare la descrizione del range di mesi relativi a questo item
{
const short id = fld.id();
TString& descr = (TString&)_month_description[id - F_MON1];
fld.set(descr);
return TRUE;
}
else
return TForm::validate(fld, val);
}
class TStampa_statistiche_app : public TSkeleton_application
{
TMask *_msk;
TForm_stampaprstat *_frm;
protected:
virtual bool create();
virtual bool destroy();
virtual void main_loop();
static bool daterange_handler(TMask_field& f, KEY key);
static bool agerange_handler(TMask_field& f, KEY key);
public:
TStampa_statistiche_app() {};
~TStampa_statistiche_app() {};
};
bool TStampa_statistiche_app::daterange_handler(TMask_field& f, KEY key)
{
if (f.to_check(key))
{
TMask& m = f.mask();
TDate from(m.get_date(F_DATEFROM));
TDate to(m.get_date(F_DATETO));
if (from.ok() && to.ok() && (to < from || to.year() != from.year()))
return f.error_box("L'intervallo date specificato non e' corretto");
}
return TRUE;
}
bool TStampa_statistiche_app::agerange_handler(TMask_field& f, KEY key)
{
if (f.to_check(key))
{
TMask& m = f.mask();
const bool ord_cod = m.get(F_ORDINAMENTO)[0] == 'C';
TString from(m.get(ord_cod ? F_DAAGE : F_DADES));
TString to(m.get(ord_cod ? F_AAGE : F_ADES));
if (from.not_empty() && to.not_empty() && to < from)
return f.error_box("L'intervallo agenti specificato non e' corretto");
}
return TRUE;
}
bool TStampa_statistiche_app::create()
{
open_files(LF_PROVV,0);
_msk = new TMask("pr1400") ;
_frm = new TForm_stampaprstat("pr1400a","");
_msk->set_handler(F_DAAGE,agerange_handler);
_msk->set_handler(F_AAGE,agerange_handler);
_msk->set_handler(F_DADES,agerange_handler);
_msk->set_handler(F_ADES,agerange_handler);
_msk->set_handler(F_DATEFROM,daterange_handler);
_msk->set_handler(F_DATETO,daterange_handler);
return TSkeleton_application::create();
}
void TStampa_statistiche_app::main_loop()
{
const char * months[] = { "Gen", "Feb", "Mar", "Apr", "Mag", "Giu",
"Lug", "Ago", "Set", "Ott", "Nov", "Dic" };
TString_array descriptions;
TString cond; // Stringa identificante la condizione di raggruppamento
TString desc; // Stringa per settare la descrizione del range di mesi
TString ds1, ds2; // Date in formato stringa per settare la condizione
TDate date_from, date_to;
TString age_from, age_to;
TString filter_expr;
TArray date_range; // Array di date per settare i range
TRectype rec_from(LF_AGENTI), rec_to(LF_AGENTI);
TCursor* cur = (TCursor*)_frm->cursor();
TSortedfile *provv = new TSortedfile(LF_PROVV,NULL,"CODAGE|DATADOC", "", 2);
cur->relation()->replace(provv, 1, "CODAGE==CODAGE",2);
while (_msk->run() == K_ENTER)
{
const bool normal_order = _msk->get(F_ORDINAMENTO)[0] != 'R';
date_from = _msk->get_date(F_DATEFROM);
date_to = _msk->get_date(F_DATETO);
age_from = _msk->get(normal_order ? F_DAAGE : F_DADES);
age_to = _msk->get(normal_order ? F_AAGE : F_ADES);
if (!date_from.ok() || !date_to.ok())
{
error_box("Inserire un range di date valido");
continue;
}
descriptions.destroy();
date_range.destroy();
// Setta l'array per il range dei mesi
int month_from = date_from.month();
int month_to = date_to.month();
int inc_month = _msk->get_int(F_GROUPMONTH);
for (int m = month_from; m <= month_to; m += inc_month)
{
desc = months[m - 1];
const int index = m + inc_month > 12 ? 12 : m + inc_month - 1;
if (inc_month > 1)
{
desc << "-";
desc << months[index - 1];
}
descriptions.add(desc);
}
m = descriptions.items();
while (m < 12)
{
descriptions.add(""); // Aggiunge gli elementi vuoti necessari
m++;
}
_frm->set_month_descriptions(descriptions);
// Setta i range delle date per raggruppare le sottosezioni
TDate d(date_from);
for (m = 1; m <= 12; m++)
{
date_range.add(d);
if (d != botime)
{
d.addmonth(inc_month-1);
d.set_end_month();
if (d > date_to)
d = date_to;
date_range.add(d);
d += 1; // Primo giorno del mese successivo
if (d > date_to)
d = botime;
}
else
date_range.add(d); // Tutti quelli che eccedono la data di fine sono botime
}
// Setta le condizioni di raggruppamento per ognuna delle sottosezioni
// I nomi sono PRS1, PRS2, PRS3... PRS6
for (m = 1; m <= 12; m++)
{
desc.format("PRS%d",m);
TForm_subsection& ssec = (TForm_subsection&)_frm->find_field('B', odd_page, desc); // Sottosezione padre
const int base = 2 * (m-1);
ds1 = ((TDate&) date_range[base]).string(ANSI);
ds2 = ((TDate&) date_range[base+1]).string(ANSI);
cond.format("(ANSI(%d->DATADOC)>=\"%s\") && (ANSI(%d->DATADOC)<=\"%s\") && (%d->NRIGA==\"1\")",
LF_PROVV, (const char*)ds1, LF_PROVV, (const char*) ds2, LF_PROVV);
ssec.setcondition(cond, _strexpr);
}
ds1 = date_from.string(ANSI);
ds2 = date_to.string(ANSI);
filter_expr.format("(ANSI(%d->DATADOC)>=\"%s\") && (ANSI(%d->DATADOC)<=\"%s\")",
LF_PROVV, (const char*)ds1, LF_PROVV, (const char*) ds2);
// Setta il filtro sul sul sortedfile ordinato per data doc
provv->cursor().setfilter(filter_expr);
// Setta gli estremi (codagente o ragione sociale)
rec_from.zero();
rec_to.zero();
rec_from.put(normal_order ? AGE_CODAGE : AGE_RAGSOC, age_from);
rec_to.put(normal_order ? AGE_CODAGE : AGE_RAGSOC, age_to);
cur->setkey(normal_order ? 1 : 2); //Ordinamento per codice agente o ragione sociale
cur->setregion(rec_from, rec_to);
// Stampa el todo
const int hh = 6;
const int fh = 1;
const int fl = printer().formlen();
int rows[4]; // Righe orizzontali
rows[0] = hh-2;
rows[1] = hh;
rows[2] = fl-1;
rows[3] = 0;
_frm->genera_intestazioni(odd_page, hh-1);
_frm->genera_fincatura(odd_page, hh-2, fl-1, rows);
_frm->print();
_msk->reset();
}
// Do not delete provv please, TRelation in TForm will do that...
}
bool TStampa_statistiche_app::destroy()
{
delete _msk;
delete _frm;
return TRUE;
}
int pr1400(int argc, char* argv[])
{
TStampa_statistiche_app a;
a.run(argc,argv,"Statistiche temporali");
return 0;
}