339 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			339 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include <applicat.h>
 | 
						||
#include <automask.h>
 | 
						||
#include <config.h>
 | 
						||
#include <reprint.h>
 | 
						||
#include <textset.h>
 | 
						||
  
 | 
						||
#include "lv2800a.h"
 | 
						||
 | 
						||
//Stampa Venduto Per Cliente nei 12 Mesi
 | 
						||
//lvietri
 | 
						||
class TVend_cli_recordset: public TCSV_recordset
 | 
						||
{
 | 
						||
public:
 | 
						||
  TVend_cli_recordset(): TCSV_recordset("CSV(\"\t\")") {}
 | 
						||
};
 | 
						||
 | 
						||
struct TStruttura_venduto: public TObject
 | 
						||
{ 
 | 
						||
  long _cliente;
 | 
						||
  const TString _articolo; 
 | 
						||
  const TString _descr;
 | 
						||
  TDate _dataDoc;
 | 
						||
  int _numeroDoc;
 | 
						||
  long _qta;
 | 
						||
  TStruttura_venduto():_cliente(0),_articolo(""),_descr(""),_dataDoc(""),_numeroDoc(0),_qta(0) {}
 | 
						||
  TStruttura_venduto(long cliente, TString articolo, TString descr,
 | 
						||
             TDate dataDoc, int numeroDoc,long qta):
 | 
						||
             _cliente(cliente),_articolo(articolo),
 | 
						||
             _descr(descr),_dataDoc(dataDoc),_numeroDoc(numeroDoc),_qta(qta) {}
 | 
						||
};
 | 
						||
 | 
						||
class TVend_cli_mask: public TAutomask
 | 
						||
{
 | 
						||
protected:
 | 
						||
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | 
						||
public:
 | 
						||
  TVend_cli_mask():TAutomask("lv2800a"){}
 | 
						||
};
 | 
						||
 | 
						||
bool TVend_cli_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | 
						||
{
 | 
						||
  switch (o.dlg())
 | 
						||
  {
 | 
						||
    case F_DATA_DA:
 | 
						||
    if (e == fe_init)
 | 
						||
    {
 | 
						||
      TDate oggi(TODAY);
 | 
						||
      oggi.set_day(1);
 | 
						||
      o.set (oggi.string());
 | 
						||
    }
 | 
						||
    default: break;
 | 
						||
  }
 | 
						||
  return true;
 | 
						||
}
 | 
						||
 | 
						||
class TVend_cli_report : public TReport
 | 
						||
{
 | 
						||
protected:
 | 
						||
  virtual bool use_mask() { return false; }
 | 
						||
};
 | 
						||
 | 
						||
class TVend_cli_app: public TSkeleton_application
 | 
						||
{
 | 
						||
protected:
 | 
						||
  virtual void main_loop();
 | 
						||
  void elabora(const TMask& mask) const;
 | 
						||
  TString getQuery(const TMask& mask) const;
 | 
						||
  bool ctl(const TDate& dataInizio, const TDate& dataFine, bool isAnno) const;
 | 
						||
};
 | 
						||
 | 
						||
TString TVend_cli_app::getQuery(const TMask& mask) const
 | 
						||
{
 | 
						||
  //Stringhe x composizione query
 | 
						||
  TString query, select, between, orderBy, join, limit;
 | 
						||
  
 | 
						||
  //Richiamo parametri della ditta di configurazione file Ditta.ini  
 | 
						||
    
 | 
						||
  //andare su bolle senza numeratore
 | 
						||
  //const TString4 codnum  = ini_get_string(CONFIG_DITTA, "lv", "NUM_FAT");
 | 
						||
  //const TString4 tipodoc = ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_FAT");
 | 
						||
  const TString4 codnum  = ini_get_string(CONFIG_DITTA, "lv", "NUM_GEN");
 | 
						||
  const TString4 tipodoc = ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_GEN");
 | 
						||
 | 
						||
  select << "USE RDOC KEY 3\n";
 | 
						||
  select << "SELECT (DOC.TIPODOC='" << tipodoc << "')"; 
 | 
						||
   
 | 
						||
  between << "&&(BETWEEN(DOC.ZONA,#ZONA_FROM,#ZONA_FROM))";
 | 
						||
  between << "&&(BETWEEN(CODART,#CODART_FROM,#CODART_TO))";
 | 
						||
  between << "&&(BETWEEN(DOC.DATADOC,#DATA_FROM,#DATA_TO))";
 | 
						||
  between << "&&(STR(BETWEEN(DOC.CODCF,#CODCF_FROM,#CODCF_TO)))\n";
 | 
						||
  orderBy << "BY DOC.CODCF CODART DOC.DATADOC NDOC\n";  
 | 
						||
  join    << "JOIN DOC TO RDOC ALIAS 1000 INTO CODNUM==CODNUM ANNO==ANNO PROVV==PROVV NDOC==NDOC\n";
 | 
						||
  
 | 
						||
  if(!mask.get_bool(F_CHECK_NO_RESI))
 | 
						||
  {
 | 
						||
    select  << "&&(2000@.B2!='X')";
 | 
						||
    join << "JOIN &LVCAU TO RDOC ALIAS 2000 INTO CODTAB==CODAGG1\n";
 | 
						||
  }
 | 
						||
  if(mask.get_bool(F_CHECK_FATT))
 | 
						||
  {
 | 
						||
    select << "&&(3000@.S2[37,38] ='+1')";
 | 
						||
    join << "JOIN %CAU TO &LVCAU ALIAS 3000 INTO CODTAB==S2\n";
 | 
						||
  }
 | 
						||
 | 
						||
  limit << "PROVV=D ANNO=" << mask.get(F_ANNO) << " CODNUM=" << codnum;
 | 
						||
 | 
						||
  query << select << between << orderBy << join;
 | 
						||
  query << "\nFROM " << limit;
 | 
						||
  query << "\nTO " << limit;
 | 
						||
 
 | 
						||
  return query;
 | 
						||
}
 | 
						||
 | 
						||
class TRiepVendCli: public TArray
 | 
						||
{
 | 
						||
public:
 | 
						||
  void add(long cliente, TString articolo, TString descr,
 | 
						||
           TDate dataDoc, int numeroDoc, long qta);
 | 
						||
  TRiepVendCli():TArray(){}
 | 
						||
};
 | 
						||
 | 
						||
 | 
						||
void TRiepVendCli::add(long cliente, TString articolo, TString descr,
 | 
						||
                     TDate dataDoc, int numeroDoc, long qta) 
 | 
						||
{
 | 
						||
  TStruttura_venduto* struttura = new TStruttura_venduto(cliente,articolo, descr,dataDoc,numeroDoc,qta);
 | 
						||
  TArray::add(struttura);  
 | 
						||
}
 | 
						||
 | 
						||
/*
 | 
						||
Effettuo Controlli. Ritorna false-Errore se:
 | 
						||
- data iniziale vuota
 | 
						||
- data finale vuota
 | 
						||
- date appartenenti ad anno differente
 | 
						||
(msk gestisce controllo se data iniziale <20> maggiore di
 | 
						||
quella finale)
 | 
						||
*/
 | 
						||
bool TVend_cli_app::ctl(const TDate& dataInizio, const TDate& dataFine, bool isAnno) const
 | 
						||
{
 | 
						||
  if (!isAnno)
 | 
						||
  {
 | 
						||
    const int annoInizio = dataInizio.year();
 | 
						||
    const int annoFine   = dataFine.year();
 | 
						||
    if (annoInizio != annoFine)
 | 
						||
      return error_box(TR("Le date non fanno parte dello stesso anno!"));
 | 
						||
  }
 | 
						||
  return true;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//metodo principale di elaborazione
 | 
						||
void TVend_cli_app:: elabora(const TMask& mask)const
 | 
						||
{
 | 
						||
  /*
 | 
						||
  Se i controlli vanno a buon fine, allora
 | 
						||
  va avanti nella gestione
 | 
						||
  */
 | 
						||
  if (ctl(mask.get_date(F_DATA_DA), mask.get_date(F_DATA_A), mask.get_bool(F_CHECK_ANNO)))
 | 
						||
  {
 | 
						||
    TISAM_recordset riep(getQuery(mask));
 | 
						||
 | 
						||
    TDate dataDa = mask.get_date(F_DATA_DA);
 | 
						||
    TDate dataA  = mask.get_date(F_DATA_A);
 | 
						||
 | 
						||
    if(mask.get_bool(F_CHECK_ANNO))
 | 
						||
    {
 | 
						||
      dataDa.set_day(1);
 | 
						||
      dataDa.set_month(1);
 | 
						||
      dataDa.set_year(mask.get_int(F_ANNO));
 | 
						||
 | 
						||
      dataA.set_day(31);
 | 
						||
      dataA.set_month(12);
 | 
						||
      dataA.set_year(mask.get_int(F_ANNO));     
 | 
						||
    }
 | 
						||
 | 
						||
    const long cazzone1 = mask.get_long(F_CODCF_DA);
 | 
						||
    const long cazzone2 = mask.get_long(F_CODCF_A);
 | 
						||
    
 | 
						||
    //inserire parametri filtri
 | 
						||
    riep.set_var("#DATA_FROM",        dataDa);
 | 
						||
    riep.set_var("#DATA_TO",          dataA);  
 | 
						||
    riep.set_var("#CODCF_FROM",       cazzone1);
 | 
						||
    riep.set_var("#CODCF_TO",         cazzone2);
 | 
						||
    riep.set_var("#ZONA_FROM",        TVariant(mask.get(F_ZONA)));
 | 
						||
    riep.set_var("#ANNO_TO",          TVariant(mask.get(F_ANNO)));
 | 
						||
    riep.set_var("#CODART_FROM",      TVariant(mask.get(F_CODART_FROM)));
 | 
						||
    riep.set_var("#CODART_TO",        TVariant(mask.get(F_CODART_TO)));
 | 
						||
    riep.set_var("#CHECK_NO_RESI_TO", TVariant(mask.get(F_CHECK_NO_RESI)));
 | 
						||
    riep.set_var("#CHECK_FATT_TO",    TVariant(mask.get(F_CHECK_FATT)));
 | 
						||
 | 
						||
    TRiepVendCli riepilogo;
 | 
						||
    
 | 
						||
    //inizializzazione variabili da utilizzare nella
 | 
						||
    //struttura
 | 
						||
    TDate dataDoc;  
 | 
						||
    TString80 articolo;
 | 
						||
    TString descr;
 | 
						||
    int  numeroDoc;
 | 
						||
    long cliente, qta;
 | 
						||
 | 
						||
    for (bool ok = riep.move_first(); ok; ok=riep.move_next())
 | 
						||
    {
 | 
						||
      dataDoc   = riep.get("DOC.DATADOC").as_date();  
 | 
						||
      articolo  = riep.get("CODART").as_string();
 | 
						||
      descr     = riep.get("DESCR").as_string();
 | 
						||
 | 
						||
      numeroDoc = riep.get("NDOC").as_int();
 | 
						||
      cliente   = riep.get("DOC.CODCF").as_int();
 | 
						||
      qta       = riep.get("QTA").as_int();
 | 
						||
     
 | 
						||
      riepilogo.add(cliente,articolo,descr,dataDoc,numeroDoc,qta);
 | 
						||
    } 
 | 
						||
  
 | 
						||
    //gestione report
 | 
						||
    TVend_cli_report rep;
 | 
						||
    bool stampa = rep.load("lv2800a");
 | 
						||
    TVend_cli_recordset* riep_set = new TVend_cli_recordset();
 | 
						||
    rep.set_recordset(riep_set);
 | 
						||
 | 
						||
    //inizializzazione variabili   
 | 
						||
    TString articoloOld;
 | 
						||
    TString descrOld;
 | 
						||
    long  clienteOld = 0;
 | 
						||
    bool start   = true;
 | 
						||
    int  colonna = 0;
 | 
						||
 | 
						||
    //inizializzazione array di quantit<69>
 | 
						||
    //12 mesi valorizzati inizialmente a 0
 | 
						||
    long qtaArray[16]; memset(qtaArray, 0, sizeof(qtaArray));
 | 
						||
    int meseArray = 0;
 | 
						||
    
 | 
						||
    //scandisce clienti e tiene buoni solo quelli valorizzati
 | 
						||
    FOR_EACH_ARRAY_ITEM(riepilogo,c,obj)
 | 
						||
    {
 | 
						||
      TStruttura_venduto& s = *(TStruttura_venduto*) obj;
 | 
						||
        
 | 
						||
      //Solo la prima volta setto le variabili altrimenti
 | 
						||
      //entrerebbe sempre nel metodo creazione record
 | 
						||
      //in report
 | 
						||
      if(start)
 | 
						||
      {
 | 
						||
        clienteOld=s._cliente;
 | 
						||
        articoloOld=s._articolo;
 | 
						||
        start = false;
 | 
						||
      }
 | 
						||
 | 
						||
      //metodo creazione record in report
 | 
						||
      if (clienteOld!=s._cliente || articoloOld!=s._articolo)
 | 
						||
      {
 | 
						||
        riep_set->new_rec();
 | 
						||
        colonna = 0;
 | 
						||
        riep_set->set(colonna,TVariant(clienteOld));//CAMPO DI ROTTURA    
 | 
						||
        colonna++;
 | 
						||
        riep_set->set(colonna,TVariant(clienteOld)); 
 | 
						||
        colonna++;
 | 
						||
        riep_set->set(colonna,TVariant(articoloOld));
 | 
						||
        colonna++;
 | 
						||
        riep_set->set(colonna,TVariant(descrOld));
 | 
						||
        
 | 
						||
        for(int a = 1; a<13; a++)
 | 
						||
        {
 | 
						||
          //colonna=3
 | 
						||
          riep_set->set((colonna+a),TVariant(long (qtaArray[a]))); 
 | 
						||
          qtaArray[a] = 0;
 | 
						||
        }
 | 
						||
 | 
						||
        clienteOld = s._cliente;
 | 
						||
        articoloOld= s._articolo;
 | 
						||
        descrOld   = s._descr;
 | 
						||
      } 
 | 
						||
 | 
						||
      //Gestione Somma qta in base al mese
 | 
						||
      meseArray = (s._dataDoc).month();
 | 
						||
      qtaArray[meseArray] = qtaArray[meseArray] + s._qta;
 | 
						||
    }
 | 
						||
 | 
						||
    //Stampa Ultimo record se ne ha fatto almeno 1
 | 
						||
    if (!start)
 | 
						||
    {
 | 
						||
      riep_set->new_rec();
 | 
						||
      colonna = 0;
 | 
						||
      riep_set->set(colonna,TVariant(clienteOld));//CAMPO DI ROTTURA          
 | 
						||
      colonna++;
 | 
						||
      riep_set->set(colonna,TVariant(clienteOld)); 
 | 
						||
      colonna++;
 | 
						||
      riep_set->set(colonna,TVariant(articoloOld));
 | 
						||
      colonna++;
 | 
						||
      riep_set->set(colonna,TVariant(descrOld));
 | 
						||
      
 | 
						||
      for (int a = 1; a<13; a++)
 | 
						||
      {
 | 
						||
        //colonna=3
 | 
						||
        riep_set->set((colonna+a),TVariant(qtaArray[a])); 
 | 
						||
        qtaArray[a] = 0;
 | 
						||
      }
 | 
						||
    }
 | 
						||
 | 
						||
    //Crea file che contiene il recordset
 | 
						||
    //riep_set->save_as("c:\\riepilogoBolla.txt");
 | 
						||
 | 
						||
    //Se il report esiste..
 | 
						||
    if (stampa)
 | 
						||
    {
 | 
						||
      //carica tutte le variabili del report.
 | 
						||
      rep.mask2report(mask);
 | 
						||
 | 
						||
      TReport_book b;
 | 
						||
      bool ok = b.add(rep);// Richiede parametri di stampa in base alla maschera omonima
 | 
						||
      if (ok)
 | 
						||
      {
 | 
						||
        //Se esiste almeno 1 pagina
 | 
						||
        if (b.pages() > 0)
 | 
						||
          b.print_or_preview(); // Stampa effettivamente
 | 
						||
        else
 | 
						||
          warning_box (TR("Nessun record estratto per i parametri inseriti"));
 | 
						||
      }
 | 
						||
    }
 | 
						||
  }
 | 
						||
}
 | 
						||
 | 
						||
void TVend_cli_app::main_loop()
 | 
						||
{
 | 
						||
  TVend_cli_mask mask;
 | 
						||
 | 
						||
  //Settaggio della data finale come
 | 
						||
  //31-12-(anno in corso)
 | 
						||
  TString16 data = "31-12-";  data << mask.get_int(F_ANNO);
 | 
						||
  mask.set(F_DATA_A, data);
 | 
						||
 | 
						||
  while (mask.run()==K_ENTER)
 | 
						||
    elabora(mask);    
 | 
						||
}
 | 
						||
 | 
						||
int lv2800(int argc, char* argv[])
 | 
						||
{
 | 
						||
  TVend_cli_app app;
 | 
						||
  app.run(argc, argv, TR("Venduto per cliente nei 12 mesi"));
 | 
						||
  return 0;
 | 
						||
} |