Files correlati : Ricompilazione Demo : [ ] Commento :Aggiunti check Stampa righi resi e da fatturare, controllo data iniziale. Nella Stampa Giri inserito check Mnemorico e controllo località-comune git-svn-id: svn://10.65.10.50/trunk@19760 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			363 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			363 lines
		
	
	
		
			9.6 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(TDate dataInizio,
 | ||
|            TDate dataFine,
 | ||
|            bool isAnno) const;
 | ||
|   bool erroreBox(TString aMsg) const;
 | ||
| };
 | ||
| 
 | ||
| TString TVend_cli_app::getQuery(const TMask& mask) const
 | ||
| {
 | ||
|   //Stringhe x composizione query
 | ||
|   TString query, select, between, orderBy, join;
 | ||
|   
 | ||
|   //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 tipodoc = ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_GEN");
 | ||
| 
 | ||
|   
 | ||
| 
 | ||
|   select  << "USE RDOC KEY 1\n";
 | ||
|   select  << "SELECT ((DOC.TIPODOC='" << tipodoc << "')&&"; 
 | ||
|   
 | ||
|   if(!mask.get_bool(F_CHECK_NO_RESI)){
 | ||
|     select  << "(2000@.B2!='X')&&";
 | ||
|   }
 | ||
|   if(mask.get_bool(F_CHECK_FATT)){
 | ||
|     select  << "(3000@.S2[37,38] ='+1')&&";
 | ||
|   }
 | ||
|     
 | ||
|   between << "(BETWEEN(DOC.ZONA,#F_ZONA_FROM,#F_ZONA_FROM))";
 | ||
|   between << "&&(BETWEEN(CODART,#F_CODART_FROM,#F_CODART_TO))";
 | ||
|   between << "&&(BETWEEN(DOC.DATADOC,#F_DATA_FROM,#F_DATA_TO))";
 | ||
|   between << "&&(BETWEEN(DOC.CODCF,#F_CODCF_FROM,#F_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)){
 | ||
|     join  << "JOIN &LVCAU TO RDOC ALIAS 2000 INTO CODTAB==CODAGG1\n";
 | ||
|   }
 | ||
|   if(mask.get_bool(F_CHECK_FATT)){
 | ||
|     join  << "JOIN %CAU TO &LVCAU ALIAS 3000 INTO CODTAB==S2\n";
 | ||
|   }
 | ||
|   
 | ||
| 
 | ||
|   query << select << between << orderBy << join;
 | ||
|   
 | ||
|   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);  
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
| Metodo di visualizzazione pop errore
 | ||
| ritorna sempre false.
 | ||
| */
 | ||
| bool TVend_cli_app::erroreBox(TString aMsg) const
 | ||
| {
 | ||
|   error_box (aMsg);
 | ||
|   return false;
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
| 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(TDate dataInizio,
 | ||
|                         TDate dataFine,
 | ||
|                         bool isAnno) const
 | ||
| {
 | ||
|   if(!isAnno)
 | ||
|   {
 | ||
|     int annoInizio = dataInizio.year();
 | ||
|     int annoFine   = dataFine.year();
 | ||
|     if(annoInizio!=annoFine)
 | ||
|     {
 | ||
|       return erroreBox(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));     
 | ||
|     }
 | ||
|     
 | ||
|     //inserire parametri filtri
 | ||
|     riep.set_var("#F_DATA_FROM",dataDa);
 | ||
|     riep.set_var("#F_DATA_TO",dataA);  
 | ||
|     riep.set_var("#F_CODCF_FROM",TVariant(mask.get(F_CODCF_DA)));
 | ||
|     riep.set_var("#F_CODCF_TO",TVariant(mask.get(F_CODCF_A)));
 | ||
|     riep.set_var("#F_ZONA_FROM",TVariant(mask.get(F_ZONA)));
 | ||
|     riep.set_var("#F_ANNO_TO",TVariant(mask.get(F_ANNO)));
 | ||
|     riep.set_var("#F_CHECK_ANNO_TO",TVariant(mask.get(F_CHECK_ANNO)));
 | ||
|     riep.set_var("#F_CODART_FROM",TVariant(mask.get(F_CODART_FROM)));
 | ||
|     riep.set_var("#F_CODART_TO",TVariant(mask.get(F_CODART_TO)));
 | ||
|     riep.set_var("#F_CHECK_NO_RESI_TO",TVariant(mask.get(F_CHECK_NO_RESI)));
 | ||
|     riep.set_var("#F_CHECK_FATT_TO",TVariant(mask.get(F_CHECK_FATT)));
 | ||
| 
 | ||
|     TRiepVendCli riepilogo;
 | ||
|     
 | ||
|     //inizializzazione variabili da utilizzare nella
 | ||
|     //struttura
 | ||
|     TDate   dataDoc;  
 | ||
|     TString articolo;
 | ||
|     TString descr;
 | ||
|     int  numeroDoc;
 | ||
|     long cliente;
 | ||
|     long 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;
 | ||
|     int  clienteOld = 0;
 | ||
|     bool start   = true;
 | ||
|     int  colonna = 0;
 | ||
| 
 | ||
|     //inizializzazione array di quantit<69>
 | ||
|     //12 mesi valorizzati inizialmente a 0
 | ||
|     int  qtaArray[12];
 | ||
|     for(int a = 0; a<13; a++) {qtaArray[a] = 0;}
 | ||
|     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(long (clienteOld)));//CAMPO DI ROTTURA    
 | ||
|         colonna++;
 | ||
|         riep_set->set(colonna,TVariant(long (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(long (clienteOld)));//CAMPO DI ROTTURA          
 | ||
|       colonna++;
 | ||
|       riep_set->set(colonna,TVariant(long (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;
 | ||
|       }
 | ||
|     }
 | ||
| 
 | ||
|     //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)
 | ||
|   TString data = "31-12-";
 | ||
|   data << mask.get_int(F_ANNO);
 | ||
|   mask.set("#F_DATA_TO",data);
 | ||
| 
 | ||
|   while(mask.run()==K_ENTER)
 | ||
|   {
 | ||
|     elabora(mask);    
 | ||
|   }  
 | ||
| }
 | ||
| 
 | ||
| int lv2800(int argc, char* argv[])
 | ||
| {
 | ||
|   TVend_cli_app app;
 | ||
|   app.run(argc, argv, TR("Stampa Venduto Per Cliente nei 12 Mesi"));
 | ||
|   return 0;
 | ||
| } |