From bb1701e7d7dddcce8c6287700327c961665aa74f Mon Sep 17 00:00:00 2001 From: guy Date: Fri, 29 Aug 1997 09:20:17 +0000 Subject: [PATCH] Gestione tabelle git-svn-id: svn://10.65.10.50/trunk@5124 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- sv/sv0100.cpp | 343 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 343 insertions(+) create mode 100755 sv/sv0100.cpp diff --git a/sv/sv0100.cpp b/sv/sv0100.cpp new file mode 100755 index 000000000..739c45696 --- /dev/null +++ b/sv/sv0100.cpp @@ -0,0 +1,343 @@ +#include +#include + +#include "../mg/mglib.h" + +#include "sv0.h" +#include "svlib01.h" + +/////////////////////////////////////////////////////////// +// Applicazione generica per la gestione di tabelle di sv +/////////////////////////////////////////////////////////// + +class TSV_tabapp : public Tab_application +{ +protected: + virtual TString& get_mask_name(TString& name) const; +}; + +TString& TSV_tabapp::get_mask_name(TString& name) const +{ + name = get_tabname(); + if (name[0] == '%') + name.ltrim(1); + name.insert("svtb", 0); + return name; +} + +/////////////////////////////////////////////////////////// +// Gestione tabella PSV +/////////////////////////////////////////////////////////// + +#include "svtbpsv.h" + +class TPSV_tabapp : public TSV_tabapp +{ + enum { MAX_ROWS = 8 }; + + TStats_agg _stats; + +protected: + virtual void on_config_change(); + virtual bool user_create(); + virtual void init_insert_mode(TMask& m); + virtual int read(TMask& m); + virtual int write(const TMask& m); + virtual int rewrite(const TMask& m); + void mask2rec(const TMask& m); // usata da re/write + +public: + static bool multiplo_handler(TMask_field& f, KEY k); + static bool chiave_handler(TMask_field& f, KEY k); + static bool chiave_notify(TSheet_field& s, int r, KEY k); + + void set_frequency(); + void fill_field_list(TMask& m); +}; + +inline TPSV_tabapp& PSV_app() { return (TPSV_tabapp&)main_app(); } + +void TPSV_tabapp::on_config_change() +{ + _stats.init(); + set_frequency(); +} + +void TPSV_tabapp::init_insert_mode(TMask& m) +{ + m.set(FPSV_MULTIPLO, m.get(FPSV_FREQUENZA)); +} + +void TPSV_tabapp::set_frequency() +{ + TMask& m = curr_mask(); + + char freq[2] = { frequency2char(_stats.frequency()), '\0' }; + m.set(FPSV_FREQUENZA, freq); + + TList_field& multiplo = (TList_field&)m.field(FPSV_MULTIPLO); + + TToken_string std_codes("G|S|Q|1|2|3|4|6|A"); + TToken_string std_descr("Giornaliera|Settimanale|Quindicinale|Mensile|" + "Bimestrale|Trimestrale|Quadrimestrale|Semestrale|Annuale"); + + TToken_string codes(8), descr(80); + switch(_stats.frequency()) + { + case fs_giornaliera :codes = std_codes; break; + case fs_settimanale :codes = "S|3|6|A"; break; + case fs_quindicinale :codes = std_codes.mid(4); break; + case fs_mensile :codes = std_codes.mid(6); break; + case fs_bimestrale :codes = "2|4|6|A"; break; + case fs_trimestrale :codes = "3|6|A"; break; + case fs_quadrimestrale:codes = "4|A"; break; + case fs_semestrale :codes = "6|A"; break; + case fs_annuale :codes = "A"; break; + default :break; + } + + for (const char* cod = codes.get(0); cod; cod = codes.get()) + { + TString16 tmp = cod; + const int pos = std_codes.get_pos(tmp); + CHECK(pos >= 0, "Invalid frequency char"); + tmp = std_descr.get(pos); + descr.add(tmp); + } + + multiplo.replace_items(codes, descr); +} + +void TPSV_tabapp::fill_field_list(TMask& m) +{ + TSheet_field& s = m.sfield(FPSV_CHIAVE); + TMask& sm = s.sheet_mask(); + + TString_array& list = sm.efield(SPSV_CAMPO).sheet()->rows_array(); + list.destroy(); + + TToken_string row(80); + + TCodart_livelli cal; + for (int l = 0; l <= cal.last_level(); l++) + { + if (l && !cal.enabled(l)) + continue; + + row = "A"; + if (l) row << l; + + row.add("Codice articolo"); + if (l) row << '[' << l << ']'; + + list.add(row); + } + + TCodgiac_livelli cgl; + for (l = 0; l <= cgl.last_level(); l++) + { + if (l && !cgl.enabled(l)) + continue; + + row = "L"; + if (l) row << l; + + row.add("Livello giacenza"); + if (l) row << '[' << l << ']'; + list.add(row); + } + + list.add("D|Tipo documento"); + list.add("V|Categoria vendita"); + list.add("C|Codice cliente"); + list.add("Z|Codice zona"); + list.add("G|Codice agente"); + list.add("M|Codice magazzino"); +} + +bool TPSV_tabapp::user_create() +{ + const bool ok = TSV_tabapp::user_create(); + + TMask& m = *get_mask(MODE_QUERY); + m.set_handler(FPSV_MULTIPLO, multiplo_handler); + m.set_handler(FPSV_CHIAVE, chiave_handler); + m.sfield(FPSV_CHIAVE).set_notify(chiave_notify); + fill_field_list(m); + + return ok; +} + +int TPSV_tabapp::read(TMask& m) +{ + const TRectype& rec = get_relation()->curr(); + + TSheet_field& sheet = m.sfield(FPSV_CHIAVE); + sheet.destroy(); + + TToken_string s1 = rec.get("S1"); + TToken_string s2 = rec.get("S2"); + + int r = 0; + for (const char* cod = s1.get(0); cod; cod = s1.get(), r++) + { + TToken_string& row = sheet.row(r); + row = cod; + cod = s2.get(r); + row.add(cod); + sheet.check_row(r); + } + + return TSV_tabapp::read(m); +} + +void TPSV_tabapp::mask2rec(const TMask& m) +{ + TString16 cod; + TToken_string s1, s2; + TSheet_field& sheet = m.sfield(FPSV_CHIAVE); + + for (int r = 0; r < sheet.items() && r < MAX_ROWS; r++) + { + TToken_string& row = sheet.row(r); + cod = row.get(0); + if (!cod.blank()) + { + s1.add(cod); + cod = row.get(); + s2.add(cod); + } + } + + TRectype& rec = get_relation()->curr(); + rec.put("S1", s1); + rec.put("S2", s2); +} + +int TPSV_tabapp::write(const TMask& m) +{ + mask2rec(m); + return TSV_tabapp::write(m); +} + +int TPSV_tabapp::rewrite(const TMask& m) +{ + mask2rec(m); + return TSV_tabapp::rewrite(m); +} + +bool TPSV_tabapp::multiplo_handler(TMask_field& f, KEY k) +{ + if (k == K_SPACE) + { + TMask& m = f.mask(); + TFrequenza_statistiche base = char2frequency(m.get(FPSV_FREQUENZA)[0]); + TFrequenza_statistiche freq = char2frequency(f.get()[0]); + if (base == freq) + { + m.enable(FPSV_NUMERO); + if (m.is_running()) + m.set(FPSV_NUMERO, 1); + } + else + { + int n = divide(freq, base); + m.set(FPSV_NUMERO, n); + m.disable(FPSV_NUMERO); + } + } + return TRUE; +} + +bool TPSV_tabapp::chiave_notify(TSheet_field& s, int r, KEY k) +{ + bool ok = TRUE; + if (k == K_INS) + ok = s.items() < MAX_ROWS; + return ok; +} + +bool TPSV_tabapp::chiave_handler(TMask_field& f, KEY k) +{ + bool ok = TRUE; + if (k == K_ENTER) + { + TSheet_field& sheet = (TSheet_field&)f; + TToken_string used; + TString16 campo; + for (int r = 0; r < sheet.items(); r++) + { + TToken_string& row = sheet.row(r); + campo = row.get(0); + + if (campo.blank()) + continue; + + switch(campo[0]) + { + case 'C': + if (!PSV_app()._stats.grp_cliente()) + ok = error_box("Le statistiche sono raggruppate per cliente"); + break; + case 'G': + if (!PSV_app()._stats.grp_agente()) + ok = error_box("Le statistiche sono raggruppate per agente"); + break; + case 'L': + if (!PSV_app()._stats.grp_giacenza()) + ok = error_box("Le statistiche sono raggruppate per livello di giacenza"); + break; + case 'M': + if (!PSV_app()._stats.grp_magazzino()) + ok = error_box("Le statistiche sono raggruppate per magazzino"); + break; + case 'Z': + if (!PSV_app()._stats.grp_zona()) + ok = error_box("Le statistiche sono raggruppate per zona"); + break; + default : break; + } + + bool found = used.get_pos(campo) >= 0; + if (!found && (campo[0] == 'A' || campo[0] == 'L')) + { + char str[2]; str[0] = campo[0]; str[1] = '\0'; + found = used.get_pos(str) >= 0; + } + + if (found) + { + ok = error_box("Il codice %s inserito alla riga %d e' gia'\n" + "utilizzato in una riga precedente.", + (const char*)campo, r+1); + } + else + used.add(campo); + } + } + return ok; +} + +/////////////////////////////////////////////////////////// +// Pseudo main +/////////////////////////////////////////////////////////// + +int sv0100(int argc, char* argv[]) +{ + TApplication::check_parameters(argc, argv); + if (argc > 2) + { + const TFixed_string tab(argv[2]); + + TSV_tabapp* app; + if (tab == "PSV") + app = new TPSV_tabapp; + else + app = new TSV_tabapp; + app->run(argc, argv, "Tabella"); + delete app; // Guy's humour + } + else + error_box("Manca il nome della tabella"); + return 0; +}