Files correlati : Ricompilazione Demo : [ ] Commento : programma statistiche di vendita aggiornato con as400 recordset git-svn-id: svn://10.65.10.50/branches/R_10_00@21803 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			721 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			721 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include "ve3800.h"
 | 
						||
 | 
						||
#include <applicat.h>
 | 
						||
#include <automask.h>
 | 
						||
#include <dongle.h>
 | 
						||
#include <modaut.h>
 | 
						||
#include <progind.h>
 | 
						||
#include <reprint.h>
 | 
						||
#include <textset.h>
 | 
						||
#include <utility.h>
 | 
						||
 | 
						||
#include "../cg/cglib01.h"
 | 
						||
#include "velib07.h"
 | 
						||
 | 
						||
///////////////////////////////////////////////////////////
 | 
						||
//  MASCHERA
 | 
						||
///////////////////////////////////////////////////////////
 | 
						||
class TStatistiche_ve_mask : public TAutomask
 | 
						||
{
 | 
						||
protected:
 | 
						||
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); 
 | 
						||
	
 | 
						||
public:
 | 
						||
  TStatistiche_ve_mask();
 | 
						||
  virtual ~TStatistiche_ve_mask() {}
 | 
						||
};
 | 
						||
 | 
						||
TStatistiche_ve_mask::TStatistiche_ve_mask() : TAutomask("ve3800")
 | 
						||
{
 | 
						||
}
 | 
						||
 | 
						||
bool TStatistiche_ve_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | 
						||
{
 | 
						||
  switch (o.dlg())
 | 
						||
  {
 | 
						||
  case F_ANNO:
 | 
						||
    if (e == fe_modify && !o.empty())
 | 
						||
    {
 | 
						||
      TEsercizi_contabili esc;
 | 
						||
      TDate inies, fines;
 | 
						||
      if (esc.code2range(atoi(o.get()), inies, fines))
 | 
						||
      {
 | 
						||
        set(F_DADATA, inies);
 | 
						||
        set(F_ADATA, fines);
 | 
						||
      }
 | 
						||
    }
 | 
						||
    break;
 | 
						||
  case F_DADATA:
 | 
						||
	case F_ADATA:
 | 
						||
		if (e == fe_close)
 | 
						||
		{
 | 
						||
			const int anno = get_int(F_ANNO);
 | 
						||
 | 
						||
			TEsercizi_contabili esc;	//..le date devono essere incluse nell'esercizio selezionato!
 | 
						||
			const TDate data = o.get();
 | 
						||
			if (!data.empty() && esc.date2esc(data) != anno)
 | 
						||
				return error_box(TR("La data deve appartenere all'anno selezionato"));
 | 
						||
		}
 | 
						||
		break;
 | 
						||
  default:
 | 
						||
    break;
 | 
						||
  }
 | 
						||
 | 
						||
  return true;
 | 
						||
}
 | 
						||
 | 
						||
/////////////////////////////////////////////////////////////
 | 
						||
//  REPORT
 | 
						||
/////////////////////////////////////////////////////////////
 | 
						||
class TStatistiche_ve_report : public TReport
 | 
						||
{
 | 
						||
protected:
 | 
						||
virtual bool use_mask() { return false; }
 | 
						||
public:
 | 
						||
  TStatistiche_ve_report() {}
 | 
						||
};
 | 
						||
 | 
						||
/////////////////////////////////////////////////////////////
 | 
						||
//  RECORDSET
 | 
						||
/////////////////////////////////////////////////////////////
 | 
						||
 | 
						||
class TStatistiche_ve_recordset : public TAS400_recordset
 | 
						||
{
 | 
						||
  real _tot[13];  //array con i totali per mese (e anno)
 | 
						||
 | 
						||
protected:
 | 
						||
  long trova_riga(const TToken_string& key, const char tipo_stat, const char tipo_dettaglio);
 | 
						||
 | 
						||
public:
 | 
						||
	TStatistiche_ve_recordset();
 | 
						||
	
 | 
						||
	void aggiungi_ai_totali(const TRiga_documento& riga, const char tipo_dati);
 | 
						||
  bool aggiungi_riga(TDocument_recordset& righe, const char tipo_dati, const char tipo_stat, const char tipo_dettaglio); //const TRiga_documento& riga, const char tipo_dati);
 | 
						||
  void calcola_percentuali();
 | 
						||
};
 | 
						||
 | 
						||
TStatistiche_ve_recordset::TStatistiche_ve_recordset() 
 | 
						||
: TAS400_recordset("AS400(512)")
 | 
						||
{
 | 
						||
  create_field("CODART",       -1, 20, _alfafld);
 | 
						||
  create_field("DESCRIZIONE",  -1, 50, _alfafld);
 | 
						||
  create_field("GENNAIO",      -1, 10, _realfld);
 | 
						||
  create_field("PGEN",         -1, 9,  _realfld);
 | 
						||
  create_field("FEBBRAIO",     -1, 10, _realfld);
 | 
						||
  create_field("PFEB",         -1, 9,  _realfld);
 | 
						||
  create_field("MARZO",        -1, 10, _realfld);
 | 
						||
  create_field("PMAR",         -1, 9,  _realfld);
 | 
						||
  create_field("APRILE",       -1, 10, _realfld);
 | 
						||
  create_field("PAPR",         -1, 9,  _realfld);
 | 
						||
  create_field("MAGGIO",       -1, 10, _realfld);
 | 
						||
  create_field("PMAG",         -1, 9,  _realfld);
 | 
						||
  create_field("GIUGNO",       -1, 10, _realfld);
 | 
						||
  create_field("PGIU",         -1, 9,  _realfld);
 | 
						||
  create_field("LUGLIO",       -1, 10, _realfld);
 | 
						||
  create_field("PLUG",         -1, 9,  _realfld);
 | 
						||
  create_field("AGOSTO",       -1, 10, _realfld);
 | 
						||
  create_field("PAGO",         -1, 9,  _realfld);
 | 
						||
  create_field("SETTEMBRE",    -1, 10, _realfld);
 | 
						||
  create_field("PSET",         -1, 9,  _realfld);
 | 
						||
  create_field("OTTOBRE",      -1, 10, _realfld);
 | 
						||
  create_field("POTT",         -1, 9,  _realfld);
 | 
						||
  create_field("NOVEMBRE",     -1, 10, _realfld);
 | 
						||
  create_field("PNOV",         -1, 9,  _realfld);
 | 
						||
  create_field("DICEMBRE",     -1, 10, _realfld);
 | 
						||
  create_field("PDIC",         -1, 9,  _realfld);
 | 
						||
  create_field("ANNO",         -1, 11, _realfld);
 | 
						||
  create_field("PANNO",        -1, 9,  _realfld);
 | 
						||
	create_field("GRMERC",       -1, 5,  _alfafld);
 | 
						||
	create_field("CODCLI",       -1, 6,  _intfld);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//metodo plutonico di ricerca dicotomica su una colonna di csv_recordset
 | 
						||
long TStatistiche_ve_recordset::trova_riga(const TToken_string& key, const char tipo_stat, const char tipo_dettaglio)
 | 
						||
{
 | 
						||
  long first = 0;
 | 
						||
  long last = items() - 1;
 | 
						||
  long riga = -1;
 | 
						||
 | 
						||
  while(first <= last)
 | 
						||
  {
 | 
						||
    const long guess = (first + last) / 2;
 | 
						||
    move_to(guess);
 | 
						||
    //const TString& guess_codart = get(0).as_string();		//ori
 | 
						||
    //const int diff = guess_codart.compare(codart);		//ori
 | 
						||
 | 
						||
		TToken_string guess_key;
 | 
						||
		
 | 
						||
		switch (tipo_stat)
 | 
						||
		{
 | 
						||
		case 'A':	//articolo
 | 
						||
			guess_key.add(get("CODART").as_string());
 | 
						||
			break;
 | 
						||
 | 
						||
		case 'C':	//cliente-codart codart-cliente
 | 
						||
		{
 | 
						||
		  switch (tipo_dettaglio)
 | 
						||
			{
 | 
						||
				case 'A':
 | 
						||
				{
 | 
						||
					guess_key.add(get("CODART").as_string());			//colonna 0=A codart
 | 
						||
					TString8 codcf = get("CODCLI").as_string();
 | 
						||
					codcf.right_just(6);
 | 
						||
					guess_key.add(codcf);										//colonna 29=AD codcf
 | 
						||
				}
 | 
						||
					break;
 | 
						||
				case 'C':
 | 
						||
					guess_key = get("CODCLI").as_string();				//colonna 29=AD codcf
 | 
						||
					guess_key.right_just(6);	
 | 
						||
					guess_key.add(get("CODART").as_string());			//colonna 0=A codart
 | 
						||
					break;
 | 
						||
				case 'G':
 | 
						||
					guess_key = get("CODCLI").as_string();				//colonna 29=AD codcf
 | 
						||
					guess_key.right_just(6);	
 | 
						||
					guess_key.add(get("GRMERC").as_string());			//colonna 28=AC grmerc
 | 
						||
					break;
 | 
						||
				case 'M':
 | 
						||
					{
 | 
						||
						guess_key.add(get("GRMERC").as_string());		//colonna 28=AC grmerc
 | 
						||
						TString8 codcf = get("CODCLI").as_string();
 | 
						||
						codcf.right_just(6);
 | 
						||
						guess_key.add(codcf);									//colonna 29=AD codcf
 | 
						||
					}
 | 
						||
					break;
 | 
						||
				default:
 | 
						||
					guess_key = get("CODCLI").as_string();				//colonna 29=AD codcf
 | 
						||
					guess_key.right_just(6);								
 | 
						||
					break;
 | 
						||
			}	//switch(tipo_dettaglio...
 | 
						||
		}	//case 'C'...
 | 
						||
		break;
 | 
						||
 | 
						||
		case 'G':	//grmerc-codart
 | 
						||
				guess_key.add(get("GRMERC").as_string());	//colonna 28=AC grmerc
 | 
						||
				guess_key.add(get("CODART").as_string());
 | 
						||
			break;
 | 
						||
 | 
						||
		default:
 | 
						||
			break;
 | 
						||
		}	//switch(tipo_stat...
 | 
						||
 | 
						||
 | 
						||
		const int diff = guess_key.compare(key);
 | 
						||
    if (diff == 0)
 | 
						||
    {
 | 
						||
      riga = guess;
 | 
						||
      break;
 | 
						||
    }
 | 
						||
    if (diff > 0)
 | 
						||
    {
 | 
						||
      last = guess - 1;
 | 
						||
    }
 | 
						||
    else
 | 
						||
    {
 | 
						||
      first = guess + 1;
 | 
						||
    }
 | 
						||
  }
 | 
						||
 | 
						||
  return riga;
 | 
						||
}
 | 
						||
 | 
						||
///////////////////////////////////////////////
 | 
						||
//  METODI DI COMPARE
 | 
						||
///////////////////////////////////////////////
 | 
						||
 | 
						||
static TStatistiche_ve_recordset* _curr_recset = NULL;
 | 
						||
static TToken_string _curr_order;
 | 
						||
 | 
						||
//funzione di ordinamento per il campo codart (campo 0 sul csv)
 | 
						||
//<2F> una stringa semplice
 | 
						||
static int compare_recset_rows(const TObject** o1, const TObject** o2)
 | 
						||
{
 | 
						||
  TToken_string& s1 = *(TToken_string*)*o1;
 | 
						||
  TToken_string& s2 = *(TToken_string*)*o2;
 | 
						||
 | 
						||
  int cmp = 0;
 | 
						||
  FOR_EACH_TOKEN(_curr_order, fld)
 | 
						||
  {
 | 
						||
    const TRecordset_column_info& ci = _curr_recset->column_info(fld);
 | 
						||
    const TString& f1 = s1.mid(ci._pos, ci._width);
 | 
						||
    const TString& f2 = s2.mid(ci._pos, ci._width);
 | 
						||
    cmp = f1.compare(f2);
 | 
						||
    if (cmp != 0)
 | 
						||
      break;
 | 
						||
  }
 | 
						||
 | 
						||
  return cmp;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
void TStatistiche_ve_recordset::aggiungi_ai_totali(const TRiga_documento& riga, const char tipo_dati)
 | 
						||
{
 | 
						||
  //datadoc (serve a stabilire in quale colonna andr<64> a sommarsi l'importo della riga corrente
 | 
						||
  const TDate datadoc = riga.doc().get_date(DOC_DATADOC);
 | 
						||
  const int mese = datadoc.month();
 | 
						||
 | 
						||
	real dato;
 | 
						||
	//i dati da analizzare possono essere 'P'rezzi o 'Q'uantit<69>
 | 
						||
	if (tipo_dati == 'P')
 | 
						||
		dato = riga.importo(true, false); //importo riga corrente
 | 
						||
	else
 | 
						||
		dato = riga.quantita();	//qta riga corrente
 | 
						||
 | 
						||
	//aggiorna l'importone del mese (ricordarsi che l'array parte da 0 quindi ci va -1 nell'indice)
 | 
						||
	_tot[mese - 1] += dato;
 | 
						||
	//aggiorna anche il totale annuale
 | 
						||
	_tot[12] += dato;
 | 
						||
}
 | 
						||
 | 
						||
//metodo per la scrittura del csv
 | 
						||
bool TStatistiche_ve_recordset::aggiungi_riga(TDocument_recordset& righe, 
 | 
						||
																											const char tipo_dati, const char tipo_stat, const char tipo_dettaglio)
 | 
						||
{
 | 
						||
  const TDocumento& doc = righe.doc(righe.cursor()->curr());
 | 
						||
  const int nriga = righe.get(RDOC_NRIGA).as_int();
 | 
						||
	const TRiga_documento& riga = doc[nriga];
 | 
						||
 | 
						||
	//se non ci sono dati da sommere <20> inutile perdere tempo!
 | 
						||
	real dato;
 | 
						||
	if (tipo_dati == 'P')
 | 
						||
		dato = riga.importo(true, false);				//'P'rezzo->importo
 | 
						||
	else
 | 
						||
		dato = riga.quantita();									//'Q'uantita
 | 
						||
 | 
						||
	if (dato.is_zero())
 | 
						||
		return false;
 | 
						||
 | 
						||
  //creazione di un nuovo record da esportare
 | 
						||
  //esiste gi<67> questo codart?
 | 
						||
  TString80 codart = riga.get(RDOC_CODART);
 | 
						||
  codart.left_just(20);
 | 
						||
 | 
						||
  TString8 codcf = righe.get("DOC.CODCF").as_string();
 | 
						||
	codcf.right_just(6);
 | 
						||
	
 | 
						||
  TString8 grmerc = righe.get("ANAMAG.GRMERC").as_string();
 | 
						||
  grmerc.left_just(5);
 | 
						||
 | 
						||
	//attenzione ai vari casi di composizione chiave!
 | 
						||
	//A=articolo G=GrMerc+Articolo C=Cliente+Articolo o Articolo+Cliente in base al tipo di stampa scelta
 | 
						||
	TToken_string key;
 | 
						||
	switch (tipo_stat)
 | 
						||
	{
 | 
						||
		case 'A':
 | 
						||
			key.add(codart);
 | 
						||
			break;
 | 
						||
 | 
						||
		case 'C':
 | 
						||
			{
 | 
						||
				switch (tipo_dettaglio)
 | 
						||
				{
 | 
						||
				case 'A':
 | 
						||
					key.add(codart);
 | 
						||
					key.add(codcf);
 | 
						||
					break;
 | 
						||
				case 'C':
 | 
						||
					key.add(codcf);
 | 
						||
					key.add(codart);
 | 
						||
					break;
 | 
						||
				case 'G':
 | 
						||
					key.add(codcf);
 | 
						||
					key.add(grmerc);
 | 
						||
					break;
 | 
						||
				case 'M':
 | 
						||
					key.add(grmerc);
 | 
						||
					key.add(codcf);
 | 
						||
					break;
 | 
						||
				default:
 | 
						||
					key.add(codcf);	//se non c'e' dettaglio basta codcf!
 | 
						||
					break;
 | 
						||
				}	//switch(tipo_dettaglio...
 | 
						||
			}
 | 
						||
			break;
 | 
						||
 | 
						||
		case 'G':
 | 
						||
			key.add(grmerc);
 | 
						||
			key.add(codart);
 | 
						||
			break;
 | 
						||
 | 
						||
		default:
 | 
						||
			break;
 | 
						||
	}	//switch(tipo_stat...
 | 
						||
 | 
						||
 | 
						||
	long numriga = trova_riga(key, tipo_stat, tipo_dettaglio);
 | 
						||
 | 
						||
  if (numriga < 0)
 | 
						||
  {
 | 
						||
    //codart
 | 
						||
    new_rec("");
 | 
						||
    set("CODART", codart);
 | 
						||
    //descrart
 | 
						||
    const TString& descrart = cache().get(LF_ANAMAG, codart, ANAMAG_DESCR);
 | 
						||
    set("DESCRIZIONE", descrart);
 | 
						||
    
 | 
						||
		set("GRMERC", grmerc);
 | 
						||
		set("CODCLI", TVariant(codcf));
 | 
						||
 | 
						||
    //re-sorting per codart (serve perch<63> solo il recordset ordinato <20> scannerizzabile con il plutonico metodo dicotomico)
 | 
						||
		switch (tipo_stat)
 | 
						||
		{
 | 
						||
		case 'A':	_curr_order = "CODART";	break;
 | 
						||
 | 
						||
		case 'C':
 | 
						||
			{
 | 
						||
			  switch (tipo_dettaglio)
 | 
						||
				{
 | 
						||
				case 'A':	_curr_order = "CODART|CODCLI";	break;
 | 
						||
				case 'C':	_curr_order = "CODCLI|CODART";	break;
 | 
						||
				case 'G':	_curr_order = "CODCLI|GRMERC";	break;
 | 
						||
				case 'M':	_curr_order = "GRMERC|CODCLI";	break;
 | 
						||
				default:	_curr_order = "CODCLI";					break;	//ordinamento quando non <20> richiesto il dettaglio
 | 
						||
				}	//switch(tipo_dettaglio...
 | 
						||
			break;
 | 
						||
			}	//case 'C'
 | 
						||
 | 
						||
		case 'G':	_curr_order = "GRMERC|CODART";	break;
 | 
						||
 | 
						||
		default:	break;
 | 
						||
		}
 | 
						||
 | 
						||
    _curr_recset = this;
 | 
						||
    sort(compare_recset_rows);
 | 
						||
    _curr_recset = NULL;
 | 
						||
		
 | 
						||
    numriga = trova_riga(key, tipo_stat, tipo_dettaglio);
 | 
						||
 | 
						||
    CHECKS(numriga >= 0, "Articolo bastardo ", (const char*)codart);
 | 
						||
  }
 | 
						||
  //riempimento del record secondo il tracciato:
 | 
						||
  // codart+descrart+12*[impns+%incid]+grmerc+codcf
 | 
						||
  
 | 
						||
  //datadoc (serve a stabilire in quale colonna andr<64> a sommarsi l'importo della riga corrente
 | 
						||
  const TDate datadoc = riga.doc().get_date(DOC_DATADOC);
 | 
						||
  const int mese = datadoc.month();
 | 
						||
  TString16 str_mese = itom(mese);
 | 
						||
  str_mese.upper();
 | 
						||
 | 
						||
	//parte comune ai due casi
 | 
						||
	real datone = get(str_mese).as_real();	//valora totale della colonna mese corrispondente nel csv
 | 
						||
	datone += dato;									//aggiunge il valore riga al valore totale articolo del mese nel csv
 | 
						||
	set(str_mese, datone);						//riscrive il valore totale aggiornato nella sua colonna(in formato stringa, cio<69> con la "," e non il ".")
 | 
						||
 | 
						||
 | 
						||
	//aggiunge anche grmerc, utilizzando codartmag per risalire al grmerc (se usasse codart potrebbe non esistere in anagrafica!)
 | 
						||
	set("GRMERC", grmerc);
 | 
						||
	//aggiunge pure il cliente
 | 
						||
	set("CODCLI", codcf);
 | 
						||
 | 
						||
	return true;
 | 
						||
}
 | 
						||
 | 
						||
void TStatistiche_ve_recordset::calcola_percentuali()
 | 
						||
{
 | 
						||
  //%incidenza articolo sul mese = imp_articolo mese / imp tot mese
 | 
						||
  for (bool ok = move_first(); ok; ok = move_next())
 | 
						||
  {
 | 
						||
    real totale_anno;
 | 
						||
    TString16 str_mese;
 | 
						||
    for (int i = 1; i <= 12; i++)
 | 
						||
    {
 | 
						||
      str_mese = itom(i);
 | 
						||
      str_mese.upper();
 | 
						||
      const real imp_art_mese = get(str_mese).as_real();
 | 
						||
      //ricordando che l'array parte da 0
 | 
						||
      real perc = imp_art_mese * CENTO / _tot[i - 1]; //calcola la % incidenza articolo sul totale per quel mese
 | 
						||
			perc.round(5);
 | 
						||
      str_mese.cut(3);
 | 
						||
      str_mese.insert("P");
 | 
						||
      set(str_mese, perc);
 | 
						||
      totale_anno += imp_art_mese;
 | 
						||
    }
 | 
						||
    set("ANNO", totale_anno);
 | 
						||
    real perc_anno = totale_anno * CENTO / _tot[12]; //calcola la % incidenza articolo sul totale annuale
 | 
						||
    perc_anno.round(5);
 | 
						||
    set("PANNO", perc_anno);
 | 
						||
  }
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
///////////////////////////////////////////////////////////
 | 
						||
// APPLICAZIONE
 | 
						||
///////////////////////////////////////////////////////////
 | 
						||
 | 
						||
class TStatistiche_ve : public TSkeleton_application
 | 
						||
{
 | 
						||
  virtual bool check_autorization() const {return false;}
 | 
						||
  virtual const char * extra_modules() const {return "ve";}
 | 
						||
 | 
						||
protected:
 | 
						||
  void elabora(const TMask& mask) const;
 | 
						||
 | 
						||
public:
 | 
						||
	virtual bool create();
 | 
						||
  virtual void main_loop();
 | 
						||
 | 
						||
};
 | 
						||
                                                
 | 
						||
 | 
						||
 | 
						||
//metodo di base per la ricerca delle righe documento che soddisfano i parametri dell'utonto
 | 
						||
void TStatistiche_ve::elabora(const TMask& mask) const
 | 
						||
{
 | 
						||
	//PARAMETRI DI STAMPA
 | 
						||
	//--------------------
 | 
						||
	//tipo dati da estrarre (si utilizza nel metodo di scrittura riga e totali;stabilisce se si vuole qta o prezzo)
 | 
						||
	const char tipo_dati = mask.get(F_TIPODATA)[0];
 | 
						||
	//tipologia di statistica (Articolo - GruppoMerceologico - Cliente)
 | 
						||
	const char tipo_stat = mask.get(F_TIPOSTAT)[0];
 | 
						||
	//se sceglie per cliente ha 3 possibilit<69> di dettaglio (''=nessuno,'C'=raccolto per cliente,'A'=raccolto per articolo)
 | 
						||
	const char tipo_dettaglio = mask.get(F_DETTAGLIO)[0];
 | 
						||
  //volendo si possono includere anche le righedoc con articoli non in anamag o addirittura vuoti!
 | 
						||
  const char tipo_riga = mask.get(F_TIPORIGA)[0];
 | 
						||
 | 
						||
	//stampa particolare bernazzalica in caso di UN SOLO CLIENTE selezionato nella stampa per cliente
 | 
						||
	//in questo caso i totali non sono generali ma solo su quel cliente
 | 
						||
	bool only_one_client = false;
 | 
						||
	if (tipo_stat == 'C')
 | 
						||
	{
 | 
						||
		const long dacli = mask.get_long(F_DACODCLI);
 | 
						||
		const long acodcli = mask.get_long(F_ACODCLI);
 | 
						||
		if (dacli == acodcli && dacli > 0)
 | 
						||
			only_one_client = true;
 | 
						||
	}
 | 
						||
 | 
						||
	//creazione del csv recordset che verra' riempito dai record del recordset righe
 | 
						||
  TStatistiche_ve_recordset* csv = new TStatistiche_ve_recordset();
 | 
						||
 | 
						||
	//CALCOLO DEI TOTALI
 | 
						||
	//------------------
 | 
						||
	//recordset per il calcolo dei totali mese/anno;servono per i calcoli futuri delle percentuali
 | 
						||
	TString prequery;
 | 
						||
  prequery << "USE RDOC KEY 1";
 | 
						||
  prequery << "\nSELECT (BETWEEN(33->DATADOC,#DADATA,#ADATA)&&(333@.S7=#TIPORIGA))";
 | 
						||
	if (only_one_client)
 | 
						||
		prequery << "&&(DOC.TIPOCF=='C')&&(DOC.CODCF==#DACODCLI)";
 | 
						||
 | 
						||
  prequery << "\nJOIN DOC INTO PROVV==PROVV ANNO==ANNO CODNUM==CODNUM NDOC==NDOC";
 | 
						||
  prequery << "\nJOIN %TRI ALIAS 333 INTO CODTAB=TIPORIGA";
 | 
						||
  prequery << "\nFROM CODNUM=#CODNUM ANNO=#ANNO PROVV=D";
 | 
						||
  prequery << "\nTO CODNUM=#CODNUM ANNO=#ANNO PROVV=D";
 | 
						||
	TDocument_recordset totali(prequery);
 | 
						||
	totali.set_var("#CODNUM", TVariant(mask.get(F_CODNUM)));
 | 
						||
  totali.set_var("#DADATA", mask.get_date(F_DADATA));
 | 
						||
  totali.set_var("#ADATA", mask.get_date(F_ADATA));
 | 
						||
  totali.set_var("#ANNO", TVariant((long)mask.get_int(F_ANNO)));
 | 
						||
  totali.set_var("#TIPORIGA", mask.get(F_TIPORIGA));
 | 
						||
	if (only_one_client)
 | 
						||
		totali.set_var("#DACODCLI", mask.get_long(F_DACODCLI));
 | 
						||
	const long totali_items = totali.items();
 | 
						||
	if (totali_items > 0)
 | 
						||
	{
 | 
						||
		//E crea pure la progind..
 | 
						||
    TProgind pi(totali_items, TR("Calcolo totali mensili ed annuali"), true, true);
 | 
						||
 | 
						||
    //Scansione del recordset trovato
 | 
						||
    for (bool ok = totali.move_first(); ok; ok = totali.move_next())
 | 
						||
	  {
 | 
						||
      if (!pi.addstatus(1))
 | 
						||
        break;
 | 
						||
      const TDocumento& doc = totali.doc(totali.cursor()->curr());
 | 
						||
      const int nriga = totali.get(RDOC_NRIGA).as_int();
 | 
						||
      //scrive sul CSV i campi che servono al file di excel e al report
 | 
						||
      csv->aggiungi_ai_totali(doc[nriga], tipo_dati);
 | 
						||
		}
 | 
						||
	}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
	//CREAZIONE QUERY
 | 
						||
	//---------------
 | 
						||
	//scatta la query per la costruzione del recordset
 | 
						||
	TString query;
 | 
						||
	query << "USE RDOC KEY 1\n";
 | 
						||
  query << "SELECT (BETWEEN(33->DATADOC,#DADATA,#ADATA)&&(333@.S7=#TIPORIGA))";
 | 
						||
 | 
						||
	switch (tipo_stat)
 | 
						||
	{
 | 
						||
	case 'A':	
 | 
						||
    query << "&&(BETWEEN(CODART,#DACODART,#ACODART))";	
 | 
						||
    break;
 | 
						||
	case 'C':	
 | 
						||
    query << "&&(DOC.TIPOCF=='C')&&(BETWEEN(DOC.CODCF,#DACODCLI,#ACODCLI))";	 
 | 
						||
    break;
 | 
						||
	case 'G':	
 | 
						||
    if (tipo_riga == 'M') 
 | 
						||
      query << "&&(BETWEEN(ANAMAG.GRMERC,#DAGRMERC,#AGRMERC))";	
 | 
						||
    break;
 | 
						||
  default:
 | 
						||
    break;
 | 
						||
	}
 | 
						||
 | 
						||
	//parte comune ai vari casi di statistica della query
 | 
						||
	query << "\nJOIN DOC INTO PROVV==PROVV ANNO==ANNO CODNUM==CODNUM NDOC==NDOC";
 | 
						||
  query << "\nJOIN %TRI ALIAS 333 INTO CODTAB=TIPORIGA";
 | 
						||
 | 
						||
	//parte non comune (deve joinare anamag per avere il grmerc)
 | 
						||
  if (tipo_riga == 'M')
 | 
						||
  {
 | 
						||
	  if (tipo_stat == 'G' || (tipo_stat == 'C' && (tipo_dettaglio == 'G' || tipo_dettaglio == 'M')))
 | 
						||
		  query << "\nJOIN ANAMAG INTO CODART==CODARTMAG";
 | 
						||
  }
 | 
						||
 | 
						||
	//ri-parte comune
 | 
						||
	query << "\nFROM CODNUM=#CODNUM ANNO=#ANNO PROVV=D";
 | 
						||
	query << "\nTO CODNUM=#CODNUM ANNO=#ANNO PROVV=D";
 | 
						||
 | 
						||
 | 
						||
	//CREAZIONE RECORDSET
 | 
						||
	//-------------------
 | 
						||
	TDocument_recordset righe(query);
 | 
						||
 | 
						||
	//parte comune di settaggio variabili
 | 
						||
	righe.set_var("#CODNUM", TVariant(mask.get(F_CODNUM)));
 | 
						||
	righe.set_var("#DADATA", mask.get_date(F_DADATA));
 | 
						||
	righe.set_var("#ADATA", mask.get_date(F_ADATA));
 | 
						||
	righe.set_var("#ANNO", TVariant((long)mask.get_int(F_ANNO)));
 | 
						||
  righe.set_var("#TIPORIGA", mask.get(F_TIPORIGA));
 | 
						||
 | 
						||
	switch(tipo_stat)
 | 
						||
	{
 | 
						||
		case 'A':
 | 
						||
			righe.set_var("#DACODART", TVariant(mask.get(F_DACODART)));
 | 
						||
			righe.set_var("#ACODART", TVariant(mask.get(F_ACODART)));
 | 
						||
			break;
 | 
						||
		case 'C':
 | 
						||
			righe.set_var("#DACODCLI", TVariant(mask.get(F_DACODCLI)));
 | 
						||
			righe.set_var("#ACODCLI", TVariant(mask.get(F_ACODCLI)));
 | 
						||
			break;
 | 
						||
		case 'G':
 | 
						||
			righe.set_var("#DAGRMERC", TVariant(mask.get(F_DAGRMERC)));
 | 
						||
			righe.set_var("#AGRMERC", TVariant(mask.get(F_AGRMERC)));
 | 
						||
			break;
 | 
						||
 | 
						||
		default:
 | 
						||
			break;
 | 
						||
	}
 | 
						||
 | 
						||
	
 | 
						||
	//CREAZIONE STAMPE/ESPORTAZIONI
 | 
						||
	//-----------------------------
 | 
						||
  //se trova (si spera!) almeno una rigadoc buona comincia il bello del programma
 | 
						||
  const long righe_items = righe.items();
 | 
						||
  if (righe_items > 0)
 | 
						||
  {
 | 
						||
    //E crea pure la progind..
 | 
						||
    TProgind pi(righe_items, TR("Generazione file statistiche..."), true, true);
 | 
						||
 | 
						||
    //Scansione del recordset trovato
 | 
						||
    for (bool ok = righe.move_first(); ok; ok = righe.move_next())
 | 
						||
	  {
 | 
						||
      if (!pi.addstatus(1))
 | 
						||
        break;
 | 
						||
      //scrive sul CSV i campi che servono al file di excel e al report
 | 
						||
			csv->aggiungi_riga(righe, tipo_dati, tipo_stat, tipo_dettaglio);
 | 
						||
    }
 | 
						||
 | 
						||
    //aggiorna le colonne delle percentuali
 | 
						||
    csv->calcola_percentuali();
 | 
						||
 | 
						||
    //se richiesto il file in formato excel...
 | 
						||
    if (mask.get_bool(F_EXCEL))
 | 
						||
    {
 | 
						||
      //salva il file come richiesto; il nome del file viene deciso in base al tipo di statistica richiesta; il file alla fine..
 | 
						||
			//..della storia <20> sempre lo stesso ma ordinato in modo diverso
 | 
						||
      TString path = mask.get(F_PATH);
 | 
						||
      path.lower();
 | 
						||
			path << "\\stat";
 | 
						||
			switch (tipo_stat)
 | 
						||
			{
 | 
						||
			case 'A':	path << "_art.xls";	break;
 | 
						||
			case 'C':	path << "_cli.xls";	break;
 | 
						||
			case 'G':	path << "_gmc.xls";	break;
 | 
						||
			default:	break;
 | 
						||
			}
 | 
						||
			csv->save_as(path, fmt_html);
 | 
						||
 | 
						||
#ifdef DBG
 | 
						||
	    xvt_sys_goto_url(path, "open");
 | 
						||
#endif
 | 
						||
    }
 | 
						||
		
 | 
						||
		//REPORT DI STAMPA
 | 
						||
		//----------------
 | 
						||
    //creazione del report di stampa
 | 
						||
	  TStatistiche_ve_report rep;
 | 
						||
		bool stampa;
 | 
						||
		//in base alle scelte dell'utonto stabilisce quale report usare
 | 
						||
		switch(tipo_stat)
 | 
						||
		{ 
 | 
						||
		case 'A':
 | 
						||
			stampa = rep.load("ve3800a");
 | 
						||
			break;
 | 
						||
 | 
						||
		case 'C':
 | 
						||
			{
 | 
						||
				switch (tipo_dettaglio)
 | 
						||
				{
 | 
						||
				case 'A':	stampa = rep.load("ve3800e");	break;	//raggr per art. - dett. per cli
 | 
						||
				case 'C':	stampa = rep.load("ve3800d");	break;	//raggr. per cli - dett. per art
 | 
						||
				case 'G':	stampa = rep.load("ve3800f");	break;	//raggr. per cli - dett. per grmerc
 | 
						||
				case 'M':	stampa = rep.load("ve3800g");	break;	//raggr. per grmerc - dett. per cli
 | 
						||
				default:	stampa = rep.load("ve3800c");	break;
 | 
						||
				}	
 | 
						||
			}
 | 
						||
			break;
 | 
						||
 | 
						||
		case 'G':
 | 
						||
			stampa = rep.load("ve3800b");
 | 
						||
			break;
 | 
						||
 | 
						||
		default:
 | 
						||
			break;
 | 
						||
		}
 | 
						||
 | 
						||
    //setta il recordset...
 | 
						||
    rep.set_recordset(csv);
 | 
						||
    //setta le variabili della maschera sul report
 | 
						||
    rep.mask2report(mask);
 | 
						||
 | 
						||
	  if (stampa)
 | 
						||
	  {
 | 
						||
		  TReport_book book;
 | 
						||
		  stampa = book.add(rep);
 | 
						||
		  if (stampa)
 | 
						||
			  book.print_or_preview();
 | 
						||
    }
 | 
						||
 | 
						||
  } //if(righe_items>0...
 | 
						||
	else
 | 
						||
		delete csv;
 | 
						||
}
 | 
						||
 | 
						||
void TStatistiche_ve::main_loop()
 | 
						||
{
 | 
						||
  TStatistiche_ve_mask mask;
 | 
						||
  
 | 
						||
  while (mask.run() == K_ENTER)
 | 
						||
  {
 | 
						||
    elabora(mask);
 | 
						||
  }
 | 
						||
} 
 | 
						||
 | 
						||
bool TStatistiche_ve::create()
 | 
						||
{
 | 
						||
  //controlla se la chiave ha l'autorizzazione a questo programma
 | 
						||
  Tdninst dninst;
 | 
						||
  if (!dninst.can_I_run(true))
 | 
						||
    return error_box(TR("Programma non autorizzato!"));
 | 
						||
 | 
						||
	return TSkeleton_application::create();
 | 
						||
}
 | 
						||
 | 
						||
int ve3800(int argc, char* argv[])
 | 
						||
{
 | 
						||
  TStatistiche_ve stat_anal;
 | 
						||
  stat_anal.run(argc, argv, TR("Statistiche di vendita"));
 | 
						||
  return 0;
 | 
						||
} |