255 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			255 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
// Stampa statistiche temporali per agente
 | 
						|
#include <applicat.h>
 | 
						|
#include <urldefid.h>    
 | 
						|
#include <form.h>
 | 
						|
#include <mask.h>
 | 
						|
#include <printer.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 TApplication
 | 
						|
{
 | 
						|
  TMask                 *_msk;
 | 
						|
  TForm_stampaprstat    *_frm;
 | 
						|
  
 | 
						|
protected:
 | 
						|
  virtual bool create();
 | 
						|
  virtual bool destroy();
 | 
						|
  virtual bool menu(MENU_TAG) ;
 | 
						|
  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()
 | 
						|
{
 | 
						|
  _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);
 | 
						|
  dispatch_e_menu(MENU_ITEM(1));
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
bool TStampa_statistiche_app::menu(MENU_TAG)
 | 
						|
{
 | 
						|
  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 
 | 
						|
  TSorted_cursor * cur1 = new TSorted_cursor(_frm->relation(),"CODAGE|124->DATADOC","",1);
 | 
						|
  TSorted_cursor * cur2 = new TSorted_cursor(_frm->relation(),"RAGSOC|124->DATADOC","",2);
 | 
						|
  
 | 
						|
  _frm->set_cursor(cur1);
 | 
						|
  TRectype rec_from(LF_AGENTI), rec_to(LF_AGENTI);
 | 
						|
  
 | 
						|
  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 cursore (attenzione se e' ordinato per ragione sociale)
 | 
						|
    TSorted_cursor* cur = normal_order ? cur1 : cur2;
 | 
						|
 | 
						|
    // 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->setregion(rec_from, rec_to);
 | 
						|
    cur->setfilter(filter_expr,TRUE); // Update relation too...
 | 
						|
    _frm->set_cursor(cur);
 | 
						|
    // 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();
 | 
						|
    
 | 
						|
  }  
 | 
						|
  delete cur1;
 | 
						|
  delete cur2;
 | 
						|
  return FALSE;
 | 
						|
}
 | 
						|
 | 
						|
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;
 | 
						|
}
 |