#include "ve2400.h" #include "ve2401.h" #include #include #include #include /////////////////////////////////////////////////////////// // Utility per gestione struttura codice avanzato /////////////////////////////////////////////////////////// const TString& root_code() { static TString4 _root_code; 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 { protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); void create_level(int level, const TString& subcode); void rebuild(); public: TCodart_mask(); }; bool TCodart_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) { case 101: if (e == fe_modify) // Se cambio il contenuto del primo livello ... rebuild(); // Ricostruisco la maschera break; default: break; } return true; } 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(21); const TString& picture = fsa.get("S1"); const int length = picture.len(); TEdit_field& kfld = add_string(100+level, 0, prompt, 1, level, length, "B"); 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(); } } void TCodart_mask::rebuild() { TArray& a = fields_array(); int i = 0; for (i = a.last(); i > 3; i--) a.destroy(i); TString8 code = root_code(); code << get(101); const TString& children = cache().get("GSA", code, "S1"); for (i = 0; i < 8; i++) { const TString& subcode = children.mid(i*3, 3); if (subcode.full()) create_level(i+2, subcode); else break; } force_update(); } 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); } const TString& advanced_get_codart() { TCodart_mask m; if (m.run() == K_ENTER) { TString& tmp = get_tmp_string(); for (short id = 101; m.id2pos(id) >= 0; id++) tmp << m.get(id); return tmp; } return EMPTY_STRING; } /////////////////////////////////////////////////////////// // Essenzialissima interfaccia pubblica /////////////////////////////////////////////////////////// bool advanced_codart_enabled() { return root_code().full(); } bool advanced_codart_handler(TMask_field& fld, KEY key) { if (key == K_SPACE) { TMask& msk = fld.mask(); msk.set(F_CODART, advanced_get_codart(), true); } return true; }