Files correlati : ve0, ve6 Ricompilazione Demo : [ ] Commento : Adeguato utilizzo nuovi alberi in evasione ordini. Migliorate alcune indentazioni fuori standard git-svn-id: svn://10.65.10.50/trunk@16000 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			230 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			230 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include "ve2400.h"
 | |
| #include "ve2401.h"
 | |
| #include "../db/dblib.h"
 | |
| 
 | |
| #include <automask.h>
 | |
| #include <diction.h>
 | |
| #include <recset.h>
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // Utility per gestione struttura codice avanzato
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| const TString& root_code()
 | |
| {
 | |
|   static TString8 _root_code; // Solitamente lungo 3, ma stiamo larghi
 | |
|   if (_root_code.empty())
 | |
|   {
 | |
|     const TString query = "USE FSA SELECT B0=\"X\"";
 | |
|     TISAM_recordset set(query);
 | |
|     if (set.move_first())
 | |
|       _root_code = set.get("CODTAB").as_string();
 | |
|     else
 | |
|       _root_code = "   "; // Evito riletture inutili
 | |
|   }
 | |
|   return _root_code;
 | |
| }
 | |
| 
 | |
| static const TRectype& get_sublevel_info(const TString& code)
 | |
| {
 | |
|   return cache().get("FSA", code.full() ? code : root_code());
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // Maschera dianamica per inserimento codici
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| class TCodart_mask : public TAutomask
 | |
| {
 | |
|   static TCodice_articolo _restart;
 | |
| 
 | |
| protected:
 | |
|   virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | |
|   void start_run();
 | |
|   void create_level(int level, const TString& subcode);
 | |
|   bool build_children();
 | |
| 
 | |
| public:
 | |
|   bool restart() const { return _restart.full(); }
 | |
|   static void restart_with(const TString& cod) { _restart = cod; }
 | |
|   
 | |
|   TCodart_mask();
 | |
| };
 | |
| 
 | |
| TCodice_articolo TCodart_mask::_restart;
 | |
| 
 | |
| bool TCodart_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | |
| {
 | |
|   switch (o.dlg())
 | |
|   {
 | |
|   case 101:
 | |
|     if (e == fe_modify && !o.empty())   // Se cambio il contenuto del primo livello ...
 | |
|     {
 | |
|       _restart = o.get();
 | |
|       stop_run(K_FORCE_CLOSE);
 | |
|     }
 | |
|     break;
 | |
|   default: 
 | |
|     break;
 | |
|   }
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| void TCodart_mask::start_run()
 | |
| {
 | |
|   first_focus(101);
 | |
|   if (_restart.full())
 | |
|   {
 | |
|     const TString r(_restart);
 | |
|     bool spegni101 = false;
 | |
|     int from = 0;
 | |
|     for (short id = 101; id2pos(id) >= 0; id++)
 | |
|     {
 | |
|       const int len = efield(id).size();
 | |
|       const TString16 part = r.mid(from, len);
 | |
|       if (part.not_empty())
 | |
|       {
 | |
|         set(id, part);
 | |
|         from += len;
 | |
|         if (id == 101)
 | |
|         {
 | |
|           if (build_children())
 | |
|             first_focus(102);
 | |
|         }
 | |
|         else
 | |
|           spegni101 = true;
 | |
|       }
 | |
|       else
 | |
|         break;
 | |
|     }
 | |
|     _restart.cut(0);
 | |
|     enable(101, !spegni101);
 | |
|   }
 | |
|   TAutomask::start_run();
 | |
| }
 | |
| 
 | |
| void TCodart_mask::create_level(int level, const TString& subcode)
 | |
| {
 | |
|   const TRectype& fsa = get_sublevel_info(subcode);
 | |
|   if (!fsa.empty())
 | |
|   {
 | |
|     const TString4 code = fsa.get("CODTAB"); // Puo' essere diverso da subcode!
 | |
|     TString80 prompt = fsa.get("S0"); prompt.left_just(30);
 | |
|     const TString& picture = fsa.get("S1");
 | |
|     const int length = picture.len();
 | |
| 
 | |
|     TEdit_field& kfld = add_string(100+level, 0, prompt, 1, level, length, "BU");
 | |
|     TEdit_field& dfld = add_string(200+level, 0, "", 40, level, 36, "D");
 | |
| 
 | |
|     TFilename tmp; tmp.temp();
 | |
|     ofstream out(tmp);
 | |
| 
 | |
|     out << "USE GSA" << endl; //usa la tabella dei sottolivelli articolo
 | |
| 
 | |
|     out << "IN CODTAB[1,3] \"" << code << "\" SELECT" << endl;
 | |
|     out << "IN CODTAB[4,0] " << kfld.dlg() << endl;
 | |
|     out << "DI \"" << prompt;
 | |
|     if (length > prompt.len())
 | |
|       out << '@' << length;
 | |
|     out << "\" CODTAB[4,0]" << endl;
 | |
|     out << "DI \"" << HR("Descrizione") << "@50\" S0" << endl; 
 | |
|     out << "OU " << kfld.dlg() << " CODTAB[4,0]" << endl;
 | |
|     out << "OU " << dfld.dlg() << " S0" << endl;
 | |
| 
 | |
|     out << "CH RE" << endl;
 | |
|     out << "EN" << endl;
 | |
|     out.close();
 | |
| 
 | |
|     TScanner scan(tmp);
 | |
|     while (scan.pop() != "EN")
 | |
|       kfld.parse_item(scan);
 | |
| 
 | |
|     xvt_fsys_removefile(tmp);
 | |
|     set_handlers();
 | |
|   }
 | |
| }
 | |
| 
 | |
| bool TCodart_mask::build_children()
 | |
| {
 | |
|   TString8 code = root_code();
 | |
|   code << get(101);
 | |
| 
 | |
|   // Non usare qui un TString& children, altrimenti  cambia sul piu' bello!
 | |
|   const TString80 children = cache().get("GSA", code, "S1");
 | |
|   
 | |
|   // Affetto la stringona S1 in sottocodici da 3 caratteri l'uno
 | |
|   for (int i = 0; i < 9; i++)
 | |
|   {
 | |
|     const TString4 subcode = children.mid(i*3, 3);
 | |
|     if (subcode.full())
 | |
|       create_level(i+2, subcode);
 | |
|     else
 | |
|       break;
 | |
|   }
 | |
|   force_update();
 | |
|   return id2pos(102) > 0;
 | |
| }
 | |
| 
 | |
| TCodart_mask::TCodart_mask() : TAutomask(TR("Articolo guidato"), 1, 78, 13)
 | |
| {
 | |
|   add_button(DLG_OK, 0, "", -12, -1, 10, 2);
 | |
|   add_button(DLG_CANCEL, 0, "", -22, -1, 10, 2);
 | |
|   create_level(1, EMPTY_STRING);
 | |
| }
 | |
| 
 | |
| bool advanced_codart_ask(TString& code, TString& desc)
 | |
| {
 | |
|   bool ok = false;
 | |
|   bool running = true;
 | |
| 
 | |
|   if (code.full())
 | |
|     TCodart_mask::restart_with(code);
 | |
|   code.cut(0);
 | |
|   desc.cut(0);
 | |
| 
 | |
|   while (running)
 | |
|   {
 | |
|     TCodart_mask m;
 | |
|     ok = m.run() == K_ENTER;
 | |
|     if (ok)
 | |
|     {
 | |
|       for (short id = 101; m.id2pos(id) >= 0; id++)
 | |
|       {
 | |
|         code << m.get(id);
 | |
|         if (id == 102)
 | |
|           desc << ' ';
 | |
|         desc << m.get(id+100);
 | |
|       }
 | |
|       running = false;
 | |
|     }
 | |
|     else
 | |
|       running = m.restart();
 | |
|   }
 | |
|   return ok;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // Essenzialissima interfaccia pubblica
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| bool advanced_codart_enabled()
 | |
| {
 | |
|   return root_code().full();
 | |
| }
 | |
| 
 | |
| bool advanced_codart_handler(TMask_field& fld, KEY key)
 | |
| {
 | |
|   if (key == K_SPACE)
 | |
|   {
 | |
|     TString code, desc;
 | |
|     if (advanced_codart_ask(code, desc))
 | |
|     {
 | |
|       TMask& msk = fld.mask();
 | |
|       msk.set(F_DESCR, desc);
 | |
|       msk.set(F_CODART, code, true);
 | |
|       msk.field(F_CODART).set_focus();
 | |
|     }
 | |
|   }
 | |
|   return true;
 | |
| }
 |