Files correlati : sc?.exe Ricompilazione Demo : [ ] Commento : Cpsmesi TRUE -> true git-svn-id: svn://10.65.10.50/trunk@20010 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			545 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			545 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include <defmask.h>
 | |
| 
 | |
| #include "../cg/cglib01.h"
 | |
| #include "scselect.h"                    
 | |
| 
 | |
| 
 | |
| TSelection_mask::TSelection_mask(const char* name)
 | |
|                : TMask(name), _who('C'), _key(1), _clifo_rel(NULL),
 | |
|                  _cli_cur_k1(NULL), _cli_cur_k2(NULL), _for_cur_k1(NULL), _for_cur_k2(NULL)
 | |
| {
 | |
|   // crea relazioni, cursori e cursor_sheets
 | |
|   _clifo_rel  = new TRelation(LF_CLIFO);
 | |
|   
 | |
|   TRectype filter(LF_CLIFO);
 | |
|   filter.put(CLI_TIPOCF, "C");
 | |
|   _cli_cur_k1 = new TCursor(_clifo_rel, "", 1, &filter, &filter);
 | |
|   _cli_cur_k2 = new TCursor(_clifo_rel, "", 2, &filter, &filter);
 | |
|   
 | |
|   _cli_sh_k1 = new TCursor_sheet(_cli_cur_k1, " |CODCF|RAGSOC", "Selezione clienti per codice",
 | |
|                                  "@1|Codice|Ragione Sociale@50",0,1);
 | |
|   _cli_sh_k2 = new TCursor_sheet(_cli_cur_k2, " |RAGSOC|CODCF", "Selezione clienti per ragione sociale",
 | |
|                                  "@1|Ragione Sociale@50|Codice",0,1);
 | |
|   
 | |
|   if (id2pos(SC_CLIFO) >= 0)
 | |
|   {
 | |
|     filter.put(CLI_TIPOCF, "F");
 | |
|     _for_cur_k1 = new TCursor(_clifo_rel, "", 1, &filter, &filter);
 | |
|     _for_cur_k2 = new TCursor(_clifo_rel, "", 2, &filter, &filter);
 | |
|     _for_sh_k1 = new TCursor_sheet(_for_cur_k1, " |CODCF|RAGSOC", "Selezione fornitori per codice",
 | |
|                                    "@1|Codice|Ragione Sociale@50",0,1);
 | |
|     _for_sh_k2 = new TCursor_sheet(_for_cur_k2, " |RAGSOC|CODCF", "Selezione fornitori per ragione sociale",
 | |
|                                    "@1|Ragione Sociale@50|Codice",0,1);
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     _for_cur_k1 = NULL;
 | |
|     _for_cur_k2 = NULL;
 | |
|     _for_sh_k1 = NULL;
 | |
|     _for_sh_k2 = NULL;
 | |
|   }                               
 | |
|   
 | |
|   set_handler(SC_CLIFO,   rclifo_handler); 
 | |
|   set_handler(SC_SORTCF,  rsortcf_handler);
 | |
|   set_handler(SC_SELECT,  bselect_handler); 
 | |
|   set_handler(SC_RESET,   breset_handler); 
 | |
|   set_handler(SC_CFCODFR, ffrom_handler); 
 | |
|   set_handler(SC_CFCODTO, fto_handler); 
 | |
|   set_handler(SC_CFDESFR, fdfrom_handler); 
 | |
|   set_handler(SC_CFDESTO, fdto_handler); 
 | |
| }
 | |
| 
 | |
| TSelection_mask::~TSelection_mask()
 | |
| {       
 | |
|   if (_for_sh_k1 != NULL)
 | |
|   {
 | |
|     delete _for_sh_k2;
 | |
|     delete _for_sh_k1;
 | |
|     delete _for_cur_k2;
 | |
|     delete _for_cur_k1;
 | |
|   }
 | |
| 
 | |
|   delete _cli_sh_k2;
 | |
|   delete _cli_sh_k1;
 | |
|   delete _cli_cur_k2;
 | |
|   delete _cli_cur_k1;
 | |
| 
 | |
|   delete _clifo_rel;
 | |
| }             
 | |
| 
 | |
| bool TSelection_mask::stop_run(KEY k)
 | |
| {     
 | |
|   const bool ok = TMask::stop_run(k);
 | |
|   if (ok && k != K_QUIT)
 | |
|     update_assoc();
 | |
|   return ok;  
 | |
| }
 | |
| 
 | |
| void TSelection_mask::set_handler(short fld_id, CONTROL_HANDLER handler)
 | |
| {                              
 | |
|   const int pos = id2pos(fld_id);
 | |
|   if (pos >= 0)
 | |
|     fld(pos).set_handler(handler);
 | |
| }
 | |
| 
 | |
| TCursor_sheet& TSelection_mask::cur_sheet() const
 | |
| {             
 | |
|   TCursor_sheet* cs;
 | |
|   if (get_key() == 1) cs = get_who() == 'C' ? _cli_sh_k1 : _for_sh_k1;
 | |
|   else                cs = get_who() == 'C' ? _cli_sh_k2 : _for_sh_k2;
 | |
|   
 | |
|   CHECK(cs, "Can't use a NULL TCursor_sheet");
 | |
|   return *cs;
 | |
| }                 
 | |
| 
 | |
| void TSelection_mask::reset_sheets()
 | |
| {
 | |
|   _cli_sh_k1->uncheck(-1);
 | |
|   _cli_sh_k2->uncheck(-1);
 | |
|   if (_for_sh_k1)
 | |
|   {
 | |
|     _for_sh_k1->uncheck(-1);
 | |
|     _for_sh_k2->uncheck(-1);
 | |
|   }  
 | |
|   reset(SC_CFCODFR);
 | |
|   reset(SC_CFCODTO);
 | |
|   reset(SC_CFDESFR);
 | |
|   reset(SC_CFDESTO);
 | |
|   reset(SC_NSEL);
 | |
| }
 | |
| 
 | |
| 
 | |
| // Seleziona tutti i clienti con codice compreso tra due estremi
 | |
| void TSelection_mask::select_clifo_range(long from, long to)
 | |
| {
 | |
|   TWait_cursor hourglass;
 | |
|   TCursor_sheet& c = cur_sheet();
 | |
|   const long items = c.items();
 | |
|   const int key = get_key();
 | |
|   
 | |
|   TCursor* crs = c.cursor();
 | |
|   if (to == 0 && items)
 | |
|     to = c.row(items-1).get_long(key);
 | |
|   
 | |
|   if (from > to)                    // Controlla limiti
 | |
|   {
 | |
|     long tmp = to;
 | |
|     to = from;
 | |
|     from = tmp;
 | |
|   }                           
 | |
|   long last = 0;
 | |
|   long firs = 0;
 | |
|   
 | |
|   TRectype& rec = crs->file().curr();
 | |
|   rec.zero();
 | |
|   rec.put(CLI_TIPOCF,get_who());
 | |
|   rec.put(CLI_CODCF,from);
 | |
|   
 | |
|   const TRecnotype start = crs->read(_isgteq);
 | |
|   firs = rec.get_long(CLI_CODCF);
 | |
|   rec.zero();
 | |
|   rec.put(CLI_TIPOCF,get_who());
 | |
|   rec.put(CLI_CODCF,to);
 | |
|   TRectype recx(rec);
 | |
|   TRecnotype end = crs->read(_isgteq);
 | |
|   if (rec > recx) 
 | |
|   {
 | |
|     end--;
 | |
|     (*crs)-=1;
 | |
|   }
 | |
|   last = rec.get_long(CLI_CODCF);
 | |
|   c.uncheck(-1);
 | |
|   for (long i = start; i <= end; i++)
 | |
|     c.check(i);
 | |
|   if (get(SC_CFCODFR).not_empty())
 | |
|     set(SC_CFCODFR, firs);
 | |
|   if (get(SC_CFCODTO).not_empty())
 | |
|     set(SC_CFCODTO, last);
 | |
|   
 | |
|   set(SC_NSEL, c.checked());
 | |
| }
 | |
| 
 | |
| void TSelection_mask::select_des_clifo_range(const TString& from, const TString & to)
 | |
| {
 | |
|   TWait_cursor hourglass;
 | |
|   TCursor_sheet& c = cur_sheet();
 | |
|   const long items = c.items();
 | |
|   const int key = get_key();   
 | |
|   CHECK(key == 2, "La chiave deve essere la 2");
 | |
|   TString s_from(from), s_to(to);
 | |
|   
 | |
|   if (s_to.empty() && items)
 | |
|     s_to = c.row(items-1).get(1);
 | |
|   s_from.upper();
 | |
|   s_to.upper();
 | |
|   
 | |
|   if (s_from > s_to)                    // Controlla limiti
 | |
|   {
 | |
|     s_to = from;
 | |
|     s_from = to;// ripristina i valori originali (!upper)
 | |
|     set(SC_CFDESFR, to);
 | |
|     set(SC_CFDESTO, from);
 | |
|   } else
 | |
|     {
 | |
|       if (to.not_empty()) s_to = to;
 | |
|       s_from = from; // ripristina i valori originali (!upper)
 | |
|     }                          
 | |
| 
 | |
|   TString last;
 | |
|   TString firs;
 | |
|   
 | |
|   TCursor* crs = c.cursor();
 | |
|   TRectype& rec = crs->file().curr();
 | |
|   rec.zero();
 | |
|   rec.put(CLI_TIPOCF,get_who());
 | |
|   rec.put(CLI_RAGSOC,s_from);
 | |
|   const TRecnotype start = crs->read(_isgteq);
 | |
|   firs = rec.get(CLI_RAGSOC);
 | |
|   rec.zero();
 | |
|   rec.put(CLI_TIPOCF,get_who());
 | |
|   rec.put(CLI_RAGSOC,s_to);
 | |
|   TRectype recx(rec);
 | |
|   TRecnotype end = crs->read(_isgteq);
 | |
|   if (rec > recx) 
 | |
|   {
 | |
|     end--;
 | |
|     (*crs)-=1;
 | |
|   }
 | |
|   last = rec.get(CLI_RAGSOC);
 | |
|   c.uncheck(-1);
 | |
|   for (long i = start; i <= end; i++)
 | |
|       c.check(i);
 | |
|   if (get(SC_CFDESFR).not_empty())
 | |
|     set(SC_CFDESFR, firs);
 | |
|   if (get(SC_CFDESTO).not_empty())
 | |
|     set(SC_CFDESTO, last);
 | |
|   set(SC_NSEL, c.checked());
 | |
| }
 | |
| 
 | |
| // Cerca il primo e l'ultimo cliente selezionati
 | |
| void TSelection_mask::set_clifo_limits()
 | |
| {  
 | |
|   TWait_cursor hourglass;
 | |
|   long from = 0, to = 0;
 | |
|   
 | |
|   TCursor_sheet& c = cur_sheet();
 | |
|   const long items = c.items();
 | |
|   const int key = get_key();
 | |
|   long first = -1, last = -1;
 | |
|   
 | |
|   for (long i = 0; i < items; i++) 
 | |
|     if (c.checked(i))
 | |
|     {
 | |
|       if (first == -1)
 | |
|         first = i;
 | |
|     }
 | |
|   if (first != -1)  //Optimization... If nothing was found previously skip this test.
 | |
|     for (long j = (items-1); j >= 0 ; j--)
 | |
|       if (c.checked(j))
 | |
|         if (last == -1)
 | |
|         {
 | |
|           last = j;
 | |
|           break;
 | |
|         }
 | |
|   if (first!= -1 && last != -1) // Something selected?
 | |
|   {
 | |
|     TToken_string fitem(c.row(first));
 | |
|     TToken_string litem(c.row(last));
 | |
|     from = fitem.get_long(key);
 | |
|     to   = litem.get_long(key);
 | |
|     if (from>to)
 | |
|     {
 | |
|       long t = to;
 | |
|       to=from;
 | |
|       from=t;
 | |
|     }
 | |
|   }
 | |
|   set(SC_CFCODFR, from);
 | |
|   set(SC_CFCODTO, to);
 | |
|   set(SC_NSEL,    c.checked());
 | |
| }
 | |
| 
 | |
| void TSelection_mask::set_des_clifo_limits()
 | |
| {  
 | |
|   TWait_cursor hourglass;
 | |
|   long first=-1, last=-1;
 | |
|   TString from,to;
 | |
|   TCursor_sheet& c = cur_sheet();
 | |
|   const long items = c.items();
 | |
|   const int key = get_key();
 | |
|   CHECK(key == 2, "La chiave deve essere la 2");
 | |
|   
 | |
|   for (long i = 0; i < items; i++) 
 | |
|     if (c.checked(i))
 | |
|     {
 | |
|       if (first == -1)
 | |
|         first = i;
 | |
|     }
 | |
|   if (first != -1)
 | |
|     for (long j = (items-1); j >= 0 ; j--)
 | |
|       if (c.checked(j))
 | |
|         if (last == -1)
 | |
|         {
 | |
|           last = j;
 | |
|           break;
 | |
|         }
 | |
|   if (first!= -1 && last != -1)
 | |
|   {
 | |
|     TToken_string fitem(c.row(first));
 | |
|     TToken_string litem(c.row(last));
 | |
|     from = fitem.get(1);
 | |
|     to   = litem.get(1);
 | |
|     if (from>to)
 | |
|     {
 | |
|       TString temp(to);
 | |
|       to=from;
 | |
|       from=temp;
 | |
|     }
 | |
|   }
 | |
|   set(SC_CFDESFR, from);
 | |
|   set(SC_CFDESTO, to);
 | |
|   set(SC_NSEL,    c.checked());
 | |
| }
 | |
| 
 | |
| // handlers
 | |
| 
 | |
| bool TSelection_mask::ffrom_handler(TMask_field& f, KEY k)
 | |
| {    
 | |
|   TSelection_mask& m = (TSelection_mask&)f.mask();
 | |
| 
 | |
|   if (k == K_TAB && f.focusdirty())
 | |
|   {
 | |
|     const long cod1 = atol(f.get());
 | |
|     const long cod2 = m.get_long(SC_CFCODTO); 
 | |
|     m.select_clifo_range(cod1, cod2);
 | |
|   }
 | |
|   else 
 | |
|     if (k == K_F9)
 | |
|     {
 | |
|       TSelection_mask& m = (TSelection_mask&)f.mask();
 | |
|       TCursor_sheet& c = m.cur_sheet();
 | |
|       c.cursor()->curr().put(CLI_CODCF, f.get());
 | |
|       c.cursor()->read();
 | |
|       c.disable_check();
 | |
|       c.disable(DLG_USER);
 | |
|       if (c.run() == K_ENTER)
 | |
|       {      
 | |
|         TToken_string& t = c.row(c.selected());
 | |
|         const long cod1 = t.get_long(m.get_key());
 | |
|         const long cod2 = m.get_long(SC_CFCODTO);
 | |
|         m.set(SC_CFCODFR, cod1);
 | |
|         m.select_clifo_range(cod1, cod2);
 | |
|       }
 | |
|       c.enable(DLG_USER);
 | |
|       c.enable_check();
 | |
|     }
 | |
|   
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| bool TSelection_mask::fto_handler(TMask_field& f, KEY k)
 | |
| {                                                
 | |
|   TSelection_mask& m = (TSelection_mask&)f.mask();
 | |
| 
 | |
|   if (k == K_TAB && f.focusdirty())
 | |
|   {
 | |
|     const long cod1 = m.get_long(SC_CFCODFR); 
 | |
|     const long cod2 = atol(f.get());
 | |
|     m.select_clifo_range(cod1, cod2);
 | |
|   }
 | |
|   else 
 | |
|     if (k == K_F9)
 | |
|     {
 | |
|       TSelection_mask& m = (TSelection_mask&)f.mask();
 | |
|       TCursor_sheet& c = m.cur_sheet();
 | |
|       c.cursor()->curr().put(CLI_CODCF, f.get());
 | |
|       c.cursor()->read();
 | |
|       c.disable_check();
 | |
|       c.disable(DLG_USER);
 | |
|       if (c.run() == K_ENTER)
 | |
|       {      
 | |
|         TToken_string& t = c.row(c.selected());
 | |
|         const long cod2 = t.get_long(m.get_key());
 | |
|         const long cod1 = m.get_long(SC_CFCODFR); 
 | |
|         m.set(SC_CFCODTO, cod2);
 | |
|         m.select_clifo_range(cod1, cod2);
 | |
|       }
 | |
|       c.enable(DLG_USER);
 | |
|       c.enable_check();
 | |
|     }
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| bool TSelection_mask::fdfrom_handler(TMask_field& f, KEY k)
 | |
| {    
 | |
|   TSelection_mask& m = (TSelection_mask&)f.mask();
 | |
| 
 | |
|   if (k == K_TAB && f.focusdirty())
 | |
|   {
 | |
|     const TString des1(f.get());
 | |
|     const TString des2(m.get(SC_CFDESTO));
 | |
|     m.select_des_clifo_range(des1, des2);
 | |
|   }
 | |
|   else 
 | |
|     if (k == K_F9)
 | |
|     {  
 | |
|       TSelection_mask& m = (TSelection_mask&)f.mask();
 | |
|       TCursor_sheet& c = m.cur_sheet();
 | |
|       c.cursor()->curr().put(CLI_RAGSOC, f.get());
 | |
|       c.cursor()->read();
 | |
|       c.disable_check();
 | |
|       c.disable(DLG_USER);
 | |
|       if (c.run() == K_ENTER)
 | |
|       {      
 | |
|         TToken_string& t = c.row(c.selected());
 | |
|         const TString des1(t.get(3 - m.get_key()));
 | |
|         const TString des2 = m.get(SC_CFDESTO);
 | |
|         m.set(SC_CFDESFR, des1);
 | |
|         m.select_des_clifo_range(des1, des2);
 | |
|       }
 | |
|       c.enable(DLG_USER);
 | |
|       c.enable_check();
 | |
|     }
 | |
|   
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| bool TSelection_mask::fdto_handler(TMask_field& f, KEY k)
 | |
| {                                                
 | |
|   TSelection_mask& m = (TSelection_mask&)f.mask();
 | |
| 
 | |
|   if (k == K_TAB && f.focusdirty())
 | |
|   {
 | |
|     const TString des2(f.get());
 | |
|     const TString des1(m.get(SC_CFDESFR));
 | |
|     m.select_des_clifo_range(des1, des2);
 | |
|   }
 | |
|   else 
 | |
|     if (k == K_F9)
 | |
|     {
 | |
|       TSelection_mask& m = (TSelection_mask&)f.mask();
 | |
|       TCursor_sheet& c = m.cur_sheet();
 | |
|       c.cursor()->curr().put(CLI_RAGSOC, f.get());
 | |
|       c.cursor()->read();
 | |
|       c.disable_check();
 | |
|       c.disable(DLG_USER);
 | |
|       if (c.run() == K_ENTER)
 | |
|       {      
 | |
|         TToken_string& t = c.row(c.selected());
 | |
|         const TString des1(m.get(SC_CFDESFR));
 | |
|         const TString des2(t.get(3 - m.get_key()));
 | |
|         m.set(SC_CFDESTO, des2);
 | |
|         m.select_des_clifo_range(des1, des2);
 | |
|       }
 | |
|       c.enable(DLG_USER);
 | |
|       c.enable_check();
 | |
|     }
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| bool TSelection_mask::breset_handler(TMask_field& f, KEY k)
 | |
| {
 | |
|   if (k == K_SPACE)
 | |
|   {
 | |
|     TSelection_mask& m = (TSelection_mask&)f.mask();
 | |
|     m.reset_sheets();
 | |
|   }  
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| bool TSelection_mask::bselect_handler(TMask_field& f, KEY k)
 | |
| {
 | |
|   if (k == K_SPACE)
 | |
|   {
 | |
|     TSelection_mask& m = (TSelection_mask&)f.mask();
 | |
|     TCursor_sheet& c = m.cur_sheet();
 | |
|     c.enable_check();
 | |
|     c.run();
 | |
|     if (m.get_key() == 2)
 | |
|       m.set_des_clifo_limits();
 | |
|     else
 | |
|       m.set_clifo_limits();
 | |
|   }
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| bool TSelection_mask::rclifo_handler(TMask_field& f, KEY k)
 | |
| {   
 | |
|   if (k == K_SPACE)
 | |
|   {
 | |
|     TSelection_mask& m = (TSelection_mask&)f.mask();
 | |
|     m.set_who(f.get()[0]);
 | |
|     m.reset_sheets();
 | |
|   }
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| bool TSelection_mask::rsortcf_handler(TMask_field& f, KEY k)
 | |
| {   
 | |
|   if (k == K_SPACE)
 | |
|   {
 | |
|     TSelection_mask& m = (TSelection_mask&)f.mask();
 | |
|     m.set_key(atoi(f.get()));
 | |
|     m.reset_sheets();
 | |
|   }
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| void TSelection_mask::update_assoc()
 | |
| {                       
 | |
|   _assoc.destroy();
 | |
|   _all_selected = FALSE;
 | |
|   
 | |
|   TCursor_sheet& cs = cur_sheet(); // Sheet di selezione (CLI/FO/PCON)
 | |
|   const long checked = cs.checked();
 | |
|   if (checked == 0L || checked == cs.items())
 | |
|     _all_selected =true;
 | |
|   else
 | |
|   {
 | |
|     const int first = get_key();
 | |
|     const char who = get_who();
 | |
|     TString16 key;
 | |
|     
 | |
|     for (long i = cs.items()-1; i >= 0; i--) if (cs.checked(i))
 | |
|     {        
 | |
|       TToken_string& row = cs.row(i);
 | |
|       if (who == 'C' || who == 'F')
 | |
|       {
 | |
|         key.format("000000%06ld", row.get_long(first));
 | |
|       }
 | |
|       else
 | |
|       {                                    
 | |
|         const TBill b(row, first, 0x0);
 | |
|         key.format("%03d%03d%06ld", 
 | |
|                    b.gruppo(), b.conto(), b.sottoconto());
 | |
|       }
 | |
|       _assoc.add(key, NULL);
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| bool TSelection_mask::selected(const TBill& b) const
 | |
| {
 | |
|   bool ok = _all_selected;
 | |
|   if (!ok)
 | |
|   {
 | |
|     TString16 key;
 | |
|     key.format("%03d%03d%06ld", 
 | |
|                b.gruppo(), b.conto(), b.sottoconto());
 | |
|     ok = _assoc.is_key(key);           
 | |
|   }
 | |
|   return ok;
 | |
| }
 | |
| 
 | |
| bool TSelection_mask::selected(int g, int c, long s) const
 | |
| {
 | |
|   bool ok = _all_selected;
 | |
|   if (!ok)
 | |
|   {
 | |
|     TString16 key;
 | |
|     key.format("%03d%03d%06ld", g, c, s);
 | |
|     ok = _assoc.is_key(key);           
 | |
|   }
 | |
|   return ok;
 | |
| }
 |