596 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			596 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include <applicat.h>
 | ||
| #include <automask.h>
 | ||
| #include <colors.h>
 | ||
| #include <defmask.h>
 | ||
| #include <execp.h>
 | ||
| #include <recarray.h>
 | ||
| #include <recset.h>
 | ||
| #include <relation.h>
 | ||
| #include <tabmod.h>
 | ||
| #include <tree.h>
 | ||
| #include <treectrl.h>
 | ||
| 
 | ||
| #include "../mg/anamag.h"
 | ||
| 
 | ||
| #include "ha3.h"
 | ||
| #include "ha3900a.h"
 | ||
| 
 | ||
| //////////////////////////////////////////////
 | ||
| //  Albero
 | ||
| //////////////////////////////////////////////
 | ||
| //Albero per la gestione delle macchine di un cliente
 | ||
| class TCoffee_tree : public TBidirectional_tree
 | ||
| {
 | ||
|   TString8 _curr_node;
 | ||
|   long _codcf;
 | ||
|   long _progressivo;
 | ||
|   TString80 _codart;
 | ||
|   TString16 _matricola, _cespite;
 | ||
|   TISAM_recordset _recset;
 | ||
|   
 | ||
| public:
 | ||
|   virtual bool goto_root();
 | ||
|   virtual bool goto_firstson() { return false; }
 | ||
|   virtual bool goto_rbrother(); 
 | ||
|   virtual bool goto_node(const TString &id);
 | ||
|   virtual bool could_have_son() const { return false; }
 | ||
|   virtual bool has_son() const { return false; }
 | ||
|   virtual bool has_rbrother() const;
 | ||
|   virtual TObject* curr_node() const { return (TObject*)&_curr_node; }
 | ||
|   virtual void node2id(const TObject* obj, TString& id) const { id = *(TString*)obj; }
 | ||
|   
 | ||
|   virtual bool has_root() const;
 | ||
|   virtual bool has_father() const { return false; }
 | ||
|   virtual bool has_lbrother() const;
 | ||
|   virtual bool goto_father() { return false; }
 | ||
|   virtual bool goto_lbrother();
 | ||
|   virtual bool get_description(TString& desc) const;
 | ||
|   virtual TFieldtypes get_var(const TString& name, TVariant& var) const;
 | ||
|   virtual TImage* image(bool selected) const { return get_res_icon(10232); }  //mai dimenticarsi la moka!
 | ||
| 
 | ||
| public:
 | ||
|   bool set_clifo(long codcf);
 | ||
|   bool select_attr(const TString& codart, const long progressivo);
 | ||
|   const long get_codcf() const { return _codcf; }
 | ||
|   const TString& get_codart() const { return _codart; }
 | ||
|   const long get_progressivo() const { return _progressivo; }
 | ||
|   const TString& get_matricola() const { return _matricola; }
 | ||
|   const TString& get_cespite() const { return _cespite; }
 | ||
|   TCoffee_tree() : _codcf(0), _recset("USE &ATT") { set_clifo(0L); }
 | ||
| };
 | ||
| 
 | ||
| 
 | ||
| bool TCoffee_tree::has_root() const
 | ||
| {
 | ||
|   return _recset.items() > 0L;
 | ||
| }
 | ||
| 
 | ||
| bool TCoffee_tree::goto_root()
 | ||
| {
 | ||
|   const bool ok = _recset.move_first();
 | ||
|   if (ok)
 | ||
|     _curr_node = "0";
 | ||
|   else
 | ||
|     _curr_node.cut(0);
 | ||
|   return ok;
 | ||
| }
 | ||
| 
 | ||
| bool TCoffee_tree::has_rbrother() const
 | ||
| {
 | ||
|   const long pos = atol(_curr_node);
 | ||
|   return pos < _recset.items() - 1;
 | ||
| }
 | ||
| 
 | ||
| bool TCoffee_tree::goto_rbrother()
 | ||
| {
 | ||
|   const long pos = atol(_curr_node) + 1;
 | ||
|   const bool ok = _recset.move_to(pos);
 | ||
|   if (ok)
 | ||
|     _curr_node.format("%ld", pos);
 | ||
|   return ok;
 | ||
| }
 | ||
| 
 | ||
| bool TCoffee_tree::has_lbrother() const
 | ||
| {
 | ||
|   return atol(_curr_node) > 0L;
 | ||
| }
 | ||
| 
 | ||
| bool TCoffee_tree::goto_lbrother()
 | ||
| {
 | ||
|   const long pos = atol(_curr_node) - 1;
 | ||
|   const bool ok = pos >= 0 && _recset.move_to(pos);
 | ||
|   if (ok)
 | ||
|     _curr_node.format("%ld", pos);
 | ||
|   return ok;
 | ||
| }
 | ||
| 
 | ||
| bool TCoffee_tree::goto_node(const TString &id)
 | ||
| { 
 | ||
|   const long pos = atol(id);
 | ||
|   const bool ok = _recset.move_to(pos);
 | ||
|   if (ok)
 | ||
|     _curr_node = id;
 | ||
|   return ok; 
 | ||
| }
 | ||
| 
 | ||
| bool TCoffee_tree::get_description(TString& desc) const
 | ||
| {
 | ||
|   desc = _recset.get("CODTAB").as_string();
 | ||
|   return desc.full();
 | ||
| }
 | ||
| 
 | ||
| TFieldtypes TCoffee_tree::get_var(const TString& name, TVariant& var) const
 | ||
| {
 | ||
|   //se il campo richiesto <20> la descrizione ci vuole quella dell'articolo, non dell'attrezzatura..
 | ||
|   //..che risulta vuota
 | ||
|   if (name == "S10")
 | ||
|   {
 | ||
|     TString80 codart = _recset.get("S0").as_string();
 | ||
|     codart.cut(20);
 | ||
|     var = cache().get(LF_ANAMAG, codart, ANAMAG_DESCR);
 | ||
|   }
 | ||
|   else
 | ||
|     var = _recset.get(name);
 | ||
| 
 | ||
|   return var.type();
 | ||
| }
 | ||
| 
 | ||
| bool TCoffee_tree::set_clifo(long codcf)
 | ||
| {
 | ||
|   TWait_cursor hourglass;
 | ||
|   _codcf = codcf;
 | ||
|   TString80 query;
 | ||
|   query << "USE &ATT\nSELECT I0=" << codcf; 
 | ||
|   _recset.set(query);
 | ||
|   return goto_root();
 | ||
| }
 | ||
| 
 | ||
| bool TCoffee_tree::select_attr(const TString& codart, const long progressivo)
 | ||
| {
 | ||
|   bool found = false;
 | ||
|   for (bool ok = _recset.move_first(); ok; ok = _recset.move_next())
 | ||
|   {
 | ||
|     TString80 curr_codart = _recset.get("S0[1,20]").as_string();
 | ||
|     curr_codart.trim();
 | ||
|     if (curr_codart == codart)
 | ||
|     {
 | ||
|       _codart = codart;
 | ||
|       const long curr_progressivo = _recset.get("CODTAB").as_int();
 | ||
|       if (curr_progressivo == progressivo)
 | ||
|       {
 | ||
|         _curr_node.format("%ld", _recset.current_row());
 | ||
|         found = true;
 | ||
|         _progressivo = progressivo;
 | ||
|         _matricola = _recset.get("S0[21,35]").as_string();
 | ||
|         _cespite = _recset.get("S1").as_string();
 | ||
|         break;
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
|   return found;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| //////////////////////////////////////////////
 | ||
| //  Metodi static di ordinamento dello sheet
 | ||
| //////////////////////////////////////////////
 | ||
| static int sort_by_data(TSheet_field& s, int r1, int r2)
 | ||
| {
 | ||
|   TToken_string& s1 = s.row(r1);
 | ||
|   TToken_string& s2 = s.row(r2);
 | ||
|   //prima ordina per data dalla piu' recente alla piu' antica..
 | ||
|   const int datacomp_pos = s.cid2index(S_DATA);
 | ||
|   const TDate d1 = s1.get(datacomp_pos);
 | ||
|   const TDate d2 = s2.get(datacomp_pos);
 | ||
|   int cmp = int(d2 - d1);
 | ||
|   //..poi per tipo (dal vuoto in avanti
 | ||
|   if (cmp == 0)
 | ||
|   {
 | ||
|     const int tipo_pos = s.cid2index(S_TIPO);
 | ||
|     const char c1 = s1.get_char(tipo_pos);
 | ||
|     const char c2 = s2.get_char(tipo_pos);
 | ||
|     cmp = int (c1 - c2);
 | ||
|   }
 | ||
| 
 | ||
|   return cmp;
 | ||
| }
 | ||
| 
 | ||
| //////////////////////////////////////////////
 | ||
| //  Maschera
 | ||
| //////////////////////////////////////////////
 | ||
| class TGestione_attrezzature_mask : public TAutomask
 | ||
| {
 | ||
|   bool _sheet_dirty;
 | ||
| 
 | ||
| protected:
 | ||
|   void fill_sheet_storico(const TString& codattr);
 | ||
|   bool write();
 | ||
|   void save_if_dirty();
 | ||
|   virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | ||
| 
 | ||
| public:
 | ||
|   TGestione_attrezzature_mask();
 | ||
| };
 | ||
| 
 | ||
| 
 | ||
| //metodo che riempie il primo sheet delle attrezzature in base ai filtri su cliente/attrezztura
 | ||
| void TGestione_attrezzature_mask::fill_sheet_storico(const TString& codattr)
 | ||
| {
 | ||
|   TWait_cursor hourglass;
 | ||
| 
 | ||
|   //riempie lo sheet dello storico in base all'attrezzatura scelta nell'albero
 | ||
|   TString query;
 | ||
|   query << "USE &HIS";
 | ||
|   query << "\nFROM CODTAB=#CODATTR";
 | ||
|   query << "\nTO CODTAB=#CODATTR";
 | ||
| 
 | ||
|   TISAM_recordset recset(query);
 | ||
|   recset.set_var("#CODATTR", codattr);
 | ||
| 
 | ||
|   const long recset_items = recset.items();
 | ||
| 
 | ||
|   TSheet_field& sf_righe = sfield(F_STORICO);
 | ||
|   sf_righe.destroy();
 | ||
| 
 | ||
|   //maschera di sheet
 | ||
|   TMask& msk = sf_righe.sheet_mask();
 | ||
|   //record del recordset con i valori da mettere sulla riga sheet
 | ||
|   const TRectype& rec = recset.cursor()->curr();
 | ||
| 
 | ||
|   const long present_clifo = get_long(F_CODCF);
 | ||
| 
 | ||
|   //new style (seza _pos_campo!)
 | ||
|   for (bool ok = recset.move_first(); ok; ok = recset.move_next())
 | ||
|   {
 | ||
|     TToken_string& row = sf_righe.row(-1);          //riga sheet da riempire
 | ||
| 
 | ||
|     const long line_clifo = rec.get_long("I0");
 | ||
|     //se il clifo presente sulla riga <20> diverso da quello attuale la riga assumer<65> un vago colore pervinca
 | ||
|     if (line_clifo != present_clifo)
 | ||
|       sf_righe.set_back_and_fore_color(DISABLED_BACK_COLOR, DISABLED_COLOR, sf_righe.items()-1);
 | ||
| 
 | ||
|     //per ogni campo della maschera di sheet setta..
 | ||
|     //..il valore di quei campi che hanno un field
 | ||
|     FOR_EACH_MASK_FIELD(msk, i, f)
 | ||
|     {
 | ||
|       const short id = f->dlg();
 | ||
|       if (id >= 101 && id < 200)
 | ||
|       {
 | ||
|         const TFieldref* fr = f->field();
 | ||
|         if (fr != NULL)
 | ||
|           row.add(fr->read(rec), id - 101);
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   //mostra e aggiorna lo sheet ordinato per data (in alto le date maggiori)
 | ||
|   sf_righe.sort(sort_by_data);
 | ||
|   sf_righe.show();
 | ||
|   sf_righe.force_update();
 | ||
| 
 | ||
|   //una volta caricato lo sheet deve risultare immacolato!
 | ||
|   _sheet_dirty = false;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| //metodo di salvataggio dei record dello sheet
 | ||
| bool TGestione_attrezzature_mask::write()
 | ||
| {
 | ||
|   TTreelist_field& tf = (TTreelist_field&)field(F_ATTREZZATURE);
 | ||
|   TCoffee_tree* ct = (TCoffee_tree*)tf.tree();
 | ||
|   if (ct == NULL)
 | ||
|     return false;
 | ||
| 
 | ||
| //  const TString& codart = ct->get_codart();
 | ||
|   const long progressivo = ct->get_progressivo();
 | ||
| 
 | ||
|   TSheet_field& sf_righe = sfield(F_STORICO);
 | ||
|   //maschera di riga dello sheet
 | ||
|   TMask& sm = sf_righe.sheet_mask();
 | ||
|   //tabella di modulo con lo storico interventi
 | ||
|   TModule_table his("&HIS");
 | ||
|   TRectype& rec_his = his.curr();
 | ||
| 
 | ||
|   //contatore delle righe che vengono salvate
 | ||
|   int righe_tot = 0;
 | ||
| 
 | ||
|   //giro su tutte le righe dello sheet
 | ||
|   FOR_EACH_SHEET_ROW(sf_righe, r, riga)
 | ||
|   {
 | ||
|     short id = 101;
 | ||
|     //giro su tutti i campi della riga (che <20> una sporca token_string)
 | ||
|     //per prima cosa mette la chiave del record che <20> cos<6F> fatta:
 | ||
|     // codart=codtab[1,5] - progressivo=codtab[6,12] - nriga=codtab[31,35]
 | ||
|     TString80 curr_codtab;
 | ||
|     curr_codtab.format("%08ld%05d", progressivo, sf_righe.items() - r);
 | ||
|     
 | ||
|     //azzera il record senno' nei campi vuoti ci metterebbe quelli del record precedente
 | ||
|     //deve azzerare la tabella, senno' perde il codice modulo HA ed il codice tabella HIS
 | ||
|     his.zero();
 | ||
|     rec_his.put("CODTAB", curr_codtab);
 | ||
|     //poi quelli specifici della riga
 | ||
|     FOR_EACH_TOKEN(*riga, str)
 | ||
|     {
 | ||
|       const TMask_field& mf = sm.field(id);
 | ||
|       const TFieldref* fr = mf.field();
 | ||
|       //solo i campi della maschera di riga che hanno un FIELD vengono salvati, gli altri si arrangino! 
 | ||
|       if (fr != NULL)
 | ||
|       {
 | ||
|         fr->write(str, rec_his);
 | ||
|       }
 | ||
|       id ++;
 | ||
|     }
 | ||
|     his.rewrite_write();
 | ||
|     righe_tot ++;
 | ||
|   }
 | ||
| 
 | ||
|   //compatta le righe dello storico, eliminando quelle in esubero
 | ||
|   TString query;
 | ||
|   query << "USE &HIS";
 | ||
|   query << "\nFROM CODTAB=#DAATTR";
 | ||
|   query << "\nTO CODTAB=#AATTR";
 | ||
|   TISAM_recordset recset(query);
 | ||
|   TString80 daattr, aattr;
 | ||
|   daattr.format("%08ld%05d", progressivo, righe_tot + 1);
 | ||
|   aattr.format("%08ld%05d", progressivo, 99999);
 | ||
|   recset.set_var("#DAATTR", daattr); 
 | ||
|   recset.set_var("#AATTR", aattr);
 | ||
|   //accoppa tutte le righe in esubero dalla tabella &HIS
 | ||
|   const long recset_items = recset.items();
 | ||
|   for (bool ok = recset.move_first(); ok; ok = recset.move_next())
 | ||
|     recset.cursor()->relation()->remove();
 | ||
| 
 | ||
|   //una volta che ha salvato lo sheet deve risultare immacolato!
 | ||
|   _sheet_dirty = false;
 | ||
| 
 | ||
|   return true;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| void TGestione_attrezzature_mask::save_if_dirty()
 | ||
| {
 | ||
|   if (_sheet_dirty && yesno_box(TR("Salvare le modifiche ?")))
 | ||
|     write();
 | ||
| }
 | ||
| 
 | ||
| bool TGestione_attrezzature_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | ||
| {
 | ||
|   switch (o.dlg())
 | ||
| 	{
 | ||
| 
 | ||
|     //campi
 | ||
|   case F_CODCF:
 | ||
|     if (e == fe_modify)
 | ||
|     {
 | ||
|       //albero magico: selezionando un cliente riempie l'albero con tutte le attrezzature del cliente
 | ||
|       TTreelist_field& tf = (TTreelist_field&)field(F_ATTREZZATURE);
 | ||
|       TCoffee_tree* ct = (TCoffee_tree*)tf.tree();
 | ||
|       if (ct != NULL)
 | ||
|       {
 | ||
|         ct->set_clifo(atol(o.get()));
 | ||
|         tf.win().force_update();
 | ||
|       }
 | ||
|     }
 | ||
|     break;
 | ||
|   case F_PROGRESSIVO:
 | ||
|     if (e == fe_modify)
 | ||
|     {
 | ||
|       //albero magico: selezionando un'attrezzatura, si posiziona direttamente sulla giusta posizione nell'albero..
 | ||
|       //..(il cliente viene riempito dalla maschera)
 | ||
|       TTreelist_field& tf = (TTreelist_field&)field(F_ATTREZZATURE);
 | ||
|       TCoffee_tree* ct = (TCoffee_tree*)tf.tree();
 | ||
|       if (ct != NULL)
 | ||
|       {
 | ||
|         ct->set_clifo(get_long(F_CODCF));
 | ||
|         const TString& codart = get(F_CODART);
 | ||
|         const long progressivo = get_long(F_PROGRESSIVO);
 | ||
|         if (ct->select_attr(codart, progressivo))
 | ||
|         {
 | ||
|           tf.select_current();
 | ||
|           send_key(K_SPACE, F_ATTREZZATURE, &o);
 | ||
|         }
 | ||
|       }
 | ||
|     }
 | ||
|     break;
 | ||
|   case F_ATTREZZATURE:
 | ||
|     if (e == fe_modify)
 | ||
|     {
 | ||
|       TTreelist_field& tf = (TTreelist_field&)field(F_ATTREZZATURE);
 | ||
|       TCoffee_tree* ct = (TCoffee_tree*)tf.tree();
 | ||
|       if (ct != NULL)
 | ||
|       {
 | ||
|         //riempie i campi di intestazione maschera
 | ||
|         TVariant str; 
 | ||
|         ct->get_var("S0", str);
 | ||
|         set(F_CODART, str.as_string().left(20));
 | ||
|         ct->get_var("CODTAB", str);
 | ||
|         set(F_PROGRESSIVO, str.as_string());
 | ||
|         check_field(F_CODART);
 | ||
|         //chiede di salvare le modifiche al cambio attrezzatura
 | ||
|         save_if_dirty();
 | ||
|         //seleziona sull'albero
 | ||
|         ct->select_attr(get(F_CODART), get_long(F_PROGRESSIVO));
 | ||
|         //la select_attr fa sapere all'albero matricola e cespite -> si possono mettere sulla maschera)
 | ||
|         set(F_MATRICOLA, ct->get_matricola());
 | ||
|         set(F_CESPITE, ct->get_cespite());
 | ||
|         //riempie lo sheet
 | ||
|         fill_sheet_storico(str.as_string());
 | ||
|       }
 | ||
|     }
 | ||
|     break;
 | ||
|   case F_STORICO:
 | ||
|     if (e == se_query_modify || e == se_notify_del)
 | ||
|     {
 | ||
|       _sheet_dirty = true;
 | ||
|     }
 | ||
|     if (e == se_notify_add)
 | ||
|     {
 | ||
|       //quando si aggiunge una riga si deve fare il sorting in modo che venga come prima riga in alto
 | ||
|       TSheet_field& sf = sfield(o.dlg());
 | ||
|       TToken_string& row = sf.row(jolly);   //riga corrente appena aggiunta
 | ||
|       row.add(TDate(TODAY), sf.cid2index(S_DATA));
 | ||
|       row.add(get(F_CODCF), sf.cid2index(S_CODCF));
 | ||
|       sf.sort(sort_by_data);
 | ||
|       sf.force_update();
 | ||
|       sf.post_select(0);  //evidenzia la prima riga
 | ||
|     }
 | ||
|     break;
 | ||
| 
 | ||
|     //bottoni
 | ||
|   case DLG_ADD_NEW:
 | ||
|     if (e == fe_button)
 | ||
|     {
 | ||
|       //1) per prima cosa deve controllare che siano pieni i campi chiave della tabella ttrezzature, senno' non puo'..
 | ||
|       //...aggiungere una cippa
 | ||
|       if (get(F_CODART).empty() || get(F_PROGRESSIVO) <= 0L)
 | ||
|         return warning_box(TR("E' necessario compilare articolo e progressivo per aggiungere una nuova attrezzatura!"));
 | ||
|     
 | ||
|       const TString& codtab = get(F_PROGRESSIVO);
 | ||
|       //2) controllo effettiva "nuovezza" dell'attrezzatura..
 | ||
|       //...se l'utonto tentasse di inserire come nuova un'attrezzatura gi<67> esistente va cazziato!
 | ||
|       TModule_table tab_att("&ATT");
 | ||
|       tab_att.put("CODTAB", codtab);
 | ||
|       const int err = tab_att.read();
 | ||
|       if (err == NOERR)
 | ||
|         return warning_box(TR("L'attrezzatura esiste gi<67>!"));
 | ||
| 
 | ||
|       //3) invio dati al gestore della tabella &ATT delle attrezzature tramite .ini
 | ||
|       TFilename trans_ini;
 | ||
|       trans_ini.temp(NULL, "ini");
 | ||
|       TString4 filenumber;
 | ||
|       filenumber << LF_TABMOD;
 | ||
|       //i config vanno chiusi tra {} senno' non si riescono ad usare
 | ||
|       {  
 | ||
|         TConfig ini(trans_ini, "Transaction");
 | ||
|         ini.set("Action", "INSERT");
 | ||
| 
 | ||
|         ini.set_paragraph(filenumber);
 | ||
|         ini.set("CODTAB", codtab);
 | ||
|         ini.set("I0", get(F_CODCF));
 | ||
|         ini.set("D0", TDate(TODAY));
 | ||
|         TString80 matricola;
 | ||
|         matricola.format("%-20s%-15s", (const char*)get(F_CODART), (const char*)get(F_MATRICOLA));
 | ||
|         ini.set("S0", matricola);
 | ||
|         ini.set("S1", get(F_CESPITE));
 | ||
|       }
 | ||
|       //invio del config al gestore della tabella &ATT
 | ||
|       TString80 cmd;
 | ||
|       cmd << "ha0 -0 &ATT /i" << trans_ini;
 | ||
|       TExternal_app app(cmd);
 | ||
| 
 | ||
|       //4) lettura dell'ini di ritorno compilato ed aggiornamento conseguente di tabella e maschera
 | ||
|       if (app.run() == NOERR)
 | ||
|       {
 | ||
|         //4a) setta sulla maschera i valori di ritorno del .ini (riempiti dal gestore di &ATT)
 | ||
|         TConfig ini(trans_ini, "Transaction");
 | ||
|         if (ini.get("Result") == "OK")
 | ||
|         {
 | ||
|           ini.set_paragraph(filenumber);
 | ||
|           TString80 codtab = ini.get("CODTAB");
 | ||
|           codtab.strip("\"");   //elimina eventuali " che vengono dall'ini
 | ||
|           const long codcf = ini.get_long("I0");
 | ||
|           const TDate data_storico = ini.get("D0");
 | ||
|           const TString& cespite = ini.get("S1");
 | ||
|           const TString& full_matricola = ini.get("S0");
 | ||
|           const TString16 matricola = full_matricola.mid(20); 
 | ||
| 
 | ||
|           //4b) da file ini crea un record nuovo sulla tabella &HIS; se non lo facesse l'albero con le attrezzature non..
 | ||
|           //....potrebbe mai vedere la nuova attrezzatura aggiunta; sara' poi l'albero stesso ad occuparsi dello sheet
 | ||
|           TModule_table tab_his("&HIS");
 | ||
|           TString80 his_codtab = codtab;
 | ||
|           his_codtab << "00001";            //l'attrezzatura <20> nuova! deve essere il primo record
 | ||
|           tab_his.put("CODTAB", his_codtab);
 | ||
|           tab_his.put("I0", codcf);
 | ||
|           tab_his.put("D0", data_storico);
 | ||
|           tab_his.put("S2", matricola); 
 | ||
|           tab_his.put("S1", cespite);
 | ||
| 
 | ||
|           int can_write = tab_his.write();
 | ||
|           if (can_write != NOERR)
 | ||
|             return warning_box(TR("Impossibile aggiungere l'attrezzatura! Risulta gi<67> presente."));
 | ||
|           
 | ||
|           set(F_CODCF, codcf, true);
 | ||
|           set(F_CODART, full_matricola.left(20), true);
 | ||
|           set(F_PROGRESSIVO, codtab, true);
 | ||
|           set(F_MATRICOLA, matricola);
 | ||
|           set(F_CESPITE, cespite);
 | ||
|         }
 | ||
|       }
 | ||
|     }
 | ||
|     break;
 | ||
|   case DLG_SAVEREC:
 | ||
|     if (e == fe_button && check_fields())
 | ||
|       write();
 | ||
|     break;
 | ||
|   case DLG_CANCEL:
 | ||
|     if (e == fe_button && jolly == 0) //il jolly=0 significa che si riferisce alla maschera principale!..
 | ||
|     {                                 //..se non ci fosse azzererebbe tutto anche quando si fa annulla sulla maschera di riga!
 | ||
|       //nel caso l'utonto clicchi su ANNULLA dopo aver fatto modifiche sara' meglio chiedere conferma se le vuole mantenere
 | ||
|       save_if_dirty();
 | ||
|         
 | ||
|       //azzera i campi della maschera
 | ||
|       reset();
 | ||
|       _sheet_dirty = false;
 | ||
| 
 | ||
|       TTreelist_field& tf = (TTreelist_field&)field(F_ATTREZZATURE);
 | ||
|       TCoffee_tree* ct = (TCoffee_tree*)tf.tree();
 | ||
|       if (ct != NULL)
 | ||
|       {
 | ||
|         ct->set_clifo(0L);
 | ||
|         tf.win().force_update();
 | ||
|       }
 | ||
|       return false;
 | ||
|     }
 | ||
|     break;
 | ||
|   case DLG_QUIT:
 | ||
|     if (e == fe_button)
 | ||
|     {
 | ||
|       //nel caso l'utonto clicchi su FINE dopo aver fatto modifiche sara' meglio chiedere conferma se le vuole mantenere
 | ||
|       save_if_dirty();
 | ||
|     }
 | ||
|     break;
 | ||
|   default:
 | ||
|     break;
 | ||
|   }
 | ||
|   return true;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| TGestione_attrezzature_mask::TGestione_attrezzature_mask() : TAutomask("ha3900a")
 | ||
| {
 | ||
|   //assegna l'albero del caffe' al campo di tipo albero sulla maschera
 | ||
|   TTreelist_field& tf = (TTreelist_field&)field(F_ATTREZZATURE);
 | ||
|   TCoffee_tree* ct = new TCoffee_tree;
 | ||
|   tf.set_tree(ct);
 | ||
| 
 | ||
|   //se non facesse questa precisazione non potrebbe inserire le righe in alto
 | ||
|   TSheet_field& sf_storico = sfield(F_STORICO);
 | ||
|   sf_storico.set_append(false);
 | ||
| 
 | ||
|   //inizializza lo "sporcatore" dello sheet 
 | ||
|   _sheet_dirty = false;
 | ||
| }
 | ||
| 
 | ||
| //////////////////////////////////////////////
 | ||
| //  Applicazione
 | ||
| //////////////////////////////////////////////
 | ||
| class TGestione_attrezzature : public TSkeleton_application
 | ||
| {
 | ||
|   virtual void main_loop();
 | ||
| };
 | ||
| 
 | ||
| 
 | ||
| void TGestione_attrezzature::main_loop()
 | ||
| {
 | ||
|   TGestione_attrezzature_mask mask;
 | ||
|   while (mask.run() == K_ENTER)
 | ||
|   {
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| int ha3900(int argc, char* argv[])
 | ||
| {
 | ||
|   TGestione_attrezzature app;
 | ||
|   app.run(argc, argv, TR("Gestione storico attrezzature"));
 | ||
|   return 0;
 | ||
| } |