352 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			352 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| // 77g1.cpp - Quadro G1
 | |
| #include <defmask.h>
 | |
| #include <msksheet.h>
 | |
| #include <relapp.h>
 | |
| #include <recarray.h>
 | |
| 
 | |
| #include "quadrog1.h"
 | |
| #include "774200.h"
 | |
| #include "77g1a.h"   
 | |
| #include "77lib.h"
 | |
| 
 | |
| class TQuadroG1 : public TRelation_application
 | |
| {
 | |
|   private:
 | |
|     TRelation*    _rel;
 | |
|     TMask*        _msk;
 | |
|     long          _codditta;
 | |
|     TString16     _quadro;
 | |
|     TString80     _title;
 | |
|     bool          _registra;
 | |
| 
 | |
|     static bool   prosp_notify(TSheet_field& s, int r, KEY k);
 | |
|     static bool   mainmsk_handler(TMask& m, KEY k);        
 | |
|     static bool   aliquota_handler(TMask_field& f, KEY k);
 | |
| 
 | |
|   protected:
 | |
|     virtual bool  user_create();
 | |
|     virtual bool  user_destroy();
 | |
|     virtual int   rewrite(const TMask& m);
 | |
|     virtual int   read(TMask& m);
 | |
|     virtual int   write  (const TMask& m);  
 | |
|     virtual bool  remove();
 | |
|     virtual TRelation*  get_relation() const { return _rel; }
 | |
|     virtual TMask*  get_mask(int mode)       { return _msk; }
 | |
|     virtual bool  changing_mask(int mode)  { return FALSE; }
 | |
|     virtual void  init_query_mode (TMask&); 
 | |
|     virtual void  init_insert_mode (TMask&);    
 | |
|     void      fill_arr(TMask& m);    
 | |
|     void      arr2rel(const TMask& m);                  
 | |
|   public:                      
 | |
|     const char*   taitol() { return (const char*)_title; }
 | |
|     TMask&      main_mask() const { return (TMask&) *_msk; }
 | |
|         
 | |
|     TQuadroG1();
 | |
|     virtual ~TQuadroG1() {};
 | |
| };                    
 | |
| 
 | |
| inline TQuadroG1& app() { return (TQuadroG1&) main_app(); }
 | |
| 
 | |
| TQuadroG1::TQuadroG1()
 | |
| {
 | |
|   _registra   = FALSE;
 | |
|   _quadro = "G1";  
 | |
|   _title  = "Quadro G1";
 | |
| }
 | |
| 
 | |
| bool TQuadroG1::aliquota_handler(TMask_field& f, KEY k)
 | |
| { 
 | |
|   bool ok = TRUE;  
 | |
|   if (k == K_TAB && f.focusdirty())
 | |
|   {                       
 | |
|     TMask& m = f.mask();
 | |
|     for (short id = 101; id <= 102; id++)
 | |
|     {
 | |
|       TEdit_field& utili = m.efield(id);
 | |
|       utili.set_dirty();
 | |
|       utili.on_hit();
 | |
|     }  
 | |
|   }
 | |
|   if (k == K_ENTER)
 | |
|   {
 | |
|     TMask& m = f.mask();
 | |
|     
 | |
|     TSheet_field& s = *m.get_sheet();
 | |
|     const int selected = s.selected();
 | |
|     TToken_string& row = s.row(selected);
 | |
|     
 | |
|     if (selected > 2 && !row.empty_items())
 | |
|     {
 | |
|       const real aliquota = f.get();
 | |
|       for (int i = 0; i < s.items(); i++) if (i != selected)
 | |
|       { 
 | |
|         const real aliq = s.row(i).get(2);
 | |
|         if (aliquota == aliq)
 | |
|         {
 | |
|           ok = f.yesno_box("L'aliquota %s%% e' gia' stata utilizzata al rigo %d.\n"
 | |
|                            "Si desidera sommare gli importi nello stesso rigo?", 
 | |
|                            (const char*)aliq.string(".2"), i+1);
 | |
|           if (ok)
 | |
|           { 
 | |
|             // Forza aggiornamento riga corrente dello sheet con la maschera
 | |
|             row.cut(0);                        
 | |
|             for (short id = 101; id <= 107; id++)
 | |
|               row.add(m.get(id));
 | |
|             
 | |
|             // Sceglie come destinazione la riga piu' in alto
 | |
|             int src = selected, dst = i;
 | |
|             if (src < dst)
 | |
|             { int tmp = src; src = dst; dst = tmp; }
 | |
|             
 | |
|             // Righe conivolte nella somma  
 | |
|             TToken_string& srcrow = s.row(src);
 | |
|             TToken_string& dstrow = s.row(dst);
 | |
|               
 | |
|             for (int x = 0; x < 7; x++) if (x < 2 || x > 4)
 | |
|             {
 | |
|               real tot = dstrow.get(x);
 | |
|               if (x < 2 || dst != 2)
 | |
|               {
 | |
|                 tot += real(srcrow.get(x)); 
 | |
|                 dstrow.add(tot.string(), x);
 | |
|               }
 | |
|               if (dst == selected)
 | |
|                 m.set(101+x, tot);
 | |
|               else
 | |
|                 m.reset(101+x);
 | |
|             }
 | |
|             if (src == selected)
 | |
|             {
 | |
|               m.reset(103);
 | |
|               s.force_update(dst);
 | |
|             }  
 | |
|             else
 | |
|             {
 | |
|               srcrow.cut(0); 
 | |
|               s.force_update(src);
 | |
|             }  
 | |
|           }
 | |
|           break;
 | |
|         }
 | |
|       }
 | |
|     }  
 | |
|   }
 | |
|   return ok;
 | |
| }
 | |
| 
 | |
| 
 | |
| void TQuadroG1::init_insert_mode (TMask& m)
 | |
| {
 | |
|   fill_arr(m);
 | |
| }
 | |
| 
 | |
| int TQuadroG1::read(TMask& m)
 | |
| {
 | |
|   int err = TRelation_application::read(m);
 | |
|   if (err == NOERR)
 | |
|     fill_arr(m);
 | |
|   return err;
 | |
| }
 | |
| 
 | |
| void TQuadroG1::init_query_mode (TMask& m)
 | |
| {
 | |
|   if (_codditta != 0)        
 | |
|   {
 | |
|     m.field(F_CODDITTA).set(_codditta);
 | |
|     m.field(F_CODDITTA).check();
 | |
|   }
 | |
|   m.send_key(K_AUTO_ENTER,0);
 | |
| }
 | |
| 
 | |
| bool TQuadroG1::user_create() 
 | |
| {
 | |
|   _msk = new TMask("77g1a");
 | |
|   _rel = new TRelation(LF_QUAG1);
 | |
|   
 | |
|   _codditta = get_firm_770();
 | |
| 
 | |
|   _msk->disable(DLG_CANCEL);   // disabilito Annulla nella toolbar
 | |
|   _msk->disable(DLG_NEWREC);   // disabilito Nuovo   nella toolbar
 | |
|   _msk->disable(DLG_DELREC);   // disabilito Elimina nella toolbar
 | |
|   _msk->disable(DLG_FINDREC);  // disabilito Ricerca nella toolbar
 | |
| 
 | |
|   _msk->set_handler(mainmsk_handler);
 | |
|   TSheet_field& prosp = (TSheet_field&)_msk->field(F_PI);  
 | |
|   prosp.set_notify(prosp_notify);                          
 | |
|   
 | |
|   TMask& sm = prosp.sheet_mask();
 | |
|   sm.set_handler(103, aliquota_handler);
 | |
|   
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| bool TQuadroG1::user_destroy() 
 | |
| {
 | |
|   delete _rel; 
 | |
|   delete _msk;
 | |
|   if (_registra)
 | |
|   { 
 | |
|     TRiporti rip;
 | |
|     rip.set(_quadro);  
 | |
|   }
 | |
|   return TRUE;
 | |
| }                           
 | |
| 
 | |
| void TQuadroG1::arr2rel(const TMask& m)
 | |
| {
 | |
|   TRecord_array arr(LF_QUAG1, "NPROG");
 | |
|   arr.renum_key("CODDITTA", _codditta);
 | |
|   
 | |
|   int last_saved = 0;
 | |
|   TSheet_field& ss = (TSheet_field&)m.field(F_PI);
 | |
|   
 | |
|   for (int i = 0; i < ss.items(); i++)
 | |
|   {                      
 | |
|     TToken_string& row  = ss.row(i);
 | |
|     real tot;
 | |
|     const real utili1s  = row.get(0); tot +=  utili1s;
 | |
|     const real utili2s  = row.get();  tot +=  utili2s;
 | |
|     const real aliquota = row.get();
 | |
|     const real racc1s   = row.get();  tot +=  racc1s;
 | |
|     const real racc2s   = row.get();  tot +=  racc2s;
 | |
|     const real rimp1s   = row.get();  tot +=  rimp1s;
 | |
|     const real rimp2s   = row.get();  tot +=  rimp2s;
 | |
|     if (i == 0 || tot > 0.0)
 | |
|     { 
 | |
|       if (i < 3)
 | |
|         last_saved = i;
 | |
|       else               
 | |
|       {
 | |
|         if (last_saved < 3)
 | |
|           last_saved = 3;
 | |
|       }    
 | |
|       last_saved++;
 | |
|       
 | |
|       TRectype& rec = arr.row(last_saved, TRUE);
 | |
|       rec.put(QG1_UTILI1S,   utili1s);
 | |
|       rec.put(QG1_UTILI2S,   utili2s);
 | |
|       rec.put(QG1_ALIQUOTA,  aliquota);
 | |
|       rec.put(QG1_RACCVER1S, racc1s);
 | |
|       rec.put(QG1_RACCVER2S, racc2s);
 | |
|       rec.put(QG1_RIMPVER1S, rimp1s);
 | |
|       rec.put(QG1_RIMPVER2S, rimp2s);
 | |
|     }
 | |
|   }
 | |
|   arr.rewrite();
 | |
| }
 | |
| 
 | |
| void TQuadroG1::fill_arr(TMask& m)
 | |
| {                                      
 | |
|   TRecord_array arr(LF_QUAG1, "NPROG");
 | |
|   arr.renum_key("CODDITTA", _codditta);
 | |
|   arr.read(arr.key());
 | |
|   
 | |
|   int last = arr.last_row();
 | |
|   if (last < 16)
 | |
|     last = 16;
 | |
|   
 | |
|   TSheet_field& ss = (TSheet_field&)m.field(F_PI);
 | |
|   ss.destroy();
 | |
|   for (int i = 0; i < last; i++)
 | |
|   {  
 | |
|     TToken_string& row = ss.row(i);
 | |
|     if (arr.exist(i+1))
 | |
|     {  
 | |
|        const TRectype& r = arr.row(i+1);
 | |
|        row.add(r.get("UTILI1S"),   0);
 | |
|        row.add(r.get("UTILI2S"),   1);
 | |
|        if (i > 2)
 | |
|          row.add(r.get("ALIQUOTA"),  2);
 | |
|        if (i == 0)  
 | |
|        {
 | |
|          row.add(r.get("RACCVER1S"), 3);
 | |
|          row.add(r.get("RACCVER2S"), 4);
 | |
|        }
 | |
|        if (i != 2)
 | |
|        {
 | |
|          row.add(r.get("RIMPVER1S"), 5);
 | |
|          row.add(r.get("RIMPVER2S"), 6);
 | |
|        }  
 | |
|     }
 | |
|     
 | |
|     if (i < 3)
 | |
|     {
 | |
|       const char* const ali = i == 0 ? "10.00" : (i == 1 ? "12.50" : "");
 | |
|       row.add(ali, 2);
 | |
|       ss.disable_cell(i, 2);
 | |
|       if (i == 2)
 | |
|       {
 | |
|         ss.disable_cell(i, 5); 
 | |
|         ss.disable_cell(i, 6);
 | |
|       }
 | |
|     }
 | |
|     if (i > 0)
 | |
|     {
 | |
|       ss.disable_cell(i, 3); 
 | |
|       ss.disable_cell(i, 4);
 | |
|     } 
 | |
|   }
 | |
| }
 | |
| 
 | |
| int TQuadroG1::write(const TMask& m)
 | |
| {
 | |
|   int err = TRelation_application::write(m);
 | |
|   if (err == NOERR)
 | |
|     arr2rel(m);
 | |
|   _registra = err == NOERR;    
 | |
|   return err;
 | |
| }
 | |
| 
 | |
| int TQuadroG1::rewrite(const TMask& m)
 | |
| {
 | |
|   int err = TRelation_application::rewrite(m);
 | |
|   if (err == NOERR)
 | |
|     arr2rel(m);
 | |
|   _registra = err == NOERR;    
 | |
|   return err;
 | |
| }
 | |
| 
 | |
| bool TQuadroG1::remove()
 | |
| {  
 | |
|   _registra = TRelation_application::remove();
 | |
|   return _registra;
 | |
| }
 | |
| 
 | |
| bool TQuadroG1::prosp_notify(TSheet_field& s, int r, KEY k)
 | |
| {
 | |
|   bool ok = TRUE;
 | |
|   switch(k)
 | |
|   {                               
 | |
|     case K_CTRL+K_INS:
 | |
|       s.disable_cell(r, 3);
 | |
|       s.disable_cell(r, 4);
 | |
|       break;
 | |
|     case K_DEL: 
 | |
|       ok = r > 2;
 | |
|       break;
 | |
|     default:
 | |
|       break;
 | |
|   }
 | |
|   return ok;
 | |
| }
 | |
|  
 | |
| bool TQuadroG1::mainmsk_handler(TMask& m, KEY k)
 | |
| { 
 | |
|   if (k == K_ESC)
 | |
|   {
 | |
|     TOperable_field& f = m.focus_field();
 | |
|     m.set_focus_field(f.dlg()); 
 | |
|   } 
 | |
|   return TRUE;
 | |
| } 
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // Funzione chiamata dal main
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| bool quadro_g1(int argc, char* argv[])
 | |
| {
 | |
|   TQuadroG1 a;
 | |
|   a.run(argc, argv, a.taitol());
 | |
|   return TRUE;
 | |
| } |