diff --git a/ab/f78.dir b/ab/f78.dir index 463565cb3..aa69c3738 100755 --- a/ab/f78.dir +++ b/ab/f78.dir @@ -1,3 +1,3 @@ 78 1 -%abpcon|0|0|107|20|Piano dei conti analisi di bilancio||| +$abpcon|0|0|110|0|Piano dei conti analisi di bilancio||| diff --git a/ba/ba0.cpp b/ba/ba0.cpp index a508ab592..aa2b6ceaa 100755 --- a/ba/ba0.cpp +++ b/ba/ba0.cpp @@ -449,10 +449,10 @@ class TMenuitem : public TObject TString _caption, _action; char _type; COLOR _color; - bool _enabled : 1; - bool _firm : 1; - bool _password : 1; - bool _reloadmenu : 1; + int _exist : 2; + bool _firm : 2; + bool _password : 2; + bool _reloadmenu : 2; protected: bool perform_submenu() const; @@ -488,8 +488,8 @@ class TSubmenu : public TObject TString _caption; TFilename _picture; TArray _items; - bool _enabled : 1; - bool _firm : 1; + bool _enabled : 2; + bool _firm : 2; public: void read(TScanner& scanner); @@ -567,7 +567,7 @@ public: TMenuitem::TMenuitem(TSubmenu* sm) : _submenu(sm), - _enabled(TRUE), _firm(FALSE), _password(FALSE), _reloadmenu(FALSE), + _exist(-1), _firm(FALSE), _password(FALSE), _reloadmenu(FALSE), _color(NORMAL_COLOR) { } @@ -587,7 +587,7 @@ void TMenuitem::create(const char* t) { switch(toupper(flags[i])) { - case 'D': _enabled = FALSE; break; + case 'D': _exist = FALSE; break; case 'F': _firm = TRUE; break; case 'P': _password = TRUE; break; case 'R': _reloadmenu = TRUE; break; @@ -604,11 +604,11 @@ void TMenuitem::create(const char* t) } if (_action.empty()) + { + _exist = FALSE; _enabled = FALSE; + } -// if (_enabled && is_program()) -// _enabled = menu().has_module(_action); - // Controlla lo stato di aggiornamento if (_enabled && is_program()) _enabled = !menu().is_dangerous(_action); @@ -616,29 +616,41 @@ void TMenuitem::create(const char* t) bool TMenuitem::enabled() const { - bool yes = _enabled; - if (yes) - { + bool yes = FALSE; + if (_exist) + { if (is_submenu()) { TSubmenu* mnu = menu().find(_action); yes = mnu && mnu->enabled(); } else - { - const int endname = _action.find(' '); - TFilename name(endname > 0 ? _action.left(endname) : _action); - const char* ext[] = { "exe", "pif", "com", "bat", NULL }; - yes = FALSE; - for (int e = 0; ext[e]; e++) + { + if (_exist < 0) { - name.ext(ext[e]); - if (name.exist()) + if (menu().is_dangerous(_action)) { - yes = TRUE; - break; + yes = FALSE; + } + else + { + const int endname = _action.find(' '); + TFilename name(endname > 0 ? _action.left(endname) : _action); + const char* ext[] = { "exe", "pif", "com", "bat", NULL }; + for (int e = 0; ext[e]; e++) + { + name.ext(ext[e]); + if (fexist(name)) + break; + } + yes = ext[e] != NULL; } - + ((TMenuitem*)this)->_exist = yes; + } + if (_exist) + { + TExternal_app app(_action); + yes = app.can_run(); } if (!yes) ((TMenuitem*)this)->_enabled = FALSE; @@ -1394,7 +1406,6 @@ bool TMenu_application::check_user() return ok; } - HIDDEN int compare_version(const char* v1, int p1, const char* v2, int p2) { TString16 ver1(v1), ver2(v2); diff --git a/ba/ba0100a.h b/ba/ba0100a.h index 28bedf479..bd05cc76b 100755 --- a/ba/ba0100a.h +++ b/ba/ba0100a.h @@ -1,12 +1,21 @@ #define F_USER 101 #define F_PASSWORD 102 #define F_USERDESC 103 -#define F_MODULI 104 +#define F_GROUP 104 +#define F_GROUPNAME 105 +#define F_TEST 106 +#define F_APPLICAT 107 +#define F_NOWRITE 108 + +#define F_MODULI 150 +#define F_PERMESSI 151 +#define F_PROPERTIES 152 + #define F_BASE 200 -#define F_74 201 -#define F_75 202 -#define F_76 203 -#define F_77 204 +#define F_74 201 +#define F_75 202 +#define F_76 203 +#define F_77 204 #define F_GI 205 #define F_SE 206 #define F_CG 207 diff --git a/ba/ba0100a.uml b/ba/ba0100a.uml index cf6044a5e..8efc7f082 100755 --- a/ba/ba0100a.uml +++ b/ba/ba0100a.uml @@ -5,20 +5,20 @@ PAGE "Selezione utente" -1 -1 30 7 STRING F_USER 8 BEGIN PROMPT 4 1 "Utente " - HELP "Nome dell'utente" FLAGS "U" - USE LF_USER - INPUT USERNAME F_USER + USE LF_USER SELECT ISGROUP="" + INPUT USERNAME F_USER DISPLAY "Utente@8" USERNAME + DISPLAY "Gruppo@8" GROUPNAME DISPLAY "Descrizione@50" USERDESC OUTPUT F_USER USERNAME + CHECKTYPE SEARCH END STRING F_PASSWORD 8 10 BEGIN PROMPT 4 3 "Password " FLAGS "*" - HELP "Password dell'utente selezionato" END BUTTON DLG_OK 10 2 diff --git a/ba/ba1100.cpp b/ba/ba1100.cpp index a2a6c299a..03b85e0d2 100755 --- a/ba/ba1100.cpp +++ b/ba/ba1100.cpp @@ -352,7 +352,7 @@ bool TManutenzione_app::create() // initvar e arrmask _browse->add_button(DLG_ADDFILE, "~Aggiungi", K_F8); TButton_field& butt = ((TMask*)_browse)->add_button(DLG_OTHERFILE, 0, "A~ltri", 0, -1, 9, 2, "", 0, 0); - butt.set_hot_key(K_F5); + butt.set_exit_key(K_F5); _mask->enable(-1); // Abilita campi privilegiati } @@ -635,11 +635,8 @@ void TManutenzione_app::edit_riga (long riga_sel, TToken_string& riga) f.build(eox); _browse->dir()->get(logicnum, _nolock, _nordir, _sysdirop); } - switch (tasto) + if (tasto == K_F5 && logicnum > 1) { - case K_F5: - if (logicnum > 1) - { TSystemisamfile f(logicnum); f.pack(); //Pack supplementare tramite FOXPRO (da togliere con CodeBase 6) @@ -1079,8 +1076,9 @@ void TManutenzione_app::convert_dir() // I files LF_PCON, LF_CAUS, LF_RCAUS, LF_CLIFO, LF_CFVEN, LF_INDSPED // vanno creati comunque nel direttorio COM, vuoti, (se non esistono gia'). - if (is_com && !to_create && movable_file(i)) - to_create = TRUE; + if (is_com && !to_create) + if (movable_file(i)) + to_create = TRUE; if (to_create && has_module(module, CHK_DONGLE)) { @@ -1241,7 +1239,7 @@ void TManutenzione_app::load_des(const int maxfdir) if (prefix().is_com()) s << "comuni"; else s << " della ditta " << atol (pref); - TProgind p(items ? items : 1, s, TRUE, TRUE, 70); + TProgind p(items ? items : 1, s, FALSE, TRUE, 70); p.setstatus(1); for (int i = 2; i <= items; i++) @@ -1359,7 +1357,7 @@ void TManutenzione_app::update() TString80 s("Conversione archivi ditte."); - TProgind p(ditte.items() ? ditte.items() : 1, s, TRUE, TRUE, 70); + TProgind p(ditte.items() ? ditte.items() : 1, s, FALSE, TRUE, 70); p.setstatus(1); TString mxs; diff --git a/ba/ba1102.cpp b/ba/ba1102.cpp index 129d3d6bf..4aacd1f5a 100755 --- a/ba/ba1102.cpp +++ b/ba/ba1102.cpp @@ -1,7 +1,7 @@ #include -#include #include #include +#include #include #include "ba1100.h" @@ -14,7 +14,6 @@ bool TEdit_file::_browse(TCursor& cursor, const TFilename& name) TToken_string head(256); TToken_string trac(256); - const char* n; trac.add(""); head.add("@1"); @@ -106,19 +105,15 @@ bool TEdit_file::_browse(TCursor& cursor, const TFilename& name) svrec = curr; if (edit_record(curr, FALSE) == K_ENTER) { - TString s(svrec.key(1)); - + const TString s(svrec.key(1)); if (s != curr.key(1)) { - cursor.file().write(); - if (cursor.file().good()) - { - curr = svrec; - cursor.file().remove(); - } + const int err = curr.write(cursor.file()); + if (err == NOERR) + svrec.remove(cursor.file()); } else - cursor.file().rewrite(); + curr.rewrite(cursor.file()); } break; case K_DEL: // delete record diff --git a/ba/ba1300.cpp b/ba/ba1300.cpp index c88da0af6..47dd17045 100755 --- a/ba/ba1300.cpp +++ b/ba/ba1300.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -19,6 +20,7 @@ protected: virtual bool destroy(); virtual bool extended_firm() const { return TRUE; } void build_sheet(); + void search_blanks(TSystemisamfile & f); public: TPackFiles_application() : _selsheet(NULL), _firm(0) {} ~TPackFiles_application() {}; @@ -73,6 +75,29 @@ void TPackFiles_application::build_sheet() } } +void TPackFiles_application::search_blanks(TSystemisamfile& f) +{ + // Scorre il file corrente per record cancellando eventuali record vuoti/blank + + f.open(_excllock, TRUE); + const long records = f.items(); + TProgind p(records, "Ricerca records vuoti in corso...", TRUE, TRUE, 70); + TString k; + + for (long i = 0; f.status() == NOERR && i < records; i++) + { + f.readat(i + 1); // Legge per numero di record, evitando falli di indice... + p.setstatus(i + 1); + k = f.curr().key(); // Chiave 1; non puo' essere vuota (anche perche' no si puo' scrivere un record vuoto) + if (f.curr().empty() || k.trim().empty()) // Teoricamente ce ne sarebbe uno solo... + { // ma se l'indice e' rovinato possono esserci piu' records vuoti + f.curr().discard(); // che vanno cmq eliminati; le pack() successive completano l'opera. + f.rewriteat(i + 1); + } + } + f.close(); +} + bool TPackFiles_application::menu(MENU_TAG m) { KEY tasto; @@ -110,7 +135,8 @@ bool TPackFiles_application::menu(MENU_TAG m) { status = NOERR; if (present) // Se il file c'e' prova a compattarlo - { + { + search_blanks(f); if (f.packfile() == NOERR) f.packindex(); status = f.status(); @@ -143,7 +169,7 @@ bool TPackFiles_application::menu(MENU_TAG m) d.put(i, is_com ? _comdir : _nordir); if (f.pack() == NOERR) if (f.load(d_name) == NOERR) // Reload - unlink(f_name); + unlink(d_name); else error_box("Impossibile ricaricare %s. Errore %d",(const char*) d_name, f.status()); else diff --git a/ba/ba1400.cpp b/ba/ba1400.cpp index 49b04f780..04f1a1d48 100755 --- a/ba/ba1400.cpp +++ b/ba/ba1400.cpp @@ -1,43 +1,387 @@ +#include #include #include #include #include #include +#include +#include #include "ba1.h" #include "ba1500.h" #include "ba0100a.h" -class TSet_users : public TRelation_application +/////////////////////////////////////////////////////////// +// Menu item +/////////////////////////////////////////////////////////// + +class TMenu_item : public TString +{ + TString _cmd; + +public: + TObject* dup() const { return new TMenu_item(*this); } + + const TString& cmd() const { return _cmd; } + TString& cmd() { return _cmd; } + + TMenu_item(const char* line); + virtual ~TMenu_item() { } +}; + +TMenu_item::TMenu_item(const char* line) +{ + TToken_string ts(line, ','); + set(ts.get(0)); trim(); + if (operator[](0) == '"') + { ltrim(1); rtrim(1); } + + _cmd = ts.get(); _cmd.trim(); + if (_cmd[0] == '"') + { _cmd.ltrim(1); _cmd.rtrim(1); } +} + +/////////////////////////////////////////////////////////// +// Sottomenu (lista di menu items) +/////////////////////////////////////////////////////////// + +class TSubmenu : public TString +{ + TArray _child; + int _module; + +public: + TMenu_item& operator[](int c) { return (TMenu_item&)*_child.objptr(c); } + TMenu_item& add_child(const char* line); + + int items() const { return _child.items(); } + int module() const { return _module; } + void set_module(int m) { _module = m; } + + TSubmenu& operator=(const char* str) { set(str); return *this; } + TSubmenu& operator=(const TSubmenu& str) { set(str); _module = str._module; return *this; } + + TSubmenu() : _module(0) { } + virtual ~TSubmenu() { } +}; + +TMenu_item& TSubmenu::add_child(const char* line) { + TMenu_item* item = new TMenu_item(line); + _child.add(item, -1); + return *item; +} + +/////////////////////////////////////////////////////////// +// Nodo dell'albero del menu principale +/////////////////////////////////////////////////////////// + +class TMenu_node : public TString +{ + TMenu_item* _item; + int _module; + +public: + const TString& command() const; + int module() const { return _module; } + + TMenu_node(TMenu_item* i, int module = 0); + TMenu_node(const char* str); +}; + +const TString& TMenu_node::command() const +{ + if (_item) + return _item->cmd(); + return EMPTY_STRING; +} + +TMenu_node::TMenu_node(TMenu_item* i, int module) + : _item(i), _module(module) +{ + set(*i); +} + +TMenu_node::TMenu_node(const char* str) + : _item(NULL), _module(0) +{ + set(str); +} + +/////////////////////////////////////////////////////////// +// Menu tree (albero di menu nodes) +/////////////////////////////////////////////////////////// + +class TMenu : public TObject_tree +{ + TAssoc_array _submenu; // Insieme dei sottomenu + TAssoc_array _prop; // Proprieta' dei singoli programmi + +protected: + virtual bool add_son(TObject* son); + virtual bool get_description(TString& desc) const; + virtual TImage* image(bool selected) const; + +protected: + TSubmenu& get_submenu(const char* name); + TSubmenu& add_submenu(const char* para, int parent_module); + void import(const char* filename, TString& first); + +public: + virtual bool enabled() const; + + TAssoc_array& properties() { return _prop; } + TString_array& properties(const char* cmd); + const TString_array* find_properties(const char* cmd) const; + + TMenu(); + virtual ~TMenu() { } +}; + +/////////////////////////////////////////////////////////// +// Main app +/////////////////////////////////////////////////////////// + +class TSet_user_passwd : public TRelation_application +{ +protected: TMask* _msk; +// TMenu* _tree; TRelation* _rel; TInformazione_moduli* _im; +protected: virtual bool user_create(); virtual bool user_destroy(); virtual TMask* get_mask(int mode) { return _msk;} virtual bool changing_mask(int mode) { return FALSE;} virtual TRelation* get_relation() const { return _rel;} virtual int read(TMask& m); - void put_in_record(const TMask& m); + + virtual void init_query_mode(TMask& m); + virtual void init_modify_mode(TMask& m); + virtual void init_insert_mode(TMask& m) { + build_sheet(NULL); + } + +protected: + virtual void put_in_record(const TMask& m); virtual int write(const TMask& m); virtual int rewrite(const TMask& m); + + TSheet_field& sheet_field() { return _msk->sfield(F_MODULI); } + void build_sheet(const TRectype* r); + void enable_aut(); + + static bool password_handler(TMask_field& f, KEY key); +public: + bool user_has_module(int mod); + + TSet_user_passwd() : _msk(NULL), _rel(NULL) , _im(NULL) {} +}; + + +class TSet_users : public TSet_user_passwd +{ + TMenu* _tree; +protected: + virtual bool user_create(); + virtual bool user_destroy(); + virtual TMask* get_mask(int mode) { return _msk;} + virtual bool changing_mask(int mode) { return FALSE;} + virtual TRelation* get_relation() const { return _rel;} + virtual int read(TMask& m); virtual bool remove(); - void enable_aut(TMask& m); + virtual void init_query_mode(TMask& m) { enable_aut();} + virtual void init_insert_mode(TMask& m) { build_sheet(NULL); } + virtual void init_modify_mode(TMask& m) { enable_aut();} + +protected: +// TSheet_field& sheet_field() { return _msk->sfield(F_MODULI); } +// void build_sheet(const TRectype* r); + void build_tree(const TRectype* r); +// void enable_aut(); + virtual void put_in_record(const TMask& m); + static bool user_handler(TMask_field& f, KEY key); - static bool password_handler(TMask_field& f, KEY key); + static bool group_handler(TMask_field& f, KEY key); +// static bool password_handler(TMask_field& f, KEY key); static bool k_notify(TSheet_field & f, int r, KEY k); - virtual void init_query_mode(TMask& m) { enable_aut(m);} - virtual void init_insert_mode(TMask& m) { build_sheet(m,NULL); enable_aut(m);} - virtual void init_modify_mode(TMask& m) { enable_aut(m);} - TSheet_field& sheet_field() { return (TSheet_field&) _msk->field(F_MODULI);} - void build_sheet(TMask& m, const TRelation* r); + static bool tree_handler(TMask_field& f, KEY key); + static bool p_notify(TSheet_field & f, int r, KEY k); public: - TSet_users() : _msk(NULL), _rel(NULL) {} -}; +// bool user_has_module(int mod); + + TSet_users() : TSet_user_passwd() , _tree(NULL) {} +}; + +inline TSet_users& app() { return (TSet_users&)main_app(); } + + +/////////////////////////////////////////////////////////// +// Menu tree implementation +/////////////////////////////////////////////////////////// + +const TString_array* TMenu::find_properties(const char* cmd) const +{ + const TString_array* arr = (const TString_array*)_prop.objptr(cmd); + return arr; +} + +TString_array& TMenu::properties(const char* cmd) +{ + TString_array* arr = (TString_array*)_prop.objptr(cmd); + if (arr == NULL) + { + arr = new TString_array; + _prop.add(cmd, arr); + } + return *arr; +} + +bool TMenu::add_son(TObject* son) +{ + if (goto_firstson()) + { + while (goto_rbrother()); + return add_rbrother(son); + } + return TObject_tree::add_son(son); +} + +bool TMenu::get_description(TString& desc) const +{ + TMenu_node* node = (TMenu_node*)curr_node(); + if (node) desc = *node; + return node != NULL; +} + +bool TMenu::enabled() const +{ + TMenu_node* node = (TMenu_node*)curr_node(); + const int mod = node->module(); + return app().user_has_module(mod); +} + +TImage* TMenu::image(bool selected) const +{ + TMenu_node* node = (TMenu_node*)curr_node(); + if (!has_son()) + { + const TString& cmd = node->command(); + if (cmd.not_empty()) + { + const TString_array* prop = find_properties(cmd); + if (prop) + { + TString80 action; + FOR_EACH_ARRAY_ROW_BACK(*prop, r, row) + { + row->get(1, action); + if (action == "Negato") + return get_res_image(BMP_STOP); + } + } + } + } + + return TObject_tree::image(selected); +} + +TSubmenu& TMenu::get_submenu(const char* name) +{ + TSubmenu* sub = (TSubmenu*)_submenu.objptr(name); + if (sub == NULL) + { + sub = new TSubmenu; + _submenu.add(name, sub); + } + return *sub; +} + + +void TMenu::import(const char* filename, TString& first) +{ + TSubmenu* sub; + TScanner scan(filename); + first.cut(0); + while (scan.good()) + { + TString& line = scan.line(); + if (line[0] == '[') + { + if (first.empty()) + first = line; + sub = &get_submenu(line); + } else + if (line.compare("Caption", 7, TRUE) == 0) + { + CHECK(sub, "Invalid menu file"); + const int equal = line.find('='); + CHECK(equal > 0, "Invalid menu Caption"); + line.ltrim(equal+1); + line.strip("\""); + *sub = line; + } else + if (line.compare("Module", 6, TRUE) == 0) + { + CHECK(sub, "Invalid menu file"); + const int equal = line.find('='); + CHECK(equal > 0, "Invalid menu Module"); + sub->set_module(atoi(line.mid(equal+1))); + } else + if (line.compare("Item", 4, TRUE) == 0) + { + CHECK(sub, "Invalid menu file"); + const int equal = line.find('='); + CHECK(equal > 0, "Invalid menu Item"); + line.ltrim(equal+1); + line.trim(); + TMenu_item& child = sub->add_child(line); + const int bracket = line.rfind('<'); + if (bracket > 0) + { + TString16 name = line.mid(bracket+1); + name.strip("< >"); + import(name, name); + child.cmd() = name; + } + } + } +} + +TSubmenu& TMenu::add_submenu(const char* para, int parent_module) +{ + TSubmenu& sub = get_submenu(para); + int module = sub.module(); + if (module == 0) + module = parent_module; + TString id; curr_id(id); + for (int i = 0; i < sub.items(); i++) + { + goto_node(id); + add_son(new TMenu_node(&sub[i], module)); + if (sub[i].cmd()[0] == '[') + add_submenu(sub[i].cmd(), module); + } + return sub; +} + +TMenu::TMenu() +{ + TString root; + import("baprassi.men", root); + add_son(new TMenu_node("Menu Principale")); + add_submenu(root, 0); + goto_root(); + expand(); +} + +/////////////////////////////////////////////////////////// +// Main application +/////////////////////////////////////////////////////////// bool TSet_users::user_handler(TMask_field& f, KEY key) { @@ -49,8 +393,25 @@ bool TSet_users::user_handler(TMask_field& f, KEY key) return ok; } -bool TSet_users::password_handler(TMask_field& f, KEY key) +bool TSet_users::group_handler(TMask_field& f, KEY key) +{ + if (key == K_TAB && f.focusdirty()) + { + TMask& m = f.mask(); + const TString& gruppo = m.get(F_GROUPNAME); + TEdit_field& ef = (TEdit_field&)f; + TRectype& rec = ef.browse()->cursor()->curr(); + if (rec.get("USERNAME") != gruppo) + { + rec.put("USERNAME", gruppo); + ef.browse()->cursor()->read(); + } + app().build_sheet(&rec); + } + return TRUE; +} +bool TSet_user_passwd::password_handler(TMask_field& f, KEY key) { if (f.mask().query_mode() || key != K_ENTER) return TRUE; const bool ok = f.get().len() > 3 && f.get().find(' ') < 0; @@ -59,32 +420,144 @@ bool TSet_users::password_handler(TMask_field& f, KEY key) return ok; } -void TSet_users::build_sheet(TMask& m, const TRelation* r) +bool TSet_users::tree_handler(TMask_field& f, KEY key) +{ + TTree_field& tf = (TTree_field&)f; + TMenu* menu = (TMenu*)tf.tree(); + const TMenu_node* node = (const TMenu_node*)(menu ? menu->curr_node() : NULL); + if (node) + { + if (key == K_SPACE || key == K_ENTER) + { + TMask& m = f.mask(); + TSheet_field& sf = m.sfield(F_PROPERTIES); + + const TString& old = m.get(F_APPLICAT); + if (old.not_empty()) + { + menu->properties(old) = sf.rows_array(); + + const TString16 mod = old.left(2); + TString_array& mprop = menu->properties(mod); + if (m.get_bool(F_NOWRITE)) + { + if (mprop.items() == 0) + { + TToken_string* ts = new TToken_string("S|Scrittura|0", sf.separator()); + ts->replace('|', sf.separator()); + mprop.add(ts); + } + } + else + mprop.destroy(); + + sf.destroy(); + m.reset(F_APPLICAT); + m.reset(F_NOWRITE); m.disable(F_NOWRITE); + } + + if (menu->enabled()) + { + const TString& cmd = node->command(); + if (cmd[0] != '[') + { + m.set(F_APPLICAT, cmd); + const TString_array* prop = menu->find_properties(cmd); + if (prop) + { + sf.rows_array() = *prop; + sf.force_update(); + } + const TString16 mod = cmd.left(2); + const TString_array* mprop = menu->find_properties(mod); + m.enable(F_NOWRITE); + m.set(F_NOWRITE, mprop && mprop->items() ? "X" : ""); + } + } + } + } + return TRUE; +} + +bool TSet_users::p_notify(TSheet_field& f, int r, KEY k) +{ + switch(k) + { + case K_INS: + { + TMask& m = f.mask(); + if (m.get(F_APPLICAT).empty()) + return error_box("Nessun programma selezionato"); + } + default: + break; + } + return TRUE; +} + +void TSet_user_passwd::build_sheet(const TRectype* r) { TString autstr; TSheet_field& sf = sheet_field(); if (r != NULL) - autstr = r->lfile().get("AUTSTR"); + { + autstr = r->get("AUTSTR"); + } const int l = autstr.len(); sf.destroy(); - + + TString d; for (int i = 0; i < ENDAUT; i++) { - TString d( _im->get_description_by_order(i)); - if (d.trim().empty()) continue; + d = _im->get_description_by_order(i); + if (d.trim().empty()) + continue; TToken_string& riga = sf.row(i); riga = d; const int module = _im->get_module_by_order(i); if (r!= NULL && moduleproperties().destroy(); + + if (r) + { + TToken_string prop_field(r->get("PERMISSION"), '\n'); + TAuto_token_string pro, row; + TString app; + FOR_EACH_TOKEN(prop_field, tok) + { + pro = tok; + pro.get(0, app); + app.trim(); + if (!app.empty()) + { + TString_array& prop = _tree->properties(app); + row.separator(pro.separator()); + row = " "; + row.add(pro.get(1)); + row.add(pro.get()); + prop.add(row); + } + } } } -void TSet_users::enable_aut(TMask& m) +// mostra le abilitazioni +void TSet_user_passwd::enable_aut() { - const bool prassi = (m.get(F_USER) == "PRASSI"); + const bool prassi = _msk->get(F_USER) == "PRASSI"; const int uns = _im->unassigned(); TSheet_field& sf = sheet_field(); const int itms = sf.items(); @@ -105,6 +578,21 @@ void TSet_users::enable_aut(TMask& m) } } +bool TSet_user_passwd::user_has_module(int mod) +{ + bool yes = mod <= 0; + if (!yes) + { + const int idx = _im->get_index(mod); + if (idx >= 0) + { + TSheet_field& sf = sheet_field(); + yes = *sf.cell(idx, 1) > ' '; + } + } + return yes; +} + bool TSet_users::k_notify(TSheet_field& f, int r, KEY k) { if (k == K_INS) @@ -112,17 +600,36 @@ bool TSet_users::k_notify(TSheet_field& f, int r, KEY k) return TRUE; } +bool TSet_user_passwd::user_create() +{ + bool superuser = user() == "PRASSI"; + _rel = new TRelation(LF_USER); + + _im = new TInformazione_moduli; + + _msk = new TMask("ba1400a") ; + _msk->set_handler(F_PASSWORD, password_handler); + + sheet_field().enable(superuser); + _msk->enable_page(1, superuser); + _msk->enable(F_GROUPNAME, superuser); + + return TRUE; +} + bool TSet_users::user_create() { - if (user() != "PRASSI") - return error_box("Utente non abilitato all'uso di questo programma"); - _msk = new TMask("ba1400a") ; - _rel = new TRelation(LF_USER); + TSet_user_passwd::user_create(); + _msk->set_handler(F_USER, user_handler); - _msk->set_handler(F_PASSWORD, password_handler); + _msk->set_handler(F_GROUPNAME, group_handler); TSheet_field& sf = sheet_field(); sf.set_notify(k_notify); - _im = new TInformazione_moduli; + + _tree = new TMenu; + _msk->set_handler(F_PERMESSI, tree_handler); + _msk->tfield(F_PERMESSI).set_tree(_tree); + _msk->sfield(F_PROPERTIES).set_notify(p_notify); return TRUE; } @@ -130,42 +637,64 @@ bool TSet_users::user_create() int TSet_users::read(TMask& m) { TRelation_application::read(m); - const TRelation *r = get_relation(); - build_sheet(m,r); - m.set(F_PASSWORD, decode(r->lfile().get("PASSWORD"))); + const TRectype& r = get_relation()->curr(); + build_sheet(&r); + + const TString16 pwd = decode(r.get("PASSWORD")); + m.set(F_PASSWORD, pwd); + m.set(F_TEST, pwd); + + build_tree(&r); + return NOERR; } +void TSet_user_passwd::put_in_record(const TMask& m) +{ + const TString16 s = encode(m.get(F_PASSWORD)); + TRectype& r = get_relation()->curr(); + r.put("PASSWORD", s); +} + void TSet_users::put_in_record(const TMask& m) { - TRelation *r = get_relation(); - TString16 s(encode(m.get(F_PASSWORD))); - TString autstr(ENDAUT); + TSet_user_passwd::put_in_record(m) ; + + TString autstr(ENDAUT, ' '); TSheet_field& sf = sheet_field(); - const int itms = sf.items(); - - autstr.fill(' '); - for (int i=0; iget(1)[0]; + const int module = riga->get_int(); + if (c == 'X') autstr[module] = c; } - r->lfile().put("AUTSTR", (const char *) autstr); - r->lfile().put("PASSWORD", (const char *) s); + TRectype& r = get_relation()->curr(); + r.put("AUTSTR", autstr); + + TToken_string prop_field(256, '\n'); + TAssoc_array& prop = _tree->properties(); + FOR_EACH_ASSOC_OBJECT(prop, hash, key, obj) + { + TString_array& arr = *(TString_array*)obj; + FOR_EACH_ARRAY_ROW(arr, r, row) + { + row->add(key, 0); + prop_field.add(*row); + } + } + r.put("PERMISSION", prop_field); } -int TSet_users::write(const TMask& m) +int TSet_user_passwd::write(const TMask& m) { put_in_record(m); return TRelation_application::write(m); } -int TSet_users::rewrite(const TMask& m) +int TSet_user_passwd::rewrite(const TMask& m) { put_in_record(m); return TRelation_application::rewrite(m); @@ -186,17 +715,93 @@ bool TSet_users::remove() return ok; } +bool TSet_user_passwd::user_destroy() +{ + if (_msk != NULL) delete _msk; + if (_rel != NULL) delete _rel; + if (_im != NULL) delete _im; + return TRUE; +} bool TSet_users::user_destroy() { - if (_msk != NULL) delete _msk; - if (_rel != NULL) delete _rel; - if (_im != NULL) delete _im; + TSet_user_passwd::user_destroy(); + if (_tree != NULL) delete _tree; return TRUE; } + +int TSet_user_passwd::read(TMask& m) +{ + TRelation_application::read(m); + const TRectype& r = get_relation()->curr(); + build_sheet(&r); + + const TString16 pwd =decode(r.get("PASSWORD")); + m.set(F_PASSWORD, pwd); + m.set(F_TEST, pwd); + + return NOERR; +} + +void TSet_user_passwd::init_query_mode(TMask& m) +{ + enable_aut(); + _msk->set(F_USER,user()); + _msk->send_key(K_AUTO_ENTER,0); + _msk->disable(DLG_FINDREC); + _msk->disable(DLG_DELREC); +} + +void TSet_user_passwd::init_modify_mode(TMask& m) +{ + enable_aut(); + _msk->disable(DLG_FINDREC); + _msk->disable(DLG_DELREC); +} + +class TSet_user_password : public TSkeleton_application +{ +protected: + virtual void main_loop(); + +public: + TSet_user_password () {} +}; + +void TSet_user_password::main_loop() +{ + TMask msk("ba1400b"); + TRelation rel(LF_USER); + TLocalisamfile &users=rel.lfile(); + users.put("USERNAME",user()); + users.read(); + + msk.autoload(rel); + TString16 pwd(users.get("PASSWORD")); + msk.set(F_PASSWORD, pwd); + msk.set(F_TEST, pwd); + int key=0; + while (key != K_QUIT) + { + key = msk.run() ; + if (key == K_SAVE) + { + users.put("PASSWORD",msk.get(F_PASSWORD)); + users.rewrite(); + } + } +} + + int ba1400(int argc, char** argv) { - TSet_users a ; - a.run(argc, argv, "Configurazione utenti"); + if (user() == "PRASSI") + { + TSet_users a ; + a.run(argc, argv, "Configurazione utenti"); + } else { + TSet_user_passwd a ; + a.run(argc, argv, "Modifica password"); + } return 0; } diff --git a/ba/ba1400a.uml b/ba/ba1400a.uml index 08546aaa9..296016c89 100755 --- a/ba/ba1400a.uml +++ b/ba/ba1400a.uml @@ -4,34 +4,66 @@ TOOLBAR "" 0 20 0 2 #include ENDPAGE -PAGE "Gestione moduli" -1 -1 35 7 +PAGE "Gestione utenti" -1 -1 35 7 + +LIST F_GROUP 1 8 +BEGIN + PROMPT 1 1 "" + ITEM " |Utente" + MESSAGE SHOW,3@ + ITEM "X|Gruppo" + MESSAGE HIDE,3@ + FIELD ISGROUP +END STRING F_USER 8 BEGIN - PROMPT 1 1 "Utente " - HELP "Inserire il nome dell'utente" + PROMPT 15 1 "" FLAGS "U" USE LF_USER - CHECKTYPE NORMAL INPUT USERNAME F_USER DISPLAY "Utente@8" USERNAME + DISPLAY "Gruppo@8" GROUPNAME DISPLAY "Descrizione@50" USERDESC OUTPUT F_USER USERNAME KEY 1 - CHECHTYPE REQUIRED + CHECKTYPE REQUIRED FIELD USERNAME END +STRING F_GROUPNAME 8 +BEGIN + PROMPT 32 1 "Gruppo di appartenenza " + FLAGS "U" + USE LF_USER SELECT ISGROUP="X" + INPUT USERNAME F_GROUP + DISPLAY "Gruppo@8" USERNAME + DISPLAY "Descrizione@50" USERDESC + OUTPUT F_GROUP USERNAME + CHECKTYPE NORMAL + FIELD GROUPNAME +END + STRING F_USERDESC 50 BEGIN - PROMPT 1 2 "Descrizione " + PROMPT 1 2 "Descrizione " FIELD USERDESC END STRING F_PASSWORD 8 BEGIN - PROMPT 1 3 "Password " - HELP "Inserire la password" + PROMPT 1 3 "Password " + FLAGS "*" + GROUP 3 +END + +STRING F_TEST 8 +BEGIN + PROMPT 32 3 "Prova " + FLAGS "*" + STR_EXPR #F_TEST=#F_PASSWORD + WARNING "La password ed la sua prova devono coincidere" + GROUP 3 END SPREADSHEET F_MODULI 78 @@ -44,6 +76,35 @@ END ENDPAGE +PAGE "Permessi" -1 -1 78 20 + +TREE F_PERMESSI -3 -7 +BEGIN + PROMPT 0 1 "" +END + +STRING F_APPLICAT 80 16 +BEGIN + PROMPT 1 -7 "Programma " + FLAGS "D" +END + +BOOLEAN F_NOWRITE +BEGIN + PROMPT 32 -7 "Disabilita registrazioni nell'intero modulo" +END + +SPREADSHEET F_PROPERTIES +BEGIN + PROMPT 1 -6 "" + FLAGS "|" + ITEM "Uso" + ITEM "Azione" + ITEM "Espressione" +END + +ENDPAGE + ENDMASK PAGE "Campo" -1 -1 60 11 @@ -65,12 +126,12 @@ BEGIN FLAGS "D" END -BUTTON DLG_OK 9 2 +BUTTON DLG_OK 10 2 BEGIN PROMPT -12 -1 "" END -BUTTON DLG_CANCEL 9 2 +BUTTON DLG_CANCEL 10 2 BEGIN PROMPT -22 -1 "" END @@ -78,3 +139,50 @@ END ENDPAGE ENDMASK + +PAGE "Proprieta'" -1 -1 70 10 + +LIST 101 1 10 +BEGIN + PROMPT 1 1 "" + ITEM " |Azione" + MESSAGE ENABLE,102|ENABLE,103 + ITEM "N|Negato" + MESSAGE DISABLE,102|DISABLE,103|"Negato",102|"1",103 + ITEM "L|Lettura" + MESSAGE DISABLE,102|ENABLE,103|"Lettura",102 + ITEM "S|Scrittura" + MESSAGE DISABLE,102|ENABLE,103|"Scrittura",102 +END + +STRING 102 16 +BEGIN + PROMPT 21 1 "Azione " + CHECKTYPE REQUIRED +END + +MEMO 103 0 -3 +BEGIN + PROMPT 1 2 "Espressione" + CHECKTYPE REQUIRED +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK + diff --git a/ba/ba1500.cpp b/ba/ba1500.cpp index aab61231c..3f4213a46 100755 --- a/ba/ba1500.cpp +++ b/ba/ba1500.cpp @@ -83,6 +83,16 @@ const char* TInformazione_moduli::get_description_by_order(int index) return ""; } +const char* TInformazione_moduli::get_description_by_name(const char* code) const +{ + FOR_EACH_ARRAY_ROW_BACK(_infos, i, info) + { + if (stricmp(info->get(1), code) == 0) + return info->get(0); + } + return "{MODULO SCONOSCIUTO}"; +} + const char* TInformazione_moduli::get_name_by_order(int index) { if (index >= 0 && index < _infos.items()) @@ -129,9 +139,20 @@ const char* TInformazione_moduli::get_description(int module) const char* TInformazione_moduli::get_name(int module) { return get_name_by_order(_index[module]); } -int TInformazione_moduli::get_index(int module) +int TInformazione_moduli::get_index(int module) const { return _index[module]; } +int TInformazione_moduli::get_index_by_name(const char* code) const +{ + FOR_EACH_ARRAY_ROW_BACK(_infos, i, info) + { + if (stricmp(info->get(1), code) == 0) + break; + } + return i >= 0 ? get_index(i) : i; +} + + /////////////////////////////////////////////////////////// // TForm richiesta attivazione @@ -815,6 +836,7 @@ bool TAttivazione_moduli::user_hnd(TMask_field & f, KEY k) const TString16 k4(f.get()); if (!f.to_check(k) || k4.empty()) return TRUE; + TMask & m = f.mask(); word ud1[4], ud2[4]; const TString16 k3(m.get(F_K3)); @@ -828,14 +850,23 @@ bool TAttivazione_moduli::user_hnd(TMask_field & f, KEY k) d.addmonth(3); if (d < d1) - return f.error_box("data non valida"); + { + f.error_box("Data non valida"); + return k != K_ENTER; + } if ((ud1[2] & UBYTEMASK) != K1 || ud1[3] != app().serno()) - return f.error_box("primo codice errato"); + { + f.error_box("Primo codice errato"); + return k != K_ENTER; + } app().garble(ud2); for (int i = 0; i < 4; i++) ud2[i] ^= app().serno(); if (ud2[3] != 0) - return f.error_box("secondo codice errato"); + { + f.error_box("Secondo codice errato"); + return k != K_ENTER; + } TSheet_field& sf = (TSheet_field&) m.field(F_MODULI); const int un = app()._im->unassigned(); for (i = un; i < MAX_AUT; i++) @@ -848,7 +879,8 @@ bool TAttivazione_moduli::user_hnd(TMask_field & f, KEY k) if (k == K_ENTER) { keyext(k4, ud2); - ::dongle().write_words(48, 4, ud2); + if (::dongle().write_words(48, 4, ud2)) + message_box("Programmazione effettuata con successo"); } else sf.force_update(); @@ -1143,7 +1175,7 @@ void TAttivazione_moduli::print_answer() TForm_item& num = form.find_field('B', odd_page, 101); TForm_item& descr = form.find_field('B', odd_page, 102); TForm_item& codice = form.find_field('B', odd_page, 103); - + TSheet_field& sheet = _msk->sfield(F_MODULI); FOR_EACH_SHEET_ROW(sheet, r, row) if (*row->get(1) > ' ') { @@ -1153,6 +1185,8 @@ void TAttivazione_moduli::print_answer() if (found == 0) { printer().open(); + form.update_serno(_msk->get(F_SN)); + form.update_dongle(::dongle()); } str.format("%3d", ++found); @@ -1174,6 +1208,7 @@ void TAttivazione_moduli::print_answer() { printer().open(); form.update_serno(_msk->get(F_SN)); + form.update_dongle(::dongle()); } if (_wanted_users != 0) { diff --git a/ba/ba1500.h b/ba/ba1500.h index 94c52b67b..bfa8ce06b 100755 --- a/ba/ba1500.h +++ b/ba/ba1500.h @@ -15,11 +15,16 @@ class TInformazione_moduli : public TObject public: const char* get_description_by_order(int index); + const char* get_description_by_name(const char* name) const; + const char* get_name_by_order(int index); int get_module_by_order(int index); const char* get_description(int module); const char* get_name(int module); - int get_index(int module); + + int get_index(int module) const; + int get_index_by_name(const char* name) const; + TDongleType get_owner(int module) const; bool test_owner(int module, TDongleType owner) const; int unassigned() const { return _unassigned_modules; } diff --git a/ba/ba1600.cpp b/ba/ba1600.cpp index 0ff2175f6..c3ab74e78 100755 --- a/ba/ba1600.cpp +++ b/ba/ba1600.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -33,7 +34,7 @@ public: class TFascicolator : public TCreazione_dischi { protected: - virtual bool use_files() const { return FALSE; } + virtual bool use_files() const { return TRUE; } virtual void main_loop(); public: virtual bool modify_mode() { return TRUE;} @@ -52,16 +53,18 @@ public: // costruisce la lista del modulo e dei suoi sottomoduli interni +// vengono creati solo i sottomoduli che contengono almeno +// una variabile di tipo File int TInstall_ini::build_list(const TString& module, TString_array& a, const char* sommario, bool agg) { CHECKS(module.len() >= 2 || module[0]=='_', "Bad module ", (const char*)module); - TConfig* sum = NULL; if (sommario && *sommario) sum = new TConfig(sommario, module); + TAssoc_array vars; TAuto_token_string tmp; TString paragraph; for (int sub = 0; sub <= 9; sub++) @@ -70,12 +73,9 @@ int TInstall_ini::build_list(const TString& module, TString_array& a, if (module[2] == '\0') // Ho specificato un modulo principale paragraph << sub; - if (sum) - { - sum->set_paragraph(paragraph); - sum->remove_all(); - } - + bool reset_par=TRUE; + vars.destroy(); + TAssoc_array& varlist = list_variables(paragraph); FOR_EACH_ASSOC_STRING(varlist, obj, key, str) { @@ -86,8 +86,23 @@ int TInstall_ini::build_list(const TString& module, TString_array& a, if (agg && is_file && tmp.get_char(1) != 'X') continue; if (sum) - sum->set(key, tmp); - + { + if (!is_file && reset_par) + vars.add(key,tmp); + else + { + if (reset_par) + { + reset_par=FALSE; + sum->set_paragraph(paragraph); + sum->remove_all(); + FOR_EACH_ASSOC_STRING(vars, obj, key, str) + sum->set(key, str); + } + sum->set(key, tmp); + } + } + if (is_file) { tmp.add(paragraph, 2); // Sottomodulo @@ -127,6 +142,36 @@ int TInstall_ini::build_complete_list(const TString& module, TString_array& a, return a.items(); } +// costruisce la lista di programmi di gestione del modulo +int TInstall_ini::build_app_list(const TString& module, TString_array& a) +{ + TString paragraph; + TToken_string row; + for (int sub = 0; sub <= 9; sub++) + { + paragraph = module; + if (module[2] == '\0') // Ho specificato un modulo principale + paragraph << sub; + + TAssoc_array& varlist = list_variables(paragraph); + FOR_EACH_ASSOC_STRING(varlist, obj, key, str) + { + int num; + if (sscanf(key, "Edit_%d", &num) == 1) + { + row = "Edit"; + row.add(num); + row.add(str); + a.add(row); + } + } + if (module[2] != '\0') + break; + } + return a.items(); +} + + void TInstall_ini::export_paragraph(const char* module, const char* summary,const bool remove_old) { CHECK(module && *module > ' ', "Can't export NULL module"); @@ -190,7 +235,9 @@ void TInstall_ini::export_paragraph(const char* module, const char* summary,cons newkey << '(' << last_file_num++ << ')'; } sum.set(newkey, str); - } else { + } + else + { sum.set(key, str); } } @@ -405,6 +452,7 @@ protected: static bool edit_handler(TMask_field& f, KEY k); static bool link_handler(TMask_field& f, KEY k); static bool deselect_handler(TMask_field& f, KEY k); + static bool isam_handler(TMask_field& f, KEY k); bool kill_missing(const char* name, bool update); @@ -534,7 +582,7 @@ bool TMod_composition_msk::missing_notify(TSheet_field& sf, int r, KEY key) TToken_string& newrow = sheet.row(-1); newrow = *riga; TString16 submod = newrow.left(2); - submod << '0'; + submod << '1'; newrow.add(submod, 2); } @@ -648,6 +696,32 @@ bool TMod_composition_msk::deselect_handler(TMask_field& f, KEY k) return TRUE; } +bool TMod_composition_msk::isam_handler(TMask_field& f, KEY k) +{ + if (k == K_F9) + { + TMask& m = f.mask(); + TArray_sheet sht(-1,-1,-4,-4,"Selezione archivio", "Codice@6R|Descrizione archivio@70"); + const TPrefix& pref = prefix(); + const int total = pref.items(); + if (total > 0) + { + TWait_cursor hourglass; + for (int i = LF_USER; i < total; i++) + { + TToken_string* row = new TToken_string; + *row << i; + row->add(pref.description(*row)); + sht.rows_array().add(row); + } + sht.select(m.get_int(f.dlg()) - LF_USER); + } + if (sht.run() == K_ENTER) + m.set(f.dlg(), sht.selected() + LF_USER); + } + return TRUE; +} + static int file_compare(const TObject** o1, const TObject** o2) { TToken_string* r1 = (TToken_string*)*o1; @@ -668,6 +742,9 @@ void TMod_composition_msk::load(const TString& module) TSheet_field& s = sfield(F_SHEET); ini.build_list(module, s.rows_array()); s.rows_array().TArray::sort(file_compare); + + TSheet_field& p = sfield(F_PROGRAMS); + ini.build_app_list(module, p.rows_array()); TFilename mask; mask << module << "*.*"; @@ -758,14 +835,38 @@ void TMod_composition_msk::save() ini.set("Patch", patch); } } + + TSheet_field& sp = sfield(F_PROGRAMS); + FOR_EACH_SHEET_ROW(sp, pr, prow) + { + TString16 var = prow->get(0); + var << '_' << prow->get(1); + + TFilename n(prow->get(2)); + const int spc = n.find(' '); + if (spc >= 0) n.cut(spc); + n.ext("exe"); + TString16 sub = module; + + FOR_EACH_SHEET_ROW(sheet, sr, srow) + { + if (n == srow->get(0)) + { + sub = srow->get(2); + break; + } + } + ini.set(var, prow->get(2), sub); + } } TMod_composition_msk::TMod_composition_msk(const bool modify_mode) - : TMask("ba1600b") + : TMask("ba1600b") { TSheet_field& s = sfield(F_SHEET); TSheet_field& miss = sfield(F_MISSING); + TSheet_field& prog = sfield(F_PROGRAMS); set_handler(F_DESELECT, deselect_handler); if (modify_mode) { @@ -775,12 +876,14 @@ TMod_composition_msk::TMod_composition_msk(const bool modify_mode) miss.disable(); // Read-only sheet miss.set_notify(missing_notify); miss.sheet_mask().set_handler(100, link_handler); + prog.sheet_mask().set_handler(102, isam_handler); } else { s.disable(); // Read-only sheet //hide(DLG_OK); // hide(F_DESELECT); //hide(DLG_CANCEL); miss.hide(); + disable_page(1); } } @@ -812,8 +915,10 @@ protected: static bool creazip_handler(TMask_field& f, KEY k); static bool modules_notify(TSheet_field& f, int row, KEY k); static bool import_export_handler(TMask_field& f, KEY k); +<<<<<<< ba1600.cpp static bool patchl_handler(TMask_field& f, KEY k); + virtual const TFilename& build_export_path(TFilename& path) const; virtual bool zip_file(const char* archive, const char* file) const; @@ -855,9 +960,8 @@ public: TFascicolator_mask(); virtual ~TFascicolator_mask() { } }; - - + bool TCreadischi_mask::modules_notify(TSheet_field& f, int row, KEY k) { bool ok = TRUE; @@ -1017,6 +1121,7 @@ bool TFascicolator_mask::list_handler(TMask_field& f, KEY k) mm.load(module); if (mm.run() == K_ENTER) { + // Salvo nel .ini mm.save(); m.dirty_composition(); } @@ -1548,7 +1653,9 @@ bool TCreadischi_mask::zip_module(const TString& main_module, bool agg, int patc filelist.temp("", main_module); struct _stat info; unsigned long lasttime=0; - { // blocco della prima Progind + + // blocco della prima Progind + { ofstream fileh(filelist); TProgind pi(arr.items(), msg, TRUE, TRUE); TFilename cmd; @@ -1605,14 +1712,32 @@ bool TCreadischi_mask::zip_module(const TString& main_module, bool agg, int patc { _stat((const char *)zipfile,&info); if (lasttime <= info.st_mtime) + { aborted = !yesno_box("Il file %s risulta già essere aggiornato. Vuoi rigenerarlo comunque?",(const char *)zipfile); + } + if (!aborted && !agg) + { + // main zip updated; are there some patches? + TFilename patchfile = zipfile.path(); + TString16 modpatch; + modpatch.format("%s%04da.ini",(const char *)main_module,patch_level); + patchfile.add(modpatch); + if (patchfile.exist()) + { + _stat((const char *)patchfile,&info); + if (lasttime <= info.st_mtime) + aborted = !yesno_box("Il file di patch %s \nrisulta già aggiornato;\nprocedo comunque alla generazione di %s ?",(const char *)patchfile,(const char *)zipfile); + } + } } if (aborted) - return FALSE; - + { + ::remove(sommario); + ::remove(filelist); // elimina il file lista-file + return TRUE; + } zip_file(archivio, filelist); // Compatto gli eventuali ultimi rimasti - - // ::remove(filelist); // elimina il file lista-file + ::remove(filelist); // elimina il file lista-file msg.cut(0); msg << "Separazione del file " << archivio << " ..."; @@ -1625,7 +1750,8 @@ bool TCreadischi_mask::zip_module(const TString& main_module, bool agg, int patc ini.set("Dischi", disks, main_module); // Aggiorna install.ini ini.export_paragraph(main_module, sommario,TRUE); // Aggiorna sommario - const bool floppy = ::os_is_removable_drive(path); + const char drive = toupper(path[0]); + const bool floppy = os_is_removable_drive(path); for (int d = 1; d <= disks && !aborted; d++) { @@ -1759,7 +1885,9 @@ int ba1600(int argc, char* argv[]) { TFascicolator app; app.run(argc, argv, "Megascicolator"); - } else { + } + else + { TCreazione_dischi app; app.run(argc, argv, "Creazione dischetti"); } diff --git a/ba/ba1600.h b/ba/ba1600.h index 07c8b4990..a13a4ac14 100755 --- a/ba/ba1600.h +++ b/ba/ba1600.h @@ -12,6 +12,7 @@ public: const char* s = NULL, bool agg = FALSE); int build_complete_list(const TString& m, TString_array& a, const char* s = NULL, bool agg = FALSE); + int build_app_list(const TString& m, TString_array& a); void export_paragraph(const char* module, const char* summary,const bool remove); void export_module_paragraphs(const char* module, const char* summary,const bool remove); @@ -32,20 +33,4 @@ public: virtual ~TInstall_ini() { } }; -// Mitica token string che sceglie da sola il separatore -class TAuto_token_string : public TToken_string -{ -protected: - TAuto_token_string& create(const char* ts); - -public: - TAuto_token_string& operator=(const char* ts) { return create(ts); } - TAuto_token_string& operator=(const TString& ts) { return create(ts); } - TAuto_token_string& operator=(const TToken_string& ts) { return create(ts); } - TAuto_token_string& operator=(const TAuto_token_string& ts) { return create(ts); } - TAuto_token_string() : TToken_string(50) { } - TAuto_token_string(const char* ts) { create(ts); } - virtual ~TAuto_token_string() { } -}; - #endif diff --git a/ba/ba1600a.h b/ba/ba1600a.h index 69c6bb52c..f86414ce9 100755 --- a/ba/ba1600a.h +++ b/ba/ba1600a.h @@ -6,6 +6,7 @@ #define F_SHEET 203 #define F_MISSING 204 #define F_MODULE 205 +#define F_PROGRAMS 206 #define F_DESELECT 251 #define S_FILE 101 diff --git a/ba/ba1600b.uml b/ba/ba1600b.uml index cfb77ab88..fe2d38655 100755 --- a/ba/ba1600b.uml +++ b/ba/ba1600b.uml @@ -44,6 +44,18 @@ END ENDPAGE +PAGE "Programmi" -1 -1 78 20 + +SPREADSHEET F_PROGRAMS 78 +BEGIN + PROMPT 1 1 "" + ITEM "Operazione" + ITEM "File" + ITEM "Programma@50" +END + +ENDPAGE + ENDMASK PAGE "File" -1 -1 52 5 @@ -111,4 +123,46 @@ END ENDPAGE ENDMASK + +PAGE "Programmi" -1 -1 64 5 + +LIST 101 4 10 +BEGIN + PROMPT 1 1 "Operazione " + ITEM "Edit|Edit" + ITEM "Open|Open" + ITEM "Print|Print" +END + +NUMBER 102 4 +BEGIN + PROMPT 51 1 "File " + FLAGS "BU" + CHECKTYPE REQUIRED +END + +STRING 103 50 +BEGIN + PROMPT 1 2 "Programma " + CHECKTYPE REQUIRED +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK diff --git a/ba/ba1700.cpp b/ba/ba1700.cpp index 69d00dfbc..ca33c91f8 100755 --- a/ba/ba1700.cpp +++ b/ba/ba1700.cpp @@ -31,6 +31,7 @@ #else const char* const http_default_path = "/aga/euro/zip/"; #endif + HIDDEN int compare_version(const char* v1, int p1, const char* v2, int p2) { TString16 ver1(v1), ver2(v2); @@ -332,8 +333,7 @@ bool TInstaller_mask::autoload() // !?!?!? modifica per correggere il bug di libreria su _parked dei TSheet: // !?!?!? (uso della stringa _park e dell'indice _parked ) // !?!?!? rimuovere appena si è corretto l'errore - for (short pisellone =0; pisellone<100; pisellone++) - add(""); +// for (short pisellone =0; pisellone<100; pisellone++) add(""); // !?!?! fine modifica destroy(); force_update(); @@ -345,6 +345,7 @@ bool TInstaller_mask::autoload() if (fexist(ininame)) { + // Presente il file ini generale "install.ini" TInstall_ini ini(ininame); ini.list_paragraphs(modules); @@ -377,10 +378,9 @@ bool TInstaller_mask::autoload() TConfig ini(ininame, module); add_module(ini, module, FALSE); } - } - // add patches + modules.destroy(); if (internet) @@ -443,8 +443,7 @@ bool TInstaller_mask::autoload() mask_rows.row(r+1).add("+", C_ISPATCH); // .....setta la presenza di patches force_update(r+1); } - } - else + } else add_module(ini, module, TRUE); } @@ -573,20 +572,25 @@ bool TInstaller_mask::move_file(const TFilename& from, const TFilename& file, co make_dir(subdir); } } - const long filesize = fsize(file); bool space_ok = FALSE; while (!space_ok) - { + { +/* int disk = 0; if (dest[1] == ':') { const char letter = toupper(dest[0]); disk = 'A' - letter + 1; - } + } + struct _diskfree_t drive; + _dos_getdiskfree(disk, &drive); - space_ok = ::os_test_disk_free_space(todir, filesize); + const unsigned requested_clusters = unsigned(filesize / drive.sectors_per_cluster / drive.bytes_per_sector) + 1; + space_ok = requested_clusters <= drive.avail_clusters; +*/ + space_ok = os_test_disk_free_space(dest, filesize); if (!space_ok) { TString msg; @@ -598,13 +602,9 @@ bool TInstaller_mask::move_file(const TFilename& from, const TFilename& file, co return FALSE; } else - { - msg << "Si desidera proseguire ugualmente?"; - if (!noyes_box(msg)) - return FALSE; - } - } - } + return error_box(msg); + } + } bool write_ok = TRUE; bool user_retry = FALSE; @@ -771,7 +771,6 @@ bool TInstaller_mask::install(const TString& module, int patchlevel) if (is_a_patch) msg << " della patch " << patchlevel ; msg << " del modulo '" << module << "' in corso..."; - TProgind pi(dischi, msg, FALSE, TRUE); TFilename tempdir; tempdir.tempdir(); @@ -810,8 +809,13 @@ bool TInstaller_mask::install(const TString& module, int patchlevel) if (ok) { const long required = fsize(cmdline) * (dischi-d+1) * 4; - const TString& dest = get(F_CURPATH); - if (!::os_test_disk_free_space(dest, required)) +/* + struct _diskfree_t drive; + _dos_getdiskfree(0, &drive); + const unsigned requested_clusters = unsigned(required / drive.sectors_per_cluster / drive.bytes_per_sector) + 1; + if (requested_clusters >= drive.avail_clusters) +*/ + if (!os_test_disk_free_space(tempdir, required)) { ok = yesno_box("Lo spazio su disco potrebbe essere insufficiente:\n" "Si desidera continuare ugualmente?"); @@ -1068,6 +1072,7 @@ void TInstaller_mask::install_selection() TString_array& arr = rows_array(); FOR_EACH_ARRAY_ROW(arr, r, row) if (checked(r)) { + const TString newver = row->get(C_RELEASE); if (newver.blank()) @@ -1101,18 +1106,16 @@ void TInstaller_mask::install_selection() "funzionamento di tutti i programmi!", (const char*)newver, newpatch, (const char*)modulo); ok = noyes_box(msg); } - - bool is_patch = row->get_char(C_ISPATCH) > ' '; - if (is_patch) + if (ok && is_patch) { // installo le patch solo se esiste già un modulo installato della stessa versione if (!oldver.blank() ) + { if (oldver != newver) ok =error_box("Il modulo '%s' installato ha versione %s:\nimpossibile installare le patch della versione %s",(const char *)modulo,(const char *)oldver,(const char *)newver); } else ok =FALSE;//error_box("Impossibile installare le patch perche' il modulo '%s' non e' installato",(const char *)modulo); } - if (ok) { if (has_patch) @@ -1132,11 +1135,7 @@ void TInstaller_mask::install_selection() message_box("Impossibile installare le patch del modulo '%s'",(const char *)modulo); } else - { ok = install(modulo, 0); // installa il modulo - } - - if (ok) _installed = TRUE; // Setta il flag di almeno un modulo installato if (ok) @@ -1234,9 +1233,7 @@ TInstaller_mask::TInstaller_mask() TFilename path = ini.get("DiskPath"); set(F_PATH, path); - const char lettera = toupper(path[0]); - const bool floppy = (path.len() > 1) && path[1] == ':' && - GetDriveType(lettera - 'A') == DRIVE_REMOVABLE; + const bool floppy = os_is_removable_drive(path); if (path.not_empty() && !floppy && !is_internet_path(path)) autoload(); diff --git a/ba/ba2200.cpp b/ba/ba2200.cpp index fb8776521..73c6b16b8 100755 --- a/ba/ba2200.cpp +++ b/ba/ba2200.cpp @@ -18,7 +18,7 @@ protected: virtual bool create(); virtual void main_loop(); static bool test_firm(TMask_field& f, KEY k); - KEY query(long& firm, char& floppy, TString& desc, bool& tmp, bool& zip) const; + KEY query(long& firm, char& floppy, TString& desc, bool& tmp) const; public: void stop_job(); diff --git a/ba/ba3100.cpp b/ba/ba3100.cpp index 153c32e37..a0b7b5267 100755 --- a/ba/ba3100.cpp +++ b/ba/ba3100.cpp @@ -6,12 +6,17 @@ #include "batbreg.h" #include "batbcam.h" #include "batbdel.h" +#include "batbval.h" #include "batbver.h" #define REG_JOURNAL 5 +#define TAB_CAMBI "CAM" +#define TAB_DELEGHE "%DEL" +#define TAB_REGISTRI "REG" +#define TAB_VALUTE "%VAL" #define TAB_VERSAMENTI "%VER" -class TGeneric_table_app : public Tab_application +class TGeneric_table_app : public TTable_application { long _oldditta; int _oldanno; @@ -19,7 +24,6 @@ class TGeneric_table_app : public Tab_application bool _stampa_intest; // ------------- specifiche tabella versamenti ed interessi IVA - TTable* _ver; void load_rec_in_disabled_fields(TMask& m); void copy_rec_in_insert_fields(TMask& m); // ------------------------------------------------------------ @@ -32,6 +36,10 @@ protected: // TRelation_application virtual void init_modify_mode(TMask& m); virtual void init_query_mode (TMask&); virtual int rewrite(const TMask& m); + +protected: + static bool valute_decimals_handler(TMask_field& f, KEY k); + static bool change_decimals_handler(TMask_field& f, KEY k); public: bool exist_journal() { return _exist_journal; } @@ -44,7 +52,7 @@ public: HIDDEN inline TGeneric_table_app& app() { return (TGeneric_table_app&)main_app(); } TGeneric_table_app::TGeneric_table_app() - : _exist_journal(FALSE), _stampa_intest(FALSE), _ver(NULL) + : _exist_journal(FALSE), _stampa_intest(FALSE) { } @@ -53,30 +61,31 @@ void TGeneric_table_app::load_rec_in_disabled_fields(TMask& m) // carica il record del periodo precedente a quello immesso // nei campi disabilitati relativi. { - CHECK(_ver, "Null table"); - TString key(m.get(F_ANNOES)); + TTable ver(TAB_VERSAMENTI); + TString16 key(m.get(F_ANNOES)); key << m.get(F_MESEES); - _ver->put("CODTAB",key); - if (_ver->read(_isgteq) == _iseof) // Se non lo trova si posiziona sull'ultimo - _ver->last(); + + ver.put("CODTAB",key); + if (ver.read(_isgteq) == _iseof) // Se non lo trova si posiziona sull'ultimo + ver.last(); else - _ver->prev(); // altrimenti legge il periodo precedente. - if (_ver->good()) // se si e' immesso un periodo precedente al primo , non copiera' nulla + ver.prev(); // altrimenti legge il periodo precedente. + if (ver.good()) // se si e' immesso un periodo precedente al primo , non copiera' nulla { - m.set(F_1_TRIMESTRE_P,_ver->get("R0")); - m.set(F_2_TRIMESTRE_P,_ver->get("R1")); - m.set(F_3_TRIMESTRE_P,_ver->get("R2")); - m.set(F_4_TRIMESTRE_P,_ver->get("R3")); - m.set(F_ANNUALE_P,_ver->get("R4")); - m.set(F_I_PERIODO_P,_ver->get("R5")); - m.set(F_I_ANNUALE_P,_ver->get("R6")); - m.set(F_I_ACCONTO_P,_ver->get("R7")); - m.set(F_I_INTEGRATIVO_P,_ver->get("R8")); - m.set(F_I_CESSAZIONE_P,_ver->get("R9")); - m.set(F_I_ART74_P,_ver->get("R10")); - m.set(F_P_LIQ_NORMALE_P,_ver->get("R11")); - m.set(F_P_LIQ_DIFFERI_P,_ver->get("R12")); + m.set(F_1_TRIMESTRE_P,ver.get("R0")); + m.set(F_2_TRIMESTRE_P,ver.get("R1")); + m.set(F_3_TRIMESTRE_P,ver.get("R2")); + m.set(F_4_TRIMESTRE_P,ver.get("R3")); + m.set(F_ANNUALE_P,ver.get("R4")); + m.set(F_I_PERIODO_P,ver.get("R5")); + m.set(F_I_ANNUALE_P,ver.get("R6")); + m.set(F_I_ACCONTO_P,ver.get("R7")); + m.set(F_I_INTEGRATIVO_P,ver.get("R8")); + m.set(F_I_CESSAZIONE_P,ver.get("R9")); + m.set(F_I_ART74_P,ver.get("R10")); + m.set(F_P_LIQ_NORMALE_P,ver.get("R11")); + m.set(F_P_LIQ_DIFFERI_P,ver.get("R12")); } } @@ -103,10 +112,10 @@ void TGeneric_table_app::copy_rec_in_insert_fields(TMask& m) void TGeneric_table_app::init_insert_mode(TMask& m) { const TString& n = get_tabname(); - if (n == "REG") + if (n == TAB_REGISTRI) { const long ditta = get_firm(); - const int anno = atoi(m.get(F_ANNO)); + const int anno = m.get_int(F_ANNO); m.set(F_STAMPA_INTESTAZIONE, _stampa_intest ? "X" : ""); @@ -115,10 +124,10 @@ void TGeneric_table_app::init_insert_mode(TMask& m) _oldditta = ditta; _oldanno = anno; - TTable reg("REG"); + TTable reg(TAB_REGISTRI); reg.put("CODTAB", m.get(F_ANNO)); - TRectype to(reg.curr()); + const TRectype to(reg.curr()); _exist_journal = FALSE; for (reg.read(_isgteq); !_exist_journal && reg.good() && reg.curr() <= to; reg.next()) @@ -133,14 +142,13 @@ void TGeneric_table_app::init_insert_mode(TMask& m) // poi copia il contenuto nei campi di input, come valori predefiniti copy_rec_in_insert_fields(m); } - } void TGeneric_table_app::init_modify_mode(TMask& m) { Tab_application::init_modify_mode(m); const TString& n = get_tabname(); - if (n == "REG") + if (n == TAB_REGISTRI) { TString16 config; config.format("REG%05ld", m.get_long(F_CODDITTA)); @@ -158,7 +166,7 @@ void TGeneric_table_app::init_modify_mode(TMask& m) void TGeneric_table_app::init_query_mode(TMask& m) { Tab_application::init_query_mode(m); - if (get_tabname() == "%DEL") + if (get_tabname() == TAB_DELEGHE) { m.show(F_BANCA1); m.show(F_BANCA2); @@ -171,7 +179,7 @@ bool TGeneric_table_app::protected_record(TRectype& rec) bool prot = rec.get_bool(FPC); if (!prot) { - if (get_tabname() == "%IVD") // Impedisce la cancellazione di una classe se ha sottoclassi + if (get_tabname() == "%IVD") // Impedisce la cancellazione di una classe se ha sottoclassi { TLocalisamfile& f = get_relation()->lfile(); const TRecnotype pos = f.recno(); @@ -415,23 +423,76 @@ HIDDEN bool mese_handler(TMask_field& f, KEY k) return TRUE; } +bool TGeneric_table_app::valute_decimals_handler(TMask_field& f, KEY k) +{ + if (k == K_SPACE) + { + TMask& m = f.mask(); + const int dec = atoi(f.get()); + TReal_field& exc = (TReal_field&)m.efield(VAL_CHANGE); + if (dec != exc.decimals()) + { + exc.set_decimals(dec); + exc.set(exc.get()); + } + if (!m.is_running() && exc.empty()) + exc.set(m.get(VAL_CHANGE_OLD)); + } + if (k == K_ENTER) + { + TMask& m = f.mask(); + real cambio = m.get(VAL_CHANGE); + if (cambio > ZERO && m.get_bool(VAL_INEURO)) + { + // Se il cambio e' espresso in EURO metto in R10 il valore in lire + cambio = 1936.27 / cambio; + cambio.round(2); + } + m.set(VAL_CHANGE_OLD, cambio); + } + return TRUE; +} + +bool TGeneric_table_app::change_decimals_handler(TMask_field& f, KEY k) +{ + if (k == K_TAB && f.to_check(k, TRUE)) + { + TMask& m = f.mask(); + const int dec = m.get_int(FLD_TABCAM_I2); + TReal_field& exc = (TReal_field&)f; + if (dec != exc.decimals()) + { + exc.set_decimals(dec); + exc.set(exc.get()); + } + if (!m.is_running() && exc.empty()) + exc.set(m.get(FLD_TABCAM_R10)); + } + if (k == K_ENTER) + { + TMask& m = f.mask(); + real cambio = f.get(); + if (cambio > ZERO && m.get_bool(FLD_TABCAM_B1)) + { + // Se il cambio e' espresso in EURO metto in R10 il valore in lire + cambio = 1936.27 / cambio; + cambio.round(2); + } + m.set(FLD_TABCAM_R10, cambio); + } + return TRUE; +} + + bool TGeneric_table_app::user_create() { - bool ok = Tab_application::user_create(); + bool ok = TTable_application::user_create(); if (ok) { const TString& name = get_tabname(); TMask& mask = *get_mask(); - if (name == "REG") - { - mask.set_handler(F_TIPO, tiporeg_handler); - mask.set_handler(F_PRINTER, printer_handler); - - TConfig st(CONFIG_STUDIO, "cg"); - _stampa_intest = st.get_bool("StiReg"); - } - if (name == "%DEL") + if (name == TAB_DELEGHE) { mask.set_handler(F_MESEDEL, mese_handler); mask.set_handler(F_IMPORTO, impdel_handler); @@ -439,23 +500,39 @@ bool TGeneric_table_app::user_create() mask.set_handler(F_BANCA1, coddel_handler); mask.set_handler(F_CONCESSIONE, coddel_handler); } - if (name == "CAM") - set_search_field(FLD_TABCAM_D0); + if (name == TAB_REGISTRI) + { + mask.set_handler(F_TIPO, tiporeg_handler); + mask.set_handler(F_PRINTER, printer_handler); + + TConfig st(CONFIG_STUDIO, "cg"); + _stampa_intest = st.get_bool("StiReg"); + } + if (name == TAB_VALUTE) + { + mask.set_handler(VAL_DECIMALS_CHANGE, valute_decimals_handler); + } + if (name == TAB_CAMBI) + { + mask.set_handler(FLD_TABCAM_S4, change_decimals_handler); + } if (name == TAB_VERSAMENTI) { - _ver = new TTable(TAB_VERSAMENTI); - _ver->put("CODTAB","199301"); - if (_ver->read() != NOERR) // Se %VER non esiste la crea + TLocalisamfile& ver = get_relation()->lfile(); + ver.put("CODTAB","199301"); + if (ver.read() != NOERR) // Se %VER non esiste la crea { - _ver->put("CODTAB","199301"); - _ver->put("R0","1.5"); _ver->put("R1","1.5"); - _ver->put("R2","1.5"); _ver->put("R3","1.5"); _ver->put("R4","1.5"); - _ver->put("R5","50500"); _ver->put("R7","200000"); - _ver->put("R11","88"); _ver->put("R12","88"); - if (_ver->write() != NOERR) - error_box("Errore %d in scrittura sulla tabella versamenti",_ver->status()); + ver.put("CODTAB","199301"); + ver.put("R0","1.5"); ver.put("R1","1.5"); + ver.put("R2","1.5"); ver.put("R3","1.5"); ver.put("R4","1.5"); + ver.put("R5","50500"); ver.put("R7","200000"); + ver.put("R11","88"); ver.put("R12","88"); + if (ver.write() != NOERR) + error_box("Errore %d in scrittura sulla tabella versamenti",ver.status()); } } + if (name == TAB_CAMBI) + set_search_field(FLD_TABCAM_D0); } return ok; @@ -463,15 +540,12 @@ bool TGeneric_table_app::user_create() bool TGeneric_table_app::user_destroy() { - const TString& n = get_tabname(); - if (n == TAB_VERSAMENTI) - delete _ver; return Tab_application::user_destroy(); } int TGeneric_table_app::rewrite(const TMask& m) { - if (get_tabname() == "REG" && !m.get_bool(F_CONFIG)) + if (get_tabname() == TAB_REGISTRI && !m.get_bool(F_CONFIG)) { TString16 config; config.format("REG%05ld", m.get_long(F_CODDITTA)); diff --git a/ba/ba4300.cpp b/ba/ba4300.cpp index b45bf6bf2..79f8bf1b7 100755 --- a/ba/ba4300.cpp +++ b/ba/ba4300.cpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include "ba4.h" #include "ba4300.h" @@ -348,6 +348,7 @@ void TDitte_application::init_query_mode(TMask& m) m.hide(FLD_GD1_RAGSOCH); } init_insert_mode(m); + m.disable(FLD_GD1_VALUTA); // La valuta si decide solo in creazione } void TDitte_application::init_insert_mode(TMask& m) @@ -374,7 +375,9 @@ void TDitte_application::init_insert_mode(TMask& m) m.disable(DLG_SOC); m.disable(DLG_REG); m.disable(DLG_REG1); - _oldattprev = ""; + _oldattprev = ""; + + m.enable(FLD_GD1_VALUTA); // La valuta si decide solo in creazione } void TDitte_application::enable_reg(TMask& m) diff --git a/ba/ba4300.h b/ba/ba4300.h index 23e827d6f..4bd0d0293 100755 --- a/ba/ba4300.h +++ b/ba/ba4300.h @@ -126,5 +126,14 @@ #define F_ISCRCAF 189 #define FLD_GD1_RAGSOCH 190 #define DLG_REG1 191 +#define FLD_GD1_VALUTA 192 + +#define CHK_IN_PRESELEN 195 +#define CHK_IN_CESSIVA 196 +#define LST_IN_FREQCES 197 +#define LST_IN_FREQACQ 198 +#define LST_IN_TIPOSOGDEL 199 +#define FLD_IN_CODSOGDEL 200 +#define FLD_IN_DESSOGDEL 201 #endif // __BA4300_H diff --git a/ba/ba4300a.uml b/ba/ba4300a.uml index b3b21ead7..6c42dde17 100755 --- a/ba/ba4300a.uml +++ b/ba/ba4300a.uml @@ -235,6 +235,19 @@ BEGIN HELP "Numero telefonico del fax della ditta" END +STRING FLD_GD1_VALUTA 3 +BEGIN + PROMPT 1 17 "Codice valuta di riferimento " + FIELD VALUTA + USE %VAL + INPUT CODTAB FLD_GD1_VALUTA + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT FLD_GD1_VALUTA CODTAB + CHECKTYPE NORMAL + FLAGS "D" +END + ENDPAGE PAGE "Pag. 2" -1 -1 77 18 @@ -756,4 +769,106 @@ END ENDPAGE +PAGE "Pag. 5" -1 -1 77 18 + +GROUPBOX DLG_NULL 76 4 +BEGIN + PROMPT 1 0 "" + FLAGS "R" +END + +NUMBER DLG_NULL 5 +BEGIN + PROMPT 2 1 "Codice " + FLAGS "RD" + GROUP 1 +END + +STRING DLG_NULL 50 +BEGIN + PROMPT 2 2 "Ragione sociale " + FLAGS "D" + GROUP 2 +END + +GROUPBOX DLG_NULL 76 6 +BEGIN + PROMPT 1 4 "Soggetto Obbligato INTRA" + FLAGS "R" +END + +BOOLEAN CHK_IN_PRESELEN +BEGIN + PROMPT 2 5 "Presentati elenchi in precedenza" + FIELD PRESELEN +END + +BOOLEAN CHK_IN_CESSIVA +BEGIN + PROMPT 2 6 "Cessata attivita' o variata partita IVA" + FIELD CESSIVA +END + +LIST LST_IN_FREQCES 1 12 +BEGIN + PROMPT 2 7 "Frequenza dei riepiloghi cessioni INTRA " + ITEM "M|Mensile" + ITEM "T|Trimestrale" + ITEM "A|Annuale" + FIELD FREQCES +END + +LIST LST_IN_FREQACQ 1 12 +BEGIN + PROMPT 2 8 "Frequenza dei riepiloghi acquisti INTRA " + ITEM "M|Mensile" + ITEM "T|Trimestrale" + ITEM "A|Annuale" + FIELD FREQACQ +END + +GROUPBOX DLG_NULL 76 4 +BEGIN + PROMPT 1 10 "Soggetto Delegato INTRA" + FLAGS "R" +END + +LIST LST_IN_TIPOSOGDEL 1 10 +BEGIN + PROMPT 1 11 "Tipo persona " + ITEM "F|Fisica" + ITEM "G|Giuridica" + FIELD TIPOSOGDEL +END + +NUMBER FLD_IN_CODSOGDEL 6 +BEGIN + PROMPT 35 11 "Codice " + USE LF_ANAG + INPUT TIPOA LST_IN_TIPOSOGDEL SELECT + INPUT CODANAGR FLD_IN_CODSOGDEL + DISPLAY "Tipo" TIPOA + DISPLAY "Codice" CODANAGR + DISPLAY "Denominazione@50" RAGSOC + OUTPUT FLD_IN_CODSOGDEL CODANAGR + OUTPUT FLD_IN_DESSOGDEL RAGSOC + FIELD CODSOGDEL + CHECKTYPE NORMAL +END + +STRING FLD_IN_DESSOGDEL 50 +BEGIN + PROMPT 1 12 "Denominazione " + USE LF_ANAG KEY 2 + INPUT TIPOA LST_IN_TIPOSOGDEL SELECT + INPUT RAGSOC FLD_IN_DESSOGDEL + DISPLAY "Denominazione@50" RAGSOC + DISPLAY "Tipo" TIPOA + DISPLAY "Codice" CODANAGR + COPY OUTPUT FLD_IN_CODSOGDEL + CHECKTYPE NORMAL +END + +ENDPAGE + ENDMASK diff --git a/ba/ba7.cpp b/ba/ba7.cpp new file mode 100755 index 000000000..2fb62fc34 --- /dev/null +++ b/ba/ba7.cpp @@ -0,0 +1,16 @@ +#include +#include "ba7.h" + +int main(int argc, char** argv) +{ + const int r = (argc > 1) ? (argv[1][1]-'0') : 0; + + switch (r) + { + default: + ba7100(argc, argv) ; break; + } + + exit(0); + return 0; +} \ No newline at end of file diff --git a/ba/ba7.h b/ba/ba7.h new file mode 100755 index 000000000..df4cabded --- /dev/null +++ b/ba/ba7.h @@ -0,0 +1,7 @@ +#ifndef __BA7_H +#define __BA7_H + +int ba7100(int argc, char* argv[]); +int ba7200(int argc, char* argv[]); + +#endif diff --git a/ba/ba7100.cpp b/ba/ba7100.cpp new file mode 100755 index 000000000..61f982728 --- /dev/null +++ b/ba/ba7100.cpp @@ -0,0 +1,776 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NO_MFC +#include + +#include "ba7.h" +#include "ba7100a.h" + +/////////////////////////////////////////////////////////// +// TConfig utilities +/////////////////////////////////////////////////////////// + +TString& set_ini_var(int cfg, const char* para, + const char* var, const char* val) +{ + static TString80 prev; + TConfig ini(cfg, para); + prev = ini.get(var); + if (val != NULL) + ini.set(var, val); + return prev; +} + +inline TString& get_ini_var(int cfg, const char* para, const char* var) +{ return set_ini_var(cfg, para, var, NULL); } + + +/////////////////////////////////////////////////////////// +// TMail_box +/////////////////////////////////////////////////////////// + +class TMail_box : public TSocketClient +{ + unsigned long _connection; + +public: + bool default_params(TString& server, TString& user,TString& password); + + bool logon(const char* server = NULL, + const char* usr = NULL, const char* pwd = NULL); + virtual bool ok() const { return _connection != NULL; } + + bool list(TString_array& a); + int get(TMail_messages& m); + bool remove(const char* id); + + void logoff(); + + TMail_box(); + ~TMail_box(); +}; + +bool TMail_box::default_params(TString& server, TString& user,TString& password) +{ + bool ok = TRUE; + if (server.empty()) + { + server = get_ini_var(CONFIG_INSTALL, "Server", "POP3"); + if (server.empty()) + ok = FALSE; + } + if (user.empty()) + user = ::user(); + if (password.empty()) + { + TDecoder users(LF_USER, "PASSWORD"); + password = ::decode(users.decode(user)); + } + return ok; +} + +bool TMail_box::logon(const char* ser, const char* usr, const char* pwd) +{ + if (_connection) + logoff(); + + if (!IsOk()) + return error_box("Impossibile inizializzare il client POP3"); + + TString server(ser); + TString user(usr); + TString password(pwd); + if (!default_params(server, user, password)) + return error_box("E' necessario specificare un server POP3, un utente ed una password"); + + _connection = QueryConnection("110", server); + if (_connection != 0) + { + TString buf; + ReadLine(_connection, buf); + if (buf[0] != '+') + return error_box("Il server POP3 %s non risponde", + (const char*)server); + + buf = "USER "; buf << user << '\n'; + WriteLine(_connection, buf); + ReadLine(_connection, buf); + if (buf[0] != '+') + return error_box("Il server POP3 %s non accetta l'utente %s", + (const char*)server, (const char*)user); + + buf = "PASS "; buf << password << '\n'; + WriteLine(_connection, buf); + ReadLine(_connection, buf); + if (buf[0] != '+') + return error_box("Il server POP3 %s non accetta l'utente %s", + (const char*)server, (const char*)user); + } + else + return error_box("Impossibile contattare il server POP3 %s", + (const char*)server); + + return TRUE; +} + +void TMail_box::logoff() +{ + if (_connection) + { + WriteLine(_connection, "QUIT\n"); + RemoveConnection(_connection); + _connection = NULL; + } +} + +bool TMail_box::list(TString_array& a) +{ + bool ok = _connection != NULL; + if (ok) + { + TString buf; + buf = "LIST\n"; + WriteLine(_connection, buf); + ReadLine(_connection, buf); + ok = buf[0] == '+'; + while (ok) + { + if (!ReadLine(_connection, buf)) + break; // Unexpected EOF + if (buf[0] == '.') + break; + int pos = buf.find(' '); + if (pos > 0) + buf.cut(pos); + a.add(buf); + } + } + return ok; +} + +HIDDEN int str2month(const char* str) +{ + const char* const mese[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; + int m; + for (m = 11; m > 0; m--) + { + if (stricmp(str, mese[m]) == 0) + break; + } + return m+1; +} + +int TMail_box::get(TMail_messages& m) +{ + // Lista dei caratteri validi + const char Base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+*"; + + // Lista per decodifica dei caratteri validi + char Deco64[256]; + memset(Deco64, ' ', sizeof(Deco64)); + for (int i = 0; Base64[i]; i++) + Deco64[Base64[i]] = i; + + TString_array a; + list(a); + + TString buf; + FOR_EACH_ARRAY_ROW(a, r, row) + { + TMail_message* msgptr = new TMail_message(user()); + m.add(msgptr); + TMail_message& msg = *msgptr; + + buf = "RETR "; buf << *row << '\n'; + WriteLine(_connection, buf); + ReadLine(_connection, buf); + bool ok = buf[0] == '+'; + bool base64 = FALSE; + bool in_body = FALSE; + while (ok) + { + if (!ReadLine(_connection, buf)) + { + ok = FALSE; + break; // Unexpected EOF + } + if (buf[0] == '.') + { + buf.ltrim(1); + if (buf.blank()) + break; + } + if (in_body) + { + if (base64) + { + unsigned val = 0; + int bits = 0; + for (const char* s = buf; *s && *s != '='; s++) + { + if (*s==0x0A || *s==0x0D || *s==0x20 || *s==0x09) + continue; // Salta eventuali blanks + val <<= 6; + val |= Deco64[*s]; + bits += 6; + if (bits >= 8) + { + const char c = char((val >> (bits - 8)) & 0xFF); + msg << c; + bits -= 8; + } + } + } + else + { + const char last = buf.right(1)[0]; + if (last > '\0' && last < ' ') + buf.rtrim(1); + msg << buf << '\n'; + } + } + else + { + if (buf.blank()) + in_body = TRUE; else + if (buf.compare("From:", 5, TRUE) == 0) + { + buf.ltrim(6); + msg.set_sender(buf); + } else + if (buf.compare("To:", 3, TRUE) == 0) + { + buf.ltrim(4); + msg.add_recipient(buf); + } else + if (buf.compare("Cc:", 3, TRUE) == 0) + { + buf.ltrim(4); + msg.add_copy_recipient(buf); + } else + if (buf.compare("Subject:", 8, TRUE) == 0) + { + buf.ltrim(9); + msg.set_subject(buf); + } else + if (buf.compare("Date:", 5, TRUE) == 0) + { + TToken_string d(buf.mid(6), ' '); + int giorno = d.get_int(1); + int mese = str2month(d.get()); + int anno = d.get_int(); + if (anno < 1000) anno += anno >= 98 ? 1900 : 2000; + TString16 ora = d.get(); + buf.cut(0); + buf << anno << '/' << mese << '/' << giorno << ' ' << ora; + msg.set_date_time(buf); + } else + if (buf.compare("Content-Transfer-Encoding:", 26, TRUE) == 0) + { + base64 = buf.find("base64") > 0; + } + } + } + } + return m.items(); +} + +bool TMail_box::remove(const char* id) +{ + bool ok = _connection != NULL; + if (ok) + { + TString buf; + buf << "DELE " << id << '\n'; + WriteLine(_connection, buf); + ReadLine(_connection, buf); + ok = buf[0] == '+'; + } + return ok; +} + +TMail_box::TMail_box() : _connection(NULL) +{ +} + +TMail_box::~TMail_box() +{ + logoff(); +} + +/////////////////////////////////////////////////////////// +// TFilter_expr +/////////////////////////////////////////////////////////// + +class TFilter_expr : public TExpression +{ + TAutomask& _mask; + +protected: + virtual bool print_error(const char* msg) const; + +public: + TFilter_expr(TAutomask& m, int logicnum, const char* expr); + virtual ~TFilter_expr() { } +}; + +bool TFilter_expr::print_error(const char* msg) const +{ + return _mask.error_box(msg); +} + +TFilter_expr::TFilter_expr(TAutomask& m, int logicnum, const char* expr) + : _mask(m) +{ + bool ok = set(expr, _strexpr); + if (ok) + { + if (logicnum < LF_USER || logicnum >= prefix().items()) + logicnum = LF_TABCOM; + + TLocalisamfile isf(logicnum); + TRectype& rec = isf.curr(); + for (int i = 0; i < numvar(); i++) if (rec.exist(varname(i))) + { + _error = 883; + TString msg; + msg << "Il campo " << varname(i) + << " non appartiene al file " << logicnum; + print_error(msg); + break; + } + } +} + + +/////////////////////////////////////////////////////////// +// TMailer_mask +/////////////////////////////////////////////////////////// + +class TMailer_mask : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + + bool file2app(const TString& file, TString& app) const; + void expand_tabs(TString& str, const int tab = 8) const; + + void save_sheet(TConfig& ini, short dlg, const char* var) const; + void load_sheet(TConfig& ini, short dlg, const char* var); + +public: + void test_delete(); + int fill_messages(); + bool save_curr_line(); + void save_all_lines(); + + void save() const; + void load(); + + TMailer_mask(); + virtual ~TMailer_mask(); +}; + +void TMailer_mask::test_delete() +{ + TWait_cursor hourglass; + xvt_statbar_set("Eliminazione messaggi POP3..."); + do_events(); + + TSheet_field& sf = sfield(F_MESSAGES); + TString16 mailer, id; + + TMail_messages mapidel; // Lista dei messaggi MAPI da cancellare + + TMail_box mailbox; + FOR_EACH_SHEET_ROW_BACK(sf, nrow, row) if (*row->get(0) == 'X') + { + row->get(sf.cid2index(F_MAILER), mailer); + row->get(sf.cid2index(F_ID), id); + if (mailer == "POP3") + { + if (!mailbox.ok()) + { + if (!mailbox.logon(get(F_SERVER), get(F_USER), get(F_PASSWORD))) + break; + } + if (!mailbox.remove(id)) + error_box("Impossibile cancellare il messagio POP3 %s", (const char*)id); + } + else + { + TMail_message* msg = new TMail_message(""); + msg->set_id(id); + mapidel.add(msg); + } + sf.destroy(nrow); + } + mailbox.logoff(); + + if (mapidel.items() > 0) + { + xvt_statbar_set("Eliminazione messaggi MAPI..."); + do_events(); + mapidel.remove(); + } + + xvt_statbar_set("Pronto"); + do_events(); +} + +void TMailer_mask::expand_tabs(TString& str, const int tab) const +{ + int start = 0; + for (int i = 0; str[i]; i++) + { + switch(str[i]) + { + case '\n': + case '\r': + start = i+1; + break; + case '\t': + { + const int t = tab - ((i-start) % tab) - 1; + str[i] = ' '; + if (t > 0) + { + TString80 spac; spac.spaces(t); + str.insert(spac, i+1); + i += t; + } + } + break; + default: + break; + } + } +} + +int TMailer_mask::fill_messages() +{ + TWait_cursor hourglass; + + TMail_messages box; + + TString server(get(F_SERVER)); + TString user(get(F_USER)); + TString password(get(F_PASSWORD)); + TMail_box mailbox; + if (mailbox.default_params(server, user, password)) + { + set(F_SERVER, server); + set(F_USER, user); + set(F_PASSWORD, password); + } + + int totmapi = 0; + + if (get_bool(F_MAPI)) + { + xvt_statbar_set("Ricezione messaggi MAPI..."); + do_events(); + totmapi = box.get(); + } + + xvt_statbar_set("Ricezione messaggi POP3..."); + do_events(); + mailbox.logon(server, user, password); + mailbox.get(box); + mailbox.logoff(); + + TSheet_field& sf = sfield(F_MESSAGES); + sf.destroy(); + + for (int m = 0; m < box.items(); m++) + { + TMail_message& msg = box.msg(m); + TToken_string& row = sf.row(m); + row.add(msg.sender(), sf.cid2index(F_SENDER)); + row.add(msg.date(), sf.cid2index(F_DATE)); + const real t = msg.time(); + row.add(t.string("@@:@@:@@"), sf.cid2index(F_TIME)); + row.add(msg.subject(), sf.cid2index(F_SUBJECT)); + expand_tabs(msg); + row.add(msg, sf.cid2index(F_BODY)); + row.add(m= LF_USER && filenum < prefix().items()) + { + TLocalisamfile isf(filenum); + ok = isf.get_relapp(app); + } + } + else + { + const int len = file.len(); + if (len == 3 || (len == 4 && file[0] == '%')) + { + TTable table(file); + ok = table.get_relapp(app); + } + } + return ok; +} + +bool TMailer_mask::save_curr_line() +{ + TSheet_field& sf = sfield(F_MESSAGES); + TMask& m = sf.sheet_mask(); + const int nrow = sf.selected(); + TToken_string& row = sf.row(nrow); + + const TString& msg = m.get(F_BODY); + if (msg.find("[Transaction]") < 0) + return FALSE; // It's not a transaction + + TFilename appname; + if (!file2app(m.get(F_SUBJECT), appname)) + return FALSE; // It hasn't a valid application + + TFilename tmp; tmp.temp(); + ofstream outf(tmp); + outf << msg; + outf.close(); + + const TString old_mailto = set_ini_var(CONFIG_INSTALL, "Main", "MailTo", ""); + + appname << " /i" << tmp; + TExternal_app app(appname); + bool ok = app.run() == NOERR; + if (ok) + { + TConfig ini(tmp, "Transaction"); + ok = ini.get("Result") == "OK"; + } + + ::remove(tmp); + + if (ok) + { + if (m.is_running()) + { + m.set(F_CHECKED, "X"); + m.stop_run(K_AUTO_ENTER); + } + else + { + row.add("X", 0); + sf.force_update(nrow); + } + } + + // Restore mail recipient + if (old_mailto.not_empty()) + set_ini_var(CONFIG_INSTALL, "Main", "MailTo", old_mailto); + + return TRUE; +} + +void TMailer_mask::save_all_lines() +{ + TWait_cursor hourglass; + TSheet_field& sf = sfield(F_MESSAGES); + TString body; + + bool one_saved = FALSE; + FOR_EACH_SHEET_ROW(sf, nrow, row) if (*row->get(0) != 'X') + { + row->get(sf.cid2index(F_BODY), body); + if (body.find("[Transaction]") >= 0) + { + sf.select(nrow); + one_saved |= save_curr_line(); + } + } + + if (one_saved && yesno_box("Si desidera eliminare i messaggi processati?")) + { + test_delete(); + fill_messages(); + } +} + +bool TMailer_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_MESSAGES: + if (e == fe_init) + { + if (!field(F_SERVER).empty() && + !field(F_USER).empty() && + !field(F_PASSWORD).empty()) + fill_messages(); + } else + if (e == se_query_add) + { + test_delete(); + fill_messages(); + return FALSE; + } + break; + case DLG_USER: + if (e == fe_button) + save_curr_line(); + break; + case DLG_SAVEREC: + if (e == fe_button) + save_all_lines(); + break; + case DLG_DELREC: + if (e == fe_button) + { + test_delete(); + fill_messages(); + return FALSE; + } + break; + case F_FILE: + if (jolly == 3) + { + if (e == fe_button) + { + TMask& m = o.mask(); + TArray_sheet sht(-1,-1,-4,-4,"Selezione archivio", "Codice@6R|Descrizione archivio@70"); + const TPrefix& pref = prefix(); + const int total = pref.items(); + if (total > 0) + { + TWait_cursor hourglass; + for (int i = LF_USER; i < total; i++) + { + TToken_string* row = new TToken_string; + *row << i; + row->add(pref.description(*row)); + sht.rows_array().add(row); + } + sht.select(m.get_int(o.dlg()) - LF_USER); + } + if (sht.run() == K_ENTER) + m.set(o.dlg(), sht.selected() + LF_USER); + } + } + break; + case F_EXPR: + if (jolly == 3) + { + if (e == fe_modify || e == fe_close) + { + TAutomask& m = (TAutomask&)o.mask(); + const int num = m.get_int(F_FILE); + TFilter_expr expr(m, num, o.get()); + return expr.error() == 0; + } + } + break; + default: + break; + } + return TRUE; +} + +void TMailer_mask::save_sheet(TConfig& ini, short dlg, const char* var) const +{ + TSheet_field& sf = sfield(dlg); + FOR_EACH_SHEET_ROW(sf, r, row) + ini.set(var, *row, NULL, TRUE, r); +} + +void TMailer_mask::load_sheet(TConfig& ini, short dlg, const char* var) +{ + TSheet_field& sf = sfield(dlg); + sf.destroy(); + for (int r = 0; ini.exist(var, r); r++) + sf.row(r) = ini.get(var, NULL, r); +} + +void TMailer_mask::save() const +{ + TConfig ini(CONFIG_DITTA, "MailTransactions"); + ini.remove_all(); + ini.set("Server", get(F_SERVER)); + ini.set("User", get(F_USER)); + ini.set("Password", encode(get(F_PASSWORD))); + save_sheet(ini, F_ADDRESSES, "Recipient"); + save_sheet(ini, F_PARAMS, "Filter"); +} + +void TMailer_mask::load() +{ + TConfig ini(CONFIG_DITTA, "MailTransactions"); + set(F_SERVER, ini.get("Server")); + set(F_USER, ini.get("User")); + set(F_PASSWORD, decode(ini.get("Password"))); + load_sheet(ini, F_ADDRESSES, "Recipient"); + load_sheet(ini, F_PARAMS, "Filter"); +} + +TMailer_mask::TMailer_mask() : TAutomask("ba7100a") +{ + load(); +} + +TMailer_mask::~TMailer_mask() +{ + save(); +} + +/////////////////////////////////////////////////////////// +// TMailer +/////////////////////////////////////////////////////////// + +class TMailer : public TSkeleton_application +{ +public: + virtual void main_loop(); +}; + +void TMailer::main_loop() +{ + open_files(LF_USER, 0); + TMailer_mask mm; + mm.run(); +} + +int ba7100(int argc, char* argv[]) +{ + TMailer app; + app.run(argc, argv, "Postino"); + return 0; +} diff --git a/ba/ba7100a.h b/ba/ba7100a.h new file mode 100755 index 000000000..51083ecd8 --- /dev/null +++ b/ba/ba7100a.h @@ -0,0 +1,25 @@ +#define F_SERVER 201 +#define F_USER 202 +#define F_PASSWORD 203 +#define F_MAPI 204 + +#define F_MESSAGES 205 +#define F_ADDRESSES 206 +#define F_PARAMS 207 + +#define F_CHECKED 101 +#define F_SENDER 102 +#define F_DATE 103 +#define F_TIME 104 +#define F_SUBJECT 105 +#define F_BODY 106 +#define F_MAILER 107 +#define F_ID 108 + +#define F_DEST 101 +#define F_GROUP 102 + +#define F_FILE 102 +#define F_OPERATOR 103 +#define F_EXPR 104 + diff --git a/ba/ba7100a.uml b/ba/ba7100a.uml new file mode 100755 index 000000000..192367a11 --- /dev/null +++ b/ba/ba7100a.uml @@ -0,0 +1,230 @@ +#include "ba7100a.h" + +TOOLBAR "Toolbar" 0 19 78 3 + +BUTTON DLG_SAVEREC 10 2 +BEGIN + PROMPT -13 -11 "" + PICTURE BMP_SAVEREC + PICTURE BMP_SAVERECDN +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -11 "" + PICTURE BMP_DELREC + PICTURE BMP_DELRECDN +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -33 -11 "" + PICTURE BMP_QUIT + PICTURE BMP_QUITDN +END + +ENDPAGE + +PAGE "Transazioni" -1 -1 78 20 + +BOOLEAN F_MAPI +BEGIN + PROMPT 1 0 "Preleva messaggi MAPI" +END + +STRING F_SERVER 80 28 +BEGIN + PROMPT 1 1 "Server " +END + +STRING F_USER 32 8 +BEGIN + PROMPT 41 1 "Utente " +END + +STRING F_PASSWORD 32 8 +BEGIN + PROMPT 61 1 "Password " + FLAGS "*" +END + +SPREADSHEET F_MESSAGES +BEGIN + PROMPT 0 2 "" + ITEM "@1" + ITEM "Da@40" + ITEM "Data@10" + ITEM "Ora@8" + ITEM "Soggetto@50" + ITEM "Messaggio@50" + ITEM "Mailer@4" + ITEM "Id@64" +END + +ENDPAGE + +PAGE "Parametri" -1 -1 78 20 + +SPREADSHEET F_ADDRESSES 0 6 +BEGIN + PROMPT 0 1 "" + ITEM "Indirizzo@50" + ITEM "Gruppo@50" +END + +SPREADSHEET F_PARAMS +BEGIN + PROMPT 0 8 "" + ITEM "Indirizzo@40" + ITEM "File" + ITEM "OP@2" + ITEM "Filtro@64" +END + +ENDPAGE + +ENDMASK + +PAGE "Message" -1 -1 62 19 + +BOOLEAN F_CHECKED +BEGIN + PROMPT 48 0 "Trasferito" +END + +STRING F_SENDER 80 50 +BEGIN + PROMPT 1 2 "Da " + FLAGS "D" +END + +DATE F_DATE +BEGIN + PROMPT 1 3 "Data " + FLAGS "D" +END + +STRING F_TIME 8 +BEGIN + PROMPT 28 3 "Ora " + FLAGS "D" +END + +STRING F_SUBJECT 256 50 +BEGIN + PROMPT 1 4 "Soggetto " +END + +MEMO F_BODY 60 12 +BEGIN + PROMPT 1 5 "Messaggio" +END + +STRING F_MAILER 4 +BEGIN + PROMPT 1 0 "Mailer " + FLAGS "D" +END + +STRING F_ID 512 50 +BEGIN + PROMPT 1 1 "Numero " + FLAGS "D" +END + +BUTTON DLG_USER 10 2 +BEGIN + PROMPT -12 -1 "" + PICTURE BMP_SAVEREC + PICTURE BMP_SAVERECDN +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +ENDMASK + +PAGE "Indirizzi" -1 -1 62 6 + +STRING F_DEST 50 +BEGIN + PROMPT 1 1 "Indirizzo " + CHECKTYPE REQUIRED +END + +STRING F_GROUP 50 +BEGIN + PROMPT 1 2 "Gruppo " +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" + PICTURE BMP_DELREC + PICTURE BMP_DELRECDN +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK + +PAGE "Parametri" -1 -1 62 12 + +STRING F_DEST 50 +BEGIN + PROMPT 1 1 "Indirizzo " +END + +NUMBER F_FILE 3 +BEGIN + PROMPT 1 2 "File " + FLAGS "B" + CHECKTYPE REQUIRED +END + +LIST F_OPERATOR 1 3 +BEGIN + PROMPT 46 3 "Operatore " + ITEM "A|And" + ITEM "O|Or" +END + +MEMO F_EXPR 60 -3 +BEGIN + PROMPT 1 3 "Espressione " +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" + PICTURE BMP_DELREC + PICTURE BMP_DELRECDN +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK diff --git a/ba/ba883.cpp b/ba/ba883.cpp index a9f32b02f..b3f7db1f9 100755 --- a/ba/ba883.cpp +++ b/ba/ba883.cpp @@ -369,8 +369,7 @@ bool TTab_application::user_create() TString16 m; m << "BATB" << t; _msk = new TMask(m) ; - TString tit; - _msk->get_caption(tit); + TString tit; _msk->get_caption(tit); set_title(tit); return TRUE; diff --git a/ba/bainst.cpp b/ba/bainst.cpp new file mode 100755 index 000000000..b0bbc6061 --- /dev/null +++ b/ba/bainst.cpp @@ -0,0 +1,537 @@ +#include +#include +#include +#include +// prototipi +#include "bainsta.h" +#include "bainst.h" + +// ******************************** +// classe TSystemtempfile +// ******************************** + + +// classe provvisoria per i system file temporanei, ovvero file temporanei con +// caricamento/scaricamento +// @doc EXTERNAL + +// @mfunc Importa un file ascii +// +// @rdesc Ritorna NOERR se l'operazione di lettura e' riuscita, altrimenti il codice di +// di errore generato (vedi ). +int TSystemtempfile::load( + const char* from, // @parm Nome del file da importare + char fs, // @parm Carattere separatore di campo (default ) + char fd, // @parm Carattere delimitatore di campi (default '\\0') + char rs, // @parm Carattere separatore di record (default '\\n') + bool vis, // @parm Indica se visualizzare lo stato dell'operazione (default TRUE) + bool extended) // @parm Indica se interpretare alcune stringhe come macro (default FALSE) + +// @comm Se

e' TRUE e trova alcune stringhe col formato %stringa% (es. %frm%) +// ne sostituisce i valori (es. ditta corrente). + +// @xref + +{ + FILE* fl = fopen(from, "r"); + int err=NOERR; + if (fl == NULL) + { + error_box("Non riesco ad aprire il file %s",from); + return 2; + } + TRecnotype r = 0, e = 0, nitems = 0, nread = 0; + TString16 firm, year, attprev("00000"); + + if (extended) + { + TDate d(TODAY); + TLocalisamfile ditte(LF_NDITTE); + + firm.format("%05ld", prefix().get_codditta()); + year.format("%04d", d.year()); + ditte.zero(); + ditte.put("CODDITTA", firm); + if (ditte.read() == NOERR) + attprev = ditte.get("CODATTPREV"); + } + if (fl == NULL) + { + clearerr(fl); + setstatus(err); + return err; + } + char w[80]; + while ((fgets(w, 80, fl) != NULL)) + { + if (strncmp(w, "[Data]", 6) == 0) + { + nitems = ftell(fl); + break; + } + } + fseek(fl, 0L, SEEK_END); + nitems = ftell(fl) - nitems; + fclose(fl); + TScanner f(from); + + //open(); + + TToken_string s(1024, fs); + bool fixedlen = (fs == '\0'); + int nflds = curr().items(); + TArray fld(nflds); + int len[MaxFields]; + TString sfd(3); + TString s1(64); + //bool lcf = FALSE; + + if (f.paragraph("Header")) + { + f.equal(); + const long level = atol(f.line()); + if (level > get_std_level()) + error_box("L'archivio %s e' stato generato con gli archivi di livello %ld%/%ld.\n Il livello attuale e' %ld/%ld.\n Convertire gli archivi e ripetere l' operazione.", + from, level/100, level%100, get_std_level()/100, get_std_level()%100); + //lcf = getlcf(level); + nflds = 0; + TToken_string s2(f.line()); + int p = s2.find('='); + if (p > 0) + { + s1 = s2.left(p); + s2.ltrim(p+1); + } + else s1.cut(0); + while (s1 == "Fields") + { + for (const char * fd = s2.get(); fd != NULL; fd = s2.get()) + { + TToken_string wfd(fd, ','); + fld.add(new TString(wfd.get())); + len[nflds] = wfd.get_int(); + nflds++; + } + s2 = f.line(); + p = s2.find('='); + if (p > 0) + { + s1 = s2.left(p); + s2.ltrim(p+1); + } + else s1.cut(0); + } + } + else + { + for (int j = 0; j < nflds; j++) + { + fld.add(TString(curr().fieldname(j)), j); + const TString & wfld = (const TString & ) fld[j]; + len[j] = (curr().type(wfld) == _datefld) ? 10 : curr().length(wfld); + } + } + if (!f.paragraph("Data")) + { + error_box("Formato dei dati non valido"); + //close(); + err = 1; + setstatus(err); + return err; + } + + if (fd) sfd << fd; + int last = NOERR; + + s1.format("Imp. archivio %s\n%6ld records %6ld errori - %3d", filename(), r, e, last); + TProgind p(nitems, s1, TRUE, TRUE, 70); + s = f.line(); + while (s.not_empty() && !p.iscancelled()) + { + if (extended) + { + int p, i; + + while ((p = s.find("%yr%")) >= 0) + for (i = 0; i < 4; i++) s[p + i] = year[i]; + while ((p = s.find("%frm%")) >= 0) + for (i = 0; i < 5; i++) s[p + i] = firm[i]; + while ((p = s.find("%att%")) >= 0) + for (i = 0; i < 5; i++) s[p + i] = attprev[i]; + } + if ((r + e) % 50 == 0) + { + s1.format("Imp. archivio %s\n%6ld records %6ld errori - %3d", filename(), r, e, last); + p.set_text(s1); + } + p.setstatus(nread + 1); + nread += s.len() + 1; + zero(); + if (fixedlen) + { + int pos = 0; + for (int j = 0; j < nflds; j++) + { + s1 = s.mid(pos,len[j]); + s1.rtrim(); + put((const TString&) fld[j], s1); + pos += len[j]; + } + } + else + { + s.restart(); + for (int j = 0; j < nflds; j++) + { + char* s2 = (char*) s.get(); + if (fd) + { + s2++; + s2[strlen(s2) - 1] = '\0'; + } + put((const TString&) fld[j], s2); + } + } + if (write() == NOERR) r++; + else + { +#ifdef DBG + yesnofatal_box("Numero linea relativa all'errore: %ld",r+e+1); +#endif + e++; + last = status(); + } + s = f.line(); + } + s1.format("Imp. archivio %s\n%6ld records %6ld errori - %3d", filename(), r, e, last); + p.set_text(s1); + //close(); + setstatus(err); + return err; +} + +// @doc EXTERNAL + +// @mfunc Esporta VERSO un file ascii. +// +// @rdesc Ritorna NOERR se l'operazione di esportazione e' riuscita, altrimenti il codice di +// di errore generato (vedi ). +int TSystemtempfile::dump( + const char* to, // @parm Nome del file verso quale esportare + int nkey, // @parm Numero della chiave di ordinamento con cui scaricare i dati (defualt 1) + char fs, // @parm Carattere seperatore di campo (defualt ) + char fd, // @parm Carattere delimitatore di campo (default '\\0') + char rs, // @parm Carattere separatore di record (default '\\n') + bool vis, // @parm Indica se visualizzare lo stato dell'operazione (defualt TRUE) + bool withdeleted) // @parm Indica se scaricare anche i record cancellati (dafault FALSE) + +// @xref + +{ + FILE* f = fopen(to, "w"); + + if (f == NULL) + { + setstatus(2); + return 2; + } + + if (withdeleted) nkey = 0; + int err = ferror(f); + + //open(FALSE, nkey ? TRUE : FALSE); + TString s(512); + bool fixedlen = (fs == '\0'); + int nflds = curr().items(); + TArray fld(nflds); + TBit_array rjust(nflds); + int len[MaxFields]; + + for (int j = 0; j < nflds; j++) + { + fld.add(TString(curr().fieldname(j)), j); + const TString & wfld = (const TString&) fld[j]; + const TFieldtypes t = curr().type(wfld); + rjust.set(j, t == _intfld || t == _longfld || t == _realfld || + t == _wordfld || t == _intzerofld || t == _longzerofld); + len[j] = (t == _datefld) ? 10 : curr().length(wfld); + } + TRecnotype i = 0; + const TRecnotype nitems = nkey ? items() : filehnd()->d->EOD; + s.format("Esportazione archivio %s", filename()); + TProgind p(nitems, s, TRUE, TRUE, 70); + TString s1; + + fprintf(f, "[Header]\nVersion=%ld", prefix().filelevel()); + for (int k = 0; k < nflds; k++) + { + if ((k % 10) == 0) fprintf(f, "\nFields="); + else fprintf(f, "|"); + fprintf(f, "%s,%d", (const char *) (const TString&) fld[k], len[k]); + } + fprintf(f, "\n\n[Data]\n"); + if (nkey) + { + setkey(nkey); + for ( first(); status() == NOERR && !p.iscancelled(); next(), i++) + { + p.setstatus(i + 1); + s = ""; + for (j = 0; j < nflds; j++) + { + if (fixedlen) + { + s1 = get((const TString&)fld[j]); + if (rjust[j]) s1.right_just(len[j]); + else s1.left_just(len[j]); + } + else + { + s1 = ""; + if (j && fs) s1 << fs; + if (fd) s1 << fd; + s1 << get((const TString&)fld[j]); + if (fd) s1 << fd; + } + s << s1; + } + fprintf(f, "%s%c", (const char*) s, rs); + } + } + else + { + for (i = 0; i < nitems && !p.iscancelled(); i++) + { + zero(); + p.setstatus(i + 1); + readat(i + 1); + s=""; + if (withdeleted || curr().valid()) + { + for (j = 0; j < nflds; j++) + { + if (fixedlen) + { + s1 = get((const TString&)fld[j]); + if (rjust[j]) s1.right_just(len[j]); + else s1.left_just(len[j]); + } + else + { + s1 = ""; + if (j && fs) s1 << fs; + if (fd) s1 << fd; + s1 << get((const TString&)fld[j]); + if (fd) s1 << fd; + } + s << s1; + } + fprintf(f, "%s%c", (const char*) s, rs); + } + } + } + p.setstatus(nitems); + //close(); + fclose(f); + setstatus(err); + return err; +} + +// ******************************** +// classe TStd_filename +// ******************************** + +bool TStd_filename::check(bool verbose,const char * n) +{ + if (n && *n) + set(n); + insert("STD\\"); + if (!exist()) + { + *this = name(); + if (!exist()) + { + insert("STD\\"); + insert(prefix().get_studio()); + if (!exist()) + { + if (verbose) + error_box("Non riesco a trovare il file: %s", (const char *)name()); + cut(0); + return FALSE; + } + } + } + return TRUE; +} + + +bool TInstallmodule_app::create() +{ + TScanner scanner("prassi.aut"); + + bool ok = FALSE; + for (int aut = 0; aut<=module_number(); aut++) + { + scanner.line(); + } + _modcode=scanner.token().left(2); + _modname=scanner.token().mid(3); + + if (modal()) + { + TString16 maskname; + maskname.format("bainst%02d",module_number()); + _m = new TMask(maskname); + } + else + _m = NULL; + + TConfig ini("install.ini"); + TConfig praw(CONFIG_INSTALL); + _test_database = praw.get("TestDatabase","Main",-1,"Y") != "N"; + + return TSkeleton_application::create(); +} + +bool TInstallmodule_app::destroy() +{ + if (_m) delete _m; + return TSkeleton_application::destroy(); +} + +bool TInstallmodule_app::preload_mask() +{ + if (!test_database()) + { + _m->set(F_DEFAULTSDATA," "); + _m->disable(F_DEFAULTSDATA); + } + else + { + if (load_default_data()) + _m->set(F_DEFAULTSDATA,"X"); + } + return TRUE; +} + +void TInstallmodule_app::main_loop() +{ + bool ok =TRUE; + + if (modal()) + { + preload_mask(); + if (_m->run()!=K_QUIT) + { + if (_m->get_bool(F_DEFAULTSDATA)) + { + install_firm(); + install_com(); + } + } + else + ok =FALSE; + } + if (ok) + post_installer(); +} + +bool TInstallmodule_app::install_firm() +{ + // ciclo su ogni ditta + TStd_filename txtfile(module_code()); + txtfile << "tab.txt"; + if (txtfile.check()) + { + TLocalisamfile ditte(LF_NDITTE); + for (ditte.first(); !ditte.eof() ; ditte.next()) + { + const int newditta=ditte.get_int("CODDITTA"); + if (prefix().exist(newditta)) + { + set_firm(newditta); + TSystemisamfile tab(LF_TAB); + tab.load(txtfile); + } + } + // carica le tabelle nei file di default + TLocalisamfile tampone(LF_TAB); + TSystemtempfile tabstd(LF_TAB); + TFilename stdtabname(prefix().get_studio()); + stdtabname << "STD\\lf0005.txt"; + tabstd.load(txtfile); + tabstd.load(stdtabname); + tabstd.set_autodel(); + TFilename tempfile; + tempfile.temp(); + + // riconverte le macro delle date + tabstd.dump(tempfile); + TScanner scan(tempfile); + FILE *dest=fopen((const char *)stdtabname,"w"); + while (TRUE) { + TString &line=scan.line(); + if (line.empty()) break; + + int pos=(line.find("-0000")); + while (pos >= 0 ) + { + line.overwrite("%yr%",pos+1); + pos=(line.find("-0000")); + } + line << '\n' ; + fputs((const char * )line,dest); + } + fclose(dest); + } + return TRUE; +} + +bool TInstallmodule_app::install_com() +{ + bool ok=TRUE; + TStd_filename txtfile(module_code()); + txtfile << "tabcom.txt"; + if (txtfile.check()) + { + TSystemisamfile tabcom(LF_TABCOM); + tabcom.load(txtfile); + } + return ok; +} + +void TInstallmodule_app::run(int argc, char* argv[]) +{ + TString title("Installazione "); + title << module_name(); + TSkeleton_application::run(argc, argv,(const char* )title); +} + + +int main(int argc,char** argv) +{ + TApplication::check_parameters(argc, argv); + + int r=0; + if (argc < 2) return 0; + TFixed_string mod(argv[2]); + mod.lower(); + + if (mod == "cg") + r=bainst07(argc,argv); // pre/post installazione contabilità generale: + else if (mod == "at") + r=bainst17(argc, argv);// pre/post installazione avis + else if (mod == "ve") + r=bainst31(argc, argv);// pre/post installazione vendite: + else if (mod == "mg") + r=bainst32(argc, argv);// pre/post installazione magazzino: + else if (mod == "sv") + r=bainst38(argc, argv);// pre/post installazione statistiche: + else + r=bainst00(argc, argv);// pre/post installazione base + exit(r); + return 0; +} + + diff --git a/ba/bainst.h b/ba/bainst.h new file mode 100755 index 000000000..54a582c4f --- /dev/null +++ b/ba/bainst.h @@ -0,0 +1,66 @@ +#include +#include + +#define G_PREINST 1 +int bainst00(int argc, char** argv); +int bainst07(int argc, char** argv); +int bainst17(int argc, char** argv); +int bainst31(int argc, char** argv); +int bainst32(int argc, char** argv); +int bainst38(int argc, char** argv); + + +// classe provvisoria per i system file temporanei, ovvero file temporanei con +// caricamento/scaricamento +class TSystemtempfile : public TIsamtempfile +{ +public: +//bool getlcf( long flev); // @parm livello archivi di partenza della convesione + + int load(const char* from, char fs = '|', char fd = '\0', char rs = '\n', bool vis = TRUE, bool extended = FALSE) ; + + int dump(const char* to, int nkey = 1, char fs = '|', char fd = '\0', char rs = '\n', bool vis = TRUE, bool withdeleted = FALSE); + + TSystemtempfile(int logicnum) : + TIsamtempfile(logicnum,NULL) {} +}; + + + + +class TStd_filename : public TFilename +{ +public: + bool check(bool verbose=FALSE,const char * name=NULL); + ~TStd_filename () {} + TStd_filename () : TFilename(){} + TStd_filename (const char * n) : TFilename(n){} +}; + +class TInstallmodule_app: public TSkeleton_application +{ + bool _is_first_inst , _test_database ; + +protected: + TMask * _m ; + TString _modcode,_modname; + +protected: + bool test_database() {return _test_database;} + const char * module_name() const {return _modname;} + const char * module_code() const {return _modcode;} + + virtual bool load_default_data() const { return TRUE;} + virtual bool modal() const {return TRUE;} + virtual int module_number() const pure; + virtual bool preload_mask(); + virtual bool post_installer() {return TRUE;} + virtual bool install_com() ; // setta i dati comuni + virtual bool install_firm() ; // setta i dati ditta + + virtual void main_loop() ; + virtual bool create(); + virtual bool destroy(); +public: + void run(int argc, char* argv[]); +}; \ No newline at end of file diff --git a/ba/bainst.url b/ba/bainst.url new file mode 100755 index 000000000..f756c9e4b --- /dev/null +++ b/ba/bainst.url @@ -0,0 +1,21 @@ +#include + +/* ba1 -0 */ +MENU TASK_MENUBAR + SUBMENU MENU_FILE "~File" + + +/* ba1 -1 */ +MENUBAR MENU_BAR(1) + +MENU MENU_BAR(1) + SUBMENU MENU_FILE "~File" + +/* ba1 -1 */ +MENUBAR MENU_BAR(2) + +MENU MENU_BAR(2) + SUBMENU MENU_FILE "~File" + + + diff --git a/ba/bainst00.cpp b/ba/bainst00.cpp new file mode 100755 index 000000000..f5fe08794 --- /dev/null +++ b/ba/bainst00.cpp @@ -0,0 +1,62 @@ +#include +#include +#include +#include +#include +#include +#include "bainst.h" +#include "bainst07.h" + +class TInstall_BA : public TInstallmodule_app +{ +private: + +protected: + virtual bool modal() const {return FALSE;} + + virtual int module_number() const {return 0;} + virtual bool install_firm() {return TRUE;} // no firm installation + virtual bool install_com() {return TRUE;} // no com installation + virtual bool post_installer(); + +public: + virtual ~TInstall_BA () {} +}; + + +bool TInstall_BA::post_installer() +{ + // configurazione provvisoria dei programmi gestori di tabelle + if (!test_database()) + { + TConfig prassis(CONFIG_STUDIO); + const char *confapp="EdApp"; + const char *tabapp="TabPrg"; + // magazzino + prassis.set_paragraph("mg"); + prassis.set(tabapp,"mg0 -0"); + prassis.set(confapp,"mg0 -2 -1"); + // distinta base + prassis.set_paragraph("db"); + prassis.set(tabapp,"db0 -0"); + prassis.set(confapp,""); + // statistiche + prassis.set_paragraph("sv"); + prassis.set(tabapp,"sv0 -0"); + prassis.set(confapp,"sv0 -3"); + // provvigioni + prassis.set_paragraph("pr"); + prassis.set(tabapp,"pr0 -4"); + // MRP + prassis.set_paragraph("mr"); + prassis.set(tabapp,"mr0 -0"); + } + return TRUE; +} + +int bainst00(int argc, char** argv) +{ + TInstall_BA app; + app.run(argc, argv); + return 0; +} \ No newline at end of file diff --git a/ba/bainst01.h b/ba/bainst01.h new file mode 100755 index 000000000..76d7a290c --- /dev/null +++ b/ba/bainst01.h @@ -0,0 +1,3 @@ +#include "bainsta.h" +#define F_DATISTD 101 + diff --git a/ba/bainst02.h b/ba/bainst02.h new file mode 100755 index 000000000..b7597e6b9 --- /dev/null +++ b/ba/bainst02.h @@ -0,0 +1,2 @@ +#include "bainsta.h" +#define F_DATISTD 101 diff --git a/ba/baprassi.men b/ba/baprassi.men index 3a91f3c71..179a646aa 100755 --- a/ba/baprassi.men +++ b/ba/baprassi.men @@ -42,6 +42,7 @@ Item_08 = "Cariche sociali", "ba3 -0 %crs", "" Item_09 = "Vecchi cod.Attivita'", "ba3 -0 %ois", "" Item_10 = "Stati esteri", "ba3 -0 %sta", "" Item_11 = "Gestione profili deleghe e distinte", "ba2 -0", "" +Item_12 = "Nomenclatura combinata", "ba3 -0 %noc", "" [PRASSI_003] Caption = "Stampa tabelle" diff --git a/ba/batbcam.h b/ba/batbcam.h index b51d66eb4..e20961306 100755 --- a/ba/batbcam.h +++ b/ba/batbcam.h @@ -1,9 +1,8 @@ -#define FLD_TABCAM_CODVAL 100 -#define FLD_TABCAM_S0 101 -#define FLD_TABCAM_R0 102 -#define FLD_TABCAM_S7 103 -#define FLD_TABCAM_D0 104 -#define FLD_DECSCAM_I0 105 -#define FLD_TABCAM_I0 106 -#define FLD_CODVAL_COPY 200 -#define FLD_DATACAM_COPY 204 +#define FLD_TABCAM_CODVAL 101 +#define FLD_TABCAM_B1 102 +#define FLD_TABCAM_S0 103 +#define FLD_TABCAM_S4 104 +#define FLD_TABCAM_S7 105 +#define FLD_TABCAM_R10 106 +#define FLD_TABCAM_D0 107 +#define FLD_TABCAM_I2 108 diff --git a/ba/batbcam.uml b/ba/batbcam.uml index e2bd6449e..323cdf699 100755 --- a/ba/batbcam.uml +++ b/ba/batbcam.uml @@ -1,6 +1,6 @@ #include "batbcam.h" -TOOLBAR "" 0 20 0 2 +TOOLBAR "" 0 19 0 3 #include @@ -8,23 +8,26 @@ ENDPAGE PAGE "Cambi giornalieri" -1 -1 78 12 -GROUPBOX DLG_NULL 78 4 +GROUPBOX DLG_NULL 78 6 BEGIN - PROMPT 1 1 "" + PROMPT 1 1 "@bValuta" END STRING FLD_TABCAM_CODVAL 3 BEGIN - PROMPT 3 2 "Codice valuta " + PROMPT 2 3 "Codice " FLAGS "UZ" KEY 1 FIELD CODTAB[1,3] USE %VAL INPUT CODTAB FLD_TABCAM_CODVAL DISPLAY "Codice" CODTAB + DISPLAY "Contro EURO" B1 DISPLAY "Valuta@50" S0 OUTPUT FLD_TABCAM_CODVAL CODTAB[1,3] OUTPUT FLD_TABCAM_S0 S0 + OUTPUT FLD_TABCAM_I2 I2 + OUTPUT FLD_TABCAM_B1 B1 CHECKTYPE FORCED MESSAGE COPY,FLD_CODVAL_COPY WARNING "Valuta assente" @@ -32,25 +35,26 @@ END DATE FLD_DATACAM_COPY BEGIN - PROMPT 30 2 "" + PROMPT 9 5 "" FLAGS "D" FIELD D0 END DATE FLD_TABCAM_D0 BEGIN - PROMPT 25 2 "Data " + PROMPT 2 5 "Data " FIELD CODTAB[4,11] FLAGS "R" KEY 1 - USE CAM SELECT CODTAB?(#FLD_TABCAM_CODVAL+"*") - JOIN %VAL TO CAM KEY 1 ALIAS 50 INTO CODTAB=CODTAB[1,3] +// USE CAM SELECT CODTAB?(#FLD_TABCAM_CODVAL+"*") +// JOIN %VAL TO CAM KEY 1 ALIAS 50 INTO CODTAB=CODTAB[1,3] + USE CAM SELECT TRIM(CODTAB[1,3])==#FLD_TABCAM_CODVAL + JOIN %VAL TO CAM KEY 1 ALIAS 50 INTO CODTAB==(TRIM(CODTAB[1,3])) INPUT CODTAB[1,3] FLD_TABCAM_CODVAL SELECT // PER INPUT INPUT CODTAB[4,11] FLD_TABCAM_D0 DISPLAY "Valuta" CODTAB[1,3] DISPLAY "Data@10" D0 - DISPLAY "Cambio@15R" R10 - DISPLAY "Descrizione@50" -50->S0 + DISPLAY "Descrizione@50" 50@->S0 OUTPUT FLD_TABCAM_CODVAL CODTAB[1,3] OUTPUT FLD_TABCAM_D0 D0 OUTPUT FLD_DATACAM_COPY D0 @@ -61,38 +65,51 @@ END STRING FLD_TABCAM_S0 50 BEGIN - PROMPT 3 3 "Descrizione " + PROMPT 20 3 "" + USE %VAL KEY 2 + INPUT S0 FLD_TABCAM_S0 + DISPLAY "Valuta@50" S0 + DISPLAY "Codice" CODTAB + DISPLAY "Contro EURO" B1 + COPY OUTPUT FLD_TABCAM_CODVAL + CHECKTYPE REQUIRED + KEY 1 +END + +GROUPBOX DLG_NULL 78 5 +BEGIN + PROMPT 1 8 "@bCambio" +END + +NUMBER FLD_TABCAM_I2 1 +BEGIN + PROMPT 2 10 "Decimali " FLAGS "D" END -GROUPBOX DLG_NULL 78 3 +NUMBER FLD_TABCAM_S4 15 5 BEGIN - PROMPT 1 5 "" -END - -NUMBER FLD_TABCAM_R0 15 5 -BEGIN - PROMPT 3 6 "Cambio " - FIELD R10 + PROMPT 20 10 "Cambio " + FIELD S4 PICTURE ".5" FLAGS "U" END -NUMBER FLD_TABCAM_I0 7 +NUMBER FLD_TABCAM_R10 15 5 BEGIN - PROMPT 32 6 "ogni " - FIELD I10 - FLAGS "U" - NUM_CALC IF(#THIS_FIELD==0,1,#THIS_FIELD) + PROMPT 20 10 "Cambio " + FIELD R10 + PICTURE ".5" + FLAGS "HU" END -STRING FLD_CODVAL_COPY 3 +BOOLEAN FLD_TABCAM_B1 BEGIN - PROMPT 46 6 "" + PROMPT 50 10 "Contro EURO" + FIELD B1 FLAGS "D" END - ENDPAGE ENDMASK diff --git a/ba/batbiva.uml b/ba/batbiva.uml index b8e0894e7..b0382cd63 100755 --- a/ba/batbiva.uml +++ b/ba/batbiva.uml @@ -167,6 +167,7 @@ BEGIN ITEM "B1|Ammontare op. es. escluse da nr. 1 a 9 e 11 art. 10" ITEM "B2|Ammontare op. es. di cui al nr. 11 art. 10" ITEM "B3|Ammontare op. es. di cui ai nr. 1 a 9 art. 10" + ITEM "B4|Ammontare op. es. di cui all'art 10 nr. 27 quinquies" ITEM "G7A|Cessioni intracomunitarie non imponibili" ITEM "G7B|Prestazioni di servizi non soggette all'imposta" END diff --git a/ba/batbnoc.h b/ba/batbnoc.h new file mode 100755 index 000000000..22a05ed9f --- /dev/null +++ b/ba/batbnoc.h @@ -0,0 +1,9 @@ +#define NOC_CODICE1 101 +#define NOC_CODICE2 102 +#define NOC_CODICE3 103 +#define NOC_DESCR 104 + +#define NOC_UMS_OBB 201 +#define NOC_UMS_CODICE 202 +#define NOC_UMS_DESCR 203 + diff --git a/ba/batbnoc.uml b/ba/batbnoc.uml new file mode 100755 index 000000000..89a732b3b --- /dev/null +++ b/ba/batbnoc.uml @@ -0,0 +1,109 @@ +#include "batbnoc.h" + +TOOLBAR "Toolbar" 0 19 0 3 + +#include + +ENDPAGE + +PAGE "Nomenclatura Combinata" -1 -1 78 18 + +GROUPBOX DLG_NULL 78 7 +BEGIN + PROMPT 1 1 "@bCodice Nomenclatura" +END + +STRING NOC_CODICE1 4 +BEGIN + PROMPT 2 3 "Codice " + FLAGS "U" + USE %NOC + INPUT CODTAB[1,4] NOC_CODICE1 + INPUT CODTAB[5,6] NOC_CODICE2 + INPUT CODTAB[7,8] NOC_CODICE3 + DISPLAY "Codice@8" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT NOC_CODICE1 CODTAB[1,4] + OUTPUT NOC_CODICE2 CODTAB[5,6] + OUTPUT NOC_CODICE3 CODTAB[7,8] + OUTPUT NOC_DESCR S0 + CHECKTYPE REQUIRED + FIELD CODTAB[1,4] + KEY 1 +END + +STRING NOC_CODICE2 2 +BEGIN + PROMPT 24 3 "" + FLAGS "U" + COPY ALL NOC_CODICE1 + CHECKTYPE REQUIRED + FIELD CODTAB[5,6] + KEY 1 +END + +STRING NOC_CODICE3 2 +BEGIN + PROMPT 32 3 "" + FLAGS "U" + COPY ALL NOC_CODICE1 + CHECKTYPE REQUIRED + FIELD CODTAB[7,8] + KEY 1 +END + +STRING NOC_DESCR 50 +BEGIN + PROMPT 2 5 "Descrizione " + USE %NOC KEY 2 + INPUT S0 NOC_DESCR + DISPLAY "Descrizione@60" S0 + DISPLAY "Codice@8" CODTAB + COPY OUTPUT NOC_CODICE1 + CHECKTYPE REQUIRED + FIELD S0 + KEY 2 +ENDPAGE + +GROUPBOX DLG_NULL 78 7 +BEGIN + PROMPT 1 8 "@bUnita' di misura supplementare" + FLAGS "R" +END + +LIST NOC_UMS_OBB 1 50 +BEGIN + PROMPT 2 10 "Obbligatorieta' " + ITEM " |Non obbligatoria" + ITEM "A|Obbligatoria per acquisti" + ITEM "C|Obbligatoria per cessioni" + ITEM "E|Obbligatoria per acquisti e cessioni" + FIELD S4 +END + +STRING NOC_UMS_CODICE 2 +BEGIN + PROMPT 2 12 "Descrizione " + USE %UMS + FLAGS "U" + INPUT CODTAB NOC_UMS_CODICE + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT NOC_UMS_CODICE CODTAB + OUTPUT NOC_UMS_DESCR S0 + CHECKTYPE NORMAL + FIELD S5 +END + +STRING NOC_UMS_DESCR 50 +BEGIN + PROMPT 20 12 "" + USE %UMS KEY 2 + INPUT S0 NOC_UMS_DESCR + DISPLAY "Descrizione@60" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT NOC_UMS_CODICE + CHECKTYPE NORMAL +END + +ENDMASK diff --git a/ba/batbpor.h b/ba/batbpor.h index b032db8ab..936e605c9 100755 --- a/ba/batbpor.h +++ b/ba/batbpor.h @@ -4,7 +4,8 @@ #define F_CODICE 101 #define F_DESCR 102 - +#define F_CONSEGNA 103 +#define F_TRASPORTO 104 diff --git a/ba/batbpor.uml b/ba/batbpor.uml index 95f8bc604..0e1f6d2ea 100755 --- a/ba/batbpor.uml +++ b/ba/batbpor.uml @@ -46,5 +46,41 @@ OUTPUT F_DESCR S0 CHECKTYPE REQUIRED END +LIST F_TRASPORTO 1 20 +BEGIN + PROMPT 4 7 "Modo di trasporto " + ITEM "1|Marittimo" + ITEM "2|Ferroviario" + ITEM "3|Stradale" + ITEM "4|Aereo" + ITEM "5|Spedizione postale" + ITEM "7|Installazioni fisse" + ITEM "8|Via acqua" + ITEM "9|Propulsione propria" + FIELD I0 +END + +STRING F_CONSEGNA 3 +BEGIN + PROMPT 4 9 "Condizioni consegna " + SHEET "Codice|Descrizione@45" + INPUT F_CONSEGNA + ITEM "EXW|Franco fabbrica" + ITEM "FCA|Franco vettore" + ITEM "FAS|Franco sotto bordo" + ITEM "FOB|Franco a bordo" + ITEM "CFR|Costo e nolo" + ITEM "CIF|Costo, assicurazione, nolo" + ITEM "CPT|Nolo/porto pagato fino a ..." + ITEM "CIP|Nolo/porto e assicurazione pagati fino a ..." + ITEM "DAF|Reso frontiera" + ITEM "DES|Reso franco bordo nave a destino" + ITEM "DEQ|Reso franco banchina" + ITEM "DDU|Reso non sdoganato" + ITEM "DDP|Reso sdoganato" + OUTPUT F_CONSEGNA + FIELD S3 +END + ENDPAGE ENDMASK diff --git a/ba/batbreg.h b/ba/batbreg.h index 2e472532a..9bf0b3acb 100755 --- a/ba/batbreg.h +++ b/ba/batbreg.h @@ -44,6 +44,8 @@ #define F_CODULC 163 #define F_CODLBU 164 #define F_RAGSOC 165 +#define F_REGSOSPEXT 166 +#define F_STAMPA_PLAFONDS 167 #define F_PRINTER 201 #define F_CONFIG 202 diff --git a/ba/batbreg.uml b/ba/batbreg.uml index 3ea2bb472..7c38d2bf7 100755 --- a/ba/batbreg.uml +++ b/ba/batbreg.uml @@ -305,11 +305,24 @@ BEGIN FIELD B1 GROUP GRP_VENDITE GRP_ACQUISTI GRP_NOGIORNMAG HELP "Indicare se il registro e' in sospensione d'imposta" + MESSAGE TRUE ENABLE,F_REGSOSPEXT + MESSAGE FALSE CLEAR,F_REGSOSPEXT END - + +LIST F_REGSOSPEXT 15 +BEGIN + PROMPT 29 5 "" + GROUP GRP_VENDITE GRP_ACQUISTI GRP_NOGIORNMAG + FLAGS "D" + FIELD I9 + ITEM "1|Normale" + ITEM "2|Volume d'affari" + ITEM "3|Liquidazione" +END + BOOLEAN F_STAMPA_CREDITO_ANNO_PREC BEGIN - PROMPT 46 5 "Stampa credito anno precedente" + PROMPT 48 5 "Stampa credito anno precedente" HELP "Indicare se si vuole la stampa del credito IVA dell'anno precedente" FIELD B4 GROUP GRP_ACQUISTI GRP_NOGIORNMAG @@ -317,7 +330,7 @@ END BOOLEAN F_CORRISP BEGIN - PROMPT 46 5 "Registro corrispettivi" + PROMPT 48 5 "Registro corrispettivi" HELP "Indicare se si tratta di registro dei corrispettivi" FIELD B0 GROUP GRP_VENDITE @@ -382,7 +395,7 @@ END BOOLEAN F_STAMPA_RIEPIL_SUL_REGISTRO BEGIN - PROMPT 46 7 "Stampa riepilogo liquidazione" + PROMPT 48 7 "Stampa riepilogo liquidazione" FIELD B6 GROUP GRP_VENDITE GRP_ACQUISTI GRP_RIEPIVA HELP "Indicare se stampare il riepilogo IVA delle aliquote utilizzate" @@ -408,6 +421,13 @@ BEGIN HELP "Indicare se stampare a fine periodo la liquidazione" END +BOOLEAN F_STAMPA_PLAFONDS +BEGIN + PROMPT 48 9 "Stampa plafonds " + FIELD S10 + GROUP GRP_VENDITE GRP_ACQUISTI GRP_RIEPIVA +END + NUMBER F_PROG_AVERE 18 BEGIN PROMPT 1 9 "Progressivo avere " @@ -425,14 +445,6 @@ BEGIN GROUP GRP_INCASSI GRP_NOGIORNMAG END -BOOLEAN F_VENTIL -BEGIN - PROMPT 46 9 "Attivita' con ventilazione" - HELP "Indicare se vengono registrate operazioni con ventilazione IVA" - FIELD B3 - GROUP GRP_ACQUISTI GRP_NOGIORNMAG -END - LIST F_MESE_STAMPA_ULTIMA_LIQ 10 BEGIN PROMPT 1 11 "Mese stampa ultima liquidazione " @@ -444,6 +456,14 @@ BEGIN GROUP GRP_VENDITE GRP_ACQUISTI GRP_RIEPIVA END +BOOLEAN F_VENTIL +BEGIN + PROMPT 48 11 "Attivita' con ventilazione" + HELP "Indicare se vengono registrate operazioni con ventilazione IVA" + FIELD B3 + GROUP GRP_ACQUISTI GRP_NOGIORNMAG +END + BOOLEAN F_STAMPA_SULLO_STESSO_REGISTRO BEGIN PROMPT 1 11 "Stampa sullo stesso registro" diff --git a/ba/batbval.h b/ba/batbval.h index 0c52fcea0..979184433 100755 --- a/ba/batbval.h +++ b/ba/batbval.h @@ -1,14 +1,10 @@ -#define F_CODE 101 -#define F_DESC 102 -#define F_DECIMALS 103 -#define F_LASTDATE 104 - -#define F_CUR_CHANGE 105 -#define F_CUR_MULT 106 -#define F_CUR_CODE 107 - -#define F_STD_CHANGE 108 -#define F_STD_MULT 109 -#define F_STD_CODE 110 -#define F_DECIMALSPR 111 - +#define VAL_CODE 101 +#define VAL_DESC 102 +#define VAL_DECIMALS 110 +#define VAL_DECIMALS_PRICES 111 +#define VAL_DECIMALS_CHANGE 112 +#define VAL_CHANGE 121 +#define VAL_CHANGE_OLD 122 +#define VAL_LASTDATE 130 +#define VAL_EURO 131 +#define VAL_INEURO 133 diff --git a/ba/batbval.uml b/ba/batbval.uml index 07bc5726a..760e7183b 100755 --- a/ba/batbval.uml +++ b/ba/batbval.uml @@ -1,6 +1,6 @@ #include "batbval.h" -TOOLBAR "" 0 20 0 2 +TOOLBAR "" 0 -3 0 0 #include @@ -10,125 +10,121 @@ PAGE "Valute" -1 -1 78 12 GROUPBOX DLG_NULL 78 4 BEGIN - PROMPT 1 1 "" + PROMPT 1 1 "@bCodice" FLAGS "R" END -STRING F_CODE 3 +STRING VAL_CODE 3 BEGIN PROMPT 2 2 "Codice " FIELD CODTAB FLAGS "UZ" KEY 1 USE %VAL - INPUT CODTAB F_CODE + INPUT CODTAB VAL_CODE DISPLAY "Codice" CODTAB DISPLAY "Valuta@50" S0 - OUTPUT F_CODE CODTAB - OUTPUT F_DESC S0 -// MESSAGE COPY,F_CUR_CODE|COPY,F_STD_CODE + OUTPUT VAL_CODE CODTAB + OUTPUT VAL_DESC S0 HELP "Codice della valuta" CHECKTYPE REQUIRED END -STRING F_DESC 50 +BOOLEAN VAL_EURO +BEGIN + PROMPT 40 2 "Codice valuta dell'EURO" + FIELD B0 + MESSAGE FALSE ENABLE,VAL_INEURO|ENABLE,VAL_DECIMALS + MESSAGE TRUE CLEAR,VAL_INEURO|CLEAR,VAL_DECIMALS|"2",VAL_DECIMALS +END + +STRING VAL_DESC 50 BEGIN PROMPT 2 3 "Descrizione " FIELD S0 KEY 2 USE %VAL KEY 2 - INPUT S0 F_DESC + INPUT S0 VAL_DESC DISPLAY "Valuta@60" S0 DISPLAY "Codice@10" CODTAB - COPY OUTPUT F_CODE + COPY OUTPUT VAL_CODE HELP "Descrizione della valuta" CHECKTYPE REQUIRED WARNING "Manca la descrizione" END -NUMBER F_DECIMALS 1 -BEGIN - PROMPT 2 5 "Decimali per importi " - FIELD I0 - NUM_EXPR (#THIS_FIELD>=0)&&(#THIS_FIELD<=3) - WARNING "Si possono specificare al massimo 3 cifre decimali" -END - -NUMBER F_DECIMALSPR 1 -BEGIN - PROMPT 2 6 "Decimali per prezzi " - FIELD I1 - NUM_EXPR (#THIS_FIELD>=0)&&(#THIS_FIELD<=3) - WARNING "Si possono specificare al massimo 3 cifre decimali" -END - GROUPBOX DLG_NULL 78 3 BEGIN - PROMPT 1 7 "Cambio attuale" + PROMPT 1 6 "@bDecimali" FLAGS "R" END -NUMBER F_CUR_CHANGE 15 5 +LIST VAL_DECIMALS 1 10 BEGIN - PROMPT 2 8 "Cambio " + PROMPT 2 7 "Decimali per importi " + ITEM "0|Nessuno" + ITEM "1|1 decimale" + ITEM "2|2 decimali" + ITEM "3|3 decimali" + FIELD I0 +END + +LIST VAL_DECIMALS_PRICES 1 10 +BEGIN + PROMPT 40 7 "Decimali per prezzi " + ITEM "0|Nessuno" + ITEM "1|1 decimale" + ITEM "2|2 decimali" + ITEM "3|3 decimali" + FIELD I1 + NUM_EXPR #THIS_FIELD>=#VAL_DECIMALS + WARNING "Si devono specificare almeno tanti decimali quanti quelli degli importi" +END + +GROUPBOX DLG_NULL 78 4 +BEGIN + PROMPT 1 10 "@bCambio standard" + FLAGS "R" +END + +LIST VAL_DECIMALS_CHANGE 1 10 +BEGIN + PROMPT 2 11 "Decimali per cambio " + ITEM "2|2 decimali" + ITEM "3|3 decimali" + ITEM "4|4 decimali" + ITEM "5|5 decimali" + ITEM "6|6 decimali" + FIELD I2 +END + +BOOLEAN VAL_INEURO +BEGIN + PROMPT 40 11 "Espresso in EURO" + FIELD B1 +END + +NUMBER VAL_CHANGE 15 5 +BEGIN + PROMPT 2 12 "Cambio " + FIELD S4 + FLAGS "U" +END + +NUMBER VAL_CHANGE_OLD 15 5 +BEGIN + PROMPT 2 12 "Cambio " FIELD R10 - PICTURE ".5" - FLAGS "U" -END - -/* -NUMBER F_CUR_MULT 7 -BEGIN - PROMPT 40 8 "ogni " - FIELD I10 - FLAGS "U" - NUM_CALC IF((#THIS_FIELD==0),1,#THIS_FIELD) + FLAGS "HU" END -STRING F_CUR_CODE 3 +DATE VAL_LASTDATE BEGIN - PROMPT 55 8 "" - FLAGS "D" -END -*/ - -DATE F_LASTDATE -BEGIN - PROMPT 62 8 "Data " + PROMPT 40 12 "Data " FIELD D0 HELP "Data di ultimo aggiornamento" END -/* -GROUPBOX DLG_NULL 78 3 -BEGIN - PROMPT 1 11 "Cambio standard" - FLAGS "R" -END - -NUMBER F_STD_CHANGE 15 5 -BEGIN - PROMPT 2 12 "Cambio " - FIELD R11 - PICTURE ".5" - FLAGS "U" -END - -NUMBER F_STD_MULT 7 -BEGIN - PROMPT 40 12 "ogni " - FIELD I11 - FLAGS "U" - NUM_CALC IF((#THIS_FIELD==0),1,#THIS_FIELD) -END - -STRING F_STD_CODE 3 -BEGIN - PROMPT 55 12 "" - FLAGS "D" -END -*/ - ENDPAGE ENDMASK diff --git a/ba/batbvet.uml b/ba/batbvet.uml index d7c877c67..728754787 100755 --- a/ba/batbvet.uml +++ b/ba/batbvet.uml @@ -12,7 +12,7 @@ BEGIN FLAGS "R" END -STRING F_CODVETT 5 +STRING F_CODVETT 6 BEGIN PROMPT 2 2 "Codice vettore " FIELD CODTAB diff --git a/ba/cgdll.cpp b/ba/cgdll.cpp new file mode 100755 index 000000000..3d2be2937 --- /dev/null +++ b/ba/cgdll.cpp @@ -0,0 +1,152 @@ +#include +#include +#include +#include +#include "cgdll.h" + +class TInstall_dll : public TSkeleton_application +{ +private: +bool _copy_dll, _makeini, _del_dll; + + bool CopiaDll(const char * dllname); + bool CreaExeIni(const char * exename); + +protected: + virtual void main_loop() ; + virtual bool create(); + bool CopiaDlls(); + bool InstallaExeIni(); + bool RemoveDlls(); +public: + virtual ~TInstall_dll () {} + virtual const char * extra_modules() const + {return "BA";} + virtual bool check_autorization() const + {return FALSE;} +}; + +bool TInstall_dll ::CopiaDll(const char * dllname) +{ + bool ok; + TFilename from("C:\\windows\\system"),to("."); + from.add(dllname); + to.add(dllname); + if (fexist(from)) + ok = fcopy(from, to); + else + warning_box("Copia impossibile : %s non è presente in %s", dllname, from.path()); + + return ok; +} + +// crea il .ini in \WINDOWS per i files exe copiati nella directory di EASYCAMPO +bool TInstall_dll ::CreaExeIni(const char * exename) +{ + TFilename ininame("C:\\WINDOWS"); + ininame.add(exename); + TFilename dllname; + + ininame.ext("ini"); + TConfig ini(ininame); + + dllname.currdir(); + dllname.add("xbs200.dll"); + ini.set_paragraph("Installable ISAMs"); + ini.set("FoxPro 2.0" ,dllname ); + ini.set("FoxPro 2.5" ,dllname ); + ini.set("dBASE III" ,dllname ); + ini.set("dBASE IV" ,dllname ); + + ini.set("Deleted","On","dBase ISAM"); + + ini.set("ParadoxNetStyle","3.x","Paradox ISAM" ); + return TRUE; +} + +// +bool TInstall_dll ::CopiaDlls() +{ + bool ok=TRUE; + ok &= CopiaDll("MSAES110.DLL" ); + ok &= CopiaDll("MSAJT112.DLL"); + ok &= CopiaDll("MSAJT200.DLL"); + ok &= CopiaDll("VBDB300.DLL"); + ok &= CopiaDll("VBRUN300.DLL"); + ok &= CopiaDll("XBS200.DLL"); + + return ok; +} +// cancella le dll dal WINDOws +bool TInstall_dll ::RemoveDlls() +{ + bool ok=TRUE; + ok &= (remove("c:\\windows\\system\\MSAES110.DLL" ) == 0); + ok &= (remove("c:\\windows\\system\\MSAJT112.DLL")== 0); + ok &= (remove("c:\\windows\\system\\MSAJT200.DLL")== 0); + ok &= (remove("c:\\windows\\system\\VBDB300.DLL")== 0); + ok &= (remove("c:\\windows\\system\\VBRUN300.DLL")== 0); + ok &= (remove("c:\\windows\\system\\XBS200.DLL")== 0); + + return ok; +} + + +bool TInstall_dll ::InstallaExeIni() +{ + bool ok; + + ok = fexist("MSAES110.DLL" ); + ok &= fexist("MSAJT112.DLL"); + ok &= fexist("MSAJT200.DLL"); + ok &= fexist("VBDB300.DLL"); + ok &= fexist("VBRUN300.DLL"); + ok &= fexist("XBS200.DLL"); + if (!ok) + error_box("Le DLL non sono presenti nel direttorio corrente"); + else + { + // copia dll (ex file PRASSI.PR inst.exe + ok &= CreaExeIni("CB0000.EXE"); + ok &= CreaExeIni("TRRICE.EXE"); + ok &= CreaExeIni("VCOPIA.EXE"); + } + return ok; +} + +bool TInstall_dll ::create() +{ + _copy_dll=TRUE, + _makeini=TRUE, + _del_dll=TRUE; + int c = argc(); + while (c>1) { + c--; + if (strcmp(argv(c),"-d")==0) + _del_dll=FALSE; + else if (strcmp(argv(c),"-c")==0) + _copy_dll=FALSE; + else if (strcmp(argv(c),"-i")==0) + _makeini=FALSE; + else if (strcmp(argv(c),"-h")==0) + warning_box("Parametri di lancio: \n -i non crea i .ini per i programmi di CG \n -c non copia le DLL nella directory corrente \n -d non cancella le DLL su windows\\system "); + } + return TSkeleton_application::create(); + +} +void TInstall_dll ::main_loop() +{ + if (_copy_dll) + CopiaDlls(); + if (_makeini) + InstallaExeIni(); + if (_del_dll) + RemoveDlls(); +} + +int main(int argc,char** argv) +{ + TInstall_dll app; + app.run(argc, argv, "Installazione DLL per contabilita' generale"); + return TRUE; +} diff --git a/ba/cgdll.h b/ba/cgdll.h new file mode 100755 index 000000000..fdee7e1a1 --- /dev/null +++ b/ba/cgdll.h @@ -0,0 +1,3 @@ +#define F_DELDLL 101 +#define F_MAKEINI 102 +#define F_COPYDLL 103 diff --git a/ba/cgdll.uml b/ba/cgdll.uml new file mode 100755 index 000000000..5bc70dd1c --- /dev/null +++ b/ba/cgdll.uml @@ -0,0 +1,45 @@ +#include "cgdll.h" +TOOLBAR "" 0 20 0 2 +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -1 "" + MESSAGE EXIT,K_ENTER +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -22 -1 "" + MESSAGE EXIT,K_QUIT +END +ENDPAGE + +PAGE "DLL Contabilita' Generale" -1 -1 78 8 +// GROUP 1 = PRE-INSTALLATION +// GROUP 2 = POST-INSTALLATION + + +GROUPBOX DLG_NULL 70 9 +BEGIN + PROMPT 2 2 "@bGestione DLL di VisualBasic" + GROUP 1 +END + +BOOL F_COPYDLL +BEGIN + PROMPT 3 4 "Copia le DLL da C:\WINDOWS\SYSTEM nella directory corrente" + GROUP 1 +END + +BOOL F_MAKEINI +BEGIN + PROMPT 3 6 "Imposta i file di CG per l'uso delle DLL nella directory corrente" + GROUP 1 +END + +BOOL F_DELDLL +BEGIN + PROMPT 3 8 "Cancella le DLL su C:\WINDOWS\SYSTEM" + GROUP 1 +END +ENDPAGE +ENDMASK diff --git a/ba/cgdll.url b/ba/cgdll.url new file mode 100755 index 000000000..e3cd28a7f --- /dev/null +++ b/ba/cgdll.url @@ -0,0 +1,13 @@ +#include + +/* ba1 -0 */ +MENU TASK_MENUBAR + SUBMENU MENU_FILE "~File" + + +/* ba1 -1 */ +MENUBAR MENU_BAR(1) + +MENU MENU_BAR(1) + SUBMENU MENU_FILE "~File" + diff --git a/ba/f2.dir b/ba/f2.dir index 4497aebde..604493a56 100755 --- a/ba/f2.dir +++ b/ba/f2.dir @@ -1,3 +1,3 @@ 2 1 -%user|0|0|260|0|Utenti|10|| +%user|0|0|279|0|Utenti|10|| diff --git a/ba/f2.trr b/ba/f2.trr index d1ca5206d..cc1f035a2 100755 --- a/ba/f2.trr +++ b/ba/f2.trr @@ -1,12 +1,15 @@ 2 -8 -USERNAME|1|8|0| -USERDESC|1|50|0| -PASSWORD|1|8|0| -AUTSTR|1|48|0| -AUTSTR1|1|48|0| -AUTSTR2|1|48|0| -AUTSTR3|1|48|0| -CONNECTED|8|1|0| +11 +USERNAME|1|8|0|Nome dell'utente/gruppo +USERDESC|1|50|0|Descrizione dell'utente/gruppo +PASSWORD|1|8|0|Password dell'utente +GROUPNAME|1|8|0|Gruppo di appartenenza +ISGROUP|8|1|0|E' un gruppo o un utente +AUTSTR|1|48|0|Autorizzazioni 1 +AUTSTR1|1|48|0|Autorizzazioni 2 +AUTSTR2|1|48|0|Autorizzazioni 3 +AUTSTR3|1|48|0|Autorizzazioni 4 +CONNECTED|8|1|0|Utente connesso +PERMISSION|11|10|0|File di configurazione permessi per gruppi/utenti 1 USERNAME| diff --git a/ba/f9.dir b/ba/f9.dir index d2f41c4aa..ea55e4b2f 100755 --- a/ba/f9.dir +++ b/ba/f9.dir @@ -1,3 +1,3 @@ 9 1 -%nditte|0|0|545|0|Ditte|#6|| +%nditte|0|0|559|0|Ditte|#6|| diff --git a/ba/f9.trr b/ba/f9.trr index 7c815df4d..8490718a7 100755 --- a/ba/f9.trr +++ b/ba/f9.trr @@ -1,5 +1,5 @@ 9 -45 +52 CODDITTA|3|5|0| TIPOA|1|1|0| CODANAGR|3|5|0| @@ -45,6 +45,13 @@ DENEST1|1|70|0| DENEST2|1|70|0| DENEST3|1|70|0| AUTSTR|1|50|0| +VALUTA|1|3|0|Codice valuta di riferimento per i dati +PRESELEN|8|1|0|Presentati elenchi in precedenza +CESSIVA|8|1|0|Cessata attivita' o variata partita IVA +FREQCES|1|1|0|Frequenza riepiloghi cessioni INTRA +FREQACQ|1|1|0|Frequenza riepiloghi acquisti INTRA +TIPOSOGDEL|1|1|0|Tipo anagrafico del soggetto delegato +CODSOGDEL|3|6|0|Codice del soggetto delegato 4 CODDITTA| UPPER(RAGSOC)|X diff --git a/ba/install.ini b/ba/install.ini index 98a608f55..a852e90fd 100755 --- a/ba/install.ini +++ b/ba/install.ini @@ -33,15 +33,6 @@ PostProcess = PreProcess = Versione = -[mu] -Data = -Descrizione = Multiutenza -Moduli = -Patch = -PostProcess = -PreProcess = -Versione = - [cm] Data = Descrizione = Gestione Commesse @@ -163,9 +154,9 @@ PostProcess = PreProcess = Versione = -[ab] +[iv] Data = -Descrizione = Analisi di bilancio +Descrizione = IVA Moduli = ba Patch = PostProcess = @@ -311,15 +302,6 @@ Versione = [_area_AVIS] Descrizione = AREA AVIS -[ac] -Data = -Descrizione = Accettazione AVIS -Moduli = ba -Patch = -PostProcess = -PreProcess = -Versione = - [av] Data = Descrizione = AVIS Assist @@ -338,10 +320,10 @@ PostProcess = PreProcess = Versione = -[mb] +[ac] Data = -Descrizione = Medi-Base -Moduli = +Descrizione = Accettazione AVIS +Moduli = ba Patch = PostProcess = PreProcess = diff --git a/cg/cg0200.cpp b/cg/cg0200.cpp index c86b3b4db..93b8c0f79 100755 --- a/cg/cg0200.cpp +++ b/cg/cg0200.cpp @@ -53,6 +53,8 @@ protected: //////////// static bool indsp_notify(TSheet_field& s, int r, KEY key); static void indsp_sheet_rebuilder(); + static bool effetti_notify(TSheet_field& s, int r, KEY key); + virtual int write(const TMask& m); virtual int rewrite(const TMask& m); virtual int read(TMask& m); @@ -494,6 +496,23 @@ int TClifo_application::read(TMask& m) field_sheet(F_CODINDSP).add(riga); field_sheet(F_CODINDEFF).add(riga); } + + TSheet_field& pnae = m.sfield(F_NONACCEFF); + pnae.destroy(); + const TRectype& cfven = get_relation()->curr(LF_CFVEN); + TToken_string nonacc(cfven.get(CFV_NONACCEFF), ';'); + TToken_string nonscd(cfven.get(CFV_NONSCADEFF), ';'); + TToken_string periodo(12, ','); + int per = 0; + for (bool good = nonacc.get(per, periodo); good; good = nonacc.get(++per, periodo)) + { + TToken_string& row = pnae.row(-1); + row = periodo << '|' << nonscd.get(per); + row.replace(';', '|'); + row.replace(',', '|'); + row.replace('-', '|'); + } + pnae.force_update(); } return _rel->status(); } @@ -584,6 +603,26 @@ void TClifo_application::common_f(const TMask& m) rec.put(IND_IVARID,row.get()); rec.put(IND_CODIND,i+1); } + + TSheet_field& pnae = m.sfield(F_NONACCEFF); + TToken_string nonacceff(30, ';'), nonscadeff(30, ';'); + FOR_EACH_SHEET_ROW(pnae, re, row) if (!row->empty_items()) + { + TString16 p; + p << row->get(0) << '-'; p << row->get(1) << ','; + p << row->get(2) << '-'; p << row->get(3); + nonacceff.add(p); + p = row->get(4); p << '-' << row->get(5); + nonscadeff.add(p); + } + + TRectype& cfven = get_relation()->curr(LF_CFVEN); + int mass = cfven.length(CFV_NONACCEFF); + if (nonacceff.len() > mass) nonacceff.cut(mass); + cfven.put(CFV_NONACCEFF, nonacceff); + mass = cfven.length(CFV_NONSCADEFF); + if (nonscadeff.len() > mass) nonscadeff.cut(mass); + cfven.put(CFV_NONSCADEFF, nonscadeff); } } @@ -632,6 +671,19 @@ default: return TRUE; } +bool TClifo_application::effetti_notify(TSheet_field& pnae, int r, KEY key) +{ + if (key == K_INS) + { + TClifo_application& a = app(); + TRectype& cfven = a.get_relation()->curr(LF_CFVEN); + int mass_len = cfven.length(CFV_NONACCEFF); // Lunghezza campo + int mass_rig = mass_len / 11; // Numero di periodi ivi salvabili + return pnae.items() < mass_rig; // Non accettare righe che non si possono salvare + } + return TRUE; +} + bool TClifo_application::user_create() // initvar e arrmask { _has_cg = has_module(CGAUT, CHK_DONGLE); @@ -660,9 +712,12 @@ bool TClifo_application::user_create() // initvar e arrmask _msk->set_handler(DLG_EMAIL, email_handler); _msk->set_handler(F_RAGSOC, rsoc_handler); - TSheet_field& ind = (TSheet_field&) _msk->field(F_SHEET_G_VEN); + TSheet_field& ind = _msk->sfield(F_SHEET_G_VEN); ind.set_notify(indsp_notify); + TSheet_field& pnae = _msk->sfield(F_NONACCEFF); + pnae.set_notify(effetti_notify); + TConfig config(CONFIG_STUDIO); _savenew = !config.get_bool("Cg02SN"); diff --git a/cg/cg0200.h b/cg/cg0200.h index 6c4a6ea16..8bb0adaa0 100755 --- a/cg/cg0200.h +++ b/cg/cg0200.h @@ -134,6 +134,15 @@ #define F_RAGGEFF 232 #define F_NUMCC 233 #define F_CODLIST1 234 +#define F_ESACC 235 +#define F_ESALL 236 +#define F_ESCAR 237 +#define F_ESPLA 238 +#define F_ESLEG 239 +#define F_ESVET 240 +#define F_ADDCONAI 241 +#define F_CONAIASS 242 +#define F_REFERENTE 243 #define DLG_RIC 300 #define DLG_CST 301 diff --git a/cg/cg0200a.uml b/cg/cg0200a.uml index 4efee7afd..076022a7a 100755 --- a/cg/cg0200a.uml +++ b/cg/cg0200a.uml @@ -89,13 +89,13 @@ BEGIN HELP "Prima parte della ragione sociale o cognome" MESSAGE COPY,3@ WARNING "Manca la ragione sociale" - CHECKTYPE REQUIRED // Guy: perche' non cosi'? + CHECKTYPE REQUIRED END STRING F_RAGSOCA 20 BEGIN PROMPT 23 2 "Nome / Seconda parte Rag. Soc. " - FIELD RAGSOC[31,] + FIELD RAGSOC[31,50] KEY 2 HELP "Seconda parte della ragione sociale o nome" MESSAGE COPY,6@ @@ -275,9 +275,15 @@ BEGIN FLAGS "D" END +STRING F_REFERENTE 50 +BEGIN +PROMPT 2 12 "Referente " +FIELD REFERENTE +END + LIST F_TIPOPERS 1 12 BEGIN - PROMPT 2 12 "Tipo persona " + PROMPT 2 13 "Tipo persona " FIELD TIPOPERS HELP "Tipo anagrafico del clinete/fornitore" ITEM "F|Fisica" @@ -288,7 +294,7 @@ END STRING F_CODSTAT 7 BEGIN - PROMPT 46 12 "Codice statistico " + PROMPT 46 13 "Codice statistico " FIELD CODSTAT USE %STT INPUT CODTAB F_CODSTAT @@ -301,7 +307,7 @@ END NUMBER F_ALLEG 1 BEGIN -PROMPT 2 13 "Inserimento in allegato " +PROMPT 2 14 "Inserimento in allegato " FIELD ALLEG SHEET "Codice|Descrizione@50" HELP "Codice per l'inserimento negli allegati IVA" @@ -317,29 +323,29 @@ END NUMBER F_CODALLEG 6 BEGIN -PROMPT 32 13 "Codice allegato " -FIELD CODALLEG -FLAGS "R" -COPY USE F_CODCF -INPUT TIPOCF F_TIPOCF SELECT -INPUT CODCF F_CODALLEG -COPY DISPLAY F_CODCF -OUTPUT F_CODALLEG CODCF -OUTPUT F_RAGSOCALLEG RAGSOC -HELP "Codice dell'allegato IVA in cui inserire i progressivi" -CHECKTYPE NORMAL -WARNING "Cliente/Fornitore assente" + PROMPT 32 14 "Codice allegato " + FIELD CODALLEG + FLAGS "R" + COPY USE F_CODCF + INPUT TIPOCF F_TIPOCF SELECT + INPUT CODCF F_CODALLEG + COPY DISPLAY F_CODCF + OUTPUT F_CODALLEG CODCF + OUTPUT F_RAGSOCALLEG RAGSOC + HELP "Codice dell'allegato IVA in cui inserire i progressivi" + CHECKTYPE NORMAL + WARNING "Cliente/Fornitore assente" END STRING F_RAGSOCALLEG 50 BEGIN -PROMPT 2 14 "Rag. soc. allegato " +PROMPT 2 15 "Rag. soc. allegato " FLAGS "D" END BOOLEAN F_OCCASIONALE BEGIN -PROMPT 2 16 "Occasionale " +PROMPT 2 17 "Occasionale " FIELD OCCAS HELP "Indicare se si tratta di un C/F occasionale" MESSAGE TRUE "2",F_ALLEG @@ -347,9 +353,9 @@ END BOOLEAN F_SOSPESO BEGIN -PROMPT 32 16 "Sospeso " -FIELD SOSPESO -HELP "Indicare se il C/F e' movimentato ma non piu' utilizzabile" + PROMPT 32 17 "Sospeso " + FIELD SOSPESO + HELP "Indicare se il C/F e' movimentato ma non piu' utilizzabile" END LIST F_DIRTY 1 @@ -366,63 +372,63 @@ PAGE "Pag.2" -1 -1 78 19 GROUPBOX DLG_NULL 76 4 BEGIN -PROMPT 1 0 "Dati identificativi" + PROMPT 1 0 "Dati identificativi" END LIST DLG_NULL 1 11 BEGIN -PROMPT 2 1 "Tipo " -FLAGS "D" -GROUP 1 -ITEM "C|Clienti" -ITEM "F|Fornitori" + PROMPT 2 1 "Tipo " + FLAGS "D" + GROUP 1 + ITEM "C|Clienti" + ITEM "F|Fornitori" END NUMBER DLG_NULL 6 BEGIN -PROMPT 2 2 "Codice " -FLAGS "RD" -GROUP 2 + PROMPT 2 2 "Codice " + FLAGS "RD" + GROUP 2 END STRING DLG_NULL 30 BEGIN -PROMPT 23 1 "Cognome / Rag. Soc. " -FLAGS "D" -GROUP 3 + PROMPT 23 1 "Cognome / Rag. Soc. " + FLAGS "D" + GROUP 3 END STRING DLG_NULL 20 BEGIN -PROMPT 23 2 "Nome / Seconda parte Rag. Soc. " -FLAGS "D" -GROUP 6 + PROMPT 23 2 "Nome / Seconda parte Rag. Soc. " + FLAGS "D" + GROUP 6 END GROUPBOX DLG_NULL 76 8 BEGIN -PROMPT 1 4 "Numeri telefonici" + PROMPT 1 4 "Numeri telefonici" END STRING F_PTEL 10 BEGIN -PROMPT 2 5 "Telefono " -FIELD PTEL -HELP "Prefisso telefonico primo recapito" + PROMPT 2 5 "Telefono " + FIELD PTEL + HELP "Prefisso telefonico primo recapito" END STRING F_TEL 30 BEGIN -PROMPT 43 5 "" -FIELD TEL -HELP "Numero telefonico primo recapito" + PROMPT 43 5 "" + FIELD TEL + HELP "Numero telefonico primo recapito" END STRING F_PTEL2 10 BEGIN -PROMPT 16 6 "" -FIELD PTEL2 -HELP "Prefisso telefonico secondo recapito" + PROMPT 16 6 "" + FIELD PTEL2 + HELP "Prefisso telefonico secondo recapito" END STRING F_TEL2 30 @@ -434,156 +440,156 @@ END STRING F_PTEL3 10 BEGIN -PROMPT 16 7 "" -FIELD PTEL3 -HELP "Prefisso telefonico terzo recapito" + PROMPT 16 7 "" + FIELD PTEL3 + HELP "Prefisso telefonico terzo recapito" END STRING F_TEL3 30 BEGIN -PROMPT 43 7 "" -FIELD TEL3 -HELP "Numero telefonico terzo recapito" + PROMPT 43 7 "" + FIELD TEL3 + HELP "Numero telefonico terzo recapito" END STRING F_PFAX 10 BEGIN -PROMPT 2 8 "Fax " -FIELD PFAX -HELP "Prefisso del numero di fax" + PROMPT 2 8 "Fax " + FIELD PFAX + HELP "Prefisso del numero di fax" END STRING F_FAX 30 BEGIN -PROMPT 43 8 "" -FIELD FAX -HELP "Numero telefonico del fax" + PROMPT 43 8 "" + FIELD FAX + HELP "Numero telefonico del fax" END STRING F_PTELEX 10 BEGIN -PROMPT 2 9 "Telex " -FIELD PTELEX + PROMPT 2 9 "Telex " + FIELD PTELEX END STRING F_TELEX 30 BEGIN -PROMPT 43 9 "" -FIELD TELEX + PROMPT 43 9 "" + FIELD TELEX END STRING F_MAIL 50 BEGIN -PROMPT 2 10 "Posta elettr. " -FIELD MAIL + PROMPT 2 10 "Posta elettr. " + FIELD MAIL END GROUPBOX DLG_NULL 76 4 BEGIN -PROMPT 1 12 "Percipiente" + PROMPT 1 12 "Percipiente" END LIST F_TIPOAPER 1 15 BEGIN -PROMPT 2 13 "Tipo " -FIELD TIPOAPER -FLAGS "D" -ITEM "F|Fisica" -ITEM "G|Giuridica" + PROMPT 2 13 "Tipo " + FIELD TIPOAPER + FLAGS "D" + ITEM "F|Fisica" + ITEM "G|Giuridica" END NUMBER F_CODANAGPER 5 BEGIN -PROMPT 61 13 "Codice " -FIELD CODANAGPER -FLAGS "R" -GROUP 4 -USE LF_ANAG -INPUT TIPOA F_TIPOAPER SELECT -INPUT CODANAGR F_CODANAGPER -DISPLAY "Codice" CODANAGR -DISPLAY "Nome@50" RAGSOC -OUTPUT F_TIPOAPER TIPOA -OUTPUT F_CODANAGPER CODANAGR -OUTPUT F_RAGSOC1 RAGSOC -HELP "Codice anagrafico percepiente per la compilazione Mod. 770" -CHECKTYPE NORMAL -WARNING "Percipiente assente" -ADD RUN ba4 -1 #F_TIPOAPER + PROMPT 61 13 "Codice " + FIELD CODANAGPER + FLAGS "R" + GROUP 4 + USE LF_ANAG + INPUT TIPOA F_TIPOAPER SELECT + INPUT CODANAGR F_CODANAGPER + DISPLAY "Codice" CODANAGR + DISPLAY "Nome@50" RAGSOC + OUTPUT F_TIPOAPER TIPOA + OUTPUT F_CODANAGPER CODANAGR + OUTPUT F_RAGSOC1 RAGSOC + HELP "Codice anagrafico percepiente per la compilazione Mod. 770" + CHECKTYPE NORMAL + WARNING "Percipiente assente" + ADD RUN ba4 -1 #F_TIPOAPER END STRING F_RAGSOC1 50 BEGIN -PROMPT 2 14 "Ragione sociale " -GROUP 4 -USE LF_ANAG KEY 2 -INPUT TIPOA F_TIPOAPER SELECT -INPUT RAGSOC F_RAGSOC1 -DISPLAY "Ragione sociale@50" RAGSOC -DISPLAY "Codice" CODANAGR -COPY OUTPUT F_CODANAGPER -HELP "Ragione sociale del percepiente per la compilazione Mod. 770" -ADD RUN ba4 -1 #F_TIPOAPER + PROMPT 2 14 "Ragione sociale " + GROUP 4 + USE LF_ANAG KEY 2 + INPUT TIPOA F_TIPOAPER SELECT + INPUT RAGSOC F_RAGSOC1 + DISPLAY "Ragione sociale@50" RAGSOC + DISPLAY "Codice" CODANAGR + COPY OUTPUT F_CODANAGPER + HELP "Ragione sociale del percepiente per la compilazione Mod. 770" + ADD RUN ba4 -1 #F_TIPOAPER END GROUPBOX DLG_NULL 76 4 BEGIN -PROMPT 1 16 "Dati di nascita" -GROUP 5 + PROMPT 1 16 "Dati di nascita" + GROUP 5 END DATE F_DATANASC BEGIN -PROMPT 2 17 "Data " -FIELD DATANASC -GROUP 5 -HELP "Data di nascita del cliente/fornitore" + PROMPT 2 17 "Data " + FIELD DATANASC + GROUP 5 + HELP "Data di nascita del cliente/fornitore" END NUMBER F_STATONASC 3 BEGIN -PROMPT 38 17 "Stato " -FIELD STATONASC -FLAGS "Z" -GROUP 5 -COPY USE F_STATOCF -INPUT CODTAB F_STATONASC -COPY DISPLAY F_STATOCF -OUTPUT F_STATONASC CODTAB -HELP "Stato di nascita del cliente/fornitore" -CHECKTYPE NORMAL -WARNING "Nazione assente" + PROMPT 38 17 "Stato " + FIELD STATONASC + FLAGS "Z" + GROUP 5 + COPY USE F_STATOCF + INPUT CODTAB F_STATONASC + COPY DISPLAY F_STATOCF + OUTPUT F_STATONASC CODTAB + HELP "Stato di nascita del cliente/fornitore" + CHECKTYPE NORMAL + WARNING "Nazione assente" END STRING F_COMNASC 4 BEGIN -PROMPT 60 17 "Comune " -FIELD COMNASC -FLAGS "U" -GROUP 5 -COPY USE F_COMCF -INPUT STATO F_STATONASC -INPUT COM F_COMNASC -COPY DISPLAY F_COMCF -OUTPUT F_STATONASC STATO -OUTPUT F_COMNASC COM -OUTPUT F_DENCOMNASC DENCOM -HELP "Codice del comune di nascita del cliente/fornitore" -CHECKTYPE NORMAL -WARNING "Comune assente" -ADD RUN ba4 -0 + PROMPT 60 17 "Comune " + FIELD COMNASC + FLAGS "U" + GROUP 5 + COPY USE F_COMCF + INPUT STATO F_STATONASC + INPUT COM F_COMNASC + COPY DISPLAY F_COMCF + OUTPUT F_STATONASC STATO + OUTPUT F_COMNASC COM + OUTPUT F_DENCOMNASC DENCOM + HELP "Codice del comune di nascita del cliente/fornitore" + CHECKTYPE NORMAL + WARNING "Comune assente" + ADD RUN ba4 -0 END STRING F_DENCOMNASC 50 BEGIN -PROMPT 2 18 "Denominazione " -GROUP 5 -USE LF_COMUNI KEY 2 -INPUT DENCOM F_DENCOMNASC -COPY DISPLAY F_DENCOMCF -COPY OUTPUT F_COMNASC -HELP "Nome del comune di nascita" -ADD RUN ba4 -0 + PROMPT 2 18 "Denominazione " + GROUP 5 + USE LF_COMUNI KEY 2 + INPUT DENCOM F_DENCOMNASC + COPY DISPLAY F_DENCOMCF + COPY OUTPUT F_COMNASC + HELP "Nome del comune di nascita" + ADD RUN ba4 -0 END ENDPAGE @@ -592,186 +598,184 @@ PAGE "Pag.3" -1 -1 78 19 GROUPBOX DLG_NULL 76 4 BEGIN -PROMPT 1 0 "Dati identificativi" + PROMPT 1 0 "Dati identificativi" END LIST DLG_NULL 1 11 BEGIN -PROMPT 2 1 "Tipo " -FLAGS "D" -GROUP 1 -ITEM "C|Clienti" -ITEM "F|Fornitori" + PROMPT 2 1 "Tipo " + FLAGS "D" + GROUP 1 + ITEM "C|Clienti" + ITEM "F|Fornitori" END NUMBER DLG_NULL 6 BEGIN -PROMPT 2 2 "Codice " -FLAGS "RD" -GROUP 2 + PROMPT 2 2 "Codice " + FLAGS "RD" + GROUP 2 END STRING DLG_NULL 30 BEGIN -PROMPT 23 1 "Cognome / Rag. Soc. " -FLAGS "D" -GROUP 3 + PROMPT 23 1 "Cognome / Rag. Soc. " + FLAGS "D" + GROUP 3 END STRING DLG_NULL 20 BEGIN -PROMPT 23 2 "Nome / Seconda parte Rag. Soc. " -FLAGS "D" -GROUP 6 + PROMPT 23 2 "Nome / Seconda parte Rag. Soc. " + FLAGS "D" + GROUP 6 END NUMBER F_CODABI 5 BEGIN -PROMPT 2 4 "Banca appoggio ABI " -FIELD CODABI -FLAGS "Z" -USE %BAN KEY 1 SELECT CODTAB ?= "?????" -INPUT CODTAB F_CODABI -DISPLAY "Codice ABI" CODTAB[1,5] -DISPLAY "Codice CAB" CODTAB[6,10] -DISPLAY "Denominazione@50" S0 -OUTPUT F_CODABI CODTAB[1,5] -// OUTPUT F_CODBAN CODTAB[6,10] -// OUTPUT F_DESBAN S0 -HELP "Codice ABI banca del C/F" -CHECKTYPE NORMAL + PROMPT 2 4 "Banca appoggio ABI " + FIELD CODABI + FLAGS "Z" + USE %BAN SELECT CODTAB ?= "?????" + INPUT CODTAB F_CODABI + DISPLAY "Codice ABI" CODTAB[1,5] + DISPLAY "Denominazione@50" S0 + OUTPUT F_CODABI CODTAB[1,5] + HELP "Codice ABI banca del C/F" + CHECKTYPE NORMAL END NUMBER F_CODBAN 5 BEGIN -PROMPT 63 4 "CAB " -FIELD CODCAB -FLAGS "Z" -USE %BAN KEY 1 SELECT CODTAB ?= "??????????" -INPUT CODTAB[1,5] F_CODABI -INPUT CODTAB[6,10] F_CODBAN -COPY DISPLAY F_CODABI -OUTPUT F_CODABI CODTAB[1,5] -OUTPUT F_CODBAN CODTAB[6,10] -OUTPUT F_DESBAN S0 -HELP "Codice CAB banca del C/F" -CHECKTYPE NORMAL + PROMPT 63 4 "CAB " + FIELD CODCAB + FLAGS "Z" + USE %BAN SELECT CODTAB ?= "??????????" + INPUT CODTAB[1,5] F_CODABI + INPUT CODTAB[6,10] F_CODBAN + DISPLAY "Codice ABI" CODTAB[1,5] + DISPLAY "Codice CAB" CODTAB[6,10] + DISPLAY "Denominazione@50" S0 + OUTPUT F_CODABI CODTAB[1,5] + OUTPUT F_CODBAN CODTAB[6,10] + OUTPUT F_DESBAN S0 + HELP "Codice CAB banca del C/F" + CHECKTYPE NORMAL END STRING F_DESBAN 50 BEGIN -PROMPT 2 5 "Denominazione " -USE %BAN KEY 2 SELECT CODTAB ?= "??????????" -INPUT S0 F_DESBAN -DISPLAY "Denominazione@50" S0 -DISPLAY "Codice ABI" CODTAB[1,5] -DISPLAY "Codice CAB" CODTAB[6,10] -COPY OUTPUT F_CODBAN + PROMPT 2 5 "Denominazione " + USE %BAN KEY 2 SELECT CODTAB ?= "??????????" + INPUT S0 F_DESBAN + DISPLAY "Denominazione@50" S0 + DISPLAY "Codice ABI" CODTAB[1,5] + DISPLAY "Codice CAB" CODTAB[6,10] + COPY OUTPUT F_CODBAN END STRING F_NUMCC 20 BEGIN -PROMPT 2 6 "Conto corrente " -FIELD NUMCC -FLAGS "U" + PROMPT 2 6 "Conto corrente " + FIELD NUMCC + FLAGS "U" END STRING F_CODVAL 3 BEGIN -PROMPT 2 7 "Valuta " -FLAGS "UZ" -FIELD CODVAL -USE %VAL -INPUT CODTAB F_CODVAL -DISPLAY "Codice valuta" CODTAB -DISPLAY "Descrizione@50" S0 -OUTPUT F_CODVAL CODTAB -OUTPUT F_DESVAL S0 -CHECKTYPE NORMAL + PROMPT 2 7 "Valuta " + FLAGS "UZ" + FIELD CODVAL + USE %VAL + INPUT CODTAB F_CODVAL + DISPLAY "Codice valuta" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODVAL CODTAB + OUTPUT F_DESVAL S0 + CHECKTYPE NORMAL END STRING F_DESVAL 50 BEGIN -PROMPT 22 7 "" -USE %VAL KEY 2 -INPUT S0 F_DESVAL -DISPLAY "Descrizione@50" S0 -DISPLAY "Codice valuta" CODTAB -COPY OUTPUT F_CODVAL -CHECKTYPE NORMAL + PROMPT 22 7 "" + USE %VAL KEY 2 + INPUT S0 F_DESVAL + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice valuta" CODTAB + COPY OUTPUT F_CODVAL + CHECKTYPE NORMAL END STRING F_CODLIN 1 BEGIN -PROMPT 2 8 "Lingua " -FIELD CODLIN -USE %LNG -FLAGS "U" -INPUT CODTAB F_CODLIN -DISPLAY "Codice lingua " CODTAB -DISPLAY "Descrizione@50" S0 -OUTPUT F_CODLIN CODTAB -OUTPUT F_DESLIN S0 -HELP "Codice lingua per C/F esteri" -CHECKTYPE NORMAL + PROMPT 2 8 "Lingua " + FIELD CODLIN + USE %LNG + FLAGS "U" + INPUT CODTAB F_CODLIN + DISPLAY "Codice lingua " CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODLIN CODTAB + OUTPUT F_DESLIN S0 + HELP "Codice lingua per C/F esteri" + CHECKTYPE NORMAL END STRING F_DESLIN 50 BEGIN -PROMPT 22 8 "" -USE %LNG KEY 2 -INPUT S0 F_DESLIN -DISPLAY "Descrizione@50" S0 -DISPLAY "Codice lingua" CODTAB -COPY OUTPUT F_CODLIN -CHECKTYPE NORMAL + PROMPT 22 8 "" + USE %LNG KEY 2 + INPUT S0 F_DESLIN + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice lingua" CODTAB + COPY OUTPUT F_CODLIN + CHECKTYPE NORMAL END STRING F_CODPAG 4 BEGIN -PROMPT 2 9 "Pagamento " -FIELD CODPAG -FLAGS "U#" -USE %CPG -INPUT CODTAB F_CODPAG -DISPLAY "Codice" CODTAB -DISPLAY "Descrizione@50" S0 -OUTPUT F_CODPAG CODTAB -OUTPUT F_DESPAG S0 -HELP "Codice condizione di pagamento concordata" -CHECKTYPE NORMAL -ADD RUN ba3 -6 + PROMPT 2 9 "Pagamento " + FIELD CODPAG + FLAGS "U#" + USE %CPG + INPUT CODTAB F_CODPAG + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODPAG CODTAB + OUTPUT F_DESPAG S0 + HELP "Codice condizione di pagamento concordata" + CHECKTYPE NORMAL + ADD RUN ba3 -6 END STRING F_DESPAG 50 BEGIN -PROMPT 22 9 "" -USE %CPG KEY 2 -INPUT S0 F_DESPAG -DISPLAY "Descrizione@50" S0 -DISPLAY "Codice pagamento" CODTAB -COPY OUTPUT F_CODPAG -CHECKTYPE NORMAL + PROMPT 22 9 "" + USE %CPG KEY 2 + INPUT S0 F_DESPAG + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice pagamento" CODTAB + COPY OUTPUT F_CODPAG + CHECKTYPE NORMAL END -NUMBER F_FIDO 15 +CURRENCY F_FIDO 15 BEGIN -PROMPT 2 10 "Fido " -FIELD FIDO -FLAGS "R" -PICTURE "." -HELP "Importo massimo fido del cliente/fornitore" + PROMPT 2 10 "Fido " + FIELD FIDO + DRIVENBY F_CODVAL + HELP "Importo massimo fido del cliente/fornitore" END GROUPBOX DLG_NULL 76 4 BEGIN -PROMPT 1 11 "Conto cliente/fornitore" + PROMPT 1 11 "Conto cliente/fornitore" END NUMBER F_GRUPPO 3 BEGIN -PROMPT 2 12 "Gruppo " -FIELD GRUPPO + PROMPT 2 12 "Gruppo " + FIELD GRUPPO END NUMBER F_CONTO 3 @@ -969,7 +973,7 @@ END NUMBER F_CODINDDOC 3 BEGIN - PROMPT 2 5 "Codice indirizzo documento " + PROMPT 2 4 "Codice indirizzo documento " FIELD LF_CFVEN->CODINDDOC GROUP 7 SHEET "Codice|Ragione sociale@50|Indirizzo@35|Nr.@10|Localita@35" @@ -981,7 +985,7 @@ END STRING F_CODNOTE 2 BEGIN - PROMPT 43 5 "Codice Note Cli/Fo " + PROMPT 43 4 "Codice Note Cli/Fo " FIELD LF_CFVEN->CODNOTE USE %NOT FLAGS "U" @@ -995,9 +999,9 @@ BEGIN CHECKTYPE NORMAL END -STRING F_CODLEG 2 +STRING F_CODLEG 3 BEGIN - PROMPT 2 8 "Codice Legale " + PROMPT 2 6 "Codice Legale " FIELD LF_CFVEN->CODLEG GROUP 7 USE %LEG @@ -1011,7 +1015,7 @@ END STRING F_CODCATC 2 BEGIN - PROMPT 43 8 "Codice Categoria contabile " + PROMPT 43 6 "Codice Categoria contabile " FIELD LF_CFVEN->CODCATC USE CCO INPUT CODTAB F_CODCATC @@ -1024,7 +1028,7 @@ END STRING F_CODPRCF 10 BEGIN - PROMPT 2 11 "Codice presso cliente " + PROMPT 2 8 "Codice presso cliente " FIELD LF_CFVEN->CODPRCF GROUP 7 HELP "Codice meccanografico assegnato dal cliente" @@ -1032,7 +1036,7 @@ END NUMBER F_CODINDSP 3 BEGIN - PROMPT 43 11 "Codice indirizzo spedizione " + PROMPT 43 8 "Codice indirizzo spedizione " FIELD LF_CFVEN->CODINDSP GROUP 7 SHEET "Codice|Ragione sociale@50|Indirizzo@35|Nr.@10|Localita@35" @@ -1041,14 +1045,14 @@ BEGIN HELP "Codice dell'indirizzo di spedizione da proporre" END - GROUPBOX DLG_NULL 76 4 +GROUPBOX DLG_NULL 76 4 BEGIN - PROMPT 1 14 "Dati Agente" + PROMPT 1 10 "Dati Agente" END STRING F_CODZONA 2 BEGIN - PROMPT 2 15 "Codice Zona " + PROMPT 2 11 "Codice Zona " FIELD LF_CFVEN->CODZONA GROUP 7 USE ZON @@ -1062,14 +1066,15 @@ END STRING F_CODAG 5 BEGIN - PROMPT 44 15 "Codice agente " + PROMPT 44 11 "Codice agente " FLAGS "UZ" FIELD LF_CFVEN->CODAG - USE AGE - INPUT CODTAB F_CODAG - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT F_CODAG CODTAB + USE LF_AGENTI + INPUT CODAGE F_CODAG + DISPLAY "Codice" CODAGE + DISPLAY "Descrizione@50" RAGSOC + OUTPUT F_CODAG CODAGE + ADD RUN pr0 -4 CHECKTYPE NORMAL GROUP 7 HELP "Codice dell'agente di cui si serve il cliente" @@ -1077,30 +1082,93 @@ END NUMBER F_PROVV 5 2 BEGIN - PROMPT 2 16 "Provvigione " + PROMPT 2 12 "Provvigione " FIELD LF_CFVEN->PERCPROVV GROUP 7 HELP "Provvigione percepita dall'agente" END - BOOLEAN F_LIQPAG +BOOLEAN F_LIQPAG BEGIN - PROMPT 46 16 "Liquidazione provvigioni" + PROMPT 46 12 "Liquidazione provvigioni" FIELD LF_CFVEN->LIQPAG GROUP 7 HELP "Indicare se si usa la liquidazione provvigioni" END +BOOLEAN F_ADDCONAI +BEGIN + PROMPT 2 15 "Addebito CONAI" + FIELD LF_CFVEN->ADDCONAI + MESSAGE FALSE CLEAR,8@|ENABLE,F_CONAIASS + MESSAGE TRUE ENABLE,8@|CLEAR,F_CONAIASS +END + +BOOLEAN F_CONAIASS +BEGIN + PROMPT 43 15 "Stampa contributo CONAI assolto" + FIELD LF_CFVEN->CONAIASS + MESSAGE FALSE ENABLE,F_ADDCONAI + MESSAGE TRUE CLEAR,F_ADDCONAI +END + +GROUPBOX DLG_NULL 76 4 +BEGIN + PROMPT 1 16 "Esenzioni CONAI" +END + +NUMBER F_ESACC 6 2 +BEGIN + PROMPT 2 17 "Acciaio " + FIELD LF_CFVEN->ESACC + GROUP 8 +END + +NUMBER F_ESALL 6 2 +BEGIN + PROMPT 30 17 "Alluminio " + FIELD LF_CFVEN->ESALL + GROUP 8 +END + +NUMBER F_ESCAR 6 2 +BEGIN + PROMPT 50 17 "Carta " + FIELD LF_CFVEN->ESCAR + GROUP 8 +END + +NUMBER F_ESPLA 6 2 +BEGIN + PROMPT 2 18 "Plastica " + FIELD LF_CFVEN->ESPLA + GROUP 8 +END + +NUMBER F_ESLEG 6 2 +BEGIN + PROMPT 30 18 "Legno " + FIELD LF_CFVEN->ESLEG + GROUP 8 +END + +NUMBER F_ESVET 6 2 +BEGIN + PROMPT 50 18 "Vetro " + FIELD LF_CFVEN->ESVET + GROUP 8 +END + ENDPAGE - PAGE "Pag.6" -1 -1 78 19 +PAGE "Pag.6" -1 -1 78 19 - GROUPBOX DLG_NULL 76 4 +GROUPBOX DLG_NULL 76 4 BEGIN PROMPT 1 0 "Dati identificativi" END - LIST DLG_NULL 1 11 +LIST DLG_NULL 1 11 BEGIN PROMPT 2 1 "Tipo " FLAGS "DG" @@ -1132,7 +1200,7 @@ BEGIN GROUP 6 END -STRING F_CODNOTESP1 2 +STRING F_CODNOTESP1 3 BEGIN PROMPT 2 4 "Codici note documento " FIELD LF_CFVEN->CODNOTESP1 @@ -1147,7 +1215,7 @@ BEGIN CHECKTYPE NORMAL END -STRING F_CODNOTESP2 2 +STRING F_CODNOTESP2 3 BEGIN PROMPT 33 4 "" FIELD LF_CFVEN->CODNOTESP2 @@ -1302,7 +1370,7 @@ BEGIN HELP "Vostro nr. di protocollo della lettera" END - DATE F_VSDATAREG +DATE F_VSDATAREG BEGIN PROMPT 40 14 "Vs data registrazione " FIELD LF_CFVEN->VSDATAREG @@ -1408,7 +1476,7 @@ END NUMBER F_CODINDEFF 3 BEGIN - PROMPT 2 6 "Codice indirizzo effetti " + PROMPT 2 5 "Codice indirizzo effetti " FIELD LF_CFVEN->CODINDEFF GROUP 7 SHEET "Codice|Ragione sociale@50|Indirizzo@35|Nr.@10|Localita@35" @@ -1419,7 +1487,7 @@ END BOOLEAN F_EMEFFRICH BEGIN - PROMPT 45 6 "Emissione effetti" + PROMPT 45 5 "Emissione effetti" FIELD LF_CFVEN->EMEFFRICH GROUP 7 HELP "Indicare se emettere effetti a richiesta" @@ -1427,7 +1495,7 @@ END NUMBER F_IMPMINEFF 6 BEGIN - PROMPT 2 7 "Importo minimo effetti " + PROMPT 2 6 "Importo minimo effetti " FIELD LF_CFVEN->IMPMINEFF GROUP 7 HELP "Importo minimo effetti" @@ -1435,40 +1503,31 @@ END BOOLEAN F_RAGGEFF BEGIN - PROMPT 45 7 "Raggruppamento effetti" + PROMPT 45 6 "Raggruppamento effetti" FIELD LF_CFVEN->RAGGEFF GROUP 7 END -GROUPBOX DLG_NULL 76 4 +TEXT DLG_NULL BEGIN - PROMPT 1 9 "Periodo Effetti" + PROMPT 1 7 "@bPeriodi di non accettazione effetti" END -STRING F_NONACCEFF 20 +SPREADSHEET F_NONACCEFF 76 6 BEGIN - PROMPT 2 10 "Periodo di non accettazione degli effetti " - FIELD LF_CFVEN->NONACCEFF + PROMPT 1 8 "Periodi effetti" + ITEM "Dal\nGiorno@6" + ITEM "Dal\nMese" + ITEM "Al\nGiorno@6" + ITEM "Al\nMese" + ITEM "Sposta al\nGiorno@9" + ITEM "Sposta al\nMese" GROUP 7 - HELP "IIl periodo di non accettazione effetti" -END - -STRING F_NONSCADEFF 20 -BEGIN - PROMPT 2 11 "Scadenza effetti periodi non accettati " - FIELD LF_CFVEN->NONSCADEFF - GROUP 7 - HELP "Scadenza effetti dei periodi non accettati" -END - - GROUPBOX DLG_NULL 76 3 -BEGIN - PROMPT 1 13 "Addebiti" END BOOLEAN F_ADDBOLLI BEGIN - PROMPT 2 14 "Bolli Ricevute bancarie " + PROMPT 2 16 "Addebito Bolli Ricevute bancarie " FIELD LF_CFVEN->ADDBOLLI GROUP 7 HELP "Indicare se addebitare bolli ricevute bancarie" @@ -1476,7 +1535,7 @@ END NUMBER F_PERCSPINC 6 2 BEGIN - PROMPT 40 14 "% Spese incasso " + PROMPT 44 16 "% Addebito Spese incasso " FIELD LF_CFVEN->PERCSPINC GROUP 7 HELP "Indicare la percentuale di addebito delle spese d'incasso" @@ -1484,7 +1543,7 @@ END BOOLEAN F_IVARID BEGIN - PROMPT 2 16 "Aliquota ridotta " + PROMPT 2 17 "Aliquota ridotta " FIELD LF_CFVEN->IVARID GROUP 7 HELP "Indicare se applicare l'aliquota ridotta" @@ -1492,14 +1551,14 @@ END BOOLEAN F_GESTCONTR BEGIN - PROMPT 26 16 "Gestione contratto" + PROMPT 26 17 "Gestione contratto" FIELD LF_CFVEN->GESTCONTR HELP "Indicare se si gestisce un contratto" END STRING F_CATVEN 2 BEGIN - PROMPT 54 16 "Categoria vendita " + PROMPT 54 17 "Categoria vendita " FIELD LF_CFVEN->CATVEN GROUP 7 USE CVE @@ -1720,7 +1779,7 @@ BEGIN HELP "Massimo numero di solleciti" END - DATE F_DATAESC +DATE F_DATAESC BEGIN PROMPT 2 12 "Ultimo estratto conto " FIELD LF_CFVEN->DATAESC @@ -1728,7 +1787,7 @@ BEGIN HELP "Data dell'ultimo estratto conto" END - DATE F_DATASOLL +DATE F_DATASOLL BEGIN PROMPT 47 12 "Ultimo sollecito " FIELD LF_CFVEN->DATASOLL @@ -1749,7 +1808,7 @@ BEGIN HELP "Codice del titolo onorifico" END - LIST F_RAGGOR 1 16 +LIST F_RAGGOR 1 16 BEGIN PROMPT 2 15 "Raggruppamento ordine " FIELD LF_CFVEN->RAGGOR @@ -1776,21 +1835,21 @@ BEGIN HELP "Tipo di evasione dell'ordine" END -NUMBER F_MINORD 18 3 +CURRENCY F_MINORD 18 BEGIN PROMPT 40 16 "Importo minimo " FIELD LF_CFVEN->MINORD GROUP 7 - PICTURE ".3" + DRIVENBY F_CODVAL HELP "Importo minimo dell'ordine" END -NUMBER F_MAXORD 18 3 +CURRENCY F_MAXORD 18 BEGIN PROMPT 40 17 "Importo massimo " FIELD LF_CFVEN->MAXORD GROUP 7 - PICTURE ".3" + DRIVENBY F_CODVAL HELP "Importo massimo dell'ordine" END @@ -1799,3 +1858,77 @@ ENDPAGE ENDMASK #include "cg0200b.uml" + +PAGE "Effetti" -1 -1 42 10 + +GROUPBOX DLG_NULL 40 4 +BEGIN + PROMPT 1 1 "@bPeriodo di non accettazione effetti" +END + +NUMBER 101 2 +BEGIN + PROMPT 2 2 "Dal giorno " + FLAGS "Z" + NUM_EXPR (#THIS_FIELD>=1)&&(#THIS_FIELD<=31) + WARNING "Inserire un giorno compreso tra 1 e 31" +END + +LIST 102 2 10 +BEGIN + PROMPT 20 2 "mese " + FLAGS "M" +END + +NUMBER 103 2 +BEGIN + PROMPT 2 3 "Al giorno " + FLAGS "Z" + NUM_EXPR (#THIS_FIELD>=1)&&(#THIS_FIELD<=31) + WARNING "Inserire un giorno compreso tra 1 e 31" +END + +LIST 104 2 10 +BEGIN + PROMPT 20 3 "mese " + FLAGS "M" +END + +GROUPBOX DLG_NULL 40 3 +BEGIN + PROMPT 1 5 "@bScadenza effetti non accettati" +END + +NUMBER 105 2 +BEGIN + PROMPT 2 6 "Giorno " + FLAGS "Z" + NUM_EXPR (#THIS_FIELD>=1)&&(#THIS_FIELD<=31) + WARNING "Inserire un giorno compreso tra 1 e 31" +END + +LIST 106 2 10 +BEGIN + PROMPT 20 6 "mese " + FLAGS "M" +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK + diff --git a/cg/cg0300a.uml b/cg/cg0300a.uml index a95f0b038..8126d46be 100755 --- a/cg/cg0300a.uml +++ b/cg/cg0300a.uml @@ -245,31 +245,26 @@ BEGIN PROMPT 2 9 "Operazioni imponibili " END -NUMBER F_IMPESC 15 +CURRENCY F_IMPESC 15 BEGIN PROMPT 25 9 "" HELP "Totale operazioni imponibili anno corrente" FIELD LF_ALLEG->IMPESC - FLAGS "R" - PICTURE "." MESSAGE K_TAB,F_TOTALE1|K_TAB,F_TOTALE5 END -NUMBER F_IMPESP 15 +CURRENCY F_IMPESP 15 BEGIN PROMPT 42 9 "" HELP "Totale operazioni imponibili anno corrente" FIELD LF_ALLEG->IMPESP - FLAGS "R" - PICTURE "." MESSAGE K_TAB,F_TOTALE1|K_TAB,F_TOTALE6 END -NUMBER F_TOTALE1 15 +CURRENCY F_TOTALE1 15 BEGIN PROMPT 60 9 "" - FLAGS "RD" - PICTURE "." + FLAGS "D" NUM_CALC {#F_IMPESP+#F_IMPESC} END @@ -278,31 +273,26 @@ BEGIN PROMPT 2 10 "Imposte addebitate " END -NUMBER F_IVAESC 15 +CURRENCY F_IVAESC 15 BEGIN PROMPT 25 10 "" HELP "Totale imposte addebitate dell'anno corrente" FIELD LF_ALLEG->IVAESC - FLAGS "R" - PICTURE "." MESSAGE K_TAB,F_TOTALE2|K_TAB,F_TOTALE5 END -NUMBER F_IVAESP 15 +CURRENCY F_IVAESP 15 BEGIN PROMPT 42 10 "" HELP "Totale imposte addebitate dell'anno precedente" FIELD LF_ALLEG->IVAESP - FLAGS "R" - PICTURE "." MESSAGE K_TAB,F_TOTALE2|K_TAB,F_TOTALE6 END -NUMBER F_TOTALE2 15 +CURRENCY F_TOTALE2 15 BEGIN PROMPT 60 10 "" - FLAGS "RD" - PICTURE "." + FLAGS "D" NUM_CALC {#F_IVAESP+#F_IVAESC} END @@ -324,31 +314,26 @@ BEGIN FLAGS "H" END -NUMBER F_NIESC 15 +CURRENCY F_NIESC 15 BEGIN PROMPT 25 11 "" FIELD LF_ALLEG->NIESC - FLAGS "R" - PICTURE "." HELP "Totale operazioni non imponibili ed esenti dell'anno corrente" MESSAGE K_TAB,F_TOTALE3|K_TAB,F_TOTALE5 END -NUMBER F_NIESP 15 +CURRENCY F_NIESP 15 BEGIN PROMPT 42 11 "" FIELD LF_ALLEG->NIESP - FLAGS "R" - PICTURE "." HELP "Totale operazioni non imponibili ed esenti dell'anno precedente" MESSAGE K_TAB,F_TOTALE3|K_TAB,F_TOTALE6 END -NUMBER F_TOTALE3 15 +CURRENCY F_TOTALE3 15 BEGIN PROMPT 60 11 "" - FLAGS "RD" - PICTURE "." + FLAGS "D" NUM_CALC {#F_NIESP+#F_NIESC} END @@ -358,34 +343,29 @@ BEGIN GROUP 6 END -NUMBER F_E8ESC 15 +CURRENCY F_E8ESC 15 BEGIN PROMPT 25 12 "" FIELD LF_ALLEG->E8ESC - FLAGS "R" GROUP 6 - PICTURE "." HELP "Totale operazioni non imponibili (Art. 8 2^c) dell'anno corrente" MESSAGE K_TAB,F_TOTALE4|K_TAB,F_TOTALE5 END -NUMBER F_E8ESP 15 +CURRENCY F_E8ESP 15 BEGIN PROMPT 42 12 "" FIELD LF_ALLEG->E8ESP - FLAGS "R" GROUP 6 - PICTURE "." HELP "Totale operazioni non imponibili (Art. 8 2^c) dell'anno precedente" MESSAGE K_TAB,F_TOTALE4|K_TAB,F_TOTALE6 END -NUMBER F_TOTALE4 15 +CURRENCY F_TOTALE4 15 BEGIN PROMPT 60 12 "" - FLAGS "RD" + FLAGS "D" GROUP 6 - PICTURE "." NUM_CALC {#F_E8ESP+#F_E8ESC} END @@ -394,19 +374,17 @@ BEGIN PROMPT 2 13 "Totale " END -NUMBER F_TOTALE5 15 +CURRENCY F_TOTALE5 15 BEGIN PROMPT 25 13 "" - FLAGS "RD" - PICTURE "." + FLAGS "D" NUM_CALC {#F_IMPESC+#F_IVAESC+#F_NIESC+#F_E8ESC} END -NUMBER F_TOTALE6 15 +CURRENCY F_TOTALE6 15 BEGIN PROMPT 42 13 "" - FLAGS "RD" - PICTURE "." + FLAGS "D" NUM_CALC {#F_IMPESP+#F_IVAESP+#F_NIESP+#F_E8ESP} END @@ -456,13 +434,13 @@ BEGIN FLAGS "H" END -NUMBER F_PROG101102 15 +CURRENCY F_PROG101102 15 BEGIN PROMPT 42 17 "" FIELD LF_ALLEG->PROG101102 - FLAGS "R" - PICTURE "." HELP "Totale operazioni non imponibili Art. 8 1^c, Artt. 8 bis, 9 e 72" END + ENDPAGE + ENDMASK diff --git a/cg/cg0400.cpp b/cg/cg0400.cpp index 225bdb043..dac59de38 100755 --- a/cg/cg0400.cpp +++ b/cg/cg0400.cpp @@ -25,6 +25,8 @@ enum liste { stampa=2, }; +enum tipo_sospensione { nessuna, normale, vol_affari, liquidazione }; + struct Importi { real imponibile; real imposta; @@ -122,6 +124,7 @@ class TProgressivi_iva : public TPrintapp int _sospmsk, _tipoprog, _livelloprog, _tipo_aliq, _tipo_attiv, _annoiva, _i; int _mese, _anno; long _codditta; + char _tipo_prog_reg; bool _st_inizio_anno, _prima_pagina; TIva_array _iva_array,_iva1_array; TGen_array _gen_array,_gen1_array; @@ -134,6 +137,8 @@ class TProgressivi_iva : public TPrintapp protected: static bool tipo_handler(TMask_field& f, KEY k); static bool selection_handler(TMask_field& f, KEY k); + static bool period_handler(TMask_field& f, KEY k); + static void check_period(TMask& m); public: @@ -144,6 +149,7 @@ public: virtual bool preprocess_page(int,int); virtual print_action postprocess_page(int,int); + bool is_month_plain(int x, int m, const char f); void lordo2netto(const real& totale, real& imponibile, real& imposta, const real& aliquota); void cerca_i_pim(); void azzera_mesi(); @@ -161,6 +167,8 @@ public: TProgressivi_iva(){}; }; +inline TProgressivi_iva& app() { return (TProgressivi_iva&) main_app(); } + HIDDEN int compare_rows(const TObject** o1, const TObject** o2) { TRiga_gen* r1 = (TRiga_gen*)*o1; @@ -169,6 +177,21 @@ HIDDEN int compare_rows(const TObject** o1, const TObject** o2) return (strcmp((const char*)r1->_codiva, (const char*)r2->_codiva)); } +bool TProgressivi_iva::is_month_plain(int x, int m, const char f) + // la piu' semplice: vero se mese == _month o se fa parte del + // trimestre indicato da month +{ + bool ok = x == m; + if (!ok && f == 'T') + { + // aggiusta al trimestre il mese da calcolare + int mto = m; + mto += 2 - ((mto-1) % 3); + ok = x > (mto - 3) && x <= mto; + } + return ok; +} + const char* TProgressivi_iva::desc_attivita(const char* codatt) { TTable attiv ("%AIS"); @@ -276,6 +299,7 @@ void TProgressivi_iva::look_pim() real imponibile, imposta,afi,afv,va7i,va7v; real corr_item,*cp,aliquota; bool is_key; + const char freq = look_lia(_codditta); _corr_array.destroy(); @@ -301,7 +325,8 @@ void TProgressivi_iva::look_pim() continue; if (!_st_inizio_anno) - if (mese != _mese) + //if (mese != _mese) + if (!is_month_plain(mese, _mese, freq)) continue; if (codatt != _cod_att) continue; @@ -313,6 +338,18 @@ void TProgressivi_iva::look_pim() reg.put("CODTAB",codreg); if (reg.read() != NOERR) reg.zero(); const bool corrisp = reg.get_bool("B0"); + + const tipo_sospensione sosp_imp = reg.get_bool("B1") ? (tipo_sospensione) reg.get_int("I9") : nessuna; + + // Se si decide di stampare i progressivi validi per la liquidazione + // i PIM validi solo per il volume d'affari vanno scartati + if (_tipo_prog_reg == 'L' && sosp_imp == vol_affari) + continue; + + // Se si decide di stampare i progressivi validi per il vol. d'affari + // i PIM validi solo per la liquidazione vanno scartati + if (_tipo_prog_reg == 'V' && sosp_imp == liquidazione) + continue; is_key = _corr_array.is_key(codiva); corr_item = ZERO; @@ -328,7 +365,7 @@ void TProgressivi_iva::look_pim() case acq_norm: if (_mese != 13) _gen_array.add_riga(codiva,ZERO,ZERO,imponibile,imposta,ZERO,ZERO); - if ((_st_inizio_anno && mese == _mese) || _mese == 13) //lo metto in un array a parte + if ((_st_inizio_anno && is_month_plain(mese, _mese, freq)) || _mese == 13) //lo metto in un array a parte _gen1_array.add_riga(codiva,ZERO,ZERO,imponibile,imposta,ZERO,ZERO); break; case vend_norm: @@ -353,13 +390,13 @@ void TProgressivi_iva::look_pim() if (_mese != 13) _gen_array.add_riga(codiva,imponibile,imposta,ZERO,ZERO,ZERO,ZERO); - if ((_st_inizio_anno && mese == _mese) || _mese == 13) //lo metto in un array a parte + if ((_st_inizio_anno && is_month_plain(mese, _mese, freq)) || _mese == 13) //lo metto in un array a parte _gen1_array.add_riga(codiva,imponibile,imposta,ZERO,ZERO,ZERO,ZERO); break; case bolle_doganali: if (_mese != 13) _gen_array.add_riga(codiva,ZERO,ZERO,ZERO,ZERO,imponibile,imposta); - if ((_st_inizio_anno && mese == _mese) || _mese == 13) + if ((_st_inizio_anno && is_month_plain(mese, _mese, freq)) || _mese == 13) _gen1_array.add_riga(codiva,ZERO,ZERO,ZERO,ZERO,imponibile,imposta); break; case acq_amm_ultdetr: @@ -367,7 +404,7 @@ void TProgressivi_iva::look_pim() real detr = imponibile * real(0.06); if (_mese != 13) _iva_array.add_riga(tipo,imponibile,imposta,detr); - if ((_st_inizio_anno && mese == _mese) || _mese == 13) + if ((_st_inizio_anno && is_month_plain(mese, _mese, freq)) || _mese == 13) _iva1_array.add_riga(tipo,imponibile,imposta,detr); } break; @@ -379,15 +416,18 @@ void TProgressivi_iva::look_pim() { if (_mese != 13) _iva_array.add_riga(tipo,imponibile,imposta,ZERO); - if ((_st_inizio_anno && mese == _mese) || _mese == 13) + if ((_st_inizio_anno && is_month_plain(mese, _mese, freq)) || _mese == 13) _iva1_array.add_riga(tipo,imponibile,imposta,ZERO); } break; - default: - if (_mese != 13) - _iva_array.add_riga(tipo,imponibile,imposta,ZERO); - if ((_st_inizio_anno && mese == _mese) || _mese == 13) - _iva1_array.add_riga(tipo,imponibile,imposta,ZERO); + default: + if (sosp_imp == normale || sosp_imp == nessuna) // Esclude quelli valevoli solo liq o solo vol.aff. dai riepiloghi altri dati + { + if (_mese != 13) + _iva_array.add_riga(tipo,imponibile,imposta,ZERO); + if ((_st_inizio_anno && is_month_plain(mese, _mese, freq)) || _mese == 13) + _iva1_array.add_riga(tipo,imponibile,imposta,ZERO); + } break; } } @@ -623,27 +663,57 @@ bool TProgressivi_iva::tipo_handler(TMask_field& f, KEY k) return TRUE; } +void TProgressivi_iva::check_period(TMask& m) +{ + app()._anno = m.get_int(F_ANNO); + const char f = app().look_lia(m.get_long(F_CODDITTA)); + m.show(-2); + m.show(F_MESE, f == 'M'); + m.show(F_TRIMESTRE, f == 'T'); +} + bool TProgressivi_iva::selection_handler(TMask_field& f, KEY k) { if (k == K_SPACE) { TMask& m = f.mask(); const int sel = atoi(f.get()); - if (sel == 1) + switch (sel) { - const bool b = atoi(m.field(F_LIVELLO).get()) == 1 ? TRUE : FALSE; - m.show(F_CODIVA,b); - m.show(F_ATTIVITA,!b); - tipo_handler(m.field(F_TIPO),K_SPACE); + case 1: + { + const bool b = atoi(m.field(F_LIVELLO).get()) == 1 ? TRUE : FALSE; + m.show(F_CODIVA,b); + m.show(F_ATTIVITA,!b); + tipo_handler(m.field(F_TIPO),K_SPACE); + } + break; + case 2: + check_period(m); + break; + default: break; } } return TRUE; } +bool TProgressivi_iva::period_handler(TMask_field& f, KEY k) +{ + if (f.to_check(k)) + { + TMask& m = f.mask(); + if (m.get_int(F_SELECTION) == 2) + check_period(m); + } + return TRUE; +} + bool TProgressivi_iva::set_print(int m) { TMask msk("cg0400a"); + msk.set_handler(F_CODDITTA, period_handler); + msk.set_handler(F_ANNO, period_handler); msk.set_handler(F_TIPO, tipo_handler); msk.set_handler(F_SELECTION, selection_handler); @@ -680,8 +750,9 @@ bool TProgressivi_iva::set_print(int m) _codditta = msk.get_long(F_CODDITTA); _anno = msk.get_int(F_ANNO); _datast = msk.get(F_DATASTAMPA); - _mese = msk.get_int(F_MESE); + _mese = msk.get_int(look_lia(_codditta) == 'M' ? F_MESE : F_TRIMESTRE); _st_inizio_anno = msk.get_bool(F_STAMPA); + _tipo_prog_reg = *msk.get(F_TIPOPROGREG); // L <=> Solo liquidazione, V <=> Solo volume d'affari prefix().set_codditta(_codditta); TLocalisamfile attiv(LF_ATTIV); @@ -1164,20 +1235,30 @@ void TProgressivi_iva::preprocess_header() set_header (soh++, (const char*)sep); sep.fill('-'); set_header (soh++, (const char *) sep); + + const char* pro_des = _tipo_prog_reg == 'L' ? "liquidazione IVA" : "Volume Affari"; + /* set_header (soh++, "Riepilogo progressivi IVA del periodo %s %d Cod. Att. %s %s", itom(_mese), _anno, (const char*) _cod_att, (const char*) descr); set_header (soh++, (const char *) sep); - */ + */ + TString periodo; + + if (f == 'M') + periodo = itom(_mese); + else + periodo.format("%d trimestre", ((_mese-1)/3) +1); + if (_st_inizio_anno) { if (_mese == 13 || (_mese == 12 && !_prima_pagina)) - set_header(soh++, "Riepilogo progressivi IVA annuale %d Cod. Att. %s %s", _anno, (const char*) _cod_att, (const char*) descr); + set_header(soh++, "Riepilogo progressivi %s annuale %d Cod. Att. %s %s", pro_des, _anno, (const char*) _cod_att, (const char*) descr); else if (_prima_pagina) - set_header(soh++, "Riepilogo progressivi IVA del periodo %s %d Cod. Att. %s %s", itom(_mese), _anno, (const char*) _cod_att, (const char*) descr); - else set_header(soh++, "Riepilogo progressivi IVA al Mese di: %s %d Cod. Att. %s %s", itom(_mese), _anno, (const char*) _cod_att, (const char*) descr); + set_header(soh++, "Riepilogo progressivi %s del periodo %s %d Cod. Att. %s %s", pro_des, (const char*) periodo, _anno, (const char*) _cod_att, (const char*) descr); + else set_header(soh++, "Riepilogo progressivi %s al%s: %s %d Cod. Att. %s %s", pro_des, f == 'M' ? " Mese di" : "", (const char*) periodo, _anno, (const char*) _cod_att, (const char*) descr); } - else set_header (soh++, "Riepilogo progressivi IVA del periodo %s %d Cod. Att. %s %s", itom(_mese), _anno, (const char*) _cod_att, (const char*) descr); + else set_header (soh++, "Riepilogo progressivi %s del periodo %s %d Cod. Att. %s %s", pro_des, (const char*) periodo, _anno, (const char*) _cod_att, (const char*) descr); set_header (soh, (const char *) sep); } } diff --git a/cg/cg0400.h b/cg/cg0400.h index 90821d9e3..cf85d65da 100755 --- a/cg/cg0400.h +++ b/cg/cg0400.h @@ -18,6 +18,8 @@ #define F_MESE 113 #define F_STAMPA 114 #define F_SELECTION 115 +#define F_TIPOPROGREG 116 +#define F_TRIMESTRE 117 #endif // __CG0400_H diff --git a/cg/cg0400a.uml b/cg/cg0400a.uml index bd80fb6dd..74de6b171 100755 --- a/cg/cg0400a.uml +++ b/cg/cg0400a.uml @@ -47,8 +47,8 @@ BEGIN PROMPT 2 5 "Tipo di stampa " ITEM "1|Riepilogo progressivi per aliquota" MESSAGE HIDE,2@|SHOW,3@ - ITEM "2|Riepilogo progressivi per mese" - MESSAGE SHOW,2@|HIDE,1@ + ITEM "2|Riepilogo progressivi per periodo" + MESSAGE HIDE,1@ END RADIOBUTTON F_LIVELLO 24 @@ -154,9 +154,9 @@ BEGIN GROUP 2 END -LISTBOX F_MESE 11 +LISTBOX F_MESE 12 BEGIN - PROMPT 2 11 "Mese riepilogo " + PROMPT 2 11 "Periodo riepilogo " ITEM "1|Gennaio" MESSAGE ENABLE,F_STAMPA ITEM "2|Febbraio" MESSAGE ENABLE,F_STAMPA ITEM "3|Marzo" MESSAGE ENABLE,F_STAMPA @@ -173,6 +173,25 @@ BEGIN GROUP 2 END +LISTBOX F_TRIMESTRE 12 +BEGIN + PROMPT 2 11 "Periodo riepilogo " + ITEM "3|1 Trimestre" MESSAGE ENABLE,F_STAMPA + ITEM "6|2 Trimestre" MESSAGE ENABLE,F_STAMPA + ITEM "9|3 Trimestre" MESSAGE ENABLE,F_STAMPA + ITEM "12|4 Trimestre" MESSAGE ENABLE,F_STAMPA + ITEM "13|Annuale" MESSAGE "X", F_STAMPA|DISABLE,F_STAMPA + GROUP 2 +END + +LISTBOX F_TIPOPROGREG 18 +BEGIN + PROMPT 35 11 "Tipo progressivi " + ITEM "L|Solo Liquidazione" + ITEM "V|Solo Volume Affari" + GROUP 2 +END + BOOLEAN F_STAMPA BEGIN PROMPT 2 13 "Stampa progressivi da inizio anno " diff --git a/cg/cg1.cpp b/cg/cg1.cpp index 3a3647c05..4f79a0dfc 100755 --- a/cg/cg1.cpp +++ b/cg/cg1.cpp @@ -12,7 +12,7 @@ int main(int argc,char** argv) case 2: cg1300(argc,argv); break; // Aggiornamenti case 3: - cg1400(argc,argv); break; // Stampa versamenti + cg1400(argc,argv); break; // Stampa deleghe iva case 4: cg1500(argc,argv); break; // Stampa bilanci case 5: diff --git a/cg/cg1200.cpp b/cg/cg1200.cpp index e44506a9c..b01241b8e 100755 --- a/cg/cg1200.cpp +++ b/cg/cg1200.cpp @@ -37,6 +37,7 @@ class TPrintclifo_app : public TPrintapp int _sort; int _interline; bool _mov_only; + int _ges_ven; TLocalisamfile* _mov; TLocalisamfile* _comuni; @@ -58,6 +59,7 @@ public: virtual bool check_autorization() const {return FALSE;} + virtual void on_firm_change(); virtual bool preprocess_page(int file, int counter); virtual bool preprocess_print(int file, int counter); virtual print_action postprocess_print(int file, int counter); @@ -74,6 +76,8 @@ public: { return current_cursor()->curr(ln).get(fn); } virtual void set_page (int file, int counter); + + bool ges_ven(); void set_elenco(); void set_rubriche(); void set_etichette(); @@ -88,7 +92,7 @@ public: const char* descrizione_allegato(char,long); TPrintclifo_app() : TPrintapp(),_piva(18), _cpercip(10), _fax(50), _telex(50), - _name(60), _telefono(90), _indir(70), _localita(90) + _name(60), _telefono(90), _indir(70), _localita(90), _ges_ven(-1) { _rel = NULL; _pr_type = undefined; _startrow = 2; _startcol = 3; _rows_et = 9; _cols_et = 40; @@ -359,18 +363,13 @@ print_action TPrintclifo_app::postprocess_print(int file, int counter) return NEXT_PAGE; } -bool gest_vend() -{ - TConfig c(CONFIG_DITTA,"cg"); - return c.get_bool("GesVen"); -} - bool rdbtype_handler(TMask_field& f, KEY k) { if (k == K_TAB) //every time that change focus or value, check flag to enable button { - if (gest_vend()) + TPrintclifo_app& a = (TPrintclifo_app&)main_app(); + if (a.ges_ven()) f.mask().enable(BUT_CG12_VENDITE); else f.mask().disable(BUT_CG12_VENDITE); @@ -785,7 +784,7 @@ void TPrintclifo_app::set_vendite(int f, int c) FLD(LF_CFVEN,CFV_CODVETT2,"@@@"), FLD(LF_CFVEN,CFV_CODVETT3,"@@@")); - set_row(8,"@9g@s @25g@pn @46g@pn @63g@n @76g@2s", + set_row(8,"@9g@s @25g@15,rpn @46g@15,rpn @63g@n @76g@2s", FLD(LF_CFVEN,CFV_RAGGOR),FLD(LF_CFVEN,CFV_MINORD,"."), FLD(LF_CFVEN,CFV_MAXORD,"."),FLD(LF_CFVEN,CFV_PREVORD), FLD(LF_CFVEN,CFV_TIPOEVORD)); @@ -973,13 +972,26 @@ bool TPrintclifo_app::preprocess_print(int file, int counter) return TRUE; } +void TPrintclifo_app::on_firm_change() +{ + TConfig c(CONFIG_DITTA, "cg"); + _ges_ven = c.get_bool("GesVen"); +} + +bool TPrintclifo_app::ges_ven() +{ + if (_ges_ven < 0) + on_firm_change(); + return _ges_ven != 0; +} + bool TPrintclifo_app::user_create() { // set relation and cursors _rel = new TRelation(LF_CLIFO); _rel->add(LF_COMUNI, "STATO==STATOCF|COM==COMCF", 1, 0, COMRF_ALIAS); _rel->add(LF_COMUNI, "STATO==STATONASC|COM==COMNASC", 1, 0, COMNASC_ALIAS); - if (gest_vend()) + if (ges_ven()) { _rel->add(LF_CFVEN,"TIPOCF=TIPOCF|CODCF=CODCF"); _rel->add(LF_INDSP,"TIPOCF=TIPOCF|CODCF=CODCF"); @@ -990,11 +1002,12 @@ bool TPrintclifo_app::user_create() _cur_1 = add_cursor(new TCursor(_rel,"",1)); _cur_2 = add_cursor(new TCursor(_rel,"",2)); add_file(LF_CLIFO); - if (gest_vend()) + if (ges_ven()) { add_file(LF_CFVEN,LF_CLIFO); add_file(LF_INDSP,LF_CLIFO); } + set_magic_currency(TRUE); enable_print_menu(); return TRUE; } diff --git a/cg/cg1400.cpp b/cg/cg1400.cpp index 404526cab..4da84fa69 100755 --- a/cg/cg1400.cpp +++ b/cg/cg1400.cpp @@ -1,12 +1,12 @@ #include #include +#include #include #include #include #include #include #include -#include #include #include "cg1400.h" @@ -53,7 +53,7 @@ bool TStampa_deleghe_IVA::create() _banche = new TTable("%BAN"); - _ditte = new TArray_sheet(-1, -1, -4, -4, "Selezione Deleghe da stampare", + _ditte = new TArray_sheet(3, 3, -3, -3, "Selezione Deleghe da stampare", "@1|Cod.@5|Ragione Sociale@30|Importo@15R|Interessi@15R|ABI@5|CAB@5|Concessione|Tit. Conto Fis."); _azienda = "" ; diff --git a/cg/cg1600.cpp b/cg/cg1600.cpp index 07436decf..b1f6b4b9c 100755 --- a/cg/cg1600.cpp +++ b/cg/cg1600.cpp @@ -2016,8 +2016,9 @@ bool TStampa_IVdirettiva::calcola(int g, int c, long s, continue; const TString& codcaus = mov.get(MOV_CODCAUS); - const char movap = toupper(causali.decode(codcaus)[0]); - + char movap = causali.decode(codcaus)[0]; + movap = toupper(movap); + if (movap == 'C' && // la causale e' di chiusura !_quadratura) // Non e' richiesta la quadratura con il Libro Giornale (Modifica continue; // del 18-06-96 richiesta da Patrizia in seguito alla modifica dei SALDI diff --git a/cg/cg2100.cpp b/cg/cg2100.cpp index 4bfe8e484..e0c7b117f 100755 --- a/cg/cg2100.cpp +++ b/cg/cg2100.cpp @@ -183,18 +183,6 @@ TMask* TPrimanota_application::load_mask(int n) return m; } -void TPrimanota_application::open_files(int logicnum, ...) -{ - va_list marker; - va_start(marker, logicnum); - while (logicnum > 0) - { - CHECKD(_file.objptr(logicnum) == NULL, "File gia' aperto: ", logicnum); - _file.add(new TLocalisamfile(logicnum), logicnum); - logicnum = va_arg(marker, int); - } -} - bool TPrimanota_application::user_create() { open_files(LF_TABCOM, LF_TAB, LF_CAUSALI, LF_RCAUSALI, LF_CLIFO, LF_PCON, 0); @@ -241,8 +229,6 @@ bool TPrimanota_application::user_destroy() delete _incasso; - close_files(); - return TRUE; } @@ -724,14 +710,14 @@ void TPrimanota_application::init_modify_mode(TMask& m) bool TPrimanota_application::test_swap(bool ritsoc) { const char sez = ritsoc ? causale().sezione_ritsoc() : causale().sezione_clifo(); - const bool s = (iva() == iva_vendite) ^ sez == 'D'; + const bool s = (iva() == iva_vendite) ^ (sez == 'D'); return s; } int TPrimanota_application::read(TMask& m) { m.reset(); // Azzera campi e relativi dirty = 3 - m.autoload(*_rel); // Carica testata + m.autoload(*_rel); // Carica testata const long numreg = _rel->curr().get_long(MOV_NUMREG); @@ -746,12 +732,12 @@ int TPrimanota_application::read(TMask& m) ivas().reset(); // Azzera tutte le righe iva occas_mask().reset(); - const TString16 occode(_rel->lfile().get("OCFPI")); + const TString16 occode(_rel->curr().get("OCFPI")); occas_mask().set(O_CODICE, occode, TRUE); } _saldi.reset(); // Azzera saldi - _saldi.set_movprovv(_rel->lfile().get_char(MOV_PROVVIS) > ' '); + _saldi.set_movprovv(_rel->curr().get_char(MOV_PROVVIS) > ' '); tiposal tsal = causale().apertura() ? apertura : (causale().chiusura() ? chiusura : normale); _saldi.set_tipo_saldo(tsal); @@ -806,7 +792,7 @@ int TPrimanota_application::read(TMask& m) { real totdoc(m.get(F_TOTALE)); totdoc = -totdoc; - m.set(F_TOTALE, totdoc.string()); + m.set(F_TOTALE, totdoc); } for (i = 0; i < _rel->iva_items(); i++) { @@ -1111,6 +1097,7 @@ int TPrimanota_application::write(const TMask& m) link_m770(); link_cesp(m, "Insert"); + link_intra(m, "Insert"); } lasterr = err; @@ -1154,6 +1141,7 @@ int TPrimanota_application::rewrite(const TMask& m) link_m770(); link_cesp(m, "Modify"); + link_intra(m, "Modify"); } return err; @@ -1184,6 +1172,7 @@ bool TPrimanota_application::remove() } } link_cesp(m, "Remove"); + link_intra(m, "Remove"); if (easydoc_connected()) run_easydoc("Elimina"); @@ -1689,25 +1678,83 @@ bool TPrimanota_application::link_cesp(const TMask& msk, const char* action) return ok; } +bool TPrimanota_application::link_intra(const TMask& m, const char* action) +{ + // Controlla autorizzazione + if (!has_module(INAUT)) + return FALSE; + + // Controlla flag sulla causale + if (!causale().intra()) + return FALSE; + + // Controlla l'esistenza del programma cespiti + if (!fexist("in0.exe")) + return FALSE; + + TFilename intrini; + intrini.tempdir(); + intrini.add("ActIntra.ini"); + + TConfig intro(intrini, "Transaction"); + intro.set("Action", action); + + TString str; // Stringa jolly di lavoro + + str.format("%d", LF_INTRA); + intro.set_paragraph(str); + intro.set("NUMREG", m.get(F_NUMREG)); + if (m.field(F_CLIENTE).shown()) + { + intro.set("TIPOMOV", "C"); + intro.set("TIPOCF", "C"); + intro.set("CODCF", m.get(F_CLIENTE)); + } + else + { + intro.set("TIPOMOV", "A"); + intro.set("TIPOCF", "F"); + intro.set("CODCF", m.get(F_FORNITORE)); + } + intro.set("TOTDOC", m.get(F_CORRLIRE)); + intro.set("CODVAL", m.get(F_VALUTAINTRA)); + intro.set("CAMBIO", m.get(F_CAMBIOINTRA)); + + intro.set_paragraph(""); // Flush + + str = "in0 -4 /i"; str << intrini; + TExternal_app app(str); + bool ok = app.run() == 0; + ::remove(intrini); + return ok; +} + + bool TPrimanota_application::protected_record(TRectype& mov) { bool ok = !TRelation_application::protected_record(mov); if (ok && autodeleting() == 0x3) { if (mov.get_bool(MOV_STAMPATO)) - { + { + static long last_checked_numreg = 0L; const long numreg = mov.get_long(MOV_NUMREG); - ok = yesno_box("Il movimento %ld e' gia' stato stampato sul libro giornale:\n" - "si desidera eliminarlo ugualmente?", numreg); - if (ok && mov.get_bool(MOV_REGST)) + if (last_checked_numreg != numreg) { - ok = yesno_box("Il movimento %ld e' gia' stato stampato sul bollato:\n" - "si desidera eliminarlo ugualmente?", numreg); - } - if (ok && mov.get_bool(MOV_INVIATO)) - { - ok = yesno_box("Il movimento %ld e' stato inviato ad un'altra contabilita':\n" + ok = yesno_box("Il movimento %ld e' gia' stato stampato sul libro giornale:\n" "si desidera eliminarlo ugualmente?", numreg); + if (ok && mov.get_bool(MOV_REGST)) + { + ok = yesno_box("Il movimento %ld e' gia' stato stampato sul bollato:\n" + "si desidera eliminarlo ugualmente?", numreg); + } + if (ok && mov.get_bool(MOV_INVIATO)) + { + ok = yesno_box("Il movimento %ld e' stato inviato ad un'altra contabilita':\n" + "si desidera eliminarlo ugualmente?", numreg); + } + if (ok) + last_checked_numreg = numreg; } } } diff --git a/cg/cg2100b.uml b/cg/cg2100b.uml index 7571e2de9..e4fb7aac2 100755 --- a/cg/cg2100b.uml +++ b/cg/cg2100b.uml @@ -213,22 +213,21 @@ BEGIN WARNING "E' stata specificata una valuta senza il cambio relativo" END -NUMBER F_TOTALE 18 +CURRENCY F_TOTALE 18 BEGIN PROMPT 2 12 "Importo movimento " - PICTURE "." GROUP 5 FIELD TOTDOC VALIDATE REQIF_FUNC 1 SK_TOTDOCVAL MESSAGE COPY,K_TOTALE END -NUMBER SK_TOTDOCVAL 18 3 +CURRENCY SK_TOTDOCVAL 18 BEGIN - PROMPT 44 12 "Totale in valuta " - PICTURE ".3" + PROMPT 41 12 "Totale in valuta " GROUP 3 5 VALIDATE REQIF_FUNC 1 F_TOTALE + DRIVENBY SK_VALUTA FIELD TOTDOCVAL END @@ -307,18 +306,16 @@ BEGIN FLAGS "D" END -NUMBER K_TOTALE 18 +CURRENCY K_TOTALE 18 BEGIN PROMPT 1 7 "Imp. mov. " - PICTURE "." FLAGS "D" GROUP 5 END -NUMBER K_RESIDUO 18 +CURRENCY K_RESIDUO 18 BEGIN PROMPT 32 7 "Residuo " - PICTURE "." FLAGS "D" GROUP 5 END @@ -352,18 +349,16 @@ BEGIN ITEM "Tipo@4" END -NUMBER F_DARE 18 +CURRENCY F_DARE 18 BEGIN PROMPT 1 -1 "Sbilancio Dare " FLAGS "DRV" - PICTURE "." END -NUMBER F_AVERE 18 +CURRENCY F_AVERE 18 BEGIN PROMPT 41 -1 "Sbilancio Avere " FLAGS "DRV" - PICTURE "." END ENDPAGE diff --git a/cg/cg2100c.uml b/cg/cg2100c.uml index 02504a7f0..6b7cfe4f6 100755 --- a/cg/cg2100c.uml +++ b/cg/cg2100c.uml @@ -436,7 +436,7 @@ BEGIN DISPLAY "Cod" CODTAB[1,3] DISPLAY "Data@10" D0 DISPLAY "Cambio@18" R10 - DISPLAY "Valuta@60" 104@->S0 + DISPLAY "Valuta@50" 104@->S0 OUTPUT SK_DATACAMBIO D0 OUTPUT SK_CAMBIO R10 GROUP 3 @@ -454,20 +454,19 @@ BEGIN WARNING "Inserire il cambio o eliminare il codice valuta" END -NUMBER F_TOTALE 18 +CURRENCY F_TOTALE 18 BEGIN PROMPT 1 14 "Totale documento " FIELD TOTDOC - PICTURE "." END -NUMBER SK_TOTDOCVAL 18 3 +CURRENCY SK_TOTDOCVAL 18 BEGIN PROMPT 38 14 "in valuta " FIELD TOTDOCVAL GROUP 3 - PICTURE ".3" VALIDATE REQIF_FUNC 1 F_TOTALE + DRIVENBY SK_VALUTA END STRING F_CODIVA 4 @@ -486,20 +485,16 @@ BEGIN WARNING "Codice IVA assente" END -NUMBER F_RITFIS 18 +CURRENCY F_RITFIS 18 BEGIN PROMPT 1 15 "Ritenute fiscali " FIELD RITFIS - FLAGS "RV" - PICTURE "." END -NUMBER F_RITSOC 18 +CURRENCY F_RITSOC 18 BEGIN PROMPT 1 16 "Ritenute sociali " FIELD RITSOC - FLAGS "RV" - PICTURE "." END DATE F_DATA74TER @@ -551,21 +546,20 @@ BEGIN PICTURE ".5" END -NUMBER F_CORRLIRE 18 +CURRENCY F_CORRLIRE 18 BEGIN - PROMPT 1 18 "Corrispett. Lire " + PROMPT 1 18 "Corrispettivo " FIELD CORRLIRE - PICTURE "." GROUP 4 END -NUMBER F_CORRVALUTA 18 3 +CURRENCY F_CORRVALUTA 18 BEGIN PROMPT 39 18 "Corrispet. valuta " FIELD CORRVALUTA - PICTURE ".3" GROUP 4 VALIDATE REQIF_FUNC 1 F_VALUTAINTRA + DRIVENBY F_VALUTAINTRA END ENDPAGE @@ -622,18 +616,16 @@ BEGIN ITEM "Descrizione Conto@50" END -NUMBER F_IMPONIBILI 18 +CURRENCY F_IMPONIBILI 18 BEGIN PROMPT 1 11 "Totale imponibili " - FLAGS "DV" - PICTURE "." + FLAGS "D" END -NUMBER F_IMPOSTE 18 +CURRENCY F_IMPOSTE 18 BEGIN PROMPT 41 11 "Totale imposte " - FLAGS "DV" - PICTURE "." + FLAGS "D" END SPREADSHEET F_SHEETCG 0 -2 @@ -657,18 +649,16 @@ BEGIN ITEM "Tipo@4" END -NUMBER F_DARE 18 +CURRENCY F_DARE 18 BEGIN PROMPT 1 -1 "Sbilancio Dare " - FLAGS "DRV" - PICTURE "." + FLAGS "D" END -NUMBER F_AVERE 18 +CURRENCY F_AVERE 18 BEGIN PROMPT 41 -1 "Sbilancio Avere " - FLAGS "DRV" - PICTURE "." + FLAGS "D" END ENDPAGE diff --git a/cg/cg2100i.uml b/cg/cg2100i.uml index b0fd67e60..17055b355 100755 --- a/cg/cg2100i.uml +++ b/cg/cg2100i.uml @@ -94,13 +94,11 @@ BEGIN ITEM "A|Avere" END -NUMBER F_TOTALE 15 +CURRENCY F_TOTALE 15 BEGIN PROMPT 18 7 "" HELP "Importo del conto di prima riga" FIELD LF_MOV->TOTDOC - FLAGS "R" - PICTURE "." CHECKTYPE REQUIRED MESSAGE COPY,I_IMPORTO2 END @@ -198,12 +196,10 @@ BEGIN ITEM "A|Avere" END -NUMBER I_IMPORTO2 15 +CURRENCY I_IMPORTO2 15 BEGIN PROMPT 18 8 "" HELP "Importo del conto di seconda riga" - PICTURE "." - FLAGS "R" END LIST DLG_NULL 1 10 @@ -252,12 +248,10 @@ BEGIN ITEM "A|Avere" END -NUMBER I_IMPORTO3 15 +CURRENCY I_IMPORTO3 15 BEGIN PROMPT 18 9 "" HELP "Importo del conto di terza riga" - PICTURE "." - FLAGS "R" END LIST DLG_NULL 1 10 @@ -304,12 +298,10 @@ BEGIN ITEM "A|Avere" END -NUMBER I_IMPORTO4 15 +CURRENCY I_IMPORTO4 15 BEGIN PROMPT 18 10 "" HELP "Importo del conto di quarta riga" - PICTURE "." - FLAGS "R" END LIST DLG_NULL 1 10 diff --git a/cg/cg2100k.uml b/cg/cg2100k.uml index 198ae6009..41b8fc104 100755 --- a/cg/cg2100k.uml +++ b/cg/cg2100k.uml @@ -51,5 +51,3 @@ END ENDPAGE ENDMASK - - diff --git a/cg/cg2100p.h b/cg/cg2100p.h index 7ec4396a8..422242af0 100755 --- a/cg/cg2100p.h +++ b/cg/cg2100p.h @@ -60,6 +60,10 @@ #define S_VALUTA 138 #define S_DATACAMBIO 139 #define S_CAMBIO 140 +#define S_CODVAL 327 + +#define S_DESCVSABID 141 +#define S_DESCNSABID 142 #endif diff --git a/cg/cg2100p.uml b/cg/cg2100p.uml index 30fda1e64..aea27092a 100755 --- a/cg/cg2100p.uml +++ b/cg/cg2100p.uml @@ -69,18 +69,17 @@ BEGIN FLAGS "U" END -NUMBER P_RESIDUO 18 +CURRENCY P_RESIDUO 18 BEGIN PROMPT 25 3 "Residuo " FLAGS "D" - PICTURE "." END -NUMBER P_RESIDUOVAL 18 3 +CURRENCY P_RESIDUOVAL 18 BEGIN PROMPT 53 3 "" FLAGS "D" - PICTURE ".3" + DRIVENBY P_VALUTA END SPREADSHEET P_PARTITE 0 7 diff --git a/cg/cg2100s.uml b/cg/cg2100s.uml index c6b9f6119..52c0f6d61 100755 --- a/cg/cg2100s.uml +++ b/cg/cg2100s.uml @@ -49,12 +49,12 @@ END NUMBER S_NUMPROT 5 BEGIN PROMPT 56 2 "Protocollo IVA " - FLAGS "DR" + FLAGS "D" END -STRING S_DESCR 50 +STRING S_DESCR 51 BEGIN - PROMPT 2 3 "Descrizione " + PROMPT 2 3 "Descrizione " FLAGS "D" END @@ -66,61 +66,62 @@ BEGIN FLAGS "D" END -NUMBER S_IMPORTO_SCAD 18 +CURRENCY S_IMPORTO_SCAD 18 BEGIN - PROMPT 18 4 "Importo " - PICTURE "." - FLAGS "DR" + PROMPT 17 4 "Importo " + FLAGS "D" END -NUMBER S_IMPORTOVAL_SCAD 18 3 +STRING S_CODVAL 3 BEGIN - PROMPT 43 4 "Importo in valuta " - PICTURE ".3" - FLAGS "DRV" + PROMPT 41 9 "Codice valuta " + FLAGS "DU" +END + +CURRENCY S_IMPORTOVAL_SCAD 18 +BEGIN + PROMPT 45 4 "in valuta " + FLAGS "D" + DRIVENBY S_CODVAL GROUP 3 END -NUMBER S_RESIDUOPAG 18 +CURRENCY S_RESIDUOPAG 18 BEGIN - PROMPT 2 5 "Residuo pagamento " - PICTURE "." - FLAGS "DR" + PROMPT 2 5 "Residuo pagamento " + FLAGS "D" END -NUMBER S_RESIDUORATA 18 +CURRRENCY S_RESIDUORATA 18 BEGIN - PROMPT 46 5 "Residuo rata " - PICTURE "." - FLAGS "DRV" + PROMPT 45 5 "Residuo rata " + FLAGS "D" END -GROUPBOX DLG_NULL 78 12 +GROUPBOX DLG_NULL 78 14 BEGIN PROMPT 1 7 "@BPagamento" END -NUMBER S_IMPORTO 18 +CURRENCY S_IMPORTO 18 BEGIN PROMPT 2 8 "Importo pagamento " - PICTURE "." FIELD IMPORTO VALIDATE REQIF_FUNC 1 S_IMPORTOVAL WARNING "L'importo deve essere specificato" END -NUMBER S_RITENUTE 18 +CURRENCY S_RITENUTE 18 BEGIN PROMPT 41 8 "Ritenute profess. " - PICTURE "." FIELD RITENUTE MESSAGE DIRTY,S_IMPORTO|K_TAB,S_IMPORTO END -NUMBER S_IMPORTOVAL 18 3 +CURRENCY S_IMPORTOVAL 18 BEGIN PROMPT 2 9 "Importo in valuta " - PICTURE ".3" + DRIVENBY S_CODVAL FIELD IMPORTOVAL GROUP 3 VALIDATE REQIF_FUNC 1 S_IMPORTO @@ -251,6 +252,20 @@ NUMBER S_VSABI 5 BEGIN PROMPT 2 15 "Vs. Banca ABI " FLAGS "Z" + USE %BAN SELECT CODTAB ? "?????" + INPUT CODTAB[1,5] S_VSABI + DISPLAY "ABI@5" CODTAB[1,5] + DISPLAY "Denominazione@50" S0 + OUTPUT S_VSABI CODTAB[1,5] + OUTPUT S_DESCVSABID S0 + CHECKTYPE NORMAL + FIELD CODABI +END + +NUMBER S_VSCAB 5 +BEGIN + PROMPT 25 15 "CAB " + FLAGS "Z" USE %BAN INPUT CODTAB[1,5] S_VSABI INPUT CODTAB[6,10] S_VSCAB @@ -261,15 +276,6 @@ BEGIN OUTPUT S_VSCAB CODTAB[6,10] OUTPUT S_DESCVSABI S0 CHECKTYPE NORMAL - FIELD CODABI -END - -NUMBER S_VSCAB 5 -BEGIN - PROMPT 25 15 "CAB " - FLAGS "Z" - COPY ALL S_VSABI - CHECKTYPE NORMAL FIELD CODCAB END @@ -281,13 +287,20 @@ BEGIN DISPLAY "Denominazione@50" S0 DISPLAY "ABI@5" CODTAB[1,5] DISPLAY "CAB@5" CODTAB[6,10] - COPY OUTPUT S_VSABI + COPY OUTPUT S_VSCAB CHECKTYPE NORMAL END +STRING S_DESCVSABID 50 37 +BEGIN + PROMPT 37 16 "" + CHECKTYPE NORMAL + FLAGS "D" +END + STRING S_AGENTE 5 BEGIN - PROMPT 2 16 "Agente " + PROMPT 2 17 "Agente " FLAGS "UZ" USE LF_AGENTI INPUT CODAGE S_AGENTE @@ -301,7 +314,7 @@ END STRING S_DESCAGENTE 50 BEGIN - PROMPT 24 16 "" + PROMPT 24 17 "" USE LF_AGENTI KEY 2 INPUT RAGSOC S_DESCAGENTE DISPLAY "Descrizione @50" RAGSOC @@ -312,38 +325,49 @@ END NUMBER S_NSABI 5 BEGIN - PROMPT 2 17 "Ns. Banca ABI " + PROMPT 2 18 "Ns. Banca ABI " FLAGS "Z" COPY USE S_VSABI INPUT CODTAB[1,5] S_NSABI - INPUT CODTAB[6,10] S_NSCAB COPY DISPLAY S_VSABI OUTPUT S_NSABI CODTAB[1,5] - OUTPUT S_NSCAB CODTAB[6,10] - OUTPUT S_DESCNSABI S0 + OUTPUT S_DESCNSABID S0 FIELD CODABIPR CHECKTYPE NORMAL END NUMBER S_NSCAB 5 BEGIN - PROMPT 25 17 "CAB " + PROMPT 25 18 "CAB " FLAGS "Z" - COPY ALL S_NSABI + COPY USE S_VSCAB + INPUT CODTAB[1,5] S_NSABI + INPUT CODTAB[6,10] S_NSCAB + COPY DISPLAY S_VSCAB + OUTPUT S_NSABI CODTAB[1,5] + OUTPUT S_NSCAB CODTAB[6,10] + OUTPUT S_DESCNSABI S0 FIELD CODCABPR CHECKTYPE NORMAL END STRING S_DESCNSABI 50 37 BEGIN - PROMPT 37 17 "" + PROMPT 37 18 "" COPY USE S_DESCVSABI INPUT S0 S_DESCNSABI COPY DISPLAY S_DESCVSABI - COPY OUTPUT S_NSABI + COPY OUTPUT S_NSCAB CHECKTYPE NORMAL END +STRING S_DESCNSABID 50 37 +BEGIN + PROMPT 37 19 "" + CHECKTYPE NORMAL + FLAGS "D" +END + ENDPAGE ENDMASK diff --git a/cg/cg2102.cpp b/cg/cg2102.cpp index c019bd512..12c7297c4 100755 --- a/cg/cg2102.cpp +++ b/cg/cg2102.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -55,7 +56,8 @@ const real& TPrimanota_application::cod2IVA(const TMask& m) // Certified 99% Non sono sicurissimo degli imponibili negativi real TPrimanota_application::scorpora(real& imponibile, const real& percent) { - real imposta = abs(imponibile) * percent / (percent + 100.0); imposta.ceil(); + real imposta = abs(imponibile) * percent / (percent + 100.0); + imposta.ceil(TCurrency::get_firm_dec()); if (imponibile.sign() < 0) imposta = -imposta; imponibile -= imposta; return imposta; @@ -532,23 +534,28 @@ HIDDEN bool imptot_error(const TImporto& imptot, const TImporto& impsal, bool va { TImporto cassa(impsal); cassa.swap_section(); TImporto residuo(imptot); residuo -= cassa; residuo.normalize(imptot.sezione()); - bool ok = residuo.is_zero(); - if (!ok) - { - const char* const pic = val ? ".3" : "."; + + if (!residuo.is_zero()) + { TPrimanota_application& a = app(); const TMask& m = a.curr_mask(); + TString16 codval; if (val) codval = m.get(SK_VALUTA); + TCurrency euro(imptot.valore(), codval); TString msg(255); msg << "Il totale documento "; - if (val) - msg << "in valuta " << m.get(SK_VALUTA); + if (codval.not_empty()) + msg << "in valuta " << codval; else - msg << "inserito"; - msg << " e' " << imptot.valore().string(pic) << ' ' << imptot.sezione() << ",\n"; + msg << "inserito"; + msg << " e' " << euro.string(TRUE) << ' ' << imptot.sezione() << ",\n"; + + euro.set_num(cassa.valore()); msg << "i pagamenti e le spese ammontano a " - << cassa.valore().string(pic) << ' ' << cassa.sezione() << ",\n"; - msg << "per cui il residuo e' " << residuo.valore().string(pic) << '.'; + << euro.string(TRUE) << ' ' << cassa.sezione() << ",\n"; + + euro.set_num(residuo.valore()); + msg << "per cui il residuo e' " << euro.string(TRUE) << '.'; if (m.edit_mode() && impsal.is_zero()) { @@ -569,11 +576,11 @@ bool TPrimanota_application::cg_handler(TMask_field& f, KEY k) if (k == K_ENTER) { TPrimanota_application& a = app(); - const real saldo = a.calcola_saldo(); + const TCurrency saldo(a.calcola_saldo()); - if (saldo != ZERO) + if (!saldo.get_num().is_zero()) { - const char* ss = saldo.string("."); + const char* ss = saldo.string(TRUE); if (*ss == '-') ss++; return f.error_box("Il movimento e' sbilanciato di %s lire.", ss); } @@ -624,8 +631,9 @@ bool TPrimanota_application::cg_handler(TMask_field& f, KEY k) if (errato) { TString msg(128); + const TCurrency euro(speso.valore()); msg << "L'importo sul saldaconto della riga " << currig << " e' " - << speso.valore().string("."); + << euro.string(TRUE); if (!speso.is_zero()) msg << (speso.sezione() == 'A' ? " Avere" : " Dare"); @@ -819,7 +827,6 @@ void TPrimanota_application::generazione_righe_cg(int r) } } - int TPrimanota_application::crea_somma_spese(TImporto& imp) { TBill cassa; causale().bill(2, cassa); @@ -876,9 +883,7 @@ bool TPrimanota_application::cg_notify(TSheet_field& cg, int r, KEY k) else { if (tipo == 'K') - { a.notify_cgline_deletion(r+1); - } break; } case K_ENTER: @@ -973,7 +978,7 @@ bool TPrimanota_application::descr_handler(TMask_field& f, KEY k) if (k == K_ENTER && f.get().empty()) { if (f.mask().get(F_CODCAUS).empty()) - return f.error_box("La descrizione del documento e' necessaria in mancanza della causale"); + return f.error_box("La descrizione del documento e' necessaria in assenza della causale"); } return TRUE; } @@ -1139,13 +1144,14 @@ bool TPrimanota_application::imposta_handler(TMask_field& f, KEY key) const real imponibile(f.mask().get(101)); const real percent = app().causale().corrispettivi() ? ZERO : cod2IVA(f.mask()); real imposta = abs(imponibile) * percent / 100.0; - imposta.ceil(); + imposta.ceil(TCurrency::get_firm_dec()); if (imponibile.sign() < 0) imposta = -imposta; const real val(f.get()); if (val != imposta) - { - f.warning_box("L'imposta dovrebbe essere %s", (const char*)imposta.string(".")); + { + const TCurrency euro(imposta); + f.warning_box("L'imposta dovrebbe essere %s", euro.string(TRUE)); } } else if (key == K_F8) @@ -1153,10 +1159,11 @@ bool TPrimanota_application::imposta_handler(TMask_field& f, KEY key) real imposta(f.get()); if (imposta.is_zero()) { - real imponibile(f.mask().get(101)); + TMask& m = f.mask(); + real imponibile(m.get(101)); const real& percent = cod2IVA(f.mask()); imposta = scorpora(imponibile, percent); - f.mask().set(101, imponibile.string()); + m.set(101, imponibile); f.set(imposta.string()); } else @@ -1261,7 +1268,7 @@ bool TPrimanota_application::iva_notify(TSheet_field& iva, int r, KEY k) if (ri == 4) // Se non esiste il conto IVA indetraibile ... { // ... somma imponibile e imposta oldimp += oldiva; - oldiva.set('D', 0.0); + oldiva.set('D', ZERO); } } @@ -1432,16 +1439,17 @@ bool TPrimanota_application::iva_handler(TMask_field& f, KEY k) { if ((k == K_TAB && !f.mask().is_running()) || k == K_ENTER) { - const real imp = app().calcola_imp(); + const TCurrency imp(app().calcola_imp()); if (k == K_ENTER) { - const real tot = app().totale_documento(); + const TCurrency tot(app().totale_documento()); if (imp != tot) { - const TString t(tot.string(".")); - const TString i(imp.string(".")); + const TString t(tot.string(TRUE)); + const TString i(imp.string(TRUE)); return error_box("La somma del totale documento e delle ritenute (%s) e' diverso dalla " - "somma degli imponibili e delle imposte (%s)", (const char*)t, (const char*)i); + "somma degli imponibili e delle imposte (%s)", + (const char*)t, (const char*)i); } TSheet_field& iva = app().ivas(); @@ -2266,8 +2274,8 @@ bool TPrimanota_application::totdoc_handler(TMask_field& f, KEY key) if (key == K_ENTER) { - const real totale(f.get()); - if (totale.is_zero()) + const TCurrency totale(real(f.get())); + if (totale.get_num().is_zero()) ok = yesno_box("Totale documento nullo: continuare ugualmente?"); if (ok) @@ -2276,10 +2284,10 @@ bool TPrimanota_application::totdoc_handler(TMask_field& f, KEY key) if (cambio.in_valuta()) { const real totval(m.get(SK_TOTDOCVAL)); - const real totlit = cambio.val2lit(totval); + const TCurrency totlit(cambio.val2lit(totval)); if (totale != totlit) ok = f.yesno_box("Il totale documento in lire dovrebbe essere %s: continuare ugualmente?", - totlit.string(".")); + totlit.string(TRUE)); } } } diff --git a/cg/cg2102.h b/cg/cg2102.h index 53e850e37..f01dbaec3 100755 --- a/cg/cg2102.h +++ b/cg/cg2102.h @@ -29,7 +29,6 @@ class TDati_incasso; class TPrimanota_application : public TRelation_application { - TArray _file; // Tutti i fiels da usare TMovimentoPN* _rel; // Relazione principale TPagamento* _pag; @@ -177,8 +176,6 @@ protected: TMask* load_mask(int n); TMask& occas_mask() { return *load_mask(3); } - void open_files(int logicnum, ...); - void close_files() { _file.destroy(); } void mask2rel(const TMask& m); @@ -268,6 +265,7 @@ protected: long calcola_m770(int tipo_coll, real& spese, real& compenso, real& iva, real& ritfis); bool link_m770(); bool link_cesp(const TMask& msk, const char* action); + bool link_intra(const TMask& msk, const char* action); public: static char row_type(const TToken_string& s); diff --git a/cg/cg2104.cpp b/cg/cg2104.cpp index 9a479259b..8402a6394 100755 --- a/cg/cg2104.cpp +++ b/cg/cg2104.cpp @@ -3,6 +3,7 @@ // fv 24/8/94 // -------------------------------------------------------------------------- +#include #include #include @@ -239,7 +240,8 @@ bool TPrimanota_application::pag_sheet_handler(TMask_field& f, KEY key) return f.error_box(s); } - const bool in_valuta = m.get(SK_VALUTA).not_empty(); + const TString& codval = m.get(SK_VALUTA); + const bool in_valuta = pag.in_valuta(); real imp; if (key == K_ENTER && m.edit_mode()) @@ -253,9 +255,10 @@ bool TPrimanota_application::pag_sheet_handler(TMask_field& f, KEY key) if (imp != tot) { - const char* const pic = in_valuta ? ".3" : "."; - const TString is(imp.string(pic)); - const TString ts(tot.string(pic)); + TCurrency curr(imp, in_valuta ? (const char*)codval : "_FIRM"); + const TString is = curr.string(TRUE); + curr.set_num(tot); + const TString ts = curr.string(TRUE); ok = yesno_box("Il totale delle rate e' %s mentre\n" "il totale del documento e' %s.\n" "Si desidera registrare ugualmente?", @@ -273,9 +276,11 @@ bool TPrimanota_application::pag_sheet_handler(TMask_field& f, KEY key) imp.round(pag.round(FALSE)); if (imp != totlit) - { - const TString is(imp.string(".")); - const TString ts(totlit.string(".")); + { + TCurrency curr(imp, "_FIRM"); + const TString is = curr.string(TRUE); + curr.set_num(totlit); + const TString ts = curr.string(TRUE); ok = yesno_box("Il totale in lire delle rate e' %s mentre\n" "il totale del documento e' %s.\n" "Si desidera registrare ugualmente?", @@ -475,6 +480,7 @@ bool TPrimanota_application::datacambio_handler(TMask_field& f, KEY key) { if (app().is_fattura()) f.mask().set(FS_DATACAMBIO, f.get()); // Copia a pagina 3 + ::handler_data_cambio(f, key); } return TRUE; } @@ -638,7 +644,7 @@ bool TPrimanota_application::rataval_handler(TMask_field& f, KEY key) { const TValuta v(app().curr_mask(), FS_VALUTA, FS_DATACAMBIO, FS_CAMBIO); const real other(f.mask().get(102)); - TString16 s(v.lit2val(other).string()); + TString80 s(v.lit2val(other).string()); f.set(s); } } @@ -694,7 +700,7 @@ void TPrimanota_application::set_totale_pagamento(bool update) const real imposval = cambio.lit2val(imposta); const real imponval = m.get_real(SK_TOTDOCVAL) - imposval; pag.set_total_valuta(imponval, imposval, spese, cambio.cambio(), - imponibile, imposta, spese); + imponibile, imposta, spese, cambio.codice()); } else { @@ -711,8 +717,8 @@ void TPrimanota_application::set_totale_pagamento(bool update) void TPrimanota_application::set_scadenze(TMask& m) { - const TString cp(m.get(F_CODPAG)); - const TString dt(m.get(F_DATADOC)); + const TString16 cp(m.get(F_CODPAG)); + const TString16 dt(m.get(F_DATADOC)); set_pagamento(cp, dt); set_totale_pagamento(FALSE); @@ -1023,9 +1029,10 @@ bool TPrimanota_application::showpartite_handler(TMask_field& f, KEY k) if (importo != speso) { - TString msg(128); + TString msg(128); + const TCurrency curr(speso.valore(), "_FIRM"); msg << "L'importo sul saldaconto della riga " << (riga+1) << " e' " - << speso.valore().string("."); + << curr.string(TRUE); if (!speso.is_zero()) msg << (speso.sezione() == 'A' ? " Avere" : " Dare"); return f.error_box(msg); @@ -1276,7 +1283,9 @@ bool TPrimanota_application::notify_cgline_deletion(TPartita& partita, long nreg bool TPrimanota_application::notify_cgline_deletion(int numrig) { bool found = FALSE; - const long nreg = curr_mask().get_long(F_NUMREG); + + const TMask& m = curr_mask(); + const long nreg = m.insert_mode() ? NUMREG_PROVVISORIO : m.get_long(F_NUMREG); // if (curr_mask().edit_mode()) // partite().add_numreg(nreg); // Gia' fatto dalla read diff --git a/cg/cg2104a.uml b/cg/cg2104a.uml index bc54bd9a8..f2a9f065a 100755 --- a/cg/cg2104a.uml +++ b/cg/cg2104a.uml @@ -13,25 +13,22 @@ BEGIN PROMPT 0 1 "@bScadenzario" END -NUMBER F_IMPONIBILE 15 +CURRENCY F_IMPONIBILE 15 BEGIN PROMPT 2 2 "Imponibile " - PICTURE "." - FLAGS "DR" + FLAGS "D" END -NUMBER F_IMPOSTA 15 +CURRENCY F_IMPOSTA 15 BEGIN PROMPT 29 2 "Imposta " - PICTURE "." - FLAGS "DR" + FLAGS "D" END -NUMBER F_SPESE 15 +CURRENCY F_SPESE 15 BEGIN PROMPT 53 2 "Spese " - PICTURE "." - FLAGS "DR" + FLAGS "D" END diff --git a/cg/cg2105.cpp b/cg/cg2105.cpp index 3af77ae4e..b8fd199b5 100755 --- a/cg/cg2105.cpp +++ b/cg/cg2105.cpp @@ -1,3 +1,4 @@ +#include #include // Serve per DLG_NEWREC #include #include // Colori righe @@ -43,7 +44,7 @@ protected: static bool nuovo_handler(TMask_field& f, KEY k); static bool cambio_handler(TMask_field& f, KEY k); - void add_importo(TToken_string& s, const TImporto& i, bool val = FALSE, int pos = -1); + void add_importo(TToken_string& s, const TImporto& i, const char* val = NULL, int pos = -1); void add_descrizione(TToken_string& s, const TRiga_partite& riga, int pos = -1); TImporto get_importo(TToken_string& s, int pos) const; @@ -276,6 +277,8 @@ void TPay_mask::set_pag(const TRectype& oldpag, const TRiga_scadenze& scad, if (!in_valuta && prima_riga) in_valuta = app().gestione_valuta(); enable(E_VALUTA, prima_riga); // La valuta puo' essere cambiata solo sulle partite nuove +#else + set(S_CODVAL, fatt.codice_valuta()); // Copia in maschera la valuta #endif show(-3, in_valuta); // Visualizza campi relativi alla valuta attiva_valuta(in_valuta); // Attiva campi e handlers relativi alla valuta @@ -494,7 +497,8 @@ bool TPay_mask::saldo_handler(TMask_field& f, KEY k) { TMask& m = f.mask(); m.set_mode(MODE_QUERY); - TMask_field& imp = m.field(m.field(S_IMPORTOVAL).active() ? S_IMPORTOVAL : S_IMPORTO); + const bool valuta = m.field(S_IMPORTOVAL).active(); + TMask_field& imp = m.field(valuta ? S_IMPORTOVAL : S_IMPORTO); imp.set_dirty(); imp.on_hit(); m.set_mode(NO_MODE); @@ -895,7 +899,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k) gm.add_descrizione(riga_fattura, riga); gm.add_importo(riga_fattura, riga.importo(FALSE, 0x1)); if (in_valuta) - gm.add_importo(riga_fattura, riga.importo(TRUE, 0x1), TRUE); + gm.add_importo(riga_fattura, riga.importo(TRUE, 0x1), prima_valuta.codice()); else riga_fattura.add(""); riga_fattura.add(riga.get(PART_NREG)); @@ -912,9 +916,9 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k) row = riga_fattura; row.add(ra, 1); row.add(scad.get(SCAD_DATASCAD), 3); - gm.add_importo(row, scad.importo(FALSE), FALSE, 5); + gm.add_importo(row, scad.importo(FALSE), NULL, 5); if (in_valuta) - gm.add_importo(row, scad.importo(TRUE), TRUE, 6); + gm.add_importo(row, scad.importo(TRUE), prima_valuta.codice(), 6); const TString& descr = scad.get(SCAD_DESCR); if (descr.not_empty()) @@ -940,7 +944,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k) if (in_valuta) { gm.add_importo(row, imp); - gm.add_importo(row, TImporto(sez, pag.get_real(PAGSCA_IMPORTOVAL)), TRUE); + gm.add_importo(row, TImporto(sez, pag.get_real(PAGSCA_IMPORTOVAL)), prima_valuta.codice()); } else { @@ -981,12 +985,12 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k) { TImporto abb_lit = abb; prima_valuta.val2lit(abb_lit); - gm.add_importo(rabb, abb_lit, FALSE); - gm.add_importo(rabb, abb, TRUE); + gm.add_importo(rabb, abb_lit); + gm.add_importo(rabb, abb, prima_valuta.codice()); } else { - gm.add_importo(rabb, abb, FALSE); + gm.add_importo(rabb, abb); rabb.add(""); } rabb.add(sum.get(PART_TIPOMOV), 11); @@ -1019,7 +1023,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k) if (in_valuta) { sl = scad.residuo(TRUE, 0xB); - gm.add_importo(rsal, sl, TRUE); + gm.add_importo(rsal, sl, prima_valuta.codice()); tot_val += sl; } } @@ -1050,7 +1054,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k) { imp.set(sum.sezione(), impval); imp.normalize(); - gm.add_importo(row, imp, TRUE); + gm.add_importo(row, imp, prima_valuta.codice()); tot_val += imp; } else @@ -1083,7 +1087,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k) prima_valuta.set(gm, P_VALUTA, P_DATACAMBIO, P_CAMBIO); #endif gm.add_importo(sp, tot_lit); - gm.add_importo(sp, tot_val, TRUE); + gm.add_importo(sp, tot_val, prima_valuta.codice()); } if (should_delete_game) @@ -1096,6 +1100,17 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k) gm._valfirst = !gm._valfirst; } + TString80 header; + header = "Importo in "; header << TCurrency::get_firm_val(); + sheet.set_column_header(106, header); + + header = "Importo in "; + if (prima_valuta.in_valuta()) + header << prima_valuta.codice(); + else + header << "valuta"; + sheet.set_column_header(107, header); + if (sheet.items() > 0) sheet.select(0, TRUE); else @@ -1232,7 +1247,8 @@ int TGame_mask::nuovo_pagamento(TPartita& partita, int nriga, int rata, tipo_mov const int nrigp = nuova_riga(partita, tm); #else int nrigp = partita.mov2rig(_numreg, _numrig); // Cerca riga partita relativa alla riga rmov - if (nrigp <= 0) // Devo creare una nuova riga di partita + const bool nuovo = nrigp <= 0; + if (nuovo) // Devo creare una nuova riga di partita nrigp = nuova_riga(partita, tm); #endif TRectype& pagamento = partita.pagamento(nriga, rata, nrigp); // Crea nuovo pagamento @@ -1259,11 +1275,14 @@ int TGame_mask::nuovo_pagamento(TPartita& partita, int nriga, int rata, tipo_mov } #ifndef __EXTRA__ - const TCausale& causale = app().causale(); - TBill contro; causale.bill(caus, contro); // Legge conto contropartita - if (caus != 2 && contro.empty()) // Se non specificato ... - causale.bill(caus = 2, contro); // ... prende il primo - contro.put(pagamento, TRUE); // Scrive conto contropartita + if (nuovo) + { + const TCausale& causale = app().causale(); + TBill contro; causale.bill(caus, contro); // Legge conto contropartita + if (caus != 2 && contro.empty()) // Se non specificato ... + causale.bill(caus = 2, contro); // ... prende il primo + contro.put(pagamento, TRUE); // Scrive conto contropartita + } #endif return nrigp; @@ -1489,7 +1508,7 @@ bool TGame_mask::nuovo_handler(TMask_field& f, KEY k) // Metodi della maschera delle partite /////////////////////////////////////////////////////////// -void TGame_mask::add_importo(TToken_string& s, const TImporto& i, bool valuta, int pos) +void TGame_mask::add_importo(TToken_string& s, const TImporto& i, const char* valuta, int pos) { if (i.is_zero()) s.add("", pos); @@ -1497,14 +1516,11 @@ void TGame_mask::add_importo(TToken_string& s, const TImporto& i, bool valuta, i { TString80 v; TImporto n(i); n.normalize(); - if (valuta) - { - v = n.valore().string(0, 3); - const int sep = v.find('.'); - v[sep] = ','; - } - else - v = n.valore().string(0, 0); + + if (valuta == NULL || *valuta == '\0') + valuta = "_FIRM"; + const TCurrency curr(n.valore(), valuta); + v = curr.string(FALSE); v.replace('.', ','); // Mette la virgola v << ' ' << n.sezione(); s.add(v, pos); } @@ -1814,7 +1830,7 @@ bool TGame_mask::edit_pagamento(TPartita& p, int nriga, int nrata, int nrigp) co #endif } -// delete pm; + // delete pm; // Perche' commentata? return key != K_ESC; } diff --git a/cg/cg2106.cpp b/cg/cg2106.cpp index bd47b93b6..48ee409bc 100755 --- a/cg/cg2106.cpp +++ b/cg/cg2106.cpp @@ -464,7 +464,7 @@ bool TPrimanota_application::run_easydoc(const char* azione) const ini.set("Descrizione", m.get(F_DESCR)); // prepara la sezione "DefinizioneDoc1" (se non esiste l'archivio mdb) - if (!fexist(archivio)) + if (!archivio.exist()) { ini.set_paragraph("DefinizioneDoc1"); ini.set("Archivio", archivio); diff --git a/cg/cg21cg.uml b/cg/cg21cg.uml index ac45d232f..5ce11a438 100755 --- a/cg/cg21cg.uml +++ b/cg/cg21cg.uml @@ -34,18 +34,14 @@ BEGIN PROMPT 1 4 "Conto principale" END -NUMBER CG_DARE 18 +CURRENCY CG_DARE 18 BEGIN PROMPT 2 5 "Dare " - FLAGS "V" - PICTURE "." END -NUMBER CG_AVERE 18 +CURRENCY CG_AVERE 18 BEGIN PROMPT 38 5 "Avere " - FLAGS "V" - PICTURE "." END LIST CG_TIPO 1 10 diff --git a/cg/cg21iva.uml b/cg/cg21iva.uml index 0384c82f1..5dd6635c7 100755 --- a/cg/cg21iva.uml +++ b/cg/cg21iva.uml @@ -49,19 +49,15 @@ BEGIN FLAGS "D" END -NUMBER 101 18 +CURRENCY 101 18 BEGIN PROMPT 2 4 "Imponibile " - FLAGS "V" - PICTURE "." END -NUMBER 104 18 +CURRENCY 104 18 BEGIN PROMPT 48 4 "Imposta " HELP "Importo dell'IVA. Se e' nullo, col tasto F8 si puo' effettuare lo scorporo" - FLAGS "V" - PICTURE "." END GROUPBOX DLG_NULL 76 5 diff --git a/cg/cg21rata.uml b/cg/cg21rata.uml index f84394e52..1c1b3321a 100755 --- a/cg/cg21rata.uml +++ b/cg/cg21rata.uml @@ -7,21 +7,20 @@ BEGIN WARNING "La data di scadenza e' obbligatoria" END -NUMBER 102 18 +CURRENCY 102 18 BEGIN PROMPT 1 3 "Importo " - PICTURE "." CHECKTYPE REQUIRED WARNING "L'importo della rata non puo' essere nullo" END -NUMBER 103 18 3 +CURRENCY 103 18 BEGIN PROMPT 1 4 "Importo valuta " FLAGS "D" - PICTURE ".3" VALIDATE REQIF_FUNC 1 102 WARNING "E' necessario specificare anche un importo in valuta" + DRIVENBY -SK_VALUTA END NUMBER 104 6 2 diff --git a/cg/cg21sld.uml b/cg/cg21sld.uml index 7dff0d369..b1a4b55fa 100755 --- a/cg/cg21sld.uml +++ b/cg/cg21sld.uml @@ -15,25 +15,22 @@ BEGIN PROMPT 59 0 "Spese" END -NUMBER FS_IMPONIBILI 18 +CURRENCY FS_IMPONIBILI 18 BEGIN PROMPT 1 1 "" - PICTURE "." FLAGS "D" CHECKTYPE REQUIRED END -NUMBER FS_IMPOSTE 18 +CURRENCY FS_IMPOSTE 18 BEGIN PROMPT 30 1 "" - PICTURE "." FLAGS "D" END -NUMBER FS_SPESE 18 +CURRENCY FS_SPESE 18 BEGIN PROMPT 59 1 "" - PICTURE "." FLAGS "D" END diff --git a/cg/cg3.cpp b/cg/cg3.cpp index d224a821b..7519ca0a4 100755 --- a/cg/cg3.cpp +++ b/cg/cg3.cpp @@ -1,29 +1,23 @@ #include -#include #define __MAIN__ #include "cg3.h" -#define usage "Error - usage : %s -{0|1|2|3|4|5|6}" - int main(int argc,char** argv) { - int rt = 1; - int s = atoi(argv[1]+1) ; - + int s = argv[1][1] - '0'; switch (s) { - case 0: rt = cg3100(argc,argv) ; break; // Lista movimenti - case 1: rt = cg3200(argc,argv) ; break; // Stampa mastrini - case 2: rt = cg3300(argc,argv) ; break; // Stampa allegati iva - case 3: rt = cg3400(argc,argv) ; break; // Stampa libro giornale - case 4: rt = cg3500(argc,argv) ; break; // Stampa ripilogo gruppi conti - case 5: rt = cg3600(argc,argv) ; break; // Visualizzazione mastrini - case 6: rt = cg3700(argc,argv) ; break; // Lista fatture - default: error_box(usage, argv[0]); break; + case 1 : cg3200(argc,argv) ; break; // Stampa mastrini +// case 2 : cg3300(argc,argv) ; break; // Stampa allegati iva + case 3 : cg3400(argc,argv) ; break; // Stampa libro giornale + case 4 : cg3500(argc,argv) ; break; // Stampa ripilogo gruppi conti + case 5 : cg3600(argc,argv) ; break; // Visualizzazione mastrini + case 6 : cg3700(argc,argv) ; break; // Lista fatture + default: cg3100(argc,argv) ; break; // Lista movimenti } - exit(rt); - return rt; + exit(0); + return 0; } diff --git a/cg/cg3100.cpp b/cg/cg3100.cpp index efc647562..87503b596 100755 --- a/cg/cg3100.cpp +++ b/cg/cg3100.cpp @@ -3,9 +3,8 @@ // #include #include +#include #include -#include -#include #include "cg3.h" #include "cg3100.h" @@ -79,10 +78,11 @@ class TListaMov_application : public TPrintapp TBit_array _err; TDate _data_ini, _data_fin, _datareg, _data_prec, _datacomp; TString _descr, _descr_doc, _descr_causale; - TString _tipo_ini, _masc, _causale, _app; + TString _tipo_ini, _causale, _app; TString _causale_ini, _causale_fin, _registro,_registro_ini, _registro_fin; TString _tipoatt, _tipo_elenco,_tipo_clifo_prec,_cod,_tipoelsucc; - TString _appoggio, _tipodoc, _tipodocumento; + char _appoggio; + TString16 _tipodoc, _tipodocumento; TString _ragsoc, _indcf, _civcf, _paiv, _codcaus, _dencom, _provcom, _cofi; TString _capcf, _codval, _simbolo, _statocf, _comcf, _tipo_fin, _reg_causale; long _documenti, _codice_ini, _codice_fin, _numero_reg, _codcf; @@ -104,6 +104,8 @@ class TListaMov_application : public TPrintapp liste _tipo_lista; word _flags; char _tipoc; + + TDecoder _simbval, _descdoc; protected: virtual void preprocess_header(); @@ -130,9 +132,12 @@ public: void incrementa_totali(); void compila_clifo(); void compila_comuni(); - bool RicercaDoc(const char*); - TListaMov_application(char tipost): _tipoc(tipost), _err(80) {} + bool RicercaDoc(const char*); + const TString& SimboloValuta (const char* cod); + const TString& DescrDoc(const char* cod); + + TListaMov_application(char tipost); virtual ~TListaMov_application() {} }; @@ -163,12 +168,12 @@ bool data_inizio(TMask_field& f, KEY k) int decidi; int anno = f.mask().get_int (F_ANNO); TDate data = f.mask().get(F_DATAINI); - if (app()._masc == "cg3100a") + if (app()._tipo_lista == movimenti) decidi = f.mask().get_int (F_DECIDI); TEsercizi_contabili esc; - if (esc.exist(anno) && ( (app()._masc == "cg3100b") || - ((app()._masc == "cg3100a" ) && (decidi == 2)) ) ) + if (esc.exist(anno) && ( (app()._tipo_lista == fatture) || + ((app()._tipo_lista == movimenti ) && (decidi == 2)) ) ) { const TDate inizio = esc[anno].inizio(); if (data.ok()) @@ -194,10 +199,10 @@ bool data_fine(TMask_field& f, KEY k) int anno = f.mask().get_int (F_ANNO); TDate dataini = f.mask().get(F_DATAINI); TDate datafin = f.mask().get(F_DATAFIN); - if (app()._masc == "cg3100a") + if (app()._tipo_lista == movimenti) decidi = f.mask().get_int (F_DECIDI); - if ( (app()._masc == "cg3100b") || - ((app()._masc == "cg3100a" ) && (decidi == 2)) ) + if ( (app()._tipo_lista == fatture) || + ((app()._tipo_lista == movimenti) && (decidi == 2)) ) if ( dataini.ok() && datafin.ok() ) if (dataini > datafin) { @@ -206,7 +211,7 @@ bool data_fine(TMask_field& f, KEY k) } TEsercizi_contabili esc; - if (esc.exist(anno) && ( (app()._masc == "cg3100b") || ((app()._masc == "cg3100a" ) && (decidi == 2)) ) ) + if (esc.exist(anno) && ( (app()._tipo_lista == fatture) || ((app()._tipo_lista == movimenti) && (decidi == 2)) ) ) { const int prossimo = esc.next(anno); const TDate fine = esc[prossimo > 0 ? prossimo : anno].fine(); @@ -228,7 +233,7 @@ bool data_fine(TMask_field& f, KEY k) bool TListaMov_application::RicercaDoc(const char * tipo) { TTable tab_tpd(TAB_TPD); - TString codtab = format ("%-2s", tipo); + TString16 codtab; codtab.format ("%-2s", tipo); tab_tpd.zero(); tab_tpd.put("CODTAB", codtab); tab_tpd.read(); @@ -392,27 +397,16 @@ const char * TipoAttivita (const char * attreg, long codice_ditta) return TMP; } -const char * SimboloValuta (const char * cod) -{ - TTable tab_val(TAB_VAL); - TString codtab = format ("%-3s", cod); - - tab_val.zero(); - - tab_val.put("CODTAB", codtab); - tab_val.read(); - if (tab_val.good()) - TMP = tab_val.get("S7"); - else - TMP = ""; - - return TMP; +const TString& TListaMov_application::SimboloValuta(const char* cod) +{ + return _simbval.decode(cod); } -const char * DescrDoc (const char * tipo) +const TString& TListaMov_application::DescrDoc(const char* tipo) { +/* TTable tab_tpd(TAB_TPD); - TString codtab = format ("%-2s", tipo); + TString16 codtab; codtab.format ("%-2s", tipo); tab_tpd.zero(); @@ -424,12 +418,14 @@ const char * DescrDoc (const char * tipo) TMP = ""; return TMP; +*/ + return _descdoc.decode(tipo); } const char * AttivitaRegistro (const char * cod, int anno) { TTable tab_reg("REG"); - TString codtab ( format ("%04d%-3s", anno, cod) ); + TString16 codtab; codtab.format ("%04d%-3s", anno, cod); tab_reg.zero(); @@ -444,13 +440,12 @@ const char * AttivitaRegistro (const char * cod, int anno) return TMP; } -const int CodiceRegistro (const char* cod, int anno) -{ +int CodiceRegistro (const char* cod, int anno) +{ +/* TTable tab_reg("REG"); - TString codtab; + TString16 codtab; codtab.format("%4d%-3s", anno, cod); - //sprintf (__tmp, "%04d%-3s", anno, cod); - //TString codtab (__tmp); int tipo_reg; tab_reg.zero(); @@ -460,8 +455,13 @@ const int CodiceRegistro (const char* cod, int anno) tipo_reg = tab_reg.get_int("I0"); else tipo_reg = 0; - return tipo_reg; +*/ + static TDecoder tab_reg("REG", "I0"); + + TString16 codtab; codtab.format("%4d%-3s", anno, cod); + int tipo_reg = atoi(tab_reg.decode(codtab)); + return tipo_reg; } bool filter_func_fatture (const TRelation* rel) @@ -758,8 +758,8 @@ void TListaMov_application::set_page(int file, int count) set_row(_nr,"@58g@pn",FLD(LF_RMOV,RMV_CONTO,"###")); set_row(_nr,"@62g@pn",FLD(LF_RMOV,RMV_SOTTOCONTO,"######")); set_row(_nr,"@69g#.20t",&_descr); - _appoggio = current_cursor()->curr(LF_RMOV).get(RMV_SEZIONE); - if ((_appoggio=="D")||(_appoggio=="d")) + _appoggio = toupper(current_cursor()->curr(LF_RMOV).get_char(RMV_SEZIONE)); + if (_appoggio=='D') set_row(_nr,"@90g@n",FLD(LF_RMOV,RMV_IMPORTO)); else set_row(_nr,"@110g@n",FLD(LF_RMOV,RMV_IMPORTO)); @@ -936,15 +936,15 @@ bool TListaMov_application::preprocess_page(int file,int counter) _descr = DescrConto(gruppo, conto, sottoconto, tipoc); _alleg = AllegClifo(gruppo, conto, sottoconto); _importo = current_cursor()->file(LF_RMOV).get_real(RMV_IMPORTO); - _appoggio = current_cursor()->curr(LF_RMOV).get(RMV_SEZIONE); + _appoggio = toupper(current_cursor()->curr(LF_RMOV).get_char(RMV_SEZIONE)); if (!_no_preprocess_page) { - if ((_appoggio=="D")||(_appoggio=="d")) + if (_appoggio=='D') { _tot_dare_generale += _importo; _tot_dare += _importo; } - else if ((_appoggio=="A")||(_appoggio=="a")) + else { _tot_avere += _importo; _tot_avere_generale += _importo; @@ -1026,15 +1026,15 @@ bool TListaMov_application::preprocess_page(int file,int counter) TString tipoc = current_cursor()->curr(LF_RMOV).get(RMV_TIPOC); _descr = DescrConto(gruppo, conto, sottoconto, tipoc); _importo = current_cursor()->file(LF_RMOV).get_real(RMV_IMPORTO); - _appoggio = current_cursor()->curr(LF_RMOV).get(RMV_SEZIONE); + _appoggio = toupper(current_cursor()->curr(LF_RMOV).get_char(RMV_SEZIONE)); if (!_no_preprocess_page) { - if ((_appoggio=="D")||(_appoggio=="d")) + if (_appoggio=='D') { _tot_dare_generale += _importo; _tot_dare += _importo; } - else if ((_appoggio=="A")||(_appoggio=="a")) + else { _tot_avere += _importo; _tot_avere_generale += _importo; @@ -1911,31 +1911,30 @@ void TListaMov_application::incrementa_totali() bool TListaMov_application::set_print(int m) { - _masc = ""; + TString16 masc; switch(toupper(_tipoc)) { case 'C': - _masc = "cg3100b"; + masc = "cg3100b"; _tipo_lista = fatture; break; case 'M': - _masc = "cg3100a"; + masc = "cg3100a"; _tipo_lista = movimenti; break; - break; default: - NFCHECK("Bad _tipoc"); + NFCHECK("Specificare C o M"); return FALSE; } - TMask msk(_masc); - + TMask msk(masc); msk.set_handler(F_ANNO, annoes_handler); msk.set_handler(F_DATAINI, data_inizio); msk.set_handler(F_DATAFIN, data_fine); - if (msk.run() != K_ENTER) return FALSE; + + set_magic_currency(TRUE); reset_files(); TLocalisamfile* fl; @@ -2122,9 +2121,6 @@ bool TListaMov_application::user_destroy() // releasev e arrmask delete _relmov1; delete _relmov2; delete _relmov3; - delete _curr1; - delete _curr2; - delete _curr3; delete _clifo; delete _caus; delete _pcon; @@ -2147,6 +2143,9 @@ void TListaMov_application::init_print(const TMask& msk) printer().setdate(data); printer().footerlen(5); + set_magic_currency(TRUE); + set_curr_codval(msk.get(F_CODVAL)); + switch (_tipo_lista) { case movimenti: @@ -2462,9 +2461,15 @@ void TListaMov_application::preprocess_header() set_header (++soh,(const char*)sep); } +TListaMov_application::TListaMov_application(char tipost) + : _tipoc(tipost), _err(80), + _simbval(TAB_VAL, "S7"), _descdoc(TAB_TPD, "S0") +{ } + + int cg3100(int argc, char* argv[]) { - const char tipo = *argv[2]; + const char tipo = argc > 2 ? *argv[2] : 'M'; TListaMov_application a(tipo); const char* title; diff --git a/cg/cg3100.h b/cg/cg3100.h index 92d18673e..89f36c47a 100755 --- a/cg/cg3100.h +++ b/cg/cg3100.h @@ -33,6 +33,7 @@ #define F_RAGSOCINI1 129 #define F_RAGSOCFIN1 130 #define F_SEPARATOR 131 +#define F_CODVAL 132 #define ST_DATA 0x0001 #define ST_NUMERO 0x0002 diff --git a/cg/cg3100a.uml b/cg/cg3100a.uml index 191c6f583..3b6064e7d 100755 --- a/cg/cg3100a.uml +++ b/cg/cg3100a.uml @@ -2,13 +2,13 @@ TOOLBAR "" 0 20 0 2 -BUTTON DLG_PRINT 9 2 +BUTTON DLG_PRINT 10 2 BEGIN PROMPT -12 -11 "~Stampa" MESSAGE EXIT,K_ENTER END -BUTTON DLG_QUIT 9 2 +BUTTON DLG_QUIT 10 2 BEGIN PROMPT -22 -11 "" END @@ -234,6 +234,18 @@ BEGIN END */ +STRING F_CODVAL 3 +BEGIN + PROMPT 2 18 "Valuta " + USE %VAL + INPUT CODTAB F_CODVAL + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODVAL CODTAB + CHECKTYPE NORMAL + FLAGS "U" +END + ENDPAGE ENDMASK diff --git a/cg/cg3100b.uml b/cg/cg3100b.uml index da4230e43..063b05ed0 100755 --- a/cg/cg3100b.uml +++ b/cg/cg3100b.uml @@ -1,6 +1,6 @@ #include "cg3100.h" -PAGE "Lista Fatture" -1 -1 73 16 +PAGE "Lista Fatture" -1 -1 73 17 NUMBER F_CODDITTA 5 BEGIN @@ -218,13 +218,25 @@ BEGIN PROMPT 2 13 "Non stampare i separatori delle migliaia" END -BUTTON DLG_PRINT 9 2 +STRING F_CODVAL 3 +BEGIN + PROMPT 2 14 "Valuta " + USE %VAL + INPUT CODTAB F_CODVAL + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODVAL CODTAB + CHECKTYPE NORMAL + FLAGS "U" +END + +BUTTON DLG_PRINT 10 2 BEGIN PROMPT -12 -1 "~Stampa" MESSAGE EXIT,K_ENTER END -BUTTON DLG_QUIT 9 2 +BUTTON DLG_QUIT 10 2 BEGIN PROMPT -22 -1 "" END diff --git a/cg/cg3200.cpp b/cg/cg3200.cpp index f70022a93..52b03a628 100755 --- a/cg/cg3200.cpp +++ b/cg/cg3200.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -89,6 +90,8 @@ class TMastrini_application : public TPrintapp bool _noseparator; TString _real_picture; + TConfig* _collins; + protected: virtual bool user_create() ; virtual bool user_destroy(); @@ -107,6 +110,8 @@ protected: bool mask2sheet(); bool sheet2mask(); + const char* real2str(const real& r) const; + public: //TDate _inizioEs,_fineEs; @@ -151,12 +156,22 @@ public: void setta_riga (int r, TString riga); int righe_rimaste_da_stampare(); + const char* trans(const char* italian); + TMastrini_application() {} virtual ~TMastrini_application() {} }; inline TMastrini_application& app() { return (TMastrini_application&)main_app(); } +const char* TMastrini_application::trans(const char* italian) +{ + TString80 key(italian); + key.replace(' ', '_'); + const TString& str = _collins->get(key, NULL, -1, italian); + return str; +} + int TMastrini_application::righe_rimaste_da_stampare() { int righe_rimaste = 0; @@ -548,7 +563,6 @@ bool TMastrini_application::contof_hnd (TMask_field& f, KEY k) f.mask().set(F_DESCRFINE_FORN, ds); f.mask().set(F_DESCRFINE_CONTO, ds); } - } return TRUE; @@ -875,11 +889,11 @@ void TMastrini_application::fai_stampa132() set_row (_rw,"@0g#t", &_dataregs); if (_stampanum == 1) - set_row (_rw,"@11g$[r]#7d$[n]", &_numreg); + set_row (_rw,"@11g$[r]#7ld$[n]", &_numreg); else if (_stampanum == 2) { - set_row (_rw,"@11g#7d", &_numgio); + set_row (_rw,"@11g#7ld", &_numgio); } set_row (_rw,"@19g#t", &_datadocs); @@ -959,11 +973,11 @@ void TMastrini_application::fai_stampa198() set_row (_rw,"@0g#t", &_dataregs); if (_stampanum == 1) { - set_row (_rw,"@11g$[r]#7d$[n]", &_numreg); + set_row (_rw,"@11g$[r]#7ld$[n]", &_numreg); set_row (_rw,"@18g/#3d", &_numrig); } else if (_stampanum == 2) - set_row (_rw,"@11g#7d", &_numgio); + set_row (_rw,"@11g#7ld", &_numgio); set_row (_rw,"@23g#t", &_datadocs); set_row (_rw,"@34g#7t", &_numdoc); @@ -990,18 +1004,18 @@ void TMastrini_application::stampa_totali132() _saldo_periodo = _totale_periodo_dare - _totale_periodo_avere; _saldo_progre = _totprogre_dare - _totprogre_avere; _saldo_progre_al = _totprogre_dare_al - _totprogre_avere_al; - set_row (_rw,"@32gTOTALI PERIODO"); + set_row (_rw,"@32g%s", trans("TOTALI PERIODO")); set_row (_rw,"@66g%r", &_saldo_periodo); set_row (_rw,"@83g%r", &_totale_periodo_dare); set_row (_rw++,"@100g%r", &_totale_periodo_avere); - set_row (_rw,"@32gTOTALI PROGRESSIVI"); + set_row (_rw,"@32g%s", trans("TOTALI PROGRESSIVI")); set_row (_rw,"@66g%r", &_saldo_progre); set_row (_rw,"@83g%r", &_totprogre_dare); set_row (_rw++,"@100g%r", &_totprogre_avere); if (_stampaprogre) //Progressivi attuali { - set_row (_rw,"@32gTOTALI PROGRESSIVI AL %s", _ultima_data_reg.string()); + set_row (_rw,"@32g%s %s", trans("TOTALI PROGRESSIVI AL"), _ultima_data_reg.string()); set_row (_rw,"@66g%r", &_saldo_progre_al); set_row (_rw,"@83g%r", &_totprogre_dare_al); set_row (_rw,"@100g%r", &_totprogre_avere_al); @@ -1009,6 +1023,12 @@ void TMastrini_application::stampa_totali132() _devi_stampare_footer = FALSE; } +const char* TMastrini_application::real2str(const real& r) const +{ + real2currency(TMP, r); + return TMP; +} + void TMastrini_application::carica_array_totali132() { TString sep(132); @@ -1035,27 +1055,30 @@ void TMastrini_application::carica_array_totali132() _lista.add(r); r = ""; - r.add("@32gTOTALI PERIODO@66g%s@83g%s@100g%s"); - r.add(_saldo_periodo.string(_real_picture)); - r.add(_totale_periodo_dare.string(_real_picture)); - r.add(_totale_periodo_avere.string(_real_picture)); + r.add("@32g%s@66g%s@83g%s@100g%s"); + r.add(trans("TOTALI PERIODO")); + r.add(real2str(_saldo_periodo)); + r.add(real2str(_totale_periodo_dare)); + r.add(real2str(_totale_periodo_avere)); _lista.add(r); r = ""; - r.add("@32gTOTALI PROGRESSIVI@66g%s@83g%s@100g%s"); - r.add(_saldo_progre.string(_real_picture)); - r.add(_totprogre_dare.string(_real_picture)); - r.add(_totprogre_avere.string(_real_picture)); + r.add("@32g%s@66g%s@83g%s@100g%s"); + r.add(trans("TOTALI PROGRESSIVI")); + r.add(real2str(_saldo_progre)); + r.add(real2str(_totprogre_dare)); + r.add(real2str(_totprogre_avere)); _lista.add(r); r = ""; if (_stampaprogre) //Progressivi attuali { - r.add("@32gTOTALI PROGRESSIVI AL@55g%s@66g%s@83g%s@100g%s"); + r.add("@32g%s@55g%s@66g%s@83g%s@100g%s"); + r.add(trans("TOTALI PROGRESSIVI AL")); r.add(_ultima_data_reg.string()); - r.add(_saldo_progre_al.string(_real_picture)); - r.add(_totprogre_dare_al.string(_real_picture)); - r.add(_totprogre_avere_al.string(_real_picture)); + r.add(real2str(_saldo_progre_al)); + r.add(real2str(_totprogre_dare_al)); + r.add(real2str(_totprogre_avere_al)); _lista.add(r); r = ""; } @@ -1080,7 +1103,7 @@ void TMastrini_application::carica_array_totali132() r.add(fmt); r.add(riga._descrdoc); totale = riga._totdociva; - r.add(totale.string(_real_picture)); + r.add(real2str(totale)); _lista.add(r); r = ""; } @@ -1171,15 +1194,16 @@ void TMastrini_application::stampa_totali198() _totprogre_dare=_progredare+_totale_periodo_dare; _totprogre_avere=_progreavere+_totale_periodo_avere; - set_row (_rw,"@32gTOTALI PERIODO@100g%r", &_totale_periodo_dare); + set_row (_rw,"@32g%s@100g%r", trans("TOTALI PERIODO"), &_totale_periodo_dare); set_row (_rw,"@117g%r", &_totale_periodo_avere); set_row (_rw++,"@151g%r", &_saldo_movimenti); - set_row (_rw,"@32gTOTALI PROGRESSIVI@100g%r", &_totprogre_dare); + set_row (_rw,"@32g%s@100g%r", trans("TOTALI PROGRESSIVI"), &_totprogre_dare); set_row (_rw,"@117g%r", &_totprogre_avere); set_row (_rw++,"@134g%r", &_saldo_progressivi); if (_stampaprogre) //Progressivi attuali { - set_row(_rw,"@32gTOTALI PROGRESSIVI AL@55g%s", _ultima_data_reg.string()); + _saldo_progre_al = _totprogre_dare_al - _totprogre_avere_al; + set_row(_rw,"@32g%s@55g%s", trans("TOTALI PROGRESSIVI AL"), _ultima_data_reg.string()); set_row (_rw,"@100g%r", &_totprogre_dare_al); set_row (_rw,"@117g%r", &_totprogre_avere_al); set_row (_rw,"@134g%r", &_saldo_progressivi); @@ -1210,27 +1234,31 @@ void TMastrini_application::carica_array_totali198() _totprogre_dare=_progredare+_totale_periodo_dare; _totprogre_avere=_progreavere+_totale_periodo_avere; - r.add("@32gTOTALI PERIODO@100g%s@117g%s@151g%s"); - r.add(_totale_periodo_dare.string(_real_picture)); - r.add(_totale_periodo_avere.string(_real_picture)); - r.add(_saldo_movimenti.string(_real_picture)); + r.add("@32g%s@100g%s@117g%s@151g%s"); + r.add(trans("TOTALI PERIODO")); + r.add(real2str(_totale_periodo_dare)); + r.add(real2str(_totale_periodo_avere)); + r.add(real2str(_saldo_movimenti)); _lista.add(r); r = ""; - r.add("@32gTOTALI PROGRESSIVI@100g%s@117g%s@134g%s"); - r.add(_totprogre_dare.string(_real_picture)); - r.add(_totprogre_avere.string(_real_picture)); - r.add(_saldo_progressivi.string(_real_picture)); + r.add("@32g%s@100g%s@117g%s@134g%s"); + r.add(trans("TOTALI PROGRESSIVI")); + r.add(real2str(_totprogre_dare)); + r.add(real2str(_totprogre_avere)); + r.add(real2str(_saldo_progressivi)); _lista.add(r); r = ""; if (_stampaprogre) //Progressivi attuali { - r.add("@32gTOTALI PROGRESSIVI AL@55g%s@100g%s@117g%s@134g%s"); + _saldo_progre_al = _totprogre_dare_al - _totprogre_avere_al; + r.add("@32g%s@55g%s@100g%s@117g%s@134g%s"); + r.add(trans("TOTALI PROGRESSIVI AL")); r.add(_ultima_data_reg.string()); - r.add(_totprogre_dare_al.string(_real_picture)); - r.add(_totprogre_avere_al.string(_real_picture)); - r.add(_saldo_progressivi.string(_real_picture)); + r.add(real2str(_totprogre_dare_al)); + r.add(real2str(_totprogre_avere_al)); + r.add(real2str(_saldo_progre_al)); _lista.add(r); r = ""; } @@ -1259,7 +1287,7 @@ void TMastrini_application::carica_array_totali198() r.add(fmt); r.add(riga._descrdoc); totale = riga._totdociva; - r.add(totale.string(_real_picture)); + r.add(real2str(totale)); _lista.add(r); r = ""; } @@ -1507,7 +1535,7 @@ bool TMastrini_application::preprocess_page(int file, int counter) // nella maschera. Se non viene specificato li stampa tutti _importo = current_cursor()->curr(LF_RMOV).get_real(RMV_IMPORTO); - _importo_str = _importo.string(_real_picture); + _importo_str = real2str(_importo); _mov->setkey(1); _mov->curr().zero(); _mov->curr().put(MOV_NUMREG,_numreg); @@ -1906,8 +1934,8 @@ bool TMastrini_application::preprocess_page(int file, int counter) if (_nummast != 3 || dep_dare != ZERO || dep_avere != ZERO) { - TString dare (dep_dare.string(_real_picture)); - TString avere (dep_avere.string(_real_picture)); + TString dare (real2str(dep_dare)); + TString avere (real2str(dep_avere)); if (_numcarat == 1) { set_row (_rw,"@32gA RIPORTO@83g%s", (const char*) dare); @@ -1967,8 +1995,8 @@ bool TMastrini_application::preprocess_page(int file, int counter) const int righe_rimaste = printer().rows_left(); _stampato = righe_rimaste >= 1; - _saldo_progressivi_str=_saldo_progressivi.string(_real_picture); - _saldo_movimenti_str=_saldo_movimenti.string(_real_picture); + _saldo_progressivi_str=real2str(_saldo_progressivi); + _saldo_movimenti_str=real2str(_saldo_movimenti); if (_numcarat == 2) { ricerca_regiva(); @@ -2261,7 +2289,7 @@ void TMastrini_application::stampa_totaliiva() TDociva& riga = (TDociva&)_b[j]; set_row(_rw+j, "@0g%s",(const char*) riga._descrdoc); totale = riga._totdociva; - TString string = totale.string(_real_picture); + TString string = real2str(totale); set_row(_rw+j, fmt, (const char*)string); } @@ -2379,7 +2407,8 @@ bool TMastrini_application::set_print(int) else _real_picture = "####.###.###.###"; set_real_picture(_real_picture); - + set_curr_codval(_msk->get(F_VALUTA)); + set_magic_currency(TRUE); if (tasto == K_ENTER) { @@ -2558,8 +2587,8 @@ void TMastrini_application::preprocess_footer() if (_nummast != 3 || dep_dare != ZERO || dep_avere != ZERO) { - TString dare (dep_dare.string(_real_picture)); - TString avere (dep_avere.string(_real_picture)); + TString dare (real2str(dep_dare)); + TString avere (real2str(dep_avere)); if (_numcarat == 1) { set_footer (2,"@32gA RIPORTO@83g%s", (const char*) dare); @@ -2698,7 +2727,7 @@ void TMastrini_application::crea_intestazione() if (_nummast != 3 || _pagina != np) { - set_header (1, "@0gDITTA@6g%5ld", _codice_ditta); + set_header (1, "@0g%s@6g%5ld", trans("DITTA"), _codice_ditta); set_header (1, "@12g%-.45s", (const char*) _ragsoc); set_header (1, "@59g%s", (const char*) _indulc); //set_header (1, "@86g%-.9s", (const char*) _civulc); @@ -2707,9 +2736,9 @@ void TMastrini_application::crea_intestazione() set_header (1, "@122g%-.3s", (const char*) _prov); } if (_nummast == 3) - set_header (3, "@0gSottoconto @b%3d %3d %6ld", _gruppo, _conto, _sottoc); + set_header (3, "@0g%s@12g@b%3d %3d %6ld", trans("Sottoconto"), _gruppo, _conto, _sottoc); else - set_header (3, "@0gSottoconto %3d %3d %6ld", _gruppo, _conto, _sottoc); + set_header (3, "@0g%s@12g%3d %3d %6ld", trans("Sottoconto"), _gruppo, _conto, _sottoc); if (_tmcf == 'C') _tipo_mask = 1; @@ -2732,15 +2761,18 @@ void TMastrini_application::crea_intestazione() { sep.fill('-'); //Stampa 132 - (sep(132)) set_header (6, (const char *) sep); - set_header (7,"Operazione@19gDocumento@117gContro@131gA"); + set_header (7,"%s@19g%s@117g%s@131g%s", + trans("Operazione"), trans("Documento"), trans("Contro"), trans("A")); if (_stampa_mov_prov) set_header(7,"@129gM"); - set_header (8,"Data"); + set_header (8, trans("Data")); if (_stampanum < 3) - set_header (8,"@11gnumero"); - set_header (8,"@19gData@30gNumero@38gCod.Causale@61gDescrizione@95gDare@111gAvere@117gPartita@131gC"); + set_header (8,"@11g%s", trans("Numero")); + set_header (8,"@19g%s@30g%s@38g%s@61g%s@95g%s@111g%s@117g%s@131g%s", + trans("Data"), trans("Numero"), trans("Cod.Causale"), trans("Descrizione"), + trans("Dare"), trans("Avere"), trans("Partita"), trans("C")); if (_stampa_mov_prov) - set_header(8,"@129gP"); + set_header(8,"@129g%s", trans("P")); sep.fill('-'); set_header (9, (const char *) sep); } @@ -2748,15 +2780,21 @@ void TMastrini_application::crea_intestazione() { sep1.fill('-'); //Stampa 198 - (sep1(198)) set_header (6,"@0g%s", (const char*)sep1); - set_header (7,"Operazione@23gData@34gNumero@169gContro@183gReg@190gNumero@197gA"); + set_header (7,"%s@23g%s@34g%s@169g%s@183g%s@190g%s@197g%s", + trans("Operazione"), trans("Data"), trans("Numero"), trans("Contro"), + trans("Reg"), trans("Numero"), trans("A")); if (_stampa_mov_prov) - set_header(7,"@195gM"); - set_header (8,"Data"); + set_header(7,"@195g%s", trans("M")); + set_header (8,trans("Data")); if (_stampanum < 3) - set_header (8,"@11gnumero"); - set_header (8,"@23gDocumento@42gCod.Causale@70gDescrizione@112gDare@127gAvere@135gSaldo progre.@152gSaldo movim.@169gPartita@183gIva@189gProtoc.@197gC"); + set_header (8,"@11g%s", trans("Numero")); + set_header (8,"@23g%s@42g%s@70g%s@112g%s@127g%s@135g%s@152g%s@169g%s@183g%s@189g%s@197g%s", + trans("Documento"), trans("Cod.Causale"), trans("Descrizione"), trans("Dare"), trans("Avere"), + trans("Saldo progre."), trans("Saldo movim."), trans("Partita"), trans("Iva"), + trans("Protoc."), trans("C")); + if (_stampa_mov_prov) - set_header(8,"@195gP"); + set_header(8,"@195g%s", trans("P")); sep1.fill('-'); set_header (9,"@0g%s", (const char*)sep1); } @@ -2768,15 +2806,15 @@ void TMastrini_application::crea_intestazione() { if (_numcarat == 1) { - set_header (10,"@42gPROGRESSIVI PRECEDENTI@66g%s", _saldo_progre_prec.string(_real_picture)); - set_header (10,"@83g%s", _progredare.string(_real_picture)); - set_header (10,"@100g%s", _progreavere.string(_real_picture)); + set_header (10,"@42g%s@66g%s", trans("PROGRESSIVI PRECEDENTI"), real2str(_saldo_progre_prec)); + set_header (10,"@83g%s", real2str(_progredare)); + set_header (10,"@100g%s", real2str(_progreavere)); } if (_numcarat == 2) { - set_header (10,"@70gPROGRESSIVI PRECEDENTI@100g%s", _progredare.string(_real_picture)); - set_header (10,"@117g%s", _progreavere.string(_real_picture)); - set_header (10,"@134g%s", _saldo_progre_prec.string(_real_picture)); + set_header (10,"@70g%s@100g%s", trans("PROGRESSIVI PRECEDENTI"), real2str(_progredare)); + set_header (10,"@117g%s", real2str(_progreavere)); + set_header (10,"@134g%s", real2str(_saldo_progre_prec)); } _riporto_dare = _progredare; _riporto_avere = _progreavere; @@ -2797,13 +2835,13 @@ void TMastrini_application::crea_intestazione() { if (_numcarat == 1) { - set_header (10,"@32gA RIPORTO@83g%s", dep_dare.string(_real_picture)); - set_header (10,"@100g%s", dep_avere.string(_real_picture)); + set_header (10,"@32g%s@83g%s", trans("A RIPORTO"), real2str(dep_dare)); + set_header (10,"@100g%s", real2str(dep_avere)); } if (_numcarat == 2) { - set_header (10,"@32gA RIPORTO@100g%s", dep_dare.string(_real_picture)); - set_header (10,"@117g%s", dep_avere.string(_real_picture)); + set_header (10,"@32g%s@100g%s", trans("A RIPORTO"), real2str(dep_dare)); + set_header (10,"@117g%s", real2str(dep_avere)); } } _riporto_parziale_dare = ZERO; @@ -2863,13 +2901,13 @@ int TMastrini_application::crea_intestazione(int start_riga) else { if (_numcarat == 1) - set_row(r,"@126gPag. %2d", _numero_pag++); + set_row(r,"@126g%s %2d", trans("Pag."), _numero_pag++); else if (_numcarat == 2) - set_row(r,"@190gPagina %2d", _numero_pag++); + set_row(r,"@190g%s %2d", trans("Pagina"),_numero_pag++); } if (_nummast != 3 || _pagina != np) { - set_row (r, "@0gDITTA@6g%5ld", _codice_ditta); + set_row (r, "@0g%s@6g%5ld", trans("DITTA"), _codice_ditta); set_row (r, "@12g%-45s", (const char*) _ragsoc); set_row (r, "@59g%s", (const char*) _indulc); //set_row (r, "@86g%-9s", (const char*) _civulc); @@ -2879,9 +2917,9 @@ int TMastrini_application::crea_intestazione(int start_riga) r += 2; } if (_nummast == 3) - set_row (r, "@0gSottoconto@12g@b%3d %3d %6ld", _gruppo, _conto, _sottoc); + set_row (r, "@0g%s@12g@b%3d %3d %6ld", trans("Sottoconto"), _gruppo, _conto, _sottoc); else - set_row (r, "@0gSottoconto@12g%3d %3d %6ld", _gruppo, _conto, _sottoc); + set_row (r, "@0g%s@12g%3d %3d %6ld", trans("Sottoconto"), _gruppo, _conto, _sottoc); if (_tmcf == 'C') _tipo_mask = 1; @@ -2907,12 +2945,13 @@ int TMastrini_application::crea_intestazione(int start_riga) { sep.fill('-'); //Stampa 132 - (sep(132)) set_row (r++,"@1g%s", (const char *) sep); - set_row (r++,"Operazione@19gDocumento@117gContro@131gA"); + set_row (r++,"%s@19g%s@117g%s@131g%s", + trans("Operazione"), trans("Documento"), trans("Contro"), trans("A")); if (_stampa_mov_prov) - set_header(r-1,"@129gM"); - set_row (r,"Data"); + set_header(r-1,"@129g%s", trans("M")); + set_row (r, trans("Data")); if (_stampanum < 3) - set_row (r,"@11gnumero"); + set_row (r,"@11g%s", trans("Numero")); set_row (r++,"@19gData@30gNumero@38gCod.Causale@61gDescrizione@95gDare@111gAvere@117gPartita@131gC"); if (_stampa_mov_prov) set_header(r-1,"@129gP"); @@ -2969,12 +3008,12 @@ void TMastrini_application::stampa_progre_riporto() { if (_numcarat == 1) { - set_row (_rw,"@32gA RIPORTO@83g%r", &dep_dare); + set_row (_rw,"@32g%s@83g%r", trans("A RIPORTO"), &dep_dare); set_row (_rw++,"@100g%r",&dep_avere); } if (_numcarat == 2) { - set_row (_rw,"@32gA RIPORTO@100g%r", &dep_dare); + set_row (_rw,"@32g%s@100g%r", trans("A RIPORTO"), &dep_dare); set_row (_rw++,"@117g%r", &dep_avere); } } @@ -3020,12 +3059,12 @@ int TMastrini_application::stampa_progre_riporto(int start_riga) { if (_numcarat == 1) { - set_row (r,"@32gA RIPORTO@83g%r", &dep_dare); + set_row (r,"@32g%s@83g%r", trans("A RIPORTO"), &dep_dare); set_row (r++,"@100g%r", &dep_avere); } if (_numcarat == 2) { - set_row (r,"@32gA RIPORTO@100g%r", &dep_dare); + set_row (r,"@32g%s@100g%r", trans("A RIPORTO"), &dep_dare); set_row (r++,"@117g%r", &dep_avere); } } @@ -3393,9 +3432,9 @@ void TMastrini_application::ricerca_clifo() set_header(3,"@59g%-.30s",(const char*) descrizione_conto()); set_header(3, "@91g%-.41s",(const char*) ragsoc); if (_nummast == 3) - set_header(4, "@rClasse@8g@b%c", _lettivd); + set_header(4, "@r%s@8g@b%c", trans("Classe"), _lettivd); else - set_header(4, "Classe@8g%c", _lettivd); + set_header(4, "%s@8g%c", trans("Classe") , _lettivd); set_header(4, "@10g%-8s", (const char*) _numrivd); if (_numivd != 0) set_header(4, "@19g%2d", _numivd); @@ -3532,9 +3571,9 @@ int TMastrini_application::ricerca_clifo(int start) set_row (r,"@59g%-30s",(const char*) descrizione_conto()); set_row(r++, "@91g%-30s",(const char*) ragsoc); if (_nummast == 3) - set_row(r, "@rClasse@8g@b%c", _lettivd); + set_row(r, "@r%s@8g@b%c", trans("Classe"), _lettivd); else - set_row(r, "Classe@8g%c", _lettivd); + set_row(r, "%s@8g%c", trans("Classe"), _lettivd); set_row(r, "@10g%-8s", (const char*) _numrivd); if (_numivd != 0) set_row(r, "@19g%2d", _numivd); @@ -3553,12 +3592,12 @@ int TMastrini_application::ricerca_clifo(int start) { if (_nummast == 3) { - set_row (r, "@rPeriodo@10g@b%s", (const char*) dataini); + set_row (r, "@r%s@10g@b%s", trans("Periodo"), (const char*) dataini); set_row (r, "@22g%s@r", (const char*) datafine); } else { - set_row (r, "Periodo@10g%s", (const char*) dataini); + set_row (r, "%s@10g%s", trans("Periodo"), (const char*) dataini); set_row (r, "@22g%s", (const char*) datafine); } } @@ -3566,13 +3605,13 @@ int TMastrini_application::ricerca_clifo(int start) { if (_nummast == 3) { - set_row (r, "@rComp. da@9g@b%s", (const char*) dataini); - set_row (r, "@20g@ra@22g@b%s@r", (const char*) datafine); + set_row (r, "@r%s@9g@b%s", trans("Comp.dal"), (const char*) dataini); + set_row (r, "@20g@r%s@22g@b%s@r", trans("al"), (const char*) datafine); } else { - set_row (r, "Comp. da@9g%s", (const char*) dataini); - set_row (r, "@20ga@22g%s", (const char*) datafine); + set_row (r, "%s@9g%s", trans("Comp.dal"), (const char*) dataini); + set_row (r, "@20g%s@22g%s", trans("al"), (const char*) datafine); } } @@ -3643,9 +3682,9 @@ void TMastrini_application::ricerca_gruppo() set_header(3,"@91g%-.41s",(const char*) descrizione_sottoconto()); if (_nummast == 3) - set_header(4, "@0g@rClasse@12g@b%c", _lettivd); + set_header(4, "@0g@r%s@12g@b%c", trans("Classe"), _lettivd); else - set_header(4, "@0gClasse@12g%c", _lettivd); + set_header(4, "@0g%s@12g%c", trans("Classe"), _lettivd); set_header(4, "@14g%-8s",(const char*) _numrivd); if (_numivd != 0) set_header(4, "@23g%d", _numivd); @@ -3664,12 +3703,12 @@ void TMastrini_application::ricerca_gruppo() { if (_nummast == 3) { - set_header (5, "@rPeriodo@12g@b%s", (const char*) dataini); + set_header (5, "@r%s@12g@b%s", trans("Periodo"), (const char*) dataini); set_header (5, "@24g@b%s@r", (const char*) datafine); } else { - set_header (5, "Periodo@12g%s", (const char*) dataini); + set_header (5, "%s@12g%s", trans("Periodo"), (const char*) dataini); set_header (5, "@24g%s", (const char*) datafine); } } @@ -3677,12 +3716,12 @@ void TMastrini_application::ricerca_gruppo() { if (_nummast == 3) { - set_header (5, "@rPeriodo di competenza@23g@b%s", (const char*) dataini); + set_header (5, "@r%s@23g@b%s", trans("Periodo di competenza"), (const char*) dataini); set_header (5, "@35g%s@r", (const char*) datafine); } else { - set_header (5, "Periodo di competenza@23g%s", (const char*) dataini); + set_header (5, "%s@23g%s", trans("Periodo di competenza"), (const char*) dataini); set_header (5, "@35g%s", (const char*) datafine); } } @@ -3718,9 +3757,9 @@ int TMastrini_application::ricerca_gruppo(int start) set_row(r++,"@91g%-.41s",(const char*) descrizione_sottoconto()); if (_nummast == 3) - set_row(r, "@0g@rClasse@12g@b%c", _lettivd); + set_row(r, "@0g@r%s@12g@b%c", trans("Classe"), _lettivd); else - set_row(r, "@0gClasse@12g%c", _lettivd); + set_row(r, "@0g%s@12g%c", trans("Classe"), _lettivd); set_row(r, "@14g%-8s",(const char*) _numrivd); if (_numivd != 0) set_row(r, "@23g%d", _numivd); @@ -3739,12 +3778,12 @@ int TMastrini_application::ricerca_gruppo(int start) { if (_nummast == 3) { - set_row (r, "@rPeriodo@12g@b%s", (const char*) dataini); + set_row (r, "@r%s@12g@b%s", trans("Periodo"), (const char*) dataini); set_row (r, "@24g%s@r", (const char*) datafine); } else { - set_row (r, "Periodo@12g%s", (const char*) dataini); + set_row (r, "%s@12g%s", trans("Periodo"), (const char*) dataini); set_row (r, "@24g%s", (const char*) datafine); } } @@ -3752,12 +3791,12 @@ int TMastrini_application::ricerca_gruppo(int start) { if (_nummast == 3) { - set_row (r, "@rPeriodo di competenza@23g@b%s", (const char*) dataini); + set_row (r, "@r%s@23g@b%s", trans("Periodo di competenza"), (const char*) dataini); set_row (r, "@35g%s@r", (const char*) datafine); } else { - set_row (r, "Periodo di competenza@23g%s", (const char*) dataini); + set_row (r, "%s@23g%s", trans("Periodo di competenza"), (const char*) dataini); set_row (r, "@35g%s", (const char*) datafine); } } @@ -3951,6 +3990,10 @@ bool TMastrini_application::user_create() _gia_stampata_intestazione = FALSE; + _collins = new TConfig("cg3200.ini", "Main"); + const TString& language = _collins->get("Language"); + _collins->set_paragraph(language); + return TRUE; } @@ -3972,6 +4015,8 @@ bool TMastrini_application::user_destroy() delete _d23; delete _d30; + delete _collins; + return TRUE; } diff --git a/cg/cg3200.h b/cg/cg3200.h index f45db7018..5bcd421c1 100755 --- a/cg/cg3200.h +++ b/cg/cg3200.h @@ -37,6 +37,9 @@ #define F_TIPOSTAMPA 115 #define F_STAMPAMOVPROV 116 #define F_SEPARATOR 117 +#define F_VALUTA 118 +#define F_DESVALUTA 119 + #define F_MEMORIZZA 500 #define F_NUMCARAT 501 #define F_NUMMAST 502 diff --git a/cg/cg3200a.uml b/cg/cg3200a.uml index 66b69c694..5918416bf 100755 --- a/cg/cg3200a.uml +++ b/cg/cg3200a.uml @@ -1,19 +1,19 @@ #include "cg3200.h" -TOOLBAR "" 0 20 0 2 +TOOLBAR "" 0 19 0 2 -BUTTON DLG_PRINT 16 2 +BUTTON DLG_PRINT 18 2 BEGIN PROMPT -13 -11 "~Stampa" MESSAGE EXIT,K_ENTER END -BUTTON F_MEMORIZZA 16 2 +BUTTON F_MEMORIZZA 18 2 BEGIN PROMPT -23 -11 "~Memorizza scelte" END -BUTTON DLG_QUIT 16 2 +BUTTON DLG_QUIT 18 2 BEGIN PROMPT -33 -11 "" END @@ -475,6 +475,31 @@ BEGIN ITEM "3|Completa" END +STRING F_VALUTA 3 +BEGIN + PROMPT 4 17 "Valuta di stampa " + FLAGS "U" + USE %VAL + INPUT CODTAB F_VALUTA + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@60" S0 + OUTPUT F_VALUTA CODTAB + OUTPUT F_DESVALUTA S0 + CHECKTYPE NORMAL +END + +STRING F_DESVALUTA 50 40 +BEGIN + PROMPT 32 17 "" + USE %VAL KEY 2 + INPUT S0 F_DESVALUTA + DISPLAY "Descrizione@60" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_VALUTA + CHECKTYPE NORMAL +END + + ENDPAGE PAGE "Parametri" -1 -1 78 20 diff --git a/cg/cg3400.cpp b/cg/cg3400.cpp index 9b4b5c52e..6bc398aca 100755 --- a/cg/cg3400.cpp +++ b/cg/cg3400.cpp @@ -1,6 +1,7 @@ // cg3400 - Stampa libro giornale #include +#include #include #include #include @@ -46,59 +47,58 @@ HIDDEN const int SEZA132 = 108; HIDDEN const int TOTAVERE132 = 110; HIDDEN enum descr { causale, conto, operazione }; +HIDDEN enum tipo_sospensione { nessuna, normale, vol_affari, liquidazione }; + class TContoOccas : public TBill { - long _s; - char _t; - TString _occfpi; - TString _descrizione; + TString16 _occfpi; + + TDecoder _clifoccas; + TDecoder _occas; + TAssoc_array _desc; public: const TContoOccas& set(int g = 0, int c = 0, long s = 0L, char t = ' ', - const char* d = NULL, int r = -1, const char* occfpi = NULL); + const char* occfpi = NULL); const TString& descrizione(); - TContoOccas() : _occfpi(NULL) {}; - virtual ~TContoOccas() {}; + TContoOccas(); + virtual ~TContoOccas() {} }; -const TContoOccas& TContoOccas::set(int g, int c, long s, char t,const char* d, int r, const char* occfpi) +TContoOccas::TContoOccas() + : _occfpi(NULL), _clifoccas(LF_CLIFO, CLI_OCCAS), + _occas(LF_OCCAS, "RAGSOC") +{ } + +const TContoOccas& TContoOccas::set(int g, int c, long s, char t, const char* occfpi) { - _s = s; _t = t; - TBill::set(g,c,s,t,d,r); + TBill::set(g,c,s,t); _occfpi = occfpi; return *this; } const TString& TContoOccas::descrizione() -{ - bool really_occas = FALSE; - +{ if (_occfpi.not_empty()) { - TLocalisamfile clifo(LF_CLIFO); - clifo.zero(); - clifo.put(CLI_CODCF, (long)_s); - clifo.put(CLI_TIPOCF, _t); - const bool clifo_ok = (clifo.read() == NOERR); - if (clifo_ok) - really_occas = clifo.get_bool(CLI_OCCAS); + TString16 code; code << tipo() << '|' << sottoconto(); + bool really_occas = _clifoccas.decode(code).not_empty(); + if (really_occas) + return _occas.decode(_occfpi); } - - if (really_occas) - { - TLocalisamfile occ(LF_OCCAS); - occ.zero(); - occ.put(OCC_CFPI, _occfpi); - if (occ.read() != NOERR) occ.zero(); - _descrizione = occ.get("RAGSOC"); - } - else - _descrizione = TBill::descrizione(); - return _descrizione; + TString16 code; code.format("%c%03d%03d%06ld", + tipo(), gruppo(), conto(), sottoconto()); + TString* d = (TString*)_desc.objptr(code); + if (d == NULL) + { + d = new TString(TBill::descrizione()); + _desc.add(code, d); + } + return *d; } class TStampa_giornale : public TPrintapp @@ -111,7 +111,7 @@ class TStampa_giornale : public TPrintapp static bool filter_func(const TRelation * r); static bool filtra_reg (const TRelation * r); - int righe_rimaste() const; + int righe_rimaste() const; private: TRelation* _rel; @@ -137,6 +137,8 @@ private: char _sezione; int _pagine_contate; // cnt pag. stampate. + TContoOccas _tc; + public: TRigaiva_array _iva_array; @@ -165,12 +167,13 @@ public: TString16 _provfis, _cap, _occfpi; TString80 _cofi; - TLocalisamfile * _com, *_clifo,*_pconti,*_nditte,*_anag; + TRecord_cache *_com; + TLocalisamfile *_clifo,*_pconti,*_nditte,*_anag; TLocalisamfile* _attiv; // da togliere in futuro (?) - TTable *_tabreg, *_tabval, *_tabes, *_tabiva; + TTable *_tabreg; - TDecoder* _causali; // Guy: saggia aggiunta + TDecoder *_causali, *_tabiva; // Guy: saggia aggiunta public: virtual void preprocess_header(); @@ -182,6 +185,8 @@ public: virtual void postclose_print(); // virtual bool cancel_hook(); virtual bool set_print(int); + + virtual void on_firm_change(); virtual bool user_create(); virtual bool user_destroy(); @@ -214,9 +219,8 @@ public: void get_dati_ditta (); const char* get_descr_caus (const char * codcaus); - TRectype& look_com (const char * cod); - TRectype& look_com (const TString& stato, const TString& cod); - const char* get_codiva_des(const char* codiva); + const TRectype& look_com (const char* cod, const char* stato = ""); + const TString& get_codiva_des(const char* codiva); void get_date_aep(int aep, TDate* in, TDate* fin); void update_totals (char sezione, real& importo); void set_reg_filter(TMask& m); @@ -247,6 +251,11 @@ bool TStampa_giornale::filter_func(const TRelation * r) const TString& provvis = recmov.get(MOV_PROVVIS); if (!provvis.blank()) return FALSE; + + // Scarto i movimenti che hanno il registro ai soli fini della liquidazione + const tipo_sospensione ts = r->lfile("REG").get_bool("B1") ? (tipo_sospensione) r->lfile("REG").get_int("I9") : nessuna; + if (ts == liquidazione) + return FALSE; // In caso di NO libro con iva scarta quelli che non hanno righe contabili if (!app()._libro_giornale_iva_unico) @@ -271,37 +280,12 @@ bool TStampa_giornale::filter_func(const TRelation * r) ////////////////////////////////////////////////////////////////////////// // Funzioni legate ai parametri ditta ////////////////////////////////////////////////////////////////////////// -HIDDEN bool libro_giornale_iva_unico() + +const TRectype& TStampa_giornale::look_com (const char* cod, const char* stato) { - TConfig conf(CONFIG_DITTA); - return conf.get_bool("StLgiU"); -} - -HIDDEN bool libro_cronologico() -{ - TConfig conf(CONFIG_DITTA); - return conf.get_bool("GsLbCn"); -} - -TRectype& TStampa_giornale::look_com (const TString& stato, const TString& cod) -{ - _com->zero(); - _com->put(COM_COM, cod); - _com->put(COM_STATO, stato); - if (_com->read() != NOERR) - _com->zero(); - - return _com->curr(); -} - -TRectype& TStampa_giornale::look_com (const char * cod) -{ - _com->zero(); - _com->put(COM_COM, cod); - if (_com->read() != NOERR) - _com->zero(); - - return _com->curr(); + TString16 codice; + codice << stato << '|' << cod; + return _com->get(codice); } const char* TStampa_giornale::get_descr_caus (const char * codcaus) @@ -311,8 +295,8 @@ const char* TStampa_giornale::get_descr_caus (const char * codcaus) void TStampa_giornale::get_dati_ditta () { - TString16 codanagr; - char tipoa; + TString16 codanagr; + char tipoa; _nditte->zero(); _nditte->put(NDT_CODDITTA, get_firm()); @@ -338,7 +322,7 @@ void TStampa_giornale::get_dati_ditta () if (_comunefis.empty()) _comunefis = _anag->get(ANF_COMRES); - TRectype dep = look_com (_comunefis); + const TRectype& dep = look_com (_comunefis); _comunefis = dep.get(COM_DENCOM); _provfis = dep.get(COM_PROVCOM); @@ -358,18 +342,23 @@ void TStampa_giornale::get_dati_ditta () } } +void TStampa_giornale::on_firm_change() +{ + TConfig conf(CONFIG_DITTA); + _libro_giornale_iva_unico = conf.get_bool("StLgiU"); + _libro_cronologico = conf.get_bool("GsLbCn"); +} + bool TStampa_giornale::user_create() { _ae = 0; _ae_solare = 0; _tabreg = new TTable ("REG"); - _tabval = new TTable ("%VAL"); - _tabes = new TTable ("ESC"); - _tabiva = new TTable ("%IVA"); + _tabiva = new TDecoder("%IVA"); _nditte = new TLocalisamfile(LF_NDITTE); _anag = new TLocalisamfile (LF_ANAG); - _com = new TLocalisamfile(LF_COMUNI); + _com = new TRecord_cache(LF_COMUNI); _clifo = new TLocalisamfile(LF_CLIFO); _pconti = new TLocalisamfile(LF_PCON); _attiv = new TLocalisamfile(LF_ATTIV); // da togliere @@ -378,6 +367,7 @@ bool TStampa_giornale::user_create() _rel = new TRelation (LF_MOV); _rel->add (LF_RMOV, "NUMREG=NUMREG"); _rel->add (LF_RMOVIVA, "NUMREG=NUMREG"); + _rel->add ("REG", "CODTAB[1,4]=ANNOIVA|CODTAB[5,7]=REG"); _cur = new TCursor (_rel, "", 2); // usa la chiave 2: DATAREG+NUMREG @@ -395,19 +385,18 @@ bool TStampa_giornale::user_create() bool TStampa_giornale::user_destroy() { delete _rel; - delete _cur; delete _RecPartoDa; delete _RecArrivoA; - delete _com; delete _clifo; delete _pconti; + delete _com; + delete _clifo; delete _pconti; delete _nditte; delete _anag; - delete _tabreg; delete _tabes; delete _tabval; delete _tabiva; + delete _tabreg; + delete _tabiva; delete _causali; delete _attiv; // da togliere in futuro - delete _nditte; - delete _anag; return TRUE; } @@ -449,8 +438,8 @@ int TStampa_giornale::set_totali_giorno(const TDate& data, const int righeiva) // Se e' l'unico totale lo stampo anche se e' zero if (competenza_ec() || (_tot_avere_gg != ZERO || _tot_dare_gg != ZERO)) { - TString td(_tot_dare_gg.string (REAL_PICTURE)); - TString ta(_tot_avere_gg.string(REAL_PICTURE)); + TString80 td; real2currency(td, _tot_dare_gg); + TString80 ta; real2currency(ta, _tot_avere_gg); sprintf(dep, "@b@%dgTotale operazioni del %s @%dg%c %s @%dg%c @%dg%s", _stampa_width == 132 ? SCRITTA : DARE198-STACC, @@ -470,8 +459,8 @@ int TStampa_giornale::set_totali_giorno(const TDate& data, const int righeiva) if (competenza_ep() || (_tot_avere_gg_ap != ZERO || _tot_dare_gg_ap != ZERO)) { - TString tdp(_tot_dare_gg_ap.string(REAL_PICTURE)); - TString tap(_tot_avere_gg_ap.string(REAL_PICTURE)); + TString80 tdp; real2currency(tdp, _tot_dare_gg_ap); + TString80 tap; real2currency(tap, _tot_avere_gg_ap); sprintf (dep, "@b@%dgTotale operazioni del %s Anno precedente @%dg%c %s @%dg%c @%dg%s", _stampa_width == 132 ? SCRITTA : DARE198-STACC, @@ -495,14 +484,11 @@ int TStampa_giornale::set_totali_giorno(const TDate& data, const int righeiva) void TStampa_giornale::postclose_print() { - if (_stampa_definitiva) + if (_stampa_definitiva && yesno_box("La stampa e' corretta?")) { - if (yesno_box("La stampa e' corretta ?")) - { - const int ultima_fatta = _pagine_contate; - aggiorna_mov(); - aggiorna_tabreg (_pagina_da, ultima_fatta); - } + const int ultima_fatta = _pagine_contate; + aggiorna_mov(); + aggiorna_tabreg (_pagina_da, ultima_fatta); } } @@ -521,8 +507,8 @@ void TStampa_giornale::preprocess_footer() if (_tot_avere_progr_ap != ZERO || _tot_dare_progr_ap != ZERO) { - progr_dare_ap = _tot_dare_progr_ap.string(REAL_PICTURE); - progr_avere_ap = _tot_avere_progr_ap.string(REAL_PICTURE); + real2currency(progr_dare_ap, _tot_dare_progr_ap); + real2currency(progr_avere_ap, _tot_avere_progr_ap); ap = TRUE; } @@ -544,8 +530,8 @@ void TStampa_giornale::preprocess_footer() { dt = _tot_dare_progr + _tot_dare_progr_ap; at = _tot_avere_progr + _tot_avere_progr_ap; - dts = dt.string(REAL_PICTURE); - ats = at.string(REAL_PICTURE); + real2currency(dts, dt); + real2currency(ats, at); riga.format ("@b@%dg%s@%dg%c %s @%dg%c @%dg%s", _stampa_width == 132 ? SCRITTA : DARE198-STUMB, @@ -581,8 +567,8 @@ int TStampa_giornale::set_totali_pagina(int righe) if (_tot_avere_progr_ap != ZERO || _tot_dare_progr_ap != ZERO) { - progr_dare_ap = _tot_dare_progr_ap.string(REAL_PICTURE); - progr_avere_ap = _tot_avere_progr_ap.string(REAL_PICTURE); + real2currency(progr_dare_ap, _tot_dare_progr_ap); + real2currency(progr_avere_ap, _tot_avere_progr_ap); ap = TRUE; } @@ -591,8 +577,8 @@ int TStampa_giornale::set_totali_pagina(int righe) // I totali distinti tra anno precedente e corrente SOLO SE STAMPA DI PROVA if (!_stampa_definitiva) { - progr_dare = _tot_dare_progr.string (REAL_PICTURE); - progr_avere = _tot_avere_progr.string(REAL_PICTURE); + real2currency(progr_dare, _tot_dare_progr); + real2currency(progr_avere, _tot_avere_progr); riga = ""; riga.format("@b@%dgTotale progressivi @%dg%c %s @%dg%c @%dg%s", _stampa_width == 132 ? SCRITTA : DARE198-STUMB, @@ -625,8 +611,8 @@ int TStampa_giornale::set_totali_pagina(int righe) _tot_dare_generale = _tot_dare_progr + _tot_dare_progr_ap; _tot_avere_generale = _tot_avere_progr + _tot_avere_progr_ap; - dts = _tot_dare_generale.string (REAL_PICTURE); - ats = _tot_avere_generale.string(REAL_PICTURE); + real2currency(dts, _tot_dare_generale); + real2currency(ats, _tot_avere_generale); riga.format("@b@%dgTotale progressivi generali @%dg%c %s @%dg%c @%dg%s", _stampa_width == 132 ? SCRITTA : DARE198-STUMB, @@ -653,8 +639,8 @@ int TStampa_giornale::set_totali_pagina(int righe) dt = _tot_dare_progr + _tot_dare_progr_ap; at = _tot_avere_progr + _tot_avere_progr_ap; - dts = dt.string(REAL_PICTURE); - ats = at.string(REAL_PICTURE); + real2currency(dts, dt); + real2currency(ats, at); // "Se il mese e' finito devo scrivere Totale progressivi generali // invece che A riportare" @@ -800,8 +786,8 @@ void TStampa_giornale::preprocess_header() return; } - TString dare (riporto_dare.string (REAL_PICTURE)); - TString avere(riporto_avere.string(REAL_PICTURE)); + TString80 dare; real2currency(dare, riporto_dare); + TString80 avere; real2currency(avere, riporto_avere); riporto.format("@b@%dgRiporto: @%dg%c %17s @%dg%c@%dg%17s", // prima erano %15s _stampa_width == 132 ? SCRITTA : DARE198-11, @@ -1054,8 +1040,6 @@ void TStampa_giornale::set_rows (int file, int counter) TString16 datadoc_str, datareg_str, numdoc, frm, caus; TDate datadoc, datareg; TString80 mov_descr, rmv_descr; - TParagraph_string descr_conto("", 50); - TContoOccas tc; long numreg, protiva; int r = 1; int g, c; @@ -1066,152 +1050,156 @@ void TStampa_giornale::set_rows (int file, int counter) switch (file) { case LF_MOV: - reset_row(1); - reset_row(2); - - datareg = _cur->file(LF_MOV).get_date("DATAREG"); - datadoc = _cur->file(LF_MOV).get_date("DATADOC"); - datareg_str = datareg.string(); - // "Fai vedere lo stesso ..-..-.... anche se non c'e' la data..." - if (datareg_str.empty()) - datareg_str = " - - "; - datadoc_str = datadoc.string(); - if (datadoc_str.empty()) - datadoc_str = " - - "; - numdoc = _cur->file(LF_MOV).get("NUMDOC"); - numreg = _cur->file(LF_MOV).get_long("NUMREG"); - mov_descr = _cur->file(LF_MOV).get("DESCR"); - - // Usati in setta_righe_iva per determinare tipo attivita' - _reg = _cur->file(LF_MOV).get(MOV_REG); - _anno_iva = _cur->file(LF_MOV).get_int(MOV_ANNOIVA); - - protiva = _cur->file(LF_MOV).get_long(MOV_PROTIVA); - caus = _cur->file(LF_MOV).get(MOV_CODCAUS); - _occfpi = _cur->file(LF_MOV).get(MOV_OCFPI); - _annoEsMov = _cur->file(LF_MOV).get_int(MOV_ANNOES); - _MovGiaStampato = _cur->file(LF_MOV).get_bool(MOV_STAMPATO); - - if (_stampa_definitiva) { - set_row(r,"Operazione n. @b%-7ld@r", _nprog_mov); - set_row(r," del @b%s@r", (const char*)datareg_str); // XX/XX/XXXX - set_row(r," doc. n. @b%-7s@r",(const char*)numdoc); - set_row(r," del @b%s@r %-50s",(const char*)datadoc_str, - (const char*)mov_descr); - } - else - { - set_row(r,"Operazione n. @b%-7ld@r", numreg); - set_row(r," del @b%s@r", (const char*) datareg_str); - set_row(r," doc. n. @b%-7s@r", (const char*) numdoc); - set_row(r," del @b%s@r %-50s", (const char*)datadoc_str,(const char*)mov_descr); - } - - if (_annoEsMov != _ae) - set_row(r," Comp. %04d", _annoEsMov); + const TRectype& mov = _cur->curr(LF_MOV); + reset_row(1); + reset_row(2); - if (_MovGiaStampato && !_stampa_definitiva) - { - TString16 str; - str.format("@%dg*",_stampa_width == 132 ? 131 : 197); - set_row(r,str); - } + datareg = mov.get_date("DATAREG"); + datadoc = mov.get_date("DATADOC"); + datareg_str = datareg.string(); + // "Fai vedere lo stesso ..-..-.... anche se non c'e' la data..." + if (datareg_str.empty()) + datareg_str = " - - "; + datadoc_str = datadoc.string(); + if (datadoc_str.empty()) + datadoc_str = " - - "; + numdoc = mov.get("NUMDOC"); + numreg = mov.get_long("NUMREG"); + mov_descr = mov.get("DESCR"); - if (caus.not_empty()) - { - const char* desc_caus = get_descr_caus(caus); - set_row(r+1, "@36gCausale %3s %-50s", (const char*) caus, desc_caus); - if (_reg.not_empty()) - set_row(r+1, " (R.IVA @b%3s@r Prot. @b%ld@r) ", (const char*)_reg,protiva); - } + // Usati in setta_righe_iva per determinare tipo attivita' + _reg = mov.get(MOV_REG); + _anno_iva = mov.get_int(MOV_ANNOIVA); + + protiva = mov.get_long(MOV_PROTIVA); + caus = mov.get(MOV_CODCAUS); + _occfpi = mov.get(MOV_OCFPI); + _annoEsMov = mov.get_int(MOV_ANNOES); + _MovGiaStampato = mov.get_bool(MOV_STAMPATO); + + if (_stampa_definitiva) + { + set_row(r,"Operazione n. @b%-7ld@r", _nprog_mov); + set_row(r," del @b%s@r", (const char*)datareg_str); // XX/XX/XXXX + set_row(r," doc. n. @b%-7s@r",(const char*)numdoc); + set_row(r," del @b%s@r %-50s",(const char*)datadoc_str, + (const char*)mov_descr); + } + else + { + set_row(r,"Operazione n. @b%-7ld@r", numreg); + set_row(r," del @b%s@r", (const char*) datareg_str); + set_row(r," doc. n. @b%-7s@r", (const char*) numdoc); + set_row(r," del @b%s@r %-50s", (const char*)datadoc_str,(const char*)mov_descr); + } + + if (_annoEsMov != _ae) + set_row(r," Comp. %04d", _annoEsMov); + + if (_MovGiaStampato && !_stampa_definitiva) + { + TString16 fmt; + fmt.format("@%dg*", _stampa_width == 132 ? 131 : 197); + set_row(r,fmt); + } + + if (caus.not_empty()) + { + const char* desc_caus = get_descr_caus(caus); + set_row(r+1, "@36gCausale %3s %-50s", (const char*) caus, desc_caus); + if (_reg.not_empty()) + set_row(r+1, " (R.IVA @b%3s@r Prot. @b%ld@r) ", (const char*)_reg,protiva); + } + } break; case LF_RMOV: - - _num_rig++; - - reset_print(); - - g = _cur->file(LF_RMOV).get_int("GRUPPO"); - c = _cur->file(LF_RMOV).get_int("CONTO"); - s = _cur->file(LF_RMOV).get_long("SOTTOCONTO"); - cf = _cur->file(LF_RMOV).get_char(RMV_TIPOC); - - if (cf != 'C' && cf != 'F') - cf = ' '; - - numreg = _cur->file(LF_RMOV).get_long("NUMREG"); - datareg = _cur->file(LF_RMOV).get("DATAREG"); - - _sezione = _cur->file(LF_RMOV).get_char (RMV_SEZIONE); - _importo = _cur->file(LF_RMOV).get_real (RMV_IMPORTO); - - rmv_descr = _cur->file(LF_RMOV).get(RMV_DESCR); - - r=1; - - // Num. progressivo di operazione. Azzerato in preprocess_page - if (!_stampa_definitiva) set_row (r, "%7ld", _num_rig); - - set_row (r, "@8g%-50s", (const char*) rmv_descr); - - set_row (r, "@59g%03d.", g); - if (c != 0) - set_row (r, "%03d.", c); - if (s != 0L) - set_row (r, "%06ld", s); - - tc.set(g,c,s,cf,NULL,-1,_occfpi); - - if (_stampa_width == 132) - descr_conto.set_width (WCONTO132); - else // se a 198 non spezzo le descrizioni - descr_conto.set_width(198); - - descr_conto = tc.descrizione(); - - if (_stampa_width == 132) - rdes = setta_righe_descr (descr_conto, conto); - else { - rdes = 2; - frm.format("@%dg%%-%ds", POSCONTO,50); - set_row (r, frm, (const char*) descr_conto); - } + const TRectype& rmov = _cur->curr(LF_RMOV); + _num_rig++; + reset_print(); - if (cf > ' ') - if (_libro_cronologico) - rdes = setta_righe_indirizzo(cf, s, rdes); + g = rmov.get_int("GRUPPO"); + c = rmov.get_int("CONTO"); + s = rmov.get_long("SOTTOCONTO"); + cf = rmov.get_char(RMV_TIPOC); - // NB Totali aggiornati in postprocess_page (update_totals()) - - if (_stampa_width == 132) - { - set_row (r, "@110g%r %c", &_importo, _sezione); - } - else // stampa_width == 198 - set_row (r, _sezione == 'D' ? "@152g%r" : "@174g%r", &_importo); + if (cf != 'C' && cf != 'F') + cf = ' '; - if (_MovGiaStampato && !_stampa_definitiva) - { - TString16 str; - str.format("@%dg*",_stampa_width == 132 ? 131 : 197); - set_row(r, str); - } + numreg = rmov.get_long("NUMREG"); + datareg = rmov.get("DATAREG"); - { - const int rows = rdes - 1; - const int left = printer().rows_left(); - if (left > 0 && left < rows) - { - _totals_updated = TRUE; - update_totals(_sezione, _importo); - } + _sezione = rmov.get_char (RMV_SEZIONE); + _importo = rmov.get_real (RMV_IMPORTO); + + rmv_descr = rmov.get(RMV_DESCR); + + r=1; + + // Num. progressivo di operazione. Azzerato in preprocess_page + if (!_stampa_definitiva) set_row (r, "%7ld", _num_rig); + + set_row (r, "@8g%-50s", (const char*) rmv_descr); + + set_row (r, "@59g%03d.", g); + if (c != 0) + set_row (r, "%03d.", c); + if (s != 0L) + set_row (r, "%06ld", s); + + _tc.set(g,c,s,cf,_occfpi); + + TParagraph_string descr_conto("", 198); + if (_stampa_width == 132) + descr_conto.set_width (WCONTO132); + else // se a 198 non spezzo le descrizioni + descr_conto.set_width(198); + + descr_conto = _tc.descrizione(); + + if (_stampa_width == 132) + rdes = setta_righe_descr (descr_conto, conto); else - _totals_updated = FALSE; - } + { + rdes = 2; + frm.format("@%dg%%-%ds", POSCONTO,50); + set_row (r, frm, (const char*) descr_conto); + } + if (cf > ' ') + if (_libro_cronologico) + rdes = setta_righe_indirizzo(cf, s, rdes); + + // NB Totali aggiornati in postprocess_page (update_totals()) + + if (_stampa_width == 132) + { + set_row (r, "@110g%r %c", &_importo, _sezione); + } + else // stampa_width == 198 + set_row (r, _sezione == 'D' ? "@152g%r" : "@174g%r", &_importo); + + if (_MovGiaStampato && !_stampa_definitiva) + { + TString16 fmt; + fmt.format("@%dg*", _stampa_width == 132 ? 131 : 197); + set_row(r,fmt); + } + + { + const int rows = rdes - 1; + const int left = printer().rows_left(); + if (left > 0 && left < rows) + { + _totals_updated = TRUE; + update_totals(_sezione, _importo); + } + else + _totals_updated = FALSE; + } + } break; default: @@ -1228,21 +1216,24 @@ bool TStampa_giornale::preprocess_page(int file, int counter) { if (counter) return TRUE; - switch (file) { + switch (file) + { case LF_MOV: - _annoEsMov = _anno_iva = 0; - _iva_array.destroy(); - *_RecArrivoA = _cur->file(LF_MOV).curr(); - _nprog_mov++; -// Il numero di operazione deve ripartire da 0 per ogni movimento - _num_rig = 0; - _data_corr = _cur->file(LF_MOV).get_date(MOV_DATAREG); -// _ultima_data_mov finisce sul registro come ultima data di stampa - if (_data_corr > _ultima_data_mov) - _ultima_data_mov = _data_corr; - _mese_corr = _data_corr.month(); - _devo_riportare = TRUE; + { + _annoEsMov = _anno_iva = 0; + _iva_array.destroy(); + *_RecArrivoA = _cur->file(LF_MOV).curr(); + _nprog_mov++; + // Il numero di operazione deve ripartire da 0 per ogni movimento + _num_rig = 0; + _data_corr = _cur->file(LF_MOV).get_date(MOV_DATAREG); + // _ultima_data_mov finisce sul registro come ultima data di stampa + if (_data_corr > _ultima_data_mov) + _ultima_data_mov = _data_corr; + _mese_corr = _data_corr.month(); + _devo_riportare = TRUE; + } break; case LF_RMOV: @@ -1261,11 +1252,11 @@ bool TStampa_giornale::preprocess_page(int file, int counter) void TStampa_giornale::calcola_iva() { - TString codiva; + TString16 codiva; int tipocr, tipodet, tipoatt; real impo, impos; bool intra; - TRectype iva (_cur->file(LF_RMOVIVA).curr()); + const TRectype& iva = _cur->file(LF_RMOVIVA).curr(); if (!iva.empty()) { @@ -1322,14 +1313,9 @@ int TStampa_giornale::setta_righe_descr(TParagraph_string& str, enum descr des) return i; } -const char* TStampa_giornale::get_codiva_des(const char* codiva) +const TString& TStampa_giornale::get_codiva_des(const char* codiva) { - _tabiva->zero(); - _tabiva->put("CODTAB", codiva); - if (_tabiva->read() == NOERR) - return _tabiva->get("S0"); - else - return NULL; + return _tabiva->decode(codiva); } // NB @@ -1343,18 +1329,18 @@ int TStampa_giornale::setta_righe_iva() for (j = 0; j < _iva_array.items(); j++) { - TRigaiva& riga = (TRigaiva&)_iva_array[j]; + const TRigaiva& riga = (TRigaiva&)_iva_array[j]; r = j+1; - TString impon_str(riga._imponibile.string(REAL_PICTURE)); - TString impos_str(riga._imposta.string(REAL_PICTURE)); + TString80 impon_str; real2currency(impon_str, riga._imponibile); + TString80 impos_str; real2currency(impos_str, riga._imposta); // set_row(r, " Imponibile@15g%15r", &riga._imponibile); // set_row(r, "@31gImposta@39g%15r", &riga._imposta); set_row(r, " Imponibile@15g%15s", (const char*)impon_str); set_row(r, "@35gImposta@43g%15s", (const char*)impos_str); // set_row(r, "@58gCod.Iva@68g%3s", (const char*)riga._codiva); set_row(r, "@64gCod.Iva %3s", (const char*)riga._codiva); - const TString80 codiva_des(get_codiva_des(riga._codiva)); - const int tipoatt = riga._tipoatt; + const TString& codiva_des = get_codiva_des(riga._codiva); + const int tipoatt = riga._tipoatt; if (_stampa_width == 132) set_row(r, "@76g%-.17s", (const char*)codiva_des); else @@ -1384,32 +1370,31 @@ int TStampa_giornale::setta_righe_iva() if (meseliq > 0) set_row(r, " Mese liq. %2d", meseliq); - TRegistro reg(_reg, _anno_iva); - const bool att_mista_ev = reg.attivita_mista(); - if (tipoatt != 0 && att_mista_ev) - set_row(r, " Tipo attivita' %d", tipoatt); + if (tipoatt != 0) + { + TRegistro reg(_reg, _anno_iva); + const bool att_mista_ev = reg.attivita_mista(); + if (att_mista_ev) + set_row(r, " Tipo attivita' %d", tipoatt); + } } _iva_array.destroy(); return r; } -int TStampa_giornale::setta_righe_valuta(int riga) +int TStampa_giornale::setta_righe_valuta(int r) { - TString16 codvali; - real corrval; - int r = riga; - corrval = current_cursor()->file(LF_MOV).get_real(MOV_CORRVALUTA); + const real corrval = current_cursor()->file(LF_MOV).get_real(MOV_CORRVALUTA); if (corrval != ZERO) { - codvali = current_cursor()->file(LF_MOV).get(MOV_CODVALI); - TString valut(corrval.string("###.###.###.###,@@@")); - r = riga+1; - set_row(r,"@56gValuta %3s", (const char*)codvali); + const TString16 codvali = current_cursor()->file(LF_MOV).get(MOV_CODVALI); + const TCurrency cur(corrval, codvali); + set_row(++r,"@56gValuta %3s", (const char*)codvali); if (_stampa_width == 132) - set_row(r,"@89gCorr.in valuta @109g%s", (const char*)valut); + set_row(r,"@89gCorr.in valuta @109g%20v", &cur); else - set_row(r,"@119gCorr.in valuta @171g%s", (const char*)valut); + set_row(r,"@119gCorr.in valuta @171g%20v", &cur); } return r; } @@ -1462,7 +1447,7 @@ int TStampa_giornale::setta_righe_indirizzo(char tipocf, long codcf,int rdes) codanagr = _clifo->get_long(CLI_CODANAGPER); } - TRectype rec = look_com (statocf, comcf); + const TRectype& rec = look_com (comcf, statocf); comune = rec.get(COM_DENCOM); prov = rec.get(COM_PROVCOM); if (comcf.empty()) comune = _clifo->get(CLI_LOCCF); @@ -1500,7 +1485,7 @@ int TStampa_giornale::setta_righe_indirizzo(char tipocf, long codcf,int rdes) { codcomna = _clifo->get("COMNASC"); statona = _clifo->get("STATONASC"); - TRectype dep = look_com (statona,codcomna); + const TRectype& dep = look_com (codcomna, statona); comna = dep.get(COM_DENCOM); provna = dep.get(COM_PROVCOM); @@ -1571,7 +1556,7 @@ bool TStampa_giornale::controlla_mov_aep() a.put (MOV_DATAREG, fine_ep); _cur->setregion(da, a); - _cur->set_filterfunction(filter_func); + _cur->set_filterfunction(filter_func, TRUE); // _cur->setfilter(format("ANNOES=%04d && STAMPATO!=\"X\"", aep)); bool gia_stampati = TRUE; @@ -1880,7 +1865,7 @@ bool TStampa_giornale::init_cursor() a.put (MOV_DATAREG, _data_a); _cur->setregion(da, a); - _cur->set_filterfunction(filter_func); + _cur->set_filterfunction(filter_func, TRUE); _cur->setfilter(_stampa_definitiva ? "STAMPATO!=\"X\"" : ""); (*_cur) = 0L; @@ -1897,7 +1882,6 @@ bool TStampa_giornale::init_cursor() bool TStampa_giornale::set_print(int) { TMask ma ("cg3400a"); - KEY tasto; ma.set_handler (CODREG, mask_a_cod_reg); ma.set_handler (DATA_A, data_a_hndl); @@ -1907,11 +1891,9 @@ bool TStampa_giornale::set_print(int) _pagina_da = 0; // Parto dall'inizio _forza_ariportare = FALSE; + KEY tasto; while ((tasto = ma.run()) != K_QUIT) { - _libro_giornale_iva_unico = libro_giornale_iva_unico(); - _libro_cronologico = libro_cronologico(); - _reg_cod = ma.get(CODREG); _stampa_definitiva = ma.get_bool(STAMPA_DEF); _data_da = ma.get(DATA_DA); @@ -1920,6 +1902,9 @@ bool TStampa_giornale::set_print(int) _stampa_width = ma.get_int(STAMPA_WIDTH); _stampa_len = ma.get_int(STAMPA_LEN); + set_magic_currency(TRUE); + set_curr_codval(ma.get(F_CODVAL)); + // Se stampa definitiva DALLA_DATA e' la data di inizio esercizio // e si scartano i movimenti gia' stampati su bollato if (_stampa_definitiva) diff --git a/cg/cg3400a.h b/cg/cg3400a.h index 590d6ee91..a05b2dca9 100755 --- a/cg/cg3400a.h +++ b/cg/cg3400a.h @@ -5,6 +5,7 @@ #define DATA_A 102 #define STAMPA_DEF 103 //#define PAGINA_DA 104 +#define F_CODVAL 105 #define REG_DESC 107 @@ -14,4 +15,3 @@ #define STAMPA_LEN 110 #define F_CODDITTA 111 #define F_RAGSOC 112 - diff --git a/cg/cg3400a.uml b/cg/cg3400a.uml index 75d3800c0..c1aca7fb9 100755 --- a/cg/cg3400a.uml +++ b/cg/cg3400a.uml @@ -2,25 +2,25 @@ PAGE "Stampa Libro Giornale" -1 -1 76 14 -GROUPBOX DLG_NULL 77 3 +GROUPBOX DLG_NULL 74 3 BEGIN PROMPT 1 0 "" END NUMBER F_CODDITTA 5 BEGIN - PROMPT 3 1 "Ditta " - FLAGS "FRD" - USE LF_NDITTE KEY 1 - CHECKTYPE REQUIRED - INPUT CODDITTA F_CODDITTA - OUTPUT F_RAGSOC RAGSOC + PROMPT 2 1 "Ditta " + FLAGS "FRD" + USE LF_NDITTE KEY 1 + INPUT CODDITTA F_CODDITTA + OUTPUT F_RAGSOC RAGSOC + CHECKTYPE REQUIRED END STRING F_RAGSOC 50 BEGIN - PROMPT 17 1 "Ragione " - FLAGS "D" + PROMPT 15 1 "Ragione " + FLAGS "D" END DATE DATA_DA @@ -69,9 +69,8 @@ END STRING REG_DESC 50 BEGIN -// PROMPT 1 7 "Descrizione " - PROMPT 25 6 "" - FLAGS "D" + PROMPT 24 6 "" + FLAGS "D" END @@ -106,7 +105,6 @@ END LISTBOX STAMPA_WIDTH 4 BEGIN PROMPT 41 9 "Numero di colonne " -// PROMPT 2 9 "Numero di colonne " HELP "Numero di colonne per pagina del modulo di stampa." ITEM "1|132" ITEM "2|198" @@ -115,26 +113,37 @@ END NUMBER STAMPA_LEN 3 BEGIN PROMPT 41 10 "Numero di righe " -// PROMPT 2 10 "Numero di righe " HELP "Numero di righe per pagina del modulo di stampa. Se non specificato assume 66 righe" END BOOLEAN STAMPA_DEF BEGIN -// PROMPT 2 13 "Stampa definitiva su bollato" PROMPT 1 9 "Stampa definitiva su bollato" HELP "Seleziona la stampa su bollato oppure, se vuoto, la stampa di prova" - MESSAGE TRUE DISABLE,DATA_DA | CLEAR, DATA_DA + MESSAGE TRUE CLEAR,DATA_DA MESSAGE FALSE ENABLE,DATA_DA END -BUTTON DLG_PRINT 9 2 +STRING F_CODVAL 3 +BEGIN + PROMPT 1 10 "Valuta " + USE %VAL + INPUT CODTAB F_CODVAL + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODVAL CODTAB + CHECKTYPE NORMAL +// Per ora non visibile + FLAGS "HU" +END + +BUTTON DLG_PRINT 10 2 BEGIN PROMPT -12 -1 "~Stampa" MESSAGE EXIT,K_ENTER END -BUTTON DLG_QUIT 9 2 +BUTTON DLG_QUIT 10 2 BEGIN PROMPT -22 -1 "" END diff --git a/cg/cg3400b.uml b/cg/cg3400b.uml index 598bcdd3d..cf377879a 100755 --- a/cg/cg3400b.uml +++ b/cg/cg3400b.uml @@ -8,10 +8,9 @@ BEGIN PROMPT 1 1 "Ultimo numero di riga stampato " END -NUMBER PROGR_DARE 18 +CURRENCY PROGR_DARE 18 BEGIN PROMPT 1 3 "Progressivo dare " - PICTURE "##.###.###.###.###" END DATE ULTIMA_DATA diff --git a/cg/cg3500.cpp b/cg/cg3500.cpp index fc6958514..c6e22436f 100755 --- a/cg/cg3500.cpp +++ b/cg/cg3500.cpp @@ -424,15 +424,13 @@ bool TStampa_riepilogo::ricerca_cf(TConto& conto,int indbil,real& prg_conto_dare bool TStampa_riepilogo::preprocess_print(int file, int counter) { -#ifdef DBG - set_real_picture ("@@@.@@@.###.###.###"); -#else set_real_picture ("###.###.###.###.###"); -#endif - set_print_zero(FALSE); + set_print_zero(FALSE); + set_magic_currency(TRUE); + _tmp_saldi->setkey(2); - _prg_dare_tot = 0.00; - _prg_avere_tot = 0.00; + _prg_dare_tot = 0.0; + _prg_avere_tot = 0.0; _gprec = -1; _cprec = -1; @@ -783,9 +781,9 @@ void TStampa_riepilogo::setta_riga_totale() go += 20; } - TString st(24); - st << '@' << go << 'g' << _saldo_tot.string("###.###.###.###.###"); - set_row(r, (const char*)st); + TString16 st; + st << '@' << go << "g%r"; + set_row(r, st, &_saldo_tot); } } @@ -838,12 +836,11 @@ bool TStampa_riepilogo::user_destroy() bool TStampa_riepilogo::set_print(int) { TMask m ("cg3500a"); - KEY tasto = m.run(); - if (tasto == K_ENTER) + if (m.run() == K_ENTER) { - _annoese = atoi(m.get(F_ANNO)); - _scelta = atoi(m.get(F_STAMPA)); - _richiesta = atoi(m.get(F_RICHIESTA)); + _annoese = m.get_int(F_ANNO); + _scelta = m.get_int(F_STAMPA); + _richiesta = m.get_int(F_RICHIESTA); _data = m.get(F_DATASTAMPA); _prog = new TProgind(_pcn->items(), "Elaborazione in corso...", FALSE); diff --git a/cg/cg3600.cpp b/cg/cg3600.cpp index 7f2974ac8..25aff088b 100755 --- a/cg/cg3600.cpp +++ b/cg/cg3600.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -2189,12 +2190,18 @@ void TMastrini_grid::destroy() grid().select(-1); } +HIDDEN const char* real2string(const real& r) +{ + TCurrency cur(r, "_FIRM"); + return cur.string(TRUE); +} + HIDDEN void set_imp(TMask_field& f, const TImporto& imp) { if (!imp.is_zero()) { TString80 str; - str.format("%s %c", imp.valore().string("."), imp.sezione()); + str.format("%s %c", real2string(imp.valore()), imp.sezione()); f.set(str); } else @@ -2271,14 +2278,14 @@ void TMastrini_grid::cell_request(long rec, short id, TGrid_cell& cell) { const TRectype& rmov = _mastrino.riga(rec); if (rmov.get_char(RMV_SEZIONE) == 'D') - cell = rmov.get_real(RMV_IMPORTO).string("."); + cell = real2string(rmov.get_real(RMV_IMPORTO)); } break; case 106: { const TRectype& rmov = _mastrino.riga(rec); if (rmov.get_char(RMV_SEZIONE) == 'A') - cell = rmov.get_real(RMV_IMPORTO).string("."); + cell = real2string(rmov.get_real(RMV_IMPORTO)); } break; case 107: @@ -2292,7 +2299,7 @@ void TMastrini_grid::cell_request(long rec, short id, TGrid_cell& cell) case 108: { const TRectype& rmov = _mastrino.riga(rec); - cell = rmov.get_real(RMV_IMPORTO).string("."); + cell = real2string(rmov.get_real(RMV_IMPORTO)); cell << ' ' << rmov.get(RMV_SEZIONE); } break; @@ -2311,7 +2318,7 @@ void TMastrini_grid::cell_request(long rec, short id, TGrid_cell& cell) TImporto imp = riga.saldo(); imp += _mastrino.saldo_iniziale(); imp.normalize(); - cell = imp.valore().string("."); + cell = real2string(imp.valore()); cell << ' ' << imp.sezione(); } } diff --git a/cg/cg3600b.uml b/cg/cg3600b.uml index 30094b4e5..67a0c5226 100755 --- a/cg/cg3600b.uml +++ b/cg/cg3600b.uml @@ -63,9 +63,9 @@ SPREADSHEET F_MASTRINI 0 -6 BEGIN PROMPT 1 2 "Mastrini" FLAGS "DM2" - ITEM "Data Op. \nData Doc.@10F" - ITEM "C@1F" - ITEM "Causale@20F" + ITEM "Data Op. \nData Doc.@10" + ITEM "C@1" + ITEM "Causale@20" ITEM "Operazione@20" ITEM "Dare@15R" ITEM "Avere@15R" @@ -100,17 +100,15 @@ BEGIN FLAGS "DR" END -NUMBER F_TOTPRO_DAR 19 +CURRENCY F_TOTPRO_DAR 19 BEGIN PROMPT 37 -4 "" - PICTURE "." FLAGS "D" END -NUMBER F_TOTPRO_AVE 19 +CURRENCY F_TOTPRO_AVE 19 BEGIN PROMPT 58 -4 "" - PICTURE "." FLAGS "D" END @@ -125,17 +123,15 @@ BEGIN FLAGS "DR" END -NUMBER F_TOTRIG_DAR 19 +CURRENCY F_TOTRIG_DAR 19 BEGIN PROMPT 37 -3 "" - PICTURE "." FLAGS "D" END -NUMBER F_TOTRIG_AVE 19 +CURRENCY F_TOTRIG_AVE 19 BEGIN PROMPT 58 -3 "" - PICTURE "." FLAGS "D" END @@ -150,17 +146,15 @@ BEGIN FLAGS "DR" END -NUMBER F_TOTPER_DAR 19 +CURRENCY F_TOTPER_DAR 19 BEGIN PROMPT 37 -2 "" - PICTURE "." FLAGS "D" END -NUMBER F_TOTPER_AVE 19 +CURRENCY F_TOTPER_AVE 19 BEGIN PROMPT 58 -2 "" - PICTURE "." FLAGS "D" END @@ -175,17 +169,15 @@ BEGIN FLAGS "DR" END -NUMBER F_TOTATT_DAR 19 +CURRENCY F_TOTATT_DAR 19 BEGIN PROMPT 37 -1 "" - PICTURE "." FLAGS "D" END -NUMBER F_TOTATT_AVE 19 +CURRENCY F_TOTATT_AVE 19 BEGIN PROMPT 58 -1 "" - PICTURE "." FLAGS "D" END diff --git a/cg/cg3700.cpp b/cg/cg3700.cpp index d80ec5f7d..8210b541b 100755 --- a/cg/cg3700.cpp +++ b/cg/cg3700.cpp @@ -1,15 +1,15 @@ // //Lista fatture: -// CG3 -6 I ==> Lista fatture con iva indetrabile // CG3 -6 C ==> Lista fatture per tipo costo/ricavo +// CG3 -6 I ==> Lista fatture con iva indetrabile // CG3 -6 N ==> Lista fatture intracomunitarie // -#include -#include #include -#include -#include #include +#include +#include +#include +#include #include "cg3.h" #include "cg3700a.h" @@ -45,8 +45,8 @@ enum tipo_st class TLista_fatture : public TPrintapp { TLocalisamfile *_nditte; // File delle ditte - TTable *_reg, - *_iva; + TDecoder *_reg; + TDecoder *_iva; TRelation* _rel; // Relazione principale int _cur1, _cur2, @@ -76,6 +76,9 @@ class TLista_fatture : public TPrintapp _tp_iva; // Totali parziali della stampa bool _one_printed, _print_all; // Flags per il controllo della stampa totali/parziali e righe multiple + + TString _tmp; + static bool filter_func1(const TRelation *); // Funzione di filtro per cursore 1 static bool filter_func2(const TRelation *); // Funzione di filtro per cursore 3 @@ -99,6 +102,9 @@ protected: void set_the_header(); virtual void set_page(int,int); virtual bool set_print(int); + + const char* real2string(const real& r, const char* pic = NULL) + { real2currency(_tmp, r, pic); return _tmp; } public: virtual bool user_create(); @@ -113,69 +119,63 @@ inline TLista_fatture& app() { return (TLista_fatture&) main_app(); } int TLista_fatture::tiporeg(const TString& reg) { - TString s(12); s << _date_from.year(); s.format("%4d%-3s",_date_from.year(),(const char*)reg); - _reg->put("CODTAB",s); - if (_reg->read() == NOERR) - return _reg->get_int("I0"); - return 0; + TString16 s; s.format("%4d%-3s",_date_from.year(),(const char*)reg); +// _reg->put("CODTAB",s); +// if (_reg->read() == NOERR) +// return _reg->get_int("I0"); +// return 0; + return atoi(_reg->decode(s)); } bool TLista_fatture::filter_func1(const TRelation *r) { - TLocalisamfile& cau = r->lfile(LF_CAUSALI); - TLocalisamfile& mov = r->lfile(LF_MOV); - TLocalisamfile& riv = r->lfile(); - TDate& from_d = app()._date_from; - TDate& to_d = app()._date_to; - TString& from_reg = app()._from_reg; - TString& to_reg = app()._to_reg; - long& from_cf = app()._from_cf; - long& to_cf = app()._to_cf; + TLista_fatture& a = app(); + const TRectype& mov = r->curr(LF_MOV); - TString rg = mov.get(MOV_REG); - TDate data = mov.get_date(MOV_DATAREG); + const TDate data = mov.get_date(MOV_DATAREG); + if (data < a._date_from || data > a._date_to) + return FALSE; + + const TString16 rg = mov.get(MOV_REG); + if (rg < a._from_reg || rg > a._to_reg) + return FALSE; - if (data < from_d || data > to_d) - return FALSE; - if (rg < from_reg || rg > to_reg) - return FALSE; - - const long cod = mov.get_long(MOV_CODCF); - const int tiporeg = app().tiporeg(rg); - if (app()._tipo == indetraibile) + const TRectype& riv = r->curr(); + if (a._tipo == indetraibile) { if (riv.get_int(RMI_TIPODET) == 0) return FALSE; - if (tiporeg == 2 && cod >= from_cf && cod <= to_cf) - return TRUE; + const int tiporeg = a.tiporeg(rg); + if (tiporeg != 2) + return FALSE; } else // Tipo costo/ricavo { if (riv.get_int(RMI_TIPOCR) == 0) return FALSE; - if (cod >= from_cf && cod <= to_cf) - return TRUE; } - return FALSE; + + const long cod = mov.get_long(MOV_CODCF); + const bool ok = cod >= a._from_cf && cod <= a._to_cf; + return ok; } bool TLista_fatture::filter_func2(const TRelation *r) { - TString& from_cau = app()._from_cau; - TString& to_cau = app()._to_cau; - TDate& from_d = app()._date_from; - TDate& to_d = app()._date_to; - TLocalisamfile& mov = r->lfile(LF_MOV); - TString cau = mov.get(MOV_CODCAUS); - TDate data = mov.get_date(MOV_DATAREG); + const TLista_fatture& a = app(); + const TRectype& mov = r->curr(LF_MOV); - - if (data < from_d || data > to_d) + const TDate data = mov.get_date(MOV_DATAREG); + if (data < a._date_from || data > a._date_to) return FALSE; - const bool is_intra = r->lfile().get_bool(RMI_INTRA); - if (cau >= from_cau && cau <= to_cau && is_intra) - return TRUE; + + const TString& cau = mov.get(MOV_CODCAUS); + if (cau >= a._from_cau && cau <= a._to_cau) + { + const bool is_intra = r->lfile().get_bool(RMI_INTRA); + return is_intra; + } return FALSE; } @@ -368,7 +368,6 @@ void TLista_fatture::set_choice_limits(TMask& m) void TLista_fatture::build_ditte_sheet() { - _ditte->destroy(); for (_nditte->first(); _nditte->good(); _nditte->next()) { @@ -406,18 +405,18 @@ bool TLista_fatture::preprocess_page(int file, int counter) if (new_det || new_cr) // Stampa totali parziali { const bool is_cr = _tipo == costo_ricavo; - TString s("TOTALE TIPO "); + TString256 s("TOTALE TIPO "); _pr.reset(); _pr.set_style(boldstyle); s << (is_cr ? "COSTO/RICAVO " : "INDETRAIBILITA' "); s << (is_cr ? _tipocrprec : _tipodetprec); _pr.put(s,42); if (_tp_doc != 0.0) - _pr.put(_tp_doc.string("###.###.###.###"),73); + _pr.put(real2string(_tp_doc),73); if (_tp_imp != 0.0) - _pr.put(_tp_imp.string("###.###.###.###"),89); + _pr.put(real2string(_tp_imp),89); if (_tp_iva != 0.0) - _pr.put(_tp_iva.string("#.###.###.###"),112); + _pr.put(real2string(_tp_iva),112); printer().print(_pr); _pr.reset(); printer().print(_pr); @@ -492,18 +491,18 @@ print_action TLista_fatture::postprocess_print(int file, int counter) if (_tipo != intra) { const bool is_cr = _tipo == costo_ricavo; - TString s("TOTALE TIPO "); + TString256 s("TOTALE TIPO "); _pr.reset(); _pr.set_style(boldstyle); s << (is_cr ? "COSTO/RICAVO " : "INDETRAIBILITA' "); s << (is_cr ? _tipocrprec : _tipodetprec); _pr.put(s,42); if (_tp_doc != 0.0) - _pr.put(_tp_doc.string("###.###.###.###"),73); + _pr.put(real2string(_tp_doc),73); if (_tp_imp != 0.0) - _pr.put(_tp_imp.string("###.###.###.###"),89); + _pr.put(real2string(_tp_imp),89); if (_tp_iva != 0.0) - _pr.put(_tp_iva.string("#.###.###.###"),112); + _pr.put(real2string(_tp_iva),112); p.print(_pr); _pr.reset(); p.print(_pr); @@ -511,11 +510,11 @@ print_action TLista_fatture::postprocess_print(int file, int counter) _pr.set_style(boldstyle); _pr.put("TOTALE GENERALE :",42); if (_tot_doc != 0.0) - _pr.put(_tot_doc.string("###.###.###.###"),73); + _pr.put(real2string(_tot_doc),73); if (_tot_imp != 0.0) - _pr.put(_tot_imp.string("###.###.###.###"),89); + _pr.put(real2string(_tot_imp),89); if (_tot_iva != 0.0) - _pr.put(_tot_iva.string("#.###.###.###"),112); + _pr.put(real2string(_tot_iva),112); p.print(_pr); } else @@ -523,7 +522,7 @@ print_action TLista_fatture::postprocess_print(int file, int counter) // Stampa gli elementi di _intra_items real tot1,tot2,tot3,tot4; TString16 cod; - TString des; + TString80 des; _Iva_item * xiva; // Scorre gli elementi memorizzati _pr.reset(); @@ -549,13 +548,13 @@ print_action TLista_fatture::postprocess_print(int file, int counter) p.print(_pr); _pr.put("Totale ",1); if (tot1 != 0.0) - _pr.put(tot1.string("###.###.###.###"),40); + _pr.put(real2string(tot1),40); if (tot2 != 0.0) - _pr.put(tot2.string("###.###.###.###"),58); + _pr.put(real2string(tot2),58); if (tot3 != 0.0) - _pr.put(tot3.string("###.###.###.###"),77); + _pr.put(real2string(tot3),77); if (tot4 != 0.0) - _pr.put(tot4.string("###.###.###.###"),93); + _pr.put(real2string(tot4),93); p.print(_pr); _pr.reset(); p.print(_pr); @@ -564,22 +563,18 @@ print_action TLista_fatture::postprocess_print(int file, int counter) } else { - _iva->put("CODTAB",cod); - if (_iva->read() == NOERR) - des = _iva->get("S0"); - else - des = ""; + des = _iva->decode(cod); _pr.put(cod,1); _pr.put(des,6); } if (r1 != 0.0) - _pr.put(r1.string("###.###.###.###"),40); + _pr.put(real2string(r1),40); if (r2 != 0.0) - _pr.put(r2.string("###.###.###.###"),58); + _pr.put(real2string(r2),58); if (r3 != 0.0) - _pr.put(r3.string("###.###.###.###"),77); + _pr.put(real2string(r3),77); if (r4 != 0.0) - _pr.put(r4.string("###.###.###.###"),93); + _pr.put(real2string(r4),93); tot1 += r1; tot2 += r2; tot3 += r3; @@ -590,13 +585,13 @@ print_action TLista_fatture::postprocess_print(int file, int counter) p.print(_pr); _pr.put("Totale Generale IVA",1); if (tot1 != 0.0) - _pr.put(tot1.string("###.###.###.###"),40); + _pr.put(real2string(tot1),40); if (tot2 != 0.0) - _pr.put(tot2.string("###.###.###.###"),58); + _pr.put(real2string(tot2),58); if (tot3 != 0.0) - _pr.put(tot3.string("###.###.###.###"),77); + _pr.put(real2string(tot3),77); if (tot4 != 0.0) - _pr.put(tot4.string("###.###.###.###"),93); + _pr.put(real2string(tot4),93); p.print(_pr); } return NEXT_PAGE; @@ -611,11 +606,12 @@ void TLista_fatture::set_the_header() _nditte->zero(); _nditte->put(NDT_CODDITTA, firm); _nditte->read(); - if (_nditte->bad()) _nditte->zero(); + if (_nditte->bad()) + _nditte->zero(); TDate today(TODAY); - TString rw(132); - TString s,s1,s2; + TString s(132), rw(132); + TString16 s1,s2; s = _nditte->get(NDT_RAGSOC); s1 = _date_from.string(); s2 = _date_to.string(); @@ -695,7 +691,7 @@ void TLista_fatture::set_page(int file, int counter) } set_row(nriga,"@89g@15n@105g@4,rs",FLD(LF_RMOVIVA,RMI_IMPONIBILE),FLD(LF_RMOVIVA,RMI_CODIVA)); set_row(nriga,"@110g@1s",FLD(LF_RMOVIVA, cr ? RMI_TIPOCR : RMI_TIPODET)); - set_row(nriga,"@112g@13pn",FLD(LF_RMOVIVA,RMI_IMPOSTA,"#.###.###.###")); + set_row(nriga,"@112g@15n",FLD(LF_RMOVIVA,RMI_IMPOSTA)); } bool TLista_fatture::set_print(int m) @@ -716,6 +712,7 @@ bool TLista_fatture::set_print(int m) add_file(LF_RMOVIVA); set_real_picture("###.###.###.###"); + set_magic_currency(TRUE); switch (_tipo) { @@ -733,83 +730,77 @@ bool TLista_fatture::set_print(int m) break; } - KEY k; - do + while (msk.run() == K_ENTER) { - k = msk.run(); - - if (k == K_ENTER) - { - _from_cf = msk.get_long(FLD_FROM_FOR); - _to_cf = msk.get_long(FLD_TO_FOR); - if (_to_cf == 0L) - _to_cf = 999999L; - _from_reg = msk.get(FLD_FROM_REG); - _to_reg = msk.get(FLD_TO_REG); - if (_to_reg.empty()) - _to_reg = "~~~"; - _from_cau = msk.get(FLD_FROM_CAU); - _to_cau = msk.get(FLD_TO_CAU); - if (_to_cau.empty()) - _to_cau = "~~~"; - _date_from = msk.get_date(FLD_DATE_FROM); - _date_to = msk.get_date(FLD_DATE_TO); + _from_cf = msk.get_long(FLD_FROM_FOR); + _to_cf = msk.get_long(FLD_TO_FOR); + if (_to_cf == 0L) + _to_cf = 999999L; + _from_reg = msk.get(FLD_FROM_REG); + _to_reg = msk.get(FLD_TO_REG); + if (_to_reg.empty()) + _to_reg = "~~~"; + _from_cau = msk.get(FLD_FROM_CAU); + _to_cau = msk.get(FLD_TO_CAU); + if (_to_cau.empty()) + _to_cau = "~~~"; + _date_from = msk.get_date(FLD_DATE_FROM); + _date_to = msk.get_date(FLD_DATE_TO); - int cur; // Seleziona il cursore corrente - switch (_tipo) + int cur; // Seleziona il cursore corrente + switch (_tipo) + { + case costo_ricavo: + cur = _cur2; + break; + case intra: + cur = _cur3; + break; + default: + cur = _cur1; + break; + } + + // Cosi' filtra il cursore ad ogni inizio stampa + get_cursor(_cur1)->set_filterfunction(filter_func1,TRUE); // Cursore 1 + get_cursor(_cur2)->set_filterfunction(filter_func1,TRUE); // Cursore 2 + get_cursor(_cur3)->set_filterfunction(filter_func2,TRUE); // Cursore 3 + + select_cursor(cur); + + // Salva la ditta corrente + TPrefix& pref = prefix(); + const long save_firm = pref.get_codditta(); + + // Ciclo sulle ditte slezionate + const long items = _ditte->items(); + printer().open(); + for (int i = 0; i < items; i++) + { + if (_ditte->checked(i)) { - case costo_ricavo: - cur = _cur2; - break; - case intra: - cur = _cur3; - break; - default: - cur = _cur1; - break; - } - - - select_cursor(cur); - // Cosi' forza la costruzione del cursore ad ogni inizio di stampa - get_cursor(_cur1)->set_filterfunction(filter_func1,TRUE); // Cursore 1 - get_cursor(_cur2)->set_filterfunction(filter_func1,TRUE); // Cursore 2 - get_cursor(_cur3)->set_filterfunction(filter_func2,TRUE); // Cursore 3 - - // Salva la ditta corrente - TPrefix& pref = prefix(); - const long save_firm = pref.get_codditta(); - - // Ciclo sulle ditte slezionate - const long items = _ditte->items(); - printer().open(); - for (int i = 0; i < items; i++) - { - if (_ditte->checked(i)) + _tipocrprec = -1; + _tipodetprec = -1; + _numregprec = -1L; + _tot_doc = 0.0; + _tot_imp = 0.0; _tot_iva = 0.0; + _tp_doc = 0.0; _tp_imp = 0.0; _tp_iva = 0.0; + _one_printed = FALSE; _print_all = TRUE; + pref.set_codditta(_ditte->row(i).get_long(1)); + if (get_cursor(cur)->items() > 0) { - _tipocrprec = -1; - _tipodetprec = -1; - _numregprec = -1L; - _tot_doc = 0.0; - _tot_imp = 0.0; _tot_iva = 0.0; - _tp_doc = 0.0; _tp_imp = 0.0; _tp_iva = 0.0; - _one_printed = FALSE; _print_all = TRUE; - pref.set_codditta(_ditte->row(i).get_long(1)); - if (get_cursor(cur)->items() > 0) - { - if (_tipo == intra) - _intra_items.destroy(); // Azzera l'array dei totali per fatture intra - print(); - } + if (_tipo == intra) + _intra_items.destroy(); // Azzera l'array dei totali per fatture intra + print(); } } - if (printer().isopen()) - printer().close(); - - // Ripristina la ditta - pref.set_codditta(save_firm); } - } while (k==K_ENTER); + if (printer().isopen()) + printer().close(); + + // Ripristina la ditta + pref.set_codditta(save_firm); + } return FALSE; } @@ -833,8 +824,8 @@ bool TLista_fatture::user_create() _ditte = new TArray_sheet(-1, -1, -4, -4, "Selezione Ditte", "@1|Cod.@5R|Ragione Sociale@50"); _nditte = new TLocalisamfile(LF_NDITTE); - _reg = new TTable("REG"); - _iva = new TTable("%IVA"); + _reg = new TDecoder("REG", "I0"); + _iva = new TDecoder("%IVA"); _rel = new TRelation(LF_RMOVIVA); _rel->add(LF_MOV,"NUMREG==NUMREG"); _rel->add(LF_CAUSALI,"CODCAUS==CODCAUS",1,LF_MOV); // Relazione diff --git a/cg/cg4300.cpp b/cg/cg4300.cpp index 8d9004632..7c967fc7e 100755 --- a/cg/cg4300.cpp +++ b/cg/cg4300.cpp @@ -59,14 +59,27 @@ void _ProrataItem::set(const int a, const real& c, const real& p, const bool fl) } } -// Calcola prorata con percentuale attuale o corrente -real _ProrataItem::calc_prorata(const real& acq, const bool current) + +// Calcola prorata con percentuale identificata dall'anno passato +// se la % prorata relativa all'anno indicato non esiste, ritorna 0 +real _ProrataItem::calc_prorata(const real& acq, const char * year) { - real prorata = acq * ((current ? _current_perc : _previous_perc) / 100.0); + real perc = _percentuali.objptr(year) ? (real&) *_percentuali.objptr(year) : ZERO; + real prorata = (acq * perc) / 100.0; prorata.round(ROUND_LIRA); return prorata; } +// Ritorna la % prorata relativa all'anno indicato. Se non esiste internamente +// viene ritornato INVALID_PRORATA +real _ProrataItem::percentuale(const char * year) +{ + real perc = _percentuali.objptr(year) ? (real&) *_percentuali.objptr(year) : INVALID_PRORATA; + if (perc == ZERO) //Se la % prorata vale 0 la percentuale non e' valida + perc = INVALID_PRORATA; + return perc; +} + // Methods of application! real TLiquidazione_app::CENTO(100.0); diff --git a/cg/cg4300.h b/cg/cg4300.h index 0be475bb6..6526557a9 100755 --- a/cg/cg4300.h +++ b/cg/cg4300.h @@ -66,6 +66,11 @@ class TProgind; // risentimento #define SOGLIA_MAGGIORE_ALIQUOTA_DEL_CAZZO_PER_AVER_DIRITTO_AL_RIMBORSO real(0.1) +// Macro per riconoscere una eventuale percentuale pro-rata non presente in tabella +// Siccome le % vanno da 0 a 100 vengono usati numeri a piacere. +#define INVALID_PRORATA real(1999.0) // A Guy piacciono gli 883... a me piace Spazio 1999 +#define INVALID_PRORATA_ASSERT real(883.0) // ...A little tribute 2 Max Pezzali + // // ------------------------------------------------------------------ // Fine parametri modificabili @@ -81,6 +86,7 @@ enum recalc { needed = 1, one = 2, ever = 3, never = 4 }; enum wht { all = 1, mnt = 2, trimestre = 3}; enum tbc { precedente = 1, incorso = 2}; enum tiporeg { vendita = 1, acquisto = 2 }; +enum tipo_sospensione { nessuna, normale, vol_affari, liquidazione }; // flags per gli items di stampa #define CHG_PARMS 1 // cambiato qualcosa (attivita', ditta...) @@ -137,6 +143,7 @@ class _CorrItem : public TObject { public: // vedi sopra per le fisime morali real _totale; // totale vendite per registro + real _totale_vf; // usato nella describe_pim(), per includere TUTTI i movimenti anche quelli validi solo per Vol. affari TString _codreg; // codice registro int _month; // mese real _aliquota; // aliquota iva @@ -158,7 +165,7 @@ public: word _f0, _f1, _f2, _f3; TString _s0, _s1, _s2, _s3, _s4, _s5; real _r0, _r1, _r2, _r3, _r4, _r5, - _r6, _r7, _r8, _r9, _r10,_r11, _r12, _r13, _r14; + _r6, _r7, _r8, _r9, _r10,_r11, _r12, _r13, _r14, _r15; TArray _arr; TDate _d0; @@ -208,19 +215,16 @@ public: }; // _ProrataItem serve per calcolare prorata dal 1998 +// E' un po' bruttino, perche' il caricamento delle percentuali +// e' obbligato a farlo dentro all'applicazione. class _ProrataItem : public TObject { - real _current_perc; // Percentuale prorata anno in corso - real _previous_perc; // Percentuale prorata anno precedente - bool _previous_ok; // Flag per indicare se presente tabella anno precedente + TAssoc_array _percentuali; // Elenco delle percentuali prorata memorizzate per anno public: - void set(const int a, const real& c, const real& p, const bool fl = TRUE); - real calc_prorata(const real& acq, const bool current = TRUE); - const real& current() const { return _current_perc; } - const real& previous() const { return _previous_perc; } - const bool previous_ok() const { return _previous_ok; } - + TAssoc_array& perc_array() { return _percentuali; } + real calc_prorata(const real& acq, const char * year); + real percentuale(const char * year); _ProrataItem() {} virtual ~_ProrataItem() {} }; diff --git a/cg/cg4301.cpp b/cg/cg4301.cpp index 8dcbae972..07fb3ebd6 100755 --- a/cg/cg4301.cpp +++ b/cg/cg4301.cpp @@ -236,14 +236,21 @@ bool TLiquidazione_app::update_firm(int month, bool recalc) _mixed = _pla->get("S7") == "M" || _pla->get("S7") == "E"; TString yr(_year); - real pr1 = _pla->get_real("R8"); // Percentuale prorata anno attuale - const int anno = atoi(_year); - _year.format("%d", anno - 1); - const bool flag = look_pla(cattiv, FALSE); // Reperisce percentuale prorata anno precedente - real pr2 = _pla->get_real("R8"); + TAssoc_array& pa = _prorata.perc_array(); + + pa.destroy(); + pa.add("DEF", _pla->get_real("R8")); // Percentuale di default, anno corrente + + const int anno = atoi(_year) - 2; + + for (int i = atoi(_year); i>=anno; i--) + { + _year = format("%d", i); + if (look_pla(cattiv, FALSE)) // Reperisce percentuale prorata anno indicato (se esiste la tabella) + pa.add(_year, _pla->get_real("R8")); + } _year = yr; // Risetta l'anno corretto e riposiziona la tabella... look_pla(cattiv, FALSE); - _prorata.set(anno, pr1, pr2, flag); } else _isservizio = _nditte->curr(LF_ATTIV).get("TIPOATT") == "S"; @@ -267,6 +274,7 @@ bool TLiquidazione_app::update_firm(int month, bool recalc) _pla->put("R11",""); _pla->put("R12",""); _pla->put("R14",""); + _pla->put("R15",""); _pla->put("S1","0"); _pla->put("S2","0"); _pla->put("S3","0"); @@ -541,13 +549,12 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) real cess_amm_iva = 0.0; real acquisti = 0.0; real acquisti_iva = 0.0; - real acquisti_iva_annoprec - = 0.0; real vendite = 0.0; real vendite_iva = 0.0; real esenti_b1 = 0.0; real esenti_b2 = 0.0; real esenti_b3 = 0.0; + real esenti_b4 = 0.0; real esenti_b14 = 0.0; real esni_rimb = 0.0; // ci sommo tutti esenti e ni validi per rimborso real corr_CEE = 0.0; @@ -578,11 +585,21 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) real assp_iva = 0.0; real vssp_imp = 0.0; real vssp_iva = 0.0; + real assl_imp = 0.0; + real assl_iva = 0.0; + real vssl_imp = 0.0; + real vssl_iva = 0.0; real bdog_imp = 0.0; real bdog_iva = 0.0; real agr_imp = 0.0; real agr_iva = 0.0; + // Nel seguente assoc, vengono memorizzati gli acquisti iva registrati quest'anno + // ma con anno documento precedente. Di conseguenza per un corretto calcolo prorata + // e' necessario distinguire gli importi, appunto, per anno. + // Questo nuovo calcolo prorata, vale solo per gli anni oltre il 1998. + TAssoc_array acq_iva_anni_prec; + TTable *arr[4] = { _pim, _pis, _prm, _prp }; //Tabelle con la stessa struttura const int year_int = atoi(_year); // Basta con le atoi()... @@ -675,7 +692,6 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) tiporeg tipomov = (tiporeg)_reg->get_long("I0"); // Controlla se la data del documento si riferisce all'anno precedente (PRORATA 1998) TDate datedoc(_mov->get(MOV_DATADOC)); - bool anno_doc_prec = (year_int > 1997) && (datedoc.year() == year_int - 1); if (_isviaggio && tipomov == vendita && !(_mov->get(MOV_DATA74TER).empty())) date = _mov->get_date(MOV_DATA74TER); @@ -692,7 +708,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) const bool sreg = !isreg; const bool rs8 = _reg->get("S8") != trueatt; const bool cmt = !_cur->is_first_match(LF_RMOVIVA); - const bool sosp_imp = _reg->get_bool("B1"); + const tipo_sospensione sosp_imp = _reg->get_bool("B1") ? (tipo_sospensione) _reg->get_int("I9") : nessuna; const TRectype& rcs = _cur->curr(LF_CAUSALI); const bool fattrit = rcs.get_bool("RITFATT"); @@ -787,7 +803,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) nin_imp = imponibile; nin_iva = imposta; } - else if (sosp_imp) // sospensione di imposta + else if (sosp_imp != nessuna) // sospensione di imposta { if (tipomov == vendita) { @@ -799,10 +815,23 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) asimp_imp = imponibile; asimp_iva = imposta; } - assp_imp += asimp_imp; - assp_iva += asimp_iva; - vssp_imp += vsimp_imp; - vssp_iva += vsimp_iva; + + switch (sosp_imp) + { + case normale: + assp_imp += asimp_imp; + assp_iva += asimp_iva; + vssp_imp += vsimp_imp; + vssp_iva += vsimp_iva; + break; + case liquidazione: + assl_imp += asimp_imp; + assl_iva += asimp_iva; + vssl_imp += vsimp_imp; + vssl_iva += vsimp_iva; + default: + break; + } } else if (fattrit) // Possono essere solo acquisti { @@ -930,6 +959,8 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) esenti_b2 += imponibile; else if (tipoes_v == "B3") esenti_b3 += imponibile; + else if (tipoes_v == "B4") + esenti_b4 += imponibile; // se e' il caso sommare esenti per rimborso if (isrimbinfr) esni_rimb += imponibile; @@ -1089,16 +1120,16 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) /* * se ign == TRUE non bisogna neppure PROGRESSIVARLI */ - bool ign = sosp_imp || (fattrit && month != 13) || noninc; + const bool sosp_vaf = sosp_imp == vol_affari; + const bool sosp_liq = sosp_imp == liquidazione; + bool ign = sosp_imp == normale || (fattrit && month != 13) || noninc; /* * se liq == FALSE gli importi non contano ai fini * del calcolo liquidazione */ - bool liq = !(tipodet == 1 || tipodet == 3 || tipodet == 9 || ign); + bool liq = !(tipodet == 1 || tipodet == 3 || tipodet == 9 || ign || sosp_vaf); - - real imp; // imponibile real ivp; // IVA su imp. real lor; // lordo @@ -1189,8 +1220,20 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) // totale acquisti acquisti += imponibile; acquisti_iva += imposta; - if (anno_doc_prec) // Se abilitato, somma l'iva acquisti relativi a documenti anno precedente - acquisti_iva_annoprec += imposta; + + const int yr = datedoc.year(); + + if (year_int > 1997 && (yr < (year_int-1) && yr > (year_int-4))) // Prende un intervallo di 2 anni al massimo + { // Quelli relativi all'anno in corso e precedente vanno assieme. + // Se abilitato, somma l'iva acquisti relativi ai documenti memorizzati con anni precedenti + TString16 yy; + yy << datedoc.year(); + const bool is_key = acq_iva_anni_prec.is_key(yy); + if (!is_key) + acq_iva_anni_prec.add(yy, new real, is_key); + real& aip = (real&) acq_iva_anni_prec[yy]; + aip += imposta; + } } // corrispettivi @@ -1275,7 +1318,36 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) } _pim->put("I0",NETTO); } + + // Rettifica il valore da memorizzare in PAM->R1, utilizzato nel calcolo Vol.Affari + // Solo nel caso in cui l'importo corrente deve far parte di tale calcolo + // Se e' valido per calcolo solo vol.aff aggiunge gli importi non aggiunti a causa del !liq + // Se e' valido per calcolo solo liq. sottrae gli importi aggiunti a causa del liq. + // Nel caso di sosp. normale non viene ne progressivato ne liquidato e ne considerato per vol. aff. + if (sosp_vaf || sosp_liq) + { + real iii = imponibile; + real iiimmm = imponibile + imposta; + if (sosp_liq) + { + iii *= -1; + iiimmm *= -1; + } + + if (corrisp) + if (tipodoc == "FS") + { + if (tipoiva == "VE") + vendite += iiimmm; + } + else + vendite += iii; + else + if (tipomov == vendita) + vendite += iii; + } + if (autodafe) // autofatture non residenti art, 17 { /* @@ -1472,27 +1544,43 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) * calcola il lercio prorata * solo se liq. periodica */ - real prorata, prorata_precedente; + real prorata, prorata_precedente1, prorata_precedente2; + real percentuale1, percentuale2; if (month != 13) { - const real& current = _prorata.current(); - const real& previous = _prorata.previous(); - bool b = TRUE; + TString16 yy; + // Prorata per documenti registrati con anno doc 2 anni fa... + yy.format("%d", year_int - 2); + real* rr1 = (real*)acq_iva_anni_prec.objptr(yy); + yy.format("%d", year_int - 1); // Reperire la % prorata dell'anno successivo a quello del documento + percentuale1 = _prorata.percentuale(yy); + prorata_precedente1 = rr1 ? _prorata.calc_prorata(*rr1, yy) : ZERO; + // Se sono presenti documenti di anni precedenti senza % prorata, si deve segnalare l'incongruenza (solo in prova) + if (percentuale1 == INVALID_PRORATA && rr1 && *rr1 != ZERO) + percentuale1 = INVALID_PRORATA_ASSERT; + + // Prorata per documenti registrati con anno doc 3 anni fa... + yy.format("%d", year_int - 3); + real *rr2 = (real*)acq_iva_anni_prec.objptr(yy); + yy.format("%d", year_int - 2); // Reperire la % prorata dell'anno successivo a quello del documento + percentuale2 = _prorata.percentuale(yy); + prorata_precedente2 = rr2 ? _prorata.calc_prorata(*rr2, yy) : ZERO; + // Se sono presenti documenti di anni precedenti senza % prorata, si deve segnalare l'incongruenza (solo in prova) + if (percentuale2 == INVALID_PRORATA && rr2 && *rr2 != ZERO) + percentuale2 = INVALID_PRORATA_ASSERT; - if (!_prorata.previous_ok() || (previous == current && _prorata.previous_ok())) // Se le percentuali sono uguali - b = FALSE; // o non esiste la tabella prec. - // considera tutto sull'anno corrente - - const real acq_res = acquisti_iva - (b ? acquisti_iva_annoprec : ZERO); - - if (!current.is_zero()) - prorata = _prorata.calc_prorata(acq_res); - - if (!previous.is_zero() && b) - { - prorata_precedente = _prorata.calc_prorata(acquisti_iva_annoprec, FALSE); - prorata += prorata_precedente; - } + // Prorata per l'anno corrente + quelli eventuali dello scorso anno e quelli che sono oltre 3 anni fa... + // E quelli che non hanno la % prorata settata in tabella + real aaa = acquisti_iva; + if (percentuale1 != INVALID_PRORATA && percentuale1 != INVALID_PRORATA_ASSERT) + aaa -= *rr1; + if (percentuale2 != INVALID_PRORATA && percentuale2 != INVALID_PRORATA_ASSERT) + aaa -= *rr2; + prorata = _prorata.calc_prorata(aaa, _year); + + // Somma i vari prorata calcolati per gli anni precedenti + prorata += prorata_precedente1 + prorata_precedente2; + acquisti_iva -= prorata; // Rettifica acquisti_iva } look_plm(month, codatt, TRUE); @@ -1511,8 +1599,9 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) * Il prorata pagato in annuale viene scritto a 0, perche' in realta' sarebbe * la somma di quelli pagati nei mesi precedenti. */ - _plm->put("R2", prorata); // Prorata complessivo (acq. rif. anno attuale + acq. rif. anno precedente) - _plm->put("R14", prorata_precedente); // Prorata acq. rif. anno precedente (in stampa prorata attuale sara' totale - precedente) + _plm->put("R2", prorata); // Prorata complessivo (acq. rif. anno attuale + acq. rif. anni precedenti) + _plm->put("R14", prorata_precedente1); // Prorata acq. rif. anno addietro + _plm->put("R15", prorata_precedente2); // Prorata acq. rif. 2 anni addietro if (_isviaggio) { @@ -1560,15 +1649,15 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) acquisti_iva += agr_detIA; } } - + + _plm->put("R12", _prorata.percentuale(_year)); // per comodita' in stampa + _plm->put("R4", percentuale1); + _plm->put("R16", percentuale2); _plm->put("R0", vendite_iva); _plm->put("R1", acquisti_iva); _plm->put("R3", ult_detr); - _plm->put("R4", _prorata.previous()); // per comodita' in stampa - _plm->put("R12", _prorata.current()); // per comodita' in stampa _plm->put("B0", "X"); // calcolato (invalidato dalla primanota) // Setta il flag di stampa errore: se siamo oltre 1997 e non esiste tabella anno prec e vi sono docs con tale riferimento - _plm->put("B1", !_prorata.previous_ok() && acquisti_iva_annoprec != ZERO && year_int > 1997); _pom->put("R9", acq_ies); _pom->put("R10", acq_ies_iva); _pum->put("R8", acq_pint); @@ -1593,6 +1682,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) _pum->put("R4", esenti_b1); _pum->put("R5", esenti_b2); _pum->put("R6", esenti_b3); + _pum->put("R13", esenti_b4); _pum->put("R7", esenti_b14); _pum->put("R12", esni_rimb); _pam->put("R0", acquisti); @@ -1603,6 +1693,10 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) _pam->put("R9", vssp_iva); _pam->put("R4", bdog_imp); _pam->put("R5", bdog_iva); + _pam->put("R12", assl_imp); + _pam->put("R13", assl_iva); + _pam->put("R14", vssl_imp); + _pam->put("R15", vssl_iva); _plm->rewrite(); _pam->rewrite(); @@ -1631,7 +1725,7 @@ void TLiquidazione_app::iva11_set_arr_phase_1(const TString& codatt) const bool autofattura = rcs.get_bool("AUTOFATT"); const bool valintra = rcs.get_bool("VALINTRA"); const bool intracom = rcs.get_bool("INTRACOM"); - const bool sosp_imp = _reg->get_bool("B1"); + const tipo_sospensione sosp_imp = _reg->get_bool("B1") ? (tipo_sospensione) _reg->get_int("I9") : nessuna; const bool corrisp = _reg->get_bool("B0"); tiporeg tipomov = (tiporeg)_reg->get_long("I0"); const bool is_vendita = tipomov == vendita; @@ -1672,12 +1766,12 @@ void TLiquidazione_app::iva11_set_arr_phase_1(const TString& codatt) } } - if (!sosp_imp && tipodet == 0 && (tipocr == 2 || tipocr == 8)) + if (sosp_imp == nessuna && tipodet == 0 && (tipocr == 2 || tipocr == 8)) { array.add(imposta,TAB11_R6,LF_TAB1100B); } - if (!sosp_imp) + if (sosp_imp == nessuna || sosp_imp == vol_affari) { if (tipodoc == "BD" && tipodet == 9) { @@ -1857,7 +1951,7 @@ void TLiquidazione_app::iva11_set_arr_phase_1(const TString& codatt) array.add(imponibile,TAB11_R9,LF_TAB1100B); } - if (tipocr == 4 && tipodoc != "AF" && !sosp_imp) + if (tipocr == 4 && tipodoc != "AF" && (sosp_imp == nessuna || sosp_imp == vol_affari)) array.add(imponibile,TAB11_EC112); } @@ -1875,7 +1969,7 @@ void TLiquidazione_app::iva11_set_arr_phase_1(const TString& codatt) array.add(imposta,TAB11_L2BIS,LF_TAB1100B); } - if (!autofattura && !sosp_imp && intra && tipoes_v == "22") + if (!autofattura && (sosp_imp == nessuna || sosp_imp == vol_affari) && intra && tipoes_v == "22") array.add(imponibile,TAB11_E52); if (_isagricolo && (tipodoc != "CR" && tipodoc != "SC" && tipodoc != "RF" && tipodoc != "FS")) @@ -2601,15 +2695,28 @@ void TLiquidazione_app::write_liq(int month, const char* codatts) real es_b1 = _pla->get_real("R1"); real es_b2 = _pla->get_real("R2"); real es_b3 = _pla->get_real("R3"); + real es_b4 = _pla->get_real("R15"); real csamm = _pla->get_real("R4"); - // calcola nuovo prorata per ogni attivita' (miste: 1+2) - real ris = vol_aff_t; // gia' esclusi: NS, B3, cess. amm - real prorata(0.0); - if (!ris.is_zero()) - prorata = (es_b1/ris) * CENTO; + real prorata = 0.0; real conguaglio = 0.0; real topay = 0.0; + real ris = vol_aff_t; // gia' esclusi: NS, B3, cess. amm + + // calcola nuovo prorata per ogni attivita' (miste: 1+2) + if (year_int > 1997) // Calcolo dal 1998 in poi + { + const real rsa = ris - es_b4 - es_b3; + const real rsn = rsa - es_b1; + if (!rsa.is_zero()) + prorata = CENTO - ((rsn/rsa) * CENTO); // Percentuale di indetraibilita: reciproco della percentuale di detraibilita' + } + else + { + if (!ris.is_zero()) + prorata = (es_b1/ris) * CENTO; + } + prorata.round(ROUND_LIRA); //if (prorata != _prorata.current()) { @@ -2624,6 +2731,7 @@ void TLiquidazione_app::write_liq(int month, const char* codatts) //conguaglio.round(ROUND_MILLELIRE); round_mille_lire(conguaglio); } + if (prorata < 0.0) prorata = 0.0; _pla->put("R9", conguaglio); _pla->put("R10",prorata); @@ -2843,6 +2951,7 @@ void TLiquidazione_app::recalc_annual(const char* att) real es_b1 = 0.0; real es_b2 = 0.0; real es_b3 = 0.0; + real es_b4 = 0.0; real cess_amm = 0.0; real vendite = 0.0; real pro_pag = 0.0; @@ -2866,6 +2975,7 @@ void TLiquidazione_app::recalc_annual(const char* att) es_b1 = _pla->get_real("R1"); es_b2 = _pla->get_real("R2"); es_b3 = _pla->get_real("R3"); + es_b4 = _pla->get_real("R15"); cess_amm = _pla->get_real("R4"); pro_pag = _pla->get_real("R12"); iva_acq = _pla->get_real("R11"); @@ -2886,10 +2996,10 @@ void TLiquidazione_app::recalc_annual(const char* att) reg = *_pim_codreg; look_iva(codiva); look_reg(reg); tiva = _iva->get("S1"); - const bool b3 = _iva->get("S2") == "B3"; + const bool b3 = _iva->get("S2") == "B3" && atoi(_year) < 1998; tiporeg treg = (tiporeg)_reg->get_long("I0"); const bool corrisp = _reg->get_bool("B0"); - const bool simp = _reg->get_bool("B1"); + const tipo_sospensione simp = _reg->get_bool("B1") ? (tipo_sospensione) _reg->get_int("I9") : nessuna; imp_ifs = _pim->get_real("R0"); imp_af = _pim->get_real("R7"); va7 = _pim->get("S0"); @@ -2902,7 +3012,8 @@ void TLiquidazione_app::recalc_annual(const char* att) tipocr == 4 || // cessioni beni ammortizzabili tiva == "NS" || // non soggetti b3 || // bi tre - simp) // sospensione di imposta + simp == normale || + simp == liquidazione) // sospensione di imposta continue; if (corrisp) @@ -2953,6 +3064,7 @@ void TLiquidazione_app::recalc_annual(const char* att) es_b1 += _pum->get_real("R4"); es_b2 += _pum->get_real("R5"); es_b3 += _pum->get_real("R6"); + es_b4 += _pum->get_real("R13"); cess_amm += _pum->get_real("R0"); // Nota: @@ -2970,6 +3082,7 @@ void TLiquidazione_app::recalc_annual(const char* att) _pla->put("R1", es_b1); _pla->put("R2", es_b2); _pla->put("R3", es_b3); + _pla->put("R15", es_b4); _pla->put("R4", cess_amm); _pla->put("R11", iva_acq); _pla->put("R12", pro_pag); diff --git a/cg/cg4304.cpp b/cg/cg4304.cpp index 01b78d23a..6c7aa0b3b 100755 --- a/cg/cg4304.cpp +++ b/cg/cg4304.cpp @@ -473,8 +473,9 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool TString ref(atts.items() == 1 ? codatt : "ALL"); const char* tmpatt; int last = _descr_arr.last(); - bool isfirst = TRUE; + bool isfirst = TRUE, issosp = FALSE; real t0, t1, t2, t3, t4, t5; + real rt0, rt1, rt2, rt3, rt4, rt5; real autodafe, autodafe_iva, art40, art40_iva; bool skip_acq = atts.items() == 1 && _mixed; @@ -536,7 +537,9 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool real rit_imp(s1.get(0)); real rit_iva(s1.get(1)); const bool is_rit= tipodet != 0 && month == 13 && rit_imp != 0.0; //Se fattura in ritardo con tipo detr. != 0 e si sta calcolando l'annuale - + const tipo_sospensione sosp_imp = _reg->get_bool("B1") ? (tipo_sospensione) _reg->get_int("I9") : nessuna; + issosp |= sosp_imp != nessuna; // Setta il flag di presenza registri in sospensione (qualsiasi tipo: normale, vol_affari, liquidazione) + // ACHTUNG! Corrispettivi da ventileer possono ventilare // ad un altro codiva; in tal caso si scrive quello if (corrisp && !other.empty()) @@ -609,17 +612,29 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool if (tipomov == acquisto) { // Ci sono anche le fatture in ritardo (solo in annuale)! Con tipo detraibilita' 1,3,9 - d->_r4 += is_rit ? rit_imp : tab->get_real("R0"); - d->_r5 += is_rit ? rit_iva : tab->get_real("R1"); - t4 += is_rit ? rit_imp : tab->get_real("R0"); - t5 += is_rit ? rit_iva : tab->get_real("R1"); + if (sosp_imp != vol_affari) + { + d->_r4 += is_rit ? rit_imp : tab->get_real("R0"); + d->_r5 += is_rit ? rit_iva : tab->get_real("R1"); + t4 += is_rit ? rit_imp : tab->get_real("R0"); + t5 += is_rit ? rit_iva : tab->get_real("R1"); + } + // Totalizza anche quelli valevoli per vol. affari. + if (sosp_imp != liquidazione) + { + rt4 += is_rit ? rit_imp : tab->get_real("R0"); + rt5 += is_rit ? rit_iva : tab->get_real("R1"); + } } else // vendita { is_key = corr_ann.is_key(codiva); cx._totale = 0; _CorrItem& ca = is_key ? (_CorrItem&) corr_ann[codiva] : cx; - ca._totale += tab->get_real(tipoiva == "VE" ? "R2" : "R3"); // Se e' codice IVA da Vent. stiamo scorrendo i PIS: va stampato il lordo dei progressivi successivi + if (sosp_imp != vol_affari) + ca._totale += tab->get_real(tipoiva == "VE" ? "R2" : "R3"); // Se e' codice IVA da Vent. stiamo scorrendo i PIS: va stampato il lordo dei progressivi successivi + if (sosp_imp != liquidazione) + ca._totale_vf += tab->get_real(tipoiva == "VE" ? "R2" : "R3"); if (!is_key) // se non c'e' lo aggiunge { ca._aliquota = _iva->get_real("R0")/CENTO; // Se e' nuovo setta l'aliquota @@ -638,10 +653,18 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool real vfs(tab->get_real("R6")); // iva fatture con scontrino if (!corrisp) { - d->_r2 -= ifs; // tolgo FS dai corrispettivi - d->_r3 -= vfs; - t2 -= ifs; // idem per i totali - t3 -= vfs; + if (sosp_imp != vol_affari) + { + d->_r2 -= ifs; // tolgo FS dai corrispettivi + d->_r3 -= vfs; + t2 -= ifs; // idem per i totali + t3 -= vfs; + } + if (sosp_imp != liquidazione) + { + rt2 -= ifs; + rt3 -= vfs; + } } @@ -655,15 +678,24 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool { // usa R0 e R1 visto che la ventilazione e' gia' // stata calcolata - - d->_r2 += (cvi /* - ifs */); // tolgo FS dai corrispettivi - d->_r3 += (cvv /* - vfs */); - d->_r0 += ifs; // aggiungo FS alle vendite - d->_r1 += vfs; - t2 += (cvi /* - ifs */); // idem per i totali - t3 += (cvv /* - vfs */); // non sono molto convinto ma vogliono cio' - t0 += ifs; // ...avevo ragione e infatti l'ho cambiato - t1 += vfs; + if (sosp_imp != vol_affari) + { + d->_r2 += (cvi /* - ifs */); // tolgo FS dai corrispettivi + d->_r3 += (cvv /* - vfs */); + d->_r0 += ifs; // aggiungo FS alle vendite + d->_r1 += vfs; + t2 += (cvi /* - ifs */); // idem per i totali + t3 += (cvv /* - vfs */); // non sono molto convinto ma vogliono cio' + t0 += ifs; // ...avevo ragione e infatti l'ho cambiato + t1 += vfs; + } + if (sosp_imp != liquidazione) + { + rt2 += cvi; + rt3 += cvv; + rt0 += ifs; + rt1 += vfs; + } } if (!corrisp || (!cfv.is_zero() || !cfi.is_zero())) @@ -685,10 +717,18 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool adi = tab->get_real("R8"); } - d->_r0 += vendi - adf - va7i; - d->_r1 += vendv - adi - va7v; - t0 += vendi /* - adf */; - t1 += vendv /* - adi */; + if (sosp_imp != vol_affari) + { + d->_r0 += vendi - adf - va7i; + d->_r1 += vendv - adi - va7v; + t0 += vendi /* - adf */; + t1 += vendv /* - adi */; + } + if (sosp_imp != liquidazione) + { + rt0 += vendi; + rt1 += vendv; + } autodafe += adf; autodafe_iva += adi; @@ -718,6 +758,10 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool dd._r3 += ivac; t2 += impc; t3 += ivac; + // Calcola lo scorporo per quelli comprensivi/validi per Vol.affari + lordo2netto(cc._totale_vf,impc,ivac,cc._aliquota); + rt2 += impc; + rt3 += ivac; } } corr_ann.destroy(); @@ -731,6 +775,7 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool iads->_s2 = " dovuta - 74 ter"; // cosi' vollero iads->_r1 += iva74t; t1 += iva74t; + rt1 += iva74t; if (isfirst) { isfirst = FALSE; @@ -784,6 +829,13 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool d->_r0 = t0; d->_r1 = t1; d->_r2 = t2; d->_r3 = t3; d->_r4 = t4; d->_r5 = t5; + // Totali progressivi da registri, comprensivi dei valori per calcolo vol affari. + if (issosp) // Setta i valori (e la conseguente stampa della riga) solo se presenti registri in sospensione + { + d->_r11 = rt0; d->_r12 = rt1; + d->_r13 = rt2; d->_r14 = rt3; + d->_s2 = rt4.string(); d->_s3 = rt5.string(); + } // aggiunge dati ptm _DescrItem* t = new _DescrItem(MISC_LIQ); @@ -825,8 +877,10 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool { t->_r12 += _plm->get_real("R14"); t->_r13 = _plm->get_real("R4"); // percentuale prorata anno precedente + t->_r14 += _plm->get_real("R15"); + t->_r15 = _plm->get_real("R16"); // percentuale prorata 2 anni addietro } - t->_r11 += _plm->get_real("R2") - _plm->get_real("R14"); // pro-rata indetraibile sui doc. acq. anno attuale + t->_r11 += _plm->get_real("R2") - _plm->get_real("R14") - _plm->get_real("R15"); // pro-rata indetraibile sui doc. acq. anno attuale // in caso di liq. annuale prende il totale (tutto R2) ad1 = real(ttm.get(1)); ad2 = real(ttm.get(2)); @@ -837,8 +891,7 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool ttm.add(ad2.string(),2); // IVA acq. amm. indetr t->_s0 = ttm; - t->_f0 = !_prorata.current().is_zero() && (month != 13); // flag per segnalare l'esistenza - t->_f1 += _plm->get_bool("B1"); // flag per segnalare errore tabella prorata precedente mancante + t->_f0 = _prorata.percentuale(_year)!=INVALID_PRORATA && (month != 13); // flag per segnalare l'esistenza d->_r9 += _pom->get_real("R9"); // acq. inded. su ricavi esenti d->_r10 += _pom->get_real("R10"); // IVA acq. inded. su ricavi esenti @@ -858,23 +911,37 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool t->_s2 = spgnp.string(); // risbatto ... t->_s3 = spgnvp.string(); // .. - // sospensione imposta: non piu' due palle, ma QUATTRO + // sospensione imposta: non piu' due palle, ma QUATTRO... + // caro Ferdinando... ora son divenute ben OTTO... + // grazie all'iva ad esigibilita' differita da pagare/de"TRARRE" TToken_string tt(t->_s4); real aqsi(tt.get(0)); real aqsv(tt.get(1)); real vnsi(tt.get(2)); real vnsv(tt.get(3)); + real aqli(tt.get(4)); + real aqlv(tt.get(5)); + real vnli(tt.get(6)); + real vnlv(tt.get(7)); aqsi += _pam->get_real("R6"); aqsv += _pam->get_real("R7"); vnsi += _pam->get_real("R8"); vnsv += _pam->get_real("R9"); + aqli += _pam->get_real("R12"); + aqlv += _pam->get_real("R13"); + vnli += _pam->get_real("R14"); + vnlv += _pam->get_real("R15"); tt = ""; tt.add(aqsi.string()); tt.add(aqsv.string()); tt.add(vnsi.string()); tt.add(vnsv.string()); + tt.add(aqli.string()); + tt.add(aqlv.string()); + tt.add(vnli.string()); + tt.add(vnlv.string()); t->_s4 = tt; } // while (attivita') @@ -894,14 +961,26 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool real e1 = _pla->get_real("R1"); real e2 = _pla->get_real("R2"); real e3 = _pla->get_real("R3"); + real e4 = _pla->get_real("R15"); real am = _pla->get_real("R4"); real iaq = _pla->get_real("R11"); // IVA acquisti real ppg = _pla->get_real("R12"); // pro-rata pagato // calcola nuovo prorata per ogni attivita' (miste: 1+2) real pr(0.0); - if (!ris.is_zero()) - pr = (e1/ris) * CENTO; + if (atoi(_year) > 1997) // Calcolo dal 1998 in poi + { + const real rsa = ris - e4 - e3; + const real rsn = rsa - e1; + if (!rsa.is_zero()) + pr = CENTO - ((rsn/rsa) * CENTO); // Percentuale di indetraibilita: reciproco della percentuale di detraibilita' + } + else + { + if (!ris.is_zero()) + pr = (e1/ris) * CENTO; + } + real co = 0.0; real topay = 0.0; pr.round(ROUND_LIRA); @@ -923,6 +1002,7 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool round_mille_lire(e1); round_mille_lire(e2); round_mille_lire(e3); + round_mille_lire(e4); round_mille_lire(ris); // prorata if (!pr.is_zero()) @@ -934,6 +1014,7 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool dd->_r4 = e2; dd->_r5 = e3; dd->_r6 = topay; + dd->_r7 = e4; t->_arr.add(dd); } } @@ -1241,35 +1322,34 @@ void TLiquidazione_app::set_plafond(_DescrItem& d) set_bookmark("Quadro plafond", _att_bookmark); - real r1 = d._r2 - d._r1 - d._r0; - real r2 = d._r5 - d._r4 - d._r3; - real r3 = d._r8 - d._r7 - d._r6; - + real r1 = d._r1 + d._r0; + real r2 = d._r4 + d._r3; + real r3 = d._r7 + d._r6; + + real disponibile = d._r2 + d._r5 + d._r8; + real riporto = disponibile - r1 - r2 -r3; + set_print_zero(TRUE); set_row(1,"QUADRO RELATIVO ALLA DISPONIBILITA' ED ALL'UTILIZZO " "MENSILE DEI PLAFONDS"); - set_row(2,""); set_row(3,""); - set_row(4,"Art. 8 1° comma lettere a-b@31gDisponibile@48g%r", - &(d._r2)); + set_row(2,""); + set_row(3,"@31gDisponibile@48g%r", &(disponibile)); + set_row(4,"Art. 8 1° comma lettere a-b"); set_row(5,"Utilizzato all'interno@48g%r", &(d._r0)); - set_row(6,"Utilizzato per l'importazione@48g%r@69gRiporto@78g%r", - &(d._r1), &r1); + set_row(6,"Utilizzato per l'importazione@48g%r",&(d._r1)); set_row(7,""); - set_row(8,"Art. 8bis 1° comma@31gDisponibile@48g%r", - &(d._r5)); + set_row(8,"Art. 8bis 1° comma"); set_row(9,"Utilizzato all'interno@48g%r", &(d._r3)); - set_row(10,"Utilizzato per l'importazione@48g%r@69gRiporto@78g%r", - &(d._r4), &(r2)); + set_row(10,"Utilizzato per l'importazione@48g%r", &(d._r4)); set_row(11,""); - set_row(12,"Art. 9 1° comma@31gDisponibile@48g%r", - &(d._r8)); + set_row(12,"Art. 9 1° comma"); set_row(13,"Utilizzato all'interno@48g%r", &(d._r6)); - set_row(14,"Utilizzato per l'importazione@48g%r@69gRiporto@78g%r", - &(d._r7), &r3); + set_row(14,"Utilizzato per l'importazione@48g%r", &(d._r7) ); + set_row(15,"@31gRiporto@48g%r", &(riporto)); set_print_zero(FALSE); set_auto_ff(); @@ -1465,6 +1545,27 @@ void TLiquidazione_app::set_plm(_DescrItem& d) &tot1, &tot2); } + + // Stampa il totale progressivo da registri, comprensivo dei movimenti valevoli per il calcolo vol. affari. + real pr_imp(d._s2); + real pr_iva(d._s3); + if (!(d._r11.is_zero() && + d._r12.is_zero() && + d._r13.is_zero() && + d._r14.is_zero() && + pr_imp.is_zero() && + pr_iva.is_zero())) + { + set_row(rw++,""); set_row(rw++,""); + set_row(rw++,"Totale Prog. da registri@25g%r@41g%r@58g%r@74g%r@91g%r@107g%r", + &(d._r11), + &(d._r12), + &(d._r13), + &(d._r14), + &(pr_imp), + &(pr_iva)); + set_row(rw++,""); + } } @@ -1482,6 +1583,10 @@ void TLiquidazione_app::set_pumpam(_DescrItem& d) real aqsv(tt.get(1)); real vnsi(tt.get(2)); real vnsv(tt.get(3)); + real aqli(tt.get(4)); + real aqlv(tt.get(5)); + real vnli(tt.get(6)); + real vnlv(tt.get(7)); real ammindi(dp.get(1)); real ammindv(dp.get(2)); @@ -1501,6 +1606,20 @@ void TLiquidazione_app::set_pumpam(_DescrItem& d) &vnsi, &vnsv); } + if (!(aqli.is_zero() && aqlv.is_zero())) + { + printed = TRUE; + set_row(row++, "IVA ad esigibilità differ. da detrarre nel periodo@50g%r@69g%r", + &aqli, + &aqlv); + } + if (!(vnli.is_zero() && vnlv.is_zero())) + { + printed = TRUE; + set_row(row++, "IVA ad esigibilità differ. da pagare nel periodo@50g%r@69g%r", + &vnli, + &vnlv); + } if (!(d._r8.is_zero() && d._r9.is_zero())) { printed = TRUE; @@ -1553,33 +1672,48 @@ void TLiquidazione_app::set_pumpam(_DescrItem& d) &spgn, &spgn_iva); } + // Prorata... + int yy = atoi(_year); if (d._f0) { - // Anno in corso... - printed = TRUE; - real prc(dp.get(0)); + printed = TRUE; - set_row(row++, "%% PRO-RATA ed IVA non detraibile (%s%%)@69g%r", - (const char*)prc.string(), &(d._r11)); - - if (atoi(_year) > 1997 /*&& d._r12 != ZERO*/) // prorata 1998 - { - if (d._f1) + if (yy > 1997) // prorata 1998 + { + real prc(dp.get(0)); + real rprc = CENTO - prc; + TString ss(rprc.string()); + + set_row(row++, "%% PRO-RATA (%s%%) ed IVA non detraibile (%s%%)@69g%r", + (const char*) ss, (const char*)prc.string(), &(d._r11)); + yy--; + if (d._r13 != INVALID_PRORATA && d._r12 != ZERO) { - // Stampa errore solo se NON definitiva. Errore MI2414 - if (!_isfinal) - { - // Segnala errore per tabella anno precedente non esistente - row++; - set_row(row++, "Impossibile reperire la %% PRO-RATA relativa all'anno precedente."); - } + rprc = CENTO - d._r13; + ss = rprc.string(); + set_row(row++, "%% PRO-RATA %d (%s%%) ed IVA non detraibile (%s%%)@69g%r", + yy, (const char*) ss, (const char*)d._r13.string(), &(d._r12)); } - else if (d._r13 != prc) + else + if (!_isfinal && d._r13 == INVALID_PRORATA_ASSERT) + set_row(row++, "Impossibile reperire la %% PRO-RATA relativa all'anno %d.", yy); + + yy--; + if (d._r15 != INVALID_PRORATA && d._r14 != ZERO) { - // Stampa % solo se la tabella dell'anno precedente esiste ma non e' uguale. Errore MI2415 - set_row(row++, "%% PRO-RATA ed IVA non detraibile (%s%%)@69g%r", - (const char*)d._r13.string(), &(d._r12)); + rprc = CENTO - d._r15; + ss = rprc.string(); + set_row(row++, "%% PRO-RATA %d (%s%%) ed IVA non detraibile (%s%%)@69g%r", + yy, (const char*) ss, (const char*)d._r15.string(), &(d._r14)); } + else + if (!_isfinal && d._r15 == INVALID_PRORATA_ASSERT) + set_row(row++, "Impossibile reperire la %% PRO-RATA relativa all'anno %d.", yy); + } + else + { + set_row(row++, "%% PRO-RATA ed IVA non detraibile (%s%%)@69g%r", + (const char*)dp.get(0), &(d._r11)); } } @@ -1913,9 +2047,10 @@ bool TLiquidazione_app::set_annual(_DescrItem& d) { // non lo ha stampato prima se annuale, perche' vladimiro il nefido // pretende l'assurdo aggiornamento della perc. a quella nuova + const year_int = atoi(_year); row++; - set_row(++row,"CALCOLO DELLA PERCENTUALE DI INDETRAIBILITA'"); + set_row(++row, year_int > 1997 ? "CALCOLO DELLA PERCENTUALE DI DETRAIBILITA'" : "CALCOLO DELLA PERCENTUALE DI INDETRAIBILITA'"); row++; set_bookmark("Calcolo pro-rata", _att_bookmark); @@ -1923,14 +2058,30 @@ bool TLiquidazione_app::set_annual(_DescrItem& d) ret = TRUE; set_print_zero(TRUE); set_row(row++,""); - set_row(row++, "%% PRO-RATA ed IVA non detraibile (%s%%)@69g%r", - (const char*)(d._r2.string()), &(d._r6)); - set_row(row++,"B1 - Operazioni esenti, escluse da nr. 1 a 9 e 11 art. 10 @69g%r", &(d._r1)); - set_row(row++,"B2 - Operazioni esenti, di cui nr. 11 art. 10 @69g%r", &(d._r4)); - set_row(row++,"B3 - Operazioni esenti da nr. 1 a 9 art. 10 @69g%r", &(d._r5)); - set_row(row++,"Volume d'affari - B3 @69g%r", &(d._r0)); - set_row(row++,"Indetraibilita'@69g%r%%", &(d._r2)); - + if (year_int > 1997) + { + const real perc_det = CENTO - d._r2; + const TString s(perc_det.string()); + + set_row(row++, "%% PRO-RATA (%s%%) ed IVA non detraibile (%s%%)@69g%r", + (const char*) s, (const char*)(d._r2.string()), &(d._r6)); + set_row(row++,"C1 - Operazioni esenti escluse da nr. 1 a 9 e 11 art. 10 @69g%r", &(d._r1)); + set_row(row++,"C2 - Operazioni esenti di cui nr. 11 art. 10 @69g%r", &(d._r4)); + set_row(row++,"C3 - Operazioni esenti da nr. 1 a 9 art. 10 @69g%r", &(d._r5)); + set_row(row++,"C1A - Operazioni esenti di cui all'art.10 n. 27 quinquies @69g%r", &(d._r7)); + set_row(row++,"Volume d'affari @69g%r", &(d._r0)); + set_row(row++,"Detraibilita' @69g%r%%", &(perc_det)); + } + else + { + set_row(row++, "%% PRO-RATA ed IVA non detraibile (%s%%)@69g%r", + (const char*)(d._r2.string()), &(d._r6)); + set_row(row++,"B1 - Operazioni esenti, escluse da nr. 1 a 9 e 11 art. 10 @69g%r", &(d._r1)); + set_row(row++,"B2 - Operazioni esenti, di cui nr. 11 art. 10 @69g%r", &(d._r4)); + set_row(row++,"B3 - Operazioni esenti da nr. 1 a 9 art. 10 @69g%r", &(d._r5)); + set_row(row++,"Volume d'affari - B3 @69g%r", &(d._r0)); + set_row(row++,"Indetraibilita'@69g%r%%", &(d._r2)); + } /* Prorata delle mie brame... * chi e' il piu' sfatto del reame ? * La seguente cosa e' ritenuta sbagliata da PRASSI diff --git a/cg/cg4400.cpp b/cg/cg4400.cpp index f0f51c366..4e3d11c6b 100755 --- a/cg/cg4400.cpp +++ b/cg/cg4400.cpp @@ -1,31 +1,14 @@ // // Stampa registri IVA - -#include -#include -#include -#include -#include -#include -#include -#include - +// Usurpatore di Liberta'... +// Nemico ed Oscuro Messo di Malvagita'... #include "cg4.h" #include "cg4400.h" #include "cg4400a.h" #include "cg4400b.h" #include "cglib01.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include - +static enum tipo_sospensione { nessuna, normale, vol_affari, liquidazione }; inline TStampa_registri_app& app() { return (TStampa_registri_app&)main_app(); } @@ -42,14 +25,21 @@ bool TStampa_registri_app::filter_func (const TRelation * r) if (codreg != (app()._codreg) || annoiva != (app()._annoes)) return FALSE; - if (app()._data_da.string() != "" && app()._data_a.string() != "") - if ( (datareg < app()._data_da || datareg > app()._data_a ) || (!datareg.ok()) ) - return FALSE; - + //if (app()._data_da.string() != "" && app()._data_a.string() != "") + // if ( (datareg < app()._data_da || datareg > app()._data_a ) || (!datareg.ok()) ) + // return FALSE; + //if (!datareg.ok()) + // return FALSE; + if (app()._tipo_stampa != prova) //stampa di bollato + { + const tipo_sospensione ts = (tipo_sospensione) r->lfile("REG").get_int("I9"); + if (ts == liquidazione) // Movimento valido solo ai fini della liquidazione + return FALSE; if (regst) //il movimento e' gia' return FALSE; //stato stampato in forma definitiva - + } + if (datareg.month() < app()._stampa_mese) app()._stampa_mese = datareg.month(); return TRUE; @@ -346,6 +336,7 @@ void TStampa_registri_app::look_reg() _stampa_ind_comp = _tabreg->get_bool ("B5"); _stampa_cred_pre = _tabreg->get_bool ("B4"); _freq_riepilogo = _tabreg->get_char ("S9"); + _stampa_plafonds = _tabreg->get_char ("S10") == 'X'; } bool TStampa_registri_app::compila_reg(const TMask& m) @@ -440,6 +431,7 @@ bool TStampa_registri_app::compila_reg(const TMask& m) _stampa_cred_pre = _tabreg->get_bool("B4"); _stampa_ind_ditta = _tabreg->get_bool("B9"); _stampa_ind_comp = _tabreg->get_bool("B5"); + _stampa_plafonds = _tabreg->get_char ("S10") == 'X'; _cod_un_loc = _tabreg->get_int ("I7"); _mese_credito = _tabreg->get_int ("I8"); //campo nascosto sulla tabella dei registri: mese di stampa credito anno precedente _mese_ultima_liq = _tabreg->get_int ("I4"); @@ -1030,6 +1022,7 @@ bool TStampa_registri_app::user_create() _rel = new TRelation (LF_MOV); _rel->add(LF_CAUSALI,"CODCAUS=CODCAUS",1,LF_MOV); _rel->add(LF_RMOVIVA,"NUMREG=NUMREG",1,LF_MOV); + _rel->add ("REG", "CODTAB[1,4]=ANNOIVA|CODTAB[5,7]=REG"); _cur = new TSorted_cursor(_rel, "DATAREG|PROTIVA|NUMREG","", 2); @@ -1727,7 +1720,7 @@ void TStampa_registri_app::set_page_tot_reg() } } // for } - if (_tipo_reg == acquisto && _tipo_stampa != prova) + if (_stampa_plafonds) stampa_plafonds(rr); } @@ -1737,13 +1730,13 @@ void TStampa_registri_app::stampa_plafonds(int r) TTable ppa ("PPA"); TString80 chiave; int num; - real r1, r2, r3; + real r1, r2, r3, r8, r8b, r9, disponibile; r1 = r2 = r3 = ZERO; if (_tipo_stampa == libro_unico) num = _fino_a_mese; - if ( _tipo_stampa == bollato || _tipo_stampa == rif_giornale ) + if ( _tipo_stampa == bollato || _tipo_stampa == prova || _tipo_stampa == rif_giornale ) num = _datareg.month(); TString16 nm; nm.format("%02d", num); @@ -1757,32 +1750,62 @@ void TStampa_registri_app::stampa_plafonds(int r) chiave << _codatt << "1"; pla.put("CODTAB", chiave); + const bool print_now = r == -1; + TPrintrow riga; + TPrinter& pr = printer(); + if (pla.read() == NOERR) { - r1 = pla.get_real("R5"); //totali esp. art.8 - r2 = pla.get_real("R6"); //totali esp. art.8 bis - r3 = pla.get_real("R7"); //totali esp. art 9 + r1 = pla.get_real("R5"); //totali esp. art.8 + r2 = pla.get_real("R6"); //totali esp. art.8 bis + r3 = pla.get_real("R7"); //totali esp. art 9 + r8 = stampa_valori_plafonds(r1, num, ppa, "1"); // Disponibile art. 8 + r8b = stampa_valori_plafonds(r2, num, ppa, "2"); // Disponibile art. 8 bis + r9 = stampa_valori_plafonds(r3, num, ppa, "3"); // Disponibile art. 9 + disponibile = r8 + r8b + r9; } - if (r1 > ZERO || r2 > ZERO || r3 > ZERO) + if ((r1 > ZERO || r2 > ZERO || r3 > ZERO) && disponibile > ZERO) { - set_row(++r, "QUADRO RELATIVO ALLA DISPONIBILITA' E UTILIZZAZIONE MENSILE DEI PLAFONDS"); - r++; + if (print_now) + { + riga.reset(); + pr.print(riga); + riga.put("QUADRO RELATIVO ALLA DISPONIBILITA' E UTILIZZAZIONE MENSILE DEI PLAFONDS",0); + pr.print(riga); + } + else + { + set_row(++r, "QUADRO RELATIVO ALLA DISPONIBILITA' E UTILIZZAZIONE MENSILE DEI PLAFONDS"); + r++; + } TString mese(9); mese = itom(num); mese.right_just(); - set_row(++r, "%s", (const char*) mese); - set_row(++r, ""); - r++; + + if (print_now) + { + riga.reset(); + pr.print(riga); + riga.put((const char*)mese, 0); + riga.put("Disponibile", 35); + riga.put(disponibile.string("###.###.###.###"), 55); + pr.print(riga); + } + else + { + set_row(++r, "%s@35gDisponibile @55g%r", (const char*) mese, &disponibile); + set_row(++r, ""); + r++; + } } - else return; + else + return; const bool is_bollato = _tipo_stampa == bollato; if (r1 > ZERO) { - real r8 = ZERO; - r8 = stampa_valori_plafonds(r1, num, ppa, "1"); if (r8 > ZERO && is_bollato || !is_bollato && !r8.is_zero()) { real pri = ZERO; @@ -1803,17 +1826,34 @@ void TStampa_registri_app::stampa_plafonds(int r) pri += ppa.get_real("R0"); pre += ppa.get_real("R1"); } - real x = r8 - pri - pre; - set_row(r++, "ART. 8 1° comma lettere a-b Disponibile %r", &r8); - set_row(r++, "Utilizzato all'interno@44g%r", &pri); - set_row(r++, "Utilizzato per l'importazione@44g%r riporto %r", &pre, &x); + disponibile -= pri + pre; + if (print_now) + { + riga.reset(); + pr.print(riga); + riga.reset(); + riga.put("ART. 8 1° comma lettere a-b", 0); + pr.print(riga); + riga.reset(); + riga.put("Utilizzato all'interno",0); + riga.put(pri.string("###.###.###.###"),55); + pr.print(riga); + riga.reset(); + riga.put("Utilizzato per l'importazione",0); + riga.put(pre.string("###.###.###.###"),55); + pr.print(riga); + } + else + { + set_row(r++, "ART. 8 1° comma lettere a-b"); + set_row(r++, "Utilizzato all'interno@55g%r", &pri); + set_row(r++, "Utilizzato per l'importazione@55g%r", &pre); + } } } if (r2 > ZERO) { - real r8b = ZERO; - r8b = stampa_valori_plafonds(r2, num, ppa, "2"); if (r8b > ZERO && is_bollato || !is_bollato && !r8b.is_zero()) { real pri = ZERO; @@ -1834,18 +1874,34 @@ void TStampa_registri_app::stampa_plafonds(int r) pri += ppa.get_real("R0"); pre += ppa.get_real("R1"); } - real x = r8b - pri - pre; + disponibile -= pri + pre; r++; - set_row(r++, "ART. 8 bis 1° comma Disponibile %r", &r8b); - set_row(r++, "Utilizzato all'interno@44g%r", &pri); - set_row(r++, "Utilizzato per l'importazione@44g%r riporto %r", &pre, &x); + if (print_now) + { + riga.reset(); + pr.print(riga); pr.print(riga); + riga.put("ART. 8 bis 1° comma", 0); + pr.print(riga); + riga.reset(); + riga.put("Utilizzato all'interno",0); + riga.put(pri.string("###.###.###.###"),55); + pr.print(riga); + riga.reset(); + riga.put("Utilizzato per l'importazione",0); + riga.put(pre.string("###.###.###.###"),55); + pr.print(riga); + } + else + { + set_row(r++, "ART. 8 bis 1° comma"); + set_row(r++, "Utilizzato all'interno@55g%r", &pri); + set_row(r++, "Utilizzato per l'importazione@55g%r", &pre); + } } } if (r3 > ZERO) { - real r9 = ZERO; - r9 = stampa_valori_plafonds(r3, num, ppa, "3"); if (r9 > ZERO && is_bollato || !is_bollato && !r9.is_zero()) { real pri = ZERO; @@ -1866,13 +1922,42 @@ void TStampa_registri_app::stampa_plafonds(int r) pri += ppa.get_real("R0"); pre += ppa.get_real("R1"); } - real x = r9 - pri - pre; + disponibile -= pri + pre; r++; - set_row(r++, "ART. 9 1° comma Disponibile %r", &r9); - set_row(r++, "Utilizzato all'interno@44g%r", &pri); - set_row(r++, "Utilizzato per l'importazione@44g%r riporto %r", &pre, &x); + if (print_now) + { + riga.reset(); + pr.print(riga);pr.print(riga); + riga.put("ART. 9 1° comma", 0); + pr.print(riga); + riga.reset(); + riga.put("Utilizzato all'interno",0); + riga.put(pri.string("###.###.###.###"),55); + pr.print(riga); + riga.reset(); + riga.put("Utilizzato per l'importazione",0); + riga.put(pre.string("###.###.###.###"),55); + pr.print(riga); + } + else + { + set_row(r++, "ART. 9 1° comma"); + set_row(r++, "Utilizzato all'interno@55g%r", &pri); + set_row(r++, "Utilizzato per l'importazione@55g%r", &pre); + } } } + if (r1 > ZERO || r2 > ZERO || r3 > ZERO) + if (print_now) + { + riga.reset(); + pr.print(riga); + riga.put("Riporto",35); + riga.put(disponibile.string("###.###.###.###"),55); + pr.print(riga); + } + else + set_row(++r, "@35gRiporto @55g%r", &disponibile); } real TStampa_registri_app::stampa_valori_plafonds(const real& r1, const int mese, TTable& ppa, const char* tipo) @@ -2931,7 +3016,7 @@ void TStampa_registri_app::no_movimenti() send_message(calc ? 'R' : 'C', app, calc ? a : mese); } - if (_tipo_reg == riepilogativo || _liquidazione) + if (_tipo_reg == riepilogativo || _liquidazione || _stampa_plafonds) { for (int m = da; m <= a; m++) { @@ -2952,6 +3037,19 @@ void TStampa_registri_app::no_movimenti() printer().formfeed(); } } + + if (_stampa_plafonds) // Se non vi sono movimenti da stampare, e c'e' la X + { // di stampa prospetto plafond, STAMPALO! + if (_freq_riepilogo == 'M' || + (m == 3 || m == 6 || m == 9 || m == 12)) + { + if (! printer().isopen()) + printer().open(); + _datareg = TDate(1, m, _annoes); + stampa_plafonds(-1); // Con -1 compone e stampa printrows all'istante + printer().formfeed(); + } + } //la funzione stampo_liquidazione non stampera' la liquidazione sul //registro il cui mese di stampa ultima liq. e' > del mese in esame @@ -3183,6 +3281,7 @@ bool TStampa_registri_app::set_print(int n) bool TStampa_registri_app::stampa_registri_IVA(const TMask& m) { bool ok = FALSE; + TRectype mov_from(LF_MOV), mov_to(LF_MOV); for (int i = 0; i < _ditte->items(); i++) { if (_selected[(long)i]) @@ -3210,7 +3309,10 @@ bool TStampa_registri_app::stampa_registri_IVA(const TMask& m) if (!_stampa_tutti_i_registri) { _scelta = no_liquidazione; - _cur->set_filterfunction(filter_func); + mov_from.put(MOV_DATAREG, _data_da); + mov_to.put(MOV_DATAREG, _data_a); + _cur->setregion(mov_from, mov_to); + _cur->set_filterfunction(filter_func, TRUE); //la filter function viene chiamata quando posiziono il cursore //e' lei che determina _stampa_mese da settare in setta_mask (*_cur) = 0L; @@ -3219,7 +3321,7 @@ bool TStampa_registri_app::stampa_registri_IVA(const TMask& m) if (_liquidazione) { _size_header = 3; - if (_tipo_stampa == bollato && !_stampa_ind_ditta) _size_header++; + if ((_tipo_stampa == bollato || _tipo_stampa == rif_giornale) && !_stampa_ind_ditta) _size_header++; clear_stliq(); //l'inizializzazione di _scelta vale per tutti //i mesi da stampare di un certo registro (su @@ -3276,6 +3378,7 @@ bool TStampa_registri_app::stampa_registri_IVA(const TMask& m) _codreg = codtab.mid(4,3); cod_lib_un = _tabreg->get("S6"); sca_vid = _tabreg->get_date("D1"); + _stampa_plafonds = _tabreg->get_char ("S10") == 'X'; _stampa_ind_ditta = _tabreg->get_bool("B9"); _liquidazione = _tabreg->get_bool("B7"); if (_tipo_stampa != prova) @@ -3328,8 +3431,11 @@ bool TStampa_registri_app::stampa_registri_IVA(const TMask& m) _scelta = no_liquidazione; //modifica del 09/11/1995 + mov_from.put(MOV_DATAREG, _data_da); + mov_to.put(MOV_DATAREG, _data_a); + _cur->setregion(mov_from, mov_to); _cur->set_filterfunction(NULL); - _cur->set_filterfunction(filter_func); + _cur->set_filterfunction(filter_func, TRUE); (*_cur) = 0L; ok = setta_mask(i); if (!ok) continue; @@ -3337,7 +3443,7 @@ bool TStampa_registri_app::stampa_registri_IVA(const TMask& m) if (_liquidazione) { _size_header = 3; - if (_tipo_stampa == bollato && !_stampa_ind_ditta) _size_header++; + if ((_tipo_stampa == bollato || _tipo_stampa == rif_giornale) && !_stampa_ind_ditta) _size_header++; clear_stliq(); //N.B. E' fondamentale che _scelta venga ri-inizializzata ad ogni //registro(cioe' dopo la stampa di ciascuno). Infatti il B0 di un diff --git a/cg/cg4400.h b/cg/cg4400.h index f8decfab1..bde90099a 100755 --- a/cg/cg4400.h +++ b/cg/cg4400.h @@ -46,7 +46,7 @@ class TStampa_registri_app : public TPrintapp tiporeg _tipo_reg; bool _st_liq[13]; bool _test; - bool _mov_empty, _stampa_ind_ditta, _stampa_tutti_i_registri, _auto_intraf, _stampa; + bool _mov_empty, _stampa_ind_ditta, _stampa_tutti_i_registri, _auto_intraf, _stampa, _stampa_plafonds; bool _corrispettivi, _liquidazione, _stampa_ind_comp, _esiste_riga_iva, _stampa_cred_pre; bool _rif_vid, _intesta_vidi, _intesta_liq, _stampa_data_reg, _ok_vidi; bool _sosp_imposta, _riep_liq; diff --git a/cg/cg4500.cpp b/cg/cg4500.cpp index 70b9f9c39..e497da826 100755 --- a/cg/cg4500.cpp +++ b/cg/cg4500.cpp @@ -219,6 +219,7 @@ bool TAp_eser::apertura_es() nuovo.put("D2", data); nuovo.put("D3", data); nuovo.put("I6", 0L); + nuovo.put("I1", 0L); nuovo.put("R1", real(0.0)); nuovo.put("R2", real(0.0)); diff --git a/cg/cg4700a.uml b/cg/cg4700a.uml index 9f95f827a..7ffc8f594 100755 --- a/cg/cg4700a.uml +++ b/cg/cg4700a.uml @@ -83,21 +83,17 @@ BEGIN ADD NONE END -NUMBER F_ACCONTO 15 +CURRENCY F_ACCONTO 15 BEGIN PROMPT 1 7 "Acconto dovuto " HELP "Introdurre l'acconto dovuto" - PICTURE "." - FLAGS "R" FIELD R4 END -NUMBER F_CREDITO 15 +CURRENCY F_CREDITO 15 BEGIN PROMPT 1 9 "Credito utilizzato " HELP "Introdurre il credito utilizzato" - PICTURE "." - FLAGS "R" FIELD R6 END diff --git a/cg/cg4800b.uml b/cg/cg4800b.uml index 241ba0858..16238cd52 100755 --- a/cg/cg4800b.uml +++ b/cg/cg4800b.uml @@ -61,25 +61,22 @@ BEGIN FLAGS "ZD" END -NUMBER F_IMPVER 15 +CURRENCY F_IMPVER 15 BEGIN PROMPT 1 9 "Importo versato " FLAGS "D" - PICTURE "." END -NUMBER F_NEWIMP 15 +CURRENCY F_NEWIMP 15 BEGIN PROMPT 1 10 "Nuovo importo " FLAGS "D" - PICTURE "." END -NUMBER F_NEWIMPCRED 15 +CURRENCY F_NEWIMPCRED 15 BEGIN PROMPT 1 12 "Importo a credito " FLAGS "HD" - PICTURE "." END ENDPAGE diff --git a/cg/cg4900b.uml b/cg/cg4900b.uml index 837d15603..cf95b9d0e 100755 --- a/cg/cg4900b.uml +++ b/cg/cg4900b.uml @@ -57,128 +57,109 @@ BEGIN PROMPT 66 3 "Debito" END -NUMBER F_IVAVEN 15 +CURRENCY F_IVAVEN 15 BEGIN PROMPT 1 4 "Iva sulle operazioni annotate fino al 20 dic. " - FLAGS "RD" - PICTURE "." + FLAGS "D" END -NUMBER F_NONFAT 15 +CURRENCY F_NONFAT 15 BEGIN PROMPT 1 5 "Iva su operaz. fino al 20 dic., ma non fatturate " - FLAGS "R" - PICTURE "." MESSAGE K_TAB,F_RISVEN|K_TAB,F_IVACRE|K_TAB,F_IVADEB END -NUMBER F_NONANN 15 +CURRENCY F_NONANN 15 BEGIN PROMPT 1 6 "Iva su operaz. fino al 20 dic., ma non annotate " - FLAGS "R" - PICTURE "." MESSAGE K_TAB,F_RISVEN|K_TAB,F_IVACRE|K_TAB,F_IVADEB END -NUMBER F_IVARED 15 +CURRENCY F_IVARED 15 BEGIN PROMPT 1 7 "Rettifiche iva a debito " - FLAGS "RD" - PICTURE "." + FLAGS "D" END -NUMBER F_IVARIM 15 +CURRENCY F_IVARIM 15 BEGIN PROMPT 1 8 "Iva chiesta a rimborso " - FLAGS "RD" - PICTURE "." + FLAGS "D" END -NUMBER F_RISVEN 15 +CURRENCY F_RISVEN 15 BEGIN PROMPT 1 9 "RISULTATO " - FLAGS "RD" - PICTURE "." + FLAGS "D" NUM_CALC {#F_IVAVEN + #F_NONFAT + #F_NONANN + #F_IVARED + #F_IVARIM} END -NUMBER F_IVAACQ 15 +CURRENCY F_IVAACQ 15 BEGIN PROMPT 1 10 "Iva su acq. annotati fino al 20 dic. " - FLAGS "RD" - PICTURE "." + FLAGS "D" END -NUMBER F_PERPRO 15 +CURRENCY F_PERPRO 15 BEGIN PROMPT 1 11 "meno % di prorata pari a Lire " - FLAGS "RD" - PICTURE "." + FLAGS "D" END -NUMBER F_CREPRE 15 +CURRENCY F_CREPRE 15 BEGIN PROMPT 1 12 "Credito precedente " - FLAGS "RD" - PICTURE "." + FLAGS "D" END -NUMBER F_ULTDET 15 +CURRENCY F_ULTDET 15 BEGIN PROMPT 1 13 "Ulteriori detrazioni " - FLAGS "RD" - PICTURE "." + FLAGS "D" END -NUMBER F_IVAREC 15 +CURRENCY F_IVAREC 15 BEGIN PROMPT 1 14 "Rettifiche iva a credito " - FLAGS "RD" - PICTURE "." + FLAGS "D" END -NUMBER F_RISACQ 15 +CURRENCY F_RISACQ 15 BEGIN PROMPT 1 15 "RISULTATO " - FLAGS "RD" - PICTURE "." + FLAGS "D" END -NUMBER F_IVACRE 15 +CURRENCY F_IVACRE 15 BEGIN PROMPT 15 16 "IVA A CREDITO " - FLAGS "RD" - PICTURE "." + FLAGS "D" NUM_CALC {#F_RISACQ - #F_RISVEN} END -NUMBER F_CREEVI 15 +CURRENCY F_CREEVI 15 BEGIN PROMPT 6 17 "CREDITO DA EVIDENZIARE " - FLAGS "RD" - PICTURE "." + FLAGS "D" END -NUMBER F_IVADEB 15 +CURRENCY F_IVADEB 15 BEGIN PROMPT 16 16 "IVA A DEBITO " - FLAGS "RD" - PICTURE "." + FLAGS "D" NUM_CALC {#F_RISVEN - #F_RISACQ} END -NUMBER F_ACCVER 15 +CURRENCY F_ACCVER 15 BEGIN PROMPT 10 17 "ACCONTO DA VERSARE " - FLAGS "RD" - PICTURE "." + FLAGS "D" END -NUMBER F_ACCNVER 15 +CURRENCY F_ACCNVER 15 BEGIN PROMPT 6 17 "ACCONTO DA NON VERSARE " - FLAGS "RD" - PICTURE "." + FLAGS "D" END ENDPAGE diff --git a/cg/cg4900c.uml b/cg/cg4900c.uml index aef16324f..1d8880808 100755 --- a/cg/cg4900c.uml +++ b/cg/cg4900c.uml @@ -4,165 +4,150 @@ TOOLBAR "" 0 20 0 2 /* BUTTON DLG_SAVEREC 10 2 -BEGIN -PROMPT -12 -1 "~Registra" -MESSAGE EXIT,K_SAVE -END -*/ - -BUTTON DLG_CANCEL 10 2 -BEGIN -PROMPT -12 -1 "" -MESSAGE EXIT,K_ESC -END - -BUTTON DLG_QUIT 10 2 -BEGIN -PROMPT -22 -1 "" -MESSAGE EXIT,K_QUIT -END - -ENDPAGE - -PAGE "Acconto su operazioni effettuate" -1 -1 77 20 - -GROUPBOX DLG_NULL 78 3 -BEGIN - PROMPT 1 0 "@bDitta corrente" -END - -NUMBER F_CODDITTA 5 -BEGIN - PROMPT 3 1 "Codice " - FLAGS "DFR" - USE LF_NDITTE KEY 1 - INPUT CODDITTA F_CODDITTA - OUTPUT F_RAGSOC RAGSOC - CHECKTYPE REQUIRED -END - -STRING F_RAGSOC 50 -BEGIN - PROMPT 17 1 "Rag. Soc. " - FLAGS "D" -END - -TEXT DLG_NULL -BEGIN - PROMPT 51 3 "Credito" -END - -TEXT DLG_NULL -BEGIN - PROMPT 66 3 "Debito" -END - -NUMBER F_IVAVEN 15 -BEGIN - PROMPT 1 4 "Iva sulle operazioni di vendita " - FLAGS "RD" - PICTURE "." -END - -NUMBER F_IVARED 15 -BEGIN - PROMPT 1 5 "Rettifiche iva a debito " - FLAGS "RD" - PICTURE "." -END - -NUMBER F_IVARIM 15 -BEGIN - PROMPT 1 6 "Iva chiesta a rimborso " - FLAGS "RD" - PICTURE "." -END - -NUMBER F_RISVEN 15 -BEGIN - PROMPT 1 7 "RISULTATO " - FLAGS "RD" - PICTURE "." -END - -NUMBER F_IVAACQ 15 -BEGIN - PROMPT 1 9 "Iva sulle operazioni di acquisto " - FLAGS "RD" - PICTURE "." -END - -NUMBER F_PERPRO 15 -BEGIN - PROMPT 1 10 "meno % di prorata pari a Lire " - FLAGS "RD" - PICTURE "." -END - -NUMBER F_CREPRE 15 -BEGIN - PROMPT 1 11 "Credito precedente " - FLAGS "RD" - PICTURE "." -END - -NUMBER F_ULTDET 15 -BEGIN - PROMPT 1 12 "Ulteriori detrazioni " - FLAGS "RD" - PICTURE "." -END - -NUMBER F_IVAREC 15 -BEGIN - PROMPT 1 13 "Rettifiche iva a credito " - FLAGS "RD" - PICTURE "." -END - -NUMBER F_RISACQ 15 -BEGIN - PROMPT 1 14 "RISULTATO " - FLAGS "RD" - PICTURE "." -END - -NUMBER F_IVACRE 15 -BEGIN - PROMPT 15 15 "IVA A CREDITO " - FLAGS "RD" - PICTURE "." -END - -NUMBER F_CREEVI 15 -BEGIN - PROMPT 6 17 "CREDITO DA EVIDENZIARE " - FLAGS "RD" - PICTURE "." -END - -NUMBER F_IVADEB 15 -BEGIN - PROMPT 16 15 "IVA A DEBITO " - FLAGS "RD" - PICTURE "." -END - -NUMBER F_ACCVER 15 -BEGIN - PROMPT 10 17 "ACCONTO DA VERSARE " - FLAGS "RD" - PICTURE "." -END - -NUMBER F_ACCNVER 15 -BEGIN - PROMPT 6 17 "ACCONTO DA NON VERSARE " - FLAGS "RD" - PICTURE "." -END - -ENDPAGE - -ENDMASK - +BEGIN +PROMPT -12 -1 "~Registra" +MESSAGE EXIT,K_SAVE +END +*/ + +BUTTON DLG_CANCEL 10 2 +BEGIN +PROMPT -12 -1 "" +MESSAGE EXIT,K_ESC +END + +BUTTON DLG_QUIT 10 2 +BEGIN +PROMPT -22 -1 "" +MESSAGE EXIT,K_QUIT +END + +ENDPAGE + +PAGE "Acconto su operazioni effettuate" -1 -1 77 20 + +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 1 0 "@bDitta corrente" +END + +NUMBER F_CODDITTA 5 +BEGIN + PROMPT 3 1 "Codice " + FLAGS "DFR" + USE LF_NDITTE KEY 1 + INPUT CODDITTA F_CODDITTA + OUTPUT F_RAGSOC RAGSOC + CHECKTYPE REQUIRED +END + +STRING F_RAGSOC 50 +BEGIN + PROMPT 17 1 "Rag. Soc. " + FLAGS "D" +END + +TEXT DLG_NULL +BEGIN + PROMPT 51 3 "Credito" +END + +TEXT DLG_NULL +BEGIN + PROMPT 66 3 "Debito" +END + +CURRENCY F_IVAVEN 15 +BEGIN + PROMPT 1 4 "Iva sulle operazioni di vendita " + FLAGS "D" +END + +CURRENCY F_IVARED 15 +BEGIN + PROMPT 1 5 "Rettifiche iva a debito " + FLAGS "D" +END + +CURRENCY F_IVARIM 15 +BEGIN + PROMPT 1 6 "Iva chiesta a rimborso " + FLAGS "D" +END + +CURRENCY F_RISVEN 15 +BEGIN + PROMPT 1 7 "RISULTATO " + FLAGS "D" +END + +CURRENCY F_IVAACQ 15 +BEGIN + PROMPT 1 9 "Iva sulle operazioni di acquisto " + FLAGS "D" +END + +CURRENCY F_PERPRO 15 +BEGIN + PROMPT 1 10 "meno % di prorata pari a Lire " + FLAGS "D" +END + +CURRENCY F_CREPRE 15 +BEGIN + PROMPT 1 11 "Credito precedente " + FLAGS "D" +END + +CURRENCY F_ULTDET 15 +BEGIN + PROMPT 1 12 "Ulteriori detrazioni " + FLAGS "D" +END + +CURRENCY F_IVAREC 15 +BEGIN + PROMPT 1 13 "Rettifiche iva a credito " + FLAGS "D" +END + +CURRENCY F_RISACQ 15 +BEGIN + PROMPT 1 14 "RISULTATO " + FLAGS "D" +END + +CURRENCY F_IVACRE 15 +BEGIN + PROMPT 15 15 "IVA A CREDITO " + FLAGS "D" +END + +CURRENCY F_CREEVI 15 +BEGIN + PROMPT 6 17 "CREDITO DA EVIDENZIARE " + FLAGS "D" +END + +CURRENCY F_IVADEB 15 +BEGIN + PROMPT 16 15 "IVA A DEBITO " + FLAGS "D" +END + +CURRENCY F_ACCVER 15 +BEGIN + PROMPT 10 17 "ACCONTO DA VERSARE " + FLAGS "D" +END + +CURRENCY F_ACCNVER 15 +BEGIN + PROMPT 6 17 "ACCONTO DA NON VERSARE " + FLAGS "D" +END + +ENDPAGE + +ENDMASK + diff --git a/cg/cg5100.cpp b/cg/cg5100.cpp index 84e04a826..81c38343f 100755 --- a/cg/cg5100.cpp +++ b/cg/cg5100.cpp @@ -19,6 +19,8 @@ class TParametri_ditta : public TConfig_application void check_registers(int year); public: + virtual bool check_autorization() const + {return FALSE;} virtual bool preprocess_config (TMask& mask, TConfig& config); virtual bool postprocess_config (TMask& mask, TConfig& config); virtual bool postprocess_config_changed(const char* par, const char* var, @@ -155,19 +157,22 @@ void TParametri_ditta::load_file(int logicnum) bool TParametri_ditta::preprocess_config (TMask& mask, TConfig& config) { - // these are disabled in normal applications - TLocalisamfile mov(LF_MOV); - const bool movempty = mov.empty(); - mask.enable(CHK_ANCFCM, movempty); - mask.enable(CHK_PCTCCM, movempty); - if (mask.get(FLD_ANLIIV).empty()) - mask.set(FLD_ANLIIV, TDate(TODAY).year()); - - // check auth for Saldaconto - if (!has_module(SCAUT, CHK_DONGLE)) - // disable saldaconting - mask.disable(-GROUP_SALDACONTO); + if (has_module(CGAUT, CHK_DONGLE)) + { + TLocalisamfile mov(LF_MOV); + const bool movempty = mov.empty(); + mask.enable(CHK_ANCFCM, movempty); + mask.enable(CHK_PCTCCM, movempty); + if (mask.get(FLD_ANLIIV).empty()) + mask.set(FLD_ANLIIV, TDate(TODAY).year()); + // check auth for Saldaconto + if (!has_module(SCAUT, CHK_DONGLE)) + // disable saldaconting + mask.disable(-GROUP_SALDACONTO); + } + else + mask.disable(-GROUP_CONTABILITA); return TRUE; } diff --git a/cg/cg5100a.h b/cg/cg5100a.h index 29eb9ba36..c2d67d686 100755 --- a/cg/cg5100a.h +++ b/cg/cg5100a.h @@ -60,4 +60,5 @@ // gruppi #define GROUP_SALDACONTO 1 +#define GROUP_CONTABILITA 2 diff --git a/cg/cg5100a.uml b/cg/cg5100a.uml index 400881349..98b577059 100755 --- a/cg/cg5100a.uml +++ b/cg/cg5100a.uml @@ -26,6 +26,7 @@ BEGIN HELP "Indicare l'anno dell'esercizio IVA corrente" FIELD AnLiIv VALIDATE FIXLEN_FUNC 4 + GROUP GROUP_CONTABILITA END GROUPBOX DLG_NULL 76 4 @@ -39,6 +40,7 @@ BEGIN HELP "Indicare se gestire un'unica anagrafica clienti/fornitori" FLAGS "D" FIELD AnCfCm + GROUP GROUP_CONTABILITA END BOOLEAN CHK_PCTCCM @@ -47,6 +49,7 @@ BEGIN HELP "Indicare se gestire un'unico archivio piano dei conti/causali" FLAGS "D" FIELD PcTcCm + GROUP GROUP_CONTABILITA END @@ -65,6 +68,7 @@ BEGIN PROMPT 4 6 "Gestione libro cronologico " HELP "Indicare se attivare il libro cronologico della gestione per i professionisti" FIELD GsLbCn + GROUP GROUP_CONTABILITA END BOOLEAN CHK_STTFFR @@ -72,6 +76,7 @@ BEGIN PROMPT 4 7 "Stampa totali fatture a fine registro " HELP "Indicare se attivare il computo dei totali fatture a fine registro" FIELD StTfFr + GROUP GROUP_CONTABILITA END BOOLEAN CHK_STLGIU @@ -79,6 +84,7 @@ BEGIN PROMPT 4 8 "Stampa libro giornale e libro IVA unico " HELP "Indicare se utilizzare un unico registro per libro giornale e libro IVA" FIELD StLgiU + GROUP GROUP_CONTABILITA END BOOLEAN CHK_GESVEN @@ -86,6 +92,7 @@ BEGIN PROMPT 4 9 "Gestione vendite" HELP "Indicare se e' attivata anche la gestione delle vendite" FIELD GesVen + GROUP GROUP_CONTABILITA END BOOLEAN CHK_GEST74 @@ -93,6 +100,7 @@ BEGIN PROMPT 4 10 "Gestione versamenti 4.tr per soggetti art. 74/4" HELP "Indicare se si deve gestire il versamento del 4. trimestre per benzinai e autotrasportatori" FIELD GesT74 + GROUP GROUP_CONTABILITA END BOOLEAN CHK_GESSAL @@ -196,6 +204,7 @@ BEGIN CHECKTYPE NORMAL FLAGS "UZ" FIELD CodLic + GROUP GROUP_CONTABILITA END STRING FLD_DESLIC 50 35 @@ -208,6 +217,7 @@ BEGIN DISPLAY "Codice Registro" CODTAB[5,7] COPY OUTPUT FLD_CODLIC CHECKTYPE NORMAL + GROUP GROUP_CONTABILITA END @@ -252,6 +262,7 @@ BEGIN ADD RUN cg0 -4 FLAGS "UZ" FIELD CoCaCh + GROUP GROUP_CONTABILITA END STRING FLD_DCOCACH 50 35 @@ -265,6 +276,7 @@ BEGIN COPY OUTPUT FLD_COCACH CHECKTYPE NORMAL ADD RUN cg0 -4 + GROUP GROUP_CONTABILITA END STRING FLD_COCAAP 3 @@ -280,6 +292,7 @@ BEGIN ADD RUN cg0 -4 CHECKTYPE NORMAL FIELD CoCaAp + GROUP GROUP_CONTABILITA END STRING FLD_DCOCAAP 50 35 @@ -292,6 +305,7 @@ BEGIN COPY OUTPUT FLD_COCAAP CHECKTYPE NORMAL ADD RUN cg0 -4 + GROUP GROUP_CONTABILITA END TEXT DLG_NULL @@ -322,6 +336,7 @@ BEGIN OUTPUT FLD_DCSBICH DESCR FIELD CsBiChG ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END NUMBER FLD_CSBICHC 3 @@ -331,6 +346,7 @@ BEGIN COPY ALL FLD_CSBICHG FIELD CsBiChC ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END NUMBER FLD_CSBICHS 6 @@ -347,6 +363,7 @@ BEGIN CHECKTYPE NORMAL FIELD CsBiChS ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END STRING FLD_DCSBICH 50 25 @@ -361,6 +378,7 @@ BEGIN DISPLAY "Sottoconto" SOTTOCONTO COPY OUTPUT FLD_CSBICHG ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END NUMBER FLD_CSPRPEG 3 @@ -378,6 +396,7 @@ BEGIN INPUT SOTTOCONTO FLD_CSPRPES FIELD CsPrPeG ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END NUMBER FLD_CSPRPEC 3 @@ -387,6 +406,7 @@ BEGIN COPY ALL FLD_CSPRPEG FIELD CsPrPeC ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END NUMBER FLD_CSPRPES 6 @@ -403,6 +423,7 @@ BEGIN CHECKTYPE NORMAL FIELD CsPrPeS ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END STRING FLD_DCSPRPE 50 25 @@ -414,6 +435,7 @@ BEGIN COPY DISPLAY FLD_DCSBICH COPY OUTPUT FLD_CSPRPEG ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END @@ -433,6 +455,7 @@ BEGIN HELP "" FIELD CsBiApG ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END NUMBER FLD_CSBIAPC 3 @@ -442,6 +465,7 @@ BEGIN COPY ALL FLD_CSBIAPG FIELD CsBiApC ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END NUMBER FLD_CSBIAPS 6 @@ -458,6 +482,7 @@ BEGIN CHECKTYPE NORMAL FIELD CsBiApS ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END STRING FLD_DCSBIAP 50 25 @@ -469,6 +494,7 @@ BEGIN COPY DISPLAY FLD_DCSBICH COPY OUTPUT FLD_CSBIAPG ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END @@ -487,6 +513,7 @@ BEGIN INPUT SOTTOCONTO FLD_CSUECPS FIELD CsUeCpG ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END NUMBER FLD_CSUECPC 3 BEGIN @@ -495,6 +522,7 @@ BEGIN COPY ALL FLD_CSUECPG FIELD CsUeCpC ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END NUMBER FLD_CSUECPS 6 BEGIN @@ -510,6 +538,7 @@ BEGIN CHECKTYPE NORMAL FIELD CsUeCpS ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END STRING FLD_DCSUECP 50 25 @@ -521,6 +550,7 @@ BEGIN COPY DISPLAY FLD_DCSBICH COPY OUTPUT FLD_CSUECPG ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END NUMBER FLD_CSPECPG 3 @@ -538,6 +568,7 @@ BEGIN INPUT SOTTOCONTO FLD_CSPECPS FIELD CsPeCpG ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END NUMBER FLD_CSPECPC 3 @@ -547,6 +578,7 @@ BEGIN COPY ALL FLD_CSPECPG FIELD CsPeCpC ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END NUMBER FLD_CSPECPS 6 @@ -563,6 +595,7 @@ BEGIN CHECKTYPE NORMAL FIELD CsPeCpS ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END STRING FLD_DCSPECP 50 25 @@ -574,6 +607,7 @@ BEGIN COPY DISPLAY FLD_DCSBICH COPY OUTPUT FLD_CSPECPG ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END NUMBER FLD_CSUECEG 3 @@ -591,6 +625,7 @@ BEGIN INPUT SOTTOCONTO FLD_CSUECES FIELD CsUeCeG ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END NUMBER FLD_CSUECEC 3 BEGIN @@ -599,6 +634,7 @@ BEGIN COPY ALL FLD_CSUECEG FIELD CsUeCeC ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END NUMBER FLD_CSUECES 6 BEGIN @@ -614,6 +650,7 @@ BEGIN CHECKTYPE NORMAL FIELD CsUeCeS ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END STRING FLD_DCSUECE 50 25 @@ -625,6 +662,7 @@ BEGIN COPY DISPLAY FLD_DCSBICH COPY OUTPUT FLD_CSUECEG ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END NUMBER FLD_CSPECEG 3 @@ -642,6 +680,7 @@ BEGIN INPUT SOTTOCONTO FLD_CSPECES FIELD CsPeCeG ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END NUMBER FLD_CSPECEC 3 BEGIN @@ -650,6 +689,7 @@ BEGIN COPY ALL FLD_CSPECEG FIELD CsPeCeC ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END NUMBER FLD_CSPECES 6 BEGIN @@ -665,6 +705,7 @@ BEGIN CHECKTYPE NORMAL FIELD CsPeCeS ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END STRING FLD_DCSPECE 50 25 BEGIN @@ -675,6 +716,7 @@ BEGIN COPY DISPLAY FLD_DCSBICH COPY OUTPUT FLD_CSPECEG ADD RUN cg0 -0 + GROUP GROUP_CONTABILITA END @@ -696,6 +738,7 @@ BEGIN ITEM "A|Freq. Annuale" ITEM "M|Freq. Mensile" FIELD RrFrAm + GROUP GROUP_CONTABILITA END BOOLEAN CHK_RRMECO @@ -703,6 +746,7 @@ BEGIN PROMPT 26 3 "Mese Commerciale" HELP "Indicare se viene utilizzato nel calcolo il mese commerciale" FIELD RrMeCo + GROUP GROUP_CONTABILITA END STRING FLD_RRCCRA 3 @@ -718,6 +762,7 @@ BEGIN CHECKTYPE NORMAL ADD RUN cg0 -4 FIELD RrCcRa + GROUP GROUP_CONTABILITA END STRING FLD_DRRCCRA 50 48 @@ -730,6 +775,7 @@ BEGIN COPY OUTPUT FLD_RRCCRA CHECKTYPE NORMAL ADD RUN cg0 -4 + GROUP GROUP_CONTABILITA END STRING FLD_RRCCRI 3 @@ -745,6 +791,7 @@ BEGIN CHECKTYPE NORMAL ADD RUN cg0 -4 FIELD RrCcRi + GROUP GROUP_CONTABILITA END STRING FLD_DRRCCRI 50 48 @@ -757,6 +804,7 @@ BEGIN COPY OUTPUT FLD_RRCCRI CHECKTYPE NORMAL ADD RUN cg0 -4 + GROUP GROUP_CONTABILITA END BOOLEAN CHK_INTRTR @@ -764,6 +812,7 @@ BEGIN PROMPT 3 12 "Non calcolare interessi per frequenza versamenti trimestrale" HELP "Se selezionato, gli interessi non vengono calcolati" FIELD InTrTr + GROUP GROUP_CONTABILITA END diff --git a/cg/cg5200a.uml b/cg/cg5200a.uml index 7de784548..2cc4a54a0 100755 --- a/cg/cg5200a.uml +++ b/cg/cg5200a.uml @@ -245,10 +245,9 @@ BEGIN PROMPT 1 1 "Codice esercizio " END -NUMBER 102 19 +CURRENCY 102 19 BEGIN PROMPT 1 3 "Saldo Iniziale " - PICTURE "." END STRING 103 1 @@ -256,22 +255,20 @@ BEGIN PROMPT 48 3 "" END -NUMBER 106 19 + +CURRENCY 106 19 BEGIN PROMPT 1 4 "Progr.Attuali: Dare " - PICTURE "." END -NUMBER 107 19 +CURRENCY 107 19 BEGIN PROMPT 51 4 "Avere " - PICTURE "." END -NUMBER 104 19 +CURRENCY 104 19 BEGIN PROMPT 22 5 "Saldo " - PICTURE "." END STRING 105 1 @@ -279,10 +276,10 @@ BEGIN PROMPT 48 5 "" END -NUMBER 108 19 + +CURRENCY 108 19 BEGIN PROMPT 1 6 " Saldo di chiusura " - PICTURE "." END STRING 109 1 @@ -290,10 +287,9 @@ BEGIN PROMPT 48 6 "" END -NUMBER 110 19 +CURRENCY 110 19 BEGIN PROMPT 1 7 "Saldo complessivo " - PICTURE "." END STRING 111 1 @@ -311,22 +307,19 @@ BEGIN PROMPT 1 9 "Ultimo numero operazione " END -NUMBER 114 19 +CURRENCY 114 19 BEGIN PROMPT 1 10 "Progr.Mov.Provvisori: Dare " - PICTURE "." END -NUMBER 115 19 +CURRENCY 115 19 BEGIN PROMPT 51 10 "Avere " - PICTURE "." END -NUMBER 116 19 +CURRENCY 116 19 BEGIN PROMPT 1 11 "Saldo " - PICTURE "." END STRING 117 1 @@ -334,16 +327,14 @@ BEGIN PROMPT 48 11 "" END -NUMBER 118 19 +CURRENCY 118 19 BEGIN PROMPT 1 12 "Progr.Mov.Eliminati: Dare " - PICTURE "." END -NUMBER 119 19 +CURRENCY 119 19 BEGIN PROMPT 51 12 "Avere " - PICTURE "." END diff --git a/cg/cg5500b.uml b/cg/cg5500b.uml index f76f286af..6e98e6913 100755 --- a/cg/cg5500b.uml +++ b/cg/cg5500b.uml @@ -47,11 +47,9 @@ BEGIN FLAGS "D" END -NUMBER F_CREDPREC 15 +CURRENCY F_CREDPREC 15 BEGIN PROMPT 1 5 "Credito inizio anno " - FLAGS "R" - PICTURE "." END SPREADSHEET F_VISLIQ1 78 11 @@ -110,11 +108,10 @@ BEGIN END -NUMBER 102 15 0 +CURRENCY 102 15 BEGIN PROMPT 1 3 "Risultato " - FLAGS "DR" - PICTURE "." + FLAGS "D" END LIST 103 1 10 @@ -126,18 +123,14 @@ BEGIN FLAGS "DU" END -NUMBER 104 15 +CURRENCY 104 15 BEGIN PROMPT 1 5 "IVA a rimborso " - FLAGS "R" - PICTURE "." END -NUMBER 105 15 +CURRENCY 105 15 BEGIN PROMPT 1 6 "Rettifiche " - FLAGS "R" - PICTURE "." END LIST 106 1 10 @@ -173,7 +166,7 @@ PAGE "Prospetto versamenti" -1 -1 50 12 STRING 101 20 BEGIN PROMPT 1 1 "Mese " - FLAGS "D" + FLAGS "D" END DATE 102 @@ -233,11 +226,9 @@ BEGIN END -NUMBER 106 15 0 +CURRENCY 106 15 0 BEGIN PROMPT 1 6 "Versamenti " - FLAGS "R" - PICTURE "." END /* diff --git a/cg/cg5500c.uml b/cg/cg5500c.uml index f937b1cb8..6935ebbc3 100755 --- a/cg/cg5500c.uml +++ b/cg/cg5500c.uml @@ -46,11 +46,9 @@ BEGIN FLAGS "D" END -NUMBER F_CREDPREC 15 +CURRENCY F_CREDPREC 15 BEGIN - PROMPT 1 4 "Credito inizio anno " - FLAGS "R" - PICTURE "." + PROMPT 1 4 "Credito inizio anno " END SPREADSHEET F_VISLIQ1 78 5 @@ -88,11 +86,10 @@ BEGIN END -NUMBER 102 15 0 +CURRENCY 102 15 BEGIN - PROMPT 1 2 "Risultato " - FLAGS "DR" - PICTURE "." + PROMPT 1 2 "Risultato " + FLAGS "D" END LIST 103 1 10 @@ -104,18 +101,14 @@ BEGIN FLAGS "DU" END -NUMBER 104 15 +CURRENCY 104 15 BEGIN - PROMPT 1 4 "IVA a rimborso " - FLAGS "R" - PICTURE "." + PROMPT 1 4 "IVA a rimborso " END -NUMBER 105 15 +CURRENCY 105 15 BEGIN - PROMPT 1 5 "Rettifiche " - FLAGS "R" - PICTURE "." + PROMPT 1 5 "Rettifiche " END LIST 106 1 10 @@ -205,11 +198,9 @@ BEGIN END -NUMBER 106 15 0 +CURRENCY 106 15 BEGIN - PROMPT 1 6 "Versamenti " - FLAGS "R" - PICTURE "." + PROMPT 1 6 "Versamenti " END /* diff --git a/cg/cg5500d.uml b/cg/cg5500d.uml index f754f9093..668c164f0 100755 --- a/cg/cg5500d.uml +++ b/cg/cg5500d.uml @@ -43,22 +43,20 @@ END /* gruppo 1: edit rimborso */ -NUMBER F_RIMBORSO 15 0 +CURRENCY F_RIMBORSO 15 BEGIN PROMPT 3 17 "Rimborso infrannuale: " GROUP 1 - FLAGS "HR" - PICTURE "." + FLAGS "H" END /* gruppo 2: edit rettifiche */ -NUMBER F_RETTIFICA 15 0 +CURRENCY F_RETTIFICA 15 BEGIN PROMPT 2 17 "Importo rettif. " GROUP 2 - FLAGS "HR" - PICTURE "." + FLAGS "H" END LIST F_DEBCRE 7 @@ -81,17 +79,17 @@ STRING F_DESCR2 60 BEGIN PROMPT 2 19 " " GROUP 2 - FLAGS "H" + FLAGS "H" END /* gruppo 3: edit acconto */ -NUMBER F_ACCONTO 15 0 + +CURRENCY F_ACCONTO 15 BEGIN PROMPT 3 17 "Acconto versato: " GROUP 3 - FLAGS "HR" - PICTURE "." + FLAGS "R" END /* gruppo 4: edit delega */ @@ -103,12 +101,11 @@ BEGIN FLAGS "H" END -NUMBER F_DELIMP 15 0 +CURRENCY F_DELIMP 15 BEGIN PROMPT 26 17 "Importo versato " GROUP 4 - PICTURE "." - FLAGS "HR" + FLAGS "R" END NUMBER F_DELABI 5 diff --git a/cg/cg6800b.uml b/cg/cg6800b.uml index df6d68f70..a565752c2 100755 --- a/cg/cg6800b.uml +++ b/cg/cg6800b.uml @@ -29,7 +29,7 @@ NUMBER F_NUMREG 6 BEGIN PROMPT 1 1 "Numero registrazione " HELP "Inserire il numero di registrazione che si vuole modificare" - FLAGS "RZ" + FLAGS "Z" CHECKTYPE REQUIRED END @@ -37,7 +37,7 @@ NUMBER F_NUMRIG 2 BEGIN PROMPT 38 1 "Numero di riga " HELP "Inserire il numero della riga desiderata. Se non viene specificata si entra in modifica della testata" - FLAGS "RZ" + FLAGS "Z" END DATE F_DATAREG @@ -81,13 +81,11 @@ END NUMBER F_PROTIVA 5 BEGIN PROMPT 1 7 "Numero protocollo iva " - FLAGS "R" END NUMBER F_NUPROTIVA 5 BEGIN PROMPT 40 7 "Ultimo protoc. riepilog. " - FLAGS "R" END STRING F_CODCAUS 3 @@ -125,19 +123,16 @@ END NUMBER F_GRUPPO 3 BEGIN PROMPT 1 11 "Sottoconto partita " - FLAGS "R" END NUMBER F_CONTO 3 BEGIN PROMPT 29 11 "" - FLAGS "R" END NUMBER F_SOTTOCONTO 6 BEGIN PROMPT 34 11 "" - FLAGS "R" END STRING F_DESCRPARTITA 50 @@ -159,29 +154,24 @@ BEGIN PROMPT 1 14 "Descrizione aggiuntiva " END -NUMBER F_IMPORTO 15 +CURRENCY F_IMPORTO 15 BEGIN PROMPT 1 15 "Importo " - FLAGS "R" - PICTURE "." END NUMBER F_GRUPPOC 3 BEGIN PROMPT 1 16 "Sottoconto contropart. " - FLAGS "R" END NUMBER F_CONTOC 3 BEGIN PROMPT 29 16 "" - FLAGS "R" END NUMBER F_SOTTOC 6 BEGIN PROMPT 34 16 "" - FLAGS "R" END STRING F_DESCRCPARTITA 50 diff --git a/cg/cg6800c.uml b/cg/cg6800c.uml index 11f10705d..59a54ace8 100755 --- a/cg/cg6800c.uml +++ b/cg/cg6800c.uml @@ -1,203 +1,199 @@ -#include "cg6800.h" - -TOOLBAR "" 0 20 0 2 - -BUTTON DLG_SAVEREC 10 2 -BEGIN -PROMPT -15 -1 "~Registra" -MESSAGE EXIT,K_SAVE -PICTURE BMP_SAVEREC -END - -BUTTON DLG_CANCEL 10 2 -BEGIN -PROMPT -45 -1 "" -MESSAGE EXIT,K_ESC -END - -BUTTON DLG_QUIT 10 2 -BEGIN -PROMPT -55 -1 "" -MESSAGE EXIT,K_QUIT -END - -ENDPAGE - -PAGE "" -1 -1 78 18 - -NUMBER F_NUMREG 6 -BEGIN - PROMPT 1 1 "Numero registrazione " - HELP "Inserire il numero di registrazione che si vuole modificare" - FLAGS "RZ" - CHECKTYPE REQUIRED -END - -NUMBER F_NUMRIG 2 -BEGIN - PROMPT 52 1 "Numero di riga " - HELP "Inserire il numero della riga desiderata. Se non viene specificata si entra in modifica della testata" - FLAGS "RZ" -END - -NUMBER F_CODCF 6 -BEGIN - PROMPT 1 3 "Codice C/F " - FLAGS "R" -END - -STRING F_RAGSOCCF 50 -BEGIN - PROMPT 26 3 "" - FLAGS "D" -END - -DATE F_DATA74TER -BEGIN - PROMPT 1 4 "Data reg. 74TER " -END - -LIST F_MESELIQ 2 10 -BEGIN - PROMPT 1 5 "Mese liquidazione " - FLAGS "M" - ITEM " |Nessuno" -END - -LIST F_PROVV 1 16 -BEGIN - PROMPT 36 4 "Movimento provvisorio " - ITEM " |No (Definitivo)" - ITEM "C|Cespiti" - ITEM "P|Contabile" -END - -GROUPBOX DLG_NULL 78 5 -BEGIN - PROMPT 0 6 "Cliente occasionale" -END - -STRING F_CFPI 16 -BEGIN - PROMPT 1 1 "" - FLAGS "HG" -END - -STRING F_RAGSOCOCC 25 -BEGIN - PROMPT 1 7 "Ragione sociale " -END - -STRING F_INDOCC 22 -BEGIN - PROMPT 1 8 "Indirizzo " -END - -STRING F_CIVOCC 6 -BEGIN - PROMPT 41 8 "" -END - -STRING F_LOCALITA 18 -BEGIN - PROMPT 1 9 "Localita' " -END - -STRING F_CAPOCC 5 -BEGIN - PROMPT 46 9 "C.A.P. " -END - -STRING F_PROVOCC 2 -BEGIN - PROMPT 62 9 "Provincia " -END - -STRING F_COMOCC 4 -BEGIN - PROMPT 1 10 "" - FLAGS "HG" -END - -NUMBER F_IMPONIBILE 15 -BEGIN - PROMPT 1 11 "Imponibile " - FLAGS "R" - PICTURE "." -END - -STRING F_CODIVA 4 -BEGIN - PROMPT 1 12 "Codice IVA " - FLAGS "U" -END - -STRING F_DESCRCODIVA 50 46 -BEGIN - PROMPT 30 12 "" - FLAGS "D" -END - -NUMBER F_IMPOSTA 15 -BEGIN - PROMPT 1 13 "Imposta " - FLAGS "R" - PICTURE "." -END - -NUMBER F_TIPODET 1 -BEGIN - PROMPT 1 14 "Tipo detraibilita' " - SHEET "Codice|Tipo detraibilita'@75" - INPUT F_TIPODET - ITEM " |Regime normale" - ITEM "1|IVA indetraibile su acquisti riferiti a ricavi esenti" - ITEM "3|IVA indicata per passaggi interni al solo fine del calcolo di ventilazione" - ITEM "9|IVA non detraibile per l'articolo 19" - OUTPUT F_TIPODET -END - -NUMBER F_TIPOCR 1 -BEGIN - PROMPT 1 15 "Tipo Costo/Ricavo " - SHEET "Codice|Tipo costo ricavo@50" - INPUT F_TIPOCR - ITEM " |0. Acquisti o vendite in genere" - ITEM "1|1. Acquisti beni per rivendita" - ITEM "2|2. Acquisti beni ammortizzabili" - ITEM "3|3. Acquisti beni ammortizzabili con detr. 6%" - ITEM "4|4. Vendita beni strumentali art. 17" - ITEM "5|5. Beni per rivendita da non ventilare" - ITEM "8|8. Altri beni strumentali acquistati in leasing" - ITEM "9|9. Spese generali" - HELP "Tipo Costo/Ricavo del conto" - OUTPUT F_TIPOCR -END - -NUMBER F_GRUPPO 3 -BEGIN - PROMPT 1 16 "Sottoconto costo/ricavo " - FLAGS "R" -END - -NUMBER F_CONTO 3 -BEGIN - PROMPT 30 16 "" - FLAGS "R" -END - -NUMBER F_SOTTOCONTO 6 -BEGIN - PROMPT 35 16 "" - FLAGS "R" -END - -STRING F_DESCRPARTITA 50 -BEGIN - PROMPT 1 17 "Descrizione sottoconto " - FLAGS "D" -END - -ENDPAGE - -ENDMASK +#include "cg6800.h" + +TOOLBAR "" 0 20 0 2 + +BUTTON DLG_SAVEREC 10 2 +BEGIN +PROMPT -15 -1 "~Registra" +MESSAGE EXIT,K_SAVE +PICTURE BMP_SAVEREC +END + +BUTTON DLG_CANCEL 10 2 +BEGIN +PROMPT -45 -1 "" +MESSAGE EXIT,K_ESC +END + +BUTTON DLG_QUIT 10 2 +BEGIN +PROMPT -55 -1 "" +MESSAGE EXIT,K_QUIT +END + +ENDPAGE + +PAGE "" -1 -1 78 18 + +NUMBER F_NUMREG 6 +BEGIN + PROMPT 1 1 "Numero registrazione " + HELP "Inserire il numero di registrazione che si vuole modificare" + FLAGS "RZ" + CHECKTYPE REQUIRED +END + +NUMBER F_NUMRIG 2 +BEGIN + PROMPT 52 1 "Numero di riga " + HELP "Inserire il numero della riga desiderata. Se non viene specificata si entra in modifica della testata" + FLAGS "RZ" +END + +NUMBER F_CODCF 6 +BEGIN + PROMPT 1 3 "Codice C/F " + FLAGS "R" +END + +STRING F_RAGSOCCF 50 +BEGIN + PROMPT 26 3 "" + FLAGS "D" +END + +DATE F_DATA74TER +BEGIN + PROMPT 1 4 "Data reg. 74TER " +END + +LIST F_MESELIQ 2 10 +BEGIN + PROMPT 1 5 "Mese liquidazione " + FLAGS "M" + ITEM " |Nessuno" +END + +LIST F_PROVV 1 16 +BEGIN + PROMPT 36 4 "Movimento provvisorio " + ITEM " |No (Definitivo)" + ITEM "C|Cespiti" + ITEM "P|Contabile" +END + +GROUPBOX DLG_NULL 78 5 +BEGIN + PROMPT 0 6 "Cliente occasionale" +END + +STRING F_CFPI 16 +BEGIN + PROMPT 1 1 "" + FLAGS "HG" +END + +STRING F_RAGSOCOCC 25 +BEGIN + PROMPT 1 7 "Ragione sociale " +END + +STRING F_INDOCC 22 +BEGIN + PROMPT 1 8 "Indirizzo " +END + +STRING F_CIVOCC 6 +BEGIN + PROMPT 41 8 "" +END + +STRING F_LOCALITA 18 +BEGIN + PROMPT 1 9 "Localita' " +END + +STRING F_CAPOCC 5 +BEGIN + PROMPT 46 9 "C.A.P. " +END + +STRING F_PROVOCC 2 +BEGIN + PROMPT 62 9 "Provincia " +END + +STRING F_COMOCC 4 +BEGIN + PROMPT 1 10 "" + FLAGS "HG" +END + +CURRENCY F_IMPONIBILE 15 +BEGIN + PROMPT 1 11 "Imponibile " +END + +STRING F_CODIVA 4 +BEGIN + PROMPT 1 12 "Codice IVA " + FLAGS "U" +END + +STRING F_DESCRCODIVA 50 46 +BEGIN + PROMPT 30 12 "" + FLAGS "D" +END + +CURRENCY F_IMPOSTA 15 +BEGIN + PROMPT 1 13 "Imposta " +END + +NUMBER F_TIPODET 1 +BEGIN + PROMPT 1 14 "Tipo detraibilita' " + SHEET "Codice|Tipo detraibilita'@75" + INPUT F_TIPODET + ITEM " |Regime normale" + ITEM "1|IVA indetraibile su acquisti riferiti a ricavi esenti" + ITEM "3|IVA indicata per passaggi interni al solo fine del calcolo di ventilazione" + ITEM "9|IVA non detraibile per l'articolo 19" + OUTPUT F_TIPODET +END + +NUMBER F_TIPOCR 1 +BEGIN + PROMPT 1 15 "Tipo Costo/Ricavo " + SHEET "Codice|Tipo costo ricavo@50" + INPUT F_TIPOCR + ITEM " |0. Acquisti o vendite in genere" + ITEM "1|1. Acquisti beni per rivendita" + ITEM "2|2. Acquisti beni ammortizzabili" + ITEM "3|3. Acquisti beni ammortizzabili con detr. 6%" + ITEM "4|4. Vendita beni strumentali art. 17" + ITEM "5|5. Beni per rivendita da non ventilare" + ITEM "8|8. Altri beni strumentali acquistati in leasing" + ITEM "9|9. Spese generali" + HELP "Tipo Costo/Ricavo del conto" + OUTPUT F_TIPOCR +END + +NUMBER F_GRUPPO 3 +BEGIN + PROMPT 1 16 "Sottoconto costo/ricavo " + FLAGS "R" +END + +NUMBER F_CONTO 3 +BEGIN + PROMPT 30 16 "" + FLAGS "R" +END + +NUMBER F_SOTTOCONTO 6 +BEGIN + PROMPT 35 16 "" + FLAGS "R" +END + +STRING F_DESCRPARTITA 50 +BEGIN + PROMPT 1 17 "Descrizione sottoconto " + FLAGS "D" +END + +ENDPAGE + +ENDMASK diff --git a/cg/cg6804c.uml b/cg/cg6804c.uml index 509cde3b6..73289eed7 100755 --- a/cg/cg6804c.uml +++ b/cg/cg6804c.uml @@ -1,4 +1,3 @@ - TOOLBAR "" 0 20 0 2 BUTTON DLG_OK 8 2 diff --git a/cg/cg6804f.uml b/cg/cg6804f.uml index f8851f8bc..6391c9bc7 100755 --- a/cg/cg6804f.uml +++ b/cg/cg6804f.uml @@ -1,225 +1,224 @@ -TOOLBAR "" 0 20 0 2 - -BUTTON DLG_OK 8 2 -BEGIN - PROMPT -13 -1 "~Conferma" - MESSAGE EXIT,K_SAVE - PICTURE BMP_SAVEREC -END - -BUTTON DLG_DELREC 8 2 -BEGIN - PROMPT -23 -1 "~Elimina" - MESSAGE EXIT,K_DEL -END - -BUTTON DLG_CANCEL 8 2 -BEGIN - PROMPT -33 -1 "" - MESSAGE EXIT,K_ESC -END - -ENDPAGE - -PAGE "Variazione Movimenti Saldaconto" -1 -1 78 18 - -LIST 101 1 12 -BEGIN - PROMPT 1 1 "Tipo conto " - ITEM " |Conto" - ITEM "C|Cliente" - ITEM "F|Fornitore" - FLAGS "DG" -END - -NUMBER 102 3 -BEGIN - PROMPT 30 1 "Gruppo " - FLAGS "D" -END - -NUMBER 103 3 -BEGIN - PROMPT 43 1 "Conto " - FLAGS "D" -END - -NUMBER 104 6 -BEGIN - PROMPT 56 1 "Sottoconto " - FLAGS "DG" -END - -STRING 105 50 -BEGIN - PROMPT 1 2 "Descrizione " - FLAGS "D" -END - -TEXT DLG_NULL -BEGIN - PROMPT 1 3 "@bRiferimento partita " - FLAGS "D" -END - -NUMBER 106 4 -BEGIN - PROMPT 1 4 "Anno " - FLAGS "D" -END - -STRING 107 7 -BEGIN - PROMPT 22 4 "Numero " - FLAGS "UD" -END - -NUMBER 108 4 -BEGIN - PROMPT 40 4 "N.ro riga " - FLAGS "D" -END - -NUMBER 109 4 -BEGIN - PROMPT 59 4 "N.ro rata " - FLAGS "D" -END - -DATE 110 -BEGIN - PROMPT 1 6 "Data scadenza " -END - -STRING 111 4 -BEGIN - PROMPT 1 7 "Cod.pagamento " - USE %CPG - INPUT CODTAB 111 - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT 111 CODTAB - CHECKTYPE NORMAL - FLAGS "U" - ADD RUN ba3 -6 -END - -NUMBER 112 1 -BEGIN - PROMPT 27 7 "Tipo pagamento " -END - -STRING 113 1 -BEGIN - PROMPT 48 7 "Ulteriore classificazione " - FLAGS "U" -END - -STRING 114 50 -BEGIN - PROMPT 1 8 "Descrizione " - FLAGS "D" -END - -STRING 115 1 -BEGIN - PROMPT 1 9 "Importo " - FLAGS "D" -END - -NUMBER 116 15 -BEGIN - PROMPT 18 9 "" - PICTURE "." -END - -NUMBER 117 15 -BEGIN - PROMPT 40 9 "Importo in valuta " - PICTURE ".3" -END - -STRING 118 50 -BEGIN - PROMPT 1 10 "Descrizione " -END - -NUMBER 119 5 -BEGIN - PROMPT 1 11 "Codice ns. banca " - USE %BAN KEY 1 SELECT CODTAB ?= "?????" - INPUT CODTAB 119 - DISPLAY "Cod. ABI" CODTAB[1,5] - DISPLAY "Denominazione@50" S0 - OUTPUT 119 CODTAB[1,5] - CHECKTYPE NORMAL - FLAGS "Z" -END - -NUMBER 120 5 -BEGIN - PROMPT 26 11 "" - USE %BAN - INPUT CODTAB[1,5] 119 - INPUT CODTAB[6,10] 120 - DISPLAY "Cod. ABI" CODTAB[1,5] - DISPLAY "Cod. CAB" CODTAB[6,10] - DISPLAY "Denominazione@50" S0 - OUTPUT 119 CODTAB[1,5] - OUTPUT 120 CODTAB[6,10] - CHECKTYPE NORMAL - FLAGS "Z" -END - -NUMBER 121 5 -BEGIN - PROMPT 1 12 "Codice vs. banca " - USE %BAN KEY 1 SELECT CODTAB ?= "?????" - INPUT CODTAB 121 - DISPLAY "Cod. ABI" CODTAB[1,5] - DISPLAY "Cod. CAB" CODTAB[6,10] - DISPLAY "Denominazione@50" S0 - OUTPUT 121 CODTAB[1,5] - CHECKTYPE NORMAL - FLAGS "Z" -END - -NUMBER 122 5 -BEGIN - PROMPT 26 12 "" - USE %BAN - INPUT CODTAB[1,5] 121 - INPUT CODTAB[6,10] 122 - DISPLAY "Cod. ABI" CODTAB[1,5] - DISPLAY "Cod. CAB" CODTAB[6,10] - DISPLAY "Denominazione@50" S0 - OUTPUT 121 CODTAB[1,5] - OUTPUT 122 CODTAB[6,10] - CHECKTYPE NORMAL - FLAGS "Z" -END - -STRING 123 5 -BEGIN - PROMPT 1 13 "Codice agente " - USE AGE - INPUT CODTAB 123 - DISPLAY "Codice" CODTAB - DISPLAY "Denominazione@50" S0 - OUTPUT 123 CODTAB - FLAGS "U" - CHECKTYPE NORMAL -END - -DATE 124 -BEGIN - PROMPT 1 14 "Data sollecito " -END - -NUMBER 125 2 -BEGIN - PROMPT 53 14 "Numero sollecito " -END - -ENDPAGE - +TOOLBAR "" 0 20 0 2 + +BUTTON DLG_OK 8 2 +BEGIN + PROMPT -13 -1 "~Conferma" + MESSAGE EXIT,K_SAVE + PICTURE BMP_SAVEREC +END + +BUTTON DLG_DELREC 8 2 +BEGIN + PROMPT -23 -1 "~Elimina" + MESSAGE EXIT,K_DEL +END + +BUTTON DLG_CANCEL 8 2 +BEGIN + PROMPT -33 -1 "" + MESSAGE EXIT,K_ESC +END + +ENDPAGE + +PAGE "Variazione Movimenti Saldaconto" -1 -1 78 18 + +LIST 101 1 12 +BEGIN + PROMPT 1 1 "Tipo conto " + ITEM " |Conto" + ITEM "C|Cliente" + ITEM "F|Fornitore" + FLAGS "DG" +END + +NUMBER 102 3 +BEGIN + PROMPT 30 1 "Gruppo " + FLAGS "D" +END + +NUMBER 103 3 +BEGIN + PROMPT 43 1 "Conto " + FLAGS "D" +END + +NUMBER 104 6 +BEGIN + PROMPT 56 1 "Sottoconto " + FLAGS "DG" +END + +STRING 105 50 +BEGIN + PROMPT 1 2 "Descrizione " + FLAGS "D" +END + +TEXT DLG_NULL +BEGIN + PROMPT 1 3 "@bRiferimento partita " + FLAGS "D" +END + +NUMBER 106 4 +BEGIN + PROMPT 1 4 "Anno " + FLAGS "D" +END + +STRING 107 7 +BEGIN + PROMPT 22 4 "Numero " + FLAGS "UD" +END + +NUMBER 108 4 +BEGIN + PROMPT 40 4 "N.ro riga " + FLAGS "D" +END + +NUMBER 109 4 +BEGIN + PROMPT 59 4 "N.ro rata " + FLAGS "D" +END + +DATE 110 +BEGIN + PROMPT 1 6 "Data scadenza " +END + +STRING 111 4 +BEGIN + PROMPT 1 7 "Cod.pagamento " + USE %CPG + INPUT CODTAB 111 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT 111 CODTAB + CHECKTYPE NORMAL + FLAGS "U" + ADD RUN ba3 -6 +END + +NUMBER 112 1 +BEGIN + PROMPT 27 7 "Tipo pagamento " +END + +STRING 113 1 +BEGIN + PROMPT 48 7 "Ulteriore classificazione " + FLAGS "U" +END + +STRING 114 50 +BEGIN + PROMPT 1 8 "Descrizione " + FLAGS "D" +END + +STRING 115 1 +BEGIN + PROMPT 1 9 "Importo " + FLAGS "D" +END + +CURRENCY 116 15 +BEGIN + PROMPT 18 9 "" +END + +NUMBER 117 15 3 +BEGIN + PROMPT 40 9 "Importo in valuta " + PICTURE ".3" +END + +STRING 118 50 +BEGIN + PROMPT 1 10 "Descrizione " +END + +NUMBER 119 5 +BEGIN + PROMPT 1 11 "Codice ns. banca " + USE %BAN KEY 1 SELECT CODTAB ?= "?????" + INPUT CODTAB 119 + DISPLAY "Cod. ABI" CODTAB[1,5] + DISPLAY "Denominazione@50" S0 + OUTPUT 119 CODTAB[1,5] + CHECKTYPE NORMAL + FLAGS "Z" +END + +NUMBER 120 5 +BEGIN + PROMPT 26 11 "" + USE %BAN + INPUT CODTAB[1,5] 119 + INPUT CODTAB[6,10] 120 + DISPLAY "Cod. ABI" CODTAB[1,5] + DISPLAY "Cod. CAB" CODTAB[6,10] + DISPLAY "Denominazione@50" S0 + OUTPUT 119 CODTAB[1,5] + OUTPUT 120 CODTAB[6,10] + CHECKTYPE NORMAL + FLAGS "Z" +END + +NUMBER 121 5 +BEGIN + PROMPT 1 12 "Codice vs. banca " + USE %BAN KEY 1 SELECT CODTAB ?= "?????" + INPUT CODTAB 121 + DISPLAY "Cod. ABI" CODTAB[1,5] + DISPLAY "Cod. CAB" CODTAB[6,10] + DISPLAY "Denominazione@50" S0 + OUTPUT 121 CODTAB[1,5] + CHECKTYPE NORMAL + FLAGS "Z" +END + +NUMBER 122 5 +BEGIN + PROMPT 26 12 "" + USE %BAN + INPUT CODTAB[1,5] 121 + INPUT CODTAB[6,10] 122 + DISPLAY "Cod. ABI" CODTAB[1,5] + DISPLAY "Cod. CAB" CODTAB[6,10] + DISPLAY "Denominazione@50" S0 + OUTPUT 121 CODTAB[1,5] + OUTPUT 122 CODTAB[6,10] + CHECKTYPE NORMAL + FLAGS "Z" +END + +STRING 123 5 +BEGIN + PROMPT 1 13 "Codice agente " + USE AGE + INPUT CODTAB 123 + DISPLAY "Codice" CODTAB + DISPLAY "Denominazione@50" S0 + OUTPUT 123 CODTAB + FLAGS "U" + CHECKTYPE NORMAL +END + +DATE 124 +BEGIN + PROMPT 1 14 "Data sollecito " +END + +NUMBER 125 2 +BEGIN + PROMPT 53 14 "Numero sollecito " +END + +ENDPAGE + diff --git a/cg/cg6804g.uml b/cg/cg6804g.uml index 2640a7ce1..b9b0cc085 100755 --- a/cg/cg6804g.uml +++ b/cg/cg6804g.uml @@ -1,271 +1,267 @@ -TOOLBAR "" 0 20 0 2 - -BUTTON DLG_OK 8 2 -BEGIN - PROMPT -13 -1 "~Conferma" - MESSAGE EXIT,K_SAVE -END - -BUTTON DLG_DELREC 8 2 -BEGIN - PROMPT -23 -1 "~Elimina" - MESSAGE EXIT,K_DEL -END - -BUTTON DLG_CANCEL 8 2 -BEGIN - PROMPT -33 -1 "" - MESSAGE EXIT,K_ESC -END - -ENDPAGE - -PAGE "Variazione Movimenti Saldaconto" -1 -1 78 20 - -LIST 101 1 12 -BEGIN - PROMPT 1 1 "Tipo conto " - ITEM " |Conto" - ITEM "C|Cliente" - ITEM "F|Fornitore" - FLAGS "DG" -END - -NUMBER 102 3 -BEGIN - PROMPT 30 1 "Gruppo " - FLAGS "D" -END - -NUMBER 103 3 -BEGIN - PROMPT 43 1 "Conto " - FLAGS "D" -END - -NUMBER 104 6 -BEGIN - PROMPT 56 1 "Sottoconto " - FLAGS "DG" -END - -STRING 105 50 -BEGIN - PROMPT 1 2 "Descrizione " - FLAGS "D" -END - -TEXT DLG_NULL -BEGIN - PROMPT 1 3 "@bRiferimento partita " - FLAGS "D" -END - -NUMBER 106 4 -BEGIN - PROMPT 1 4 "Anno " - FLAGS "D" -END - -STRING 107 7 -BEGIN - PROMPT 28 4 "Numero " - FLAGS "UD" -END - -NUMBER 110 4 -BEGIN - PROMPT 56 4 "Numero riga " - FLAGS "D" -END - -NUMBER 109 4 -BEGIN - PROMPT 1 5 "Numero rata fatt. " - FLAGS "D" -END - -NUMBER 108 4 -BEGIN - PROMPT 53 5 "Numero riga fatt. " - FLAGS "D" -END - -STRING 111 1 -BEGIN - PROMPT 1 7 "Acconto/Saldo " - FLAGS "U" -END - -STRING 112 1 -BEGIN - PROMPT 1 8 "Importo pagato " - FLAGS "D" -END - -NUMBER 113 15 -BEGIN - PROMPT 20 8 "" - PICTURE "." -END - -STRING 114 1 -BEGIN - PROMPT 1 9 "Ritenute prof. " - FLAGS "D" -END - -NUMBER 115 15 -BEGIN - PROMPT 20 9 "" - PICTURE "." -END - -STRING 116 1 -BEGIN - PROMPT 1 10 "Abbuoni " - FLAGS "U" -END - -NUMBER 117 15 -BEGIN - PROMPT 20 10 "" - PICTURE "." -END - -STRING 118 1 -BEGIN - PROMPT 1 11 "Diff. cambio " - FLAGS "U" -END - -NUMBER 119 15 -BEGIN - PROMPT 20 11 "" - PICTURE "." -END - -NUMBER 120 15 -BEGIN - PROMPT 41 8 "Importo in valuta " - PICTURE ".3" -END - -LIST 121 1 12 -BEGIN - PROMPT 1 30 "" - ITEM " |Conto" - ITEM "C|Cliente" - ITEM "F|Fornitore" - FLAGS "D" -END - -NUMBER 122 3 -BEGIN - PROMPT 1 12 "Cod.contropartita " -END - -NUMBER 123 3 -BEGIN - PROMPT 27 12 "" -END - -NUMBER 124 6 -BEGIN - PROMPT 34 12 "" - USE LF_PCON - INPUT GRUPPO 122 - INPUT CONTO 123 - INPUT SOTTOCONTO 124 - DISPLAY "Gruppo" GRUPPO - DISPLAY "Conto" CONTO - DISPLAY "Sottoconto" SOTTOCONTO - DISPLAY "Descrizione@50" DESCR - OUTPUT 122 GRUPPO - OUTPUT 123 CONTO - OUTPUT 124 SOTTOCONTO - OUTPUT 125 DESCR - CHECKTYPE NORMAL -END - -STRING 125 50 -BEGIN - PROMPT 1 13 "Descrizione " - FLAGS "D" -END - -NUMBER 126 5 -BEGIN - PROMPT 1 14 "Codice ns. banca " - USE %BAN KEY 1 SELECT CODTAB ?= "?????" - INPUT CODTAB 126 - DISPLAY "Cod. ABI" CODTAB[1,5] - DISPLAY "Denominazione@50" S0 - OUTPUT 126 CODTAB[1,5] - CHECKTYPE NORMAL - FLAGS "Z" -END - -NUMBER 127 5 -BEGIN - PROMPT 28 14 "" - USE %BAN - INPUT CODTAB[1,5] 126 - INPUT CODTAB[6,10] 127 - DISPLAY "Cod. ABI" CODTAB[1,5] - DISPLAY "Cod. CAB" CODTAB[6,10] - DISPLAY "Denominazione@50" S0 - OUTPUT 126 CODTAB[1,5] - OUTPUT 127 CODTAB[6,10] - CHECKTYPE NORMAL - FLAGS "Z" -END - -NUMBER 128 5 -BEGIN - PROMPT 1 15 "Codice vs. banca " - USE %BAN KEY 1 SELECT CODTAB ?= "?????" - INPUT CODTAB 128 - DISPLAY "Cod. ABI" CODTAB[1,5] - DISPLAY "Cod. CAB" CODTAB[6,10] - DISPLAY "Denominazione@50" S0 - OUTPUT 128 CODTAB[1,5] - CHECKTYPE NORMAL - FLAGS "Z" -END - -NUMBER 129 5 -BEGIN - PROMPT 28 15 "" - USE %BAN - INPUT CODTAB[1,5] 128 - INPUT CODTAB[6,10] 129 - DISPLAY "Cod. ABI" CODTAB[1,5] - DISPLAY "Cod. CAB" CODTAB[6,10] - DISPLAY "Denominazione@50" S0 - OUTPUT 128 CODTAB[1,5] - OUTPUT 129 CODTAB[6,10] - CHECKTYPE NORMAL - FLAGS "Z" -END - -STRING 130 5 -BEGIN - PROMPT 1 16 "Codice agente " - USE AGE - INPUT CODTAB 130 - DISPLAY "Codice" CODTAB - DISPLAY "Denominazione@50" S0 - OUTPUT 130 CODTAB - FLAGS "U" - CHECKTYPE NORMAL -END - -STRING 131 1 -BEGIN - PROMPT 41 10 "Attivo / Passivo " - FLAGS "UD" -END - -ENDPAGE - +TOOLBAR "" 0 20 0 2 + +BUTTON DLG_OK 8 2 +BEGIN + PROMPT -13 -1 "~Conferma" + MESSAGE EXIT,K_SAVE +END + +BUTTON DLG_DELREC 8 2 +BEGIN + PROMPT -23 -1 "~Elimina" + MESSAGE EXIT,K_DEL +END + +BUTTON DLG_CANCEL 8 2 +BEGIN + PROMPT -33 -1 "" + MESSAGE EXIT,K_ESC +END + +ENDPAGE + +PAGE "Variazione Movimenti Saldaconto" -1 -1 78 20 + +LIST 101 1 12 +BEGIN + PROMPT 1 1 "Tipo conto " + ITEM " |Conto" + ITEM "C|Cliente" + ITEM "F|Fornitore" + FLAGS "DG" +END + +NUMBER 102 3 +BEGIN + PROMPT 30 1 "Gruppo " + FLAGS "D" +END + +NUMBER 103 3 +BEGIN + PROMPT 43 1 "Conto " + FLAGS "D" +END + +NUMBER 104 6 +BEGIN + PROMPT 56 1 "Sottoconto " + FLAGS "DG" +END + +STRING 105 50 +BEGIN + PROMPT 1 2 "Descrizione " + FLAGS "D" +END + +TEXT DLG_NULL +BEGIN + PROMPT 1 3 "@bRiferimento partita " + FLAGS "D" +END + +NUMBER 106 4 +BEGIN + PROMPT 1 4 "Anno " + FLAGS "D" +END + +STRING 107 7 +BEGIN + PROMPT 28 4 "Numero " + FLAGS "UD" +END + +NUMBER 110 4 +BEGIN + PROMPT 56 4 "Numero riga " + FLAGS "D" +END + +NUMBER 109 4 +BEGIN + PROMPT 1 5 "Numero rata fatt. " + FLAGS "D" +END + +NUMBER 108 4 +BEGIN + PROMPT 53 5 "Numero riga fatt. " + FLAGS "D" +END + +STRING 111 1 +BEGIN + PROMPT 1 7 "Acconto/Saldo " + FLAGS "U" +END + +STRING 112 1 +BEGIN + PROMPT 1 8 "Importo pagato " + FLAGS "D" +END + +CURRENCY 113 15 +BEGIN + PROMPT 20 8 "" +END + +STRING 114 1 +BEGIN + PROMPT 1 9 "Ritenute prof. " + FLAGS "D" +END + +CURRENCY 115 15 +BEGIN + PROMPT 20 9 "" +END + +STRING 116 1 +BEGIN + PROMPT 1 10 "Abbuoni " + FLAGS "U" +END + +CURRENCY 117 15 +BEGIN + PROMPT 20 10 "" +END + +STRING 118 1 +BEGIN + PROMPT 1 11 "Diff. cambio " + FLAGS "U" +END + +CURRENCY 119 15 +BEGIN + PROMPT 20 11 "" +END + +NUMBER 120 15 +BEGIN + PROMPT 41 8 "Importo in valuta " + PICTURE ".3" +END + +LIST 121 1 12 +BEGIN + PROMPT 1 30 "" + ITEM " |Conto" + ITEM "C|Cliente" + ITEM "F|Fornitore" + FLAGS "D" +END + +NUMBER 122 3 +BEGIN + PROMPT 1 12 "Cod.contropartita " +END + +NUMBER 123 3 +BEGIN + PROMPT 27 12 "" +END + +NUMBER 124 6 +BEGIN + PROMPT 34 12 "" + USE LF_PCON + INPUT GRUPPO 122 + INPUT CONTO 123 + INPUT SOTTOCONTO 124 + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + DISPLAY "Descrizione@50" DESCR + OUTPUT 122 GRUPPO + OUTPUT 123 CONTO + OUTPUT 124 SOTTOCONTO + OUTPUT 125 DESCR + CHECKTYPE NORMAL +END + +STRING 125 50 +BEGIN + PROMPT 1 13 "Descrizione " + FLAGS "D" +END + +NUMBER 126 5 +BEGIN + PROMPT 1 14 "Codice ns. banca " + USE %BAN KEY 1 SELECT CODTAB ?= "?????" + INPUT CODTAB 126 + DISPLAY "Cod. ABI" CODTAB[1,5] + DISPLAY "Denominazione@50" S0 + OUTPUT 126 CODTAB[1,5] + CHECKTYPE NORMAL + FLAGS "Z" +END + +NUMBER 127 5 +BEGIN + PROMPT 28 14 "" + USE %BAN + INPUT CODTAB[1,5] 126 + INPUT CODTAB[6,10] 127 + DISPLAY "Cod. ABI" CODTAB[1,5] + DISPLAY "Cod. CAB" CODTAB[6,10] + DISPLAY "Denominazione@50" S0 + OUTPUT 126 CODTAB[1,5] + OUTPUT 127 CODTAB[6,10] + CHECKTYPE NORMAL + FLAGS "Z" +END + +NUMBER 128 5 +BEGIN + PROMPT 1 15 "Codice vs. banca " + USE %BAN KEY 1 SELECT CODTAB ?= "?????" + INPUT CODTAB 128 + DISPLAY "Cod. ABI" CODTAB[1,5] + DISPLAY "Cod. CAB" CODTAB[6,10] + DISPLAY "Denominazione@50" S0 + OUTPUT 128 CODTAB[1,5] + CHECKTYPE NORMAL + FLAGS "Z" +END + +NUMBER 129 5 +BEGIN + PROMPT 28 15 "" + USE %BAN + INPUT CODTAB[1,5] 128 + INPUT CODTAB[6,10] 129 + DISPLAY "Cod. ABI" CODTAB[1,5] + DISPLAY "Cod. CAB" CODTAB[6,10] + DISPLAY "Denominazione@50" S0 + OUTPUT 128 CODTAB[1,5] + OUTPUT 129 CODTAB[6,10] + CHECKTYPE NORMAL + FLAGS "Z" +END + +STRING 130 5 +BEGIN + PROMPT 1 16 "Codice agente " + USE AGE + INPUT CODTAB 130 + DISPLAY "Codice" CODTAB + DISPLAY "Denominazione@50" S0 + OUTPUT 130 CODTAB + FLAGS "U" + CHECKTYPE NORMAL +END + +STRING 131 1 +BEGIN + PROMPT 41 10 "Attivo / Passivo " + FLAGS "UD" +END + +ENDPAGE + diff --git a/cg/cgarea.men b/cg/cgarea.men index d031c42ee..83d24aa2a 100755 --- a/cg/cgarea.men +++ b/cg/cgarea.men @@ -9,3 +9,5 @@ Item_05 = "Gestione percipienti", <77prassi.men> Item_06 = "Contabilita analitica", Item_07 = "Bilanci e Analisi", Item_08 = "Dichiarazione IVA", "miva -t", "" +Item_09 = "Elenchi INTRA comunitari", + diff --git a/cg/cglib01.cpp b/cg/cglib01.cpp index 4d48e06ee..0c341c1c1 100755 --- a/cg/cglib01.cpp +++ b/cg/cglib01.cpp @@ -1,7 +1,10 @@ // Esercizi contabili e registri IVA +#include #include #include +#include +#include #include #include @@ -110,6 +113,16 @@ int TEsercizi_contabili::last() const return items() ? esc(items()-1).codice() : 0; } +int TEsercizi_contabili::last_mag() const +{ + int es=last()-1; + while (es>0 && !esercizio(es).chiusura_mag()) + es--; + es++; + return es; +} + + int TEsercizi_contabili::pred(int codice) const { const int i = esc2index(codice); @@ -324,7 +337,9 @@ real* TRegistro::read_prorata(int anno) const real TRegistro::prorata(int annodoc) { const int annoiva = year(); - const int annopro = (annoiva < 1998 || annodoc < 1900) ? annoiva : annodoc; +// const int annopro = (annoiva < 1998 || annodoc < 1900) ? annoiva : annodoc; + if (annodoc <= 1900) annodoc = annoiva; // Test per anno documento non specificato + const int annopro = annoiva >= 1998 && annodoc < annoiva ? annodoc+1 : annoiva; TString16 chiave; chiave << annopro; real* pr = (real*)_prorata.objptr(chiave); @@ -451,12 +466,50 @@ bool TCodiceIVA::read(const char* cod) real TCodiceIVA::scorpora(real& imponibile) const { const real percent = percentuale(); - real imposta = abs(imponibile) * percent / (percent + 100.0); imposta.ceil(); + + real imposta = abs(imponibile) * percent / (percent + 100.0); +// imposta.ceil(); + imposta.ceil(TCurrency::get_firm_dec()); + if (imponibile.sign() < 0) imposta = -imposta; imponibile -= imposta; return imposta; } +bool handler_data_cambio(TMask_field& f, KEY k) +{ + if (k == K_TAB && f.focusdirty()) + { + CHECK(f.is_edit(), "Campo non editabile come data cambio"); + TEdit_field& e = (TEdit_field&)f; + TBrowse& b = *e.browse(); + const TRectype& rec = b.cursor()->curr(); + const TString16 codval = rec.get("CODTAB").left(3); + const TString& firmval = TCurrency::get_firm_val(); + real cambio = rec.get("R10"); + if (codval.not_empty() && codval != firmval && cambio > ZERO) + { + TDecoder val("%val", "R10"); + const real base = val.decode(firmval); + if (base > ZERO && base != 1.0) + { + TToken_string out_fields = b.get_output_fields(); + for (short dlg = short(out_fields.get_int(0)); dlg; dlg = short(out_fields.get_int())) + { + TMask_field& of = f.mask().field(dlg); + if (of.class_id() == CLASS_REAL_FIELD) + { + cambio /= base; + of.set(cambio.string()); + break; + } + } + } + } + } + return TRUE; +} + /////////////////////////////////////////////////////////// // TBill /////////////////////////////////////////////////////////// @@ -474,7 +527,7 @@ void TBill::set_description(const char* d) if (_descrizione) *_descrizione = d; else - _descrizione = new TString(d); + _descrizione = new TString80(d); } } @@ -484,7 +537,7 @@ const TBill& TBill::get(TToken_string& s, int from, int mode) const char* first = s.get(from); if (mode & 0x1) { - _tipo = first ? toupper(*first) : ' '; + _tipo = first ? char(toupper(*first)) : ' '; first = s.get(); } else _tipo = ' '; @@ -525,7 +578,7 @@ const TBill& TBill::copy(const TBill& bill) // Certified 100% const TBill& TBill::set(int g, int c, long s, char t, const char* d, int r) { - _tipo = (t > ' ') ? toupper(t) : ' '; + _tipo = (t > ' ') ? char(toupper(t)) : ' '; _gruppo = g; _conto = c; _sottoconto = s; @@ -679,7 +732,7 @@ bool TBill::find() _sottoconto = 0L; ok = read(pcon); if (ok) - _tipo = toupper(pcon.get_char(PCN_TMCF)); + _tipo = char(toupper(pcon.get_char(PCN_TMCF))); _sottoconto = sotto; } } @@ -774,7 +827,8 @@ const TString& TBill::descrizione() const myself.set_description("Sconosciuto"); } if (_descrizione == NULL) - myself._descrizione = new TString; +// myself._descrizione = new TString; + return EMPTY_STRING; return *_descrizione; } diff --git a/cg/cglib01.h b/cg/cglib01.h index 727036d2c..2df882e41 100755 --- a/cg/cglib01.h +++ b/cg/cglib01.h @@ -57,6 +57,7 @@ public: int next(int codice) const; int first() const; int last() const; + int last_mag() const; bool exist(int codice) const; TEsercizi_contabili(); @@ -75,6 +76,9 @@ enum TipoIVA const char* iva2name(TipoIVA i); +class TMask_field; +bool handler_data_cambio(TMask_field& f, KEY k); + class TRegistro : public TObject { bool read_att(); diff --git a/cg/cglib02.h b/cg/cglib02.h index edd792577..f59b60840 100755 --- a/cg/cglib02.h +++ b/cg/cglib02.h @@ -128,7 +128,7 @@ public: // bool prg_mov_eliminati(int i,TConto& c,int d, real& p1, real& p2); TSaldo(); - virtual ~TSaldo() { } + virtual ~TSaldo() {} }; diff --git a/cg/cglib03.h b/cg/cglib03.h index 59965bd1b..9b0f0e239 100755 --- a/cg/cglib03.h +++ b/cg/cglib03.h @@ -7,14 +7,6 @@ #include #endif -#ifndef __REAL_H -#include -#endif - -#ifndef __STRINGS_H -#include -#endif - // Defines per TInteressi_IVA_table. Servono per comporre i nomi dei campi #define P_1_TRIMESTRE 0 @@ -33,14 +25,12 @@ class TInteressi_IVA_table : public TTable { -// TTable *_ver; - public: int read(int anno, int mese); //int status() { return _ver->status();} real get(int what); TInteressi_IVA_table(); - ~TInteressi_IVA_table(); + virtual ~TInteressi_IVA_table(); }; struct TDociva : public TObject @@ -49,8 +39,9 @@ struct TDociva : public TObject real _totdociva; int _ndoc; - TDociva(const char* _descrdociva, const real& _importo,const int _natdoc):_descrdoc(_descrdociva),_totdociva(_importo),_ndoc(_natdoc) - {} + TDociva(const char* _descrdociva, const real& _importo,const int _natdoc) + :_descrdoc(_descrdociva),_totdociva(_importo),_ndoc(_natdoc) { } + virtual ~TDociva() { } }; class TDociva_array : public TArray diff --git a/cg/cgp1200.cpp b/cg/cgp1200.cpp index e296b3d3e..a21e617d4 100755 --- a/cg/cgp1200.cpp +++ b/cg/cgp1200.cpp @@ -62,6 +62,7 @@ class TCGPSaldo long _cdc; TDecoder _causali_apertura; + TExternisamfile* _mvcs; public: bool significativo() const { return _significativo; } @@ -71,10 +72,10 @@ public: const real& saldo() const { return _saldo;} const real& saldoini() const { return _saldo_iniziale;} const bool flagprec() { return _prec; } - TCGPSaldo(bool m, long c); + TCGPSaldo(bool m, long c, TExternisamfile* mc); }; -TCGPSaldo::TCGPSaldo(bool m, long c) : _movcas(m), _cdc(c), +TCGPSaldo::TCGPSaldo(bool m, long c, TExternisamfile* mc) : _movcas(m), _cdc(c), _mvcs(mc), _causali_apertura(LF_CAUSALI, CAU_MOVAP), _saldo_iniziale(ZERO), _saldo(ZERO), _annoes(0), _prec(FALSE), _movimentato(FALSE), _significativo(FALSE) {} @@ -83,9 +84,9 @@ TCGPSaldo::TCGPSaldo(bool m, long c) : _movcas(m), _cdc(c), bool TCGPSaldo::data_limite_bilancio(int bilancio, int g, int c, long s, const TDate& data_inf, const TDate& data_sup, int indbil, int stp_prov) { - TExternisamfile movcas("$movcas"); +// TExternisamfile movcas("$movcas"); TLocalisamfile xmov(LF_RMOV); - TLocalisamfile& rmov = _movcas ? (TLocalisamfile&)movcas : xmov; + TLocalisamfile& rmov = _movcas ? (TLocalisamfile&)(*_mvcs) : xmov; TLocalisamfile mov(LF_MOV); _saldo_iniziale = ZERO; @@ -252,6 +253,7 @@ class TStampaBilanciCDC_application : public TPrintapp TSaldi_list* _listacf, * _lista; TArray_sheet *_cdc_sheet; TLocalisamfile* _com, * _pcn, * _mov, * _rmov, * _clifo, * _saldi, * _nditte,* _anag,* _caus; + TExternisamfile* _mvcs; TIsamtempfile * _tmp_saldi_att, * _tmp_saldi_pass, * _tmp_saldi_conti_uno; TIsamtempfile * _tmp_saldi_costi, * _tmp_saldi_ricavi,* _tmp_saldi_conti_due; TTable* _esc, *_cdc_table; @@ -1098,7 +1100,7 @@ void TStampaBilanciCDC_application::next_c() bool TStampaBilanciCDC_application::bil_sez_contr() { - TCGPSaldo sld(_movcas_print, _cdc_cod); + TCGPSaldo sld(_movcas_print, _cdc_cod, _mvcs); int indbil_conto=0; int g, c; long s; @@ -1364,7 +1366,7 @@ bool TStampaBilanciCDC_application::bil_sez_contr() bool TStampaBilanciCDC_application::ricerca_sottoc_clifo(int g,int c, bool compensa, int indbil_conto,real& saldo) { - TCGPSaldo sld(_movcas_print, _cdc_cod); + TCGPSaldo sld(_movcas_print, _cdc_cod, _mvcs); int aep=0; long s, items; bool esiste_sc = FALSE; @@ -1960,9 +1962,10 @@ bool TStampaBilanciCDC_application::calcola(int g, int c, long s) long num_reg; TDate data_reg, data, datacomp; bool conto_mov = FALSE; - TExternisamfile movcas("$movcas"); + //TExternisamfile movcas("$movcas"); + TLocalisamfile xmov(LF_RMOV); - TLocalisamfile& rmov = _movcas_print ? (TLocalisamfile&)movcas : xmov; + TLocalisamfile& rmov = _movcas_print ? (TLocalisamfile&)(*_mvcs) : xmov; TLocalisamfile mov(LF_MOV); TDecoder causali(LF_CAUSALI, CAU_MOVAP); @@ -4050,7 +4053,8 @@ bool TStampaBilanciCDC_application::user_create() _tmp_saldi_costi = NULL; _tmp_saldi_ricavi = NULL; _tmp_saldi_conti_uno = NULL; - _tmp_saldi_conti_due = NULL; + _tmp_saldi_conti_due = NULL; + _mvcs = new TExternisamfile("$movcas"); return TRUE; } @@ -4079,6 +4083,7 @@ bool TStampaBilanciCDC_application::user_destroy() if (_tmp_saldi_ricavi) delete _tmp_saldi_ricavi; if (_tmp_saldi_conti_uno) delete _tmp_saldi_conti_uno; if (_tmp_saldi_conti_due) delete _tmp_saldi_conti_due; + if (_mvcs) delete _mvcs; return TRUE; } diff --git a/cg/cgp3.men b/cg/cgp3.men new file mode 100755 index 000000000..da38ae1c3 --- /dev/null +++ b/cg/cgp3.men @@ -0,0 +1,7 @@ +[PRASSICGP_001] +Caption = "Personalizzazioni" +Picture = +Module = 7 +Flags = "F" +Item_01 = "Stampa Mastrini per Conti", "cgp3 -0", "" + diff --git a/cg/cgpagame.cpp b/cg/cgpagame.cpp index 605936836..1b1ba84e4 100755 --- a/cg/cgpagame.cpp +++ b/cg/cgpagame.cpp @@ -1,11 +1,12 @@ +#include #include +#include #include -#include -#include #include "cgpagame.h" #include "cg2100.h" +#include #include #include #include @@ -110,7 +111,7 @@ void TPagamento::set_mese_commerciale(bool v, int& sscad) void TPagamento::set_rate_differenziate(int v) { _dirty = FALSE; - if (_rdiff ^ v == 2) return; + if ((int(_rdiff) ^ v) == 2) return; if (v == 2 && (100 % n_rate()) == 0) { @@ -709,8 +710,7 @@ word TPagamento::validate() const tot = 0.0; for (int i = 0; i < n_rate(); i++) { - const real tpay(tval_rata(i)); - + const real tpay = tval_rata(i); if (tpay.is_zero()) res |= P_ZEROVAL; tot += tpay; @@ -721,7 +721,8 @@ word TPagamento::validate() const real tmax = importo_da_dividere(TRUE) + importo_da_non_dividere(TRUE); tmax.round(_roundval); - if (tot != tmax) res |= P_TOTNCVAL; + if (tot != tmax) + res |= P_TOTNCVAL; } // check errori date scadenze (se istanziate) @@ -818,31 +819,33 @@ const char* TPagamento::desc_tipo(int tipo, char ulc, bool* ok) const if (ok != NULL) *ok = TRUE; if (ulc > ' ') { - const char key[] = { tipo+'0', toupper(ulc), '\0' }; + const char key[3] = { tipo+'0', toupper(ulc), '\0' }; +/* TTable clr("%CLR"); clr.put("CODTAB", key); - const int err = clr.read(); if (err == NOERR) - o = clr.get("S0"); + o = clr.get("S0"); // Bravo merlo: e' locale! else if (ok != NULL) *ok = FALSE; +*/ + o = cache().get("%CLR", key).get("S0"); } if (*o == '\0') { switch (tipo) { - case 0: o = "Altro pagamento"; break; - case 1: o = "Rimessa diretta o contanti"; break; - case 2: o = "Tratta"; break; - case 3: o = "Ricevuta Bancaria"; break; - case 4: o = "Cessione"; break; - case 5: o = "Paghero'"; break; - case 6: o = "Lettera di credito"; break; - case 7: o = "Tratta accettata"; break; - case 8: o = "Rapporti interban. diretti"; break; - case 9: o = "Bonifici"; break; - default: o = ""; if (ok != NULL) *ok = FALSE; break; + case 0: o = "Altro pagamento"; break; + case 1: o = "Rimessa diretta o contanti"; break; + case 2: o = "Tratta"; break; + case 3: o = "Ricevuta Bancaria"; break; + case 4: o = "Cessione"; break; + case 5: o = "Paghero'"; break; + case 6: o = "Lettera di credito"; break; + case 7: o = "Tratta accettata"; break; + case 8: o = "Rapporti interban. diretti"; break; + case 9: o = "Bonifici"; break; + default: if (ok != NULL) *ok = FALSE; break; } } return o; @@ -1685,12 +1688,13 @@ void TPagamento::set_total(const real& ib, const real& im, const real& sp) _cambio = 1.0; _firstr = _secndr = ZERO; // Azzera importi in valuta - init_total(ib, im, sp, FALSE); // setta regolarmente totali in lire + init_total(ib, im, sp, NULL); // setta regolarmente totali in lire } void TPagamento::set_total_valuta(const real& ib, const real& im, const real& sp, const real& c, - const real& ibl, const real& iml, const real& spl) -{ + const real& ibl, const real& iml, const real& spl, const char* codval) +{ + CHECKS(codval && *codval && TCurrency::get_firm_val() != codval, "Valuta non valida ", codval); const bool era_valuta = _in_valuta; _in_valuta = TRUE; @@ -1699,16 +1703,25 @@ void TPagamento::set_total_valuta(const real& ib, const real& im, const real& _cambio = real(1.0); // setta regolarmente totali in lire - init_total(ibl, iml, spl, FALSE); + init_total(ibl, iml, spl, NULL); // ripeti tutto con la valuta - init_total(ib, im, sp, TRUE); + init_total(ib, im, sp, codval); if (!era_valuta && _in_valuta) adjust_perc_imp(TRUE, _rdiff, TRUE); } -void TPagamento::init_total(const real& ib, const real& im, const real& sp, bool valuta) -{ +void TPagamento::init_total(const real& ib, const real& im, const real& sp, const char* codval) +{ + const bool valuta = (codval != NULL) && *codval && TCurrency::get_firm_val() != codval; + if (valuta) + { + const TCurrency cur(ZERO, codval); + _roundval = cur.decimals(); + } + else + _roundlit = TCurrency::get_firm_dec(); + const int round = valuta ? _roundval : _roundlit; real& ibp = valuta ? _imponval : _imponlit; real& imp = valuta ? _imposval : _imposlit; @@ -1877,6 +1890,75 @@ void TPagamento::adjust_fixed_scad() TToken_string& tt = rata(i); tt.add(d.string(), 3); } + + adjust_refused_scad(); +} + +void TPagamento::adjust_refused_scad() +{ + if (_codcf <= 0L) + return; + + CHECK(_tipocf == 'C' || _tipocf == 'F', "Bad tipocf in pagament"); + + TString16 codice; + codice << _tipocf << '|' << _codcf; + const TRectype& clifo = cache().get(LF_CFVEN, codice); + + TToken_string nonacceff(clifo.get(CFV_NONACCEFF), ';'); + if (nonacceff.empty_items()) + return; + + TToken_string intervallo(12, ','); + TToken_string dalgiorno(5, '-'), algiorno(5, '-'); + for (int i = 0; i < n_rate(); i++) + { + const TDate d = data_rata(i); + int inter = 0; + for (bool good = nonacceff.get(inter, intervallo); + good; good = nonacceff.get(++inter, intervallo)) + { + intervallo.get(0, dalgiorno); + int gio = dalgiorno.get_int(0); + int mes = dalgiorno.get_int(1); + if (mes <= 0 || mes > 12) mes = 1; + int ann = d.year(); + int max_gio = TDate::last_day(mes, ann); + if (gio <= 0) gio = 1; else + if (gio > max_gio) gio = max_gio; + + const TDate frd(gio, mes, ann); + if (d < frd) + continue; + + intervallo.get(1, algiorno); + gio = algiorno.get_int(0); + mes = algiorno.get_int(1); + if (mes <= 0 || mes > 12) mes = 1; + ann += (mes < frd.month()) ? 1 : 0; + max_gio = TDate::last_day(mes, ann); + if (gio <= 0 || gio > max_gio) + gio = max_gio; + const TDate tod(gio, mes, ann); + if (d > tod) + continue; + + intervallo = clifo.get(CFV_NONSCADEFF); + intervallo.get(inter, algiorno); + gio = algiorno.get_int(0); + mes = algiorno.get_int(1); + ann += (mes < tod.month()) ? 1 : 0; + if (mes <= 0 || mes > 12) mes = 1; + max_gio = TDate::last_day(mes, ann); + if (gio <= 0 || gio > max_gio) + gio = max_gio; + + const TDate nd(gio, mes, ann); + TToken_string& tt = rata(i); + tt.add(nd.string(), 3); + break; + } + } } TPagamento::TPagamento(const char* codtab, const char* data) : @@ -1884,7 +1966,8 @@ TPagamento::TPagamento(const char* codtab, const char* data) : _speselit(0.0), _cambio(1.0), _in_valuta(FALSE), _code(codtab), _dirty(FALSE), _inited(FALSE), _def_tpr(1), _def_ulc(""), _roundval(3), _int_rate(30), _tpr(0), _rdiff(FALSE), - _was_tpr4(FALSE), _roundlit(0), _imponval(0.0), _imposval(0.0), _speseval(0.0) + _was_tpr4(FALSE), _roundlit(0), _imponval(0.0), _imposval(0.0), _speseval(0.0), + _tipocf('C'), _codcf(0L) { _fixd[0] = _fixd[1] = _fixd[2] = 0; if (data != NULL && *data) diff --git a/cg/cgpagame.h b/cg/cgpagame.h index 98ab2839c..bf4ec9546 100755 --- a/cg/cgpagame.h +++ b/cg/cgpagame.h @@ -79,6 +79,9 @@ class TPagamento : public TObject bool _was_tpr4; bool _in_valuta; // in valuta o non + char _tipocf; + long _codcf; + protected: // gestione casino se si modificano importi o percentuali rate @@ -88,7 +91,7 @@ protected: word change_value_uguali_prossima(int rata, real value, bool is_perc, bool v); word change_value_uguali_possible(int rata, real value, bool is_perc, bool v); - void init_total(const real& ib, const real& im, const real& sp, bool valuta); + void init_total(const real& ib, const real& im, const real& sp, const char* codval); // aggiusta parametri diversi da importo se si sono aggiunte rate void adjust_parameters(bool mcomm); @@ -98,6 +101,8 @@ protected: void adjust_perc(int rdiff, bool v); // controlla il segno di un valore in base a _tpr e row bool sign_ok(const real& val, int row) const; + // Controlla i periodi di accettazione effetti del cliente + void adjust_refused_scad(); public: @@ -165,6 +170,8 @@ public: void set_inizio_scadenza(char v) { _inscad = v; } void set_code(const char* c) { _code = c; } void set_roundval(int n) { _roundval = n; } + + const TDate& get_inizio() const { return _inizio; } bool in_valuta() const { return _in_valuta; } const real& cambio() const { return _cambio; } @@ -213,7 +220,7 @@ public: // only one of these must be called void set_total(const real& ib, const real& im, const real& sp); void set_total_valuta(const real& ib, const real& im, const real& sp, const real& cambio, - const real& ibl, const real& iml, const real& spl); + const real& ibl, const real& iml, const real& spl, const char* codval); // istanzia uno sheet field come diobue comanda void set_sheet(TSheet_field& sf, int sscad = -1); @@ -232,6 +239,9 @@ public: bool was_tpr4() const { return _was_tpr4; } void set_tpr4(bool b) { _was_tpr4 = b; } + + void set_clifo(long codice, char tipo = 'C') + { _codcf = codice; _tipocf = tipo; } // se codtab non e' NULL legge da file (e da' errore se non c'e') // se si vuole fare un pagamento nuovo si da' il codice con set_code diff --git a/cg/cgsaldac.cpp b/cg/cgsaldac.cpp index 48757f1f3..8164c0cfd 100755 --- a/cg/cgsaldac.cpp +++ b/cg/cgsaldac.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -117,11 +118,17 @@ TValuta::TValuta(const char* cod, const TDate& dat, const real& cam) } TValuta::TValuta() : _cod(""), _dat(TODAY), _cam(1.0) -{} +{ + adjust(); +} void TValuta::adjust() { - if (_cod.empty() || _cod == "LIT") + const TCurrency firm_cur(ZERO, "_FIRM"); + _declit = _decval = firm_cur.decimals(); + + const TCurrency this_cur(ZERO, _cod); + if (this_cur.same_value_as(firm_cur)) { _cod.cut(0); _cam = 1.0; @@ -130,6 +137,8 @@ void TValuta::adjust() { if (_cam <= ZERO) _cam = 1.0; + _cod = this_cur.get_value(); + _decval = this_cur.decimals(); } } @@ -198,7 +207,7 @@ real TValuta::lit2val(const real& lit) const { real val(lit); val /= _cam; - val.round(3); + val.round(_decval); return val; } @@ -206,20 +215,20 @@ real TValuta::val2lit(const real& val) const { real lit(val); lit *= _cam; - lit.round(); + lit.round(_declit); return lit; } void TValuta::val2lit(real& val) const { val *= _cam; - val.round(); + val.round(_declit); } void TValuta::lit2val(real& lit) const { lit /= _cam; - lit.round(3); + lit.round(_decval); } void TValuta::val2lit(TImporto& imp) const @@ -268,6 +277,12 @@ bool TRiga_scadenze::in_valuta() const return riga().in_valuta(); } +// Controlla se la fattura della rata e' in valuta +const TString& TRiga_scadenze::codice_valuta() const +{ + return riga().codice_valuta(); +} + // Controlla se la rata e' stata completamente pagata bool TRiga_scadenze::chiusa(bool update) const { @@ -310,8 +325,11 @@ TImporto TRiga_scadenze::importo_pagato(bool val, int mode) const real abb(pag.get_real(PAGSCA_ABBUONI)); if (in_val && !val) // Gli abbuoni sono sempre in valuta e quindi { // devono essere convertiti opportunamente - abb *= sum.get_real(PART_CAMBIO); - abb.round(); +// abb *= sum.get_real(PART_CAMBIO); +// abb.round(); + TCurrency cur(abb, "_FIRM"); + cur *= sum.get_real(PART_CAMBIO); + abb = cur.get_num(); } totale += TImporto(sez, abb); } @@ -444,8 +462,11 @@ bool TRiga_scadenze::modifica_pagamento(const TRectype& new_pag, const TValuta& old_abb = old_abbuono; // Vecchio abbuono in lire if (in_val) { - old_abb.valore() *= sum.get_real(PART_CAMBIO); - old_abb.valore().round(); +// old_abb.valore() *= sum.get_real(PART_CAMBIO); +// old_abb.valore().round(); + TCurrency cur(old_abb.valore(), "_FIRM"); + cur *= sum.get_real(PART_CAMBIO); + old_abb.valore() = cur.get_num(); } old_diffcam = calcola_differenza_cambio(nrigp, FALSE); @@ -461,8 +482,11 @@ bool TRiga_scadenze::modifica_pagamento(const TRectype& new_pag, const TValuta& new_abb = new_abbuono; // Calcola nuovo abbuono in lire if (in_valuta()) { - new_abb.valore() *= sum.get_real(PART_CAMBIO); - new_abb.valore().round(); +// new_abb.valore() *= sum.get_real(PART_CAMBIO); +// new_abb.valore().round(); + TCurrency cur(new_abb.valore(), "_FIRM"); + cur *= sum.get_real(PART_CAMBIO); + new_abb.valore() = cur.get_num(); } new_diffcam = calcola_differenza_cambio(nrigp, update); @@ -687,6 +711,13 @@ int TRiga_partite::ultima_rata_con_abbuoni_diffcam() const return s; } +// Determina il codice valuta +const TString& TRiga_partite::codice_valuta() const +{ + const TString& cod = get(PART_CODVAL); + return cod; +} + // Determina se una riga e' in valuta in base al codice valuta bool TRiga_partite::in_valuta() const { @@ -731,9 +762,12 @@ TImporto TRiga_partite::importo(bool valuta, int mode) const TImporto abbuoni(get_char(PART_SEZABB), get_real(PART_ABBUONI)); if (!in_lire) // Converto in lire gli abbuoni che sono memorizzati in valuta { - const real cambio(get(PART_CAMBIO)); - abbuoni.valore() *= cambio; - abbuoni.valore().round(); +// const real cambio(get(PART_CAMBIO)); +// abbuoni.valore() *= cambio; +// abbuoni.valore().round(); + TCurrency cur(abbuoni.valore(), "_FIRM"); + cur *= get_real(PART_CAMBIO); + abbuoni.valore() = cur.get_num(); } i += abbuoni; } @@ -1210,10 +1244,15 @@ bool TPartita::esistono_abbuoni_diffcam(long nreg) const return nrata > 0; } +const TString& TPartita::codice_valuta() const +{ + const int ultima = last(); + return ultima > 0 ? riga(ultima).codice_valuta() : EMPTY_STRING; +} + bool TPartita::in_valuta() const { const int ultima = last(); - return ultima > 0 ? riga(ultima).in_valuta() : FALSE; } @@ -1568,8 +1607,11 @@ TImporto TPartita::importo_pagato_unassigned(bool val, int mode) const real abb(pag.get_real(PAGSCA_ABBUONI)); if (in_val && !val) // Gli abbuoni sono sempre in valuta e quindi { // devono essere convertiti opportunamente - abb *= sum.get_real(PART_CAMBIO); - abb.round(); +// abb *= sum.get_real(PART_CAMBIO); +// abb.round(); + TCurrency cur(abb, "_FIRM"); + cur *= sum.get_real(PART_CAMBIO); + abb = cur.get_num(); } totale += TImporto(sez, abb); } diff --git a/cg/cgsaldac.h b/cg/cgsaldac.h index 1218f269f..7d5dc9f87 100755 --- a/cg/cgsaldac.h +++ b/cg/cgsaldac.h @@ -36,7 +36,7 @@ protected: // TRectype virtual int rewrite(TBaseisamfile& f) const; virtual int remove(TBaseisamfile& f) const; virtual void renum_key(const char* field, const char* val); - + const TRecord_array& rows_array() const { return _recarr; } TRecord_array& rows_array() { return _recarr; } @@ -69,6 +69,7 @@ class TValuta : public TSortable TString16 _cod; TDate _dat; real _cam; + int _declit, _decval; protected: // TSortable virtual int compare(const TSortable& s) const; @@ -134,6 +135,7 @@ protected: // TRecord_tree public: bool chiusa(bool update = FALSE) const; + const TString& codice_valuta() const; bool in_valuta() const; TPartita& partita() const; @@ -186,6 +188,7 @@ public: TImporto importo(bool valuta, int mode = 0xF) const; TImporto esposto(bool valuta, const TDate & data_scad, const TDate & data_rischio, bool & sbf) const; + const TString& codice_valuta() const; bool in_valuta() const; bool update(const TRectype& vec, const TRectype& nuo, const char* field); @@ -234,6 +237,8 @@ public: bool rata_chiusa(int nriga, int nrata) const; bool esiste(int nriga, int nrata = 0, int nrigp = 0) const; bool esistono_abbuoni_diffcam(long nreg = 0) const; + + const TString& codice_valuta() const; bool in_valuta() const ; // assegna riga e figli ad altra partita diff --git a/cg/f17.dir b/cg/f17.dir index d8b92e62f..d9b9f0bc5 100755 --- a/cg/f17.dir +++ b/cg/f17.dir @@ -1,3 +1,3 @@ 17 0 -$cfven|51|51|323|0|Clienti/Fornitori per vendite||| +$cfven|0|0|399|0|Clienti/Fornitori per vendite||| diff --git a/cg/f17.trr b/cg/f17.trr index 21bd44a4f..8935bb407 100755 --- a/cg/f17.trr +++ b/cg/f17.trr @@ -1,5 +1,5 @@ 17 -61 +69 TIPOCF|1|1|0|Tipo liente, ornitore CODCF|3|6|0|Codice CODINDDOC|2|3|0|Codice indirizzo documenti @@ -17,9 +17,9 @@ CODNOTESP1|1|2|0|Note documento 1 CODNOTESP2|1|2|0|Note documento 2 CODSPMEZZO|1|2|0|Spedizione a mezzo CODPORTO|1|3|0|Porto -CODVETT1|1|5|0|Vettore 1 -CODVETT2|1|5|0|Vettore 2 -CODVETT3|1|5|0|Vettore 3 +CODVETT1|1|6|0|Vettore 1 +CODVETT2|1|6|0|Vettore 2 +CODVETT3|1|6|0|Vettore 3 RAGGDOC|8|1|0|Raggruppa i documenti del cliente/fornitore CODCFASS|3|6|0|Codice cliente (fornitori) o fornitore (clienti) associato ASSFIS|1|4|0|Assoggettamento fiscale @@ -35,8 +35,8 @@ CODINDEFF|2|3|0|Indirizzo effetti EMEFFRICH|8|1|0|Emissione effetti a richiesta RAGGEFF|8|1|0|Raggruppa gli effetti del cliente/fornitore IMPMINEFF|3|6|0|Importo minimo effetti -NONACCEFF|1|20|0|Periodo di non accettazione effetti -NONSCADEFF|1|20|0|Periodo di non accettazione scadenze effetti +NONACCEFF|1|50|0|Periodi di non accettazione effetti +NONSCADEFF|1|25|0|Scadenze effetti non accettati ADDBOLLI|8|1|0|Addebito bolli PERCSPINC|4|6|2|Percentuale spese incasso da addebitare IVARID|8|1|0|IVA ridotta @@ -52,8 +52,8 @@ CODSP3|1|8|0|Spese da addebitare 3 CODSP4|1|8|0|Spese da addebitare 4 PROFSOLL|1|5|0|Profilo sollecito ??? MAXSOLL|2|2|0|Massimo sollecito ??? -DATAESC|5|8|0|Data estratto conto ??? -DATASOLL|5|8|0|Data sollecito ??? +DATAESC|5|8|0|Data estratto conto +DATASOLL|5|8|0|Data sollecito SCONTO|1|25|0|Sconto (aa+bb-cc) TITOLO|1|2|0|Titolo onorifico RAGGOR|1|1|0|Raggruppamento ordini @@ -61,5 +61,13 @@ MINORD|4|18|3|Importo minimo ordini MAXORD|4|18|3|Importo massimo ordini PREVORD|2|2|0|Priorita' evasione ordini TIPOEVORD|1|2|0|Tipo priorita' evasione ordini +ADDCONAI|8|1|0|Addebito contributo CONAI in fattura +ESACC|4|6|2|Percentuale di esenzione CONAI acciaio +ESALL|4|6|2|Percentuale di esenzione CONAI alluminio +ESCAR|4|6|2|Percentuale di esenzione CONAI carta +ESPLA|4|6|2|Percentuale di esenzione CONAI plastica +ESLEG|4|6|2|Percentuale di esenzione CONAI legno +ESVET|4|6|2|Percentuale di esenzione CONAI vetro +CONAIASS|8|1|0|Stampa contributo CONAI assolto 1 TIPOCF+CODCF| diff --git a/cg/f20.dir b/cg/f20.dir index 3177e88b0..b413aed5e 100755 --- a/cg/f20.dir +++ b/cg/f20.dir @@ -1,3 +1,3 @@ 20 0 -$clifo|0|0|586|0|Clienti/Fornitori|NCF|| +$clifo|0|0|636|0|Clienti/Fornitori|NCF|| diff --git a/cg/f20.trr b/cg/f20.trr index 387b9592a..0accb1d54 100755 --- a/cg/f20.trr +++ b/cg/f20.trr @@ -1,5 +1,5 @@ 20 -50 +51 TIPOCF|1|1|0|Tipo ( liente ornitore CODCF|3|6|0|Codice RAGSOC|1|50|0|Ragione sociale @@ -50,6 +50,7 @@ RICALT|1|30|0|Sigla di ricerca alternativa OGGETTI|11|10|0|Link ad oggetti esterni SOSPESO|8|1|0|Anagrafica sospesa DIRTY|1|1|0|Anagrafica modificata +REFERENTE|1|50|0|Persona referente presso il cliente/fornitore 6 TIPOCF+CODCF| TIPOCF+UPPER(RAGSOC)|X diff --git a/db/dbcv.cpp b/db/dbcv.cpp new file mode 100755 index 000000000..5b3074df5 --- /dev/null +++ b/db/dbcv.cpp @@ -0,0 +1,19 @@ +#include + +#include "dbcv.h" + +int main(int argc, char** argv) +{ + int n = argc > 1 ? (argv[1][1] - '0') : 0; + switch(n) + { + case 0: + dbcv00(argc, argv); break; + case 1: + dbcv01(argc, argv); break; + default: + dbcv00(argc, argv); break; + } + exit(0); + return 0; +} \ No newline at end of file diff --git a/db/dbcv.h b/db/dbcv.h new file mode 100755 index 000000000..0bc9888fc --- /dev/null +++ b/db/dbcv.h @@ -0,0 +1,7 @@ +#ifndef __DBCV_H +#define __DBCV_H + +int dbcv00(int argc, char* argv[]); +int dbcv01(int argc, char* argv[]); + +#endif diff --git a/db/dbcv.url b/db/dbcv.url new file mode 100755 index 000000000..86c291703 --- /dev/null +++ b/db/dbcv.url @@ -0,0 +1,11 @@ +#define APPNAME EURO_DB +#define QAPPNAME "EURO_DB" +#define QFIRMNAME "A.G.A. Informatica Srl" + +#include + + +MENU TASK_MENUBAR + SUBMENU MENU_FILE "~File" + + diff --git a/db/dbcv00.cpp b/db/dbcv00.cpp new file mode 100755 index 000000000..5a32d8ddf --- /dev/null +++ b/db/dbcv00.cpp @@ -0,0 +1,1489 @@ +#include "dbcv.h" +#include "dbcv09.h" +#include +#include +#include +#include +#include +#include +#include +#include "..\mg\anamag.h" +#include "..\mg\mag.h" +#include "..\include\doc.h" +#include "..\include\rdoc.h" + +#define BPCS_ANAGRAFICA "iiml01" +#define BPCS_IMPORTEX "iimsl01" +#define BPCS_DISTINTE "mbml01" +#define BPCS_DIVISORI "cicl01" +#define BPCS_MOVMAG "ithl01" +#define BPCS_ORDACQ "acq_ord" +#define BPCS_FIRMORD "ord_cli" +#define BPCS_SHOPORDS "ord_prod" + + +class TTimed_skipbox: public TTimed_breakbox +{ +public: + TTimed_skipbox(const char * message,int seconds,int x=40,int y=10); + ~TTimed_skipbox(); +}; + +TTimed_skipbox:: TTimed_skipbox(const char * message,int seconds,int x,int y) + : TTimed_breakbox(message,seconds,x,y) +{ + hide(DLG_OK); + hide(DLG_CANCEL); + add_button(DLG_CANCEL, 0, "~Ignora", -22, -1, 12, 2,"",0); + add_button(DLG_OK, 0, "Im~porta", -12, -1, 12, 2,"",0); +} + +TTimed_skipbox::~TTimed_skipbox() +{} + + +class TImport_file : public TObject +{ + TExternisamfile *_f; + real _rbuffer; + TString _sbuffer; + TDate _dbuffer; +public: + void put(const char *field, const char * val); + TString & get(const char *field); + inline const long get_long(const char *field); + inline const real & get_real(const char *field); + inline const TDate & get_date(const char *field); + TString & get_codice(const char *field); + bool first(); + bool next(); + bool eof(); + long items(); + TImport_file(const char *path, const char * name); +}; + +TImport_file::TImport_file(const char *path, const char * name) +{ + TFilename fname(path); + fname.add(name); + _f = new TExternisamfile(fname, FALSE, TRUE); +} +void TImport_file::put(const char *field, const char * val) +{ + _f->put(field,val); +} +TString & TImport_file::get(const char *field) +{ + _sbuffer = _f->get(field); + return _sbuffer.trim(); +} +TString & TImport_file::get_codice(const char *field) +{ + _sbuffer = _f->get(field); + _sbuffer.trim(); + + return _sbuffer; +} +const real & TImport_file::get_real(const char *field) +{ + get(field).replace(',','.'); + _rbuffer=real(_sbuffer); + return _rbuffer; +} +const long TImport_file::get_long(const char *field) +{ + const long l= _f->get_long(field); + return l; +} +const TDate & TImport_file::get_date(const char *field) +{ + _dbuffer=_f->get_long(field); + return _dbuffer; +} + +bool TImport_file::first() +{ + return _f->first(); +} +bool TImport_file::next() +{ + return _f->next(); +} +bool TImport_file::eof() +{ + return _f->eof(); +} + +long TImport_file::items() +{ + return _f->items(); +} + + +class TSupport_file : public TObject +{ + TIsamtempfile * _f; + TRecord_cache *_cache; +public: + void zap(); + void put(const char * field, const char * value); + int read(TRectype & r); + int read() + {return read(_f->curr());} + int write(); + TSupport_file (int logicnum,const char * radix); + virtual ~TSupport_file (); +}; + +void TSupport_file::zap() +{ + int err; + for (long i=_f->items(); i>0; i--) + { + _f->readat(i); + err=_f->remove(); + } +} +int TSupport_file::read(TRectype & r) +{ + CHECK(r.num() == _f->num(),"TIpo record inconsistente"); + TString k(r.build_key(1)); + r = _cache->get(k); + if (r.empty()) + return _iskeynotfound; + return NOERR; +} +int TSupport_file::write() +{ + TString k(_f->curr().build_key(1)); + _cache->discard(k); + return _f->write(); +} + +void TSupport_file::put(const char * field, const char * value) +{ + _f->put(field,value); +} + +TSupport_file::TSupport_file (int logicnum,const char * radix) +{ + _f = new TIsamtempfile(logicnum,radix,FALSE,FALSE); + _cache= new TRecord_cache(_f); +} +TSupport_file::~TSupport_file() +{ + delete _f; + delete _cache; +} + +typedef void (*SET_DOC_FUN)(TImport_file & import,TConfig &trans); +typedef bool (*FILTER_FUN)(TImport_file & import); + +class TImporta_BPCS : public TSkeleton_application +{ + TLocalisamfile * _dist, *_rdist, * _anamag, *_umart, *_codcorr,*_mag; +private: + void delete_ghosts(); + void delete_boms(); + int read_last_rdist(const char *item_code); + bool read_is_dist(const char *item_code); + bool read_is_ghost(const char *item_code); + const char * read_first_um(const char *item_code); + bool creadocs(const char * msg, + long firm, TImport_file & imp_file, + const char *FieldNumDoc, const char *FieldClifor, const char *FieldDataDoc,const char *FieldGroup, + SET_DOC_FUN set_header, SET_DOC_FUN set_body, FILTER_FUN filter ); + + void clear_docs(const char * num); + void newums(); + bool force_write(TLocalisamfile & f); + +protected: + bool create(); + bool destroy(); + bool importa_boms(TMask &m); + bool cambia_gmc(TMask & m); + bool importa_arts(TMask &m, const bool sologhost=FALSE); + bool importa_ums_BP(TMask &m); + bool importa_ordacq(TMask & m); + bool importa_ordcli(TMask & m); + bool importa_ordprod(TMask & m); + bool importa_movmag(TMask & m, bool segrate=FALSE, bool trieste=FALSE); +protected: + virtual void main_loop() ; +}; + +bool TImporta_BPCS::create() +{ + _dist = new TLocalisamfile(LF_DIST); + _rdist = new TLocalisamfile(LF_RDIST); + _anamag = new TLocalisamfile(LF_ANAMAG); + _umart = new TLocalisamfile(LF_UMART); + _codcorr = new TLocalisamfile(LF_CODCORR); + _mag = new TLocalisamfile(LF_MAG); + return TSkeleton_application::create(); +} +bool TImporta_BPCS::destroy() +{ + delete _dist; + delete _rdist; + delete _anamag; + delete _umart; + delete _codcorr; + delete _mag; + return TSkeleton_application::destroy(); +} + +bool TImporta_BPCS::force_write(TLocalisamfile & f) +{ + int err=f.write(); + if (err != NOERR) // fallisce se c'e' gia' + err=f.rewrite(); + return err; +} + +int TImporta_BPCS::read_last_rdist(const char *item_code) +{ + static TString prevcode=""; + static int nrig=0; + if (prevcode!=item_code) + { + prevcode=item_code; + nrig=0; + _rdist->put("CODDIST",item_code); + int err=_rdist->read(_isgteq); + while (err==NOERR && _rdist->get("CODDIST")==item_code) + { + nrig++; + err=_rdist->next(); + } + } + return ++nrig; +} + +bool TImporta_BPCS::read_is_dist(const char *item_code) +{ + const TRectype & rec=cache().get(LF_DIST,item_code); + if (!rec.empty()) + return TRUE; + return FALSE; +} +bool TImporta_BPCS::read_is_ghost(const char *item_code) +{ + const TRectype & rec=cache().get(LF_DIST,item_code); + if (!rec.empty()) + return rec.get_bool("VIRTUALE") && !rec.get_bool("ARTPROD")&& !rec.get_bool("ARTACQ") ; + return FALSE; +} +const char * TImporta_BPCS::read_first_um(const char *item_code) +{ + TToken_string key(item_code); + key.add(1); + const TRectype & rec=cache().get(LF_UMART,key); + if (rec.empty()) + error_box("Impossibile trovare l'item %s",item_code); + return rec.get("UM"); +} +// cancella le distinte che non sono lavorazioni +void TImporta_BPCS ::delete_boms() +{ + TWait_cursor hourglass; + TIndwin info(60,"Cancellazione distinte...",FALSE,FALSE); + TTable lav("LAV"); + _dist->first(); + // distinte + while (!_dist->eof()) + { + do_events(); + lav.put("CODTAB",_dist->get("CODDIST")); + if (lav.read()!=NOERR) + { + // non e' una lavorazione + _dist->remove(); + } + _dist->next(); + } + // righe distinte + _rdist->first(); + while (!_rdist->eof()) + { + do_events(); + lav.put("CODTAB",_dist->get("CODDIST")); + if (1 + || _rdist->get("TIPO")!="L") + { + // non e' una lavorazione + _rdist->remove(); + } + _rdist->next(); + } +} + +// elimina i ghost "di servizio" +void TImporta_BPCS ::delete_ghosts() +{ + TWait_cursor hourglass; + TIndwin info(60,"Cancellazione distinte fantasma inutili...",FALSE,FALSE); + TLocalisamfile dist(LF_DIST); + _dist->first(); + while (!_dist->eof()) + { + do_events(); + if (_dist->get_bool("VIRTUALE") && !_dist->get_bool("ARTPROD")&& !_dist->get_bool("ARTACQ") )// fantasma + { + TString codice=_dist->get("CODDIST"); + if (codice.find("__") < 0) // non appartiene ad uno stabilimento particolare + _dist->remove(); + } + _dist->next(); + } +} + +bool TImporta_BPCS ::importa_boms(TMask &m) +{ + TWait_cursor hourglass; + cache().flush(LF_DIST); + cache().flush(LF_ANAMAG); + cache().flush(LF_UMART); + + TSupport_file morti(LF_DIST,ANAGRAFICA_MORTI); + TImport_file boms(m.get(F_PATH), BPCS_DISTINTE); + TProgind info(boms.items(),"Importazione distinte...",TRUE,TRUE); + TToken_string imported_lcode,dead_lcode,skipped_lcode,current_lcode; + TString old_code,item_code,last_code; + TString8 impianto,main_imp; + int bseq; + + boms.first(); + while (!boms.eof()) + { + info.addstatus(1); + if (info.iscancelled()) + return FALSE; + // converte ogni distinta ancora valida + old_code=(boms.get_codice("BPROD")); + impianto=(boms.get("BMWHS")); + int metodo(int(boms.get_long("BMBOMM"))); + current_lcode.add(old_code,0); + current_lcode.add(impianto,1); + current_lcode.add(metodo,2); + + const long ddis=boms.get_long("BDDIS"); + bool skip=!((ddis==99999999)||(ddis==999999)||(ddis==99999)||(ddis==9999999)); + if (imported_lcode==current_lcode) + skip = FALSE; + else if (skipped_lcode==current_lcode || dead_lcode==current_lcode) + skip = TRUE; + if (!skip) + { + morti.put("CODDIST",old_code); + if (morti.read()==NOERR) + { + skip=TRUE; + skipped_lcode=current_lcode; + } + } + if (!skip && atol(boms.get("BDEFF"))zero(); + _dist->put("CODDIST", old_code); + _dist->put("DESCR", descr); + _dist->put("VIRTUALE", " "); + _dist->put("ARTPROD", "X"); + _dist->put("UM", um_f); + TString varvar("VARIANTE="); + varvar << "\"" << old_code << "__\"+IF(_IMPIANTO!=\"\",IF(_IMPIANTO==\"XT\",_IMPIANTO,_LINEA),\"SE\")" ; + _dist->put("PARAMETRI",varvar); + int err=_dist->write(); + if (err!=_isreinsert) + { + _rdist->zero(); + _rdist->put("CODDIST", old_code); + _rdist->put("NRIG", 1 ); + _rdist->put("TIPO", "V" ); + _rdist->put("CODCOMP", "VARIANTE" ); + _rdist->put("UM", ""); + _rdist->put("EXPR", 1 ); + force_write(*_rdist); + } + } + } + // figlio + TString son_code=boms.get_codice("BCHLD"); + TString um_s=read_first_um(son_code) ; + const bool son_ghost=read_is_ghost(son_code); + if (son_ghost) + son_code << "__" << impianto ; + // scrivi la bom + if (last_code!=item_code && cache().get(LF_DIST,item_code).empty()) + { + descr << " (impianto " << impianto << ")"; + cache().discard(LF_DIST,item_code); + _dist->zero(); + _dist->put("CODDIST", item_code); + _dist->put("DESCR", descr); + _dist->put("VIRTUALE", "X" ); + _dist->put("ARTPROD", ""); + _dist->put("UM", "BP"); + TString varimp("_IMPIANTO="); + varimp << '"' << impianto << '"'; + _dist->put("PARAMETRI",varimp); + _dist->write(); // fallisce se esiste gia' + + _umart->zero(); + _umart->put("CODART",item_code); + _umart->put("NRIGA",1); + _umart->put("UM",um_f); + _umart->put("FC","1"); + force_write(*_umart); + + last_code=item_code; + bseq=0; + } + bseq++; + _rdist->zero(' '); + _rdist->put("CODDIST", item_code); + _rdist->put("NRIG", bseq); + _rdist->put("TIPO", son_ghost ? "D" : "A"); + _rdist->put("CODCOMP", son_code ); + _rdist->put("UM", um_s); + _rdist->put("EXPR", boms.get_real("BQREQ") ); + force_write(*_rdist); + + imported_lcode=current_lcode; + } + boms.next(); + } + delete_ghosts(); + return TRUE; +} + +void TImporta_BPCS ::newums() +{ + _dist->first(); + TString item_code,ghostcode; + while (!_dist->eof()) + { + if (_dist->get_bool("VIRTUALE") && !_dist->get_bool("ARTPROD")&& !_dist->get_bool("ARTACQ") )// fantasma + { + item_code=_dist->get("CODDIST"); + int pos=item_code.find("__"); + if (pos>=0) + { + ghostcode=item_code; + ghostcode.cut(pos); + _umart->zero(); + _umart->put("CODART",ghostcode); + _umart->put("NRIGA",1); + if (_umart->read()==NOERR) + { + _umart->put("CODART",item_code); + force_write(*_umart); + } + } + } + _dist->next(); + } +} + +// importa le ums dal file di anagrafica +bool TImporta_BPCS ::importa_arts(TMask & m, const bool sologhost) +{ + TWait_cursor hourglass; + cache().flush(LF_ANAMAG); + cache().flush(LF_DIST); + cache().flush(LF_UMART); + + TSupport_file morti(LF_DIST,ANAGRAFICA_MORTI); + TImport_file items_ext(m.get(F_PATH),BPCS_IMPORTEX); + TImport_file items(m.get(F_PATH),BPCS_ANAGRAFICA); + TString item_code,item_type,tmp; + bool skip; + TProgind info(items.items(),sologhost ? "Importazione distinte fantasma...":"Importazione articoli e distinte fantasma...",TRUE,TRUE); + items_ext.first(); + items.first(); + while (!items.eof()) + { + info.addstatus(1); + if (info.iscancelled()) + return FALSE; + item_type=items.get("IITYP"); + if (items.get("IID")=="IM" && atoi(item_type)!=6) + { + item_code=items.get_codice("IPROD"); + skip=FALSE; + // sincronizza il file dell'anagrafica Importex + while (!sologhost && items_ext.get_codice("MSITE")zero(); + _dist->put("CODDIST",item_code); + _dist->put("DESCR",items.get("IDESC")); + _dist->put("VIRTUALE", "X" ); + _dist->put("ARTPROD", " "); + force_write(*_dist); + } else { + _anamag->zero(); + _anamag->put( ANAMAG_CODART,item_code); + _anamag->put( ANAMAG_DESCR,items.get("IDESC")); + _anamag->put( ANAMAG_DESCRAGG,items.get("IDSCE")); + _anamag->put( ANAMAG_CODFORN, items.get("IVEND")); + _anamag->put( ANAMAG_UMP, "KG"); + _anamag->put( ANAMAG_PESO, items.get("IWGHT")); + // riordino + _anamag->put( ANAMAG_RIORDINO , "F"); //_anamag->put( ANAMAG_RIORDINO , items.get("IMRP")=="M" ? "F" : "P" ); + _anamag->put( ANAMAG_GIORNIRIOR, items.get("ILEAD")); + _anamag->put( ANAMAG_LOTTORIOR, items.get("ILOTS")); + _anamag->put( ANAMAG_LOTTOIRIOR, items.get("IIOQ")); + // + _anamag->put( ANAMAG_PPCONF , items.get("IFII")); + _anamag->put( ANAMAG_PPCOLLO , items.get("IFII")); + TString16 gmc=items.get("IITYP"); + switch (gmc[0]) + { + case 'F': + case 'E': + case 'Z': + case 'G': + gmc[0]= 'F'; break; + case 'M': + gmc[0]= 'S'; break; + case 'P': + gmc[0]= 'C'; break; + } + TString16 iclas(items.get("ICLAS")); + if (!iclas.blank()) + { + switch (m.get(F_ICLAS)[0]) + { + case 'S': + complete_gmc(gmc, iclas); + break; + case 'C': + gmc << iclas; + break; + case ' ': + break; + } + } + _anamag->put( ANAMAG_GRMERC,gmc); + _anamag->put( ANAMAG_COSTSTD, items.get("ISCST")); + _anamag->put( ANAMAG_ULTCOS1, items.get("IACST")); + tmp=items.get("TAXC1"); + if (tmp.left(3)=="IVA") + tmp=tmp.sub(3); + _anamag->put( ANAMAG_CODIVA , tmp); + if (items_ext.get_codice("MSITE")==items.get_codice("IPROD")) + { + _anamag->put( ANAMAG_CLASSDOG , check_clasdog(items_ext.get_long("MSTDO"))); + _anamag->put( ANAMAG_USER1 , items_ext.get("MSIDR"));// idrati + _anamag->put( ANAMAG_USER2 , items_ext.get("MSANI"));//anidri + _anamag->put( ANAMAG_USER3 , items_ext.get("MSTAL"));//alcool + // dimensioni + _anamag->put( ANAMAG_USER4, items_ext.get("MSPLU")); + _anamag->put( ANAMAG_USER5, items_ext.get("MSPAL")); + _anamag->put( ANAMAG_USER6, items_ext.get("MSPPR")); + // composizione pallets + _anamag->put( ANAMAG_USER7, items_ext.get("MSCST")); // casse per strato + _anamag->put( ANAMAG_USER8, items_ext.get("MSSTP")); // strati per pallet + } + force_write(*_anamag); + real smin(items.get("IMIN")); + if (smin!=ZERO) + { + _mag->zero(); + _mag->put(MAG_SCORTAMIN,smin); + _mag->put(MAG_ANNOES,"1999"); + _mag->put(MAG_CODART,item_code); + _mag->put(MAG_NRIGA,1); + _mag->put(MAG_CODMAG,"SE1"); + force_write(*_mag); + _mag->put(MAG_NRIGA,2); + _mag->put(MAG_CODMAG,"TS1"); + force_write(*_mag); + } + } + TString16 um,ums(items.get("IUMS")); + real fc; + int nriga=1; + for (int u=0; u<3; u++) + { + switch (u) + { + case 1: + um=items.get("IUMP"); + fc=items.get_real("IUMCN"); + break; + case 2: + um=items.get("IUMR"); + fc=items.get_real("IUMRC"); + break; + default: + um=ums; + fc=1.0; + } + if (!um.blank() && (u==0 || um!=ums)) + { + _umart->zero(); + _umart->put("CODART",item_code); + _umart->put("NRIGA",nriga); + _umart->put("UM",um); + if (nriga==1) + _umart->put("PREZZO",items.get("ILIST")); + _umart->put("FC",fc); + force_write(*_umart); + nriga++; + } + } // fine ciclo unita' di misura + long ean=items.get_long("IDRAW"); + if (!m.get(F_EAN).blank() && ean!=0L) + { + _codcorr->zero(); + _codcorr->put("CODARTALT",ean); + _codcorr->put("NRIGA",1); + _codcorr->put("TIPO",m.get(F_EAN)); + _codcorr->put("CODART",item_code); + force_write(*_codcorr); + } + } + } + items.next(); + } + return TRUE; +} + + +bool TImporta_BPCS ::cambia_gmc(TMask & m) +{ + TWait_cursor hourglass; + cache().flush(LF_ANAMAG); + cache().flush(LF_DIST); + cache().flush(LF_UMART); + + TImport_file items_ext(m.get(F_PATH),BPCS_IMPORTEX); + TImport_file items(m.get(F_PATH),BPCS_ANAGRAFICA); + TString item_code,item_type,tmp; + TProgind info(items.items(),"Importazione gruppi merceologici e classi doganali",TRUE,TRUE); + items_ext.first(); + items.first(); + while (!items.eof()) + { + info.addstatus(1); + if (info.iscancelled()) + return FALSE; + item_type=items.get("IITYP"); + if (items.get("IID")=="IM" && atoi(item_type)!=6) + { + item_code=items.get_codice("IPROD"); + if (item_type!="0") // fantasma + { + _anamag->zero(); + _anamag->put( ANAMAG_CODART,item_code); + if (_anamag->read()==NOERR) + { + // sincronizza il file dell'anagrafica Importex + while (items_ext.get_codice("MSITE")put( ANAMAG_CLASSDOG , cld); + } + TString16 gmc=items.get("IITYP"); + switch (gmc[0]) + { + case 'F': + case 'E': + case 'Z': + case 'G': + gmc[0]= 'F'; break; // finiti + case 'M': + gmc[0]= 'S'; break; // semilavorati () + case 'P': + gmc[0]= 'C'; break; // componenti (parts) + } + TString16 iclas(items.get("ICLAS")); + if (!iclas.blank()) + { + switch (m.get(F_ICLAS)[0]) + { + case 'S': + complete_gmc(gmc, iclas); + break; + case 'C': + gmc << iclas; + break; + case ' ': + break; + } + } + _anamag->put( ANAMAG_GRMERC,gmc); + _anamag->rewrite(); + } + } + } + items.next(); + } + return TRUE; +} + + +// importa le ums dal file dei divisori +bool TImporta_BPCS ::importa_ums_BP(TMask & m) +{ + TWait_cursor hourglass; + cache().flush(LF_UMART); + + TImport_file divisori(m.get(F_PATH),BPCS_DIVISORI); + TProgind info(divisori.items(),"Importazione divisori (batch di produzione)...",TRUE,TRUE); + divisori.first(); + TString item_code,impianto; + while (!divisori.eof()) + { + info.addstatus(1); + if (info.iscancelled()) + return FALSE; + item_code=(divisori.get_codice("ICPROD")); + impianto=divisori.get("ICFAC"); + if (impianto=="SE" || impianto == "TS") + { + item_code << "__" << impianto; + if (read_is_dist(item_code)) + { + _umart->zero(); + _umart->put("CODART",item_code); + _umart->put("NRIGA",2); + _umart->put("UM","BP"); + _umart->put("FC",divisori.get("ICBTCH")); + force_write(*_umart); + } + } + divisori.next(); + } + + return TRUE; +} + +void TImporta_BPCS ::clear_docs(const char * num) +{ + TString codnum(num); + TLocalisamfile doc(LF_DOC); + TLocalisamfile rdoc(LF_RIGHEDOC); + for (int anno=1998; anno<=1999; anno++) + { + doc.put("PROVV","D"); + doc.put("ANNO",anno); + doc.put("CODNUM",codnum); + doc.read(_isgteq); + while (!doc.eof() && doc.get("CODNUM")==codnum) + { + doc.remove(); + doc.next(); + } + } + rdoc.put("CODNUM",codnum); + rdoc.read(_isgteq); + while (!rdoc.eof() && rdoc.get("CODNUM")==codnum) + { + rdoc.remove(); + rdoc.next(); + } +} + +bool TImporta_BPCS ::creadocs(const char * msg, + long firm, // ditta + TImport_file & imp_file, + const char *FieldNumDoc, const char *FieldClifor, const char *FieldDataDoc,const char *FieldGroup, + SET_DOC_FUN set_header, SET_DOC_FUN set_body, FILTER_FUN filter ) +{ + + TProgind info(imp_file.items(),msg,TRUE,TRUE); + TConfig *trans=NULL; + long ntransac=0; + int nrigadoc=0; + long last_ndoc=-1L; + TDate last_date(""); + long last_clifor=-1L; + TString last_group=""; + + // rimuove le transazioni + TString_array transactions; + list_files("ND_*.ini", transactions); + FOR_EACH_ARRAY_ROW(transactions, row, name) + remove(*name); + + imp_file.first(); + while (!imp_file.eof()) + { + info.addstatus(1); + if (info.iscancelled()) + return FALSE; + if (filter(imp_file)) + { + long new_ndoc =FieldNumDoc ? imp_file.get_long(FieldNumDoc) : last_ndoc; + long new_clifor=FieldClifor ? imp_file.get_long(FieldClifor) : last_clifor; + if (new_clifor==0L && FieldClifor) + new_clifor=9999; // cliente generico + TString new_group=FieldGroup ? imp_file.get(FieldGroup) : last_group; + TDate new_date(FieldDataDoc ? imp_file.get_long(FieldDataDoc) : 0L); + if (nrigadoc>100 || (last_ndoc != new_ndoc) || (last_date != new_date ) || (last_clifor != new_clifor )|| (last_group != new_group )) + { + // emetti il doc + // reset + ntransac++; + if (new_ndoc>0L) + last_ndoc=new_ndoc; + if (new_clifor>0L) + last_clifor=new_clifor; + if (!new_group.blank()) + last_group=new_group; + if (!new_date.empty()) + last_date=new_date; + if (trans) delete trans; + trans = new TConfig(format("ND_%05d.ini",ntransac)); + trans->set_paragraph("Transaction"); + trans->set("Action","INSERT"); + trans->set("Mode","AUTO"); + trans->set("Firm",firm); + + trans->set_paragraph(format("%d",LF_DOC)); + if (new_ndoc>0) + trans->set(DOC_NDOC,new_ndoc); + if (new_date.empty()) + new_date=TODAY; + trans->set(DOC_DATADOC, new_date); + trans->set(DOC_TIPOCF,"F"); + if (new_clifor>0L) + trans->set(DOC_CODCF,new_clifor); + trans->set(DOC_PROVV,"D"); + set_header(imp_file, *trans); + nrigadoc=0; + } + // righe + nrigadoc++; + trans->set_paragraph(format("%d,%d",LF_RIGHEDOC, nrigadoc)); + set_body(imp_file, *trans); + } + imp_file.next(); + } + if (trans) delete trans; + // genera i documenti + TExternal_app gestdoc("ve0.exe -1 -ind_*.ini "); + gestdoc.run(); + return TRUE; +} + + + + +void set_head_F_ordcli(TImport_file & import, TConfig &trans) +{ + trans.set(DOC_ANNO,import.get_date("FRDTE").year()); + trans.set(DOC_CODNUM,(import.get("FPFAC")=="SE") ? "SEOC": "TSOC"); + trans.set(DOC_TIPODOC,"ORC"); + TDate dc(import.get_date("FRDTE")); + dc+=28; + round_date(dc,TRUE); + trans.set(DOC_DATACONS, dc);// stessa data del doc +} +void set_body_F_ordcli(TImport_file &import, TConfig &trans) +{ + TToken_string tmp; + trans.set(RDOC_TIPORIGA,"01"); + tmp =import.get_codice("FPROD"); + trans.set(RDOC_CODART,tmp); + trans.set(RDOC_DESCR,cache().get(LF_ANAMAG,tmp).get("DESCR")); + tmp.add("1"); + trans.set(RDOC_PREZZO,cache().get(LF_UMART,tmp).get("PREZZO")); + trans.set(RDOC_UMQTA,cache().get(LF_UMART,tmp).get("UM")); + trans.set(RDOC_QTA,import.get("FQTY")); + // gia' suddivisa su doc : trans.set(RDOC_DATACONS, import.get_date("FDATE")); + tmp=import.get("FPFAC"); + tmp << 1; + trans.set(RDOC_CODMAG,tmp); +} +bool filter_F_ordcli(TImport_file & import) +{ + bool ok= import.get("FID")=="FP" && import.get("FTYPE")=="F"; + if (ok) + { + char type = cache().get(LF_ANAMAG,import.get_codice("FPROD")).get(ANAMAG_GRMERC)[0]; + ok = (type== 'F'); + } + return ok; +} + +void set_head_R_ordcli(TImport_file & import, TConfig &trans) +{ + trans.set(DOC_ANNO,import.get_date("SRDTE").year()); + trans.set(DOC_CODNUM,(import.get("SOFAC")=="SE") ? "SEOC": "TSOC"); + trans.set(DOC_TIPODOC,"ORC"); + TDate dc(import.get_date("SRDTE")); + dc+=28; + round_date(dc,TRUE); + trans.set(DOC_DATACONS, dc);// stessa data del doc +} +void set_body_R_ordcli(TImport_file &import, TConfig &trans) +{ + TToken_string tmp; + trans.set(RDOC_TIPORIGA,"01"); + tmp =import.get_codice("SPROD"); + trans.set(RDOC_CODART,tmp); + trans.set(RDOC_DESCR,cache().get(LF_ANAMAG,tmp).get("DESCR")); + tmp.add("1"); + trans.set(RDOC_PREZZO,cache().get(LF_UMART,tmp).get("PREZZO")); + trans.set(RDOC_UMQTA,cache().get(LF_UMART,tmp).get("UM")); + trans.set(RDOC_QTA,import.get("SQREQ")); + trans.set(RDOC_QTAEVASA,import.get("SQFIN")); + + tmp=import.get("SOFAC"); + tmp << 1; + trans.set(RDOC_CODMAG,tmp); +} +bool filter_R_ordcli(TImport_file & import) +{ + bool ok=import.get("SID")=="SO"; + if (ok) + { + char type = cache().get(LF_ANAMAG,import.get_codice("SPROD")).get(ANAMAG_GRMERC)[0]; + ok = (type== 'F'); + } + return ok; +} + +// ordini di produzione +void set_head_F_ordprod(TImport_file & import, TConfig &trans) +{ + trans.set(DOC_ANNO,import.get_date("FRDTE").year()); + trans.set(DOC_CODNUM,(import.get("FPFAC")=="SE") ? "SEOC": "TSOC"); + trans.set("TIPODOC","ORP"); + TDate dc(import.get_date("FRDTE")); + dc+=28; + round_date(dc); + TDate dd(trans.get(DOC_DATADOC)); + if (dc < dd ) + trans.set(DOC_DATADOC, dc); + trans.set(DOC_DATACONS, dc); +} +void set_body_F_ordprod(TImport_file &import, TConfig &trans) +{ + TToken_string tmp,tmp2; + trans.set(RDOC_TIPORIGA,"01"); + tmp =import.get_codice("FPROD"); + trans.set(RDOC_CODART,tmp); + trans.set(RDOC_DESCR,cache().get(LF_ANAMAG,tmp).get("DESCR")); + tmp.add("1"); + trans.set(RDOC_PREZZO,cache().get(LF_UMART,tmp).get("PREZZO")); + trans.set(RDOC_UMQTA,cache().get(LF_UMART,tmp).get("UM")); + + tmp=import.get("FPFAC"); + codimp2codmagdep(tmp, atoi(import.get("FPBOMM")), tmp2); + trans.set(RDOC_IMPIANTO,tmp); + trans.set(RDOC_CODMAG,tmp2); + trans.set(RDOC_QTA,import.get("FQTY")); + trans.set(RDOC_QTAEVASA,"0"); +} +bool filter_F_ordprod(TImport_file & import) +{ + bool ok= import.get("FID")=="FP" && import.get("FPFAC")=="SE" && import.get("FTYPE")=="F"; + if (ok) + { + char type = cache().get(LF_ANAMAG,import.get_codice("FPROD")).get(ANAMAG_GRMERC)[0]; + ok = (type== 'F' || type== 'S' ); + } + return ok; +} + +void set_head_R_ordprod(TImport_file & import, TConfig &trans) +{ + trans.set(DOC_ANNO,import.get_date("SRDTE").year()); + trans.set("CODNUM",(import.get("SOFAC")=="SE") ? "SEMP": "TSMP"); + trans.set("TIPODOC","ORP"); + TDate dc(import.get_date("SRDTE")); + dc+=28; + round_date(dc); + TDate dd(trans.get(DOC_DATADOC)); + if (dc < dd ) + trans.set(DOC_DATADOC, dc); + trans.set(DOC_DATACONS, dc); +} +void set_body_R_ordprod(TImport_file &import, TConfig &trans) +{ + TToken_string tmp,tmp2; + trans.set(RDOC_TIPORIGA,"01"); + tmp =import.get_codice("SPROD"); + trans.set(RDOC_CODART,tmp); + trans.set(RDOC_DESCR,cache().get(LF_ANAMAG,tmp).get("DESCR")); + tmp.add("1"); + trans.set(RDOC_PREZZO,cache().get(LF_UMART,tmp).get("PREZZO")); + trans.set(RDOC_UMQTA,cache().get(LF_UMART,tmp).get("UM")); + + tmp=import.get("SOFAC"); + codimp2codmagdep(tmp, atoi(import.get("SOBOMM")), tmp2); + trans.set(RDOC_IMPIANTO,tmp); + trans.set(RDOC_CODMAG,tmp2); + trans.set(RDOC_QTA,import.get("SQREQ")); + trans.set(RDOC_QTAEVASA,import.get("SQFIN")); + add_stdlabors(import.get_codice("SPROD"), import.get_long("SWRKC"), int(import.get_long("SOBOMM"))); +} +bool filter_R_ordprod(TImport_file & import) +{ + bool ok=(import.get("SID")=="SO" && import.get("SOFAC")=="SE"); + if (ok) + { + char type = cache().get(LF_ANAMAG,import.get_codice("SPROD")).get(ANAMAG_GRMERC)[0]; + ok = (type== 'F'||type== 'S'); + } + return ok; +} + + + +void set_head_ordacq(TImport_file & import, TConfig &trans) +{ + TString codimp; + int nummag=(atoi(import.get_date("PWHSE"))) ; + num_mag2main_imp(nummag, codimp); + + TDate dc(import.get_date("PDDTE")); + TDate dd(import.get_date("PEDTE"));//data doc + if (dc < dd ) + dd=dc; + trans.set(DOC_DATADOC, dd); + trans.set(DOC_DATACONS, dc); + trans.set(DOC_ANNO,dd.year()); + trans.set("CODNUM",(codimp=="SE") ? "SEOF": "TSOF"); + trans.set("TIPODOC","ORF"); +} + +void set_body_ordacq(TImport_file &import, TConfig &trans) +{ + TToken_string tmp,tmp2; + trans.set(RDOC_TIPORIGA,"01"); + tmp=import.get_codice("PPROD"); + trans.set(RDOC_CODART,tmp); + trans.set(RDOC_DESCR,cache().get(LF_ANAMAG,tmp).get("DESCR")); + //trans.set(RDOC_PREZZO,import.get("POLIST")); + trans.set(RDOC_UMQTA,import.get("PUM")); + + int nummag=(atoi(import.get_date("PWHSE"))) ; + num_mag2main_imp(nummag, tmp); + tmp << "1"; + trans.set(RDOC_CODMAG,tmp); + trans.set(RDOC_QTA,import.get("PQORD")); + trans.set(RDOC_QTAEVASA,import.get("PQREC")); +} + +bool filter_ordacq(TImport_file & import) +{ + TString codimp; + int nummag=(atoi(import.get_date("PWHSE"))) ; + num_mag2main_imp(nummag, codimp); + bool ok =(codimp == "SE" ||codimp == "TS" ); + if (!ok) + error_box("Ordine di acquisto sull'impianto %s",(const char *)codimp); + return ok; +} + +void set_head_movmag(TImport_file & import, TConfig &trans) +{ + bool alertnegative=TRUE; + long codcli=atol(import.get("TVEND")); + int magno=atoi(import.get("TWHS")); + TString codimp; + num_mag2main_imp(magno, codimp); + + TString codnum,tipodoc, causmag, descrmov; + codnum=codimp; + const char * cod0=(const char * )import.get("TTYPE"); + char cod1=*(cod0+1); + long numdoc=0L;// riassegno qui il numdoc , per usare il nummag al suo posto come ragguppatore nel ciclo di crea_docs + switch (*cod0) + { + case 'O': // completed; + descrmov="Movimento di apertura di inizio esercizio"; + codnum << "DI"; + causmag="RIMI"; + codcli=0L; + break; + + case 'A': // completed + descrmov="Differenza inventariale"; + codnum << "DI"; + alertnegative=FALSE; + codcli=0L; + break; + + case '0': // completed; + descrmov="Carico prodotti finiti da terzi"; + codnum << "BE"; + causmag="CFAL"; + break; + + case 'C': // completed; + CHECKS(cod1=='3',"Causale sconosciuta :%s",cod0); + descrmov="Scarico componenti verso terzisti"; + codnum << "MM"; + causmag="SCAR"; + trans.set(DOC_TIPOCF,"F"); + break; + + case 'M': + if (cod1=='\0') // completed; + { + descrmov="Confezionamento prodotti finiti"; + codnum << "MM"; + } else { + descrmov="Sconfezionamento"; + codnum << "MM"; + } + codcli=0L; + alertnegative=FALSE; + break; + + case 'U': + if (cod1=='\0') // completed; + { + descrmov="acquisto"; + codnum << "BA"; + } else { + descrmov="reso"; + codnum << "RF"; + } + break; + + case 'I': // confirmed + descrmov="Scarico componenti "; + codnum << "MM"; + causmag="SCAR"; + break; + + case 'T': // to be confirmed + codnum << "MM"; + descrmov="Trasferimento"; + codcli=0L; + alertnegative=FALSE; + break; + case 'X': // completed; + codnum << "MM"; + if (cod1=='7') + { + descrmov="Scarico manuale"; + causmag="SCAR"; + } else if (cod1=='8') + { + descrmov="Carico manuale"; + causmag="CAR"; + } else { + descrmov="Scarico per campionatura"; + causmag="SCAR"; + } + codcli=0L; + break; + default: + CHECKS(TRUE,"Causale sconosciuta :%s",cod0); + } + trans.set("CODNUM",codnum); + if (!tipodoc.blank()) + trans.set("TIPODOC",tipodoc); + if (!causmag.blank()) + trans.set("CAUSMAG",causmag); + trans.set("DESCR",descrmov); + trans.set(DOC_NDOC,0L); + trans.set(DOC_CODCF,codcli); + trans.set(DOC_ANNO,import.get_date("TTDTE").year()); + trans.set(DOC_NUMDOCRIF,import.get("TREF")); + trans.set(DOC_DATADOCRIF,import.get_date("TSDTE")); + +} + +void set_body_movmag(TImport_file &import, TConfig &trans) +{ + TString codimp, codmag, causmag, desc; + int magno=atoi(import.get("TWHS")); + num_mag2main_imp(magno, codimp); + int terzista=location2metod(import.get_long("TLOCT")); + codimp2codmagdep(codimp, terzista,codmag); + + TToken_string tmp(import.get_codice("TPROD")); + trans.set(RDOC_TIPORIGA,"01"); + trans.set(RDOC_CODART,tmp); + desc =cache().get(LF_ANAMAG,tmp).get("DESCR"); + if (terzista==99) + desc << "(terzista " << atol(import.get("TLOCT")) << ")"; + trans.set(RDOC_DESCR,desc); + trans.set(RDOC_UMQTA,import.get("THTUM")); + + trans.set(RDOC_CODMAG,codmag); + const char * cod0=(const char * )import.get("TTYPE"); + real qta(import.get("TQTY")); + switch (*cod0) + { + case 'M': + if (*(cod0+1)=='1') + qta = -qta; + case 'A': + case 'T': + if (qta >= ZERO) + { + causmag="CAR"; + } else { + qta = -qta; + causmag="SCAR"; + } + trans.set(RDOC_CAUSMAG,causmag); + break; + + case 'O': + case '0': + case 'C': + case 'U': + case 'I': + case 'X': + break; + } + trans.set(RDOC_QTA, qta.string()); +} + +bool filter_movmag(TImport_file & import) +{ + const char * cod0=(const char * )import.get("TTYPE"); + switch (*cod0) + { + case 'O': // completed; + case 'A': // completed + case '0': // completed; + case 'C': // completed; + case 'M': + case 'U': + case 'I': // confirmed + case 'T': // to be confirmed + case 'X': // completed; + return TRUE; + break; + } + return FALSE; +} + + +bool filter_movmagSE(TImport_file & import) +{ + TString codimp; + int magno=atoi(import.get("TWHS")); + num_mag2main_imp(magno, codimp); + return codimp=="SE" && filter_movmag(import); +} + +bool filter_movmagTS(TImport_file & import) +{ + TString codimp; + int magno=atoi(import.get("TWHS")); + num_mag2main_imp(magno, codimp); + return codimp=="TS"; +} + + +bool TImporta_BPCS ::importa_ordacq(TMask & m) +{ + clear_docs("SEOF"); + clear_docs("TSOF"); + TImport_file ordacq(m.get(F_PATH),BPCS_ORDACQ); + return creadocs("Importazione ordini di acquisto..",get_firm(),ordacq, + "PORD","PVEND",NULL,NULL, + set_head_ordacq,set_body_ordacq,filter_ordacq); +} + +bool TImporta_BPCS ::importa_ordcli(TMask & m) +{ + clear_docs("SEOC"); + clear_docs("TSOC"); + TImport_file released_orders(m.get(F_PATH),BPCS_SHOPORDS); + bool ok = creadocs("Importazione ordini cliente (1)..",get_firm(),released_orders, + NULL,"SCUST","SRDTE","SOFAC", + set_head_R_ordcli,set_body_R_ordcli,filter_R_ordcli); + + TImport_file firm_orders(m.get(F_PATH),BPCS_FIRMORD); + ok = ok && creadocs("Importazione ordini cliente (2)..",get_firm(),firm_orders, + NULL,"FPPVND","FRDTE","FPFAC", + set_head_F_ordcli,set_body_F_ordcli,filter_F_ordcli); + return ok; +} + +bool TImporta_BPCS ::importa_ordprod(TMask & m) +{ + clear_docs("SEMP"); + clear_docs("SEOP"); + clear_docs("SEFA"); + clear_docs("TSMP"); + clear_docs("TSOP"); + clear_docs("TSFA"); + TImport_file released_orders(m.get(F_PATH),BPCS_SHOPORDS); + bool ok = creadocs("Importazione ordini di produzione (1)..",get_firm(),released_orders, + "SORD",NULL,"SRDTE","SOFAC", + set_head_R_ordprod,set_body_R_ordprod,filter_R_ordprod); + + TImport_file firm_orders(m.get(F_PATH),BPCS_FIRMORD); + ok = ok && creadocs("Importazione ordini di produzione (2)..",get_firm(),firm_orders, + NULL,"FPPVND","FRDTE","FPFAC", + set_head_F_ordprod,set_body_F_ordprod,filter_F_ordprod); + return ok; +} + + +bool TImporta_BPCS ::importa_movmag(TMask & m, bool segrate, bool trieste) +{ + clear_docs("TSBA"); + clear_docs("TSBE"); + clear_docs("TSBT"); + clear_docs("TSBU"); + clear_docs("TSBV"); + clear_docs("TSDI"); + clear_docs("TSMM"); + clear_docs("TSRF"); + clear_docs("SEBA"); + clear_docs("SEBE"); + clear_docs("SEBT"); + clear_docs("SEBU"); + clear_docs("SEBV"); + clear_docs("SEDI"); + clear_docs("SEMM"); + clear_docs("SERF"); + TImport_file movmag(m.get(F_PATH),BPCS_MOVMAG); + bool ok = TRUE; + if (segrate) + ok &= creadocs("Importazione movimenti magazzino di Segrate..",get_firm(),movmag, + NULL,"TREFM","TTDTE","TTYPE", + set_head_movmag,set_body_movmag,filter_movmagSE); + if (trieste) + ok &= creadocs("Importazione movimenti magazzino di Trieste..",get_firm(),movmag, + NULL,"TREFM","TTDTE","TTYPE", + set_head_movmag,set_body_movmag,filter_movmagTS); + return ok; +/*bool creadocs( ........ + char *FieldNumDoc,char *FieldClifor,char *FieldDataDoc, char *Group + ...........)*/ +} + + +void TImporta_BPCS ::main_loop() +{ + TMask m("dbcv00a.msk"); + m.field(F_PATH).set("E:\\bpcs\\"); + while (m.run()!=K_QUIT) + { + if (m.get_bool(F_RESETMORTI) && noyes_box("Confermi la cancellazione del file degli articoli da escludere ?")) + { + TSupport_file morti(LF_DIST, ANAGRAFICA_MORTI); + morti.zap(); + } + if (m.get_bool(F_CREAMAG3)) + crea_mag3(); + + bool ok=TRUE; + if (m.get_bool(F_ARTS)) + { + if (m.get_bool(F_CHANGEGMC)) + ok|=cambia_gmc(m); + else + { + if (m.get_bool(F_BOMS)) + delete_boms(); + ok|=importa_arts(m); // articoli e distinte virtuali fantasma + } + } + if (m.get_bool(F_BOMS)) + { + if (0 && !m.get_bool(F_ARTS)) + { + delete_boms(); + ok|=importa_arts(m, TRUE); // importa distinte virtuali fantasma + } + ok|=importa_boms(m); + } + if (m.get_bool(F_DIVS)) + ok|=importa_ums_BP(m); + if (m.get_bool(F_ORDACQ)) + ok|=importa_ordacq(m); + if (m.get_bool(F_ORDPROD)) + ok|=importa_ordprod(m); + if (m.get_bool(F_ORDCLI)) + ok|=importa_ordcli(m); + if (m.get_bool(F_MOVMAG)) + ok|=importa_movmag(m,TRUE,FALSE); + + if (ok) + message_box("Operazione conclusa"); + else + message_box("Operazione interrotta"); + } +} + + +int dbcv00(int argc, char* argv[]) +{ + TString name; + TImporta_BPCS dt; + dt.run(argc, argv, "Conversione distinte da BPCS"); + return 0; +} diff --git a/db/dbcv00a.h b/db/dbcv00a.h new file mode 100755 index 000000000..ecc93f869 --- /dev/null +++ b/db/dbcv00a.h @@ -0,0 +1,15 @@ +#define F_PATH 101 +#define F_ARTS 102 +#define F_BOMS 103 +#define F_DIVS 104 +#define F_ANNO 105 +#define F_RESETMORTI 106 +#define F_EAN 107 +#define F_ICLAS 108 +#define F_ORDPROD 120 +#define F_ORDACQ 121 +#define F_ORDCLI 122 +#define F_MOVMAG 123 +#define F_CREAMAG3 124 +#define F_SOLOGHOST 125 +#define F_CHANGEGMC 126 diff --git a/db/dbcv00a.uml b/db/dbcv00a.uml new file mode 100755 index 000000000..e9479025b --- /dev/null +++ b/db/dbcv00a.uml @@ -0,0 +1,108 @@ +#include "dbcv00a.h" +#define G_ARTICOLI 10 +#define G_DISTINTE 20 + +TOOLBAR "" 0 19 0 0 + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -11 "~OK" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -11 "~Fine" + MESSAGE EXIT,K_QUIT + PICTURE BMP_QUIT + PICTURE BMP_QUITDN +END + +ENDPAGE + +PAGE "Importazione Distinta base" -1 -1 80 20 + +STRING DLG_PROFILE 70 +BEGIN + FLAGS "HG" + PROMPT 1 1 "" + PSELECT +END + +STRING F_PATH 40 +BEGIN + PROMPT 1 1 "Percorso dei files DBF di BPCS " +END + +NUMBER F_ANNO 2 +BEGIN + PROMPT 1 3 "Chiedi conferma per le distinte risalenti al " +END +BOOL F_RESETMORTI +BEGIN + PROMPT 1 4 "Azzera file articoli da ignorare" +END +BOOL F_CREAMAG3 +BEGIN + PROMPT 42 4 "Crea i magazzini terzisti" +END + +BOOL F_ARTS +BEGIN + PROMPT 1 6 "Carica gli articoli" + MESSAGE TRUE SHOW,G_ARTICOLI@ + MESSAGE FALSE HIDE,G_ARTICOLI@ +END +BOOL F_CHANGEGMC +BEGIN + PROMPT 38 6 "Ricarica solo i gr.merc." + MESSAGE TRUE DISABLE,F_EAN + MESSAGE FALSE ENABLE,F_EAN + GROUP G_ARTICOLI +END + +LIST F_EAN 40 +BEGIN + PROMPT 3 7 "" + ITEM " |Non caricare i codici EAN" + ITEM "8|Carica codici EAN 8" + ITEM "13|Carica codici EAN 13" + GROUP G_ARTICOLI +END +LIST F_ICLAS 40 +BEGIN + PROMPT 3 8 "" + ITEM " |Non caricare il campo ICLAS" + ITEM "S|Carica ICLAS come sotto cat.merc." + ITEM "C|Carica ICLAS come cat.merc." + GROUP G_ARTICOLI +END +BOOL F_BOMS +BEGIN + PROMPT 1 10 "Carica le distinte" +END +BOOL F_DIVS +BEGIN + PROMPT 40 10 "Carica i divisori" +END + +BOOL F_MOVMAG +BEGIN + PROMPT 1 12 "Carica le movimentazioni di magazzino" +END + +BOOL F_ORDACQ +BEGIN + PROMPT 1 14 "Carica gli ordini di acquisto" +END +BOOL F_ORDCLI +BEGIN + PROMPT 1 16 "Carica gli ordini cliente" +END +BOOL F_ORDPROD +BEGIN + PROMPT 1 18 "Carica gli ordini di produzione" +END + +ENDPAGE + +ENDMASK diff --git a/db/dbcv01.cpp b/db/dbcv01.cpp new file mode 100755 index 000000000..c0f8b4a7b --- /dev/null +++ b/db/dbcv01.cpp @@ -0,0 +1,32 @@ +#include "dbcv.h" +#include "dbcv09.h" +/*#include +#include +#include +#include +#include +#include +#include +#include "..\mg\anamag.h" +#include "..\mg\mag.h" +#include "..\include\doc.h" +#include "..\include\rdoc.h"*/ + +#define BPCS_ANAGRAFICA "iiml01" +#define BPCS_IMPORTEX "iimsl01" +#define BPCS_DISTINTE "mbml01" +#define BPCS_DIVISORI "cicl01" +#define BPCS_MOVMAG "ithl01" +#define BPCS_ORDACQ "acq_ord" +#define BPCS_FIRMORD "ord_cli" +#define BPCS_SHOPORDS "ord_prod" + + + +int dbcv01(int argc, char* argv[]) +{ + TString name; + TCrea_dbf dt; + dt.run(argc, argv, "Conversione txt da BPCS in files DBF"); + return 0; +} diff --git a/db/dbcv09.cpp b/db/dbcv09.cpp new file mode 100755 index 000000000..822c80cd4 --- /dev/null +++ b/db/dbcv09.cpp @@ -0,0 +1,440 @@ +#include "dbcv09.h" +// ****************************************** +// ****************************************** +int location2metod(long location) +{ + switch (location) + { + case 0: return 0; + case 1530: return 1; + case 59: return 2; + case 2008: return 3; + case 63: return 4; + case 872: return 5; + case 66: return 6; + case 1700: return 7; + case 115: return 8; + case 935: return 9; + case 911: return 10; + case 1812: return 11; + case 230: return 12; + case 433: return 13; + case 272: return 14; + case 1382: return 15; + case 467: return 16; + case 1352: return 17; + case 233: return 18; + case 498: return 19; + case 651: return 20; + case 511: return 21; + case 519: return 22; + case 2017: return 23; + case 798: return 24; + case 582: return 25; + case 618: return 26; + case 1190: return 27; + case 1360: return 28; + case 1727: return 29; + case 2081: return 30; + case 1330: return 31; + case 565: return 32; + case 2079: return 33; + case 2194: return 34; + case 229: return 35; + case 2280: return 36; + case 60: return 37; + case 50037: return 38; + case 1154: return 39; + case 2153: return 40; + case -1: return 41; // M&M srl + case 1569: return 42; + case 2237: return 43; + case -2: return 44; // rotolito + case -3: return 45; // sconfezionamento + } + return 99; // terzista generico +} + +const char * descr_method(int method) +{ + switch (method) + { + case 1: return ("Areosol lab. Italia"); + case 2: return ("Areosol serivce Italia"); + case 3: return ("Bertoncini"); + case 4: return ("Bregaglio"); + case 5: return ("CABL service"); + case 6: return ("CIP4"); + case 7: return ("Stabilimenti Cover di PD/PR"); + case 8: return ("Deskin"); + case 9: return ("Farmol Safca"); + case 10: return ("FATAI Nyl"); + case 11: return ("Hydra Farm."); + case 12: return ("IMAPACK"); + case 13: return ("Interchem Italia"); + case 14: return ("Ivers Lee Italia"); + case 15: return ("Liquichim"); + case 16: return ("Manilab"); + case 17: return ("MP"); + case 18: return ("Niada"); + case 19: return ("Noviplast"); + case 20: return ("OCE"); + case 21: return ("Pantapack"); + case 22: return ("PimepackDue"); + case 23: return ("Pernici Cereira"); + case 24: return ("Re.Le.Vi."); + case 25: return ("Synthesis"); + case 26: return ("Treccificio BS"); + case 27: return ("Tosvar Areosol"); + case 28: return ("Unifill"); + case 29: return ("Unispray"); + case 30: return ("Artical"); + case 31: return ("La cosmografica"); + case 32: return ("Chizzoni"); + case 33: return ("E.Bonetto Lito"); + case 34: return ("CT Service srl"); + case 35: return ("M&M sas"); + case 36: return ("Brelil"); + case 37: return ("Akronimex"); + case 38: return ("Globol UK"); + case 39: return ("LIto Sestese"); + case 40: return ("Serialfa"); + case 41: return ("M&M"); // M&M srl + case 42: return ("M&M srl"); + case 43: return ("ERREDI ser. srl"); + case 44: return ("Rotolito"); // rotolito + } + return "-- Unknown --"; +} + + +void num_mag2main_imp(int magno, TString & codimp) +{ + switch (magno) + { + case 91: + case 93: + case 26: + codimp="SE"; + break; + case 92: + case 28: + codimp="TS"; + break; + default: + codimp="XX"; + } +} + +void complete_gmc(TString & gmc,const char *iclas) +{ + TString des; + TString16 subgmc(iclas); + char type; + if (subgmc=="AM") { + type = 'H'; + des="Ambipur"; + } else if (subgmc=="IN") { + type = 'H'; + des="Ambipur"; + } else if (subgmc=="KM") { + type = 'H'; + des="Kiwi Mobili"; + } else if (subgmc=="KS") { + type = 'H'; + des="Kiwi Shoecare"; + } else if (subgmc=="OS") { + type = 'H'; + des="Shoe care generico"; + } else if (subgmc=="PV") { + type = 'H'; + des="Pulizia vetri"; + } else if (subgmc=="HA") { + type = 'H'; + des="House care generico"; + } else if (subgmc=="OC") { + type = 'O'; + des="Oral care generico"; + } else if (subgmc=="SB") { + type = 'O'; + des="Oral care Smithcline Beecham"; + } else if (subgmc=="AV") { + type = 'P'; + des="Acqua Velva"; + } else if (subgmc=="BA") { + type = 'P'; + des="Badedas"; + } else if (subgmc=="BR") { + type = 'P'; + des="Brylcreem"; + } else if (subgmc=="DE") { + type = 'P'; + des="Depilzero "; + } else if (subgmc=="FB") { + type = 'P'; + des="Fissan Baby"; + } else if (subgmc=="FO") { + type = 'P'; + des="Fissan body generico"; + } else if (subgmc=="GL") { + type = 'P'; + des="Glysolid"; + } else if (subgmc=="GP") { + type = 'P'; + des="General purpose personal case"; + } else if (subgmc=="OB") { + type = 'P'; + des="Personal care generico"; + } else if (subgmc=="QU") { + type = 'P'; + des="Quickies"; + } else if (subgmc=="SA") { + type = 'P'; + des="Savane"; + } else if (subgmc=="SO") { + type = 'P'; + des="Super soap"; + } else if (subgmc=="SX") { + type = 'P'; + des="Sanex"; + } else if (subgmc=="WI") { + type = 'P'; + des="Williams"; + } else + return; + gmc << type << 'C'; + if (cache().get("GMC",gmc).empty()) + { + cache().discard("GMC",gmc); + TTable ttt("GMC"); + ttt.put("CODTAB",gmc); + ttt.put("S0",type=='H' ? "House care" : (type=='P' ? "Personal care" :"Oral care")); + ttt.write(); + } + gmc << subgmc; + if (cache().get("GMC",gmc).empty()) + { + cache().discard("GMC",gmc); + TTable ttt("GMC"); + ttt.put("CODTAB",gmc); + ttt.put("S0",des); + ttt.write(); + } +} + +const char * check_clasdog(long stdo) +{ + static TString cld; + if (stdo) + { + cld.format("%010ld",stdo); + if (cache().get("%CLD",cld).empty()) + { + cache().discard("%CLD",cld); + TTable ttt("%CLD"); + ttt.put("CODTAB",cld); + ttt.put("S0","???"); + ttt.write(); + } + } + else + cld.cut(0); + return cld; +} + +void codimp2codmagdep(TString &codimp,int terzista, TString &codmag) +{ + if (terzista>0) + { + codimp << format("3%02d",terzista); + codmag = codimp; + } else { + codmag = codimp; + codmag << 1; + } +} + +void num_mag2cod_imp(int magno, TString & codimp) +{ + switch (magno) + { + case 91: + case 93: + codimp="SE3"; + break; + case 26: + codimp="SE"; + break; + case 92: + codimp="TS3"; + break; + case 28: + codimp="TS"; + break; + default: + codimp="XX"; + } +} + +void add_stdlabors(const char * item, long wrkc, int bomm) +{ + int type=int (wrkc/100); + if ( type == 1010 || (bomm != 0 && bomm != 99)) // non e' una linea di confezionamento di Segrate o terzista + { + TLocalisamfile rdist(LF_RDIST); + TString stdlav; + rdist.put("CODDIST",item); + rdist.read(_isgteq); + int nrig=0; + while (!rdist.eof() && rdist.get("CODDIST")==item) + { + if (rdist.get("TIPO")=="L") break; + rdist.next(); + nrig++; + } + if (rdist.eof() || rdist.get("CODDIST")!=item) + { + // nessuna lavorazione precedentemente inserita + int lineno; + if (type == 1010 ) + lineno=int (wrkc - type*100); + else + lineno= 100; + int pzxca; + switch (lineno) + { + case 1: + stdlav="L_ALCOL1"; + pzxca=12; + break; + case 2: + stdlav="L_DOCCIA"; + pzxca=12; + break; + case 4: + stdlav="L_GLYSOL"; + pzxca=12; + break; + case 5: + stdlav="L_BRYLCR"; + pzxca=12; + break; + case 6: + stdlav="L_BAGNOS"; + pzxca=12; + break; + case 7: + stdlav="L_SAPONE"; + pzxca=12; + break; + case 8: + stdlav="L_SAPRIC"; + pzxca=12; + break; + case 9: + stdlav="L_DENTIF"; + pzxca=12; + break; + case 10: + stdlav="L_PENTO"; + pzxca=12; + break; + case 14: + stdlav="L_ALCOL2"; + pzxca=12; + break; + // lavorazioni terzisti + case 100: + stdlav="L_RICONF"; + pzxca=12; + break; + default: + error_box("Linea sconosciuta per l'articolo %s:%d",item,lineno); + lineno=0; + } + TString16 um=cache().get(LF_DIST,item).get("UM"); + if (lineno && !um.empty()) + { + TToken_string key(item); + key.add("1",1); + if (cache().get(LF_UMART,key).get("UM")=="CA") + stdlav<< "_CA" << pzxca; + else + stdlav<< "_SL"; + real fc; + if (cache().get(LF_UMART,key).get("UM")==um) + { + fc=cache().get(LF_UMART,key).get_real("FC"); + } else { + key.add("2",1); + fc=cache().get(LF_UMART,key).get_real("FC"); + } + if (!cache().get("LAV",stdlav).empty()) + { + rdist.put("CODDIST",item); + rdist.put("NRIG",nrig+1); + rdist.put("TIPO","L"); + rdist.put("CODCOMP",stdlav); + rdist.put("UM",um); + rdist.put("EXPR",fc.string()); + rdist.write(); + } else { + error_box("Impossibile trovare la lavorazione %s per l'articolo %s. Inserimento automatico", (const char *)stdlav, item); + cache().discard("LAV",stdlav); + TTable ttt("LAV"); + ttt.put("CODTAB",stdlav); + ttt.put("S0","???"); + ttt.write(); + } + } + } + } +} + +void round_date(TDate& date, bool up) +{ + // Dimensione del bucke in giorni + const int bucket_size = 7; + + // Riporta la data al primo lunedi prima dell'inizio + const int wday = date.wday(); + if (wday > 1) date -= wday-1; + + if (up) // Arrotonda alla fine del bucket + date += (bucket_size - 1); + else // Arrotonda all'inizio del bucket + date = date ; +} + + + +void crea_mag3() +{ + TString codmag;TString desc; + TTable mag("MAG"); + mag.put("CODTAB","SE3"); + mag.put("B0","X"); + mag.put("S0","Terzisti di Segrate (ex mag. 91-93)"); + mag.write(); + + mag.put("CODTAB","TS3"); + mag.put("B0","X"); + mag.put("S0","Terzisti di Trieste (ex mag. 92)"); + mag.write(); + for (int t=1 ; t<45;t++) + { + desc=descr_method(t); + + codmag.format("SE3%02d",t); + mag.put("CODTAB",codmag); + mag.put("S0",desc); + mag.write(); + + codmag.format("TS3%02d",t); + mag.put("CODTAB",codmag); + mag.put("S0",desc); + mag.write(); + } +} + + diff --git a/db/dbcv09.h b/db/dbcv09.h new file mode 100755 index 000000000..ce9fcccd9 --- /dev/null +++ b/db/dbcv09.h @@ -0,0 +1,19 @@ +#include +#include +#include +#include + +// individua il metodo a partire dalla locazione di magazzino (codice dep) +int location2metod(long location) ; +// codifica il nome del terzista +const char * descr_method(int method) ; +// aggiunge le lavorazioni standard +void add_stdlabors(const char * item, long wrkc, int bomm) ; +void crea_mag3(); +void round_date(TDate& date, bool up=FALSE) ; +const char * check_clasdog(long stdo); +void complete_gmc(TString & gmc,const char *iclas); +void codimp2codmagdep(TString &codimp,int terzista, TString &codmag); +void num_mag2cod_imp(int magno, TString & codimp); + +void num_mag2main_imp(int magno, TString & codimp); diff --git a/ef/batbbnp.uml b/ef/batbbnp.uml index 6fbe9b3a7..e1b7a41bc 100755 --- a/ef/batbbnp.uml +++ b/ef/batbbnp.uml @@ -5,7 +5,7 @@ TOOLBAR "" 0 19 0 2 #include ENDPAGE -PAGE "Gestione Tabella Banche di Presentazione" 0 -1 77 19 +PAGE "Banche di Presentazione" 0 -1 77 19 GROUPBOX DLG_NULL 78 4 BEGIN @@ -52,11 +52,11 @@ BEGIN FIELD BNP->CODTAB[1,5] KEY 1 USE BNP KEY 1 SELECT CODTAB ?= "??????????" - JOIN %BAN TO BNP KEY 1 INTO CODTAB=CODTAB + JOIN %BAN ALIAS 100 INTO CODTAB==CODTAB INPUT CODTAB[1,5] F_ABI DISPLAY "ABI@5" CODTAB[1,5] DISPLAY "CAB@5" CODTAB[6,10] - DISPLAY "Denominazione@50" %BAN->S0 + DISPLAY "Denominazione@50" 100@->S0 OUTPUT F_ABI CODTAB[1,5] //OUTPUT F_ISTIT %BAN->S0 MESSAGE COPY,F_CODICEABI @@ -71,15 +71,15 @@ BEGIN FIELD BNP->CODTAB[6,10] KEY 1 USE BNP KEY 1 SELECT CODTAB ?= "??????????" - JOIN %BAN TO BNP KEY 1 INTO CODTAB=CODTAB + JOIN %BAN ALIAS 100 INTO CODTAB=CODTAB INPUT CODTAB[1,5] F_ABI INPUT CODTAB[6,10] F_CAB DISPLAY "ABI@5" CODTAB[1,5] DISPLAY "CAB@5" CODTAB[6,10] - DISPLAY "Denominazione@50" %BAN->S0 + DISPLAY "Denominazione@50" 100@->S0 OUTPUT F_CAB CODTAB[6,10] OUTPUT F_ABI CODTAB[1,5] - OUTPUT F_DENOM %BAN->S0 + OUTPUT F_DENOM 100@->S0 MESSAGE COPY,F_CODICECAB MESSAGE CHECK,F_CODICEABI CHECKTYPE REQUIRED diff --git a/ef/dse.frm b/ef/dse.frm index cf5cf7b16..8a114b0f4 100755 --- a/ef/dse.frm +++ b/ef/dse.frm @@ -23,8 +23,13 @@ END GENERAL BEGIN OFFSET 0 0 - FONT "Roman 17cpi" - SIZE 12 +END + +SECTION GRAPHICS ODD 4 + FIGURA 1 1 1 + BEGIN + PROMPT 1 1 "" + END END SECTION HEADER ODD 9 @@ -39,7 +44,7 @@ END STRING 2 20 BEGIN KEY "scritta elenco riba" - PROMPT 64 1 "ELENCO RI.BA. " + PROMPT 70 1 "ELENCO RI.BA. " END NUMBER 3 8 @@ -49,76 +54,57 @@ BEGIN MESSAGE _PAGENO END -STRING 4 20 -BEGIN - KEY "scritta presentati il" - PROMPT 5 3 "PRESENTATI IL : " -END - -DATA 5 10 -BEGIN - KEY "data" - PROMPT 0 0 "" - FLAGS "AH" - MESSAGE COPY,6 -END - -DATA 6 10 +DATA 4 20 BEGIN KEY "data emissione" - PROMPT 21 3 "" + PROMPT 8 3 "PRESENTATI IL : " + MESSAGE _DATA END -STRING 7 3 -BEGIN - KEY "scritta DA" - PROMPT 5 4 "DA " -END - -STRING 8 70 +STRING 5 70 BEGIN KEY "ditta" - PROMPT 8 4 "" + PROMPT 8 4 "DA : " MESSAGE _DITTA,!RAGSOC END -STRING 9 20 +STRING 6 20 BEGIN KEY "scritta titolo righe del body" PROMPT 2 7 "DEBITORE O TRASSATO" END -STRING 10 10 +STRING 7 10 BEGIN KEY "scritta titolo righe del body" PROMPT 32 7 "INDIRIZZO" END -STRING 11 17 +STRING 8 17 BEGIN KEY "scritta titolo righe del body" PROMPT 62 7 "BANCA D'APPOGGIO" END -STRING 12 11 +STRING 9 11 BEGIN KEY "scritta titolo righe del body" PROMPT 94 7 "FATTURA DEL" END -STRING 13 8 +STRING 10 8 BEGIN KEY "scritta titolo righe del body" PROMPT 111 7 "SCADENZA" END -STRING 14 7 +STRING 11 7 BEGIN KEY "scritta titolo righe del body" PROMPT 129 7 "IMPORTO" END -STRING 15 +STRING 12 BEGIN KEY "riga separazione dalle righe del body" PROMPT 2 8 "---------------------------------------------------------------------------------------------------------------------------------------------" @@ -127,60 +113,66 @@ END END SECTION BODY ODD 8 - -STRING 16 30 2 + +STRING 16 25 2 BEGIN KEY "debitore" PROMPT 2 1 "" - FIELD 20->RAGSOC + FIELD 20->RAGSOC + MESSAGE INC,FL->2 END -STRING 18 30 2 +STRING 27 16 BEGIN - KEY "indirizzo debitore" - PROMPT 32 1 "" - FIELD 20->INDCF + KEY "codice fiscale" + PROMPT 2 3 "" + FIELD 20->PAIV + FIELD 20->COFI END -STRINGA 19 +STRING 17 25 2 BEGIN - KEY "LOCALITA" - PROMPT 0 0 "" - FLAGS "H" - MESSAGE COPY,21 - FIELD 20->LOCALITACF + KEY "Indirizzo debitore + nr. civico" + PROMPT 29 1 "" + MESSAGE _CLI,!IND END -STRINGA 20 -BEGIN - KEY "PROV" - PROMPT 0 0 "" - FLAGS "H" - MESSAGE APPEND,21 - FIELD 13->PROVCOM -END - -STRINGA 21 50 +STRINGA 18 25 2 BEGIN KEY "PIAZZA(LOCALITA+PROV)" - PROMPT 32 2 "" + PROMPT 29 3 "" + MESSAGE _CLI,!PIAZZA END -STRING 22 30 2 +STRING 19 30 2 BEGIN KEY "banca d'appoggio denominazione" PROMPT 55 1 "" FIELD 201@->S0 END -STRING 23 50 2 +STRING 20 30 2 BEGIN KEY "banca d'appoggio succursale" PROMPT 55 3 "" FIELD 203@->S0 END -LISTA 28 8 +STRING 21 5 +BEGIN + KEY "ABI presentazione" + PROMPT 55 5 "ABI: " + FIELD CODABI +END + +STRING 22 5 +BEGIN + KEY "CAB succursale" + PROMPT 55 6 "CAB: " + FIELD CODCAB +END + +LISTA 23 8 BEGIN KEY "a saldo/in conto" FIELD 31->ULTRATA @@ -196,46 +188,46 @@ BEGIN MESSAGE _FATT,!DATIFATT END -DATA 26 10 +DATA 25 10 BEGIN KEY "data scadenza" PROMPT 112 1 "" FIELD 31->DATASCAD END -NUMERO 27 18 +NUMERO 26 18 BEGIN KEY "importo" PROMPT 122 1 "" MESSAGE _IMPORTO - PICTURE "###.###.###.###" + MESSAGE ADD,FL->3 + PICTURE "###.###.###.###" END END SECTION FOOTER LAST 2 -STRING 25 +STRINGA 1 BEGIN KEY "riga separazione dalle righe del body" PROMPT 2 1 "---------------------------------------------------------------------------------------------------------------------------------------------" END -NUMERO 26 13 +NUMERO 2 13 BEGIN KEY "scritta n. documenti" PROMPT 5 2 "N. DOCUMENTI " - MESSAGE _FOOTER,!NDOC END -NUMERO 28 18 +NUMERO 3 18 BEGIN KEY "Totale" PROMPT 115 2 "TOTALE " PICTURE "###.###.###.###" - MESSAGE _FOOTER,!TOTALE END END END + diff --git a/ef/ef0.cpp b/ef/ef0.cpp index 7d26d8604..a8eb75f74 100755 --- a/ef/ef0.cpp +++ b/ef/ef0.cpp @@ -1,46 +1,42 @@ //PROGRAMMA PRINCIPALE APPLICAZIONE "GESTIONE EFFETTI" #include -#include #include "ef0.h" -#define usage "Error - usage : %s -{0|1|2|3|4|5|6|7|8}" - int main(int argc, char** argv) { - const int op = argc < 2 ? 0 : atoi(argv[1]+1); - int res = 1; + const char op = argc < 2 ? '0' : argv[1][1]; switch (op) { - case 0: - res = ef0100(argc,argv);// GESTIONE EFFETTI + case '1': + ef0200(argc,argv);// GENERAZIONE EFFETTI DA E/C break; - case 1: - res = ef0200(argc,argv);// GENERAZIONE EFFETTI DA E/C - break; - case 2: - res = ef0300(argc,argv);// GESTIONE DISTINTE + case '2': + ef0300(argc,argv);// GESTIONE DISTINTE break; - case 3: - res = ef0400(argc,argv);// ELIMINAZIONE EFFETTI + case '3': + ef0400(argc,argv);// ELIMINAZIONE EFFETTI break; - case 4: - res = ef0500(argc,argv);// EMISSIONE EFFETTI/DISTINTE + case '4': + ef0500(argc,argv);// EMISSIONE EFFETTI/DISTINTE break; - case 5: - res = ef0600(argc,argv);// STAMPE DI CONTROLLO EFFETTI + case '5': + ef0600(argc,argv);// STAMPE DI CONTROLLO EFFETTI break; - case 6: - res = ef0700(argc,argv);// GESTIONE TABELLA BANCHE DI PRESENTAZIONE + case '6': + ef0700(argc,argv);// GESTIONE TABELLA BANCHE DI PRESENTAZIONE break; - case 7: - res = ef0800(argc,argv);// CONTABILIZZAZIONE EFFETTI + case '7': + ef0800(argc,argv);// CONTABILIZZAZIONE EFFETTI break; - case 8: - res = ef0900(argc,argv);// PARAMETRI EFFETTI + case '8': + ef0900(argc,argv);// PARAMETRI EFFETTI + break; + case '9': + ef0A00(argc,argv);// GENERAZIONE DISTINTE DA SCADENZE break; default: - error_box(usage, argv[0]); + ef0100(argc,argv);// GESTIONE EFFETTI break; } - return res; + return 0; } diff --git a/ef/ef0.h b/ef/ef0.h index 4dc6118e5..c45b04b06 100755 --- a/ef/ef0.h +++ b/ef/ef0.h @@ -10,5 +10,7 @@ int ef0600(int argc, char* argv[]);// STAMPE DI CONTROLLO EFFETTI int ef0700(int argc, char* argv[]);// GESTIONE TABELLA BANCHE DI PRESENTAZIONE int ef0800(int argc, char* argv[]);// CONTABILIZZAZIONE EFFETTI int ef0900(int argc, char* argv[]);// PARAMETRI EFFETTI +int ef0A00(int argc, char* argv[]);// GENERAZIONE DISTINTE + #endif // __EF0_H diff --git a/ef/ef0.url b/ef/ef0.url index 7150e4b6c..723392a62 100755 --- a/ef/ef0.url +++ b/ef/ef0.url @@ -4,51 +4,3 @@ MENU TASK_MENUBAR SUBMENU MENU_FILE "~File" -/* ef0 -1 */ -MENUBAR MENU_BAR(1) - -MENU MENU_BAR(1) - SUBMENU MENU_FILE "~File" - -/* ef0 -2 */ -MENUBAR MENU_BAR(2) - -MENU MENU_BAR(2) - SUBMENU MENU_FILE "~File" - -/* ef0 -3 */ -MENUBAR MENU_BAR(3) - -MENU MENU_BAR(3) - SUBMENU MENU_FILE "~File" - -/* ef0 -4 */ -MENUBAR MENU_BAR(4) - -MENU MENU_BAR(4) - SUBMENU MENU_FILE "~File" - -/* ef0 -5 */ -MENUBAR MENU_BAR(5) - -MENU MENU_BAR(5) - SUBMENU MENU_FILE "~File" - -/* ef0 -6 */ -MENUBAR MENU_BAR(6) - -MENU MENU_BAR(6) - SUBMENU MENU_FILE "~File" - -/* ef0 -7 */ -MENUBAR MENU_BAR(7) - -MENU MENU_BAR(7) - SUBMENU MENU_FILE "~File" - -/* ef0 -8 */ -MENUBAR MENU_BAR(8) - -MENU MENU_BAR(8) - SUBMENU MENU_FILE "~File" - diff --git a/ef/ef0100.cpp b/ef/ef0100.cpp index fd302c9bb..e8848bba3 100755 --- a/ef/ef0100.cpp +++ b/ef/ef0100.cpp @@ -1,5 +1,8 @@ #include +#include #include +#include +#include #include "../ve/velib.h" @@ -19,11 +22,12 @@ class TVariazione_effetti: public TRelation_application TMask *_msk; TEffetto *_effetto; TRelation *_rel; - TLocalisamfile *_reff, *_cess, *_com, * _doc, * _rdoc, *_cfven, *_occas; + protected: virtual void init_query_mode(TMask&); virtual void init_insert_mode(TMask&); virtual bool get_next_key(TToken_string& key); + virtual void init_modify_mode(TMask&); static bool handle_sheet(TMask_field& f, KEY); static bool codval_handler(TMask_field& f, KEY k); static bool contab_handler(TMask_field& f, KEY k); @@ -55,7 +59,8 @@ inline TVariazione_effetti& app() {return (TVariazione_effetti&)main_app();} void TVariazione_effetti::init_query_mode(TMask&) { _msk->reset(F_TOTIMP); - _msk->reset(F_TOTIMPVAL); + _msk->reset(F_TOTIMPVAL); + _msk->enable(F_TIPOCF); } // quando si va in insert mode resetta i due campi della maschera relativi @@ -68,8 +73,13 @@ void TVariazione_effetti::init_insert_mode(TMask&) TToken_string riga("|||||||||"); righe_sheet().row(0) = riga; righe_sheet().set_dirty(); + _msk->enable(F_TIPOCF); } +void TVariazione_effetti::init_modify_mode(TMask&) +{ + _msk->disable(F_TIPOCF); +} // ritorna il prossimo numero valido di chiave bool TVariazione_effetti::get_next_key(TToken_string& key) { @@ -165,10 +175,10 @@ void TVariazione_effetti::common_f(const TMask& m) int TVariazione_effetti::read(TMask& m) { m.autoload(*_rel); - TLocalisamfile f(LF_EFFETTI); int err = _rel->status(); if (err == NOERR) { + TLocalisamfile f(LF_EFFETTI); // legge l'effetto dal record corrente della relazione err = _effetto->read(f, _rel->curr()); if (err == NOERR) @@ -187,15 +197,15 @@ int TVariazione_effetti::read(TMask& m) riga.cut(0); riga.add(rec.get(CES_RAGSOC)); riga.add(rec.get(CES_LOCALITA)); - riga.add(rec.get(CES_STATO)); // per caricare nello sheet dei cessionari la denominazione // del comune di cui si conosce il codice - codcom = rec.get(CES_COM); + codcom = rec.get(CES_STATO); + codcom << '|' << rec.get(CES_COM); riga.add(codcom); - _com->zero(); - _com->put(COM_COM, codcom); - if (_com->read() == NOERR) - riga.add(_com->get(COM_DENCOM)); + + const TRectype& com = cache().get(LF_COMUNI, codcom); + riga.add(com.get(COM_DENCOM)); + shcess.row(i-1)=riga; } items = _effetto->rows_r(); @@ -258,16 +268,12 @@ bool TVariazione_effetti::remove() // crea la relap bool TVariazione_effetti::user_create() -{ +{ + open_files(LF_TAB, LF_TABCOM, LF_EFFETTI, LF_REFFETTI, LF_CESS, + LF_COMUNI, LF_DOC, LF_RIGHEDOC, + LF_CLIFO, LF_CFVEN, LF_OCCAS, 0); _msk = new TMask("ef0100a") ; _rel = new TRelation(LF_EFFETTI); - _reff = new TLocalisamfile(LF_REFFETTI); - _cess = new TLocalisamfile(LF_CESS); - _com = new TLocalisamfile(LF_COMUNI); - _doc = new TLocalisamfile(LF_DOC); - _rdoc = new TLocalisamfile(LF_RIGHEDOC); - _cfven = new TLocalisamfile(LF_CFVEN); - _occas = new TLocalisamfile(LF_OCCAS); _effetto = new TEffetto; _msk->set_handler(F_CODVAL, codval_handler); _msk->set_handler(F_EFFCONT, contab_handler); @@ -284,13 +290,6 @@ bool TVariazione_effetti::user_destroy() delete _msk; delete _rel; delete _effetto; - delete _reff; - delete _cess; - delete _com; - delete _doc; - delete _rdoc; - delete _cfven; - delete _occas; return TRUE; } diff --git a/ef/ef0100.h b/ef/ef0100.h index 350ebdbb3..df2ccd6fe 100755 --- a/ef/ef0100.h +++ b/ef/ef0100.h @@ -34,6 +34,7 @@ #define F_EFFCONT 228 #define F_EFFCOMP 229 #define F_SHEET_EFF 230 +#define F_TIPOCF 231 // Identificatori campi per lo spreadsheet dei Cessionari #define F_RAGSOC 101 diff --git a/ef/ef0100a.uml b/ef/ef0100a.uml index 72ddb7f52..075773c20 100755 --- a/ef/ef0100a.uml +++ b/ef/ef0100a.uml @@ -8,37 +8,60 @@ ENDPAGE PAGE "Testata/Righe" 0 -1 0 19 -GROUPBOX DLG_NULL 80 5 +GROUPBOX DLG_NULL 78 6 BEGIN PROMPT 0 0 "" END NUMBER F_NPROGTR 7 BEGIN - PROMPT 1 1 "Numero " + PROMPT 1 1 "Numero " FIELD NPROGTR - FLAGS "R" KEY 1 USE LF_EFFETTI KEY 1 - JOIN LF_CLIFO TO LF_EFFETTI KEY 1 INTO CODCF=CODCF TIPOCF="C" + JOIN LF_CLIFO TO LF_EFFETTI KEY 1 INTO CODCF=CODCF TIPOCF=F_TIPOCF INPUT NPROGTR F_NPROGTR - DISPLAY "Nr. progressivo" NPROGTR - DISPLAY "Codice cliente" CODCF - DISPLAY "Data scadenza" DATASCAD - DISPLAY "Tipo distinta" TIPODIST - DISPLAY "Nr. distinta" NDIST - DISPLAY "Ragione Sociale Cliente@50" LF_CLIFO->RAGSOC + DISPLAY "Nr.progr." NPROGTR + DISPLAY "Tipo" TIPOCF + DISPLAY "Cod.cliente\nfornitore@11" CODCF + DISPLAY "Data\nscadenza@10" DATASCAD + DISPLAY "Tipo\ndistinta@9" TIPODIST + DISPLAY "Nr.\ndistinta@9" NDIST + DISPLAY "Ragione Sociale@50" LF_CLIFO->RAGSOC OUTPUT F_NPROGTR NPROGTR CHECKTYPE REQUIRED MESSAGE COPY,10@ END +LIST F_TIPOCF 10 +BEGIN + PROMPT 1 2 "Tipo effetto " + ITEM "C|Attivo" + MESSAGE SHOW,8@|HIDE,9@ + ITEM "F|Passivo" + MESSAGE HIDE,8@|SHOW,9@ + FIELD TIPOCF +END + +TEXT DLG_NULL +BEGIN + PROMPT 1 3 "Cliente" + GROUP 8 +END + +TEXT DLG_NULL +BEGIN + PROMPT 1 3 "Fornitore" + GROUP 9 +END + + NUMBER F_CODCF 6 BEGIN - PROMPT 1 2 "Cliente " + PROMPT 15 3 "" FIELD CODCF USE LF_CLIFO - INPUT TIPOCF "C" + INPUT TIPOCF F_TIPOCF SELECT INPUT CODCF F_CODCF DISPLAY "Codice" CODCF DISPLAY "Ragione sociale@50" RAGSOC @@ -53,9 +76,9 @@ END STRING F_CFRAGSOC 50 BEGIN - PROMPT 27 2 "" + PROMPT 25 3 "" USE LF_CLIFO KEY 2 - INPUT TIPOCF "C" + INPUT TIPOCF F_TIPOCF SELECT INPUT RAGSOC F_CFRAGSOC DISPLAY "Ragione sociale@60" RAGSOC DISPLAY "Codice" CODCF @@ -67,7 +90,7 @@ END DATE F_DATASCAD BEGIN - PROMPT 1 3 "Data scadenza " + PROMPT 1 4 "Data scadenza " FIELD DATASCAD KEY 3 USE LF_EFFETTI KEY 3 @@ -87,7 +110,7 @@ END LIST F_TIPOPAG 24 BEGIN - PROMPT 1 5 "Tipo pagamento " + PROMPT 1 6 "Tipo pagamento " FIELD TIPOPAG ITEM "2|Tratta" ITEM "3|Ricevuta Bancaria" @@ -101,7 +124,7 @@ END STRING F_ULTCLASS 1 BEGIN - PROMPT 46 5 "Ulteriore classificazione " + PROMPT 46 6 "Ulteriore classificazione " FIELD ULTCLASS USE %CLR INPUT CODTAB[1,1] F_TIPOPAG SELECT @@ -113,7 +136,7 @@ END STRING F_CODVAL 3 BEGIN - PROMPT 1 6 "Codice valuta " + PROMPT 1 7 "Codice valuta " FIELD CODVAL FLAGS "UZ" USE %VAL @@ -126,7 +149,7 @@ END DATA F_DATACAM BEGIN - PROMPT 46 6 "Data cambio " + PROMPT 46 7 "Data cambio " FIELD DATACAMBIO FLAGS "R" USE CAM @@ -143,7 +166,7 @@ END NUMBER F_CAMBIO 15 5 BEGIN - PROMPT 1 7 "Cambio " + PROMPT 1 8 "Cambio " FIELD CAMBIO FLAGS "RU" PICTURE ".5" @@ -154,11 +177,11 @@ END BOOLEAN F_ULTRATA BEGIN - PROMPT 46 7 "Ultima rata" + PROMPT 46 8 "Ultima rata" FIELD ULTRATA END -SPREADSHEET F_SHEET_RIGHE 0 7 +SPREADSHEET F_SHEET_RIGHE 0 -2 BEGIN PROMPT 1 9 "Righe effetto" ITEM "Importo effetto@14" @@ -176,28 +199,26 @@ BEGIN ITEM "Nr. rata" END -NUMBER F_TOTIMP 18 2 +CURRENCY F_TOTIMP 18 BEGIN - PROMPT 1 17 "Totale importi " + PROMPT 1 -1 "Totale importi " FIELD IMPORTO - PICTURE "###.###.###.###,@@" FLAG "D" END -NUMBER F_TOTIMPVAL 18 3 +CURRENCY F_TOTIMPVAL 18 BEGIN - PROMPT 1 18 "Totale importi in valuta " + PROMPT 41 -1 "Totale in valuta " + DRIVENBY F_CODVAL FIELD IMPORTOVAL - PICTURE "###.###.###.###,@@@" FLAG "D" - //GROUP 1 END ENDPAGE PAGE "Parametri" 0 -1 0 19 -GROUPBOX DLG_NULL 80 5 +GROUPBOX DLG_NULL 78 5 BEGIN PROMPT 0 0 "" END @@ -209,9 +230,21 @@ BEGIN GROUP 10 END +TEXT DLG_NULL +BEGIN + PROMPT 1 2 "Cliente" + GROUP 8 +END + +TEXT DLG_NULL +BEGIN + PROMPT 1 2 "Fornitore" + GROUP 9 +END + NUMBER DLG_NULL 6 BEGIN - PROMPT 1 2 "Cliente " + PROMPT 16 2 "" FLAGS "RD" GROUP 11 END @@ -277,14 +310,14 @@ BEGIN PROMPT 42 6 "Codice ABI " FIELD CODABIP FLAGS "Z" - USE %BAN KEY 1 SELECT CODTAB ?= "?????" - INPUT CODTAB F_CODABIP - DISPLAY "Codice ABI" CODTAB[1,5] - DISPLAY "Denominazione@50" S0 - OUTPUT F_CODABIP CODTAB[1,5] - OUTPUT F_CODCABP CODTAB[6,10] - CHECKTYPE NORMAL - WARNING "Codice ABI assente" +// USE BNP KEY 1 SELECT CODTAB ?= "?????" +// INPUT CODTAB F_CODABIP +// DISPLAY "Codice ABI" CODTAB[1,5] +// DISPLAY "Denominazione@50" S0 +// OUTPUT F_CODABIP CODTAB[1,5] +// OUTPUT F_CODCABP CODTAB[6,10] +// CHECKTYPE NORMAL +// WARNING "Codice ABI assente" END NUMBER F_CODCABP 5 @@ -292,7 +325,8 @@ BEGIN PROMPT 42 7 "Codice CAB " FIELD CODCABP FLAGS "Z" - USE %BAN KEY 1 SELECT CODTAB ?= "??????????" + USE BNP +// KEY 1 SELECT CODTAB ?= "??????????" INPUT CODTAB[1,5] F_CODABIP INPUT CODTAB[6,10] F_CODCABP DISPLAY "Codice ABI" CODTAB[1,5] @@ -392,7 +426,7 @@ ENDPAGE PAGE "Cessionari" 0 -1 0 19 -GROUPBOX DLG_NULL 80 5 +GROUPBOX DLG_NULL 78 5 BEGIN PROMPT 0 0 "" END @@ -404,10 +438,22 @@ BEGIN GROUP 10 END +TEXT DLG_NULL +BEGIN + PROMPT 1 2 "Cliente" + GROUP 8 +END + +TEXT DLG_NULL +BEGIN + PROMPT 1 2 "Fornitore" + GROUP 9 +END + NUMBER DLG_NULL 6 BEGIN - PROMPT 1 2 "Cliente " - FLAGS "RD" + PROMPT 16 2 "" + FLAGS "D" GROUP 11 END @@ -425,7 +471,7 @@ BEGIN GROUP 13 END -SPREADSHEET F_SHEET_EFF 0 8 +SPREADSHEET F_SHEET_EFF BEGIN PROMPT 1 6 "Obbligati principali" ITEM "Ragione Sociale@50" diff --git a/ef/ef0101.cpp b/ef/ef0101.cpp index 7ace51470..449f29de8 100755 --- a/ef/ef0101.cpp +++ b/ef/ef0101.cpp @@ -14,8 +14,8 @@ TEffetto::TEffetto() TEffetto::TEffetto(TRectype& rec) : TRectype(LF_EFFETTI), _righe(LF_REFFETTI, REFF_NRIGATR), _cess(LF_CESS, CES_NRIGA) { - TLocalisamfile f(LF_EFFETTI); - read(f,rec); + TLocalisamfile f(LF_EFFETTI); + read(f,rec); } TEffetto::TEffetto(const TEffetto& eff) @@ -139,9 +139,8 @@ int TEffetto::read(TLocalisamfile& f, const TRectype& rec, word lockop) int TEffetto::read(TLocalisamfile& f, char tipodist, long ndist, int nrigadist, word lockop) { f.setkey(4); - TRectype rec(LF_EFFETTI); + TRectype& rec = head(); put_key(rec, tipodist, ndist, nrigadist); - head() = rec; return leggi(f, rec); // c'era lockop ??? } @@ -162,8 +161,8 @@ int TEffetto::write(TLocalisamfile& f, bool force) if (err != NOERR) err = TRectype::write(f); } - } - else + } + else { if (nuovo) { @@ -176,7 +175,7 @@ int TEffetto::write(TLocalisamfile& f, bool force) if (err == _isreinsert) myself.renum(); } while (err == _isreinsert); - } + } else { err = TRectype::write(f); @@ -241,3 +240,9 @@ const bool TEffetto::in_valuta() val.upper(); return val.not_empty() && val != "LIT"; } + +const char TEffetto::get_tipo() const +{ + const char tipo = get_char(EFF_TIPOCF); + return tipo == '\0' ? 'C' : tipo; +} diff --git a/ef/ef0101.h b/ef/ef0101.h index 529e07c95..8622d19d5 100755 --- a/ef/ef0101.h +++ b/ef/ef0101.h @@ -43,6 +43,8 @@ public: TRectype& row_c(int i, bool create=FALSE) { return _cess.row(i,create); } // ritorna la riga i delle righe TRectype& row_r(int i, bool create=FALSE) { return _righe.row(i,create); } + // ritorna la riga i delle righe + const TRectype& row_r(int i) const { return _righe.row(i); } // ritorna il numero delle righe presenti nelle righe effetto int rows_r() const { return _righe.rows(); } // ritorna il numero delle righe presenti nei cessionari @@ -82,6 +84,7 @@ public: // restituisce l'importo dell'effetto real importo(const bool valuta = FALSE) const { return get_real(valuta ? EFF_IMPORTOVAL : EFF_IMPORTO); } const bool in_valuta() ; + const char get_tipo() const ; // setta i campi per la quarta chiave del file void put_key(TRectype& rec,char tipodist, long ndist, int nrigadist = 0); // setta i campi per la prima chiave del file diff --git a/ef/ef0300.cpp b/ef/ef0300.cpp index aa78fdde3..cdba6ae1f 100755 --- a/ef/ef0300.cpp +++ b/ef/ef0300.cpp @@ -38,14 +38,13 @@ protected: static bool imp_notify(TSheet_field& s, int r, KEY key); static bool conferma_handler(TMask_field& f, KEY k); static bool annulla_handler(TMask_field& f, KEY k); - static bool from_data_handler(TMask_field& f, KEY k); - static bool to_data_handler(TMask_field& f, KEY k); + static bool data_handler(TMask_field& f, KEY k); static bool ordina_handler(TMask_field& f, KEY k); static void calcola_totale(); static void calcola(); static void aggiungi(); static bool effetto_aggiunto(const long numero); - static void carica_riba(int tipopag); + static void carica_riba(int tipopag, const bool reset = TRUE); static void ord_data(); static void ord_fatt(); // ritorna un riferimento allo sheet degli effetti (righe) nella @@ -75,6 +74,7 @@ void TVariazione_distinte::init_query_mode(TMask&) _msk->enable(F_TIPODIST); _msk->reset(F_TOTIMP); _msk->enable(F_TIPOPAG); + _msk->enable(F_TIPOCF); } // quando si va in insert mode resetta i campi della maschera relativi @@ -86,7 +86,8 @@ void TVariazione_distinte::init_insert_mode(TMask&) _msk->enable(F_CODVAL); _msk->disable(F_NUMBER); _msk->disable(F_TIPODIST); - _msk->enable(F_TIPOPAG); + _msk->enable(F_TIPOPAG); + _msk->enable(F_TIPOCF); } // quando si va in modify mode disabilta i campi relativi alla chiave @@ -96,6 +97,7 @@ void TVariazione_distinte::init_modify_mode(TMask&) _msk->disable(F_NUMBER); _msk->disable(F_TIPODIST); _msk->disable(F_TIPOPAG); + _msk->disable(F_TIPOCF); } // ritorna il prossimo numero di distinta valido @@ -214,8 +216,9 @@ int TVariazione_distinte::read(TMask& m) riga.add(eff.get(EFF_DATASCAD)); //prendo la ragione sociale del cliente conoscendone il codice const long codcf = eff.get_long(EFF_CODCF); + const char tipo = eff.get_tipo(); _clifo->zero(); - _clifo->put(CLI_TIPOCF , 'C'); + _clifo->put(CLI_TIPOCF , tipo); _clifo->put(CLI_CODCF, codcf); if (_clifo->read() == NOERR) riga.add(_clifo->get(CLI_RAGSOC)); @@ -246,14 +249,11 @@ int TVariazione_distinte::read(TMask& m) m.enable(F_CODVAL, valuta); } riga.add(codval); -// riga.add(eff.get(EFF_IMPORTO)); -// riga.add(eff.get(EFF_IMPORTOVAL)); - TCurrency soldi; - soldi.read(eff, EFF_IMPORTO, NULL); + TCurrency soldi(eff.get_real(EFF_IMPORTO), "_FIRM"); riga.add(soldi.string(TRUE)); - soldi.read(eff, EFF_IMPORTOVAL, EFF_CODVAL); - if (!soldi.get_num().is_zero()) - riga.add(soldi.string(TRUE)); + TCurrency soldival(eff.get_real(EFF_IMPORTOVAL), codval); + if (!soldival.get_num().is_zero()) + riga.add(soldival.string(TRUE)); shrighe.row(i) = riga; } @@ -387,8 +387,8 @@ bool TVariazione_distinte::user_create() _m2->set_handler(F_TOTIMPDIST, imp_aut_handler); _m2->set_handler(DLG_OK, conferma_handler); _m2->set_handler(DLG_CANCEL, annulla_handler); - _m2->set_handler(F_DADATA, from_data_handler); - _m2->set_handler(F_ADATA, to_data_handler); + _m2->set_handler(F_DADATA, data_handler); + _m2->set_handler(F_ADATA, data_handler); _m2->set_handler(F_TIPORD, ordina_handler); righe_sheet().set_notify(impdist_notify); righe_sel_sheet().set_notify(imp_notify); @@ -430,7 +430,7 @@ bool TVariazione_distinte::effetto_aggiunto(const long numero) // LF_EFFETTI che non hanno ancora un riferimento ad una distinta; // inoltre è possibile inserire nella distinta effetti aventi lo stesso // tipo di pagamento. -void TVariazione_distinte::carica_riba(int tipopag) +void TVariazione_distinte::carica_riba(int tipopag, const bool reset) { // deve caricare solo quegli effetti che non hanno riferimento alla // distinta quindi setta i campi ad essa relativi a zero @@ -443,9 +443,11 @@ void TVariazione_distinte::carica_riba(int tipopag) TLocalisamfile * clifo = app()._clifo; TToken_string riga(80); TMask* m2 = app()._m2; - m2->reset(); + if (reset) + m2->reset(); TSheet_field& sf = (TSheet_field&)m2->field(F_SHEET); - sf.reset(); + if (reset) + sf.reset(); TString16 codval = app()._msk->get(F_CODVAL); if (codval.empty()) codval = "LIT"; @@ -453,6 +455,8 @@ void TVariazione_distinte::carica_riba(int tipopag) int err, i = 0; err = eff.read(f, tipodist, ndist, nrigadist); int tipop = eff.get_int(EFF_TIPOPAG); + int tipod = app()._msk->get(F_TIPOCF)[0]; + while ( (err == NOERR) && (tipodist == 0)) { // se effetti di tipo cambiario (pagherò, tratta, tratta accettata) @@ -461,13 +465,16 @@ void TVariazione_distinte::carica_riba(int tipopag) const bool to_select = (tipopag == 0) || (tipopag == tipop) || ((tipopag == 2 || tipopag ==5 || tipopag == 7) && (tipop == 2 || tipop ==5 || tipop == 7)); - + char tipo = eff.get_tipo(); TString16 valuta = eff.get(EFF_CODVAL); - if (valuta.empty()) valuta = "LIT"; + + if (valuta.empty()) + valuta = "LIT"; + const bool valuta_ok = valuta == codval; const long numero = eff.get_long(EFF_NPROGTR); - if (to_select && valuta_ok && !effetto_aggiunto(numero)) + if (to_select && valuta_ok && !effetto_aggiunto(numero) && tipo == tipod) { riga = " "; // Campo selezione @@ -475,7 +482,7 @@ void TVariazione_distinte::carica_riba(int tipopag) riga.add(eff.get(EFF_DATASCAD)); long codcf = eff.get_long(EFF_CODCF); clifo->zero(); - clifo->put(CLI_TIPOCF, 'C'); + clifo->put(CLI_TIPOCF, tipo); clifo->put(CLI_CODCF, codcf); if (clifo->read() == NOERR) riga.add(clifo->get(CLI_RAGSOC)); @@ -499,15 +506,12 @@ void TVariazione_distinte::carica_riba(int tipopag) } riga.add(valuta); -// riga.add(eff.get(EFF_IMPORTO)); - TCurrency soldi; - soldi.read(eff, EFF_IMPORTO, NULL); + TCurrency soldi(eff.get_real(EFF_IMPORTO), "_FIRM"); riga.add(soldi.string(TRUE)); -// riga.add(eff.get(EFF_IMPORTOVAL)); - soldi.read(eff, EFF_IMPORTOVAL, EFF_CODVAL); - if (!soldi.get_num().is_zero()) - riga.add(soldi.string(TRUE)); + TCurrency soldival(eff.get_real(EFF_IMPORTOVAL), codval); + if (!soldival.get_num().is_zero()) + riga.add(soldival.string(TRUE)); sf.row(i) = riga; i++; @@ -658,66 +662,42 @@ bool TVariazione_distinte::annulla_handler(TMask_field& f, KEY k) // Handler per gestire la scelta per data, nella maschera di scelta // delle riba (ef0300c) -bool TVariazione_distinte::from_data_handler(TMask_field& f, KEY k) +bool TVariazione_distinte::data_handler(TMask_field& f, KEY k) { - if (k == K_TAB) - { - TMask& m = f.mask(); - if (!f.get().empty()) - { - bool deleted = FALSE; - TDate data = m.get_date(F_DADATA); - TSheet_field& sf = (TSheet_field&)m.field(F_SHEET); -// tolgo dallo sheet gli effetti che hanno una data minore a quella -// indicata nel campo della maschera - for(int i = 0; i < sf.items(); i++) - { - if (deleted) i--; - TToken_string& row = sf.row(i); - TDate data_sh = (TDate)row.get(2); - if (data_sh < data) - { - sf.destroy(i); - deleted = TRUE; - } - else deleted = FALSE; - } - } + if (f.to_check(k) && k == K_TAB) + { + // Carica prima tutte le ri.ba e poi toglie quelle che non servono in base alla selzione + app().begin_wait(); + int tipopag = app()._msk->get_int(F_TIPOPAG); + carica_riba(tipopag, FALSE); + app().end_wait(); + + TMask& m = f.mask(); + bool deleted = FALSE; + TDate datad = m.get_date(F_DADATA); + TDate dataa = m.get_date(F_ADATA); + + if (!datad.ok()) + datad = botime; + if (!dataa.ok()) + dataa = eotime; + TDate data_sh; + TSheet_field& sf = (TSheet_field&)m.field(F_SHEET); + TString_array& sa = sf.rows_array(); + // tolgo dallo sheet gli effetti che hanno la data non compresa nel range + for (int i = sa.items()-1; i >=0 ; i--) + { + TToken_string& row = sa.row(i); + data_sh = (TDate)row.get(2); + if (data_sh > dataa || data_sh < datad) + sa.remove(i); + } + sa.pack(); + sf.force_update(); } return TRUE; } -// Handler per gestire la scelta per data, nella maschera di scelta -// delle riba (ef0300c) -bool TVariazione_distinte::to_data_handler(TMask_field& f, KEY k) -{ - if (k == K_TAB) - { - TMask& m = f.mask(); - if (!f.get().empty()) - { - bool deleted = FALSE; - TDate data = m.get_date(F_ADATA); - TSheet_field& sf = (TSheet_field&)m.field(F_SHEET); -// tolgo dallo sheet gli effetti che hanno una data maggiore a quella -// indicata nel campo della maschera - for(int i = 0; i < sf.items(); i++) - { - if (deleted) i--; - TToken_string& row = sf.row(i); - TDate data_sh = (TDate)row.get(2); - if (data_sh > data) - { - sf.destroy(i); - deleted = TRUE; - } - else deleted = FALSE; - } - } - } - return TRUE; -} - // COMPARE FUNCTION per l'ordinamento per data degli effetti presenti // nello sheet, nella maschera di scelta delle riba (ef0300c) HIDDEN int confronta_data(const TObject** o1, const TObject** o2) @@ -906,4 +886,4 @@ int ef0300(int argc, char* argv[]) TVariazione_distinte a ; a.run(argc, argv, "Distinte di presentazione"); return 0; -} \ No newline at end of file +} diff --git a/ef/ef0300.h b/ef/ef0300.h index c286e4799..faf6300f6 100755 --- a/ef/ef0300.h +++ b/ef/ef0300.h @@ -17,6 +17,7 @@ #define F_TIPOPAG 112 #define F_SHEET_RIBA 113 #define F_NPROGTR 114 +#define F_TIPOCF 115 // Identificatori campi per lo spreadsheet di selezione RiBa da aggiungere // alla distinta (ef0300c.uml) diff --git a/ef/ef0300a.uml b/ef/ef0300a.uml index 9b17c9eb9..3f5a0b86e 100755 --- a/ef/ef0300a.uml +++ b/ef/ef0300a.uml @@ -38,15 +38,19 @@ BEGIN FLAGS "R" KEY 4 USE LF_EFFETTI KEY 4 SELECT NRIGADIST == 1 - INPUT NDIST F_NUMBER INPUT TIPODIST F_TIPODIST + INPUT NDIST F_NUMBER INPUT NRIGADIST F_NUMBERRIGA - DISPLAY "Nr. distinta" NDIST - DISPLAY "Tipo distinta" TIPODIST + DISPLAY "Numero" NDIST + DISPLAY "Tipo" TIPODIST + DISPLAY "Data@10" DATADIST + DISPLAY "ABI@5" CODABIP + DISPLAY "CAB@5" CODCABP OUTPUT F_NUMBER NDIST OUTPUT F_TIPODIST TIPODIST OUTPUT F_NUMBERRIGA NRIGADIST OUTPUT F_NPROGTR NPROGTR + OUTPUT F_TIPOCF TIPOCF CHECKTYPE REQUIRED END @@ -64,20 +68,29 @@ BEGIN FIELD LF_EFFETTI->DATADIST END +LIST F_TIPOCF 10 +BEGIN + PROMPT 48 2 "Tipo effetti " + ITEM "C|Attivi" + ITEM "F|Passivi" +END + NUMBER F_CODABIP 5 0 BEGIN PROMPT 15 3 "Codice ABI " FIELD LF_EFFETTI->CODABIP FLAGS "RZ" - USE %BAN KEY 1 SELECT CODTAB ?= "?????" - INPUT CODTAB F_CODABIP + USE BNP + JOIN %BAN ALIAS 100 INTO CODTAB==CODTAB + INPUT CODTAB[1,5] F_CODABIP + INPUT CODTAB[6,10] F_CODCABP DISPLAY "Codice ABI" CODTAB[1,5] - DISPLAY "Denominazione@50" S0 + DISPLAY "Codice CAB" CODTAB[6,10] + DISPLAY "Denominazione@50" 100@->S0 OUTPUT F_CODABIP CODTAB[1,5] OUTPUT F_CODCABP CODTAB[6,10] - OUTPUT F_DENBANP S0 + OUTPUT F_DENBANP 100@->S0 CHECKTYPE REQUIRED - WARNING "Codice ABI assente" END NUMBER F_CODCABP 5 0 @@ -85,32 +98,21 @@ BEGIN PROMPT 15 4 "Codice CAB " FIELD LF_EFFETTI->CODCABP FLAGS "RZ" - USE %BAN KEY 1 SELECT CODTAB ?= "??????????" - INPUT CODTAB[1,5] F_CODABIP - INPUT CODTAB[6,10] F_CODCABP - DISPLAY "Codice ABI" CODTAB[1,5] - DISPLAY "Codice CAB" CODTAB[6,10] - DISPLAY "Denominazione@50" S0 - OUTPUT F_CODABIP CODTAB[1,5] - OUTPUT F_CODCABP CODTAB[6,10] - OUTPUT F_DENBANP S0 - CHECKTYPE REQUIRED - VALIDATE REQIF_FUNC 1 F_CODCABP - WARNING "Banca assente" + COPY ALL F_CODABIP END STRING F_DENBANP 50 BEGIN PROMPT 2 5 "Banca di Presentazione " - FLAGS "U" USE %BAN KEY 2 INPUT S0 F_DENBANP DISPLAY "Denominazione@50" S0 DISPLAY "Codice ABI" CODTAB[1,5] DISPLAY "Codice CAB" CODTAB[6,10] - OUTPUT F_DENBANP S0 OUTPUT F_CODABIP CODTAB[1,5] OUTPUT F_CODCABP CODTAB[6,10] + OUTPUT F_DENBANP S0 + CHECKTYPE REQUIRED END LIST F_TIPOPAG 24 diff --git a/ef/ef0300b.uml b/ef/ef0300b.uml index 50915bd80..3d54601e9 100755 --- a/ef/ef0300b.uml +++ b/ef/ef0300b.uml @@ -70,21 +70,22 @@ BEGIN FLAGS "DR" END -BUTTON DLG_OK 9 2 +BUTTON DLG_OK 10 2 BEGIN PROMPT -13 -1 "" END -BUTTON DLG_CANCEL 9 2 +BUTTON DLG_CANCEL 10 2 BEGIN PROMPT -23 -1 "" END -BUTTON DLG_DELREC 9 2 +BUTTON DLG_DELREC 10 2 BEGIN PROMPT -33 -1 "Elimina" - MESSAGE EXIT, K_DEL - FLAGS "H" + PICTURE BMP_DELREC + PICTURE BMP_DELRECDN + MESSAGE "X",F_CHECK END ENDPAGE diff --git a/ef/ef0300c.uml b/ef/ef0300c.uml index a19ff145e..85ec80722 100755 --- a/ef/ef0300c.uml +++ b/ef/ef0300c.uml @@ -5,7 +5,7 @@ PAGE "Aggiungi Effetti alla Distinta" -1 -1 78 20 GROUPBOX DLG_NULL 60 3 BEGIN - PROMPT 1 1 "Selezione effetti per data" + PROMPT 1 1 "Visualizza effetti per data" END DATE F_DADATA diff --git a/ef/ef0301.cpp b/ef/ef0301.cpp index 6a55f6260..9b5a231aa 100755 --- a/ef/ef0301.cpp +++ b/ef/ef0301.cpp @@ -28,7 +28,7 @@ int TDistinta::read(const char tipo, const long numero, word lockop) { int err = NOERR; CHECK(tipo!='\0' && numero > 0,"Can't read distinta from NULL elements"); - TLocalisamfile f(LF_EFFETTI); + TLocalisamfile f(LF_EFFETTI); f.setkey(4); if (_righe_dist.items() > 0) // Se ha letto una distinta precedente, sblocca la prima riga { f.read((TRectype&)_righe_dist[0],_isequal,_unlock); @@ -64,24 +64,42 @@ int TDistinta::write(bool force, TToken_string* dati_dist) int err = NOERR; //quanti effetti sono nella distinta (nell'array in memoria) const int elem = items(); - TLocalisamfile f(LF_EFFETTI); + TLocalisamfile f(LF_EFFETTI); f.setkey(4); + for (int i=0; irestart(); effetto.put(EFF_TIPODIST, dati_dist->get()); - effetto.put(EFF_NDIST, dati_dist->get_long()); + effetto.put(EFF_NDIST, dati_dist->get()); effetto.put(EFF_DATADIST, dati_dist->get()); - effetto.put(EFF_CODABIP, dati_dist->get_long()); - effetto.put(EFF_CODCABP, dati_dist->get_long()); + effetto.put(EFF_CODABIP, dati_dist->get()); + effetto.put(EFF_CODCABP, dati_dist->get()); effetto.put(EFF_NRIGADIST, i+1); } //riscrivo l'effetto con i dati della distinta a cui appartiene err = effetto.rewrite(f); } + + if (dati_dist) + { + f.setkey(4); + f.put(EFF_TIPODIST, dati_dist->get(0)); + f.put(EFF_NDIST, dati_dist->get()); + + int i = elem; + f.put(EFF_NRIGADIST, ++i); + for (int e = f.read(); e == NOERR; e = f.read()) + { + TEffetto eff(f.curr()); + eff.remove(f); + f.put(EFF_NRIGADIST, ++i); + } + } + return err; } diff --git a/ef/ef0301.h b/ef/ef0301.h index a301bb60a..16139ac71 100755 --- a/ef/ef0301.h +++ b/ef/ef0301.h @@ -13,6 +13,10 @@ class TDistinta:public TObject { //array che contiene puntatori agli effetti nella distinta TArray _righe_dist; + +protected: + TEffetto& eff(int n) { return (TEffetto&)_righe_dist[n]; } + public: //ritorna un riferimento all'array degli effetti nella distinta TArray& righe(){ return _righe_dist;} @@ -32,6 +36,8 @@ public: int remove(char tipodist, long ndist); //restituisce il tipo di distinta const char tipodist() const { return ((TRectype&)_righe_dist[0]).get_char(EFF_TIPODIST); } + //restituisce il tipo degli effetti della distinta (lienti/ornitori) + const char tipocf() const { return ((TRectype&)_righe_dist[0]).get_char(EFF_TIPOCF); } //restituisce il numero di distinta const long ndist() const { return ((TRectype&)_righe_dist[0]).get_long(EFF_NDIST); } //restituisce il codice valuta della distinta @@ -47,7 +53,7 @@ public: //restituisce il codice cab di presentazione effetti const TString& cabp()const { return ((TRectype&)_righe_dist[0]).get(EFF_CODCABP); } // restituisce l'effetto n-esimo - TRectype& operator[](const int index) { return (TRectype&) _righe_dist[index]; } + TEffetto& operator[](const int index) { return eff(index); } //costruttore di default TDistinta() {}; //costruttore distinta del tipo e numero passato diff --git a/ef/ef0400.cpp b/ef/ef0400.cpp index f4374ef89..ff49ddd70 100755 --- a/ef/ef0400.cpp +++ b/ef/ef0400.cpp @@ -3,7 +3,7 @@ #include #include #include -#include + #include "ef0.h" #include "ef0101.h" #include "ef0400.h" @@ -153,44 +153,47 @@ bool TEliminazione_effetti::to_data_handler(TMask_field& f, KEY k) // appartengono void TEliminazione_effetti::elimina() { - const TRectype *from = app()._from; - const TRectype *to = app()._to; - TMask *m = app()._msk; - TRelation *rel = app()._rel; - const char* filter; - int key; - char op1 = m->get(F_TIPOSEL)[0]; - char op2 = m->get(F_TIPOCANC)[0]; - switch (op1) //scelgo la chiave per il cursore - { + const TRectype *from = app()._from; + const TRectype *to = app()._to; + TMask *m = app()._msk; + TRelation *rel = app()._rel; + TString filter; + + int key; + char op1 = m->get(F_TIPOSEL)[0]; + char op2 = m->get(F_TIPODIST)[0]; + char op3 = m->get(F_TIPOCANC)[0]; + switch (op1) //scelgo la chiave per il cursore + { case 'N': //selezione effetti per numero key = 1; break; case 'D': //selezione effetti per data key = 3; break; - } - switch (op2) //scelgo il filtro per il cursore - { + } + //scelgo il filtro per il cursore + filter << "(TIPOCF=\")" << op2 << "\")"; + switch (op3) + { case 'S': //cancello effetti stampati - filter = "EFFSTAMP=\"X\""; + filter << "&&(EFFSTAMP=\"X\")"; break; case 'C': //cancello effetti contabilizzati - filter = "EFFCONT=\"X\""; + filter << "&&(EFFCONT=\"X\")"; break; default : //cancello tutti gli effetti - filter = ""; break; - } - TCursor cur(rel,filter,key,from,to); // istanzio il cursore - TLocalisamfile& delfile = cur.file();// prendo un riferimento al file - long n = cur.items();// prendo il numero di elementi del cursore - cur.freeze();// congelo lo stato del cursore - for (cur=0; cur.pos() < n; ++cur)// scandisco tutti gli elementi del cursore - { - TEffetto eff(delfile.curr());// istanzio un effetto - eff.remove(delfile); // e lo cancello - } + } + TCursor cur(rel,filter,key,from,to); // istanzio il cursore + TLocalisamfile& delfile = cur.file();// prendo un riferimento al file + long n = cur.items();// prendo il numero di elementi del cursore + cur.freeze();// congelo lo stato del cursore + for (cur=0; cur.pos() < n; ++cur)// scandisco tutti gli elementi del cursore + { + TEffetto eff(delfile.curr());// istanzio un effetto + eff.remove(delfile); // e lo cancello + } } //Handler per gestire la conferma della cancellazione degli effetti @@ -199,8 +202,8 @@ bool TEliminazione_effetti::conferma_handler(TMask_field& f, KEY k) TMask &m = f.mask(); if (k == K_SPACE) { - if (yesno_box("Vuoi veramete eliminare gli effetti selezionati")) - elimina(); + if (yesno_box("Si desidera veramente eliminare gli effetti selezionati")) + elimina(); } return TRUE; } @@ -212,7 +215,7 @@ bool TEliminazione_effetti::annulla_handler(TMask_field& f, KEY k) TMask &m = f.mask(); if (k == K_SPACE) { - if (yesno_box("Vuoi veramete annullare i dati inseriti")) + if (yesno_box("Si desidera veramente annullare i dati inseriti")) m.reset(); } return TRUE; diff --git a/ef/ef0400.h b/ef/ef0400.h index 028b91446..960c86520 100755 --- a/ef/ef0400.h +++ b/ef/ef0400.h @@ -10,5 +10,6 @@ #define F_A_RIBA 104 #define F_DA_DATA 105 #define F_A_DATA 106 +#define F_TIPODIST 107 #endif// __EF0400_H diff --git a/ef/ef0400a.uml b/ef/ef0400a.uml index 4b48e3295..d038b9bdd 100755 --- a/ef/ef0400a.uml +++ b/ef/ef0400a.uml @@ -3,7 +3,7 @@ PAGE "Eliminazione Effetti" -1 -1 57 14 -LIST F_TIPOSEL 24 +LIST F_TIPOSEL 20 BEGIN PROMPT 2 1 "Tipo Selezione " ITEM "N|Numero progressivo" @@ -14,12 +14,19 @@ BEGIN MESSAGE ENABLE,2@ END -LIST F_TIPOCANC 24 +LIST F_TIPODIST 20 +BEGIN + PROMPT 2 2 "Tipo Effetti " + ITEM "C|Attivi" + ITEM "F|Passivi" +END + +LIST F_TIPOCANC 20 BEGIN PROMPT 2 3 "Tipo Cancellazione " ITEM "T|Tutti" - ITEM "S|Quelli stampati" - ITEM "C|Quelli contabilizzati" + ITEM "S|Stampati" + ITEM "C|Contabilizzati" END GROUPBOX DLG_NULL 55 3 @@ -33,7 +40,7 @@ BEGIN PROMPT 2 6 "Dalla Riba " GROUP 1 FIELD LF_EFFETTI->NPROGTR - USE LF_EFFETTI KEY 1 + USE LF_EFFETTI SELECT TIPOCF=#F_TIPODIST INPUT NPROGTR F_DA_RIBA DISPLAY "Nr. progressivo" NPROGTR DISPLAY "Data scadenza" DATASCAD @@ -46,7 +53,7 @@ BEGIN PROMPT 30 6 "Alla Riba " GROUP 1 FIELD LF_EFFETTI->NPROGTR - USE LF_EFFETTI KEY 1 + USE LF_EFFETTI SELECT TIPOCF=#F_TIPODIST INPUT NPROGTR F_A_RIBA DISPLAY "Nr. progressivo" NPROGTR DISPLAY "Data scadenza" DATASCAD @@ -67,7 +74,7 @@ BEGIN PROMPT 2 10 "Dalla Data " GROUP 2 FIELD LF_EFFETTI->DATASCAD - USE LF_EFFETTI KEY 3 + USE LF_EFFETTI KEY 3 SELECT TIPOCF=#F_TIPODIST INPUT DATASCAD F_DA_DATA DISPLAY "Data scadenza" DATASCAD DISPLAY "Nr. progressivo" NPROGTR @@ -81,7 +88,7 @@ BEGIN PROMPT 30 10 "Alla Data " GROUP 2 FIELD LF_EFFETTI->DATASCAD - USE LF_EFFETTI KEY 3 + USE LF_EFFETTI KEY 3 SELECT TIPOCF=#F_TIPODIST INPUT DATASCAD F_A_DATA DISPLAY "Data scadenza" DATASCAD DISPLAY "Nr. progressivo" NPROGTR diff --git a/ef/ef0500.cpp b/ef/ef0500.cpp index e0e756ce4..308b25cea 100755 --- a/ef/ef0500.cpp +++ b/ef/ef0500.cpp @@ -6,32 +6,34 @@ #include #include #include -//#include #include "ef0.h" #include "ef0301.h" #include "ef0500.h" +#include +#include + class TRiba_form; class TDistinta_form; class TRiba_file; -enum fo{kb360 = 1, kb720 = 2, kb1200 = 3, kb1440 = 4}; +enum fo { kb360 = 1, kb720 = 2, kb1200 = 3, kb1440 = 4 }; #define RIBAFILENAME "ribael.dat" /////////////////////////////////////////////////////////////////////// -// Classe per l'emissione di effetti e distinte su carta o su floppy // +// Classe per l'emissione di effetti e distinte su carta o su floppy // /////////////////////////////////////////////////////////////////////// class TEmissione: public TSkeleton_application { fo _foutput; TMask* _msk; - TRelation* _firmrel; - TRelation* _rel; + TRelation* _firmrel; + TRelation* _rel; TCursor* _cur; TRiba_form* _formrb; TDistinta_form* _formdse; TRiba_file* _trasfile; - int _base_page_no; + int _base_page_no; protected: virtual bool create(void); virtual void main_loop(); @@ -45,14 +47,14 @@ protected: void save_data_emis(void); void header_rb(void); void footer_ef(void); - void inizializza_cur(void); - void inizializza_file(void); + void inizializza_cur(void); + void inizializza_file(void); void record(THash_object& lavoro); - bool ok_write(void); - void aggiorna_rb(TCursor*); - void aggiorna_dist(TCursor*); - static bool annulla_handler(TMask_field& f, KEY k); -public: + bool ok_write(void); + void aggiorna_rb(TCursor*); + void aggiorna_dist(TCursor*); + static bool annulla_handler(TMask_field& f, KEY k); +public: int base_no() { return _base_page_no;} const TMask& msk() const {return *_msk;} TEmissione() {}; @@ -63,12 +65,12 @@ public: inline TEmissione& app() { return (TEmissione&) main_app();} ///////////////////////////////////////////////////////////// -// Classe TRiba_form customizzata dalla Form per le Ri.Ba. // +// Classe TRiba_form customizzata dalla Form per le Ri.Ba. // ///////////////////////////////////////////////////////////// class TRiba_form: public TForm -{ -protected: - virtual bool validate(TForm_item &, TToken_string &); +{ +protected: + virtual bool validate(TForm_item &, TToken_string &); public: TRiba_form(const char *); virtual ~TRiba_form(){}; @@ -78,13 +80,13 @@ public: // Classe TDistinta_form customizzata dalla Form per le Distinte // /////////////////////////////////////////////////////////////////// class TDistinta_form: public TForm -{ - TRelation *_firmrel; - TSorted_cursor *_cursor;// cursore che permette l'ordinamento degli effetti +{ + TRelation *_firmrel; + TSorted_cursor *_cursor;// cursore che permette l'ordinamento degli effetti protected: // nella distinta per data scadenza o per dati fattura - virtual bool validate(TForm_item &, TToken_string &); + virtual bool validate(TForm_item &, TToken_string &); public: - void set_order(const char tipo); + void set_order(const char tipo); virtual TCursor* cursor() const { return (TCursor*)_cursor;} TDistinta_form(const char*, TRelation *); virtual ~TDistinta_form(); @@ -94,21 +96,21 @@ public: // Classe TRiba_file customizzata dalla TFile_text // ///////////////////////////////////////////////////// class TRiba_file: public TFile_text -{ - long _nditta; +{ + long _nditta; real _tot_importi; -protected: +protected: virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str); public: TRiba_file(const TString& file_name, const TString& config_name):TFile_text(file_name, config_name){} - virtual ~TRiba_file(){} + virtual ~TRiba_file(){} void set_ditta(long nditta){_nditta = nditta;} const long ditta(void) const {return _nditta;} void set_tot_importi(real importo){_tot_importi = importo;} void add_tot_importi(real importo){_tot_importi += importo;} - const real tot_importi(void) const {return _tot_importi;} + const real tot_importi(void) const {return _tot_importi;} }; - + // creazione dell'applicazione bool TEmissione::create() { @@ -118,39 +120,38 @@ bool TEmissione::create() _firmrel= new TRelation(LF_NDITTE); _firmrel->add(LF_ANAG, "TIPOA=TIPOA|CODANAGR=CODANAGR"); _firmrel->add(LF_UNLOC,"CODDITTA=CODDITTA"); - _rel = new TRelation(LF_EFFETTI); - _rel->add(LF_REFFETTI, "NPROGTR=NPROGTR"); + _rel = new TRelation(LF_EFFETTI); + _rel->add(LF_REFFETTI, "NPROGTR=NPROGTR"); _rel->add(LF_CESS, "NPROGTR=NPROGTR"); - _rel->add(LF_CLIFO, "TIPOCF=\"C\"|CODCF=CODCF"); - _rel->add("%BAN", "CODTAB[1,5]=CODABI", 1, 0, 401); - _rel->add("%BAN", "CODTAB=CODABI+CODCAB", 1, 0, 402); + _rel->add(LF_CLIFO, "TIPOCF=TIPOCF|CODCF=CODCF"); + _rel->add("%BAN", "CODTAB[1,5]=CODABI", 1, 0, 401); + _rel->add("%BAN", "CODTAB=CODABI+CODCAB", 1, 0, 402); _rel->add(LF_COMUNI, "STATO=STATOCF|COM=COMCF",1,LF_CLIFO); _cur = NULL; _msk->set(F_NOMEFILE,RIBAFILENAME); - _trasfile = new TRiba_file(RIBAFILENAME, "riba.ini"); - _trasfile->set_ditta(get_firm()); +// _trasfile = new TRiba_file(RIBAFILENAME, "riba.ini"); +// _trasfile->set_ditta(get_firm()); _msk->set_handler(DLG_CANCEL, annulla_handler); + _trasfile = NULL; return TSkeleton_application::create(); } // distruzione dell'applicazione bool TEmissione::destroy() -{ +{ if (_formrb) delete _formrb; - if (_formdse) delete _formdse; - delete _msk; - delete _firmrel; - delete _rel; - delete _cur; - if ( _trasfile) - { - _trasfile->close(); - delete _trasfile; + if (_formdse) delete _formdse; + delete _msk; + delete _firmrel; + delete _rel; + delete _cur; + if (_trasfile) + delete _trasfile; return TSkeleton_application::destroy(); } // carica la ditta corrente -void TEmissione::on_firm_change() +void TEmissione::on_firm_change() { TLocalisamfile &firmfile= _firmrel->lfile(); firmfile.put("CODDITTA", get_firm()); @@ -159,12 +160,28 @@ void TEmissione::on_firm_change() // carica la maschera per emissione effetti e distinte void TEmissione::main_loop() -{ - KEY key = K_ENTER; - while (key != K_QUIT) - { - key = _msk->run(); - if (key == K_ENTER) +{ + // Preimposta gli eventuali valori specificati sulla riga di comando + if (argc() >= 4) + { + TLocalisamfile eff(LF_EFFETTI); + eff.setkey(4); + eff.put(EFF_TIPODIST, argv(2)); + eff.put(EFF_NDIST, argv(3)); + eff.put(EFF_NRIGADIST, 1); + if (eff.read() == NOERR) + { + _msk->set(F_TIPODIST, eff.get(EFF_TIPODIST)); + _msk->set(F_TIPOCF, eff.get(EFF_TIPOCF)); + _msk->set(F_NUMBER, eff.get(EFF_NDIST)); + } + } + + KEY key = K_ENTER; + while (key != K_QUIT) + { + key = _msk->run(); + if (key == K_ENTER) conferma(); } } @@ -173,51 +190,67 @@ void TEmissione::main_loop() void TEmissione::conferma() { int tipoemis = _msk->get_int(F_TIPOEMIS); - if (tipoemis == 1) + if (tipoemis == 1) floppy(); else - print(); -} - + print(); +} + // gestione emissione su floppy void TEmissione::floppy() { - inizializza_cur(); - inizializza_file(); - long n_eff = _cur->items(); - bool condition = ok_write(); - if (!condition) - error_box("Impossibile continuare discetto pieno"); - else - { - TProgind* pi; - pi = new TProgind(n_eff,"Emissione Ri.Ba. su floppy...",FALSE,TRUE,10); - TAssoc_array& tracciati = _trasfile->tracciati(); - header_rb();//intestazione flusso effetti - //scandisco tutti gli effetti della distinta selezionata - for (*_cur = 0; _cur->pos() < n_eff; ++(*_cur)) - { - pi->addstatus(1L); - save_data_emis(); - THash_object* lavoro = tracciati.get_hashobj(); - //scandisco tutti i record di un effetto - for (int i = 0; lavoro != NULL; i++) - { - record(*lavoro);//emetto il record - lavoro = tracciati.get_hashobj(); - } - } - footer_ef(); //chiusura flusso effetti - delete pi; - } -} + inizializza_cur(); + + long codabi = _cur->file().get_long(EFF_CODABIP); + const char tipo = _cur->file().get_char(EFF_TIPOCF); + + TFilename ribaini; + + ribaini.format("ri%c%05ld.ini",tipo, codabi);// compongo il nome del tracciato + if (!ribaini.exist()) // ne controllo l'esistenza se non + ribaini = "riba.ini"; // esiste utilizzo quello generico + + _trasfile = new TRiba_file(RIBAFILENAME, ribaini); + _trasfile->set_ditta(get_firm()); + inizializza_file(); + + long n_eff = _cur->items(); + bool condition = ok_write(); + + if (!condition) + error_box("Impossibile continuare dischetto pieno"); + else + { + TProgind pi(n_eff,"Emissione Ri.Ba. su floppy...",FALSE,TRUE,10); + + TAssoc_array& tracciati = _trasfile->tracciati(); + header_rb();//intestazione flusso effetti + //scandisco tutti gli effetti della distinta selezionata + for (*_cur = 0; _cur->pos() < n_eff; ++(*_cur)) + { + pi.addstatus(1L); + save_data_emis(); + THash_object* lavoro = tracciati.get_hashobj(); + //scandisco tutti i record di un effetto + for (int i = 0; lavoro != NULL; i++) + { + record(*lavoro);//emetto il record + lavoro = tracciati.get_hashobj(); + } + } + footer_ef(); //chiusura flusso effetti + } + _trasfile->close(); + delete _trasfile; + _trasfile = NULL; +} // registro la data ed il numero di emissione dell'effetto corrente void TEmissione::save_data_emis() -{ +{ const TDate data_emis = _msk->get_date(F_DATAEMIS); TLocalisamfile& effetti = _rel->lfile(); - TEffetto effetto = effetti.curr(); + TEffetto effetto = effetti.curr(); long numero = effetto.numero(); effetto.put(EFF_NUMEMISS, numero); effetto.put(EFF_DATAEMISS, data_emis); @@ -233,46 +266,43 @@ void TEmissione::header_rb() TRecord_text rec; *_cur = 0; rec.set_type("RB"); - _trasfile->autoload(rec, *_cur); - _trasfile->write(rec); -} + _trasfile->autoload(rec, *_cur); + _trasfile->write(rec); +} //emetto il record di chiusura del flusso di effetti void TEmissione::footer_ef() { - TRecord_text rec; - *_cur = 0; - rec.set_type("EF"); - _trasfile->autoload(rec, *_cur); - _trasfile->write(rec); - _trasfile->write_file()->seekp(0, ios::end); + TRecord_text rec; + *_cur = 0; + rec.set_type("EF"); + _trasfile->autoload(rec, *_cur); + _trasfile->write(rec); + _trasfile->write_file()->seekp(0, ios::end); } //inizializza il cursore per la gestione dei dati da caricare negli effetti -void TEmissione::inizializza_cur() +void TEmissione::inizializza_cur() { - const int ndist = _msk->get_int(F_NUMBER); - const char tipodist = _msk->get(F_TIPODIST)[0]; - TRectype from(_rel->lfile().curr()), - to(_rel->lfile().curr()); - from.zero(); - from.put(EFF_TIPODIST, tipodist); - from.put(EFF_NDIST, ndist); - to = from; - _cur = new TCursor(_rel,"",4,&from,&to); - _cur->freeze(); + const int ndist = _msk->get_int(F_NUMBER); + const char tipodist = _msk->get(F_TIPODIST)[0]; + TRectype from(_rel->lfile().curr()); + from.zero(); + from.put(EFF_TIPODIST, tipodist); + from.put(EFF_NDIST, ndist); + _cur = new TCursor(_rel,"",4,&from,&from); + _cur->freeze(); } //inizializza il file di testo su cui emettere gli effetti -void TEmissione::inizializza_file() +void TEmissione::inizializza_file() { - TString fileriba = _msk->get(F_UNITA); + TFilename fileriba = _msk->get(F_UNITA); fileriba << ":\\" << _msk->get(F_NOMEFILE); - TFilename file(fileriba); - _trasfile->open(file,'w'); + _trasfile->open(fileriba,'w'); _trasfile->set_tot_importi(0.0); _foutput = (fo)_msk->get_int(F_FOR_OUT); -} +} //emetto un record del flusso di effetti void TEmissione::record(THash_object& lavoro) @@ -283,86 +313,61 @@ void TEmissione::record(THash_object& lavoro) TTracciato_record& oggetto = (TTracciato_record&)lavoro.obj(); const TString& tipo = oggetto.type(); TRecord_text rec(tipo); - //carico il record da emettere + //carico il record da emettere _trasfile->autoload(rec, *_cur, &tipo); - _trasfile->write(rec);//emetto i dati su file - } + _trasfile->write(rec);//emetto i dati su file + } } -//controllo che ci sia spazio a sufficenza per emettere il flusso +//controllo che ci sia spazio a sufficenza per emettere il flusso //sull'unità scelta dall'utente,ritorna TRUE se è possibile farlo -bool TEmissione::ok_write() +bool TEmissione::ok_write() { - long elem = _cur->items(); + long elem = _cur->items(); int dim = _trasfile->recordsize(); unsigned long nbyte = (elem*7+2)*dim; -/* - char unita = toupper(_msk->get(F_UNITA)[0]); - unsigned drive; - switch(unita) - { - case 'a' : - drive = 1; - break; - case 'b' : - drive = 2; - break; - } - - // routine uses system call 0x36 to obtain information on the disk drive - // specified by drive - - struct _diskfree_t diskspace; - _dos_getdiskfree(drive, &diskspace); - unsigned long available_clusters = (unsigned long) diskspace.avail_clusters; - unsigned long sectors_per_cluster = (unsigned long) diskspace.sectors_per_cluster; - unsigned long bytes_per_sector = (unsigned long) diskspace.bytes_per_sector; - unsigned long free_space = available_clusters * sectors_per_cluster * bytes_per_sector; - - return nbyte < free_space; -*/ TString16 unita; unita << _msk->get(F_UNITA)[0] << ":\\"; return os_test_disk_free_space(unita, nbyte); } - + // aggiorna numero e data di emissione ed il flag di stampa // su tutti gli effetti nel cursore -void TEmissione::aggiorna_rb(TCursor* cur) -{ +void TEmissione::aggiorna_rb(TCursor* cur) +{ TLocalisamfile &eff = cur->file(LF_EFFETTI); for (*cur = 0; cur->pos() < cur->items(); ++(*cur)) - { - TEffetto effetto = eff.curr(); + { + TEffetto effetto = eff.curr(); long numero = effetto.numero(); effetto.put(EFF_NUMEMISS, numero); TDate data = _msk->get_date(F_DATAEMIS); effetto.put(EFF_DATAEMISS, data); bool cond = TRUE; - effetto.put(EFF_EFFSTAMP, cond); + effetto.put(EFF_EFFSTAMP, cond); effetto.rewrite(eff); - } + } } -// aggiorna il flag di stampa della distinta +// aggiorna il flag di stampa della distinta // su tutti gli effetti nel cursore void TEmissione::aggiorna_dist(TCursor* cur) -{ +{ TLocalisamfile &eff = cur->file(LF_EFFETTI); for (*cur = 0; cur->pos() < cur->items(); ++(*cur)) - { - TEffetto effetto = eff.curr(); + { + TEffetto effetto = eff.curr(); bool cond = TRUE; - effetto.put(EFF_DISTSTAM, cond); + effetto.put(EFF_DISTSTAM, cond); effetto.rewrite(eff); - } + } } // gestione emissione su moduli cartacei delle riba void TEmissione::print_rb(char tipost, int ndist, char tipodist, int ncopie, const bool is_vis) { - TCursor* fcur = _formrb->cursor(); - TLocalisamfile &eff = fcur->file(LF_EFFETTI); + TCursor* fcur = _formrb->cursor(); + TLocalisamfile &eff = fcur->file(LF_EFFETTI); TString16 filter; if (tipost == 'D' && !_msk->get_bool(F_RIST)) // se stampa definitiva effetti e se non deve ristampare le riba filter = "EFFSTAMP=\" \"";// setta il filtro del cursore per ... @@ -371,38 +376,44 @@ void TEmissione::print_rb(char tipost, int ndist, char tipodist, int ncopie, con fcur->setkey(4); TRectype darec(eff.curr());// fissa i dati per la scelta degli ... darec.zero();// ... effetti nel primo e nell'ultimo record del cursore - darec.put(EFF_NDIST, ndist); - darec.put(EFF_TIPODIST, tipodist); - TRectype arec(darec); - fcur->setregion(darec, arec); - long n = fcur->items(); - fcur->freeze(); -// se la stampa non si fa a video istanzia puntatore per la gestione -// della barra di attesa + if (ndist > 0) + { + darec.put(EFF_NDIST, ndist); + darec.put(EFF_TIPODIST, tipodist); + TRectype arec(darec); + fcur->setregion(darec, arec); + fcur->setfilter(""); + } + else + fcur->setfilter("(TIPODIST==\"\")&&(NDIST==\"\")"); + long n = fcur->items(); + fcur->freeze(); +// se la stampa non si fa a video istanzia puntatore per la gestione +// della barra di attesa for (int j=0; j < ncopie; j++) { - TProgind* pi; - if (!is_vis) + TProgind* pi; + if (!is_vis) pi = new TProgind(n,"Stampa Effetti...",FALSE,TRUE,10); // ciclo sugli elementi del cursore di stampa - //for (*fcur = 0; fcur->pos() < n; ++(*fcur)) + //for (*fcur = 0; fcur->pos() < n; ++(*fcur)) { if (!is_vis) pi->addstatus(1L); // aggiorna la barra d'attesa - _formrb->print(); // stampa il form - } - } - if (tipost == 'D') // se emetto riba in definitiva devo aggiornare + _formrb->print(); // stampa il form + } + } + if (tipost == 'D') // se emetto riba in definitiva devo aggiornare aggiorna_rb(fcur);// data, numero emissione e flag di stampa effetto } // gestione emissione su moduli cartacei delle distinte void TEmissione::print_dse(char tipost, int ndist, char tipodist, int ncopie, const bool is_vis) { - TCursor* fcur = _formdse->cursor(); - TLocalisamfile &eff = fcur->file(LF_EFFETTI); + TCursor* fcur = _formdse->cursor(); + TLocalisamfile &eff = fcur->file(LF_EFFETTI); // setta la chiave 4 per il cursore per poter leggere tutti gli effetti -// della distinta +// della distinta TString16 filter; if (tipost == 'D' && !_msk->get_bool(F_RIST)) // se stampa definitiva effetti e se non deve ristampare le riba filter = "DISTSTAM=\" \"";// setta il filtro del cursore per ... @@ -410,47 +421,57 @@ void TEmissione::print_dse(char tipost, int ndist, char tipodist, int ncopie, co fcur->setkey(4); TRectype darec(eff.curr()); // fissa i dati per la scelta degli ... darec.zero(); // ... effetti nel primo e nell'ultimo record del cursore - darec.put(EFF_NDIST, ndist); - darec.put(EFF_TIPODIST, tipodist); - TRectype arec(darec); - fcur->setregion(darec, arec); - long n = fcur->items(); - fcur->freeze(); + if (ndist > 0) + { + darec.put(EFF_NDIST, ndist); + darec.put(EFF_TIPODIST, tipodist); + TRectype arec(darec); + fcur->setregion(darec, arec); + fcur->setfilter(""); + } + else + fcur->setfilter("(TIPODIST==\"\")&&(NDIST==\"\")"); + long n = fcur->items(); + fcur->freeze(); // se la stampa non si fa a video istanzia puntatore per la gestione -// della barra di attesa +// della barra di attesa for (int j=0; j < ncopie; j++) { - TProgind* pi; - if (!is_vis) + TProgind* pi; + if (!is_vis) pi = new TProgind(n,"Stampa Distinta...",FALSE,TRUE,10); - _base_page_no = 0; + _base_page_no = 0; if (!is_vis) pi->addstatus(1L); // aggiorna la barra d'attesa - _formdse->print(); // stampa il form - // stampa numero di pagina (solo nella distinta) + _formdse->find_field('F',last_page,2).set(""); // Azzera nr documenti + _formdse->find_field('F',last_page,3).set(""); // Azzera tot documenti + _formdse->print(); // stampa il form + // stampa numero di pagina (solo nella distinta) _base_page_no = printer().getcurrentpage() -1; } if (tipost == 'D') // se emetto distinta in definitiva ... - aggiorna_dist(fcur);// ... devo aggiornare flag di stampa distinta -} + aggiorna_dist(fcur);// ... devo aggiornare flag di stampa distinta +} // gestione emissione effetti/distinte su moduli cartacei void TEmissione::print() { int ncopie = _msk->get_int(F_NCOPIE); - if (ncopie == 0) ncopie = 1; + if (ncopie == 0) ncopie = 1; printer().open(); // TRUE se si stampa a video - const bool is_vis = printer().printtype() == screenvis; + const bool is_vis = printer().printtype() == screenvis; int emis = _msk->get_int(F_EMIS); int ndist = _msk->get_int(F_NUMBER); char tipodist = _msk->get(F_TIPODIST)[0]; _rel->lfile().put(EFF_TIPODIST,tipodist); - _rel->lfile().put(EFF_NDIST,ndist); + _rel->lfile().put(EFF_NDIST,ndist); _rel->lfile().put(EFF_NRIGADIST,1); _rel->lfile().setkey(4); _rel->read(); - long codabi = _rel->lfile().get_long(EFF_CODABIP); + long codabi = _rel->lfile().get_long(EFF_CODABIP); + const char tipo = _rel->lfile().get_char(EFF_TIPOCF); + char tipost = _msk->get(F_TIPOST)[0]; char tipord = _msk->get(F_TIPORD)[0]; // se emetto riba istanzio il form per le riba @@ -458,35 +479,35 @@ void TEmissione::print() if (emis == 1) { TFilename nomeform; - nomeform.format("rb%05ld.frm",codabi);// compongo il nome del form + nomeform.format("rb%c%05ld.frm",tipo, codabi);// compongo il nome del form if (!nomeform.exist()) // ne controllo l'esistenza se non nomeform = "rb.frm"; // esiste utilizzo quello generico - _formrb = new TRiba_form(nomeform); + _formrb = new TRiba_form(nomeform); print_rb(tipost,ndist,tipodist,ncopie,is_vis); } else { TFilename nomeform; - nomeform.format("dse%05ld.frm",codabi);// compongo il nome del form + nomeform.format("ds%c%05ld.frm",tipo, codabi);// compongo il nome del form if (!nomeform.exist()) // ne controllo l'esistenza nomeform = "dse.frm"; // se non esiste utilizzo quello generico _formdse = new TDistinta_form(nomeform, _firmrel); _formdse->set_order(tipord); print_dse(tipost,ndist,tipodist,ncopie,is_vis); } - printer().close(); + printer().close(); } // handler per gestire la conferma dell'annullamento dei dati inseriti -// nella maschera +// nella maschera bool TEmissione::annulla_handler(TMask_field& f, KEY k) -{ - TMask &m = f.mask(); +{ + TMask &m = f.mask(); if (k == K_SPACE) - { - if (yesno_box("Vuoi veramete annullare i dati inseriti")) - m.reset(); - } + { + if (yesno_box("Vuoi veramente annullare i dati inseriti")) + m.reset(); + } return TRUE; } @@ -499,11 +520,11 @@ TRiba_form::TRiba_form(const char* name): TForm() // gestione dei messaggi estesi nei campi bool TRiba_form::validate(TForm_item &cf, TToken_string &s) { - const TString code(s.get(0)); - TString valore; + const TString code(s.get(0)); + TString valore; - if (code == "_IMPORTO") - { + if (code == "_IMPORTO") + { // gestione dei campi relativi all'importo dell'effetto. Setta il valore da // solo se e' in valuta (cambia anche la picture) // sintassi: _IMPORTO @@ -516,36 +537,35 @@ bool TRiba_form::validate(TForm_item &cf, TToken_string &s) valore = importo.string(picture); cf.set(valore); cf.put_paragraph(valore); - cf.set(""); } - else - if (code == "_BANCAP") + else if (code == "_BANCAP") { // gestione dei campi relativi alla banca di presentazione dell'effetto // sintassi: _BANCAP - TCursor* cur = cursor(); - TRectype & ban = cur->curr(-204); - valore.cut(0); - valore << ban.get("S0"); - valore.trim(); - ban = cur->curr(-202); - valore << " " << ban.get("S0"); - valore.trim(); - cf.set(valore); - cf.put_paragraph(valore); - cf.set(""); + TCursor* cur = cursor(); + if (cur->curr().get_int(EFF_NDIST) > 0) + { + TRectype & ban = cur->curr(-204); + valore.cut(0); + valore << ban.get("S0"); + valore.trim(); + ban = cur->curr(-202); + valore << " " << ban.get("S0"); + valore.trim(); + cf.set(valore); + cf.put_paragraph(valore); + } } - else - if (code == "_FATT") + else if (code == "_FATT") { // gestione dei campi relativi alle/a fatture/a a cui si riferisce un effetto // sintassi: _FATT, // dove: è uno delle macro seguenti: // "!A" fattura o fatture - // "!DATI" numero e data fattura + // "!DATI" numero e data fattura // "!IMPFATT" importo fattura - //TCursor* fcur = cursor(); - //TLocalisamfile &eff = fcur->file(LF_EFFETTI); + //TCursor* fcur = cursor(); + //TLocalisamfile &eff = fcur->file(LF_EFFETTI); TEffetto effetto(cursor()->file().curr());// = eff.curr(); long num = effetto.numero(); const bool in_valuta = effetto.in_valuta(); @@ -554,47 +574,78 @@ bool TRiba_form::validate(TForm_item &cf, TToken_string &s) TString in(s.get()); if (in[0]=='!') { - in.ltrim(1); + in.ltrim(1); // "!A" se 1 sola fattura stampa 'a' altrimenti stampa 'e' - if (in == "A") + if (in == "A") { if (condition) cf.set("a"); - else + else cf.set("e"); } - // "!DATIFATT" stampa numero e data fattura delle fatture a cui si riferisce l'effetto - if (in == "DATIFATT") + // "!DATIFATT" stampa numero e data fattura delle fatture a cui si riferisce l'effetto + if (in == "DATIFATT") { int elem = dati->items(); TString descfatt; for (int i = 0; i < elem; i+=3) { descfatt << dati->get(i); - descfatt << " "; + descfatt << " "; descfatt << dati->get(i+1); descfatt << " "; cf.set(descfatt); - } + } } - // "!IMPFATT" se 1 sola fattura ne stampa l' importo - if (in == "IMPFATT") + // "!IMPFATT" se 1 sola fattura ne stampa l' importo + if (in == "IMPFATT") { if (condition) - { + { TString picture(cf.picture()); if (in_valuta) picture << ",@@@"; real importo(dati->get(2)); cf.set(importo.string(picture)); - } + } } - } + } valore = cf.get(); cf.put_paragraph(valore); - cf.set(""); return (TRUE); - } + } + else + if (code == "_CLI") + { + // gestione dei campi relativi al cliente a cui si riferisce un effetto + // sintassi: _CLI, + // dove: è uno delle macro seguenti: + // "!IND" INDIRIZZO + NR. CIVICO + // "!PIAZZA" COMUNE + PROVINCIA + TString in(s.get()); + if (in[0]=='!') + { + in.ltrim(1); + TRelation* rel = relation(); + if (in=="IND") + { + valore = rel->lfile(LF_CLIFO).get(CLI_INDCF); + in = rel->lfile(LF_CLIFO).get(CLI_CIVCF); + if (in.not_empty()) + valore << ", " << in; + } + else + if (in=="PIAZZA") + { + valore = rel->lfile(LF_COMUNI).get(COM_DENCOM); + in = rel->lfile(LF_COMUNI).get(COM_PROVCOM); + if (in.not_empty()) + valore << " (" << in << ")"; + } + } + cf.put_paragraph(valore); + return (TRUE); + } return TForm::validate(cf, s); } @@ -605,15 +656,15 @@ TDistinta_form::TDistinta_form(const char* name, TRelation *rel): TForm(), _firm _cursor = NULL; } -// setta l'ordinamento del TSordet_cursor del form +// setta l'ordinamento del TSordet_cursor del form void TDistinta_form::set_order(const char tipo) { TString ordine; - // ordinamento secondo la data di scadenza dell'effetto - if (tipo == 'S') + // ordinamento secondo la data di scadenza dell'effetto + if (tipo == 'S') ordine = "DATASCAD|TIPODIST|NDIST|NRIGADIST"; - // ordinamento seconda il numero e la data della fattura - if (tipo == 'F') + // ordinamento seconda il numero e la data della fattura + if (tipo == 'F') ordine = "14->NFATT|TIPODIST|NDIST|NRIGADIST"; _cursor = new TSorted_cursor(relation(),ordine); } @@ -627,10 +678,10 @@ TDistinta_form::~TDistinta_form() // gestione dei messaggi estesi nei campi bool TDistinta_form::validate(TForm_item &cf, TToken_string &s) { - const TString code(s.get(0)); + const TString code(s.get(0)); TString valore; - if (code == "_IMPORTO") - { + if (code == "_IMPORTO") + { // gestione dei campi relativi all'importo dell'effetto. Setta il valore da // solo se e' in valuta (cambia anche la picture) // sintassi: _IMPORTO @@ -641,28 +692,28 @@ bool TDistinta_form::validate(TForm_item &cf, TToken_string &s) if (in_valuta) picture << ",@@@"; valore = importo.string(picture); - cf.set(valore); + cf.set(real::ita2eng(valore)); cf.put_paragraph(valore); - cf.set(""); - } - if (code == "_BANCAP") - { + return (TRUE); + } + if (code == "_BANCAP") + { // gestione dei campi relativi alla banca di presentazione della distinta // sintassi: _BANCAP TCursor* cur = cursor(); TRectype & ban = cur->curr(-204); valore.cut(0); valore << ban.get("S0"); - valore.trim(); - ban = cur->curr(-202); + valore.trim(); + ban = cur->curr(-202); valore << " " << ban.get("S0"); - valore.trim(); + valore.trim(); cf.set(valore); cf.put_paragraph(valore); - cf.set(""); - } + return (TRUE); + } if (code == "_DITTA") - { + { // gestione di campi della ditta corrente // sintassi: _DITTA, // dove: è uno delle macro seguenti: @@ -671,32 +722,57 @@ bool TDistinta_form::validate(TForm_item &cf, TToken_string &s) if (in[0]=='!') { in.ltrim(1); - // "!RAGSOC" prende la ragione sociale della ditta corrente - if (in=="RAGSOC") + // "!RAGSOC" prende la ragione sociale della ditta corrente + if (in=="RAGSOC") { - const TString ragsoc = _firmrel->lfile().get("RAGSOC"); - valore.cut(0); - valore = ragsoc.left(30); - valore.trim(); - TString str = ragsoc.right(20); - str.trim(); - valore << " " << str; - cf.set(valore); + valore = _firmrel->lfile().get("RAGSOC"); + valore.strip_d_spaces(); + cf.set(valore); } } valore = cf.get(); cf.put_paragraph(valore); cf.set(""); return (TRUE); - } + } + if (code == "_CLI") + { + // gestione dei campi relativi al cliente a cui si riferisce un effetto + // sintassi: _CLI, + // dove: è uno delle macro seguenti: + // "!IND" INDIRIZZO + NR. CIVICO + // "!PIAZZA" COMUNE + PROVINCIA + TString in(s.get()); + if (in[0]=='!') + { + in.ltrim(1); + TRelation* rel = relation(); + if (in=="IND") + { + valore = rel->lfile(LF_CLIFO).get(CLI_INDCF); + in = rel->lfile(LF_CLIFO).get(CLI_CIVCF); + if (in.not_empty()) + valore << ", " << in; + } + else + if (in=="PIAZZA") + { + valore = rel->lfile(LF_COMUNI).get(COM_DENCOM); + in = rel->lfile(LF_COMUNI).get(COM_PROVCOM); + if (in.not_empty()) + valore << " (" << in << ")"; + } + } + cf.set(valore); + cf.put_paragraph(valore); + return (TRUE); + } if (code == "_FATT") - { + { // gestione dei campi relativi alle fatture a cui si riferisce un effetto // sintassi: _FATT, // dove: è uno delle macro seguenti: - // "!DATI" numero e data fattura - //TCursor* fcur = cursor(); - //TLocalisamfile &eff = fcur->file(LF_EFFETTI); + // "!DATI" numero e data fattura TEffetto effetto(cursor()->file().curr()); //= eff.curr(); long num = effetto.numero(); TToken_string* dati = effetto.dati_fatt(num); @@ -706,74 +782,34 @@ bool TDistinta_form::validate(TForm_item &cf, TToken_string &s) if (in[0]=='!') { in.ltrim(1); - // "!DATIFATT" stampa numero e data fattura delle fatture a cui si riferisce l'effetto - if (in == "DATIFATT") + // "!DATIFATT" stampa numero e data fattura delle fatture a cui si riferisce l'effetto + if (in == "DATIFATT") { for (int i = 0; i < elem; i+=3) { descfatt << dati->get(i); - descfatt << " "; + descfatt << " "; descfatt << dati->get(i+1); descfatt << " "; cf.set(descfatt); - } - } - } - valore = cf.get(); - cf.put_paragraph(valore); - cf.set(""); // resetta il campo per la prossima stampa di questo item - return (TRUE); - } - if (code == "_FOOTER") - { - // gestione dei campi del fondo pagina della distinta - // sintassi: _FOOTER, - // dove: è uno delle macro seguenti: - // "!NDOC" numero riba nella distinta - // "!TOTALE" totale presentato - TString in(s.get()); - if (in[0]=='!') - { - in.ltrim(1); - TCursor* fcur = cursor(); - long i = fcur->items(); - //"!NDOC" prende il numero riba nella distinta guardando quanti - // elementi ha il cursore di stampa - if (in == "NDOC") - { - TString16 num; num << i; - cf.set(num); - } - //"!TOTALE" calcola il totale presentato prendendo i totale degli - // effetti nel cursore di stampa - if (in == "TOTALE") - { - real totale = 0.0; - TString picture(cf.picture()); - TEffetto effetto(fcur->file().curr()); - const bool in_valuta = effetto.in_valuta(); - if (in_valuta) // In una distinta le riba sono tutte della stessa valuta; quindi basta prenderne 1 - picture << ",@@@"; - TLocalisamfile& eff = fcur->file(); - for (*fcur = 0; fcur->pos() < i; ++(*fcur)) - totale += eff.get_real(in_valuta ? EFF_IMPORTOVAL : EFF_IMPORTO); - cf.set(totale.string(picture)); + } } } valore = cf.get(); cf.put_paragraph(valore); - cf.set(""); return (TRUE); - } - /* - if (code== "_PAGENO") - { - // messaggio per stampare il numero di pagina corrente - TString16 pg; pg << int(printer().getcurrentpage() - app().base_no()); - cf.set(pg); cf.put_paragraph(pg); - cf.set(""); } - */ + if (code == "_DATA") + { + // gestione della data di emissione delle riba + // sintassi: _DATA + const TDate data_emis = app().msk().get_date(F_DATAEMIS); + valore = data_emis.string(); + cf.set(valore); + cf.put_paragraph(valore); + cf.set(""); + return TRUE; + } return TForm::validate(cf, s); } @@ -793,16 +829,14 @@ void TRiba_file:: validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TSt in.trim(); valore = in; } - else - if (code == "_DATA") + else if (code == "_DATA") { // gestione della data di emissione delle riba // sintassi: _DATA const TDate data_emis = app().msk().get_date(F_DATAEMIS); valore = data_emis.string(); } - else - if (code == "_NRIBA") + else if (code == "_NRIBA") { // gestione dei campi relativi al flusso di effetti (riba) // sintassi: _NRIBA, @@ -833,8 +867,7 @@ void TRiba_file:: validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TSt else CHECKS (TRUE,"Sotto-Macro _NRIBA non definita",(const char *)in); } - else - if (code == "_DITTA") + else if (code == "_DITTA") { // gestione di campi della ditta corrente // sintassi: _DITTA,, @@ -885,6 +918,7 @@ void TRiba_file:: validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TSt // sintassi: _DEBITORE,, // dove: è uno delle macro seguenti: // "!RAGSOC" ragione sociale + // "!CFPI" Partita IVA o Codice fiscale // "!INDIRIZZO" indirizzo // "!PIAZZA" comune + sigla provincia // dove: è uno delle opzioni seguenti: @@ -926,7 +960,15 @@ void TRiba_file:: validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TSt valore = comuni.get("PROVCOM"); valore.trim(); } - else + else if (in=="CFPI") + { + valore = clifo.get("PAIV"); + valore.trim(); + if (valore.empty()) + valore = clifo.get("COFI"); + valore.trim(); + } + else CHECKS (TRUE,"Sotto-Macro _DEBITORE non definita",(const char *)in); } else if (code == "_BANCA") @@ -936,8 +978,8 @@ void TRiba_file:: validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TSt TRectype & ban = cur.curr(-401); valore.cut(0); valore << ban.get("S0"); - valore.trim(); - ban = cur.curr(-402); + valore.trim(); + ban = cur.curr(-402); valore << " " << ban.get("S0"); valore.trim(); } @@ -957,28 +999,27 @@ void TRiba_file:: validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TSt for (int i = 0; i < elem; i+=3) { descfatt << dati->get(i); - descfatt << " "; + descfatt << " "; descfatt << dati->get(i+1); descfatt << " "; - } + } int l = descfatt.len(); - TString in(s.get()); + TString in(s.get()); if (in[0]=='!') { in.ltrim(1); - if (in == "1") + if (in == "1") { valore = descfatt.left(40); valore.trim(); } - if (in == "2") + if (in == "2") { valore = descfatt.mid(40, l); } - } + } } - else - if (code == "_IMPORTO") + else if (code == "_IMPORTO") { // gestione di campi degli importi degli effetti nel flusso // sintassi: _IMPORTO, @@ -993,13 +1034,13 @@ void TRiba_file:: validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TSt real importo(str); add_tot_importi(importo); valore.cut(0); - valore << importo.string(13,1); + valore << importo.string(13,0); } else if (in=="TOT") { valore.cut(0); real importo = tot_importi(); - valore << importo.string("############@,@"); + valore << importo.string("##############@"); set_tot_importi(0.0); } else diff --git a/ef/ef0500.h b/ef/ef0500.h index d9fb79f9c..b26acdec8 100755 --- a/ef/ef0500.h +++ b/ef/ef0500.h @@ -17,5 +17,6 @@ #define F_DATAEMIS 111 #define F_RIST 112 #define F_NOMEFILE 113 +#define F_TIPOCF 114 #endif //__EF0500_H diff --git a/ef/ef0500a.uml b/ef/ef0500a.uml index 7ad340754..a9e6e95d8 100755 --- a/ef/ef0500a.uml +++ b/ef/ef0500a.uml @@ -1,17 +1,17 @@ // DEFINIZIONE CAMPI MASCHERA PER LA EMISSIONE DEGLI EFFETTI #include "ef0500.h" -PAGE "Emissione Effetti e Distinte" -1 -1 77 15 +PAGE "Emissione Effetti e Distinte" -1 -1 76 15 RADIOBUTTON F_TIPOEMIS 39 BEGIN PROMPT 2 0 " " ITEM "1|Emissione su floppy" - MESSAGE DISABLE,2@|DISABLE,4@|DISABLE,5@ - MESSAGE ENABLE,1@|SHOW,F_NOMEFILE + MESSAGE DISABLE,2@|DISABLE,4@|DISABLE,5@ + MESSAGE ENABLE,1@|SHOW,F_NOMEFILE ITEM "2|Emissione su moduli cartacei" - MESSAGE DISABLE,1@ - MESSAGE ENABLE,2@|HIDE,F_NOMEFILE + MESSAGE DISABLE,1@ + MESSAGE ENABLE,2@|HIDE,F_NOMEFILE END STRING F_NOMEFILE 12 @@ -21,47 +21,58 @@ BEGIN END LIST F_TIPODIST 18 -BEGIN - PROMPT 2 5 "Tipo Distinta " +BEGIN + PROMPT 2 5 "Tipo Distinta " KEY 4 ITEM "I|All'incasso" ITEM "B|Salvo buon fine" ITEM "S|Allo sconto" END -NUMBER F_NUMBER 5 -BEGIN - PROMPT 43 5 "Numero Distinta " - FLAGS "R" +LIST F_TIPOCF 1 8 +BEGIN + PROMPT 43 4 "Tipo Effetti " + ITEM "C|Attivi" + ITEM "F|Passivi" +END + +NUMBER F_NUMBER 5 +BEGIN + PROMPT 43 5 "Numero Distinta " + FLAGS "R" KEY 4 - USE LF_EFFETTI KEY 4 SELECT NRIGADIST = 1 - INPUT NDIST F_NUMBER + USE LF_EFFETTI KEY 4 SELECT (NRIGADIST=1)&&(TIPOCF=#F_TIPOCF) + INPUT NDIST F_NUMBER INPUT TIPODIST F_TIPODIST INPUT NRIGADIST F_NUMBERRIGA + DISPLAY "Tipo" TIPODIST DISPLAY "Nr. distinta" NDIST - DISPLAY "Tipo distinta" TIPODIST + DISPLAY "Data@10" DATADIST + DISPLAY "C/F" TIPOCF + DISPLAY "ABI@5" CODABIP + DISPLAY "CABI@5" CODCABP OUTPUT F_NUMBER NDIST - OUTPUT F_TIPODIST TIPODIST + OUTPUT F_TIPODIST TIPODIST OUTPUT F_NUMBERRIGA NRIGADIST CHECKTYPE NORMAL END /* CAMPO NASCOSTO CHE SERVE PER LA RICERCA */ -LIST F_NUMBERRIGA 12 -BEGIN +LIST F_NUMBERRIGA 12 +BEGIN PROMPT 1 60 "Numero Riga Distinta" KEY 4 - ITEM "1|PRIMA RIGA" - FLAGS "D" + ITEM "1|PRIMA RIGA" + FLAGS "D" END LIST F_UNITA 9 BEGIN PROMPT 2 6 "Unità di output " ITEM "a|Drive A" - ITEM "b|Drive B" + ITEM "b|Drive B" GROUP 1 -END +END LIST F_FOR_OUT 7 BEGIN @@ -71,7 +82,8 @@ BEGIN ITEM "3|1,2 Mb" ITEM "4|1,44 Mb" GROUP 1 -END + FLAGS "H" +END LIST F_EMIS 20 BEGIN @@ -81,8 +93,8 @@ BEGIN ITEM "2|Emissione distinta" MESSAGE ENABLE,4@ GROUP 2 -END - +END + NUMBER F_NCOPIE 3 BEGIN PROMPT 2 9 "Numero copie " @@ -105,7 +117,7 @@ BEGIN ITEM "P|Provvisoria" ITEM "D|Definitiva" GROUP 2 -END +END BOOLEAN F_RIST BEGIN @@ -132,7 +144,7 @@ END BUTTON DLG_QUIT 9 2 BEGIN PROMPT -33 -1 "" -END +END ENDPAGE ENDMASK diff --git a/ef/ef0600.cpp b/ef/ef0600.cpp index 009172382..67b865ae2 100755 --- a/ef/ef0600.cpp +++ b/ef/ef0600.cpp @@ -1,12 +1,15 @@ #include #include #include +#include +#include +#include +#include #include #include -#include -#include -#include + #include + #include "ef0101.h" #include "ef0600.h" @@ -24,8 +27,8 @@ class TPrint_effetti_app : public TPrintapp TDate _scad_prec; //TRectype* _rec_prec; int _cur_1, _cur_2, _cur_3, _cur_4, _interline; - long _dist_prec, _cliente_prec; - char _tipo_prec; + long _dist_prec, _cliente_prec; + char _tipo_prec, _tipocf_prec; real _tot_data, _tot_mese, _tot_banca, _tot_distinta, _tot_tip_dist, _tot_cliente, _tot_stampa; bool _prima_volta; public: @@ -48,7 +51,7 @@ public: void set_cliente(); const char* get_field(int ln, const char* fn) {return current_cursor()->curr(ln).get(fn);} const char* look_tab(const char* tabname, const TString& cod,const char* fld="S0"); - const TString& look_clifo(long codcf); + const TString& look_clifo(char tipo, long codcf, TString& cli) const; void st_tot_scad(); void st_tot_mese(); void st_header_scad(const TDate* scad); @@ -68,31 +71,30 @@ TPrint_effetti_app::TPrint_effetti_app():TPrintapp(), _ban(11), _ban_prec(11), _ } // restituisce la ragione sociale del cliente compattata -const TString& TPrint_effetti_app::look_clifo(long codcf) +const TString& TPrint_effetti_app::look_clifo(char tipo, long codcf, TString& cli) const { - TLocalisamfile clifo(LF_CLIFO); - clifo.put(CLI_TIPOCF,'C'); - clifo.put(CLI_CODCF, codcf); - clifo.read(); - TString s,cli; - cli = (clifo.get(CLI_RAGSOC)); - s = cli.mid(30,50); - s.trim(); - cli = cli.mid(0,30); + TString80 s; + s << tipo << '|' << codcf; + s = cache().get(LF_CLIFO, s, CLI_RAGSOC); + cli = s.left(30); cli.trim(); - cli << " " << s; + s.ltrim(30); + cli << ' ' << s; return cli; } // restituisce un campo di una tabella const char* TPrint_effetti_app::look_tab(const char* tabname, const TString& cod, const char* fld) { +/* TTable tab(tabname); tab.curr().zero(); tab.curr().put("CODTAB",cod); tab.read(); if (tab.bad()) tab.curr().zero(); return tab.curr().get(fld); +*/ + return cache().get(tabname, cod, fld); } // stampa il totale per data di scadenza @@ -334,7 +336,8 @@ print_action TPrint_effetti_app::postprocess_print(int file, int counter) _pr.put(_tot_cliente.string("###.###.##@,@@"),72); printer().print(_pr); _pr.reset(); - _pr.put((look_clifo(_cliente_prec)),52); + TString80 cli; + _pr.put((look_clifo(_tipocf_prec, _cliente_prec,cli)),52); printer().print(_pr); _tot_cliente = 0.0; _pr.reset(); @@ -482,6 +485,7 @@ bool TPrint_effetti_app::preprocess_page(int file, int counter) long dist = rec.get_long (EFF_NDIST); char tipodist = rec.get_char(EFF_TIPODIST); long cliente = rec.get_long (EFF_CODCF); + char tipocf = rec.get_char(EFF_TIPOCF); real importo = rec.get_real(EFF_IMPORTO); // elaboro le seguenti stringhe per la stampa if (ban=="00000") @@ -529,6 +533,7 @@ bool TPrint_effetti_app::preprocess_page(int file, int counter) case st_cliente: _scad_prec = scad; _cliente_prec = cliente; + _tipocf_prec = tipocf; st_header_cliente(&_cli); break; default: @@ -629,8 +634,19 @@ bool TPrint_effetti_app::preprocess_page(int file, int counter) break; case st_distinta: // è cambiato il numero distinta, stampo il relativo totale + // è cambiato il mese della la data di scadenza, stampo il relativo totale + // ed il nuovo header del mese + if (scad.month() !=_scad_prec.month()) + { + st_tot_mese(); + _pr.reset(); + printer().print(_pr); + st_header_scad(&scad); + } if (dist !=_dist_prec) { + if (scad.month() ==_scad_prec.month()) + st_tot_mese(); //il totale per nessuna distinta si fa solo per tipo if (_dist_prec != 0) { @@ -683,10 +699,12 @@ bool TPrint_effetti_app::preprocess_page(int file, int counter) st_header_dist(tipodist); } } + _scad_prec = scad; _dist_prec = dist; _tipo_prec = tipodist; _tot_distinta += importo; _tot_tip_dist += importo; + _tot_mese += importo; _tot_stampa += importo ; break; case st_cliente: @@ -699,7 +717,7 @@ bool TPrint_effetti_app::preprocess_page(int file, int counter) st_tot_mese(); // stampo i totali di data e di mese nel caso in cui cambi // il cliente ma non la data o il mese - if (cliente !=_cliente_prec) + if (tipocf != _tipocf_prec || cliente !=_cliente_prec) { if (scad == _scad_prec) st_tot_scad(); @@ -710,7 +728,8 @@ bool TPrint_effetti_app::preprocess_page(int file, int counter) _pr.put(_tot_cliente.string("###.###.##@,@@"),72); printer().print(_pr); _pr.reset(); - _pr.put((look_clifo(_cliente_prec)),52); + TString80 cli; + _pr.put((look_clifo(_tipocf_prec, _cliente_prec, cli)),52); printer().print(_pr); _tot_cliente = 0.0; _pr.reset(); @@ -718,6 +737,7 @@ bool TPrint_effetti_app::preprocess_page(int file, int counter) st_header_cliente(&_cli); } _cliente_prec = cliente; + _tipocf_prec = tipocf; _scad_prec = scad; _tot_cliente += importo; _tot_data += importo; @@ -792,34 +812,38 @@ bool TPrint_effetti_app::set_print(int) to.put(EFF_DATASCAD,cod_to); cod_from = mask.get(F_DADIST); cod_to = mask.get(F_ADIST); - if (cod_from.empty()) - cod_from = "00000000"; // per selezionare tutte - if (cod_to.empty()) // le distinte - cod_to = "99999999"; - filter = ""; - filter << "(NDIST>=" << cod_from << ") && (NDIST<=" << cod_to << ")" ; + + filter.cut(0); + if (cod_from.empty()) + cod_from = "1"; + filter << "(NDIST>=" << cod_from << ")"; + if (cod_to.not_empty()) + filter << "&&(NDIST<=" << cod_to << ")"; + cod_from = mask.get(F_DATIPODIST); - cod_to = mask.get(F_ATIPODIST); - if ((!cod_from.empty())&&(!cod_to.empty())&&(cod_from==cod_to)) // per selezionare un tipo - filter << "&&(TIPODIST==\"" << cod_from << "\")"; // di distinta + filter << "&&(TIPODIST==\"" << cod_from << "\")"; // di distinta select_cursor(_cur_3); break; case st_cliente: - cod_from = mask.get(F_DA_DATA4); - cod_to = mask.get(F_A_DATA4); - from.put(EFF_DATASCAD,cod_from); - to.put(EFF_DATASCAD,cod_to); - cod_from = mask.get(F_DACLI); - cod_to = mask.get(F_ACLI); - if (cod_from.empty()) - cod_from = "000000"; // per selezionare tutti - if (cod_to.empty()) // i clienti - cod_to = "999999"; - from.put(EFF_CODCF,cod_from); - to.put(EFF_CODCF,cod_to); - filter = ""; - filter << "(CODCF>=" << cod_from << ")&&(CODCF<=" << cod_to << ")" ; - select_cursor(_cur_4); + { + cod_from = mask.get(F_DA_DATA4); + cod_to = mask.get(F_A_DATA4); + from.put(EFF_DATASCAD,cod_from); + to.put(EFF_DATASCAD,cod_to); + cod_from = mask.get(F_DACLI); + cod_to = mask.get(F_ACLI); + if (cod_from.empty()) + cod_from = "000000"; // per selezionare tutti + if (cod_to.empty()) // i clienti + cod_to = "999999"; + from.put(EFF_CODCF,cod_from); + to.put(EFF_CODCF,cod_to); + filter = ""; + const TString & tipocf = mask.get(F_TIPOCF); + filter << "(TIPOCF == \"" << tipocf << "\")&&"; + filter << "(CODCF>=" << cod_from << ")&&(CODCF<=" << cod_to << ")" ; + select_cursor(_cur_4); + } break; default: break; @@ -840,7 +864,7 @@ bool TPrint_effetti_app::user_create() // aggiunto solo per poter usare l'oggetto TEffetto (serve il file // aperto anche se non viene usato direttamente) _rel->add(LF_CESS, "NPROGTR==NPROGTR"); - _rel->add(LF_CLIFO, "TIPOCF=='C'|CODCF==CODCF"); + _rel->add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF"); //STAMPA PER SCADENZA _cur_1 = add_cursor(new TCursor(_rel,"",3)); //STAMPA PER BANCA diff --git a/ef/ef0600.h b/ef/ef0600.h index 8af7c9308..ec4ff3b89 100755 --- a/ef/ef0600.h +++ b/ef/ef0600.h @@ -15,13 +15,13 @@ #define F_NUMBERRIGA 109 #define F_DATIPODIST 110 #define F_DADIST 111 -#define F_ATIPODIST 112 #define F_ADIST 113 #define F_DA_DATA3 114 #define F_A_DATA3 115 -#define F_DACLI 116 -#define F_ACLI 117 -#define F_DA_DATA4 118 -#define F_A_DATA4 119 +#define F_TIPOCF 116 +#define F_DACLI 117 +#define F_ACLI 118 +#define F_DA_DATA4 119 +#define F_A_DATA4 120 #endif//__EF0600_H diff --git a/ef/ef0600a.uml b/ef/ef0600a.uml index 27900a93c..26b3db67a 100755 --- a/ef/ef0600a.uml +++ b/ef/ef0600a.uml @@ -15,7 +15,7 @@ BEGIN PROMPT 2 0 "Stampa per " ITEM "1|Banca" MESSAGE SHOW,2@|HIDE,1@|HIDE,3@|HIDE,4@ - ITEM "2|Cliente" + ITEM "2|Cliente/Fornitore" MESSAGE SHOW,4@|HIDE,1@|HIDE,2@|HIDE,3@ ITEM "3|Distinta" MESSAGE SHOW,3@|HIDE,1@|HIDE,2@|HIDE,4@ @@ -54,7 +54,8 @@ BEGIN PROMPT 2 8 "Dalla Banca " FLAGS "RZ" GROUP 2 - USE %BAN KEY 1 SELECT CODTAB ?= "?????" + USE BNP +// KEY 1 SELECT CODTAB ?= "?????" INPUT CODTAB F_DABAN DISPLAY "Codice ABI" CODTAB[1,5] DISPLAY "Denominazione@50" S0 @@ -67,7 +68,8 @@ BEGIN PROMPT 30 8 "Alla Banca " FLAGS "RZ" GROUP 2 - USE %BAN KEY 1 SELECT CODTAB ?= "?????" + USE BNP +// KEY 1 SELECT CODTAB ?= "?????" INPUT CODTAB F_ABAN DISPLAY "Codice ABI" CODTAB[1,5] DISPLAY "Denominazione@50" S0 @@ -127,9 +129,9 @@ BEGIN FLAGS "R" GROUP 3 KEY 4 - USE LF_EFFETTI KEY 4 SELECT NRIGADIST = 1 + USE LF_EFFETTI KEY 4 SELECT NRIGADIST=1 + INPUT TIPODIST F_DATIPODIST SELECT INPUT NDIST F_DADIST - INPUT TIPODIST F_DATIPODIST INPUT NRIGADIST F_NUMBERRIGA DISPLAY "Nr. distinta" NDIST DISPLAY "Tipo distinta" TIPODIST @@ -145,31 +147,19 @@ BEGIN GROUP 3 END -LIST F_ATIPODIST 19 -BEGIN - PROMPT 31 9 " " - GROUP 3 - KEY 4 - ITEM " | " - ITEM "I|All'incasso" - ITEM "B|Salvo buon fine" - ITEM "S|Allo sconto" -END - NUMBER F_ADIST 5 BEGIN PROMPT 31 10 " " FLAGS "R" KEY 4 GROUP 3 - USE LF_EFFETTI KEY 4 SELECT NRIGADIST = 1 + USE LF_EFFETTI KEY 4 SELECT NRIGADIST=1 + INPUT TIPODIST F_DATIPODIST SELECT INPUT NDIST F_ADIST - INPUT TIPODIST F_ATIPODIST INPUT NRIGADIST F_NUMBERRIGA DISPLAY "Nr. distinta" NDIST DISPLAY "Tipo distinta" TIPODIST OUTPUT F_ADIST NDIST - OUTPUT F_ATIPODIST TIPODIST OUTPUT F_NUMBERRIGA NRIGADIST CHECKTYPE NORMAL //NUM_EXPR {#THIS_FIELD>=#F_DADIST} @@ -202,33 +192,41 @@ BEGIN WARNING "Data limite superiore non valida" END -GROUPBOX DLG_NULL 55 4 +GROUPBOX DLG_NULL 55 5 BEGIN - PROMPT 1 7 "Stampa effetti per Cliente" + PROMPT 1 7 "Stampa effetti per Cliente/Fornitori" GROUP 4 END +LIST F_TIPOCF 11 +BEGIN + PROMPT 2 8 "Tipo " + ITEM "C|Clienti" + ITEM "F|Fornitori" + GROUP 4 +END + NUMBER F_DACLI 6 BEGIN - PROMPT 2 8 "Dal Cliente " + PROMPT 2 9 "Da Codice " GROUP 4 USE LF_CLIFO - INPUT TIPOCF "C" + INPUT TIPOCF F_TIPOCF SELECT INPUT CODCF F_DACLI - DISPLAY "Ragione sociale@60" RAGSOC DISPLAY "Codice" CODCF + DISPLAY "Ragione sociale@60" RAGSOC OUTPUT F_DACLI CODCF CHECKTYPE NORMAL END NUMBER F_ACLI 6 BEGIN - PROMPT 30 8 "Al Cliente " + PROMPT 30 9 "A Codice " GROUP 4 - USE LF_CLIFO - INPUT TIPOCF "C" + COPY USE F_DACLI + INPUT TIPOCF F_TIPOCF SELECT INPUT CODCF F_ACLI - DISPLAY "Ragione sociale@60" RAGSOC + COPY DISLAY F_DACLI DISPLAY "Codice" CODCF OUTPUT F_ACLI CODCF CHECKTYPE NORMAL @@ -236,13 +234,13 @@ END DATA F_DA_DATA4 BEGIN - PROMPT 2 9 "Dalla Data " + PROMPT 2 10 "Dalla Data " GROUP 4 END DATA F_A_DATA4 BEGIN - PROMPT 30 9 "Alla Data " + PROMPT 30 10 "Alla Data " GROUP 4 VALIDATE DATE_CMP_FUNC >= F_DA_DATA2 WARNING "Data limite superiore non valida" diff --git a/ef/ef0700.cpp b/ef/ef0700.cpp index 4091de169..90f6aaec7 100755 --- a/ef/ef0700.cpp +++ b/ef/ef0700.cpp @@ -1,20 +1,20 @@ #include #include + #include "batbbnp.h" //////////////////////////////////////////////////// // Classe per la gestione della Tabella di Ditta // // "Banche di presentazione" // //////////////////////////////////////////////////// -class TBnp_table_app : public Tab_application +class TBnp_table_app : public TTable_application { protected: - virtual bool user_destroy() ; virtual bool user_create() ; virtual void init_query_insert_mode(TMask& m) ; virtual void init_insert_mode(TMask& m) ; virtual void init_query_mode (TMask&); - virtual int rewrite(const TMask& m); + public: // @cmember Disabilita la verifica del modulo : essendo una anagrafica, va sempre abilitata virtual bool check_autorization() const @@ -52,7 +52,7 @@ void TBnp_table_app::init_insert_mode(TMask& m) void TBnp_table_app::init_query_mode(TMask& m) { - Tab_application::init_query_mode(m); + TTable_application::init_query_mode(m); m.show(F_ABI); m.show(F_CAB); m.field(F_ABI).check_type(CHECK_REQUIRED); @@ -65,7 +65,7 @@ void TBnp_table_app::init_query_mode(TMask& m) bool TBnp_table_app::user_create() { - Tab_application::user_create(); + TTable_application::user_create(); const TString& name = get_tabname(); if (name.empty()) { @@ -75,16 +75,6 @@ bool TBnp_table_app::user_create() return TRUE; } -bool TBnp_table_app::user_destroy() -{ - return Tab_application::user_destroy(); -} - -int TBnp_table_app::rewrite(const TMask& m) -{ - return Tab_application::rewrite(m); -} - int ef0700(int argc, char* argv[]) { TBnp_table_app a ; diff --git a/ef/ef0800.cpp b/ef/ef0800.cpp index f3c210e26..d99faa597 100755 --- a/ef/ef0800.cpp +++ b/ef/ef0800.cpp @@ -36,10 +36,10 @@ #include #include #include + #include "../cg/cg2101.h" #include "../cg/cg2103.h" #include "../cg/cgsaldac.h" -//#include "../cg/cglib.h" #include "../ve/velib.h" #include "ef0301.h" #include "ef0800a.h" @@ -52,7 +52,7 @@ #include #include -#define CGROWS_LIMIT 99 // Limite imposto da invii/ricezioni +#define CGROWS_LIMIT 96 // Limite imposto da invii/ricezioni #define DIST_INCASSO 'I' #define DIST_SBF 'B' @@ -64,6 +64,7 @@ class TContabilizzazione_effetti_app : public TApplication { TDate _data_op; // Data operazione TString16 _cod_caus; // Codice causale + TString16 _cod_caus_pag; // Codice causale pagamenti int _cod_es; // Codice/anno esercizio bool _sc_enabled; // se TRUE il saldaconto di ditta e' abilitato bool _can_write; // se TRUE e' abilitata la scrittura. Non appena rileva un errore rimane a FALSE for this instance @@ -80,7 +81,8 @@ class TContabilizzazione_effetti_app : public TApplication *_scad, // file delle scadenze (per far funzionare TPartita) *_pags, // file dei pagamenti (per far funzionare TPartita) *_clifo, // file dei clienti - *_doc; // file dei documenti + *_doc, // file dei documenti + *_pcon; // file piano dei conti TTable *_cpg, // tabella condizioni di pagamento *_bnp; // tabella banca presentazione effetti TBill _banca, // conto di contropartita della banca @@ -97,21 +99,23 @@ protected: // TApplication // Compila la testata del movimento void compile_head_mov(); // Compila la riga di partita - void compile_riga_partita(TRiga_partite& riga, TEffetto& effetto, TRectype& riga_effetto); + void compile_riga_partita(TRiga_partite& riga, const TEffetto& effetto, const TRectype& riga_effetto); // Compila la riga di pagamento - void compile_riga_pagamento(TRectype& riga_pagamento, TEffetto& effetto, TRectype& riga_effetto, char acc_sal); + void compile_riga_pagamento(TRectype& riga_pagamento, const TEffetto& effetto, const TRectype& riga_effetto, char acc_sal); // scrive il movimento e le scadenze error_type write_all(bool chage_status = TRUE); // cerca il conto di contropartita per la distinta corrente (setta _banca) error_type search_bank_counter_bill(int tipopag=0); // cerca il conto clienti - error_type search_clifo_bill(const long codcf); + error_type search_clifo_bill(char tipo, const long codcf); // ritorna la sezione corretta per la riga di partita char sezione() const; // aggiunge una riga all'array dei clienti bool add_cg_row(const TRectype& eff, TArray& customers, TAssoc_array& _banks); // unisce gli array clienti/banche nel record array delle righe contabili - void join_rows(TArray& customers, TAssoc_array& banks); + void join_rows(TArray& customers, TAssoc_array& banks, + const TImporto& abbuoni_att, const TImporto& abbuoni_pas, + const TImporto& differenze_cam); // Visualizza l'ultimo errore rilevato void display_error(); // Contabilizza l'effetto corrente @@ -158,32 +162,32 @@ void TContabilizzazione_effetti_app::build_dist_sheet() bool enabled = TRUE; int num_eff = 0; - for (long i = 0; i< items; i++) - { - cur_dist = i; - const long ndist = rec.get_long(EFF_NDIST); - const char tipo = rec.get_char(EFF_TIPODIST); - if (ndist != ndist_prec || tipo != tipo_prec) - { - TToken_string * t = new TToken_string; - - t->add(" ");t->add(tipo_prec); - t->add(ndist_prec); - t->add(num_eff); - t->add(codabi); - t->add(codcab); - const long pos = _dist_sheet->add(t); //aggiunge una riga allo sheet delle distinte + for (long i = 0; i< items; i++) + { + cur_dist = i; + const long ndist = rec.get_long(EFF_NDIST); + const char tipo = rec.get_char(EFF_TIPODIST); + if (ndist != ndist_prec || tipo != tipo_prec) + { + TToken_string * t = new TToken_string; + + t->add(" ");t->add(tipo_prec); + t->add(ndist_prec); + t->add(num_eff); + t->add(codabi); + t->add(codcab); + const long pos = _dist_sheet->add(t); //aggiunge una riga allo sheet delle distinte _dist_sheet->enable_row(pos, enabled); - ndist_prec = ndist; - tipo_prec = tipo; + ndist_prec = ndist; + tipo_prec = tipo; enabled = TRUE; - num_eff = 0; - } - num_eff++; // numero di effetti che compongono la distinta - codabi = rec.get(EFF_CODABIP); - codcab = rec.get(EFF_CODCABP); + num_eff = 0; + } + num_eff++; // numero di effetti che compongono la distinta + codabi = rec.get(EFF_CODABIP); + codcab = rec.get(EFF_CODCABP); enabled &= !rec.get_bool(EFF_EFFCONT); - } + } TToken_string * t = new TToken_string; @@ -194,7 +198,7 @@ void TContabilizzazione_effetti_app::build_dist_sheet() t->add(codcab); const long pos = _dist_sheet->add(t); //aggiunge una riga allo sheet delle distinte _dist_sheet->enable_row(pos, enabled); - } + } } bool TContabilizzazione_effetti_app::handle_reset(TMask_field& f, KEY k) @@ -230,6 +234,7 @@ bool TContabilizzazione_effetti_app::create() TApplication::create(); TConfig conf(CONFIG_DITTA); _cod_caus = conf.get("CODCAUS","ef"); // implementare programma di gestione parametri effetti + _cod_caus_pag = conf.get("CODCAUSPAG","ef"); // implementare programma di gestione parametri effetti _caus = NULL; _sc_enabled = conf.get_bool("GesSal","cg"); if (!has_module(CGAUT) && _sc_enabled) @@ -255,12 +260,12 @@ bool TContabilizzazione_effetti_app::create() _attiv = new TLocalisamfile(LF_ATTIV); // Altrimenti TRegistro non va! _clifo = new TLocalisamfile(LF_CLIFO); _doc = new TLocalisamfile(LF_DOC); + _pcon = new TLocalisamfile(LF_PCON); _distinta = new TDistinta; _movimento = new TMovimentoPN; _dist_sheet = new TArray_sheet(-1, -1, -4, -4, "Selezione distinte", "@1|Tipo|Numero distinta@R|Numero effetti@R|ABI@5|CAB@5"); - if (_sc_enabled) - _part_array = new TPartite_array; + _part_array = new TPartite_array; dispatch_e_menu(BAR_ITEM(1)); return TRUE; } @@ -281,18 +286,36 @@ bool TContabilizzazione_effetti_app::destroy() if (_attiv) delete _attiv; if (_clifo)delete _clifo; if (_doc)delete _doc; + if (_pcon)delete _pcon; if (_caus) delete _caus; if (_distinta) delete _distinta; if (_movimento) delete _movimento; if (_dist_sheet) delete _dist_sheet; - if (_sc_enabled) - delete _part_array; + if (_part_array) delete _part_array; return TApplication::destroy(); } bool TContabilizzazione_effetti_app::menu(MENU_TAG mt) { build_dist_sheet(); + + // Preselezione della distinta specificata sulla riga di comando + if (argc() >= 4) + { + const char tip = *argv(2); + const long num = atol(argv(3)); + for (int r = 0; r < _dist_sheet->items(); r++) + { + TToken_string& row = _dist_sheet->row(r); + if (row.get_char(1) == tip && row.get_long(2) == num) + { + _dist_sheet->check(r); + break; + } + } + _msk->set(F_DISTINTE, _dist_sheet->checked()); + } + while (_msk->run() == K_ENTER) { if (!_dist_sheet->one_checked()) @@ -303,13 +326,13 @@ bool TContabilizzazione_effetti_app::menu(MENU_TAG mt) _data_op = _msk->get_date(F_DATA_OP); if (!_data_op.ok()) _data_op = TODAY; - if (_caus != NULL) delete _caus; - _caus = new TCausale(_cod_caus,_data_op.year()); - if (!_caus->ok()) - { - error_box("Causale contabile non valida o non presente in parametri effetti"); - continue; - } +// if (_caus != NULL) delete _caus; +// _caus = new TCausale(_cod_caus,_data_op.year()); +// if (!_caus->ok()) +// { +// error_box("Causale contabile non valida o non presente in parametri effetti"); +// continue; +// } TEsercizi_contabili esc; esc.update(); _cod_es = esc.date2esc(_data_op); @@ -332,12 +355,16 @@ void TContabilizzazione_effetti_app::display_error() switch (_error) { case clifo_error: - msg.format("Non e' possibile reperire il cliente relativamente alla distinta %c %ld. " + msg.format("Non e' possibile reperire il cliente/fornitore relativamente alla distinta %c %ld. " "Controllare la riga %d",_distinta->tipodist(), _distinta->ndist(),_cur_dist_row+1); break; case bank_error: msg.format("Non e' possibile reperire i conti di contropartita per la banca di presentazione " - "relativamente alla distinta %c %ld. Controllare la tabella e la causale.",_distinta->tipodist(), _distinta->ndist()); + "relativamente alla distinta %c %ld. Controllare la tabella e la causale.",_distinta->tipodist(), _distinta->ndist()); + break; + case cau_abb_error: + msg.format("Non e' possibile reperire i conti per gli abbuoni\n" + " o le differenze cambi dalla causale '%s'", _caus->codice()); break; default: // Errori generici o non indicati vengono visualizzati nel punto dell'errore break; @@ -349,7 +376,7 @@ void TContabilizzazione_effetti_app::display_error() bool TContabilizzazione_effetti_app::add_cg_row(const TRectype& eff, TArray& customers, TAssoc_array& banks) { - const long numreg = _movimento->lfile().get_long(MOV_NUMREG); + const long numreg = _movimento->curr().get_long(MOV_NUMREG); real imp = eff.get_real(EFF_IMPORTO); const int tipopag = eff.get_int(EFF_TIPOPAG); TRectype* c_rec = new TRectype(LF_RMOV); @@ -374,7 +401,8 @@ bool TContabilizzazione_effetti_app::add_cg_row(const TRectype& eff, TArray& cus if (!is_present) // nuova banca? allora setta la sezione ed il conto { int nriga = 2; - if (_sc_enabled && tipopag>1 && tipopag<8) nriga = tipopag+1; + if (_sc_enabled && tipopag>1 && tipopag<8) + nriga = tipopag+1; b_rec.put(RMV_SEZIONE,_caus->sezione(nriga)); b_rec.put(RMV_TIPOC,_banca.tipo()); b_rec.put(RMV_GRUPPO,_banca.gruppo()); @@ -392,7 +420,10 @@ bool TContabilizzazione_effetti_app::add_cg_row(const TRectype& eff, TArray& cus return !is_present; } -void TContabilizzazione_effetti_app::join_rows(TArray& customers, TAssoc_array& banks) +void TContabilizzazione_effetti_app::join_rows(TArray& customers, TAssoc_array& banks, + const TImporto& abbuoni_att, + const TImporto& abbuoni_pas, + const TImporto& differenze_cam) { // aggiunge prima i record delle righe relative ai clienti int j=0,i=0; @@ -410,16 +441,52 @@ void TContabilizzazione_effetti_app::join_rows(TArray& customers, TAssoc_array& _movimento->cg(i++) = *row; _movimento->cg(i-1).put(RMV_NUMRIG,i); } + // infine abbuoni e differenze cambio + if (i > 0 && _sc_enabled) + { + TBill zio; + TRectype riga(_movimento->cg(0)); + if (!abbuoni_pas.is_zero()) + { + _caus->bill(9, zio); zio.put(riga); + if (!zio.ok()) _error = cau_abb_error; + riga.put(RMV_SEZIONE, abbuoni_pas.sezione()); + riga.put(RMV_IMPORTO, abbuoni_pas.valore()); + riga.put(RMV_ROWTYPE, "P"); + _movimento->cg(i++) = riga; + _movimento->cg(i-1).put(RMV_NUMRIG,i); + } + if (!abbuoni_att.is_zero()) + { + _caus->bill(10, zio); zio.put(riga); + if (!zio.ok()) _error = cau_abb_error; + riga.put(RMV_SEZIONE, abbuoni_att.sezione()); + riga.put(RMV_IMPORTO, abbuoni_att.valore()); + riga.put(RMV_ROWTYPE, "A"); + _movimento->cg(i++) = riga; + _movimento->cg(i-1).put(RMV_NUMRIG,i); + } + if (!differenze_cam.is_zero()) + { + _caus->bill(13, zio); zio.put(riga); + if (!zio.ok()) _error = cau_abb_error; + riga.put(RMV_SEZIONE, differenze_cam.sezione()); + riga.put(RMV_IMPORTO, differenze_cam.valore()); + riga.put(RMV_ROWTYPE, "C"); + _movimento->cg(i++) = riga; + _movimento->cg(i-1).put(RMV_NUMRIG,i); + } + } } -error_type TContabilizzazione_effetti_app::search_clifo_bill(const long codcf) +error_type TContabilizzazione_effetti_app::search_clifo_bill(char tipo, const long codcf) { _error = no_error; - _clifo->put(CLI_TIPOCF,"C"); + _clifo->put(CLI_TIPOCF, tipo); _clifo->put(CLI_CODCF,codcf); _cliente.set(0,0,0); if (_clifo->read() == NOERR) - _cliente.set(_clifo->get_int(CLI_GRUPPO),_clifo->get_int(CLI_CONTO),codcf,'C'); + _cliente.set(_clifo->get_int(CLI_GRUPPO),_clifo->get_int(CLI_CONTO),codcf, tipo); if (!_cliente.ok()) // se non e' valido, reperiscilo dalla riga #1 della causale { _caus->bill(1,_cliente); // conto della riga 1 @@ -439,7 +506,7 @@ error_type TContabilizzazione_effetti_app::search_bank_counter_bill(int tipopag) _error = no_error; if (tipopag == 0) // cerca sulla tabella e poi sulla 2a riga di causale { - TString codtab(_distinta->abip()); + TString16 codtab(_distinta->abip()); codtab << _distinta->cabp(); const char tipodist = _distinta->tipodist(); _banca.set(0,0,0); // resetta il conto... @@ -469,11 +536,7 @@ error_type TContabilizzazione_effetti_app::search_bank_counter_bill(int tipopag) // il conto sulla riga 2 della causale (solo se SC non abilitato) if (!_banca.ok() && !_sc_enabled) - { _caus->bill(2,_banca); // conto della riga 2 - if (!_banca.ok()) - _error = bank_error; - } // se il saldaconto non e' abilitato, il conto di contropartita sulla causale // va verificato per ogni riga di distinta, a seconda del tipo di pagamento. } @@ -490,9 +553,9 @@ error_type TContabilizzazione_effetti_app::search_bank_counter_bill(int tipopag) // 8 Rapporti interban. diretti riga 2 // 9 Bonifici riga 2 _caus->bill(tipopag>0 && tipopag<8 ? tipopag+1:2,_banca); - if (!_banca.ok()) - _error = bank_error; } + if (!_banca.ok()) + _error = bank_error; return _error; } @@ -521,14 +584,14 @@ void TContabilizzazione_effetti_app::compile_head_mov() TLocalisamfile& mov = _movimento->lfile(); mov.last(); const long numreg = mov.get_long(MOV_NUMREG)+1; // Calcola il numero di registrazione - const TDate& datadist = _distinta->data_dist(); - const TDate& datacam = _distinta->data_cam(); - const TString& codval = _distinta->codval(); - const real& cambio = _distinta->cambio(); + const TDate datadist = _distinta->data_dist(); + const TDate datacam = _distinta->data_cam(); + const TString16 codval = _distinta->codval(); + const real cambio = _distinta->cambio(); const long ndist = _distinta->ndist(); TString des; - des.format("Contabilizzazione distinta nr. %ld ",ndist, datadist.string()); + mov.zero(); mov.put(MOV_DESCR,des); mov.put(MOV_NUMREG,numreg); @@ -538,7 +601,7 @@ void TContabilizzazione_effetti_app::compile_head_mov() mov.put(MOV_DATADOC,datadist); mov.put(MOV_NUMDOC,ndist); mov.put(MOV_TIPODOC,_caus->tipo_doc()); - mov.put(MOV_CODCAUS,_cod_caus); + mov.put(MOV_CODCAUS,_caus->codice()); mov.put(MOV_CODVAL,codval); mov.put(MOV_DATACAM,datacam); mov.put(MOV_CAMBIO,cambio); @@ -546,7 +609,7 @@ void TContabilizzazione_effetti_app::compile_head_mov() // e solo nel caso di saldaconto abilitato } -void TContabilizzazione_effetti_app::compile_riga_partita(TRiga_partite& riga, TEffetto& effetto, TRectype& riga_effetto) +void TContabilizzazione_effetti_app::compile_riga_partita(TRiga_partite& riga, const TEffetto& effetto, const TRectype& riga_effetto) { TLocalisamfile& head_mov = _movimento->lfile(); riga.put(PART_TIPOMOV,_caus->tipomov()); @@ -559,13 +622,15 @@ void TContabilizzazione_effetti_app::compile_riga_partita(TRiga_partite& riga, T riga.put(PART_DATAPAG,effetto.get_date(EFF_DATASCAD)); riga.put(PART_NUMDOC,head_mov.get(MOV_NUMDOC)); // Sarebbe il numero della distinta... // La descrizione della riga (PART_DESCR) la lascio vuota. Verificare con Guy le regole necessarie per la sua compilazione eventuale - riga.put(PART_SEZ,sezione()); real imp = riga_effetto.get_real(REFF_IMPORTO); real imp_val = riga_effetto.get_real(REFF_IMPORTOVAL); + riga.put(PART_SEZ,sezione()); +/* Non scrivo qui gli importi: li sommo quando faccio i pagamenti riga.put(PART_IMPORTO,imp); + riga.put(PART_IMPORTOVAL,imp_val); +*/ riga.put(PART_CODVAL,effetto.get(EFF_CODVAL)); riga.put(PART_CAMBIO,effetto.get_real(EFF_CAMBIO)); - riga.put(PART_IMPORTOVAL,imp_val); riga.put(PART_DATACAM,effetto.get_date(EFF_DATACAMBIO)); riga.put(PART_TIPOCF,_cliente.tipo()); riga.put(PART_SOTTOCONTO,_cliente.sottoconto()); @@ -580,7 +645,7 @@ void TContabilizzazione_effetti_app::compile_riga_partita(TRiga_partite& riga, T } } -void TContabilizzazione_effetti_app::compile_riga_pagamento(TRectype& riga_pagamento, TEffetto& effetto, TRectype& riga_effetto, char acc_sal) +void TContabilizzazione_effetti_app::compile_riga_pagamento(TRectype& riga_pagamento, const TEffetto& effetto, const TRectype& riga_effetto, char acc_sal) { // ANNO, NUMPART, NRIGA, NRATA, NRIGP dovrebbero essere gia' compilati riga_pagamento.put(PAGSCA_TIPOC,_cliente.tipo()); @@ -671,10 +736,22 @@ void TContabilizzazione_effetti_app::contabilize_bill(const char tipo, const lon // per effettuare il raggruppamento TArray customers; TAssoc_array banks; + TImporto abbuoni_att, abbuoni_pas, differenze_cam; + bool reset_bank = FALSE; _total_mov = 0.0; _total_mov_val = 0.0; distinta.read(tipo,numero,_lock); // Sblocca da solo quella precedente + if (_caus != NULL) + delete _caus; + + const char* cc = distinta.tipocf() == 'C' ? _cod_caus : _cod_caus_pag; + _caus = new TCausale(cc, _data_op.year()); + if (!_caus->ok()) + { + error_box("Causale '%s' non valida o non presente in parametri effetti", cc); + return; + } //Cerca il conto della contropartita della banca di presentazione. //Nel caso in cui sia presente sulla tabella BNP (selezione anche per @@ -710,8 +787,9 @@ void TContabilizzazione_effetti_app::contabilize_bill(const char tipo, const lon //di _movimento if (good() && _can_write) { - join_rows(customers,banks); - write_all(FALSE); // non cambiare lo stato della distinta, cambialo solo alla fine + join_rows(customers, banks, abbuoni_att, abbuoni_pas, differenze_cam); + if (good()) + write_all(FALSE); // non cambiare lo stato della distinta, cambialo solo alla fine } if (good()) { @@ -719,6 +797,7 @@ void TContabilizzazione_effetti_app::contabilize_bill(const char tipo, const lon _part_array->destroy(); // e l'array delle partite customers.destroy(); banks.destroy(); + abbuoni_att = abbuoni_pas = differenze_cam = TImporto('A', ZERO); nrows = 0; _total_mov = 0.0; _total_mov_val = 0.0; @@ -727,9 +806,16 @@ void TContabilizzazione_effetti_app::contabilize_bill(const char tipo, const lon } } if (!good()) break; - TEffetto eff(distinta[_cur_dist_row]); + const TEffetto& eff = distinta[_cur_dist_row]; const long codcf = eff.get_long(EFF_CODCF); - search_clifo_bill(codcf); + const char tipo = eff.get_tipo(); + search_clifo_bill(tipo, codcf); + + const TString16 codval = eff.get(EFF_CODVAL); + const TDate datacam = eff.get(EFF_DATACAMBIO); + const real cambio = eff.get(EFF_CAMBIO); + const TValuta valuta_eff(codval, datacam, cambio); + if (!good()) break; // se la banca non e' stata settata cerca il conto sulla causale a seconda del tipo di pagamento di questo effetto if (!_banca.ok()) @@ -754,7 +840,7 @@ void TContabilizzazione_effetti_app::contabilize_bill(const char tipo, const lon for (int k = 1; k <= rows; k++) { // reperisce gli estremi della partita eventualmente pre-settati sulla riga - TRectype& reff = eff.row_r(k); + const TRectype& reff = eff.row_r(k); anno = reff.get_int(REFF_ANNO); numpart = reff.get(REFF_NUMPART); // Ricava il numero della fattura.. @@ -807,28 +893,69 @@ void TContabilizzazione_effetti_app::contabilize_bill(const char tipo, const lon { TRiga_partite& rpart = partita->riga(r); if (rpart.is_fattura() && rpart.get(PART_NUMDOC) == numdoc_to_search) - { - nriga = r; - break; - } + { + nriga = r; + break; + } } // reperire il numero di rata (nrata) dalla riga effetto int nrata = reff.get_int(REFF_NRATA); char acc_sal = 'A'; if (partita->esiste(nriga,nrata)) // calcola se e' a saldo o in acconto della rata { - TRiga_scadenze& riga_scadenza = partita->rata(nriga,nrata); - TImporto residuo_scadenza(riga_scadenza.residuo(FALSE)); - if (residuo_scadenza.valore() <= reff.get_real(REFF_IMPORTO)) - acc_sal = 'S'; + acc_sal = reff.get_char(REFF_ACCSAL); + if (acc_sal != 'S') + { + TRiga_scadenze& riga_scadenza = partita->rata(nriga,nrata); + TImporto residuo_scadenza(riga_scadenza.residuo(FALSE)); + if (residuo_scadenza.valore() <= reff.get_real(REFF_IMPORTO)) + acc_sal = 'S'; + else + acc_sal = 'A'; // Potrebbe succedere che il ACCSAL sia vuoto + } } else if (nriga != uns) nriga = uns; // E' praticamente impossibile che si trovi la fattura // senza le proprie scadenze. Al limite settiamo il numero di riga per non assegnati. - TRectype& riga_pagamento = partita->pagamento(nriga,nrata,nrigp); // Nuova riga di pagamento - // compilare i campi di riga_pagamento + // Creo una nuova riga di pagamento + TRectype& old_riga_pagamento = partita->pagamento(nriga,nrata,nrigp); + // compilo i campi di riga_pagamento + TRectype riga_pagamento(old_riga_pagamento); compile_riga_pagamento(riga_pagamento,eff,reff, acc_sal); + // Aggiorno il pagamento generando eventuali abbuoni + char old_ap, new_ap; + TImporto old_abb, new_abb, old_diffcam, new_diffcam; + partita->modifica_pagamento(riga_pagamento, valuta_eff, + old_ap, old_abb, old_diffcam, + new_ap, new_abb, new_diffcam, TRUE); + + // Se ci sono abbuoni o differenze cambio... + if (!new_abb.is_zero() || !new_diffcam.is_zero()) + { + if (new_ap == 'A') + { + abbuoni_att -= new_abb; // Sottraggo perche' va in sezione opposta + abbuoni_att.normalize(); + } + if (new_ap == 'P') + { + abbuoni_pas -= new_abb; // Sottraggo perche' va in sezione opposta + abbuoni_pas.normalize(); + } + if (!new_diffcam.is_zero()) + { + differenze_cam -= new_diffcam; // Sottraggo perche' va in sezione opposta + differenze_cam.normalize(); + } + + TRectype& last = (TRectype&)customers[customers.last()]; + TImporto imp(last.get_char(RMV_SEZIONE), last.get_real(RMV_IMPORTO)); + imp += new_abb; // Incremento con abbuoni + imp += new_diffcam; // Incremento con differenze cambi + last.put(RMV_SEZIONE, imp.sezione()); + last.put(RMV_IMPORTO, imp.valore()); + } // completare se necessario i campi della riga effetto corrente (ANNO-NUMPART-NRIGA) } if (reset_bank) @@ -839,8 +966,8 @@ void TContabilizzazione_effetti_app::contabilize_bill(const char tipo, const lon if (good() && _can_write) // scrive il movimento residuo ... { - join_rows(customers,banks); - if (write_all() == no_error) // Se la scrittura e' andata ok... + join_rows(customers, banks, abbuoni_att, abbuoni_pas, differenze_cam); + if (good() && write_all() == no_error) // Se la scrittura e' andata ok... _total_bills++; // incrementa il numero di distinte contabilizzate } _movimento->destroy_rows(mov.get_long(MOV_NUMREG)); // azzera le righe.. diff --git a/ef/ef0900a.h b/ef/ef0900a.h index a2c9fa6fe..f4a03356b 100755 --- a/ef/ef0900a.h +++ b/ef/ef0900a.h @@ -1 +1,2 @@ #define F_CAUSALE 101 +#define F_CAUSALE_PAG 102 diff --git a/ef/ef0900a.uml b/ef/ef0900a.uml index c4187d2c7..bb79f2755 100755 --- a/ef/ef0900a.uml +++ b/ef/ef0900a.uml @@ -1,33 +1,33 @@ #include "ef0900a.h" -TOOLBAR "" 0 20 0 2 +TOOLBAR "" 0 19 0 3 BUTTON DLG_OK 10 2 BEGIN -PROMPT -12 -1 "" +PROMPT -12 -11 "" END BUTTON DLG_QUIT 10 2 BEGIN -PROMPT -22 -1 "" +PROMPT -22 -11 "" END ENDPAGE PAGE "Parametri effetti" 1 1 60 14 -GROUPBOX DLG_NULL 78 4 +GROUPBOX DLG_NULL 78 5 BEGIN -PROMPT 1 2 "Contabilizzazione" +PROMPT 1 2 "@bContabilizzazione" END STRING F_CAUSALE 3 BEGIN - PROMPT 2 3 "Causale incasso " + PROMPT 2 3 "Causale incasso " FIELD CODCAUS KEY 1 FLAGS "UZ" - USE LF_CAUSALI + USE LF_CAUSALI INPUT CODCAUS F_CAUSALE DISPLAY "Cod." CODCAUS DISPLAY "Descrizione@50" DESCR @@ -37,6 +37,19 @@ BEGIN CHECKTYPE NORMAL END +STRING F_CAUSALE_PAG 3 +BEGIN + PROMPT 2 5 "Causale pagamento " + FIELD CODCAUSPAG + KEY 1 + FLAGS "UZ" + COPY USE F_CAUSALE + INPUT CODCAUS F_CAUSALE_PAG + COPY DISPLAY F_CAUSALE + OUTPUT F_CAUSALE_PAG CODCAUS + CHECKTYPE NORMAL +END + ENDPAGE ENDMASK diff --git a/ef/ef0a00.cpp b/ef/ef0a00.cpp new file mode 100755 index 000000000..b46fa41b2 --- /dev/null +++ b/ef/ef0a00.cpp @@ -0,0 +1,587 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include "../cg/cgsaldac.h" +#include "../ef/ef0301.h" + +#include "ef0.h" +#include "ef0A00a.h" + +#include + +/////////////////////////////////////////////////////////// +// Main Mask +/////////////////////////////////////////////////////////// + +class TPE_mask : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + bool on_sheet_event(TOperable_field& o, TField_event e, long jolly); + +public: + bool calc_residual(const TRiga_scadenze& scad, + real& impres, real& imppag, + char& accsal, int& rdist, int& reff) const; + bool fill_rate(); + void update_total(); + + TRectype& new_row_effetto(TDistinta& dist, char tipocf, long codcf, + int& rigadist, int& rigaeff) const; + void save_rate(); + void print(); + + TPE_mask() : TAutomask("ef0A00a") { } + virtual ~TPE_mask() { } +}; + +// Calcola il residuo di una rata tenendo conto anche degli eventuali +// effetti non ancora contabilizzati +bool TPE_mask::calc_residual(const TRiga_scadenze& scad, + real& impres, real& imppag, + char& accsal, int& rdist, int& reff) const +{ + TRelation rel(LF_REFFETTI); + rel.add(LF_EFFETTI, "NPROGTR==NPROGTR"); + + TRectype& filter = rel.curr(); + const char* field[] = { SCAD_ANNO, SCAD_NUMPART, SCAD_NRIGA, SCAD_NRATA, NULL }; + for (int i = 0; field[i]; i++) + filter.put(field[i], scad.get(field[i])); + TCursor cur(&rel, "", 2, &filter, &filter); + + const char tipocf = scad.get_char(SCAD_TIPOCF); + const long codcf = scad.get_long(SCAD_SOTTOCONTO); + TString expr; + expr << '(' << LF_EFFETTI << "->EFFCONT!=\"X\")&&"; + expr << '(' << LF_EFFETTI << "->TIPOCF==\"" << tipocf << "\")&&"; + expr << '(' << LF_EFFETTI << "->CODCF==\"" << codcf << "\")"; + cur.setfilter(expr, TRUE); + + const long items = cur.items(); + const bool valuta = scad.in_valuta(); + + impres = scad.residuo(TRUE).valore(); + imppag = ZERO; + accsal = 'A'; + rdist = reff = 0; + + if (items > 0L) + { + cur.freeze(); + const TRectype& riga = cur.curr(); + const TRectype& effe = cur.curr(LF_EFFETTI); + for (cur = 0L; cur.pos() < items; ++cur) + { + if (effe.get(EFF_TIPODIST) == get(F_TIPODIST) && + effe.get(EFF_NDIST) == get(F_DIST)) + { + rdist = effe.get_int(EFF_NRIGADIST); + reff = riga.get_int(REFF_NRIGATR); + accsal = riga.get_char(REFF_ACCSAL); + imppag += riga.get_real(valuta ? REFF_IMPORTOVAL : REFF_IMPORTO); + } + else + { + if (riga.get_char(REFF_ACCSAL) == 'S') + { + impres = ZERO; + break; + } + impres -= riga.get_real(valuta ? REFF_IMPORTOVAL : REFF_IMPORTO); + } + } + } + + return !impres.is_zero(); +} + +void TPE_mask::update_total() +{ + real tot, val; + TSheet_field& s = sfield(F_SHEET); + const int postot = s.cid2index(F_IMPORTO); + FOR_EACH_SHEET_ROW_BACK(s, r, row) + tot += real(row->get(postot)); + set(F_TOTAL, tot); +} + +bool TPE_mask::fill_rate() +{ + const long ndist = get_long(F_DIST); + const TDate dadata = get(F_DA_DATA); + const TDate adata = get(F_A_DATA); + const TString& codval = get(F_CODVAL); + TSheet_field& sheet = sfield(F_SHEET); + sheet.destroy(); + + TRelation rel(LF_PARTITE); + TRectype filter(LF_PARTITE); + filter.put(PART_TIPOCF, get(F_TIPOCF)); + filter.put(PART_GRUPPO, 0); + filter.put(PART_CONTO, 0); + filter.put(PART_SOTTOCONTO, get(F_CLIFO)); + + TCursor partite(&rel, "", 1, &filter, &filter); + + TString filtro; + filtro << "(CHIUSA!=\"X\")&&(CODVAL==\"" << codval << "\")"; + partite.setfilter(filtro, TRUE); + + long items = partite.items(); + if (items == 0) + return FALSE; + + TRectype& partita = partite.curr(); + + TProgind pi(items, "Caricamento partite aperte", FALSE, TRUE); + if (items > 900) items = 900; + partite.freeze(); + + long last_cf = 0; + int last_year = 0; + TString16 last_game; + TString last_ragsoc; + + for (partite = 0L; partite.pos() < items; ++partite) + { + pi.addstatus(1); + const long cur_cf = partita.get_long(PART_SOTTOCONTO); + const int cur_year = partita.get_int(PART_ANNO); + const TString& cur_game = partita.get(PART_NUMPART); + if (cur_cf == last_cf && cur_year == last_year && cur_game == last_game) + continue; + last_year = cur_year; + last_game = cur_game; + if (cur_cf != last_cf) + { + last_cf = cur_cf; + TString16 cod; + cod << get(F_TIPOCF) << '|' << last_cf; + last_ragsoc = cache().get(LF_CLIFO, cod, CLI_RAGSOC); + } + + const TPartita game(partita); + const int last = game.last(); + for (int riga = game.prima_fattura(); riga > 0 && riga <= last; riga++) + { + const TRiga_partite& rp = game.riga(riga); + if (rp.is_fattura()) + { + for (int rata = 1; rata <= rp.rate(); rata++) + { + const TRiga_scadenze& rs = rp.rata(rata); + if (!rs.chiusa()) + { + const TDate data = rs.get(SCAD_DATASCAD); + if (data >= dadata && (!adata.ok() || data <= adata)) + { + real impres, imppag; + char accsal; int rigadist, rigaeff; + bool ok = calc_residual(rs, impres, imppag, accsal, + rigadist, rigaeff); + if (ok) + { + TToken_string& row = sheet.row(-1); + row.add(imppag.string()); + row.add(accsal); + row.add(impres.string()); + row.add(last_cf); + row.add(last_ragsoc); + row.add(game.anno()); + row.add(game.numero()); + row.add(riga); + row.add(rata); + row.add(data); + row.add(rigadist); + row.add(rigaeff); + } + } + } + } + } + } + } + sheet.force_update(); + update_total(); + + const int righe = sheet.items(); + const bool canedit = righe > 0; + enable(-5, canedit); + + return canedit; +} + +TRectype& TPE_mask::new_row_effetto(TDistinta& dist, char tipocf, long codcf, + int& rigadist, int& rigaeff ) const +{ + TString16 codice; codice << tipocf << '|' << codcf; + const bool ragg = cache().get(LF_CFVEN, codice, CFV_RAGGEFF).not_empty(); + + TEffetto* neweff = NULL; + if (ragg) + { + for (int i = 0; i < dist.items(); i++) + { + TEffetto& eff = dist[i]; + if (eff.get_char(EFF_TIPOCF) == tipocf && + eff.get_long(EFF_CODCF) == codcf) + { + neweff = &eff; + rigadist = i+1; + break; + } + } + } + if (neweff == NULL) + { + neweff = new TEffetto; + dist.righe().add(neweff); + rigadist = dist.items(); + neweff->put(EFF_TIPOCF, tipocf); + neweff->put(EFF_CODCF, codcf); + neweff->put(EFF_TIPOCF, get(F_TIPOCF)); + neweff->put(EFF_CODVAL, get(F_CODVAL)); + neweff->put(EFF_CAMBIO, get(F_CAMBIO)); + neweff->put(EFF_DATACAMBIO, get(F_DATADIST)); + } + rigaeff = neweff->rows_r()+1; + return neweff->row_r(rigaeff, TRUE); +} + +void TPE_mask::save_rate() +{ + const TString& codval = get(F_CODVAL); + const real cambio = get(F_CAMBIO); + + const char tipodist = get(F_TIPODIST)[0]; + const long numdist = get_long(F_DIST); + TDistinta distinta(tipodist, numdist, _lock); + + bool zeroes = FALSE; // Esistono righe effetto da cancellare + + TSheet_field& sheet = sfield(F_SHEET); + FOR_EACH_SHEET_ROW(sheet, r, row) + { + real imp = row->get(sheet.cid2index(F_IMPORTO)); + real impval; + if (codval.not_empty() && !imp.is_zero()) + { + impval = imp; + TCurrency c(impval, codval, cambio); + c.change_to_firm_val(); + imp = c.get_num(); + } + char accsal = row->get_char(sheet.cid2index(F_ACCSAL)); + int rigadist = row->get_int(sheet.cid2index(F_RIGADIST)); + int rigaeff = row->get_int(sheet.cid2index(F_RIGAEFF)); + if (rigaeff > 0 || accsal == 'S' || imp > ZERO) + { + if (rigaeff <= 0) + { + char tipocf = get(F_TIPOCF)[0]; + long codcf = row->get_long(sheet.cid2index(F_CODCF)); + + TRectype& reff = new_row_effetto(distinta, tipocf, codcf, rigadist, rigaeff); + reff.put(REFF_ANNO, row->get(sheet.cid2index(F_ANNO))); + reff.put(REFF_NUMPART, row->get(sheet.cid2index(F_PARTITA))); + reff.put(REFF_NRIGA, row->get(sheet.cid2index(F_RIGA))); + reff.put(REFF_NRATA, row->get(sheet.cid2index(F_RATA))); + + TToken_string key; + key.add(get(F_TIPOCF)); + key.add("0|0"); + key.add(row->get(sheet.cid2index(F_CODCF))); + key.add(row->get(sheet.cid2index(F_ANNO))); + key.add(row->get(sheet.cid2index(F_PARTITA))); + key.add(row->get(sheet.cid2index(F_RIGA))); + key.add(row->get(sheet.cid2index(F_RATA))); + const TRectype& scad = cache().get(LF_SCADENZE, key); + + TString16 abi = scad.get(SCAD_CODABI); + TString16 cab = scad.get(SCAD_CODCAB); + if (atol(cab) == 0L) + { + key = get(F_TIPOCF); + key.add(row->get(sheet.cid2index(F_CODCF))); + const TRectype& clifo = cache().get(LF_CLIFO, key); + abi = clifo.get(CLI_CODABI); + cab = clifo.get(CLI_CODCAB); + } + + TEffetto& eff = distinta[rigadist-1]; + eff.put(EFF_DATASCAD, scad.get(SCAD_DATASCAD)); + eff.put(EFF_CODABI, abi); + eff.put(EFF_CODCAB, cab); + } + + TEffetto& eff = distinta[rigadist-1]; + TRectype& reff = eff.row_r(rigaeff); + real oldimp = reff.get(REFF_IMPORTO); + real oldimpval = reff.get(REFF_IMPORTOVAL); + reff.put(REFF_IMPORTO, imp); + reff.put(REFF_IMPORTOVAL, impval); + reff.put(REFF_ACCSAL, accsal); + + if (imp.is_zero() && accsal != 'S') + { + reff.put(REFF_ACCSAL, 'Z'); // Segna la riga come NULLA + zeroes = TRUE; + } + } + } + + // Ricalcola totali righe ed elimina le righe NULLE + for (int rd = distinta.items()-1; rd >= 0; rd--) + { + TEffetto& eff = distinta[rd]; + real totimp, totimpval; + for (int i = eff.rows_r(); i > 0; i--) + { + const TRectype& reff = eff.row_r(i); + if (reff.get_char(REFF_ACCSAL) == 'Z') + eff.destroy_row_r(i, TRUE); + else + { + totimp += reff.get_real(EFF_IMPORTO); + totimpval += reff.get_real(EFF_IMPORTOVAL); + } + } + if (eff.rows_r() == 0) + distinta.righe().destroy(rd, TRUE); + else + { + eff.put(EFF_IMPORTO, totimp); + eff.put(EFF_IMPORTOVAL, totimpval); + eff.put(EFF_TIPOPAG, get(F_TIPOPAG)); + } + } + + TToken_string dati_dist; + dati_dist.add(tipodist); + dati_dist.add(numdist); + dati_dist.add(get(F_DATADIST)); + dati_dist.add(get(F_ABI)); + dati_dist.add(get(F_CAB)); + distinta.write(FALSE, &dati_dist); +} + +void TPE_mask::print() +{ + TString16 cmd; + cmd << "ef0 -4 " << get(F_TIPODIST) << ' ' << get(F_DIST); + TExternal_app app(cmd); + app.run(); +} + +bool TPE_mask::on_sheet_event(TOperable_field& o, TField_event e, long jolly) +{ + TMask& m = o.mask(); + switch (o.dlg()) + { + case F_IMPORTO: + if (e == fe_modify) + { + if (m.get_real(F_IMPORTO) >= m.get_real(F_RESIDUO)) + m.set(F_ACCSAL, "S"); + } + break; + case F_PAGA: + if (e == fe_button) + { + TMask& m = o.mask(); + if (m.get_real(F_IMPORTO).is_zero()) + { + m.set(F_IMPORTO, m.get(F_RESIDUO)); + m.set(F_ACCSAL, "S"); + } + else + { + m.reset(F_IMPORTO); + m.reset(F_ACCSAL); + } + } + break; + case F_SHEET: + switch(e) + { + case se_query_add: + { + TOperable_field& baggio = (TOperable_field&)field(F_AGGIORNA); + if (baggio.active()) + on_field_event(baggio, fe_button, 0); + } + return FALSE; + case se_notify_modify: + update_total(); + break; + default: + break; + } + default: + break; + } + return TRUE; +} + +bool TPE_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case DLG_NEWREC: + { + TLocalisamfile eff(LF_EFFETTI); eff.setkey(4); + TRectype& curr = eff.curr(); + curr.put(EFF_TIPODIST, get(F_TIPODIST)); + curr.put(EFF_NDIST, 9999999L); + const int err = eff.read(_isgreat); + long n = 1L; + if (err != _isemptyfile) + { + if (err == NOERR) + eff.prev(); + if (curr.get(EFF_TIPODIST) == get(F_TIPODIST)) + n += curr.get_long(EFF_NDIST); + } + set(F_DIST, n); + } + break; + case F_DIST: + if (e == fe_modify) + { + TEdit_field& ef = (TEdit_field&)o; + bool ok = ef.check(); + if (ok) + { + const TCursor& cur = *ef.browse()->cursor(); + ok = cur.ok(); + if (ok) + { + const TRectype& rec = cur.curr(); + if (rec.get_bool(EFF_EFFCONT)) + return error_box("La distinta %s e' gia' stata contabilizzata,\n" + "per cui non e' possibile modificarla", (const char*)ef.get()); + } + } + enable(-3, !ok); + } + break; + case F_AGGIORNA: + if (e == fe_button) + { + if (!field(F_DIST).empty()) + { + const bool full = fill_rate(); + if (full) + { + disable(-3); + disable(-4); + } + } + else + return error_box("E' necessario specificare un numero di distinta"); + } + break; + case F_CONTABILI: + if (e == fe_button) + { + TString16 cmd; + cmd << "ef0 -7 " << get(F_TIPODIST) << ' ' << get(F_DIST); + TExternal_app app(cmd); + app.run(); + stop_run(K_ESC); + } + break; + case DLG_DELREC: + if (e == fe_button && yesno_box("Confermate l'eliminazione della distinta %ld", + get_long(F_DIST))) + { + TSheet_field& sheet = sfield(F_SHEET); + FOR_EACH_SHEET_ROW(sheet, r, row) + row->add("", 0); + save_rate(); + } + break; + case DLG_SAVEREC: + if (e == fe_button) + { + if (check_fields()) + { + save_rate(); + fill_rate(); + } + } + break; + case DLG_PRINT: + if (e == fe_button) + { + print(); + return FALSE; + } + break; + case F_SHEET: + return on_sheet_event(o, e, jolly); + default: + if (jolly > 0) + return on_sheet_event(o, e, jolly); + break; + } + return TRUE; +} + +/////////////////////////////////////////////////////////// +// Main Program +/////////////////////////////////////////////////////////// + +class TPagamento_effetti : public TSkeleton_application +{ + TPE_mask* _mask; + +public: + virtual void main_loop(); + virtual void print(); +}; + +void TPagamento_effetti::main_loop() +{ + open_files(LF_TABCOM, LF_TAB, LF_CLIFO, LF_CFVEN, + LF_PARTITE, LF_SCADENZE, LF_PAGSCA, + LF_EFFETTI, LF_REFFETTI, LF_CESS, 0); + enable_menu_item(M_FILE_PRINT); + _mask = new TPE_mask; + do + { + _mask->reset(F_DIST); + _mask->enable(-3); + _mask->enable(-4); + _mask->disable(-5); + _mask->sfield(F_SHEET).destroy(); + _mask->reset(F_TOTAL); + } + while (_mask->run() != K_QUIT); + + delete _mask; + _mask = NULL; +} + +void TPagamento_effetti::print() +{ + if (_mask) + _mask->print(); +} + +int ef0A00(int argc, char* argv[]) +{ + TPagamento_effetti pe; + pe.run(argc, argv, "Distinte Pagamento"); + return 0; +} diff --git a/ef/ef0a00a.h b/ef/ef0a00a.h new file mode 100755 index 000000000..8e743142d --- /dev/null +++ b/ef/ef0a00a.h @@ -0,0 +1,33 @@ +#define F_TIPOCF 201 +#define F_DA_DATA 202 +#define F_A_DATA 203 +#define F_ABI 204 +#define F_CAB 205 +#define F_TIPODIST 206 +#define F_DIST 207 +#define F_DUMMYDIST 208 +#define F_DATADIST 209 +#define F_CODVAL 210 +#define F_CAMBIO 211 +#define F_CLIFO 212 +#define F_TIPOPAG 213 +#define F_TOTAL 220 + +#define F_SHEET 300 +#define F_AGGIORNA 301 +#define F_CONTABILI 302 + +#define F_PAGA 100 +#define F_IMPORTO 101 +#define F_ACCSAL 102 +#define F_RESIDUO 103 +#define F_CODCF 104 +#define F_RAGSOC 105 +#define F_ANNO 106 +#define F_PARTITA 107 +#define F_RIGA 108 +#define F_RATA 109 +#define F_DATA 110 +#define F_RIGADIST 111 +#define F_RIGAEFF 112 + diff --git a/ef/ef0a00a.uml b/ef/ef0a00a.uml new file mode 100755 index 000000000..3671ac94a --- /dev/null +++ b/ef/ef0a00a.uml @@ -0,0 +1,328 @@ +#include "ef0A00a.h" + +TOOLBAR "Toolbar" 0 -3 0 3 + +BUTTON DLG_NEWREC 10 2 +BEGIN + PROMPT -16 -11 "~Nuovo" + PICTURE BMP_NEWREC + PICTURE BMP_NEWRECDN + GROUP 3 +END + +BUTTON DLG_SAVEREC 10 2 +BEGIN + PROMPT -26 -11 "" + PICTURE BMP_SAVEREC + PICTURE BMP_SAVERECDN + GROUP 5 +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -36 -11 "" + PICTURE BMP_DELREC + PICTURE BMP_DELRECDN + GROUP 5 +END + +BUTTON DLG_PRINT 10 2 +BEGIN + PROMPT -46 -11 "" + PICTURE BMP_PRINT +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -56 -11 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -66 -11 "" +END + +ENDPAGE + +PAGE "Distite Pagamento" -1 -1 78 19 + +GROUPBOX DLG_NULL 78 5 +BEGIN + PROMPT 1 0 "@bDistinta" +END + +LIST F_TIPODIST 1 15 +BEGIN + PROMPT 2 1 "Tipo " + ITEM "I|All'incasso" + ITEM "B|Salvo buon fine" + ITEM "S|Allo sconto" + GROUP 3 +END + +LIST F_DUMMYDIST 1 +BEGIN + PROMPT 15 1 "" + ITEM "1|1" + FLAGS "H" +END + +NUMBER F_DIST 5 +BEGIN + PROMPT 30 1 "Numero " + USE LF_EFFETTI KEY 4 SELECT NRIGADIST==1 + INPUT TIPODIST F_TIPODIST + INPUT NDIST F_DIST + INPUT NRIGADIST F_DUMMYDIST + DISPLAY "Tipo" TIPODIST + DISPLAY "Numero" NDIST + DISPLAY "Data@10" DATADIST + DISPLAY "C/F" TIPOCF + DISPLAY "ABI@5" CODABIP + DISPLAY "CAB@5" CODCABP + DISPLAY "Valuta" CODVAL + OUTPUT F_TIPODIST TIPODIST + OUTPUT F_DIST NDIST + OUTPUT F_DATADIST DATADIST + OUTPUT F_CODVAL CODVAL + OUTPUT F_TIPOCF TIPOCF + OUTPUT F_ABI CODABIP + OUTPUT F_CAB CODCABP + OUTPUT F_TIPOPAG TIPOPAG + CHECKTYPE SEARCH + GROUP 4 +END + +STRING F_CODVAL 3 +BEGIN + PROMPT 53 1 "Valuta " + FLAGS "UZ" + USE %VAL + INPUT CODTAB F_CODVAL + DISPLAY "Codice" CODTAB + DISPLAY "Denominazione@50" S0 + OUTPUT F_CODVAL CODTAB + CHECKTYPE NORMAL + GROUP 3 + MESSAGE EMPTY CLEAR,F_CAMBIO + MESSAGE ENABLE,F_CAMBIO +END + +DATE F_DATADIST +BEGIN + PROMPT 2 2 "Data " + FLAGS "A" + CHECKTYPE REQUIRED +END + +NUMBER F_CAMBIO 15 5 +BEGIN + PROMPT 53 2 "Cambio " +END + +NUMBER F_ABI 5 +BEGIN + PROMPT 2 3 "Banca " + FLAGS "Z" + USE BNP + JOIN %BAN ALIAS 100 INTO CODTAB==CODTAB + INPUT CODTAB[1,5] F_ABI + INPUT CODTAB[6,10] F_CAB + DISPLAY "ABI@5" CODTAB[1,5] + DISPLAY "CAB@5" CODTAB[6,10] + DISPLAY "Denominazione@50" 100@->S0 + OUTPUT F_ABI CODTAB[1,5] + OUTPUT F_CAB CODTAB[6,10] + CHECKTYPE REQUIRED +END + +NUMBER F_CAB 5 +BEGIN + PROMPT 17 3 "" + FLAGS "Z" + COPY ALL F_ABI + CHECKTYPE REQUIRED +END + +LIST F_TIPOPAG 1 30 +BEGIN + PROMPT 35 3 "Pagamento " + ITEM "1|Rimessa Diretta" + ITEM "2|Tratta" + ITEM "3|Ricevuta Bancaria" + ITEM "4|Cessione" + ITEM "5|Paghero'" + ITEM "6|Lettera di credito" + ITEM "7|Tratta accettata" + ITEM "8|Rapporti interbancari diretti" + ITEM "9|Bonifico" +END + +LIST F_TIPOCF 1 10 +BEGIN + PROMPT 2 5 "Seleziona " + ITEM "C|Cliente" + ITEM "F|Fornitore" + GROUP 3 +END + +NUMBER F_CLIFO 6 +BEGIN + PROMPT 38 5 "" + USE LF_CLIFO + INPUT TIPOCF F_TIPOCF SELECT + INPUT CODCF F_CLIFO + DISPLAY "Codice" CODCF + DISPLAY "Ragione Sociale@50" RAGSOC + OUTPUT F_CLIFO CODCF + CHECKTYPE NORMAL + GROUP 4 +END + +DATE F_DA_DATA +BEGIN + PROMPT 2 6 "Dalla data " + GROUP 4 +END + +DATE F_A_DATA +BEGIN + PROMPT 28 6 "Alla data " + FLAGS "A" + GROUP 4 +END + +BUTTON F_AGGIORNA 10 2 +BEGIN + PROMPT 66 5 "" + PICTURE BMP_SELECT + GROUP 4 +END + +SPREADSHEET F_SHEET 0 -2 +BEGIN + PROMPT 0 7 "" + ITEM "Importo@18" + ITEM "A/S@3" + ITEM "Residuo@18" + ITEM "Codice" + ITEM "Ragione Sociale@20" + ITEM "Anno" + ITEM "Partita" + ITEM "Riga" + ITEM "Rata" + ITEM "Data@10" + ITEM "Riga" + ITEM "Effetto" +END + +CURRENCY F_TOTAL 18 +BEGIN + PROMPT 2 -1 "Totale " + FLAGS "D" +END + +BUTTON F_CONTABILI 30 +BEGIN + PROMPT 41 -1 "~Contabilizzazione" + GROUP 5 +END + +ENDPAGE + +ENDMASK + +PAGE "Rate" -1 -1 60 9 + +NUMBER F_RIGADIST 4 +BEGIN + PROMPT 31 1 "Riga effetto " + FLAGS "D" +END + +NUMBER F_RIGAEFF 4 +BEGIN + PROMPT 51 1 "" + FLAGS "D" +END + +NUMBER F_CODCF 6 +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +STRING F_RAGSOC 50 +BEGIN + PROMPT 9 1 "" + FLAGS "D" +END + +NUMBER F_ANNO 4 +BEGIN + PROMPT 1 3 "Anno " + FLAGS "D" +END + +STRING F_PARTITA 7 +BEGIN + PROMPT 21 3 "Partita " + FLAGS "D" +END + +NUMBER F_RIGA 4 +BEGIN + PROMPT 38 3 "Riga " + FLAGS "D" +END + +NUMBER F_RATA 4 +BEGIN + PROMPT 50 3 "Rata " + FLAGS "D" +END + +DATE F_DATA +BEGIN + PROMPT 1 4 "Data " + FLAGS "D" +END + +CURRENCY F_RESIDUO 18 +BEGIN + PROMPT 1 5 "Residuo " + FLAGS "D" + DRIVENBY -F_CODVAL +END + +CURRENCY F_IMPORTO 18 +BEGIN + PROMPT 1 6 "Importo " + DRIVENBY -F_CODVAL +END + +LIST F_ACCSAL 1 10 +BEGIN + PROMPT 41 6 "" + ITEM "A|Acconto" + ITEM "S|Saldo" +END + +BUTTON F_PAGA 10 2 +BEGIN + PROMPT -13 -1 "~Paga" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK diff --git a/ef/f14.dir b/ef/f14.dir index 9a48bb54e..a8ff1a9b5 100755 --- a/ef/f14.dir +++ b/ef/f14.dir @@ -1,3 +1,3 @@ 14 0 -$reffetti|0|0|125|34|Righe effetti|#13|| +$reffetti|0|0|126|34|Righe effetti|#13|| diff --git a/ef/f14.trr b/ef/f14.trr index 974a01ee4..30f0952fd 100755 --- a/ef/f14.trr +++ b/ef/f14.trr @@ -1,5 +1,5 @@ 14 -15 +16 NPROGTR|3|7|0|Numero progressivo effetto NRIGATR|2|3|0|Numero riga effetto ANNO|2|4|0|Anno/Esercizio @@ -15,5 +15,7 @@ IMPFATT|4|18|2|Importo fattura IMPORTO|4|18|2|Importo effetto IMPFATTVAL|4|18|3|Importo fattura in valuta IMPORTOVAL|4|18|3|Importo effetto in valuta -1 +ACCSAL|1|1|0|Acconto/Saldo +2 NPROGTR+NRIGATR| +ANNO+NUMPART+NRIGA+NRATA| diff --git a/ef/f31.dir b/ef/f31.dir index c93cce4a8..6a3f54bc5 100755 --- a/ef/f31.dir +++ b/ef/f31.dir @@ -1,3 +1,3 @@ 31 0 -$effetti|0|0|154|34|Effetti|NEFF|| +$effetti|0|0|155|0|Effetti|NEFF|| diff --git a/ef/f31.trr b/ef/f31.trr index 2173cca9f..2fd5943b3 100755 --- a/ef/f31.trr +++ b/ef/f31.trr @@ -1,10 +1,11 @@ 31 -27 +28 NPROGTR|3|7|0|Numero progressivo effetto DATASCAD|5|8|0|Data di scadenza TIPOPAG|2|1|0|Tipo pagamento ULTCLASS|1|1|0|Ulteriore clessificazione -CODCF|3|6|0|Codice cliente +TIPOCF|1|1|0|Tipo (liente, ornitore +CODCF|3|6|0|Codice cliente/Fornitore NUMEMISS|3|8|0|Numero di emissione DATAEMISS|5|8|0|Data emissione CODVAL|1|3|0|Codice valuta diff --git a/ef/rb.frm b/ef/rb.frm index 0d6caf7e8..e2beb8ef1 100755 --- a/ef/rb.frm +++ b/ef/rb.frm @@ -23,8 +23,6 @@ END GENERAL BEGIN OFFSET 0 0 - FONT "Roman 17cpi" - SIZE 12 END SECTION BODY ODD 19 @@ -117,7 +115,7 @@ STRING 13 32 BEGIN KEY "indirizzo debitore" PROMPT 31 16 "" - FIELD 20->INDCF + MESSAGE _CLI,!IND END STRING 14 5 @@ -127,20 +125,21 @@ BEGIN FIELD 20->CAPCF END -STRING 15 22 +STRING 15 30 BEGIN KEY "localita debitore" PROMPT 38 17 "" - FIELD 20->LOCALITACF + MESSAGE _CLI,!PIAZZA END - -STRING 16 2 + +STRING 23 16 BEGIN - KEY "provincia debitore" - PROMPT 61 17 "" - FIELD 113@->PROVCOM -END - + KEY "codice fiscale" + PROMPT 31 18 "" + FIELD 20->PAIV + FIELD 20->COFI +END + STRING 17 27 2 BEGIN KEY "istituto banca d'appoggio" diff --git a/ef/riba.ini b/ef/riba.ini index 937a99718..14097bc90 100755 --- a/ef/riba.ini +++ b/ef/riba.ini @@ -1,9 +1,12 @@ [MAIN] -TYPEFIELD = 1 DECSEP = , -RECORDSEP = +FIELDSEP = +RECORDSEP = RECORDSIZE = 120 -FIELDSEP = +SKIPLINES = 0 +TYPEFIELD = 1 +TYPELEN = -1 +TYPEPOS = -1 [TYPE FISSO] ALIGN = @@ -43,7 +46,7 @@ DATA = S DECIMAL = 0 FILLER = ' ' LENGTH = 0 -PICTURE = +PICTURE = [HEADER RB] NAME(0)=CAMPO BLANK @@ -146,22 +149,22 @@ LENGTH(10) = 5 NAME(11) = CAMPO BLANK TYPE(11) = FISSO -POSITION(11) = 58 +POSITION(11) = 57 LENGTH(11) = 12 NAME(12) = CODICE ABI BANCA DOMICILIATARIA (FACOLTATIVO) -TYPE(12) = FISSO -POSITION(12) = 70 +FIELD(12) = 31->CODABI +POSITION(12) = 69 LENGTH(12) = 5 NAME(13) = CODICE CAB BANCA DOMICILIATARIA (FACOLTATIVO) -TYPE(13) = FISSO -POSITION(13) = 75 +FIELD(13) = 31->CODCAB +POSITION(13) = 74 LENGTH(13) = 5 NAME(14) = RIFERIMENTO DEBITORE (FACOLTATIVO) TYPE(14) = FISSO -POSITION(14) = 80 +POSITION(14) = 79 LENGTH(14) = 12 NAME(15) = CODICE AZIENDA (FACOLTATIVO) @@ -171,7 +174,7 @@ LENGTH(15) = 5 NAME(16) = CODICE FISSO (FACOLTATIVO) TYPE(16) = FISSO -POSITION(16) = 91 +POSITION(16) = 96 LENGTH(16) = 1 NAME(17) = CODICE CLIENTE DEBITORE (FACOLTATIVO) @@ -259,10 +262,16 @@ POSITION(4)=40 LENGTH(4)=30 MESSAGE(4) = _DEBITORE,!RAGSOC,2 -NAME(5)=CAMPO BLANK -TYPE(5)=FISSO +NAME(5)=CODICE FISCALE DEBITORE SEGMENTO 3 +TYPE(5)=STRINGA POSITION(5)=70 -LENGTH(5)=50 +LENGTH(5)=16 +MESSAGE(5)= _DEBITORE,!CFPI + +NAME(6)=CAMPO BLANK +TYPE(6)=FISSO +POSITION(6)=86 +LENGTH(6)=34 [RECORD 40] NAME(0)=CAMPO BLANK @@ -293,7 +302,7 @@ FIELD(4)=20->CAPCF POSITION(4)=40 LENGTH(4)=5 -NAME(5)=INDIRIZZO DEBITORE: COMUNE +NAME(5)=INDIRIZZO DEBITORE: COMUNE TYPE(5)=STRINGA POSITION(5)=45 LENGTH(5)=23 @@ -462,7 +471,7 @@ NAME(7)=IMPORTO TOTALE DEL FLUSSO TYPE(7)=IMPORTO POSITION(7)=52 LENGTH(7)=15 -PICTURE(7)= ############@,@ +PICTURE(7)= ############@ MESSAGE(7)=_IMPORTO,!TOT NAME(8)=ZERO FILLED diff --git a/include/applicat.cpp b/include/applicat.cpp index 90b08e787..bc1d3526c 100755 --- a/include/applicat.cpp +++ b/include/applicat.cpp @@ -519,6 +519,18 @@ void TApplication::set_perms() } } +void TApplication::open_files(int logicnum, ...) +{ + va_list marker; + va_start(marker, logicnum); + while (logicnum > 0) + { + CHECKD(_used_files.objptr(logicnum) == NULL, "File gia' aperto: ", logicnum); + _used_files.add(new TLocalisamfile(logicnum), logicnum); + logicnum = va_arg(marker, int); + } +} + // @doc EXTERNAL // @mfunc Legge il parametro /uUTENTE e lo toglie dalla lista @@ -578,6 +590,11 @@ void TApplication::run( _name = cmd2name(argv[0]); } + if (use_files()) + init_global_vars(); + else + CGetPref(); + const int sn = get_serial_number(); if (sn < 0) @@ -591,11 +608,6 @@ void TApplication::run( return; } - if (use_files()) - init_global_vars(); - else - CGetPref(); - set_perms(); const TFixed_string mod(get_module_name()); @@ -639,8 +651,8 @@ void TApplication::about() const if (get_version_info(year, release, tag, patch)) { - message_box("Versione %d.%02d\nProgramma %s\nN.ro di serie %u-%02d.%03d", - year, release, (const char*)n.name(), ser_no, tag, patch); + message_box("Versione %d.%02d\nProgramma %s\nN.ro di serie %u-%02d.%03d \nUtente %s", + year, release, (const char*)n.name(), ser_no, tag, patch, (const char*)user()); } else { diff --git a/include/archives.cpp b/include/archives.cpp index a6df027a5..f58647062 100755 --- a/include/archives.cpp +++ b/include/archives.cpp @@ -425,8 +425,8 @@ bool TArchive::backup( // Cancella eventuali gal residui TString_array gals; - list_files("*.gal", gals); list_files("*.000", gals); + list_files("*.gal", gals); for (int g = gals.items()-1; g >= 0; g--) ::remove(gals.row(g)); @@ -451,9 +451,9 @@ bool TArchive::backup( delete _arc; _arc = NULL; remove(work); - xvt_fsys_set_dir(&curdir); - prefix().set(old); + if (pr_set) + prefix().set(old); return ok; } diff --git a/include/cfven.h b/include/cfven.h index ce6d2d1ab..c3f425e02 100755 --- a/include/cfven.h +++ b/include/cfven.h @@ -67,7 +67,7 @@ #define CFV_VSDATAREG "VSDATAREG" #define CFV_NSPROT "NSNPROT" #define CFV_NSDATAREG "NSDATAREG" -#define CFV_SCONTOCL "SCONTOCL" -#define CFV_SCONTOR "SCONTOR" -#define CFV_CODSCINC "CODSCINC" +#define CFV_SCONTOCL "SCONTOCL" +#define CFV_SCONTOR "SCONTOR" +#define CFV_CODSCINC "CODSCINC" #endif diff --git a/include/codeb.c b/include/codeb.c index 997f7e4b1..7c0bdfd9e 100755 --- a/include/codeb.c +++ b/include/codeb.c @@ -1473,7 +1473,7 @@ int DB_tagget(int handle) int DB_first(int handle) { if(!handle_ok(handle)) return(-1); - return(d4top(dbdata[handle])); + return(x4top(&xdb[handle])); } @@ -1484,7 +1484,7 @@ int DB_first(int handle) int DB_last(int handle) { if(!handle_ok(handle)) return(-1); - return(d4bottom(dbdata[handle])); + return(x4bottom(&xdb[handle])); } @@ -1494,7 +1494,7 @@ int DB_last(int handle) int DB_next(int handle) { if(!handle_ok(handle)) return(-1); - return(d4skip(dbdata[handle],1L)); + return(x4skip(&xdb[handle],1L)); } /*------------------------------------------------------------------------- @@ -1503,7 +1503,7 @@ int DB_next(int handle) int DB_prev(int handle) { if(!handle_ok(handle)) return(-1); - return(d4skip(dbdata[handle],-1L)); + return(x4skip(&xdb[handle],-1L)); } @@ -1513,7 +1513,7 @@ int DB_prev(int handle) int DB_skip(int handle,long int recno) { if(!handle_ok(handle)) return(-1); - return(d4skip(dbdata[handle],recno)); + return(x4skip(&xdb[handle],recno)); } /*------------------------------------------------------------------------- @@ -1545,7 +1545,7 @@ int DB_seek(int handle,char *key) char * k; if(!handle_ok(handle)) return(-1); - rc = d4seek(dbdata[handle],key); + rc = x4seek(&xdb[handle],key); if (rc) return rc; tt = d4tag_selected(dbdata[handle]); diff --git a/include/config.cpp b/include/config.cpp index 0ee0ce4a0..00c25f478 100755 --- a/include/config.cpp +++ b/include/config.cpp @@ -114,8 +114,8 @@ void TConfig::_write_file() } bool skip = FALSE, done = FALSE, skip_empty = TRUE; - - if (_file.exist()) + + if (_file.exist()) { ifstream in(_file, ios::in | ios::nocreate, filebuf::sh_read); if (in.good()) @@ -252,7 +252,7 @@ void TConfig::remove_all() //

const TString& TConfig::get( const char* var, // @parm Variabile della quale ritornare il valore - const char* section, // @parm Sezione della varaibile (default NULL) + const char* section, // @parm Sezione della variabile (default NULL) int index, // @parm Eventuale indice della varaibailie (default -1) const char* def) // @parm Valore default della varaibile (default "") @@ -276,9 +276,9 @@ const TString& TConfig::get( else val = (TString*)_data.objptr(var); - if (val == NULL) // Se non la trova inserisci il default - { - if (def && *def) + if (val == NULL) // Se non la trova inserisci il default + { + if (def && *def) { set(var, def, section, TRUE, index); val = &get(var, NULL, index); diff --git a/include/controls.cpp b/include/controls.cpp index e343bf57a..300081eca 100755 --- a/include/controls.cpp +++ b/include/controls.cpp @@ -10,6 +10,21 @@ #include +/* COLOR MASK_BACK_COLOR = COLOR_DKCYAN; +COLOR MASK_LIGHT_COLOR = COLOR_CYAN; +COLOR MASK_DARK_COLOR = COLOR_GRAY; +COLOR BTN_BACK_COLOR = COLOR_LTGRAY; +COLOR BTN_LIGHT_COLOR = COLOR_WHITE; +COLOR BTN_DARK_COLOR = COLOR_GRAY; +COLOR TOOL_BACK_COLOR = COLOR_GRAY; +COLOR NORMAL_COLOR = COLOR_BLACK; +COLOR NORMAL_BACK_COLOR = COLOR_LTGRAY; +COLOR DISABLED_COLOR = COLOR_GRAY; +COLOR DISABLED_BACK_COLOR = MASK_BACK_COLOR; +COLOR FOCUS_COLOR = NORMAL_COLOR; +COLOR FOCUS_BACK_COLOR = COLOR_CYAN; +BOOLEAN CAMPI_SCAVATI = FALSE; +BOOLEAN AUTOSELECT = FALSE; */ COLOR MASK_BACK_COLOR = COLOR_LTGRAY; COLOR MASK_LIGHT_COLOR = COLOR_WHITE; COLOR MASK_DARK_COLOR = COLOR_GRAY; @@ -23,8 +38,8 @@ COLOR DISABLED_COLOR = COLOR_DKGRAY; COLOR DISABLED_BACK_COLOR = MASK_BACK_COLOR; COLOR FOCUS_COLOR = NORMAL_COLOR; COLOR FOCUS_BACK_COLOR = COLOR_YELLOW; -bool CAMPI_SCAVATI = FALSE; -bool AUTOSELECT = FALSE; +BOOLEAN CAMPI_SCAVATI = FALSE; +BOOLEAN AUTOSELECT = FALSE; #ifndef STX_DATA // Very deep hacking @@ -407,31 +422,31 @@ WINDOW create_interface(WINDOW parent, short x, short y, short dx, short dy, if (x <= 0 || y <= 0 || dx <= 0 || dy <= 0) { - RCT max; xvt_vobj_get_client_rect(parent, &max); + RCT max_rct; xvt_vobj_get_client_rect(parent, &max_rct); if (parent == TASK_WIN) - max.bottom -= 26; // Non contare la status bar + max_rct.bottom -= 26; // Non contare la status bar if (dy <= 0) { if (y < -1) { height = -top; - top += max.bottom; + top += max_rct.bottom; y = 22 - height/ROWY; } else - height = max.bottom - top + dy * ROWY; + height = max_rct.bottom - top + dy * ROWY; } if (dx <= 0) { - width = max.right - left + dx * CHARX; + width = max_rct.right - left + dx * CHARX; if (!tag && dx == 0 && y > 0) // Aggiusta toolbar top++; } - if (x < 0) left = (max.right - width) >> 1; - if (y < 0) top = (max.bottom - height) >> 1; + if (x < 0) left = (max_rct.right - width) >> 1; + if (y < 0) top = (max_rct.bottom - height) >> 1; } RCT r; xvt_rect_set(&r, left, top, left+width, top+height); @@ -789,10 +804,10 @@ void TControl::coord2rct(WINDOW win, short x, short y, short dx, short dy, RCT & y++; } - RCT max; xvt_vobj_get_client_rect(win, &max); - xi_pu_to_fu(itf, (XinPoint *) &max, 2); - const int& MAXX = max.right; - const int& MAXY = max.bottom; + RCT max_rct; xvt_vobj_get_client_rect(win, &max_rct); + xi_pu_to_fu(itf, (XinPoint *)&max_rct, 2); + const int& MAXX = max_rct.right; + const int& MAXY = max_rct.bottom; int width = XI_FU_MULTIPLE; if (dx > 0) diff --git a/include/date.cpp b/include/date.cpp index 6ae981070..1968c89d2 100755 --- a/include/date.cpp +++ b/include/date.cpp @@ -182,7 +182,11 @@ void TDate::set_month(int n) CHECK(n > 0 && n < 13, "TDate::set_month: mese impossibile"); _val = makedata(day(), n, year()); } -void TDate::set_year(int n) { _val = makedata(day(), month(), n); } + +void TDate::set_year(int n) +{ + _val = makedata(day(), month(), n); +} TDate::operator const char*() const { @@ -216,7 +220,6 @@ void TDate::print_on(ostream& out) const out << string(); } - void TDate::read_from(istream& in) { char s[256]; @@ -396,6 +399,15 @@ int TDate::week() const return int((*this - y) / 7 + 1); } +TDate& TDate::operator +=(long nday) +{ + const long d = day() + nday; + if (d > 0 && d < 29) + _val += nday; + else + _val = julian2date(date2julian() + nday); + return *this; +} void TDate::addmonth(int nmonth) { @@ -642,13 +654,12 @@ const char* itom( // @comm Se il parametro

e' maggiore di 12 viene calcolato il nome del // mese corrispondente a tale cifra (es. 15 = "Marzo") { - CHECKD(m >= 1 && m <= 12, "Bad month ", m); + CHECK(m>=1, "Il mese indicato deve essere un numero da 1 a 12 "); const char* nomi[12] = { "Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre" }; - return nomi[(m-1) % 12]; } diff --git a/include/date.h b/include/date.h index 08e563bcb..9b1cf67cc 100755 --- a/include/date.h +++ b/include/date.h @@ -118,7 +118,7 @@ public: TDate& operator +=(long nday); // @cmember Decrementa la data di un certo numero di giorni TDate& operator -=(long nday) - { return operator +=(nday); } + { return operator+=(-nday); } // @cmember Incrementa la data di un giorno TDate& operator ++() { return operator +=(1L); } diff --git a/include/default.url b/include/default.url index ba9d784b1..b99897e15 100755 --- a/include/default.url +++ b/include/default.url @@ -1,6 +1,6 @@ #ifndef APPNAME -#define APPNAME PRASSI -#define QAPPNAME "PRASSI" +#define APPNAME EUROCAMP +#define QAPPNAME "EUROCAMP" #endif #ifndef LIBDIR diff --git a/include/defmask.h b/include/defmask.h index 4f7178683..3c1e42c6d 100755 --- a/include/defmask.h +++ b/include/defmask.h @@ -32,6 +32,7 @@ #define DLG_F8 27 /* TAG del bottone */ #define DLG_FAX 28 /* TAG del bottone */ #define DLG_EMAIL 29 /* TAG del bottone */ +#define DLG_PROFILE 30 /* TAG del campo */ #define DLG_USER 100 /* TAG del primo controllo definito dall'utente */ /* @M diff --git a/include/expr.cpp b/include/expr.cpp index 59bc78b7e..37cfa174f 100755 --- a/include/expr.cpp +++ b/include/expr.cpp @@ -635,6 +635,9 @@ void TExpression::eval() case _upper: evalstack.peek_string().upper(); break; + case _trim: + evalstack.peek_string().trim(); + break; case _round: { const int ndec = (int)(evalstack.pop_real()).integer(); @@ -736,20 +739,20 @@ HIDDEN char _tok[81]; TCodesym TExpression::tok2fun(const char* tok) const { - const int MAX_TOK = 27; + const int MAX_TOK = 28; HIDDEN const char* fnstr[MAX_TOK] = { "ANSI", "CEIL", "COS", "EXP", "EXP10", "IF", "LEFT", "LEN", "LOG", "LOG10", "MAX", "MID", "MIN", "NUM", "PERC", "POW", "RIGHT", "ROUND", "SCORP", "SIN", "SQR", "SQRT", "STR", "SUBSTR","TAN", - "TRUNC", "UPPER"}; + "TRIM", "TRUNC", "UPPER"}; HIDDEN TCodesym fntok[MAX_TOK] = { _ansi, _ceil, _cos, _exp, _exp10, _if, _left, _len, _log, _log10, _max, _mid, _min, _num, _perc, _pow, _right, _round, _scorp, _sin, _sqr, _sqrt, _str, _substr, _tan, - _trunc, _upper}; + _trim, _trunc, _upper}; int f = 0, l = MAX_TOK-1, i = MAX_TOK/2; while (TRUE) @@ -1050,6 +1053,7 @@ TCodesym TExpression::__factor(TCodesym startsym) case _tan: case _ansi: case _upper: + case _trim: case _len: sym = __function(1); _code.add(startsym); diff --git a/include/expr.h b/include/expr.h index f6bd73950..596e0a64e 100755 --- a/include/expr.h +++ b/include/expr.h @@ -68,6 +68,7 @@ enum TCodesym { _scorp, // @emem Scorpora una percentuale _substr, // @emem Estrae una sottostringa _len, // @emem Lunghezza di una stringa + _trim // @emem Trimma una stringa } ; // @doc INTERNAL diff --git a/include/files.cpp b/include/files.cpp index bcad0eb42..167e7b068 100755 --- a/include/files.cpp +++ b/include/files.cpp @@ -430,6 +430,8 @@ void TTrec::rehash() for (i = 0; i < MaxFields; i++) _rec->SortFd[i] = INVFLD; if (_rec->NFields) { + if (_rec->NFields> MaxFields) + fatal_box("Troppi campi in questo tracciato") ; for (i = 0; i < _rec->NFields; i++) { nf = i; diff --git a/include/filetext.cpp b/include/filetext.cpp index 0d5058143..3cf1a5450 100755 --- a/include/filetext.cpp +++ b/include/filetext.cpp @@ -1,6 +1,14 @@ #include #include + +// Ritorna TRUE se la stringa e' piena di zero +static bool zero_only(const TString& v) +{ + for (int i = v.len()-1; i>=0 && v[i]=='0'; i--); + return i<0; +} + //////////////////////////////////////// TTracciato_Campo //////////////////////////////////////// TTracciato_campo::TTracciato_campo(int position, int length, int decimal, const char align, const char filler) : _position(position), _length(length), _decimal(decimal), @@ -403,7 +411,7 @@ void TFile_text::set_rec_parm(TConfig& config, const char* section) } TFile_text::TFile_text(const char* file_name, const char* config_name) - : _name(file_name), _skiplines(0) + : _name(file_name), _skiplines(0), _kill_zeroes(FALSE) { _read_file = NULL; _write_file = NULL; @@ -507,14 +515,8 @@ int TFile_text::read(TRecord_text& rec) } else { - TString16 tipo; - - if (_typepos >= 0 && _typelen > 0) - { - tipo = buffer.mid(_typepos, _typelen); - tipo.trim(); - } - + TString16 tipo = buffer.mid(_typepos, _typelen); + tipo.trim(); rec.set_type(tipo);//istanzio il tipo del record text TTracciato_record* tr = t_rec(tipo); if (tr != NULL) @@ -527,11 +529,8 @@ int TFile_text::read(TRecord_text& rec) TTracciato_campo& tc = tr->get(i); const int pos = tc.position(); const int len = tc.length(); - if (pos >= 0 && len > 0) - { - const char* lavoro = buffer.mid(pos, len); - rec.add(lavoro, i); - } + const char* lavoro = buffer.mid(pos, len); + rec.add(lavoro, i); } } } @@ -738,6 +737,8 @@ int TFile_text::_autosave(TRelation& rel, const TRecord_text& rec, TTracciato_re } break; default: + if (_kill_zeroes && zero_only(valore)) + valore = ""; valore = format_field(tc, rel.lfile().num(), valore);//formatta il campo secondo le specifiche del record break; } @@ -753,7 +754,7 @@ int TFile_text::_autosave(TRelation& rel, const TRecord_text& rec, TTracciato_re err = rel.rewrite(); return err; } - + return NOERR; } @@ -795,19 +796,9 @@ void TFile_text::add_field(TRecord_text& rec, const int ncampo, const char* val) void TFile_text::add_field(TRecord_text& rec, const char* name, const char* val) { TTracciato_record& tr = *t_rec(rec.type()); - const int ncampo = tr.get_pos(name); - if (ncampo >= 0) - rec.add(val, ncampo); - else - NFCHECK("Campo inesistente %s", name); -} - -//Carica nel record_text il campo con il valore già formattato -void TFile_text::add_field(TRecord_text& rec, const char* name, long val) -{ - TString16 str; - str.format("%ld", val); - add_field(rec, name, str); + int ncampo = tr.get_pos(name); + CHECKS(ncampo >= 0, "Campo inesistente ", name); + rec.add(val, ncampo); } @@ -934,13 +925,14 @@ TString& TFile_text::format_field(const TTracciato_campo& tc, short lfile, TStri const TRectype record(tc.field().file() ? tc.field().file() : lfile); int length = flength(tc,record); + const bool is_memo = record.type(tc.field().name()); if (!fpicture(tc).blank()) { TString tmp; tmp.picture(fpicture(tc), campo); campo=tmp; } - if (length > campo.len()) + if (length > campo.len() || is_memo) // Se il field di destinazione e' un memo... si scrive tutto! { if (falign(tc) == 'R') campo.right_just(length, ffiller(tc)); diff --git a/include/filetext.h b/include/filetext.h index ebdc179ba..e8affe777 100755 --- a/include/filetext.h +++ b/include/filetext.h @@ -116,9 +116,9 @@ public: //////////////////////////////////////////////////////////////////////////// class TRecord_text : public TObject { - TString16 _type; //tipo del record - TString_array _array; //array che contiene i valori dei campi - + TString16 _type; //tipo del record + TString_array _array; //array che contiene i valori dei campi + public: const TString& type() const {return _type;} void set_type(const TString& type) {_type = type;} @@ -126,13 +126,13 @@ public: TString& row(int pos); const TString& get(int pos) const {return row(pos);}//ritorna il campo dell'array della posizione void add(const TString& c, int pos = -1);//scrive il campo nell'array alla posizione - - const int items() const {return _array.items();}//ritorna il numero di elementi dell'array - virtual bool destroy(int index = -1, bool pack = FALSE) - { return _array.destroy(index, pack); } - TRecord_text() { } - TRecord_text(const TString& type) : _type(type) { } + const int items() const {return _array.items();}//ritorna il numero di elementi dell'array + virtual bool destroy(int index = -1, bool pack = FALSE) + {return _array.destroy(index, pack);} + + TRecord_text() {} + TRecord_text(const TString& type): _type(type) {} virtual ~TRecord_text(){} }; ///////////////////////////////// TFile_text ////////////////////////////////////// @@ -154,6 +154,7 @@ class TFile_text : public TObject TString _recordsep;//separatore di record a lunghezza variabile (blank() se lung.fissa) char _fieldsep; //separatore di campo (se a lunghezza variabile) bool _fixedlen; //indicatore di lunghezza fissa dei campi + bool _kill_zeroes; // Flag per svuotare i campi pieni di zero int _typepos;//posizione ove trovare la chiave nel record a lunghezza fissa int _typelen;//lunghezza della chiave del record a lunghezza fissa int _typefield;//posizione ove trovare la chiave nel record a lunghezza variabile @@ -255,7 +256,9 @@ public: const TString& get_field(const TRecord_text& rec, int ncampo); //scarica dal record_text il campo di nome const TString& get_field(const TRecord_text& rec, const char* name); - + //Svuota i campi pieni di zeri + void kill_zero_only(const bool b = TRUE) { _kill_zeroes = b; } + TFile_text(const char* file_name, const char* config_name); virtual ~TFile_text(); }; diff --git a/include/form.cpp b/include/form.cpp index 6043dd059..b74197f36 100755 --- a/include/form.cpp +++ b/include/form.cpp @@ -1,68 +1,26 @@ +#define __FORM_CPP + #include #include - #include #include +#include +#include #include #include #include #include #include -#include -#include -#include #include +#include -#ifndef __DEFMASK_H -#include -#endif - -#include "/u/guy/p.due/ba/bafrm.h" - -// per lo sheet di edit campi -HIDDEN const int idt_id = 101; -HIDDEN const int dsc_id = 102; -HIDDEN const int prn_id = 103; -HIDDEN const int yps_id = 104; -HIDDEN const int xps_id = 105; -HIDDEN const int len_id = 106; -HIDDEN const int col_id = 107; -HIDDEN const int int_id = 108; -HIDDEN const int spc_id = 109; -HIDDEN const int fnl_id = 110; -HIDDEN const int fnr_id = 111; -HIDDEN const int typ_id = 112; -HIDDEN const int frm_id = 113; +#include "../ba/bafrm.h" /////////////////////////////////////////////////////////// // Utility functions /////////////////////////////////////////////////////////// -// Current form (edit, print) -HIDDEN TForm* _cur_form = NULL; -HIDDEN TPrint_section* _cur_sect = NULL; -HIDDEN TMask* _special_mask = NULL; - -HIDDEN TForm& form() -{ - CHECK(_cur_form, "Can't print NULL form"); - return *_cur_form; -} - -HIDDEN TPrint_section& section() -{ - CHECK(_cur_sect, "Can't print NULL section"); - return *_cur_sect; -} - -HIDDEN TMask& special_mask() -{ - CHECK(_special_mask, "Can't access NULL mask"); - return *_special_mask; -} - - // @doc INTERNAL // @func Funzione che converte dalla notazione carattere al corrispondente @@ -91,154 +49,6 @@ pagetype char2page( return pt; } -/////////////////////////////////////////////////////////// -// Gestione TFieldref su maschera -// ID CAMPO ATTIVO -// xx0 Stringa completa del TFieldref -// xx1 Descrizione file -// xx2 Bottone selezione file X -// xx3 Descrizione campo -// xx4 Bottone selezione campo X -// xx5 Primo carattere campo X -// xx6 Ultimo carattere campo X -/////////////////////////////////////////////////////////// - -HIDDEN void put_fieldref(const TFieldref& fr, TMask_field& f) -{ - TRelation_description& rd = form().rel_desc(); - rd.set_cur_file(fr.file()); - - TString80 desc; desc << fr; - f.set(desc); - - TMask& m = f.mask(); - const short id = f.dlg(); // Campo contenente il TFieldref - - m.set(id+1, rd.file_desc()); - m.set(id+3, rd.get_field_description(fr.name())); - m.set(id+5, (fr.from() > 0 || fr.to() > 0) ? fr.from()+1 : 0); - m.set(id+6, fr.to() > fr.from() ? fr.to() : 0); -} - - -// Handler of F_BUT_FILE field on mask -HIDDEN bool but_file_handler(TMask_field& f, KEY k) -{ - if (k == K_F9) - { - TRelation_description& r = form().rel_desc(); - - TEdit_field& e = f.mask().efield(f.dlg()-1); - TFieldref ref; ref = e.get(); - if (r.choose_file(ref.file())) - { - ref.set_file(r.file_num()); - put_fieldref(ref, e); - } - } - return TRUE; -} - -HIDDEN bool but_file_handler_sub(TMask_field& f, KEY k) -{ - if (k == K_SPACE) - { - TRelation_description& r = form().rel_desc(); - - TEdit_field& e = f.mask().efield(f.dlg()-2); - TFieldref ref; ref = e.get(); - if (r.choose_file(ref.file())) - { - ref.set_file(r.file_num()); - f.mask().set(F_FILE1,r.file_desc()); - } - } - return TRUE; -} - - -// Handler of F_BUT_FIELD field on mask -HIDDEN bool but_field_handler(TMask_field& f, KEY k) -{ - if (k == K_F9) - { - TRelation_description& r = form().rel_desc(); - TEdit_field& e = f.mask().efield(f.dlg()-3); // TBC - TFieldref ref; ref = e.get(); - if (r.choose_field(ref.name())) - { - ref.set_name(r.field_name()); - put_fieldref(ref, e); - } - } - return TRUE; -} - -// Handler of F_FROM field on mask -HIDDEN bool from_handler(TMask_field& f, KEY k) -{ - if (f.to_check(k)) - { - TEdit_field& e = f.mask().efield(f.dlg()-5); - TFieldref ref; ref = e.get(); - ref.set_from(atoi(f.get())); - put_fieldref(ref, e); - } - return TRUE; -} - -// Handler of F_TO field on mask -HIDDEN bool to_handler(TMask_field& f, KEY k) -{ - if (f.to_check(k)) - { - TEdit_field& e = f.mask().efield(f.dlg()-6); - TFieldref ref; ref = e.get(); - ref.set_to(atoi(f.get())); - put_fieldref(ref, e); - } - return TRUE; -} - -HIDDEN bool dateformat_handler(TMask_field& f, KEY k) -{ - if (k == K_SPACE) - { - TMask& m = f.mask(); - - char fmt[8]; - fmt[0] = m.get(F_DFORMAT)[0]; - fmt[1] = m.get(F_DDAY)[0]; - fmt[2] = m.get(F_DMONTH)[0]; - fmt[3] = m.get(F_DYEAR)[0]; - fmt[4] = m.get(F_DSEP)[0]; - fmt[5] = '\0'; - - const TDate d(TODAY); - const TFormatted_date ex(d,fmt); - m.set(F_DEXAMPLE, ex.string()); - } - return TRUE; -} - -HIDDEN bool fmt_handler(TMask_field& f, KEY k) -{ - if (k==K_ENTER || k==K_TAB) - { - TMask& m = f.mask(); - TPrint_section& s = ::section(); - if (s.columnwise()) - { - const int fmt_len = m.get(F_PICTURE).len(); // length of picture - m.set(F_LENFMT,fmt_len); - m.set(F_NUMCOL,s.fields()); - } - else - m.set(F_NUMCOL,999); - } - return TRUE; -} - /////////////////////////////////////////////////////////// // TForm_flags /////////////////////////////////////////////////////////// @@ -298,29 +108,6 @@ void TForm_flags::print_on(ostream& out) const out << " FLAGS \"" << s << '"' << endl; } -// Set mask fields -// Certified 100% -void TForm_flags::print_on(TMask& m) -{ - m.set(F_DISABLED, enabled ? " " : "X"); - m.set(F_HIDDEN, shown ? " " : "X"); - m.set(F_AUTOMAGIC, automagic ? "X" : " "); - m.set(F_FINKL, finkl ? " " : "X"); - m.set(F_FINKR, finkr ? " " : "X"); -} - - -// Get mask fields -// Certified 100% -void TForm_flags::read_from(const TMask& m) -{ - shown = !m.get_bool(F_HIDDEN); - enabled = !m.get_bool(F_DISABLED); - automagic = m.get_bool(F_AUTOMAGIC); - finkl = !m.get_bool(F_FINKL); - finkr = !m.get_bool(F_FINKR); -} - /////////////////////////////////////////////////////////// // TForm_item /////////////////////////////////////////////////////////// @@ -333,7 +120,8 @@ TForm_item::TForm_item(TPrint_section* section) void TForm_item::copy_to_form_item(TForm_item* fi) const { fi->_flag = _flag; fi->_group = _group; - // come copiarlo facendo una cosa orrenda... + + /* come copiarlo facendo una cosa orrenda... fi->_special.destroy(); specials().restart(); int items = special_items(); @@ -342,7 +130,8 @@ void TForm_item::copy_to_form_item(TForm_item* fi) const THash_object* ho = specials().get_hashobj(); fi->_special.add(ho->key(),ho->obj()); } - // fi->_special = _special; sarebbe utile avere un "operator =" per i TAssoc_array + */ + fi->_special = _special; // sarebbe utile avere un "operator =" per i TAssoc_array fi->_temp = _temp; fi->_id = _id; fi->_x = _x; fi->_y = _y; @@ -350,11 +139,13 @@ void TForm_item::copy_to_form_item(TForm_item* fi) const fi->_effective_height = _effective_height; fi->_ofs = _ofs; fi->_prompt = _prompt; fi->_desc = _desc; fi->_col_head = _col_head; - // Anche qui... copia uno alla volta + + /* Anche qui... copia uno alla volta items = _message.items(); for (k = 0; k < items; k++) fi->_message.add(_message.row(k),k); - // fi->_message = _message; sarebbe utile avere un "operator =" per i TString_array + */ + fi->_message = _message; // sarebbe utile avere un "operator =" per i TString_array } TObject* TForm_item::dup() const @@ -850,135 +641,6 @@ void TForm_item::print_on(TToken_string& row) const } } -void TForm_item::print_on_sheet_row(TToken_string& tt) const -{ - TString tmp(80); - tt.add(_id, idt_id - 101); - tt.add(_desc, dsc_id - 101); - tt.add(_x, _section->columnwise() ? col_id - 101 : xps_id - 101); - tt.add(_width, len_id - 101); - if (!_section->columnwise()) - tt.add(_y, yps_id - 101); - tt.add(class_name(), typ_id - 101); - tt.add(shown() ? " " : "X", prn_id - 101); - tmp = example(); tt.add(tmp, frm_id - 101); - - if (_section->columnwise()) - { - tt.add(_ofs, spc_id -101); - tt.add(finkl() ? " " : "X", fnl_id -101); - tt.add(finkr() ? " " : "X", fnr_id -101); - tt.add(_col_head, int_id - 101); - } -} - -void TForm_item::print_on(TMask& m) -{ - m.set(F_CLASS, class_name()); - m.set(F_ID, id()); - m.set(F_KEY, key()); - m.set(F_X, _x); - m.set(F_Y, _y); - m.set(F_PROMPT, _prompt); - m.set(F_WIDTH, _width); - if (_section->columnwise()) - m.set(F_INTEST, _col_head); - m.set(F_HEIGHT, _height); - m.set(F_SPACES, _ofs); - - _flag.print_on(m); - - for (int g = 1; g <= 24; g++) - m.set(F_GROUP+g, _group[g] ? "X" : " "); -} - -void TForm_item::read_from(const TMask& m) -{ - _desc = m.get(F_KEY); - _x = atoi(m.get(F_X)); - _y = atoi(m.get(F_Y)); - _prompt = m.get(F_PROMPT); - _width = atoi(m.get(F_WIDTH)); - if (_section->columnwise()) - _col_head = m.get(F_INTEST); - _height = atoi(m.get(F_HEIGHT)); - _id = atoi(m.get(F_ID)); - _ofs = atoi(m.get(F_SPACES)); - - _flag.read_from(m); - - _group.reset(); - for (int g = 1; g <= 24; g++) - _group.set(g, m.get_bool(F_GROUP+g)); -} - -void TForm_item::read_from(TToken_string& s) -{ - _id = s.get_int(idt_id - 101); - _desc = s.get(dsc_id - 101); - _x = _section->columnwise() ? s.get_int(col_id - 101) : s.get_int(xps_id - 101); - _width = s.get_int(len_id - 101); - if (!_section->columnwise()) - _y = s.get_int(yps_id - 101); - _flag.set_shown(s.get(prn_id - 101)[0] != 'X'); - - if (_section->columnwise()) - { - _ofs = s.get_int(spc_id - 101); - _flag.set_finkl(s.get(fnl_id - 101)[0] != 'X'); - _flag.set_finkr(s.get(fnr_id - 101)[0] != 'X'); - _col_head = s.get(int_id - 101); - } - set_dirty(); -} - -bool TForm_item::edit(TMask& m) -{ - m.enable(F_CLASS, m.insert_mode()); - m.reset(); - - if (m.insert_mode()) - { - short id = 0; - for (word i = 0; i < section().fields(); i++) - { - const TForm_item& f = section().field(i); - if (f.id() > id) id = f.id(); - } - _id = id+1; - } - - print_on(m); - - const bool godmode = form().edit_level() > 1; - m.enable_page(1, godmode); - m.enable(-7, godmode); - m.enable(F_ID, godmode); - m.enable(F_KEY,godmode); - m.enable(F_Y,!_section->columnwise()); - m.enable(F_INTEST,_section->columnwise()); - if (_flag.memo) - { - m.disable(F_PROMPT); - m.hide(F_PROMPT); - m.enable(F_MEMO); - m.show(F_MEMO); - m.enable(F_HEIGHT); - m.show(F_HEIGHT); - } - else - { - m.hide(F_MEMO); - m.disable(F_MEMO); - } - const bool dirty = m.run() == K_ENTER; - if (dirty) - { - read_from(m); - set_dirty(); - } - return dirty; -} const TString& TForm_item::picture() const { @@ -1426,13 +1088,6 @@ TObject* TForm_string::dup() const return fs; } -bool TForm_string::edit(TMask& m) -{ - const bool godmode = form().edit_level() > 1; - m.enable(F_PROMPT, godmode ? TRUE : (_field.items()==0)); - return TForm_item::edit(m); -} - bool TForm_string::parse_item(TScanner& scanner) { if (scanner.key() == "FI") // FIELD reference @@ -1451,106 +1106,6 @@ bool TForm_string::parse_item(TScanner& scanner) return TForm_item::parse_item(scanner); } -void TForm_string::print_body(ostream& out) const -{ - TForm_item::print_body(out); - if (_picture.not_empty()) - out << " PICTURE \"" << _picture << "\"" << endl; - for (int i = 0; i < _field.items(); i++) - out << " FIELD " << field(i) << endl; -} - -bool TForm_string::read_from(const TRectype& prof) -{ - bool changed = TForm_item::read_from(prof); - - const TString& pict = prof.get("PICT"); - if (_picture != pict) - { - _picture = pict; - changed = TRUE; - } - - if (has_memo()) - { - const TString& m = prof.get("TESTO"); - if (_memo != m) - { - _memo = m; - changed = TRUE; - } - } - - return changed; -} - -void TForm_string::print_on(TToken_string& row) -{ - TForm_item::print_on(row); - if (_field.items() && form().edit_level() > 1) - row << '|' << field(0); -} - -void TForm_string::print_on(TRectype& prof) -{ - TForm_item::print_on(prof); - prof.put("PICT", _picture); - if (has_memo()) - { - prof.put("TESTO", _memo); - } -} - -void TForm_string::print_on(TMask& m) -{ - TForm_item::print_on(m); - for (int i = 0; i < _field.items(); i++) - put_fieldref(field(i), m.field(i == 0 ? F_FIELDREF1 : F_FIELDREF2)); - - m.set(F_PICTURE, _picture); - m.set(F_MEMO, _memo); - - TSheet_field& s = (TSheet_field&)m.field(F_ITEMS); - s.reset(); - if (_message.items() > 0) - { - TToken_string& row = s.row(0); - row = " | "; - row.add(message(0)); - } -} - -void TForm_string::read_from(const TMask& m) -{ - TForm_item::read_from(m); - _picture = m.get(F_PICTURE); - _memo = m.get(F_MEMO); - - for (int i = 0; i < 2; i++) - { - const TString& f = m.get(i == 0 ? F_FIELDREF1 : F_FIELDREF2); - if (f.not_empty()) - { - TFieldref* fr = (TFieldref*)_field.objptr(i); - if (fr == NULL) - { - fr = new TFieldref(f, 0); - _field.add(fr, i); - } - *fr = f; - } - else - _field.destroy(i); - } - - TSheet_field& f = (TSheet_field&)m.field(F_ITEMS); - TToken_string& msg = f.row(0); - if (msg.empty_items()) - _message.destroy(0); - else - _message.add(msg.get(2), 0); -} - bool TForm_string::set(const char* s) { _str = s; @@ -1810,7 +1365,7 @@ bool TForm_number::update() if (print) { - TString s(get()); + TString80 s(get()); const bool mc = form().magic_currency(); if (mc) { @@ -1925,6 +1480,9 @@ public: TForm_currency(TPrint_section* section); virtual ~TForm_currency() {} }; +/////////////////////////////////////////////////////////// +// TForm_currency +/////////////////////////////////////////////////////////// bool TForm_currency::parse_head(TScanner& scanner) { @@ -2135,8 +1693,6 @@ void TForm_date::read_from(const TMask& m) _format[5] = '\0'; } - - bool TForm_date::edit(TMask& m) { return TForm_string::edit(m); @@ -2323,12 +1879,14 @@ class TGraphic_section : public TPrint_section TString _back; protected: - TForm_item* parse_item(const TString& s); - bool update(); + // @cmember Crea un campo della classe specificata + virtual TForm_item* create_item(const TString& s); + + virtual bool update(); public: void append(const char* s) { _back << s; } - + TGraphic_section(TForm* f, pagetype pt) : TPrint_section(f, 'G', pt) {} virtual ~TGraphic_section() {} }; @@ -2418,18 +1976,16 @@ bool TForm_box::update() return TRUE; } - -TForm_item* TGraphic_section::parse_item(const TString& s) +TForm_item* TGraphic_section::create_item(const TString& typ) { - if (s == "FI") - return new TForm_picture(this); - else if (s == "LI") - return new TForm_line(this); - else if (s == "BO") - return new TForm_box(this); - - error_box("Campo di stampa non ammesso per lo sfondo: %s", (const char*)s); - return NULL; + TForm_item* fff = NULL; + if (typ.compare("LINEA", 2, TRUE) == 0) + fff = new TForm_line(this); else + if (typ.compare("BOX", 2, TRUE) == 0) + fff = new TForm_box(this); else + if (typ.compare("FIGURA", 2, TRUE) == 0) + fff = new TForm_picture(this); + return fff; } bool TGraphic_section::update() @@ -2453,47 +2009,6 @@ bool TGraphic_section::update() // TPrint_section /////////////////////////////////////////////////////////// -HIDDEN bool font_handler(TMask_field& f, KEY key) -{ - if (key == K_SPACE) - { - main_app().begin_wait(); - - const char* family = f.get(); - const int MAXSIZES = 16; - long sizes[MAXSIZES]; - BOOLEAN scalable; - const int num_sizes = (int)xvt_fmap_get_family_sizes(printer().get_printrcd(), - (char*)family, sizes, &scalable, MAXSIZES); - - TToken_string pn1(80), pn2(80); - if (scalable) - { - for (int i = 4; i <= 32; i++) - { - pn1.add(i); - pn2.add(i); - } - } - else - { - if (num_sizes > 0) - { - for (int i = 0; i < num_sizes; i++) - pn1.add(sizes[i]); - } - else pn1.add(printer().get_char_size()); - pn2 = pn1; - } - TList_field& lst = (TList_field&)f.mask().field(F_SIZE); - lst.replace_items(pn1, pn2); - lst.set(format("%d",printer().get_char_size())); - - main_app().end_wait(); - } - return TRUE; -} - TMask* TPrint_section::_msk = NULL; @@ -2563,6 +2078,26 @@ TPrint_section::~TPrint_section() } } +TForm_item* TPrint_section::create_item(const TString& s) +{ + TForm_item* f = NULL; + if (s.compare("STRINGA", 2, TRUE) == 0) + f = new TForm_string(this); else + if (s.compare("NUMERO", 2, TRUE) == 0) + f = new TForm_number(this); else + if (s.compare("VALUTA", 2, TRUE) == 0) + f = new TForm_currency(this); else + if (s.compare("DATA", 2, TRUE) == 0) + f = new TForm_date(this); else + if (s.compare("LISTA", 2, TRUE) == 0) + f = new TForm_list(this); else + if (s.compare("GRUPPO", 2, TRUE) == 0) + f = new TForm_group(this); else + if (s.compare("SECTION", 2, TRUE) == 0) + f = new TForm_subsection(this); + return f; +} + void TPrint_section::change_field(int n, TForm_item* f) { _item.add(f,n); @@ -2726,24 +2261,10 @@ void TPrint_section::offset(int& x, int& y) TForm_item* TPrint_section::parse_item(const TString& s) -{ - if (s == "ST") - return new TForm_string(this); - if (s == "NU") - return new TForm_number(this); - if (s == "VA") - return new TForm_currency(this); - if (s == "DA") - return new TForm_date(this); - if (s == "LI") - return new TForm_list(this); - if (s == "GR") - return new TForm_group(this); - if (s == "SE") - return new TForm_subsection(this); - - yesnofatal_box("Campo di stampa non ammesso per la sezione di stampa: %s", (const char*)s); - return NULL; +{ + TForm_item* f = create_item(s); + CHECKS(f, "Campo non ammesso per la sezione di stampa:", (const char*)s); + return f; } @@ -2825,702 +2346,6 @@ bool TPrint_section::update() return ok; } -// @doc EXTERNAL - -// @mfunc Legge dal record

altezza e offset prima colonna della sezione -// -// @rdesc Ritorna se i valori letti hanno modificato quelli attuali -bool TPrint_section::read_from( - const TRectype& prof) // @parm Record dal quela leggere i valori - -// @comm Nel caso il record non sia LF_RFORM viene dato un messaggio di . -{ - CHECK(prof.num() == LF_RFORM, "Il record deve essere del file LF_RFORM"); - - bool changed = FALSE; - const word h = (word)prof.get_int("HGT"); - const word l = (word)prof.get_int("LEN"); - const word y = (word)prof.get_int("Y"); - if (_height != h) - { - _height = h; - changed = TRUE; - } - if (_ofspc != l) - { - _ofspc = l; - changed = TRUE; - } - if (_ofsvr != y) - { - _ofsvr = y; - changed = TRUE; - } - return changed; -} - -void TPrint_section::print_on(TRectype& prof) -{ - CHECK(prof.num() == LF_RFORM, "Il record deve essere del file LF_RFORM"); - prof.put("ID", 0); - prof.put("X", 0); - prof.put("Y", _ofsvr); - prof.put("LEN", _ofspc); - prof.put("HGT", _height); -} - -typedef struct { - char name_1[80]; // Fontname old - char name_2[80]; // Fontname new - int size_1; // size (height) of old font - int size_2; // size (height) of new font - real ratio; // ratio (width_old_font/width_new_font) -} s_data; - -BOOLEAN XVT_CALLCONV1 wpr (long data) -{ - s_data* st =(s_data*)data; - WINDOW prwin = xvt_print_create_win(printer().get_printrcd(),""); - long width_old,width_new; - TString spc(100); - spc.fill('m'); - xvt_set_font(prwin,st->name_1, XVT_FS_NONE, st->size_1); - width_old = xvt_dwin_get_text_width(prwin,(char*)(const char*)spc, 100); - xvt_set_font(prwin,st->name_2, XVT_FS_NONE, st->size_2); - width_new = xvt_dwin_get_text_width(prwin,(char*)(const char*)spc, 100); - st->ratio = (double)width_old / (double)width_new; - xvt_vobj_destroy(prwin); - - return FALSE; -} - -bool TPrint_section::special_field_handler(TMask_field& f, KEY k) -{ - if (k == K_SPACE && _special_mask != NULL) - _special_mask->run(); - return TRUE; -} - -bool TPrint_section::repos_fields(const char* name, int size) -{ - TPrint_section& ps = ::section(); - bool rt = FALSE; - if (ps.form().fontname() != name || - ps.form().fontsize() != size) - { - if (!ps.form().dirty()) ps.form().set_dirty(); - ps.set_dirty(); - if (yesno_box("E' stato cambiato il font o la dimensione del carattere.\nSi desidera aggiornare le coordinate dei campi?")) - { - rt = TRUE; - s_data prm; - prm.size_1=ps.form().fontsize(); - strcpy(prm.name_1,ps.form().fontname()); - prm.size_2=size; - strcpy(prm.name_2,name); - prm.ratio = 1.0; - // Next 3 lines may be changed - xvt_print_open(); - xvt_print_start_thread (wpr, (long)&prm); - xvt_print_close(); - - if (ps.form().edit_level() > 1) - { - TMask rm("Rapporto tra i caratteri", 1, 30, 4); - rm.add_number(DLG_USER, 0, "Rapporto ", 1, 1, 8, "", 4); - rm.add_button(DLG_OK, 0, "Conferma", -12, -1, 10, 2); - rm.add_button(DLG_CANCEL, 0, "Annulla", -22, -1, 10, 2); - real ratio = prm.ratio; - rm.set(DLG_USER, ratio); - if (rm.run() == K_ENTER) - { - ratio = rm.get_real(DLG_USER); - prm.ratio = ratio; - } - } - - const char sechar[4] = { 'B', 'F', 'G', 'H' }; - for (int sn = 0; sn < 4 ; sn++) - { - const char sc = sechar[sn]; - for (pagetype pt = odd_page; pt <= last_page; pt = pagetype(pt+1)) - { - TPrint_section* sec = ps.form().exist(sc, pt); - if (sec != NULL && !sec->columnwise()) - { - sec->set_dirty(); - for (word i = 0; i < sec->fields() ; i++) - { - TForm_item& fi = sec->field(i); - short value = fi.x(); - if (value > 0 && (prm.ratio != 1.0)) - { - real x_pos; - x_pos = value * prm.ratio; - x_pos.round(); - fi.set_x((short)x_pos.integer()); - fi.set_dirty(); - } - } - } - } - } - } - ps.form().fontname() = name; - ps.form().fontsize() = size; - // Aggiorna lo spreadsheet - TSheet_field& ms = (TSheet_field&)ps._msk->field(F_FIELDS); - TToken_string tt(128); - const word flds = ps.fields(); - for (word i = 0; i < flds; i++) - { - TForm_item& f = ps.field(i); - ps.field(i).print_on_sheet_row(tt); - ms.row(i) = tt; - } - } - return rt; -} - -// handlers for section editing -bool TPrint_section::detail_field_handler(TMask_field& f, KEY k) -{ - if (k == K_SPACE) - { - - if (_cur_form && TString(_cur_form->section_mask()).left(2) == "ba") - { - TString80 name(_msk->get(F_FONT)); - int size = _msk->get_int(F_SIZE); - repos_fields(name, size); - } - - bool consider_sheet_mask = FALSE; - if (f.mask().is_running()) // Se la maschera di editing dello sheet e' running - consider_sheet_mask = TRUE; // allora deve tener conto anche di essa per l'I/O - - // to avoid kasinations with recursion - TPrint_section& section = ::section(); - TSheet_field& ms = *f.mask().get_sheet(); - int field = ms.selected(); - TToken_string& tt = ms.row(field); - TToken_string tt_mask(tt); - if (consider_sheet_mask) - { - TMask& msheet = f.mask(); - tt_mask.add(msheet.get(idt_id), idt_id - 101); - tt_mask.add(msheet.get(dsc_id), dsc_id - 101); - tt_mask.add(msheet.get(len_id), len_id - 101); - tt_mask.add(msheet.get(prn_id), prn_id - 101); - - if (section.columnwise()) - { - tt_mask.add(msheet.get(col_id), col_id - 101); - tt_mask.add(msheet.get(spc_id), spc_id -101); - tt_mask.add(msheet.get(int_id), int_id - 101); - tt_mask.add(msheet.get(fnl_id), fnl_id -101); - tt_mask.add(msheet.get(fnr_id), fnr_id -101); - } - else - { - tt_mask.add(msheet.get(xps_id), xps_id - 101); - tt_mask.add(msheet.get(yps_id), yps_id - 101); - } - } - - TMask msk("ba2100f"); - - msk.set_handler(F_DFORMAT, dateformat_handler); - msk.set_handler(F_DYEAR, dateformat_handler); - msk.set_handler(F_DMONTH, dateformat_handler); - msk.set_handler(F_DDAY, dateformat_handler); - msk.set_handler(F_DSEP, dateformat_handler); - - msk.set_handler(F_FILE1, but_file_handler); - msk.set_handler(F_FIELD1, but_field_handler); - msk.set_handler(F_FROM1, from_handler); - msk.set_handler(F_TO1, to_handler); - msk.set_handler(F_FILE2, but_file_handler); - msk.set_handler(F_FIELD2, but_field_handler); - msk.set_handler(F_FROM2, from_handler); - msk.set_handler(F_TO2, to_handler); - msk.set_handler(F_PICTURE,fmt_handler); - // TBI set_mode etc, vedi sotto - - // gna' - TForm_item& fi = section.field(field); - - msk.enable(F_OPTIONS, fi.special_items() > 3); - msk.enable(F_SPACES, section.columnwise()); - msk.enable(F_FINKL, section.columnwise()); - msk.enable(F_FINKR, section.columnwise()); - - // build option mask - if (fi.special_items() > 3) - { - msk.set_handler(F_OPTIONS, special_field_handler); - - CHECK(fi.special_items() < 18, "Quanti special! Non ho nessuna voglia di " - " farti una maschera a piu' pagine. Ripensaci e riprova"); - - _special_mask = new TMask("Variabili personalizzate", 1, 78, fi.special_items() + 3); - _special_mask->add_button(DLG_OK, 0, "", -12, -1, 10, 2); - _special_mask->add_button(DLG_CANCEL, 0, "", -22, -1, 10, 2); - fi.specials().restart(); - - for (int k = 0; k < fi.special_items(); k++) - { - THash_object* ho = fi.specials().get_hashobj(); - TToken_string& tt = (TToken_string&)(ho->obj()); - TString type = tt.get(0); - TString val = tt.get(1); - TToken_string des(tt.get(2),'/'); - TString prompt(des.get(0)); - - if (type == "STRINGA") - { - _special_mask->add_string(101+k, 0, prompt, 1, k+1, des.get_int(1),""); - _special_mask->set(101+k, val); - } - else if (type == "NUMERO") - { - _special_mask->add_number(101+k, 0, prompt, 1, k+1, des.get_int(1),"",des.get_int(2)); - _special_mask->set(101+k, val); - } - else if (type == "LISTA") - { - TToken_string codes(128); - TToken_string value(128); - - for (int jj = 2; jj < des.items(); jj++) - { - CHECK (jj < (des.items() - 1), "AAARGH! 'Sta LISTA special e' fatta male"); - TString t1(des.get(jj++)); - TString t2(des.get(jj)); - codes.add(t1); - value.add(t2); - } - - _special_mask->add_list(101+k, 0, prompt, 1, k+1, des.get_int(1), "", codes, value); - _special_mask->set(101+k, val); - } - else if (type == "BOOLEAN") - { - _special_mask->add_boolean(101+k, 0, prompt, 1, k+1); - _special_mask->set(101+k, val); - } - else if (type == "DATA") - { - _special_mask->add_date(101+k, 0, prompt, 1, k+1); - _special_mask->set(101+k, val); - } - } - } - if (consider_sheet_mask) - fi.read_from(tt_mask); - else - fi.read_from(tt); - fi.edit(msk); - - // check specials - if (_special_mask != NULL) - { - if (_special_mask->last_key() == K_ENTER) - { - fi.specials().restart(); - - for (int k = 0; k < fi.special_items(); k++) - { - THash_object* ho = fi.specials().get_hashobj(); - TToken_string& tt = (TToken_string&)(ho->obj()); - TString val = tt.get(1); - TString nvl = _special_mask->get(k + 101); - if (nvl != val) - { - tt.add(nvl, 1); - if (tt.items() == 3) tt.add("X"); - fi.set_dirty(); - } - } - } - - if (_special_mask != NULL) - { - delete _special_mask; - _special_mask = NULL; - } - } - - if (!consider_sheet_mask) - fi.print_on_sheet_row(tt); - else - { - TMask& msheet = f.mask(); - fi.print_on_sheet_row(tt_mask); - msheet.set(idt_id, tt_mask.get_int(idt_id - 101)); - msheet.set(dsc_id, tt_mask.get(dsc_id - 101)); - msheet.set(len_id, tt_mask.get_int(len_id - 101)); - msheet.set(prn_id, tt_mask.get(prn_id - 101)); - msheet.set(frm_id, fi.example()); - - if (section.columnwise()) - { - msheet.set(spc_id, tt_mask.get_int(spc_id - 101)); - msheet.set(col_id, tt_mask.get_int(col_id - 101)); - msheet.set(int_id, tt_mask.get(int_id - 101)); - msheet.set(fnl_id, tt_mask.get(fnl_id - 101)); - msheet.set(fnr_id, tt_mask.get(fnr_id - 101)); - } - else - { - msheet.set(xps_id, tt_mask.get_int(xps_id - 101)); - msheet.set(yps_id, tt_mask.get_int(yps_id - 101)); - } - } - - ms.force_update(); - - _cur_sect = §ion; - } - return TRUE; -} - -bool TPrint_section::detail_field_notify (TSheet_field& s, int r, KEY k) -{ - TPrint_section& sec = ::section(); - if (k == K_DEL || k == K_INS) - { - if (::form().edit_level() <= 1) - return FALSE; - if (k == K_DEL) - { - // elimina campo - sec.destroy_field(r); - sec.set_dirty(); - } - } - else if (k == (K_INS + K_CTRL)) - { - // new field: set defaults and create field - TForm_string* f = new TForm_string(&sec); - sec.insert_field(r, f); - TToken_string& tt = s.row(r); - f->print_on_sheet_row(tt); - tt.add("Nuovo campo", sec.columnwise() ? int_id : dsc_id); - if (sec.columnwise()) tt.add(r+1, col_id - 101); - s.force_update(); - sec.set_dirty(); - } - else if (k == K_ENTER) - { - // modify field - TForm_item* fld = &sec.field(r); - TToken_string& tt = s.row(r); - - if (sec.columnwise() && ((word)tt.get_int(col_id - 101) <= 0 || - (word)tt.get_int(col_id - 101) > sec.fields())) - { - warning_box("Numero di colonna non accettabile (deve essere da 1 a %u)", sec.fields()); - return FALSE; - } - // ??? type changed ??? - if (strcmp(tt.get(typ_id - 101), fld->class_name()) != 0) - { - // so'ccazzi: crea nuovo campo del tipo dato e - // copia gli special (e il resto) - TString typ(tt.get(typ_id - 101)); - TForm_item* fff = NULL; - if (typ == "NUMERO") - fff = new TForm_number(&sec); - else if (typ == "STRINGA") - fff = new TForm_string(&sec); - else if (typ == "DATA") - fff = new TForm_date(&sec); - else if (typ == "LISTA") - fff = new TForm_list(&sec); - else if (typ == "GRUPPO") - fff = new TForm_group(&sec); - else if (typ == "LINEA") - fff = new TForm_line((TGraphic_section*)&sec); - else if (typ == "BOX") - fff = new TForm_box((TGraphic_section*)&sec); - else if (typ == "FIGURA") - fff = new TForm_picture((TGraphic_section*)&sec); - - // copia SPECIALS - TAssoc_array& aa = fld->specials(); - TAssoc_array& bb = fff->specials(); - THash_object* oo = NULL; - aa.restart(); - - for (int i = 0; i < aa.items(); i++) - { - oo = aa.get_hashobj(); - bb.add(oo->key(), oo->obj()); - } - sec.change_field(r, fld = fff); - fld->set_dirty(); - } - // modifica valori - fld->read_from(tt); - } - else - if (k == K_SPACE) - { - if (_cur_form && TString(_cur_form->section_mask()).left(2) == "ba") - { - TString80 name(s.mask().get(F_FONT)); - int size = s.mask().get_int(F_SIZE); - if (repos_fields(name,size)) - s.force_update(); - } - } - - return TRUE; -} - -// @doc EXTERNAL - -// @mfunc Esegue l'edit della sezione di stampa -// -// @rdesc Ritorna TRUE se e' stata modificata effettivamente -bool TPrint_section::edit( - const char* title) // @parm Titolo della maschera di edit -{ - const bool is_ba_editor = TString(_form->section_mask()).left(2) == "ba"; - bool nstd_dirty = FALSE; - bool font_found = FALSE; - - _cur_form = _form; - _cur_sect = this; - - if (!_upsection) - { - TMask m(_form->section_mask()); - _msk = &m; - m.set_caption(title); - m.set(F_HEIGHT, _height); - m.set(F_OFSPC, _ofspc); - m.set(F_OFSVR, _ofsvr); - if (is_ba_editor) - { - m.set(F_X, form().offset_x()); - m.set(F_Y, form().offset_y()); - m.set(F_CTP, format("%c",form().char_to_pos())); - m.set(F_IPX, form().ipx()); - m.set(F_IPY, form().ipy()); - m.set(F_FPX, form().fpx()); - m.set(F_FLEN, printer().formlen()); - } - else - _form->pre_edit_checks(m,_cur_sect); - TSheet_field& ms = (TSheet_field&)m.field(F_FIELDS); - - m.hide(F_OFSVR);//Offset verticale, per _columnwise. Non ancora usato. - if (_columnwise) - { - m.disable(F_HEIGHT); - ms.delete_column(xps_id); ms.sheet_mask().hide(xps_id); - ms.delete_column(yps_id); ms.sheet_mask().hide(yps_id); - } - else - { - m.hide(F_OFSPC); - ms.delete_column(int_id); ms.sheet_mask().hide(int_id); - ms.delete_column(col_id); ms.sheet_mask().hide(col_id); - ms.delete_column(spc_id); ms.sheet_mask().hide(spc_id); - ms.delete_column(fnl_id); ms.sheet_mask().hide(fnl_id); - ms.delete_column(fnr_id); ms.sheet_mask().hide(fnr_id); - } - - ms.enable_column(frm_id - 101, FALSE); - - if (form().edit_level() <= 1) - { - ms.enable_column(idt_id - 101, FALSE); - ms.enable_column(typ_id - 101, FALSE); - } - - // handlers - ms.set_notify(detail_field_notify); - ms.sheet_mask().set_handler(100, detail_field_handler); - if (_form->edit_level()<=1) ms.sheet_mask().disable(DLG_DELREC); - - TToken_string tt(128); - const word flds = fields(); - - // fill sheet - for (word i = 0; i < flds; i++) - { - TForm_item& f = field(i); - field(i).print_on_sheet_row(tt); - // TBI colorare se specials (e vedi se colorare solo se non standard) - ms.row(-1) = tt; - } - - if (is_ba_editor) - { - const int MAX_FAMILIES = 128; - char* family[MAX_FAMILIES]; - const int num_families = (int)xvt_fmap_get_families(printer().get_printrcd(), family, MAX_FAMILIES); - TToken_string pn1(256), pn2(256); - - for (int i = 0; i < num_families; i++) - { - pn1.add(family[i]); - pn2.add(family[i]); - if (!font_found) - if (form().fontname() == family[i]) font_found = TRUE; - xvt_mem_free(family[i]); - } - TList_field& lst = (TList_field&)m.field(F_FONT); - if (!font_found) - { - warning_box("Il font %s non esiste per la stampante di default.",(const char*) form().fontname()); - pn1.add(form().fontname()); - pn2.add(form().fontname()); - } - lst.replace_items(pn1, pn2); - lst.set(form().fontname()); - printer().set_char_size(form().fontsize()); - m.set_handler(F_FONT,font_handler); - } - - if(_columnwise) - { - bool ok = FALSE; - while (m.run() != K_ESC) - { - TSheet_field& ms = (TSheet_field&)m.field(F_FIELDS); - const int items = ms.items(); - for (int i=0; ipost_edit_checks(m,_cur_sect); - } - _msk = NULL; - } - - if (is_ba_editor) - if (form()._isnew || (_dirty && yesno_box("Dati generali modificati. Salvare?"))) - { - TLocalisamfile frm(LF_FORM); - frm.zero(); - frm.put("TIPOPROF",form().name()); - frm.put("CODPROF",form().code()); - if (frm.read(_isequal,_lock) == NOERR) - { - frm.put("OFFY",form().offset_y()); - frm.put("OFFX",form().offset_x()); - frm.put("FONTNAME",form().fontname()); - frm.put("FONTSIZE",form().fontsize()); - frm.put("CTP",form().char_to_pos()); - frm.put("IPX", form().ipx()); - frm.put("IPY", form().ipy()); - frm.put("FPX", form().fpx()); - frm.rewrite(); - _dirty = FALSE; - } - } - - if (!_dirty) - for (word j = 0; j < fields(); j++) - _dirty |= field(j).dirty(); - - set_dirty(_dirty); - return (_dirty || nstd_dirty); -} - -void TPrint_section::print_on(ostream& out) const -{ - out << ' '; - switch (page_type()) - { - case even_page: - out << "EVEN"; break; - case first_page: - out << "FIRST"; break; - case last_page: - out << "LAST"; break; - default: - out << "ODD"; break; - } - out << ' ' << _height; - if (_columnwise) out << " COLUMNWISE"; - out << endl << endl; - for(word i = 0; i < fields(); i++) - if (!field(i).temp()) out << field(i); -} - TForm_item& TPrint_section::find_field(short id) const { TForm_item * f = find_field_everywhere(id,this); @@ -4327,31 +3152,36 @@ word TForm::set_footer( } void TForm::header_handler(TPrinter& p) -{ - if (form().firstpage_is_lastpage()) +{ + TForm& f = *_cur_form; + if (f.firstpage_is_lastpage()) { - form().set_background(1, TRUE); - form().set_header(1, TRUE); - form().set_footer(0, FALSE); + f.set_background(1, TRUE); + f.set_header(1, TRUE); + f.set_footer(0, FALSE); } else { - const word page = form().page(p); - form().set_background(page, TRUE); - form().set_header(page, TRUE); - form().set_footer(page, FALSE); + const word page = f.page(p); + f.set_background(page, TRUE); + f.set_header(page, TRUE); + f.set_footer(page, FALSE); } } void TForm::footer_handler(TPrinter& p) { - if (form().firstpage_is_lastpage()) { - form().set_footer(0, TRUE); - } else { - const word currp = form().page(p); - form().set_footer(currp, TRUE); + TForm& f = *_cur_form; + if (f.firstpage_is_lastpage()) + { + f.set_footer(0, TRUE); + } + else + { + const word currp = f.page(p); + f.set_footer(currp, TRUE); if (currp) - form().set_header(form().next_page(p), FALSE); + f.set_header(f.next_page(p), FALSE); } } @@ -4692,6 +3522,12 @@ void TForm::remove_examples(char sez, pagetype p) } */ +bool TForm::has_subsections() +{ + const TPrint_section& b = section('B', odd_page); + return b.subsections() > 0 ; +} + // @doc EXTERNAL // @mfunc Stampa gli items da

a

@@ -4775,7 +3611,7 @@ bool TForm::print( // controlla i casi di stampa _first_eq_last=FALSE; - if (!fixed_pages() && set_body(1,FALSE) * word(to-from+1) <= pr.formlen()- set_header(1,FALSE) - set_footer(0,FALSE)) + if (!fixed_pages() && !has_subsections() && set_body(1,FALSE) * word(to-from+1) <= pr.formlen()- set_header(1,FALSE) - set_footer(0,FALSE)) // tutta la stampa sta in una pagina _first_eq_last=TRUE; // if (to == lastrec) to--; // l'ultima pagina è gestita come caso particolare @@ -4784,6 +3620,9 @@ bool TForm::print( for (long i = from; i <= to && ok;) { + if (pr.frozen()) + break; + if (from < 0) to = from; else if (cursor()) @@ -4799,7 +3638,7 @@ bool TForm::print( { pr.formfeed(); // quanto resta da stampare sta nell'ultima pagina - if (!fixed_pages() && set_body(0,FALSE) * word(to-i+1) <= pr.formlen()- set_header(1,FALSE) - set_footer(0,FALSE)) + if (!fixed_pages() && !has_subsections() && set_body(0,FALSE) * word(to-i+1) <= pr.formlen()- set_header(1,FALSE) - set_footer(0,FALSE)) { while (i <= to && from >= 0) // stampa l'ultima pagina { @@ -4832,16 +3671,28 @@ bool TForm::print( while (fixed_pages() && page(pr) % _npages !=0) { - static TPrintrow empty_line; pr.formfeed(); +/* + static TPrintrow empty_line; pr.print(empty_line); +*/ + pr.skip(1); // No static when possible } + if (from >= 0) { if (!_lastpage) - { + { + TPrint_section* last_foot = exist('F', last_page, FALSE); + if (last_foot != NULL) + { + const word lfh = last_foot->height(); + const word left = pr.rows_left() + pr.footersize(); + if (lfh > left) // Se l'ultimo footer e' troppo grande ... + pr.formfeed(); // Stampa il footer normale + pr.footerlen(lfh); // Fondamentale! + } set_last_page(TRUE); - set_footer(0,FALSE); } pr.formfeed(); } @@ -5496,6 +4347,7 @@ void TForm::init() set_fink_mode(TRUE); _dirty= FALSE; _msg_add_enabled = TRUE; + _magic_currency = FALSE; } // @doc EXTERNAL @@ -5738,6 +4590,7 @@ TForm::TForm() { init(); _frompage=_topage=0; + _magic_currency = FALSE; } TForm::TForm(const char* name, const char* code, int lev, const char* desc) @@ -5745,6 +4598,7 @@ TForm::TForm(const char* name, const char* code, int lev, const char* desc) init(); read(name, code, lev, desc); _frompage=_topage=0; + _magic_currency = FALSE; } TForm::~TForm() diff --git a/include/form.h b/include/form.h index dba59d998..d3677ba97 100755 --- a/include/form.h +++ b/include/form.h @@ -92,8 +92,6 @@ class TForm : public TObject TString _fontname; // @cmember:(INTERNAL) Dimensione del font da utilizzare int _fontsize; - // @cmember:(INTERNAL) Maschera per la sezione - TString _section_mask; //@cmember:(INTERNAL) Numero esatto di pagine word _npages; //@cmember:(INTERNAL) Offset X valido per tutte le sezioni @@ -303,6 +301,8 @@ public: // @cmember Ritorna se il form è un modulo a pagine fisse bool fixed_pages() const { return _npages>0; } + // @cmember Ritorna se il form contiene sottosezioni + bool has_subsections(); // @cmember Ritorna il nome della mschera per la sezione virtual const char* section_mask() @@ -620,7 +620,9 @@ public: // @cmember Ritorna se si tratta di una sezione temporanea virtual bool temp() const { return _temp; }; - + + // @cmember Crea un campo della classe specificata + virtual TForm_item* create_item(const TString& typ); // @cmember Ritorna il numero di campi da stampare word fields() const { return word(_item.items()); } @@ -1148,6 +1150,12 @@ public: virtual ~TForm_string() {} }; +#ifdef __FORM_CPP +TForm* _cur_form; +#else +extern TForm* _cur_form; +#endif + #endif diff --git a/include/formed.cpp b/include/formed.cpp new file mode 100755 index 000000000..09c426506 --- /dev/null +++ b/include/formed.cpp @@ -0,0 +1,1271 @@ +#include +#include +#include + +#ifndef __DEFMASK_H +#include +#endif + +#include "../ba/bafrm.h" + +// per lo sheet di edit campi +#define idt_id 101 +#define dsc_id 102 +#define prn_id 103 +#define yps_id 104 +#define xps_id 105 +#define len_id 106 +#define col_id 107 +#define int_id 108 +#define spc_id 109 +#define fnl_id 110 +#define fnr_id 111 +#define typ_id 112 +#define frm_id 113 + +// Current section (edit, print) +HIDDEN TPrint_section* _cur_sect = NULL; +HIDDEN TMask* _special_mask = NULL; + +HIDDEN TPrint_section& section() +{ + CHECK(_cur_sect, "Can't print NULL section"); + return *_cur_sect; +} + +HIDDEN TMask& special_mask() +{ + CHECK(_special_mask, "Can't access NULL mask"); + return *_special_mask; +} + +/////////////////////////////////////////////////////////// +// Gestione TFieldref su maschera +// ID CAMPO ATTIVO +// xx0 Stringa completa del TFieldref +// xx1 Descrizione file +// xx2 Bottone selezione file X +// xx3 Descrizione campo +// xx4 Bottone selezione campo X +// xx5 Primo carattere campo X +// xx6 Ultimo carattere campo X +/////////////////////////////////////////////////////////// + +HIDDEN void put_fieldref(const TFieldref& fr, TMask_field& f) +{ + TRelation_description& rd = _cur_form->rel_desc(); + rd.set_cur_file(fr.file()); + + TString80 desc; desc << fr; + f.set(desc); + + TMask& m = f.mask(); + const short id = f.dlg(); // Campo contenente il TFieldref + + m.set(id+1, rd.file_desc()); + m.set(id+3, rd.get_field_description(fr.name())); + m.set(id+5, (fr.from() > 0 || fr.to() > 0) ? fr.from()+1 : 0); + m.set(id+6, fr.to() > fr.from() ? fr.to() : 0); +} + + +// Handler of F_BUT_FILE field on mask +HIDDEN bool but_file_handler(TMask_field& f, KEY k) +{ + if (k == K_F9) + { + TRelation_description& r = _cur_form->rel_desc(); + + TEdit_field& e = f.mask().efield(f.dlg()-1); + TFieldref ref; ref = e.get(); + if (r.choose_file(ref.file())) + { + ref.set_file(r.file_num()); + put_fieldref(ref, e); + } + } + return TRUE; +} + +HIDDEN bool but_file_handler_sub(TMask_field& f, KEY k) +{ + if (k == K_SPACE) + { + TRelation_description& r = _cur_form->rel_desc(); + + TEdit_field& e = f.mask().efield(f.dlg()-2); + TFieldref ref; ref = e.get(); + if (r.choose_file(ref.file())) + { + ref.set_file(r.file_num()); + f.mask().set(F_FILE1,r.file_desc()); + } + } + return TRUE; +} + + +// Handler of F_BUT_FIELD field on mask +HIDDEN bool but_field_handler(TMask_field& f, KEY k) +{ + if (k == K_F9) + { + TRelation_description& r = _cur_form->rel_desc(); + TEdit_field& e = f.mask().efield(f.dlg()-3); // TBC + TFieldref ref; ref = e.get(); + if (r.choose_field(ref.name())) + { + ref.set_name(r.field_name()); + put_fieldref(ref, e); + } + } + return TRUE; +} + +// Handler of F_FROM field on mask +HIDDEN bool from_handler(TMask_field& f, KEY k) +{ + if (f.to_check(k)) + { + TEdit_field& e = f.mask().efield(f.dlg()-5); + TFieldref ref; ref = e.get(); + ref.set_from(atoi(f.get())); + put_fieldref(ref, e); + } + return TRUE; +} + +// Handler of F_TO field on mask +HIDDEN bool to_handler(TMask_field& f, KEY k) +{ + if (f.to_check(k)) + { + TEdit_field& e = f.mask().efield(f.dlg()-6); + TFieldref ref; ref = e.get(); + ref.set_to(atoi(f.get())); + put_fieldref(ref, e); + } + return TRUE; +} + +HIDDEN bool dateformat_handler(TMask_field& f, KEY k) +{ + if (k == K_SPACE) + { + TMask& m = f.mask(); + + char fmt[8]; + fmt[0] = m.get(F_DFORMAT)[0]; + fmt[1] = m.get(F_DDAY)[0]; + fmt[2] = m.get(F_DMONTH)[0]; + fmt[3] = m.get(F_DYEAR)[0]; + fmt[4] = m.get(F_DSEP)[0]; + fmt[5] = '\0'; + + const TDate d(TODAY); + const TFormatted_date ex(d,fmt); + m.set(F_DEXAMPLE, ex.string()); + } + return TRUE; +} + +HIDDEN bool fmt_handler(TMask_field& f, KEY k) +{ + if (k==K_ENTER || k==K_TAB) + { + TMask& m = f.mask(); + TPrint_section& s = ::section(); + if (s.columnwise()) + { + const int fmt_len = m.get(F_PICTURE).len(); // length of picture + m.set(F_LENFMT,fmt_len); + m.set(F_NUMCOL,s.fields()); + } + else + m.set(F_NUMCOL,999); + } + return TRUE; +} + +HIDDEN bool font_handler(TMask_field& f, KEY key) +{ + if (key == K_SPACE) + { + TWait_cursor hourglass; + + const char* family = f.get(); + const int MAXSIZES = 16; + long sizes[MAXSIZES]; + BOOLEAN scalable; + const int num_sizes = (int)xvt_fmap_get_family_sizes(printer().get_printrcd(), + (char*)family, sizes, &scalable, MAXSIZES); + + TToken_string pn1(80), pn2(80); + if (scalable) + { + for (int i = 4; i <= 32; i++) + { + pn1.add(i); + pn2.add(i); + } + } + else + { + if (num_sizes > 0) + { + for (int i = 0; i < num_sizes; i++) + pn1.add(sizes[i]); + } + else pn1.add(printer().get_char_size()); + pn2 = pn1; + } + TList_field& lst = (TList_field&)f.mask().field(F_SIZE); + lst.replace_items(pn1, pn2); + + TString16 str; str.format("%d",printer().get_char_size()); + lst.set(str); + } + return TRUE; +} + + +/////////////////////////////////////////////////////////// +// TForm_flags +/////////////////////////////////////////////////////////// + +// Set mask fields +// Certified 100% +void TForm_flags::print_on(TMask& m) +{ + m.set(F_DISABLED, enabled ? " " : "X"); + m.set(F_HIDDEN, shown ? " " : "X"); + m.set(F_AUTOMAGIC, automagic ? "X" : " "); + m.set(F_FINKL, finkl ? " " : "X"); + m.set(F_FINKR, finkr ? " " : "X"); +} + + +// Get mask fields +// Certified 100% +void TForm_flags::read_from(const TMask& m) +{ + shown = !m.get_bool(F_HIDDEN); + enabled = !m.get_bool(F_DISABLED); + automagic = m.get_bool(F_AUTOMAGIC); + finkl = !m.get_bool(F_FINKL); + finkr = !m.get_bool(F_FINKR); +} + +/////////////////////////////////////////////////////////// +// TForm_item +/////////////////////////////////////////////////////////// + +void TForm_item::print_on_sheet_row(TToken_string& tt) const +{ + TString tmp(80); + tt.add(_id, idt_id - 101); + tt.add(_desc, dsc_id - 101); + tt.add(_x, _section->columnwise() ? col_id - 101 : xps_id - 101); + tt.add(_width, len_id - 101); + if (!_section->columnwise()) + tt.add(_y, yps_id - 101); + tt.add(class_name(), typ_id - 101); + tt.add(shown() ? " " : "X", prn_id - 101); + tmp = example(); tt.add(tmp, frm_id - 101); + + if (_section->columnwise()) + { + tt.add(_ofs, spc_id -101); + tt.add(finkl() ? " " : "X", fnl_id -101); + tt.add(finkr() ? " " : "X", fnr_id -101); + tt.add(_col_head, int_id - 101); + } +} + +void TForm_item::print_on(TMask& m) +{ + m.set(F_CLASS, class_name()); + m.set(F_ID, id()); + m.set(F_KEY, key()); + m.set(F_X, _x); + m.set(F_Y, _y); + m.set(F_PROMPT, _prompt); + m.set(F_WIDTH, _width); + if (_section->columnwise()) + m.set(F_INTEST, _col_head); + m.set(F_HEIGHT, _height); + m.set(F_SPACES, _ofs); + + _flag.print_on(m); + + for (int g = 1; g <= 24; g++) + m.set(F_GROUP+g, _group[g] ? "X" : " "); +} + +void TForm_item::read_from(const TMask& m) +{ + _desc = m.get(F_KEY); + _x = atoi(m.get(F_X)); + _y = atoi(m.get(F_Y)); + _prompt = m.get(F_PROMPT); + _width = atoi(m.get(F_WIDTH)); + if (_section->columnwise()) + _col_head = m.get(F_INTEST); + _height = atoi(m.get(F_HEIGHT)); + _id = atoi(m.get(F_ID)); + _ofs = atoi(m.get(F_SPACES)); + + _flag.read_from(m); + + _group.reset(); + for (int g = 1; g <= 24; g++) + _group.set(g, m.get_bool(F_GROUP+g)); +} + +void TForm_item::read_from(TToken_string& s) +{ + _id = s.get_int(idt_id - 101); + _desc = s.get(dsc_id - 101); + _x = _section->columnwise() ? s.get_int(col_id - 101) : s.get_int(xps_id - 101); + _width = s.get_int(len_id - 101); + if (!_section->columnwise()) + _y = s.get_int(yps_id - 101); + _flag.set_shown(s.get(prn_id - 101)[0] != 'X'); + + if (_section->columnwise()) + { + _ofs = s.get_int(spc_id - 101); + _flag.set_finkl(s.get(fnl_id - 101)[0] != 'X'); + _flag.set_finkr(s.get(fnr_id - 101)[0] != 'X'); + _col_head = s.get(int_id - 101); + } + set_dirty(); +} + +bool TForm_item::edit(TMask& m) +{ + m.enable(F_CLASS, m.insert_mode()); + m.reset(); + + if (m.insert_mode()) + { + short id = 0; + for (word i = 0; i < section().fields(); i++) + { + const TForm_item& f = section().field(i); + if (f.id() > id) id = f.id(); + } + _id = id+1; + } + + print_on(m); + + const bool godmode = form().edit_level() > 1; + m.enable_page(1, godmode); + m.enable(-7, godmode); + m.enable(F_ID, godmode); + m.enable(F_KEY,godmode); + m.enable(F_Y,!_section->columnwise()); + m.enable(F_INTEST,_section->columnwise()); + if (_flag.memo) + { + m.disable(F_PROMPT); + m.hide(F_PROMPT); + m.enable(F_MEMO); + m.show(F_MEMO); + m.enable(F_HEIGHT); + m.show(F_HEIGHT); + } + else + { + m.hide(F_MEMO); + m.disable(F_MEMO); + } + const bool dirty = m.run() == K_ENTER; + if (dirty) + { + read_from(m); + set_dirty(); + } + return dirty; +} + +/////////////////////////////////////////////////////////// +// TForm_string +/////////////////////////////////////////////////////////// + +bool TForm_string::edit(TMask& m) +{ + const bool godmode = form().edit_level() > 1; + m.enable(F_PROMPT, godmode ? TRUE : (_field.items()==0)); + return TForm_item::edit(m); +} + +void TForm_string::print_body(ostream& out) const +{ + TForm_item::print_body(out); + if (_picture.not_empty()) + out << " PICTURE \"" << _picture << "\"" << endl; + for (int i = 0; i < _field.items(); i++) + out << " FIELD " << field(i) << endl; +} + +bool TForm_string::read_from(const TRectype& prof) +{ + bool changed = TForm_item::read_from(prof); + + const TString& pict = prof.get("PICT"); + if (_picture != pict) + { + _picture = pict; + changed = TRUE; + } + + if (has_memo()) + { + const TString& m = prof.get("TESTO"); + if (_memo != m) + { + _memo = m; + changed = TRUE; + } + } + + return changed; +} + +void TForm_string::print_on(TToken_string& row) +{ + TForm_item::print_on(row); + if (_field.items() && form().edit_level() > 1) + row << '|' << field(0); +} + +void TForm_string::print_on(TRectype& prof) +{ + TForm_item::print_on(prof); + prof.put("PICT", _picture); + if (has_memo()) + { + prof.put("TESTO", _memo); + } +} + +void TForm_string::print_on(TMask& m) +{ + TForm_item::print_on(m); + for (int i = 0; i < _field.items(); i++) + put_fieldref(field(i), m.field(i == 0 ? F_FIELDREF1 : F_FIELDREF2)); + + m.set(F_PICTURE, _picture); + m.set(F_MEMO, _memo); + + TSheet_field& s = (TSheet_field&)m.field(F_ITEMS); + s.reset(); + if (_message.items() > 0) + { + TToken_string& row = s.row(0); + row = " | "; + row.add(message(0)); + } +} + +void TForm_string::read_from(const TMask& m) +{ + TForm_item::read_from(m); + _picture = m.get(F_PICTURE); + _memo = m.get(F_MEMO); + + for (int i = 0; i < 2; i++) + { + const TString& f = m.get(i == 0 ? F_FIELDREF1 : F_FIELDREF2); + if (f.not_empty()) + { + TFieldref* fr = (TFieldref*)_field.objptr(i); + if (fr == NULL) + { + fr = new TFieldref(f, 0); + _field.add(fr, i); + } + *fr = f; + } + else + _field.destroy(i); + } + + TSheet_field& f = (TSheet_field&)m.field(F_ITEMS); + TToken_string& msg = f.row(0); + if (msg.empty_items()) + _message.destroy(0); + else + _message.add(msg.get(2), 0); +} + +/////////////////////////////////////////////////////////// +// TForm_subsection +/////////////////////////////////////////////////////////// + +bool TForm_subsection::edit(TMask& m) +{ + // mask con nome e bottone edit contents / annulla + TMask mu("ba2100u"); + mu.set(F_CAPTION, _name); + mu.set(F_WIDTH, _width); + mu.set(F_HEIGHT, _height); + mu.set(F_X, _x); + mu.set(F_Y, _y); + + mu.set_handler(F_BUT_FILE1, but_file_handler_sub); + + if (_file_id != -1) + { + // set file description + form().rel_desc().set_cur_file(_file_id); + TString80 desc; desc << form().rel_desc().file_desc(); + mu.set(F_FILE1, desc); + } + + KEY k; + + // vedere se e' nuova etc. + // gestire aggiunta / modifica menu + + while ((k = mu.run()) != K_ESC) + { + if (mu.field(F_CAPTION).dirty()) + _name = mu.get(F_CAPTION); + + if (mu.field(F_WIDTH).dirty()) + _width = mu.get_int(F_WIDTH); + + if (mu.field(F_HEIGHT).dirty()) + _height = mu.get_int(F_HEIGHT); + + if (mu.field(F_X).dirty()) + _x = mu.get_int(F_X); + + if (mu.field(F_Y).dirty()) + _y = mu.get_int(F_Y); + + if (mu.field(F_FILE1).dirty()) + { + if (mu.get(F_FILE1).empty()) + _file_id = -1; + else + _file_id = form().rel_desc().file_num(); + } + + if (k == K_INS) + _ssec.edit(_name); + else if (k == K_DEL) + { + // remove myself + + } + else if (k == K_ENTER) + break; + } + + return k != K_ESC; +} + + +void TForm_subsection::print_on(ostream& out) const +{ + out << "SEZIONE " << _name << ' ' << _width << ' ' << _height + << ' ' << _x << ' ' << _y; + + if (_file_id != -1) + out << " FILE " << _file_id; + out << "\n"; + + for (word i = 0; i < _ssec.fields(); i++) + out << _ssec.field(i); + out << "\nEND\n"; +} + +/////////////////////////////////////////////////////////// +// TPrint_section +/////////////////////////////////////////////////////////// + +// @doc EXTERNAL + +// @mfunc Legge dal record

altezza e offset prima colonna della sezione +// +// @rdesc Ritorna se i valori letti hanno modificato quelli attuali +bool TPrint_section::read_from( + const TRectype& prof) // @parm Record dal quela leggere i valori + +// @comm Nel caso il record non sia LF_RFORM viene dato un messaggio di . +{ + CHECK(prof.num() == LF_RFORM, "Il record deve essere del file LF_RFORM"); + + bool changed = FALSE; + const word h = (word)prof.get_int("HGT"); + const word l = (word)prof.get_int("LEN"); + const word y = (word)prof.get_int("Y"); + if (_height != h) + { + _height = h; + changed = TRUE; + } + if (_ofspc != l) + { + _ofspc = l; + changed = TRUE; + } + if (_ofsvr != y) + { + _ofsvr = y; + changed = TRUE; + } + return changed; +} + +void TPrint_section::print_on(TRectype& prof) +{ + CHECK(prof.num() == LF_RFORM, "Il record deve essere del file LF_RFORM"); + prof.put("ID", 0); + prof.put("X", 0); + prof.put("Y", _ofsvr); + prof.put("LEN", _ofspc); + prof.put("HGT", _height); +} + +typedef struct +{ + char name_1[80]; // Fontname old + char name_2[80]; // Fontname new + int size_1; // size (height) of old font + int size_2; // size (height) of new font + real ratio; // ratio (width_old_font/width_new_font) +} s_data; + +BOOLEAN XVT_CALLCONV1 wpr (long data) +{ + s_data* st =(s_data*)data; + WINDOW prwin = xvt_print_create_win(printer().get_printrcd(),""); + long width_old,width_new; + TString spc(128, 'm'); + xvt_set_font(prwin,st->name_1, XVT_FS_NONE, st->size_1); + width_old = xvt_dwin_get_text_width(prwin,(char*)(const char*)spc, 128); + xvt_set_font(prwin,st->name_2, XVT_FS_NONE, st->size_2); + width_new = xvt_dwin_get_text_width(prwin,(char*)(const char*)spc, 128); + st->ratio = (double)width_old / (double)width_new; + xvt_vobj_destroy(prwin); + + return FALSE; +} + +bool TPrint_section::special_field_handler(TMask_field& f, KEY k) +{ + if (k == K_SPACE && _special_mask != NULL) + _special_mask->run(); + return TRUE; +} + +bool TPrint_section::repos_fields(const char* name, int size) +{ + TPrint_section& ps = ::section(); + bool rt = FALSE; + if (ps.form().fontname() != name || + ps.form().fontsize() != size) + { + if (!ps.form().dirty()) ps.form().set_dirty(); + ps.set_dirty(); + if (yesno_box("E' stato cambiato il font o la dimensione del carattere.\nSi desidera aggiornare le coordinate dei campi?")) + { + rt = TRUE; + s_data prm; + prm.size_1=ps.form().fontsize(); + strcpy(prm.name_1,ps.form().fontname()); + prm.size_2=size; + strcpy(prm.name_2,name); + prm.ratio = 1.0; + // Next 3 lines may be changed + xvt_print_open(); + xvt_print_start_thread (wpr, (long)&prm); + xvt_print_close(); + + if (ps.form().edit_level() > 1) + { + TMask rm("Rapporto tra i caratteri", 1, 30, 4); + rm.add_number(DLG_USER, 0, "Rapporto ", 1, 1, 8, "", 4); + rm.add_button(DLG_OK, 0, "Conferma", -12, -1, 10, 2); + rm.add_button(DLG_CANCEL, 0, "Annulla", -22, -1, 10, 2); + real ratio = prm.ratio; + rm.set(DLG_USER, ratio); + if (rm.run() == K_ENTER) + { + ratio = rm.get_real(DLG_USER); + prm.ratio = ratio; + } + } + + const char sechar[4] = { 'B', 'F', 'G', 'H' }; + for (int sn = 0; sn < 4 ; sn++) + { + const char sc = sechar[sn]; + for (pagetype pt = odd_page; pt <= last_page; pt = pagetype(pt+1)) + { + TPrint_section* sec = ps.form().exist(sc, pt); + if (sec != NULL && !sec->columnwise()) + { + sec->set_dirty(); + for (word i = 0; i < sec->fields() ; i++) + { + TForm_item& fi = sec->field(i); + short value = fi.x(); + if (value > 0 && (prm.ratio != 1.0)) + { + real x_pos; + x_pos = value * prm.ratio; + x_pos.round(); + fi.set_x((short)x_pos.integer()); + fi.set_dirty(); + } + } + } + } + } + } + ps.form().fontname() = name; + ps.form().fontsize() = size; + // Aggiorna lo spreadsheet + TSheet_field& ms = (TSheet_field&)ps._msk->field(F_FIELDS); + TToken_string tt(128); + const word flds = ps.fields(); + for (word i = 0; i < flds; i++) + { + TForm_item& f = ps.field(i); + ps.field(i).print_on_sheet_row(tt); + ms.row(i) = tt; + } + } + return rt; +} + +// handlers for section editing +bool TPrint_section::detail_field_handler(TMask_field& f, KEY k) +{ + if (k == K_SPACE) + { + const TFixed_string sm(_cur_form->section_mask()); + if (_cur_form && sm.left(2) == "ba") + { + TString name(_msk->get(F_FONT)); + int size = _msk->get_int(F_SIZE); + repos_fields(name, size); + } + + bool consider_sheet_mask = FALSE; + if (f.mask().is_running()) // Se la maschera di editing dello sheet e' running + consider_sheet_mask = TRUE; // allora deve tener conto anche di essa per l'I/O + + // to avoid kasinations with recursion + TPrint_section& section = ::section(); + TSheet_field& ms = *f.mask().get_sheet(); + int field = ms.selected(); + TToken_string& tt = ms.row(field); + TToken_string tt_mask(tt); + if (consider_sheet_mask) + { + TMask& msheet = f.mask(); + tt_mask.add(msheet.get(idt_id), idt_id - 101); + tt_mask.add(msheet.get(dsc_id), dsc_id - 101); + tt_mask.add(msheet.get(len_id), len_id - 101); + tt_mask.add(msheet.get(prn_id), prn_id - 101); + + if (section.columnwise()) + { + tt_mask.add(msheet.get(col_id), col_id - 101); + tt_mask.add(msheet.get(spc_id), spc_id -101); + tt_mask.add(msheet.get(int_id), int_id - 101); + tt_mask.add(msheet.get(fnl_id), fnl_id -101); + tt_mask.add(msheet.get(fnr_id), fnr_id -101); + } + else + { + tt_mask.add(msheet.get(xps_id), xps_id - 101); + tt_mask.add(msheet.get(yps_id), yps_id - 101); + } + } + + TMask msk("ba2100f"); + + msk.set_handler(F_DFORMAT, dateformat_handler); + msk.set_handler(F_DYEAR, dateformat_handler); + msk.set_handler(F_DMONTH, dateformat_handler); + msk.set_handler(F_DDAY, dateformat_handler); + msk.set_handler(F_DSEP, dateformat_handler); + + msk.set_handler(F_FILE1, but_file_handler); + msk.set_handler(F_FIELD1, but_field_handler); + msk.set_handler(F_FROM1, from_handler); + msk.set_handler(F_TO1, to_handler); + msk.set_handler(F_FILE2, but_file_handler); + msk.set_handler(F_FIELD2, but_field_handler); + msk.set_handler(F_FROM2, from_handler); + msk.set_handler(F_TO2, to_handler); + msk.set_handler(F_PICTURE,fmt_handler); + // TBI set_mode etc, vedi sotto + + // gna' + TForm_item& fi = section.field(field); + + msk.enable(F_OPTIONS, fi.special_items() > 3); + msk.enable(F_SPACES, section.columnwise()); + msk.enable(F_FINKL, section.columnwise()); + msk.enable(F_FINKR, section.columnwise()); + + // build option mask + if (fi.special_items() > 3) + { + msk.set_handler(F_OPTIONS, special_field_handler); + + CHECK(fi.special_items() < 18, "Quanti special! Non ho nessuna voglia di " + " farti una maschera a piu' pagine. Ripensaci e riprova"); + + _special_mask = new TMask("Variabili personalizzate", 1, 78, fi.special_items() + 3); + _special_mask->add_button(DLG_OK, 0, "", -12, -1, 10, 2); + _special_mask->add_button(DLG_CANCEL, 0, "", -22, -1, 10, 2); + fi.specials().restart(); + + for (int k = 0; k < fi.special_items(); k++) + { + THash_object* ho = fi.specials().get_hashobj(); + TToken_string& tt = (TToken_string&)(ho->obj()); + TString type = tt.get(0); + TString val = tt.get(1); + TToken_string des(tt.get(2),'/'); + TString prompt(des.get(0)); + + if (type == "STRINGA") + { + _special_mask->add_string(101+k, 0, prompt, 1, k+1, des.get_int(1),""); + _special_mask->set(101+k, val); + } + else if (type == "NUMERO") + { + _special_mask->add_number(101+k, 0, prompt, 1, k+1, des.get_int(1),"",des.get_int(2)); + _special_mask->set(101+k, val); + } + else if (type == "LISTA") + { + TToken_string codes(128); + TToken_string value(128); + + for (int jj = 2; jj < des.items(); jj++) + { + CHECK (jj < (des.items() - 1), "AAARGH! 'Sta LISTA special e' fatta male"); + TString t1(des.get(jj++)); + TString t2(des.get(jj)); + codes.add(t1); + value.add(t2); + } + + _special_mask->add_list(101+k, 0, prompt, 1, k+1, des.get_int(1), "", codes, value); + _special_mask->set(101+k, val); + } + else if (type == "BOOLEAN") + { + _special_mask->add_boolean(101+k, 0, prompt, 1, k+1); + _special_mask->set(101+k, val); + } + else if (type == "DATA") + { + _special_mask->add_date(101+k, 0, prompt, 1, k+1); + _special_mask->set(101+k, val); + } + } + } + if (consider_sheet_mask) + fi.read_from(tt_mask); + else + fi.read_from(tt); + fi.edit(msk); + + // check specials + if (_special_mask != NULL) + { + if (_special_mask->last_key() == K_ENTER) + { + fi.specials().restart(); + + for (int k = 0; k < fi.special_items(); k++) + { + THash_object* ho = fi.specials().get_hashobj(); + TToken_string& tt = (TToken_string&)(ho->obj()); + TString val = tt.get(1); + TString nvl = _special_mask->get(k + 101); + if (nvl != val) + { + tt.add(nvl, 1); + if (tt.items() == 3) tt.add("X"); + fi.set_dirty(); + } + } + } + + if (_special_mask != NULL) + { + delete _special_mask; + _special_mask = NULL; + } + } + + if (!consider_sheet_mask) + fi.print_on_sheet_row(tt); + else + { + TMask& msheet = f.mask(); + fi.print_on_sheet_row(tt_mask); + msheet.set(idt_id, tt_mask.get_int(idt_id - 101)); + msheet.set(dsc_id, tt_mask.get(dsc_id - 101)); + msheet.set(len_id, tt_mask.get_int(len_id - 101)); + msheet.set(prn_id, tt_mask.get(prn_id - 101)); + msheet.set(frm_id, fi.example()); + + if (section.columnwise()) + { + msheet.set(spc_id, tt_mask.get_int(spc_id - 101)); + msheet.set(col_id, tt_mask.get_int(col_id - 101)); + msheet.set(int_id, tt_mask.get(int_id - 101)); + msheet.set(fnl_id, tt_mask.get(fnl_id - 101)); + msheet.set(fnr_id, tt_mask.get(fnr_id - 101)); + } + else + { + msheet.set(xps_id, tt_mask.get_int(xps_id - 101)); + msheet.set(yps_id, tt_mask.get_int(yps_id - 101)); + } + } + + ms.force_update(); + + _cur_sect = §ion; + } + return TRUE; +} + +bool TPrint_section::detail_field_notify (TSheet_field& s, int r, KEY k) +{ + TPrint_section& sec = ::section(); + if (k == K_DEL || k == K_INS) + { + if (sec.form().edit_level() <= 1) + return FALSE; + if (k == K_DEL) + { + // elimina campo + sec.destroy_field(r); + sec.set_dirty(); + } + } + else if (k == (K_INS + K_CTRL)) + { + // new field: set defaults and create field + TForm_string* f = new TForm_string(&sec); + sec.insert_field(r, f); + TToken_string& tt = s.row(r); + f->print_on_sheet_row(tt); + tt.add("Nuovo campo", sec.columnwise() ? int_id : dsc_id); + if (sec.columnwise()) tt.add(r+1, col_id - 101); + s.force_update(); + sec.set_dirty(); + } + else if (k == K_ENTER) + { + // modify field + TForm_item* fld = &sec.field(r); + TToken_string& tt = s.row(r); + + if (sec.columnwise() && ((word)tt.get_int(col_id - 101) <= 0 || + (word)tt.get_int(col_id - 101) > sec.fields())) + { + warning_box("Numero di colonna non accettabile (deve essere da 1 a %u)", sec.fields()); + return FALSE; + } + // ??? type changed ??? + if (strcmp(tt.get(typ_id - 101), fld->class_name()) != 0) + { + // so'ccazzi: crea nuovo campo del tipo dato e + // copia gli special (e il resto) + const TString typ(tt.get(typ_id - 101)); + TForm_item* fff = sec.create_item(typ); + + // copia SPECIALS + TAssoc_array& aa = fld->specials(); + TAssoc_array& bb = fff->specials(); + THash_object* oo = NULL; + aa.restart(); + + for (int i = 0; i < aa.items(); i++) + { + oo = aa.get_hashobj(); + bb.add(oo->key(), oo->obj()); + } + sec.change_field(r, fld = fff); + fld->set_dirty(); + } + // modifica valori + fld->read_from(tt); + } + else + if (k == K_SPACE) + { + if (_cur_form && TString(_cur_form->section_mask()).left(2) == "ba") + { + TString80 name(s.mask().get(F_FONT)); + int size = s.mask().get_int(F_SIZE); + if (repos_fields(name,size)) + s.force_update(); + } + } + + return TRUE; +} + +// @doc EXTERNAL + +// @mfunc Esegue l'edit della sezione di stampa +// +// @rdesc Ritorna TRUE se e' stata modificata effettivamente +bool TPrint_section::edit( + const char* title) // @parm Titolo della maschera di edit +{ + const bool is_ba_editor = TString(_form->section_mask()).left(2) == "ba"; + bool nstd_dirty = FALSE; + bool font_found = FALSE; + + _cur_form = _form; + _cur_sect = this; + + if (!_upsection) + { + TMask m(_form->section_mask()); + _msk = &m; + m.set_caption(title); + m.set(F_HEIGHT, _height); + m.set(F_OFSPC, _ofspc); + m.set(F_OFSVR, _ofsvr); + if (is_ba_editor) + { + m.set(F_X, form().offset_x()); + m.set(F_Y, form().offset_y()); + TString16 str; str << form().char_to_pos(); + m.set(F_CTP, str); + m.set(F_IPX, form().ipx()); + m.set(F_IPY, form().ipy()); + m.set(F_FPX, form().fpx()); + m.set(F_FLEN, printer().formlen()); + } + else + _form->pre_edit_checks(m,_cur_sect); + TSheet_field& ms = (TSheet_field&)m.field(F_FIELDS); + + m.hide(F_OFSVR);//Offset verticale, per _columnwise. Non ancora usato. + if (_columnwise) + { + m.disable(F_HEIGHT); + ms.delete_column(xps_id); ms.sheet_mask().hide(xps_id); + ms.delete_column(yps_id); ms.sheet_mask().hide(yps_id); + } + else + { + m.hide(F_OFSPC); + ms.delete_column(int_id); ms.sheet_mask().hide(int_id); + ms.delete_column(col_id); ms.sheet_mask().hide(col_id); + ms.delete_column(spc_id); ms.sheet_mask().hide(spc_id); + ms.delete_column(fnl_id); ms.sheet_mask().hide(fnl_id); + ms.delete_column(fnr_id); ms.sheet_mask().hide(fnr_id); + } + + ms.enable_column(frm_id - 101, FALSE); + + if (form().edit_level() <= 1) + { + ms.enable_column(idt_id - 101, FALSE); + ms.enable_column(typ_id - 101, FALSE); + } + + // handlers + ms.set_notify(detail_field_notify); + ms.sheet_mask().set_handler(100, detail_field_handler); + if (_form->edit_level()<=1) ms.sheet_mask().disable(DLG_DELREC); + + TToken_string tt(128); + const word flds = fields(); + + // fill sheet + for (word i = 0; i < flds; i++) + { + TForm_item& f = field(i); + field(i).print_on_sheet_row(tt); + // TBI colorare se specials (e vedi se colorare solo se non standard) + ms.row(-1) = tt; + } + + if (is_ba_editor) + { + const int MAX_FAMILIES = 128; + char* family[MAX_FAMILIES]; + const int num_families = (int)xvt_fmap_get_families(printer().get_printrcd(), family, MAX_FAMILIES); + TToken_string pn1(256), pn2(256); + + for (int i = 0; i < num_families; i++) + { + pn1.add(family[i]); + pn2.add(family[i]); + if (!font_found) + if (form().fontname() == family[i]) font_found = TRUE; + xvt_mem_free(family[i]); + } + TList_field& lst = (TList_field&)m.field(F_FONT); + if (!font_found) + { + warning_box("Il font %s non esiste per la stampante di default.",(const char*) form().fontname()); + pn1.add(form().fontname()); + pn2.add(form().fontname()); + } + lst.replace_items(pn1, pn2); + lst.set(form().fontname()); + printer().set_char_size(form().fontsize()); + m.set_handler(F_FONT,font_handler); + } + + if(_columnwise) + { + bool ok = FALSE; + while (m.run() != K_ESC) + { + TSheet_field& ms = (TSheet_field&)m.field(F_FIELDS); + const int items = ms.items(); + for (int i=0; ipost_edit_checks(m,_cur_sect); + } + _msk = NULL; + } + + if (is_ba_editor) + if (form()._isnew || (_dirty && yesno_box("Dati generali modificati. Salvare?"))) + { + TLocalisamfile frm(LF_FORM); + frm.zero(); + frm.put("TIPOPROF",form().name()); + frm.put("CODPROF",form().code()); + if (frm.read(_isequal,_lock) == NOERR) + { + frm.put("OFFY",form().offset_y()); + frm.put("OFFX",form().offset_x()); + frm.put("FONTNAME",form().fontname()); + frm.put("FONTSIZE",form().fontsize()); + frm.put("CTP",form().char_to_pos()); + frm.put("IPX", form().ipx()); + frm.put("IPY", form().ipy()); + frm.put("FPX", form().fpx()); + frm.rewrite(); + _dirty = FALSE; + } + } + + if (!_dirty) + for (word j = 0; j < fields(); j++) + _dirty |= field(j).dirty(); + + set_dirty(_dirty); + return (_dirty || nstd_dirty); +} + +void TPrint_section::print_on(ostream& out) const +{ + out << ' '; + switch (page_type()) + { + case even_page: + out << "EVEN"; break; + case first_page: + out << "FIRST"; break; + case last_page: + out << "LAST"; break; + default: + out << "ODD"; break; + } + out << ' ' << _height; + if (_columnwise) out << " COLUMNWISE"; + out << endl << endl; + for(word i = 0; i < fields(); i++) + if (!field(i).temp()) out << field(i); +} + \ No newline at end of file diff --git a/include/golem.cpp b/include/golem.cpp index 818916caf..967acbfc5 100755 --- a/include/golem.cpp +++ b/include/golem.cpp @@ -765,7 +765,7 @@ bool TMAPI_session::open() return error_box("Impossibile inizializzare MAPI"); FLAGS flags = MAPI_USE_DEFAULT | MAPI_LOGON_UI; - ULONG err = lpfnMAPILogon(_hWnd, "", "", flags, 0L, &_hSession); + ULONG err = lpfnMAPILogon(_hWnd, NULL, NULL, flags, 0L, &_hSession); if (err != SUCCESS_SUCCESS) return error_box("Impossibile collegarsi a MAPI: %lu", err); diff --git a/include/isam.cpp b/include/isam.cpp index e9b5d2dbc..d3c1fe233 100755 --- a/include/isam.cpp +++ b/include/isam.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #ifdef DBG #define JOURNAL @@ -1220,7 +1221,6 @@ bool TBaseisamfile::get_relapp(TString& app) const return app.not_empty(); } - /////////////////////////////////////////////////////////// // TLocalisamfile /////////////////////////////////////////////////////////// @@ -1259,6 +1259,13 @@ TLocalisamfile::TLocalisamfile(int logicnum, bool tmpfile) TLocalisamfile::~TLocalisamfile() { close(); +// dalla 1.5 ??? +// if (_isamfile && openf[num()-1] != NULL) +// { +// if (_was_open) +// setkey(_oldkey); +// close(); +// } } int TLocalisamfile::close() @@ -1432,6 +1439,7 @@ int TIsamtempfile::open( if (err != NOERR) { err = get_error(err); +// dalla 1.5 serve ? relisfd(_isamfile); fatal_box("Can't create temp file '%s' num. %d: Error n. %d", (const char*)filename, num(), err); } } @@ -1760,12 +1768,12 @@ int TSystemisamfile::update( if (toconvert) fname = filename(); - if (toconvert) //&& (dir.eox() > 0L || fname.exist())) + if (toconvert) && (dir.eox() > 0L || fname.exist())) { TRecnotype ni = 0L; TFilename tmpfname; tmpfname.temp("tf"); - err=DB_build(tmpfname, wrec.rec()); + err=DB_build((const char*) tmpfname, wrec.rec()); if (err != NOERR) { @@ -2189,7 +2197,11 @@ int TSystemisamfile::load( s2++; s2[strlen(s2) - 1] = '\0'; } - put((const TString&) fld[j], s2); + if (curr().type((const TString&) fld[j]) == _memofld) + sfld = esc(s2); + else + sfld = s2; + put((const TString&) fld[j], sfld); } } @@ -2268,7 +2280,7 @@ int TSystemisamfile::dump( s.format("Esportazione archivio %s", filename()); TProgind p(nitems, s, TRUE, TRUE, 70); - TString s1; + TString s1, sfld; fprintf(f, "[Header]\nVersion=%ld\nFile=%d", prefix().filelevel(), num()); @@ -2299,7 +2311,17 @@ int TSystemisamfile::dump( s1 = ""; if (j && fs) s1 << fs; if (fd) s1 << fd; - s1 << get((const TString&)fld[j]); + sfld = get((const TString&)fld[j]); + if (curr().type((const TString&) fld[j]) == _memofld) + { + int p = 0; + while ((p = sfld.find('\n', 0)) >= 0) + { + sfld.overwrite("\\", p); + sfld.insert("n", p+1); + } + } + s1 << sfld; if (fd) s1 << fd; } s << s1; @@ -2330,7 +2352,17 @@ int TSystemisamfile::dump( s1 = ""; if (j && fs) s1 << fs; if (fd) s1 << fd; - s1 << get((const TString&)fld[j]); + sfld = get((const TString&)fld[j]); + if (curr().type((const TString&) fld[j]) == _memofld) + { + int p = 0; + while ((p = sfld.find('\n', 0)) >= 0) + { + sfld.overwrite("\\", p); + sfld.insert("n", p+1); + } + } + s1 << sfld; if (fd) s1 << fd; } s << s1; @@ -2357,6 +2389,37 @@ void TBaseisamfile::recover() //////////////////////////////////////////////////////////// // TRectype //////////////////////////////////////////////////////////// +void TRectype::init(int logicnum) +{ + bool has_memo_fld = FALSE; + + _logicnum = logicnum; + + CHECK(_logicnum < EXTERNAL_FILE,"Impossibile costruire un record di un file esterno"); + + if (openf[_logicnum - 1] != NULL) + { + _length = DB_reclen(openf[logicnum - 1]->fhnd); + has_memo_fld = rec_has_memo(rec_des()); + } + else + { + TDir wdir; + wdir.get(_logicnum, _nolock, _nordir, _sysdirop); + if (wdir.is_com()) + wdir.get(_logicnum, _nolock, _comdir, _sysdirop); + _length = wdir.len(); + has_memo_fld = _length > 0 && lf_has_memo(_logicnum); + } + _rec = new char [ _length ]; + *_tab = '\0'; + if (_length) + zero(); + else + setempty(TRUE); + if(has_memo_fld) + init_memo(RECORD_NON_FISICO ); +} TRectype::TRectype(int logicnum) : _memo_data(NULL), _memo_dirty(NULL) @@ -2686,7 +2749,6 @@ int TRectype::get_int(const char* fieldname) const return atoi(get_str(fieldname)); } - long TRectype::get_long(const char* fieldname) const { return atol(get_str(fieldname)); @@ -2831,6 +2893,11 @@ void TRectype::put_str(const char* fieldname, const char* val) if (ft == _boolfld) val = (*val && strchr("1STXY", toupper(*val)) != NULL) ? "T" : "F"; + if (*val == '\0') // VERIFICRE COL REPOSITORY + { + TRecfield f(*this, fieldname); + if (*f.pos() == '\0') return; + } if(ft == _memofld) { _memo_dirty->set(nf); @@ -2851,7 +2918,7 @@ void TRectype::zero(const char* fieldname) else { const RecDes * recd = rec_des(); - int nf = findfld(recd, fieldname); + const int nf = findfld(recd, fieldname); if (nf == FIELDERR) unknown_field(fieldname); else @@ -2913,6 +2980,7 @@ TRectype& TRectype::operator =(const TRectype& rec) CHECK(rec._memo_dirty, "memo_dirty NULL con memo_data valido"); *_memo_dirty= *rec._memo_dirty; } + strcpy(_tab, rec._tab); setempty(rec.empty()); // Copy emptiness status return *this; } diff --git a/include/isam.h b/include/isam.h index 5dc774924..fb91e82eb 100755 --- a/include/isam.h +++ b/include/isam.h @@ -236,6 +236,8 @@ public: bool has_memo() const { return _memo_data != NULL; } void memo_recno (const TRecnotype recno = RECORD_NON_FISICO) { _memo_recno = recno; } + // @cmember Inizializza un record staccato da un file. + void init(int logicnum); // @cmember Costruttore Costruisce un record staccato da un file. // Sarebbe meglio utilizzare una delle altre due TRectype(int logicnum); diff --git a/include/lffiles.h b/include/lffiles.h index f78362bd9..a6ad02120 100755 --- a/include/lffiles.h +++ b/include/lffiles.h @@ -134,6 +134,7 @@ #define LF_COLLDICH 127 #define LF_IDONEITA 128 + #define LF_ATSTATS 129 #define LF_ATOPERA 130 #define LF_ATROPERA 131 diff --git a/include/mask.cpp b/include/mask.cpp index ed93f5803..cf4b1dd4f 100755 --- a/include/mask.cpp +++ b/include/mask.cpp @@ -61,7 +61,7 @@ void TMask::init_mask() { _msg_field = 0; _msg_key = 0; - _pages = 0; // Azzera numero pagine + _pages = 0; // Azzera numero pagine e sheets if (_mask_num == 0) _sheet = NULL; // Non appartiene a nessuno sheet _enabled.set(MAX_PAGES); @@ -638,7 +638,13 @@ bool TMask::stop_run( bool ok = check_current_field(); if (ok) ok = check_fields(); - if (!ok) return FALSE; + if (ok) + { + if (id2pos(DLG_PROFILE) >= 0 && field(DLG_PROFILE).hidden()) + save_profile(); + } + else + return FALSE; } return TWindow::stop_run(key); @@ -924,8 +930,11 @@ WINDOW TMask::read_page( WINDOW w; if (toolbar || toolwin()) - { - w = create_interface(NULL_WIN, 0, r.top, 0, toolbar ? 0 : tooly, title, this, orecchie); + { + if (toolbar) + w = create_interface(NULL_WIN, 0, r.top, 0, 0, title, this, FALSE); + else + w = create_interface(NULL_WIN, 0, r.top, 0, tooly, title, this, orecchie); } else { @@ -1057,25 +1066,29 @@ const TString& TMask::get(short fld_id) const long TMask::get_long(short fld_id) const { - const TString& s = field(fld_id).get(); +// const TString& s = field(fld_id).get(); + const TString& s = get(fld_id); return atol(s); } bool TMask::get_bool(short fld_id) const { - const TString& s = field(fld_id).get(); +// const TString& s = field(fld_id).get(); + const TString& s = get(fld_id); return s.not_empty(); } real TMask::get_real(short fld_id) const { - const TString& s = field(fld_id).get(); +// const TString& s = field(fld_id).get(); + const TString& s = get(fld_id); return real(s); } TDate TMask::get_date(short fld_id) const { - const TString& s = field(fld_id).get(); +// const TString& s = field(fld_id).get(); + const TString& s = get(fld_id); return TDate(s); } @@ -1124,7 +1137,7 @@ void TMask::set(short fld_id, const real& n, bool hit) void TMask::set(short fld_id, const TDate& d, bool hit) { - CHECK(field(fld_id).is_kind_of(CLASS_DATE_FIELD), "Can't set a date in a non-date field"); + CHECK(id2pos(fld_id) < 0 || field(fld_id).is_kind_of(CLASS_DATE_FIELD), "Can't set a date in a non-date field"); set(fld_id, d.string(), hit); } @@ -1365,15 +1378,13 @@ void TMask::autosave(TRelation& r) const void TMask::on_firm_change() { - TString16 firm, valuta; - + TString16 firm; + firm << prefix().get_codditta(); for (int i = fields()-1; i >= 0; i--) { TMask_field& f = fld(i); if (f._flags.firm) { - if (firm.empty()) - firm << prefix().get_codditta(); f.set(firm); f.check(STARTING_CHECK); f.on_hit(); @@ -1468,7 +1479,7 @@ void TMask::send_key( } #ifdef DBG else - yesnofatal_box("Can't send key %u to field %d", key, to); + NFCHECK("Can't send key %u to field %d", key, to); #endif } } @@ -1860,7 +1871,6 @@ bool TMask::load( return TRUE; } - // @doc EXTERNAL // @mfunc Copia i valori dei campi dalla maschera

diff --git a/include/mask.h b/include/mask.h index 467130f54..917d66ca2 100755 --- a/include/mask.h +++ b/include/mask.h @@ -184,7 +184,7 @@ public: // @cmember Aggiunge runtime un campo testo alla maschera TMask_field& add_static (short id, int page, const char* prompt, int x, int y, const char* flags = ""); - // @cmember Aggiunge runtime un campo stringa alla maschera + // @cmember Aggiunge runtime un campo stringa alla maschera TEdit_field& add_string (short id, int page, const char* prompt, int x, int y, int dim, const char* flags = "", int width = 0); // @cmember Aggiunge runtime un campo numerico alla maschera diff --git a/include/maskfld.cpp b/include/maskfld.cpp index cd3320bdb..37291c1f7 100755 --- a/include/maskfld.cpp +++ b/include/maskfld.cpp @@ -1178,6 +1178,7 @@ const char* TEditable_field::prompt() const return _prompt ? _prompt->caption() : ""; } +<<<<<<< maskfld.cpp TOperable_field* TEditable_field::add_driver(short id) { @@ -1189,7 +1190,10 @@ TOperable_field* TEditable_field::add_driver(short id) { const int pos = sheet->mask().id2pos(-id); if (pos >= 0) + { driver = &(TOperable_field&)sheet->mask().fld(pos); + CHECKD(driver->is_kind_of(CLASS_OPERABLE_FIELD), "Field not operable ", -id); + } } } else @@ -1198,6 +1202,7 @@ TOperable_field* TEditable_field::add_driver(short id) if (pos >= 0) { driver = &(TOperable_field&)mask().fld(pos); + CHECKD(driver->is_kind_of(CLASS_OPERABLE_FIELD), "Field not operable ", id); TString16 msg; msg.format("CHECK,%d", dlg()); driver->message(0, TRUE)->add(msg); @@ -2980,6 +2985,8 @@ bool TEdit_field::parse_item(TScanner& scanner) { const TString16 what(scanner.popkey()); const TBrowse* b = parse_browse(scanner); + + CHECK(b,"Impossibile copiare la browse da un campo visto che quel campo non l'ha" ); if (b) { if (what == "US" || what == "AL") @@ -3946,6 +3953,21 @@ void TReal_field::set_decimals(int d) { if (d > 0) _picture.format(".%d", d); else _picture = "."; + } + else + { + if (_picture.not_empty()) + { + const int pdot = _picture.find(','); + if (pdot >= 0) + _picture.cut(pdot); + if (d > 0) + { + _picture << ','; + while (d-- > 0) + _picture << '@'; + } + } } } @@ -4808,3 +4830,4 @@ TWindowed_field::~TWindowed_field() if (_win) delete _win; } + diff --git a/include/maskfld.h b/include/maskfld.h index ba99ed72c..24f3cd32a 100755 --- a/include/maskfld.h +++ b/include/maskfld.h @@ -459,6 +459,9 @@ public: // @cmember Esegue il messaggio

-esimo sul campo bool do_message(int n); + // @cmember Ritorna il messaggio

-esimo del campo + TToken_string* message(int m, bool crea = FALSE); + // @cmember Controlla se il campo ha un messaggio virtual bool has_message() const { return _message != NULL; } @@ -508,9 +511,9 @@ protected: virtual void create(WINDOW parent); // @cmember Legge un item del controllo dal file

- void parse_head(TScanner& scanner); + virtual void parse_head(TScanner& scanner); // @cmember Legge un item del controllo dal file

- bool parse_item(TScanner& scanner); + virtual bool parse_item(TScanner& scanner); // @cmember Gestisce la pressione del tasto (TRUE se la gestione ha avuto successo) virtual bool on_key(KEY key); @@ -553,13 +556,13 @@ public: // @cmember Ritorna TRUE se il campo e' caricabile da file virtual bool is_loadable() const { return TRUE; } - + // @cmember Ritorna il valore di default del campo virtual const TString& get_default() const; // @cmember Imposta il valore di default del campo virtual void set_default(const char* def); - + // @cmember costruttore TLoadable_field(TMask* mask): TOperable_field(mask) {}; // @cmember distruttore @@ -582,7 +585,7 @@ class TEditable_field : public TLoadable_field // @cmember:(INTERNAL) Lista dei campi da cui dipende TPointer_array* _drivers; - + // @cmember:(INTERNAL) Stringa definibile dall'utilizzatore della classe da utilizzare a piacimento TToken_string* _userdata; @@ -667,12 +670,11 @@ public: // @cmember Ritorna TRUE se il campo e' di tipo editable virtual bool is_editable() const { return TRUE; } - // @cmember Aggiunge un campo driver - TOperable_field* add_driver(short id); - // @cmember Ritorna un eventuale campo driver TOperable_field* driver(int n) const { return _drivers ? (TOperable_field*)_drivers->objptr(n) : NULL; } + // @cmember Aggiunge un campo driver + TOperable_field* add_driver(short id); TEditable_field(TMask* m); virtual ~TEditable_field(); @@ -757,6 +759,7 @@ public: virtual bool is_browse() const { return FALSE; } virtual bool is_sheet() const { return FALSE; } virtual bool is_filesel() const { return FALSE; } + virtual bool is_profile() const { return FALSE; } TBrowse_button(TEdit_field* f); virtual ~TBrowse_button(); diff --git a/include/mov.h b/include/mov.h index 1fcb09731..202638ca4 100755 --- a/include/mov.h +++ b/include/mov.h @@ -9,6 +9,7 @@ #define MOV_CODCF "CODCF" #define MOV_DATADOC "DATADOC" #define MOV_NUMDOC "NUMDOC" +#define MOV_MESELIQ "MESELIQ" #define MOV_TIPODOC "TIPODOC" #define MOV_TOTDOC "TOTDOC" #define MOV_TOTDOCVAL "TOTDOCVAL" diff --git a/include/msksheet.cpp b/include/msksheet.cpp index 4897d198f..5738a0806 100755 --- a/include/msksheet.cpp +++ b/include/msksheet.cpp @@ -1342,7 +1342,9 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev) } break; case K_CTRL + '-': // ********* delete line - { + if (_check_enabled) + { + _check_enabled = FALSE; // Disable checks if (sheet_mask().id2pos(DLG_DELREC)>=0 && sheet_mask().field(DLG_DELREC).enabled() && notify(_cur_rec, K_DEL)) @@ -1360,7 +1362,8 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev) select(rec, FALSE); } refused = TRUE; - } + _check_enabled = TRUE; // Re-enable checks + } break; case K_CTRL + '+': // ********* insert line if (test_focus_change()) @@ -1618,7 +1621,10 @@ void TSpreadsheet::select(int rec, bool scrollto) if (has_focus) { _cur_rec = -1; - set_focus_cell(row, 1); +//Augusto was here +// set_focus_cell(row, 1); + set_focus_cell(row, _cur_col); +// } else { @@ -1697,10 +1703,11 @@ TOperable_field* TSpreadsheet::field(short id) const // Ricopia i campi della maschera nel record dato ed aggiorna il display void TSpreadsheet::mask2str(int rec) { - TToken_string& r = row(rec); - - owner().mask2row(rec, r); - + if (rec >= 0 && rec < items()) + { + TToken_string& r = row(rec); + owner().mask2row(rec, r); + } if (_needs_update != rec) { if (_needs_update >= 0) @@ -1891,6 +1898,8 @@ void TSpreadsheet::swap_rows( const int fromindex, const int toindex) _property.swap(fromindex, toindex); } + + void TSpreadsheet::set_column_width(const int col, const int width) const { XI_OBJ* column = find_column(col); @@ -2217,7 +2226,6 @@ bool TSheet_field::parse_item(TScanner& scanner) _ctl_data._park.add(scanner.string()); return TRUE; } - if (scanner.key() == "FL") // FLAGS { const char* flags = scanner.string(); @@ -2270,7 +2278,7 @@ bool TSheet_field::parse_item(TScanner& scanner) return TRUE; } - return TMask_field::parse_item(scanner); + return TLoadable_field::parse_item(scanner); } void TSheet_field::parse_input(TScanner& scanner) @@ -2435,10 +2443,16 @@ int TSheet_field::cid2index(short cid) const return s->cid2index(cid); } -void TSheet_field::enable_column(int column, bool on) -{ +void TSheet_field::enable_row(int row, bool on) +{ TSpreadsheet* s = (TSpreadsheet*)_ctl; - s->enable_column(column, on); + s->enable_cell(row, -1 , on); +} + +bool TSheet_field::row_enabled(int row) +{ + TSpreadsheet* s = (TSpreadsheet*)_ctl; + return (s->find_enabled_column(row,1,1) != 0); } @@ -2448,6 +2462,13 @@ void TSheet_field::enable_cell(int row, int column, bool on) s->enable_cell(row, column, on); } +void TSheet_field::enable_column(int column, bool on) +{ + TSpreadsheet* s = (TSpreadsheet*)_ctl; + s->enable_column(column, on); +} + + bool TSheet_field::column_enabled(int column) const { TSpreadsheet* s = (TSpreadsheet*)_ctl; @@ -2518,6 +2539,36 @@ void TSheet_field::swap_rows( const int fromindex, const int toindex) s->swap_rows(fromindex, toindex); } +static int default_rows_compare(TSheet_field &s, int i, int j) +{ + TToken_string &s1 = s.row(i); + TToken_string &s2 = s.row(j); + if (s1 == s2) + return 0; + return s1.compare(s2); +} + + + +void TSheet_field::sort(ROWS_COMPARE_FUNCTION compare) +{ + if (compare == NULL) compare = default_rows_compare; + + const long last = items()-1; + + for (int i = 0; i < last; i++) + { + for (int j = i+1; j <= last; j++) + { + const int cmp = compare(*this, i, j); + if (cmp > 0) + swap_rows( i,j); + } + } +} + + + void TSheet_field::set_column_width( const int col, const int width ) const { TSpreadsheet* s = (TSpreadsheet*)_ctl; @@ -2562,7 +2613,6 @@ bool TSheet_field::on_hit() } const bool ok = handler(K_SPACE); return ok; - } diff --git a/include/msksheet.h b/include/msksheet.h index d16c6a97c..310087cc1 100755 --- a/include/msksheet.h +++ b/include/msksheet.h @@ -26,6 +26,9 @@ class TSheet_field; // @doc EXTERNAL +//typedef (*ROWS_COMPARE_FUNCTION)(const TToken_string&, const TToken_string&); +typedef (*ROWS_COMPARE_FUNCTION)(TSheet_field & s, int r1, int r2); + // @type SPREADSHEET_NOTIFY | Prototipo funzione che gestisce l'ingresso, l'uscita e la modifica da una riga dello sheet typedef bool (*SPREADSHEET_NOTIFY)(TSheet_field& s, int r, KEY k); @@ -187,6 +190,9 @@ public: { enable_cell(row, column, FALSE); } // @cmember Controlla se una cella e' disabilitata (vedi ) bool cell_disabled(int row, int column) const; + // @cmember Controlla se una cella e' disabilitata (vedi ) + bool cell_enabled(int row, int column) const; + // @cmember Controlla se una colonna e' abilitata (vedi ) bool column_enabled(int column) const; // @cmember Controlla se una colonna e' disabilitata (vedi ) @@ -201,9 +207,20 @@ public: void move_column( const int fromindex, const int toindex ) const; // @cmember Permette di invertire la posizione di due colonne void swap_columns(const int fromid, const int toid) const; + + // @cmember Abilita/disabilita una riga dello spreadsheet (vedi ) + void enable_row(int row, bool on = TRUE); + // @cmember Disabilta una riga dello spreadsheet (chiama ) + void disable_row(int row) + { enable_row(row, FALSE); } + // @cmember Controlla se una riga e' disabilitata (tutte le sue celle sono disabilitate) + bool row_enabled(int row); // @cmember Permette di invertire la posizione di due righe void swap_rows( const int fromindex, const int toindex ) ; + // @cmember Permette di ordinare le righe dello sheet + void sort(ROWS_COMPARE_FUNCTION = NULL); + // @cmember Controlla se l'utente ha salvato la disposizione delle colonne bool user_saved_columns_order() const; // @cmember Setta la disposizione delle colonne @@ -218,7 +235,9 @@ public: // @cmember Setta il colore dello sfondo e del testo di una o tutte le righe void set_back_and_fore_color(COLOR back, COLOR fore, int row); // @cmember Memorizza la disposizione delle colonne - void save_columns_order(); + void save_columns_order(); + // @cmember Imposta la disposizione delle colonne + void set_columns_order(TToken_string* order); // @cmember Dispone le colonne come all'atto del caricamento void reset_columns_order(); // @cmember Setta il member

con il valore di

diff --git a/include/multirec.cpp b/include/multirec.cpp index 4c64055d3..65a114e19 100755 --- a/include/multirec.cpp +++ b/include/multirec.cpp @@ -99,8 +99,11 @@ int TMultiple_rectype::write_rewrite(TBaseisamfile & f, bool re) const do { err = TRectype::write(f); - if (err == _isreinsert && myself.renum()) - myself.renum_key(); + if (err == _isreinsert) + if (myself.renum()) + myself.renum_key(); + else + break; } while (err == _isreinsert); myself._nuovo = (err != NOERR); } @@ -148,12 +151,27 @@ TRecord_array& TMultiple_rectype::body(int logicnum) const void TMultiple_rectype::renum_key() { + TString oldkey; for (int i = _files.last(); i >= 0 ; i = _files.pred(i)) { - TRecord_array& b = (TRecord_array&)_files[i]; - TRectype* rec = new TRectype(b.key()); - set_body_key(*rec); - b.set_key(rec); // Aggiorna righe + const int logicnum = lognum(i); + TRecord_array * b = & body(logicnum); + if (b) + { + if (i==0) + oldkey=b->key().build_key(); + // convertire al piu' presto le seguenti righe ... + TRectype * rec = new TRectype(b->key()); + set_body_key(*rec); + b->set_key(rec); // Aggiorna righe + // .. nella piu' economiche + //set_body_key(*b); + // ...dove set_body_key(TRecarray & b) e' la nuova funzione virtuale da implementare + // che realizza direttamente la rinumerazione del record array + if (i==0) + if (oldkey != b->key().build_key()) + _nuovo = TRUE; + } } } @@ -180,6 +198,7 @@ void TMultiple_rectype::zero(char c) TAuto_variable_rectype::zero(c); for (int i = _files.last(); i >= 0 ; i = _files.pred(i)) ((TRecord_array &)_files[i]).destroy_rows(); + _nuovo = TRUE; } int TMultiple_rectype::readat(TBaseisamfile& f, TRecnotype nrec, word lockop) diff --git a/include/netsock.cpp b/include/netsock.cpp index 211306727..00fe31c10 100755 --- a/include/netsock.cpp +++ b/include/netsock.cpp @@ -619,30 +619,6 @@ BOOL TSocketClient::ReadLine(DWORD, TString& str) BOOL TSocketClient::HttpGetFile(const char* remote, const char* local) { - BOOL ok = FALSE; - - TString buf; - buf << "GET " << remote << " HTTP/1.0\r\n\r\n"; - - if (WriteLine(0, buf)) - { - const clock_t start = clock(); - - long size = 0; - for (int r = 0; !cur_socket->eof(); r++) - { - ReadLine(0, buf); - if (buf.blank()) - break; - if (r == 0 && buf.find("404") > 0) - return FALSE; // File not found - if (buf.compare("Content-length:", 15, TRUE) == 0) - { - const int colon = buf.find(':'); - size = atol(buf.mid(colon+1)); - } - } - ofstream outfile(local, ios::out | ios::binary); if (outfile.good()) { TString msg; diff --git a/include/netutils.cpp b/include/netutils.cpp index 4d509abf1..b5f7fd61e 100755 --- a/include/netutils.cpp +++ b/include/netutils.cpp @@ -1,8 +1,4 @@ #define NO_MFC -#define CObject TObject -#define CString TString -#define CStringArray TString_array - #include "NetUtils.h" TLanManager::TLanManager() diff --git a/include/prassi.aut b/include/prassi.aut index 64eda0c60..9b785736d 100755 --- a/include/prassi.aut +++ b/include/prassi.aut @@ -37,7 +37,7 @@ db Distinta Base pr Provvigioni Agenti mb Medi-Base sv Statistiche di Vendita -mr Master Resource Planning +mr Manufacturing Resource Planning xx Modulo vario 1 xx Modulo vario 2 xx Modulo vario 3 diff --git a/include/prefix.cpp b/include/prefix.cpp index 3e7643460..33c7e457c 100755 --- a/include/prefix.cpp +++ b/include/prefix.cpp @@ -314,7 +314,6 @@ int TFile_info::open_low(bool exclusive, bool index) err = get_error(_handle); } return err; -} int TFile_info::close_low() { @@ -852,8 +851,9 @@ TPrefix::TPrefix() : _filelevel(0), _items(0), _firm(NULL) TPrefix::~TPrefix() { - if (_firm) delete _firm; set(); + if (_firm) + delete _firm; DB_exit(); } diff --git a/include/printapp.cpp b/include/printapp.cpp index 180799a9a..d788a00c4 100755 --- a/include/printapp.cpp +++ b/include/printapp.cpp @@ -36,24 +36,19 @@ const word VALUTA_FLAG = 0x4000; // print token containers /////////////////////////////////////////////////////////// -class _Transfield:public TObject +class _Transfield : public TObject { friend class TPrint_application; - TString _from, // "from" value - _to, // "to" value - _fn; // field name int _lognum; // logical number + TString16 _fn; + TString _from, _to; - public: - _Transfield (int l, const char *fn, const char *from, const char *to): - _from (3), _to (20), _fn (10) - { - _lognum = l; - _from = from; - _to = to; - _fn = fn; - } +public: + _Transfield (int l, const char *fn, const char *from, const char *to) : + _lognum(l), _fn(fn), _from (from), _to (to) + { } + virtual ~_Transfield() { } }; class _Token : public TObject @@ -61,6 +56,7 @@ class _Token : public TObject friend class TPrint_application; int _tag; int _row; + public: int tag() const { return _tag; } int row() const { return _row; } @@ -74,8 +70,9 @@ class _PrintfTok : public _Token { friend class TPrint_application; TString _val; + public: - _PrintfTok (int rw, const char *val) : _val(val) + _PrintfTok (int rw, const char *val) : _val(val) { tag(0); row(rw); } virtual ~_PrintfTok () {} }; @@ -86,26 +83,23 @@ class _FieldTok : public _Token friend class TPrint_application; int _size, _dec; char _align; - TString _fld; // field description + TString80 _fld; // field description + word _flags; // all you need to know - word _flags; // all you need to know - - public: - _FieldTok (int rw, char *fld, word flags, char align = 'l', - int size = -1, int dec = -1): - _fld (20) +public: + _FieldTok (int rw, const char *fld, word flags, char align = 'l', + int size = -1, int dec = -1) { tag(1); row(rw); - _fld = (const char *) fld; + _fld = fld; _flags = flags; - _size = size, _align = align; + _size = size; + _align = align; _dec = dec; - delete fld; - } - virtual ~ _FieldTok () - { } + + virtual ~_FieldTok () { } }; class _PrintfRef : public _Token @@ -786,19 +780,15 @@ void TPrint_application::set_row ( case 'u': case 'r': { - char *x = new char[2]; - x[0] = ch; - x[1] = '\0'; + char x[2] = { ch, '\0' }; _rows.add (new _FieldTok (_currow, x, FONT_FLAG)); } break; case 'g': case 'j': { - const char *xxx = format ("%c %d", ch, size); - char *xxxx = new char[strlen (xxx) + 1]; - strcpy (xxxx, xxx); - _rows.add (new _FieldTok (_currow, xxxx, JUMP_FLAG)); + const char* x = format ("%c %d", ch, size); + _rows.add (new _FieldTok (_currow, x, JUMP_FLAG)); } break; case 'T': @@ -868,6 +858,7 @@ void TPrint_application::set_row ( { char* x = va_arg (params, char *); _rows.add (new _FieldTok (_currow, x, flags, align, size, dec)); + delete x; // FLD macro has mallocated it! } flags = 0x0000; align = 'l'; @@ -1019,7 +1010,7 @@ void TPrint_application::set_row ( if (strind) { strbuf[strind] = '\0'; - _rows.add(new _PrintfTok (_currow, strbuf)); + _rows.add(new _PrintfTok(_currow, strbuf)); strind = 0; } va_end (params); @@ -1198,8 +1189,9 @@ bool TPrint_application::print_one ( // @comm Dopo la stampa del record non viene spostato in avanti il cursore { int i = 0; + TPrinter& prn = printer(); - if ((_prind && _prind->iscancelled()) || printer().frozen()) + if ((_prind && _prind->iscancelled()) || prn.frozen()) if (_cancelled = cancel_hook()) return FALSE; if (!_print_defined) @@ -1212,10 +1204,10 @@ bool TPrint_application::print_one ( int *pos = new int[_maxrow + 1]; for (i = 0; i <= _maxrow; i++) - { - rw.add(new TPrintrow()); - pos[i] = -1; - } + { + rw.add(new TPrintrow()); + pos[i] = -1; + } // printing workhorse for (i = 0; i <= _maxrow; i++) @@ -1462,25 +1454,33 @@ bool TPrint_application::print_one ( } case 'r': { - const real& rrr = *(real*)pr->_what; if (pr->_fmt.len () == 2 && _picture.not_empty()) { - strcpy (__tmp_string, rrr.string (_picture)); - } - else - { + const real& rrr = *(real*)pr->_what; const char* fff = pr->_fmt; + if (*_picture && (strlen(fff) == 2 || strcmp(fff, "%Lf") == 0)) + { + if (_magic_currency && _picture == "." || + (_picture.len() >= 9 && _picture.find(',') < 0)) + real2currency(ps, rrr); + else + ps = rrr.string(_picture); + } + else + { #ifdef __LONGDOUBLE__ - sprintf(__tmp_string, fff, (long double)rrr); + sprintf(__tmp_string, fff, (long double)rrr); #else - dsprintf(__tmp_string, (char*)fff, rrr.ptr()); + dsprintf(__tmp_string, (char*)fff, rrr.ptr()); #endif + ps = __tmp_string; + } + if (rrr.is_zero () && !_print_zero) + ps.fill (' ', ps.len()); } - ps = __tmp_string; - if (rrr.is_zero () && !_print_zero) - ps.fill (' ', ps.len()); break; - } + default: + break; } ps = fill_str (ps, _fillchar); @@ -1516,7 +1516,7 @@ bool TPrint_application::print_one ( for (i = 0; i <= /*_maxrow*/ last; i++) { TPrintrow *pr = (TPrintrow *) & rw[i]; - if (!(printer().print(*pr))) + if (!(prn.print(*pr))) break; } //if (_auto_ff && last /* _maxrox */ < printer().formlen ()) @@ -1612,6 +1612,7 @@ TPrint_application::TPrint_application ():TApplication (), _transtab (10), _magic_currency = FALSE; _prind = NULL; _cur_file = 0; + _magic_currency = FALSE; _print_zero = FALSE; _last_choice = BAR_ITEM (1); } diff --git a/include/printapp.h b/include/printapp.h index f92137c3e..e2314af6a 100755 --- a/include/printapp.h +++ b/include/printapp.h @@ -180,6 +180,7 @@ class TPrint_application : public TApplication bool _print_zero; // @cmember:(INTERNAL) Barra di attesa TProgind* _prind; + // @cmember:(INTERNAL) Picture default per i reali TString80 _picture; diff --git a/include/real.cpp b/include/real.cpp index 217fbdceb..e8f1da70a 100755 --- a/include/real.cpp +++ b/include/real.cpp @@ -1589,7 +1589,7 @@ real TGeneric_distrib::get () real r = currslice; if (_tot != _totslices) { - if (_tot < 1E9) + if (_tot < 1E9 && currslice < 1E9) r = (_tot * currslice) / _totslices; else r *= (_tot / _totslices); diff --git a/include/recarray.cpp b/include/recarray.cpp index f479fd204..73490034a 100755 --- a/include/recarray.cpp +++ b/include/recarray.cpp @@ -685,11 +685,21 @@ const TRectype& TRecord_cache::get(const char* key) return rec; } +const TRectype& TRecord_cache::get(long key) +{ + TString16 str; str << key; + return get(str); +} + const TString& TRecord_cache::get(const char* key, const char* field) { return get(key).get(field); } +const TString& TRecord_cache::get(long key, const char* field) +{ + return get(key).get(field); +} /////////////////////////////////////////////////////////// // TDB_cache /////////////////////////////////////////////////////////// diff --git a/include/recarray.h b/include/recarray.h index 3d78b8516..f04a31f59 100755 --- a/include/recarray.h +++ b/include/recarray.h @@ -171,7 +171,7 @@ public: int io_result(); const int key_number() const { return _key; } - + bool already_loaded(const char* code) const; bool already_loaded(long code) const; @@ -201,7 +201,7 @@ protected: public: const TString& decode(const char* code); const TString& decode(long code); - + TDecoder(int num, const char* field, int key = 1); TDecoder(const char* table, const char* field = "S0", int key = 1); virtual ~TDecoder() { } @@ -214,14 +214,14 @@ protected: // @cmember Elimina la chiave dalla cache public: - // @cmember ritorna il campo (chiama get(chiave)) - const TString& get(const char* chiave, const char* campo); // @cmember ritorna il record con una determinata chiave virtual const TRectype& get(const char* chiave); + // @cmember ritorna il campo (chiama get(chiave)) + const TString& get(const char* chiave, const char* campo); // @cmember ritorna il record con una determinata chiave numerica - const TRectype& get(long chiave) - { char str[24]; sprintf(str, "%ld", chiave); return get(str); } + const TRectype& get(long chiave); + const TString& get(long chiave, const char* campo) ; TRecord_cache(int num, int key = 1); TRecord_cache(TLocalisamfile *f, int key = 1); diff --git a/include/relapp.cpp b/include/relapp.cpp index 38bc9691e..61fe353a2 100755 --- a/include/relapp.cpp +++ b/include/relapp.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include /////////////////////////////////////////////////////////// @@ -314,10 +315,7 @@ bool TRelation_application::autonum( if (rec) ((TEditable_field&)f).autosave(*get_relation()); if (_renum_message.empty() || f.in_key(1)) - { - _renum_message = "Il documento e' stato registrato con:\n"; - _renum_message << f.prompt() << " = " << f.get(); - } + _renum_message.format("L'elemento e' stato registrato con :\n %s = %s", (const char *) f.prompt(), (const char *) f.get()); } return k.not_empty(); } @@ -924,7 +922,7 @@ bool TRelation_application::save(bool check_dirty) mask2mail(*_mask); break; case _isreinsert: - warning_box("Esiste gia' un documento con la stessa chiave"); + warning_box("Esiste gia' un elemento con la stessa chiave"); break; default: error_box("Impossibile registrare i dati: errore %d", err); @@ -1012,7 +1010,7 @@ bool TRelation_application::relation_remove() r.restore_status(); if (protected_record(r.curr())) - return message_box("Documento non eliminabile"); + return message_box("Elemento non eliminabile"); if (_curr_transaction == TRANSACTION_DELETE || yesno_box("Confermare l'eliminazione")) { @@ -1107,7 +1105,7 @@ void TRelation_application::main_loop() if (pos >= 0 && _mask->fld(pos).active()) _mask->send_key(K_CTRL+'E', 0); else - error_box("Documento non eliminabile."); + error_box("Elemento non eliminabile."); _autodelete = FALSE; } } @@ -1173,7 +1171,7 @@ void TRelation_application::main_loop() if (trovato) { modify_mode(); - warning_box("Documento gia' presente"); + warning_box("Elemento gia' presente"); if (_curr_transaction.not_empty()) { _curr_transaction=TRANSACTION_MODIFY; @@ -1270,6 +1268,7 @@ void TRelation_application::main_loop() ini.set("Result", err == NOERR ? "CANCEL" : "ERROR"); ini.set("Error", err); } + } _trans_counter++; } while ( _trans_counter < _ntransactions); @@ -1563,7 +1562,10 @@ void TRelation_application::mask2ini(const TMask& m, TConfig& ini) TString16 defpar; defpar << get_relation()->lfile().num(); ini.set("Firm", get_firm(), "Transaction"); - for (int f = m.fields()-1; f >= 0; f--) + + TString16 defpar; defpar << get_relation()->lfile().num(); + TString str(80); + for (int f = 0; f < m.fields(); f++) { TMask_field& campo = m.fld(f); if (campo.field() && campo.shown()) diff --git a/include/relapp.h b/include/relapp.h index 68251932b..66574c88a 100755 --- a/include/relapp.h +++ b/include/relapp.h @@ -21,7 +21,6 @@ #define TRANSACTION_INSERT "INSERT" #define TRANSACTION_MODIFY "MODIFY" #define TRANSACTION_DELETE "DELETE" -#define TRANSACTION_RUN "RUN" #define TM_INTERACTIVE 'I' #define TM_AUTOMATIC 'A' // @doc EXTERNAL @@ -68,7 +67,7 @@ class TRelation_application : public TSkeleton_application // @cmember:(INTERNAL) Modalità di esecuzione della transazione corrente (Automatica o interattiva) char _curr_trans_mode; // @cmember:(INTERNAL) Flag di cancellazione automatica veloce - byte _autodelete; + bool _autodelete; private: // @cmember:(INTERNAL) Carica la transazione corrente (protocollo via .ini) diff --git a/include/relation.cpp b/include/relation.cpp index c66e3b289..49aa38cd0 100755 --- a/include/relation.cpp +++ b/include/relation.cpp @@ -588,7 +588,7 @@ int TRelation::position_rels( // Le altre funzioni sul record procedono normalmente { - TString expr; // Stringa di lavoro per la valutazione delle espressioni + TString expr(80); // Stringa di lavoro per la valutazione delle espressioni _errors = NOERR; @@ -613,34 +613,27 @@ int TRelation::position_rels( { expr = rd.evaluate_expr(j, to); TFieldref& s = (TFieldref&) rd._fields[j]; - if (from.is_sorted() && from.curr().type(s.name()) ==_alfafld) - expr.rpad(s.len(from.curr()),'~'); s.write(expr, furr); } // for each field from.read(_isgteq, lck); // record read : if not found, zero current record - if (from.bad()) + bool eq = !from.bad(); + for (int kk = 0; eq && kk < rd._fields.items(); kk++) { - bool eq = TRUE; - for (int kk = 0; eq && kk < rd._fields.items(); kk++) - { - TFieldref& fl = (TFieldref&)rd._fields[kk]; - const TString80 f_fr(fl.read(furr)); - const TString80 f_ex(rd.evaluate_expr(kk, to)); - if (rd._forced[kk]) - eq = f_fr == f_ex; - else - eq = f_fr.compare(f_ex, f_ex.len()) == 0; - } - rd._first_match = eq; - if (eq) - from.setstatus(NOERR); - else - furr.zero(); + TFieldref& fl = (TFieldref&)rd._fields[kk]; + const TString80 f_fr(fl.read(furr)); + const TString80 f_ex(rd.evaluate_expr(kk, to)); + if (rd._forced[kk]) + eq = f_fr == f_ex; + else + eq = f_fr.compare(f_ex, f_ex.len()) == 0; } - else - rd._first_match = TRUE; + rd._first_match = eq; + if (eq) + from.setstatus(NOERR); + else + furr.zero(); } // for each relation return _errors; } @@ -694,7 +687,6 @@ bool TRelation::next_match( reldef(j).load_rec(rec, from); from.setkey(reldef(j)._key); from.next(); - ok = (from.good() && from.curr() == rec); for (int kk = 0; ok && kk < reldef(j)._fields.items(); kk++) { @@ -928,6 +920,7 @@ static bool _last_created = FALSE; // @rdesc Ritorna l'handle del file aperto FILE* TCursor::open_index( bool create) // @parm Indica se creare l'indice nel caso manchi (default FALSE) +<<<<<<< relation.cpp { _last_created = create; if (_indexname.empty()) @@ -1985,11 +1978,13 @@ void TFieldref::write(const char* val, TRelation& r) const void TFieldref::write(const char* val, TRectype& rec) const { if (_fileid >= CNF_GENERAL) return; - if (_from > 0) + if (_from > 0 || _to > 0) { - TString campo(rec.get(_name)); - campo.overwrite(val, _from); - rec.put(_name, campo); + buffer = rec.get(_name); + if (_to <= _from) + ((TFieldref*)this)->_to = rec.length(_name); + buffer.overwrite(val, _from, _to - _from); + rec.put(_name, buffer); } else { @@ -1999,14 +1994,14 @@ void TFieldref::write(const char* val, TRectype& rec) const int TFieldref::len(const TRectype &rec) const { - if (_to >= 0) + if (_to > _from) return _to - _from; if (_fileid <= 0) return rec.length(_name) - _from; const TRectype r(_fileid); const int len = r.length(_name); - return len - _from; + return len - _from; } /////////////////////////////////////////////////////////// @@ -2460,6 +2455,8 @@ int TSortedfile::read(word op , word lockop ) // @mfunc Legge il record e lo copia in

(vedi e ) int TSortedfile::read(TRectype& rec, word op , word lockop ) { + if (&curr() != &rec) + curr() = rec; _curs->read((TIsamop)op,(TReclock)lockop); setstatus(_curs->file().status()); return status(); @@ -2573,18 +2570,19 @@ TSortedfile::TSortedfile(int logicnum,TRelation * rel,const char * ordexpr,const :TLocalisamfile(logicnum),_rel(NULL) { // costruisce il cursore - if (rel == NULL) - rel = new TRelation(logicnum); - - _rel=rel; + if (!rel) + { + _rel = new TRelation(logicnum); + } + else + _rel=rel; _curs = new TSorted_cursor(_rel,ordexpr,"",nkey); -// if (&curr()!=&(_curs->file().curr())) -// _curs->file().set_curr(&curr()); + if (&curr()!=&(_curs->file().curr())) + _curs->file().set_curr(&curr()); _curs->setfilter(filter,TRUE); //must pass TRUE because cursors doesn't update rel (BUG). // DON't move this line BEFORE set_curr : filter's fieldrefs are allocated at cursor setfilter - } // @mfunc Distruttore TSortedfile::~TSortedfile() diff --git a/include/sheet.cpp b/include/sheet.cpp index ad92293f5..10aa54385 100755 --- a/include/sheet.cpp +++ b/include/sheet.cpp @@ -515,10 +515,15 @@ void TSheet_control::check( else { if (!_disabled[n]) + { _checked.set(n, on); - // Aggiorna la riga - XI_OBJ cell; XI_MAKE_CELL(&cell, _obj, rec2row(n), 1); - xi_cell_request(&cell); + // Aggiorna la riga + if (_sheet->is_running()) + { + XI_OBJ cell; XI_MAKE_CELL(&cell, _obj, rec2row(n), 1); + xi_cell_request(&cell); + } + } } } @@ -753,6 +758,11 @@ bool TSheet_control::event_handler(XI_OBJ* itf, XI_EVENT *xiev) xiev->v.cell_request.color = FOCUS_COLOR; xiev->v.cell_request.back_color = FOCUS_BACK_COLOR; } + else + { + xiev->v.cell_request.color = 0; + xiev->v.cell_request.back_color = 0; + } } } else @@ -1045,7 +1055,7 @@ void TSheet::start_run() if (pos >= 0) fld(pos).enable(on); - _parked = -1; + reset_parked(); repos_buttons(); force_update(); @@ -1206,6 +1216,7 @@ bool TArray_sheet::destroy(int i) { uncheck(-1); enable_row(-1); + reset_parked(); return _data.destroy(i, TRUE); } @@ -1460,6 +1471,10 @@ TBrowse_sheet::TBrowse_sheet(TCursor* cursor, const char* fields, f->browse() ? f->browse()->input_fields() : 1), _field(f), _sel(0) { + TBrowse* browse = f->browse(); + if (browse == NULL) + return; + TToken_string ca; // Tag buttons int n = 0; for (const char* s = sibling.get(0); s && *s; s = sibling.get(), n++) @@ -1475,10 +1490,6 @@ TBrowse_sheet::TBrowse_sheet(TCursor* cursor, const char* fields, if (n > 0) add_tag_button(0, ca, _sel); - TBrowse* browse = f->browse(); - if (browse == NULL) - return; - TToken_string tids = head; TToken_string tfns = fields; TToken_string ids = browse->get_input_fields(); diff --git a/include/sheet.h b/include/sheet.h index d0941b1a3..ef4de6e52 100755 --- a/include/sheet.h +++ b/include/sheet.h @@ -20,17 +20,19 @@ class TSheet : public TMask TSheet_control* _sheet; // Spreadsheet contenuto TToken_string _park; // Ultima riga richiesta - long _parked; // Numero riga richiesta long _select_row; // Riga da selezionare + long _parked; // Numero riga parcheggiata // @access Protected Member protected: // TMask + // @cmember Lavori in background virtual void on_idle(); static bool tutti_handler(TMask_field& f, KEY k); protected: + void reset_parked() { _parked = -1; } virtual void get_row(long r, TToken_string& row) { row.cut(0); } virtual long get_items() const { return 0L; } diff --git a/include/stdtypes.cpp b/include/stdtypes.cpp index 2873d4bff..b95542c99 100755 --- a/include/stdtypes.cpp +++ b/include/stdtypes.cpp @@ -37,7 +37,7 @@ bool test_assistance_year() if (get_serial_number() > 0) { const int new_year = dongle().year_assist(); - if (new_year >= 1998 && new_year <= dongle_year) + if (new_year >= 1997 && new_year <= dongle_year) dongle_year = new_year; } @@ -108,5 +108,8 @@ void operator delete( } #endif // FOXPRO +#endif // DBG + + diff --git a/include/strings.cpp b/include/strings.cpp index 736deac10..e84537a11 100755 --- a/include/strings.cpp +++ b/include/strings.cpp @@ -265,7 +265,7 @@ TString& TString::operator <<(const TObject& obj) ostrstream out(spark.get_buffer(), spark.size()); obj.print_on(out); out << ends; - return operator <<(spark); + return operator <<(spork); } @@ -898,7 +898,8 @@ TString& TString::add_plural( // @mfunc Sovrascrive la stringa

dalla posizione

TString& TString::overwrite( const char* s, // @parm Stringa da inserire - int pos) // @parm Posizione dalla quale iniziare a sovrascrivere + int pos, // @parm Posizione dalla quale iniziare a sovrascrivere + int lung) // @parm Lunghezza // @comm Sovrascrive dalla posizione

fino alla lunghezza di

l'oggetto // stringa. Nel caso la dimensione sia maggiore l'oggetto viene riallocato @@ -906,16 +907,18 @@ TString& TString::overwrite( // // @xref { - if (s) + if (lung == 0) lung=strlen(s); + if (s || lung) { const int l = len(); if (pos < 0) pos = l; - const int max = pos+strlen(s); + const int max = pos+lung; if (max > size()) resize(max, TRUE); // resize needed? const bool over = max > l; // beyond end of string? - for (int i = l; i < pos; i++) _str[i] = ' '; // space padding + for (int i = l; i < pos; i++) _str[i] = ' '; // space padding per inserimenti dopo la fine della stringa for (; *s; s++) _str[pos++] = *s; // write + for (; pos < max ; pos++) _str[pos] = ' '; // space padding per inserimenti con stringhe minori della lunghezza prevista if (over) _str[pos] = '\0'; // end of string } return *this; @@ -1206,6 +1209,11 @@ const TFilename& TFilename::tempdir() return *this; } +const TFilename& TFilename::currdir() +{ + _getcwd(get_buffer(),256); + return *this; +} // Certified 50% // @doc EXTERNAL diff --git a/include/strings.h b/include/strings.h index 615e508c5..c16002f74 100755 --- a/include/strings.h +++ b/include/strings.h @@ -134,7 +134,7 @@ public: TString& spaces(int n = -1) { return fill(' ', n); } // @cmember Sovrascrive la stringa s dalla posizione pos - TString& overwrite(const char* s, int pos = 0); + TString& overwrite(const char* s, int pos = 0, int len = 0); // @cmember Inserisce la stringa s dalla posizione pos TString& insert(const char* s, int pos = 0); @@ -296,6 +296,55 @@ public: void strncpy(const char* s, int n); }; + +// @doc EXTERNAL + +// @class TString4 | Definisce le stringhe di 4 caratteri +// +// @base public | TFixed_string +// +// @author:(INTERNAL) Augusto +// +// @comm Questa classe e' identica alla per quanto riguarda i public member e quindi +// si rimanda a tale classe per ulteriori spiegazioni. +class TString4 : public TFixed_string +{ + char _str4[5]; + +public: + TString4(const char* s = "") : TFixed_string(_str4, 5) { set(s); } + TString4(const TString& s) : TFixed_string(_str4, 5) { set(s); } + TString4(const TString4& s) : TFixed_string(_str4, 5) { set(s); } + const TString& operator =(const char* s) { return set(s); } + const TString& operator =(const TString& s) { return set((const char*)s); } + const TString& operator =(const TString4& s) { return set((const char*)s); } +}; + + +// @doc EXTERNAL + +// @class TString8 | Definisce le stringhe di 8 caratteri +// +// @base public | TFixed_string +// +// @author:(INTERNAL) Augusto +// +// @comm Questa classe e' identica alla per quanto riguarda i public member e quindi +// si rimanda a tale classe per ulteriori spiegazioni. +class TString8 : public TFixed_string +{ + char _str8[9]; + +public: + TString8(const char* s = "") : TFixed_string(_str8, 9) { set(s); } + TString8(const TString& s) : TFixed_string(_str8, 9) { set(s); } + TString8(const TString8& s) : TFixed_string(_str8, 9) { set(s); } + const TString& operator =(const char* s) { return set(s); } + const TString& operator =(const TString& s) { return set((const char*)s); } + const TString& operator =(const TString8& s) { return set((const char*)s); } +}; + + // @doc EXTERNAL // @class TString16 | Definisce le stringhe di 16 caratteri @@ -454,6 +503,8 @@ public: const TFilename& temp(const char* prefix = NULL, const char* extension = NULL); // @cmember Genera il nome della directory temporanea const TFilename& tempdir(); + // @cmember Genera il nome della directory corrente + const TFilename& currdir(); }; // Forward declaration for TToken_string::get(int n, real& r) const @@ -495,6 +546,7 @@ public: virtual TObject* dup() const; // @cmember Setta il carattere separatore a s void separator(char s); + // @cmember Ritorna il carattere separatore char separator() const { return _separator; } // @cmember Rimette all'inizio il puntatore diff --git a/include/tabapp.h b/include/tabapp.h index 55b74c847..10506f582 100755 --- a/include/tabapp.h +++ b/include/tabapp.h @@ -11,6 +11,7 @@ #define FPC "FPC" +#define TTable_application Tab_application // @doc EXTERNAL // @class Tab_application | Classe per la definizione della per le tabelle diff --git a/include/tabutil.h b/include/tabutil.h index 8dda6a679..edd933676 100755 --- a/include/tabutil.h +++ b/include/tabutil.h @@ -52,6 +52,7 @@ public: // @cmember Distruttore virtual ~TTable(); + // @cmember Ritorna la relapp che gestisce la tabella virtual bool get_relapp(TString& app) const; // @cmember Ritorna il numero logico della tabella

diff --git a/include/text.h b/include/text.h index f20d29bf9..146e62c12 100755 --- a/include/text.h +++ b/include/text.h @@ -118,10 +118,10 @@ class TTextfile: public TObject // @access Public Member public: // @cmember Ritorna il numero totale delle linee di testo - long lines() + long lines() const { return _lines; } // @cmember Ritorna se sono state effettuate delle modifiche - bool changed() + bool changed() const { return _dirty; } diff --git a/include/varrec.cpp b/include/varrec.cpp index d798f3f2f..8fce5e3c6 100755 --- a/include/varrec.cpp +++ b/include/varrec.cpp @@ -1,13 +1,15 @@ #include #include -HIDDEN bool rec_has_memo(const RecDes* rd) -{ - for( int i = rd->NFields - 1; i >= 0; i--) - if (rd->Fd[i].TypeF == _memofld) - return TRUE; - return FALSE; -} +// HIDDEN bool rec_has_memo(const RecDes* rd) +//{ +// for( int i = rd->NFields - 1; i >= 0; i--) +// if (rd->Fd[i].TypeF == _memofld) +// return TRUE; +// return FALSE; +//} + +extern bool rec_has_memo( const RecDes * rd ); TVariable_field::TVariable_field( const char * name, // @@ -79,8 +81,7 @@ TString & TVariable_field::get() const if (_e) { CHECK(_rec, "NULL Record pointer with an expression"); - const int items = _e->numvar(); - for (int i = 0; i < items; i++) + _rec->set_variables(_e); _e->setvar(i, _rec->get(_e->varname(i))); v = _e->as_string(); } @@ -204,6 +205,13 @@ void TVariable_rectype::remove_field(const char * fieldname) _virtual_fields.destroy(); } +void TVariable_rectype::set_variables(TExpression * e) const +{ + const int items = e->numvar(); + for (int i = 0; i < items; i++) + e->setvar(i, get(e->varname(i))); +} + void TVariable_rectype::set_memo_fld( const char * fieldname) { if (fieldname && *fieldname) @@ -369,7 +377,6 @@ TRectype & TVariable_rectype::operator =(const char* rec) return *this; } - /////////////////////////////////////////////////////////// // TExtrectype /////////////////////////////////////////////////////////// diff --git a/include/varrec.h b/include/varrec.h index 6c256e9bf..eadc34e18 100755 --- a/include/varrec.h +++ b/include/varrec.h @@ -142,6 +142,7 @@ public: virtual void add_field(TVariable_field * f); virtual void remove_field(const char * fieldname = NULL); + virtual void set_variables(TExpression * e) const ; TVariable_field * variable_field(const char * name) const { return (TVariable_field *) _virtual_fields.objptr(name);} TVariable_field * first_variable_field() { return (TVariable_field *) _virtual_fields.first_item();} diff --git a/include/viswin.cpp b/include/viswin.cpp index 91f50f84f..fd3ca5e14 100755 --- a/include/viswin.cpp +++ b/include/viswin.cpp @@ -78,7 +78,7 @@ int TViswin::tabx(int x) const HIDDEN long w = 0L; if (w == 0L) { - TString256 t; t.spaces(256); + const TString t(256, 'm'); w = xvt_dwin_get_text_width(win(), (char*)(const char*)t, 256); } return int((w*x) >> 8); @@ -926,7 +926,7 @@ void TViswin::paint_row (long j) set_font(PRINT_FONT, st, PRINT_HEIGHT); set_color(fg, bg); - stringat(X_OFFSET+pos, row, cp); + printat (X_OFFSET+pos, row, "%s", cp); pos += strlen (cp); } @@ -1240,6 +1240,7 @@ void TViswin::abort_print () { _txt.freeze (); freeze (); + printer().freeze(); set_focus (); close_print(); } @@ -2561,6 +2562,8 @@ TViswin::TViswin(const char *fname, if (_toplevel) { + if (width == 0 && height == 0) + maximize(); enable_menu_item(M_EDIT_COPY, FALSE); enable_menu_item(M_SHOW_RULERS, TRUE); enable_menu_item(M_SHOW_BUTTONS, TRUE); diff --git a/include/window.cpp b/include/window.cpp index b21ee6b1d..9dcfbe8b9 100755 --- a/include/window.cpp +++ b/include/window.cpp @@ -513,15 +513,15 @@ void TImage::convert_to_default_colors() short dx, dy; xvt_image_get_dimensions(_image, &dx, &dy); for (short y = 0; y < dy; y++) for (short x = 0; x < dx; x++) { - const COLOR c = xvt_image_get_pixel(_image, x, y); + const COLOR c = get_pixel(x, y); switch (c) { case COLOR_DKCYAN & 0x00FFFFFF: - xvt_image_set_pixel(_image, x, y, MASK_BACK_COLOR); break; + set_pixel(x, y, MASK_BACK_COLOR); break; case COLOR_CYAN & 0x00FFFFFF: - xvt_image_set_pixel(_image, x, y, MASK_LIGHT_COLOR); break; + set_pixel(x, y, MASK_LIGHT_COLOR); break; case COLOR_GRAY & 0x00FFFFFF: - xvt_image_set_pixel(_image, x, y, MASK_DARK_COLOR); break; + set_pixel(x, y, MASK_DARK_COLOR); break; default: break; } diff --git a/include/window.h b/include/window.h index 4a865d0ec..6f12f5e83 100755 --- a/include/window.h +++ b/include/window.h @@ -125,6 +125,12 @@ public: // @cmember Setta l'

.esime entry della paletta al colore

void set_clut(byte n, COLOR c); + + // @cmember Legge il colore del pixel + COLOR get_pixel(int x, int y) const; + + // @cmember Setta il colore del pixel + void set_pixel(int x, int y, COLOR c); // @cmember Costruttore. Viene passato il nome del file TImage(const char* n); @@ -208,6 +214,9 @@ public: // @cmember Distruttore virtual ~TWindow(); + // @cmember Ritorna l'handler della finestra padre + WINDOW parent() const; + // @cmember Ritorna l'identificatore della classe finestra virtual word class_id() const; diff --git a/include/xvtility.cpp b/include/xvtility.cpp index 5f48b3888..cbcfba410 100755 --- a/include/xvtility.cpp +++ b/include/xvtility.cpp @@ -112,6 +112,8 @@ RCT& resize_rect( RCT pc; if (parent == NULL_WIN) parent = TASK_WIN; xvt_vobj_get_client_rect(parent, &pc); // Get parent window size + if (parent == TASK_WIN) + pc.bottom -= 26; const short MAXX = pc.right; const short MAXY = pc.bottom; diff --git a/m770/770101.cpp b/m770/770101.cpp index 193037bcb..a3fbfa851 100755 --- a/m770/770101.cpp +++ b/m770/770101.cpp @@ -51,8 +51,8 @@ int TSchedaPE::read_scperc_rows() const TLocalisamfile& rpag = lfile(LF_RPAG); position_rels(); destroy_rows(); - - // carico array versamenti + + // carico array versamenti int i = 0; for(bool ok = is_first_match(LF_RVER); ok; ok = next_match(LF_RVER)) ver(i++) = rver.curr(); @@ -67,7 +67,7 @@ int TSchedaPE::read_scperc_rows() return NOERR; } -int TSchedaPE::read(TIsamop op, TReclock lockop, TDate& atdate) +int TSchedaPE::read(TIsamop op, TReclock lockop) { int err = file().read(op, lockop); if (err == NOERR) err = read_scperc_rows(); @@ -189,17 +189,17 @@ int TSchedaPE::registra(bool re, bool force) return err; } -int TSchedaPE::write(bool force, TDate&) +int TSchedaPE::write(bool force) { return registra(FALSE, force); } -int TSchedaPE::rewrite(bool force, TDate&) +int TSchedaPE::rewrite(bool force) { return registra(TRUE, force); } -int TSchedaPE::remove(TDate&) +int TSchedaPE::remove() { TLocalisamfile& scheda = lfile(); TLocalisamfile& rver = lfile(LF_RVER); diff --git a/m770/77qc.frm b/m770/77qc.frm index 79eb49ac3..58adcb296 100755 --- a/m770/77qc.frm +++ b/m770/77qc.frm @@ -303,6 +303,7 @@ BEGIN PICTURE "###.###.###^^^" // FIELD RITENUTE SPECIAL STRINGA TRASFER "SC0223" "" + SPECIAL STRINGA DYLOG "NU,289,11" "" END diff --git a/m770/77qd.frm b/m770/77qd.frm index a45190129..de4a3d9a6 100755 --- a/m770/77qd.frm +++ b/m770/77qd.frm @@ -206,10 +206,19 @@ BEGIN KEY "COMUNE DI RESIDENZA FISCALE" PROMPT 25 5 "" FIELD 513@->DENCOM - MESSAGE EMPTY SHOW,3@|HIDE,4@ - MESSAGE SHOW,4@|HIDE,3@ + MESSAGE EMPTY ENABLE,3@|DISABLE,4@ + MESSAGE ENABLE,4@|DISABLE,3@|COPY,208 SPECIAL STRING TRASFER "SF0208" "" SPECIAL STRING DYLOG "AN,128,21" "" + GROUP 1 +END + +LISTA 96 +BEGIN + KEY "Tipo anagrafica" + FIELD TIPOA + ITEM "F| " MESSAGE SHOW,1@|HIDE,2@ + ITEM "G| " MESSAGE SHOW,2@|HIDE,1@ END STRINGA 80 @@ -217,9 +226,10 @@ BEGIN KEY "COMUNE DI RESIDENZA" PROMPT 25 5 "" FIELD 413@->DENCOM - GROUP 3 + GROUP 1 3 SPECIAL STRING TRASFER "SF0208" "" SPECIAL STRING DYLOG "AN,128,21" "" + MESSAGE COPY,208 END STRINGA 9 @@ -230,6 +240,8 @@ BEGIN FIELD 413@->PROVCOM SPECIAL STRING TRASFER "SF0209" "" SPECIAL STRING DYLOG "AN,149,2" "" + MESSAGE COPY,209 + GROUP 1 END STRINGA 101 @@ -252,14 +264,15 @@ STRINGA 10 BEGIN KEY "VIA RES. + NUMCIVRES" PROMPT 78 5 "" - GROUP 3 + GROUP 1 3 SPECIAL STRING TRASFER "SF0210" "" SPECIAL STRING DYLOG "AN,151,35" "" + MESSAGE COPY,210 END STRINGA 103 BEGIN - KEY "VIA RES." + KEY "VIA RES. FISC." FIELD 216@->INDRF[1,35] FLAGS "H" MESSAGE COPY,100 @@ -267,7 +280,7 @@ END STRINGA 104 BEGIN - KEY "NUM.CIV DI RESIDENZA" + KEY "NUM.CIV DI RESIDENZA FISC." FLAGS "H" FIELD 216@->CIVRF MESSAGE APPEND,100 @@ -278,12 +291,9 @@ BEGIN KEY "VIA RF + NUMCIVRF" PROMPT 78 5 "" GROUP 4 - SPECIAL STRING DYLOG "AN,128,35" "" -END - -NUMBER 97 -BEGIN - SPECIAL STRING DYLOG "NU,304,1" "" + SPECIAL STRING DYLOG "AN,151,35" "" + GROUP 1 + MESSAGE COPY,210 END LISTA 11 @@ -296,6 +306,32 @@ BEGIN SPECIAL STRING TRASFER "SF0211" "" END +NUMBER 97 +BEGIN + SPECIAL STRING DYLOG "NU,304,1" "" +END + +STRINGA 208 +BEGIN + KEY "COMUNE DI RESIDENZA GIURIDICHE" + GROUP 2 + SPECIAL STRING DYLOG "AN,246,21" "" +END + +STRINGA 209 +BEGIN + KEY "PROV. RESIDENZA GIURIDICHE" + GROUP 2 + SPECIAL STRING DYLOG "AN,267,2" "" +END + +STRINGA 210 +BEGIN + KEY "INDIRIZZO GIURIDICHE" + GROUP 2 + SPECIAL STRING DYLOG "AN,269,35" "" +END + STRINGA 12 BEGIN KEY "STATO ESTERO DI RES." @@ -392,6 +428,7 @@ BEGIN // FIELD IMPORTO PICTURE "###.###.###^^^" SPECIAL STRING TRASFER "SF0221" "" + SPECIAL STRING DYLOG "NU,419,11" "" END END diff --git a/m770/77qd1.frm b/m770/77qd1.frm index 56c4948c1..adb96f6eb 100755 --- a/m770/77qd1.frm +++ b/m770/77qd1.frm @@ -198,20 +198,29 @@ BEGIN KEY "COMUNE DI RESIDENZA FISCALE" PROMPT 25 5 "" FIELD 513@->DENCOM - MESSAGE EMPTY SHOW,3@|HIDE,4@ - MESSAGE SHOW,4@|HIDE,3@ + MESSAGE EMPTY ENABLE,3@|DISABLE,4@ + MESSAGE ENABLE,4@|DISABLE,3@|COPY,208 SPECIAL STRING TRASFER "SH0208" "" SPECIAL STRING DYLOG "AN,128,21" "" END +LISTA 96 +BEGIN + KEY "Tipo anagrafica" + FIELD TIPOA + ITEM "F| " MESSAGE SHOW,1@|HIDE,2@ + ITEM "G| " MESSAGE SHOW,2@|HIDE,1@ +END + STRINGA 80 BEGIN KEY "COMUNE DI RESIDENZA" PROMPT 25 5 "" FIELD 413@->DENCOM - GROUP 3 + GROUP 1 3 SPECIAL STRING TRASFER "SH0208" "" SPECIAL STRING DYLOG "AN,128,21" "" + MESSAGE COPY,208 END STRINGA 9 @@ -222,6 +231,7 @@ BEGIN FIELD 413@->PROVCOM SPECIAL STRING TRASFER "SH0209" "" SPECIAL STRING DYLOG "AN,149,2" "" + MESSAGE COPY,209 END STRINGA 101 @@ -244,9 +254,10 @@ STRINGA 10 BEGIN KEY "VIA RES. + NUMCIVRES" PROMPT 78 5 "" - GROUP 3 + GROUP 1 3 SPECIAL STRING TRASFER "SH0210" "" SPECIAL STRING DYLOG "AN,151,35" "" + MESSAGE COPY,210 END STRINGA 103 @@ -269,9 +280,31 @@ STRINGA 100 BEGIN KEY "VIA RF + NUMCIVRF" PROMPT 78 5 "" - GROUP 4 + GROUP 1 4 SPECIAL STRING TRASFER "SH0210" "" SPECIAL STRING DYLOG "AN,151,35" "" + MESSAGE COPY,210 +END + +STRINGA 208 +BEGIN + KEY "COMUNE DI RESIDENZA GIURIDICHE" + GROUP 2 + SPECIAL STRING DYLOG "AN,246,21" "" +END + +STRINGA 209 +BEGIN + KEY "PROV. RESIDENZA GIURIDICHE" + GROUP 2 + SPECIAL STRING DYLOG "AN,267,2" "" +END + +STRINGA 210 +BEGIN + KEY "INDIRIZZO GIURIDICHE" + GROUP 2 + SPECIAL STRING DYLOG "AN,269,35" "" END STRING 11 @@ -340,6 +373,7 @@ BEGIN // FIELD IMPORTO PICTURE "###.###.###^^^" SPECIAL STRING TRASFER "SH0217" "" + SPECIAL STRING DYLOG "NU,360,11" "" END END diff --git a/m770/77qdb.frm b/m770/77qdb.frm index e4c04565d..dfc37fa56 100755 --- a/m770/77qdb.frm +++ b/m770/77qdb.frm @@ -200,20 +200,29 @@ BEGIN KEY "COMUNE DI RESIDENZA FISCALE" PROMPT 25 5 "" FIELD 513@->DENCOM - MESSAGE EMPTY SHOW,3@|HIDE,4@ - MESSAGE SHOW,4@|HIDE,3@ + MESSAGE EMPTY ENABLE,3@|DISABLE,4@ + MESSAGE ENABLE,4@|DISABLE,3@|COPY,208 SPECIAL STRING TRASFER "SG0208" "" SPECIAL STRING DYLOG "AN,128,21" "" END +LISTA 96 +BEGIN + KEY "Tipo anagrafica F/G" + FIELD TIPOA + ITEM "F|1" MESSAGE SHOW,1@|HIDE,2@ + ITEM "G|2" MESSAGE SHOW,2@|HIDE,1@ +END + STRINGA 80 BEGIN KEY "COMUNE DI RESIDENZA" PROMPT 25 5 "" FIELD 413@->DENCOM - GROUP 3 + GROUP 1 3 SPECIAL STRING TRASFER "SG0208" "" SPECIAL STRING DYLOG "AN,128,21" "" + MESSAGE COPY,208 END STRINGA 9 @@ -224,6 +233,7 @@ BEGIN FIELD 413@->PROVCOM SPECIAL STRING TRASFER "SG0209" "" SPECIAL STRING DYLOG "AN,149,2" "" + MESSAGE COPY,209 END STRINGA 101 @@ -246,9 +256,10 @@ STRINGA 10 BEGIN KEY "VIA RES. + NUMCIVRES" PROMPT 78 5 "" - GROUP 3 + GROUP 1 3 SPECIAL STRING TRASFER "SG0210" "" SPECIAL STRING DYLOG "AN,151,35" "" + MESSAGE COPY,210 END STRINGA 103 @@ -271,9 +282,10 @@ STRINGA 100 BEGIN KEY "VIA RF + NUMCIVRF" PROMPT 78 5 "" - GROUP 4 + GROUP 1 4 SPECIAL STRING TRASFER "SG0210" "" SPECIAL STRING DYLOG "AN,151,35" "" + MESSAGE COPY,210 END LISTA 11 @@ -322,6 +334,27 @@ BEGIN SPECIAL STRING DYLOG "AN,343,20" "" END +STRINGA 208 +BEGIN + KEY "COMUNE DI RESIDENZA GIURIDICHE" + GROUP 2 + SPECIAL STRING DYLOG "AN,246,21" "" +END + +STRINGA 209 +BEGIN + KEY "PROV. RESIDENZA GIURIDICHE" + GROUP 2 + SPECIAL STRING DYLOG "AN,267,2" "" +END + +STRINGA 210 +BEGIN + KEY "INDIRIZZO GIURIDICHE" + GROUP 2 + SPECIAL STRING DYLOG "AN,269,35" "" +END + STRINGA 15 BEGIN KEY "CAUSALE" @@ -388,6 +421,7 @@ BEGIN // FIELD IMPORTO PICTURE "###.###.###^^^" SPECIAL STRING TRASFER "SG0221" "" + SPECIAL STRING DYLOG "NU,419,11" "" END STRINGA 22 @@ -396,7 +430,7 @@ BEGIN PROMPT 124 9 "" FIELD CONTR10 SPECIAL STRING TRASFER "SG0222" "" - SPECIAL STRING DYLOG "AN,419,1" "" + SPECIAL STRING DYLOG "AN,430,1" "" END END diff --git a/m770/77ql.frm b/m770/77ql.frm index efe2bfe03..4a4830192 100755 --- a/m770/77ql.frm +++ b/m770/77ql.frm @@ -162,7 +162,7 @@ END STRING 50 BEGIN KEY "RSS decodificato" - SPECIAL STRING DYLOG "NU,96,2" "" + SPECIAL STRING DYLOG "AN,96,2" "" END STRINGA 6 @@ -178,18 +178,20 @@ BEGIN KEY "Luogo Vers." PROMPT 25 4 "" FIELD 42->QLLV + SPECIAL STRING DYLOG "AN,92,1" "" END LISTA 8 BEGIN KEY "Tipo Vers." PROMPT 33 4 "" - ITEM " | " - ITEM "B|B" MESSAGE SHOW,13|HIDE,14 - ITEM "C|C" MESSAGE SHOW,14|HIDE,13 - ITEM "D|D" MESSAGE SHOW,14|HIDE,13 + ITEM " | " MESSAGE HIDE,12|HIDE,13 + ITEM "B|B" MESSAGE SHOW,12|SHOW,13 + ITEM "C|C" MESSAGE HIDE,12|HIDE,13 + ITEM "D|D" MESSAGE HIDE,12|HIDE,13 FIELD 42->QLTV SPECIAL STRING TRASFER "SL0105" "" + SPECIAL STRING DYLOG "AN,91,1" "" END STRINGA 9 @@ -198,6 +200,7 @@ BEGIN PROMPT 45 4 "" FIELD 42->QLCT SPECIAL STRING TRASFER "SL0107" "" + SPECIAL STRING DYLOG "AN,59,4" "" END STRINGA 10 @@ -221,7 +224,7 @@ END STRINGA 12 BEGIN - KEY "SERIE" + KEY "ABI" PROMPT 81 4 "" FIELD 42->QLSERIE SPECIAL STRING DYLOG "NU,43,5" "" @@ -229,16 +232,16 @@ END STRINGA 13 BEGIN - KEY "NUMERO SENZA Prog.Versamento" + KEY "CAB" PROMPT 96 4 "" FIELD 42->QLNUMERO[1,5] + SPECIAL STRING DYLOG "NU,48,5" "" END STRINGA 14 BEGIN KEY "NUMERO COMPLETO" FIELD 42->QLNUMERO - SPECIAL STRING DYLOG "NU,48,11" "" END END diff --git a/m770/batbca7.uml b/m770/batbca7.uml index 268af4f35..655df0a8b 100755 --- a/m770/batbca7.uml +++ b/m770/batbca7.uml @@ -445,30 +445,32 @@ BOOLEAN TCF_BINPS BEGIN PROMPT 1 18 "Contributo INPS " FIELD LF_TABCOM->B4 - MESSAGE TRUE ENABLE,INPS_GROUP@|"10.00",TCF_PERCINPS|"95.00",TCF_ASSIMPINPS + MESSAGE TRUE ENABLE,INPS_GROUP@ MESSAGE FALSE DISABLE,INPS_GROUP@|RESET,INPS_GROUP@ END -NUMBER TCF_PERCINPS 6 +NUMBER TCF_PERCINPS 6 2 BEGIN PROMPT 30 18 "Percentuale " PICTURE ".2" FIELD LF_TABCOM->R1 - NUM_EXPR {(#THIS>=0) && (#THIS<=100)} - FLAGS "D" + NUM_EXPR {(#THIS>0) && (#THIS<=100)} + FLAGS "DU" GROUP INPS_GROUP + CHEKCTYPE REQUIRED WARNING "Percentuale contributo INPS non valida" END -NUMBER TCF_ASSIMPINPS 6 +NUMBER TCF_ASSIMPINPS 6 2 BEGIN PROMPT 1 19 "Percentuale ass.imp. " PICTURE ".2" FIELD LF_TABCOM->R2 - NUM_EXPR {(#THIS>=0) && (#THIS<=100)} - FLAGS "D" + NUM_EXPR {(#THIS>0) && (#THIS<=100)} + FLAGS "DU" GROUP INPS_GROUP WARNING "Percentuale ass.imp. contributo INPS non valida" + CHEKCTYPE REQUIRED END NUMBER TCF_COMMINPS 6 diff --git a/mg/anamag.h b/mg/anamag.h index 9746f25fa..72bf60d19 100755 --- a/mg/anamag.h +++ b/mg/anamag.h @@ -26,6 +26,9 @@ #define ANAMAG_PPCONF "PPCONF" #define ANAMAG_PPCOLLO "PPCOLLO" #define ANAMAG_RIORDINO "RIORDINO" +#define ANAMAG_LOTTORIOR "LOTTORIOR" +#define ANAMAG_LOTTOIRIOR "LOTTOIRIOR" +#define ANAMAG_GIORNIRIOR "LEADTIME" #define ANAMAG_CODIVAR "CODIVAR" #define ANAMAG_TARA "TARA" #define ANAMAG_SCONTO "SCONTO" @@ -36,6 +39,10 @@ #define ANAMAG_ULTCOS2 "ULTCOS2" #define ANAMAG_MASSANUN "MASSANUN" #define ANAMAG_UNSUPPUN "UNSUPPUN" -#define ANAMAG_PROV "PROV" +#define ANAMAG_VALSTATUN "VALSTATUN" +#define ANAMAG_PROV "PROV" +#define ANAMAG_PAESE "PAESE" +#define ANAMAG_NUMREG1 "NUMREG1" +#define ANAMAG_NUMREG2 "NUMREG2" #endif diff --git a/mg/bastcau.uml b/mg/bastcau.uml index 3444a6ca4..fe7b64ce8 100755 --- a/mg/bastcau.uml +++ b/mg/bastcau.uml @@ -4,6 +4,7 @@ PAGE "Stampa Tabella Causali di magazzino" -1 -1 58 8 STRING F_INIZIO1 5 BEGIN + FLAGS "U" PROMPT 2 1 "Da codice " USE %CAU FIELD CODTAB @@ -16,6 +17,7 @@ END STRING F_FINE1 5 BEGIN + FLAGS "U" PROMPT 2 3 " A codice " HELP "Inserire il codice di fine " FIELD CODTAB diff --git a/mg/batbcau.h b/mg/batbcau.h index cbe89e882..3d07251bf 100755 --- a/mg/batbcau.h +++ b/mg/batbcau.h @@ -33,7 +33,8 @@ #define F_DIBAEXPLOSION 140 #define F_DEFAULTMAG 141 #define F_DEFAULTDEP 142 -#define F_COSTO_ESPL 143 +#define F_LIV_ESPL 143 +#define F_COSTO_ESPL 144 #define G_SGNVAL 20 #define G_SGNQTA 21 diff --git a/mg/batbcau.rpt b/mg/batbcau.rpt index e5f78621c..1e9bf7ce6 100755 --- a/mg/batbcau.rpt +++ b/mg/batbcau.rpt @@ -43,6 +43,8 @@ Tabella Causali di Magazzino 2|S2[27,27]|@116g@6,ct 2|S9|@111g@4,ls 3| +[Footers] +1| [Translations] 0|S6|P|Prezzo 0|S6|C|Costo @@ -50,4 +52,6 @@ Tabella Causali di Magazzino 0|S7|C|Carico 0|S7|S|Scarico 0|S7| |==== - +0|S2|+|+ +0|S2|-|- +0|S2|0| diff --git a/mg/batbcau.uml b/mg/batbcau.uml index bdc5344f2..034e49040 100755 --- a/mg/batbcau.uml +++ b/mg/batbcau.uml @@ -151,13 +151,19 @@ BOOL F_DIBAEXPLOSION BEGIN FIELD B3 PROMPT 2 17 "Esplodi mediante Distinta Base" - MESSAGE TRUE ENABLE,F_COSTO_ESPL - MESSAGE CLEAR, F_COSTO_ESPL + MESSAGE TRUE ENABLE,F_COSTO_ESPL|ENABLE,F_LIV_ESPL + MESSAGE CLEAR,F_COSTO_ESPL|CLEAR,F_LIV_ESPL +END + +NUMBER F_LIV_ESPL 1 +BEGIN + PROMPT 40 17 "Livello " + FIELD I0 END LISTBOX F_COSTO_ESPL 14 BEGIN - PROMPT 40 17 "Costo da utilizzare " + PROMPT 52 17 "Costo da utilizzare " FIELD S11 ITEM " |Nessuno" ITEM "U|Ultimo costo" diff --git a/mg/f109.dir b/mg/f109.dir index 71044ca1d..e6c0ca675 100755 --- a/mg/f109.dir +++ b/mg/f109.dir @@ -1,3 +1,3 @@ 109 0 -$mag|0|0|675|0|Giacenze di magazzino||| +$mag|0|0|692|0|Giacenze di magazzino||| diff --git a/mg/f109.trr b/mg/f109.trr index 82c41deef..490b2e2d0 100755 --- a/mg/f109.trr +++ b/mg/f109.trr @@ -1,5 +1,5 @@ 109 -46 +47 CODMAG|1|5|0|Codice magazzino e deposito CODART|1|20|0|Codice articolo LIVELLO|1|15|0|Livello di magazzino @@ -32,7 +32,8 @@ SCARTI|4|15|5|Scarti VALSCARTI|4|15|5|Valore scarti LIVRIOR|4|15|3|Livello di riordino LOTTORIOR|4|15|3|Lotto minimo di riordino -GIORNIRIOR|1|3|0|Numero di giorni di riordino +LOTTOIRIOR|4|15|3|Lotto incrementale di riordino +GIORNIRIOR|4|5|1|Numero di giorni di riordino SCORTAMIN|4|15|5|Scorta minima USER1|4|15|5|campo definito dall'utente USERVAL1|4|18|3|valore diff --git a/mg/mag.h b/mg/mag.h index fd41be7d7..62c4e8e7f 100755 --- a/mg/mag.h +++ b/mg/mag.h @@ -31,9 +31,10 @@ #define MAG_NDIST "NDIST" #define MAG_SCARTI "SCARTI" #define MAG_VALSCARTI "VALSCARTI" -#define MAG_LIVRIOR "LIVRIOR" -#define MAG_LOTTORIOR "LOTTORIOR" +#define MAG_LIVRIOR "LIVRIOR" // livello di riordino +#define MAG_SCORTAMIN "SCORTAMIN" // scorta minima +#define MAG_LOTTORIOR "LOTTORIOR" // lotto minimo +#define MAG_LOTTOIRIOR "LOTTOIRIOR" // lotto incrementale di riordino #define MAG_GIORNIRIOR "GIORNIRIOR" -#define MAG_SCORTAMIN "SCORTAMIN" #endif diff --git a/mg/mg0100.cpp b/mg/mg0100.cpp index a1f8974c3..6f52e2461 100755 --- a/mg/mg0100.cpp +++ b/mg/mg0100.cpp @@ -124,6 +124,7 @@ bool TMask_tabmag::stdmag_handler(TMask_field& f, KEY k) // tabella causali: handler della somma segni bool TMask_tabmag::sumsign_handler(TMask_field& f, KEY k) { + int ok=TRUE; if (k == K_ENTER) { int ss=f.mask().get_int(F_SGNGIAC)-f.mask().get_int(F_SGNRIM); @@ -138,8 +139,26 @@ bool TMask_tabmag::sumsign_handler(TMask_field& f, KEY k) f.error_box("La somma dei segni \n((GIAC-RIM)-(ACQ+ENTR)+(VEN+USC)+(ACL-INCL)+(PRODF-PRODC) + SCARTI) \ndeve essere uguale a zero"); return FALSE; } +#define ABSSALDO(fld) abs(f.mask().get_int(fld)) + if (f.mask().edit_mode() || f.mask().insert_mode()) + { + int ps=ABSSALDO(F_SGNGIAC)+ABSSALDO(F_SGNRIM); + ps+=ABSSALDO(F_SGNACQ)+ABSSALDO(F_SGNENTR); + ps+=ABSSALDO(F_SGNVEN)+ABSSALDO(F_SGNUSC); + ps+=ABSSALDO(F_SGNACL)+ABSSALDO(F_SGNINCL); + ps+=ABSSALDO(F_SGNPRODF)+ABSSALDO(F_SGNPRODC); + ps+=ABSSALDO(F_SGNORDC)+ABSSALDO(F_SGNORDF); + ps+=ABSSALDO(F_SGNLABEL)+ABSSALDO(F_SGNSCAR); + if (ps==0) + ok = f.yesno_box("Attenzione: la causale non movimenta nessun saldo. Confermi ?"); + const char tipomov=*f.mask().get(F_TIPOMOV); + if ((f.mask().get_int(F_SGNGIAC) >=0 && tipomov=='S') ) + ok = f.yesno_box("Attenzione: la causale e' impostata come scarico ma la giacenza non e' movimentata in negativo. Confermi ?"); + if ((f.mask().get_int(F_SGNGIAC) <=0 && tipomov=='C')) + ok = f.yesno_box("Attenzione: la causale e' impostata come carico ma la giacenza non e' movimentata in positivo. Confermi ?"); + } } - return TRUE; + return ok; } // HANDLER DEL FORMATO DEL LIVELLO diff --git a/mg/mg1.cpp b/mg/mg1.cpp index ea81a652f..f3b81efc6 100755 --- a/mg/mg1.cpp +++ b/mg/mg1.cpp @@ -1,30 +1,24 @@ #include -#include // // Modulo di gestione movimenti #include "mg1.h" -#define usage "Error - usage : %s -{0|1|2|3 [A|C]}" - int main(int argc, char** argv) { - int rt = -1; - const int r = (argc > 1) ? atoi(&argv[1][1]) : -1; + const int r = (argc > 1) ? argv[1][1]-'0' : 0; switch (r) { - case 0: - rt = mg1100(argc,argv) ; break; // gestione interattiva movimenti case 1: - rt = mg1200(argc,argv) ; break; // ricostruzione saldi + mg1200(argc,argv) ; break; // ricostruzione saldi case 2: - //rt = mg1300(argc,argv) ; break; // gestione movimenti DA DOCUMENTI + // mg1300(argc,argv) ; break; // gestione movimenti DA DOCUMENTI case 3: - rt = mg1400(argc,argv) ; break; // gestione aperture/chiusure + mg1400(argc,argv) ; break; // gestione aperture/chiusure default: - error_box(usage, argv[0]) ; break; + mg1100(argc,argv) ; break; // gestione interattiva movimenti } exit(0); - return rt ; + return 0; } diff --git a/mg/mg1100.cpp b/mg/mg1100.cpp index 4df1f9421..a9aea4b4d 100755 --- a/mg/mg1100.cpp +++ b/mg/mg1100.cpp @@ -1,33 +1,24 @@ -#include -#include -#include +#include #include #include -#include -#include -#include -#include "..\mg\mglib.h" -//#include "..\cg\cglib.h" +#include + +#include "mglib.h" #include "..\ve\veconf.h" +#include "..\db\dblib.h" + #include "mg1100.h" -#ifndef __DBLIB_H -#include "..\db\dblib.h" -#endif - - -real tmpreal; -//******************** -//******************** // maschera dell'applicazione "Gestione interattiva movimenti di magazzino" // -class TMask_movmag: public TMask +class TMask_movmag : public TMask { - static TRecord_cache cache_causali; - static TArticolo_giacenza *curr_art ; + TRecord_cache _cache_causali; + TArticolo_giacenza _curr_art; + TMov_mag * _mov_mag; TCodgiac_livelli * livelli_giac; // oggetto gestione livelli di giacenza - TString price_codart; + TString _price_codart; real price_quant; bool price_proposed; real proposed_price(const char * codart, real quant,const char * causrig); @@ -57,9 +48,6 @@ public: }; -TRecord_cache TMask_movmag::cache_causali("%CAU"); -TArticolo_giacenza *TMask_movmag::curr_art; - // HANDLER DEL CODICE LIVELLO anagrafica bool TMask_movmag::codgrp_handler(TMask_field& f, KEY k) { @@ -82,12 +70,11 @@ bool TMask_movmag::codgrp_handler(TMask_field& f, KEY k) // costruttore della maschera anagrafica di magazzino //TMask_movmag::TMask_movmag() : TMask_movmag::TMask_movmag(TCodgiac_livelli *l_m,TMov_mag * m_m) - : TMask("mg1100") + : TMask("mg1100"), _cache_causali("%CAU") { // oggetti dell'applicazione livelli_giac= l_m; _mov_mag = m_m; - curr_art= new TArticolo_giacenza; // setta handler e notify TSheet_field & ss=(TSheet_field &)field(F_RIGHE); set_handler(F_DATACOMP, handle_datacomp); @@ -210,7 +197,7 @@ bool TMask_movmag::notify_righe(TSheet_field & ss, int r, KEY key) // quindi se non sono settati, prende quelli di default TString16 stdmag; TString16 stddep; - TCausale_magazzino & cau = (TCausale_magazzino &)cache_causali.get(m.get(F_CODCAUS)); + TCausale_magazzino & cau = (TCausale_magazzino &)m._cache_causali.get(m.get(F_CODCAUS)); if (cau.default_magdep().not_empty()) { stdmag = cau.default_mag(); @@ -252,18 +239,22 @@ bool TMask_movmag::handle_righeprezzo1(TMask_field &f, KEY k) // proposta hard: propone il prezzo in ogni caso bool TMask_movmag::handle_righeprezzo2(TMask_field &f, KEY k) { - TMask_movmag &m=(TMask_movmag &)f.mask().get_sheet()->mask(); - if (k==K_TAB && f.focusdirty()) - { - // propone il prezzo in base alla causale - if (!f.mask().get(F_QUANT).blank() && - !f.mask().get(F_CODART).blank()) + if (k == K_TAB) + { + TMask& m = f.mask(); + TMask_movmag& mmm = (TMask_movmag&)m.get_sheet()->mask(); + const TString& codart = m.get(F_CODART); + if (f.focusdirty()) { - real prz=m.proposed_price(f.mask().get(F_CODART), - f.mask().get_real(F_QUANT), - f.mask().get(F_CAUSRIG)); - f.mask().set(F_PREZZO,prz); + // propone il prezzo in base alla causale + if (codart.not_empty() && codart != mmm._price_codart && !m.get(F_QUANT).blank()) + { + TMask_movmag& mmm = (TMask_movmag&)m.get_sheet()->mask(); + real prz = mmm.proposed_price(codart, m.get_real(F_QUANT), m.get(F_CAUSRIG)); + m.set(F_PREZZO, prz); + } } + mmm._price_codart = codart; } return TRUE; } @@ -273,7 +264,9 @@ bool TMask_movmag::handle_codarticolo(TMask_field &f, KEY k) { if (k==K_TAB && f.focusdirty()) { - curr_art->read(f.get()); + // TMask_movmag& maskmov = (TMask_movmag&)f.mask(); + TMask_movmag& maskmov = (TMask_movmag &)f.mask().get_sheet()->mask(); + maskmov._curr_art.read(f.get()); handle_righeprezzo2(f, k); } return TRUE; @@ -294,9 +287,9 @@ bool TMask_movmag::handle_giacattuale(TMask_field &f, KEY k) } TString16 codmag(maskrighe.get(F_CODMAG)); codmag.insert(maskrighe.get(F_CODDEP),3); - tmpreal=maskrighe.get_real(F_UMFC); + real tmpreal=maskrighe.get_real(F_UMFC); if (!tmpreal.is_zero()) - tmpreal=curr_art->disponibilita(maskmov.get(F_ANNOES),codmag,codliv,TRUE)/tmpreal; + tmpreal=maskmov._curr_art.disponibilita(maskmov.get(F_ANNOES),codmag,codliv,TRUE)/tmpreal; f.set(tmpreal.string()); } return TRUE; @@ -322,15 +315,15 @@ bool TMask_movmag::add_autorows (int r, const char * old_codcaus, const char * o if (new_codcaus.blank()) new_codcaus=get(F_CODCAUS); - TCausale_magazzino &oldcau=(TCausale_magazzino &)cache_causali.get(old_codcaus); - TCausale_magazzino &cau =(TCausale_magazzino &)cache_causali.get(new_codcaus); + TCausale_magazzino &oldcau=(TCausale_magazzino &)_cache_causali.get(old_codcaus); + TCausale_magazzino &cau =(TCausale_magazzino &)_cache_causali.get(new_codcaus); bool rimuovi_righe_coll=FALSE; bool inserisci_righe_coll=*cau.caus_collegata()!='\0'; if (inserisci_righe_coll) { // ******************************* // deve esserci una riga collegata - TCausale_magazzino &cau_coll =(TCausale_magazzino &)cache_causali.get(cau.caus_collegata()); + TCausale_magazzino &cau_coll =(TCausale_magazzino &)_cache_causali.get(cau.caus_collegata()); if ((r < ss.items()-1 && *ss.cell(r+1,ss.cid2index( F_AUTOMATICA)) == riga_automatica) && cau_coll.esplodente()) @@ -356,7 +349,10 @@ bool TMask_movmag::add_autorows (int r, const char * old_codcaus, const char * o // ****************** if (inserisci_righe_coll) { - TCausale_magazzino &cau_coll =(TCausale_magazzino &)cache_causali.get(cau.caus_collegata()); + TCausale_magazzino &cau_coll =(TCausale_magazzino &)_cache_causali.get(cau.caus_collegata()); + TString16 mag, dep; + mag = cau_coll.default_mag(); + dep = cau_coll.default_dep(); TString tmpstr; int offset=1; #define COPIA_SU_AUTO(colnum) {tmpstr=(ss.row(r).get(ss.cid2index(colnum))); ss.row(r+offset).add(tmpstr,ss.cid2index(colnum));} @@ -367,9 +363,9 @@ bool TMask_movmag::add_autorows (int r, const char * old_codcaus, const char * o ss.row(r+offset)=ss.row(r); ss.row(r+offset).add(TString(1,riga_automatica),ss.cid2index(F_AUTOMATICA)); if (cau_coll.has_default_mag()) - ss.row(r+1).add(cau_coll.default_mag(),ss.cid2index(F_CODMAG)); + ss.row(r+offset).add(mag,ss.cid2index(F_CODMAG)); if (cau_coll.has_default_dep()) - ss.row(r+1).add(cau_coll.default_dep(),ss.cid2index(F_CODDEP)); + ss.row(r+offset).add(dep,ss.cid2index(F_CODDEP)); COPIA_SU_AUTO(F_PREZZO); added_some= TRUE; } @@ -414,7 +410,9 @@ bool TMask_movmag::add_explrows(int r) bool added_some=FALSE; - TCausale_magazzino &cau =(TCausale_magazzino &)cache_causali.get(new_codcaus); + TCausale_magazzino &cau =(TCausale_magazzino &)_cache_causali.get(new_codcaus); + TArticolo articolo; + if (cau.esplodente() && *sheet.cell(r,sheet.cid2index(F_ESPLOSA)) == ' ') { TDistinta_tree distinta; @@ -423,9 +421,11 @@ bool TMask_movmag::add_explrows(int r) // c'e' una riga di movimento esplodente non ancora esplosa: // va sostituita con n righe esplose TString codmag; - real prezzo,quant; + real prezzo,quant; + const char tipo_costo = cau.get("S11")[0]; + const int livello = cau.get_int("I0"); distinta.set_root(sheet.cell(r,sheet.cid2index(F_CODART))); - distinta.explode(boom, FALSE, 0, 0, "A"); + distinta.explode(boom, FALSE, 0, livello, "A"); for (int newrow=0; newrow < boom.items() ; newrow++) { TRiga_esplosione & riga_esp=(TRiga_esplosione & )(boom[newrow]); @@ -442,6 +442,12 @@ bool TMask_movmag::add_explrows(int r) nuova_riga.add(codmag.sub(1,3) ,sheet.cid2index(F_CODMAG)); nuova_riga.add(codmag.sub(4,5) ,sheet.cid2index(F_CODDEP)); } + articolo.read(riga_esp.articolo()); + if (tipo_costo == 'U') + prezzo = articolo.get_real(ANAMAG_ULTCOS1); + else + if (tipo_costo == 'S') + prezzo = articolo.get_real(ANAMAG_COSTSTD); if (!prezzo.is_zero()) nuova_riga.add(prezzo.string(),sheet.cid2index(F_PREZZO)); nuova_riga.add("X",sheet.cid2index(F_ESPLOSA)); @@ -462,7 +468,7 @@ real TMask_movmag::proposed_price(const char *codart, { real rv("0"); TCausale_magazzino & cau= - (TCausale_magazzino &)cache_causali.get(*causrig ? causrig : get(F_CODCAUS)); + (TCausale_magazzino &)_cache_causali.get(*causrig ? causrig : get(F_CODCAUS)); TLocalisamfile anamag(LF_ANAMAG); anamag.put("CODART",codart); anamag.read(); diff --git a/mg/mg1100a.h b/mg/mg1100a.h index a98a7ca19..1f5431a7f 100755 --- a/mg/mg1100a.h +++ b/mg/mg1100a.h @@ -13,7 +13,7 @@ #define F_PREZZO 112 #define F_CAUSRIG 113 #define F_GIAC 114 -#define F_ESPLOSA 120 +#define F_ESPLOSA 115 #define F_UMFC 121 // colonne non visibili dello Sheet diff --git a/mg/mg1100a.uml b/mg/mg1100a.uml index 94720b0be..1430c6698 100755 --- a/mg/mg1100a.uml +++ b/mg/mg1100a.uml @@ -234,15 +234,17 @@ BEGIN CHECKTYPE REQUIRED WARNING "Indicare la quantità" GROUP G_NOAUTO + MESSAGE CHECK,F_VALORE END NUMBER F_PREZZO 18 3 BEGIN PROMPT 2 14 "Prezzo " FIELD PREZZO + MESSAGE CHECK,F_VALORE END -NUMBER F_VALORE 15 5 +NUMBER F_VALORE 18 3 BEGIN FLAGS "D" PROMPT 42 14 "Valore totale " diff --git a/mg/mg1200.cpp b/mg/mg1200.cpp index 9aaafd10e..617f167c7 100755 --- a/mg/mg1200.cpp +++ b/mg/mg1200.cpp @@ -1,11 +1,5 @@ #include -#include -#include -#include -#include -#include -#include -#include + #include "mg1200.h" #include "mglib.h" #include "..\cg\cglib01.h" @@ -54,7 +48,6 @@ bool TMask_buildmov::handle_annoes(TMask_field &fld, KEY k) class TApp_rebuildbalances: public TSkeleton_application { - TArray * used_files; TRelation * _rel; // relazione TCursor * _cur; // cursore TString16 _annoes; @@ -62,7 +55,6 @@ class TApp_rebuildbalances: public TSkeleton_application { protected: virtual bool create(); - virtual bool destroy(); virtual void main_loop(); public: @@ -74,30 +66,15 @@ public: //inline TApp_rebuildbalances& app() { return (TApp_rebuildbalances&) main_app(); } - bool TApp_rebuildbalances::create() { open_files(LF_ANAMAG,LF_UMART,LF_MAG,LF_MOVMAG,LF_RMOVMAG,LF_TABCOM,LF_STOMAG,0); - TSkeleton_application::create(); - return TRUE; + return TSkeleton_application::create(); } -bool TApp_rebuildbalances::destroy() -{ - delete used_files; - TSkeleton_application::destroy(); - return TRUE; -} void TApp_rebuildbalances::main_loop() { - /*if (argc()>2) - _annoes=argv(2); - else - fatal_box("Manca l'indicazione dell'esercizio da ricostruire"); - if (argc()>3) - _reset_giac=(TString(argv(3)).upper()=="RESET");*/ - TMask_buildmov m; while (m.run()==K_ENTER) { diff --git a/mg/mg1400.cpp b/mg/mg1400.cpp index 87e996a76..cd549ecc2 100755 --- a/mg/mg1400.cpp +++ b/mg/mg1400.cpp @@ -1,12 +1,14 @@ // mg1400.cpp : Chiusura/Apertura esercizi di magazzino #include +#include #include -#include -#include #include #include +#include + #include "mglib.h" #include "..\cg\cglib01.h" +#include "..\ve\veconf.h" #include "mg1400.h" #include "movmag.h" @@ -25,9 +27,17 @@ class TMask_openclose: public TMask { bool ordaut; TEsercizi_contabili esercizi; + + bool _gestione_listini; + bool _gestione_condv; + +protected: static bool handle_close(TMask_field &, KEY); static bool handle_open(TMask_field &, KEY); + static void common_handler(TMask_field &); static bool handle_what(TMask_field &, KEY); + static bool handle_val(TMask_field &, KEY); + public: TEsercizi_contabili& exercise() { return (TEsercizi_contabili&) esercizi; } TMask_openclose(const bool ord) ; @@ -43,6 +53,11 @@ TMask_openclose::TMask_openclose(const bool ord) set_handler(F_DATECLOSE, handle_close); set_handler(F_DATEOPEN, handle_open); set_handler(F_WHAT, handle_what); + set_handler(F_VALORIZZAZIONE, handle_val); + + TConfig cfg(CONFIG_DITTA, "ve"); + _gestione_listini = cfg.get_bool("GES", NULL, A_LISTINI); + _gestione_condv = _gestione_listini && cfg.get_bool("GESLISCV"); } bool TMask_openclose::handle_close(TMask_field &fld, KEY k) @@ -59,8 +74,8 @@ bool TMask_openclose::handle_close(TMask_field &fld, KEY k) return fld.error_box("La data indicata non appartiene a nessun esercizio."); if (k == K_ENTER && ex.esercizio(es_close).chiusura_mag() != TDate(NULLDATE)) - return fld.error_box("L'esercizio risulta gia' chiuso. Selezionare" - " un altro esercizio o togliere il flag di chiusura."); + return fld.error_box("L'esercizio %d risulta gia' chiuso. Selezionare" + " un altro esercizio o togliere la data di chiusura.", es_close); else { int pred = ex.pred(es_close); @@ -97,22 +112,42 @@ bool TMask_openclose::handle_open(TMask_field &fld, KEY k) return TRUE; } -bool TMask_openclose::handle_what(TMask_field &fld, KEY k) +void TMask_openclose::common_handler(TMask_field &fld) { - if (k == K_SPACE) + TMask_openclose& mask = (TMask_openclose&)fld.mask(); + const action w = (action) mask.get_int(F_WHAT); + const TTipo_valorizz t = (TTipo_valorizz) mask.get_int(F_VALORIZZAZIONE); + const bool eb = w == definitiva && t >= valorizz_FIFOa; + if (w == provvisoria) // Se oper. provv. disabilita tutte le causali { - TMask_openclose& mask = (TMask_openclose&)fld.mask(); - const int x = atoi(fld.get()); - const action w = (action) x; - mask.enable(-4, w == definitiva); // Se oper. provv. disabilita tutte le causali + mask.disable(-6); + mask.reset(-6); + } + else + { + mask.enable(-5, eb); + mask.enable(-4, !eb); // Le causali degli ordini sono abilitate solo se NON c'e' il modulo ordini if (mask.ordaut) mask.disable(-1); + if (eb) + mask.reset(-4); + else + mask.reset(-5); + } + if (mask.field(F_LIST).shown()) + { + mask.enable(F_LIST, mask._gestione_listini); + mask.enable(F_CATVEN, mask._gestione_condv); } - return TRUE; } - +bool TMask_openclose::handle_what(TMask_field &fld, KEY k) +{ + if (k == K_SPACE) + common_handler(fld); + return TRUE; +} // Corrispondenza elementi di _movimenti: #define CAUS_A_RIMIN 0 // movimento con causale di rimanenze iniziali #define CAUS_A_INCL 1 // " " " In conto lav. @@ -121,10 +156,11 @@ bool TMask_openclose::handle_what(TMask_field &fld, KEY k) #define CAUS_A_INPRC 4 // " " " In prod. comp. #define CAUS_A_ORDF 5 // " " " Ordinato fornitori #define CAUS_A_ORDC 6 // " " " Ordinato clienti -// elemento 7 e successivi: tutte le righe in eccesso a MAX_ROWS - - - +#define CAUS_A_QTA 7 // " " " Movimentazione solo quantità +#define CAUS_A_VAL 8 // " " " Movimentazione solo valore +// Elemento 9 e successivi: tutte le righe in eccesso a MAX_ROWS +// CAUS_A_QTA e CAUS_A_VAL vengono utilizzate solo se la chiusura è definitiva e la +// valorizzazione impostata è FIFO/LIFO class TApp_openclose : public TSkeleton_application { @@ -200,6 +236,9 @@ void TApp_openclose::compila_movimento(TMov_mag& currmov, TArticolo_giacenza& ar head.put(MOVMAG_CODCAUS, _causali.row(caus)); } + // Currency delle mie brame... + TCurrency currency(ZERO, "_FIRM"); + // Aggiunge una nuova riga al movimento corrente TString codmagdep(rec.get(MAG_CODMAG)); TString codmag(codmagdep);codmag.cut(3); @@ -211,52 +250,64 @@ void TApp_openclose::compila_movimento(TMov_mag& currmov, TArticolo_giacenza& ar switch (caus) { case CAUS_A_RIMIN: // Rimanenze iniziali + case CAUS_A_QTA: // Movimentazione solo quantità + case CAUS_A_VAL: // Movimentazione solo valore { qta = rec.get_real(MAG_GIAC) + rec.get_real(MAG_ACL) - rec.get_real(MAG_INCL); // ??corretta da AcL, IncL e InProdF ?? if (!_valorizza_comp) qta += rec.get_real(MAG_PRODFIN)-rec.get_real(MAG_PRODCOMP); - switch (_calctype) + if (caus != CAUS_A_QTA) { - case valorizz_costmediopond: - val = art.costo_mediopond(_es_to_close, codmag, livello); - break; - case valorizz_costmedio: - val = art.costo_medio(_es_to_close, codmag, livello); - break; - case valorizz_ultcos: - val = art.ultimo_costo(_es_to_close); - break; - case valorizz_mediacos: - val = art.media_costi(_es_to_close); - break; - case valorizz_przlist: - val = art.prezzo_listino(_es_to_close, _catven, _codlis); - break; - case valorizz_coststd: - val = art.costo_standard(_es_to_close); - break; - case valorizz_LIFOa: - val = art.LIFO_annuale(_es_to_close, codmag, livello); - break; - case valorizz_FIFOa: - val = art.FIFO_annuale(_es_to_close, codmag, livello); - break; - case valorizz_LIFO: - val = art.LIFO(_es_to_close, codmag, livello); - break; - case valorizz_FIFO: - val = art.FIFO(_es_to_close, codmag, livello); - break; - case valorizz_LIFOr: - val = art.LIFO_ragionieristico(_es_to_close, codmag, livello); - break; - case valorizz_FIFOr: - val = art.FIFO_ragionieristico(_es_to_close, codmag, livello); - break; - default: - break; + switch (_calctype) + { + case valorizz_costmediopond: + val = art.costo_mediopond(_es_to_close, codmag, livello); + break; + case valorizz_costmedio: + val = art.costo_medio(_es_to_close, codmag, livello); + break; + case valorizz_ultcos: + val = art.ultimo_costo(_es_to_close); + break; + case valorizz_mediacos: + val = art.media_costi(_es_to_close); + break; + case valorizz_przlist: + val = art.prezzo_listino(_es_to_close, _catven, _codlis); + break; + case valorizz_coststd: + val = art.costo_standard(_es_to_close); + break; + case valorizz_LIFOa: + val = art.LIFO_annuale(_es_to_close, codmag, livello); + break; + case valorizz_FIFOa: + val = art.FIFO_annuale(_es_to_close, codmag, livello); + break; + case valorizz_LIFO: + val = art.LIFO(_es_to_close, codmag, livello); + break; + case valorizz_FIFO: + val = art.FIFO(_es_to_close, codmag, livello); + break; + case valorizz_LIFOr: + val = art.LIFO_ragionieristico(_es_to_close, codmag, livello); + break; + case valorizz_FIFOr: + val = art.FIFO_ragionieristico(_es_to_close, codmag, livello); + break; + default: + break; + } } - prezzo = val/qta; + if (caus == CAUS_A_RIMIN) + prezzo = val; + else + if (caus == CAUS_A_VAL) + { + prezzo = val * qta; + qta = ZERO; + }// Per CAUS_A_QTA prezzo rimane a ZERO } break; case CAUS_A_INCL: // In conto lav. @@ -296,7 +347,11 @@ void TApp_openclose::compila_movimento(TMov_mag& currmov, TArticolo_giacenza& ar riga.put(RMOVMAG_LIVGIAC, livello); // La causale di riga va messa solo se e' diversa da quella di testata! riga.put(RMOVMAG_QUANT, qta); - riga.put(RMOVMAG_PREZZO, prezzo); + + // Setta il prezzo al nr di decimali impostati per la valuta corrente + currency.set_price(caus == CAUS_A_VAL ? FALSE : TRUE); // Se mov. solo valore (FIFO/LIFO) i decimali devono essere per gl'importi + currency.set_num(prezzo); + riga.put(RMOVMAG_PREZZO, currency.string()); } } @@ -313,7 +368,6 @@ void TApp_openclose::chiudi_esercizio() int err = NOERR; TTable esc("ESC"); - rebuild_balances(_es_to_close); // Cosi' ci assicuriamo che i saldi dell'esercizio vecchio siano a posto descr1.format(_what == definitiva ? "Apertura esercizio %s" : "Aggiornamento saldi esercizio %s", (const char*) _es_to_open); descr2 << descr1 << " in corso..."; @@ -324,11 +378,10 @@ void TApp_openclose::chiudi_esercizio() _movmag->last(); long numreg = _movmag->get_long(MOVMAG_NUMREG) +1; // Indici per i movimenti. Crea i movimenti di base (uno per ogni causale) - int indici[7], last = 6; + int indici[9], last = 8; if (_what == definitiva) { - - for (int j=0; j < 7; j++) + for (int j = 0; j < 9; j++) { _movimenti.add(new TMov_mag); TRectype& h = ((TMov_mag&) _movimenti[j]).head(); @@ -338,14 +391,18 @@ void TApp_openclose::chiudi_esercizio() } const long max_art = cur.items(); - TProgind *prog = new TProgind(max_art, descr2, FALSE, TRUE, 10); + cur.freeze(); + TProgind *prog = new TProgind(max_art, descr2, FALSE, TRUE); // Ciclo per i fottuti articoli - for (cur = 0L; cur.ok(); cur +=1) + for (cur = 0L; cur.pos() < max_art; ++cur) { // Scorre i saldi del vecchio esercizio per questo TArticolo_giacenza - // compilando un array di almeno 7 TMov_mag - // Almeno 7 perche' 7 sono le causali; fissiamo il limite di righe per movimento a 500 (MAXROWS) + // compilando un array di almeno 9 TMov_mag + // Almeno 9 perche' 9 sono le causali; fissiamo il limite di righe per movimento a 500 (MAXROWS) // quindi i movimenti possono essere di piu'. + // Caso particolare da notare: nel caso di valorizzazione LIFO/FIFO in realtà i movimenti + // Sono sempre e solo 2, uno movimenta solo la qta ed uno solo il valore, in modo da far + // tornare i cosiddetti conti // I saldi per questo articolo TArticolo_giacenza& art = (TArticolo_giacenza&)cur.curr(); @@ -355,7 +412,7 @@ void TApp_openclose::chiudi_esercizio() for (int r = lastrow; r > 0; r = rec_arr.pred_row(r)) { TRectype& rec = rec_arr[r]; - for (int i = 0; i < 7; i++) + for (int i = 0; i < 9; i++) { if (_causali.row(i).empty()) continue; // Salta eventuali causali vuote @@ -381,7 +438,7 @@ void TApp_openclose::chiudi_esercizio() // ************** // Effettua la scrittura dei movimenti di apertura generati const int max_mov = _movimenti.items(); - prog = new TProgind(max_mov, "Scrittura movimenti di apertura in corso...",FALSE,TRUE,10); + prog = new TProgind(max_mov, "Scrittura movimenti di apertura in corso...",FALSE,TRUE); for (int i=0; err == NOERR && iaddstatus(1L); @@ -455,7 +512,7 @@ void TApp_openclose::main_loop() _valorizza_comp= _msk->get(F_VALCOMP)=="C"; //Valorizza i componenti o i finiti _codlis = _msk->get(F_LIST); _catven = _msk->get(F_CATVEN); - for (short xx = F_CAURIM; xx <= F_CAUORC; xx++) // legge le causali impostate + for (short xx = F_CAURIM; xx <= F_CAUVAL; xx++) // legge le causali impostate _causali.add(_msk->get(xx)); chiudi_esercizio(); // Chiusura esercizio } diff --git a/mg/mg1400.h b/mg/mg1400.h index 6e84e3d66..3d0e3b09d 100755 --- a/mg/mg1400.h +++ b/mg/mg1400.h @@ -11,8 +11,10 @@ #define F_CAUPRC 111 #define F_CAUORF 112 #define F_CAUORC 113 -#define F_CATVEN 114 -#define F_LIST 115 -#define F_WHAT 116 -#define F_VALCOMP 117 +#define F_CAUQTA 114 +#define F_CAUVAL 115 +#define F_CATVEN 116 +#define F_LIST 117 +#define F_WHAT 118 +#define F_VALORCOMP 119 diff --git a/mg/mg1400.uml b/mg/mg1400.uml index fdfe3c61f..e4f155949 100755 --- a/mg/mg1400.uml +++ b/mg/mg1400.uml @@ -31,19 +31,19 @@ BEGIN FLAGS "DRZ" END -LISTBOX F_VALORIZZAZIONE 30 +LISTBOX F_VALORIZZAZIONE 27 BEGIN - PROMPT 2 5 "Valorizzazione " + PROMPT 2 5 "Valorizzazione " ITEM "5|Al costo medio ponderato" MESSAGE HIDE,2@|ENABLE,3@ ITEM "4|Al costo medio acquisti" MESSAGE HIDE,2@|ENABLE,3@ ITEM "0|All'ultimo costo" MESSAGE HIDE,2@|ENABLE,3@ ITEM "1|Alla media dei costi" MESSAGE HIDE,2@|ENABLE,3@ ITEM "2|Al prezzo di listino" MESSAGE SHOW,2@|ENABLE,3@ ITEM "3|Al costo standard" MESSAGE HIDE,2@|ENABLE,3@ - ITEM "6|L.I.F.O. annuale" MESSAGE HIDE,2@|DISABLE,3@|COPY,F_STOMET - ITEM "7|F.I.F.O. annuale" MESSAGE HIDE,2@|DISABLE,3@|COPY,F_STOMET - ITEM "8|L.I.F.O. storico" MESSAGE HIDE,2@|DISABLE,3@|COPY,F_STOMET - ITEM "9|F.I.F.O. storico" MESSAGE HIDE,2@|DISABLE,3@|COPY,F_STOMET + ITEM "7|L.I.F.O. annuale" MESSAGE HIDE,2@|DISABLE,3@|COPY,F_STOMET + ITEM "6|F.I.F.O. annuale" MESSAGE HIDE,2@|DISABLE,3@|COPY,F_STOMET + ITEM "9|L.I.F.O. storico" MESSAGE HIDE,2@|DISABLE,3@|COPY,F_STOMET + ITEM "8|F.I.F.O. storico" MESSAGE HIDE,2@|DISABLE,3@|COPY,F_STOMET /* TBI LIFO/FIFO ragionieristico ITEM "9|L.I.F.O. ragionieristico" MESSAGE HIDE,2@|DISABLE,3@|COPY,F_STOMET @@ -51,12 +51,12 @@ BEGIN */ END -LISTBOX F_STOMET 30 +LISTBOX F_STOMET 27 BEGIN - PROMPT 2 6 "Storico " - ITEM "5|L.I.F.O. annuale" + PROMPT 2 6 "Storico " + ITEM "7|L.I.F.O. annuale" ITEM "6|F.I.F.O. annuale" - ITEM "7|L.I.F.O. storico" + ITEM "9|L.I.F.O. storico" ITEM "8|F.I.F.O. storico" /* TBI LIFO/FIFO ragionieristico @@ -104,7 +104,7 @@ BEGIN GROUP 2 END -GROUPBOX DLG_NULL 70 6 +GROUPBOX DLG_NULL 70 7 BEGIN PROMPT 2 7 "Causali d'apertura " END @@ -121,7 +121,7 @@ BEGIN CHECKTYPE REQUIRED WARNING "La causale deve avere i segni: GIAC+ RIMIN+" ADD RUN MG0 -0 %CAU - GROUP 4 + GROUP 4 6 END STRING F_CAUICL 5 @@ -136,7 +136,7 @@ BEGIN CHECKTYPE REQUIRED WARNING "La causale deve avere i segni: GIAC+, INCL+" ADD RUN MG0 -0 %CAU - GROUP 4 + GROUP 4 6 END STRING F_CAUACL 5 @@ -151,7 +151,7 @@ BEGIN CHECKTYPE REQUIRED WARNING "La causale deve avere i segni: GIAC-, ACL+" ADD RUN MG0 -0 %CAU - GROUP 4 + GROUP 4 6 END STRING F_CAUPRF 5 @@ -165,7 +165,7 @@ BEGIN OUTPUT F_CAUPRF CODTAB CHECKTYPE REQUIRED WARNING "La causale deve avere i segni: GIAC-, PRODF+" - GROUP 4 + GROUP 4 6 ADD RUN MG0 -0 %CAU END @@ -180,7 +180,7 @@ BEGIN OUTPUT F_CAUPRC CODTAB CHECKTYPE REQUIRED WARNING "La causale deve avere i segni: GIAC+, PRODC+" - GROUP 4 + GROUP 4 6 ADD RUN MG0 -0 %CAU END @@ -195,7 +195,7 @@ BEGIN OUTPUT F_CAUORF CODTAB CHECKTYPE REQUIRED WARNING "La causale deve avere il segno: ORDF+" - GROUP 1 4 + GROUP 1 4 6 ADD RUN MG0 -0 %CAU END @@ -210,13 +210,45 @@ BEGIN OUTPUT F_CAUORC CODTAB CHECKTYPE REQUIRED WARNING "La causale deve avere il segno: ORDC+" - GROUP 1 4 + GROUP 1 4 6 ADD RUN MG0 -0 %CAU END -LIST F_VALCOMP 40 +STRING F_CAUQTA 5 BEGIN - PROMPT 3 13 "Valorizzo " + PROMPT 3 12 "Movimentazione qta " + FLAGS "U" + USE %CAU SELECT (B0 == "X") + INPUT CODTAB F_CAUQTA + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CAUQTA CODTAB + CHECKTYPE REQUIRED + WARNING "La causale deve avere il flag di movimentazione quantità" + GROUP 5 6 + FLAGS "D" + ADD RUN MG0 -0 %CAU +END + +STRING F_CAUVAL 5 +BEGIN + PROMPT 43 12 "Movimentazione val " + FLAGS "U" + USE %CAU SELECT (B1 == "X") + INPUT CODTAB F_CAUVAL + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CAUVAL CODTAB + CHECKTYPE REQUIRED + WARNING "La causale deve avere il flag di movimentazione valore" + GROUP 5 6 + FLAGS "D" + ADD RUN MG0 -0 %CAU +END + +LIST F_VALORCOMP 40 +BEGIN + PROMPT 3 14 "Valorizzo " ITEM "C|i componenti impegnati in produzione" ITEM "F|i finiti in fase di produzione" GROUP 4 diff --git a/mg/mg3.cpp b/mg/mg3.cpp index 4dbfc3148..72dc2bf6f 100755 --- a/mg/mg3.cpp +++ b/mg/mg3.cpp @@ -1,31 +1,26 @@ #include -#include + // ****************************** // Gestione stampe di magazzino (anagrafica giacenze,storico,schede, disponibilita) #include "mg3.h" -#define usage "Error - usage : %s -{0|1|2|3|4}" - int main(int argc, char** argv) { - int rt = -1; - const int r = (argc > 1) ? atoi(&argv[1][1]) : -1; + const int r = (argc > 1) ? argv[1][1]-'0' : 0; switch (r) { - case 0: - rt = mg3100(argc,argv) ; break; // stampa dati storici, giac e prezzi case 1: - rt = mg3200(argc,argv) ; break; // stampa disponibilità .... + mg3200(argc,argv) ; break; // stampa disponibilità .... case 2: - rt = mg3300(argc,argv) ; break; // stampa schede di magazzino + mg3300(argc,argv) ; break; // stampa schede di magazzino case 3: - rt = mg3400(argc,argv) ; break; // stampa + mg3400(argc,argv) ; break; // stampa case 4: - rt = mg3500(argc,argv) ; break; // stampa storico rimanenze + mg3500(argc,argv) ; break; // stampa storico rimanenze default: - error_box(usage, argv[0]) ; break; + mg3100(argc,argv) ; break; // stampa dati storici, giac e prezzi } - - return rt ; + exit(0); + return 0; } diff --git a/mg/mg3100.cpp b/mg/mg3100.cpp index 15afd145d..2d93e8a26 100755 --- a/mg/mg3100.cpp +++ b/mg/mg3100.cpp @@ -27,8 +27,8 @@ bool TForm_giacprezzi::validate(TForm_item &cf, TToken_string &s) subcode=s.get(); if (subcode=="PREZZO") { TString codart(relation()->lfile(LF_ANAMAG).get("CODART")); - if (listino->ricerca(codart,0.0)) - cf.set(listino->get_prezzo().string()); + const bool found = listino->ricerca(codart, ZERO); + cf.set(found ? listino->get_prezzo().string() : ""); return TRUE; } } @@ -61,6 +61,7 @@ class TStampadatist_mask: public TStampemg_mask static bool handle_ragg(TMask_field &fld, KEY k); // handler static bool handle_liv(TMask_field &fld, KEY k); // handler static bool handle_subord(TMask_field &fld, KEY k); // handler + static bool handle_filt(TMask_field &fld, KEY k); // handler public: TStampadatist_mask(); virtual ~TStampadatist_mask(){}; @@ -80,6 +81,7 @@ TStampadatist_mask::TStampadatist_mask(): set_handler(F_TOLIVELLOGIAC, handle_liv); set_handler(F_ORDINE, handle_ragg); set_handler(F_ORDINEART,handle_subord); + set_handler(F_FILTRO,handle_filt); if (!artlev().enabled()) { TMask_field &f1=field(F_RAGGCODICE); f1.reset(); f1.check();f1.hide(); @@ -92,7 +94,36 @@ TStampadatist_mask::TStampadatist_mask(): field(F_FROMLIVELLOGIAC).hide(); field(F_TOLIVELLOGIAC).hide(); } +} +bool TStampadatist_mask::handle_filt(TMask_field &fld, KEY k) +{ + if (k == K_SPACE) + { + const bool articles = fld.mask().get(F_ORDINE)=="A"; + if (articles) + { + TMask& m = fld.mask(); + switch (fld.get()[0]) + { + case '0': + case 'P': + case 'N': + case 'S': + m.show(F_ORDINEMAG); + m.hide(F_ORDINEART); + m.send_key(K_SPACE, F_ORDINEMAG); + break; + case 'T': + m.show(F_ORDINEART); + m.hide(F_ORDINEMAG); + m.send_key(K_SPACE, F_ORDINEART); + default: + break; + } + } + } + return TRUE; } bool TStampadatist_mask::handle_subord(TMask_field &fld, KEY k) @@ -199,13 +230,11 @@ bool TStampadatist_mask::handle_ragg(TMask_field &fld, KEY k) // STAMPA anagrafiche class TStampa_datistorici : public TSkeleton_application { - TArray _file; TStampadatist_mask * _mask; TCursor * _cur; TForm_giacprezzi * _form; // to be moved into TPrint_application protected: - void open_files(int logicnum, ...); virtual bool create(); virtual bool destroy(); virtual void main_loop(); @@ -213,6 +242,7 @@ protected: void setprint_permagazzini(); void setprint_perarticoli(); + void setprint_perarticoli_all(); public: TStampa_datistorici() {} @@ -223,24 +253,10 @@ void TStampa_datistorici ::on_firm_change() _mask->enable_livellicodice(); } -void TStampa_datistorici::open_files(int logicnum, ...) -{ - va_list marker; - va_start(marker, logicnum); - while (logicnum > 0) - { - CHECKD(_file.objptr(logicnum) == NULL, "File gia' aperto: ", logicnum); - _file.add(new TLocalisamfile(logicnum), logicnum); - logicnum = va_arg(marker, int); - } -} - - - bool TStampa_datistorici::create() { _mask = new TStampadatist_mask(); - open_files(LF_ANAMAG,LF_MAG,LF_TAB,LF_TABCOM,0); + open_files(LF_ANAMAG,LF_MAG,LF_TAB,LF_TABCOM,LF_UMART, 0); return TSkeleton_application::create(); } @@ -252,7 +268,6 @@ bool TStampa_datistorici::destroy() void TStampa_datistorici::setprint_permagazzini() { - char subordine=*_mask->get(F_ORDINEART); TRectype darec(LF_MAG),arec(LF_MAG); TString cfilter,sortexp,joinexp; _form = new TForm_giacprezzi("mg3100b", ""); @@ -341,15 +356,136 @@ void TStampa_datistorici::setprint_permagazzini() } rangem.set(srangem.empty() ? "Tutti i magazzini" : format("Magazzini %s", (const char *)srangem)); darec.put("ANNOES",_mask->get(F_ANNOES)); - darec.put("CODMAG",_mask->get(F_DAMAG)); arec.put("ANNOES",_mask->get(F_ANNOES)); - arec.put("CODMAG",_mask->get(F_AMAG)); _cur->setfilter(cfilter); _cur->setregion(darec,arec); } -// ORDINAMENTO void TStampa_datistorici::setprint_perarticoli() +{ + char subordine=*_mask->get(F_ORDINEMAG); + TRectype darec(LF_MAG),arec(LF_MAG); + TString filter; + char filtro_articoli=*_mask->get(F_FILTRO); + _form = new TForm_giacprezzi("mg3100a", ""); + + // ******************** + // range di stampa magazzini + TString srangem; + TForm_item & rangem=_form->find_field('H',odd_page,FF_RANGEMAGAZ); + _cur = _form->cursor(); + if (*_mask->get(F_DAMAG)) + srangem << "da \"" << _mask->get(F_DAMAG) << "\" "; + if (*_mask->get(F_AMAG)) + srangem << "fino a \"" << _mask->get(F_AMAG) << "\""; + + rangem.set(srangem.blank()? "Tutti i magazzini" : format("Magazzini %s",(const char *)srangem)); + + // ******************** + // filtro giacenze + TForm_item & it_filtro=_form->find_field('H',odd_page,FF_FILTRO); + switch (filtro_articoli) { + case '0': // non nulli + filter << "(STR(" << LF_MAG << "->GIAC!=\"0\"))&&"; + it_filtro.set("non nulle"); + break; + case 'P': // positivi + filter << "(STR(" << LF_MAG << "->GIAC>\"0\"))&&"; + it_filtro.set("positive"); + break; + case 'N': // negativi + filter << "(STR(" << LF_MAG << "->GIAC<\"0\"))&&"; + it_filtro.set("negative"); + break; + case 'S': // sottoscorta + filter << "(STR("<< LF_MAG << "->GIAC < " <SCORTAMIN))&&"; + it_filtro.set("sottoscorta"); + break; + } + if (_mask->get(F_DAART).not_empty()) + filter << "(CODART>=\"" << _mask->get(F_DAART) << "\")&&"; + if (_mask->get(F_AART).not_empty()) + filter << "(CODART<=\"" << _mask->get(F_AART) << "\")&&"; + + if (filter.not_empty()) + filter.rtrim(2); + + // ****************** + // sotto-ordinamenti e range di stampa articoli + TString srangea,srangecm,espr; + TForm_item & rangecm=_form->find_field('H',odd_page,FF_RANGECATMER); + TForm_item & rangea=_form->find_field('H',odd_page,FF_RANGEARTIC); + if (!_mask->get(F_DAART).blank()) + srangea << "da \"" << _mask->get(F_DAART) << "\" "; + if (!_mask->get(F_AART).blank()) + srangea << "fino a \"" << _mask->get(F_AART) << "\""; + rangea.set(srangea.empty() ? "Tutti gli articoli" : format("Articoli %s", (const char *)srangea)); + switch (subordine) + { + case 'C': + case 'D': + _form->find_field('B',odd_page,"H_CATMER").hide(); + _form->find_field('B',odd_page,"TOT_CATMER").hide(); + _form->set_ordering(normale); + break; + case 'M': + _form->find_field('B',odd_page,"H_CATMER").show(); + _form->find_field('B',odd_page,"TOT_CATMER").show(); + _form->set_ordering(cat_merc); + espr.format("%d->GRMERC[1,3]", LF_ANAMAG); + _form->find_field('B',odd_page,"GRUPPI_CATMER").setcondition(espr,_strexpr); + + if (!_mask->get(F_DACATMER).blank()) + { + srangecm << "da \"" << _mask->get(F_DACATMER) << "\" "; + filter << "&&(" << LF_ANAMAG << "->GRMERC[1,3]>=\"" << _mask->get(F_DACATMER) << "\")"; + } + if (!_mask->get(F_ACATMER).blank()) + { + srangecm << "fino a \"" << _mask->get(F_ACATMER) << "\""; + filter << "&&(" << LF_ANAMAG << "->GRMERC[1,3]<=\"" << _mask->get(F_ACATMER) << "\")"; + } + rangecm.set(srangecm.empty() ? "Tutte le categorie merceologiche" : format("Categorie merc. %s", (const char *)srangecm)); + break; + } + + _form->setdett_perart( + _mask->get_bool(F_RAGGCODICE), + _mask->get_int(F_FROMLIVELLOART), + _mask->get_int(F_TOLIVELLOART), + _mask->get_bool(F_RAGGLIVGIAC), + _mask->get_int(F_FROMLIVELLOGIAC), + _mask->get_int(F_TOLIVELLOGIAC), + _mask->get_bool(F_TOTALIMAGAZZINI), + _mask->get_bool(F_DETTAGLIOMAG)); + + TString16 ena=((_mask->get_bool(F_STAMPAGIAC) && *_mask->get(F_FILTRO)!='S')? "1": "0"); + _form->find_field('H',odd_page,FF_FLAGGIAC).set(ena ); + _form->find_field('B',odd_page,FF_FLAGGIAC).set(ena); + ena=((_mask->get_bool(F_STAMPAGIAC) && *_mask->get(F_FILTRO)=='S')? "1": "0") ; + _form->find_field('H',odd_page,FF_FLAGSOTTOS).set(ena); + _form->find_field('B',odd_page,FF_FLAGSOTTOS).set(ena); + _form->find_field('H',odd_page,FF_PREZZIVALORI).set(_mask->get(F_PREZZIVALORI)); + _form->find_field('B',odd_page,FF_PREZZIVALORI).set(_mask->get(F_PREZZIVALORI)); + + ena=_mask->get_bool(F_VALMEDI) ? "1": "0"; + _form->find_field('H',odd_page,FF_FLAGVALMEDI).set(ena); + _form->find_field('B',odd_page,FF_FLAGVALMEDI).set(ena); + + _form->set_codlistino(_mask->get(F_CATVENLISTINO),_mask->get(F_CODLISTINO)); + + darec.put("ANNOES",_mask->get(F_ANNOES)); + darec.put("CODMAG",_mask->get(F_DAMAG)); +// darec.put("CODART",_mask->get(F_DAART)); + arec.put("ANNOES",_mask->get(F_ANNOES)); + arec.put("CODMAG",_mask->get(F_AMAG)); +// arec.put("CODART",_mask->get(F_AART)); + _cur->setregion(darec,arec); + _cur->setfilter(filter, subordine == 'M'); +} + +// ORDINAMENTO +void TStampa_datistorici::setprint_perarticoli_all() { TRectype darec(LF_ANAMAG),arec(LF_ANAMAG); TString cfilter,filter,joinexp; @@ -369,9 +505,10 @@ void TStampa_datistorici::setprint_perarticoli() char filtro_articoli=*_mask->get(F_FILTRO); char subordine=*_mask->get(F_ORDINEART); - _form = filtro_articoli == 'T' ? - new TForm_giacprezzi("mg3100aa", "") : - new TForm_giacprezzi("mg3100a", "");; + //_form = filtro_articoli == 'T' ? + // new TForm_giacprezzi("mg3100aa", "") : + // new TForm_giacprezzi("mg3100a", "");; + _form = new TForm_giacprezzi("mg3100aa", ""); // ******************** // range di stampa magazzini TForm_item & rangem=_form->find_field('H',odd_page,FF_RANGEMAGAZ); @@ -425,7 +562,7 @@ void TStampa_datistorici::setprint_perarticoli() arec.put("CODART",_mask->get(F_AART)); _form->find_field('B',odd_page,"H_CATMER").hide(); _form->find_field('B',odd_page,"TOT_CATMER").hide(); - _form->setcatmer(FALSE); + _form->set_ordering(normale); if (!_mask->get(F_DAART).blank()) srangea << "da \"" << _mask->get(F_DAART) << "\" "; if (!_mask->get(F_AART).blank()) @@ -437,7 +574,7 @@ void TStampa_datistorici::setprint_perarticoli() arec.put("DESCR",_mask->get(F_ADES)); _form->find_field('B',odd_page,"H_CATMER").disable(); _form->find_field('B',odd_page,"TOT_CATMER").hide(); - _form->setcatmer(FALSE); + _form->set_ordering(normale); if (!_mask->get(F_DADES).blank()) srangea << "da \"" << _mask->get(F_DADES) << "\" "; if (!_mask->get(F_ADES).blank()) @@ -449,7 +586,7 @@ void TStampa_datistorici::setprint_perarticoli() arec.put("GRMERC",_mask->get(F_ACATMER)); _form->find_field('B',odd_page,"H_CATMER").show(); _form->find_field('B',odd_page,"TOT_CATMER").show(); - _form->setcatmer(TRUE); + _form->set_ordering(cat_merc); if (!_mask->get(F_DAART).blank()) { @@ -498,7 +635,12 @@ void TStampa_datistorici::setprint_perarticoli() joinexp << "ANNOES==" << _mask->get(F_ANNOES) << "|CODART==CODART"; TSortedfile *mag; - mag= new TSortedfile(LF_MAG,NULL,sortexp,filter,1); + // !?!?!! ATTENZIONE : Modifica temporanea + mag= new TSortedfile(LF_MAG,NULL,sortexp,"",1); + // il filtro viene qui settato DOPO la creazione del Sortedfile a causa di una bug + // sulla libreria nei TSorted_file / TCursor + mag->cursor().setfilter(filter); + // FINE MODIFICA ; rimettere il filtro nel costruttore quando il bug sarà risolto _cur->relation()->replace(mag,1,joinexp); if (cfilter.not_empty()) { @@ -516,7 +658,10 @@ void TStampa_datistorici::main_loop() { if (*_mask->get(F_ORDINE)=='A') { - setprint_perarticoli(); + if (*_mask->get(F_FILTRO) == 'T') + setprint_perarticoli_all(); + else + setprint_perarticoli(); } else { setprint_permagazzini(); } diff --git a/mg/mg3100.uml b/mg/mg3100.uml index 35b9c528f..e78208f24 100755 --- a/mg/mg3100.uml +++ b/mg/mg3100.uml @@ -8,6 +8,8 @@ BEGIN MESSAGE SHOW,G_PARAMVALORI@ |HIDE,G_LISTINO@ ITEM "P|Costi e prezzi" MESSAGE RESET,F_STAMPAGIAC|HIDE,G_PARAMVALORI@|SHOW,G_LISTINO@ + ITEM "L|Solo prezzi" + MESSAGE RESET,F_STAMPAGIAC|HIDE,G_PARAMVALORI@|SHOW,G_LISTINO@ END BOOL F_VALMEDI @@ -52,26 +54,36 @@ END LISTBOX F_ORDINE 10 BEGIN PROMPT 2 2 "Ordinamento " - ITEM "A|articoli" - MESSAGE ENABLE,F_ORDINEART|HIDE,F_TOTALIDEPOSITI|"X",F_DETTAGLIODEP - MESSAGE SHOW,F_TOTALIMAGAZZINI|SHOW,F_DETTAGLIOMAG - ITEM "M|magazzini" - MESSAGE "C",F_ORDINEART|K_SPACE,F_ORDINEART|DISABLE,F_ORDINEART|SHOW,G_CODART@|HIDE,G_DESART@ + ITEM "A|articoli" + MESSAGE " ", F_FILTRO|SHOW,F_ORDINEART|ENABLE,F_ORDINEART|HIDE,F_TOTALIDEPOSITI|"X",F_DETTAGLIODEP + MESSAGE SHOW,F_TOTALIMAGAZZINI|SHOW,F_DETTAGLIOMAG + ITEM "M|magazzini" + MESSAGE " ", F_FILTRO|"C",F_ORDINEART|K_SPACE,F_ORDINEART|SHOW,F_ORDINEART|DISABLE,F_ORDINEART|HIDE,F_ORDINEMAG|SHOW,G_CODART@|HIDE,G_DESART@ MESSAGE SHOW,F_TOTALIDEPOSITI|"X",F_DETTAGLIODEP - MESSAGE HIDE,F_TOTALIMAGAZZINI|HIDE,F_DETTAGLIOMAG + MESSAGE HIDE,F_TOTALIMAGAZZINI|HIDE,F_DETTAGLIOMAG END LISTBOX F_ORDINEART 20 BEGIN - FLAGS "G" + FLAGS "G" PROMPT 34 2 "Sotto-ordinamento " - ITEM "C|codice" - MESSAGE HIDE,G_CATMER@|ENABLE,G_CODART@|HIDE,G_DESART@ - ITEM "D|descrizione" - MESSAGE HIDE,G_CATMER@|DISABLE,G_CODART@|SHOW,G_DESART@ - ITEM "M|gruppo merc./codice" - MESSAGE SHOW,G_CATMER@|ENABLE,G_CODART@|HIDE,G_DESART@ + ITEM "C|codice" + MESSAGE HIDE,G_CATMER@|ENABLE,G_CODART@|HIDE,G_DESART@ + ITEM "D|descrizione" + MESSAGE HIDE,G_CATMER@|DISABLE,G_CODART@|SHOW,G_DESART@ + ITEM "M|gruppo merc./codice" + MESSAGE SHOW,G_CATMER@|ENABLE,G_CODART@|HIDE,G_DESART@ +END + +LISTBOX F_ORDINEMAG 20 +BEGIN + FLAGS "G" + PROMPT 34 2 "Sotto-ordinamento " + ITEM "C|codice" + MESSAGE HIDE,G_CATMER@|ENABLE,G_CODART@|HIDE,G_DESART@ + ITEM "M|gruppo merc./codice" + MESSAGE SHOW,G_CATMER@|ENABLE,G_CODART@|HIDE,G_DESART@ END NUMBER F_ANNOES 4 @@ -90,61 +102,61 @@ END LISTBOX F_FILTRO 30 BEGIN - FLAGS "G" + FLAGS "G" PROMPT 34 3 "Stampo " ITEM "0|solo giacenze non nulle" ITEM "P|solo giacenze positive" ITEM "N|solo giacenze negativie" ITEM "S|solo articoli sotto scorta" - ITEM "T|tutto" + ITEM "T|tutto" END STRING F_DAART 20 BEGIN PROMPT 2 5 "Dall'articolo " - FLAGS "U" - USE LF_ANAMAG - INPUT CODART F_DAART + FLAGS "U" + USE LF_ANAMAG + INPUT CODART F_DAART DISPLAY "Codice@20" CODART - DISPLAY "Descr@50" DESCR - OUTPUT F_DAART CODART - OUTPUT F_DADES DESCR - GROUP G_CODART + DISPLAY "Descr@50" DESCR + OUTPUT F_DAART CODART + OUTPUT F_DADES DESCR + GROUP G_CODART END STRING F_AART 20 BEGIN PROMPT 2 6 " all'articolo " - FLAGS "U" - COPY USE F_DAART - INPUT CODART F_AART - COPY DISPLAY F_DAART - OUTPUT F_AART CODART - OUTPUT F_ADES DESCR - GROUP G_CODART + FLAGS "U" + COPY USE F_DAART + INPUT CODART F_AART + COPY DISPLAY F_DAART + OUTPUT F_AART CODART + OUTPUT F_ADES DESCR + GROUP G_CODART END STRING F_DADES 50 BEGIN PROMPT 2 5 "Dall'articolo " - FLAGS "U" - USE LF_ANAMAG KEY 2 - INPUT DESCR F_DADES - DISPLAY "Descr@50" DESCR + FLAGS "U" + USE LF_ANAMAG KEY 2 + INPUT DESCR F_DADES + DISPLAY "Descr@50" DESCR DISPLAY "Codice@20" CODART - OUTPUT F_DAART CODART - OUTPUT F_DADES DESCR - GROUP G_DESART + OUTPUT F_DAART CODART + OUTPUT F_DADES DESCR + GROUP G_DESART END STRING F_ADES 50 BEGIN PROMPT 2 6 " all'articolo " - FLAGS "U" - COPY USE F_DADES - INPUT DESCR F_ADES - COPY DISPLAY F_DADES - OUTPUT F_ADES DESCR - OUTPUT F_AART CODART - GROUP G_DESART + FLAGS "U" + COPY USE F_DADES + INPUT DESCR F_ADES + COPY DISPLAY F_DADES + OUTPUT F_ADES DESCR + OUTPUT F_AART CODART + GROUP G_DESART END @@ -152,7 +164,7 @@ STRING F_DAMAG 3 BEGIN PROMPT 2 8 "Dal magazzino " FLAGS "U" - USE MAG SELECT CODTAB[4,5]=="" && CODTAB[1,3]!="" + USE MAG SELECT CODTAB[4,5]=="" INPUT CODTAB F_DAMAG DISPLAY "Codice" CODTAB DISPLAY "Descr@50" S0 @@ -205,16 +217,16 @@ BOOL F_DETTAGLIODEP BEGIN FLAGS "HD" PROMPT 42 13 "Dettaglio i depositi" - MESSAGE TRUE ENABLE,F_RAGGLIVGIAC|ENABLE,F_RAGGCODICE - MESSAGE FALSE CLEAR,F_RAGGLIVGIAC|K_SPACE,F_RAGGLIVGIAC|CLEAR,F_RAGGCODICE|K_SPACE,F_RAGGCODICE + MESSAGE TRUE ENABLE,F_RAGGLIVGIAC|ENABLE,F_RAGGCODICE + MESSAGE FALSE CLEAR,F_RAGGLIVGIAC|K_SPACE,F_RAGGLIVGIAC|CLEAR,F_RAGGCODICE|K_SPACE,F_RAGGCODICE FLAGS "D" END BOOLEAN F_RAGGCODICE BEGIN PROMPT 2 14 "Stampa totali livelli di codice" - MESSAGE FALSE CLEAR,F_FROMLIVELLOART|CLEAR,F_TOLIVELLOART|CHECK,F_TOLIVELLOART - MESSAGE TRUE ENABLE,F_FROMLIVELLOART|ENABLE,F_TOLIVELLOART|CHECK,F_TOLIVELLOART + MESSAGE FALSE CLEAR,F_FROMLIVELLOART|CLEAR,F_TOLIVELLOART|CHECK,F_TOLIVELLOART + MESSAGE TRUE ENABLE,F_FROMLIVELLOART|ENABLE,F_TOLIVELLOART|CHECK,F_TOLIVELLOART END NUMBER F_FROMLIVELLOART 1 @@ -246,7 +258,7 @@ END BOOL F_RAGGLIVGIAC BEGIN - PROMPT 2 15 "Raggruppo le giacenze" + PROMPT 2 15 "Stampa totali livelli di giacenza" MESSAGE FALSE CLEAR,F_FROMLIVELLOGIAC|CLEAR,F_TOLIVELLOGIAC|CHECK,F_TOLIVELLOGIAC MESSAGE TRUE ENABLE,F_FROMLIVELLOGIAC|ENABLE,F_TOLIVELLOGIAC END diff --git a/mg/mg3100a.frm b/mg/mg3100a.frm index 60b34c08b..a4a4a814b 100755 --- a/mg/mg3100a.frm +++ b/mg/mg3100a.frm @@ -1,7 +1,6 @@ #include "mg3frm.h" -USE LF_ANAMAG KEY 1 -SORT LF_MAG BY ANNOES CODART LIVELLO CODMAG - JOIN TO LF_ANAMAG INTO ANNOES==1996 CODART==CODART +USE LF_MAG KEY 2 BY ANNOES CODART LIVELLO CODMAG +JOIN LF_ANAMAG TO LF_MAG INTO CODART==CODART JOIN MAG TO LF_MAG ALIAS 500 INTO CODTAB==CODMAG[1,3] JOIN MAG TO LF_MAG ALIAS 501 INTO CODTAB==CODMAG JOIN GMC TO LF_ANAMAG ALIAS 400 INTO CODTAB==GRMERC[1,3] @@ -95,10 +94,12 @@ END FLAG "H" KEY "PREZZIOVALORI" ITEM "P|0" - MESSAGE ENABLE,FG_RIGAPREZZI@|DISABLE,FG_RIGAVALORI@ + MESSAGE ENABLE,FG_RIGAPREZZI@|ENABLE,FG_RIGACOSTI@|DISABLE,FG_RIGAVALORI@ ITEM "V|1" - MESSAGE DISABLE,FG_RIGAPREZZI@|ENABLE,FG_RIGAVALORI@ - END + MESSAGE DISABLE,FG_RIGAPREZZI@|DISABLE,FG_RIGACOSTI@|ENABLE,FG_RIGAVALORI@ + ITEM "L|2" + MESSAGE ENABLE,FG_RIGAPREZZI@|DISABLE,FG_RIGACOSTI@|DISABLE,FG_RIGAVALORI@ + END LIST FF_FLAGGIAC 1 BEGIN @@ -164,7 +165,7 @@ END BEGIN KEY "H1" PROMPT 74 6 "Ult.costo" - GROUP FG_RIGAPREZZI + GROUP FG_RIGACOSTI END STRINGA 9 12 2 BEGIN @@ -252,9 +253,11 @@ SECTION BODY ODD 0 COLUMNWISE FLAG "H" KEY "PREZZIOVALORI" ITEM "P|0" - MESSAGE ENABLE,FG_RIGAPREZZI@|DISABLE,FG_RIGAVALORI@ + MESSAGE ENABLE,FG_RIGAPREZZI@|ENABLE,FG_RIGACOSTI@|DISABLE,FG_RIGAVALORI@ ITEM "V|1" - MESSAGE DISABLE,FG_RIGAPREZZI@|ENABLE,FG_RIGAVALORI@ + MESSAGE DISABLE,FG_RIGAPREZZI@|DISABLE,FG_RIGACOSTI@|ENABLE,FG_RIGAVALORI@ + ITEM "L|2" + MESSAGE ENABLE,FG_RIGAPREZZI@|DISABLE,FG_RIGACOSTI@|DISABLE,FG_RIGAVALORI@ END LIST FF_FLAGGIAC 1 @@ -313,7 +316,7 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE RESET,15@|_USER,RESET_UM,1553 END - SECTION GRUPPI_CATMER 1 0 0 FILE LF_ANAMAG GROUP GRMERC + SECTION GRUPPI_CATMER 1 0 0 FILE LF_MAG GROUP LF_ANAMAG->GRMERC STRINGA 60 20 1 BEGIN @@ -322,7 +325,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE RESET,14@|_USER,RESET_UM,1453 END - SECTION H_GCODART1 1 1 1 HEADER + SECTION H_GCODART1 1 1 1 GROUP STRINGA 16 20 1 BEGIN KEY "CODICE GRUPPO" @@ -337,7 +340,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART1 1 0 0 FILE LF_ANAMAG GROUP CODART + SECTION GRUPPI_CODART1 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 40 1 BEGIN FLAG "H" @@ -345,7 +348,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE RESET,13@|_USER,RESET_UM,1353 END - SECTION H_GCODART2 1 1 1 HEADER + SECTION H_GCODART2 1 1 1 GROUP STRINGA 16 20 1 BEGIN KEY "CODICE GRUPPO" @@ -360,7 +363,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART2 1 0 0 FILE LF_ANAMAG GROUP CODART + SECTION GRUPPI_CODART2 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 40 1 BEGIN FLAG "H" @@ -369,7 +372,7 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE RESET,12@|_USER,RESET_UM,1253 END - SECTION H_GCODART3 1 1 1 HEADER + SECTION H_GCODART3 1 1 1 GROUP STRINGA 16 20 1 BEGIN KEY "CODICE GRUPPO" @@ -384,7 +387,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART3 1 0 0 FILE LF_ANAMAG GROUP CODART + SECTION GRUPPI_CODART3 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 20 1 BEGIN FLAG "H" @@ -392,7 +395,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE RESET,11@|_USER,RESET_UM,1153 END - SECTION H_GCODART4 1 1 1 HEADER + SECTION H_GCODART4 1 1 1 GROUP STRINGA 16 20 1 BEGIN KEY "CODICE GRUPPO" @@ -407,7 +410,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART4 1 0 0 FILE LF_ANAMAG GROUP CODART + SECTION GRUPPI_CODART4 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 40 1 BEGIN FLAG "H" @@ -415,7 +418,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE RESET,10@|_USER,RESET_UM,1053 END - SECTION H_GCODART5 1 1 1 HEADER + SECTION H_GCODART5 1 1 1 GROUP STRINGA 16 20 1 BEGIN KEY "CODICE GRUPPO" @@ -430,7 +433,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART5 1 0 0 FILE LF_ANAMAG GROUP CODART + SECTION GRUPPI_CODART5 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 40 1 BEGIN FLAG "H" @@ -438,7 +441,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE RESET,9@|_USER,RESET_UM,953 END - SECTION H_GCODART6 1 1 1 HEADER + SECTION H_GCODART6 1 1 1 GROUP STRINGA 16 20 1 BEGIN KEY "CODICE GRUPPO" @@ -453,7 +456,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART6 1 0 0 FILE LF_ANAMAG GROUP CODART + SECTION GRUPPI_CODART6 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 40 1 BEGIN FLAG "H" @@ -461,7 +464,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE RESET,8@|_USER,RESET_UM,853 END - SECTION H_GCODART7 1 1 1 HEADER + SECTION H_GCODART7 1 1 1 GROUP STRINGA 16 20 1 BEGIN KEY "CODICE GRUPPO" @@ -476,7 +479,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART7 1 0 0 FILE LF_ANAMAG GROUP CODART + SECTION GRUPPI_CODART7 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 40 1 BEGIN FLAG "H" @@ -485,7 +488,7 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE RESET,7@|_USER,RESET_UM,753 END - SECTION H_GCODART8 1 1 1 HEADER + SECTION H_GCODART8 1 1 1 GROUP STRINGA 16 20 1 BEGIN KEY "CODICE GRUPPO" @@ -500,7 +503,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART8 1 0 0 FILE LF_ANAMAG GROUP CODART + SECTION GRUPPI_CODART8 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 40 1 BEGIN FLAG "H" @@ -508,7 +511,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE RESET,6@|_USER,RESET_UM,653 END - SECTION H_ARTICOLO 1 1 1 HEADER + SECTION H_ARTICOLO 1 1 1 GROUP STRINGA 2020 20 1 BEGIN KEY "CODICE articolo" @@ -540,7 +543,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION FILE_GIACENZE 1 0 0 FILE LF_MAG + SECTION FILE_GIACENZE 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 20 1 BEGIN FLAG "H" @@ -548,7 +551,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE RESET,5@ END - SECTION H_GLIVGIAC1 1 1 1 HEADER + SECTION H_GLIVGIAC1 1 1 1 GROUP STRINGA 31 20 1 BEGIN KEY "Livello giac" @@ -571,7 +574,7 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 2 1 "" MESSAGE RESET,4@ END - SECTION H_GLIVGIAC2 1 1 1 HEADER + SECTION H_GLIVGIAC2 1 1 1 GROUP STRINGA 31 20 1 BEGIN KEY "Livello giac" @@ -595,7 +598,7 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE RESET,3@ END - SECTION H_GLIVGIAC3 1 1 1 HEADER + SECTION H_GLIVGIAC3 1 1 1 GROUP STRINGA 31 20 1 BEGIN KEY "Livello giac" @@ -619,7 +622,7 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE RESET,2@ END - SECTION H_GLIVGIAC4 1 1 1 HEADER + SECTION H_GLIVGIAC4 1 1 1 GROUP STRINGA 31 20 1 BEGIN KEY "Livello giac" @@ -1316,7 +1319,7 @@ SECTION BODY ODD 0 COLUMNWISE END // tot ggiac1 END // FILE GIACENZE - SECTION TOT_ARTICOLO 1 1 1 FOOTER + SECTION TOT_ARTICOLO 1 1 1 GROUP STRINGA 651 20 1 BEGIN KEY "" @@ -1419,7 +1422,7 @@ SECTION BODY ODD 0 COLUMNWISE KEY "ULC" PROMPT 7 1 "" PICTURE "###.###.###" - GROUP FG_RIGAPREZZI + GROUP FG_RIGACOSTI END NUMERO 649 12 BEGIN @@ -1431,7 +1434,7 @@ SECTION BODY ODD 0 COLUMNWISE END // TOT ART END // GART8 - SECTION TOT_GART8 1 1 1 FOOTER + SECTION TOT_GART8 1 1 1 GROUP STRINGA 751 20 BEGIN KEY "" @@ -1534,7 +1537,7 @@ SECTION BODY ODD 0 COLUMNWISE END // tot gart8 END // GART7 - SECTION TOT_GART7 1 1 1 FOOTER + SECTION TOT_GART7 1 1 1 GROUP STRINGA 851 20 1 BEGIN KEY "" @@ -1637,7 +1640,7 @@ SECTION BODY ODD 0 COLUMNWISE END // tot gart7 END // GART6 - SECTION TOT_GART6 1 1 1 FOOTER + SECTION TOT_GART6 1 1 1 GROUP STRINGA 951 20 1 BEGIN KEY "" @@ -1740,7 +1743,7 @@ SECTION BODY ODD 0 COLUMNWISE END // tot gart6 END // GART5 - SECTION TOT_GART5 1 1 1 FOOTER + SECTION TOT_GART5 1 1 1 GROUP STRINGA 1051 20 1 BEGIN KEY "" @@ -1840,7 +1843,7 @@ SECTION BODY ODD 0 COLUMNWISE END // tot gart5 END // GART4 - SECTION TOT_GART4 1 1 1 FOOTER + SECTION TOT_GART4 1 1 1 GROUP STRINGA 1151 20 1 BEGIN KEY "" @@ -1940,7 +1943,7 @@ SECTION BODY ODD 0 COLUMNWISE END // tot gart4 END // GART3 - SECTION TOT_GART3 1 1 1 FOOTER + SECTION TOT_GART3 1 1 1 GROUP STRINGA 1251 20 1 BEGIN KEY "" @@ -2040,7 +2043,7 @@ SECTION BODY ODD 0 COLUMNWISE END // tot gart3 END // GART2 - SECTION TOT_GART2 1 1 1 FOOTER + SECTION TOT_GART2 1 1 1 GROUP STRINGA 1351 20 1 BEGIN KEY "" @@ -2140,7 +2143,7 @@ SECTION BODY ODD 0 COLUMNWISE END // tot gart2 END // GART1 - SECTION TOT_GART1 1 1 1 FOOTER + SECTION TOT_GART1 1 1 1 GROUP STRINGA 1451 20 1 BEGIN KEY "" diff --git a/mg/mg3100b.frm b/mg/mg3100b.frm index e24578b94..6ce7749c4 100755 --- a/mg/mg3100b.frm +++ b/mg/mg3100b.frm @@ -85,9 +85,11 @@ END FLAG "H" KEY "PREZZIOVALORI" ITEM "P|0" - MESSAGE ENABLE,FG_RIGAPREZZI@|DISABLE,FG_RIGAVALORI@ + MESSAGE ENABLE,FG_RIGAPREZZI@|ENABLE,FG_RIGACOSTI@|DISABLE,FG_RIGAVALORI@ ITEM "V|1" - MESSAGE DISABLE,FG_RIGAPREZZI@|ENABLE,FG_RIGAVALORI@ + MESSAGE DISABLE,FG_RIGAPREZZI@|DISABLE,FG_RIGACOSTI@|ENABLE,FG_RIGAVALORI@ + ITEM "L|2" + MESSAGE ENABLE,FG_RIGAPREZZI@|DISABLE,FG_RIGACOSTI@|DISABLE,FG_RIGAVALORI@ END LIST FF_FLAGGIAC 1 @@ -112,117 +114,117 @@ END MESSAGE SHOW,15 END - LIST FF_FLAGVALMEDI 1 - BEGIN - PROMPT 1 1 "" - FLAG "H" - KEY "FLAG VALORI MEDI" - ITEM "0|N" + LIST FF_FLAGVALMEDI 1 + BEGIN + PROMPT 1 1 "" + FLAG "H" + KEY "FLAG VALORI MEDI" + ITEM "0|N" MESSAGE DISABLE,FG_VALMEDI@ - ITEM "1|Y" + ITEM "1|Y" MESSAGE ENABLE,FG_VALMEDI@ - END + END - STRINGA 6 20 - BEGIN - KEY "H1" + STRINGA 6 20 + BEGIN + KEY "H1" PROMPT 2 6 "Codice" - END - STRINGA 7 40 - BEGIN - KEY "H1" + END + STRINGA 7 40 + BEGIN + KEY "H1" PROMPT 23 6 "Descrizione" - END - STRINGA 7 40 - BEGIN - KEY "H1" + END + STRINGA 7 40 + BEGIN + KEY "H1" PROMPT 54 6 "UM" - END - STRINGA 8 12 - BEGIN - KEY "H1" + END + STRINGA 8 12 + BEGIN + KEY "H1" PROMPT 65 6 "Acq." - GROUP FG_RIGAVALORI - END - STRINGA 9 12 - BEGIN - KEY "H1" + GROUP FG_RIGAVALORI + END + STRINGA 9 12 + BEGIN + KEY "H1" PROMPT 74 6 "Ult.costo" - GROUP FG_RIGAPREZZI - END - STRINGA 9 12 - BEGIN - KEY "H1" + GROUP FG_RIGACOSTI + END + STRINGA 9 12 + BEGIN + KEY "H1" PROMPT 75 6 "Val.Acq." GROUP FG_RIGAVALORI FG_VALORI - END - STRINGA 9 12 - BEGIN - KEY "H1" + END + STRINGA 9 12 + BEGIN + KEY "H1" PROMPT 75 7 " Medio" GROUP FG_RIGAVALORI FG_VALMEDI - END - STRINGA 10 12 - BEGIN - KEY "H1" + END + STRINGA 10 12 + BEGIN + KEY "H1" PROMPT 91 6 "Ven." GROUP FG_RIGAVALORI - END - STRINGA 10 12 - BEGIN - KEY "H1" + END + STRINGA 10 12 + BEGIN + KEY "H1" PROMPT 90 6 "Prezzo" - GROUP FG_RIGAPREZZI - END - STRINGA 11 12 - BEGIN - KEY "H1" + GROUP FG_RIGAPREZZI + END + STRINGA 11 12 + BEGIN + KEY "H1" PROMPT 101 6 "Val.Ven." GROUP FG_RIGAVALORI FG_VALORI - END - STRINGA 11 12 - BEGIN - KEY "H1" + END + STRINGA 11 12 + BEGIN + KEY "H1" PROMPT 101 7 " Medio" GROUP FG_RIGAVALORI FG_VALMEDI - END - STRINGA 12 12 - BEGIN - KEY "H1" + END + STRINGA 12 12 + BEGIN + KEY "H1" PROMPT 117 6 "Rim." - GROUP FG_RIGAVALORI - END - STRINGA 13 12 - BEGIN - KEY "H1" + GROUP FG_RIGAVALORI + END + STRINGA 13 12 + BEGIN + KEY "H1" PROMPT 127 6 "Val.Rim." GROUP FG_RIGAVALORI FG_VALORI - END - STRINGA 13 12 - BEGIN - KEY "H1" + END + STRINGA 13 12 + BEGIN + KEY "H1" PROMPT 127 7 "Medio" GROUP FG_RIGAVALORI FG_VALMEDI - END - STRINGA 14 12 - BEGIN - KEY "H1" + END + STRINGA 14 12 + BEGIN + KEY "H1" PROMPT 142 6 "Giac." - GROUP FG_RIGAVALORI - END - STRINGA 15 12 - BEGIN - KEY "H1" + GROUP FG_RIGAPREZZI + END + STRINGA 15 12 + BEGIN + KEY "H1" PROMPT 140 6 "Scorta-Giac." - GROUP FG_RIGAVALORI - END + GROUP FG_RIGAVALORI + END - STRINGA 17 146 - BEGIN - KEY "Separatore (iniziale)" + STRINGA 17 146 + BEGIN + KEY "Separatore (iniziale)" PROMPT 1 8 "---------------------------------------------------------------------------------------------------------------------------------------------------" - END + END END @@ -234,9 +236,11 @@ SECTION BODY ODD 0 COLUMNWISE FLAG "H" KEY "H PREZZI O VALORI" ITEM "V|Valori" - MESSAGE DISABLE,FG_RIGAPREZZI@|ENABLE,FG_RIGAVALORI@ + MESSAGE DISABLE,FG_RIGAPREZZI@|DISABLE,FG_RIGACOSTI@|ENABLE,FG_RIGAVALORI@ ITEM "P|Prezzi" - MESSAGE ENABLE,FG_RIGAPREZZI@|DISABLE,FG_RIGAVALORI@ + MESSAGE ENABLE,FG_RIGAPREZZI@|ENABLE,FG_RIGACOSTI@|DISABLE,FG_RIGAVALORI@ + ITEM "L|Listino" + MESSAGE ENABLE,FG_RIGAPREZZI@|DISABLE,FG_RIGACOSTI@|DISABLE,FG_RIGAVALORI@ END LIST FF_FLAGGIAC 1 @@ -261,25 +265,25 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ENABLE,BO->248 END - LIST FF_FLAGVALMEDI 1 - BEGIN - PROMPT 1 1 "" - FLAG "H" - KEY "FLAG VALORI MEDI" - ITEM "0|N" + LIST FF_FLAGVALMEDI 1 + BEGIN + PROMPT 1 1 "" + FLAG "H" + KEY "FLAG VALORI MEDI" + ITEM "0|N" MESSAGE SHOW,FG_VALORI@|DISABLE,FG_VALMEDI@ ITEM "1|Y" MESSAGE HIDE,FG_VALORI@|ENABLE,FG_VALMEDI@ END - STRINGA 60 40 1 - BEGIN - FLAGS "H" - KEY "MAGAZZ" - PROMPT 2 1 "" + STRINGA 60 40 1 + BEGIN + FLAGS "H" + KEY "MAGAZZ" + PROMPT 2 1 "" MESSAGE RESET,1@|_USER,RESET_UM,153 - END + END SECTION H_MAGAZZINO 1 1 1 GROUP STRINGA 60 20 1 @@ -296,8 +300,8 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 3 1 "" MESSAGE COPY,150 END - END - + END + SECTION GRUPPI_MAGAZZINO 1 0 0 FILE LF_MAG GROUP CODMAG[1,3] LIST FF_DIVDEPOSITI BEGIN @@ -311,333 +315,333 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE SHOW,TOT_DEPOSITO END STRINGA 60 20 1 - BEGIN - FLAGS "H" - KEY "dep" - PROMPT 2 1 "" + BEGIN + FLAGS "H" + KEY "dep" + PROMPT 2 1 "" MESSAGE RESET,15@|_USER,RESET_UM,53 - END + END SECTION H_DEPOSITO 1 1 1 STR_EXPR #FF_DIVDEPOSITI=="X" STRINGA 60 20 1 - BEGIN + BEGIN KEY "CODDEP" PROMPT 2 1 "Deposito " FIELD 501@->CODTAB[4,5] MESSAGE COPY,51 - END + END STRINGA 61 70 1 - BEGIN + BEGIN KEY "DESCR DEP" PROMPT 3 1 "" - FIELD 501@->s0 - MESSAGE COPY,50 - END - END + FIELD 501@->s0 + MESSAGE COPY,50 + END + END SECTION GRUPPI_DEPOSITO 1 0 0 FILE LF_MAG GROUP CODMAG[1,5] - STRINGA 60 40 1 - BEGIN - FLAGS "H" - KEY "gcodart1" - PROMPT 2 1 "" + STRINGA 60 40 1 + BEGIN + FLAGS "H" + KEY "gcodart1" + PROMPT 2 1 "" MESSAGE RESET,14@|_USER,RESET_UM,1453 - END + END SECTION H_GCODART1 1 1 1 GROUP STRINGA 16 20 1 - BEGIN - KEY "CODICE GRUPPO1" - PROMPT 2 1 "" + BEGIN + KEY "CODICE GRUPPO1" + PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,1|COPY,1451 - END + END STRINGA 17 70 - BEGIN - KEY "CODICE GRUPPO1" - PROMPT 3 1 "" - MESSAGE _USER,GRUPPOART,1|COPY,1450 - END - END - + BEGIN + KEY "CODICE GRUPPO1" + PROMPT 3 1 "" + MESSAGE _USER,GRUPPOART,1|COPY,1450 + END + END + SECTION GRUPPI_CODART1 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 20 1 - BEGIN - FLAGS "H" - KEY "" - PROMPT 2 1 "" + BEGIN + FLAGS "H" + KEY "" + PROMPT 2 1 "" MESSAGE RESET,13@|_USER,RESET_UM,1353 - END + END SECTION H_GCODART2 1 1 1 GROUP STRINGA 16 20 1 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 2 1 "" + BEGIN + KEY "CODICE GRUPPO" + PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,2|COPY,1351 - END + END STRINGA 17 70 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 3 1 "" - MESSAGE _USER,GRUPPOART,2|COPY,1350 - END - END - + BEGIN + KEY "CODICE GRUPPO" + PROMPT 3 1 "" + MESSAGE _USER,GRUPPOART,2|COPY,1350 + END + END + SECTION GRUPPI_CODART2 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 20 1 - BEGIN - FLAGS "H" - KEY "CATMER" - PROMPT 2 1 "" + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" MESSAGE RESET,12@|_USER,RESET_UM,1253 - END + END SECTION H_GCODART3 1 1 1 GROUP STRINGA 16 20 1 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 2 1 "" + BEGIN + KEY "CODICE GRUPPO" + PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,3|COPY,1251 - END + END STRINGA 17 70 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 3 1 "" - MESSAGE _USER,GRUPPOART,3|COPY,1250 - END - END - + BEGIN + KEY "CODICE GRUPPO" + PROMPT 3 1 "" + MESSAGE _USER,GRUPPOART,3|COPY,1250 + END + END + SECTION GRUPPI_CODART3 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 20 1 - BEGIN - FLAGS "H" - KEY "CATMER" - PROMPT 2 1 "" + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" MESSAGE RESET,11@|_USER,RESET_UM,1153 - END + END SECTION H_GCODART4 1 1 1 GROUP STRINGA 16 20 1 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 2 1 "" + BEGIN + KEY "CODICE GRUPPO" + PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,4|COPY,1151 - END + END STRINGA 17 70 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 3 1 "" - MESSAGE _USER,GRUPPOART,4|COPY,1150 - END - END - + BEGIN + KEY "CODICE GRUPPO" + PROMPT 3 1 "" + MESSAGE _USER,GRUPPOART,4|COPY,1150 + END + END + SECTION GRUPPI_CODART4 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 20 1 - BEGIN - FLAGS "H" - KEY "CATMER" - PROMPT 2 1 "" + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" MESSAGE RESET,10@|_USER,RESET_UM,1053 - END + END SECTION H_GCODART5 1 1 1 GROUP STRINGA 16 20 1 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 2 1 "" + BEGIN + KEY "CODICE GRUPPO" + PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,5|COPY,1051 - END + END STRINGA 17 70 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 3 1 "" - MESSAGE _USER,GRUPPOART,5|COPY,1050 - END - END - + BEGIN + KEY "CODICE GRUPPO" + PROMPT 3 1 "" + MESSAGE _USER,GRUPPOART,5|COPY,1050 + END + END + SECTION GRUPPI_CODART5 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 20 1 - BEGIN - FLAGS "H" - KEY "CATMER" - PROMPT 2 1 "" + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" MESSAGE RESET,9@|_USER,RESET_UM,953 - END + END SECTION H_GCODART6 1 1 1 GROUP STRINGA 16 20 1 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 2 1 "" + BEGIN + KEY "CODICE GRUPPO" + PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,6|COPY,951 - END + END STRINGA 17 70 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 3 1 "" - MESSAGE _USER,GRUPPOART,6|COPY,950 - END - END - + BEGIN + KEY "CODICE GRUPPO" + PROMPT 3 1 "" + MESSAGE _USER,GRUPPOART,6|COPY,950 + END + END + SECTION GRUPPI_CODART6 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 20 1 - BEGIN - FLAGS "H" - KEY "CATMER" - PROMPT 2 1 "" + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" MESSAGE RESET,8@|_USER,RESET_UM,853 - END + END SECTION H_GCODART7 1 1 1 GROUP STRINGA 16 20 1 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 2 1 "" + BEGIN + KEY "CODICE GRUPPO" + PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,7|COPY,851 - END + END STRINGA 17 70 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 3 1 "" - MESSAGE _USER,GRUPPOART,7|COPY,850 - END - END - + BEGIN + KEY "CODICE GRUPPO" + PROMPT 3 1 "" + MESSAGE _USER,GRUPPOART,7|COPY,850 + END + END + SECTION GRUPPI_CODART7 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 20 1 - BEGIN - FLAGS "H" - KEY "CATMER" - PROMPT 2 1 "" + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" MESSAGE RESET,7@|_USER,RESET_UM,753 - END - + END + SECTION H_GCODART8 1 1 1 GROUP STRINGA 16 20 1 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 2 1 "" + BEGIN + KEY "CODICE GRUPPO" + PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,8|COPY,751 - END + END STRINGA 17 70 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 3 1 "" - MESSAGE _USER,GRUPPOART,8|COPY,750 - END - END - + BEGIN + KEY "CODICE GRUPPO" + PROMPT 3 1 "" + MESSAGE _USER,GRUPPOART,8|COPY,750 + END + END + SECTION GRUPPI_CODART8 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 20 1 - BEGIN - FLAGS "H" - KEY "CATMER" - PROMPT 2 1 "" + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" MESSAGE RESET,6@ - END + END SECTION H_ARTICOLO 1 1 1 GROUP STRINGA 20 20 1 - BEGIN - KEY "CODICE articolo" - PROMPT 2 1 "" - FIELD CODART + BEGIN + KEY "CODICE articolo" + PROMPT 2 1 "" + FIELD CODART MESSAGE COPY,651 - END + END STRINGA 21 70 - BEGIN - KEY "DESCR.articolo" - PROMPT 3 1 "" + BEGIN + KEY "DESCR.articolo" + PROMPT 3 1 "" FIELD LF_ANAMAG->DESCR - MESSAGE COPY,650 - END - NUMERO 22 12 - BEGIN - KEY "ULC" - FLAGS "H" - PROMPT 7 2 "" - FIELD LF_ANAMAG->ULTCOS1 - MESSAGE COPY,648 - END - NUMERO 23 12 - BEGIN - KEY "PREZZO" - FLAGS "H" - PROMPT 7 2 "" - MESSAGE _USER,PREZZO|COPY,649 - END - END - + MESSAGE COPY,650 + END + NUMERO 22 12 + BEGIN + KEY "ULC" + FLAGS "H" + PROMPT 7 2 "" + FIELD LF_ANAMAG->ULTCOS1 + MESSAGE COPY,648 + END + NUMERO 23 12 + BEGIN + KEY "PREZZO" + FLAGS "H" + PROMPT 7 2 "" + MESSAGE _USER,PREZZO|COPY,649 + END + END + SECTION ARTICOLO 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 20 1 - BEGIN - FLAGS "H" - KEY "CATMER" - PROMPT 2 1 "" - MESSAGE RESET,5@ - END + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" + MESSAGE RESET,5@ + END SECTION H_GLIVGIAC1 1 1 1 GROUP STRINGA 31 20 1 - BEGIN - KEY "Livello giac" - PROMPT 2 1 "" + BEGIN + KEY "Livello giac" + PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOGIAC,1|COPY,551 - END + END STRINGA 31 30 1 - BEGIN - KEY "Livello giac" + BEGIN + KEY "Livello giac" PROMPT 3 1 "" - MESSAGE _USER,GRUPPOGIAC,1|COPY,550 - END - END - + MESSAGE _USER,GRUPPOGIAC,1|COPY,550 + END + END + SECTION GRUPPI_LIVGIAC1 1 0 0 FILE LF_MAG GROUP LIVELLO STRINGA 60 20 1 - BEGIN - FLAGS "H" - KEY "CATMER" - PROMPT 2 1 "" - MESSAGE RESET,4@ - END + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" + MESSAGE RESET,4@ + END SECTION H_GLIVGIAC2 1 1 1 GROUP STRINGA 31 20 1 - BEGIN - KEY "Livello giac" - PROMPT 2 1 "" + BEGIN + KEY "Livello giac" + PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOGIAC,2|COPY,451 - END + END STRINGA 31 30 1 - BEGIN - KEY "Livello giac" + BEGIN + KEY "Livello giac" PROMPT 3 1 "" - MESSAGE _USER,GRUPPOGIAC,2|COPY,450 - END - END - + MESSAGE _USER,GRUPPOGIAC,2|COPY,450 + END + END + SECTION GRUPPI_LIVGIAC2 1 0 0 FILE LF_MAG GROUP LIVELLO STRINGA 60 20 1 - BEGIN - FLAGS "H" - KEY "CATMER" - PROMPT 2 1 "" - MESSAGE RESET,3@ - END - + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" + MESSAGE RESET,3@ + END + SECTION H_GLIVGIAC3 1 1 1 GROUP STRINGA 31 20 1 - BEGIN - KEY "Livello giac" - PROMPT 2 1 "" + BEGIN + KEY "Livello giac" + PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOGIAC,3|COPY,351 - END + END STRINGA 31 30 1 - BEGIN - KEY "Livello giac" + BEGIN + KEY "Livello giac" PROMPT 3 1 "" - MESSAGE _USER,GRUPPOGIAC,3|COPY,350 - END - END - + MESSAGE _USER,GRUPPOGIAC,3|COPY,350 + END + END + SECTION GRUPPI_LIVGIAC3 1 0 0 FILE LF_MAG GROUP LIVELLO STRINGA 60 20 1 - BEGIN - FLAGS "H" - KEY "CATMER" - PROMPT 2 1 "" - MESSAGE RESET,2@ - END - + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" + MESSAGE RESET,2@ + END + SECTION H_GLIVGIAC4 1 1 1 GROUP END // GGIAC4 SECTION GRUPPI_LIVGIAC4 1 0 0 STR_EXPR LIVELLO @@ -645,30 +649,30 @@ SECTION BODY ODD 0 COLUMNWISE END // GGIAC4 SECTION TOT_GLIVGIAC4 1 1 1 GROUP STRINGA 250 30 - BEGIN + BEGIN PROMPT 3 1 "" MESSAGE _USER,GRUPPOGIAC,4 - END + END STRINGA 251 20 1 - BEGIN - KEY "Livello giac4" + BEGIN + KEY "Livello giac4" PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOGIAC,4 - END - STRINGA 253 3 - BEGIN - KEY "UM" + END + STRINGA 253 3 + BEGIN + KEY "UM" PROMPT 5 1 "" FIELD LF_UMART->UM - MESSAGE COPY,353 - END - - NUMERO 241 12 - BEGIN - KEY "ACQ" + MESSAGE COPY,353 + END + + NUMERO 241 12 + BEGIN + KEY "ACQ" PROMPT 6 1 "" - PICTURE "########,@#" - MESSAGE ADD,341 + PICTURE "########,@#" + MESSAGE ADD,341 FIELD LF_MAG->ACQ GROUP FG_RIGAVALORI END @@ -676,8 +680,8 @@ SECTION BODY ODD 0 COLUMNWISE BEGIN KEY "VALACQ" PROMPT 7 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,342 + PICTURE "###.###.##@" + MESSAGE ADD,342 FIELD LF_MAG->VALACQ GROUP FG_VALORI FG_RIGAVALORI END @@ -694,8 +698,8 @@ SECTION BODY ODD 0 COLUMNWISE BEGIN KEY "ven" PROMPT 8 1 "" - PICTURE "########,@#" - MESSAGE ADD,343 + PICTURE "########,@#" + MESSAGE ADD,343 FIELD LF_MAG->VEN GROUP FG_RIGAVALORI END @@ -707,10 +711,10 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,344 GROUP FG_VALORI FG_RIGAVALORI FIELD LF_MAG->VALVEN - END - NUMERO 284 12 - BEGIN - KEY "VALven" + END + NUMERO 284 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" PICTURE "#######,@##" MESSAGE _NUMEXPR,#244/#243 @@ -722,7 +726,7 @@ SECTION BODY ODD 0 COLUMNWISE KEY "rim" PROMPT 10 1 "" PICTURE "########,@#" - MESSAGE ADD,345 + MESSAGE ADD,345 FIELD LF_MAG->RIM GROUP FG_RIGAVALORI END @@ -730,8 +734,8 @@ SECTION BODY ODD 0 COLUMNWISE BEGIN KEY "VALrim" PROMPT 11 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,346 + PICTURE "###.###.##@" + MESSAGE ADD,346 FIELD LF_MAG->VALRIM GROUP FG_VALORI FG_RIGAVALORI END @@ -750,8 +754,8 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 12 1 "" PICTURE "########,@#" FIELD LF_MAG->GIAC - MESSAGE ADD,347 - GROUP FG_RIGAVALORI + MESSAGE ADD,347 + GROUP FG_RIGAPREZZI END NUMERO 248 12 BEGIN @@ -765,1244 +769,1244 @@ SECTION BODY ODD 0 COLUMNWISE BEGIN KEY "giac" PROMPT 6 1 "" - PICTURE "########,@#" + PICTURE "########,@#" FIELD LF_MAG->GIAC - MESSAGE ADD,341 - GROUP 2 FG_RIGAPREZZI + MESSAGE ADD,341 + GROUP 2 FG_RIGAPREZZI END*/ - END // tot ggiac4 - - END // GGIAC3 + END // tot ggiac4 + + END // GGIAC3 SECTION TOT_GLIVGIAC3 1 1 1 GROUP STRINGA 350 30 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 351 20 1 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 353 3 - BEGIN - KEY "UM" + END + STRINGA 353 3 + BEGIN + KEY "UM" PROMPT 5 1 "" - MESSAGE COPY,453 - END - NUMERO 341 12 - BEGIN - KEY "ACQ" + MESSAGE COPY,453 + END + NUMERO 341 12 + BEGIN + KEY "ACQ" PROMPT 6 1 "" - PICTURE "########,@#" - MESSAGE ADD,441 - GROUP 3 - END - NUMERO 342 12 - BEGIN - KEY "VALACQ" + PICTURE "########,@#" + MESSAGE ADD,441 + GROUP 3 + END + NUMERO 342 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,442 - GROUP 3 FG_VALORI - END - NUMERO 382 12 - BEGIN - KEY "VALACQ" + PICTURE "###.###.##@" + MESSAGE ADD,442 + GROUP 3 FG_VALORI + END + NUMERO 382 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#342/#341 - GROUP FG_VALMEDI - END - - NUMERO 343 12 - BEGIN - KEY "ven" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#342/#341 + GROUP FG_VALMEDI + END + + NUMERO 343 12 + BEGIN + KEY "ven" PROMPT 8 1 "" - PICTURE "########,@#" - MESSAGE ADD,443 - GROUP 3 - END - NUMERO 344 12 - BEGIN - KEY "VALven" + PICTURE "########,@#" + MESSAGE ADD,443 + GROUP 3 + END + NUMERO 344 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,444 - GROUP 3 FG_VALORI - END - NUMERO 384 12 - BEGIN - KEY "VALven" + PICTURE "###.###.##@" + MESSAGE ADD,444 + GROUP 3 FG_VALORI + END + NUMERO 384 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#344/#343 - GROUP FG_VALMEDI - END - - NUMERO 345 12 - BEGIN - KEY "rim" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#344/#343 + GROUP FG_VALMEDI + END + + NUMERO 345 12 + BEGIN + KEY "rim" PROMPT 10 1 "" - PICTURE "########,@#" - MESSAGE ADD,445 - GROUP 3 - END - NUMERO 346 12 - BEGIN - KEY "VALrim" + PICTURE "########,@#" + MESSAGE ADD,445 + GROUP 3 + END + NUMERO 346 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,446 - GROUP 3 FG_VALORI - END - NUMERO 386 12 - BEGIN - KEY "VALrim" + PICTURE "###.###.##@" + MESSAGE ADD,446 + GROUP 3 FG_VALORI + END + NUMERO 386 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#346/#345 - GROUP FG_VALMEDI - END - - NUMERO 347 12 - BEGIN - KEY "giac" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#346/#345 + GROUP FG_VALMEDI + END + + NUMERO 347 12 + BEGIN + KEY "giac" PROMPT 12 1 "" - PICTURE "########,@#" - MESSAGE ADD,447 - GROUP 3 - END - END // tot ggiac3 - - END // GGIAC2 + PICTURE "########,@#" + MESSAGE ADD,447 + GROUP 3 + END + END // tot ggiac3 + + END // GGIAC2 SECTION TOT_GLIVGIAC2 1 1 1 GROUP STRINGA 450 30 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 451 20 1 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 453 3 - BEGIN - KEY "UM" + END + STRINGA 453 3 + BEGIN + KEY "UM" PROMPT 5 1 "" - MESSAGE COPY,553 - END - NUMERO 441 12 - BEGIN - KEY "ACQ" + MESSAGE COPY,553 + END + NUMERO 441 12 + BEGIN + KEY "ACQ" PROMPT 6 1 "" - PICTURE "########,@#" - MESSAGE ADD,541 - GROUP 4 - END - NUMERO 442 12 - BEGIN - KEY "VALACQ" + PICTURE "########,@#" + MESSAGE ADD,541 + GROUP 4 + END + NUMERO 442 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,542 - GROUP 4 FG_VALORI - END - NUMERO 482 12 - BEGIN - KEY "VALACQ" + PICTURE "###.###.##@" + MESSAGE ADD,542 + GROUP 4 FG_VALORI + END + NUMERO 482 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#442/#441 - GROUP FG_VALMEDI - END - - NUMERO 443 12 - BEGIN - KEY "ven" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#442/#441 + GROUP FG_VALMEDI + END + + NUMERO 443 12 + BEGIN + KEY "ven" PROMPT 8 1 "" - PICTURE "########,@#" - MESSAGE ADD,543 - GROUP 4 - END - NUMERO 444 12 - BEGIN - KEY "VALven" + PICTURE "########,@#" + MESSAGE ADD,543 + GROUP 4 + END + NUMERO 444 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,544 - GROUP 4 FG_VALORI - END - NUMERO 484 12 - BEGIN - KEY "VALven" + PICTURE "###.###.##@" + MESSAGE ADD,544 + GROUP 4 FG_VALORI + END + NUMERO 484 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#444/#443 - GROUP FG_VALMEDI - END - - NUMERO 445 12 - BEGIN - KEY "rim" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#444/#443 + GROUP FG_VALMEDI + END + + NUMERO 445 12 + BEGIN + KEY "rim" PROMPT 10 1 "" - PICTURE "########,@#" - MESSAGE ADD,545 - GROUP 4 - END - NUMERO 446 12 - BEGIN - KEY "VALrim" + PICTURE "########,@#" + MESSAGE ADD,545 + GROUP 4 + END + NUMERO 446 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,546 - GROUP 4 FG_VALORI - END - NUMERO 486 12 - BEGIN - KEY "VALrim" + PICTURE "###.###.##@" + MESSAGE ADD,546 + GROUP 4 FG_VALORI + END + NUMERO 486 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#446/#445 - GROUP FG_VALMEDI - END - - NUMERO 447 12 - BEGIN - KEY "giac" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#446/#445 + GROUP FG_VALMEDI + END + + NUMERO 447 12 + BEGIN + KEY "giac" PROMPT 12 1 "" - PICTURE "########,@#" - MESSAGE ADD,547 - GROUP 4 - END - END // tot ggiac2 - END // GGIAC1 + PICTURE "########,@#" + MESSAGE ADD,547 + GROUP 4 + END + END // tot ggiac2 + END // GGIAC1 SECTION TOT_GLIVGIAC1 1 1 1 GROUP STRINGA 550 30 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 551 20 1 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 553 3 - BEGIN - KEY "UM" + END + STRINGA 553 3 + BEGIN + KEY "UM" PROMPT 5 1 "" - MESSAGE COPY,653 - END - NUMERO 541 12 - BEGIN - KEY "ACQ" + MESSAGE COPY,653 + END + NUMERO 541 12 + BEGIN + KEY "ACQ" PROMPT 6 1 "" - PICTURE "########,@#" - MESSAGE ADD,641 - GROUP 5 - END - NUMERO 542 12 - BEGIN - KEY "VALACQ" + PICTURE "########,@#" + MESSAGE ADD,641 + GROUP 5 + END + NUMERO 542 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,642 - GROUP 5 FG_VALORI - END - NUMERO 582 12 - BEGIN - KEY "VALACQ" + PICTURE "###.###.##@" + MESSAGE ADD,642 + GROUP 5 FG_VALORI + END + NUMERO 582 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#542/#541 - GROUP FG_VALMEDI - END - - NUMERO 543 12 - BEGIN - KEY "ven" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#542/#541 + GROUP FG_VALMEDI + END + + NUMERO 543 12 + BEGIN + KEY "ven" PROMPT 8 1 "" - PICTURE "########,@#" - MESSAGE ADD,643 - GROUP 5 - END - NUMERO 544 12 - BEGIN - KEY "VALven" + PICTURE "########,@#" + MESSAGE ADD,643 + GROUP 5 + END + NUMERO 544 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,644 - GROUP 5 FG_VALORI - END - NUMERO 584 12 - BEGIN - KEY "VALven" + PICTURE "###.###.##@" + MESSAGE ADD,644 + GROUP 5 FG_VALORI + END + NUMERO 584 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#544/#543 - GROUP FG_VALMEDI - END - - NUMERO 545 12 - BEGIN - KEY "rim" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#544/#543 + GROUP FG_VALMEDI + END + + NUMERO 545 12 + BEGIN + KEY "rim" PROMPT 10 1 "" - PICTURE "########,@#" - MESSAGE ADD,645 - GROUP 5 - END - NUMERO 546 12 - BEGIN - KEY "VALrim" + PICTURE "########,@#" + MESSAGE ADD,645 + GROUP 5 + END + NUMERO 546 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,646 - GROUP 5 FG_VALORI - END - NUMERO 586 12 - BEGIN - KEY "VALrim" + PICTURE "###.###.##@" + MESSAGE ADD,646 + GROUP 5 FG_VALORI + END + NUMERO 586 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#546/#545 - GROUP FG_VALMEDI - END - - NUMERO 547 12 - BEGIN - KEY "giac" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#546/#545 + GROUP FG_VALMEDI + END + + NUMERO 547 12 + BEGIN + KEY "giac" PROMPT 12 1 "" - PICTURE "########,@#" - MESSAGE ADD,647 - GROUP 5 - END - END // tot ggiac1 - - END // FILE GIACENZE + PICTURE "########,@#" + MESSAGE ADD,647 + GROUP 5 + END + END // tot ggiac1 + + END // FILE GIACENZE SECTION TOT_ARTICOLO 1 1 1 GROUP STRINGA 650 30 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 651 20 1 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 653 3 - BEGIN - KEY "UM" + END + STRINGA 653 3 + BEGIN + KEY "UM" PROMPT 5 1 "" MESSAGE _USER,COPY_UM,753 - END - NUMERO 641 12 - BEGIN - KEY "ACQ" + END + NUMERO 641 12 + BEGIN + KEY "ACQ" PROMPT 6 1 "" - PICTURE "########,@#" - MESSAGE ADD,741 - GROUP 6 - END - NUMERO 642 12 - BEGIN - KEY "VALACQ" + PICTURE "########,@#" + MESSAGE ADD,741 + GROUP 6 + END + NUMERO 642 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,742 - GROUP 6 FG_VALORI FG_RIGAVALORI - END - NUMERO 682 12 - BEGIN - KEY "VALACQ" + PICTURE "###.###.##@" + MESSAGE ADD,742 + GROUP 6 FG_VALORI FG_RIGAVALORI + END + NUMERO 682 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#642/#641 - GROUP FG_VALMEDI FG_RIGAVALORI - END - NUMERO 643 12 - BEGIN - KEY "ven" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#642/#641 + GROUP FG_VALMEDI FG_RIGAVALORI + END + NUMERO 643 12 + BEGIN + KEY "ven" PROMPT 8 1 "" - PICTURE "########,@#" - MESSAGE ADD,743 - GROUP 6 FG_RIGAVALORI - END - NUMERO 644 12 - BEGIN - KEY "VALven" + PICTURE "########,@#" + MESSAGE ADD,743 + GROUP 6 FG_RIGAVALORI + END + NUMERO 644 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,744 - GROUP 6 FG_VALORI FG_RIGAVALORI - END - NUMERO 684 12 - BEGIN - KEY "VALven" + PICTURE "###.###.##@" + MESSAGE ADD,744 + GROUP 6 FG_VALORI FG_RIGAVALORI + END + NUMERO 684 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#644/#643 - GROUP FG_VALMEDI FG_RIGAVALORI - END - NUMERO 645 12 - BEGIN - KEY "rim" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#644/#643 + GROUP FG_VALMEDI FG_RIGAVALORI + END + NUMERO 645 12 + BEGIN + KEY "rim" PROMPT 10 1 "" - PICTURE "########,@#" - MESSAGE ADD,745 - GROUP 6 FG_RIGAVALORI - END - NUMERO 646 12 - BEGIN - KEY "VALrim" + PICTURE "########,@#" + MESSAGE ADD,745 + GROUP 6 FG_RIGAVALORI + END + NUMERO 646 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,746 - GROUP 6 FG_VALORI FG_RIGAVALORI - END - NUMERO 686 12 - BEGIN - KEY "VALrim" + PICTURE "###.###.##@" + MESSAGE ADD,746 + GROUP 6 FG_VALORI FG_RIGAVALORI + END + NUMERO 686 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#646/#645 - GROUP FG_VALMEDI FG_RIGAVALORI - END - - NUMERO 647 12 - BEGIN - KEY "giac" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#646/#645 + GROUP FG_VALMEDI FG_RIGAVALORI + END + + NUMERO 647 12 + BEGIN + KEY "giac" PROMPT 12 1 "" - PICTURE "########,@#" - MESSAGE ADD,747 - GROUP 6 FG_RIGAVALORI - END - NUMERO 648 12 - BEGIN - KEY "ULC" + PICTURE "########,@#" + MESSAGE ADD,747 + GROUP 6 FG_RIGAVALORI + END + NUMERO 648 12 + BEGIN + KEY "ULC" PROMPT 7 1 "" - PICTURE "###.###.###" - GROUP 6 FG_RIGAPREZZI - END - NUMERO 649 12 - BEGIN - KEY "PREZZO" + PICTURE "###.###.###" + GROUP 6 FG_RIGACOSTI + END + NUMERO 649 12 + BEGIN + KEY "PREZZO" PROMPT 8 1 "" - PICTURE "###.###.###" - GROUP 6 FG_RIGAPREZZI - END - END // TOT ART - - END // GART8 + PICTURE "###.###.###" + GROUP 6 FG_RIGAPREZZI + END + END // TOT ART + + END // GART8 SECTION TOT_GART8 1 1 1 GROUP STRINGA 750 30 1 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 751 20 1 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 753 3 - BEGIN - KEY "UM" + END + STRINGA 753 3 + BEGIN + KEY "UM" PROMPT 5 1 "" MESSAGE _USER,COPY_UM,853 - END - NUMERO 741 12 - BEGIN - KEY "ACQ" + END + NUMERO 741 12 + BEGIN + KEY "ACQ" PROMPT 6 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,753|ADD,841 - GROUP 7 - END - NUMERO 742 12 - BEGIN - KEY "VALACQ" + GROUP 7 + END + NUMERO 742 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,842 - GROUP 7 FG_VALORI - END - NUMERO 782 12 - BEGIN - KEY "VALACQ" + PICTURE "###.###.##@" + MESSAGE ADD,842 + GROUP 7 FG_VALORI + END + NUMERO 782 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#742/#741 - GROUP FG_VALMEDI - END - - NUMERO 743 12 - BEGIN - KEY "ven" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#742/#741 + GROUP FG_VALMEDI + END + + NUMERO 743 12 + BEGIN + KEY "ven" PROMPT 8 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,753|ADD,843 - GROUP 7 FG_RIGAVALORI - END - NUMERO 744 12 - BEGIN - KEY "VALven" + GROUP 7 FG_RIGAVALORI + END + NUMERO 744 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,844 - GROUP 7 FG_VALORI - END - NUMERO 784 12 - BEGIN - KEY "VALven" + PICTURE "###.###.##@" + MESSAGE ADD,844 + GROUP 7 FG_VALORI + END + NUMERO 784 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#744/#743 - GROUP FG_VALMEDI - END - - NUMERO 745 12 - BEGIN - KEY "rim" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#744/#743 + GROUP FG_VALMEDI + END + + NUMERO 745 12 + BEGIN + KEY "rim" PROMPT 10 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,753|ADD,845 - GROUP 7 - END - NUMERO 746 12 - BEGIN - KEY "VALrim" + GROUP 7 + END + NUMERO 746 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,846 - GROUP 7 FG_VALORI - END - NUMERO 786 12 - BEGIN - KEY "VALrim" + PICTURE "###.###.##@" + MESSAGE ADD,846 + GROUP 7 FG_VALORI + END + NUMERO 786 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#746/#745 - GROUP FG_VALMEDI - END - NUMERO 747 12 - BEGIN - KEY "giac" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#746/#745 + GROUP FG_VALMEDI + END + NUMERO 747 12 + BEGIN + KEY "giac" PROMPT 12 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,753|ADD,847 - GROUP 7 - END + GROUP 7 + END - END // tot gart8 - - END // GART7 + END // tot gart8 + + END // GART7 SECTION TOT_GART7 1 1 1 GROUP STRINGA 850 30 1 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 851 20 1 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 853 3 - BEGIN - KEY "UM" + END + STRINGA 853 3 + BEGIN + KEY "UM" PROMPT 5 1 "" MESSAGE _USER,COPY_UM,953 - END - NUMERO 841 12 - BEGIN - KEY "ACQ" + END + NUMERO 841 12 + BEGIN + KEY "ACQ" PROMPT 6 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,853|ADD,941 - GROUP 8 - END - NUMERO 842 12 - BEGIN - KEY "VALACQ" + GROUP 8 + END + NUMERO 842 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,942 - GROUP 8 FG_VALORI - END - NUMERO 882 12 - BEGIN - KEY "VALACQ" + PICTURE "###.###.##@" + MESSAGE ADD,942 + GROUP 8 FG_VALORI + END + NUMERO 882 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#842/#841 - GROUP FG_VALMEDI - END - - NUMERO 843 12 - BEGIN - KEY "ven" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#842/#841 + GROUP FG_VALMEDI + END + + NUMERO 843 12 + BEGIN + KEY "ven" PROMPT 8 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,853|ADD,943 - GROUP 8 - END - NUMERO 844 12 - BEGIN - KEY "VALven" + GROUP 8 + END + NUMERO 844 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,944 - GROUP 8 FG_VALORI - END - NUMERO 884 12 - BEGIN - KEY "VALven" + PICTURE "###.###.##@" + MESSAGE ADD,944 + GROUP 8 FG_VALORI + END + NUMERO 884 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#844/#843 - GROUP FG_VALMEDI - END - - NUMERO 845 12 - BEGIN - KEY "rim" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#844/#843 + GROUP FG_VALMEDI + END + + NUMERO 845 12 + BEGIN + KEY "rim" PROMPT 10 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,853|ADD,945 - GROUP 8 - END - NUMERO 846 12 - BEGIN - KEY "VALrim" + GROUP 8 + END + NUMERO 846 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,946 - GROUP 8 FG_VALORI - END - NUMERO 886 12 - BEGIN - KEY "VALrim" + PICTURE "###.###.##@" + MESSAGE ADD,946 + GROUP 8 FG_VALORI + END + NUMERO 886 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#846/#845 - GROUP FG_VALMEDI - END - - NUMERO 847 12 - BEGIN - KEY "giac" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#846/#845 + GROUP FG_VALMEDI + END + + NUMERO 847 12 + BEGIN + KEY "giac" PROMPT 12 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,853|ADD,947 - GROUP 8 - END - END // tot gart7 - - END // GART6 + GROUP 8 + END + END // tot gart7 + + END // GART6 SECTION TOT_GART6 1 1 1 GROUP STRINGA 950 30 1 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 951 20 1 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 953 3 - BEGIN - KEY "UM" + END + STRINGA 953 3 + BEGIN + KEY "UM" PROMPT 5 1 "" MESSAGE _USER,COPY_UM,1053 - END - NUMERO 941 12 - BEGIN - KEY "ACQ" + END + NUMERO 941 12 + BEGIN + KEY "ACQ" PROMPT 6 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,953|ADD,1041 - GROUP 9 - END - NUMERO 942 12 - BEGIN - KEY "VALACQ" + GROUP 9 + END + NUMERO 942 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,1042 - GROUP 9 FG_VALORI - END - NUMERO 982 12 - BEGIN - KEY "VALACQ" + PICTURE "###.###.##@" + MESSAGE ADD,1042 + GROUP 9 FG_VALORI + END + NUMERO 982 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#942/#941 - GROUP FG_VALMEDI - END - - NUMERO 943 12 - BEGIN - KEY "ven" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#942/#941 + GROUP FG_VALMEDI + END + + NUMERO 943 12 + BEGIN + KEY "ven" PROMPT 8 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,953|ADD,1043 - GROUP 9 - END - NUMERO 944 12 - BEGIN - KEY "VALven" + GROUP 9 + END + NUMERO 944 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,1044 - GROUP 9 FG_VALORI - END - NUMERO 984 12 - BEGIN - KEY "VALven" + PICTURE "###.###.##@" + MESSAGE ADD,1044 + GROUP 9 FG_VALORI + END + NUMERO 984 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#944/#943 - GROUP FG_VALMEDI - END - - NUMERO 945 12 - BEGIN - KEY "rim" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#944/#943 + GROUP FG_VALMEDI + END + + NUMERO 945 12 + BEGIN + KEY "rim" PROMPT 10 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,953|ADD,1045 - GROUP 9 - END - NUMERO 946 12 - BEGIN - KEY "VALrim" + GROUP 9 + END + NUMERO 946 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,1046 - GROUP 9 FG_VALORI - END - NUMERO 986 12 - BEGIN - KEY "VALrim" + PICTURE "###.###.##@" + MESSAGE ADD,1046 + GROUP 9 FG_VALORI + END + NUMERO 986 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#946/#945 - GROUP FG_VALMEDI - END - - NUMERO 947 12 - BEGIN - KEY "giac" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#946/#945 + GROUP FG_VALMEDI + END + + NUMERO 947 12 + BEGIN + KEY "giac" PROMPT 12 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,953|ADD,1047 - GROUP 9 - END - END // tot gart6 - - END // GART5 + GROUP 9 + END + END // tot gart6 + + END // GART5 SECTION TOT_GART5 1 1 1 GROUP STRINGA 1050 30 1 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 1051 20 1 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 1053 3 - BEGIN - KEY "UM" + END + STRINGA 1053 3 + BEGIN + KEY "UM" PROMPT 5 1 "" MESSAGE _USER,COPY_UM,1153 - END - NUMERO 1041 12 - BEGIN - KEY "ACQ" + END + NUMERO 1041 12 + BEGIN + KEY "ACQ" PROMPT 6 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,1053|ADD,1141 - GROUP 10 - END - NUMERO 1042 12 - BEGIN - KEY "VALACQ" + GROUP 10 + END + NUMERO 1042 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,1142 - GROUP 10 FG_VALORI - END - NUMERO 1082 12 - BEGIN - KEY "VALACQ" + PICTURE "###.###.##@" + MESSAGE ADD,1142 + GROUP 10 FG_VALORI + END + NUMERO 1082 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#1042/#1041 - GROUP FG_VALMEDI - END - NUMERO 1043 12 - BEGIN - KEY "ven" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#1042/#1041 + GROUP FG_VALMEDI + END + NUMERO 1043 12 + BEGIN + KEY "ven" PROMPT 8 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,1053|ADD,1143 - GROUP 10 - END - NUMERO 1044 12 - BEGIN - KEY "VALven" + GROUP 10 + END + NUMERO 1044 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,1144 - GROUP 10 FG_VALORI - END - NUMERO 1084 12 - BEGIN - KEY "VALven" + PICTURE "###.###.##@" + MESSAGE ADD,1144 + GROUP 10 FG_VALORI + END + NUMERO 1084 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#1044/#1043 - GROUP FG_VALMEDI - END - NUMERO 1045 12 - BEGIN - KEY "rim" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#1044/#1043 + GROUP FG_VALMEDI + END + NUMERO 1045 12 + BEGIN + KEY "rim" PROMPT 10 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,1053|ADD,1145 - GROUP 10 - END - NUMERO 1046 12 - BEGIN - KEY "VALrim" + GROUP 10 + END + NUMERO 1046 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,1146 - GROUP 10 FG_VALORI - END - NUMERO 1086 12 - BEGIN - KEY "VALrim" + PICTURE "###.###.##@" + MESSAGE ADD,1146 + GROUP 10 FG_VALORI + END + NUMERO 1086 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#1046/#1045 - GROUP FG_VALMEDI - END - NUMERO 1047 12 - BEGIN - KEY "giac" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#1046/#1045 + GROUP FG_VALMEDI + END + NUMERO 1047 12 + BEGIN + KEY "giac" PROMPT 12 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,1053|ADD,1147 - GROUP 10 - END - END // tot gart5 - - END // GART4 + GROUP 10 + END + END // tot gart5 + + END // GART4 SECTION TOT_GART4 1 1 1 GROUP STRINGA 1150 30 1 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 1151 20 1 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 1153 3 - BEGIN - KEY "UM" + END + STRINGA 1153 3 + BEGIN + KEY "UM" PROMPT 5 1 "" MESSAGE _USER,COPY_UM,1253 - END - NUMERO 1141 12 - BEGIN - KEY "ACQ" + END + NUMERO 1141 12 + BEGIN + KEY "ACQ" PROMPT 6 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,1153|ADD,1241 - GROUP 11 - END - NUMERO 1142 12 - BEGIN - KEY "VALACQ" + GROUP 11 + END + NUMERO 1142 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,1242 - GROUP 11 FG_VALORI - END - NUMERO 1182 12 - BEGIN - KEY "VALACQ" + PICTURE "###.###.##@" + MESSAGE ADD,1242 + GROUP 11 FG_VALORI + END + NUMERO 1182 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#1142/#1141 - GROUP FG_VALMEDI - END - NUMERO 1143 12 - BEGIN - KEY "ven" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#1142/#1141 + GROUP FG_VALMEDI + END + NUMERO 1143 12 + BEGIN + KEY "ven" PROMPT 8 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,1153|ADD,1243 - GROUP 11 - END - NUMERO 1144 12 - BEGIN - KEY "VALven" + GROUP 11 + END + NUMERO 1144 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,1244 - GROUP 11 FG_VALORI - END - NUMERO 1184 12 - BEGIN - KEY "VALven" + PICTURE "###.###.##@" + MESSAGE ADD,1244 + GROUP 11 FG_VALORI + END + NUMERO 1184 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#1144/#1143 - GROUP FG_VALMEDI - END - NUMERO 1145 12 - BEGIN - KEY "rim" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#1144/#1143 + GROUP FG_VALMEDI + END + NUMERO 1145 12 + BEGIN + KEY "rim" PROMPT 10 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,1153|ADD,1245 - GROUP 11 - END - NUMERO 1146 12 - BEGIN - KEY "VALrim" + GROUP 11 + END + NUMERO 1146 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,1246 - GROUP 11 FG_VALORI - END - NUMERO 1186 12 - BEGIN - KEY "VALrim" + PICTURE "###.###.##@" + MESSAGE ADD,1246 + GROUP 11 FG_VALORI + END + NUMERO 1186 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#1146/#1145 - GROUP FG_VALMEDI - END - NUMERO 1147 12 - BEGIN - KEY "giac" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#1146/#1145 + GROUP FG_VALMEDI + END + NUMERO 1147 12 + BEGIN + KEY "giac" PROMPT 12 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,1153|ADD,1247 - GROUP 11 - END - END // tot gart4 - - END // GART3 + GROUP 11 + END + END // tot gart4 + + END // GART3 SECTION TOT_GART3 1 1 1 GROUP STRINGA 1250 30 1 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 1251 20 1 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 1253 3 - BEGIN - KEY "UM" + END + STRINGA 1253 3 + BEGIN + KEY "UM" PROMPT 5 1 "" MESSAGE _USER,COPY_UM,1353 - END - NUMERO 1241 12 - BEGIN - KEY "ACQ" + END + NUMERO 1241 12 + BEGIN + KEY "ACQ" PROMPT 6 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,1253|ADD,1341 - GROUP 12 - END - NUMERO 1242 12 - BEGIN - KEY "VALACQ" + GROUP 12 + END + NUMERO 1242 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,1342 - GROUP 12 FG_VALORI - END - NUMERO 1282 12 - BEGIN - KEY "VALACQ" + PICTURE "###.###.##@" + MESSAGE ADD,1342 + GROUP 12 FG_VALORI + END + NUMERO 1282 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#1242/#1241 - GROUP FG_VALMEDI - END - NUMERO 1243 12 - BEGIN - KEY "ven" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#1242/#1241 + GROUP FG_VALMEDI + END + NUMERO 1243 12 + BEGIN + KEY "ven" PROMPT 8 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,1253|ADD,1343 - GROUP 12 - END - NUMERO 1244 12 - BEGIN - KEY "VALven" + GROUP 12 + END + NUMERO 1244 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,1344 - GROUP 12 FG_VALORI - END - NUMERO 1284 12 - BEGIN - KEY "VALven" + PICTURE "###.###.##@" + MESSAGE ADD,1344 + GROUP 12 FG_VALORI + END + NUMERO 1284 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#1244/#1243 - GROUP FG_VALMEDI - END - NUMERO 1245 12 - BEGIN - KEY "rim" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#1244/#1243 + GROUP FG_VALMEDI + END + NUMERO 1245 12 + BEGIN + KEY "rim" PROMPT 10 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,1253|ADD,1345 - GROUP 12 - END - NUMERO 1246 12 - BEGIN - KEY "VALrim" + GROUP 12 + END + NUMERO 1246 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,1346 - GROUP 12 FG_VALORI - END - NUMERO 1286 12 - BEGIN - KEY "VALrim" + PICTURE "###.###.##@" + MESSAGE ADD,1346 + GROUP 12 FG_VALORI + END + NUMERO 1286 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#1246/#1245 - GROUP FG_VALMEDI - END - NUMERO 1247 12 - BEGIN - KEY "giac" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#1246/#1245 + GROUP FG_VALMEDI + END + NUMERO 1247 12 + BEGIN + KEY "giac" PROMPT 12 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,1253|ADD,1347 - GROUP 12 - END - END // tot gart3 - - END // GART2 + GROUP 12 + END + END // tot gart3 + + END // GART2 SECTION TOT_GART2 1 1 1 GROUP STRINGA 1350 30 1 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 1351 20 1 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 1353 3 - BEGIN - KEY "UM" + END + STRINGA 1353 3 + BEGIN + KEY "UM" PROMPT 5 1 "" MESSAGE _USER,COPY_UM,1453 - END - NUMERO 1341 12 - BEGIN - KEY "ACQ" + END + NUMERO 1341 12 + BEGIN + KEY "ACQ" PROMPT 6 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,1353|ADD,1441 - GROUP 13 - END - NUMERO 1342 12 - BEGIN - KEY "VALACQ" + GROUP 13 + END + NUMERO 1342 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,1442 - GROUP 13 FG_VALORI - END - NUMERO 1382 12 - BEGIN - KEY "VALACQ" + PICTURE "###.###.##@" + MESSAGE ADD,1442 + GROUP 13 FG_VALORI + END + NUMERO 1382 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#1342/#1341 - GROUP FG_VALMEDI - END - NUMERO 1343 12 - BEGIN - KEY "ven" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#1342/#1341 + GROUP FG_VALMEDI + END + NUMERO 1343 12 + BEGIN + KEY "ven" PROMPT 8 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,1353|ADD,1443 - GROUP 13 - END - NUMERO 1344 12 - BEGIN - KEY "VALven" + GROUP 13 + END + NUMERO 1344 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,1444 - GROUP 13 FG_VALORI - END - NUMERO 1384 12 - BEGIN - KEY "VALven" + PICTURE "###.###.##@" + MESSAGE ADD,1444 + GROUP 13 FG_VALORI + END + NUMERO 1384 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#1344/#1343 - GROUP FG_VALMEDI - END - NUMERO 1345 12 - BEGIN - KEY "rim" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#1344/#1343 + GROUP FG_VALMEDI + END + NUMERO 1345 12 + BEGIN + KEY "rim" PROMPT 10 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,1353|ADD,1445 - GROUP 13 - END - NUMERO 1346 12 - BEGIN - KEY "VALrim" + GROUP 13 + END + NUMERO 1346 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,1446 - GROUP 13 FG_VALORI - END - NUMERO 1386 12 - BEGIN - KEY "VALrim" + PICTURE "###.###.##@" + MESSAGE ADD,1446 + GROUP 13 FG_VALORI + END + NUMERO 1386 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#1346/#1345 - GROUP FG_VALMEDI - END - NUMERO 1347 12 - BEGIN - KEY "giac" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#1346/#1345 + GROUP FG_VALMEDI + END + NUMERO 1347 12 + BEGIN + KEY "giac" PROMPT 12 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,1353|ADD,1447 - GROUP 13 - END - END // tot gart2 - - END // GART1 + GROUP 13 + END + END // tot gart2 + + END // GART1 SECTION TOT_GART1 1 1 1 GROUP STRINGA 1450 30 1 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 1451 20 1 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 1453 3 - BEGIN - KEY "UM" + END + STRINGA 1453 3 + BEGIN + KEY "UM" PROMPT 5 1 "" MESSAGE _USER,COPY_UM,53 - END - NUMERO 1441 12 - BEGIN - KEY "ACQ" + END + NUMERO 1441 12 + BEGIN + KEY "ACQ" PROMPT 6 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,1453|ADD,41 - GROUP 14 - END - NUMERO 1442 12 - BEGIN - KEY "VALACQ" + GROUP 14 + END + NUMERO 1442 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,42 - GROUP 14 FG_VALORI - END - NUMERO 1482 12 - BEGIN - KEY "VALACQ" + PICTURE "###.###.##@" + MESSAGE ADD,42 + GROUP 14 FG_VALORI + END + NUMERO 1482 12 + BEGIN + KEY "VALACQ" PROMPT 7 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#1442/#1441 - GROUP FG_VALMEDI - END - NUMERO 1443 12 - BEGIN - KEY "ven" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#1442/#1441 + GROUP FG_VALMEDI + END + NUMERO 1443 12 + BEGIN + KEY "ven" PROMPT 8 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,1453|ADD,43 - GROUP 14 - END - NUMERO 1444 12 - BEGIN - KEY "VALven" + GROUP 14 + END + NUMERO 1444 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,44 - GROUP 14 FG_VALORI - END - NUMERO 1484 12 - BEGIN - KEY "VALven" + PICTURE "###.###.##@" + MESSAGE ADD,44 + GROUP 14 FG_VALORI + END + NUMERO 1484 12 + BEGIN + KEY "VALven" PROMPT 9 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#1444/#1443 - GROUP FG_VALMEDI - END - NUMERO 1445 12 - BEGIN - KEY "rim" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#1444/#1443 + GROUP FG_VALMEDI + END + NUMERO 1445 12 + BEGIN + KEY "rim" PROMPT 10 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,1453|ADD,45 - GROUP 14 - END - NUMERO 1446 12 - BEGIN - KEY "VALrim" + GROUP 14 + END + NUMERO 1446 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,46 - GROUP 14 FG_VALORI - END - NUMERO 1486 12 - BEGIN - KEY "VALrim" + PICTURE "###.###.##@" + MESSAGE ADD,46 + GROUP 14 FG_VALORI + END + NUMERO 1486 12 + BEGIN + KEY "VALrim" PROMPT 11 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#1446/#1445 - GROUP FG_VALMEDI - END - NUMERO 1447 12 - BEGIN - KEY "giac" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#1446/#1445 + GROUP FG_VALMEDI + END + NUMERO 1447 12 + BEGIN + KEY "giac" PROMPT 12 1 "" - PICTURE "########,@#" + PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,1453|ADD,47 - GROUP 14 - END - END // tot gart1 + GROUP 14 + END + END // tot gart1 END // GRUPPI DEPOSITO @@ -2112,121 +2116,108 @@ SECTION BODY ODD 0 COLUMNWISE END END // tot depositi END // gruppi MAGAZZ - + SECTION TOT_MAGAZZINO 1 2 2 GROUP SECTION SEP_MAGAZZINO 1 0 0 GROUP - STRINGA 77 - BEGIN - KEY "giac" - PROMPT 12 1 "" - PICTURE "#######@,@#" - MESSAGE _USER,VALIDATE_UM,53|ADD,147 - GROUP 15 - END - END // tot depositi - END // MAGAZZ - - SECTION TOT_MAGAZZINO 1 1 1 GROUP - SECTION SEP_MAGAZZINO 1 1 1 GROUP STRINGA 77 BEGIN KEY "giac" PROMPT 6 1 "-------------------------------------------------------------------------------------------------" - END - END + END + END STRINGA 150 30 - BEGIN - KEY "Magazzino" - PROMPT 3 1 "" - END + BEGIN + KEY "Magazzino" + PROMPT 3 1 "" + END STRINGA 151 20 - BEGIN - KEY "Magazzino" + BEGIN + KEY "Magazzino" PROMPT 2 1 "Totale mag. " - END - STRINGA 153 3 - BEGIN - KEY "UM" - PROMPT 5 1 "" - END - NUMERO 141 12 - BEGIN - KEY "ACQ" + END + STRINGA 153 3 + BEGIN + KEY "UM" + PROMPT 5 1 "" + END + NUMERO 141 12 + BEGIN + KEY "ACQ" PROMPT 6 1 "" PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,153 - GROUP 1 - END - NUMERO 142 12 - BEGIN - KEY "VALACQ" - PROMPT 7 1 "" - PICTURE "###.###.##@" - GROUP 1 FG_VALORI - END - NUMERO 182 12 - BEGIN - KEY "VALACQ" - PROMPT 7 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#142/#141 - GROUP FG_VALMEDI - END - NUMERO 143 12 - BEGIN - KEY "ven" - PROMPT 8 1 "" + GROUP 1 + END + NUMERO 142 12 + BEGIN + KEY "VALACQ" + PROMPT 7 1 "" + PICTURE "###.###.##@" + GROUP 1 FG_VALORI + END + NUMERO 182 12 + BEGIN + KEY "VALACQ" + PROMPT 7 1 "" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#142/#141 + GROUP FG_VALMEDI + END + NUMERO 143 12 + BEGIN + KEY "ven" + PROMPT 8 1 "" PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,153 - GROUP 1 - END - NUMERO 144 12 - BEGIN - KEY "VALven" - PROMPT 9 1 "" - PICTURE "###.###.##@" - GROUP 1 FG_VALORI - END - NUMERO 184 12 - BEGIN - KEY "VALven" - PROMPT 9 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#144/#143 - GROUP FG_VALMEDI - END - NUMERO 145 12 - BEGIN - KEY "rim" - PROMPT 10 1 "" + GROUP 1 + END + NUMERO 144 12 + BEGIN + KEY "VALven" + PROMPT 9 1 "" + PICTURE "###.###.##@" + GROUP 1 FG_VALORI + END + NUMERO 184 12 + BEGIN + KEY "VALven" + PROMPT 9 1 "" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#144/#143 + GROUP FG_VALMEDI + END + NUMERO 145 12 + BEGIN + KEY "rim" + PROMPT 10 1 "" PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,153 - GROUP 1 - END - NUMERO 146 12 - BEGIN - KEY "VALrim" - PROMPT 11 1 "" - PICTURE "###.###.##@" - GROUP 1 FG_VALORI - END - NUMERO 186 12 - BEGIN - KEY "VALrim" - PROMPT 11 1 "" - PICTURE "#######,@##" - MESSAGE _NUMEXPR,#146/#145 - GROUP FG_VALMEDI - END - NUMERO 147 12 - BEGIN - KEY "giac" - PROMPT 12 1 "" + GROUP 1 + END + NUMERO 146 12 + BEGIN + KEY "VALrim" + PROMPT 11 1 "" + PICTURE "###.###.##@" + GROUP 1 FG_VALORI + END + NUMERO 186 12 + BEGIN + KEY "VALrim" + PROMPT 11 1 "" + PICTURE "#######,@##" + MESSAGE _NUMEXPR,#146/#145 + GROUP FG_VALMEDI + END + NUMERO 147 12 + BEGIN + KEY "giac" + PROMPT 12 1 "" PICTURE "########,@#" MESSAGE _USER,VALIDATE_UM,153 - GROUP 1 - END - END // tot magazz + GROUP 1 + END + END // tot magazz END // section body, loop anamag SECTION FOOTER ODD 2 diff --git a/mg/mg3200.cpp b/mg/mg3200.cpp index e9df717fc..42c746216 100755 --- a/mg/mg3200.cpp +++ b/mg/mg3200.cpp @@ -290,7 +290,7 @@ void TStampa_disp::setprint_perarticoli() arec.put("CODART",_mask->get(F_AART)); _form->find_field('B',odd_page,"H_CATMER").hide(); _form->find_field('B',odd_page,"TOT_CATMER").hide(); - _form->setcatmer(FALSE); + _form->set_ordering(normale); if (!_mask->get(F_DAART).blank()) srangea << "da \"" << _mask->get(F_DAART) << "\" "; if (!_mask->get(F_AART).blank()) @@ -302,7 +302,7 @@ void TStampa_disp::setprint_perarticoli() arec.put("DESCR",_mask->get(F_ADES)); _form->find_field('B',odd_page,"H_CATMER").disable(); _form->find_field('B',odd_page,"TOT_CATMER").hide(); - _form->setcatmer(FALSE); + _form->set_ordering(normale); if (!_mask->get(F_DADES).blank()) srangea << "da \"" << _mask->get(F_DADES) << "\" "; if (!_mask->get(F_ADES).blank()) @@ -314,7 +314,7 @@ void TStampa_disp::setprint_perarticoli() arec.put("GRMERC",_mask->get(F_ACATMER)); _form->find_field('B',odd_page,"H_CATMER").show(); _form->find_field('B',odd_page,"TOT_CATMER").show(); - _form->setcatmer(TRUE); + _form->set_ordering(cat_merc); if (!_mask->get(F_DAART).blank()) { srangea << "da \"" << _mask->get(F_DAART) << "\" "; @@ -348,7 +348,12 @@ void TStampa_disp::setprint_perarticoli() joinexp << "ANNOES==" << _mask->get(F_ANNOES) << "|CODART==CODART"; TSortedfile *mag; - mag= new TSortedfile(LF_MAG,NULL,sortexp,filter,1); + // !?!?!! ATTENZIONE : Modifica temporanea + mag= new TSortedfile(LF_MAG,NULL,sortexp,"",1); + // il filtro viene qui settato DOPO la creazione del Sortedfile a causa di una bug + // sulla libreria nei TSorted_file / TCursor + mag->cursor().setfilter(filter); + // FINE MODIFICA ; rimettere il filtro nel costruttore quando il bug sarà risolto _cur->relation()->replace(mag,1,joinexp); if (cfilter.not_empty()) { diff --git a/mg/mg3200.uml b/mg/mg3200.uml index 9626859ca..34f817f50 100755 --- a/mg/mg3200.uml +++ b/mg/mg3200.uml @@ -46,7 +46,7 @@ BEGIN FLAGS "U" USE LF_ANAMAG INPUT CODART F_DAART - DISPLAY "Codice" CODART + DISPLAY "Codice@20" CODART DISPLAY "Descr@50" DESCR OUTPUT F_DAART CODART OUTPUT F_DADES DESCR @@ -72,7 +72,7 @@ BEGIN USE LF_ANAMAG KEY 2 INPUT DESCR F_DADES DISPLAY "Descr@50" DESCR - DISPLAY "Codice" CODART + DISPLAY "Codice@20" CODART OUTPUT F_DADES DESCR OUTPUT F_DAART CODART GROUP G_DESART @@ -95,7 +95,7 @@ STRING F_DAMAG 3 BEGIN PROMPT 2 7 "Dal magazzino " FLAGS "U" - USE MAG SELECT CODTAB[4,5]=="" && CODTAB[1,3]!="" + USE MAG SELECT CODTAB[4,5]=="" INPUT CODTAB F_DAMAG DISPLAY "Codice" CODTAB DISPLAY "Descr@50" S0 diff --git a/mg/mg3300.uml b/mg/mg3300.uml index 6ea684124..57947947d 100755 --- a/mg/mg3300.uml +++ b/mg/mg3300.uml @@ -80,7 +80,7 @@ BEGIN FLAGS "U" USE LF_ANAMAG INPUT CODART F_DAART - DISPLAY "Codice" CODART + DISPLAY "Codice@20" CODART DISPLAY "Descr@50" DESCR OUTPUT F_DAART CODART GROUP G_CODART @@ -105,7 +105,7 @@ BEGIN USE LF_ANAMAG KEY 2 INPUT DESCR F_DADES DISPLAY "Descr@50" DESCR - DISPLAY "Codice" CODART + DISPLAY "Codice@20" CODART OUTPUT F_DADES DESCR GROUP G_DESART END diff --git a/mg/mg3400.uml b/mg/mg3400.uml index 630d2da9b..846c18603 100755 --- a/mg/mg3400.uml +++ b/mg/mg3400.uml @@ -35,7 +35,7 @@ BEGIN FLAGS "U" USE LF_ANAMAG INPUT CODART F_DAART - DISPLAY "Codice" CODART + DISPLAY "Codice@20" CODART DISPLAY "Descr@50" DESCR OUTPUT F_DAART CODART GROUP G_CODART @@ -58,7 +58,7 @@ BEGIN USE LF_ANAMAG KEY 2 INPUT DESCR F_DADES DISPLAY "Descr@50" DESCR - DISPLAY "Codice" CODART + DISPLAY "Codice@20" CODART OUTPUT F_DADES DESCR GROUP G_DESART END @@ -80,7 +80,7 @@ BEGIN FLAGS "U" USE MAG SELECT CODTAB[4,5]=="" && CODTAB[1,3]!="" INPUT CODTAB F_DAMAG - DISPLAY "Codice" CODTAB + DISPLAY "Codice@20" CODTAB DISPLAY "Descr@50" S0 OUTPUT F_DAMAG CODTAB END @@ -101,7 +101,7 @@ BEGIN FLAGS "U" USE GMC SELECT CODTAB[4,5]=="" INPUT CODTAB F_DACATMER - DISPLAY "Codice" CODTAB + DISPLAY "Codice" CODTAB DISPLAY "Descr@50" S0 OUTPUT F_DACATMER CODTAB[1,3] GROUP G_CATMER diff --git a/mg/mg3500.cpp b/mg/mg3500.cpp index 75bd9b337..6d63ae495 100755 --- a/mg/mg3500.cpp +++ b/mg/mg3500.cpp @@ -5,26 +5,57 @@ #include "mg3frm.h" // mg3500 Stampa + +class TForm_storgiac : public TForm_stampemg +{ + TSorted_cursor * _sortcur; + bool _use_alternate_cursor; +public: + void use_alternate_cursor(const bool b = TRUE) { _use_alternate_cursor = b; } + virtual TCursor* cursor() const ; + TForm_storgiac(const char *name,const char *code) ; + virtual ~TForm_storgiac(); +}; + +TForm_storgiac::TForm_storgiac(const char *name,const char *code) : + TForm_stampemg(name,code) +{ + _use_alternate_cursor = FALSE; + _sortcur = new TSorted_cursor(relation(),"RAGGFIS|CODART"); +} + +TForm_storgiac::~TForm_storgiac() +{ + delete _sortcur; +} + +TCursor* TForm_storgiac::cursor() const +{ + if (_use_alternate_cursor) // Se e' settata la stampa per ragg. fisc ritorna il cursore appropriato + return (TCursor*)_sortcur; + return TForm_stampemg::cursor(); +} + +///////////////////////////////////////////////////// +// Applicazione +///////////////////////////////////////////////////// class TStampa_storgiac : public TSkeleton_application { TArray * _files; TStampemg_mask * _mask; TCursor * _cur; - TForm_stampemg * _form; // to be moved into TPrint_application + TForm_storgiac * _form; // to be moved into TPrint_application protected: virtual bool create(); virtual bool destroy(); virtual void main_loop(); - void setprint_permagazzini(); - void setprint_perarticoli(); public: TStampa_storgiac() {} - virtual ~TStampa_storgiac() {} + virtual ~TStampa_storgiac() {}; }; - bool TStampa_storgiac::create() { _mask = new TStampemg_mask("mg3500"); @@ -50,27 +81,99 @@ void TStampa_storgiac::main_loop() if (_mask->magazz_ini().gestmag(TRUE)) { TRectype darec(LF_ANAMAG),arec(LF_ANAMAG); - TString cfilter,filter,joinexp; - + TString cfilter,joinexp, espr; + + cfilter.format("%d->NRIGA!=0", LF_STOMAG); //Considera l'articolo solo se ha almeno una riga di storico... joinexp << "ANNOESRIF==" << _mask->get(F_ANNOES) << "|CODART==CODART"; - _form = new TForm_stampemg("mg3500", ""); + _form = new TForm_storgiac("mg3500", ""); _cur = _form->cursor(); - switch (*_mask->get(F_ORDINE)) + const char ordine = *_mask->get(F_ORDINE); + switch (ordine) { case 'C': _cur->setkey(1); darec.put("CODART",_mask->get(F_DAART)); arec.put("CODART",_mask->get(F_AART)); + _form->find_field('B',odd_page,"H_CATMER").hide(); + _form->find_field('B',odd_page,"TOT_CATMER").hide(); + _form->find_field('B',odd_page,"H_SCATMER").hide(); + _form->find_field('B',odd_page,"TOT_SCATMER").hide(); + _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("CODART[1,1]",_strexpr); break; case 'D': _cur->setkey(2); darec.put("DESCR",_mask->get(F_DADES)); arec.put("DESCR",_mask->get(F_ADES)); + _form->find_field('B',odd_page,"H_CATMER").hide(); + _form->find_field('B',odd_page,"TOT_CATMER").hide(); + _form->find_field('B',odd_page,"H_SCATMER").hide(); + _form->find_field('B',odd_page,"TOT_SCATMER").hide(); + _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("CODART[1,1]",_strexpr); + break; + case 'S': + case 'M': + { + TString16 m1,m2; + m1 = _mask->get(F_DAGRMERC); + m2 = _mask->get(F_AGRMERC); + if (ordine == 'S') + { + m1 << _mask->get(F_DASGRMERC); + m2 << _mask->get(F_ASGRMERC); + m1.trim(); + m2.trim(); + } + if (m2.empty() && _mask->get(F_AART).not_empty()) + m2.fill('\254',5); + _cur->setkey(3); + darec.put("GRMERC", m1); + darec.put("CODART",_mask->get(F_DAART)); + arec.put("GRMERC", m2); + arec.put("CODART",_mask->get(F_AART)); + _form->find_field('B',odd_page,"H_CATMER").show(); + _form->find_field('B',odd_page,"TOT_CATMER").show(); + if (ordine == 'S') + { + _form->find_field('B',odd_page,"H_SCATMER").show(); + _form->find_field('B',odd_page,"TOT_SCATMER").show(); + } + else + { + _form->find_field('B',odd_page,"H_SCATMER").hide(); + _form->find_field('B',odd_page,"TOT_SCATMER").hide(); + _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("CODART[1,1]",_strexpr); + } + _form->set_ordering(cat_merc); + } + break; + case 'R': + _form->set_ordering(ragg_fisc);// Setta la subsection in modo da raggruppare per RAGGFIS + _form->use_alternate_cursor(); + _cur = _form->cursor(); + _cur->setkey(1); + darec.put("CODART",_mask->get(F_DAART)); + arec.put("CODART",_mask->get(F_AART)); + if (_mask->get(F_DARAGGFIS).not_empty()) + cfilter.format("(RAGGFIS>=\"%s\")",(const char*)_mask->get(F_DARAGGFIS)); + if (cfilter.not_empty() && _mask->get(F_ARAGGFIS).not_empty()) + { + cfilter << "&&(RAGGFIS<=\""; + cfilter << _mask->get(F_ARAGGFIS); + cfilter << "\")"; + } + _form->find_field('B',odd_page,"H_CATMER").show(); + _form->find_field('B',odd_page,"TOT_CATMER").show(); + _form->find_field('B',odd_page,"GRUPPI_CATMER").setcondition("RAGGFIS",_strexpr); + _form->find_field('B',odd_page,"H_SCATMER").hide(); + _form->find_field('B',odd_page,"TOT_SCATMER").hide(); + _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("RAGGFIS",_strexpr); + break; + default: break; } _cur->relation()->replace(new TLocalisamfile(LF_STOMAG),1,joinexp); - _cur->setfilter(cfilter); + _cur->setfilter(cfilter,TRUE); _cur->setregion(darec,arec); _form->print(); delete _form; diff --git a/mg/mg3500.frm b/mg/mg3500.frm index cf6044529..c90753180 100755 --- a/mg/mg3500.frm +++ b/mg/mg3500.frm @@ -3,6 +3,9 @@ USE LF_ANAMAG KEY 1 JOIN LF_STOMAG TO LF_ANAMAG INTO ANNOESRIF==1996 CODART==CODART JOIN LF_UMART TO LF_ANAMAG INTO CODART==CODART JOIN MAG TO LF_STOMAG ALIAS LF_TAB_MAG INTO CODTAB==CODMAG[1,3] +JOIN GMC TO LF_ANAMAG ALIAS 400 INTO CODTAB==GRMERC[1,3] +JOIN GMC TO LF_ANAMAG ALIAS 401 INTO CODTAB==GRMERC +JOIN RFA TO LF_ANAMAG ALIAS 600 INTO CODTAB==RAGGFIS END DESCRIPTION @@ -16,8 +19,6 @@ END GENERAL BEGIN OFFSET 0 1 -// FONT "Courier New" -// SIZE 10 END @@ -37,24 +38,24 @@ END STRINGA 2 10 BEGIN KEY "Data" - PROMPT 120 1 "Data " + PROMPT 50 1 "Data " MESSAGE _TODAY END NUMERO 3 7 BEGIN KEY "Nr. pagina" - PROMPT 137 1 "Pagina " + PROMPT 73 1 "Pag. " MESSAGE _PAGENO END NUMERO 4 32 BEGIN KEY "Intestazione stampa" - PROMPT 45 2 "Stampa storico rimanenze" + PROMPT 28 2 "Stampa storico rimanenze" END -STRINGA 5 146 +STRINGA 5 80 BEGIN KEY "Separatore (iniziale)" PROMPT 1 3 "------------------------------------------------------------------------------------------------------------------------------------------------------" @@ -65,8 +66,40 @@ END SECTION BODY ODD 0 + SECTION H_CATMER 1 1 1 GROUP + STRINGA 11 20 + BEGIN + KEY "Cat. Merc/Gr. Fisc" + PROMPT 2 1 "@B" + MESSAGE _USER,CODCATMER|COPY,52|RESET,55 + END + STRINGA 12 50 + BEGIN + KEY "Descrizione Cat.Merc/Rag.fis" + PROMPT 23 1 "@R" + MESSAGE _USER,CATMER + END + END - SECTION GRUPPI_ARTICOLO 1 0 0 COLUMNWISE FILE LF_STOMAG + SECTION GRUPPI_CATMER 1 0 0 COLUMNWISE FILE LF_ANAMAG GROUP GRMERC + + SECTION H_SCATMER 1 1 1 GROUP + STRINGA 11 20 + BEGIN + KEY "SottoCat. Merc" + PROMPT 2 1 "" + FIELD GRMERC + MESSAGE COPY,42|RESET,45 + END + STRINGA 12 50 + BEGIN + KEY "Descrizione SottoCat.Merc" + PROMPT 23 1 "" + FIELD 401@->S0 + END + END + + SECTION GRUPPI_SCATMER 1 0 0 COLUMNWISE FILE LF_ANAMAG GROUP GRMERC SECTION H_ARTICOLO 1 3 1 GROUP STRINGA 11 20 @@ -74,11 +107,12 @@ SECTION BODY ODD 0 KEY "CODART" PROMPT 2 1 "Articolo " FIELD LF_ANAMAG->CODART + MESSAGE RESET,115|RESET,117 END STRINGA 12 50 BEGIN KEY "DESCR" - PROMPT 33 1 "" + PROMPT 23 1 "" FIELD LF_ANAMAG->DESCR END END @@ -116,10 +150,15 @@ SECTION BODY ODD 0 PROMPT 4 1 "Quantità( " FIELD LF_UMART->UM END - NUMERO 16 12 + NUMERO 16 18 + BEGIN + KEY "VALORE UNITARIO" + PROMPT 5 1 ") Valore un." + END + NUMERO 17 18 BEGIN KEY "VALORE" - PROMPT 5 1 ") Valore" + PROMPT 6 1 " Valore" END END // HD ANNI SECTION BODY_ANNI 1 1 1 COLUMNWISE FILE LF_STOMAG GROUP CODMAG @@ -138,23 +177,28 @@ SECTION BODY ODD 0 BEGIN KEY "QUANT" PROMPT 4 1 "" - PICTURE "###.###,@@@" + PICTURE "###.###,@@@@@" FIELD LF_STOMAG->QUANT MESSAGE ADD,115 END - NUMERO 16 12 + VALUTA 16 18 + BEGIN + KEY "VALORE UNITARIO" + // I valori unitari dello storico sono già memorizzati coi decimali giusti + PROMPT 5 1 "" + FLAGS "U" + FIELD LF_STOMAG->VALORE + END + VALUTA 17 18 BEGIN KEY "VALORE" - PROMPT 5 1 "" - PICTURE "###.###.###" - FIELD LF_STOMAG->VALORE - MESSAGE ADD,116 + PROMPT 6 1 "" + MESSAGE _NUMEXPR,#15*#16|ADD,117|ADD,FL->2 END - - END // body anni - END // gruppi anni dello stesso articolo + END // BODY ANNI + END // BODY MAG gruppi anni dello stesso articolo - SECTION FOOTER_ANNI 1 1 1 COLUMNWISE GROUP + SECTION FOOTER_ANNI 1 1 2 COLUMNWISE GROUP NUMERO 13 15 BEGIN KEY "offset" @@ -163,29 +207,110 @@ SECTION BODY ODD 0 NUMERO 14 10 BEGIN KEY "ANNO" - PROMPT 2 1 " Totale" + PROMPT 2 1 "Totale" END NUMERO 115 12 BEGIN KEY "QUANT" PROMPT 4 1 "" - PICTURE "###.###,@@@" + PICTURE "###.###,@@@@@" END - NUMERO 116 12 + NUMERO 116 18 + BEGIN + KEY "VALORE UNTARIO" + // Qui non stampa nulla + PROMPT 5 1 "" + END + VALUTA 117 18 BEGIN KEY "VALORE" - PROMPT 5 1 "" - PICTURE "###.###.###" + PROMPT 6 1 "" + MESSAGE ADD,45|ADD,55 END - - END // body anni + END // footer anni + + END // GRUPPI_SCATMER + SECTION TOT_SCATMER 1 1 1 COLUMNWISE GROUP + STRINGA 41 15 + BEGIN + KEY "Totali per sottocat. merc." + PROMPT 1 1 "" + END + STRINGA 42 10 + BEGIN + KEY "" + PROMPT 2 1 "Totale " + END + STRINGA 43 12 + BEGIN + PROMPT 4 1 "" + END + STRINGA 44 18 + BEGIN + PROMPT 5 1 "" + END + VALUTA 45 18 + BEGIN + KEY "VALORE" + PROMPT 6 1 "" + END + END // TOT_SCATMER - END // CICLO sul file di storico + END // GRUPPI_CATMER + + SECTION TOT_CATMER 1 1 2 COLUMNWISE GROUP + STRINGA 51 15 + BEGIN + KEY "Totali per cat merc/ragg.fisc" + PROMPT 1 1 "" + END + STRINGA 52 10 + BEGIN + KEY "" + PROMPT 2 1 "@BTotale " + END + STRINGA 53 12 + BEGIN + PROMPT 4 1 "" + END + STRINGA 54 18 + BEGIN + PROMPT 5 1 "" + END + VALUTA 55 18 + BEGIN + KEY "VALORE" + PROMPT 6 1 "" + END + END // TOT_CATMER + + //END // CICLO sul file di storico END // section body, loop anamag SECTION FOOTER ODD 2 END // fine footer +SECTION FOOTER LAST 3 COLUMNWISE + +STRINGA 5 80 +BEGIN + KEY "Separatore (finale)" + PROMPT 1 1 "------------------------------------------------------------------------------------------------------------------------------------------------------" +END + +STRINGA 1 58 +BEGIN + PROMPT 1 2 "@BTotale generale" +END + +VALUTA 2 18 +BEGIN + KEY "TOTALE" + PROMPT 2 2 "" +END + +END + END // fine form diff --git a/mg/mg3500.h b/mg/mg3500.h index 745625ac8..0bc098bd6 100755 --- a/mg/mg3500.h +++ b/mg/mg3500.h @@ -4,11 +4,20 @@ #define F_AART 106 #define F_DADES 111 #define F_ADES 112 +#define F_DAGRMERC 113 +#define F_AGRMERC 114 +#define F_DASGRMERC 115 +#define F_ASGRMERC 116 +#define F_DARAGGFIS 117 +#define F_ARAGGFIS 118 #define G_CATMER 1 #define G_CODART 2 #define G_DESART 3 +#define G_GRMERC 4 +#define G_SGRMERC 5 +#define G_RAGGFIS 6 diff --git a/mg/mg3500.uml b/mg/mg3500.uml index 6ffe26dfa..d562302f3 100755 --- a/mg/mg3500.uml +++ b/mg/mg3500.uml @@ -1,14 +1,20 @@ #include "mg3500.h" -PAGE "Stampa storico rimanenze" -1 -1 78 20 +PAGE "Stampa storico rimanenze" -1 -1 70 12 -LISTBOX F_ORDINE 20 +LISTBOX F_ORDINE 25 BEGIN FLAGS "G" PROMPT 2 1 "Ordinamento " ITEM "C|codice" - MESSAGE ENABLE,G_CODART@|HIDE,G_DESART@ + MESSAGE SHOW,G_CODART@|HIDE,G_DESART@|HIDE,G_GRMERC@|HIDE,G_SGRMERC@|HIDE,G_RAGGFIS@ ITEM "D|descrizione" - MESSAGE DISABLE,G_CODART@|SHOW,G_DESART@ + MESSAGE SHOW,G_DESART@|HIDE,G_CODART@|HIDE,G_GRMERC@|HIDE,G_SGRMERC@|HIDE,G_RAGGFIS@ + ITEM "M|Gruppo merceologico" + MESSAGE SHOW,G_CODART@|HIDE,G_DESART@|SHOW,G_GRMERC@|HIDE,G_SGRMERC@|HIDE,G_RAGGFIS@ + ITEM "S|Sottogruppo merceologico" + MESSAGE SHOW,G_CODART@|HIDE,G_DESART@|SHOW,G_GRMERC@|SHOW,G_SGRMERC@|HIDE,G_RAGGFIS@ + ITEM "R|Raggruppamento fiscale" + MESSAGE SHOW,G_CODART@|HIDE,G_DESART@|SHOW,G_RAGGFIS@|HIDE,G_GRMERC@|HIDE,G_SGRMERC@ END NUMBER F_ANNOES 4 @@ -31,19 +37,21 @@ BEGIN FLAGS "U" USE LF_ANAMAG INPUT CODART F_DAART - DISPLAY "Codice" CODART + DISPLAY "Codice@20" CODART DISPLAY "Descr@50" DESCR OUTPUT F_DAART CODART + CHECKTYPE NORMAL GROUP G_CODART END STRING F_AART 20 BEGIN - PROMPT 2 5 " all'articolo " + PROMPT 2 5 "all'articolo " FLAGS "U" COPY USE F_DAART INPUT CODART F_AART COPY DISPLAY F_DAART OUTPUT F_AART CODART + CHECKTYPE NORMAL GROUP G_CODART END @@ -54,22 +62,102 @@ BEGIN USE LF_ANAMAG KEY 2 INPUT DESCR F_DADES DISPLAY "Descr@50" DESCR - DISPLAY "Codice" CODART + DISPLAY "Codice@20" CODART OUTPUT F_DADES DESCR + CHECKTYPE NORMAL GROUP G_DESART END STRING F_ADES 50 BEGIN - PROMPT 2 5 " all'articolo " + PROMPT 2 5 "all'articolo " FLAGS "U" COPY USE F_DADES INPUT DESCR F_ADES COPY DISPLAY F_DADES OUTPUT F_ADES DESCR + CHECKTYPE NORMAL GROUP G_DESART END +STRING F_DAGRMERC 3 +BEGIN + PROMPT 2 6 "Dal gr. merceologico " + FLAGS "U" + USE GMC SELECT CODTAB[4,5]=="" + INPUT CODTAB F_DAGRMERC + DISPLAY "Codice" CODTAB + DISPLAY "Descr@50" S0 + OUTPUT F_DAGRMERC CODTAB[1,3] + CHECKTYPE NORMAL + GROUP G_GRMERC +END + +STRING F_DASGRMERC 2 +BEGIN + PROMPT 29 6 "" + FLAGS "U" + USE GMC SELECT CODTAB[4,5]!="" + INPUT CODTAB[1,3] F_DAGRMERC + INPUT CODTAB[4,5] F_DASGRMERC + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_DAGRMERC CODTAB[1,3] + OUTPUT F_DASGRMERC CODTAB[4,5] + GROUP G_SGRMERC +END + +STRING F_AGRMERC 3 +BEGIN + PROMPT 2 7 "Al gr. merceologico " + FLAGS "U" + USE GMC SELECT CODTAB[4,5]=="" + INPUT CODTAB F_AGRMERC + DISPLAY "Codice" CODTAB + DISPLAY "Descr@50" S0 + OUTPUT F_AGRMERC CODTAB[1,3] + CHECKTYPE NORMAL + GROUP G_GRMERC +END + +STRING F_ASGRMERC 2 +BEGIN + PROMPT 29 7 "" + USE GMC SELECT CODTAB[4,5]!="" + INPUT CODTAB[1,3] F_AGRMERC + INPUT CODTAB[4,5] F_ASGRMERC + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_AGRMERC CODTAB[1,3] + OUTPUT F_ASGRMERC CODTAB[4,5] + GROUP G_SGRMERC +END + +STRING F_DARAGGFIS 5 +BEGIN + PROMPT 2 6 "Da ragg. fiscale " + FLAGS "U" + USE RFA + INPUT CODTAB F_DARAGGFIS + DISPLAY "Codice " CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_DARAGGFIS CODTAB + CHECKTYPE NORMAL + GROUP G_RAGGFIS +END + +STRING F_ARAGGFIS 5 +BEGIN + PROMPT 2 7 "al ragg. fiscale " + FLAGS "U" + USE RFA + INPUT CODTAB F_ARAGGFIS + DISPLAY "Codice " CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_ARAGGFIS CODTAB + CHECKTYPE NORMAL + GROUP G_RAGGFIS +END BUTTON DLG_OK 10 2 BEGIN diff --git a/mg/mg3frm.h b/mg/mg3frm.h index d61003d52..f12b07719 100755 --- a/mg/mg3frm.h +++ b/mg/mg3frm.h @@ -14,4 +14,5 @@ #define FG_VALMEDI 26 #define FG_RIGAVALORI 27 #define FG_RIGAPREZZI 28 +#define FG_RIGACOSTI 29 diff --git a/mg/mg4100.cpp b/mg/mg4100.cpp index 8a78608aa..337b24b9f 100755 --- a/mg/mg4100.cpp +++ b/mg/mg4100.cpp @@ -2,6 +2,8 @@ #include "mglib.h" #include "mg4100.h" +#include "movmag.h" +#include "rmovmag.h" class TStampa_listamov : public TSkeleton_application { @@ -13,12 +15,16 @@ class TStampa_listamov : public TSkeleton_application bool _raggmag; TString _daart,_aart,_damag,_amag; TDate _dadata,_adata; +static TToken_string filtrocausali; protected: virtual bool create(); virtual bool destroy(); virtual void main_loop(); +static bool filtro_causali(const TRelation* r); }; +TToken_string TStampa_listamov :: filtrocausali; + bool TStampa_listamov::create() { @@ -41,9 +47,16 @@ bool TStampa_listamov::destroy() bool TStampa_listamov::filtro_causali(const TRelation* r) { - delete _mask; - TSkeleton_application::destroy(); - return TRUE; + TString16 caumag,currcau; + currcau=r->lfile(LF_RMOVMAG).get(RMOVMAG_CODCAUS); + if (currcau.empty()) + currcau=r->lfile(LF_MOVMAG).get(MOVMAG_CODCAUS); + caumag = filtrocausali.get(0); + do { + if (caumag==currcau) return TRUE; + caumag = filtrocausali.get(); + } while (!caumag.empty()); + return FALSE; } diff --git a/mg/mg4100.h b/mg/mg4100.h index 56da40e10..77d5e75b0 100755 --- a/mg/mg4100.h +++ b/mg/mg4100.h @@ -10,4 +10,5 @@ #define F_CAU4 110 #define F_CAU5 111 #define F_CAU6 112 - +#define F_DAARTICOLO 113 +#define F_AARTICOLO 114 diff --git a/mg/mg4100.uml b/mg/mg4100.uml index d8b407221..680821a29 100755 --- a/mg/mg4100.uml +++ b/mg/mg4100.uml @@ -12,6 +12,7 @@ BEGIN DISPLAY "Al@12" D0 OUTPUT F_ANNOES CODTAB ADD NONE + CHECKTYPE NORMAL END LISTBOX F_ORDINE 30 @@ -25,7 +26,7 @@ END DATA F_DADATA BEGIN - PROMPT 2 5 "Dalla data " + PROMPT 2 5 "Dalla data " USE LF_MOVMAG KEY 4 SELECT ANNOES==#F_ANNOES// KEY 3 for DATAREG INPUT DATAREG F_DADATA DISPLAY "Esercizio" ANNOES @@ -38,7 +39,7 @@ END DATA F_ADATA BEGIN - PROMPT 2 7 "Alla data " + PROMPT 42 5 "Alla data " COPY USE F_DADATA INPUT DATAREG F_ADATA COPY DISPLAY F_DADATA @@ -48,7 +49,7 @@ END STRING F_DANUM 7 BEGIN - PROMPT 2 5 "dal numero " + PROMPT 2 5 "Dal numero " USE LF_MOVMAG KEY 1 SELECT ANNOES=#F_ANNOES INPUT NUMREG F_DANUM DISPLAY "Esercizio" ANNOES @@ -61,7 +62,7 @@ END STRING F_ANUM 7 BEGIN - PROMPT 2 7 "Al numero " + PROMPT 42 5 "Al numero " COPY USE F_DANUM INPUT NUMREG F_ANUM COPY DISPLAY F_DANUM @@ -97,7 +98,7 @@ BEGIN USE %CAU INPUT CODTAB F_CAU1 DISPLAY "Codice" CODTAB - DISPLAY "Descr@30" S0 + DISPLAY "Descr@50" S0 OUTPUT F_CAU1 CODTAB CHECKTYPE NORMAL MESSAGE EMPTY CLEAR,F_CAU2 |CHECK,F_CAU2 @@ -108,8 +109,8 @@ STRING F_CAU2 5 BEGIN FLAGS "U" PROMPT 2 10 "Causale " - INPUT CODTAB F_CAU2 COPY USE F_CAU1 + INPUT CODTAB F_CAU2 COPY DISPLAY F_CAU1 OUTPUT F_CAU2 CODTAB CHECKTYPE NORMAL diff --git a/mg/mg4200.cpp b/mg/mg4200.cpp index 16f0265d9..7d14d63cd 100755 --- a/mg/mg4200.cpp +++ b/mg/mg4200.cpp @@ -1,4 +1,5 @@ #include +#include #include "..\ve\veconf.h" #include "mglib.h" @@ -9,31 +10,44 @@ class TForm_inventario : public TForm_stampemg { int _colonne; + TSorted_cursor *_sortcur; // Cursore sortato: RAGGFIS+CODART usato in stampe per raggr. fisc. TConfig *conf_ditta; + bool _use_alternate_cursor; TArticolo_giacenza * _curr_art; TString16 _codlist,_catven; // codici listino e cat vendita - bool _giaceff, // flag inventario di giacenza - _valcomp; // flag valorizzzione finiti o componenti + bool _giaceff, // flag inventario di giacenza + _valcomp; // flag valorizzzione finiti o componenti TTipo_valorizz _valorizz_scelte[MAX_VAL_COLUMNS]; // valorizzazioni delle varie colonne + TCurrency *_currency; TArticolo_giacenza &curr_art(); public: + virtual TCursor* cursor() const ; bool genera_intestazione_supplementare(pagetype p, short y); void set_parametri(const char * codcm,const char * cod,bool giaceff, bool valcomp); bool valorizzazione(TForm_item &cf, TTipo_valorizz t); bool validate(TForm_item &cf, TToken_string &s); + void use_alternate_cursor(const bool b = TRUE) { _use_alternate_cursor = b; } void add_colval(int tipo); TForm_inventario(const char *name,const char *code) ; ~TForm_inventario(); }; +TCursor* TForm_inventario::cursor() const +{ + if (_use_alternate_cursor) // Se e' settata la stampa per ragg. fisc ritorna il cursore appropriato + return (TCursor*)_sortcur; + return TForm_stampemg::cursor(); +} + bool TForm_inventario::validate(TForm_item &cf, TToken_string &s) { const TString code(s.get(0)); // prende il primo parametro, il codice del messaggio TString subcode; if (code=="_USER") { - TRectype & magrec=relation()->lfile(LF_MAG).curr(); + TLocalisamfile & magfile=relation()->lfile(LF_MAG); + TRectype & magrec=magfile.curr(); TString16 annoes(magrec.get(MAG_ANNOES)); subcode=s.get(); if (subcode=="GIAC") { @@ -86,10 +100,11 @@ bool TForm_inventario::validate(TForm_item &cf, TToken_string &s) TArticolo_giacenza &TForm_inventario::curr_art() { - TRectype & magrec=relation()->lfile(LF_MAG).curr(); - if (_curr_art==NULL || magrec.get(MAG_CODART)!=_curr_art->codice() ) { + TString newcode(relation()->lfile(LF_ANAMAG).curr().get(ANAMAG_CODART)); + if (_curr_art==NULL || newcode != _curr_art->codice()) + { if (_curr_art) delete _curr_art; - _curr_art=new TArticolo_giacenza(magrec.get(MAG_CODART)); + _curr_art=new TArticolo_giacenza(newcode); } return *_curr_art; } @@ -99,6 +114,11 @@ void TForm_inventario::add_colval(int tipo) TTipo_valorizz t= (TTipo_valorizz )tipo; if (t>=valorizz_ultcos && tipo <=valorizz_LIFOr) { + // Accende le colonne totali del Footer Last... + find_field('F', last_page, FF_BASEFL + (_colonne * 2)).show(); + if (t < valorizz_FIFOa) + find_field('F', last_page, FF_BASEFL + (_colonne * 2) +1).show(); + _valorizz_scelte[_colonne++]=t; TString col; col << _colonne; @@ -122,50 +142,58 @@ bool TForm_inventario::valorizzazione(TForm_item &cf, TTipo_valorizz t) TString annoes(magrec.get(MAG_ANNOES)); real v; if (t==valorizz_ultcos) { - v=curr_art().ultimo_costo(annoes).string(); + v=curr_art().ultimo_costo(annoes); } if (t==valorizz_mediacos) { - v=curr_art().media_costi(annoes).string(); + v=curr_art().media_costi(annoes); } if (t==valorizz_przlist) { - v=curr_art().prezzo_listino(annoes,_catven,_codlist).string(); + v=100.0 / (100.0 + curr_art().get_real(ANAMAG_PERCRIC)); + v=curr_art().prezzo_listino(annoes,_catven,_codlist) * v; } if (t==valorizz_coststd) { - v=curr_art().costo_standard(annoes).string(); + v=curr_art().costo_standard(annoes); } if (t==valorizz_costmediopond) { - TString codmag(magrec.get(MAG_CODMAG));codmag.cut(3); + TString codmag(magrec.get(MAG_CODMAG));codmag.left(3); const TString livello(magrec.get(MAG_LIVELLO)); - v=curr_art().costo_mediopond(annoes,codmag,livello).string(); + v=curr_art().costo_mediopond(annoes,codmag,livello); } if (t==valorizz_costmedio) { - TString codmag(magrec.get(MAG_CODMAG));codmag.cut(3); + TString codmag(magrec.get(MAG_CODMAG));codmag.left(3); const TString livello(magrec.get(MAG_LIVELLO)); - v=curr_art().costo_medio(annoes,codmag,livello).string(); + v=curr_art().costo_medio(annoes,codmag,livello); } + // arrotonda le valorizzazioni a costo unitario + _currency->set_price(TRUE); + _currency->set_num(v); + v = _currency->string(); + if (t==valorizz_LIFO) { - TString codmag(magrec.get(MAG_CODMAG));codmag.cut(3); + TString codmag(magrec.get(MAG_CODMAG));codmag.left(3); const TString livello(magrec.get(MAG_LIVELLO)); - v=curr_art().LIFO(annoes,codmag,livello, _giaceff,_valcomp).string(); + v=curr_art().LIFO(annoes,codmag,livello, _giaceff,_valcomp); } if (t==valorizz_FIFO) { - TString codmag(magrec.get(MAG_CODMAG));codmag.cut(3); + TString codmag(magrec.get(MAG_CODMAG));codmag.left(3); const TString livello(magrec.get(MAG_LIVELLO)); - v=curr_art().FIFO(annoes,codmag,livello, _giaceff,_valcomp).string(); + v=curr_art().FIFO(annoes,codmag,livello, _giaceff,_valcomp); } if (t==valorizz_LIFOa) { - TString codmag(magrec.get(MAG_CODMAG));codmag.cut(3); + TString codmag(magrec.get(MAG_CODMAG));codmag.left(3); const TString livello(magrec.get(MAG_LIVELLO)); - v=curr_art().LIFO_annuale(annoes,codmag,livello, _giaceff,_valcomp).string(); + v=curr_art().LIFO_annuale(annoes,codmag,livello, _giaceff,_valcomp); } if (t==valorizz_FIFOa) { - TString codmag(magrec.get(MAG_CODMAG));codmag.cut(3); + TString codmag(magrec.get(MAG_CODMAG));codmag.left(3); const TString livello(magrec.get(MAG_LIVELLO)); - v=curr_art().FIFO_annuale(annoes,codmag,livello, _giaceff,_valcomp).string(); + v=curr_art().FIFO_annuale(annoes,codmag,livello, _giaceff,_valcomp); } const real giac_corretta = curr_art().giacenza_corretta(magrec,_giaceff,_valcomp); - v = (v / giac_corretta).round() * giac_corretta ; - cf.set(v.string()); + v= v * giac_corretta ; + _currency->set_price(FALSE); + _currency->set_num(v); + cf.set(_currency->string()); //* curr_art().giacenza_corretta(magrec,_giaceff,_valcomp) return TRUE; } @@ -213,14 +241,19 @@ void TForm_inventario::set_parametri(const char * codcatv,const char * codlist,b TForm_inventario::TForm_inventario(const char *name,const char *code) : TForm_stampemg(name,code),_curr_art(NULL) -{ +{ + _sortcur = new TSorted_cursor(relation(),"RAGGFIS|CODART"); + _use_alternate_cursor = FALSE; _colonne=0; + _currency = new TCurrency(ZERO,"_FIRM"); } TForm_inventario::~TForm_inventario() { if (_curr_art) delete _curr_art; + if (_sortcur) delete _sortcur; + delete _currency; } @@ -231,6 +264,7 @@ class TStampainv_mask: public TStampemg_mask static bool handle_liv(TMask_field &fld, KEY k); // handler static bool handle_subord(TMask_field &fld, KEY k); // handler static bool handle_codlist(TMask_field &fld, KEY k); // handler + static bool handle_filt(TMask_field &fld, KEY k); // handler public: TStampainv_mask(); ~TStampainv_mask(){}; @@ -252,7 +286,34 @@ TStampainv_mask::TStampainv_mask(): //set_handler(F_DETTAGLIODEP, handle_ragg); set_handler(F_DETTAGLIOMAG, handle_ragg); set_handler(F_ORDINEART,handle_subord); + set_handler(F_ORDINEMAG,handle_subord); set_handler(F_CODLISTINO, handle_codlist); + set_handler(F_FILTRO, handle_filt); +} + +bool TStampainv_mask::handle_filt(TMask_field &fld, KEY k) +{ + if (k == K_SPACE) + { + const bool articles = fld.mask().get(F_ORDINE)=="A"; + TMask& m = fld.mask(); + switch (fld.get()[0]) + { + case '+': + case 'N': + m.show(F_ORDINEMAG); + m.hide(F_ORDINEART); + m.send_key(K_SPACE, F_ORDINEMAG); + break; + case 'T': + m.show(F_ORDINEART, articles); + m.show(F_ORDINEMAG, !articles); + m.send_key(K_SPACE, articles ? F_ORDINEART : F_ORDINEMAG); + default: + break; + } + } + return TRUE; } bool TStampainv_mask::handle_subord(TMask_field &fld, KEY k) @@ -261,7 +322,7 @@ bool TStampainv_mask::handle_subord(TMask_field &fld, KEY k) { TOperable_field &fraggcod=(TOperable_field &)fld.mask().field(F_RAGGCODICE); TOperable_field &fragggiac=(TOperable_field &)fld.mask().field(F_RAGGLIVGIAC); - switch (fld.get()[1]) { + switch (fld.get()[0]) { case 'C': if (fld.mask().get(F_ORDINE)=="A") fraggcod.enable(); @@ -275,6 +336,8 @@ bool TStampainv_mask::handle_subord(TMask_field &fld, KEY k) } break; case 'M': + case 'S': + case 'R': case 'D': fraggcod.reset(); fraggcod.check();fraggcod.disable(); break; @@ -303,6 +366,7 @@ bool TStampainv_mask::handle_liv(TMask_field &fld, KEY k) return TRUE; } + bool TStampainv_mask::handle_ragg(TMask_field &fld, KEY k) { if (k == K_SPACE) @@ -367,6 +431,7 @@ protected: void setprint_permagazzini(); void setprint_perarticoli(); + void setprint_perarticoli_all(); public: TStampa_inventario() {} @@ -404,9 +469,10 @@ bool TStampa_inventario::destroy() void TStampa_inventario::setprint_permagazzini() { - char subordine=*_mask->get(F_ORDINEART); + const char subordine=*_mask->get(F_ORDINEMAG); + const bool totdep = _mask->get_bool(F_TOTALIDEPOSITI); TRectype darec(LF_MAG),arec(LF_MAG); - TString cfilter,sortexp,joinexp; + TString cfilter, espr1, espr2; _cur = _form->cursor(); // setta il filtro sul cursore if (*_mask->get(F_FILTRO)=='N') @@ -419,7 +485,88 @@ void TStampa_inventario::setprint_permagazzini() cfilter << "(CODART<=" <<'"' << _mask->get(F_AART)<< "~~~~~~~~~~~~~~~~~~~\")&&" ; if (cfilter.not_empty()) cfilter.cut(cfilter.len()-2); - + switch (subordine) + { + case 'C': + _form->find_field('B',odd_page,"H_CATMER").hide(); + _form->find_field('B',odd_page,"TOT_CATMER").hide(); + _form->find_field('B',odd_page,"H_SCATMER").hide(); + _form->find_field('B',odd_page,"TOT_SCATMER").hide(); + if (!totdep) + espr1 = "ANNOES|CODMAG[1,3]|CODART|LIVELLO|CODMAG[4,5]"; + else + espr1 = "ANNOES|CODMAG|CODART|LIVELLO"; + _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("CODART",_strexpr); + _form->set_ordering(normale); + break; + case 'S': + case 'M': + { + TString16 m1,m2; + m1 = _mask->get(F_DACATMER); + m2 = _mask->get(F_ACATMER); + _form->find_field('B',odd_page,"H_CATMER").show(); + _form->find_field('B',odd_page,"TOT_CATMER").show(); + if (!totdep) + espr1.format("ANNOES|CODMAG[1,3]|%d->GRMERC|CODART|LIVELLO|CODMAG[4,5]", LF_ANAMAG); + else + espr1.format("ANNOES|CODMAG|%d->GRMERC|CODART|LIVELLO", LF_ANAMAG); + _form->set_ordering(cat_merc); + espr2.format("CODMAG[1,3]+CODMAG[1,5]+%d->GRMERC[1,3]", LF_ANAMAG); + _form->find_field('B',odd_page,"GRUPPI_CATMER").setcondition(espr2,_strexpr); + if (subordine == 'S') + { + _form->find_field('B',odd_page,"H_SCATMER").show(); + _form->find_field('B',odd_page,"TOT_SCATMER").show(); + m1 << _mask->get(F_DASCATMER); + m2 << _mask->get(F_ASCATMER); + m1.trim(); + m2.trim(); + } + else + { + _form->find_field('B',odd_page,"H_SCATMER").hide(); + _form->find_field('B',odd_page,"TOT_SCATMER").hide(); + } + if (m1.not_empty()) + { + espr2.format("&&(%d->GRMERC>=\"%s\")", LF_ANAMAG, (const char*) m1); + cfilter << espr2; + } + if (m2.not_empty()) + { + espr2.format("&&(%d->GRMERC<=\"%s\")", LF_ANAMAG, (const char*) m2); + cfilter << espr2; + } + } + break; + case 'R': + _form->find_field('B',odd_page,"H_CATMER").show(); + _form->find_field('B',odd_page,"TOT_CATMER").show(); + _form->find_field('B',odd_page,"H_SCATMER").hide(); + _form->find_field('B',odd_page,"TOT_SCATMER").hide(); + if (!totdep) + espr1.format("ANNOES|CODMAG[1,3]|%d->RAGGFIS|CODART|LIVELLO|CODMAG[4,5]",LF_ANAMAG); + else + espr1.format("ANNOES|CODMAG|%d->RAGGFIS|CODART|LIVELLO|CODMAG[4,5]",LF_ANAMAG); + _form->set_ordering(ragg_fisc); + espr2.format("CODMAG[1,3]+CODMAG[1,5]+%d->RAGGFIS", LF_ANAMAG); + _form->find_field('B',odd_page,"GRUPPI_CATMER").setcondition(espr2,_strexpr); + _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition(espr2,_strexpr); + + if (_mask->get(F_DARAGFIS).not_empty()) + { + espr2.format("&&(%d->RAGGFIS>=\"%s\")", LF_ANAMAG, (const char*) _mask->get(F_DARAGFIS)); + cfilter << espr2; + } + if (_mask->get(F_ARAGFIS).not_empty()) + { + espr2.format("&&(%d->RAGGFIS<=\"%s\")", LF_ANAMAG, (const char*) _mask->get(F_ARAGFIS)); + cfilter << espr2; + } + break; + default: break; + } //_mask->set_livellicodice(); // abilita/disabilita le sezioni dei totali _form->setdett_permag( @@ -427,28 +574,136 @@ void TStampa_inventario::setprint_permagazzini() _mask->get_bool(F_RAGGLIVGIAC),_mask->get_int(F_FROMLIVELLOGIAC),_mask->get_int(F_TOLIVELLOGIAC), TRUE,_mask->get_bool(F_TOTALIDEPOSITI),_mask->get_bool(F_DETTAGLIODEP)); - if (!_mask->get_bool(F_TOTALIDEPOSITI)) - { - ((TSorted_cursor *)_cur)->change_order("ANNOES|CODMAG[1,3]|CODART|LIVELLO"); + ((TSorted_cursor *)_cur)->change_order(espr1); + if (!totdep) _form->find_field('B',odd_page,"GRUPPI_DEPOSITO").setcondition("CODMAG[1,3]",_strexpr); - } + else + _form->find_field('B',odd_page,"GRUPPI_DEPOSITO").setcondition("CODMAG[1,5]",_strexpr); darec.put("ANNOES",_mask->get(F_ANNOES)); darec.put("CODMAG",_mask->get(F_DAMAG)); arec.put("ANNOES",_mask->get(F_ANNOES)); arec.put("CODMAG",_mask->get(F_AMAG)); - _cur->setfilter(cfilter); + _cur->setfilter(cfilter, TRUE); _cur->setregion(darec,arec); } // ORDINAMENTO void TStampa_inventario::setprint_perarticoli() +{ + char subordine=*_mask->get(F_ORDINEART); + TRectype darec(LF_MAG),arec(LF_MAG); + TString cfilter, espr1, espr2; + _cur = _form->cursor(); + // setta il filtro sul cursore + if (*_mask->get(F_FILTRO)=='N') + cfilter << "(GIAC!=0)&&" ; + if (*_mask->get(F_FILTRO)=='+') + cfilter << "(GIAC>0)&&" ; + if (cfilter.not_empty()) + cfilter.cut(cfilter.len()-2); + + switch (subordine) + { + case 'C': + case 'D': + _form->find_field('B',odd_page,"H_CATMER").hide(); + _form->find_field('B',odd_page,"TOT_CATMER").hide(); + _form->find_field('B',odd_page,"H_SCATMER").hide(); + _form->find_field('B',odd_page,"TOT_SCATMER").hide(); + espr1 = "ANNOES|CODART|LIVELLO|CODMAG"; + _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("CODART",_strexpr); + _form->set_ordering(normale); + break; + case 'S': + case 'M': + { + TString16 m1,m2; + m1 = _mask->get(F_DACATMER); + m2 = _mask->get(F_ACATMER); + _form->find_field('B',odd_page,"H_CATMER").show(); + _form->find_field('B',odd_page,"TOT_CATMER").show(); + espr1.format("ANNOES|%d->GRMERC|CODART|LIVELLO|CODMAG", LF_ANAMAG); + _form->set_ordering(cat_merc); + espr2.format("%d->GRMERC[1,3]", LF_ANAMAG); + _form->find_field('B',odd_page,"GRUPPI_CATMER").setcondition(espr2,_strexpr); + if (subordine == 'S') + { + _form->find_field('B',odd_page,"H_SCATMER").show(); + _form->find_field('B',odd_page,"TOT_SCATMER").show(); + m1 << _mask->get(F_DASCATMER); + m2 << _mask->get(F_ASCATMER); + m1.trim(); + m2.trim(); + } + else + { + _form->find_field('B',odd_page,"H_SCATMER").hide(); + _form->find_field('B',odd_page,"TOT_SCATMER").hide(); + } + if (m1.not_empty()) + { + espr2.format("&&(%d->GRMERC>=\"%s\")", LF_ANAMAG, (const char*) m1); + cfilter << espr2; + } + if (m2.not_empty()) + { + espr2.format("&&(%d->GRMERC<=\"%s\")", LF_ANAMAG, (const char*) m2); + cfilter << espr2; + } + } + break; + case 'R': + _form->find_field('B',odd_page,"H_CATMER").show(); + _form->find_field('B',odd_page,"TOT_CATMER").show(); + _form->find_field('B',odd_page,"H_SCATMER").hide(); + _form->find_field('B',odd_page,"TOT_SCATMER").hide(); + espr1.format("ANNOES|%d->RAGGFIS|CODART|LIVELLO|CODMAG",LF_ANAMAG); + _form->set_ordering(ragg_fisc); + espr2.format("%d->RAGGFIS", LF_ANAMAG); + _form->find_field('B',odd_page,"GRUPPI_CATMER").setcondition(espr2,_strexpr); + _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition(espr2,_strexpr); + + if (_mask->get(F_DARAGFIS).not_empty()) + { + espr2.format("&&(%d->RAGGFIS>=\"%s\")", LF_ANAMAG, (const char*) _mask->get(F_DARAGFIS)); + cfilter << espr2; + } + if (_mask->get(F_ARAGFIS).not_empty()) + { + espr2.format("&&(%d->RAGGFIS<=\"%s\")", LF_ANAMAG, (const char*) _mask->get(F_ARAGFIS)); + cfilter << espr2; + } + break; + default: break; + } + _form->setdett_perart( + _mask->get_bool(F_RAGGCODICE),_mask->get_int(F_FROMLIVELLOART),_mask->get_int(F_TOLIVELLOART), + _mask->get_bool(F_RAGGLIVGIAC),_mask->get_int(F_FROMLIVELLOGIAC),_mask->get_int(F_TOLIVELLOGIAC), + _mask->get_bool(F_TOTALIMAGAZZINI),_mask->get_bool(F_DETTAGLIOMAG)); + + ((TSorted_cursor *)_cur)->change_order(espr1); + + darec.put("ANNOES",_mask->get(F_ANNOES)); + darec.put("CODMAG",_mask->get(F_DAMAG)); + if (*_mask->get(F_DAART)) + cfilter << "&&(CODART>=\"" << _mask->get(F_DAART) << "\")"; + if (*_mask->get(F_AART)) + cfilter << "&&(CODART<=\"" << _mask->get(F_AART) << "\")"; + arec.put("ANNOES",_mask->get(F_ANNOES)); + arec.put("CODMAG",_mask->get(F_AMAG)); + _cur->setfilter(cfilter, subordine != 'C'); + _cur->setregion(darec,arec); +} + +void TStampa_inventario::setprint_perarticoli_all() { TRectype darec(LF_ANAMAG),arec(LF_ANAMAG); TString cfilter,filter,joinexp; TString sortexp("ANNOES|CODART|LIVELLO|CODMAG"); char subordine=*_mask->get(F_ORDINEART); + _cur = _form->cursor(); if (*_mask->get(F_FILTRO)=='N') filter << "(" << LF_MAG <<"->GIAC!=0)&&" ; @@ -470,7 +725,10 @@ void TStampa_inventario::setprint_perarticoli() arec.put("CODART",_mask->get(F_AART)); _form->find_field('B',odd_page,"H_CATMER").hide(); _form->find_field('B',odd_page,"TOT_CATMER").hide(); - _form->setcatmer(FALSE); + _form->find_field('B',odd_page,"H_SCATMER").hide(); + _form->find_field('B',odd_page,"TOT_SCATMER").hide(); + _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("CODART",_strexpr); + _form->set_ordering(normale); break; case 'D': _cur->setkey(2); @@ -478,17 +736,77 @@ void TStampa_inventario::setprint_perarticoli() arec.put("DESCR",_mask->get(F_ADES)); _form->find_field('B',odd_page,"H_CATMER").disable(); _form->find_field('B',odd_page,"TOT_CATMER").hide(); - _form->setcatmer(FALSE); + _form->find_field('B',odd_page,"H_SCATMER").hide(); + _form->find_field('B',odd_page,"TOT_SCATMER").hide(); + _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("CODART",_strexpr); + _form->set_ordering(normale); break; + case 'S': case 'M': + { + TString16 m1,m2; + m1 = _mask->get(F_DACATMER); + m2 = _mask->get(F_ACATMER); + if (subordine == 'S') + { + m1 << _mask->get(F_DASCATMER); + m2 << _mask->get(F_ASCATMER); + m1.trim(); + m2.trim(); + } + // Siccome GRMERC e' il primo campo della chiave, se e' settato l'articolo di fine intervallo + // ed esso non e' vuoto, mentre la categoria merc. lo e'... la setregion() del cursore non ha effetti, + // Quindi se non viene indicata alcuna categoria merc. di fine interv, va preimpostata + // Alla ultima stringa possibile + if (m2.empty() && _mask->get(F_AART).not_empty()) + m2.fill('\254',subordine == 'S' ? 5 : 3); _cur->setkey(3); - darec.put("GRMERC",_mask->get(F_DACATMER)); + darec.put("GRMERC", m1); darec.put("CODART",_mask->get(F_DAART)); - arec.put("GRMERC",_mask->get(F_ACATMER)); + arec.put("GRMERC", m2); arec.put("CODART",_mask->get(F_AART)); _form->find_field('B',odd_page,"H_CATMER").show(); _form->find_field('B',odd_page,"TOT_CATMER").show(); - _form->setcatmer(TRUE); + if (subordine == 'S') + { + _form->find_field('B',odd_page,"H_SCATMER").show(); + _form->find_field('B',odd_page,"TOT_SCATMER").show(); + } + else + { + _form->find_field('B',odd_page,"H_SCATMER").hide(); + _form->find_field('B',odd_page,"TOT_SCATMER").hide(); + _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("CODART",_strexpr); + } + _form->set_ordering(cat_merc); + } + break; + case 'R': + { + //TString filter_expr; + _form->set_ordering(ragg_fisc);// Setta la subsection in modo da raggruppare per RAGGFIS + _form->use_alternate_cursor(); + _cur = _form->cursor(); // Setta il cursore sortato per questo ordinamento... siccome non esiste una chiave RAGGFIS+CODART + _cur->setkey(1); + darec.put("CODART",_mask->get(F_DAART)); + arec.put("CODART",_mask->get(F_AART)); + _form->find_field('B',odd_page,"H_CATMER").show(); + _form->find_field('B',odd_page,"TOT_CATMER").show(); + _form->find_field('B',odd_page,"H_SCATMER").hide(); + _form->find_field('B',odd_page,"TOT_SCATMER").hide(); + _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("RAGGFIS",_strexpr); + + if (_mask->get(F_DARAGFIS).not_empty()) + cfilter.format("(RAGGFIS>=\"%s\")",(const char*)_mask->get(F_DARAGFIS)); + if (cfilter.not_empty() && _mask->get(F_ARAGFIS).not_empty()) + { + cfilter << "&&(RAGGFIS<=\""; + cfilter << _mask->get(F_ARAGFIS); + cfilter << "\")&&"; + } + _cur->setfilter(cfilter); + _cur->setregion(darec, arec); + } break; } _form->setdett_perart( @@ -513,7 +831,6 @@ void TStampa_inventario::setprint_perarticoli() // FINE MODIFICA ; rimettere il filtro nel costruttore quando il bug sarà risolto _cur->relation()->replace(mag,1,joinexp); - _cur->setfilter(cfilter); _cur->setregion(darec,arec); } @@ -524,13 +841,22 @@ void TStampa_inventario::main_loop() { if (_mask->magazz_ini().gestmag(TRUE)) { + if (_mask->get(F_DAART).blank() && _mask->get(F_AART).blank() && + _mask->get(F_DAMAG).blank() && _mask->get(F_AMAG).blank() && + !yesno_box("Sono stati selezionati tutti gli articoli. Confermi la stampa?")) + continue; if (*_mask->get(F_ORDINE)=='A') { if (*_mask->get(F_FILTRO)=='T') // tutti gli articoli + { _form = new TForm_inventario("mg4200aa", ""); + setprint_perarticoli_all(); + } else + { _form = new TForm_inventario("mg4200a", ""); - setprint_perarticoli(); + setprint_perarticoli(); + } } else { _form = new TForm_inventario("mg4200b", ""); setprint_permagazzini(); diff --git a/mg/mg4200.h b/mg/mg4200.h index 0bcd4ed66..ffef42e3d 100755 --- a/mg/mg4200.h +++ b/mg/mg4200.h @@ -30,6 +30,10 @@ #define F_PREZZIVALORI 127 #define F_CODLISTINO 128 #define F_CATVENLISTINO 129 +#define F_DARAGFIS 130 +#define F_ARAGFIS 131 +#define F_DASCATMER 132 +#define F_ASCATMER 133 #define F_VAL1 141 #define F_VAL2 152 #define F_VAL3 153 @@ -44,5 +48,7 @@ #define G_DESART 3 #define G_PARAMVALORI 4 #define G_LISTINO 5 +#define G_RAGFIS 6 +#define G_SCATMER 7 #endif //__MG4200_H diff --git a/mg/mg4200.uml b/mg/mg4200.uml index d4ccad69d..af8806ff6 100755 --- a/mg/mg4200.uml +++ b/mg/mg4200.uml @@ -6,11 +6,9 @@ LISTBOX F_ORDINE 10 BEGIN PROMPT 2 1 "Ordinamento " ITEM "A|articoli" - MESSAGE ENABLE,F_ORDINEART - MESSAGE "X",F_DETTAGLIODEP|SHOW,F_TOTALIMAGAZZINI|SHOW,F_DETTAGLIOMAG|HIDE,F_TOTALIDEPOSITI + MESSAGE " ",F_FILTRO|"X",F_DETTAGLIODEP|SHOW,F_TOTALIMAGAZZINI|SHOW,F_DETTAGLIOMAG|HIDE,F_TOTALIDEPOSITI ITEM "M|magazzini" - MESSAGE "C",F_ORDINEART|K_SPACE,F_ORDINEART|DISABLE,F_ORDINEART|SHOW,G_CODART@|HIDE,G_DESART@ - MESSAGE SHOW,F_TOTALIDEPOSITI|HIDE,F_TOTALIMAGAZZINI|HIDE,F_DETTAGLIOMAG + MESSAGE " ",F_FILTRO|SHOW,F_TOTALIDEPOSITI|HIDE,F_TOTALIMAGAZZINI|HIDE,F_DETTAGLIOMAG END @@ -19,11 +17,29 @@ BEGIN FLAGS "G" PROMPT 36 1 "sotto-ordinamento " ITEM "C|codice" - MESSAGE HIDE,G_CATMER@|ENABLE,G_CODART@|HIDE,G_DESART@|ENABLE,F_RAGGCODICE + MESSAGE HIDE,G_RAGFIS@|HIDE,G_SCATMER@|HIDE,G_CATMER@|ENABLE,G_CODART@|HIDE,G_DESART@|ENABLE,F_RAGGCODICE ITEM "D|descrizione" - MESSAGE HIDE,G_CATMER@|DISABLE,G_CODART@|SHOW,G_DESART@|CLEAR,F_RAGGCODICE|K_SPACE,F_RAGGCODICE + MESSAGE SHOW,G_DESART@|HIDE,G_RAGFIS@|HIDE,G_SCATMER@|HIDE,G_CATMER@|DISABLE,G_CODART@|CLEAR,F_RAGGCODICE|K_SPACE,F_RAGGCODICE ITEM "M|gruppo merc./codice" - MESSAGE SHOW,G_CATMER@|ENABLE,G_CODART@|HIDE,G_DESART@|ENABLE,F_RAGGCODICE + MESSAGE HIDE,G_RAGFIS@|HIDE,G_SCATMER@|SHOW,G_CATMER@|ENABLE,G_CODART@|HIDE,G_DESART@|ENABLE,F_RAGGCODICE + ITEM "S|sottogr. merc/codice" + MESSAGE HIDE,G_RAGFIS@|SHOW,G_SCATMER@|SHOW,G_CATMER@|ENABLE,G_CODART@|HIDE,G_DESART@|ENABLE,F_RAGGCODICE + ITEM "R|raggr. fisc./codice" + MESSAGE SHOW,G_RAGFIS@|HIDE,G_SCATMER@|HIDE,G_CATMER@|ENABLE,G_CODART@|HIDE,G_DESART@|ENABLE,F_RAGGCODICE +END + +LISTBOX F_ORDINEMAG 20 +BEGIN + FLAGS "G" + PROMPT 36 1 "sotto-ordinamento " + ITEM "C|codice" + MESSAGE HIDE,G_RAGFIS@|HIDE,G_SCATMER@|HIDE,G_CATMER@|ENABLE,G_CODART@|HIDE,G_DESART@|ENABLE,F_RAGGCODICE + ITEM "M|gruppo merc./codice" + MESSAGE HIDE,G_RAGFIS@|HIDE,G_SCATMER@|SHOW,G_CATMER@|ENABLE,G_CODART@|HIDE,G_DESART@|ENABLE,F_RAGGCODICE + ITEM "S|sottogr. merc/codice" + MESSAGE HIDE,G_RAGFIS@|SHOW,G_SCATMER@|SHOW,G_CATMER@|ENABLE,G_CODART@|HIDE,G_DESART@|ENABLE,F_RAGGCODICE + ITEM "R|raggr. fisc./codice" + MESSAGE SHOW,G_RAGFIS@|HIDE,G_SCATMER@|HIDE,G_CATMER@|ENABLE,G_CODART@|HIDE,G_DESART@|ENABLE,F_RAGGCODICE END LIST F_REALE_GIAC 12 @@ -69,13 +85,14 @@ END STRING F_DAART 20 BEGIN - PROMPT 2 4 "Dall'articolo " + PROMPT 2 4 "Dall'articolo " FLAGS "U" USE LF_ANAMAG INPUT CODART F_DAART - DISPLAY "Codice" CODART + DISPLAY "Codice@25" CODART DISPLAY "Descr@50" DESCR OUTPUT F_DAART CODART + CHECKTYPE NORMAL GROUP G_CODART END STRING F_AART 20 @@ -86,18 +103,20 @@ BEGIN INPUT CODART F_AART COPY DISPLAY F_DAART OUTPUT F_AART CODART + CHECKTYPE NORMAL GROUP G_CODART END STRING F_DADES 50 20 BEGIN - PROMPT 2 4 "Dall'articolo " + PROMPT 2 4 "Dall'articolo " FLAGS "U" USE LF_ANAMAG KEY 2 INPUT DESCR F_DADES DISPLAY "Descr@50" DESCR - DISPLAY "Codice" CODART + DISPLAY "Codice@20" CODART OUTPUT F_DADES DESCR + CHECKTYPE NORMAL GROUP G_DESART END STRING F_ADES 50 20 @@ -108,19 +127,21 @@ BEGIN INPUT DESCR F_ADES COPY DISPLAY F_DADES OUTPUT F_ADES DESCR + CHECKTYPE NORMAL GROUP G_DESART END STRING F_DAMAG 3 BEGIN - PROMPT 2 5 "Dal magazzino " + PROMPT 2 5 "Dal magazzino " FLAGS "U" USE MAG SELECT CODTAB[4,5]=="" INPUT CODTAB F_DAMAG DISPLAY "Codice" CODTAB DISPLAY "Descr@50" S0 OUTPUT F_DAMAG CODTAB + CHECKTYPE NORMAL END STRING F_AMAG 3 @@ -131,20 +152,36 @@ BEGIN INPUT CODTAB F_AMAG COPY DISPLAY F_DAMAG OUTPUT F_AMAG CODTAB + CHECKTYPE NORMAL END STRING F_DACATMER 3 BEGIN - PROMPT 2 6 "Dal gruppo " + PROMPT 2 6 "Dal gruppo " FLAGS "U" USE GMC SELECT CODTAB[4,5]=="" INPUT CODTAB F_DACATMER DISPLAY "Codice" CODTAB DISPLAY "Descr@50" S0 OUTPUT F_DACATMER CODTAB[1,3] + CHECKTYPE NORMAL GROUP G_CATMER END +STRING F_DASCATMER 2 +BEGIN + PROMPT 23 6 "" + FLAGS "U" + USE GMC SELECT CODTAB[4,5]!="" + INPUT CODTAB[1,3] F_DACATMER + INPUT CODTAB[4,5] F_DASCATMER + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_DACATMER CODTAB[1,3] + OUTPUT F_DASCATMER CODTAB[4,5] + CHECKTYPE NORMAL + GROUP G_SCATMER +END STRING F_ACATMER 3 BEGIN @@ -154,9 +191,51 @@ BEGIN INPUT CODTAB F_ACATMER COPY DISPLAY F_DACATMER OUTPUT F_ACATMER CODTAB[1,3] + CHECKTYPE NORMAL GROUP G_CATMER END +STRING F_ASCATMER 2 +BEGIN + PROMPT 51 6 "" + FLAGS "U" + USE GMC + INPUT CODTAB[1,3] F_ACATMER + INPUT CODTAB[4,5] F_ASCATMER + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_ACATMER CODTAB[1,3] + OUTPUT F_ASCATMER CODTAB[4,5] + CHECKTYPE NORMAL + GROUP G_SCATMER +END + +STRING F_DARAGFIS 5 +BEGIN + PROMPT 2 6 "Dal grup. fis. " + FLAGS "U" + USE RFA + INPUT CODTAB F_DARAGFIS + DISPLAY "Codice " CODTAB + DISPLAY "Descrizione@40" S0 + OUTPUT F_DARAGFIS CODTAB + CHECKTYPE NORMAL + GROUP G_RAGFIS +END + +STRING F_ARAGFIS 5 +BEGIN + PROMPT 42 6 " a " + FLAGS "U" + USE RFA + INPUT CODTAB F_ARAGFIS + DISPLAY "Codice " CODTAB + DISPLAY "Descrizione@40" S0 + OUTPUT F_ARAGFIS CODTAB + CHECKTYPE NORMAL + GROUP G_RAGFIS +END + BOOL F_TOTALIDEPOSITI BEGIN PROMPT 2 7 "Suddivido per depositi" diff --git a/mg/mg4200a.frm b/mg/mg4200a.frm index 592b35db2..c0354f871 100755 --- a/mg/mg4200a.frm +++ b/mg/mg4200a.frm @@ -1,11 +1,11 @@ #include "mg4frm.h" -USE LF_ANAMAG KEY 1 -SORT LF_MAG BY ANNOES CODART LIVELLO CODMAG - JOIN TO LF_ANAMAG INTO ANNOES==1996 CODART==CODART +USE LF_MAG KEY 2 BY ANNOES CODART LIVELLO CODMAG +JOIN LF_ANAMAG TO LF_MAG INTO CODART==CODART JOIN MAG TO LF_MAG ALIAS 500 INTO CODTAB==CODMAG[1,3] JOIN MAG TO LF_MAG ALIAS 501 INTO CODTAB==CODMAG JOIN GMC TO LF_ANAMAG ALIAS 400 INTO CODTAB==GRMERC[1,3] JOIN GMC TO LF_ANAMAG ALIAS 401 INTO CODTAB==GRMERC +JOIN RFA TO LF_ANAMAG ALIAS 600 INTO CODTAB==RAGGFIS JOIN LF_UMART TO LF_ANAMAG INTO CODART==CODART END @@ -242,21 +242,6 @@ SECTION BODY ODD 0 COLUMNWISE PROMPT 18 1 "" FLAGS "H" END - - SECTION H_CATMER 1 2 1 GROUP - STRINGA 11 20 - BEGIN - KEY "CATMER" - PROMPT 2 1 "" - MESSAGE _USER,CODCATMER - END - STRINGA 12 70 - BEGIN - KEY "CODICE CATMER" - PROMPT 3 1 "" - MESSAGE _USER,CATMER|COPY,1550 - END - END STRINGA 60 20 BEGIN @@ -266,8 +251,53 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE RESET,15@|_USER,RESET_UM,1553 END - SECTION GRUPPI_CATMER 1 0 0 FILE LF_ANAMAG GROUP GRMERC + //Intestazione per ordinamento su categoria merceologica/raggruppamento fiscale + // I messaggi cambiano a seconda che il raggr. princ sia per cat.mer o ragg.fis. + SECTION H_CATMER 1 2 1 GROUP + STRINGA 11 20 + BEGIN + KEY "CATMER" + PROMPT 2 1 "@B" + MESSAGE _USER,CODCATMER|COPY,1550 + END + STRINGA 12 70 + BEGIN + KEY "CODICE CATMER" + PROMPT 3 1 "@R" + MESSAGE _USER,CATMER + END + END + // Raggruppamento cambiato a Run-time a seconda che sia per cat.mer o rag.fis. + SECTION GRUPPI_CATMER 1 0 0 FILE LF_MAG GROUP LF_ANAMAG->GRMERC + + STRINGA 60 20 + BEGIN + FLAGS "H" + KEY "SCATMER" + PROMPT 2 1 "" + MESSAGE RESET,16@|_USER,RESET_UM,1653 + END + + SECTION H_SCATMER 1 2 1 GROUP //HEADER + STRINGA 11 20 + BEGIN + KEY "SCATMER" + PROMPT 2 1 "" + FIELD LF_ANAMAG->GRMERC + MESSAGE COPY,1650 + GROUP 16 + END + STRINGA 12 70 + BEGIN + KEY "CODICE SCATMER" + PROMPT 3 1 "" + FIELD 401@->S0 + GROUP 16 + END + END + + SECTION GRUPPI_SCATMER 1 0 0 FILE LF_MAG GROUP LF_ANAMAG->GRMERC STRINGA 60 20 BEGIN FLAGS "H" @@ -290,7 +320,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART1 1 0 0 FILE LF_ANAMAG GROUP CODART + SECTION GRUPPI_CODART1 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 40 1 BEGIN FLAGS "H" @@ -313,7 +343,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART2 1 0 0 FILE LF_ANAMAG GROUP CODART + SECTION GRUPPI_CODART2 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 40 1 BEGIN FLAGS "H" @@ -336,7 +366,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART3 1 0 0 FILE LF_ANAMAG GROUP CODART + SECTION GRUPPI_CODART3 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 40 1 BEGIN FLAGS "H" @@ -359,7 +389,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART4 1 0 0 FILE LF_ANAMAG GROUP CODART + SECTION GRUPPI_CODART4 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 40 1 BEGIN FLAGS "H" @@ -382,7 +412,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART5 1 0 0 FILE LF_ANAMAG GROUP CODART + SECTION GRUPPI_CODART5 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 40 1 BEGIN FLAGS "H" @@ -405,7 +435,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART6 1 0 0 FILE LF_ANAMAG GROUP CODART + SECTION GRUPPI_CODART6 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 40 1 BEGIN FLAGS "H" @@ -428,7 +458,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART7 1 0 0 FILE LF_ANAMAG GROUP CODART + SECTION GRUPPI_CODART7 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 40 1 BEGIN FLAGS "H" @@ -452,7 +482,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION GRUPPI_CODART8 1 0 0 FILE LF_ANAMAG GROUP CODART + SECTION GRUPPI_CODART8 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 40 1 BEGIN FLAGS "H" @@ -477,7 +507,7 @@ SECTION BODY ODD 0 COLUMNWISE END END - SECTION FILE_GIACENZE 1 1 0 FILE LF_MAG + SECTION FILE_GIACENZE 1 0 0 FILE LF_MAG GROUP CODART STRINGA 60 40 1 BEGIN FLAGS "H" @@ -647,106 +677,113 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE _USER,GIAC|ADD,141 END - NUMERO 82 12 - BEGIN - KEY "VAL1M" - PROMPT 8 1 "" - PICTURE "###.###.##@" - MESSAGE _USER,VAL1 - GROUP FG_COL1 FG_COL1_UNIT - END - NUMERO 42 15 + VALUTA 42 15 BEGIN KEY "VAL1" PROMPT 7 1 "" PICTURE "##.###.###.##@" - MESSAGE _NUMEXPR,#82*#41|ADD,142 + MESSAGE _USER,VAL1|ADD,142|ADD,FL->11 END - NUMERO 83 12 + VALUTA 82 12 BEGIN - KEY "VAL2M" - PROMPT 10 1 "" + KEY "VAL1M" + PROMPT 8 1 "" + FLAGS "U" PICTURE "###.###.##@" - MESSAGE _USER,VAL2 - GROUP FG_COL2 FG_COL2_UNIT + GROUP FG_COL1 FG_COL1_UNIT + MESSAGE _NUMEXPR,#42/#41 END - NUMERO 43 15 + + VALUTA 43 15 BEGIN KEY "VAL2" PROMPT 9 1 "" PICTURE "##.###.###.##@" - MESSAGE _NUMEXPR,#83*#41|ADD,143 + MESSAGE _USER,VAL2|ADD,143|ADD,FL->13 GROUP FG_COL2 END - - NUMERO 84 12 + VALUTA 83 12 BEGIN - KEY "VAL3M" - PROMPT 12 1 "" + KEY "VAL2M" + PROMPT 10 1 "" + FLAGS "U" PICTURE "###.###.##@" - MESSAGE _USER,VAL3 - GROUP FG_COL3 FG_COL3_UNIT + MESSAGE _NUMEXPR,#43/#41 + GROUP FG_COL2 FG_COL2_UNIT END - NUMERO 44 15 + + VALUTA 44 15 BEGIN KEY "VAL3" PROMPT 11 1 "" PICTURE "##.###.###.##@" - MESSAGE _NUMEXPR,#84*#41|ADD,144 + MESSAGE _USER,VAL3|ADD,144|ADD,FL->15 GROUP FG_COL3 END + VALUTA 84 12 + BEGIN + KEY "VAL3M" + PROMPT 12 1 "" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#44/#41 + GROUP FG_COL3 FG_COL3_UNIT + END - NUMERO 85 12 + VALUTA 45 15 + BEGIN + KEY "VAL4" + PROMPT 13 1 "" + PICTURE "##.###.###.##@" + MESSAGE _USER,VAL4|ADD,145|ADD,FL->17 + GROUP FG_COL4 + END + VALUTA 85 12 BEGIN KEY "VAL4M" PROMPT 14 1 "" + FLAGS "U" PICTURE "###.###.##@" - MESSAGE _USER,VAL4 + MESSAGE _NUMEXPR,#45/#41 GROUP FG_COL4 FG_COL4_UNIT END - NUMERO 45 15 - BEGIN - KEY "VAL4" - PROMPT 13 1 "" - PICTURE "##.###.###.##@" - MESSAGE _NUMEXPR,#85*#41|ADD,145 - GROUP FG_COL4 - END - NUMERO 86 12 + VALUTA 46 15 + BEGIN + KEY "VAL5" + PROMPT 15 1 "" + PICTURE "##.###.###.##@" + MESSAGE _USER,VAL5|ADD,146|ADD,FL->19 + GROUP FG_COL5 + END + VALUTA 86 12 BEGIN KEY "VAL5M" PROMPT 16 1 "" + FLAGS "U" PICTURE "###.###.##@" - MESSAGE _USER,VAL5 + MESSAGE _NUMEXPR,#46/#41 GROUP FG_COL5 FG_COL5_UNIT END - NUMERO 46 15 - BEGIN - KEY "VAL5" - PROMPT 15 1 "" - PICTURE "##.###.###.##@" - MESSAGE _NUMEXPR,#86*#41|ADD,146 - GROUP FG_COL5 - END - NUMERO 87 12 - BEGIN - KEY "VAL6M" - PROMPT 18 1 "" - PICTURE "###.###.##@" - MESSAGE _USER,VAL6 - GROUP FG_COL6 - END - NUMERO 47 15 + VALUTA 47 15 BEGIN KEY "VAL6" PROMPT 17 1 "" PICTURE "##.###.###.##@" - MESSAGE _NUMEXPR,#87*#41|ADD,147 + MESSAGE _USER,VAL6|ADD,147|ADD,FL->21 GROUP FG_COL6 END + VALUTA 87 12 + BEGIN + KEY "VAL6M" + PROMPT 18 1 "" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#47/#41 + GROUP FG_COL6 FG_COL6_UNIT + END END // depositi dello stesso magazzino END // MAGAZZ @@ -776,7 +813,7 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,241 GROUP 1 END - NUMERO 142 15 + VALUTA 142 15 BEGIN KEY "VAL1" PROMPT 7 1 "" @@ -784,15 +821,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,242 GROUP 1 END - NUMERO 182 12 + VALUTA 182 12 BEGIN KEY "VAL1" PROMPT 8 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#142/#141 GROUP 1 FG_COL1 FG_COL1_UNIT END - NUMERO 143 15 + VALUTA 143 15 BEGIN KEY "VAL2" PROMPT 9 1 "" @@ -800,15 +838,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,243 GROUP 1 FG_COL2 END - NUMERO 183 12 + VALUTA 183 12 BEGIN KEY "VAL1" PROMPT 10 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#143/#141 GROUP 1 FG_COL2 FG_COL2_UNIT END - NUMERO 144 15 + VALUTA 144 15 BEGIN KEY "VAL3" PROMPT 11 1 "" @@ -816,15 +855,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,244 GROUP 1 FG_COL3 END - NUMERO 184 12 + VALUTA 184 12 BEGIN KEY "VAL1" PROMPT 12 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#144/#141 GROUP 1 FG_COL3 FG_COL3_UNIT END - NUMERO 145 15 + VALUTA 145 15 BEGIN KEY "VAL4" PROMPT 13 1 "" @@ -832,15 +872,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,245 GROUP 1 FG_COL4 END - NUMERO 185 12 + VALUTA 185 12 BEGIN KEY "VAL4" PROMPT 14 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#145/#141 GROUP 1 FG_COL4 FG_COL4_UNIT END - NUMERO 146 15 + VALUTA 146 15 BEGIN KEY "VAL5" PROMPT 15 1 "" @@ -848,15 +889,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,246 GROUP 1 FG_COL5 END - NUMERO 186 12 + VALUTA 186 12 BEGIN KEY "VAL1" PROMPT 16 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#146/#141 GROUP 1 FG_COL5 FG_COL5_UNIT END - NUMERO 147 15 + VALUTA 147 15 BEGIN KEY "VAL6" PROMPT 17 1 "" @@ -864,10 +906,11 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,247 GROUP 1 FG_COL6 END - NUMERO 187 12 + VALUTA 187 12 BEGIN KEY "VAL6" PROMPT 18 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#147/#141 GROUP 1 FG_COL6 FG_COL6_UNIT @@ -899,7 +942,7 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,341 GROUP 2 END - NUMERO 242 15 + VALUTA 242 15 BEGIN KEY "VAL1" PROMPT 7 1 "" @@ -907,15 +950,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,342 GROUP 2 END - NUMERO 282 12 + VALUTA 282 12 BEGIN KEY "VAL_MEDIO" PROMPT 8 1 "" PICTURE "###.###.##@" + FLAGS "U" MESSAGE _NUMEXPR,#242/#241 GROUP 2 FG_COL1 FG_COL1_UNIT END - NUMERO 243 15 + VALUTA 243 15 BEGIN KEY "VAL2" PROMPT 9 1 "" @@ -923,15 +967,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,343 GROUP 2 FG_COL2 END - NUMERO 283 12 + VALUTA 283 12 BEGIN KEY "VAL_MEDIO" PROMPT 10 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#243/#241 GROUP 2 FG_COL2 FG_COL2_UNIT END - NUMERO 244 15 + VALUTA 244 15 BEGIN KEY "VAL3" PROMPT 11 1 "" @@ -939,15 +984,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,344 GROUP 2 FG_COL3 END - NUMERO 284 12 + VALUTA 284 12 BEGIN KEY "VAL_MEDIO" PROMPT 12 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#244/#241 GROUP 2 FG_COL3 FG_COL3_UNIT END - NUMERO 245 15 + VALUTA 245 15 BEGIN KEY "COL4" PROMPT 13 1 "" @@ -955,15 +1001,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,345 GROUP 2 FG_COL4 END - NUMERO 285 12 + VALUTA 285 12 BEGIN KEY "VAL_MEDIO" PROMPT 14 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#245/#241 GROUP 2 FG_COL4 FG_COL4_UNIT END - NUMERO 246 15 + VALUTA 246 15 BEGIN KEY "COL5" PROMPT 15 1 "" @@ -971,15 +1018,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,346 GROUP 2 FG_COL5 END - NUMERO 286 12 + VALUTA 286 12 BEGIN KEY "VAL_MEDIO" PROMPT 16 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#246/#241 GROUP 2 FG_COL5 FG_COL5_UNIT END - NUMERO 247 15 + VALUTA 247 15 BEGIN KEY "giac" PROMPT 17 1 "" @@ -987,10 +1035,11 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,347 GROUP 2 FG_COL6 END - NUMERO 287 12 + VALUTA 287 12 BEGIN KEY "VAL_MEDIO" PROMPT 18 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#246/#241 GROUP 2 FG_COL6 FG_COL6_UNIT @@ -1023,7 +1072,7 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,441 GROUP 3 END - NUMERO 342 15 + VALUTA 342 15 BEGIN KEY "COL1" PROMPT 7 1 "" @@ -1031,15 +1080,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,442 GROUP 3 END - NUMERO 382 12 + VALUTA 382 12 BEGIN KEY "VAL_MEDIO" PROMPT 8 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#342/#341 GROUP 3 FG_COL1 FG_COL1_UNIT END - NUMERO 343 15 + VALUTA 343 15 BEGIN KEY "COL2" PROMPT 9 1 "" @@ -1047,15 +1097,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,443 GROUP 3 FG_COL2 END - NUMERO 383 12 + VALUTA 383 12 BEGIN KEY "VAL_MEDIO" PROMPT 10 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#343/#341 GROUP 3 FG_COL2 FG_COL2_UNIT END - NUMERO 344 15 + VALUTA 344 15 BEGIN KEY "COL3" PROMPT 11 1 "" @@ -1063,15 +1114,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,444 GROUP 3 FG_COL3 END - NUMERO 384 12 + VALUTA 384 12 BEGIN KEY "VAL_MEDIO" PROMPT 12 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#344/#341 GROUP 3 FG_COL3 FG_COL3_UNIT END - NUMERO 345 15 + VALUTA 345 15 BEGIN KEY "COL4" PROMPT 13 1 "" @@ -1079,15 +1131,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,445 GROUP 3 FG_COL4 END - NUMERO 385 12 + VALUTA 385 12 BEGIN KEY "VAL_MEDIO" PROMPT 14 1 "" PICTURE "###.###.##@" + FLAGS "U" MESSAGE _NUMEXPR,#345/#341 GROUP 3 FG_COL4 FG_COL4_UNIT END - NUMERO 346 15 + VALUTA 346 15 BEGIN KEY "COL5" PROMPT 15 1 "" @@ -1095,26 +1148,29 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,446 GROUP 3 FG_COL5 END - NUMERO 386 12 + VALUTA 386 12 BEGIN KEY "VAL_MEDIO" PROMPT 16 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#346/#341 GROUP 3 FG_COL5 FG_COL5_UNIT END - NUMERO 347 15 + VALUTA 347 15 BEGIN KEY "COL6" PROMPT 17 1 "" + FLAGS "U" PICTURE "##.###.###.##@" MESSAGE ADD,447 GROUP 3 FG_COL6 END - NUMERO 387 12 + VALUTA 387 12 BEGIN KEY "VAL_MEDIO" PROMPT 18 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#347/#341 GROUP 3 FG_COL6 FG_COL6_UNIT @@ -1147,7 +1203,7 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,541 GROUP 4 END - NUMERO 442 15 + VALUTA 442 15 BEGIN KEY "VAL1" PROMPT 7 1 "" @@ -1155,15 +1211,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,542 GROUP 4 END - NUMERO 482 12 + VALUTA 482 12 BEGIN KEY "VAL_MEDIO" PROMPT 8 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#442/#441 GROUP 4 FG_COL1 FG_COL1_UNIT END - NUMERO 443 15 + VALUTA 443 15 BEGIN KEY "COL2" PROMPT 9 1 "" @@ -1171,15 +1228,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,543 GROUP 4 FG_COL2 END - NUMERO 483 12 + VALUTA 483 12 BEGIN KEY "VAL_MEDIO" PROMPT 10 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#443/#441 GROUP 4 FG_COL2 FG_COL2_UNIT END - NUMERO 444 15 + VALUTA 444 15 BEGIN KEY "COL3" PROMPT 11 1 "" @@ -1187,15 +1245,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,544 GROUP 4 FG_COL3 END - NUMERO 484 12 + VALUTA 484 12 BEGIN KEY "VAL_MEDIO" PROMPT 12 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#444/#441 GROUP 4 FG_COL3 FG_COL3_UNIT END - NUMERO 445 15 + VALUTA 445 15 BEGIN KEY "COL4" PROMPT 13 1 "" @@ -1203,15 +1262,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,545 GROUP 4 FG_COL4 END - NUMERO 485 12 + VALUTA 485 12 BEGIN KEY "VAL_MEDIO" PROMPT 14 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#445/#441 GROUP 4 FG_COL4 FG_COL4_UNIT END - NUMERO 446 15 + VALUTA 446 15 BEGIN KEY "COL5" PROMPT 15 1 "" @@ -1219,15 +1279,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,546 GROUP 4 FG_COL5 END - NUMERO 486 12 + VALUTA 486 12 BEGIN KEY "VAL_MEDIO" PROMPT 16 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#446/#441 GROUP 4 FG_COL5 FG_COL5_UNIT END - NUMERO 447 15 + VALUTA 447 15 BEGIN KEY "giac" PROMPT 17 1 "" @@ -1235,10 +1296,11 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,547 GROUP 4 FG_COL6 END - NUMERO 487 12 + VALUTA 487 12 BEGIN KEY "VAL_MEDIO" PROMPT 18 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#447/#441 GROUP 4 FG_COL6 FG_COL6_UNIT @@ -1270,7 +1332,7 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,641 GROUP 5 END - NUMERO 542 15 + VALUTA 542 15 BEGIN KEY "VAL1" PROMPT 7 1 "" @@ -1278,15 +1340,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,642 GROUP 5 END - NUMERO 582 12 + VALUTA 582 12 BEGIN KEY "VAL_MEDIO" PROMPT 8 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#542/#541 GROUP 5 FG_COL1 FG_COL1_UNIT END - NUMERO 543 15 + VALUTA 543 15 BEGIN KEY "COL2" PROMPT 9 1 "" @@ -1294,15 +1357,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,643 GROUP 5 FG_COL2 END - NUMERO 583 12 + VALUTA 583 12 BEGIN KEY "VAL_MEDIO" PROMPT 10 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#543/#541 GROUP 5 FG_COL2 FG_COL2_UNIT END - NUMERO 544 15 + VALUTA 544 15 BEGIN KEY "COL3" PROMPT 11 1 "" @@ -1310,15 +1374,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,644 GROUP 5 FG_COL3 END - NUMERO 584 12 + VALUTA 584 12 BEGIN KEY "VAL_MEDIO" PROMPT 12 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#544/#541 GROUP 5 FG_COL3 FG_COL3_UNIT END - NUMERO 545 15 + VALUTA 545 15 BEGIN KEY "COL4" PROMPT 13 1 "" @@ -1326,15 +1391,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,645 GROUP 5 FG_COL4 END - NUMERO 585 12 + VALUTA 585 12 BEGIN KEY "VAL_MEDIO" PROMPT 14 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#545/#541 GROUP 5 FG_COL4 FG_COL4_UNIT END - NUMERO 546 15 + VALUTA 546 15 BEGIN KEY "COL5" PROMPT 15 1 "" @@ -1342,15 +1408,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,646 GROUP 5 FG_COL5 END - NUMERO 586 12 + VALUTA 586 12 BEGIN KEY "VAL_MEDIO" PROMPT 16 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#546/#541 GROUP 5 FG_COL5 FG_COL5_UNIT END - NUMERO 547 15 + VALUTA 547 15 BEGIN KEY "giac" PROMPT 17 1 "" @@ -1358,10 +1425,11 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,647 GROUP 5 FG_COL6 END - NUMERO 587 12 + VALUTA 587 12 BEGIN KEY "VAL_MEDIO" PROMPT 18 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#547/#541 GROUP 5 FG_COL6 FG_COL6_UNIT @@ -1369,7 +1437,7 @@ SECTION BODY ODD 0 COLUMNWISE END // tot ggiac1 END // FILE GIACENZE - SECTION TOT_ARTICOLO 1 1 1 FOOTER + SECTION TOT_ARTICOLO 1 1 1 GROUP //FOOTER STRINGA 650 30 1 BEGIN KEY "" @@ -1394,7 +1462,7 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,741 GROUP 6 END - NUMERO 642 15 + VALUTA 642 15 BEGIN KEY "VAL1" PROMPT 7 1 "" @@ -1402,15 +1470,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,742 GROUP 6 END - NUMERO 682 12 + VALUTA 682 12 BEGIN KEY "VAL_MEDIO" PROMPT 8 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#642/#641 GROUP 6 FG_COL1 FG_COL1_UNIT END - NUMERO 643 15 + VALUTA 643 15 BEGIN KEY "COL2" PROMPT 9 1 "" @@ -1418,15 +1487,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,743 GROUP 6 FG_COL2 END - NUMERO 683 12 + VALUTA 683 12 BEGIN KEY "VAL_MEDIO" PROMPT 10 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#643/#641 GROUP 6 FG_COL2 FG_COL2_UNIT END - NUMERO 644 15 + VALUTA 644 15 BEGIN KEY "COL3" PROMPT 11 1 "" @@ -1434,15 +1504,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,744 GROUP 6 FG_COL3 END - NUMERO 684 12 + VALUTA 684 12 BEGIN KEY "VAL_MEDIO" PROMPT 12 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#644/#641 GROUP 6 FG_COL3 FG_COL3_UNIT END - NUMERO 645 15 + VALUTA 645 15 BEGIN KEY "COL4" PROMPT 13 1 "" @@ -1450,15 +1521,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,745 GROUP 6 FG_COL4 END - NUMERO 685 12 + VALUTA 685 12 BEGIN KEY "VAL_MEDIO" PROMPT 14 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#645/#641 GROUP 6 FG_COL4 FG_COL4_UNIT END - NUMERO 646 15 + VALUTA 646 15 BEGIN KEY "COL5" PROMPT 15 1 "" @@ -1466,15 +1538,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,746 GROUP 6 FG_COL5 END - NUMERO 686 12 + VALUTA 686 12 BEGIN KEY "VAL_MEDIO" PROMPT 16 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#646/#641 GROUP 6 FG_COL5 FG_COL5_UNIT END - NUMERO 647 15 + VALUTA 647 15 BEGIN KEY "giac" PROMPT 17 1 "" @@ -1482,10 +1555,11 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,747 GROUP 6 FG_COL6 END - NUMERO 687 12 + VALUTA 687 12 BEGIN KEY "VAL_MEDIO" PROMPT 18 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#647/#641 GROUP 6 FG_COL6 FG_COL6_UNIT @@ -1518,7 +1592,7 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE _USER,VALIDATE_UM,753|ADD,841 GROUP 7 END - NUMERO 742 15 + VALUTA 742 15 BEGIN KEY "VAL1" PROMPT 7 1 "" @@ -1526,15 +1600,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,842 GROUP 7 END - NUMERO 782 12 + VALUTA 782 12 BEGIN KEY "VAL_MEDIO" PROMPT 8 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#742/#741 GROUP 7 FG_COL1 FG_COL1_UNIT END - NUMERO 743 15 + VALUTA 743 15 BEGIN KEY "COL2" PROMPT 9 1 "" @@ -1542,15 +1617,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,843 GROUP 7 FG_COL2 END - NUMERO 783 12 + VALUTA 783 12 BEGIN KEY "VAL_MEDIO" PROMPT 10 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#743/#741 GROUP 7 FG_COL2 FG_COL2_UNIT END - NUMERO 744 15 + VALUTA 744 15 BEGIN KEY "COL3" PROMPT 11 1 "" @@ -1558,15 +1634,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,844 GROUP 7 FG_COL3 END - NUMERO 784 12 + VALUTA 784 12 BEGIN KEY "VAL_MEDIO" PROMPT 12 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#744/#741 GROUP 7 FG_COL3 FG_COL3_UNIT END - NUMERO 745 15 + VALUTA 745 15 BEGIN KEY "COL4" PROMPT 13 1 "" @@ -1574,15 +1651,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,845 GROUP 7 FG_COL4 END - NUMERO 785 12 + VALUTA 785 12 BEGIN KEY "VAL_MEDIO" PROMPT 14 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#745/#741 GROUP 7 FG_COL4 FG_COL4_UNIT END - NUMERO 746 15 + VALUTA 746 15 BEGIN KEY "COL5" PROMPT 15 1 "" @@ -1590,15 +1668,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,846 GROUP 7 FG_COL5 END - NUMERO 786 12 + VALUTA 786 12 BEGIN KEY "VAL_MEDIO" PROMPT 16 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#746/#741 GROUP 7 FG_COL5 FG_COL5_UNIT END - NUMERO 747 15 + VALUTA 747 15 BEGIN KEY "COL6" PROMPT 17 1 "" @@ -1606,10 +1685,11 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,847 GROUP 7 FG_COL6 END - NUMERO 787 12 + VALUTA 787 12 BEGIN KEY "VAL_MEDIO" PROMPT 18 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#747/#741 GROUP 7 FG_COL6 FG_COL6_UNIT @@ -1642,7 +1722,7 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE _USER,VALIDATE_UM,853|ADD,941 GROUP 8 END - NUMERO 842 15 + VALUTA 842 15 BEGIN KEY "VAL1" PROMPT 7 1 "" @@ -1650,15 +1730,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,942 GROUP 8 END - NUMERO 882 12 + VALUTA 882 12 BEGIN KEY "VAL_MEDIO" PROMPT 8 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#842/#841 GROUP 8 FG_COL1 FG_COL1_UNIT END - NUMERO 843 15 + VALUTA 843 15 BEGIN KEY "COL2" PROMPT 9 1 "" @@ -1666,15 +1747,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,943 GROUP 8 FG_COL2 END - NUMERO 883 12 + VALUTA 883 12 BEGIN KEY "VAL_MEDIO" PROMPT 10 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#843/#841 GROUP 8 FG_COL2 FG_COL2_UNIT END - NUMERO 844 15 + VALUTA 844 15 BEGIN KEY "COL3" PROMPT 11 1 "" @@ -1682,15 +1764,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,944 GROUP 8 FG_COL3 END - NUMERO 884 12 + VALUTA 884 12 BEGIN KEY "VAL_MEDIO" PROMPT 12 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#844/#841 GROUP 8 FG_COL3 FG_COL3_UNIT END - NUMERO 845 15 + VALUTA 845 15 BEGIN KEY "COL4" PROMPT 13 1 "" @@ -1698,15 +1781,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,945 GROUP 8 FG_COL4 END - NUMERO 885 12 + VALUTA 885 12 BEGIN KEY "VAL_MEDIO" PROMPT 14 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#845/#841 GROUP 8 FG_COL4 FG_COL4_UNIT END - NUMERO 846 15 + VALUTA 846 15 BEGIN KEY "COL5" PROMPT 15 1 "" @@ -1714,15 +1798,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,946 GROUP 8 FG_COL5 END - NUMERO 886 12 + VALUTA 886 12 BEGIN KEY "VAL_MEDIO" PROMPT 16 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#846/#841 GROUP 8 FG_COL5 FG_COL5_UNIT END - NUMERO 847 15 + VALUTA 847 15 BEGIN KEY "giac" PROMPT 17 1 "" @@ -1730,10 +1815,11 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,947 GROUP 8 FG_COL6 END - NUMERO 887 12 + VALUTA 887 12 BEGIN KEY "VAL_MEDIO" PROMPT 18 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#847/#841 GROUP 8 FG_COL6 FG_COL6_UNIT @@ -1766,7 +1852,7 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE _USER,VALIDATE_UM,953|ADD,1041 GROUP 9 END - NUMERO 942 15 + VALUTA 942 15 BEGIN KEY "VAL1" PROMPT 7 1 "" @@ -1774,15 +1860,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1042 GROUP 9 END - NUMERO 982 12 + VALUTA 982 12 BEGIN KEY "VAL_MEDIO" PROMPT 8 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#942/#941 GROUP 9 FG_COL1 FG_COL1_UNIT END - NUMERO 943 15 + VALUTA 943 15 BEGIN KEY "COL2" PROMPT 9 1 "" @@ -1790,15 +1877,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1043 GROUP 9 FG_COL2 END - NUMERO 983 12 + VALUTA 983 12 BEGIN KEY "VAL_MEDIO" PROMPT 10 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#943/#941 GROUP 9 FG_COL2 FG_COL2_UNIT END - NUMERO 944 15 + VALUTA 944 15 BEGIN KEY "COL3" PROMPT 11 1 "" @@ -1806,15 +1894,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1044 GROUP 9 FG_COL3 END - NUMERO 984 12 + VALUTA 984 12 BEGIN KEY "VAL_MEDIO" PROMPT 12 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#944/#941 GROUP 9 FG_COL3 FG_COL3_UNIT END - NUMERO 945 15 + VALUTA 945 15 BEGIN KEY "COL4" PROMPT 13 1 "" @@ -1822,15 +1911,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1045 GROUP 9 FG_COL4 END - NUMERO 985 12 + VALUTA 985 12 BEGIN KEY "VAL_MEDIO" PROMPT 14 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#945/#941 GROUP 9 FG_COL4 FG_COL4_UNIT END - NUMERO 946 15 + VALUTA 946 15 BEGIN KEY "COL5" PROMPT 15 1 "" @@ -1838,15 +1928,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1046 GROUP 9 FG_COL5 END - NUMERO 986 12 + VALUTA 986 12 BEGIN KEY "VAL_MEDIO" PROMPT 16 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#946/#941 GROUP 9 FG_COL5 FG_COL5_UNIT END - NUMERO 947 15 + VALUTA 947 15 BEGIN KEY "giac" PROMPT 17 1 "" @@ -1854,10 +1945,11 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1047 GROUP 9 FG_COL6 END - NUMERO 987 12 + VALUTA 987 12 BEGIN KEY "VAL_MEDIO" PROMPT 18 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#947/#941 GROUP 9 FG_COL6 FG_COL6_UNIT @@ -1890,7 +1982,7 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE _USER,VALIDATE_UM,1053|ADD,1141 GROUP 10 END - NUMERO 1042 15 + VALUTA 1042 15 BEGIN KEY "VAL1" PROMPT 7 1 "" @@ -1898,15 +1990,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1142 GROUP 10 END - NUMERO 1082 12 + VALUTA 1082 12 BEGIN KEY "VAL_MEDIO" PROMPT 8 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1042/#1041 GROUP FG_COL1 FG_COL1_UNIT END - NUMERO 1043 15 + VALUTA 1043 15 BEGIN KEY "COL2" PROMPT 9 1 "" @@ -1914,15 +2007,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1143 GROUP 10 FG_COL2 END - NUMERO 1083 12 + VALUTA 1083 12 BEGIN KEY "VAL_MEDIO" PROMPT 10 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1043/#1041 GROUP FG_COL2 FG_COL2_UNIT END - NUMERO 1044 15 + VALUTA 1044 15 BEGIN KEY "COL3" PROMPT 11 1 "" @@ -1930,15 +2024,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1144 GROUP 10 FG_COL3 END - NUMERO 1084 12 + VALUTA 1084 12 BEGIN KEY "VAL_MEDIO" PROMPT 12 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1044/#1041 GROUP FG_COL3 FG_COL3_UNIT END - NUMERO 1045 15 + VALUTA 1045 15 BEGIN KEY "COL4" PROMPT 13 1 "" @@ -1946,15 +2041,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1145 GROUP 10 FG_COL4 END - NUMERO 1085 12 + VALUTA 1085 12 BEGIN KEY "VAL_MEDIO" PROMPT 14 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1045/#1041 GROUP FG_COL4 FG_COL4_UNIT END - NUMERO 1046 15 + VALUTA 1046 15 BEGIN KEY "COL5" PROMPT 15 1 "" @@ -1962,15 +2058,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1146 GROUP 10 FG_COL5 END - NUMERO 1086 12 + VALUTA 1086 12 BEGIN KEY "VAL_MEDIO" PROMPT 16 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1046/#1041 GROUP FG_COL5 FG_COL5_UNIT END - NUMERO 1047 15 + VALUTA 1047 15 BEGIN KEY "giac" PROMPT 17 1 "" @@ -1978,10 +2075,11 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1147 GROUP 10 FG_COL6 END - NUMERO 1087 12 + VALUTA 1087 12 BEGIN KEY "VAL_MEDIO" PROMPT 18 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1047/#1041 GROUP FG_COL6 FG_COL6_UNIT @@ -2014,7 +2112,7 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE _USER,VALIDATE_UM,1153|ADD,1241 GROUP 11 END - NUMERO 1142 15 + VALUTA 1142 15 BEGIN KEY "VAL1" PROMPT 7 1 "" @@ -2022,15 +2120,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1242 GROUP 11 END - NUMERO 1182 12 + VALUTA 1182 12 BEGIN KEY "VAL_MEDIO" PROMPT 8 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1142/#1141 GROUP FG_COL1 FG_COL1_UNIT END - NUMERO 1143 15 + VALUTA 1143 15 BEGIN KEY "COL2" PROMPT 9 1 "" @@ -2038,15 +2137,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1243 GROUP 11 FG_COL2 END - NUMERO 1183 12 + VALUTA 1183 12 BEGIN KEY "VAL_MEDIO" + FLAGS "U" PROMPT 10 1 "" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1143/#1141 GROUP FG_COL2 FG_COL2_UNIT END - NUMERO 1144 15 + VALUTA 1144 15 BEGIN KEY "COL3" PROMPT 11 1 "" @@ -2054,15 +2154,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1244 GROUP 11 FG_COL3 END - NUMERO 1184 12 + VALUTA 1184 12 BEGIN KEY "VAL_MEDIO" PROMPT 12 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1144/#1141 GROUP FG_COL3 FG_COL3_UNIT END - NUMERO 1145 15 + VALUTA 1145 15 BEGIN KEY "COL4" PROMPT 13 1 "" @@ -2070,15 +2171,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1245 GROUP 11 FG_COL4 END - NUMERO 1185 12 + VALUTA 1185 12 BEGIN KEY "VAL_MEDIO" PROMPT 14 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1145/#1141 GROUP FG_COL4 FG_COL4_UNIT END - NUMERO 1146 15 + VALUTA 1146 15 BEGIN KEY "COL5" PROMPT 15 1 "" @@ -2086,15 +2188,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1246 GROUP 11 FG_COL5 END - NUMERO 1186 12 + VALUTA 1186 12 BEGIN KEY "VAL_MEDIO" PROMPT 16 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1146/#1141 GROUP FG_COL5 FG_COL5_UNIT END - NUMERO 1147 15 + VALUTA 1147 15 BEGIN KEY "giac" PROMPT 17 1 "" @@ -2102,10 +2205,11 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1247 GROUP 11 FG_COL6 END - NUMERO 1187 12 + VALUTA 1187 12 BEGIN KEY "VAL_MEDIO" PROMPT 18 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1147/#1141 GROUP FG_COL6 FG_COL6_UNIT @@ -2138,7 +2242,7 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE _USER,VALIDATE_UM,1253|ADD,1341 GROUP 12 END - NUMERO 1242 15 + VALUTA 1242 15 BEGIN KEY "VAL1" PROMPT 7 1 "" @@ -2146,15 +2250,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1342 GROUP 12 END - NUMERO 1282 12 + VALUTA 1282 12 BEGIN KEY "VALMEDIO" PROMPT 8 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1242/#1241 GROUP 12 FG_COL1 FG_COL1_UNIT END - NUMERO 1243 15 + VALUTA 1243 15 BEGIN KEY "COL2" PROMPT 9 1 "" @@ -2162,15 +2267,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1343 GROUP 12 FG_COL2 END - NUMERO 1283 12 + VALUTA 1283 12 BEGIN KEY "VALMEDIO" PROMPT 10 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1243/#1241 GROUP 12 FG_COL2 FG_COL2_UNIT END - NUMERO 1244 15 + VALUTA 1244 15 BEGIN KEY "COL3" PROMPT 11 1 "" @@ -2178,15 +2284,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1344 GROUP 12 FG_COL3 END - NUMERO 1284 12 + VALUTA 1284 12 BEGIN KEY "VALMEDIO" PROMPT 12 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1244/#1241 GROUP 12 FG_COL3 FG_COL3_UNIT END - NUMERO 1245 15 + VALUTA 1245 15 BEGIN KEY "COL4" PROMPT 13 1 "" @@ -2194,15 +2301,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1345 GROUP 12 FG_COL4 END - NUMERO 1285 12 + VALUTA 1285 12 BEGIN KEY "VALMEDIO" PROMPT 14 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1245/#1241 GROUP 12 FG_COL4 FG_COL4_UNIT END - NUMERO 1246 15 + VALUTA 1246 15 BEGIN KEY "COL5" PROMPT 15 1 "" @@ -2210,15 +2318,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1346 GROUP 12 FG_COL5 END - NUMERO 1286 12 + VALUTA 1286 12 BEGIN KEY "VALMEDIO" PROMPT 16 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1246/#1241 GROUP 12 FG_COL5 FG_COL5_UNIT END - NUMERO 1247 15 + VALUTA 1247 15 BEGIN KEY "giac" PROMPT 17 1 "" @@ -2226,10 +2335,11 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1347 GROUP 12 FG_COL6 END - NUMERO 1287 12 + VALUTA 1287 12 BEGIN KEY "VALMEDIO" PROMPT 18 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1247/#1241 GROUP 12 FG_COL6 FG_COL6_UNIT @@ -2262,7 +2372,7 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE _USER,VALIDATE_UM,1353|ADD,1441 GROUP 13 END - NUMERO 1342 15 + VALUTA 1342 15 BEGIN KEY "VAL1" PROMPT 7 1 "" @@ -2270,15 +2380,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1442 GROUP 13 END - NUMERO 1382 12 + VALUTA 1382 12 BEGIN KEY "VALMEDIO" PROMPT 8 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1342/#1341 GROUP 13 FG_COL1 FG_COL1_UNIT END - NUMERO 1343 15 + VALUTA 1343 15 BEGIN KEY "COL2" PROMPT 9 1 "" @@ -2286,15 +2397,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1443 GROUP 13 FG_COL2 END - NUMERO 1383 12 + VALUTA 1383 12 BEGIN KEY "VALMEDIO" PROMPT 10 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1343/#1341 GROUP 13 FG_COL2 FG_COL2_UNIT END - NUMERO 1344 15 + VALUTA 1344 15 BEGIN KEY "COL3" PROMPT 11 1 "" @@ -2302,15 +2414,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1444 GROUP 13 FG_COL3 END - NUMERO 1384 12 + VALUTA 1384 12 BEGIN KEY "VALMEDIO" PROMPT 12 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1344/#1341 GROUP 13 FG_COL3 FG_COL3_UNIT END - NUMERO 1345 15 + VALUTA 1345 15 BEGIN KEY "COL4" PROMPT 13 1 "" @@ -2318,15 +2431,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1445 GROUP 13 FG_COL4 END - NUMERO 1385 12 + VALUTA 1385 12 BEGIN KEY "VALMEDIO" PROMPT 14 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1345/#1341 GROUP 13 FG_COL4 FG_COL4_UNIT END - NUMERO 1346 15 + VALUTA 1346 15 BEGIN KEY "COL5" PROMPT 15 1 "" @@ -2334,15 +2448,16 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1446 GROUP 13 FG_COL5 END - NUMERO 1386 12 + VALUTA 1386 12 BEGIN KEY "VALMEDIO" PROMPT 16 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1346/#1341 GROUP 13 FG_COL5 FG_COL5_UNIT END - NUMERO 1347 15 + VALUTA 1347 15 BEGIN KEY "giac" PROMPT 17 1 "" @@ -2350,10 +2465,11 @@ SECTION BODY ODD 0 COLUMNWISE MESSAGE ADD,1447 GROUP 13 FG_COL6 END - NUMERO 1387 12 + VALUTA 1387 12 BEGIN KEY "VALMEDIO" PROMPT 18 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1347/#1341 GROUP 13 FG_COL6 FG_COL6_UNIT @@ -2376,116 +2492,245 @@ SECTION BODY ODD 0 COLUMNWISE BEGIN KEY "UM" PROMPT 5 1 "" - MESSAGE _USER,COPY_UM,1553 + //MESSAGE _USER,COPY_UM,1553|_USER,COPY_UM,1653 END NUMERO 1441 12 BEGIN KEY "GIAC" PROMPT 6 1 "" PICTURE "########,@##" - MESSAGE _USER,VALIDATE_UM,1453|ADD,1541 + MESSAGE _USER,VALIDATE_UM,1453//|ADD,1541|ADD,1641 GROUP 14 END - NUMERO 1442 15 + VALUTA 1442 15 BEGIN KEY "VAL1" PROMPT 7 1 "" PICTURE "##.###.###.##@" - MESSAGE ADD,1542 + MESSAGE ADD,1542|ADD,1642 GROUP 14 END - NUMERO 1482 12 + VALUTA 1482 12 BEGIN KEY "VALMEDIO" PROMPT 8 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1442/#1441 GROUP 14 FG_COL1 FG_COL1_UNIT END - NUMERO 1443 15 + VALUTA 1443 15 BEGIN KEY "COL2" PROMPT 9 1 "" PICTURE "##.###.###.##@" - MESSAGE ADD,1543 + MESSAGE ADD,1543|ADD,1643 GROUP 14 FG_COL2 END - NUMERO 1483 12 + VALUTA 1483 12 BEGIN KEY "VALMEDIO" PROMPT 10 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1443/#1441 GROUP 14 FG_COL2 FG_COL2_UNIT END - NUMERO 1444 15 + VALUTA 1444 15 BEGIN KEY "COL3" PROMPT 11 1 "" PICTURE "##.###.###.##@" - MESSAGE ADD,1544 + MESSAGE ADD,1544|ADD,1644 GROUP 14 FG_COL3 END - NUMERO 1484 12 + VALUTA 1484 12 BEGIN KEY "VALMEDIO" PROMPT 12 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1444/#1441 GROUP 14 FG_COL3 FG_COL3_UNIT END - NUMERO 1445 15 + VALUTA 1445 15 BEGIN KEY "COL4" PROMPT 13 1 "" PICTURE "##.###.###.##@" - MESSAGE ADD,1545 + MESSAGE ADD,1545|ADD,1645 GROUP 14 FG_COL4 END - NUMERO 1485 12 + VALUTA 1485 12 BEGIN KEY "VALMEDIO" PROMPT 14 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1445/#1441 GROUP 14 FG_COL4 FG_COL4_UNIT END - NUMERO 1446 15 + VALUTA 1446 15 BEGIN KEY "COL5" PROMPT 15 1 "" PICTURE "##.###.###.##@" - MESSAGE ADD,1546 + MESSAGE ADD,1546|ADD,1646 GROUP 14 FG_COL5 END - NUMERO 1486 12 + VALUTA 1486 12 BEGIN KEY "VALMEDIO" PROMPT 16 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1446/#1441 GROUP 14 FG_COL5 FG_COL5_UNIT END - NUMERO 1447 15 + VALUTA 1447 15 BEGIN KEY "giac" PROMPT 17 1 "" PICTURE "##.###.###.##@" - MESSAGE ADD,1547 + MESSAGE ADD,1547|ADD,1647 GROUP 14 FG_COL6 END - NUMERO 1487 12 + VALUTA 1487 12 BEGIN KEY "VALMEDIO" PROMPT 18 1 "" + FLAGS "U" PICTURE "###.###.##@" MESSAGE _NUMEXPR,#1447/#1441 GROUP 14 FG_COL6 FG_COL6_UNIT END END // tot gart1 + END // GRUPPI_SCATMER - END // GRUPPI_CATMER - SECTION TOT_CATMER 1 1 1 FOOTER + SECTION TOT_SCATMER 1 1 1 GROUP //FOOTER + STRINGA 1650 30 + BEGIN + KEY "" + PROMPT 3 1 "Totale " + END + STRINGA 1651 20 + BEGIN + KEY "" + PROMPT 2 1 "" + END + STRINGA 1653 3 + BEGIN + KEY "UM" + PROMPT 5 1 "" + END + NUMERO 1641 12 + BEGIN + KEY "GIAC" + PROMPT 6 1 "" + PICTURE "########,@##" + //MESSAGE _USER,VALIDATE_UM,1653 + GROUP 16 + END + VALUTA 1642 15 + BEGIN + KEY "VAL1" + PROMPT 7 1 "" + PICTURE "##.###.###.##@" + GROUP 16 + END + NUMERO 1682 12 + BEGIN + KEY "VALMEDIO" + PROMPT 8 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#1642/#1641 + GROUP 16 FG_COL1 FG_COL1_UNIT + END + VALUTA 1643 15 + BEGIN + KEY "COL2" + PROMPT 9 1 "" + PICTURE "##.###.###.##@" + GROUP 16 FG_COL2 + END + NUMERO 1683 12 + BEGIN + KEY "VALMEDIO" + PROMPT 10 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#1643/#1641 + GROUP 16 FG_COL2 FG_COL2_UNIT + END + VALUTA 1644 15 + BEGIN + KEY "COL3" + PROMPT 11 1 "" + PICTURE "##.###.###.##@" + GROUP 16 FG_COL3 + END + NUMERO 1684 12 + BEGIN + KEY "VALMEDIO" + PROMPT 12 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#1644/#1641 + GROUP 16 FG_COL3 FG_COL3_UNIT + END + VALUTA 1645 15 + BEGIN + KEY "COL4" + PROMPT 13 1 "" + PICTURE "##.###.###.##@" + GROUP 16 FG_COL4 + END + NUMERO 1685 12 + BEGIN + KEY "VALMEDIO" + PROMPT 14 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#1645/#1641 + GROUP 16 FG_COL4 FG_COL4_UNIT + END + VALUTA 1646 15 + BEGIN + KEY "COL5" + PROMPT 15 1 "" + PICTURE "##.###.###.##@" + GROUP 16 FG_COL5 + END + NUMERO 1686 12 + BEGIN + KEY "VALMEDIO" + PROMPT 16 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#1646/#1641 + GROUP 16 FG_COL5 FG_COL5_UNIT + END + VALUTA 1647 15 + BEGIN + KEY "giac" + PROMPT 17 1 "" + PICTURE "##.###.###.##@" + GROUP 16 FG_COL6 + END + NUMERO 1687 12 + BEGIN + KEY "VALMEDIO" + PROMPT 18 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#1647/#1641 + GROUP 16 FG_COL6 FG_COL6_UNIT + END + END // tot scat_mer + END // GRUPPI_CATMER + + SECTION TOT_CATMER 1 1 2 GROUP //FOOTER STRINGA 1 255 BEGIN KEY "sep" @@ -2495,7 +2740,7 @@ SECTION BODY ODD 0 COLUMNWISE STRINGA 1550 30 BEGIN KEY "" - PROMPT 3 1 "" + PROMPT 3 1 "@BTotale " END STRINGA 1551 20 BEGIN @@ -2512,10 +2757,10 @@ SECTION BODY ODD 0 COLUMNWISE KEY "GIAC" PROMPT 6 1 "" PICTURE "########,@##" - MESSAGE _USER,VALIDATE_UM,1553 + //MESSAGE _USER,VALIDATE_UM,1553 GROUP 15 END - NUMERO 1542 15 + VALUTA 1542 15 BEGIN KEY "VAL1" PROMPT 7 1 "" @@ -2526,11 +2771,12 @@ SECTION BODY ODD 0 COLUMNWISE BEGIN KEY "VALMEDIO" PROMPT 8 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1542/#1541 + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#1542/#1541 GROUP 15 FG_COL1 FG_COL1_UNIT END - NUMERO 1543 15 + VALUTA 1543 15 BEGIN KEY "COL2" PROMPT 9 1 "" @@ -2541,11 +2787,12 @@ SECTION BODY ODD 0 COLUMNWISE BEGIN KEY "VALMEDIO" PROMPT 10 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1543/#1541 + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#1543/#1541 GROUP 15 FG_COL2 FG_COL2_UNIT END - NUMERO 1544 15 + VALUTA 1544 15 BEGIN KEY "COL3" PROMPT 11 1 "" @@ -2556,11 +2803,12 @@ SECTION BODY ODD 0 COLUMNWISE BEGIN KEY "VALMEDIO" PROMPT 12 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1544/#1541 + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#1544/#1541 GROUP 15 FG_COL3 FG_COL3_UNIT END - NUMERO 1545 15 + VALUTA 1545 15 BEGIN KEY "COL4" PROMPT 13 1 "" @@ -2571,11 +2819,12 @@ SECTION BODY ODD 0 COLUMNWISE BEGIN KEY "VALMEDIO" PROMPT 14 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1545/#1541 + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#1545/#1541 GROUP 15 FG_COL4 FG_COL4_UNIT END - NUMERO 1546 15 + VALUTA 1546 15 BEGIN KEY "COL5" PROMPT 15 1 "" @@ -2586,11 +2835,12 @@ SECTION BODY ODD 0 COLUMNWISE BEGIN KEY "VALMEDIO" PROMPT 16 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1546/#1541 + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#1546/#1541 GROUP 15 FG_COL5 FG_COL5_UNIT END - NUMERO 1547 15 + VALUTA 1547 15 BEGIN KEY "COL6" PROMPT 17 1 "" @@ -2601,15 +2851,115 @@ SECTION BODY ODD 0 COLUMNWISE BEGIN KEY "VALMEDIO" PROMPT 18 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1547/#1541 + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#1547/#1541 GROUP 15 FG_COL6 FG_COL6_UNIT END END // tot catmerc - END // section body, loop anamag SECTION FOOTER ODD 2 END // fine footer +SECTION FOOTER LAST 3 COLUMNWISE + +STRINGA 1 255 +BEGIN + KEY "Separatore (iniziale)" + PROMPT 1 1 "---------------------------------------------------------" + MESSAGE _USER,LINEATOTALI +END + +STRINGA 2 68 +BEGIN + PROMPT 1 2 "@BTotale generale" +END + +VALUTA 11 15 +BEGIN + KEY "TOTALE COL. 1" + FLAGS "H" + PROMPT 2 2 "" + PICTURE "##.###.###.##@" +END + +NUMERO 12 12 +BEGIN + FLAGS "H" + PROMPT 3 2 "" +END + +VALUTA 13 15 +BEGIN + KEY "TOTALE COL. 2" + FLAGS "H" + PROMPT 4 2 "" + PICTURE "##.###.###.##@" +END + +NUMERO 14 12 +BEGIN + FLAGS "H" + PROMPT 5 2 "" +END + +VALUTA 15 15 +BEGIN + KEY "TOTALE COL. 3" + PROMPT 6 2 "" + FLAGS "H" + PICTURE "##.###.###.##@" +END + +NUMERO 16 12 +BEGIN + PROMPT 7 2 "" + FLAGS "H" +END + +VALUTA 17 15 +BEGIN + KEY "TOTALE COL. 4" + PROMPT 8 2 "" + FLAGS "H" + PICTURE "##.###.###.##@" +END + +NUMERO 18 12 +BEGIN + PROMPT 9 2 "" + FLAGS "H" +END + +VALUTA 19 15 +BEGIN + KEY "TOTALE COL. 5" + PROMPT 10 2 "" + FLAGS "H" + PICTURE "##.###.###.##@" +END + +NUMERO 20 12 +BEGIN + PROMPT 11 2 "" + FLAGS "H" +END + +VALUTA 21 15 +BEGIN + KEY "TOTALE COL. 6" + PROMPT 12 2 "" + FLAGS "H" + PICTURE "##.###.###.##@" +END + +NUMERO 22 12 +BEGIN + PROMPT 13 2 "" + FLAGS "H" +END + +END // Footer last + END // fine form diff --git a/mg/mg4200b.frm b/mg/mg4200b.frm index a04e24147..a905af438 100755 --- a/mg/mg4200b.frm +++ b/mg/mg4200b.frm @@ -3,6 +3,9 @@ USE LF_MAG KEY 2 BY ANNOES CODMAG[1,3] CODART LIVELLO CODMAG[4,5] JOIN LF_ANAMAG TO LF_MAG INTO CODART==CODART JOIN MAG TO LF_MAG ALIAS 500 INTO CODTAB==CODMAG[1,3] JOIN MAG TO LF_MAG ALIAS 501 INTO CODTAB==CODMAG +JOIN GMC TO LF_ANAMAG ALIAS 400 INTO CODTAB==GRMERC[1,3] +JOIN GMC TO LF_ANAMAG ALIAS 401 INTO CODTAB==GRMERC +JOIN RFA TO LF_ANAMAG ALIAS 600 INTO CODTAB==RAGGFIS JOIN LF_UMART TO LF_ANAMAG INTO CODART==CODART END @@ -114,22 +117,22 @@ SECTION BODY ODD 1 COLUMNWISE MESSAGE HIDE, FG_COL6_UNIT@ END - LIST FF_ENABLECOLS - BEGIN - FLAGS "H" - ITEM "|only one, " - ITEM "1|only one, " + LIST FF_ENABLECOLS + BEGIN + FLAGS "H" + ITEM "|only one, " + ITEM "1|only one, " MESSAGE DISABLE,FG_COL2@|DISABLE,FG_COL3@|DISABLE,FG_COL4@|DISABLE,FG_COL5@|DISABLE,FG_COL6@ - ITEM "2|two" - MESSAGE DISABLE,FG_COL3@|DISABLE,FG_COL4@|DISABLE,FG_COL5@|DISABLE,FG_COL6@ - ITEM "3|three" - MESSAGE DISABLE,FG_COL4@|DISABLE,FG_COL5@|DISABLE,FG_COL6@ - ITEM "4|four" - MESSAGE DISABLE,FG_COL5@|DISABLE,FG_COL6@ - ITEM "5|five" - MESSAGE DISABLE,FG_COL6@ - ITEM "6|six" - END + ITEM "2|two" + MESSAGE DISABLE,FG_COL3@|DISABLE,FG_COL4@|DISABLE,FG_COL5@|DISABLE,FG_COL6@ + ITEM "3|three" + MESSAGE DISABLE,FG_COL4@|DISABLE,FG_COL5@|DISABLE,FG_COL6@ + ITEM "4|four" + MESSAGE DISABLE,FG_COL5@|DISABLE,FG_COL6@ + ITEM "5|five" + MESSAGE DISABLE,FG_COL6@ + ITEM "6|six" + END STRINGA 2 20 BEGIN @@ -238,34 +241,34 @@ SECTION BODY ODD 1 COLUMNWISE FLAGS "H" END - NUMBER FF_FLAGTOTQTA 1 - BEGIN - FLAGS "H" - END - - STRINGA 60 40 1 - BEGIN - FLAGS "H" - KEY "MAGAZZ" - PROMPT 2 1 "" - MESSAGE RESET,1@ - END + NUMBER FF_FLAGTOTQTA 1 + BEGIN + FLAGS "H" + END + + STRINGA 60 40 1 + BEGIN + FLAGS "H" + KEY "MAGAZZ" + PROMPT 2 1 "" + MESSAGE RESET,1@ + END SECTION H_MAGAZZINO 1 1 1 GROUP STRINGA 60 20 1 - BEGIN - KEY "codice magazzino" - PROMPT 2 1 "Magazzino " + BEGIN + KEY "codice magazzino" + PROMPT 2 1 "@BMagazzino " FIELD 500@->CODTAB MESSAGE COPY,151 - END - STRINGA 60 40 1 - BEGIN - KEY "codice magazzino" - PROMPT 3 1 "" - FIELD 500@->s0 - MESSAGE COPY,150 - END - END + END + STRINGA 60 40 1 + BEGIN + KEY "codice magazzino" + PROMPT 3 1 "@R" + FIELD 500@->s0 + MESSAGE COPY,150 + END + END SECTION GRUPPI_MAGAZZINO 1 0 0 FILE LF_MAG GROUP CODMAG[1,3] STRINGA 60 40 1 BEGIN @@ -287,2180 +290,2659 @@ SECTION BODY ODD 1 COLUMNWISE END SECTION H_DEPOSITO 1 1 1 STR_EXPR #FF_DIVDEPOSITI=="X" STRINGA 60 20 1 - BEGIN + BEGIN KEY "codice deposito" PROMPT 2 1 "Deposito " FIELD 501@->CODTAB[4,5] MESSAGE COPY,51 - END + END STRINGA 60 30 1 - BEGIN - KEY "codice magazzino" + BEGIN + KEY "codice magazzino" PROMPT 3 1 "" - FIELD 501@->s0 - MESSAGE COPY,50 - END - END + FIELD 501@->s0 + GROUP 15 + MESSAGE COPY,50 + END + END SECTION GRUPPI_DEPOSITO 1 0 0 FILE LF_MAG GROUP CODMAG[1,5] - STRINGA 60 40 1 - BEGIN - FLAGS "H" - KEY "" - PROMPT 2 1 "" - MESSAGE RESET,14@ - END - SECTION H_GCODART1 1 1 1 GROUP - STRINGA 16 20 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 2 1 "" - MESSAGE _USER,CODGRUPPOART,1|COPY,1451 - END - STRINGA 17 30 1 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 3 1 "" - MESSAGE _USER,GRUPPOART,1|COPY,1450 - END - END + // Raggruppam. merc./fiscale + STRINGA 60 20 + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" + MESSAGE RESET,16@ + END + SECTION H_CATMER 1 1 1 HEADER + STRINGA 60 20 + BEGIN + KEY "CATMER" + PROMPT 2 1 "" + MESSAGE _USER,CODCATMER|COPY,1650 + END + STRINGA 12 70 + BEGIN + KEY "CODICE CATMER" + PROMPT 3 1 "" + MESSAGE _USER,CATMER + END + END - SECTION GRUPPI_CODART1 1 0 0 FILE LF_MAG GROUP CODART - STRINGA 60 40 1 - BEGIN - FLAGS "H" - KEY "CATMER" - PROMPT 2 1 "" - MESSAGE RESET,13@ - END - SECTION H_GCODART2 1 1 1 GROUP + SECTION GRUPPI_CATMER 1 0 0 FILE LF_MAG GROUP LF_ANAMAG->GRMERC + STRINGA 60 20 + BEGIN + FLAGS "H" + KEY "SCATMER" + PROMPT 2 1 "" + MESSAGE RESET,17@ + END + + SECTION H_SCATMER 1 1 1 GROUP + STRINGA 11 20 + BEGIN + KEY "SCATMER" + PROMPT 2 1 "" + FIELD LF_ANAMAG->GRMERC + MESSAGE COPY,1750 + GROUP 17 + END + STRINGA 12 70 + BEGIN + KEY "CODICE SCATMER" + PROMPT 3 1 "@R" + FIELD 401@->S0 + GROUP 17 + END + END + + SECTION GRUPPI_SCATMER 1 0 0 FILE LF_MAG GROUP LF_ANAMAG->GRMERC + STRINGA 60 40 1 + BEGIN + FLAGS "H" + KEY "" + PROMPT 2 1 "" + MESSAGE RESET,14@ + END + + SECTION H_GCODART1 1 1 1 GROUP + STRINGA 16 20 + BEGIN + KEY "CODICE GRUPPO" + PROMPT 2 1 "" + MESSAGE _USER,CODGRUPPOART,1|COPY,1451 + END + STRINGA 17 30 1 + BEGIN + KEY "CODICE GRUPPO" + PROMPT 3 1 "" + MESSAGE _USER,GRUPPOART,1|COPY,1450 + END + END + + SECTION GRUPPI_CODART1 1 0 0 FILE LF_MAG GROUP CODART + STRINGA 60 40 1 + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" + MESSAGE RESET,13@ + END + SECTION H_GCODART2 1 1 1 GROUP STRINGA 16 20 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 2 1 "" + BEGIN + KEY "CODICE GRUPPO" + PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,2|COPY,1351 - END + END STRINGA 17 30 1 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 3 1 "" - MESSAGE _USER,GRUPPOART,2|COPY,1350 - END - END - - SECTION GRUPPI_CODART2 1 0 0 FILE LF_MAG GROUP CODART - STRINGA 60 40 1 - BEGIN - FLAGS "H" - KEY "CATMER" - PROMPT 2 1 "" - MESSAGE RESET,12@ - END - SECTION H_GCODART3 1 1 1 GROUP + BEGIN + KEY "CODICE GRUPPO" + PROMPT 3 1 "" + MESSAGE _USER,GRUPPOART,2|COPY,1350 + END + END + + SECTION GRUPPI_CODART2 1 0 0 FILE LF_MAG GROUP CODART + STRINGA 60 40 1 + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" + MESSAGE RESET,12@ + END + SECTION H_GCODART3 1 1 1 GROUP STRINGA 16 20 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 2 1 "" + BEGIN + KEY "CODICE GRUPPO" + PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,3|COPY,1251 - END + END STRINGA 17 30 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 3 1 "" - MESSAGE _USER,GRUPPOART,3|COPY,1250 - END - END - - SECTION GRUPPI_CODART3 1 0 0 FILE LF_MAG GROUP CODART - STRINGA 60 40 1 - BEGIN - FLAGS "H" - KEY "CATMER" - PROMPT 2 1 "" - MESSAGE RESET,11@ - END - SECTION H_GCODART4 1 1 1 GROUP + BEGIN + KEY "CODICE GRUPPO" + PROMPT 3 1 "" + MESSAGE _USER,GRUPPOART,3|COPY,1250 + END + END + + SECTION GRUPPI_CODART3 1 0 0 FILE LF_MAG GROUP CODART + STRINGA 60 40 1 + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" + MESSAGE RESET,11@ + END + SECTION H_GCODART4 1 1 1 GROUP STRINGA 16 20 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 2 1 "" + BEGIN + KEY "CODICE GRUPPO" + PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,4|COPY,1151 - END + END STRINGA 17 30 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 3 1 "" - MESSAGE _USER,GRUPPOART,4|COPY,1150 - END - END - - SECTION GRUPPI_CODART4 1 0 0 FILE LF_MAG GROUP CODART - STRINGA 60 40 1 - BEGIN - FLAGS "H" - KEY "CATMER" - PROMPT 2 1 "" - MESSAGE RESET,10@ - END - SECTION H_GCODART5 1 1 1 GROUP + BEGIN + KEY "CODICE GRUPPO" + PROMPT 3 1 "" + MESSAGE _USER,GRUPPOART,4|COPY,1150 + END + END + + SECTION GRUPPI_CODART4 1 0 0 FILE LF_MAG GROUP CODART + STRINGA 60 40 1 + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" + MESSAGE RESET,10@ + END + SECTION H_GCODART5 1 1 1 GROUP STRINGA 16 20 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 2 1 "" + BEGIN + KEY "CODICE GRUPPO" + PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,5|COPY,1051 - END + END STRINGA 17 30 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 3 1 "" - MESSAGE _USER,GRUPPOART,5|COPY,1050 - END - END - - SECTION GRUPPI_CODART5 1 0 0 FILE LF_MAG GROUP CODART - STRINGA 60 40 1 - BEGIN - FLAGS "H" - KEY "CATMER" - PROMPT 2 1 "" - MESSAGE RESET,9@ - END + BEGIN + KEY "CODICE GRUPPO" + PROMPT 3 1 "" + MESSAGE _USER,GRUPPOART,5|COPY,1050 + END + END + + SECTION GRUPPI_CODART5 1 0 0 FILE LF_MAG GROUP CODART + STRINGA 60 40 1 + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" + MESSAGE RESET,9@ + END SECTION H_GCODART6 1 1 1 GROUP STRINGA 16 20 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 2 1 "" + BEGIN + KEY "CODICE GRUPPO" + PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,6|COPY,951 - END + END STRINGA 17 30 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 3 1 "" - MESSAGE _USER,GRUPPOART,6|COPY,950 - END - END - - SECTION GRUPPI_CODART6 1 0 0 FILE LF_MAG GROUP CODART - STRINGA 60 40 1 - BEGIN - FLAGS "H" - KEY "CATMER" - PROMPT 2 1 "" - MESSAGE RESET,8@ - END - SECTION H_GCODART7 1 1 1 GROUP + BEGIN + KEY "CODICE GRUPPO" + PROMPT 3 1 "" + MESSAGE _USER,GRUPPOART,6|COPY,950 + END + END + + SECTION GRUPPI_CODART6 1 0 0 FILE LF_MAG GROUP CODART + STRINGA 60 40 1 + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" + MESSAGE RESET,8@ + END + SECTION H_GCODART7 1 1 1 GROUP STRINGA 16 20 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 2 1 "" + BEGIN + KEY "CODICE GRUPPO" + PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,7|COPY,851 - END + END STRINGA 17 30 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 3 1 "" - MESSAGE _USER,GRUPPOART,7|COPY,850 - END - END - - SECTION GRUPPI_CODART7 1 0 0 FILE LF_MAG GROUP CODART - STRINGA 60 40 1 - BEGIN - FLAGS "H" - KEY "CATMER" - PROMPT 2 1 "" - MESSAGE RESET,7@ - END - - SECTION H_GCODART8 1 1 1 GROUP + BEGIN + KEY "CODICE GRUPPO" + PROMPT 3 1 "" + MESSAGE _USER,GRUPPOART,7|COPY,850 + END + END + + SECTION GRUPPI_CODART7 1 0 0 FILE LF_MAG GROUP CODART + STRINGA 60 40 1 + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" + MESSAGE RESET,7@ + END + + SECTION H_GCODART8 1 1 1 GROUP STRINGA 16 20 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 2 1 "" + BEGIN + KEY "CODICE GRUPPO" + PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOART,8|COPY,751 - END + END STRINGA 17 30 - BEGIN - KEY "CODICE GRUPPO" - PROMPT 3 1 "" - MESSAGE _USER,GRUPPOART,8|COPY,750 - END - END - - SECTION GRUPPI_CODART8 1 0 0 FILE LF_MAG GROUP CODART - STRINGA 60 40 1 - BEGIN - FLAGS "H" - KEY "CATMER" - PROMPT 2 1 "" - MESSAGE RESET,6@ - END - SECTION H_ARTICOLO 1 1 1 GROUP + BEGIN + KEY "CODICE GRUPPO" + PROMPT 3 1 "" + MESSAGE _USER,GRUPPOART,8|COPY,750 + END + END + + SECTION GRUPPI_CODART8 1 0 0 FILE LF_MAG GROUP CODART + STRINGA 60 40 1 + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" + MESSAGE RESET,6@ + END + SECTION H_ARTICOLO 1 1 1 GROUP STRINGA 2020 20 - BEGIN - KEY "CODICE articolo" - PROMPT 2 1 "" - FIELD CODART + BEGIN + KEY "CODICE articolo" + PROMPT 2 1 "" + FIELD CODART MESSAGE COPY,651 - END + END STRINGA 21 30 - BEGIN - KEY "DESCR.articolo" - PROMPT 3 1 "" - FIELD LF_ANAMAG->DESCR - MESSAGE COPY,650 - END - END + BEGIN + KEY "DESCR.articolo" + PROMPT 3 1 "" + FIELD LF_ANAMAG->DESCR + MESSAGE COPY,650 + END + END - SECTION ARTICOLO 1 0 0 FILE LF_MAG GROUP CODART - STRINGA 60 40 1 - BEGIN - FLAGS "H" - KEY "" - PROMPT 2 1 "" - MESSAGE RESET,5@ - END - SECTION H_GLIVGIAC1 1 1 1 GROUP + SECTION ARTICOLO 1 0 0 FILE LF_MAG GROUP CODART + STRINGA 60 40 1 + BEGIN + FLAGS "H" + KEY "" + PROMPT 2 1 "" + MESSAGE RESET,5@ + END + SECTION H_GLIVGIAC1 1 1 1 GROUP STRINGA 31 20 1 - BEGIN - KEY "Livello giac" - PROMPT 2 1 "" + BEGIN + KEY "Livello giac" + PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOGIAC,1|COPY,551 - END + END STRINGA 31 20 1 - BEGIN - KEY "Livello giac" + BEGIN + KEY "Livello giac" PROMPT 3 1 "" - MESSAGE _USER,GRUPPOGIAC,1|COPY,550 - END - END - SECTION GRUPPI_LIVGIAC1 1 0 0 FILE LF_MAG GROUP LIVELLO - STRINGA 60 40 1 - BEGIN - FLAGS "H" - KEY "CATMER" - PROMPT 2 1 "" - MESSAGE RESET,4@ - END - SECTION H_GLIVGIAC2 1 1 1 GROUP + MESSAGE _USER,GRUPPOGIAC,1|COPY,550 + END + END + SECTION GRUPPI_LIVGIAC1 1 0 0 FILE LF_MAG GROUP LIVELLO + STRINGA 60 40 1 + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" + MESSAGE RESET,4@ + END + SECTION H_GLIVGIAC2 1 1 1 GROUP STRINGA 31 20 1 - BEGIN - KEY "Livello giac" - PROMPT 2 1 "" + BEGIN + KEY "Livello giac" + PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOGIAC,2|COPY,451 - END + END STRINGA 31 30 1 - BEGIN - KEY "Livello giac" + BEGIN + KEY "Livello giac" PROMPT 3 1 "" - MESSAGE _USER,GRUPPOGIAC,2|COPY,450 - END - END - - SECTION GRUPPI_LIVGIAC2 1 0 0 FILE LF_MAG GROUP LIVELLO - STRINGA 60 40 1 - BEGIN - FLAGS "H" - KEY "CATMER" - PROMPT 2 1 "" - MESSAGE RESET,3@ - END - - SECTION H_GLIVGIAC3 1 1 1 GROUP + MESSAGE _USER,GRUPPOGIAC,2|COPY,450 + END + END + + SECTION GRUPPI_LIVGIAC2 1 0 0 FILE LF_MAG GROUP LIVELLO + STRINGA 60 40 1 + BEGIN + FLAGS "H" + KEY "CATMER" + PROMPT 2 1 "" + MESSAGE RESET,3@ + END + + SECTION H_GLIVGIAC3 1 1 1 GROUP STRINGA 31 20 1 - BEGIN - KEY "Livello giac" - PROMPT 2 1 "" + BEGIN + KEY "Livello giac" + PROMPT 2 1 "" MESSAGE _USER,CODGRUPPOGIAC,3|COPY,351 - END + END STRINGA 31 30 1 - BEGIN - KEY "Livello giac" + BEGIN + KEY "Livello giac" PROMPT 3 1 "" - MESSAGE _USER,GRUPPOGIAC,3|COPY,350 - END - END + MESSAGE _USER,GRUPPOGIAC,3|COPY,350 + END + END - SECTION GRUPPI_LIVGIAC3 1 0 0 FILE LF_MAG GROUP LIVELLO - STRINGA 60 40 1 - BEGIN - FLAGS "H" - KEY "AAA" - PROMPT 2 1 "" - MESSAGE RESET,2@ - END - + SECTION GRUPPI_LIVGIAC3 1 0 0 FILE LF_MAG GROUP LIVELLO + STRINGA 60 40 1 + BEGIN + FLAGS "H" + KEY "AAA" + PROMPT 2 1 "" + MESSAGE RESET,2@ + END + SECTION H_GLIVGIAC4 1 0 0 GROUP - END // GGIAC4 + END // GGIAC4 SECTION TOT_GLIVGIAC4 1 1 1 GROUP STRINGA 250 30 - BEGIN + BEGIN PROMPT 3 1 "" - END + END STRINGA 251 20 - BEGIN - KEY "Livello giac4" + BEGIN + KEY "Livello giac4" PROMPT 2 1 "" - END - STRINGA 253 3 - BEGIN - KEY "UM" + END + STRINGA 253 3 + BEGIN + KEY "UM" PROMPT 5 1 "" - FIELD LF_UMART->UM - MESSAGE COPY,353 - END - NUMERO 241 12 - BEGIN - KEY "GIAC" + FIELD LF_UMART->UM + MESSAGE COPY,353 + END + NUMERO 241 12 + BEGIN + KEY "GIAC" PROMPT 6 1 "" - PICTURE "########,@##" + PICTURE "########,@##" MESSAGE _USER,GIAC|ADD,341 - GROUP 2 - END + GROUP 2 + END - NUMERO 282 12 - BEGIN - KEY "VAL_MEDIO" - PROMPT 8 1 "" - PICTURE "###.###.##@" - MESSAGE _USER,VAL1 - GROUP 2 FG_COL1 FG_COL1_UNIT - END - NUMERO 242 15 - BEGIN - KEY "VAL1" + VALUTA 242 15 + BEGIN + KEY "VAL1" PROMPT 7 1 "" - PICTURE "##.###.###.##@" - MESSAGE _NUMEXPR,#282*#241|ADD,342 - GROUP 2 - END + PICTURE "##.###.###.##@" + MESSAGE _USER,VAL1|ADD,342|ADD,FL->11 + GROUP 2 + END + VALUTA 282 12 + BEGIN + KEY "VAL_MEDIO" + PROMPT 8 1 "" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#242/#241 + GROUP 2 FG_COL1 FG_COL1_UNIT + END - NUMERO 283 12 - BEGIN - KEY "VAL_MEDIO" - PROMPT 10 1 "" - PICTURE "###.###.##@" - MESSAGE _USER,VAL2 - GROUP 2 FG_COL2 FG_COL2_UNIT - END - NUMERO 243 15 - BEGIN - KEY "VAL2" + VALUTA 243 15 + BEGIN + KEY "VAL2" PROMPT 9 1 "" - PICTURE "##.###.###.##@" - MESSAGE _NUMEXPR,#283*#241|ADD,343 - GROUP 2 FG_COL2 - END + PICTURE "##.###.###.##@" + MESSAGE _USER,VAL2|ADD,343|ADD,FL->13 + GROUP 2 FG_COL2 + END + VALUTA 283 12 + BEGIN + KEY "VAL_MEDIO" + PROMPT 10 1 "" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#243/#241 + GROUP 2 FG_COL2 FG_COL2_UNIT + END - NUMERO 284 12 - BEGIN - KEY "VAL_MEDIO" - PROMPT 12 1 "" - PICTURE "###.###.##@" - MESSAGE _USER,VAL3 - GROUP 2 FG_COL3 FG_COL3_UNIT - END - NUMERO 244 15 - BEGIN - KEY "VAL3" + VALUTA 244 15 + BEGIN + KEY "VAL3" PROMPT 11 1 "" - PICTURE "##.###.###.##@" - MESSAGE _NUMEXPR,#284*#241|ADD,344 - GROUP 2 FG_COL3 - END + PICTURE "##.###.###.##@" + MESSAGE _USER,VAL3|ADD,344|ADD,FL->15 + GROUP 2 FG_COL3 + END + VALUTA 284 12 + BEGIN + KEY "VAL_MEDIO" + PROMPT 12 1 "" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#244/#241 + GROUP 2 FG_COL3 FG_COL3_UNIT + END - NUMERO 285 12 - BEGIN - KEY "VAL_MEDIO" - PROMPT 14 1 "" - PICTURE "###.###.##@" - MESSAGE _USER,VAL4 - GROUP 2 FG_COL4 FG_COL4_UNIT - END - NUMERO 245 15 - BEGIN - KEY "COL4" + VALUTA 245 15 + BEGIN + KEY "COL4" PROMPT 13 1 "" - PICTURE "##.###.###.##@" - MESSAGE _NUMEXPR,#285*#241|ADD,345 - GROUP 2 FG_COL4 - END + PICTURE "##.###.###.##@" + MESSAGE _USER,VAL4|ADD,345|ADD,FL->17 + GROUP 2 FG_COL4 + END + VALUTA 285 12 + BEGIN + KEY "VAL_MEDIO" + PROMPT 14 1 "" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#245/#241 + GROUP 2 FG_COL4 FG_COL4_UNIT + END - NUMERO 286 12 - BEGIN - KEY "VAL_MEDIO" - PROMPT 16 1 "" - PICTURE "###.###.##@" - MESSAGE _USER,VAL5 - GROUP 2 FG_COL5 FG_COL5_UNIT - END - NUMERO 246 15 - BEGIN - KEY "COL5" + VALUTA 246 15 + BEGIN + KEY "COL5" PROMPT 15 1 "" - PICTURE "##.###.###.##@" - MESSAGE _NUMEXPR,#286*#241|ADD,346 - GROUP 2 FG_COL5 - END + PICTURE "##.###.###.##@" + MESSAGE _USER,VAL5|ADD,346|ADD,FL->19 + GROUP 2 FG_COL5 + END + VALUTA 286 12 + BEGIN + KEY "VAL_MEDIO" + PROMPT 16 1 "" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#246/#241 + GROUP 2 FG_COL5 FG_COL5_UNIT + END - NUMERO 287 12 - BEGIN - KEY "VAL_MEDIO" - PROMPT 18 1 "" - PICTURE "###.###.##@" - MESSAGE _USER,VAL6 - GROUP 2 FG_COL6 FG_COL6_UNIT - END - NUMERO 247 15 - BEGIN - KEY "COL6" + VALUTA 247 15 + BEGIN + KEY "COL6" PROMPT 17 1 "" - PICTURE "##.###.###.##@" - MESSAGE _NUMEXPR,#287*#241|ADD,347 - GROUP 2 FG_COL6 - END - END // tot ggiac4 - - END // GGIAC3 + PICTURE "##.###.###.##@" + MESSAGE _USER,VAL6|ADD,347|ADD,FL->21 + GROUP 2 FG_COL6 + END + VALUTA 287 12 + BEGIN + KEY "VAL_MEDIO" + PROMPT 18 1 "" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#247/#241 + GROUP 2 FG_COL6 FG_COL6_UNIT + END + END // tot ggiac4 + + END // GGIAC3 SECTION TOT_GLIVGIAC3 1 1 1 GROUP STRINGA 350 30 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 351 20 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 353 3 - BEGIN - KEY "UM" + END + STRINGA 353 3 + BEGIN + KEY "UM" PROMPT 5 1 "" - MESSAGE COPY,453 - END - NUMERO 341 12 - BEGIN - KEY "GIAC" + MESSAGE COPY,453 + END + NUMERO 341 12 + BEGIN + KEY "GIAC" PROMPT 6 1 "" - PICTURE "########,@##" + PICTURE "########,@##" MESSAGE ADD,441 - GROUP 3 - END - NUMERO 342 15 - BEGIN - KEY "COL1" + GROUP 3 + END + VALUTA 342 15 + BEGIN + KEY "COL1" PROMPT 7 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,442 - GROUP 3 - END - NUMERO 382 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,442 + GROUP 3 + END + VALUTA 382 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 8 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#342/#341 - GROUP 3 FG_COL1 FG_COL1_UNIT - END - NUMERO 343 15 - BEGIN - KEY "COL2" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#342/#341 + GROUP 3 FG_COL1 FG_COL1_UNIT + END + VALUTA 343 15 + BEGIN + KEY "COL2" PROMPT 9 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,443 - GROUP 3 FG_COL2 - END - NUMERO 383 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,443 + GROUP 3 FG_COL2 + END + VALUTA 383 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 10 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#343/#341 - GROUP 3 FG_COL2 FG_COL2_UNIT - END - NUMERO 344 15 - BEGIN - KEY "COL3" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#343/#341 + GROUP 3 FG_COL2 FG_COL2_UNIT + END + VALUTA 344 15 + BEGIN + KEY "COL3" PROMPT 11 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,444 - GROUP 3 FG_COL3 - END - NUMERO 384 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,444 + GROUP 3 FG_COL3 + END + VALUTA 384 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 12 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#344/#341 - GROUP 3 FG_COL3 FG_COL3_UNIT - END - NUMERO 345 15 - BEGIN - KEY "COL4" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#344/#341 + GROUP 3 FG_COL3 FG_COL3_UNIT + END + VALUTA 345 15 + BEGIN + KEY "COL4" PROMPT 13 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,445 - GROUP 3 FG_COL4 - END - NUMERO 385 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,445 + GROUP 3 FG_COL4 + END + VALUTA 385 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 14 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#345/#341 - GROUP 3 FG_COL4 FG_COL4_UNIT - END - NUMERO 346 15 - BEGIN - KEY "COL5" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#345/#341 + GROUP 3 FG_COL4 FG_COL4_UNIT + END + VALUTA 346 15 + BEGIN + KEY "COL5" PROMPT 15 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,446 - GROUP 3 FG_COL5 - END - NUMERO 386 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,446 + GROUP 3 FG_COL5 + END + VALUTA 386 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 16 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#346/#341 - GROUP 3 FG_COL5 FG_COL5_UNIT - END - NUMERO 347 15 - BEGIN - KEY "COL6" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#346/#341 + GROUP 3 FG_COL5 FG_COL5_UNIT + END + VALUTA 347 15 + BEGIN + KEY "COL6" PROMPT 17 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,447 - GROUP 3 FG_COL6 - END - NUMERO 387 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,447 + GROUP 3 FG_COL6 + END + VALUTA 387 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 18 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#347/#341 - GROUP 3 FG_COL6 FG_COL6_UNIT - END - END // tot ggiac3 - - END // GGIAC2 + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#347/#341 + GROUP 3 FG_COL6 FG_COL6_UNIT + END + END // tot ggiac3 + + END // GGIAC2 SECTION TOT_GLIVGIAC2 1 1 1 GROUP STRINGA 450 30 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 451 20 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 453 3 - BEGIN - KEY "UM" + END + STRINGA 453 3 + BEGIN + KEY "UM" PROMPT 5 1 "" - MESSAGE COPY,553 - END - NUMERO 441 12 - BEGIN - KEY "GIAC" + MESSAGE COPY,553 + END + NUMERO 441 12 + BEGIN + KEY "GIAC" PROMPT 6 1 "" - PICTURE "########,@##" - MESSAGE ADD,541 - GROUP 4 - END - NUMERO 442 15 - BEGIN - KEY "VAL1" + PICTURE "########,@##" + MESSAGE ADD,541 + GROUP 4 + END + VALUTA 442 15 + BEGIN + KEY "VAL1" PROMPT 7 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,542 - GROUP 4 - END - NUMERO 482 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,542 + GROUP 4 + END + VALUTA 482 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 8 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#442/#441 - GROUP 4 FG_COL1 FG_COL1_UNIT - END - NUMERO 443 15 - BEGIN - KEY "COL2" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#442/#441 + GROUP 4 FG_COL1 FG_COL1_UNIT + END + VALUTA 443 15 + BEGIN + KEY "COL2" PROMPT 9 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,543 - GROUP 4 FG_COL2 - END - NUMERO 483 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,543 + GROUP 4 FG_COL2 + END + VALUTA 483 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 10 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#443/#441 - GROUP 4 FG_COL2 FG_COL2_UNIT - END - NUMERO 444 15 - BEGIN - KEY "COL3" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#443/#441 + GROUP 4 FG_COL2 FG_COL2_UNIT + END + VALUTA 444 15 + BEGIN + KEY "COL3" PROMPT 11 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,544 - GROUP 4 FG_COL3 - END - NUMERO 484 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,544 + GROUP 4 FG_COL3 + END + VALUTA 484 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 12 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#444/#441 - GROUP 4 FG_COL3 FG_COL3_UNIT - END - NUMERO 445 15 - BEGIN + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#444/#441 + GROUP 4 FG_COL3 FG_COL3_UNIT + END + VALUTA 445 15 + BEGIN KEY "COL4" PROMPT 13 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,545 - GROUP 4 FG_COL4 - END - NUMERO 485 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,545 + GROUP 4 FG_COL4 + END + VALUTA 485 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 14 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#445/#441 - GROUP 4 FG_COL4 FG_COL4_UNIT - END - NUMERO 446 15 - BEGIN - KEY "COL5" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#445/#441 + GROUP 4 FG_COL4 FG_COL4_UNIT + END + VALUTA 446 15 + BEGIN + KEY "COL5" PROMPT 15 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,546 - GROUP 4 FG_COL5 - END - NUMERO 486 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,546 + GROUP 4 FG_COL5 + END + VALUTA 486 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 16 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#446/#441 - GROUP 4 FG_COL5 FG_COL5_UNIT - END - NUMERO 447 15 - BEGIN - KEY "giac" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#446/#441 + GROUP 4 FG_COL5 FG_COL5_UNIT + END + VALUTA 447 15 + BEGIN + KEY "giac" PROMPT 17 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,547 - GROUP 4 FG_COL6 - END - NUMERO 487 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,547 + GROUP 4 FG_COL6 + END + VALUTA 487 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 18 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#447/#441 - GROUP 4 FG_COL6 FG_COL6_UNIT - END - END // tot ggiac2 - END // GGIAC1 + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#447/#441 + GROUP 4 FG_COL6 FG_COL6_UNIT + END + END // tot ggiac2 + END // GGIAC1 SECTION TOT_GLIVGIAC1 1 1 1 GROUP STRINGA 550 30 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 551 20 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 553 3 - BEGIN - KEY "UM" + END + STRINGA 553 3 + BEGIN + KEY "UM" PROMPT 5 1 "" - MESSAGE COPY,653 - END - NUMERO 541 12 - BEGIN - KEY "GIAC" + MESSAGE COPY,653 + END + NUMERO 541 12 + BEGIN + KEY "GIAC" PROMPT 6 1 "" - PICTURE "########,@##" - MESSAGE ADD,641 - GROUP 5 - END - NUMERO 542 15 - BEGIN - KEY "VAL1" + PICTURE "########,@##" + MESSAGE ADD,641 + GROUP 5 + END + VALUTA 542 15 + BEGIN + KEY "VAL1" PROMPT 7 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,642 - GROUP 5 - END - NUMERO 582 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,642 + GROUP 5 + END + VALUTA 582 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 8 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#542/#541 - GROUP 5 FG_COL1 FG_COL1_UNIT - END - NUMERO 543 15 - BEGIN - KEY "COL2" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#542/#541 + GROUP 5 FG_COL1 FG_COL1_UNIT + END + VALUTA 543 15 + BEGIN + KEY "COL2" PROMPT 9 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,643 - GROUP 5 FG_COL2 - END - NUMERO 583 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,643 + GROUP 5 FG_COL2 + END + VALUTA 583 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 10 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#543/#541 - GROUP 5 FG_COL2 FG_COL2_UNIT - END - NUMERO 544 15 - BEGIN - KEY "COL3" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#543/#541 + GROUP 5 FG_COL2 FG_COL2_UNIT + END + VALUTA 544 15 + BEGIN + KEY "COL3" PROMPT 11 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,644 - GROUP 5 FG_COL3 - END - NUMERO 584 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,644 + GROUP 5 FG_COL3 + END + VALUTA 584 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 12 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#544/#541 - GROUP 5 FG_COL3 FG_COL3_UNIT - END - NUMERO 545 15 - BEGIN - KEY "COL4" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#544/#541 + GROUP 5 FG_COL3 FG_COL3_UNIT + END + VALUTA 545 15 + BEGIN + KEY "COL4" PROMPT 13 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,645 - GROUP 5 FG_COL4 - END - NUMERO 585 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,645 + GROUP 5 FG_COL4 + END + VALUTA 585 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 14 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#545/#541 - GROUP 5 FG_COL4 FG_COL4_UNIT - END - NUMERO 546 15 - BEGIN - KEY "COL5" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#545/#541 + GROUP 5 FG_COL4 FG_COL4_UNIT + END + VALUTA 546 15 + BEGIN + KEY "COL5" PROMPT 15 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,646 - GROUP 5 FG_COL5 - END - NUMERO 586 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,646 + GROUP 5 FG_COL5 + END + VALUTA 586 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 16 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#546/#541 - GROUP 5 FG_COL5 FG_COL5_UNIT - END - NUMERO 547 15 - BEGIN - KEY "giac" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#546/#541 + GROUP 5 FG_COL5 FG_COL5_UNIT + END + VALUTA 547 15 + BEGIN + KEY "giac" PROMPT 17 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,647 - GROUP 5 FG_COL6 - END - NUMERO 587 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,647 + GROUP 5 FG_COL6 + END + VALUTA 587 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 18 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#547/#541 - GROUP 5 FG_COL6 FG_COL6_UNIT - END - END // tot ggiac1 - - END // FILE GIACENZE + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#547/#541 + GROUP 5 FG_COL6 FG_COL6_UNIT + END + END // tot ggiac1 + + END // FILE GIACENZE SECTION TOT_ARTICOLO 1 1 1 GROUP STRINGA 650 30 1 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 651 20 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 653 3 - BEGIN - KEY "UM" + END + STRINGA 653 3 + BEGIN + KEY "UM" PROMPT 5 1 "" MESSAGE _USER, COPY_UM,753 END - NUMERO 641 12 - BEGIN - KEY "GIAC" + NUMERO 641 12 + BEGIN + KEY "GIAC" PROMPT 6 1 "" - PICTURE "########,@##" - MESSAGE ADD,741 - GROUP 6 - END - NUMERO 642 15 - BEGIN - KEY "VAL1" + PICTURE "########,@##" + MESSAGE ADD,741 + GROUP 6 + END + VALUTA 642 15 + BEGIN + KEY "VAL1" PROMPT 7 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,742 - GROUP 6 - END - NUMERO 682 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,742 + GROUP 6 + END + VALUTA 682 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 8 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#642/#641 - GROUP 6 FG_COL1 FG_COL1_UNIT - END - NUMERO 643 15 - BEGIN - KEY "COL2" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#642/#641 + GROUP 6 FG_COL1 FG_COL1_UNIT + END + VALUTA 643 15 + BEGIN + KEY "COL2" PROMPT 9 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,743 - GROUP 6 FG_COL2 - END - NUMERO 683 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,743 + GROUP 6 FG_COL2 + END + VALUTA 683 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 10 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#643/#641 - GROUP 6 FG_COL2 FG_COL2_UNIT - END - NUMERO 644 15 - BEGIN - KEY "COL3" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#643/#641 + GROUP 6 FG_COL2 FG_COL2_UNIT + END + VALUTA 644 15 + BEGIN + KEY "COL3" PROMPT 11 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,744 - GROUP 6 FG_COL3 - END - NUMERO 684 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,744 + GROUP 6 FG_COL3 + END + VALUTA 684 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 12 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#644/#641 - GROUP 6 FG_COL3 FG_COL3_UNIT - END - NUMERO 645 15 - BEGIN - KEY "COL4" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#644/#641 + GROUP 6 FG_COL3 FG_COL3_UNIT + END + VALUTA 645 15 + BEGIN + KEY "COL4" PROMPT 13 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,745 - GROUP 6 FG_COL4 - END - NUMERO 685 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,745 + GROUP 6 FG_COL4 + END + VALUTA 685 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 14 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#645/#641 - GROUP 6 FG_COL4 FG_COL4_UNIT - END - NUMERO 646 15 - BEGIN - KEY "COL5" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#645/#641 + GROUP 6 FG_COL4 FG_COL4_UNIT + END + VALUTA 646 15 + BEGIN + KEY "COL5" PROMPT 15 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,746 - GROUP 6 FG_COL5 - END - NUMERO 686 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,746 + GROUP 6 FG_COL5 + END + VALUTA 686 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 16 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#646/#641 - GROUP 6 FG_COL5 FG_COL5_UNIT - END - NUMERO 647 15 - BEGIN - KEY "giac" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#646/#641 + GROUP 6 FG_COL5 FG_COL5_UNIT + END + VALUTA 647 15 + BEGIN + KEY "giac" PROMPT 17 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,747 - GROUP 6 FG_COL6 - END - NUMERO 687 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,747 + GROUP 6 FG_COL6 + END + VALUTA 687 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 18 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#647/#641 - GROUP 6 FG_COL6 FG_COL6_UNIT - END - END // TOT ART - - END // GART8 + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#647/#641 + GROUP 6 FG_COL6 FG_COL6_UNIT + END + END // TOT ART + + END // GART8 SECTION TOT_GART8 1 1 1 GROUP STRINGA 750 30 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 751 20 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 753 3 - BEGIN - KEY "UM" + END + STRINGA 753 3 + BEGIN + KEY "UM" PROMPT 5 1 "" MESSAGE _USER,COPY_UM,853 - END - NUMERO 741 12 - BEGIN - KEY "GIAC" + END + NUMERO 741 12 + BEGIN + KEY "GIAC" PROMPT 6 1 "" - PICTURE "########,@##" + PICTURE "########,@##" MESSAGE _USER,VALIDATE_UM,753|ADD,841 - GROUP 7 - END - NUMERO 742 15 - BEGIN - KEY "VAL1" + GROUP 7 + END + VALUTA 742 15 + BEGIN + KEY "VAL1" PROMPT 7 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,842 - GROUP 7 - END - NUMERO 782 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,842 + GROUP 7 + END + VALUTA 782 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 8 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#742/#741 - GROUP 7 FG_COL1 FG_COL1_UNIT - END - NUMERO 743 15 - BEGIN - KEY "COL2" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#742/#741 + GROUP 7 FG_COL1 FG_COL1_UNIT + END + VALUTA 743 15 + BEGIN + KEY "COL2" PROMPT 9 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,843 - GROUP 7 FG_COL2 - END - NUMERO 783 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,843 + GROUP 7 FG_COL2 + END + VALUTA 783 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 10 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#743/#741 - GROUP 7 FG_COL2 FG_COL2_UNIT - END - NUMERO 744 15 - BEGIN - KEY "COL3" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#743/#741 + GROUP 7 FG_COL2 FG_COL2_UNIT + END + VALUTA 744 15 + BEGIN + KEY "COL3" PROMPT 11 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,844 - GROUP 7 FG_COL3 - END - NUMERO 784 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,844 + GROUP 7 FG_COL3 + END + VALUTA 784 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 12 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#744/#741 - GROUP 7 FG_COL3 FG_COL3_UNIT - END - NUMERO 745 15 - BEGIN - KEY "COL4" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#744/#741 + GROUP 7 FG_COL3 FG_COL3_UNIT + END + VALUTA 745 15 + BEGIN + KEY "COL4" PROMPT 13 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,845 - GROUP 7 FG_COL4 - END - NUMERO 785 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,845 + GROUP 7 FG_COL4 + END + VALUTA 785 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 14 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#745/#741 - GROUP 7 FG_COL4 FG_COL4_UNIT - END - NUMERO 746 15 - BEGIN - KEY "COL5" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#745/#741 + GROUP 7 FG_COL4 FG_COL4_UNIT + END + VALUTA 746 15 + BEGIN + KEY "COL5" PROMPT 15 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,846 - GROUP 7 FG_COL5 - END - NUMERO 786 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,846 + GROUP 7 FG_COL5 + END + VALUTA 786 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 16 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#746/#741 - GROUP 7 FG_COL5 FG_COL5_UNIT - END - NUMERO 747 15 - BEGIN - KEY "COL6" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#746/#741 + GROUP 7 FG_COL5 FG_COL5_UNIT + END + VALUTA 747 15 + BEGIN + KEY "COL6" PROMPT 17 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,847 - GROUP 7 FG_COL6 - END - NUMERO 787 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,847 + GROUP 7 FG_COL6 + END + VALUTA 787 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 18 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#747/#741 - GROUP 7 FG_COL6 FG_COL6_UNIT - END - END // tot gart8 - - END // GART7 + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#747/#741 + GROUP 7 FG_COL6 FG_COL6_UNIT + END + END // tot gart8 + + END // GART7 SECTION TOT_GART7 1 1 1 GROUP STRINGA 850 30 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 851 20 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 853 3 - BEGIN - KEY "UM" + END + STRINGA 853 3 + BEGIN + KEY "UM" PROMPT 5 1 "" MESSAGE _USER,COPY_UM,953 - END - NUMERO 841 12 - BEGIN - KEY "GIAC" + END + NUMERO 841 12 + BEGIN + KEY "GIAC" PROMPT 6 1 "" - PICTURE "########,@##" + PICTURE "########,@##" MESSAGE _USER,VALIDATE_UM,853|ADD,941 - GROUP 8 - END - NUMERO 842 15 - BEGIN - KEY "VAL1" + GROUP 8 + END + VALUTA 842 15 + BEGIN + KEY "VAL1" PROMPT 7 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,942 - GROUP 8 - END - NUMERO 882 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,942 + GROUP 8 + END + VALUTA 882 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 8 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#842/#841 - GROUP 8 FG_COL1 FG_COL1_UNIT - END - NUMERO 843 15 - BEGIN - KEY "COL2" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#842/#841 + GROUP 8 FG_COL1 FG_COL1_UNIT + END + VALUTA 843 15 + BEGIN + KEY "COL2" PROMPT 9 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,943 - GROUP 8 FG_COL2 - END - NUMERO 883 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,943 + GROUP 8 FG_COL2 + END + VALUTA 883 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 10 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#843/#841 - GROUP 8 FG_COL2 FG_COL2_UNIT - END - NUMERO 844 15 - BEGIN - KEY "COL3" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#843/#841 + GROUP 8 FG_COL2 FG_COL2_UNIT + END + VALUTA 844 15 + BEGIN + KEY "COL3" PROMPT 11 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,944 - GROUP 8 FG_COL3 - END - NUMERO 884 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,944 + GROUP 8 FG_COL3 + END + VALUTA 884 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 12 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#844/#841 - GROUP 8 FG_COL3 FG_COL3_UNIT - END - NUMERO 845 15 - BEGIN - KEY "COL4" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#844/#841 + GROUP 8 FG_COL3 FG_COL3_UNIT + END + VALUTA 845 15 + BEGIN + KEY "COL4" PROMPT 13 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,945 - GROUP 8 FG_COL4 - END - NUMERO 885 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,945 + GROUP 8 FG_COL4 + END + VALUTA 885 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 14 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#845/#841 - GROUP 8 FG_COL4 FG_COL4_UNIT - END - NUMERO 846 15 - BEGIN - KEY "COL5" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#845/#841 + GROUP 8 FG_COL4 FG_COL4_UNIT + END + VALUTA 846 15 + BEGIN + KEY "COL5" PROMPT 15 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,946 - GROUP 8 FG_COL5 - END - NUMERO 886 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,946 + GROUP 8 FG_COL5 + END + VALUTA 886 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 16 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#846/#841 - GROUP 8 FG_COL5 FG_COL5_UNIT - END - NUMERO 847 15 - BEGIN - KEY "giac" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#846/#841 + GROUP 8 FG_COL5 FG_COL5_UNIT + END + VALUTA 847 15 + BEGIN + KEY "giac" PROMPT 17 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,947 - GROUP 8 FG_COL6 - END - NUMERO 887 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,947 + GROUP 8 FG_COL6 + END + VALUTA 887 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 18 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#847/#841 - GROUP 8 FG_COL6 FG_COL6_UNIT - END - END // tot gart7 - - END // GART6 + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#847/#841 + GROUP 8 FG_COL6 FG_COL6_UNIT + END + END // tot gart7 + + END // GART6 SECTION TOT_GART6 1 1 1 GROUP STRINGA 950 30 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 951 20 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 953 3 - BEGIN - KEY "UM" + END + STRINGA 953 3 + BEGIN + KEY "UM" PROMPT 5 1 "" MESSAGE _USER,COPY_UM,1053 - END - NUMERO 941 12 - BEGIN - KEY "GIAC" + END + NUMERO 941 12 + BEGIN + KEY "GIAC" PROMPT 6 1 "" - PICTURE "########,@##" + PICTURE "########,@##" MESSAGE _USER,VALIDATE_UM,953|ADD,1041 - GROUP 9 - END - NUMERO 942 15 - BEGIN - KEY "VAL1" + GROUP 9 + END + VALUTA 942 15 + BEGIN + KEY "VAL1" PROMPT 7 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1042 - GROUP 9 - END - NUMERO 982 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1042 + GROUP 9 + END + VALUTA 982 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 8 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#942/#941 - GROUP 9 FG_COL1 FG_COL1_UNIT - END - NUMERO 943 15 - BEGIN - KEY "COL2" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#942/#941 + GROUP 9 FG_COL1 FG_COL1_UNIT + END + VALUTA 943 15 + BEGIN + KEY "COL2" PROMPT 9 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1043 - GROUP 9 FG_COL2 - END - NUMERO 983 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1043 + GROUP 9 FG_COL2 + END + VALUTA 983 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 10 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#943/#941 - GROUP 9 FG_COL2 FG_COL2_UNIT - END - NUMERO 944 15 - BEGIN - KEY "COL3" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#943/#941 + GROUP 9 FG_COL2 FG_COL2_UNIT + END + VALUTA 944 15 + BEGIN + KEY "COL3" PROMPT 11 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1044 - GROUP 9 FG_COL3 - END - NUMERO 984 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1044 + GROUP 9 FG_COL3 + END + VALUTA 984 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 12 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#944/#941 - GROUP 9 FG_COL3 FG_COL3_UNIT - END - NUMERO 945 15 - BEGIN - KEY "COL4" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#944/#941 + GROUP 9 FG_COL3 FG_COL3_UNIT + END + VALUTA 945 15 + BEGIN + KEY "COL4" PROMPT 13 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1045 - GROUP 9 FG_COL4 - END - NUMERO 985 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1045 + GROUP 9 FG_COL4 + END + VALUTA 985 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 14 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#945/#941 - GROUP 9 FG_COL4 FG_COL4_UNIT - END - NUMERO 946 15 - BEGIN - KEY "COL5" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#945/#941 + GROUP 9 FG_COL4 FG_COL4_UNIT + END + VALUTA 946 15 + BEGIN + KEY "COL5" PROMPT 15 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1046 - GROUP 9 FG_COL5 - END - NUMERO 986 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1046 + GROUP 9 FG_COL5 + END + VALUTA 986 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 16 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#946/#941 - GROUP 9 FG_COL5 FG_COL5_UNIT - END - NUMERO 947 15 - BEGIN - KEY "giac" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#946/#941 + GROUP 9 FG_COL5 FG_COL5_UNIT + END + VALUTA 947 15 + BEGIN + KEY "giac" PROMPT 17 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1047 - GROUP 9 FG_COL6 - END - NUMERO 987 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1047 + GROUP 9 FG_COL6 + END + VALUTA 987 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 18 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#947/#941 - GROUP 9 FG_COL6 FG_COL6_UNIT - END - END // tot gart6 - - END // GART5 + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#947/#941 + GROUP 9 FG_COL6 FG_COL6_UNIT + END + END // tot gart6 + + END // GART5 SECTION TOT_GART5 1 1 1 GROUP STRINGA 1050 30 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 1051 20 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 1053 3 - BEGIN - KEY "UM" + END + STRINGA 1053 3 + BEGIN + KEY "UM" PROMPT 5 1 "" MESSAGE _USER,COPY_UM,1153 - END - NUMERO 1041 12 - BEGIN - KEY "GIAC" + END + NUMERO 1041 12 + BEGIN + KEY "GIAC" PROMPT 6 1 "" - PICTURE "########,@##" + PICTURE "########,@##" MESSAGE _USER,VALIDATE_UM,1053|ADD,1141 - GROUP 10 - END - NUMERO 1042 15 - BEGIN - KEY "VAL1" + GROUP 10 + END + VALUTA 1042 15 + BEGIN + KEY "VAL1" PROMPT 7 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1142 - GROUP 10 - END - NUMERO 1082 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1142 + GROUP 10 + END + VALUTA 1082 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 8 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1042/#1041 - GROUP FG_COL1 FG_COL1_UNIT - END - NUMERO 1043 15 - BEGIN - KEY "COL2" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1042/#1041 + GROUP FG_COL1 FG_COL1_UNIT + END + VALUTA 1043 15 + BEGIN + KEY "COL2" PROMPT 9 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1143 - GROUP 10 FG_COL2 - END - NUMERO 1083 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1143 + GROUP 10 FG_COL2 + END + VALUTA 1083 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 10 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1043/#1041 - GROUP FG_COL2 FG_COL2_UNIT - END - NUMERO 1044 15 - BEGIN - KEY "COL3" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1043/#1041 + GROUP FG_COL2 FG_COL2_UNIT + END + VALUTA 1044 15 + BEGIN + KEY "COL3" PROMPT 11 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1144 - GROUP 10 FG_COL3 - END - NUMERO 1084 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1144 + GROUP 10 FG_COL3 + END + VALUTA 1084 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 12 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1044/#1041 - GROUP FG_COL3 FG_COL3_UNIT - END - NUMERO 1045 15 - BEGIN - KEY "COL4" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1044/#1041 + GROUP FG_COL3 FG_COL3_UNIT + END + VALUTA 1045 15 + BEGIN + KEY "COL4" PROMPT 13 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1145 - GROUP 10 FG_COL4 - END - NUMERO 1085 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1145 + GROUP 10 FG_COL4 + END + VALUTA 1085 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 14 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1045/#1041 - GROUP FG_COL4 FG_COL4_UNIT - END - NUMERO 1046 15 - BEGIN - KEY "COL5" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1045/#1041 + GROUP FG_COL4 FG_COL4_UNIT + END + VALUTA 1046 15 + BEGIN + KEY "COL5" PROMPT 15 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1146 - GROUP 10 FG_COL5 - END - NUMERO 1086 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1146 + GROUP 10 FG_COL5 + END + VALUTA 1086 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 16 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1046/#1041 - GROUP FG_COL5 FG_COL5_UNIT - END - NUMERO 1047 15 - BEGIN - KEY "giac" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1046/#1041 + GROUP FG_COL5 FG_COL5_UNIT + END + VALUTA 1047 15 + BEGIN + KEY "giac" PROMPT 17 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1147 - GROUP 10 FG_COL6 - END - NUMERO 1087 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1147 + GROUP 10 FG_COL6 + END + VALUTA 1087 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 18 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1047/#1041 - GROUP FG_COL6 FG_COL6_UNIT - END - END // tot gart5 - - END // GART4 + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1047/#1041 + GROUP FG_COL6 FG_COL6_UNIT + END + END // tot gart5 + + END // GART4 SECTION TOT_GART4 1 1 1 GROUP STRINGA 1150 30 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 1151 20 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 1153 3 - BEGIN - KEY "UM" + END + STRINGA 1153 3 + BEGIN + KEY "UM" PROMPT 5 1 "" MESSAGE _USER,COPY_UM,1253 - END - NUMERO 1141 12 - BEGIN - KEY "GIAC" + END + NUMERO 1141 12 + BEGIN + KEY "GIAC" PROMPT 6 1 "" - PICTURE "########,@##" + PICTURE "########,@##" MESSAGE _USER,VALIDATE_UM,1153|ADD,1241 - GROUP 11 - END - NUMERO 1142 15 - BEGIN - KEY "VAL1" + GROUP 11 + END + VALUTA 1142 15 + BEGIN + KEY "VAL1" PROMPT 7 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1242 - GROUP 11 - END - NUMERO 1182 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1242 + GROUP 11 + END + VALUTA 1182 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 8 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1142/#1141 - GROUP FG_COL1 FG_COL1_UNIT - END - NUMERO 1143 15 - BEGIN - KEY "COL2" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1142/#1141 + GROUP FG_COL1 FG_COL1_UNIT + END + VALUTA 1143 15 + BEGIN + KEY "COL2" PROMPT 9 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1243 - GROUP 11 FG_COL2 - END - NUMERO 1183 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1243 + GROUP 11 FG_COL2 + END + VALUTA 1183 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 10 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1143/#1141 - GROUP FG_COL2 FG_COL2_UNIT - END - NUMERO 1144 15 - BEGIN - KEY "COL3" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1143/#1141 + GROUP FG_COL2 FG_COL2_UNIT + END + VALUTA 1144 15 + BEGIN + KEY "COL3" PROMPT 11 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1244 - GROUP 11 FG_COL3 - END - NUMERO 1184 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1244 + GROUP 11 FG_COL3 + END + VALUTA 1184 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 12 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1144/#1141 - GROUP FG_COL3 FG_COL3_UNIT - END - NUMERO 1145 15 - BEGIN - KEY "COL4" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1144/#1141 + GROUP FG_COL3 FG_COL3_UNIT + END + VALUTA 1145 15 + BEGIN + KEY "COL4" PROMPT 13 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1245 - GROUP 11 FG_COL4 - END - NUMERO 1185 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1245 + GROUP 11 FG_COL4 + END + VALUTA 1185 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 14 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1145/#1141 - GROUP FG_COL4 FG_COL4_UNIT - END - NUMERO 1146 15 - BEGIN - KEY "COL5" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1145/#1141 + GROUP FG_COL4 FG_COL4_UNIT + END + VALUTA 1146 15 + BEGIN + KEY "COL5" PROMPT 15 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1246 - GROUP 11 FG_COL5 - END - NUMERO 1186 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1246 + GROUP 11 FG_COL5 + END + VALUTA 1186 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 16 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1146/#1141 - GROUP FG_COL5 FG_COL5_UNIT - END - NUMERO 1147 15 - BEGIN - KEY "giac" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1146/#1141 + GROUP FG_COL5 FG_COL5_UNIT + END + VALUTA 1147 15 + BEGIN + KEY "giac" PROMPT 17 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1247 - GROUP 11 FG_COL6 - END - NUMERO 1187 12 - BEGIN - KEY "VAL_MEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1247 + GROUP 11 FG_COL6 + END + VALUTA 1187 12 + BEGIN + KEY "VAL_MEDIO" PROMPT 18 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1147/#1141 - GROUP FG_COL6 FG_COL6_UNIT - END - END // tot gart4 - - END // GART3 + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1147/#1141 + GROUP FG_COL6 FG_COL6_UNIT + END + END // tot gart4 + + END // GART3 SECTION TOT_GART3 1 1 1 GROUP STRINGA 1250 30 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 1251 20 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 1253 3 - BEGIN - KEY "UM" + END + STRINGA 1253 3 + BEGIN + KEY "UM" PROMPT 5 1 "" MESSAGE _USER,COPY_UM,1353 - END - NUMERO 1241 12 - BEGIN - KEY "GIAC" + END + NUMERO 1241 12 + BEGIN + KEY "GIAC" PROMPT 6 1 "" - PICTURE "########,@##" + PICTURE "########,@##" MESSAGE _USER,VALIDATE_UM,1253|ADD,1341 - GROUP 12 - END - NUMERO 1242 15 - BEGIN - KEY "VAL1" + GROUP 12 + END + VALUTA 1242 15 + BEGIN + KEY "VAL1" PROMPT 7 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1342 - GROUP 12 - END - NUMERO 1282 12 - BEGIN - KEY "VALMEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1342 + GROUP 12 + END + VALUTA 1282 12 + BEGIN + KEY "VALMEDIO" PROMPT 8 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1242/#1241 - GROUP 12 FG_COL1 FG_COL1_UNIT - END - NUMERO 1243 15 - BEGIN - KEY "COL2" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1242/#1241 + GROUP 12 FG_COL1 FG_COL1_UNIT + END + VALUTA 1243 15 + BEGIN + KEY "COL2" PROMPT 9 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1343 - GROUP 12 FG_COL2 - END - NUMERO 1283 12 - BEGIN - KEY "VALMEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1343 + GROUP 12 FG_COL2 + END + VALUTA 1283 12 + BEGIN + KEY "VALMEDIO" PROMPT 10 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1243/#1241 - GROUP 12 FG_COL2 FG_COL2_UNIT - END - NUMERO 1244 15 - BEGIN - KEY "COL3" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1243/#1241 + GROUP 12 FG_COL2 FG_COL2_UNIT + END + VALUTA 1244 15 + BEGIN + KEY "COL3" PROMPT 11 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1344 - GROUP 12 FG_COL3 - END - NUMERO 1284 12 - BEGIN - KEY "VALMEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1344 + GROUP 12 FG_COL3 + END + VALUTA 1284 12 + BEGIN + KEY "VALMEDIO" PROMPT 12 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1244/#1241 - GROUP 12 FG_COL3 FG_COL3_UNIT - END - NUMERO 1245 15 - BEGIN - KEY "COL4" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1244/#1241 + GROUP 12 FG_COL3 FG_COL3_UNIT + END + VALUTA 1245 15 + BEGIN + KEY "COL4" PROMPT 13 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1345 - GROUP 12 FG_COL4 - END - NUMERO 1285 12 - BEGIN - KEY "VALMEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1345 + GROUP 12 FG_COL4 + END + VALUTA 1285 12 + BEGIN + KEY "VALMEDIO" PROMPT 14 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1245/#1241 - GROUP 12 FG_COL4 FG_COL4_UNIT - END - NUMERO 1246 15 - BEGIN - KEY "COL5" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1245/#1241 + GROUP 12 FG_COL4 FG_COL4_UNIT + END + VALUTA 1246 15 + BEGIN + KEY "COL5" PROMPT 15 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1346 - GROUP 12 FG_COL5 - END - NUMERO 1286 12 - BEGIN - KEY "VALMEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1346 + GROUP 12 FG_COL5 + END + VALUTA 1286 12 + BEGIN + KEY "VALMEDIO" PROMPT 16 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1246/#1241 - GROUP 12 FG_COL5 FG_COL5_UNIT - END - NUMERO 1247 15 - BEGIN - KEY "giac" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1246/#1241 + GROUP 12 FG_COL5 FG_COL5_UNIT + END + VALUTA 1247 15 + BEGIN + KEY "giac" PROMPT 17 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1347 - GROUP 12 FG_COL6 - END - NUMERO 1287 12 - BEGIN - KEY "VALMEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1347 + GROUP 12 FG_COL6 + END + VALUTA 1287 12 + BEGIN + KEY "VALMEDIO" PROMPT 18 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1247/#1241 - GROUP 12 FG_COL6 FG_COL6_UNIT - END - END // tot gart3 - - END // GART2 + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1247/#1241 + GROUP 12 FG_COL6 FG_COL6_UNIT + END + END // tot gart3 + + END // GART2 SECTION TOT_GART2 1 1 1 GROUP STRINGA 1350 30 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 1351 20 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 1353 3 - BEGIN - KEY "UM" + END + STRINGA 1353 3 + BEGIN + KEY "UM" PROMPT 5 1 "" MESSAGE _USER,COPY_UM,1453 - END - NUMERO 1341 12 - BEGIN - KEY "GIAC" + END + NUMERO 1341 12 + BEGIN + KEY "GIAC" PROMPT 6 1 "" - PICTURE "########,@##" + PICTURE "########,@##" MESSAGE _USER,VALIDATE_UM,1353|ADD,1441 - GROUP 13 - END - NUMERO 1342 15 - BEGIN - KEY "VAL1" + GROUP 13 + END + VALUTA 1342 15 + BEGIN + KEY "VAL1" PROMPT 7 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1442 - GROUP 13 - END - NUMERO 1382 12 - BEGIN - KEY "VALMEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1442 + GROUP 13 + END + VALUTA 1382 12 + BEGIN + KEY "VALMEDIO" PROMPT 8 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1342/#1341 - GROUP 13 FG_COL1 FG_COL1_UNIT - END - NUMERO 1343 15 - BEGIN - KEY "COL2" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1342/#1341 + GROUP 13 FG_COL1 FG_COL1_UNIT + END + VALUTA 1343 15 + BEGIN + KEY "COL2" PROMPT 9 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1443 - GROUP 13 FG_COL2 - END - NUMERO 1383 12 - BEGIN - KEY "VALMEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1443 + GROUP 13 FG_COL2 + END + VALUTA 1383 12 + BEGIN + KEY "VALMEDIO" PROMPT 10 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1343/#1341 - GROUP 13 FG_COL2 FG_COL2_UNIT - END - NUMERO 1344 15 - BEGIN - KEY "COL3" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1343/#1341 + GROUP 13 FG_COL2 FG_COL2_UNIT + END + VALUTA 1344 15 + BEGIN + KEY "COL3" PROMPT 11 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,1444 - GROUP 13 FG_COL3 - END - NUMERO 1384 12 - BEGIN - KEY "VALMEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,1444 + GROUP 13 FG_COL3 + END + VALUTA 1384 12 + BEGIN + KEY "VALMEDIO" PROMPT 12 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1344/#1341 - GROUP 13 FG_COL3 FG_COL3_UNIT - END - NUMERO 1345 15 - BEGIN - KEY "COL4" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1344/#1341 + GROUP 13 FG_COL3 FG_COL3_UNIT + END + VALUTA 1345 15 + BEGIN + KEY "COL4" PROMPT 13 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,1445 - GROUP 13 FG_COL4 - END - NUMERO 1385 12 - BEGIN - KEY "VALMEDIO" + PICTURE "###.###.##@" + MESSAGE ADD,1445 + GROUP 13 FG_COL4 + END + VALUTA 1385 12 + BEGIN + KEY "VALMEDIO" PROMPT 14 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1345/#1341 - GROUP 13 FG_COL4 FG_COL4_UNIT - END - NUMERO 1346 15 - BEGIN - KEY "COL5" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1345/#1341 + GROUP 13 FG_COL4 FG_COL4_UNIT + END + VALUTA 1346 15 + BEGIN + KEY "COL5" PROMPT 15 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,1446 - GROUP 13 FG_COL5 - END - NUMERO 1386 12 - BEGIN - KEY "VALMEDIO" + PICTURE "###.###.##@" + MESSAGE ADD,1446 + GROUP 13 FG_COL5 + END + VALUTA 1386 12 + BEGIN + KEY "VALMEDIO" PROMPT 16 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1346/#1341 - GROUP 13 FG_COL5 FG_COL5_UNIT - END - NUMERO 1347 15 - BEGIN - KEY "giac" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1346/#1341 + GROUP 13 FG_COL5 FG_COL5_UNIT + END + VALUTA 1347 15 + BEGIN + KEY "giac" PROMPT 17 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,1447 - GROUP 13 FG_COL6 - END - NUMERO 1387 12 - BEGIN - KEY "VALMEDIO" + PICTURE "###.###.##@" + MESSAGE ADD,1447 + GROUP 13 FG_COL6 + END + VALUTA 1387 12 + BEGIN + KEY "VALMEDIO" PROMPT 18 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1347/#1341 - GROUP 13 FG_COL6 FG_COL6_UNIT - END - END // tot gart2 - - END // GART1 + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1347/#1341 + GROUP 13 FG_COL6 FG_COL6_UNIT + END + END // tot gart2 + + END // GART1 SECTION TOT_GART1 1 1 1 GROUP STRINGA 1450 30 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 3 1 "" - END + END STRINGA 1451 20 - BEGIN - KEY "" + BEGIN + KEY "" PROMPT 2 1 "" - END - STRINGA 1453 3 - BEGIN - KEY "UM" + END + STRINGA 1453 3 + BEGIN + KEY "UM" PROMPT 5 1 "" - MESSAGE _USER,COPY_UM,53 - END - NUMERO 1441 12 - BEGIN - KEY "GIAC" + //MESSAGE _USER,COPY_UM,53 + END + NUMERO 1441 12 + BEGIN + KEY "GIAC" PROMPT 6 1 "" - PICTURE "########,@##" - MESSAGE _USER,VALIDATE_UM,1453|ADD,41 - GROUP 14 - END - NUMERO 1442 15 - BEGIN - KEY "VAL1" + PICTURE "########,@##" + MESSAGE _USER,VALIDATE_UM,1453//|ADD,41 + GROUP 14 + END + VALUTA 1442 15 + BEGIN + KEY "VAL1" PROMPT 7 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,42 - GROUP 14 - END - NUMERO 1482 12 - BEGIN - KEY "VALMEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,42|ADD,1642|ADD,1742 + GROUP 14 + END + VALUTA 1482 12 + BEGIN + KEY "VALMEDIO" PROMPT 8 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1442/#1441 - GROUP 14 FG_COL1 FG_COL1_UNIT - END - NUMERO 1443 15 - BEGIN - KEY "COL2" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1442/#1441 + GROUP 14 FG_COL1 FG_COL1_UNIT + END + VALUTA 1443 15 + BEGIN + KEY "COL2" PROMPT 9 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,43 - GROUP 14 FG_COL2 - END - NUMERO 1483 12 - BEGIN - KEY "VALMEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,43|ADD,1643|ADD,1743 + GROUP 14 FG_COL2 + END + VALUTA 1483 12 + BEGIN + KEY "VALMEDIO" PROMPT 10 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1443/#1441 - GROUP 14 FG_COL2 FG_COL2_UNIT - END - NUMERO 1444 15 - BEGIN - KEY "COL3" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1443/#1441 + GROUP 14 FG_COL2 FG_COL2_UNIT + END + VALUTA 1444 15 + BEGIN + KEY "COL3" PROMPT 11 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,44 - GROUP 14 FG_COL3 - END - NUMERO 1484 12 - BEGIN - KEY "VALMEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,44|ADD,1644|ADD,1744 + GROUP 14 FG_COL3 + END + VALUTA 1484 12 + BEGIN + KEY "VALMEDIO" PROMPT 12 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1444/#1441 - GROUP 14 FG_COL3 FG_COL3_UNIT - END - NUMERO 1445 15 - BEGIN - KEY "COL4" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1444/#1441 + GROUP 14 FG_COL3 FG_COL3_UNIT + END + VALUTA 1445 15 + BEGIN + KEY "COL4" PROMPT 13 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,45 - GROUP 14 FG_COL4 - END - NUMERO 1485 12 - BEGIN - KEY "VALMEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,45|ADD,1645|ADD,1745 + GROUP 14 FG_COL4 + END + VALUTA 1485 12 + BEGIN + KEY "VALMEDIO" PROMPT 14 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1445/#1441 - GROUP 14 FG_COL4 FG_COL4_UNIT - END - NUMERO 1446 15 - BEGIN - KEY "COL5" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1445/#1441 + GROUP 14 FG_COL4 FG_COL4_UNIT + END + VALUTA 1446 15 + BEGIN + KEY "COL5" PROMPT 15 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,46 - GROUP 14 FG_COL5 - END - NUMERO 1486 12 - BEGIN - KEY "VALMEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,46|ADD,1646|ADD,1746 + GROUP 14 FG_COL5 + END + VALUTA 1486 12 + BEGIN + KEY "VALMEDIO" PROMPT 16 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1446/#1441 - GROUP 14 FG_COL5 FG_COL5_UNIT - END - NUMERO 1447 15 - BEGIN - KEY "giac" + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1446/#1441 + GROUP 14 FG_COL5 FG_COL5_UNIT + END + VALUTA 1447 15 + BEGIN + KEY "giac" PROMPT 17 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,47 - GROUP 14 FG_COL6 - END - NUMERO 1487 12 - BEGIN - KEY "VALMEDIO" + PICTURE "##.###.###.##@" + MESSAGE ADD,47|ADD,1647|ADD,1747 + GROUP 14 FG_COL6 + END + VALUTA 1487 12 + BEGIN + KEY "VALMEDIO" PROMPT 18 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#1447/#1441 - GROUP 14 FG_COL6 FG_COL6_UNIT - END - END // tot gart1 - END // GRUPPI DEPOSITO + FLAGS "U" + PICTURE "###.###.##@" + MESSAGE _NUMEXPR,#1447/#1441 + GROUP 14 FG_COL6 FG_COL6_UNIT + END + END // tot gart1 + END //GRUPPI SCATMER - SECTION TOT_DEPOSITO 1 1 1 GROUP + SECTION TOT_SCATMER 1 1 1 GROUP + STRINGA 1750 30 + BEGIN + KEY "" + PROMPT 3 1 "Totale " + END + STRINGA 1751 20 + BEGIN + KEY "" + PROMPT 2 1 "" + END + STRINGA 1753 3 + BEGIN + KEY "UM" + PROMPT 5 1 "" + END + NUMERO 1741 12 + BEGIN + KEY "GIAC" + PROMPT 6 1 "" + PICTURE "########,@##" + GROUP 17 + END + VALUTA 1742 15 + BEGIN + KEY "VAL1" + PROMPT 7 1 "" + PICTURE "##.###.###.##@" + GROUP 17 + END + NUMERO 1782 12 + BEGIN + KEY "VALMEDIO" + PROMPT 8 1 "" + GROUP 17 FG_COL1 FG_COL1_UNIT + END + VALUTA 1743 15 + BEGIN + KEY "COL2" + PROMPT 9 1 "" + PICTURE "##.###.###.##@" + GROUP 17 FG_COL2 + END + NUMERO 1783 12 + BEGIN + KEY "VALMEDIO" + PROMPT 10 1 "" + GROUP 16 FG_COL2 FG_COL2_UNIT + END + VALUTA 1744 15 + BEGIN + KEY "COL3" + PROMPT 11 1 "" + PICTURE "##.###.###.##@" + GROUP 17 FG_COL3 + END + NUMERO 1784 12 + BEGIN + KEY "VALMEDIO" + PROMPT 12 1 "" + GROUP 17 FG_COL3 FG_COL3_UNIT + END + VALUTA 1745 15 + BEGIN + KEY "COL4" + PROMPT 13 1 "" + PICTURE "##.###.###.##@" + GROUP 17 FG_COL4 + END + NUMERO 1785 12 + BEGIN + KEY "VALMEDIO" + PROMPT 14 1 "" + GROUP 17 FG_COL4 FG_COL4_UNIT + END + VALUTA 1746 15 + BEGIN + KEY "COL5" + PROMPT 15 1 "" + PICTURE "##.###.###.##@" + GROUP 17 FG_COL5 + END + NUMERO 1786 12 + BEGIN + KEY "VALMEDIO" + PROMPT 16 1 "" + GROUP 17 FG_COL5 FG_COL5_UNIT + END + VALUTA 1747 15 + BEGIN + KEY "giac" + PROMPT 17 1 "" + PICTURE "##.###.###.##@" + GROUP 17 FG_COL6 + END + NUMERO 1787 12 + BEGIN + KEY "VALMEDIO" + PROMPT 18 1 "" + GROUP 17 FG_COL6 FG_COL6_UNIT + END + END // tot scat_mer + + END //GRUPPI MERC + + SECTION TOT_CATMER 1 1 1 FOOTER //GROUP + /* + STRINGA 1 77 + BEGIN + KEY "sep" + PROMPT 6 3 "" + MESSAGE _USER,LINEATOTALI + END*/ + STRINGA 1650 30 + BEGIN + KEY "" + PROMPT 3 1 "Totale " + END + STRINGA 1651 20 + BEGIN + KEY "" + PROMPT 2 1 "" + END + STRINGA 1653 3 + BEGIN + KEY "UM" + PROMPT 5 1 "" + END + NUMERO 1641 12 + BEGIN + KEY "GIAC" + PROMPT 6 1 "" + PICTURE "########,@##" + //MESSAGE _USER,VALIDATE_UM,1653 + GROUP 16 + END + VALUTA 1642 15 + BEGIN + KEY "VAL1" + PROMPT 7 1 "" + PICTURE "##.###.###.##@" + GROUP 16 + END + NUMERO 1682 12 + BEGIN + KEY "VALMEDIO" + PROMPT 8 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#1542/#1541 + GROUP 16 FG_COL1 FG_COL1_UNIT + END + VALUTA 1643 15 + BEGIN + KEY "COL2" + PROMPT 9 1 "" + PICTURE "##.###.###.##@" + GROUP 16 FG_COL2 + END + NUMERO 1683 12 + BEGIN + KEY "VALMEDIO" + PROMPT 10 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#1543/#1541 + GROUP 16 FG_COL2 FG_COL2_UNIT + END + VALUTA 1644 15 + BEGIN + KEY "COL3" + PROMPT 11 1 "" + PICTURE "##.###.###.##@" + GROUP 16 FG_COL3 + END + NUMERO 1684 12 + BEGIN + KEY "VALMEDIO" + PROMPT 12 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#1544/#1541 + GROUP 16 FG_COL3 FG_COL3_UNIT + END + VALUTA 1645 15 + BEGIN + KEY "COL4" + PROMPT 13 1 "" + PICTURE "##.###.###.##@" + GROUP 16 FG_COL4 + END + NUMERO 1685 12 + BEGIN + KEY "VALMEDIO" + PROMPT 14 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#1545/#1541 + GROUP 16 FG_COL4 FG_COL4_UNIT + END + VALUTA 1646 15 + BEGIN + KEY "COL5" + PROMPT 15 1 "" + PICTURE "##.###.###.##@" + GROUP 16 FG_COL5 + END + NUMERO 1686 12 + BEGIN + KEY "VALMEDIO" + PROMPT 16 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#1546/#1541 + GROUP 16 FG_COL5 FG_COL5_UNIT + END + VALUTA 1647 15 + BEGIN + KEY "COL6" + PROMPT 17 1 "" + PICTURE "##.###.###.##@" + GROUP 16 FG_COL6 + END + NUMERO 1687 12 + BEGIN + KEY "VALMEDIO" + PROMPT 18 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#1547/#1541 + GROUP 16 FG_COL6 FG_COL6_UNIT + END + END // tot catmerc + + END // GRUPPI DEPOSITO + + SECTION TOT_DEPOSITO 1 1 1 GROUP SECTION SEP_DEPOSITO 1 1 0 NORMAL GROUP - STRINGA 77 - BEGIN + STRINGA 77 + BEGIN KEY "" PROMPT 52 1 "" MESSAGE _USER,LINEATOTALI - END - END + END + END STRINGA 51 20 - BEGIN - KEY "CODICE" + BEGIN + KEY "CODICE" PROMPT 2 1 "Deposito " - END - STRINGA 50 30 - BEGIN - KEY "descr" - PROMPT 3 1 "" - END - STRINGA 53 3 - BEGIN - KEY "UM" - PROMPT 5 1 "" - MESSAGE _USER,COPY_UM,153 - END - NUMERO 41 12 - BEGIN - KEY "GIAC" - PROMPT 6 1 "" - PICTURE "########,@##" - MESSAGE _USER,VALIDATE_UM,53|ADD,141 - GROUP 15 - END - NUMERO 42 15 - BEGIN - KEY "VAL1" - PROMPT 7 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,142 - GROUP 15 - END - NUMERO 82 12 - BEGIN - KEY "VAL1M" - PROMPT 8 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#42/#41 - GROUP FG_COL1 FG_COL1_UNIT - END - NUMERO 43 15 - BEGIN - KEY "VAL2" - PROMPT 9 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,143 - GROUP 15 FG_COL2 - END - NUMERO 83 12 - BEGIN - KEY "VAL2M" - PROMPT 10 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#43/#41 - GROUP FG_COL2 FG_COL2_UNIT - END - NUMERO 44 15 - BEGIN - KEY "VAL3" - PROMPT 11 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,144 - GROUP 15 FG_COL3 - END - NUMERO 84 12 - BEGIN - KEY "VAL3M" - PROMPT 12 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#44/#41 - GROUP FG_COL3 FG_COL3_UNIT - END - NUMERO 45 15 - BEGIN - KEY "VAL4" - PROMPT 13 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,145 - GROUP 15 FG_COL4 - END - NUMERO 85 12 - BEGIN - KEY "VAL3M" - PROMPT 14 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#45/#41 - GROUP FG_COL4 FG_COL4_UNIT - END - NUMERO 46 15 - BEGIN - KEY "VAL5" - PROMPT 15 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,146 - GROUP 15 FG_COL5 - END - NUMERO 86 12 - BEGIN - KEY "VAL5M" - PROMPT 16 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#46/#41 - GROUP FG_COL5 FG_COL5_UNIT - END - NUMERO 47 15 - BEGIN - KEY "VAL6" - PROMPT 17 1 "" - PICTURE "##.###.###.##@" - MESSAGE ADD,147 - GROUP 15 FG_COL6 - END - NUMERO 87 12 - BEGIN - KEY "VAL6M" - PROMPT 18 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#47/#41 - GROUP FG_COL6 FG_COL6_UNIT - END - END // tot depositi - END // MAGAZZ + END + STRINGA 50 30 + BEGIN + KEY "descr" + PROMPT 3 1 "" + END + STRINGA 53 3 + BEGIN + KEY "UM" + PROMPT 5 1 "" + //MESSAGE _USER,COPY_UM,153 + END + NUMERO 41 12 + BEGIN + KEY "GIAC" + PROMPT 6 1 "" + //PICTURE "########,@##" + //MESSAGE _USER,VALIDATE_UM,53|ADD,141 + GROUP 15 + END + VALUTA 42 15 + BEGIN + KEY "VAL1" + PROMPT 7 1 "" + PICTURE "##.###.###.##@" + MESSAGE ADD,142 + GROUP 15 + END + NUMERO 82 12 + BEGIN + KEY "VAL1M" + PROMPT 8 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#42/#41 + GROUP FG_COL1 FG_COL1_UNIT + END + VALUTA 43 15 + BEGIN + KEY "VAL2" + PROMPT 9 1 "" + PICTURE "##.###.###.##@" + MESSAGE ADD,143 + GROUP 15 FG_COL2 + END + NUMERO 83 12 + BEGIN + KEY "VAL2M" + PROMPT 10 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#43/#41 + GROUP FG_COL2 FG_COL2_UNIT + END + VALUTA 44 15 + BEGIN + KEY "VAL3" + PROMPT 11 1 "" + PICTURE "##.###.###.##@" + MESSAGE ADD,144 + GROUP 15 FG_COL3 + END + NUMERO 84 12 + BEGIN + KEY "VAL3M" + PROMPT 12 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#44/#41 + GROUP FG_COL3 FG_COL3_UNIT + END + VALUTA 45 15 + BEGIN + KEY "VAL4" + PROMPT 13 1 "" + PICTURE "##.###.###.##@" + MESSAGE ADD,145 + GROUP 15 FG_COL4 + END + NUMERO 85 12 + BEGIN + KEY "VAL3M" + PROMPT 14 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#45/#41 + GROUP FG_COL4 FG_COL4_UNIT + END + VALUTA 46 15 + BEGIN + KEY "VAL5" + PROMPT 15 1 "" + PICTURE "##.###.###.##@" + MESSAGE ADD,146 + GROUP 15 FG_COL5 + END + NUMERO 86 12 + BEGIN + KEY "VAL5M" + PROMPT 16 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#46/#41 + GROUP FG_COL5 FG_COL5_UNIT + END + VALUTA 47 15 + BEGIN + KEY "VAL6" + PROMPT 17 1 "" + PICTURE "##.###.###.##@" + MESSAGE ADD,147 + GROUP 15 FG_COL6 + END + NUMERO 87 12 + BEGIN + KEY "VAL6M" + PROMPT 18 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#47/#41 + GROUP FG_COL6 FG_COL6_UNIT + END + END // tot depositi + END // MAGAZZ - SECTION TOT_MAGAZZINO 1 1 1 GROUP - STRINGA 150 30 - BEGIN - KEY "Magazzino" - PROMPT 3 1 "" - END + SECTION TOT_MAGAZZINO 1 1 1 GROUP STRINGA 151 20 - BEGIN - KEY "Magazzino" - PROMPT 2 1 "Totale mag." - END - STRINGA 153 3 - BEGIN - KEY "UM" - PROMPT 5 1 "" - MESSAGE COPY,253 - END - NUMERO 141 12 - BEGIN - KEY "GIAC" - PROMPT 6 1 "" - PICTURE "########,@##" - MESSAGE _USER,VALIDATE_UM,153 - GROUP 1 - END - NUMERO 142 15 - BEGIN - KEY "VAL1" - PROMPT 7 1 "" - PICTURE "##.###.###.##@" - GROUP 1 - END - NUMERO 182 12 - BEGIN - KEY "VAL1" - PROMPT 8 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#142/#141 - GROUP 1 FG_COL1_UNIT - END - NUMERO 143 15 - BEGIN - KEY "VAL2" - PROMPT 9 1 "" - PICTURE "##.###.###.##@" - GROUP 1 FG_COL2 - END - NUMERO 183 12 - BEGIN - KEY "VAL1" - PROMPT 10 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#143/#141 - GROUP 1 FG_COL2 FG_COL2_UNIT - END - NUMERO 144 15 - BEGIN - KEY "VAL3" - PROMPT 11 1 "" - PICTURE "##.###.###.##@" - GROUP 1 FG_COL3 - END + BEGIN + KEY "Magazzino" + PROMPT 2 1 "@BTotale mag. " + END + STRINGA 150 30 + BEGIN + KEY "Magazzino" + PROMPT 3 1 "" + END + STRINGA 153 3 + BEGIN + KEY "UM" + PROMPT 5 1 "" + MESSAGE COPY,253 + END + NUMERO 141 12 + BEGIN + KEY "GIAC" + PROMPT 6 1 "" + PICTURE "########,@##" + //MESSAGE _USER,VALIDATE_UM,153 + GROUP 1 + END + VALUTA 142 15 + BEGIN + KEY "VAL1" + PROMPT 7 1 "" + PICTURE "##.###.###.##@" + GROUP 1 + END + NUMERO 182 12 + BEGIN + KEY "VAL1" + PROMPT 8 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#142/#141 + GROUP 1 FG_COL1_UNIT + END + VALUTA 143 15 + BEGIN + KEY "VAL2" + PROMPT 9 1 "" + PICTURE "##.###.###.##@" + GROUP 1 FG_COL2 + END + NUMERO 183 12 + BEGIN + KEY "VAL1" + PROMPT 10 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#143/#141 + GROUP 1 FG_COL2 FG_COL2_UNIT + END + VALUTA 144 15 + BEGIN + KEY "VAL3" + PROMPT 11 1 "" + PICTURE "##.###.###.##@" + GROUP 1 FG_COL3 + END NUMERO 184 12 - BEGIN - KEY "VAL1" - PROMPT 12 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#144/#141 - GROUP 1 FG_COL3 FG_COL3_UNIT - END - NUMERO 145 15 - BEGIN - KEY "VAL4" - PROMPT 13 1 "" - PICTURE "##.###.###.##@" - GROUP 1 FG_COL4 - END - NUMERO 185 12 - BEGIN - KEY "VAL4" - PROMPT 14 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#145/#141 - GROUP 1 FG_COL4 FG_COL4_UNIT - END - NUMERO 146 15 - BEGIN - KEY "VAL5" - PROMPT 15 1 "" - PICTURE "##.###.###.##@" - GROUP 1 FG_COL5 - END - NUMERO 186 12 - BEGIN - KEY "VAL1" - PROMPT 16 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#146/#141 - GROUP 1 FG_COL5 FG_COL5_UNIT - END - NUMERO 147 15 - BEGIN - KEY "VAL6" - PROMPT 17 1 "" - PICTURE "##.###.###.##@" - GROUP 1 FG_COL6 - END - NUMERO 187 12 - BEGIN - KEY "VAL6" - PROMPT 18 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#147/#141 - GROUP 1 FG_COL6 FG_COL6_UNIT - END - END // tot magazz + BEGIN + KEY "VAL1" + PROMPT 12 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#144/#141 + GROUP 1 FG_COL3 FG_COL3_UNIT + END + VALUTA 145 15 + BEGIN + KEY "VAL4" + PROMPT 13 1 "" + PICTURE "##.###.###.##@" + GROUP 1 FG_COL4 + END + NUMERO 185 12 + BEGIN + KEY "VAL4" + PROMPT 14 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#145/#141 + GROUP 1 FG_COL4 FG_COL4_UNIT + END + VALUTA 146 15 + BEGIN + KEY "VAL5" + PROMPT 15 1 "" + PICTURE "##.###.###.##@" + GROUP 1 FG_COL5 + END + NUMERO 186 12 + BEGIN + KEY "VAL1" + PROMPT 16 1 "" + FLAGS "U" + //PICTURE "###.###.##@" + //MESSAGE _NUMEXPR,#146/#141 + GROUP 1 FG_COL5 FG_COL5_UNIT + END + VALUTA 147 15 + BEGIN + KEY "VAL6" + PROMPT 17 1 "" + PICTURE "##.###.###.##@" + GROUP 1 FG_COL6 + END + NUMERO 187 12 + BEGIN + KEY "VAL6" + PROMPT 18 1 "" + FLAGS "U" + //PICTURE "###.###.###" + //MESSAGE _NUMEXPR,#147/#141 + GROUP 1 FG_COL6 FG_COL6_UNIT + END + END // tot magazz END // section body, loop anamag - SECTION FOOTER ODD 2 - END // fine footer +SECTION FOOTER ODD 2 +END // fine footer + +SECTION FOOTER LAST 3 COLUMNWISE + +STRINGA 1 146 +BEGIN + KEY "Separatore (iniziale)" + PROMPT 1 1 "---------------------------------------------------------" + MESSAGE _USER,LINEATOTALI +END + +STRINGA 2 68 +BEGIN + PROMPT 1 2 "@BTotale generale" +END + +VALUTA 11 15 +BEGIN + KEY "TOTALE COL. 1" + PROMPT 2 2 "" + PICTURE "##.###.###.##@" + FLAGS "H" +END + +NUMERO 12 12 +BEGIN + PROMPT 3 2 "" + FLAGS "H" +END + +VALUTA 13 15 +BEGIN + KEY "TOTALE COL. 2" + PROMPT 4 2 "" + PICTURE "##.###.###.##@" + FLAGS "H" +END + +NUMERO 14 12 +BEGIN + PROMPT 5 2 "" + FLAGS "H" +END + +VALUTA 15 15 +BEGIN + KEY "TOTALE COL. 3" + PROMPT 6 2 "" + FLAGS "H" + PICTURE "##.###.###.##@" +END + +NUMERO 16 12 +BEGIN + PROMPT 7 2 "" + FLAGS "H" +END + +VALUTA 17 15 +BEGIN + KEY "TOTALE COL. 4" + PROMPT 8 2 "" + FLAGS "H" + PICTURE "##.###.###.##@" +END + +NUMERO 18 12 +BEGIN + PROMPT 9 2 "" + FLAGS "H" +END + +VALUTA 19 15 +BEGIN + KEY "TOTALE COL. 5" + PROMPT 10 2 "" + FLAGS "H" + PICTURE "##.###.###.##@" +END + +NUMERO 20 12 +BEGIN + PROMPT 11 2 "" + FLAGS "H" +END + +VALUTA 21 15 +BEGIN + KEY "TOTALE COL. 6" + PROMPT 12 2 "" + FLAGS "H" + PICTURE "##.###.###.##@" +END + +NUMERO 22 12 +BEGIN + PROMPT 13 2 "" + FLAGS "H" +END + +END // Footer last END // fine form diff --git a/mg/mg4300.cpp b/mg/mg4300.cpp index 251eee075..54d701114 100755 --- a/mg/mg4300.cpp +++ b/mg/mg4300.cpp @@ -1,6 +1,7 @@ #include -#include #include +#include +#include #include "anamag.h" #include "mag.h" @@ -113,9 +114,10 @@ bool TGiornalemag::validate(TForm_item &cf, TToken_string &s) return TRUE; } else if (subcode== "INTEST_DITTA") { - if (!_reg_giorn->stampa_intditta()) return TRUE; - s="_DITTA,!RAGSOC"; - + if (_reg_giorn->stampa_intditta()) + s = "_DITTA,!RAGSOC"; + else + return TRUE; } else if (subcode== "PAGENO") { valore << (int)(last_pag_stampata+printer().getcurrentpage()); cf.set(valore); @@ -177,10 +179,27 @@ bool TGiornalemag::validate(TForm_item &cf, TToken_string &s) else valore << " " ; valore << ' '; + vv = ""; } if (ragg_articoli) { valore << "Art." << cursor()->relation()->lfile(LF_ANAMAG).get(ANAMAG_CODART) << ' '; + //vv << ' ' << cursor()->relation()->lfile(LF_RMOVMAG).get("LIVGIAC") << ' '; + TString livello(cursor()->relation()->lfile(LF_RMOVMAG).get("LIVGIAC")); + if (livello.not_empty() && livello_giac != 0) + { + for (int lev=1; lev <= livello_giac; lev++) + { + if (!giofrm->giaclev().enabled(lev)) + continue; + const int starts = giofrm->giaclev().code_start(lev) -1; + const int length = giofrm->giaclev().code_length(lev); + valore << livello.mid(starts,length); + valore << "/"; + } + valore << giofrm->giaclev().name(livello_giac); + valore << " " << giofrm->giaclev().group_descr_packed(livello,livello_giac) << " "; + } } else { if (ragg_classi) { @@ -197,18 +216,29 @@ bool TGiornalemag::validate(TForm_item &cf, TToken_string &s) //valore << cursor()->relation()->lfile(LF_RMOVMAG).get("NRIG"); } vv << "Art. " << cursor()->relation()->lfile(LF_ANAMAG).get(ANAMAG_CODART); - vv << ' ' << cursor()->relation()->lfile(LF_RMOVMAG).get("LIVGIAC") << ' '; + //vv << ' ' << cursor()->relation()->lfile(LF_RMOVMAG).get("LIVGIAC") << ' '; } } + valore << vv; + cf.set(valore); + return TRUE; + } else if (subcode== "INFO_CAUS") { + const TRectype& rec_caus = cache().get("%CAU", cf.get()); if (ragg_caus) { - TString16 raggcau(cur->relation()->lfile(-ALIAS_CAUSALI).get("S8")); + const TString16 raggcau = rec_caus.get("S8"); if (raggcau.blank()) - valore << "Causali varie " ; + valore << "Causali varie"; else - valore << "Causali gruppo " << raggcau << ' '; + { + const TRectype& rec_rag = cache().get("%RFC", raggcau); + valore << "Causali gruppo " << raggcau << ' ' << rec_rag.get("S0"); + } + } + else + { + valore << "Causale " << cf.get() << ' ' << rec_caus.get("S0"); } - valore << vv; cf.set(valore); return TRUE; } @@ -219,66 +249,76 @@ bool TGiornalemag::validate(TForm_item &cf, TToken_string &s) const char * TGiornalemag::get_cronofield(TVariable_rectype & r) { - static TString80 valore; + // static buffer + static TString * valore=NULL; if (valore == NULL ) valore = new TString80 ; + TDate datamov(cur->relation()->lfile(LF_MOVMAG).get_date("DATAREG")); long numreg=cur->relation()->lfile(LF_MOVMAG).get_int("NUMREG"); // gestione frequenza - valore.cut(0); + valore->cut(0); switch (freq_stampa ) { case 0: - valore.format("%4d%2d%2d%7d",datamov.year(), + valore->format("%4d%2d%2d%7d",datamov.year(), datamov.month(), datamov.day(), numreg); break; default: - valore.format("%4d%2d%2d",datamov.year(), + valore->format("%4d%2d%2d",datamov.year(), datamov.month(), (int)(datamov.day()/freq_stampa)); } - return valore; + return *valore; } const char * TGiornalemag::get_fiscfield(TVariable_rectype & r) { - static TString80 valore; + static TString * valore=NULL; if (valore == NULL ) valore = new TString80 ; TString vv; - valore.cut(0); + valore->cut(0); // gestione ragruppamenti if (!ragg_mag) { - valore.format("%-15s",(const char *)cur->relation()->lfile(LF_RMOVMAG).get("CODMAG")); + valore->format("%-15s",(const char *)cur->relation()->lfile(LF_RMOVMAG).get("CODMAG")); } if (ragg_articoli) { - valore << cur->relation()->lfile(LF_ANAMAG).get(ANAMAG_CODART); - } else { + *valore << cur->relation()->lfile(LF_ANAMAG).get(ANAMAG_CODART); + + TString c2(cur->relation()->lfile(LF_RMOVMAG).get("LIVGIAC")); + if (livello_giac) + *valore << giofrm->giaclev().unpack_grpcode(c2, livello_giac); + } + else + { if (ragg_classi) { - valore << cur->relation()->lfile(LF_ANAMAG).get(ANAMAG_CLASSEFIS); + *valore << cur->relation()->lfile(LF_ANAMAG).get(ANAMAG_CLASSEFIS); if (ragg_raggart) { - valore << cur->relation()->lfile(LF_ANAMAG).get(ANAMAG_RAGGFIS); + *valore << cur->relation()->lfile(LF_ANAMAG).get(ANAMAG_RAGGFIS); } - } else { - if (!ragg_caus && freq_stampa==0) { + } + else + { + if (!ragg_caus && freq_stampa==0) + { vv.format("%4d",cur->relation()->lfile(LF_RMOVMAG).get_int("NRIG")); - } else { - TString c1(cur->relation()->lfile(LF_ANAMAG).get(ANAMAG_CODART)); - TString c2(cur->relation()->lfile(LF_RMOVMAG).get("LIVGIAC")); - c2 = livello_giac ? giofrm->giaclev().unpack_grpcode(c2, livello_giac) : c2; - vv.format("%-20s%-15s", (const char *)c1,(const char *)c2 ); + } + else + { + vv.format("%-20s", (const char *)cur->relation()->lfile(LF_ANAMAG).get(ANAMAG_CODART)); } } } - if (ragg_caus) - { - valore << cur->relation()->lfile(-ALIAS_CAUSALI).get("S8"); - } - valore << vv; - return valore; + if (ragg_caus) // raggruppo per "tipo" di causale + *valore << cur->curr(-ALIAS_CAUSALI).get("S8"); + else + *valore << cur->curr(-ALIAS_CAUSALI).get("CODTAB"); + *valore << vv; + return *valore; } @@ -318,16 +358,13 @@ void TGiornalemag::set_parametri(TMask & m) cursor()->relation()->lfile().set_curr(vrec_rmov); // inserisce tutti i magazzini collegati - TTable mag("MAG"); _cod_magazzini.destroy(); - mag.first(); - while (!mag.eof()) + TTable mag("MAG"); + for (int err = mag.first(); err == NOERR; err = mag.next()) { - TString16 codmag(mag.get("CODTAB").left(3)); - if (mag.get("CODTAB")==codmag) - if (mag.get("S8")==m.get(F_CODREG)) - _cod_magazzini.add(codmag); - mag.next(); + const TString16 codmag(mag.get("CODTAB").left(3)); + if (codmag.len() == 3 && mag.get("S8")==m.get(F_CODREG)) + _cod_magazzini.add(codmag); } // setta il filtro sui magazzini di questo giornale @@ -340,7 +377,7 @@ void TGiornalemag::set_parametri(TMask & m) void TGiornalemag::add_mag(TRectype & magrec,const char * codreg) { TString16 codmag(magrec.get("CODTAB").left(3)); - if (magrec.get("CODTAB")==codmag) + if (codmag.len() == 3) { if (_cod_magazzini.is_key(codmag)) return; if (magrec.get_int("I2")==1) @@ -360,17 +397,30 @@ void TGiornalemag::add_mag(TRectype & magrec,const char * codreg) bool TGiornalemag::filter_func(const TRelation* r) -{ +{ + const TRectype& movmag = r->curr(LF_MOVMAG); + const TDate datareg = movmag.get("DATAREG"); + if (datareg.year() != _annoes) + return FALSE; + if (!dadata.empty() && datareg < dadata) + return FALSE; + if (!adata.empty() && datareg > adata) + return FALSE; + + const TString16 codmag = r->curr(LF_RMOVMAG).get("CODMAG").left(3); + if (!_cod_magazzini.is_key(codmag)) + return FALSE; + + // considera solo le causali "fiscali" o quelle che movimentano le rimanenze iniziali(movimenti d'apertura) bool rval; - TCausale_magazzino & causmov=(TCausale_magazzino & )r->lfile(-ALIAS_CAUSALI).curr(); - TCausale_magazzino & causrig=(TCausale_magazzino & )r->lfile(-ALIAS_CAUSALIR).curr(); - rval = r->lfile(LF_MOVMAG).get_date("DATAREG").year()==_annoes; - rval &=_cod_magazzini.is_key(r->lfile(LF_RMOVMAG).get("CODMAG").left(3)); - if (!dadata.empty()) rval &=r->lfile(LF_MOVMAG).get_date("DATAREG")>=dadata; - if (!adata.empty()) rval &=r->lfile(LF_MOVMAG).get_date("DATAREG")<=adata; - // considera solo le causali "fiscali" - rval &=causrig.codice().not_empty() ? - causrig.is_fiscale(): causmov.is_fiscale(); + TCausale_magazzino& causrig=(TCausale_magazzino&)r->curr(-ALIAS_CAUSALIR); + if (causrig.codice().not_empty()) + rval = causrig.is_fiscale() || causrig.sgn(s_rim); + else + { + TCausale_magazzino& causmov=(TCausale_magazzino&)r->curr(-ALIAS_CAUSALI); + rval = causmov.is_fiscale() || causmov.sgn(s_rim); + } return rval; } @@ -424,8 +474,6 @@ int TGiornalemag::_annoes; // STAMPA giornale class TStampa_giornalemag : public TSkeleton_application { - - TArray * _files; TStampemg_mask * _mask; TGiornalemag * _giorn_mag; // to be moved into TPrint_application TCursor * _cur; @@ -444,15 +492,9 @@ public: bool TStampa_giornalemag::create() { + open_files(LF_ANAMAG, LF_MOVMAG, LF_RMOVMAG, LF_TAB, LF_TABCOM, 0); _mask = new TStampemg_mask("mg4300"); - _files = new TArray(); - _files->add(new TLocalisamfile(LF_RMOVMAG)); - _files->add(new TLocalisamfile(LF_MOVMAG)); _mask->show(F_TOLIVELLOGIAC, _mask->giaclev().enabled()); // Abilita la gestione del dettaglio livello giacenza - _mask->set_handler(F_FREQ, livgiac_handler); - _mask->set_handler(F_RAGGARTICOLI, livgiac_handler); - _mask->set_handler(F_CLASSEFISART, livgiac_handler); - _mask->set_handler(F_RAGGCAUS, livgiac_handler); return TSkeleton_application::create(); } @@ -463,23 +505,6 @@ bool TStampa_giornalemag::destroy() return TRUE; } -bool TStampa_giornalemag::livgiac_handler(TMask_field& f, KEY k) -{ - if ((f.focusdirty() && (k == K_SPACE)) || f.to_check(k)) - { - TMask& m = f.mask(); - const int freq_stampa = m.get_int(F_FREQ); - const bool ragg_articoli = m.get_bool(F_RAGGARTICOLI ); - const bool ragg_classi = m.get_bool(F_CLASSEFISART ); - const bool ragg_caus = m.get_bool(F_RAGGCAUS ); - const bool enable_liv = !ragg_articoli && !ragg_classi && (ragg_caus || freq_stampa); - m.enable(F_TOLIVELLOGIAC, enable_liv); - if (!enable_liv) - m.reset(F_TOLIVELLOGIAC); - } - return TRUE; -} - void TStampa_giornalemag::main_loop() { while (_mask->run() == K_ENTER ) diff --git a/mg/mg4300.frm b/mg/mg4300.frm index 37da1048b..2c4730145 100755 --- a/mg/mg4300.frm +++ b/mg/mg4300.frm @@ -10,12 +10,12 @@ END DESCRIPTION BEGIN - 47->* "Anagrafica articoli" - 109->* "Archivio Giacenze" - MAG->* "Tabella magazzini" - 110->* "Movimenti di magazzino" - 111->* "Righe Movimenti di magazzino" - 49->* "Unità di misura articoli" + 47->* "Anagrafica articoli" + 109->* "Archivio Giacenze" + MAG->* "Tabella magazzini" + 110->* "Movimenti di magazzino" + 111->* "Righe Movimenti di magazzino" + 49->* "Unità di misura articoli" END GENERAL @@ -25,12 +25,17 @@ BEGIN //SIZE 10 END +SECTION GRAPHIC +BEGIN +END + + SECTION HEADER ODD 5 STRINGA 1 40 1 BEGIN KEY "nome ditta" - PROMPT 1 1 "Ditta " - MESSAGE _USER, INTEST_DITTA + PROMPT 1 1 "" + MESSAGE _USER,INTEST_DITTA END STRINGA 2 10 @@ -66,7 +71,7 @@ SECTION HEADER ODD 5 END NUMBER 9 12 BEGIN - PROMPT 76 4 "Valore" + PROMPT 75 4 "Valore" END STRINGA 5 80 BEGIN @@ -102,9 +107,16 @@ SECTION BODY ODD 2 BEGIN PROMPT 1 1 "" MESSAGE _USER,INFO_FISC|COPY,FF_CODTOT + END + STRINGA 101 60 + BEGIN + PROMPT 10 1 "" + MESSAGE COPY,FF_INFOCAUS + FIELD ALIAS_CAUSALIR@->CODTAB + FIELD ALIAS_CAUSALI@->CODTAB END STRINGA 102 12 - BEGIN + BEGIN PROMPT 37 1 "" FIELD LF_UMART->UM MESSAGE COPY,FF_UMTOT @@ -130,7 +142,7 @@ SECTION BODY ODD 2 END NUMBER 103 12 BEGIN - PROMPT 71 1 "" + PROMPT 70 1 "" PICTURE "###.###,@##" MESSAGE _NUMEXPR,LF_RMOVMAG->QUANT*ALIAS_UMRMOV@->FC|_USER,*SEGNOCAUS|ADD,FF_QTARAGGFIS END @@ -153,36 +165,31 @@ SECTION BODY ODD 2 END SECTION TOTALI_RAGG_FISC 1 1 1 NUMEXPR #FF_QTARAGGFIS!=0 - SECTION HEADER_RAGG_CRONO 1 2 1 NUMEXPR #FF_NUMLINEE=0 - STRINGA FF_INFORAGGCRO 150 + SECTION HEADER_RAGG_CRONO 1 2 2 NUMEXPR #FF_NUMLINEE=0 + STRINGA FF_INFORAGGCRO 70 BEGIN PROMPT 1 1 "" MESSAGE _USER,INCNUMREGST END - SECTION HEADER_MOV 2 2 1 GROUP - STRINGA 101 30 - BEGIN - PROMPT 10 1 "Causale: " - FIELD LF_MOVMAG->CODCAUS // == FIELD ALIAS_CAUSALI@->CODTAB - END - STRINGA 101 50 - BEGIN - PROMPT 31 1 "" - FIELD ALIAS_CAUSALI@->S0 - END - SECTION HEADER_EXDOC 2 1 1 NUMEXPR LF_MOVMAG->EX_NUMDOC!=0 + STRINGA FF_INFOCAUS 70 + BEGIN + PROMPT 9 2 "" + MESSAGE _USER,INFO_CAUS + END + SECTION HEADER_MOV 3 0 0 GROUP + SECTION HEADER_EXDOC 1 1 1 NUMEXPR LF_MOVMAG->EX_NUMDOC!=0 STRINGA 101 25 BEGIN PROMPT 10 1 "Documento " FIELD LF_MOVMAG->EX_NUMDOC END - STRINGA 101 10 + STRINGA 102 10 BEGIN PROMPT 30 1 "del " FIELD LF_MOVMAG->EX_DATADOC END END // end section header doc - SECTION HEADER_DOC 2 1 1 NUMEXPR (LF_MOVMAG->EX_NUMDOC==0) && (LF_MOVMAG->NUMDOC!=0) + SECTION HEADER_DOC 1 1 1 NUMEXPR (LF_MOVMAG->EX_NUMDOC==0) && (LF_MOVMAG->NUMDOC!=0) STRINGA 101 25 BEGIN PROMPT 10 1 "Documento " @@ -203,19 +210,19 @@ SECTION BODY ODD 2 MESSAGE INC,FF_NUMLINEE END STRINGA FF_UMTOT 2 - BEGIN + BEGIN PROMPT 42 1 "" GROUP 2 END NUMBER FF_QTARAGGFIS 12 - BEGIN + BEGIN PROMPT 45 1 "" PICTURE "###.###,@##" GROUP 2 END NUMBER FF_VALTOT 12 BEGIN - PROMPT 71 1 "" + PROMPT 70 1 "" PICTURE "###.###.###" GROUP 2 END diff --git a/mg/mg4300.h b/mg/mg4300.h index 1c4f281e9..49a9eed0c 100755 --- a/mg/mg4300.h +++ b/mg/mg4300.h @@ -34,6 +34,6 @@ #define FF_INFORAGGCRO 605 #define FF_NUMREG 606 #define FF_NUMLINEE 607 - +#define FF_INFOCAUS 608 #endif //__MG4300_H diff --git a/mg/mg4300.uml b/mg/mg4300.uml index 280191196..d01b28bbf 100755 --- a/mg/mg4300.uml +++ b/mg/mg4300.uml @@ -4,43 +4,37 @@ PAGE "Stampa giornale" -1 -1 78 20 NUMBER F_ANNO 4 BEGIN - FLAGS "AH" + FLAGS "AH" END NUMBER F_ANNOES 4 BEGIN + PROMPT 2 1 "Anno " FLAGS "A" - PROMPT 2 1 "Codice es. " - USE ESC - INPUT CODTAB F_ANNOES - DISPLAY "Esercizio" CODTAB - DISPLAY "Dal@12" D0 - DISPLAY "Al@12" D1 - OUTPUT F_ANNOES CODTAB - ADD NONE - CHECKTYPE NORMAL + CHECKTYPE REQUIRED END STRING F_CODREG 3 BEGIN - FLAGS "U" + FLAGS "U" PROMPT 42 1 "Codice giornale " - USE REG SELECT I0=9 - INPUT CODTAB[1,4] F_ANNOES - INPUT CODTAB[5,7] F_CODREG - COPY DISPLAY F_ANNOES - OUTPUT F_ANNOES CODTAB[1,4] - OUTPUT F_CODREG CODTAB[5,7] - CHECKTYPE REQUIRED - ADD NONE + USE REG SELECT I0=9 + INPUT CODTAB[1,4] F_ANNOES + INPUT CODTAB[5,7] F_CODREG + DISPLAY "Anno" CODTAB[1,4] + DISPLAY "Codice" CODTAB[5,8] + DISPLAY "Descrizione" S0 + OUTPUT F_ANNOES CODTAB[1,4] + OUTPUT F_CODREG CODTAB[5,7] + CHECKTYPE REQUIRED + ADD NONE END - LISTBOX F_DEFINITIVA 10 BEGIN PROMPT 2 3 "Si desidera la stampa " - ITEM "P|di prova" - ITEM "D|definitiva" + ITEM "P|di prova" + ITEM "D|definitiva" END DATE F_DATAIN @@ -55,57 +49,70 @@ END NUMBER F_FREQ 2 BEGIN - FLAGS "U" + FLAGS "U" PROMPT 2 7 "Frequenza di stampa " - NUM_EXPR #F_FREQ<=31 - WARNING "La frequenza di stampa può essere fino a 31 giorni" + NUM_EXPR #F_FREQ<=31 + WARNING "La frequenza di stampa può essere fino a 31 giorni" END BOOLEAN F_RAGG BEGIN PROMPT 2 9 "Raggruppo" - MESSAGE TRUE ENABLE,F_RAGGMAG|ENABLE,F_CLASSEFISART|ENABLE,F_RAGGARTICOLI|ENABLE,F_RAGGCAUS - MESSAGE FALSE CLEAR,F_RAGGMAG|CLEAR,F_CLASSEFISART|CLEAR,F_RAGGARTICOLI|CLEAR,F_RAGGCAUS - GROUP G_OPZ + MESSAGE TRUE ENABLE,F_RAGGMAG|ENABLE,F_CLASSEFISART|ENABLE,F_RAGGARTICOLI|ENABLE,F_RAGGCAUS + MESSAGE FALSE CLEAR,F_RAGGMAG|CLEAR,F_CLASSEFISART|CLEAR,F_RAGGARTICOLI|CLEAR,F_RAGGCAUS + GROUP G_OPZ END BOOLEAN F_RAGGMAG BEGIN - FLAGS "D" + FLAGS "D" PROMPT 2 11 "Raggruppo i magazzini" - GROUP G_OPZ + GROUP G_OPZ END BOOLEAN F_RAGGARTICOLI BEGIN - FLAGS "D" + FLAGS "D" PROMPT 2 12 "Raggruppo le giacenze dello stesso articolo" - MESSAGE TRUE CLEAR,F_CLASSEFISART|K_SPACE,F_CLASSEFISART - MESSAGE FALSE ENABLE,F_CLASSEFISART - GROUP G_OPZ + MESSAGE TRUE CLEAR,F_CLASSEFISART|K_SPACE,F_CLASSEFISART|ENABLE,F_TOLIVELLOGIAC + MESSAGE FALSE ENABLE,F_CLASSEFISART|DISABLE,F_TOLIVELLOGIAC + GROUP G_OPZ END +NUMBER F_TOLIVELLOGIAC 1 +BEGIN + PROMPT 52 12 "Livello dettaglio " + FLAGS "D" + USE FCG + INPUT CODTAB F_TOLIVELLOGIAC + DISPLAY "Num." CODTAB + DISPLAY "Descr@50" S0 + OUTPUT F_TOLIVELLOGIAC CODTAB + CHECKTYPE NORMAL + WARNING "Livello finale non ammissibile" +END + BOOLEAN F_CLASSEFISART BEGIN - FLAGS "D" + FLAGS "D" PROMPT 2 13 "Raggruppo gli articoli della stessa classe fiscale" - MESSAGE FALSE CLEAR,F_RAGGFISART|K_SPACE,F_RAGGFISART|ENABLE,F_RAGGARTICOLI - MESSAGE TRUE ENABLE,F_RAGGFISART|CLEAR,F_RAGGARTICOLI - GROUP G_OPZ + MESSAGE FALSE CLEAR,F_RAGGFISART|K_SPACE,F_RAGGFISART|ENABLE,F_RAGGARTICOLI + MESSAGE TRUE ENABLE,F_RAGGFISART|CLEAR,F_RAGGARTICOLI + GROUP G_OPZ END BOOLEAN F_RAGGFISART BEGIN - FLAGS "D" + FLAGS "D" PROMPT 2 14 "Raggruppo gli articoli dello stesso ragg. fiscale" - GROUP G_OPZ + GROUP G_OPZ END BOOLEAN F_RAGGCAUS BEGIN - FLAGS "D" + FLAGS "D" PROMPT 2 15 "Raggruppo le causali" - GROUP G_OPZ + GROUP G_OPZ END NUMBER F_TOLIVELLOGIAC 1 diff --git a/mg/mg4frm.h b/mg/mg4frm.h index 46901658d..50b784f0f 100755 --- a/mg/mg4frm.h +++ b/mg/mg4frm.h @@ -21,6 +21,9 @@ #define FF_DISABLEUNIT5 685 #define FF_DISABLEUNIT6 686 +// Form item base per il FOOTER LAST nelle stampa inventario +#define FF_BASEFL 11 + // Questi sono i gruppi dei raggruppamenti // e rappresentano i vari gruppi articoli / livello giac / magazzini ed // altro a seconda della stmpa e dell'ordinamento scelto diff --git a/mg/mgarea.men b/mg/mgarea.men index 6c06ad5e6..e3cc0e822 100755 --- a/mg/mgarea.men +++ b/mg/mgarea.men @@ -16,19 +16,19 @@ Caption = "Archivi e tabelle di base" Picture = Module = 0 Flags = "" -Item_01 = "Tabelle", [MGAREA_002] -Item_02 = "Stampa Tabelle", [MGAREA_007] Item_03 = "Archivi di base", [MGAREA_012] +Item_01 = "Tabelle", [MGAREA_002] Item_04 = "Stampe archivi di base", [MGAREA_013] +Item_02 = "Stampa Tabelle", [MGAREA_007] [MGAREA_002] Caption = "Tabelle" Picture = Module = 0 Flags = "" -Item_01 = "Magazzino", [MGAREA_006] -Item_02 = "Vendita", [MGAREA_004] -Item_03 = "Contabili", [MGAREA_005] +Item_01 = "Tabelle Magazzino", [MGAREA_006] +Item_02 = "Tabelle Vendita", [MGAREA_004] +Item_03 = "Tabelle Contabili", [MGAREA_005] [MGAREA_004] Caption = "Tabelle vendita" @@ -193,7 +193,8 @@ Item_03 = "Agenti e dati generali", "ve0 -2 -2", "F" Item_04 = "Contabilizzazione sconti", "ve0 -2 -3", "F" Item_05 = "Contabilizzazione spese e bolli", "ve0 -2 -4", "F" Item_06 = "Contabilizzazione", "ve0 -2 -5", "F" -Item_07 = "Gestione spese e bolli", "ve0 -2 -6", "F" +Item_07 = "Articoli e Distinte", "ve0 -2 -7", "F" +Item_08 = "Configurazione contabilita'", "cg5 -1", "F" [MGAREA_022] Caption = "Configurazione magazzino" diff --git a/mg/mglib.h b/mg/mglib.h index a1c3f41b6..52af2d61e 100755 --- a/mg/mglib.h +++ b/mg/mglib.h @@ -57,7 +57,8 @@ typedef enum { riga_nongenerata=' ' // immissione direttta del mov. } TTipo_rigamovmag; -char * Nome_valorizz[]; +extern char * Nome_valorizz[]; + typedef enum { valorizz_ultcos, valorizz_mediacos, @@ -76,6 +77,7 @@ typedef enum { class TArticolo : public TMultiple_rectype { protected: + TString _codice; // la get_str supporta anche la sintassi: // #LF->fieldname // oppure: @@ -96,12 +98,13 @@ public: virtual TObject* dup() const { return new TArticolo(codice()); } - const TString& codice() const { return get(ANAMAG_CODART);} + // restituisce il codice (e' un reference "sicuro" ad una stringa interna) + const TString& codice() const; const TString& descrizione(const char * lingua = NULL) const; bool unlock() ; - bool lock_and_prompt() ; - void update_ultcosti(real costo,TDate data) ; + bool lock_and_prompt(const char * cod) ; + void update_ultcosti(const real& costo, const TDate& data, long numreg, int numrig); int find_um(const char * um, int from = 0) const { return find(LF_UMART, UMART_UM, um, from); } int find_deslin(const char * deslin, int from = 0) const { return find(LF_DESLIN, DESLIN_CODLIN, deslin, from); } @@ -141,6 +144,9 @@ protected: void reset_anno_sto () { set_anno_sto();} bool is_last_esercizio(const char* annoes) const; + void copia_storico(TString & newanno, const char * annoes,const char * codmag); + void add_storico(const char * annorif,const char * annoes,const char * codmag, const real & qta, const real & prz); + public: virtual TObject* dup() const { return new TArticolo_giacenza(codice()); } @@ -170,9 +176,9 @@ public: real costo_medio(const char * annoes, const char * codmag, const char * livello) const; real costo_mediopond(const char * annoes, const char * codmag, const char * livello) const; real LIFO_annuale(const char * annoes, const char * codmag, const char * livello, - bool giacenza_effettiva = TRUE, bool valorizza_componenti = TRUE) const; + bool giacenza_effettiva = TRUE, bool valorizza_componenti = TRUE) const; real FIFO_annuale(const char * annoes, const char * codmag, const char * livello, - bool giacenza_effettiva = TRUE, bool valorizza_componenti = TRUE) const; + bool giacenza_effettiva = TRUE, bool valorizza_componenti = TRUE) const; real LIFO(const char * annoes, const char * codmag, const char * livello, bool giacenza_effettiva = TRUE, bool valorizza_componenti = TRUE) const; real FIFO(const char * annoes, const char * codmag, const char * livello, @@ -181,13 +187,18 @@ public: bool giacenza_effettiva = TRUE, bool valorizza_componenti = TRUE) const; real FIFO_ragionieristico(const char * annoes, const char * codmag, const char * livello, bool giacenza_effettiva = TRUE, bool valorizza_componenti = TRUE) const; + void agg_storicoLIFOa(const char * annoes, const char * codmag, bool giac_eff, bool valorizza_componenti) ; + void agg_storicoFIFOa(const char * annoes, const char * codmag, bool giac_eff, bool valorizza_componenti) ; + void agg_storicoLIFO (const char * annoes, const char * codmag, bool giac_eff, bool valorizza_componenti) ; + void agg_storicoFIFO (const char * annoes, const char * codmag, bool giac_eff, bool valorizza_componenti) ; real giacenza_corretta(const TRectype & rec ,bool giacenza_effettiva,bool valorizza_componenti) const ; void put_ultimo_costo(const real& costo, const TDate& data); void put_costo_standard(const real& costo); - real giacenza_anno(const char* codmag, const char* livello, int anno = 0) const; + real giacenza_anno(const char* codmag, const char* livello, int anno) const; + real scorta_minima(const char* codmag, const char* livello, int anno) const; TArticolo_giacenza(const char* codice = NULL); TArticolo_giacenza(const TRectype& rec); @@ -197,11 +208,7 @@ public: // ******************************* // LIBRERIA DI utility del magazzino // ******************************* -//#define MANY_MAG_LEV 10 -//#define MAX_GIAC_LEVEL 4 - -#define MANY_MAG_LEV 10 -#define MAX_GIAC_LEVEL 4 +#define MAX_COD_LEVELS 10 class TR_automa; @@ -235,11 +242,11 @@ class TCodice_livelli : public TObject { long _last_firm; - bool _autoinsert[MANY_MAG_LEV]; - bool _codiceadata[MANY_MAG_LEV]; - int _code_length[MANY_MAG_LEV]; - TString _name[MANY_MAG_LEV]; - TString _picture[MANY_MAG_LEV]; + bool _autoinsert[MAX_COD_LEVELS]; + bool _codiceadata[MAX_COD_LEVELS]; + int _code_length[MAX_COD_LEVELS]; + TString _name[MAX_COD_LEVELS]; + TString _picture[MAX_COD_LEVELS]; int _last_level; TDecoder *_gruppi; @@ -254,6 +261,8 @@ protected: void test_firm(); public: + // Ritorna il numero massimo di livelli possibili + virtual inline int max_levels() const {return MAX_COD_LEVELS;} // Ritorna il numero di livelli abilitati int last_level() const { return enabled() ? _last_level : 0; } // Abilita la gestione dei livelli @@ -281,6 +290,8 @@ public: // Setta la colonna del campo livello codice di uno sheet in base alle abilitazioni void set_sheetcolumn(TSheet_field &fld_righe,int field, int lev) const; + // Setta le colonne dei campi livello codice di uno sheet in base alle abilitazioni + void set_sheet_columns(TSheet_field &sht, short dlg) const; // costruisce il codice compatto e viceversa void pack_maskgrpcodes(TString & pc, const TMask & m, int field, int level); void pack_grpcode(TString & pc, const TString &codlev, const int levnum); // Inserisce il codice del gruppo del livello levnum in pc @@ -316,6 +327,7 @@ public: class TCodart_livelli : public TCodice_livelli { public: + virtual inline int max_levels() const {return 10;} virtual void init(); TCodart_livelli(); // costruttore @@ -326,6 +338,7 @@ public: class TCodgiac_livelli : public TCodice_livelli { public: + virtual inline int max_levels() const {return 4;} virtual void init(); TCodgiac_livelli(); // costruttore @@ -388,14 +401,16 @@ typedef enum class TCausale_magazzino : public TRectype { + static TDecoder _ragg_fisc; + public: const TString & codice() const {return get("CODTAB");} const TString & descr() const {return get("S0");} char tipoprz() const {return get_char("S6");} char tipomov() const {return get_char("S7");} - const TString & raggfisc() {return get("S8");} - const TString & caus_collegata() {return get("S9");} - int sgn(TTipo_saldomag fieldname) ; + const TString & raggfisc() const {return get("S8");} + const TString & caus_collegata() const {return get("S9");} + int sgn(TTipo_saldomag fieldname) const; bool update_qta() const {return !get_bool("B1");} bool update_val() const {return !get_bool("B0");} bool update_ultcos() const {return get_bool("B2");} @@ -416,19 +431,20 @@ class TLine_movmag ; // convenience... // ( un movimento (testata+righe) == un oggetto TMov_mag ) class TMov_mag : public TMultiple_rectype { - // - TString16 _annoes; + TString16 _annoes; // codice esercizio del movimento + TDate _datacomp; // data di competenza // TArticolo_giacenza curr_art; TAssoc_array lines_to_add; TAssoc_array lines_to_subtract; - static TRecord_cache cache_causali; + static TRecord_cache _cache_causali; protected: virtual void load_rows_file(int logicnum); virtual void set_body_key(TRectype & rowrec); + virtual bool key_complete(); virtual bool renum(); // rinumerazione ; // ************ gestione saldi @@ -473,15 +489,17 @@ protected: bool add_explrows() const; public: // IO ad alto livello - const char *get_next_key() ; + virtual const char *get_next_key() ; virtual int remove(TBaseisamfile& f) const ; virtual void zero(char c = '\0');// azzeramento ; virtual int write(TBaseisamfile& f) const ; virtual int rewrite(TBaseisamfile& f) const ; int force_update_bal(); + + const TCausale_magazzino& causale(const char* cod = NULL) const; // - int codice_esercizio(TDate &d); + int codice_esercizio(const TDate &d); // costruttori e distruttori TMov_mag(); virtual ~TMov_mag(); @@ -497,11 +515,18 @@ bool rebuild_balances(const TString& annoes, #define FORM_MAXARTLEV 8 // numero di livelli codice nel form #define UNKNOWN_NAME "-" +typedef enum { + normale, // Codice o descrizione + ragg_fisc, // Raggr. Fiscale + Codice Articolo + cat_merc, // Cat. Merceologica[1..3] + Codice Articolo + scat_merc // Cat. Merceologica[1..5] + Codice Articolo +} TTipo_ordinamento_mg; + class TForm_stampemg : public TForm { bool _permag; int _fromlivgiac,_tolivgiac,_fromlivart,_tolivart; - bool _sottocatmer; + TTipo_ordinamento_mg _ordering; //sostituire con le funzioni di TLivelli_... : //TDecoder *_giacgrp,*_artgrp; @@ -520,7 +545,8 @@ public: void gruppoart(TForm_item &cf, TToken_string &s); void codgruppogiac(TForm_item &cf, TToken_string &s); bool validate(TForm_item &cf, TToken_string &s); - void setcatmer(bool catmer,bool sottoc=FALSE); + void set_ordering(const TTipo_ordinamento_mg t); + TTipo_ordinamento_mg get_ordering() const { return _ordering; } bool setdett_perart(bool totaliart, int fromlivart,int livart,bool totaligiac, int fromlivgiac,int livgiac,bool showmag, bool showdep); bool setdett_permag(bool totaliart, int fromlivart,int livart,bool totaligiac, int fromlivgiac, int livgiac,bool showmag, bool showdep,bool showdett); TForm_stampemg(const char *name,const char *code) ; @@ -587,7 +613,7 @@ public: void put_contratto(const char * codcontr,const char *tipocf,const char *codcf); void put_offerta(const char * codoff); // ricerca il codice - bool ricerca(const char * cod, const real& qta = ZERO); + bool ricerca(const char * cod, const real& qta = ZERO) ; TCondizione_vendita(TConfig * _ditta = NULL, TLocalisamfile * anamag = NULL, TLocalisamfile * umart = NULL); virtual ~TCondizione_vendita() {} @@ -640,5 +666,8 @@ public: virtual ~TRegistro_std() {} }; +const char * add_magcode(TString & codmagdep, const char * m); +const char * add_depcode(TString & codmagdep, const char * d); + #endif //__MGLIB_H diff --git a/mg/mglib01.cpp b/mg/mglib01.cpp index fa90a0495..4d086b374 100755 --- a/mg/mglib01.cpp +++ b/mg/mglib01.cpp @@ -619,7 +619,7 @@ void TCodice_livelli::load(bool enabled, const char *tabname,const char *tabgrp) _lev_enabled = enabled; _last_level=0; - for (int i=0; i < MANY_MAG_LEV; i++) + for (int i=0; i < max_levels(); i++) { _name[i]=""; _code_length[i]=0; @@ -630,7 +630,7 @@ void TCodice_livelli::load(bool enabled, const char *tabname,const char *tabgrp) if (_lev_enabled) { e = _tabformato.first(); - for (int i=0; e == NOERR && i < MANY_MAG_LEV; i++) + for (int i=0; e == NOERR && i < max_levels(); i++) { _name[i]=_tabformato.get("S0"); _picture[i]=_tabformato.get("S1"); @@ -650,7 +650,7 @@ const char *TCodice_livelli::code_format(int levnum) const { if (levnum<0) levnum=last_level(); - CHECK(levnum<=MANY_MAG_LEV && levnum>0,"I codici livello partono da 1") ; + CHECK(levnum<=max_levels() && levnum>0,"I codici livello partono da 1") ; CHECK(enabled(), "iu chent get de code format if levels ar disebold"); ((TCodice_livelli *)this)->add_metachar(levnum); @@ -662,7 +662,7 @@ bool TCodice_livelli::fit_to_format(const char *codepart,int levnum) const { if (levnum<0) levnum=last_level(); - CHECK(levnum<=MANY_MAG_LEV && levnum>0,"I codici livello partono da 1") ; + CHECK(levnum<=max_levels() && levnum>0,"I codici livello partono da 1") ; CHECK(enabled(), "iu chent cec ueter de format fits if levels ar disebold"); ((TCodice_livelli *)this)->add_metachar(levnum); return ((TMetachar*)_metachars.objptr(levnum-1))->recognized(codepart); @@ -671,7 +671,7 @@ bool TCodice_livelli::fit_to_format(const char *codepart,int levnum) const void TCodice_livelli::add_metachar(int levnum) { - CHECK(levnum<=MANY_MAG_LEV && levnum>0,"I codici livello partono da 1") ; + CHECK(levnum<=max_levels() && levnum>0,"I codici livello partono da 1") ; if (_metachars.objptr(levnum-1)==NULL) _metachars.add(new TMetachar(picture(levnum)),levnum-1); } @@ -683,21 +683,21 @@ const bool TCodice_livelli::enabled() const const bool TCodice_livelli::enabled(int levnum) const { - CHECK(levnum<=MANY_MAG_LEV && levnum>0,"I codici livello partono da 1") ; - return (_lev_enabled && levnum<=MANY_MAG_LEV && levnum>0 && levnum<=_last_level); + CHECK(levnum<=max_levels() && levnum>0,"I codici livello partono da 1") ; + return (_lev_enabled && levnum<=max_levels() && levnum>0 && levnum<=_last_level); } const int TCodice_livelli::code_start(int levnum) const { - CHECK(levnum<=MANY_MAG_LEV && levnum>0,"I codici livello partono da 1") ; + CHECK(levnum<=max_levels() && levnum>0,"I codici livello partono da 1") ; return packed_length(levnum-1)+1; } const int TCodice_livelli::code_length(int levnum) const { - CHECK(levnum<=MANY_MAG_LEV && levnum>0,"I codici livello partono da 1") ; + CHECK(levnum<=max_levels() && levnum>0,"I codici livello partono da 1") ; /* - if (_lev_enabled && levnum <= MANY_MAG_LEV && levnum > 0) + if (_lev_enabled && levnum <= max_levels() && levnum > 0) return(_code_length[levnum-1]); else return(0); @@ -707,29 +707,29 @@ const int TCodice_livelli::code_length(int levnum) const const int TCodice_livelli::packed_length(int levnum) const { - CHECK(levnum<=MANY_MAG_LEV ,"I codici livello arrivano fino a MANY_MAG_LEV") ; + CHECK(levnum<=max_levels() ,"I codici livello arrivano fino a max_levels()") ; int start=0; - for (int i=0; _lev_enabled && i0,"I codici livello partono da 1") ; + CHECK(levnum<=max_levels() && levnum>0,"I codici livello partono da 1") ; return(_name[levnum-1]); } const bool TCodice_livelli::autoinsert(int levnum) const { - CHECK(levnum<=MANY_MAG_LEV && levnum>0,"I codici livello partono da 1") ; + CHECK(levnum<=max_levels() && levnum>0,"I codici livello partono da 1") ; return _autoinsert[levnum-1]; } const bool TCodice_livelli::codiceadata(int levnum) const { - CHECK(levnum<=MANY_MAG_LEV && levnum>0,"I codici livello partono da 1") ; + CHECK(levnum<=max_levels() && levnum>0,"I codici livello partono da 1") ; return _codiceadata[levnum-1]; } @@ -750,7 +750,7 @@ const bool TCodice_livelli::autoinsert( int levnum, TMask_field & fld) const const bool TCodice_livelli::autoinsert(int levnum, TString & newcode) const { - CHECK(levnum<=MANY_MAG_LEV && levnum>0,"I codici livello partono da 1") ; + CHECK(levnum<=max_levels() && levnum>0,"I codici livello partono da 1") ; const int result=group_search(newcode, levnum); if (result == _iskeynotfound || result == _iseof || result == _iskeyerr) { @@ -788,7 +788,7 @@ const bool TCodice_livelli::autoinsert(int levnum, TString & newcode) const const TString & TCodice_livelli::picture(int levnum) const { - CHECK(levnum<=MANY_MAG_LEV && levnum>0,"I codici livello partono da 1") ; + CHECK(levnum<=max_levels() && levnum>0,"I codici livello partono da 1") ; return(_picture[levnum-1]); } @@ -800,14 +800,14 @@ void TCodice_livelli::pack_maskgrpcodes(TString & pc, const TMask & mask, int fi void TCodice_livelli::pack_grpcode(TString & pc, const TString &codlev, const int levnum) { - CHECK(levnum<=MANY_MAG_LEV && levnum>0,"I codici livello partono da 1") ; + CHECK(levnum<=max_levels() && levnum>0,"I codici livello partono da 1") ; pc.overwrite(codlev.left(_code_length[levnum-1]),packed_length(levnum-1)); } TString TCodice_livelli::unpack_grpcode(const TString& pc, const int levnum) const { - CHECK(levnum<=MANY_MAG_LEV && levnum>0,"I codici livello partono da 1") ; + CHECK(levnum<=max_levels() && levnum>0,"I codici livello partono da 1") ; int start=0; for (int i=1; _lev_enabled && i0,"I codici livello partono da 1") ; + CHECK(levnum<=max_levels() && levnum>0,"I codici livello partono da 1") ; TString valore; valore << levnum; valore << gcode; @@ -834,7 +834,7 @@ TString TCodice_livelli::build_tabcode(const TString & gcode, const int levnum) TString TCodice_livelli::build_tabcode_packed(const TString & pack, const int levnum) const { - CHECK(levnum<=MANY_MAG_LEV && levnum>0,"I codici livello partono da 1") ; + CHECK(levnum<=max_levels() && levnum>0,"I codici livello partono da 1") ; return build_tabcode(unpack_grpcode(pack,levnum),levnum); } @@ -869,20 +869,26 @@ const int TCodice_livelli::group_search_packed(const char * packed_code, int lev void TCodice_livelli::set_sheetcolumn(TSheet_field &fld_righe,int field, int lev) const { - CHECK(lev<=MANY_MAG_LEV && lev>0,"I codici livello partono da 1") ; + CHECK(lev <= max_levels() && lev > 0,"I codici livello partono da 1") ; if (enabled(lev)) { fld_righe.sheet_mask().field(field).show(); - fld_righe.set_column_header(fld_righe.cid2index(field),name(lev)); + fld_righe.set_column_header(field,name(lev)); fld_righe.sheet_mask().field(field).set_prompt(name(lev)); } else { fld_righe.sheet_mask().field(field).hide(); - fld_righe.delete_column(fld_righe.cid2index(field)); + fld_righe.delete_column(field); } } +void TCodice_livelli::set_sheet_columns(TSheet_field &sht, short dlg) const +{ + for (int l = 0; l < max_levels(); l++) + set_sheetcolumn(sht, dlg+l, l+1); +} + TCodice_livelli::TCodice_livelli() : _last_firm(-1), _gruppi(NULL) {} @@ -1000,3 +1006,16 @@ bool TMagazzini::gestmultimag() const { test_firm() ; return _gestmultimag; } + +const char * add_magcode(TString & str, const char * m) +{ + str = m; + str.rpad(3); + return str; +} + +const char * add_depcode(TString & str, const char * d) +{ + str << d; + return str.trim(); +} diff --git a/mg/mglib02.cpp b/mg/mglib02.cpp index 8fd50880a..74053ec79 100755 --- a/mg/mglib02.cpp +++ b/mg/mglib02.cpp @@ -2,11 +2,9 @@ // oggetto TArticolo_giacenza, multirecord dell'articolo di magazzino // oggetto TMov_Mag , multirecord del movimento di magazzino // funzione di ricostruzione saldi - -#include -#include -// #include +//#include #include +#include #include "mglib.h" @@ -18,6 +16,22 @@ #include "..\ve\veconf.h" // libreria per i movimenti +class TTimed_skipbox: public TTimed_breakbox +{ +public: + TTimed_skipbox(const char * message,int seconds,int x=40,int y=10); + ~TTimed_skipbox(); +}; + +TTimed_skipbox:: TTimed_skipbox(const char * message,int seconds,int x,int y) + : TTimed_breakbox(message,seconds,x,y) +{ + hide(DLG_CANCEL); + add_button(DLG_CANCEL, 0, "Ignora", -22, -1, 12, 2,"",0); +} + +TTimed_skipbox::~TTimed_skipbox() +{} char * Nome_valorizz[]= { @@ -29,6 +43,8 @@ char * Nome_valorizz[]= "FIFO Ragionieristico", "LIFO Ragionieristico" } ; +HIDDEN TString16 _mg_null_str; + const TString & TArticolo::get_str(const char* fieldname) const { if (*fieldname != '#') @@ -121,6 +137,12 @@ int TArticolo::read(const char * cod, word op, word lockop) return read( tmp, op, lockop); } +const TString& TArticolo::codice() const +{ + ((TArticolo *)this)->_codice=get(ANAMAG_CODART); + return _codice; +} + const TString & TArticolo::descrizione(const char* lingua) const { if (lingua && *lingua) @@ -134,21 +156,45 @@ const TString & TArticolo::descrizione(const char* lingua) const } -void TArticolo::update_ultcosti(real costo,TDate data) +void TArticolo::update_ultcosti(const real& costo, const TDate& data, long numreg, int _unused_) { - TDate data1(get_date(ANAMAG_DULTCOS1)); - if (data>= data1) + const TDate data1(get_date(ANAMAG_DULTCOS1)); + const TDate data2(get_date(ANAMAG_DULTCOS2)); + // modificato il 2-2-99; + const long numreg1 = get_long(ANAMAG_NUMREG1); + const long numreg2 = get_long(ANAMAG_NUMREG2); + if (data >= data1 || (numreg == numreg1 && // // movimento piu' recente o aggiornamento dello stesso movimento ... + (data > data2 || (numreg > numreg2 )))) // ... e "data" superiore al penultimo { real costo1(get_real(ANAMAG_ULTCOS1)); - put(ANAMAG_DULTCOS1,data); put(ANAMAG_ULTCOS1,costo); - put(ANAMAG_DULTCOS2,data1); - put(ANAMAG_ULTCOS2,costo1); - } else { - if (data>= get_date(ANAMAG_DULTCOS2)) + put(ANAMAG_DULTCOS1,data); + put(ANAMAG_NUMREG1,numreg); + if (numreg != numreg1 && (data > data1 || numreg > numreg1)) + { + // trasforma l'ultimo costo in penultimo + put(ANAMAG_ULTCOS2,costo1); + put(ANAMAG_DULTCOS2,data1); + put(ANAMAG_NUMREG2,numreg1); + } + } + else + { + real costo2(get_real(ANAMAG_ULTCOS2)); + if (data>= data2 || numreg == numreg2 || numreg == numreg1 ) + { put(ANAMAG_DULTCOS2,data); put(ANAMAG_ULTCOS2,costo); - } + put(ANAMAG_NUMREG2,numreg); + } + if (numreg == numreg1 ) + { + // trasforma il penultimo costo in ultimo + put(ANAMAG_ULTCOS1,costo2); + put(ANAMAG_DULTCOS1,data2); + put(ANAMAG_NUMREG1,numreg2); + } + } } bool TArticolo::unlock() @@ -156,22 +202,24 @@ bool TArticolo::unlock() bool rv; if (codice().not_empty()) { - TLocalisamfile anag(LF_ANAMAG); - anag.curr()=*this; - rv=(anag.read(_isequal,_unlock)==NOERR); + static TLocalisamfile *anag=NULL; if (anag==NULL) anag= new TLocalisamfile(LF_ANAMAG); + rv=(anag->read(*this, _isequal,_unlock)==NOERR); return rv; } return FALSE; } -bool TArticolo::lock_and_prompt() +bool TArticolo::lock_and_prompt(const char * cod) { TString mess; int err; - do { - TLocalisamfile anag(LF_ANAMAG); - anag.curr()=*this; - err=anag.read(_isequal,_testandlock); + //const TString cod(codice()); + + static TLocalisamfile *anag=NULL; if (anag==NULL) anag= new TLocalisamfile(LF_ANAMAG); + do + { + put(ANAMAG_CODART, cod); + err=anag->read(*this,_isequal,_testandlock); switch (err) { case NOERR: @@ -179,14 +227,20 @@ bool TArticolo::lock_and_prompt() case _islocked: { mess.cut(0); - mess << "Il record di anagrafica dell'articolo ''"<< codice() << "'' risulta essere già in uso.\n Interrompo ?"; + mess << "Il record di anagrafica\ndell'articolo ''"<< cod << "'' e' gia' usato da un altro programma. Scegliere se ritentare la lettura o ignorare l'articolo."; break; } + case _iskeynotfound: + mess.cut(0); + mess << "Il record di anagrafica\ndell'articolo ''"<< cod << "'' non esiste."; + error_box(mess); + return FALSE; + break; default: mess.cut(0); - mess << "Non riesco ad accedere al record di anagrafica dell'articolo ''"<< codice() << "'' \n Interrompo ?"; + mess << "Non riesco ad accedere al\nrecord di anagrafica dell'articolo ''"<< cod << "'' - errore " << err << "."; } - TTimed_breakbox bbox((const char *)mess,10); + TTimed_skipbox bbox((const char *)mess,10); if (bbox.run()==K_ESC) return FALSE; } while (TRUE); @@ -219,7 +273,11 @@ TArticolo::TArticolo(const char* codice) add_file(LF_CODCORR,"NRIGA"); add_file(LF_DESLIN,"NRIGA"); if (codice && *codice) - read(codice); + { + int err=read(codice); + if (err!=NOERR) + error_box("Impossibile leggere l'articolo %s: Errore %d",codice, err); + } } TArticolo::TArticolo(const TRectype& rec) @@ -385,7 +443,7 @@ TRecord_array & TArticolo_giacenza::mag(const char * annoes) const if (anno.blank()) { TEsercizi_contabili ese; - anno.format("%04d", ese.last()); + anno.format("%04d", ese.last_mag()); } ((TArticolo_giacenza*)this)->set_anno_mag(anno); return body(LF_MAG); @@ -397,7 +455,7 @@ TRecord_array & TArticolo_giacenza::storico(const char * annoesrif) const if (anno.blank()) { TEsercizi_contabili ese; - anno.format("%04d", ese.last()); + anno.format("%04d", ese.last_mag()); } ((TArticolo_giacenza *) this)->set_anno_sto(anno); return body(LF_STOMAG); @@ -412,7 +470,7 @@ bool TArticolo_giacenza::is_last_esercizio(const char* annoes) const if (anno > 0) { TEsercizi_contabili e; - yes = anno == e.last(); + yes = !e.esercizio(anno).chiusura_mag().ok() ; } } return yes; @@ -445,13 +503,13 @@ bool TArticolo_giacenza::azzera_saldi(const char * cod_es) return rec_arr.write(TRUE) == NOERR; } - bool TArticolo_giacenza::riporta_saldi(const char * oldes, const char* newes, const TTipo_valorizz tipo, const char* catven, const char* codlis) { TString codes(newes), mag, liv; TRecord_array& rec_arr = TArticolo_giacenza::mag(oldes); const int last = rec_arr.last_row(); real rim, val, giac, inpf, proc, icl, acl; + TCurrency currency(ZERO, "_FIRM"); rec_arr.renum_key(MAG_ANNOES, codes); // Rinumera for (int r = last;r > 0 ; r = rec_arr.pred_row(r)) // Scorre le righe @@ -506,6 +564,19 @@ bool TArticolo_giacenza::riporta_saldi(const char * oldes, const char* newes, co default: break; } + // Setta il prezzo al nr di decimali fissati per i prezzi della valuta corrente + if (tipo < valorizz_FIFOa) + { + currency.set_price(TRUE); + currency.set_num(val); + val = currency.string(); + } + val *= rim; + + // Setta l'importo al nr di decimali fissati per gli importi della valuta corrente + currency.set_price(FALSE); + currency.set_num(val); + val = currency.string(); rec.put(MAG_RIM, rim); rec.put(MAG_VALRIM, val); rec.zero(MAG_ACQ); rec.zero(MAG_VALACQ); rec.zero(MAG_ENT); rec.zero(MAG_VALENT); @@ -579,10 +650,11 @@ real TArticolo_giacenza::prezzo_listino(const char * annoes, const char * catven { if (is_last_esercizio(annoes)) { + TString codart=codice(); TConfig cfg(CONFIG_DITTA); TCondizione_vendita cv(&cfg); cv.put_listino(codlist,catven); - if (cv.ricerca(codice())) + if (cv.ricerca(codart)) return cv.get_prezzo(); else { @@ -617,8 +689,11 @@ real TArticolo_giacenza::costo_medio(const char * annoes, const char * codmag, c { real acq; real valacq; - - CHECK(strlen(codmag)<=3, "Non è più possibile avere valorizzazione a livello di deposito"); + +#ifdef DBG + if (strlen(codmag)>3) + NFCHECK("Non è più possibile avere valorizzazione a livello di deposito"); +#endif TRecord_array & rmag = mag(annoes); for (int i = find_mag(annoes, codmag, livello); i > 0; @@ -638,7 +713,10 @@ real TArticolo_giacenza::costo_mediopond(const char * annoes, const char * codma real acq; real valacq; - CHECK(strlen(codmag)<=3, "Non è più possibile avere valorizzazione a livello di deposito"); +#ifdef DBG + if (strlen(codmag)>3) + NFCHECK("Non è più possibile avere valorizzazione a livello di deposito"); +#endif TRecord_array & rmag = mag(annoes); for (int i = find_mag(annoes, codmag, livello); i > 0; i = find_mag(annoes, codmag, livello, i)) @@ -653,17 +731,12 @@ real TArticolo_giacenza::costo_mediopond(const char * annoes, const char * codma return acq == ZERO ? costo_standard(annoes) : valacq / acq; } - - real TArticolo_giacenza::LIFO_annuale(const char * annoes, const char * codmag, const char * livello, bool giac_eff, bool valorizza_componenti) const { - CHECK(strlen(codmag)<=3, "Non è più possibile avere valorizzazione a livello di deposito"); - - real rim; - real valrim; - real acq; - real valacq; + CHECK(strlen(codmag)<=3,"Non è più possibile avere valorizzazione a livello di deposito"); + real rim,valrim; + real acq,valacq; real giacenza; TRecord_array & rmag = mag(annoes); for (int i = find_mag(annoes, codmag, livello); i > 0; i = find_mag(annoes, codmag, livello, i)) @@ -683,14 +756,13 @@ real TArticolo_giacenza::LIFO_annuale(const char * annoes, const char * codmag, return valrim / rim; } + real TArticolo_giacenza::FIFO_annuale(const char * annoes, const char * codmag, const char * livello, bool giac_eff, bool valorizza_componenti) const { - CHECK(strlen(codmag)<=3, "Non è più possibile avere valorizzazione a livello di deposito"); - real rim; - real valrim; - real acq; - real valacq; + CHECK(strlen(codmag)<=3,"Non è più possibile avere valorizzazione a livello di deposito"); + real rim,valrim; + real acq,valacq; real giacenza; TRecord_array & rmag = mag(annoes); for (int i = find_mag(annoes, codmag, livello); i > 0; i = find_mag(annoes, codmag, livello, i)) @@ -705,20 +777,18 @@ real TArticolo_giacenza::FIFO_annuale(const char * annoes, const char * codmag, } if (giacenza <= ZERO) return ZERO; - if (giacenza > acq) return ((giacenza - acq) * (valrim / rim) + valacq) / giacenza; return valacq / acq; } + real TArticolo_giacenza::LIFO(const char * annoes, const char * codmag, const char * livello, bool giac_eff, bool valorizza_componenti) const { - CHECK(strlen(codmag)<=3, "Non è più possibile avere valorizzazione a livello di deposito"); - real rim; - real valrim; - real acq; - real valacq; + CHECK(strlen(codmag)<=3,"Non è più possibile avere valorizzazione a livello di deposito"); + real rim,valrim; + real acq,valacq; real giacenza; TRecord_array & rmag = mag(annoes); for (int i = find_mag(annoes, codmag, livello); i > 0; i = find_mag(annoes, codmag, livello, i)) @@ -740,20 +810,21 @@ real TArticolo_giacenza::LIFO(const char * annoes, const char * codmag, const ch TRecord_array & rstorico = storico(annoes); // const int last = rstorico.last_row(); + valrim=ZERO; rim = giacenza; for (i = find_storico(annoes, "", codmag); i > 0; i = find_storico(annoes, "", codmag, i)) { - const TRectype & rec = rstorico.row(i); + TRectype & rec = rstorico[i]; const real qta = rec.get(STOMAG_QUANT); if (qta > giacenza) { - valrim += (rec.get_real(STOMAG_VALORE) / qta) * giacenza; + valrim += (rec.get_real(STOMAG_VALORE)) * giacenza; break; } else { - valrim += rec.get_real(STOMAG_VALORE); + valrim += rec.get_real(STOMAG_VALORE) * qta; giacenza -= qta; } } @@ -763,11 +834,9 @@ real TArticolo_giacenza::LIFO(const char * annoes, const char * codmag, const ch real TArticolo_giacenza::FIFO(const char * annoes, const char * codmag, const char * livello, bool giac_eff, bool valorizza_componenti) const { - CHECK(strlen(codmag)<=3, "Non è più possibile avere valorizzazione a livello di deposito"); - real rim; - real valrim; - real acq; - real valacq; + CHECK(strlen(codmag)<=3,"Non è più possibile avere valorizzazione a livello di deposito"); + real rim,valrim; + real acq,valacq; real giacenza; TRecord_array & rmag = mag(annoes); for (int i = find_mag(annoes, codmag, livello); i > 0; i = find_mag(annoes, codmag, livello, i)) @@ -784,12 +853,12 @@ real TArticolo_giacenza::FIFO(const char * annoes, const char * codmag, const ch if (giacenza <= ZERO) return ZERO; if (giacenza <= acq) + { return valacq / acq; - - TRecord_array & rstorico = storico(annoes); - - const int last = rstorico.last_row(); + } + TRecord_array & rstorico = storico(annoes); + const int last = rstorico.last_row(); real res = giacenza - acq; rim = ZERO; valrim = ZERO; @@ -805,12 +874,12 @@ real TArticolo_giacenza::FIFO(const char * annoes, const char * codmag, const ch if (qta > res) { rim += res; - valrim += (rec.get_real(STOMAG_VALORE) / qta) * res; + valrim += (rec.get_real(STOMAG_VALORE)) * res; } else { rim += qta; - valrim += rec.get_real(STOMAG_VALORE); + valrim += rec.get_real(STOMAG_VALORE) * qta; res -= qta; } } @@ -832,6 +901,152 @@ real TArticolo_giacenza::LIFO_ragionieristico(const char * annoes, const char * return ZERO; // da implementare } +void TArticolo_giacenza::copia_storico(TString & nuovoanno,const char * annoes,const char * codmag) +{ + CHECK(codmag && *codmag,"Copia_storico: Indicare l'anno esercizio dello storico"); + TEsercizi_contabili ese; + nuovoanno=ese.next(atoi(annoes)); + TRecord_array & rstorico = storico(annoes); + int last=rstorico.last_row(); + int codmag_len = (codmag && *codmag) ? strlen(codmag) : 0; + for (int i = rstorico.last_row(); i > 0; i--) + if (codmag_len == 0 || rstorico[i].get(STOMAG_CODMAG).compare(codmag, codmag_len) == 0) + { + TRectype newrec(rstorico[i]); + newrec.put(STOMAG_ANNOESRIF,nuovoanno); + newrec.put(STOMAG_NRIGA,++last); + rstorico.insert_row(newrec); + } +} + +void TArticolo_giacenza::add_storico(const char * annorif,const char * annoes,const char * codmag, const real & qta, const real & prz) +{ + CHECK(codmag && *codmag,"Add_storico: Indicare l'anno esercizio dello storico"); + TEsercizi_contabili ese; + TRecord_array & rstorico = storico(annoes); + for (int i=rstorico.last_row(); i>0; i--) + { + TString anno=rstorico[i].get(STOMAG_ANNOESRIF); + if (anno<=annorif) + { + TString mag=rstorico[i].get(STOMAG_CODMAG); + if (mag<=codmag) + break; + } + } + TRectype storec(LF_STOMAG); + storec.put(STOMAG_ANNOESRIF,annorif); + storec.put(STOMAG_CODART,codice()); + storec.put(STOMAG_NRIGA,i+1); + storec.put(STOMAG_CODMAG,codmag); + storec.put(STOMAG_QUANT,qta); + storec.put(STOMAG_VALORE,prz); + rstorico.insert_row(storec); +} +// annoes indica l'anno dell'esercizio da chiudere +void TArticolo_giacenza::agg_storicoLIFO(const char * annoes, const char * codmag, + bool giac_eff, bool valorizza_componenti) +{ + CHECK(strlen(codmag)<=3,"Non è più possibile avere valorizzazione a livello di deposito"); + CHECK(codmag && *codmag,"Necessario indicare il magazzino"); + + real rim,acq,valacq,giacenza; + TRecord_array & rmag = mag(annoes); + for (int i = find_mag(annoes, codmag, ""); i > 0; i = find_mag(annoes, codmag, "", i)) + { + const TRectype & rec = rmag.row(i); + rim += rec.get_real(MAG_RIM); + acq += rec.get_real(MAG_ACQ); + valacq += rec.get_real(MAG_VALACQ); + giacenza += giacenza_corretta(rec,giac_eff,valorizza_componenti); + } + TCurrency qta(ZERO,"_FIRM"),prz(ZERO,"_FIRM",TRUE); + + TString nuovoanno; + copia_storico(nuovoanno, annoes, nuovoanno); + + if (giacenza <= ZERO) + giacenza=ZERO; + if (giacenza > rim) + { + qta.set_num(giacenza-rim); + prz.set_num(valacq/acq); + add_storico(nuovoanno,annoes,codmag,qta.get_num(),prz.get_num()); + return; + } + real res = rim-giacenza; + TRecord_array & rstorico = storico(nuovoanno); + for (i = find_storico(nuovoanno, "", codmag); i > 0; i = find_storico(nuovoanno, "", codmag, i)) + { + TRectype & rec = rstorico[i]; + const real qta_sto=rec.get_real(STOMAG_QUANT); + if (qta_sto > res) + { + qta.set_num(qta_sto-res); + rec.put(STOMAG_QUANT,qta.get_num()); + break; + } else { + rstorico.destroy_row(i); + res -= qta_sto; + } + } + rstorico.pack(); +} + + +void TArticolo_giacenza::agg_storicoFIFO(const char * annoes, const char * codmag, + bool giac_eff, bool valorizza_componenti) +{ + CHECK(strlen(codmag)<=3,"Non è più possibile avere valorizzazione a livello di deposito"); + CHECK(codmag && *codmag,"Necessario indicare il magazzino"); + real rim,acq,valacq,giacenza; + TRecord_array & rmag = mag(annoes); + for (int i = find_mag(annoes, codmag, ""); i > 0; i = find_mag(annoes, codmag, "", i)) + { + const TRectype & rec = rmag.row(i); + rim += rec.get_real(MAG_RIM); + acq += rec.get_real(MAG_ACQ); + valacq += rec.get_real(MAG_VALACQ); + giacenza += giacenza_corretta(rec,giac_eff,valorizza_componenti); + } + + if (giacenza <= ZERO) + return ; + if (giacenza <= acq) + return; + TString nuovoanno; + copia_storico(nuovoanno, annoes, codmag); + + TCurrency qta(ZERO,"_FIRM"),prz(ZERO,"_FIRM",TRUE); + TRecord_array & rstorico = storico(annoes); + const int last = rstorico.last_row(); + real res = giacenza - acq; + for (i = find_storico(nuovoanno, "", codmag); i > 0; i = find_storico(nuovoanno, "", codmag, i)) + { + TRectype & rec = rstorico[i]; + const real qta_sto = rec.get(STOMAG_QUANT); + if (res > qta_sto) + { + res -= qta_sto; + } else { + if (res>ZERO) + { + qta.set_num(res); + rec.put(STOMAG_QUANT, qta.get_num()); + res=ZERO; + } else { + rstorico.destroy_row(i); + } + } + } + // aggiunge la quota dell'anno in corso + qta.set_num(giacenza-rim); + prz.set_num(valacq/acq); + add_storico(nuovoanno, annoes, codmag, qta.get_num(), prz.get_num()); + rstorico.pack(); +} + + void TArticolo_giacenza::put_ultimo_costo(const real& costo, const TDate& data) { TDate d = get(ANAMAG_DULTCOS1); @@ -894,6 +1109,30 @@ real TArticolo_giacenza::giacenza_anno(const char* codmag, return giac; } +real TArticolo_giacenza::scorta_minima(const char* codmag, + const char* livello, + int anno) const +{ + TString16 annoes; + if (anno > 0) + annoes.format("%04d", anno); + + const TRecord_array& rmag = mag(annoes); + real sm; + int nmag=0; + for (int i = find_mag(annoes, codmag, livello); i > 0; + i = find_mag(annoes, codmag, livello, i)) + { + const TRectype& rec = rmag.row(i); + sm += rec.get_real("SCORTAMIN"); + nmag++; + } + if (nmag) + sm = sm / nmag; + return sm; +} + + TArticolo_giacenza::TArticolo_giacenza(const char* codice) : TArticolo(codice) { @@ -911,77 +1150,79 @@ TArticolo_giacenza::TArticolo_giacenza(const TRectype& rec) // causali -int TCausale_magazzino::sgn(TTipo_saldomag tiposaldo) +int TCausale_magazzino::sgn(TTipo_saldomag tiposaldo) const { - static TString *segni=NULL; if (segni==NULL) segni=new TString80; - *segni=get("S2"); + int index = -1; switch (tiposaldo) { - case s_giac: - return atoi(segni->mid(0,2)); - case s_acq: - return atoi(segni->mid(2,2)); - case s_ent: - return atoi(segni->mid(4,2)); - case s_ven: - return atoi(segni->mid(6,2)); - case s_usc: - return atoi(segni->mid(8,2)); - case s_ordc: - return atoi(segni->mid(10,2)); - case s_ordf: - return atoi(segni->mid(12,2)); - case s_incl: - return atoi(segni->mid(14,2)); - case s_acl: - return atoi(segni->mid(16,2)); - case s_prodc: - return atoi(segni->mid(18,2)); - case s_prodf: - return atoi(segni->mid(20,2)); - case s_rim: - return atoi(segni->mid(22,2)); - case s_scart: - return atoi(segni->mid(24,2)); - case s_label: - return atoi(segni->mid(26,2)); - case s_user1: - return atoi(segni->mid(28,2)); - case s_user2: - return atoi(segni->mid(30,2)); - case s_user3: - return atoi(segni->mid(32,2)); - case s_user4: - return atoi(segni->mid(34,2)); - case s_user5: - return atoi(segni->mid(36,2)); - case s_user6: - return atoi(segni->mid(38,2)); - default: - return 0; + case s_giac : index = 0; break; + case s_acq : index = 2; break; + case s_ent : index = 4; break; + case s_ven : index = 6; break; + case s_usc : index = 8; break; + case s_ordc : index = 10; break; + case s_ordf : index = 12; break; + case s_incl : index = 14; break; + case s_acl : index = 16; break; + case s_prodc: index = 18; break; + case s_prodf: index = 20; break; + case s_rim : index = 22; break; + case s_scart: index = 24; break; + case s_label: index = 26; break; + case s_user1: index = 28; break; + case s_user2: index = 30; break; + case s_user3: index = 32; break; + case s_user4: index = 34; break; + case s_user5: index = 36; break; + case s_user6: index = 38; break; + default : index = -1; break; } + + int s = 0; + if (index >= 0) + { + const TString& s2 = get("S2"); + s = atoi(s2.mid(index, 2)); + } + return s; } +TDecoder TCausale_magazzino::_ragg_fisc("%RFC", "S6"); + bool TCausale_magazzino::is_fiscale() { - return (tipomov()=='S' || tipomov()=='C' ); + bool rt = FALSE; + + if (raggfisc().not_empty()) // Per essere fiscale deve avere il raggruppamento fiscale + { + const char tm = tipomov(); + rt = tm=='S' || tm=='C'; // La causale deve essere Carico o Scarico... + if (rt) + { + const char rfc = _ragg_fisc.decode(raggfisc())[0]; + rt = rfc == 'S' || rfc == 'C'; // Ed il raggruppamento deve essere Carico o Scarico + } + } + return rt; } TCausale_magazzino::TCausale_magazzino(const char * codice): TRectype(LF_TABCOM) { +/* TTable f("%CAU"); - settab("CAU"); put("CODTAB", codice); if (TRectype::read(f) != NOERR) zero(); +*/ + this->TRectype::operator =(cache().get("%CAU", codice)); } const real CENTO=real(100.0); -bool TCondizione_vendita:: ricerca(const char * codice, const real & qta) +bool TCondizione_vendita::ricerca(const char * codice, const real & qta) { int tiporic; switch (_condv.get_char("TIPO")) { @@ -1001,12 +1242,14 @@ bool TCondizione_vendita:: ricerca(const char * codice, const real & qta) bool TCondizione_vendita::cerca( int tiporicerca, const char * codriga , const real & qta) { - if( config_ditta().get_bool( "GES", "ve", tiporicerca ) ) +// if (_condv.get("COD").empty()) +// return FALSE; + + bool found = FALSE; + + if(config_ditta().get_bool("GES", "ve", tiporicerca)) { _condv.setkey( 1 ); - - if (_condv.get("COD").empty()) - return FALSE; switch( tiporicerca ) { case A_CONTRATTI: @@ -1026,13 +1269,12 @@ bool TCondizione_vendita::cerca( int tiporicerca, const char * codriga , const r } break; } - if( _condv.read( ) == NOERR ) + if( _condv.read() == NOERR ) { // si posiziona sulla riga const bool gest_scagl = _condv.get_bool("GESTSCAGL"); const TString16 seqricrighe( _condv.get( "SEQRIC" ) ); - bool found = FALSE; - + for( int i = 0; !found && i < seqricrighe.len( ); i ++ ) { _rcondv.zero( ); @@ -1043,7 +1285,7 @@ bool TCondizione_vendita::cerca( int tiporicerca, const char * codriga , const r _rcondv.put("COD", _condv.get("COD")); if (gest_scagl) _rcondv.put("NSCAGL", 1); - + char ricerca = seqricrighe[ i ]; _rcondv.put( "TIPORIGA", ricerca ); switch( ricerca ) @@ -1056,30 +1298,32 @@ bool TCondizione_vendita::cerca( int tiporicerca, const char * codriga , const r _rcondv.get("TIPORIGA")[0] == 'A') { const TString cod_found(_rcondv.get("CODRIGA")); - return cod_found.compare(codriga, cod_found.len()) == 0; + found = cod_found.compare(codriga, cod_found.len()) == 0; } } break; case 'R': _rcondv.put("CODRIGA", anamag().get( "RAGGFIS")); _rcondv.read(); + found = _rcondv.good(); break; case 'S': { _rcondv.put( "CODRIGA", anamag().get("GRMERC")); _rcondv.read( ); + found = _rcondv.good(); } break; case 'G': { _rcondv.put( "CODRIGA", anamag().get("GRMERC").left(3)); _rcondv.read( ); + found = _rcondv.good(); } break; default: break; } - found = _rcondv.good(); } // individua lo scaglione corretto in base alla quantita' if (found && gest_scagl) @@ -1101,11 +1345,30 @@ bool TCondizione_vendita::cerca( int tiporicerca, const char * codriga , const r _rcondv.read(rec); } _prezzo = _rcondv.get_real("PREZZO"); - return found; } + } + + if (!found) + { +/* + TLocalisamfile um(LF_UMART); // Use Frate cercone when possible! + um.put("CODART", codriga); + um.put("NRIGA", 1); + if (um.read() == NOERR) + { + _prezzo = um.get_real("PREZZO"); + found = TRUE; + } + else + _prezzo = ZERO; +*/ + TString80 cod; cod << codriga << "|1"; + const TRectype& um = cache().get(LF_UMART, cod); + _prezzo = um.get_real("PREZZO"); + found = _prezzo != ZERO; } - // Ricerca fallita - return FALSE; + + return found; } void TCondizione_vendita::put_condv(const char *tipocv,const char *codicecv,const char *catven,const char *tipocf,const char *codcf) diff --git a/mg/mglib03.cpp b/mg/mglib03.cpp index 232bab10e..9dfad3170 100755 --- a/mg/mglib03.cpp +++ b/mg/mglib03.cpp @@ -35,7 +35,7 @@ void TForm_stampemg::gruppogiac(TForm_item &cf, TToken_string &s) void TForm_stampemg::gruppoart(TForm_item &cf, TToken_string &s) { int lv=atoi(s.get()); - TString valore; + TToken_string valore; valore=_artlev->group_descr_packed(relation()->lfile(LF_ANAMAG).get("CODART"),lv); if (valore.empty()) @@ -49,7 +49,6 @@ void TForm_stampemg::gruppoart(TForm_item &cf, TToken_string &s) cf.set(valore); } - void TForm_stampemg::codgruppogiac(TForm_item &cf, TToken_string &s) { TString valore,levname; @@ -70,6 +69,7 @@ void TForm_stampemg::codgruppogiac(TForm_item &cf, TToken_string &s) bool TForm_stampemg::validate(TForm_item &cf, TToken_string &s) { + static TString *last_um=NULL; const TString code(s.get(0)); // prende il primo parametro, il codice del messaggio TString subcode; TString valore,levname; @@ -78,27 +78,8 @@ bool TForm_stampemg::validate(TForm_item &cf, TToken_string &s) subcode=s.get(); if (subcode=="GRUPPOGIAC") { - /* - int lv=atoi(s.get()); - do { - valore=_giaclev->build_tabcode(relation()->lfile(LF_MAG).get("LIVELLO"),lv); - } while (--lv>0 && valore==""); - if (valore!="") - levname=_giaclev->name(lv+1) ; - else - levname="giacenza"; - cf.set(levname << ' ' << _giacgrp->decode(valore)); - */ gruppogiac(cf,s); - } - if (subcode=="GRUPPOART") { - /* - int lv=atoi(s.get()); - do { - valore=_artlev->build_tabcode(relation()->lfile(LF_ANAMAG).get("CODART"),lv); - } while (--lv>0 && valore==""); - cf.set(_artgrp->decode(valore)); - */ + } else if (subcode=="GRUPPOART") { gruppoart(cf,s); } else if (subcode=="CODGRUPPOGIAC") { codgruppogiac(cf,s); @@ -110,17 +91,15 @@ bool TForm_stampemg::validate(TForm_item &cf, TToken_string &s) } while (--lv>0 && valore==""); cf.set(valore); - } - if (subcode=="CATMER") { - valore=relation()->lfile(_sottocatmer ? -401 : -400).get("S0"); + } else if (subcode=="CATMER") { + valore=relation()->lfile(_ordering == ragg_fisc ? -600 : (_ordering == scat_merc ? -401 : -400)).get("S0"); cf.set(valore); - } - if (subcode=="CODCATMER") { - valore=relation()->lfile(LF_ANAMAG).get("GRMERC"); - valore.rpad(5).cut(_sottocatmer ? 5:3); + } else if (subcode=="CODCATMER") { + valore=relation()->lfile(LF_ANAMAG).get(_ordering == ragg_fisc ? "RAGGFIS" : "GRMERC"); + if (_ordering != ragg_fisc) + valore.rpad(5).cut(_ordering == scat_merc ? 5:3); cf.set(valore); - } - if (subcode=="LIVELLIGIAC") { + } else if (subcode=="LIVELLIGIAC") { int lv=_tolivgiac; valore=""; do { @@ -177,31 +156,52 @@ bool TForm_stampemg::validate(TForm_item &cf, TToken_string &s) return TForm::validate(cf, s); } -void TForm_stampemg::setcatmer(bool catmer,bool sottoc) +void TForm_stampemg::set_ordering(const TTipo_ordinamento_mg t) { + _ordering = t; TForm_subsection &s=((TForm_subsection &)find_field('B',odd_page,"GRUPPI_CATMER")); - TString cond("GRMERC"); - if (catmer) - cond << "[1," << (sottoc ? 5 : 3) <<']'; - else - cond ="CODART[1,1]"; + TString cond; + switch (_ordering) + { + default: + case normale: + cond = "CODART"; + break; + case ragg_fisc: + cond = "RAGGFIS"; + break; + case cat_merc: + cond = "GRMERC[1,3]"; + break; + } s.setcondition(cond,_strexpr); - _sottocatmer=sottoc; -} +} bool TForm_stampemg::setdett_perart(bool totaliart,int fromlivart,int livart,bool totaligiac,int fromlivgiac,int livgiac,bool showmag, bool showdep) { - if (!totaliart && fromlivgiac==0) - fromlivart=artlev().last_level(); - if (!totaligiac) - { - if (livart==0) - livart=artlev().last_level(); // - } else { - if (livgiac==0) - livgiac=giaclev().last_level(); // - } + const int last_artlev=_artlev->last_level() ? _artlev->last_level() : 1; + const int last_giaclev=_giaclev->last_level(); + if (totaliart) // voglio i totali di articolo + { + if (livart==0 && fromlivgiac==0) + livart=last_artlev; // + } + else + { + if (fromlivgiac==0) + fromlivart=last_artlev; + } + if (totaligiac) // voglio i totali di giacenza + { + if (livgiac==0 && livart==0) + livgiac=last_giaclev; // + } + else + { + if (fromlivart>livart) + livart=fromlivart; + } find_field('B',odd_page,"H_MAGAZZINO").enable(showmag && showdep); find_field('B',odd_page,"TOT_MAGAZZINO").show(showmag); find_field('B',odd_page,"H_DEPOSITO").show(FALSE); @@ -211,15 +211,28 @@ bool TForm_stampemg::setdett_perart(bool totaliart,int fromlivart,int livart,boo bool TForm_stampemg::setdett_permag(bool totaliart,int fromlivart,int livart,bool totaligiac,int fromlivgiac,int livgiac,bool showmag, bool showdep,bool showdett) { - if (!totaliart && fromlivgiac==0) - fromlivart=artlev().last_level(); - if (!totaligiac) + const int last_artlev=_artlev->last_level() ? _artlev->last_level() : 1; + const int last_giaclev=_giaclev->last_level(); + + if (totaliart) // voglio i totali di articolo { - if (livart==0) - livart=artlev().last_level(); // - } else { - if (livgiac==0) - livgiac=giaclev().last_level(); // + if (livart==0 && fromlivgiac==0) + livart=last_artlev; // + } + else + { + if (fromlivgiac==0) + fromlivart=last_artlev; + } + if (totaligiac) // voglio i totali di giacenza + { + if (livgiac==0 && livart==0) + livgiac=last_giaclev; // + } + else + { + if (fromlivart>livart) + livart=fromlivart; } find_field('B',odd_page,"H_MAGAZZINO").show(showmag && (showdep || showdett) ); @@ -231,13 +244,14 @@ bool TForm_stampemg::setdett_permag(bool totaliart,int fromlivart,int livart,boo return setdettaglio(showdett,fromlivart,livart,fromlivgiac,livgiac,FALSE); } + bool TForm_stampemg::setdettaglio(bool show, int fromlivart,int livart,int fromlivgiac,int livgiac,bool dettgiac) { - const int last_artlev=_artlev->last_level(); + const int last_artlev=_artlev->last_level() ? _artlev->last_level() : 1; const int last_giaclev=_giaclev->last_level(); - const int tolivart =min(( livart ? livart :_artlev->last_level()) ,_artlev->last_level()-1) ; - const int tolivgiac=min((livgiac ? livgiac :_giaclev->last_level()),_giaclev->last_level()); + const int tolivart =min(( livart ? livart :last_artlev) ,last_artlev-1); + const int tolivgiac=min((livgiac ? livgiac :last_giaclev),last_giaclev ); _fromlivart=fromlivart; _fromlivgiac=fromlivgiac; @@ -248,7 +262,7 @@ bool TForm_stampemg::setdettaglio(bool show, int fromlivart,int livart,int froml TForm_subsection &s1=(TForm_subsection &)find_field('B',odd_page,"H_ARTICOLO"); TForm_subsection &s2=(TForm_subsection &)find_field('B',odd_page,"TOT_ARTICOLO"); if (fromlivgiac==0 // non raggruppo a partire dai livelli di giacenza - && (livart==0 ||livart==_artlev->last_level())) { + && (livart==0 || livart==last_artlev)) { s1.show(show && (dettgiac || livgiac!=0) ); s2.show(show); } else { @@ -266,7 +280,7 @@ bool TForm_stampemg::setdettaglio(bool show, int fromlivart,int livart,int froml sname << i; TForm_subsection &s2=(TForm_subsection &)find_field('B',odd_page,sname); s2.show(show && i>=fromlivart && - (itolivart || livgiac || dettgiac))) && fromlivgiac==0); + (itolivart || livgiac || dettgiac))) && fromlivgiac==0); } // abilita le sezioni del codice livelli giacenza for (i=1; i<=FORM_MAXGIACLEV; i++) @@ -274,7 +288,7 @@ bool TForm_stampemg::setdettaglio(bool show, int fromlivart,int livart,int froml TString sname("TOT_GLIVGIAC"); sname << i; TForm_subsection &s1=(TForm_subsection &)find_field('B',odd_page,sname); - s1.show(show && i>=fromlivgiac && (i<=tolivgiac) && livart==0); + s1.show(show && i>=fromlivgiac && (i<=tolivgiac) && (livart==0)); sname="H_GLIVGIAC"; sname << i; TForm_subsection &s2=(TForm_subsection &)find_field('B',odd_page,sname); @@ -318,6 +332,8 @@ TForm_stampemg::TForm_stampemg(const char *name,const char *code) _artlev= new TCodart_livelli(); _fromlivgiac=_tolivgiac=0; _fromlivart=_tolivart=0; + _ordering = normale; + } TForm_stampemg::~TForm_stampemg() { diff --git a/mg/mgprassi.men b/mg/mgprassi.men index feb015c81..c7a5f94d1 100755 --- a/mg/mgprassi.men +++ b/mg/mgprassi.men @@ -11,6 +11,7 @@ Item_05 = "Configurazione magazzino", [PRASSIMG_099] [PRASSIMG_061] Caption = "Tabelle di magazzino" +Module = 32 Picture = Item_02 = "Gestione tabelle", [MGAREA_006] Item_03 = "Stampa tabelle", [MGAREA_011] @@ -19,7 +20,7 @@ Item_03 = "Stampa tabelle", [MGAREA_011] [PRASSIMG_063] Caption = "Movimenti di magazzino" Picture = -Module = 0 +Module = 32 Flags = "" Item_01 = "Gestione interattiva", "mg1 -0", "F" Item_02 = "Ricostruzione saldi", "mg1 -1", "F" @@ -47,9 +48,9 @@ Flags = "" Item_01 = "Apertura/chiusura magazzino", "mg1 -3", "F" [PRASSIMG_099] -Caption = "Configurazione magazzino" +Caption = "Configurazione modulo magazzino" Picture = -Module = 0 +Module = 32 Flags = "" Item_01 = "Parametri di magazzino", "mg0 -2 -1", "F" Item_02 = "Formato codice articoli", "mg0 -0 FCA", "F" diff --git a/mr/f132.dir b/mr/f132.dir new file mode 100755 index 000000000..5af8e8c93 --- /dev/null +++ b/mr/f132.dir @@ -0,0 +1,3 @@ +132 +0 +$mrprep|0|0|504|0|File report per MRP||| diff --git a/mr/f132.trr b/mr/f132.trr new file mode 100755 index 000000000..e770d9ecf --- /dev/null +++ b/mr/f132.trr @@ -0,0 +1,46 @@ +132 +41 +TIPO|1|1|0|Tipo (H: Testata, R:Riga) +IMPIANTO|1|5|0|Codice impianto +LINEA|1|5|0|Codice linea +CODART|1|20|0|Codice articolo +LIVELLO|1|15|0|Livello di giacenza +UM|1|2|0|Unita di misura +QTAFIRST|4|13|5|Quantita precedente il primo periodo +QTA1|4|13|5|Quantita nel periodo 1 +CMIN1|4|13|5|Capacita minima nel periodo 1 +CMAX1|4|13|5|Capacita massima nel periodo 1 +QTA2|4|13|5|Quantita nel periodo 2 +CMIN2|4|13|5|Capacita minima nel periodo 2 +CMAX2|4|13|5|Capacita massima nel periodo 2 +QTA3|4|13|5|Quantita nel periodo 3 +CMIN3|4|13|5|Capacita minima nel periodo 3 +CMAX3|4|13|5|Capacita massima nel periodo 3 +QTA4|4|13|5|Quantita nel periodo 4 +CMIN4|4|13|5|Capacita minima nel periodo 4 +CMAX4|4|13|5|Capacita massima nel periodo 4 +QTA5|4|13|5|Quantita nel periodo 5 +CMIN5|4|13|5|Capacita minima nel periodo 5 +CMAX5|4|13|5|Capacita massima nel peridoo 5 +QTA6|4|13|5|Quantita nel periodo 6 +CMIN6|4|13|5|Capacita minima nel periodo 6 +CMAX6|4|13|5|Capacita massima nel periodo 6 +QTA7|4|13|5|Quantita nel periodo 7 +CMIN7|4|13|5|Capacita minima nel periodo 7 +CMAX7|4|13|5|Capacita massima nel periodo 7 +QTA8|4|13|5|Quantita nel periodo 8 +CMIN8|4|13|5|Capacita minima nel periodo 8 +CMAX8|4|13|5|Capacita massima nel periodo 8 +QTA9|4|13|5|Quantita nel periodo 9 +CMIN9|4|13|5|Capacita minima nel periodo 9 +CMAX9|4|13|5|Capacita massima nel periodo 9 +QTA10|4|13|5|Quantita nel periodo 10 +CMIN10|4|13|5|Capacita minima nel periodo 10 +CMAX10|4|13|5|Capacita massima nel periodo 10 +QTA11|4|13|5|Quantita nel periodo 11 +CMIN11|4|13|5|Capacita minima nel periodo 11 +CMAX11|4|13|5|Capacita massima nel periodo 11 +QTALAST|4|13|5|Quantita successiva l'ultimo periodo +2 +TIPO+CODART+LIVELLO+IMPIANTO+LINEA| +TIPO+IMPIANTO+LINEA+CODART+LIVELLO| diff --git a/mr/mr1.cpp b/mr/mr1.cpp new file mode 100755 index 000000000..666290142 --- /dev/null +++ b/mr/mr1.cpp @@ -0,0 +1,16 @@ +#include + +#include "mr1.h" + +int main(int argc, char** argv) +{ + int a = argc > 1 ? (argv[1][1] - '0') : 0; + switch (a) + { + case 0: + default: + mr1100(argc, argv); + } + exit(0); + return 0; +} diff --git a/mr/mr1.h b/mr/mr1.h new file mode 100755 index 000000000..2a56d415f --- /dev/null +++ b/mr/mr1.h @@ -0,0 +1,7 @@ +#ifndef __MR1_H +#define __MR1_H + +int mr1100(int argc, char* argv[]); + +#endif // __MR1_H + diff --git a/mr/mr1.url b/mr/mr1.url new file mode 100755 index 000000000..c87eba8ca --- /dev/null +++ b/mr/mr1.url @@ -0,0 +1,10 @@ +#define APPNAME EURO_MR +#define QAPPNAME "EURO_MR" +#include + +/* mr1 -0 Generazione MRP Reports */ + +MENU TASK_MENUBAR + SUBMENU MENU_FILE "~File" + + diff --git a/mr/mr1100.cpp b/mr/mr1100.cpp new file mode 100755 index 000000000..4674fe9ad --- /dev/null +++ b/mr/mr1100.cpp @@ -0,0 +1,1020 @@ +// Applicazione di generazione reports & stampe per MRP +#include +#include +#include +#include +#include + +#include "mrplib.h" +#include "../ve/velib.h" +#include "../mg/mglib.h" + +#include "mr1.h" +#include "mr1100a.h" +#include + +#include +#include + +#define LF_MRPREP 132 + +#define LAST_BUCKET 12 + +// Tipi di stampa +enum tipo_stampa { + articoli, // produzione articoli nel tempo + linee, // carico linee + scheduling, // scheduling delle linee + available // Tipo di stampa non definita: ordinata per articoli e stampa del carico della linea +}; + +// I tipi di stampa si identificano secondo la seguente tabella, tramite l'intersezione +// tra l'ordinamento ed il valore impostati: +/* + + |----------------------+ + |quantita | carico | + -----------+----------------------- + articoli |articoli | available| + -----------+----------------------+ + linea |scheduling | linee | + -----------+----------------------- + + */ +enum tipo_ordinamento { + articolo, + linea +}; + +enum tipo_valore { + quantita, + carico +}; + +enum tipo_dettaglio { + det_articolo, + det_giacenza, + det_impianto, + det_linea +}; + +/////////////////////////////////////////////////////////// +// _TCapacitaLinea, usato per calcolare le capacita' delle linee +/////////////////////////////////////////////////////////// + +class _TCapacitaLinea : public TObject +{ + TArray _cap_min, // Array 1..LAST_BUCKET-1 di capacita' minime + _cap_max; // Array 1..LAST_BUCKET-1 di capacita' massime + +public: + TArray& cap_min() { return _cap_min; } + TArray& cap_max() { return _cap_max; } + _TCapacitaLinea() ; + virtual ~_TCapacitaLinea() {} +}; + +_TCapacitaLinea::_TCapacitaLinea() +{ + for (int i = 0; i= 0, "Invalid TMRP_rep_record_array ", b); + TMRP_rep_record* qta = (TMRP_rep_record*)_buckets.objptr(b); + if (qta == NULL) + { + qta = new TMRP_rep_record; + _buckets.add(qta, b); + } + return *qta; +} + +/////////////////////////////////////////////////////////// +// TMRP_rep_line +/////////////////////////////////////////////////////////// + +class TMRP_rep_line : public TSortable +{ + TCodice_articolo _codart; + TString16 _giac, _imp, _lin, _um; + + TMRP_rep_record_array _bucket; + +protected: + virtual int compare(const TSortable& s) const; + +public: + const TCodice_articolo& codice() const { return _codart; } + const TString& livgiac() const { return _giac; } + const TString& codimp() const { return _imp; } + const TString& codlin() const { return _lin; } + const TString& um() const { return _um; } + + int last() const { return _bucket.last(); } + int pred(int i) const { return _bucket.pred(i); } + + real& qta(int b) { return _bucket[b]._qta; } + + void fill(TRectype& record, TAssoc_array* capacita = NULL); + + TMRP_rep_line(const TCodice_articolo& codart, + const TString& giac, const TString& imp, + const TString& lin, const TString& um); + virtual ~TMRP_rep_line() { } +}; + +void TMRP_rep_line::fill(TRectype& record, TAssoc_array* capacita) +{ + record.zero(); + record.put("TIPO", "R"); + record.put("CODART", _codart); + record.put("LIVELLO", _giac); + record.put("IMPIANTO", _imp); + record.put("LINEA", _lin); + record.put("UM", _um); + TString16 campo; + for (int b = last(); b >= 0; b = pred(b)) + { + switch(b) + { + case 0: + campo = "QTAFIRST"; break; + case LAST_BUCKET: + campo = "QTALAST"; break; + default: + campo.format("QTA%d", b); break; + } + record.put(campo, qta(b)); + } + + if (capacita) + for (b=1; bobjptr(_lin); + if (cl) + { + TArray& cmin = cl->cap_min(); + TArray& cmax = cl->cap_max(); + campo.format("CMIN%d", b); + record.put(campo, (real&)cmin[b-1]); // Capacita' minima... + campo.format("CMAX%d", b); + record.put(campo, (real&)cmax[b-1]); // e massima + } + } +} + +int TMRP_rep_line::compare(const TSortable& s) const +{ + const TMRP_rep_line& c = (const TMRP_rep_line&)s; + int cmp = _codart.compare(c._codart); + if (cmp == 0) + { + cmp = _giac.compare(c._giac); + if (cmp == 0) + { + cmp = _imp.compare(c._imp); + if (cmp == 0) + { + cmp = _lin.compare(c._lin); + if (cmp == 0) + cmp = _um.compare(c._um); + } + } + } + return cmp; +} + +TMRP_rep_line::TMRP_rep_line(const TCodice_articolo& codart, + const TString& giac, + const TString& imp, const TString& lin, + const TString& um) +: _codart(codart), _giac(giac), _imp(imp), _lin(lin), _um(um) +{ } + +/////////////////////////////////////////////////////////// +// TMRP_rep_lines +/////////////////////////////////////////////////////////// + +class TMRP_rep_lines : public TMRP_array +{ +protected: + virtual TSortable* new_obj(const TToken_string& key) const; + +public: + TMRP_rep_line* find(const TCodice_articolo& codart, + const TString& giac, const TString& imp, + const TString& lin, const TString& um, + bool create); + TMRP_rep_line& operator[](long n) const + { return (TMRP_rep_line&)find_obj(n); } +}; + +TSortable* TMRP_rep_lines::new_obj(const TToken_string& key) const +{ + TCodice_articolo art; key.get(0, art); + TString gia; key.get(1, gia); + TString imp; key.get(2, imp); + TString lin; key.get(3, lin); + TString um ; key.get(4, um); + return new TMRP_rep_line(art, gia, imp, lin, um); +} + +TMRP_rep_line* TMRP_rep_lines::find(const TCodice_articolo& codart, + const TString& giac, + const TString& imp, + const TString& lin, + const TString& um, + bool create) +{ + _key = codart; + _key.add(giac); + _key.add(imp); + _key.add(lin); + _key.add(um); + TSortable* s = create ? add_obj(_key) : find_obj(_key); + return (TMRP_rep_line*)s; +} + +/////////////////////////////////////////////////////////// +// MRP report generator mask +/////////////////////////////////////////////////////////// + +class TRepgen_mask : public TCalendar_mask +{ +protected: + void calcola_capacita(TAssoc_array&) const ; + bool test_tipodoc_num( const TSheet_field &sheet_num , const TSheet_field &sheet_type) ; + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + + void round_field(TMask_field& fld, bool up) const; + +public: + int round_date(TDate& date, bool up) const; + bool elabora() const; + TRepgen_mask(); + virtual ~TRepgen_mask() { } +}; + +bool TRepgen_mask::test_tipodoc_num(const TSheet_field &sheet_num ,const TSheet_field &sheet_type) +{ + TString16 tipo; + TString_array& nums = sheet_num.rows_array(); + TString_array& types = sheet_type.rows_array(); + for (int j = types.items()-1; j >= 0; j--) + { + bool ok=FALSE; + tipo = types.row(j).get(0) ; + const char * cazzoinculo=(const char * )tipo; + for (int i = nums.items()-1; i >= 0; i--) + { + TCodice_numerazione num(nums.row(i).get(0)); + for (int n = num.ntipi_doc()-1;n >= 0; n--) + { + const char* t = num.tipo_doc(n); + if (tipo == t) + ok = TRUE; + } + } + if (!ok) + return error_box("Il tipo '%s' non appartiene a nessuna delle numerazioni scelte",(const char * )tipo); + } + return TRUE; +} + +int TRepgen_mask::round_date(TDate& date, bool up) const +{ + // Dimensione del bucket in giorni + int bucket_size = get_int(F_BUCKET) * 7; + if (bucket_size < 7) bucket_size = 7; + + // Riporta la data al primo lunedi prima dell'inizio + TDate inizio = get(F_DADATA); + const int wday = inizio.wday(); + if (wday > 1) inizio -= wday-1; + + // Calcola il bucket di appartenenza + const int days = int(date - inizio); + const int bucket = days / bucket_size; + + if (up) // Arrotonda alla fine del bucket + date = inizio + long((bucket+1) * bucket_size - 1); + else // Arrotonda all'inizio del bucket + date = inizio + long(bucket * bucket_size); + + return bucket; +} + +void TRepgen_mask::round_field(TMask_field& fld, bool up) const +{ + TDate date = fld.get(); + if (date.ok()) + { + round_date(date, up); + fld.set(date); + } +} + +void TRepgen_mask::calcola_capacita(TAssoc_array& capacita) const +{ + if (capacita.items() == 0) + return; + + const bool carico_uomo = get_bool(F_MANLOAD); + const TDate df(get_date(F_DADATA)); + const TDate dt(get_date(F_ADATA)); + TDate wd1,wd2; + TString16 codimp; + + capacita.restart(); + TProgind pi(capacita.items(), "Calcolo capacita linee", FALSE, TRUE); + THash_object* ho = capacita.get_hashobj(); + for (;ho != NULL; ho = capacita.get_hashobj()) + { + pi.addstatus(1L); + const TString& linea = ho->key(); + _TCapacitaLinea& cl = (_TCapacitaLinea&) ho->obj(); + TLinea_prod lp(linea); + codimp = lp.codimp(); + + TMRP_calendar& mc = TMRP_time::get_calendar(codimp, linea); + TArray& cap_min = cl.cap_min(); + TArray& cap_max = cl.cap_max(); + + for (wd1 = df; wd1 <= dt; ++wd1) // Piglia tutte le date nel range! (very, very heavy...) + { + wd2 = wd1; + const int bucket = round_date(wd2, FALSE); // da 0 a 10 al massimo + if (bucket > 10) + break; // Fine + real & v1 = (real&) cap_min[bucket]; + v1 += carico_uomo ? mc.add_oreuomo(v1, wd1) : mc.add_oremacchina(v1, wd1); + real & v2 = (real&) cap_max[bucket]; + v2 += carico_uomo ? mc.add_oreuomo_max(v2, wd1) : mc.add_oremacchina_max(v2, wd1); + } + } +} + +bool TRepgen_mask::elabora() const +{ + TRelation rel(LF_RIGHEDOC); + TCursor cur(&rel); + const TRectype& riga = cur.curr(); + TRectype filter_fr(riga), filter_to(riga); + + const TDate date_fr = get(F_DADATA); + const int year_fr = date_fr.year(); + TDate date_to = get(F_ADATA); + const int year_to = date_to.year(); + const int bucket_size = get_int(F_BUCKET) * 7; + const TExplosion_grouping raggr = (TExplosion_grouping)get_int(F_RAGGRUM); + const tipo_valore ts = (tipo_valore) get_int(F_VAL2PRINT); + const bool carico_uomo = get_bool(F_MANLOAD); + const int last_bucket = round_date(date_to,TRUE)+1; + + TString16 ws; + + TDistinta_tree distinta; + TArray lav_array; + + TMRP_rep_lines articles; + TAssoc_array capacita; + + TString msg; + TSheet_field& numerazioni = sfield(F_NUMERAZIONI); + FOR_EACH_SHEET_ROW(numerazioni, r, row) + { + const TString16 codnum = row->get(0); + // Filtra il cursore in modo da limitarlo alla numerazione + // corrente ed agli anni specificati dalle due date limite + filter_fr.put(RDOC_PROVV, "D"); + filter_fr.put(RDOC_CODNUM, codnum); + filter_fr.put(RDOC_ANNO, year_fr); + + filter_to.put(RDOC_PROVV, "D"); + filter_to.put(RDOC_CODNUM, codnum); + filter_to.put(RDOC_ANNO, year_to); + + cur.setregion(filter_fr, filter_to); + const long items = cur.items(); + cur.freeze(TRUE); + + msg = "Elaborazione numerazione "; msg << codnum; + TProgind pi(items, msg, FALSE, TRUE); + + // Scandisce le righe dei documenti + for (cur = 0; cur.pos() < items; ++cur) + { + pi.addstatus(1); + const TCodice_articolo art = riga.get(RDOC_CODARTMAG); + if (art.not_empty()) + { + TDate datacons = riga.get(RDOC_DATACONS); + // Seleziona tutte le righe! Altrimenti LAST_BUCKET non viene mai settato + //if (datacons <= date_to) + { + real qta; + if (!riga.get_bool(RDOC_RIGAEVASA)) + { + qta = riga.get_real(RDOC_QTA); + qta -= riga.get_real(RDOC_QTAEVASA); + } + // Seleziona le righe articolo non ancora evase + if (qta > ZERO) + { + const TString16 liv = riga.get(RDOC_LIVELLO); + const TString16 imp = riga.get(RDOC_IMPIANTO); + const TString16 lin = riga.get(RDOC_LINEA); + const TCodice_um um = riga.get(RDOC_UMQTA); + + TQuantita q(art, um, qta); + int bucket = 0; + + if (datacons >= date_fr) + { + bucket = round_date(datacons, FALSE) + 1; + if (bucket > last_bucket) + bucket = LAST_BUCKET; + } + + // Calcoli per carico + if (ts == carico) + { + distinta.set_root(riga); + real ore,tot; + + TRiga_esplosione * llav = distinta.first_labor(lav_array, raggr); + TLavorazione * lavorazione = TDistinta_tree::find_labor(llav); + + while (llav) + { + const int linea = lavorazione->find_linea(lin); + + const real prod_linea = lavorazione->produttiv_linea(linea); + ore = (llav->val() * lavorazione->um_temporale().converti_in_ore()) / prod_linea; + if (carico_uomo) + ore *= lavorazione->numpers_linea(linea); + + //rep.qta(bucket) += ore; + tot += ore; + llav = distinta.next_labor(lav_array); + } + + if (tot > ZERO) + { + TMRP_rep_line& rep = *articles.find(art, liv, imp, lin, ws, TRUE); + rep.qta(bucket) += tot; + } + + + // Sbatte nella cache le linee di cui dopo calcolera' le capacita' minime e massime + // In modo che il calcolo venga effettuato una volta sola per ogni linea. + if (capacita.objptr(lin) == NULL) + capacita.add(lin, new _TCapacitaLinea); // Vuoto per ora... lo riempie poco piu' giu' + } + else // Produzione articoli nel tempo & scheduling linee + { + TMRP_rep_line& rep = *articles.find(art, liv, imp, lin, q.um(), TRUE); + switch (raggr) + { + case RAGGR_EXP_UMBASE: + q.convert2umbase(); + break; + case RAGGR_EXP_UMDIST: + q.convert2umdist(); + break; + default: break; + } + rep.qta(bucket) += q.val(); + } + } + } + } + } + cur.freeze(FALSE); + } + + if (ts == carico && get_bool(F_CAPACITA)) + calcola_capacita(capacita); + + const long total = articles.items(); + TProgind pi(total, "Generazione file", FALSE, TRUE); + + TMask_field& fld = field(F_FILENAME); + TFilename filename = fld.get(); + + if (filename.empty()) + filename.temp("mrprep"); + + fld.set(filename); + + filename.insert("%"); + + TIsamtempfile rep(LF_MRPREP, filename); + + // Scrive la testata (Record tipo "H"); + rep.put("TIPO","H"); + rep.put("CODART", date_fr.string()); + rep.put("LIVELLO", get(F_ADATA)); + rep.put("IMPIANTO", bucket_size); + rep.put("LINEA", ts == quantita ? "Q" : "C"); + rep.write(); + + for (long i = 0; i < total; i++) + { + pi.addstatus(1); + articles[i].fill(rep.curr(), ts == carico ? &capacita : NULL); + int err = rep.write(); + if (err != NOERR) + rep.rewrite(); + } + return rep.good(); +} + +bool TRepgen_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch(o.dlg()) + { + case F_DADATA: + if (e == fe_modify) + round_field(o, FALSE); + break; + case F_ADATA: + if (e == fe_modify) + round_field(o, TRUE); + break; + case F_BUCKET: + if (e == fe_modify) + { + round_field(field(F_DADATA), FALSE); + round_field(field(F_ADATA), TRUE); + } + break; + case F_NUMERAZIONI: + if (e == fe_init) + { + TSheet_field& s = (TSheet_field&)o; + if (s.items() == 0) + { + s.row(0); + s.force_update(); + } + } + if (e == fe_close) + { + const TSheet_field& s = (const TSheet_field&)o; + FOR_EACH_SHEET_ROW_BACK(s, r, row) + if (!row->empty_items()) return TRUE; + return error_box("E' necessario inserire almeno una numerazione"); + } + break; + case F_TIPI: + if (e == fe_init) + { + TSheet_field& s = (TSheet_field&)o; + if (s.items() == 0) + { + s.row(0); + s.force_update(); + } + } + if (e == fe_close) + { + const TSheet_field& s = (const TSheet_field&)o; + FOR_EACH_SHEET_ROW_BACK(s, r, row) + if (!row->empty_items()) + { + const bool ok=test_tipodoc_num(sfield(F_NUMERAZIONI), s ); + return ok; + } + return error_box("E' necessario inserire almeno una riga"); + } + break; + case F_YEAR: + case F_IMPIANTO: + case F_LINEA: + if (e == fe_modify) + update_calendar(F_CALENDAR, F_YEAR, F_IMPIANTO, F_LINEA); + break; + case DLG_PRINT: + case DLG_ELABORA: + if (e == fe_button) + { + if (check_fields()) + save_profile(); + if (o.dlg() == DLG_ELABORA) + elabora(); + } + break; + default: + break; + } + return TRUE; +} + +TRepgen_mask::TRepgen_mask() + : TCalendar_mask("mr1100a") +{ + load_profile(); +} + +/////////////////////////////////////////////////////////// +// MRP Form +/////////////////////////////////////////////////////////// + +class TMRP_form : public TForm +{ + TCodgiac_livelli *_codgiac; + int _level; + +protected: + virtual bool validate(TForm_item &, TToken_string &); // gestione dei messaggi estesi nei campi + +public: + TMRP_form(const char* name, TCodgiac_livelli* c, int l); + virtual ~TMRP_form() {} ; +}; + +TMRP_form::TMRP_form(const char* name, TCodgiac_livelli* c, int l) : TForm(name) +{ + _codgiac = c; + _level = l; +} + +bool TMRP_form::validate(TForm_item &cf, TToken_string &s) +{ + const TString code(s.get(0)); + + if (code == "_MRP") + { + TLocalisamfile& rep = cf.form().cursor()->file(); + TString action(s.get(1)); + TString livello, descr; + if (action == "DESCRLIV") + { + if (_level > 0) + livello = rep.get("LIVELLO"); + if (livello.not_empty()) + { + for (int lev=1; lev <= _level; lev++) + { + if (!_codgiac->enabled(lev)) + continue; + const int starts = _codgiac->code_start(lev) -1; + const int length = _codgiac->code_length(lev); + descr << "/"; + descr << livello.mid(starts,length); + } + descr << " " << _codgiac->name(_level); + descr << " " << _codgiac->group_descr(livello,_level); + } + cf.set(descr); + } + else + if (action == "LOAD") + { + //CALCOLO percentuale carico + // MESSAGE _MRP,LOAD,, + // formula: #id campo1 * 100 / #id campo2 + // prende i contenuti dei campi specificati e ne calcola il rapporto % come indicato + real v1(cf.find_field(s.get(2)).get()); + real v2(cf.find_field(s.get(3)).get()); + + v1 *= 100; + if (v2 != ZERO) + v1 /= v2; + if (v1 > ZERO && v1 <= 100.0) + cf.set(v1.string("##@,@@ %")); + else + if (v1 <= ZERO) + cf.set(""); + else + cf.set("*****"); + } + // Ignore any other command + } + return TForm::validate(cf, s); +} + +/////////////////////////////////////////////////////////// +// MRP report file generator +/////////////////////////////////////////////////////////// + +class TMRP_repgen : public TSkeleton_application +{ + TRepgen_mask * _m; + TMRP_form * _form; + TLocalisamfile * _mrprep; + TCodgiac_livelli *_codgiac; + int _livello; + tipo_ordinamento _tipo_ord; + tipo_valore _tipo_val; + tipo_dettaglio _dettaglio; + +protected: + void set_buckets_description(); + void set_buckets(); + void set_form(); + virtual bool create(); + virtual bool destroy(); + virtual void main_loop(); + +public: + TMRP_repgen() { _m = NULL; } + virtual ~TMRP_repgen() {} +}; + +bool TMRP_repgen::create() +{ + _m = new TRepgen_mask; + _mrprep = new TLocalisamfile(LF_MRPREP); + _codgiac = new TCodgiac_livelli; + if (!_codgiac->enabled()) + _m->hide(F_LIVDET); + return TSkeleton_application::create(); +} + +bool TMRP_repgen::destroy() +{ + delete _codgiac; + if (_m) + delete _m; + if (_mrprep) + delete _mrprep; + return TSkeleton_application::destroy(); +} + +void TMRP_repgen::set_buckets_description() +{ + TString descr; + TDate fd = _m->get_date(F_DADATA); + TDate td = _m->get_date(F_ADATA); + TDate wd; + int bucket_size = _m->get_int(F_BUCKET) * 7; + if (bucket_size < 7) bucket_size = 7; + + const short first_id = 3; + const short last_id = 15; + --fd; + descr.format("\nAl %s", (const char*)fd); + _form->find_field('B', odd_page, first_id).set_col_head(descr); + for (;fd <= td;) + { + ++fd; + descr.format("Da %s\nAl ",(const char*)fd); + fd += bucket_size-1; + wd = fd; + descr << (const char*) fd; + const short id = first_id+_m->round_date(wd,FALSE)+1; + if (id > last_id) + continue; + _form->find_field('B', odd_page, id).set_col_head(descr); + } + ++td; + descr.format("Dal %s", (const char*)td); + _form->find_field('B', odd_page, last_id).set_col_head(descr); +} + +void TMRP_repgen::set_buckets() +{ + TString tmp; + TDate last_date = _m->get_date(F_ADATA); + + // Calcola l'ultimo bucket visibile: + // Il bucket iniziale e quello finale dovrebbero essere sempre visibili + const short last_bucket = _m->round_date(last_date,TRUE)+1; + + // Disabilita le colonne in base al numero di buckets da visualizzare + const short first_id = 4; // Bucket 1 + const short last_id = 14; // Bucket 11 + + for (short id = first_id+last_bucket; id <= last_id; id++) + _form->find_field('B',odd_page,id).disable(); + + // Nella stampa scheduling linee, non esiste un totale per linea/impianto ma per articolo/liv giacenza + for (id = first_id+last_bucket+100; id <= (last_id+100); id++) + _form->find_field('B',odd_page,id).disable(); + + set_buckets_description(); + + // Show delle subsections necessarie + TToken_string sections; + const bool tl = _tipo_ord == linea; + + switch (_dettaglio) + { + case det_articolo: + sections = tl ? "IMPIANTI|LINEE" : ""; + break; + case det_giacenza: + sections = tl ? "IMPIANTI|LINEE|ARTICOLI" : "ARTICOLI"; + break; + case det_impianto: + sections = tl ? "" : "ARTICOLI|LIVELLI"; + break; + case det_linea: + sections = tl ? "IMPIANTI" : "ARTICOLI|LIVELLI|IMPIANTI"; + break; + default: break; + } + + const int items = sections.items(); + for (int i=0; ifind_field('B', odd_page, sections.get(i)).show(); + + if ((tl && _dettaglio == det_giacenza) || (!tl && _dettaglio >= det_giacenza)) + if (_livello > 0) + { + tmp.format("LIVELLO[1,%d]", _codgiac->packed_length(_livello)); + _form->find_field('B', odd_page, "LIVELLI").setcondition(tmp,_strexpr); + } + + if (tl && _m->get_bool(F_CAPACITA)) // Abilitato il calcolo capacita/carico linea? + { + _form->find_field('B', odd_page, 238).show(); + const short lid = 240 + (last_bucket >= LAST_BUCKET ? 11 : last_bucket); + for (short id = 240; idfind_field('B', odd_page, id).show(); + } + + if (tl && _tipo_val == quantita) // Stampa scheduling, disabilita totali per linea/impianto) + { + // Abilita i campi per l'unita di misura sui totali per livello giac. e articolo + _form->find_field('B', odd_page, 2).show(); + _form->find_field('B', odd_page, 302).show(); + _form->find_field('B', odd_page, 402).show(); + _form->find_field('B', odd_page, 502).show(); + for (short id = 201; id <= 215; id++) + _form->find_field('B', odd_page, id).hide(); // Riga totale linea + for (id = 101; id <= 115; id++) + _form->find_field('B', odd_page, id).hide(); // Riga totale impianto + } + + if (!tl && _tipo_val == carico) // Stampa carico per articoli + { + // Nasconde la colonna delle unita' di misura. + // Il calcolo capacita' non ha senso e quindi viene omesso in + // stampa, sebbene sia possibile effettuarne il calcolo. + _form->find_field('B', odd_page, 2).hide(); + _form->find_field('B', odd_page, 102).hide(); + _form->find_field('B', odd_page, 202).hide(); + _form->find_field('B', odd_page, 302).hide(); + _form->find_field('B', odd_page, 402).hide(); + } + + // Prende il titolo della stampa dal nome profilo + _form->find_field('H', odd_page,4).set(_m->get(DLG_PROFILE)); +} + +void TMRP_repgen::set_form() +{ + TString expr,tmp; + TString from(_m->get(_tipo_ord == articolo ? F_ARTFROM : F_IMPIANTOFROM)); + TString to(_m->get(_tipo_ord == articolo ? F_ARTTO : F_IMPIANTOTO)); + + expr.format("(TIPO==\"R\")"); + if (_tipo_ord == articolo) + { + if (from.not_empty()) + { + expr << "&&"; + tmp.format("(CODART>=\"%s\")",(const char*)from); + expr << tmp; + } + if (to.not_empty()) + { + if (expr.not_empty()) + expr << "&&"; + tmp.format("(CODART<=\"%s\")",(const char*)to); + expr << tmp; + } + } + else + { + if (from.not_empty()) + { + expr << "&&"; + tmp.format("(IMPIANTO>=\"%s\")",(const char*)from); + expr << tmp; + } + + if (to.not_empty()) + { + if (expr.not_empty()) + expr << "&&"; + tmp.format("(IMPIANTO<=\"%s\")",(const char*)to); + expr << tmp; + } + + + from = _m->get(F_LINEAFROM); + to = _m->get(F_LINEAFROM); + + if (from.not_empty()) + { + if (expr.not_empty()) + expr << "&&"; + tmp.format("(LINEA>=\"%s\")",(const char*)from); + expr << tmp; + } + + if (to.not_empty()) + { + if (expr.not_empty()) + expr << "&&"; + tmp.format("(LINEA<=\"%s\")",(const char*)to); + expr << tmp; + } + } + + if (expr.not_empty()) // Filtronzo... il filtro gonzo + _form->cursor()->setfilter(expr); + + set_buckets(); +} + +void TMRP_repgen::main_loop() +{ + while (_m->run() != K_QUIT) + { + const bool use_file = _m->get_bool(F_USAFILE); + if (use_file || _m->elabora()) + { + _tipo_ord = (tipo_ordinamento) _m->get_int(F_ORDINAMENTO); + _tipo_val = (tipo_valore) _m->get_int(F_VAL2PRINT); + _livello = _m->get_int(F_LIVDET); + TFilename fname(_m->get(F_FILENAME)); // Presente 24 ore su 24 + fname.insert("%"); // e questo dove lo mettiamo? + const bool delfile = !_m->get_bool(F_GENREPORT) && !use_file; + + if (delfile) + _m->reset(F_FILENAME); + // Utilizza questo file per la stampa del form + TIsamtempfile * report = new TIsamtempfile(LF_MRPREP,fname, FALSE, delfile); + TRelation* rel; + _dettaglio = (tipo_dettaglio) _m->get_int(_tipo_ord == articolo ? F_DETTAGLIO1 : F_DETTAGLIO2); + _form = new TMRP_form(_tipo_ord == articolo ? "mr1100a" : "mr1100b", _codgiac, _livello); + rel = _form->relation(); + rel->replace(report); + set_form(); + + const int hh = 7; + const int fl = printer().formlen(); + + int rows[4]; // Righe orizzontali + rows[0] = hh-3; + rows[1] = hh; + rows[2] = fl; + rows[3] = 0; + _form->genera_intestazioni(odd_page, hh-2); + _form->genera_fincatura(odd_page, hh-3, fl, rows); + + // stampa + if (_form->cursor()->items() > 0) + _form->print(); + // report non va cancellato, poiche' ne viene fatta la sostituzione nella relazione del form + // quindi la delete viene gia' fatta alla distruzione di _form + delete _form; + } + } +} + +int mr1100(int argc, char* argv[]) +{ + TMRP_repgen a; + a.run(argc, argv, "Generazione MRP reports"); + return 0; +} diff --git a/mr/mr1100a.frm b/mr/mr1100a.frm new file mode 100755 index 000000000..7c39720fc --- /dev/null +++ b/mr/mr1100a.frm @@ -0,0 +1,824 @@ +// Form per la stampa produzione articoli nel tempo +// ed il carico articoli nel tempo ( non richiesta ma messa per completezza ) + + +USE 132 +JOIN LF_ANAMAG INTO CODART==CODART +JOIN IMP ALIAS 201 INTO CODTAB==IMPIANTO +JOIN LNP ALIAS 202 INTO CODTAB==LINEA +END + +DESCRIPTION +BEGIN +END + +GENERAL +BEGIN + OFFSET 0 0 +END + +SECTION HEADER ODD 7 + +STRINGA 1 40 1 +BEGIN + KEY "nome ditta" + PROMPT 1 1 "Ditta " + MESSAGE _DITTA, !RAGSOC +END + +STRINGA 2 10 +BEGIN + KEY "Data" + PROMPT 76 1 "Data " + MESSAGE _TODAY +END + +NUMERO 3 7 +BEGIN + KEY "Nr. pagina" + PROMPT 110 1 "Pagina " + MESSAGE _PAGENO +END + +STRINGA 4 40 +BEGIN + KEY "Intestazione stampa" + PROMPT 40 2 "" +END + +END //HEADER + + +SECTION BODY ODD 3 COLUMNWISE + +STRING 1 50 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Articolo" "Articolo" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Cod. Articolo" + PROMPT 1 1 "@B" + MESSAGE _STREXPR,CODART+ " "+LF_ANAMAG->DESCR|RESET,1@ +END + +STRING 2 2 +BEGIN + SPECIAL STRINGA INTESTAZIONE "UM" "UM" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Unita di misura" + PROMPT 2 1 "" +END + +NUMERO 3 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket Iniziale" + PROMPT 3 1 "" +END + +NUMERO 4 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 1" + PROMPT 4 1 "" +END + +NUMERO 5 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 2" + PROMPT 5 1 "" +END + +NUMERO 6 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 3" + PROMPT 6 1 "" +END + +NUMERO 7 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 4" + PROMPT 7 1 "" +END + +NUMERO 8 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 5" + PROMPT 8 1 "" +END + +NUMERO 9 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 6" + PROMPT 9 1 "" +END + +NUMERO 10 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 7" + PROMPT 10 1 "" +END + +NUMERO 11 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 8" + PROMPT 11 1 "" +END + +NUMERO 12 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 9" + PROMPT 12 1 "" +END + +NUMERO 13 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 10" + PROMPT 13 1 "" +END + +NUMERO 14 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 11" + PROMPT 14 1 "" +END + +NUMERO 15 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket Finale" + PROMPT 15 1 "" +END + +SECTION ARTICOLI 2 0 2 FILE 132 GROUP CODART + FLAGS "H" + STRINGA 200 50 + BEGIN + PROMPT 1 1 "Livello giacenza" + MESSAGE _MRP,DESCRLIV|RESET,2@|COPY,201 + END + + SECTION LIVELLI 2 0 2 FILE 132 GROUP LIVELLO + FLAGS "H" + STRINGA 300 50 + BEGIN + PROMPT 1 1 " Impianto " + MESSAGE _STREXPR,IMPIANTO+ " "+201@->S0|RESET,3@|COPY,301 + END + + SECTION IMPIANTI 2 0 2 FILE 132 GROUP IMPIANTO + FLAGS "H" + STRINGA 400 50 + BEGIN + PROMPT 1 1 " Linea " + MESSAGE _STREXPR,LINEA+ " "+202@->S0|RESET,4@|COPY,401 + END + + SECTION LINEE 1 0 0 FILE 132 GROUP LINEA + FLAGS "H" + + STRINGA 501 50 + BEGIN + KEY "Cod. " + PROMPT 1 1 "" + END + + STRINGA 502 2 + BEGIN + KEY "UM" + PROMPT 2 1 "" + FIELD UM + MESSAGE COPY,102|COPY,202|COPY,302|COPY,402 + END + + NUMERO 503 14 + BEGIN + KEY "Bucket Iniziale" + PROMPT 3 1 "" + FIELD QTAFIRST + MESSAGE ADD,103|ADD,203|ADD,303|ADD,403 + END + + NUMERO 504 14 + BEGIN + KEY "Bucket 1" + PROMPT 4 1 "" + FIELD QTA1 + MESSAGE ADD,104|ADD,204|ADD,304|ADD,404 + END + + NUMERO 505 14 + BEGIN + KEY "Bucket 2" + PROMPT 5 1 "" + FIELD QTA2 + MESSAGE ADD,105|ADD,205|ADD,305|ADD,405 + END + + NUMERO 506 14 + BEGIN + KEY "Bucket 3" + PROMPT 6 1 "" + FIELD QTA3 + MESSAGE ADD,106|ADD,206|ADD,306|ADD,406 + END + + NUMERO 507 14 + BEGIN + KEY "Bucket 4" + PROMPT 7 1 "" + FIELD QTA4 + MESSAGE ADD,107|ADD,207|ADD,307|ADD,407 + END + + NUMERO 508 14 + BEGIN + KEY "Bucket 5" + PROMPT 8 1 "" + FIELD QTA5 + MESSAGE ADD,108|ADD,208|ADD,308|ADD,408 + END + + NUMERO 509 14 + BEGIN + KEY "Bucket 6" + PROMPT 9 1 "" + FIELD QTA6 + MESSAGE ADD,109|ADD,209|ADD,309|ADD,409 + END + + NUMERO 510 14 + BEGIN + KEY "Bucket 7" + PROMPT 10 1 "" + FIELD QTA7 + MESSAGE ADD,110|ADD,210|ADD,310|ADD,410 + END + + NUMERO 511 14 + BEGIN + KEY "Bucket 8" + PROMPT 11 1 "" + FIELD QTA8 + MESSAGE ADD,111|ADD,211|ADD,311|ADD,411 + END + + NUMERO 512 14 + BEGIN + KEY "Bucket 9" + PROMPT 12 1 "" + FIELD QTA9 + MESSAGE ADD,112|ADD,212|ADD,312|ADD,412 + END + + NUMERO 513 14 + BEGIN + KEY "Bucket 10" + PROMPT 13 1 "" + FIELD QTA10 + MESSAGE ADD,113|ADD,213|ADD,313|ADD,413 + END + + NUMERO 514 14 + BEGIN + KEY "Bucket 11" + PROMPT 14 1 "" + FIELD QTA11 + MESSAGE ADD,114|ADD,214|ADD,314|ADD,414 + END + + NUMERO 515 14 + BEGIN + KEY "Bucket Finale" + PROMPT 15 1 "" + FIELD QTALAST + MESSAGE ADD,115|ADD,215|ADD,315|ADD,415 + END + END // SECTION LINEE + + //Totalizzatori per linee + STRINGA 401 50 + BEGIN + KEY "Totale linea" + PROMPT 1 2 " Totale linea " + END + + STRINGA 402 2 + BEGIN + KEY "UM" + PROMPT 2 2 "" + END + + NUMERO 403 14 + BEGIN + KEY "Bucket Iniziale" + PROMPT 3 2 "" + PICTURE "#########,@@@" + GROUP 4 + END + + NUMERO 404 14 + BEGIN + KEY "Bucket 1" + PROMPT 4 2 "" + PICTURE "#########,@@@" + GROUP 4 + END + + NUMERO 405 14 + BEGIN + KEY "Bucket 2" + PROMPT 5 2 "" + PICTURE "#########,@@@" + GROUP 4 + END + + NUMERO 406 14 + BEGIN + KEY "Bucket 3" + PROMPT 6 2 "" + PICTURE "#########,@@@" + GROUP 4 + END + + NUMERO 407 14 + BEGIN + KEY "Bucket 4" + PROMPT 7 2 "" + PICTURE "#########,@@@" + GROUP 4 + END + + NUMERO 408 14 + BEGIN + KEY "Bucket 5" + PROMPT 8 2 "" + PICTURE "#########,@@@" + GROUP 4 + END + + NUMERO 409 14 + BEGIN + KEY "Bucket 6" + PROMPT 9 2 "" + PICTURE "#########,@@@" + GROUP 4 + END + + NUMERO 410 14 + BEGIN + KEY "Bucket 7" + PROMPT 10 2 "" + PICTURE "#########,@@@" + GROUP 4 + END + + NUMERO 411 14 + BEGIN + KEY "Bucket 8" + PROMPT 11 2 "" + PICTURE "#########,@@@" + GROUP 4 + END + + NUMERO 412 14 + BEGIN + KEY "Bucket 9" + PROMPT 12 2 "" + PICTURE "#########,@@@" + GROUP 4 + END + + NUMERO 413 14 + BEGIN + KEY "Bucket 10" + PROMPT 13 2 "" + PICTURE "#########,@@@" + GROUP 4 + END + + NUMERO 414 14 + BEGIN + KEY "Bucket 11" + PROMPT 14 2 "" + PICTURE "#########,@@@" + GROUP 4 + END + + NUMERO 415 14 + BEGIN + KEY "Bucket Finale" + PROMPT 15 2 "" + PICTURE "#########,@@@" + GROUP 4 + END + END // SECTION IMPIANTI + + // Totalizzatori per impianti + STRINGA 301 50 + BEGIN + KEY "Totale impianto" + PROMPT 1 2 " Totale impianto " + END + + STRINGA 302 2 + BEGIN + KEY "UM" + PROMPT 2 2 "" + END + + NUMERO 303 14 + BEGIN + KEY "Bucket Iniziale" + PROMPT 3 2 "" + PICTURE "#########,@@@" + GROUP 3 + END + + NUMERO 304 14 + BEGIN + KEY "Bucket 1" + PROMPT 4 2 "" + PICTURE "#########,@@@" + GROUP 3 + END + + NUMERO 305 14 + BEGIN + KEY "Bucket 2" + PROMPT 5 2 "" + PICTURE "#########,@@@" + GROUP 3 + END + + NUMERO 306 14 + BEGIN + KEY "Bucket 3" + PROMPT 6 2 "" + PICTURE "#########,@@@" + GROUP 3 + END + + NUMERO 307 14 + BEGIN + KEY "Bucket 4" + PROMPT 7 2 "" + PICTURE "#########,@@@" + GROUP 3 + END + + NUMERO 308 14 + BEGIN + KEY "Bucket 5" + PROMPT 8 2 "" + PICTURE "#########,@@@" + GROUP 3 + END + + NUMERO 309 14 + BEGIN + KEY "Bucket 6" + PROMPT 9 2 "" + PICTURE "#########,@@@" + GROUP 3 + END + + NUMERO 310 14 + BEGIN + KEY "Bucket 7" + PROMPT 10 2 "" + PICTURE "#########,@@@" + GROUP 3 + END + + NUMERO 311 14 + BEGIN + KEY "Bucket 8" + PROMPT 11 2 "" + PICTURE "#########,@@@" + GROUP 3 + END + + NUMERO 312 14 + BEGIN + KEY "Bucket 9" + PROMPT 12 2 "" + PICTURE "#########,@@@" + GROUP 3 + END + + NUMERO 313 14 + BEGIN + KEY "Bucket 10" + PROMPT 13 2 "" + PICTURE "#########,@@@" + GROUP 3 + END + + NUMERO 314 14 + BEGIN + KEY "Bucket 11" + PROMPT 14 2 "" + PICTURE "#########,@@@" + GROUP 3 + END + + NUMERO 315 14 + BEGIN + KEY "Bucket Finale" + PROMPT 15 2 "" + PICTURE "#########,@@@" + GROUP 3 + END + END // SECTION LIVELLI + + // Totalizzatori per livello + STRINGA 201 50 + BEGIN + KEY "Totale livello giacenza" + PROMPT 1 2 " Totale livello giacenza " + END + + STRINGA 202 2 + BEGIN + KEY "UM" + PROMPT 2 2 "" + END + + NUMERO 203 14 + BEGIN + KEY "Bucket Iniziale" + PROMPT 3 2 "" + PICTURE "#########,@@@" + GROUP 2 + END + + NUMERO 204 14 + BEGIN + KEY "Bucket 1" + PROMPT 4 2 "" + PICTURE "#########,@@@" + GROUP 2 + END + + NUMERO 205 14 + BEGIN + KEY "Bucket 2" + PROMPT 5 2 "" + PICTURE "#########,@@@" + GROUP 2 + END + + NUMERO 206 14 + BEGIN + KEY "Bucket 3" + PROMPT 6 2 "" + PICTURE "#########,@@@" + GROUP 2 + END + + NUMERO 207 14 + BEGIN + KEY "Bucket 4" + PROMPT 7 2 "" + PICTURE "#########,@@@" + GROUP 2 + END + + NUMERO 208 14 + BEGIN + KEY "Bucket 5" + PROMPT 8 2 "" + PICTURE "#########,@@@" + GROUP 2 + END + + NUMERO 209 14 + BEGIN + KEY "Bucket 6" + PROMPT 9 2 "" + PICTURE "#########,@@@" + GROUP 2 + END + + NUMERO 210 14 + BEGIN + KEY "Bucket 7" + PROMPT 10 2 "" + PICTURE "#########,@@@" + GROUP 2 + END + + NUMERO 211 14 + BEGIN + KEY "Bucket 8" + PROMPT 11 2 "" + PICTURE "#########,@@@" + GROUP 2 + END + + NUMERO 212 14 + BEGIN + KEY "Bucket 9" + PROMPT 12 2 "" + PICTURE "#########,@@@" + GROUP 2 + END + + NUMERO 213 14 + BEGIN + KEY "Bucket 10" + PROMPT 13 2 "" + PICTURE "#########,@@@" + GROUP 2 + END + + NUMERO 214 14 + BEGIN + KEY "Bucket 11" + PROMPT 14 2 "" + PICTURE "#########,@@@" + GROUP 2 + END + + NUMERO 215 14 + BEGIN + KEY "Bucket Finale" + PROMPT 15 2 "" + PICTURE "#########,@@@" + GROUP 2 + END +END // SECTION ARTICOLI + +// Totalizzatori articolo +STRING 101 50 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Totale articolo" + PROMPT 1 2 "Totale articolo" +END + +STRING 102 2 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "UM" + PROMPT 2 2 "" +END + +NUMERO 103 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket Iniziale" + PROMPT 3 2 "" + GROUP 1 + PICTURE "#########,@@@" +END + +NUMERO 104 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 1" + PROMPT 4 2 "" + GROUP 1 + PICTURE "#########,@@@" +END + +NUMERO 105 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 2" + PROMPT 5 2 "" + GROUP 1 + PICTURE "#########,@@@" +END + +NUMERO 106 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 3" + PROMPT 6 2 "" + GROUP 1 + PICTURE "#########,@@@" +END + +NUMERO 107 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 4" + PROMPT 7 2 "" + GROUP 1 + PICTURE "#########,@@@" +END + +NUMERO 108 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 5" + PROMPT 8 2 "" + GROUP 1 + PICTURE "#########,@@@" +END + +NUMERO 109 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 6" + PROMPT 9 2 "" + GROUP 1 + PICTURE "#########,@@@" +END + +NUMERO 110 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 7" + PROMPT 10 2 "" + GROUP 1 + PICTURE "#########,@@@" +END + +NUMERO 111 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 8" + PROMPT 11 2 "" + GROUP 1 + PICTURE "#########,@@@" +END + +NUMERO 112 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 9" + PROMPT 12 2 "" + GROUP 1 + PICTURE "#########,@@@" +END + +NUMERO 113 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 10" + PROMPT 13 2 "" + GROUP 1 + PICTURE "#########,@@@" +END + +NUMERO 114 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 11" + PROMPT 14 2 "" + GROUP 1 + PICTURE "#########,@@@" +END + +NUMERO 115 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket Finale" + PROMPT 15 2 "" + GROUP 1 + PICTURE "#########,@@@" +END + +END //BODY + + diff --git a/mr/mr1100a.h b/mr/mr1100a.h new file mode 100755 index 000000000..0bb9a251f --- /dev/null +++ b/mr/mr1100a.h @@ -0,0 +1,40 @@ +#ifndef __MR1100A_H +#define __MR1100A_H + +#define F_PROFILO 200 +#define F_NUMERAZIONI 201 +#define F_TIPI 202 +#define F_ANNO 205 +#define F_DADATA 206 +#define F_ADATA 207 +#define F_BUCKETS 208 +#define F_BUCKET 209 +#define F_RAGGRUM 210 +#define F_FILENAME 211 +#define F_GENREPORT 212 +#define F_ORDINAMENTO 213 +#define F_ARTFROM 214 +#define F_ARTTO 215 +#define F_IMPIANTOFROM 216 +#define F_IMPIANTOTO 217 +#define F_LINEAFROM 218 +#define F_LINEATO 219 +#define F_DETTAGLIO1 220 +#define F_DETTAGLIO2 221 +#define F_VAL2PRINT 222 +#define F_LIVDET 223 +#define F_MANLOAD 224 +#define F_CAPACITA 225 +#define F_USAFILE 226 +#define F_YEAR 301 +#define F_IMPIANTO 302 +#define F_LINEA 303 +#define F_CALENDAR 304 + +#define F_TIPO 101 +#define F_DESCTIPO 102 +#define F_DASTATO 103 +#define F_ASTATO 104 + +#endif + diff --git a/mr/mr1100a.uml b/mr/mr1100a.uml new file mode 100755 index 000000000..10fc99601 --- /dev/null +++ b/mr/mr1100a.uml @@ -0,0 +1,434 @@ +#include "mr1100a.h" + +TOOLBAR "Toolbar" 0 -3 -1 -1 + +STRING DLG_PROFILE 50 +BEGIN + PROMPT 1 0 "Profilo " + PSELECT + MESSAGE K_SPACE,F_ORDINAMENTO|K_SPACE,F_VAL2PRINT +END + +BUTTON DLG_ELABORA 10 2 +BEGIN + PROMPT -13 -11 "~Elabora" + PICTURE BMP_ELABORA +END + +BUTTON DLG_PRINT 10 2 +BEGIN + PROMPT -23 -11 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -33 -11 "~Fine" + PICTURE BMP_QUIT + PICTURE BMP_QUITDN +END + +ENDPAGE + +PAGE "MRP report" -1 -1 80 20 + +GROUPBOX DLG_NULL 78 7 +BEGIN + PROMPT 1 2 "@bParametri dell'elaborazione" +END + +DATE F_DADATA +BEGIN + PROMPT 2 3 "Dalla data " + CHECKTYPE REQUIRED +END + +DATE F_ADATA +BEGIN + PROMPT 45 3 "Alla data " + CHECKTYPE REQUIRED + VALIDATE DATE_CMP_FUNC > F_DADATA + WARNING "La data finale deve essere maggiore di quella iniziale" +END + +LIST F_BUCKETS 1 15 +BEGIN + PROMPT 2 4 "Bucket temporale " + ITEM "1|1 Settimana" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + ITEM "2|2 Settimane" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + ITEM "4|1 Mese" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + ITEM "8|2 Mese" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + ITEM "13|3 Mesi" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + ITEM "17|4 Mesi" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + ITEM "26|6 Mesi" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + ITEM "52|1 Anno" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + ITEM " |Personalizzato" + MESSAGE ENABLE,F_BUCKET +END + +NUMBER F_BUCKET 2 +BEGIN + PROMPT 45 4 "Settimane " + FLAGS "U" + CHECKTYPE REQUIRED +END + +LIST F_RAGGRUM 1 53 +BEGIN + PROMPT 2 5 "Raggruppa " + ITEM "0|Nessun raggruppamento" + ITEM "3|Raggruppa all'unita' di misura principale" + ITEM "5|Raggruppa all'unita' di misura di distinta" +END + +BOOLEAN F_GENREPORT +BEGIN + PROMPT 2 6 "Genera report" + MESSAGE TRUE ENABLE,F_FILENAME|ENABLE,DLG_ELABORA|CLEAR,F_USAFILE + MESSAGE FALSE CLEAR,F_FILENAME|DISABLE,DLG_ELABORA|ENABLE,F_USAFILE +END + +BOOLEAN F_USAFILE +BEGIN + PROMPT 19 6 "Utilizza report esistente" + MESSAGE TRUE ENABLE,F_FILENAME + MESSAGE FALSE CLEAR,F_FILENAME +END + +STRING F_FILENAME 80 55 +BEGIN + PROMPT 2 7 "File DBF " + FSELECT "*.dbf" + CHECKTYPE REQUIRED +END + +RADIOBUTTON F_ORDINAMENTO 45 +BEGIN + PROMPT 1 9 "Ordinamento" + ITEM "0|Articolo, Liv.giacenza, Impianto e Linea" + MESSAGE HIDE,6@|SHOW,5@|CLEAR,F_LIVDET + ITEM "1|Impianto, Linea, Articolo e Liv.giacenza" + MESSAGE HIDE,5@|SHOW,6@|CLEAR,F_LIVDET +END + +RADIOBUTTON F_VAL2PRINT 29 +BEGIN + PROMPT 50 9 "Valore in stampa" + ITEM "0|Quantita'" + MESSAGE CLEAR,F_MANLOAD|CLEAR,F_CAPACITA + ITEM "1|Carico" + MESSAGE ENABLE,F_MANLOAD|ENABLE,F_CAPACITA +END + +RADIOBUTTON F_DETTAGLIO1 30 +BEGIN + PROMPT 1 13 "Dettaglio" + ITEM "0|Articolo" + MESSAGE CLEAR, F_LIVDET + ITEM "1|Giacenza" + MESSAGE ENABLE, F_LIVDET + ITEM "2|Impianto" + MESSAGE ENABLE, F_LIVDET + ITEM "3|Linea" + MESSAGE ENABLE, F_LIVDET + GROUP 5 +END + +RADIOBUTTON F_DETTAGLIO2 30 +BEGIN + PROMPT 1 13 "Dettaglio" + ITEM "2|Impianto" + MESSAGE CLEAR, F_LIVDET + ITEM "3|Linea" + MESSAGE CLEAR, F_LIVDET + ITEM "0|Articolo" + MESSAGE CLEAR, F_LIVDET + ITEM "1|Giacenza" + MESSAGE ENABLE, F_LIVDET + GROUP 6 +END + +NUMBER F_LIVDET 1 +BEGIN + PROMPT 34 14 "Livello dettaglio " + FLAGS "D" + USE FCG + INPUT CODTAB F_LIVDET + DISPLAY "Num." CODTAB + DISPLAY "Descr@50" S0 + OUTPUT F_LIVDET CODTAB + CHECKTYPE NORMAL + WARNING "Livello finale non ammissibile" +END + +BOOLEAN F_MANLOAD +BEGIN + PROMPT 34 15 "Carico ore per addetto" +END + +BOOLEAN F_CAPACITA +BEGIN + PROMPT 34 16 "Calcola capacita linee" +END + +STRING F_ARTFROM 20 +BEGIN + PROMPT 34 17 "Da articolo " + FLAGS "U" + USE LF_ANAMAG + INPUT CODART F_ARTFROM + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_ARTFROM CODART + CHECKTYPE NORMAL + ADD RUN ve2 -3 + GROUP 5 +END + +STRING F_ARTTO 20 +BEGIN + PROMPT 34 18 "Ad articolo " + FLAGS "U" + USE LF_ANAMAG + INPUT CODART F_ARTTO + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_ARTTO CODART + CHECKTYPE NORMAL + ADD RUN ve2 -3 + GROUP 5 +END + +STRING F_IMPIANTOFROM 5 +BEGIN + PROMPT 34 17 "Da impianto " + FLAGS "UZ" + USE IMP + INPUT CODTAB F_IMPIANTOFROM + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_IMPIANTOFROM CODTAB + CHECKTYPE NORMAL + GROUP 6 +END + +STRING F_IMPIANTOTO 5 +BEGIN + PROMPT 56 17 "Ad impianto " + FLAGS "UZ" + USE IMP + INPUT CODTAB F_IMPIANTOTO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_IMPIANTOTO CODTAB + CHECKTYPE NORMAL + GROUP 6 +END + +STRING F_LINEAFROM 5 +BEGIN + PROMPT 34 18 "Da linea " + FLAGS "UZ" + USE LNP + INPUT CODTAB F_LINEAFROM + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_LINEAFROM CODTAB + CHECKTYPE NORMAL + GROUP 6 7 +END + +STRING F_LINEATO 5 +BEGIN + PROMPT 56 18 "A linea " + FLAGS "UZ" + USE LNP + INPUT CODTAB F_LINEATO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_LINEATO CODTAB + CHECKTYPE NORMAL + GROUP 6 7 +END + +ENDPAGE + +PAGE "Selezione" -1 -1 78 20 + +SPREADSHEET F_NUMERAZIONI 18 8 +BEGIN + PROMPT 1 1 "" + ITEM "Numerazione" +END + +SPREADSHEET F_TIPI 56 8 +BEGIN + PROMPT 20 1 "" + ITEM "Tipo@4" + ITEM "Descrizione@50" + ITEM "Da stato" + ITEM "A stato" +END + +ENDPAGE + +PAGE "Calendario" -1 -1 78 20 + +NUMBER F_YEAR 4 +BEGIN + PROMPT 1 1 "Anno " + FLAGS "A" +END + +STRING F_LINEA 5 +BEGIN + PROMPT 25 1 "Linea " + FLAGS "UZ" + USE LNP + INPUT CODTAB F_LINEA + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_LINEA CODTAB + CHECKTYPE NORMAL +END + +STRING F_IMPIANTO 5 +BEGIN + PROMPT 50 1 "Impianto " + FLAGS "UZ" + USE IMP + INPUT CODTAB F_IMPIANTO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_IMPIANTO CODTAB + CHECKTYPE NORMAL +END + +CALENDAR F_CALENDAR -3 -1 +BEGIN + PROMPT 0 2 "" +END + +ENDPAGE + +ENDMASK + +PAGE "Numerazioni" -1 -1 60 6 + +STRING F_TIPO 4 +BEGIN + PROMPT 1 1 "Codice " + FLAGS "U" + USE %NUM + INPUT CODTAB F_TIPO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_TIPO CODTAB + OUTPUT F_DESCTIPO S0 + CHECKTYPE REQUIRED +END + +STRING F_DESCTIPO 50 +BEGIN + PROMPT 16 1 "" + USE %NUM KEY 2 + INPUT S0 F_DESCTIPO + DISPLAY "Descrizione@70" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_TIPO + CHECKTYPE REQUIRED +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK + +PAGE "Tipi documento" -1 -1 70 10 + +STRING F_TIPO 4 +BEGIN + PROMPT 1 2 "Tipo " + FLAGS "U" + USE %TIP + INPUT CODTAB F_TIPO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_TIPO CODTAB + OUTPUT F_DESCTIPO S0 + CHECKTYPE REQUIRED +END + +STRING F_DESCTIPO 50 +BEGIN + PROMPT 26 2 "" + USE %TIP KEY 2 + INPUT S0 F_DESCTIPO + DISPLAY "Descrizione@70" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_TIPO + CHECKTYPE REQUIRED +END + +STRING F_DASTATO 1 +BEGIN + PROMPT 1 3 "Da stato " + USE %STD + INPUT CODTAB F_DASTATO + DISPLAY "Stato" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_DASTATO CODTAB + CHECKTYPE REQUIRED +END + +STRING F_ASTATO 1 +BEGIN + PROMPT 16 3 "A stato " + COPY USE F_DASTATO + INPUT CODTAB F_ASTATO + COPY DISPLAY F_DASTATO + OUTPUT F_ASTATO CODTAB + CHECKTYPE REQUIRED +END + + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE +ENDMASK + + diff --git a/mr/mr1100b.frm b/mr/mr1100b.frm new file mode 100755 index 000000000..55fae89f0 --- /dev/null +++ b/mr/mr1100b.frm @@ -0,0 +1,1296 @@ +// Form per la stampa carico linee nel tempo +// e la stampa scheduling del bucket suddiviso per linee + + +USE 132 KEY 2 +JOIN LF_ANAMAG INTO CODART==CODART +JOIN IMP ALIAS 201 INTO CODTAB==IMPIANTO +JOIN LNP ALIAS 202 INTO CODTAB==LINEA +END + +DESCRIPTION +BEGIN +END + +GENERAL +BEGIN + OFFSET 0 0 +END + +SECTION HEADER ODD 7 + +STRINGA 1 40 1 +BEGIN + KEY "nome ditta" + PROMPT 1 1 "Ditta " + MESSAGE _DITTA, !RAGSOC +END + +STRINGA 2 10 +BEGIN + KEY "Data" + PROMPT 76 1 "Data " + MESSAGE _TODAY +END + +NUMERO 3 7 +BEGIN + KEY "Nr. pagina" + PROMPT 110 1 "Pagina " + MESSAGE _PAGENO +END + +STRINGA 4 50 +BEGIN + KEY "Intestazione stampa" + PROMPT 40 2 "" +END + +END //HEADER + + +SECTION BODY ODD 3 COLUMNWISE + +STRING 1 50 +BEGIN + SPECIAL STRINGA INTESTAZIONE "Impianto" "Impianto" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Cod. Impianto" + PROMPT 1 1 "@BImpianto " + MESSAGE _STREXPR,IMPIANTO+ " "+201@->S0|RESET,1@ +END + +STRING 2 4 +BEGIN + SPECIAL STRINGA INTESTAZIONE "UM" "UM" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Unita di misura" + PROMPT 2 1 "" + FLAGS "H" +END + +NUMERO 3 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket Iniziale" + PROMPT 3 1 "" +END + +NUMERO 4 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 1" + PROMPT 4 1 "" +END + +NUMERO 5 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 2" + PROMPT 5 1 "" +END + +NUMERO 6 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 3" + PROMPT 6 1 "" +END + +NUMERO 7 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 4" + PROMPT 7 1 "" +END + +NUMERO 8 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 5" + PROMPT 8 1 "" +END + +NUMERO 9 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 6" + PROMPT 9 1 "" +END + +NUMERO 10 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 7" + PROMPT 10 1 "" +END + +NUMERO 11 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 8" + PROMPT 11 1 "" +END + +NUMERO 12 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 9" + PROMPT 12 1 "" +END + +NUMERO 13 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 10" + PROMPT 13 1 "" +END + +NUMERO 14 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 11" + PROMPT 14 1 "" +END + +NUMERO 15 14 +BEGIN + SPECIAL STRINGA INTESTAZIONE "" "" + SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket Finale" + PROMPT 15 1 "" +END + +SECTION IMPIANTI 2 0 4 FILE 132 GROUP IMPIANTO + FLAGS "H" + STRINGA 200 50 + BEGIN + PROMPT 1 1 " Linea " + MESSAGE _STREXPR,LINEA+ " "+202@->S0|RESET,2@ + END + + SECTION LINEE 2 0 3 FILE 132 GROUP LINEA + FLAGS "H" + STRINGA 300 50 + BEGIN + PROMPT 1 1 " Articolo " + MESSAGE _STREXPR,CODART+ " "+LF_ANAMAG->DESCR|RESET,3@ + END + + SECTION ARTICOLI 2 0 2 FILE 132 GROUP CODART + FLAGS "H" + STRINGA 400 50 + BEGIN + PROMPT 1 1 " Livello giacenza " + MESSAGE _MRP,DESCRLIV|RESET,4@ + END + + SECTION LIVELLI 1 0 0 FILE 132 GROUP LIVELLO + FLAGS "H" + + STRINGA 501 50 + BEGIN + KEY "Cod. " + PROMPT 1 1 "" + END + + STRINGA 502 4 + BEGIN + KEY "UM" + PROMPT 2 1 "" + FIELD UM + MESSAGE COPY,102|COPY,202|COPY,302|COPY,402 + FLAGS "H" + END + + NUMERO 503 14 + BEGIN + KEY "Bucket Iniziale" + PROMPT 3 1 "" + FIELD QTAFIRST + MESSAGE ADD,103|ADD,203|ADD,303|ADD,403 + END + + NUMERO 504 14 + BEGIN + KEY "Bucket 1" + PROMPT 4 1 "" + FIELD QTA1 + MESSAGE ADD,104|ADD,204|ADD,304|ADD,404 + END + + NUMERO 505 14 + BEGIN + KEY "Bucket 2" + PROMPT 5 1 "" + FIELD QTA2 + MESSAGE ADD,105|ADD,205|ADD,305|ADD,405 + END + + NUMERO 506 14 + BEGIN + KEY "Bucket 3" + PROMPT 6 1 "" + FIELD QTA3 + MESSAGE ADD,106|ADD,206|ADD,306|ADD,406 + END + + NUMERO 507 14 + BEGIN + KEY "Bucket 4" + PROMPT 7 1 "" + FIELD QTA4 + MESSAGE ADD,107|ADD,207|ADD,307|ADD,407 + END + + NUMERO 508 14 + BEGIN + KEY "Bucket 5" + PROMPT 8 1 "" + FIELD QTA5 + MESSAGE ADD,108|ADD,208|ADD,308|ADD,408 + END + + NUMERO 509 14 + BEGIN + KEY "Bucket 6" + PROMPT 9 1 "" + FIELD QTA6 + MESSAGE ADD,109|ADD,209|ADD,309|ADD,409 + END + + NUMERO 510 14 + BEGIN + KEY "Bucket 7" + PROMPT 10 1 "" + FIELD QTA7 + MESSAGE ADD,110|ADD,210|ADD,310|ADD,410 + END + + NUMERO 511 14 + BEGIN + KEY "Bucket 8" + PROMPT 11 1 "" + FIELD QTA8 + MESSAGE ADD,111|ADD,211|ADD,311|ADD,411 + END + + NUMERO 512 14 + BEGIN + KEY "Bucket 9" + PROMPT 12 1 "" + FIELD QTA9 + MESSAGE ADD,112|ADD,212|ADD,312|ADD,412 + END + + NUMERO 513 14 + BEGIN + KEY "Bucket 10" + PROMPT 13 1 "" + FIELD QTA10 + MESSAGE ADD,113|ADD,213|ADD,313|ADD,413 + END + + NUMERO 514 14 + BEGIN + KEY "Bucket 11" + PROMPT 14 1 "" + FIELD QTA11 + MESSAGE ADD,114|ADD,214|ADD,314|ADD,414 + END + + NUMERO 515 14 + BEGIN + KEY "Bucket Finale" + PROMPT 15 1 "" + FIELD QTALAST + MESSAGE ADD,115|ADD,215|ADD,315|ADD,415 + END + + NUMERO 516 14 + BEGIN + KEY "Capacita minima col1" + PROMPT 4 2 "" + FIELD CMIN1 + MESSAGE COPY,216 + END + + NUMERO 517 14 + BEGIN + KEY "Capacita massima col1" + PROMPT 4 3 "" + FIELD CMAX1 + MESSAGE COPY,217 + END + + NUMERO 518 14 + BEGIN + KEY "Capacita minima col2" + PROMPT 5 2 "" + FIELD CMIN2 + MESSAGE COPY,218 + END + + NUMERO 519 14 + BEGIN + KEY "Capacita massima col2" + PROMPT 5 3 "" + FIELD CMAX2 + MESSAGE COPY,219 + END + + NUMERO 520 14 + BEGIN + KEY "Capacita minima col3" + PROMPT 6 2 "" + FIELD CMIN3 + MESSAGE COPY,220 + END + + NUMERO 521 14 + BEGIN + KEY "Capacita massima col3" + PROMPT 6 3 "" + FIELD CMAX3 + MESSAGE COPY,221 + END + + NUMERO 522 14 + BEGIN + KEY "Capacita minima col4" + PROMPT 7 2 "" + FIELD CMIN4 + MESSAGE COPY,222 + END + + NUMERO 523 14 + BEGIN + KEY "Capacita massima col4" + PROMPT 7 3 "" + FIELD CMAX4 + MESSAGE COPY,223 + END + + NUMERO 524 14 + BEGIN + KEY "Capacita minima col5" + PROMPT 8 2 "" + FIELD CMIN5 + MESSAGE COPY,224 + END + + NUMERO 525 14 + BEGIN + KEY "Capacita massima col5" + PROMPT 8 3 "" + FIELD CMAX5 + MESSAGE COPY,225 + END + + NUMERO 526 14 + BEGIN + KEY "Capacita minima col6" + PROMPT 9 2 "" + FIELD CMIN6 + MESSAGE COPY,226 + END + + NUMERO 527 14 + BEGIN + KEY "Capacita massima col6" + PROMPT 9 3 "" + FIELD CMAX6 + MESSAGE COPY,227 + END + + NUMERO 528 14 + BEGIN + KEY "Capacita minima col7" + PROMPT 10 2 "" + FIELD CMIN7 + MESSAGE COPY,228 + END + + NUMERO 529 14 + BEGIN + KEY "Capacita massima col7" + PROMPT 10 3 "" + FIELD CMAX7 + MESSAGE COPY,229 + END + + NUMERO 530 14 + BEGIN + KEY "Capacita minima col8" + PROMPT 11 2 "" + FIELD CMIN8 + MESSAGE COPY,230 + END + + NUMERO 531 14 + BEGIN + KEY "Capacita massima col8" + PROMPT 11 3 "" + FIELD CMAX8 + MESSAGE COPY,231 + END + + NUMERO 532 14 + BEGIN + KEY "Capacita minima col9" + PROMPT 12 2 "" + FIELD CMIN9 + MESSAGE COPY,232 + END + + NUMERO 533 14 + BEGIN + KEY "Capacita massima col9" + PROMPT 12 3 "" + FIELD CMAX9 + MESSAGE COPY,233 + END + + NUMERO 534 14 + BEGIN + KEY "Capacita minima col10" + PROMPT 13 2 "" + FIELD CMIN10 + MESSAGE COPY,234 + END + + NUMERO 535 14 + BEGIN + KEY "Capacita massima col10" + PROMPT 13 3 "" + FIELD CMAX10 + MESSAGE COPY,235 + END + + NUMERO 536 14 + BEGIN + KEY "Capacita minima col11" + PROMPT 14 2 "" + FIELD CMIN11 + MESSAGE COPY,236 + END + + NUMERO 537 14 + BEGIN + KEY "Capacita massima col11" + PROMPT 14 3 "" + FIELD CMAX11 + MESSAGE COPY,236 + END + + END // SECTION LIVELLI + + //Totalizzatori per livelli + STRINGA 401 50 + BEGIN + KEY "Totale livello giacenza" + PROMPT 1 2 " Totale livello giacenza " + END + + STRINGA 402 4 + BEGIN + KEY "UM" + PROMPT 2 2 "" + FLAGS "H" + END + + NUMERO 403 14 + BEGIN + KEY "Bucket Iniziale" + PROMPT 3 2 "" + PICTURE "#########,@@" + GROUP 4 + END + + NUMERO 404 14 + BEGIN + KEY "Bucket 1" + PROMPT 4 2 "" + PICTURE "#########,@@" + GROUP 4 + END + + NUMERO 405 14 + BEGIN + KEY "Bucket 2" + PROMPT 5 2 "" + PICTURE "#########,@@" + GROUP 4 + END + + NUMERO 406 14 + BEGIN + KEY "Bucket 3" + PROMPT 6 2 "" + PICTURE "#########,@@" + GROUP 4 + END + + NUMERO 407 14 + BEGIN + KEY "Bucket 4" + PROMPT 7 2 "" + PICTURE "#########,@@" + GROUP 4 + END + + NUMERO 408 14 + BEGIN + KEY "Bucket 5" + PROMPT 8 2 "" + PICTURE "#########,@@" + GROUP 4 + END + + NUMERO 409 14 + BEGIN + KEY "Bucket 6" + PROMPT 9 2 "" + PICTURE "#########,@@" + GROUP 4 + END + + NUMERO 410 14 + BEGIN + KEY "Bucket 7" + PROMPT 10 2 "" + PICTURE "#########,@@" + GROUP 4 + END + + NUMERO 411 14 + BEGIN + KEY "Bucket 8" + PROMPT 11 2 "" + PICTURE "#########,@@" + GROUP 4 + END + + NUMERO 412 14 + BEGIN + KEY "Bucket 9" + PROMPT 12 2 "" + PICTURE "#########,@@" + GROUP 4 + END + + NUMERO 413 14 + BEGIN + KEY "Bucket 10" + PROMPT 13 2 "" + PICTURE "#########,@@" + GROUP 4 + END + + NUMERO 414 14 + BEGIN + KEY "Bucket 11" + PROMPT 14 2 "" + PICTURE "#########,@@" + GROUP 4 + END + + NUMERO 415 14 + BEGIN + KEY "Bucket Finale" + PROMPT 15 2 "" + PICTURE "#########,@@" + GROUP 4 + END + END // SECTION ARTICOLI + + // Totalizzatori per articoli + STRINGA 301 50 + BEGIN + KEY "Totale articolo" + PROMPT 1 2 " Totale articolo " + END + + STRINGA 302 4 + BEGIN + KEY "UM" + PROMPT 2 2 "" + FLAGS "H" + END + + NUMERO 303 14 + BEGIN + KEY "Bucket Iniziale" + PROMPT 3 2 "" + PICTURE "#########,@@" + GROUP 3 + END + + NUMERO 304 14 + BEGIN + KEY "Bucket 1" + PROMPT 4 2 "" + PICTURE "#########,@@" + GROUP 3 + END + + NUMERO 305 14 + BEGIN + KEY "Bucket 2" + PROMPT 5 2 "" + PICTURE "#########,@@" + GROUP 3 + END + + NUMERO 306 14 + BEGIN + KEY "Bucket 3" + PROMPT 6 2 "" + PICTURE "#########,@@" + GROUP 3 + END + + NUMERO 307 14 + BEGIN + KEY "Bucket 4" + PROMPT 7 2 "" + PICTURE "#########,@@" + GROUP 3 + END + + NUMERO 308 14 + BEGIN + KEY "Bucket 5" + PROMPT 8 2 "" + PICTURE "#########,@@" + GROUP 3 + END + + NUMERO 309 14 + BEGIN + KEY "Bucket 6" + PROMPT 9 2 "" + PICTURE "#########,@@" + GROUP 3 + END + + NUMERO 310 14 + BEGIN + KEY "Bucket 7" + PROMPT 10 2 "" + PICTURE "#########,@@" + GROUP 3 + END + + NUMERO 311 14 + BEGIN + KEY "Bucket 8" + PROMPT 11 2 "" + PICTURE "#########,@@" + GROUP 3 + END + + NUMERO 312 14 + BEGIN + KEY "Bucket 9" + PROMPT 12 2 "" + PICTURE "#########,@@" + GROUP 3 + END + + NUMERO 313 14 + BEGIN + KEY "Bucket 10" + PROMPT 13 2 "" + PICTURE "#########,@@" + GROUP 3 + END + + NUMERO 314 14 + BEGIN + KEY "Bucket 11" + PROMPT 14 2 "" + PICTURE "#########,@@" + GROUP 3 + END + + NUMERO 315 14 + BEGIN + KEY "Bucket Finale" + PROMPT 15 2 "" + PICTURE "#########,@@" + GROUP 3 + END + END // SECTION LINEE + + // Totalizzatori per linee + STRINGA 201 50 + BEGIN + KEY "Totale linea" + PROMPT 1 2 " Totale linea " + END + + STRINGA 202 4 + BEGIN + KEY "UM" + PROMPT 2 2 "" + FLAGS "H" + END + + NUMERO 203 14 + BEGIN + KEY "Bucket Iniziale" + PROMPT 3 2 "" + PICTURE "#########,@@" + GROUP 2 + END + + NUMERO 204 14 + BEGIN + KEY "Bucket 1" + PROMPT 4 2 "" + PICTURE "#########,@@" + GROUP 2 + END + + NUMERO 205 14 + BEGIN + KEY "Bucket 2" + PROMPT 5 2 "" + PICTURE "#########,@@" + GROUP 2 + END + + NUMERO 206 14 + BEGIN + KEY "Bucket 3" + PROMPT 6 2 "" + PICTURE "#########,@@" + GROUP 2 + END + + NUMERO 207 14 + BEGIN + KEY "Bucket 4" + PROMPT 7 2 "" + PICTURE "#########,@@" + GROUP 2 + END + + NUMERO 208 14 + BEGIN + KEY "Bucket 5" + PROMPT 8 2 "" + PICTURE "#########,@@" + GROUP 2 + END + + NUMERO 209 14 + BEGIN + KEY "Bucket 6" + PROMPT 9 2 "" + PICTURE "#########,@@" + GROUP 2 + END + + NUMERO 210 14 + BEGIN + KEY "Bucket 7" + PROMPT 10 2 "" + PICTURE "#########,@@" + GROUP 2 + END + + NUMERO 211 14 + BEGIN + KEY "Bucket 8" + PROMPT 11 2 "" + PICTURE "#########,@@" + GROUP 2 + END + + NUMERO 212 14 + BEGIN + KEY "Bucket 9" + PROMPT 12 2 "" + PICTURE "#########,@@" + GROUP 2 + END + + NUMERO 213 14 + BEGIN + KEY "Bucket 10" + PROMPT 13 2 "" + PICTURE "#########,@@" + GROUP 2 + END + + NUMERO 214 14 + BEGIN + KEY "Bucket 11" + PROMPT 14 2 "" + PICTURE "#########,@@" + GROUP 2 + END + + NUMERO 215 14 + BEGIN + KEY "Bucket Finale" + PROMPT 15 2 "" + PICTURE "#########,@@" + GROUP 2 + END + + NUMERO 216 14 + BEGIN + KEY "Capacita minima 1" + FLAGS "H" + PROMPT 4 3 "" + GROUP 2 + END + + NUMERO 217 14 + BEGIN + KEY "Capacita massima 1" + FLAGS "H" + PROMPT 4 4 "" + GROUP 2 + END + + NUMERO 218 14 + BEGIN + KEY "Capacita minima 2" + FLAGS "H" + PROMPT 5 3 "" + GROUP 2 + END + + NUMERO 219 14 + BEGIN + KEY "Capacita massima 2" + FLAGS "H" + PROMPT 5 4 "" + GROUP 2 + END + + NUMERO 220 14 + BEGIN + KEY "Capacita minima 3" + FLAGS "H" + PROMPT 6 3 "" + GROUP 2 + END + + NUMERO 221 14 + BEGIN + KEY "Capacita massima 3" + FLAGS "H" + PROMPT 6 4 "" + GROUP 2 + END + + NUMERO 222 14 + BEGIN + KEY "Capacita minima 4" + FLAGS "H" + PROMPT 7 3 "" + GROUP 2 + END + + NUMERO 223 14 + BEGIN + KEY "Capacita massima 4" + FLAGS "H" + PROMPT 7 4 "" + GROUP 2 + END + + NUMERO 224 14 + BEGIN + KEY "Capacita minima 5" + FLAGS "H" + PROMPT 8 3 "" + GROUP 2 + END + + NUMERO 225 14 + BEGIN + KEY "Capacita massima 5" + FLAGS "H" + PROMPT 8 4 "" + GROUP 2 + END + + NUMERO 226 14 + BEGIN + KEY "Capacita minima 6" + FLAGS "H" + PROMPT 9 3 "" + GROUP 2 + END + + NUMERO 227 14 + BEGIN + KEY "Capacita massima 6" + FLAGS "H" + PROMPT 9 4 "" + GROUP 2 + END + + NUMERO 228 14 + BEGIN + KEY "Capacita minima 7" + FLAGS "H" + PROMPT 10 3 "" + GROUP 2 + END + + NUMERO 229 14 + BEGIN + KEY "Capacita massima 7" + FLAGS "H" + PROMPT 10 4 "" + GROUP 2 + END + + NUMERO 230 14 + BEGIN + KEY "Capacita minima 8" + FLAGS "H" + PROMPT 11 3 "" + GROUP 2 + END + + NUMERO 231 14 + BEGIN + KEY "Capacita massima 8" + FLAGS "H" + PROMPT 11 4 "" + GROUP 2 + END + + NUMERO 232 14 + BEGIN + KEY "Capacita minima 9" + FLAGS "H" + PROMPT 12 3 "" + GROUP 2 + END + + NUMERO 233 14 + BEGIN + KEY "Capacita massima 9" + FLAGS "H" + PROMPT 12 4 "" + GROUP 2 + END + + NUMERO 234 14 + BEGIN + KEY "Capacita minima 10" + FLAGS "H" + PROMPT 13 3 "" + GROUP 2 + END + + NUMERO 235 14 + BEGIN + KEY "Capacita massima 10" + FLAGS "H" + PROMPT 13 4 "" + GROUP 2 + END + + NUMERO 236 14 + BEGIN + KEY "Capacita minima 11" + FLAGS "H" + PROMPT 14 3 "" + GROUP 2 + END + + NUMERO 237 14 + BEGIN + KEY "Capacita massima 11" + FLAGS "H" + PROMPT 14 4 "" + GROUP 2 + END + + STRINGA 238 50 + BEGIN + KEY "Carico" + FLAGS "H" + PROMPT 1 3 " Carico linea" + END + + STRINGA 239 10 + BEGIN + KEY "UM" + FLAGS "H" + PROMPT 2 3 "" + END + + NUMERO 240 14 + BEGIN + KEY "Carico linea col 1" + FLAGS "H" + PROMPT 4 3 "" + MESSAGE _MRP,LOAD,204,217 + GROUP 2 + END + + NUMERO 241 14 + BEGIN + KEY "Carico linea col 2" + FLAGS "H" + PROMPT 5 3 "" + MESSAGE _MRP,LOAD,205,219 + GROUP 2 + END + + NUMERO 242 14 + BEGIN + KEY "Carico linea col 3" + FLAGS "H" + PROMPT 6 3 "" + MESSAGE _MRP,LOAD,206,221 + GROUP 2 + END + + NUMERO 243 14 + BEGIN + KEY "Carico linea col 4" + FLAGS "H" + PROMPT 7 3 "" + MESSAGE _MRP,LOAD,207,223 + GROUP 2 + END + + NUMERO 244 14 + BEGIN + KEY "Carico linea col 5" + FLAGS "H" + PROMPT 8 3 "" + MESSAGE _MRP,LOAD,208,225 + GROUP 2 + END + + NUMERO 245 14 + BEGIN + KEY "Carico linea col 6" + FLAGS "H" + PROMPT 9 3 "" + MESSAGE _MRP,LOAD,209,227 + GROUP 2 + END + + NUMERO 246 14 + BEGIN + KEY "Carico linea col 7" + FLAGS "H" + PROMPT 10 3 "" + MESSAGE _MRP,LOAD,210,229 + GROUP 2 + END + + NUMERO 247 14 + BEGIN + KEY "Carico linea col 8" + FLAGS "H" + PROMPT 11 3 "" + MESSAGE _MRP,LOAD,211,231 + GROUP 2 + END + + NUMERO 248 14 + BEGIN + KEY "Carico linea col 9" + FLAGS "H" + PROMPT 12 3 "" + MESSAGE _MRP,LOAD,212,233 + GROUP 2 + END + + NUMERO 249 14 + BEGIN + KEY "Carico linea col 10" + FLAGS "H" + PROMPT 13 3 "" + MESSAGE _MRP,LOAD,213,235 + GROUP 2 + END + + NUMERO 250 14 + BEGIN + KEY "Carico linea col 11" + FLAGS "H" + PROMPT 14 3 "" + MESSAGE _MRP,LOAD,214,237 + GROUP 2 + END +END // SECTION IMPIANTI + +// Totalizzatori impianto +STRING 101 50 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Totale impianto" + PROMPT 1 2 "Totale impianto" +END + +STRING 102 4 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "UM" + PROMPT 2 2 "" + FLAGS "H" +END + +NUMERO 103 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket Iniziale" + PROMPT 3 2 "" + GROUP 1 + PICTURE "#########,@@" +END + +NUMERO 104 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 1" + PROMPT 4 2 "" + GROUP 1 + PICTURE "#########,@@" +END + +NUMERO 105 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 2" + PROMPT 5 2 "" + GROUP 1 + PICTURE "#########,@@" +END + +NUMERO 106 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 3" + PROMPT 6 2 "" + GROUP 1 + PICTURE "#########,@@" +END + +NUMERO 107 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 4" + PROMPT 7 2 "" + GROUP 1 + PICTURE "#########,@@" +END + +NUMERO 108 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 5" + PROMPT 8 2 "" + GROUP 1 + PICTURE "#########,@@" +END + +NUMERO 109 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 6" + PROMPT 9 2 "" + GROUP 1 + PICTURE "#########,@@" +END + +NUMERO 110 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 7" + PROMPT 10 2 "" + GROUP 1 + PICTURE "#########,@@" +END + +NUMERO 111 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 8" + PROMPT 11 2 "" + GROUP 1 + PICTURE "#########,@@" +END + +NUMERO 112 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 9" + PROMPT 12 2 "" + GROUP 1 + PICTURE "#########,@@" +END + +NUMERO 113 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 10" + PROMPT 13 2 "" + GROUP 1 + PICTURE "#########,@@" +END + +NUMERO 114 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket 11" + PROMPT 14 2 "" + GROUP 1 + PICTURE "#########,@@" +END + +NUMERO 115 14 +BEGIN + SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" + KEY "Bucket Finale" + PROMPT 15 2 "" + GROUP 1 + PICTURE "#########,@@" +END + +END //BODY + + diff --git a/mr/mr2.cpp b/mr/mr2.cpp new file mode 100755 index 000000000..ada40c497 --- /dev/null +++ b/mr/mr2.cpp @@ -0,0 +1,17 @@ +#include + +#include "mr2.h" + +int main(int argc, char** argv) +{ + int a = argc > 1 ? (argv[1][1] - '0') : 0; + switch (a) + { + case 0: // MRP + mr2100(argc,argv); break; + case 1: // planning + mr2200(argc,argv); break; + } + exit(0); + return 0; +} diff --git a/mr/mr2.h b/mr/mr2.h new file mode 100755 index 000000000..528cc7ccb --- /dev/null +++ b/mr/mr2.h @@ -0,0 +1,8 @@ +#ifndef __MR2_H +#define __MR2_H + +int mr2100(int argc, char* argv[]); +int mr2200(int argc, char* argv[]); + +#endif // __MR2_H + diff --git a/mr/mr2.url b/mr/mr2.url new file mode 100755 index 000000000..290e76747 --- /dev/null +++ b/mr/mr2.url @@ -0,0 +1,34 @@ +#define APPNAME EURO_MR +#define QAPPNAME "EURO_MR" +#include +#include "mr2url.h" + +/* mr2 -0 PLANNING*/ + +MENU TASK_MENUBAR + SUBMENU MENU_FILE "~File" + +/* mr2 -1 M.R.P. */ +MENUBAR MENU_BAR(1) + +MENU MENU_BAR(1) + SUBMENU MENU_FILE "~File" + +image USER_BMP_CHECK "check.bmp" +image USER_BMP_ARROWUP "darrowu.bmp" +image USER_BMP_ARROWDOWN "darrowd.bmp" +image USER_BMP_ARROWLEFT "darrowl.bmp" +image USER_BMP_ARROWRIGHT "darrowr.bmp" +image USER_BMP_ARROWUP_RED "darrowu2.bmp" +image USER_BMP_ARROWDOWN_RED "darrowd2.bmp" +image USER_BMP_ARROWLEFT_RED "darrowl2.bmp" +image USER_BMP_ARROWRIGHT_RED "darrowr2.bmp" + +image USER_BMP_ARROWUPLEFT "darrowul.bmp" +image USER_BMP_ARROWDOWNLEFT "darrowdl.bmp" +image USER_BMP_ARROWUPRIGHT "darrowur.bmp" +image USER_BMP_ARROWDOWNRIGHT "darrowdr.bmp" + +image USER_BMP_SELECT_ORDP "selordp.bmp" +image USER_BMP_SELECT_ORDF "selordf.bmp" + diff --git a/mr/mr2100.cpp b/mr/mr2100.cpp new file mode 100755 index 000000000..1412e724c --- /dev/null +++ b/mr/mr2100.cpp @@ -0,0 +1,1673 @@ +#include +#include +#include +#include +#include +#include + +#include "mrplib.h" +#include "..\mg\mglib.h" +#include "..\ve\velib.h" +#include "..\ve\veconf.h" + +#include "mr2100.h" +#include "mr2100a.h" + +/////////////////////////////////////////////////////////// +// TMRP_record +/////////////////////////////////////////////////////////// + +const real& TMRP_record::add_gross_req(const real & val) +{ + _gross_requirement += val; + return _gross_requirement; +} + +const real& TMRP_record::add_sched_rec(const real & val) +{ + _sched_receipts += val; + return _sched_receipts; +} + +const real& TMRP_record::add_net_req(const real & val) +{ + _net_requirement += val; + return _net_requirement; +} + +TObject * TMRP_record::dup() const +{ + TMRP_record *o= new TMRP_record(_time); + o->TMRP_record::operator=(*this); + return o; +} + +TMRP_record & TMRP_record::operator=(const TMRP_record & a) +{ + _gross_requirement=a._gross_requirement; + _on_hand=a._on_hand; + _sched_receipts=a._sched_receipts; + _released_receipts=a._released_receipts; + _net_requirement=a._net_requirement; + _planned_orders=a._planned_orders; + return *this; +} + +TMRP_record::TMRP_record(const TMRP_time& t) + : _time(t) +{ +} + +/////////////////////////////////////////////////////////// +// TMRP_line +/////////////////////////////////////////////////////////// +TArticolo_giacenza *TMRP_line::_articolo_giac=NULL; + +void TMRP_line::lotti_riordino(real & minimo, real & increm) const +{ + _articolo_giac->read(_codart); + const int i=_articolo_giac->find_mag("", _codmag); + if (i>=0) + { + const TRectype & rec=_articolo_giac->mag("").row(i); + minimo = rec.get_real(MAG_LOTTORIOR); + increm = rec.get_real(MAG_LOTTOIRIOR); + } else + minimo=increm=0; + if (minimo.is_zero()) + minimo = _articolo_giac->get_real(MAG_LOTTORIOR); + if (increm.is_zero()) + increm = _articolo_giac->get_real(MAG_LOTTOIRIOR); +} + +int TMRP_line::add_son(const real& qta, TMRP_line* son) +{ + CHECK(son, "Can't add NULL TMRP_line son"); + CHECK(son != this, "Hermafrodite TMRP_line"); + _qta_sons.add(qta); + return _sons.add(son); +} + +bool TMRP_line::is_son(const TCodice_articolo& art) const +{ + for (int i = sons()-1; i >= 0; i--) + { + const TMRP_line& r = son(i); + if (r.codice() == art) + break; + } + return i >= 0; +} + +int TMRP_line::compare(const TSortable& s) const +{ + const TMRP_line& line = (const TMRP_line&)s; + const bool imfather = sons() > 0; + const bool hesfather = line.sons() > 0; + if (imfather && (!hesfather || is_son(line.codice()))) + return +1; + if (hesfather && (!imfather || line.is_son(codice()))) + return -1; + return 0; +} + + +TObject* TMRP_line::dup() const +{ + TMRP_line * o=new TMRP_line(*this); + return o; +} + +TMRP_line & TMRP_line::operator=(const TMRP_line & a) +{ + //key + _codart=a._codart; + _livgiac=a._livgiac; + _codmag=a._codmag; + _codimp=a._codimp; + _codlin=a._codlin; + _codcli=a._codcli; + // contents + _description=a._description; + _sons=a._sons; + _qta_sons=a._qta_sons; + _req_per_bucket=a._req_per_bucket; + + _articolo_giac= new TArticolo_giacenza(a._articolo_giac->codice()); + + return *this; +} + +TMRP_record& TMRP_line::record(int i) const +{ + TMRP_record* rec = (TMRP_record*)_req_per_bucket.objptr(i); + CHECKD(rec != NULL, "Invalid MRP record ", i); + return *rec; +} + +TMRP_record& TMRP_line::record(const TMRP_time& t) const +{ + const int last = last_bucket(); + for (int i = 0; i <= last; i++) + { + TMRP_record& rec = record(i); + const int cmp = rec.time().compare(t); + if (cmp == 0) + return rec; + if (cmp > 0) + { + ((TArray&)_req_per_bucket).insert(NULL, i); + break; + } + } + + TMRP_record* rec = new TMRP_record(t); + ((TArray&)_req_per_bucket).add(rec, i); + return *rec; +} + +// approssima in base al lotto minimo; prevede valori negativi +real TMRP_line::sizeup_net_requirement(int i, const real &val) +{ + real req; // Azzera net requirement + if (val < ZERO) + { + req = -val; // Rende positiva la richiesta effettiva + + real lm,li; + lotti_riordino(lm,li); + int cazzo; + if (!lm.is_zero() && !li.is_zero() ) + cazzo=1; + if (req > lm) // Se la richiesta supera il lotto minimo + { + if (li > ZERO) + { + // Calcola il numero di lotti incrementali + real lotti = (req - lm) / li; + lotti.ceil(); + // La quantita' richiesta = minimo + lotti * dim.lotti + req = lm + lotti * li; + } + } + else + req = lm; // Forza la richiesta almeno al lotto minimo + } + set_net_req(i, req); + return req; +} + +const real& TMRP_line::add_gross_req(const TMRP_time& t, const real& val) +{ return record(t).add_gross_req(val); } + +const real& TMRP_line::add_sched_rec(const TMRP_time& t, const real &val) +{ return record(t).add_sched_rec(val);} + +const real & TMRP_line::set_net_req(int i, const real &val) +{ + if (val>ZERO) + return record(i).set_net_req(val); + else + return record(i).set_net_req(ZERO); +} + +const real & TMRP_line::add_net_req(const TMRP_time &t, const real &val) +{ return record(t).add_net_req(val); } + +const real & TMRP_line::set_on_hand(int i, const real &val) +{ return record(i).set_on_hand(val);} + +const real & TMRP_line::set_on_hand(const TMRP_time &t, const real &val) +{ return record(t).set_on_hand(val);} + +const TMRP_time& TMRP_line::lead_time(int i, TMRP_time& t) const +{ + t = record(i).time(); + + TLocalisamfile dist(LF_DIST); + dist.put("CODDIST", codice()); + if (dist.read() == NOERR) + { + int days = dist.get_int("LEADTIME"); + long hours = dist.get_long("LEADHOURS"); + t.sub_time(days, hours); + } + else + { + TLocalisamfile anamag(LF_ANAMAG); + anamag.put(ANAMAG_CODART, codice()); + if (anamag.read() == NOERR) + { + int days = anamag.get_int("LEADTIME"); + t.sub_time(days); + } + } + return t; +} + +real &TMRP_line::giacenza_attuale(real &g) const +{ + TDate d(TODAY); + return giacenza_attuale(g, d); +} + +real &TMRP_line::giacenza_attuale(real &g, const TDate &d) const +{ + _articolo_giac->read(codice()); + g = _articolo_giac->giacenza_anno(codmag(),livgiac(),d.year()); + return g; +} + +real &TMRP_line::scorta_minima(real &g) const +{ + TDate d(TODAY); + return scorta_minima(g,d); +} + +real &TMRP_line::scorta_minima(real &g, const TDate &d) const +{ + _articolo_giac->read(codice()); + g = _articolo_giac->scorta_minima(codmag(),livgiac(),d.year()); + return g; +} + + +TMRP_line::TMRP_line(const char* art, const char* giac, + const char* mag, const char* imp, + const char* lin, long codcli) + : _codart(art), _livgiac(giac), + _codmag(mag), _codimp(imp), _codlin(lin), _codcli(codcli) +{ + if (_articolo_giac==NULL) + _articolo_giac= new TArticolo_giacenza(); +} + +TMRP_line::TMRP_line(const TMRP_line&a) +{ + TMRP_line::operator=(a); +} + + + +/////////////////////////////////////////////////////////// +// TMRP_lines +/////////////////////////////////////////////////////////// + +TSortable* TMRP_lines::new_obj(const TToken_string& key) const +{ + TCodice_articolo art; key.get(0, art); art.trim(); + TString80 gia; key.get(1, gia); gia.trim(); + TString16 mag; key.get(2, mag); mag.trim(); + TString16 imp; key.get(3, imp); imp.trim(); + TString16 lin; key.get(4, lin); lin.trim(); + TString16 clifor ; key.get(5, clifor); + return new TMRP_line(art, gia, mag, imp, lin, atol(clifor)); +} + +TMRP_lines::TMRP_lines(const TMRP_lines & a) +{ + TMRP_lines::operator=(a); +} + + +TObject* TMRP_lines::dup() const +{ + return new TMRP_lines(*this);; +} +TMRP_lines & TMRP_lines::operator= (const TMRP_lines &a) +{ + TMRP_array::operator= (a); + _ignore_mag=a._ignore_mag; + _ignore_imp=a._ignore_imp; + _ignore_lin=a._ignore_lin; + return *this; +} + +TMRP_line* TMRP_lines::find(const TCodice_articolo& codart, + const TString& gia, const TString& mag, + const TString& imp, const TString& lin, + long codcli, + bool create) +{ + _key = codart; + _key.add(gia); + if (_ignore_mag) + _key.add(" ",2); + else + _key.add(mag,2); + if (_ignore_imp) + _key.add(" ",3); + else + _key.add(imp,3); + if (_ignore_lin) + _key.add(" ",4); + else + _key.add(lin,4); + + _key.add(codcli,5); + + TSortable* s = create ? add_obj(_key) : find_obj(_key); + return (TMRP_line*)s; +} + +TMRP_lines::TMRP_lines() + : _ignore_mag(FALSE), _ignore_imp(FALSE), _ignore_lin(FALSE) +{ } + +TMRP_lines::~TMRP_lines() +{ destroy(); } + +/////////////////////////////////////////////////////////// +// TRiga_ordine +/////////////////////////////////////////////////////////// + +#define SORT_COMPLETE 13 // +#define SORT_BY_DFA -1 // data documento + data di consegna + fornitore + articolo +#define SORT_BY_DAF -2 // data documento + data di consegna + articolo + fornitore +#define SORT_BY_FAD -3 // +#define SORT_BY_FDA -4 // +#define SORT_BY_AFD -5 // +#define SORT_BY_ADF -6 // +class TRiga_ordine : public TToken_string +{ +public: + int compare(const TToken_string& r, int level = SORT_COMPLETE) const; + int compare_field(TString &str0, TString &str1,short field_no) const; + + TRiga_ordine& operator=(TToken_string& r); + TRiga_ordine& operator+=(TRiga_ordine& r); + + TRiga_ordine() : TToken_string(128) { } + TRiga_ordine(const TDate& datadoc, long forn, + const TMRP_line& line, int bucket, + TCodgiac_livelli& livelli, const real & price); + virtual ~TRiga_ordine() { } +}; + +int TRiga_ordine::compare(const TToken_string& riga, int level) const +{ + TString16 str0, str1; + int cmp = 0; + if (level>=0) + { + for (int i = 2; i <= level && cmp == 0; i++) + { + get(i, str0); + riga.get(i, str1); + cmp=compare_field(str0,str1,short(i+FIRST_FIELD)); + } + } else { + // ordinamenti non standard + short f; + short fields_DFA[] = {F_DATADOC, F_DATACONS, F_ORD_TYPE, F_FORNITORE, F_ARTICOLO}; + short fields_DAF[] = {F_DATADOC, F_DATACONS, F_ARTICOLO, F_ORD_TYPE, F_FORNITORE}; + short fields_AFD[] = {F_ARTICOLO, F_ORD_TYPE, F_FORNITORE, F_DATADOC, F_DATACONS}; + short fields_ADF[] = {F_ARTICOLO, F_ORD_TYPE, F_DATADOC, F_DATACONS, F_FORNITORE}; + short fields_FAD[] = {F_ORD_TYPE, F_FORNITORE, F_ARTICOLO, F_DATADOC, F_DATACONS}; + short fields_FDA[] = {F_ORD_TYPE, F_FORNITORE, F_DATADOC, F_DATACONS, F_ARTICOLO}; + for (int i = 0; i < 5 && cmp == 0; i++) + { + switch (level) + { + case SORT_BY_DFA: + f=fields_DFA[i]; break; + case SORT_BY_DAF: + f=fields_DAF[i]; break; + case SORT_BY_FAD: + f=fields_FAD[i]; break; + case SORT_BY_FDA: + f=fields_FDA[i]; break; + case SORT_BY_ADF: + f=fields_ADF[i]; break; + case SORT_BY_AFD: + f=fields_AFD[i]; break; + default: + NFCHECK("Ordinamento sconosciuto"); + break; + } + get(f-FIRST_FIELD, str0); + riga.get(f-FIRST_FIELD, str1); + cmp=compare_field(str0,str1,f); + } + } + return cmp; +} + +int TRiga_ordine::compare_field(TString &str0, TString &str1,short field_no) const +{ + int cmp; + switch (field_no) + { + case F_DATADOC: + case F_DATACONS: + { + if (str0 != str1) + { + const TDate mine(str0); + const TDate his(str1); + cmp = mine > his ? +1 : -1; + } + else + cmp = 0; + } + break; + case F_FORNITORE: // data doc + { + const long f0 = atol(str0); + const long f1 = atol(str1); + cmp = f0 == f1 ? 0 : (f0 > f1 ? +1 : -1); + } + break; + default: + cmp = str0.compare(str1); + break; + } + return cmp; +} + + +TRiga_ordine& TRiga_ordine::operator=(TToken_string& r) +{ + this->TToken_string::operator=(r); + return *this; +} + +TRiga_ordine& TRiga_ordine::operator+=(TRiga_ordine& r) +{ + CHECK(compare(r) == 0, "Can't add incompatible order line"); + real qta = get(13); + qta += real(r.get(13)); + add(qta.string(), 13); + return *this; +} + +TRiga_ordine::TRiga_ordine(const TDate& datadoc, long forn, const TMRP_line& line, int bucket, TCodgiac_livelli& lg, const real & price) + : TToken_string(128) +{ + add(" ",F_SELECTED-FIRST_FIELD); + add("F",F_ORD_TYPE-FIRST_FIELD); + add(datadoc.string(),F_DATADOC-FIRST_FIELD); + const TMRP_time& time = line.time(bucket); + add(time.date().string(),F_DATACONS-FIRST_FIELD); + add(forn,F_FORNITORE-FIRST_FIELD); + add(line.codice(),F_ARTICOLO-FIRST_FIELD); + + const TString& liv = line.livgiac(); + for (int l = 1; l <= 4; l++) + { + if (lg.enabled(l)) + add(liv.mid(lg.code_start(l), lg.code_length(l)),F_LIV1+l-1-FIRST_FIELD); + else + add(" ",F_LIV1+l-1-FIRST_FIELD); + } + + add(line.codmag().left(3),F_MAGAZZINO-FIRST_FIELD); + add(line.codmag().mid(3),F_DEPOSITO-FIRST_FIELD); + + add(line.codimp(),F_CODIMP-FIRST_FIELD); + add(line.codlin(),F_CODLIN-FIRST_FIELD); + add(line.net_requirement(bucket).string(),F_QUANTITA-FIRST_FIELD); + + const TCodice_um um; + const TQuantita qta(line.codice(), um, ZERO); + add(qta.um(),F_UM-FIRST_FIELD); + add(price.string(),F_PREZZO-FIRST_FIELD); + + add(line.description(),F_DESCART-FIRST_FIELD); +} + +/////////////////////////////////////////////////////////// +// TLav_finder Trova la prima lavorazione di un articolo +/////////////////////////////////////////////////////////// + +class TLav_finder : public TAssoc_array +{ + TDecoder _lnp; + bool _keep_imp; + +public: + void init(bool ki = TRUE); + const TString& lin2imp(const TString& lin); + TLavorazione& art2lav(const TCodice_articolo& art); + void art2magimpline(const TCodice_articolo& art, + TString& mag, TString& imp, + TString& lin); + + TLav_finder(); + virtual ~TLav_finder() { } +}; + +void TLav_finder::init(bool ki) +{ + _keep_imp = ki; + TAssoc_array::destroy(); + _lnp.destroy(); +} + +TLavorazione& TLav_finder::art2lav(const TCodice_articolo& art) +{ + TLavorazione* lav = (TLavorazione*)objptr(art); + if (lav == NULL) + { + TDistinta_tree tree; + TArray boom; + tree.set_root(art); + tree.explode(boom, FALSE, RAGGR_EXP_UMBASE, 1, "L"); + TString16 codlav; + if (boom.items() > 0) + codlav = ((TRiga_esplosione&)boom[0]).articolo(); + lav = new TLavorazione(codlav); + add(art, lav); + } + return *lav; +} + +void TLav_finder::art2magimpline(const TCodice_articolo& art, + TString& mag, TString& imp, + TString& lin) +{ + TLavorazione& lav = art2lav(art); + if (imp.blank() && !lin.blank()) + imp = _lnp.decode(lin); + lin.cut(0); + const int ll = _keep_imp ? lav.linee() : lav.linee_standard(); + for (int l = 0; l < ll; l++) + { + const TString& linea = lav.cod_linea(l); + const bool goodimp = imp.empty() || _lnp.decode(linea) == imp; + if (l == 0 || goodimp) + { lin = linea; lin.trim(); } + if (goodimp) + break; + } + if (lin.not_empty()) + { + const TLinea_prod lnp(lin) ; + imp = lnp.codimp(); + mag = lnp.codmag(); + } + else + { + if (!_keep_imp) + imp = mag = ""; + } +} + +TLav_finder::TLav_finder() : _lnp("LNP", "S6"), _keep_imp(TRUE) +{ } + +/////////////////////////////////////////////////////////// +// TMatResPlanning +/////////////////////////////////////////////////////////// + +class TMatResMask; + + +class TMatResPlanning : public TSkeleton_application +{ + TMRP_lines _articles; + TLav_finder _artinfo; + +private: + bool gross2net_logic(TMRP_line &curr_article, int bucket,bool lotsizing_f, bool lotsizing_p); + bool build_gross_requirements(const TMatResMask& m); + bool build_sched_receipts(const TMatResMask& m); + bool explode_articles(const TMatResMask& m); + + bool test_codnum(const TCodice_numerazione& num, TString_array& a) const; + bool test_status(const TRectype& doc, TString_array& a) const; + +protected: + bool preprocess_cycle(const TMatResMask& m); // req iniziale dai docs + bool net_requirement_cycle(const TMatResMask& m); + bool build_orders(TMatResMask& m); + +public: + virtual void main_loop(); + virtual bool firm_change_enabled() const { return FALSE; } + + void compute(TMatResMask& m); + bool emit_orders(TMatResMask& m); +}; + +TMatResPlanning& app() { return (TMatResPlanning&)main_app(); } + +/////////////////////////////////////////////////////////// +// TMatResMask +/////////////////////////////////////////////////////////// + +class TMatResMask : public TCalendar_mask +{ + TCodgiac_livelli _livelli; + TCondizione_vendita *_condv; + + void clear_sheets(); +protected: + void round_field(TMask_field& fld, bool up) const; + + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + int find_pos(const TRiga_ordine& r, int& cmp) const; + void sort_orders(); + bool orders_selected(char type); + void select_orders(char type); + +public: + TCodgiac_livelli & livelli_giacenza() {return _livelli;} + int round_date(TDate& date, bool up = FALSE) const; + int add_order_line(const TDate& data, long forn, const TMRP_line& l, int bucket); + + TMatResMask(); + virtual ~TMatResMask() { } +}; + +int TMatResMask::round_date(TDate& date, bool up) const +{ + // Dimensione del bucke in giorni + int bucket_size = get_int(F_BUCKET) * 7; + if (bucket_size < 7) bucket_size = 7; + + // Riporta la data al primo lunedi prima dell'inizio + TDate inizio = get(F_DADATA); + const int wday = inizio.wday(); + if (wday > 1) inizio -= wday-1; + + // Calcola il bucket di appartenenza + const int days = int(date - inizio); + const int bucket = days / bucket_size; + + if (up) // Arrotonda alla fine del bucket + date = inizio + long((bucket+1) * bucket_size - 1); + else // Arrotonda all'inizio del bucket + date = inizio + long(bucket * bucket_size); + + return bucket; +} + +void TMatResMask::round_field(TMask_field& fld, bool up) const +{ + TDate date = fld.get(); + if (date.ok()) + { + round_date(date, up); + fld.set(date); + } +} + +bool TMatResMask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + const char * confirm_msg="Le attuali %d righe di ordine verranno perse. Confermi ?"; + switch (o.dlg()) + { + case F_DADATA: + if (e == fe_modify) + round_field(o, FALSE); + break; + case F_ADATA: + if (e == fe_modify) + round_field(o, TRUE); + break; + case F_BUCKET: + if (e == fe_modify) + { + round_field(field(F_DADATA), FALSE); + round_field(field(F_ADATA), TRUE); + } + break; + case F_NUM_ORC: + case F_TIPI_ORC: + case F_NUM_ORF: + case F_TIPI_ORF: + if (e == fe_init) + { + TSheet_field& s = (TSheet_field&)o; + if (s.items() == 0) + { + s.row(0); + s.force_update(); + } + } + if (e == fe_close) + { + const TSheet_field& s = (const TSheet_field&)o; + FOR_EACH_SHEET_ROW_BACK(s, r, row) + if (!row->empty_items()) return TRUE; + return error_box("E' necessario inserire almeno una riga"); + } + break; + case F_ORDINI: + { + TSheet_field& s = (TSheet_field&)o; + switch(e) + { + case se_query_add: + return FALSE; + default: + break; + } + } + break; + case F_YEAR: + case F_IMPIANTO: + case F_LINEA: + if (e == fe_modify || (o.dlg() == F_YEAR && e == fe_init )) + update_calendar(F_CALENDAR, F_YEAR, F_IMPIANTO, F_LINEA); + break; + case DLG_CANCEL: + if (e == fe_button) + if (jolly == 0L) + { + TSheet_field& s = sfield(F_ORDINI); + const int it=s.items(); + if (it==0 || yesno_box(confirm_msg, it)) + { + enable(-1); + s.destroy(); + s.force_update(); + } else + return FALSE; + } + break; + case DLG_ELABORA: + if (e == fe_button && check_fields()) + { + TSheet_field& s = sfield(F_ORDINI); + const int it=s.items(); + if (it==0 || yesno_box(confirm_msg, it)) + { + s.destroy(); + app().compute(*this); + enable(DLG_SAVEREC, s.items() > 0); + enable(-1, s.items() == 0); + sort_orders(); + s.set_focus(); + } + } + break; + case F_SORT_ORDINI: + if (e == fe_modify) + sort_orders(); + break; + case F_SELECT_ORDF: + if (e == fe_button) + select_orders('F'); + break; + case F_SELECT_ORDP: + if (e == fe_button) + select_orders('P'); + break; + case DLG_SAVEREC: + if (e == fe_button && check_fields()) + { + if (!app().emit_orders(*this)) + message_box("Nessun ordine generato"); + } + break; + case DLG_PROFILE: + if (e == fe_modify) + { + clear_sheets(); + enable(-1); + } + break; + default: + break; + }; + return TRUE; +} + + +void TMatResMask::clear_sheets() +{ + TSheet_field &sa=sfield(F_ORDINI); + if (sa.items()>0) + { + sa.destroy(); + sa.force_update(); + } +} +// Per ora scansione lineare, in futuro ricerca binaria +int TMatResMask::find_pos(const TRiga_ordine& r, int& cmp) const +{ + TSheet_field& s = sfield(F_ORDINI); + TString_array& a = s.rows_array(); + cmp = +1; + for (int i = 0; i < a.items(); i++) + { + const TRiga_ordine& riga = (const TRiga_ordine&)a[i]; + cmp = r.compare(riga); + if (cmp <= 0) + break; + } + return i; +} + + +int TMatResMask::add_order_line(const TDate& datadoc, long forn, const TMRP_line& line, int bucket) +{ + TRiga_ordine* r = new TRiga_ordine(datadoc, forn, line, bucket, _livelli, ZERO); + + int cmp; + const int pos = find_pos(*r, cmp); + + TSheet_field& s = sfield(F_ORDINI); + TString_array& a = s.rows_array(); + if (cmp == 0) + { + TRiga_ordine& riga = (TRiga_ordine&)a[pos]; + riga += *r; + delete r; + } + else + { + if (1 || cmp > 0) + a.add(r); + else + a.insert(r, pos); + } + return pos; +} + +static int order_compareDFA(TSheet_field &s,int i1,int i2) +{ + const TRiga_ordine& r1 = (TRiga_ordine&)s.row(i1); + const TRiga_ordine& r2 = (TRiga_ordine&)s.row(i2); + return r1.compare(r2,SORT_BY_DFA); +} +static int order_compareDAF(TSheet_field &s,int i1,int i2) +{ + const TRiga_ordine& r1 = (TRiga_ordine&)s.row(i1); + const TRiga_ordine& r2 = (TRiga_ordine&)s.row(i2); + return r1.compare(r2,SORT_BY_DAF); +} +static int order_compareAFD(TSheet_field &s,int i1,int i2) +{ + const TRiga_ordine& r1 = (TRiga_ordine&)s.row(i1); + const TRiga_ordine& r2 = (TRiga_ordine&)s.row(i2); + return r1.compare(r2,SORT_BY_AFD); +} +static int order_compareADF(TSheet_field &s,int i1,int i2) +{ + const TRiga_ordine& r1 = (TRiga_ordine&)s.row(i1); + const TRiga_ordine& r2 = (TRiga_ordine&)s.row(i2); + return r1.compare(r2,SORT_BY_ADF); +} +static int order_compareFAD(TSheet_field &s,int i1,int i2) +{ + const TRiga_ordine& r1 = (TRiga_ordine&)s.row(i1); + const TRiga_ordine& r2 = (TRiga_ordine&)s.row(i2); + return r1.compare(r2,SORT_BY_FAD); +} +static int order_compareFDA(TSheet_field &s,int i1,int i2) +{ + const TRiga_ordine& r1 = (TRiga_ordine&)s.row(i1); + const TRiga_ordine& r2 = (TRiga_ordine&)s.row(i2); + int cmp=r1.compare(r2,SORT_BY_FDA); + return cmp; +} + +void TMatResMask::sort_orders() +{ + TSheet_field& s = sfield(F_ORDINI); + TSheet_field& a = s; + switch (-get_int(F_SORT_ORDINI)) + { + case SORT_BY_DAF: + a.sort(order_compareDAF); break; + case SORT_BY_FAD: + a.sort(order_compareFAD); break; + case SORT_BY_FDA: + a.sort(order_compareFDA); break; + case SORT_BY_AFD: + a.sort(order_compareAFD); break; + case SORT_BY_ADF: + a.sort(order_compareADF); break; + case SORT_BY_DFA: + default: + a.sort(order_compareDFA); break; + } + + s.force_update(); +} + +bool TMatResMask::orders_selected(char type) +{ + TSheet_field& s = sfield(F_ORDINI); + const int it=s.items(); + for (int r=0; r< it; r++) + { + if ( *s.cell(r, s.cid2index(F_ORD_TYPE))==type + && *s.cell(r, s.cid2index(F_SELECTED))=='X') + return TRUE; + } + return FALSE; +} + +void TMatResMask::select_orders(char type) +{ + TSheet_field& s = sfield(F_ORDINI); + bool on=!orders_selected(type); + const int it=s.items(); + for (int r=0; r< it; r++) + { + if ( *s.cell(r, s.cid2index(F_ORD_TYPE))==type ) + { + s.row(r).add(on ? "X" : " ", s.cid2index(F_SELECTED)); + s.force_update(r); + } + } + TString msg=format("Ordini %s %s",type=='F' ? "fornitore" : "di produzione" ,on ? "selezionati" :" de-selezionati"); + xvt_statbar_set(msg); +} + + + +TMatResMask::TMatResMask() : TCalendar_mask("mr2100a") +{ + _condv = NULL; + TSheet_field& sf = sfield(F_ORDINI); + _livelli.set_sheet_columns(sf, F_LIV1); + + TConfig ini(CONFIG_DITTA, "mg"); + if (!ini.get_bool("GESDEPOSITI", "mg")) + { + sf.delete_column(F_DEPOSITO); + sf.sheet_mask().hide(F_DEPOSITO); + } + + if (!ini.get_bool("GESTIMPIANTI", "mr")) + { + sf.delete_column(F_CODIMP); // Elimina colonna impianto + sf.sheet_mask().hide(F_CODIMP); + sf.sheet_mask().hide(F_DESCIMP); + + disable(F_NOIMP); // Forza l'ignoramento degli impianti + set(F_NOIMP, "X"); + } +} + +/////////////////////////////////////////////////////////// +// TMatResPlanning +/////////////////////////////////////////////////////////// + +bool TMatResPlanning::test_codnum(const TCodice_numerazione& num, + TString_array& a) const +{ + bool yes = a.find(num.codice()) >= 0; + return yes; +} + +bool TMatResPlanning::test_status(const TRectype& doc, + TString_array& a) const +{ + const TString16 tipodoc = doc.get(DOC_TIPODOC); + const int statodoc = doc.get_int(DOC_STATO); + bool yes = FALSE; + for (int i = a.items()-1; i >= 0 && !yes; i--) + { + TToken_string& riga = a.row(i); + const char* t = riga.get(0); + if (tipodoc == t) + { + const int state_fr = riga.get_int(F_DASTATO - FIRST_FIELD); + const int state_to = riga.get_int(F_ASTATO - FIRST_FIELD); + yes = statodoc >= state_fr && statodoc <= state_to; + } + } + return yes; +} + +static long table_items(const char* tab) +{ + TRelation tabrel(tab); + TCursor tabcur (&tabrel); + long tot = tabcur.items(); + return tot; +} + +/////////// finished: 100% +/////////// tested : 100% +bool TMatResPlanning::build_gross_requirements(const TMatResMask& m) +{ + TDate date_fr = m.get(F_DADATA); + const int bucket_fr = m.round_date(date_fr, FALSE); + + TDate date_to = m.get(F_ADATA); + const int bucket_to = m.round_date(date_to, TRUE); + + const int year_fr = date_fr.year(); + const int year_to = date_to.year(); + const bool master = m.get(F_ORC_MASTER)[0] == 'M'; + // azzera l'array _requirements + const bool nomag = m.get_bool(F_NOMAG); + const bool noimp = m.get_bool(F_NOIMP); + const bool nolin = m.get_bool(F_NOLIN); + _articles.ignore(nomag, noimp, nolin); + _articles.destroy(); + + TTable num("%NUM"); + TCodice_numerazione cod; + + TRelation rel(LF_DOC); + TCursor cur(&rel); + const TRectype& curr_doc = cur.curr(); + TRectype filter_fr(curr_doc), filter_to(curr_doc); + + TString_array& n = m.sfield(F_NUM_ORC).rows_array(); + TString_array& a = m.sfield(F_TIPI_ORC).rows_array(); + + TProgind pi(table_items("%NUM"), "Fase 1: caricamento fabbisogni lordi...", TRUE, TRUE); + + // Scandisce tutte le numerazioni considerando solo quelle + // contenenti i tipi documento specificati nella maschera + for (int err = cod.first(num); err == NOERR; err = cod.next(num)) + { + pi.addstatus(1); + if (pi.iscancelled()) + return FALSE; + + if (test_codnum(cod, n)) + { + // Filtra il cursore in modo da limitarlo alla numerazione + // corrente ed agli anni specificati dalle due date limite + filter_fr.put(DOC_PROVV, "D"); + filter_fr.put(DOC_ANNO, year_fr); + filter_fr.put(DOC_CODNUM, cod.get("CODTAB")); + filter_to.put(DOC_PROVV, "D"); + filter_to.put(DOC_ANNO, year_to); + filter_to.put(DOC_CODNUM, cod.get("CODTAB")); + cur.setregion(filter_fr, filter_to); + TString cfilter; + cfilter << DOC_CODNUM << "==\"" << cod.get("CODTAB") << '"'; + cur.setfilter(cfilter); + const long items = cur.items(); + cur.freeze(TRUE); + + // Scandisce i documenti inevasi e considera solo + // quelli con uno stato nel range corretto + for (cur = 0; cur.pos() < items; ++cur) + { + const bool evaso = curr_doc.get_bool(DOC_DOCEVASO); + if (evaso) + continue; + + TDate doc_cons = curr_doc.get(DOC_DATACONS); + if (!doc_cons.ok()) + doc_cons = curr_doc.get(DOC_DATADOC); + + if (test_status(curr_doc, a)) + { + // Scandisce le righe articolo e memorizza + // le quantita' richieste + TDocumento doc(cur.curr()); + for (int r = doc.physical_rows(); r > 0; r--) + { + // Seleziona le righe articolo non ancora evase + const TRiga_documento& riga = doc[r]; + + TDate datacons = riga.get(RDOC_DATACONS); + if (!datacons.ok()) datacons = doc_cons; + // Data consegna troppo avanti + if (datacons > date_to) + continue; + + if (riga.is_articolo()) + { + const real qta = riga.qtaresidua(); + if (qta > ZERO) + { + const TCodice_articolo art = riga.get(RDOC_CODARTMAG); + const TString16 liv = riga.get(RDOC_LIVELLO); + const TString16 mag = nomag ? EMPTY_STRING : riga.get(RDOC_CODMAG); + const TString16 imp = noimp ? EMPTY_STRING : riga.get(RDOC_IMPIANTO); + const TString16 lin = nolin ? EMPTY_STRING : riga.get(RDOC_LINEA); + const TCodice_um um = riga.get(RDOC_UMQTA); + TQuantita q(art, um, qta); + q.convert2umbase(); + TMRP_line* line = _articles.find(art, liv, mag, imp, lin, 0L); + if (line == NULL) + { + // nuova linea + line = _articles.find(art, liv, mag, imp, lin, 0L, TRUE); + line->set_description(riga.get(RDOC_DESCR)); + } + const TMRP_time t(datacons, 0, imp, lin); + line->add_gross_req(t, q.val()); + if (master) + line->add_net_req(t, q.val()); + } + } + } + } + } + cur.freeze(FALSE); + } + } + + return _articles.items() > 0L; +} + +/////////// finished: 100% +/////////// tested : 100% +bool TMatResPlanning::explode_articles(const TMatResMask& m) +{ + TDistinta_tree distinta; // albero distinta + TArray boom; // array per i figli + int level = 1; + TProgind* pi = NULL; + + // Inizializza la cache delle lavorazioni + _artinfo.init(m.get_bool(F_KEEP_IMP)); + + // Scandisce gli articoli inseriti dal gross requirements ed + // accoda tutti gli articoli risultanti dalla loro esplosione + for (long a = 0; a < _articles.items(); a++) + { + if (pi && pi->isfinished()) + { + delete pi; + pi = NULL; + } + if (pi == NULL) + { + TString80 msg; + msg.format("Fase 2: esplosione articoli (livello %d)", level++); + pi = new TProgind(_articles.items()-a, msg, TRUE, TRUE); + } + pi->addstatus(1); + if (pi->iscancelled()) + return FALSE; + + TMRP_line& line = _articles[a]; + if (distinta.set_root(line.codice())) + { + distinta.set_global("_DISTINTA", line.codice()); + distinta.set_global("_LIVELLO", line.livgiac()); + distinta.set_global("_MAGAZZINO", line.codmag()); + distinta.set_global("_IMPIANTO", line.codimp()); + distinta.set_global("_LINEA", line.codlin()); + + distinta.explode(boom, FALSE, RAGGR_EXP_UMBASE, 1, "AV"); + for (int i = 0; i < boom.items(); i++) + { + const TRiga_esplosione& riga = (const TRiga_esplosione&)boom[i]; + const TCodice_articolo& art = riga.articolo(); + const TRectype& articolo=cache().get(LF_ANAMAG,art); + bool add=TRUE; + if (!articolo.get(ANAMAG_CODART).blank()) + { + const char reorder_type=articolo.get_char(ANAMAG_RIORDINO); + if (reorder_type!='F' && reorder_type!=' ' && reorder_type!='\0') // e' a riordino + add=FALSE; + } + if (add) + { + // articolo gestito dall'MRP + TString16 mag = line.codmag(); + TString16 imp = line.codimp(); + TString16 lin = line.codlin(); + _artinfo.art2magimpline(art, mag, imp, lin); + TMRP_line* son = _articles.find(art, riga.giacenza(),mag, imp, lin, 0L); + if (son == NULL) + { + son = _articles.find(art, riga.giacenza(), mag, imp, lin, 0L, TRUE); + son->set_description(distinta.describe(art)); + } + line.add_son(riga.val(), son); + } + } + } + } + + if (pi != NULL) delete pi; + + return _articles.items() > 0; +} + +/////////// finished: 100% +/////////// tested: +bool TMatResPlanning ::build_sched_receipts(const TMatResMask& m) +{ + TDate date_fr = m.get(F_DADATA); + const int bucket_fr = m.round_date(date_fr, FALSE); + + TDate date_to = m.get(F_ADATA); + const int bucket_to = m.round_date(date_to, TRUE); + + const int year_fr = date_fr.year(); + const int year_to = date_to.year(); + + TTable num("%NUM"); + TCodice_numerazione cod; + + TRelation rel(LF_DOC); + TCursor cur(&rel); + const TRectype& curr = cur.curr(); + TRectype filter_fr(curr), filter_to(curr); + + TString_array& n = m.sfield(F_NUM_ORF).rows_array(); + TString_array& a = m.sfield(F_TIPI_ORF).rows_array(); + + TProgind pi(table_items("%NUM"), "Fase 3: caricamento arrivi futuri...", TRUE, TRUE); + + // Scandisce tutte le numerazioni considerando solo quelle + // contenenti i tipi documento specificati nella maschera + for (int err = cod.first(num); err == NOERR; err = cod.next(num)) + { + pi.addstatus(1); + if (pi.iscancelled()) + return FALSE; + + if (test_codnum(cod, n)) + { + // Filtra il cursore in modo da limitarlo alla numerazione + // corrente ed agli anni specificati dalle due date limite + filter_fr.put(DOC_PROVV, "D"); + filter_fr.put(DOC_CODNUM, cod.get("CODTAB")); + filter_fr.put(DOC_ANNO, year_fr); + filter_to.put(DOC_PROVV, "D"); + filter_to.put(DOC_CODNUM, cod.get("CODTAB")); + filter_to.put(DOC_ANNO, year_to); + cur.setregion(filter_fr, filter_to); + TString cfilter; + cfilter << DOC_CODNUM << "==" << '"' << cod.get("CODTAB") << '"' ; + cur.setfilter(cfilter); + const long items = cur.items(); + cur.freeze(TRUE); + + // Scandisce i documenti inevasi e considera solo + // quelli con uno stato nel range corretto + for (cur = 0; cur.pos() < items; ++cur) + { + const bool evaso = curr.get_bool(DOC_DOCEVASO); + if (evaso) + continue; + + if (!test_status(curr, a)) + continue; + + // Data di consegna standard + TDate doc_cons = curr.get(DOC_DATACONS); + if (!doc_cons.ok()) + doc_cons = curr.get(DOC_DATADOC); + + // Scandisce le righe articolo e memorizza + // le quantita' richieste + TDocumento doc(cur.curr()); + for (int r = doc.physical_rows(); r > 0; r--) + { + // Seleziona le righe articolo non ancora evase + const TRiga_documento& riga = doc[r]; + + TDate consegna = riga.get(RDOC_DATACONS); + if (!consegna.ok()) + consegna = doc_cons; + + // Data consegna troppo avanti + if (consegna > date_to) + continue; + + if (riga.is_articolo()) + { + const real qta = riga.qtaresidua(); + if (qta > ZERO) + { + const TCodice_articolo art = riga.get(RDOC_CODARTMAG); + const TString16 liv = riga.get(RDOC_LIVELLO); + const TString16 mag = riga.get(RDOC_CODMAG); + const TString16 imp = riga.get(RDOC_IMPIANTO); + const TString16 lin = riga.get(RDOC_LINEA); + TMRP_line* line = _articles.find(art, liv, mag, imp, lin, 0L, FALSE); + if (line != NULL) + { + const TCodice_um um = riga.get(RDOC_UMQTA); + TQuantita q(art, um, qta); + q.convert2umbase(); + + const TMRP_time t(consegna, 0, imp, lin); + line->add_sched_rec(t, q.val()); + } + } + } + } + } + cur.freeze(FALSE); + } + } + + return _articles.items() > 0L; +} + +/////////// finished: 99% +/////////// tested: 99% +bool TMatResPlanning::preprocess_cycle(const TMatResMask& m) +{ + // costruisce il gross requirement dai DOC di planning + if (build_gross_requirements(m)) + // esplode l'array mediante la DIBA + if (explode_articles(m)) + // costruisce gli sched rec degli elementi dai DOCS ordini fornitore emessi + return build_sched_receipts(m); + + return FALSE; +} + +/////////// finished: 99% +/////////// tested: +// implementa la logica che porta dal fabbisogno lordo a quello netto +// per quel bucket e riporta il balance on hand sul bucket successivo +bool TMatResPlanning::gross2net_logic(TMRP_line &curr_article, int bucket, bool lotsizing_f, bool lotsizing_p) +{ + // Verifico se esiste gia' un fabbisogno netto + real sm,tmpreal = -curr_article.net_requirement(bucket); + if (tmpreal >= ZERO) // Devo calcolare il fabbisogno netto + { + tmpreal = curr_article.on_hand(bucket); + tmpreal -= curr_article.gross_requirement(bucket); + curr_article.scorta_minima(sm, curr_article.time(bucket).date()); + tmpreal -= sm; + } + tmpreal += curr_article.sched_receipts(bucket); + + // adegua il quantitativo del fabbisogno netto in base al lot-sizing, se il valore risulta negativo + const int n_figli = curr_article.sons(); + real net_req; + if ((lotsizing_p && n_figli!=0 )||(lotsizing_f && n_figli==0) ) + net_req = curr_article.sizeup_net_requirement(bucket, tmpreal); + else + net_req = curr_article.set_net_req(bucket, -tmpreal); + + // calcola la giacenza del bucket successivo + tmpreal += net_req; + if (tmpreal > ZERO) + { + const int nb = curr_article.next_bucket(bucket); + if (nb <= curr_article.last_bucket()) + curr_article.set_on_hand(nb, tmpreal); + } + + // trasforma i fabbisogni totali nel fabbisogno lordo dei figli + net_req += curr_article.sched_receipts(bucket); + if (net_req > ZERO) + { + TMRP_time lead_time; + curr_article.lead_time(bucket, lead_time); + + for (int o = 0; o < n_figli; o++) + { + TMRP_line& article_son = curr_article.son(o); + tmpreal = net_req * curr_article.qta_son(o); + if (tmpreal > ZERO) + article_son.add_gross_req(lead_time, tmpreal); + } + } + return TRUE; +} + +/////////// finished: 99% +/////////// tested: +bool TMatResPlanning::net_requirement_cycle(const TMatResMask& m) +{ + bool ok = TRUE; + bool lotsizing_p=m.get_bool(F_LOTSIZING_P); + bool lotsizing_f=m.get_bool(F_LOTSIZING_F); + + // ordina gli articoli + const long total = _articles.sort(); + + TProgind pi(total, "Fase 4: calcolo dei fabbisogni netti", FALSE, TRUE); + + // cicla iterativamente sugli elementi di _articles + for (long a = 0; a < total; a++) + { + pi.addstatus(1); + + TMRP_line& curr_article = _articles[a]; + + const int last = curr_article.last_bucket(); + if (last >= 0) + { + real curgiac; + curr_article.set_on_hand(0, curr_article.giacenza_attuale(curgiac, m.get_date(F_DADATA))); + + for (int bucket = 0; ok && bucket <= last; bucket = curr_article.next_bucket(bucket)) + { + ok = gross2net_logic(curr_article, bucket, lotsizing_f, lotsizing_p); + if (!ok) + break; + } + } + } + return ok; +} + +/////////// finished: 100% +/////////// tested : 100% +// genera le righe degli ordini di produzione o a fornitore +bool TMatResPlanning::build_orders(TMatResMask& m) +{ + TSheet_field& sf = m.sfield(F_ORDINI); + sf.destroy(); +// TArticolo articolo; + + const long tot = _articles.items(); + if (tot > 0L) + { + const int leadtime = m.get_int(F_LEADTIME); + + TProgind pi(tot, "Fase 5: generazione righe ordini...", FALSE, TRUE); + for (long a = 0; a < tot; a++) + { + pi.addstatus(1); + const TMRP_line& line = _articles[a]; + + const TRectype& anarec = cache().get(LF_ANAMAG,line.codice()); + const TRectype& distrec = cache().get(LF_DIST,line.codice()); + const bool prod = distrec.get_bool("ARTPROD"); + const long forn = prod ? 0 : anarec.get_long("CODFORN"); + for (int b = line.last_bucket(); b >= 0; b--) + { + real qta = line.net_requirement(b); + if (!qta.is_zero() && !qta.round(5).is_zero())// > real("0.00001")) + { + TMRP_time time = line.time(b); + if (line.sons() == 0) // Sottrai alle foglie il bonus + time.sub_time(leadtime); + TDate date = time.date(); + m.round_date(date); + + //articolo.read(line.codice()); + //const char reorder_type=articolo.get_char(ANAMAG_RIORDINO); + //if (prod || reorder_type=='F' || reorder_type==' ' || reorder_type=='\0') + m.add_order_line(date, forn, line, b); + } + } + } + } + + const int orders=sf.items(); + if (orders==0) + message_box("Nessun ordine da emettere"); + real price, qta; + TCodice_articolo codart; + FOR_EACH_SHEET_ROW(sf,n,row) + { + long codcli=atol(row->get(F_FORNITORE-FIRST_FIELD)); + const TRectype& rec=cache().get(LF_DIST,row->get(F_ARTICOLO-FIRST_FIELD)); + bool art_prod = rec.get_bool("ARTPROD"); + bool art_acq = rec.get_bool("ARTACQ") || codcli!=0L; + + if (rec.empty()) // + art_prod=!(art_acq=TRUE); + TString16 tipoord=!art_acq ? "P":"F" ; + row->add(tipoord, F_ORD_TYPE-FIRST_FIELD); + sf.check_row(n); + + if (tipoord=="P") + tipoord=" "; + else + tipoord=m.get(F_TIPOCF_CONDV); + row->get(F_QUANTITA-FIRST_FIELD,qta); + row->get(F_ARTICOLO-FIRST_FIELD,codart); + find_price(m.get(F_TIPOCV),m.get(F_CODCONDV),m.get(F_CATVEN_CV), + tipoord, codcli, + codart, qta, + price); + row->add(price.string(), F_PREZZO-FIRST_FIELD); + + sf.enable_cell(n,F_ORD_TYPE-FIRST_FIELD,art_prod != art_acq); + } + return TRUE; +} + +/////////// finished: 90% +/////////// tested : 90% +// genera gli ordini di produzione o a fornitore +bool TMatResPlanning::emit_orders(TMatResMask& m) +{ + TSheet_field& sf = m.sfield(F_ORDINI); + + TDate today(TODAY); + int docf = 0, docp = 0; + TAssoc_array docs; + TToken_string key; + FOR_EACH_SHEET_ROW(sf, r, row) + { + TToken_string& riga = *row; + if (*riga.get(0) == 'X') + { + const TDate datadoc = riga.get(sf.cid2index(F_DATADOC)); + const TDate datacon = riga.get(sf.cid2index(F_DATACONS)); + const char type = riga.get_char(sf.cid2index(F_ORD_TYPE)); + const bool prod = type == 'P'; + const long forn = prod ? 0 : riga.get_long(sf.cid2index(F_FORNITORE)); + const real qta(riga.get(sf.cid2index(F_QUANTITA))); + + riga.add(" ",sf.cid2index(F_OK)); + if (qta.is_zero()) + continue; + if (datadoc < today) + if (!noyes_box("Riga %d: data di documento inferiore a quella odierna. Confermi ?",r+1)) + continue; + if (datacon < datadoc) + if (!noyes_box("Riga %d: data di consegna inferiore a quella del documento. Confermi ?",r+1)) + continue; + if (prod || forn!=0L) + { + key = datadoc.string(); + key.add(datacon.string()); + key.add(type); + key.add(forn); + TDocumento* doc = (TDocumento*)docs.objptr(key); + if (doc == NULL) + { + const TString& codnum = m.get(prod ? F_NUM_PROD : F_NUM_FORN ); + const TString& tipdoc = m.get(prod ? F_TIPO_PROD: F_TIPO_FORN ); + doc = new TDocumento('D', datadoc.year(), codnum, 0); + doc->set_tipo(tipdoc); + TRectype& testata = doc->head(); + testata.put(DOC_DATADOC, datadoc); + testata.put(DOC_DATACONS, datacon); + if (prod) + docp++; + else + { + testata.put(DOC_TIPOCF, "F"); + testata.put(DOC_CODCF, forn); + docf++; + } + docs.add(key, doc); + } + TRiga_documento& rdoc = doc->new_row(m.get(prod ? F_RIGA_PROD : F_RIGA_FORN)); + rdoc.put(RDOC_CODART, riga.get(sf.cid2index(F_ARTICOLO))); + + TString80 str; + TCodice_livelli & livelli = m.livelli_giacenza(); + livelli.pack_grpcode(str, riga.get(sf.cid2index(F_LIV1)), 1); + livelli.pack_grpcode(str, riga.get(sf.cid2index(F_LIV2)), 2); + livelli.pack_grpcode(str, riga.get(sf.cid2index(F_LIV3)), 3); + livelli.pack_grpcode(str, riga.get(sf.cid2index(F_LIV4)), 4); + rdoc.put(RDOC_LIVELLO,str); + + add_magcode(str,riga.get(sf.cid2index(F_MAGAZZINO))); + add_depcode(str,riga.get(sf.cid2index(F_DEPOSITO))); + rdoc.put(RDOC_CODMAG, str); + + rdoc.put(RDOC_IMPIANTO, riga.get(sf.cid2index(F_CODIMP))); + rdoc.put(RDOC_LINEA, riga.get(sf.cid2index(F_CODLIN))); + rdoc.put(RDOC_QTA, qta); + rdoc.put(RDOC_UMQTA, riga.get(sf.cid2index(F_UM))); + rdoc.put(RDOC_PREZZO, riga.get(sf.cid2index(F_PREZZO))); + TString ddd=riga.get(sf.cid2index(F_DESCART)); + rdoc.put(RDOC_DESCR, riga.get(sf.cid2index(F_DESCART))); + + riga.add("X",sf.cid2index(F_OK)); + } + else + error_box("Codice fornitore mancante alla riga %d", r+1); + } + } + + const int tot = int(docs.items()); + if (tot > 0 && yesno_box("Confermare la generazione di\n" + "%d ordini di produzione e di\n" + "%d odini a fornitori?", docp, docf)) + { + TProgind pi(tot, "Generazione ordini", FALSE, TRUE); + FOR_EACH_ASSOC_OBJECT(docs, hash, str, obj) + { + pi.addstatus(1); + TDocumento* doc = (TDocumento*)obj; + if (doc->write()!=NOERR) + doc->read(); // unlock + } + FOR_EACH_SHEET_ROW_BACK(sf, r, row) + { + if (*row->get(sf.cid2index(F_SELECTED)) == 'X' && *row->get(sf.cid2index(F_OK))=='X') + sf.destroy(r); + } + + m.enable(DLG_SAVEREC, sf.items() > 0); + } + + return tot > 0; +} + +void TMatResPlanning::compute(TMatResMask& m) +{ + if (preprocess_cycle(m)) // req iniziale dai docs + if (net_requirement_cycle(m)) + build_orders(m); +} + +void TMatResPlanning::main_loop() +{ + open_files(LF_TABCOM, LF_TAB, LF_DOC, LF_RIGHEDOC, 0); + open_files(LF_CLIFO, LF_CFVEN, LF_OCCAS, LF_INDSP,LF_CONDV, 0); + open_files(LF_ANAMAG, LF_DIST, LF_RDIST, 0); + open_files(LF_MAG, 0); + + TMatResMask m; + TConfig prassid(CONFIG_DITTA, "ve"); // apre il file di configurazione della ditta corrente + if (prassid.get_bool("GES", NULL, A_LISTINI)) + { + m.enable(F_CATVEN_CV,prassid.get_bool("GESLISCV")); + } + else + { + m.disable(F_TIPOCV); + m.disable(F_CATVEN_CV); + } + if (!prassid.get_bool("GES", NULL, A_CONTRATTI) || + !prassid.get_bool("GESCONCC")) + m.disable(F_TIPOCF_CONDV); + + while (m.run()!=K_QUIT); +} + +int mr2100(int argc, char* argv[]) +{ + TMatResPlanning a; + a.run(argc, argv, "Material Requirements Planning"); + return 0; +} + diff --git a/mr/mr2100.h b/mr/mr2100.h new file mode 100755 index 000000000..dfe4aa1a1 --- /dev/null +++ b/mr/mr2100.h @@ -0,0 +1,159 @@ +#ifndef __MR2100_H +#define __MR2100_H + +class TMRP_record : public TObject +{ + TMRP_time _time; // time + real _gross_requirement; // gross req + real _on_hand; // projected on hand + real _sched_receipts; // scheduled receipts + real _released_receipts; // released scheduled receipts (not used) + real _net_requirement; // lot-sized net requirement + real _planned_orders; // anticipated planned orders + +public: + const real& gross_requirement() const { return _gross_requirement; } + const real& on_hand() const { return _on_hand > ZERO ? _on_hand : ZERO; } + const real& sched_receipts() const { return _sched_receipts; } + const real& net_requirement() const { return _net_requirement; } + const real& planned_orders() const { return _planned_orders; } + + const real& set_on_hand(const real & val) { return _on_hand=val;} + const real& set_net_req(const real & val) { return _net_requirement=val;} + const real& add_net_req(const real & val); + const real& add_gross_req(const real& val); + const real& add_sched_rec(const real& val); + + TMRP_record & operator=(const TMRP_record & a); + + const TMRP_time& time() const { return _time; } + virtual TObject* dup() const; + + TMRP_record(const TMRP_time& t); + virtual ~TMRP_record() { } +}; + + +class TMRP_line : public TSortable +{ + TCodice_articolo _codart; + TString16 _livgiac; + TString16 _codmag; + TString16 _codimp; + TString16 _codlin; + long _codcli; +static TArticolo_giacenza *_articolo_giac; + +protected: + TArray _req_per_bucket; + + TPointer_array _sons; + TArray _qta_sons; + + TString _description; + + bool is_son(const TCodice_articolo& art) const; + + void lotti_riordino(real & minimo, real & increm) const ; +public: + TMRP_record& record(int i) const; + TMRP_record& record(const TMRP_time& t) const; + + const TCodice_articolo& codice() const { return _codart; } + const TString& livgiac() const { return _livgiac; } + const TString& codmag() const { return _codmag; } + const TString& codimp() const { return _codimp; } + const TString& codlin() const { return _codlin; } + long codcli() const { return _codcli; } + const TString& description() const { return _description; } + + virtual int compare(const TSortable& s) const; + int first_bucket(int i) const { return _req_per_bucket.first(); } + int last_bucket() const { return _req_per_bucket.last(); } + int next_bucket(int i) const { return _req_per_bucket.succ(i); } + + int add_son(const real& qta, TMRP_line* son); + int sons() const { return _sons.items(); } + const TMRP_line& son(int i) const { return (const TMRP_line&)_sons[i]; } + TMRP_line& son(int i) { return (TMRP_line&)_sons[i]; } + const real& qta_son(int i) const { return (const real&)_qta_sons[i]; } + + const real & on_hand(int i) const + {return record(i).on_hand();} + + const real & gross_requirement(int i) const + {return record(i).gross_requirement();} + + const real & net_requirement(int i) const + {return record(i).net_requirement();} + + const real & sched_receipts(int i) const + {return record(i).sched_receipts();} + + const real & planned_orders(int i) const + {return record(i).planned_orders();} + + const TString& set_description(const TString &s) { return _description=s; } + + const real& set_on_hand(int i, const real& val); + const real& set_on_hand(const TMRP_time& t, const real& val); + + const real& add_gross_req(const TMRP_time& t, const real& val); + const real& add_sched_rec(const TMRP_time& t, const real& val); + + const real& add_net_req(const TMRP_time& t, const real& val); + const real& set_net_req(int i, const real& val); + real sizeup_net_requirement(int i, const real& val); + + real& giacenza_attuale(real&) const; + real& giacenza_attuale(real&, const TDate & data_attuale) const; + real &scorta_minima(real&) const; + real &scorta_minima(real&, const TDate & data) const; + + const TMRP_time& lead_time(int i, TMRP_time& t) const; + + const TMRP_time& time(int i) const { return record(i).time(); } + + virtual TObject* dup() const; + TMRP_line & operator=(const TMRP_line & a); + + TMRP_line(const char* art, const char* giac, + const char* magdep, const char* imp, const char* lin, + long codcli); + TMRP_line(const TMRP_line&a); + virtual ~TMRP_line() { } +}; + +class TMRP_lines : public TMRP_array +{ + bool _ignore_mag; + bool _ignore_imp; + bool _ignore_lin; + +protected: + virtual TSortable* new_obj(const TToken_string& key) const; + +public: + TMRP_line* find(const TCodice_articolo& codart, + const TString& giac, const TString& mag, + const TString& imp, const TString& lin, + long codcli, + bool create=FALSE); + + TMRP_line& operator[](long n) const + { return (TMRP_line&)find_obj(n); } + + void ignore(bool im, bool ii, bool il) + { _ignore_mag = im; _ignore_imp = ii; _ignore_lin = il; } + + virtual TObject* dup() const; + TMRP_lines & operator= (const TMRP_lines &a); + + TMRP_lines(); + TMRP_lines(const TMRP_lines &a); + virtual ~TMRP_lines(); +}; + + +#endif + diff --git a/mr/mr2100a.h b/mr/mr2100a.h new file mode 100755 index 000000000..a118b171d --- /dev/null +++ b/mr/mr2100a.h @@ -0,0 +1,75 @@ +#ifndef __MR2100A_H +#define __MR2100A_H + +#define F_PROFILO 200 +#define F_NUM_ORC 201 +#define F_TIPI_ORC 202 +#define F_NUM_ORF 203 +#define F_TIPI_ORF 204 +#define F_DADATA 206 +#define F_ADATA 207 +#define F_BUCKETS 208 +#define F_BUCKET 209 +#define F_NUM_PROD 210 +#define F_TIPO_PROD 211 +#define F_RIGA_PROD 212 +#define F_NUM_FORN 213 +#define F_TIPO_FORN 214 +#define F_RIGA_FORN 215 +#define F_NOMAG 216 +#define F_NOIMP 217 +#define F_NOLIN 218 +#define F_KEEP_IMP 219 +#define F_LEADTIME 220 +#define F_ORC_MASTER 221 +#define F_SORT 222 +#define F_LOTSIZING_P 223 +#define F_LOTSIZING_F 224 +#define F_TIPOCV 225 +#define F_CODCONDV 226 +#define F_CATVEN_CV 227 +#define F_TIPOCF_CONDV 228 +#define F_CF_CONDV 229 + +#define F_YEAR 301 +#define F_IMPIANTO 302 +#define F_LINEA 303 +#define F_CALENDAR 304 +#define F_ORDINI 401 +#define F_SORT_ORDINI 402 +#define F_SELECT_ORDF 403 +#define F_SELECT_ORDP 404 + +#define F_TIPO 101 +#define F_DASTATO 102 +#define F_ASTATO 103 +#define F_DESCTIPO 104 + +#define F_SELECTED 101 +#define F_ORD_TYPE 102 +#define F_DATADOC 103 +#define F_DATACONS 104 +#define F_FORNITORE 105 +#define F_ARTICOLO 106 +#define F_LIV1 107 +#define F_LIV2 108 +#define F_LIV3 109 +#define F_LIV4 110 +#define F_MAGAZZINO 111 +#define F_DEPOSITO 112 +#define F_CODIMP 113 +#define F_CODLIN 114 +#define F_QUANTITA 115 +#define F_UM 116 +#define F_PREZZO 117 +#define F_DESCART 118 +#define F_OK 119 + +#define F_RAGSOC 154 +#define F_DESCMAG 160 +#define F_DESCIMP 162 +#define F_DESCLIN 163 +#define H_CODIMP 164 + +#endif + diff --git a/mr/mr2100a.uml b/mr/mr2100a.uml new file mode 100755 index 000000000..e926cf2c0 --- /dev/null +++ b/mr/mr2100a.uml @@ -0,0 +1,903 @@ +#include "mr2100a.h" +#include "mr2url.h" + +TOOLBAR "Toolbar" 0 -3 -1 -1 + +STRING DLG_PROFILE 50 +BEGIN + PROMPT 1 0 "Profilo " + PSELECT +END + +BUTTON DLG_ELABORA 10 2 +BEGIN + PROMPT -15 -1 "~Elabora" + PICTURE BMP_ELABORA +END + +BUTTON DLG_SAVEREC 10 2 +BEGIN + PROMPT -25 -1 "~Registra" + PICTURE BMP_SAVEREC + PICTURE BMP_SAVERECDN + FLAGS "D" +END + +BUTTON DLG_EDIT 10 2 +BEGIN + PROMPT -35 -1 "~Modifica" + MESSAGE RUN,ve0,-1 + PICTURE BMP_EDIT +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -45 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -55 -1 "~Fine" + PICTURE BMP_QUIT + PICTURE BMP_QUITDN +END + +ENDPAGE + +PAGE "Query" -1 -1 80 19 + +GROUPBOX DLG_NULL 78 7 +BEGIN + PROMPT 1 2 "@bParametri dell'elaborazione" +END + +DATE F_DADATA +BEGIN + PROMPT 2 4 "Dalla data " + CHECKTYPE REQUIRED + GROUP 1 +END + +DATE F_ADATA +BEGIN + PROMPT 45 4 "Alla data " + CHECKTYPE REQUIRED + VALIDATE DATE_CMP_FUNC > F_DADATA + WARNING "La data finale deve essere maggiore di quella iniziale" + GROUP 1 +END + +LIST F_BUCKETS 1 15 +BEGIN + GROUP 1 + PROMPT 2 6 "Bucket temporale " + ITEM "1|1 Settimana" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + ITEM "2|2 Settimane" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + ITEM "4|1 Mese" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + ITEM "8|2 Mese" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + ITEM "13|3 Mesi" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + ITEM "17|4 Mesi" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + ITEM "26|6 Mesi" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + ITEM "52|1 Anno" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET + ITEM " |Personalizzato" + MESSAGE ENABLE,F_BUCKET +END + +NUMBER F_BUCKET 2 +BEGIN + GROUP 1 + PROMPT 45 6 "Settimane " + FLAGS "U" + CHECKTYPE REQUIRED +END + +BOOLEAN F_NOMAG +BEGIN + PROMPT 2 10 "Non suddividere per magazzini" +END + +BOOLEAN F_NOIMP +BEGIN + PROMPT 2 11 "Non suddividere per impianti" +END + +BOOLEAN F_NOLIN +BEGIN + PROMPT 2 12 "Non suddividere per linee" +END + +BOOLEAN F_KEEP_IMP +BEGIN + GROUP 1 + PROMPT 2 13 "Mantieni la produzione all'interno dello stesso impianto" +END + +BOOLEAN F_LOTSIZING_F +BEGIN + GROUP 1 + PROMPT 2 15 "Lotti minimi sugli ordini di acquisto" +END + +BOOLEAN F_LOTSIZING_P +BEGIN + GROUP 1 + PROMPT 2 16 "Lotti minimi sugli ordini di produzione" +END + +NUMBER F_LEADTIME 2 +BEGIN + GROUP 1 + PROMPT 2 17 "Lead time aggiuntivo sui materiali " + FLAGS "U" +END + +ENDPAGE + +PAGE "Parametri" -1 -1 80 19 + +LIST F_ORC_MASTER 1 20 +BEGIN + GROUP 1 + PROMPT 1 0 "" + ITEM "O|Ordini da clienti" + ITEM "M|Master Schedule Plan" +END + +SPREADSHEET F_NUM_ORC 8 6 +BEGIN + GROUP 1 + PROMPT 1 1 "" + ITEM "Codice" +END + +SPREADSHEET F_TIPI_ORC 62 6 +BEGIN + GROUP 1 + PROMPT 16 1 "" + ITEM "Tipo@4" + ITEM "Da stato" + ITEM "A stato" + ITEM "Descrizione@50" +END + +TEXT DLG_NULL +BEGIN + PROMPT 1 8 "@bOrdini produzione/fornitori" +END + +SPREADSHEET F_NUM_ORF 8 6 +BEGIN + GROUP 1 + PROMPT 1 9 "" + ITEM "Codice" +END + +SPREADSHEET F_TIPI_ORF 62 6 +BEGIN + GROUP 1 + PROMPT 16 9 "" + ITEM "Tipo@4" + ITEM "Da stato" + ITEM "A stato" + ITEM "Descrizione@50" +END + +TEXT DLG_NULL +BEGIN + PROMPT 2 16 "@bOrdini di produzione" +END + +STRING F_NUM_PROD 4 +BEGIN + GROUP 1 + PROMPT 27 16 "Numerazione " + FLAGS "U" + USE %NUM + INPUT CODTAB F_NUM_PROD + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_NUM_PROD CODTAB + CHECKTYPE REQUIRED + ADD NONE +END + +STRING F_TIPO_PROD 4 +BEGIN + GROUP 1 + PROMPT 50 16 "Tipo " + FLAGS "U" + USE %TIP + INPUT CODTAB F_TIPO_PROD + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_TIPO_PROD CODTAB + CHECKTYPE REQUIRED + ADD NONE +END + +STRING F_RIGA_PROD 4 +BEGIN + GROUP 1 + PROMPT 66 16 "Riga " + FLAGS "U" + USE %TRI SELECT S7=="M" + INPUT CODTAB F_RIGA_PROD + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_RIGA_PROD CODTAB + CHECKTYPE REQUIRED + ADD NONE +END + +TEXT DLG_NULL +BEGIN + PROMPT 2 17 "@bOrdini a fornitori" +END + +STRING F_NUM_FORN 4 +BEGIN + GROUP 1 + PROMPT 27 17 "Numerazione " + FLAGS "U" + COPY USE F_NUM_PROD + INPUT CODTAB F_NUM_FORN + COPY DISPLAY F_NUM_PROD + OUTPUT F_NUM_FORN CODTAB + CHECKTYPE REQUIRED + ADD NONE +END + +STRING F_TIPO_FORN 4 +BEGIN + GROUP 1 + PROMPT 50 17 "Tipo " + FLAGS "U" + COPY USE F_TIPO_PROD + INPUT CODTAB F_TIPO_FORN + COPY DISPLAY F_TIPO_PROD + OUTPUT F_TIPO_FORN CODTAB + CHECKTYPE REQUIRED + ADD NONE +END + +STRING F_RIGA_FORN 4 +BEGIN + GROUP 1 + PROMPT 66 17 "Riga " + FLAGS "U" + COPY USE F_RIGA_PROD + INPUT CODTAB F_RIGA_FORN + COPY DISPLAY F_RIGA_PROD + OUTPUT F_RIGA_FORN CODTAB + CHECKTYPE REQUIRED + ADD NONE +END + +LIST F_TIPOCV 10 +BEGIN + GROUP 1 + PROMPT 2 18 "Preleva i prezzi da " + ITEM "|Anagrafica" + MESSAGE HIDE,F_CODCONDV|HIDE,F_TIPOCF_CONDV|HIDE,F_CATVEN_CV|CHECK,F_CODCONDV + ITEM "L|Listino" + MESSAGE SHOW,F_CODCONDV|HIDE,F_TIPOCF_CONDV|SHOW,F_CATVEN_CV|CHECK,F_CODCONDV + ITEM "C|Contratto" + MESSAGE SHOW,F_CODCONDV|SHOW,F_TIPOCF_CONDV|HIDE,F_CATVEN_CV|CHECK,F_CODCONDV + ITEM "O|Offerta" + MESSAGE SHOW,F_CODCONDV|HIDE,F_TIPOCF_CONDV|HIDE,F_CATVEN_CV|CHECK,F_CODCONDV +END + +STRING F_CODCONDV 3 +BEGIN + PROMPT 36 18 "" + USE LF_CONDV + INPUT TIPO F_TIPOCV + INPUT CATVEN F_CATVEN_CV + INPUT COD F_CODCONDV + INPUT TIPOCF F_TIPOCF_CONDV + + DISPLAY "" TIPO + DISPLAY "Cat.ven." CATVEN + DISPLAY "" TIPOCF + DISPLAY "Cli/for@10" CODCF + DISPLAY "Codice" COD + DISPLAY "Descrizione@30" DESCR + + OUTPUT F_TIPOCV TIPO + OUTPUT F_CATVEN_CV CATVEN + OUTPUT F_TIPOCF_CONDV TIPOCF + OUTPUT F_CODCONDV COD +END + +STRING F_CATVEN_CV 2 +BEGIN + PROMPT 43 18 "Categoria di vendita " + USE CVE + INPUT CODTAB F_CATVEN_CV + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione @50" S0 + OUTPUT F_CATVEN_CV CODTAB + CHECKTYPE REQUIRED +END + + +LIST F_TIPOCF_CONDV 9 +BEGIN + PROMPT 43 18 "" + ITEM "C|Cliente" + ITEM "F|Fornitore" +END + +ENDPAGE + +PAGE "Fabbisogni" -1 -1 78 20 + +BUTTON F_SELECT_ORDP 20 2 +BEGIN + PROMPT 1 1 "Ordini di produzione" + PICTURE USER_BMP_SELECT_ORDP +END + +BUTTON F_SELECT_ORDF 20 2 +BEGIN + PROMPT 24 1 "Ordini a fornitore" + PICTURE USER_BMP_SELECT_ORDF +END + +LIST F_SORT_ORDINI 40 +BEGIN + PROMPT 1 3 "Ordina per " + ITEM "1|Data / fornitore / articolo" + ITEM "2|Data / articolo / fornitore" + ITEM "3|Fornitore / articolo / data" + ITEM "4|Fornitore / data / articolo" + ITEM "5|Articolo / fornitore / data" + ITEM "6|Articolo / data / fornitore" +END + +SPREADSHEET F_ORDINI +BEGIN + PROMPT 0 4 "" + ITEM "@1" + ITEM "@1" + ITEM "Documento@10" + ITEM "Consegna@10" + ITEM "Fornit." + ITEM "Codice Articolo@20" + ITEM "Liv.1@10" + ITEM "Liv.2@10" + ITEM "Liv.3@10" + ITEM "Liv.4@10" + ITEM "Mag@3" + ITEM "Dep@2" + ITEM "Imp.@5" + ITEM "Linea@5" + ITEM "Quantita'@18" + ITEM "UM." + ITEM "Prezzo@18" + ITEM "Descrizione@50" + DEFAULT NONE +END + + +//TEXT DLG_NULL +//BEGIN +// PROMPT 1 -1 "Premere il bottone (+) in alto a destra della tabella per riordinarla" +//END + +ENDPAGE + +PAGE "Calendario" -1 -1 78 20 + +NUMBER F_YEAR 4 +BEGIN + PROMPT 1 1 "Anno " + FLAGS "A" +END + +STRING F_LINEA 5 +BEGIN + PROMPT 25 1 "Linea " + FLAGS "UZ" + USE LNP + INPUT CODTAB F_LINEA + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_LINEA CODTAB + OUTPUT F_IMPIANTO S6 + CHECKTYPE NORMAL +END + +STRING F_IMPIANTO 5 +BEGIN + PROMPT 50 1 "Impianto " + FLAGS "UZ" + USE IMP + INPUT CODTAB F_IMPIANTO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_IMPIANTO CODTAB + CHECKTYPE NORMAL +END + +CALENDAR F_CALENDAR -3 -1 +BEGIN + PROMPT 0 2 "" +END + +ENDPAGE + + +ENDMASK + + +PAGE "Numerazioni clienti" -1 -1 60 6 + +STRING F_TIPO 4 +BEGIN + PROMPT 1 1 "Codice " + FLAGS "U" + USE %NUM + INPUT CODTAB F_TIPO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_TIPO CODTAB + OUTPUT F_DESCTIPO S0 + CHECKTYPE REQUIRED + ADD NONE +END + +STRING F_DESCTIPO 50 +BEGIN + PROMPT 16 1 "" + USE %NUM KEY 2 + INPUT S0 F_DESCTIPO + DISPLAY "Descrizione@70" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_TIPO + CHECKTYPE REQUIRED + ADD NONE +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK + +PAGE "Ordini clienti" -1 -1 60 10 + +STRING F_TIPO 4 +BEGIN + PROMPT 1 1 "Tipo " + FLAGS "U" + USE %TIP + INPUT CODTAB F_TIPO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_TIPO CODTAB + OUTPUT F_DESCTIPO S0 + CHECKTYPE REQUIRED + ADD NONE +END + +NUMBER F_DASTATO 1 +BEGIN + PROMPT 1 2 "Da stato " + USE %STD + INPUT CODTAB F_DASTATO + DISPLAY "Stato" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_DASTATO CODTAB + CHECKTYPE REQUIRED + ADD NONE +END + +NUMBER F_ASTATO 1 +BEGIN + PROMPT 16 2 "A stato " + COPY USE F_DASTATO + INPUT CODTAB F_ASTATO + COPY DISPLAY F_DASTATO + OUTPUT F_ASTATO CODTAB + CHECKTYPE REQUIRED + ADD NONE +END + +STRING F_DESCTIPO 50 +BEGIN + PROMPT 16 1 "" + USE %TIP KEY 2 + INPUT S0 F_DESCTIPO + DISPLAY "Descrizione@70" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_TIPO + CHECKTYPE REQUIRED + ADD NONE +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK + + +PAGE "Numerazioni fornitori" -1 -1 60 6 + +STRING F_TIPO 4 +BEGIN + PROMPT 1 1 "Codice " + FLAGS "U" + USE %NUM + INPUT CODTAB F_TIPO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_TIPO CODTAB + OUTPUT F_DESCTIPO S0 + CHECKTYPE REQUIRED + ADD NONE +END + +STRING F_DESCTIPO 50 +BEGIN + PROMPT 16 1 "" + USE %NUM KEY 2 + INPUT S0 F_DESCTIPO + DISPLAY "Descrizione@70" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_TIPO + CHECKTYPE REQUIRED + ADD NONE +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK + + +PAGE "Ordini fornitori" -1 -1 60 10 + +STRING F_TIPO 4 +BEGIN + PROMPT 1 1 "Tipo " + FLAGS "U" + USE %TIP + INPUT CODTAB F_TIPO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_TIPO CODTAB + OUTPUT F_DESCTIPO S0 + CHECKTYPE REQUIRED + ADD NONE +END + +NUMBER F_DASTATO 1 +BEGIN + PROMPT 1 2 "Da stato " + USE %STD + INPUT CODTAB F_DASTATO + DISPLAY "Stato" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_DASTATO CODTAB + CHECKTYPE REQUIRED + ADD NONE +END + +NUMBER F_ASTATO 1 +BEGIN + PROMPT 16 2 "A stato " + COPY USE F_DASTATO + INPUT CODTAB F_ASTATO + COPY DISPLAY F_DASTATO + OUTPUT F_ASTATO CODTAB + CHECKTYPE REQUIRED + ADD NONE +END + +STRING F_DESCTIPO 50 +BEGIN + PROMPT 16 1 "" + USE %TIP KEY 2 + INPUT S0 F_DESCTIPO + DISPLAY "Descrizione@70" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_TIPO + CHECKTYPE REQUIRED + ADD NONE +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK + +PAGE "Righe ordini" -1 -1 70 15 + +BOOLEAN F_SELECTED +BEGIN + PROMPT 1 1 "Riga selezionata per la generazione" +END + +LIST F_ORD_TYPE 1 14 +BEGIN + FLAGS "G" + PROMPT 46 1 "Ordine " + ITEM "F|Fornitore" + MESSAGE ENABLE,F_FORNITORE|ENABLE,F_RAGSOC + ITEM "P|Produzione" + MESSAGE CLEAR,F_FORNITORE|CLEAR,F_RAGSOC +END + +DATE F_DATADOC +BEGIN + PROMPT 1 2 "Data doc. " + CHECKTYPE REQUIRED + FIELD DATADOC +END + +DATE F_DATACONS +BEGIN + PROMPT 39 2 "Data consegna " + CHECKTYPE REQUIRED + VALIDATE DATE_CMP_FUNC >= F_DATADOC + FIELD DATACONS + WARNING "Data di consegna inferiore a quella del documento" +END + +NUMBER F_FORNITORE 6 +BEGIN + PROMPT 1 3 "Fornitore " + USE LF_CLIFO + INPUT TIPOCF "F" + INPUT CODCF F_FORNITORE + DISPLAY "Codice" CODCF + DISPLAY "Descrizione@50" RAGSOC + OUTPUT F_FORNITORE CODCF + OUTPUT F_RAGSOC RAGSOC + FIELD CODCF + CHECKTYPE REQUIRED + GROUP 2 +END + +STRING F_RAGSOC 50 37 +BEGIN + PROMPT 24 3 "" + USE LF_CLIFO KEY 2 + INPUT TIPOCF "F" + INPUT RAGSOC F_RAGSOC + DISPLAY "Descrizione@50" RAGSOC + DISPLAY "Codice@16" CODCF + COPY OUTPUT F_FORNITORE + CHECKTYPE REQUIRED + GROUP 2 +END + +STRING F_ARTICOLO 20 +BEGIN + PROMPT 1 4 "Articolo " + FLAGS "D" +END + +STRING F_DESCART 50 +BEGIN + PROMPT 1 5 "Descrizione " + FLAGS "D" +END + +STRING F_LIV1 10 +BEGIN + PROMPT 1 6 "Giacenza " +END + +STRING F_LIV2 10 +BEGIN + PROMPT 27 6 "Giacenza " +END + +STRING F_LIV3 10 +BEGIN + PROMPT 1 7 "Giacenza " +END + +STRING F_LIV4 10 +BEGIN + PROMPT 27 7 "Giacenza " +END + +STRING F_MAGAZZINO 3 +BEGIN + PROMPT 1 8 "Magazzino " + FLAGS "U" + USE MAG + INPUT CODTAB[1,3] F_MAGAZZINO + INPUT CODTAB[4,5] F_DEPOSITO + DISPLAY "Magazzino" CODTAB[1,3] + DISPLAY "Deposito" CODTAB[4,5] + DISPLAY "Descrizione@50" S0 + OUTPUT F_MAGAZZINO CODTAB[1,3] + OUTPUT F_DEPOSITO CODTAB[4,5] + OUTPUT F_DESCMAG S0 + CHECKTYPE NORMAL +END + +STRING F_DEPOSITO 2 +BEGIN + PROMPT 19 8 "" + FLAGS "U" + COPY ALL F_MAGAZZINO + CHECKTYPE NORMAL +END + +STRING F_DESCMAG 50 37 +BEGIN + PROMPT 24 8 "" + USE MAG KEY 2 + INPUT S0 F_DESCMAG + DISPLAY "Descrizione@50" S0 + DISPLAY "Magazzino" CODTAB[1,3] + DISPLAY "Deposito" CODTAB[4,5] + COPY OUTPUT F_MAGAZZINO + CHECKTYPE NORMAL +END + +STRING H_CODIMP 5 +BEGIN + PROMPT 1 9 "Impianto " + FLAGS "UGH" + MESSAGE EMPTY COPY,H_CODIMP + MESSAGE COPY,F_CODIMP|CHECK,F_CODIMP +END + +STRING F_CODIMP 5 +BEGIN + PROMPT 1 9 "Impianto " + FLAGS "UZ" + USE IMP + INPUT CODTAB F_CODIMP + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODIMP CODTAB + OUTPUT F_DESCIMP S0 + CHECKTYPE NORMAL +END + +STRING F_DESCIMP 50 37 +BEGIN + PROMPT 24 9 "" + FLAGS "U" + USE IMP KEY 2 + INPUT S0 F_DESCIMP + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice@16" CODTAB + COPY OUTPUT F_CODIMP + CHECKTYPE NORMAL +END + +STRING F_CODLIN 5 +BEGIN + PROMPT 1 10 "Linea " + FLAGS "UZ" + USE LNP + INPUT CODTAB F_CODLIN + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODLIN CODTAB + OUTPUT F_DESCLIN S0 + OUTPUT H_CODIMP S6 + CHECKTYPE NORMAL +END + +STRING F_DESCLIN 50 37 +BEGIN + PROMPT 24 10 "" + USE LNP KEY 2 + INPUT S0 F_DESCLIN + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice@16" CODTAB + COPY OUTPUT F_CODLIN + CHECKTYPE NORMAL +END + +NUMBER F_QUANTITA 18 5 +BEGIN + PROMPT 1 11 "Quantita' " + PICTURE ".5" + FLAGS "U" + CHECKTYPE REQUIRED +END + +STRING F_UM 2 +BEGIN + PROMPT 44 11 "Unita' di misura " + FLAGS "D" +END + +NUMBER F_PREZZO 18 3 +BEGIN + PROMPT 1 12 "Prezzo " +END + +BOOL F_OK +BEGIN + PROMPT 44 11 "OK" + FLAGS "H" +END + + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +ENDMASK diff --git a/mr/mr2200.cpp b/mr/mr2200.cpp new file mode 100755 index 000000000..2976710cc --- /dev/null +++ b/mr/mr2200.cpp @@ -0,0 +1,3801 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "mrplib.h" +#include "../mg/mglib.h" +#include "../ve/velib.h" +#include "../ve/veconf.h" + +#include "mr2100.h" + +#include "mr2200a.h" +#include "mr2200b.h" + + +const real MAXCAPACITY("999999999.99"); +/////////////////////////////////////////////////////////// +// triga ordine +/////////////////////////////////////////////////////////// +#define SORT_BY_CAL -1 // cliente / articolo / impianto-linea +#define SORT_BY_CLA -2 // +#define SORT_BY_ALC -3 // +#define SORT_BY_ACL -4 // +#define SORT_BY_LAC -5 // +#define SORT_BY_LCA -6 // + +enum TMSP_mode {_actual_schedule, _stock_break}; +enum TMSP_logic {_first_fit_logic, _JIT_logic}; + + +class TMSP_constraint; +class TMSP_constraints; +class TMSP_mask; + +class TRiga_articolo : public TToken_string +{ +public: +static int order_compare(TSheet_field & s, int i1, int i2, int level); +static int order_compare( const TToken_string& r1 , const TToken_string& r2 , int level); +static int compare_field(TString &str0, TString &str1,short field_no) ; +static int order_compareCAL(TSheet_field & s, int i1, int i2); +static int order_compareCLA(TSheet_field & s, int i1, int i2); +static int order_compareALC(TSheet_field & s, int i1, int i2); +static int order_compareACL(TSheet_field & s, int i1, int i2); +static int order_compareLAC(TSheet_field & s, int i1, int i2); +static int order_compareLCA(TSheet_field & s, int i1, int i2); +static bool find_block(const TSheet_field& sf, const int riga, int &first_row, int &last_row ); + + int compare(const TToken_string& r, int level) const; + TRiga_articolo& operator=(TToken_string& r); + TRiga_articolo& operator+=(TRiga_articolo& r); + + TRiga_articolo() : TToken_string(128) { } + TRiga_articolo(const TMSP_constraint & line); + virtual ~TRiga_articolo() { } +}; + +/////////////////////////////////////////////////////////// +// TMSP_record +/////////////////////////////////////////////////////////// + +class TMSP_record : public TObject +{ +public: + long _numdoc; + int _numrig; + real _qta; + real _price; + + TMSP_record() : _numdoc(0L), _numrig(0) { } +}; + +/////////////////////////////////////////////////////////// +// TMSP_record_array; +/////////////////////////////////////////////////////////// + +class TMSP_record_array : public TObject +{ + TArray _buckets; + +public: + int items() const { return _buckets.items(); } + int last() const { return _buckets.last(); } + int pred(int i) const { return _buckets.pred(i); } + + TMSP_record& operator[](int b); +}; + +/////////////////////////////////////////////////////////// +// TCRP_line ; carichi di linea +/////////////////////////////////////////////////////////// + +class TCapacita_prod : public TSortable +{ + real _capacity; // Capacita' macchina + real _human_capacity; // Capacita' macchina + real _load; // Carico macchina + real _human_load; // Carico uomo + +// static TDecoder* _umart1; // Decoder per trovare unita' base articolo +// static TDecoder* _umart2; // Decoder per trovare conversione +// static TDecoder* _umdist; // Decoder per trovare unita' base distinta + +protected: + virtual int compare(const TSortable& s) const; + virtual TObject* dup() const { return new TCapacita_prod(*this); } + + void copy(const TCapacita_prod& q); + real get_factor(const TCodice_um& um) const; + void convert(real& val, const TCodice_um& from_um, const TCodice_um& to_um) const; + +public: + const TCapacita_prod& operator =(const TCapacita_prod& q) + { copy(q); return q; } + + void set(const real& cap, const real& load); + void set_capacity(const real& cap){_capacity=cap;} + void set_human_capacity(const real& cap){_human_capacity=cap;} + void set_load(const real& load) {_load=load;} + void set_human_load(const real& load) {_human_load=load;} + + void add_capacity(const real& cap){_capacity+=cap;} + void add_human_capacity(const real& cap){_human_capacity+=cap;} + void add_load(const real& load) {_load+=load;} + void add_human_load(const real& load) {_human_load+=load;} + + real & capacity() {return _capacity;} + real & load() {return _load;} + real & human_capacity() {return _human_capacity;} + real & human_load() {return _human_load;} + + TCapacita_prod (); + TCapacita_prod (const real& cap, const real& load); + TCapacita_prod (const TCapacita_prod & q) { copy(q); } + virtual ~TCapacita_prod () {} +}; + + +class TCRP_line : public TSortable +{ + TString8 _lineap, _imp; + TString _desc; + bool _on_sheet; + + TArray _bucket; + + +protected: + virtual int compare(const TSortable& s) const; + TCapacita_prod& bucket(int n) ; + TCapacita_prod& operator[](int n) + {return bucket(n);} + +public: + + const TString& codimp() const { return _imp; } + const TString& codlin() const { return _lineap; } + const TString& desc() const { return _desc; } + void set_desc(const char* str) { _desc = str; } + + int last() const { return _bucket.last(); } + int pred(int i) const { return _bucket.pred(i); } + + real& capacity(int b) { return bucket(b).capacity(); } + real& load(int b) { return bucket(b).load(); } + real& human_capacity(int b) { return bucket(b).human_capacity(); } + real& human_load(int b) { return bucket(b).human_load(); } + + void set_capacity(int b,const real & v ) { bucket(b).set_capacity(v); } + void set_human_capacity(int b,const real & v ) { bucket(b).set_human_capacity(v); } +// void set_load(int b, const real & v) { bucket(b).set_load(v); } +// void set_human_capacity(int b,const real & v ) { bucket(b).set_human_capacity(v); } +// void set_human_load(int b, const real & v) { bucket(b).set_human_load(v); } + +// void add_capacity(int b,const real & v ) { bucket(b).add_capacity(v); } + void add_load(int b, const real & v) { bucket(b).add_load(v); } +// void add_human_capacity(int b,const real & v ) { bucket(b).add_human_capacity(v); } + void add_human_load(int b, const real & v) { bucket(b).add_human_load(v); } + + void fill_capacity_row(TToken_string& row, bool percent=FALSE); + void fill_load_row(TToken_string& row, bool percent=FALSE); + void fill_hcapacity_row(TToken_string& row, bool percent=FALSE); + void fill_hload_row(TToken_string& row, bool percent=FALSE); + + bool is_on_sheet() const { return _on_sheet; } + void set_on_sheet(bool on = TRUE) { _on_sheet = on; } + + //TCRP_line(const TString& codlin); + TCRP_line(const TString& codimp,const TString& codlin); + virtual ~TCRP_line() { } +}; + + +class TCRP_lines : public TMRP_array +{ +protected: + virtual TSortable* new_obj(const TToken_string& key) const; + +public: + TCRP_line* find(const TLinea_prod& linea_prod, + const char * codart="", long codcli=0L, bool create=FALSE); + TCRP_line* find(const char * codimp="", const char * codlin="", + const char * codart="", long codcli=0L, bool create=FALSE); + TCRP_line& operator[](long n) const + { return (TCRP_line&)find_obj(n); } +}; + +class TMaster_code : public TObject +{ + TString _code; + TString _liv; + TString _um; + TString _codimp; + TString _codlin; + TString _codmag; + real _expr; + real _leadtime; +public: + const char *articolo() const {return _code;} + const char *livello() const {return _liv;} + const char *um() const {return _um;} + const real &expr() const {return _expr;} + const real &leadtime() const {return _leadtime;} + const char *codimp() const {return _codimp;} + const char *codlin() const {return _codlin;} + const char *codmag() const {return _codmag;} + + TMaster_code(const char *code, const char *liv, const char *ummaster, const real &expr, const real &leadtime, const char *codimp, const char *codlin, const char *codmag); + TMaster_code(const char *code, const char *liv,const char *ummaster, const real &expr, int leadtime, const char *codimp, const char *codlin, const char *codmag); + virtual ~TMaster_code() {} +}; + +class TMSP_constraints : public TMRP_array +{ +protected: + virtual TSortable* new_obj(const TToken_string& key) const; + +public: + TMSP_constraint* find(long cliente,const TString& codart,const TString& giac, + const TString& imp, const TString& lin, const TString& mag, + bool create=FALSE) ; + + TMSP_constraint& operator[](long n) const + { return (TMSP_constraint&)find_obj(n); } +}; + + +class TMSP_constraint : public TSortable +{ + long _cliente; + TCodice_articolo _codart; + TString16 _giac; + TString8 _imp, _lin; + TString8 _mag; + TString _desc; + + bool _on_sheet; + TArray _mastercodes; // codici di livello 2 per articoli NON master + TMSP_constraints _upperlines; // vincoli dei codici di livello 1 per articoli master + + TMSP_record_array _bucket_qta; + +protected: + virtual int compare(const TSortable& s) const; + +public: + long cliente() const { return _cliente; } + const TCodice_articolo& codice() const { return _codart; } + const TString& livgiac() const { return _giac; } + const TString& codimp() const { return _imp; } + const TString& codlin() const { return _lin; } + const TString& codmag() const { return _mag; } + const TString& desc() const { return _desc; } + void set_desc(const char* str) { _desc = str; } + + bool riga(int b, long& ndoc, int& nriga); + void set_riga(int b, long ndoc, int nriga); + // master sched. a due livelli: + void add_mastercode(TMaster_code * mc); + TMaster_code * get_mastercode(int i=0); + bool has_mastercodes() const ; + void add_upperline(TMSP_constraint& constr); + TMSP_constraint* get_upperline(TMSP_constraint& constr); + bool has_upperlines() const ; + + int last() const { return _bucket_qta.last(); } + int pred(int i) const { return _bucket_qta.pred(i); } + + virtual real& qta(int b) { return _bucket_qta[b]._qta; } + virtual real& price(int b) { return _bucket_qta[b]._price; } + + virtual void fill_sheet_row(TToken_string& row, const TMSP_mask & m, bool codes_only=FALSE); + + bool is_on_sheet() const { return _on_sheet; } + void set_on_sheet(bool on = TRUE) { _on_sheet = on; } + + TMSP_constraint & operator=(const TMSP_constraint & line); + + TMSP_constraint(long cliente, + const TCodice_articolo& codart, + const TString& giac, + const TString& imp, const TString& lin, + const TString& mag); + TMSP_constraint(TMSP_constraint & cons); + virtual ~TMSP_constraint() { } +}; + +// linee contenenti pianificazioni +class TMSP_line : public TMSP_constraint +{ +public: + + virtual void fill_sheet_row(TToken_string& row, const TMSP_mask & m, bool codes_only=FALSE); + TMSP_line(long cliente, const TCodice_articolo& codart, + const TString& giac, const TString& mag, + const TString& imp, const TString& lin); + TMSP_line(TMSP_line & line); + TMSP_line(TMSP_constraint & cons); + virtual ~TMSP_line() { } +}; + + +class TMSP_lines : public TMRP_array +{ +protected: + virtual TSortable* new_obj(const TToken_string& key) const; + +public: + TMSP_line* find(long cliente, const TString& art, const TString& gia, + const TString& imp, const TString& lin, const TString& mag, + bool create=FALSE); + + TMSP_line* find(const TToken_string& row, TCodice_livelli & levels, bool create=FALSE); + + TMSP_line& operator[](long i) const + { return (TMSP_line&)find_obj(i); } +}; + + + +class TMSP_mask : public TCalendar_mask +{ + TCodgiac_livelli _livelli; + // quantità provenienti dai documenti "ordine": + TMSP_constraints _constraints; + + // quantità provenienti dai documenti "planning" (commesse): + TMSP_lines _articles; + + // quantità per il processo di nettificazione/sizing in caso di generazione dell'MSP + TMRP_lines _mrp_articles; + // proposte del sistema + TMRP_lines _proposed_articles, _proposed_1stlevel; + + // capacità linea per linea + TCRP_lines _capacities; + + // albero per le ricerche sulle dist + TDistinta_tree _dist_tree; + + +protected: + bool on_field_event(TOperable_field& o, TField_event e, long jolly); + + bool load_MRP_lines(TMSP_mode mode, int level=0); + bool nettify_MRP_lines(bool already_net, bool lotsizing=FALSE); + void add_MRP_bucket(TMRP_line& new_article, int nbucket, const real &curr_arts); + // proposta automatica del sistema + bool general_review(bool check_machine, bool check_human, bool useextralines, bool useextrahours,bool lotsizing, bool no_outcapacity, int anticipomin,int anticipomax, TMSP_mode mode, TMSP_logic logic ); + bool insert_propose(bool verbose=FALSE) ; + bool remove_propose(bool verbose=FALSE) ; + void add_or_sub_propose(char sign); + + void propose_1stJIT(TMSP_logic logic, bool check_m, bool check_h); +// void propose_firstfit(bool check_m, bool check_h); +// bool firstfit_review(bool check_machine, bool check_human, bool useextralines, bool useextrahours,bool lotsizing, bool no_outcapacity, int anticipomin,int anticipomax, TMSP_mode mode); +// void propose_JIT(bool check_m, bool check_h); +// bool JIT_review(bool check_machine, bool check_human, bool useextralines, bool useextrahours,bool lotsizing, bool no_outcapacity, int anticipomin,int anticipomax, TMSP_mode mode); + // controlli + bool sort_sheet(); + void check_articles(); + void check_capacities(); + void pack_article_sheet(); + // capacity review + bool capacity_review(bool useextralines, bool useextrahours); + TCRP_line *compute_capacity(TLinea_prod &lineaprod, bool useextralines, bool useextrahours); + + TMSP_constraint* find_constraint(const TMSP_line& l,bool force_insert=FALSE); + int find_constr_row(const TMSP_constraint& c); + + bool do_test_art_row(int r, int c, bool signal); + bool test_art_row(int r, bool signal=TRUE); + bool test_load_row(int r, bool signal=TRUE); + int init_bucket0(TArticolo_giacenza &art, int r); + + void copy_sheet_row(TToken_string & newrow, const TToken_string & row); + + void clear_sheets(); + + bool distinta_master(const char *code); + int find_distinta_master(const char * code, TString & master, TString & livmaster,TString & um,real & expr, TString & imp,TString & lin,TString & magdep, int fromindex=0); + +public: + const TCodgiac_livelli& livelli_giac() const {return _livelli;} + + void msprow2codes(TToken_string &row, long &clifor, TCodice_articolo &art , + TString & liv, TString & mag, TString & imp, TString & lin, TString & um); + void crprow2codes(TToken_string &row, TString & imp, TString & lin, long &clifor, TCodice_articolo &art , + TString & liv, TString & um); + TMRP_line* find_propose(long codcli, const char * codart,const char * liv, + const char * codimp,const char * codlin,const char * mag, + bool Force=FALSE); + TMSP_line* find_article(long cli, const char *art, const char *liv, + const char *imp, const char *lin, const char *mag,bool Force=FALSE) + {return _articles.find(cli, art, liv, imp, lin, mag, Force);} + + + int days_per_bucket() const; + + int round_date(TDate& date, bool up = FALSE) const; + void round_field(TMask_field& fld, bool up) const; + + int test_codnum(const TCodice_numerazione& num) const; + bool test_tipodoc_num( const TSheet_field &sheet_num , const TSheet_field &sheet_type) ; + + bool test_status(const TRectype& doc, int tipo) const; + bool carica_documenti(); + void fill_sheet(); + void salva_documenti(); + + TMSP_mask(); + virtual ~TMSP_mask() { } +}; + +class TMSPCheck_mask : public TAutomask +{ +protected: + int _col, _row, _constr_row, _last_col, _last_row; + TMSP_mask * _main_mask; + TSheet_field * _sheet; +protected: + int max_rows() {return _sheet->items();} + void go_top(); + bool on_field_event(TOperable_field& o, TField_event e, long jolly); + bool move_to(int dlg); + virtual void check_pos_range(); + virtual int fill_mask(const bool show=TRUE); + virtual bool is_constraint(int row); + virtual bool is_article(int row); + virtual int find_constraint(int row); +public: + void gopos(int row, int col); + virtual void gopos_mainmask(); + void fix_actual_pos(); + short last_row(){ return _last_row;} + short last_col(){ return _last_col;} + + TMSPCheck_mask(TMSP_mask * main_mask); + TMSPCheck_mask(TMSP_mask * main_mask,const char * m,TSheet_field * s ); +}; + + +class TCRPCheck_mask : public TMSPCheck_mask +{ +protected: + virtual void check_pos_range(); + virtual int fill_mask(const bool show=TRUE); + virtual bool is_constraint(int row); + virtual bool is_article(int row); + virtual int find_constraint(int row); +public: + TCRPCheck_mask(TMSP_mask * main_mask); +}; + + +/////////////////////////////////////////////////////////// +TMSP_record& TMSP_record_array::operator[](int b) +{ + CHECKD(b >= 0, "Invalid TMSP_record_array ", b); + TMSP_record* rec = (TMSP_record*)_buckets.objptr(b); + if (rec == NULL) + { + rec = new TMSP_record; + _buckets.add(rec, b); + } + return *rec; +} + + +/////////////////////////////////////////////////////////// + +TCapacita_prod::TCapacita_prod () : + _capacity(), _load() + { } + +TCapacita_prod::TCapacita_prod (const real& cap, const real& load) : + _capacity(cap), _load(load) +{ } + +void TCapacita_prod::set(const real& cap, const real& load) +{ _capacity=(cap);_load=(load);} + +void TCapacita_prod::copy (const TCapacita_prod & q) +{ + _capacity=q._capacity; // Valore attuale + _load=q._load; // Valore attuale +} + +int TCapacita_prod::compare(const TSortable& s) const +{ + TCapacita_prod& c=(TCapacita_prod&)s; + real r=_capacity-c._capacity; + return r.sign(); +} + + +TCRP_line::TCRP_line(const TString& codimp,const TString& codlin) +: _lineap(codlin),_on_sheet(FALSE) +{ + if (!codlin.blank()) + { + TTable tablnp("LNP"); + tablnp.put("CODTAB",_lineap); + tablnp.read(); + _desc = tablnp.get("S0"); + _imp = tablnp.get("S6"); + } + else + { + _imp = codimp ; + if (!codimp.blank()) + { + TTable tabimp("IMP"); + tabimp.put("CODTAB",_imp); + tabimp.read(); + _desc = tabimp.get("S0"); + } + else + { + _desc = "Totale ditta"; + } + } +} + +int TCRP_line::compare(const TSortable& s) const +{ + const TCRP_line& c = (const TCRP_line&)s; + int cmp = _imp.compare(c._imp); + if (cmp == 0) + { + cmp = _lineap.compare(c._lineap); + } + return cmp; +} + +// carica una riga di sheet con i dati dell'oggetto vincolo +void TCRP_line::fill_capacity_row(TToken_string& row, bool percent) +{ + row.add(codimp(),F_CODIMPCRP -FIRST_FIELD); + row.add(codlin(),F_CODLINCRP -FIRST_FIELD); + + row.add(percent ? "%": "ore",F_LUM -FIRST_FIELD); + + real r; + for (int bu = last(); bu > 0; bu = pred(bu)) + { + r=capacity(bu); + if (!r.is_zero()) + row.add(percent ? "100" : r.string(), bu + F_LBUCKET0 -FIRST_FIELD); // buckets + else + row.add("", bu + F_LBUCKET0 -FIRST_FIELD); + } +} +void TCRP_line::fill_hcapacity_row(TToken_string& row, bool percent) +{ + row.add(codimp(),F_CODIMPCRP -FIRST_FIELD); + row.add(codlin(),F_CODLINCRP -FIRST_FIELD); + + row.add(percent ? "%": "ore",F_LUM -FIRST_FIELD); + + real r; + for (int bu = last(); bu > 0; bu = pred(bu)) + { + r=human_capacity(bu); + if (!r.is_zero()) + row.add(percent ? "100" : r.string(), bu + F_LBUCKET0 -FIRST_FIELD); // buckets + else + row.add("", bu + F_LBUCKET0 -FIRST_FIELD); + } +} + +// carica una riga di sheet con i dati dell'oggetto vincolo +void TCRP_line::fill_load_row(TToken_string& row, bool percent) +{ + row.add(codimp(),F_CODIMPCRP -FIRST_FIELD); + row.add(codlin(),F_CODLINCRP -FIRST_FIELD); + + row.add(percent ? "%": "ore",F_LUM -FIRST_FIELD); + + real r; + for (int bu = last(); bu > 0; bu = pred(bu)) + { + r=percent ? (capacity(bu).is_zero() ? ZERO : (100L * load(bu) / capacity(bu))) : load(bu) ; + row.add(r.string(), bu + F_LBUCKET0 -FIRST_FIELD); // buckets + } +} +void TCRP_line::fill_hload_row(TToken_string& row, bool percent) +{ + row.add(codimp(),F_CODIMPCRP -FIRST_FIELD); + row.add(codlin(),F_CODLINCRP -FIRST_FIELD); + + row.add(percent ? "%": "ore",F_LUM -FIRST_FIELD); + + real r; + for (int bu = last(); bu > 0; bu = pred(bu)) + { + r=percent ? (human_capacity(bu).is_zero() ? ZERO :(100L * human_load(bu) / human_capacity(bu))) : human_load(bu) ; + row.add(r.string(), bu + F_LBUCKET0 -FIRST_FIELD); // buckets + } +} + + +TCapacita_prod& TCRP_line::bucket(int n) +{ + TCapacita_prod *o; + o=(TCapacita_prod *)_bucket.objptr(n); + if (o==NULL) + { + o=new TCapacita_prod(); + _bucket.add(o,n); + } + return *o; +} + +/////////////////////////////////////////////////////////// +// TCRP_lines ; carichi delle varie linee +/////////////////////////////////////////////////////////// + + +TSortable* TCRP_lines::new_obj(const TToken_string& key) const +{ + TString8 codimp, codlin; + key.get(0,codimp); + key.get(1,codlin); + return new TCRP_line(codimp, codlin); +} + +TCRP_line* TCRP_lines::find(const TLinea_prod& linea_prod, const char * codart, long codcli, bool create) +{ +/* _key=linea_prod.codimp(); + _key.add(linea_prod.codice()); + TSortable* s = create ? add_obj(_key) : find_obj(_key); + return (TCRP_line*)s;*/ + return find(linea_prod.codimp(), linea_prod.codice(),codart, codcli, create); +} + +TCRP_line* TCRP_lines::find(const char * codimp, const char * codlin, const char * codart, long codcli, bool create) +{ + _key.add(codimp,0); + _key.add(codlin,1); + _key.add(codart,2); // articolo + _key.add(format("%ld",codcli),3); // cliente + TSortable* s = create ? add_obj(_key) : find_obj(_key); + return (TCRP_line*)s; +} + +/////////////////////////////////////////////////////////// +// TMaster_code +/////////////////////////////////////////////////////////// + +TMaster_code::TMaster_code(const char *code, const char *liv,const char *ummaster, const real &expr, const real &leadtime, const char *codimp, const char *codlin, const char *codmag) + : _code(code), _liv (liv), _um(ummaster), _expr(expr), _leadtime(leadtime), + _codimp(codimp), _codlin(codlin), _codmag(codmag) +{ +} +TMaster_code::TMaster_code(const char *code, const char *liv,const char *ummaster, const real &expr, int leadtime, const char *codimp, const char *codlin, const char *codmag) + : _code(code), _liv (liv), _um(ummaster), _expr(expr), _leadtime(format("%d",leadtime)), + _codimp(codimp), _codlin(codlin), _codmag(codmag) +{ +} + + +/////////////////////////////////////////////////////////// +// TMSP_constraint +/////////////////////////////////////////////////////////// +int TMSP_constraint::compare(const TSortable& s) const +{ + const TMSP_constraint& c = (const TMSP_constraint&)s; + const long diff = _cliente - c._cliente; + int cmp = diff == 0L ? 0 : (diff > 0 ? +1 : -1); + if (cmp == 0) + { + cmp = _codart.compare(c._codart); + if (cmp == 0) + { + cmp = _giac.compare(c._giac); + if (cmp == 0) + { + cmp = _imp.compare(c._imp); + if (cmp == 0) + cmp = _mag.compare(c._mag); + } + } + } + return cmp; +} + + +// carica una riga di sheet con i dati dell'oggetto vincolo +void TMSP_constraint::fill_sheet_row(TToken_string& row, const TMSP_mask & m, bool codes_only) +{ + const TCodgiac_livelli& livelli=m.livelli_giac(); + TString tipocf(m.get(F_TIPOCF)); + + row.add(m.get_bool(F_NOCLI_IN) ? "" : tipocf,F_TIPOCF_SHEET-FIRST_FIELD); + + row.add(format("%ld", cliente()),F_CLIENTE-FIRST_FIELD); + row.add(codice(),F_ARTICOLO-FIRST_FIELD); + row.add(" ",F_PRIORITA-FIRST_FIELD); + + const TString& liv = livgiac(); + for (int l = 1; l <= 4; l++) + { + if (livelli.enabled(l)) + row.add(livelli.unpack_grpcode(liv,l),F_LIV1+l-1-FIRST_FIELD); + else + row.add(" ",F_LIV1+l-1-FIRST_FIELD); + } + + row.add(desc(),F_DESCART-FIRST_FIELD); + row.add(codimp(),F_CODIMP-FIRST_FIELD); + row.add(codlin(),F_CODLIN-FIRST_FIELD); + + TString8 str = _mag.left(3); + row.add(str, F_MAGAZZINO-FIRST_FIELD); + str = _mag.mid(3); + row.add(str,F_DEPOSITO-FIRST_FIELD); + + const TCodice_um um; + const TQuantita qta_art(codice(), um, ZERO); + row.add(qta_art.um(),F_UM-FIRST_FIELD); + + if (codes_only) + return; + real needs=ZERO; + const int last_buck= last(); + for (int bu = 0; bu <= last_buck; bu ++) + { + needs=qta(bu); + row.add(needs.string(), bu*2+F_BUCKET0-FIRST_FIELD); + needs=price(bu); + row.add(needs.string(), bu*2+F_BUCKET0+1-FIRST_FIELD); + } + row.add(has_mastercodes() ? "M" : " ",F_MASTERCODE-FIRST_FIELD); +} + +bool TMSP_constraint::riga(int buck, long& ndoc, int& nrig) +{ + TMSP_record& b = _bucket_qta[buck]; + ndoc = b._numdoc; + nrig = b._numrig; + return ndoc > 0L && nrig > 0; +} + +void TMSP_constraint::set_riga(int buck, long ndoc, int nrig) +{ + TMSP_record& b = _bucket_qta[buck]; + b._numdoc = ndoc; + b._numrig = nrig; +} + +bool TMSP_constraint::has_mastercodes() const +{ + return _mastercodes.items()>0; +} + +void TMSP_constraint::add_mastercode(TMaster_code *mc) +{ + _mastercodes.add(mc); +} + +TMaster_code *TMSP_constraint::get_mastercode(int i) +{ + if (i>=0 && i < _mastercodes.items()); + return (TMaster_code *) _mastercodes.objptr(i); + return NULL; +} + +bool TMSP_constraint::has_upperlines() const +{ + return _upperlines.items()>0; +} + +void TMSP_constraint::add_upperline(TMSP_constraint& mc) +{ + if (_upperlines.items()==0) + { + // aggiunge se stesso + TMSP_constraint * myself=_upperlines.find(cliente(), codice(), livgiac(), + codimp(),codlin(),codmag(),TRUE); + *myself=*this; + } + _upperlines.find(mc.cliente(), mc.codice(), mc.livgiac(), + mc.codimp(),mc.codlin(),mc.codmag(),TRUE); +} + +TMSP_constraint* TMSP_constraint::get_upperline(TMSP_constraint& mc) +{ + return _upperlines.find(mc.cliente(), mc.codice(), mc.livgiac(), + mc.codimp(),mc.codlin(),mc.codmag(),FALSE); +} + +TMSP_constraint & TMSP_constraint::operator=(const TMSP_constraint & line) +{ + _cliente=line.cliente(); + _codart=line.codice(); + _giac=line.livgiac(); + _imp=line.codimp(); + _lin=line.codlin(); + _mag=line.codmag(); + _on_sheet=_on_sheet; + _desc=line.desc(); + _bucket_qta=line._bucket_qta; + return *this; +} + + +TMSP_constraint::TMSP_constraint(long cliente, + const TCodice_articolo& codart, + const TString& giac, + const TString& imp, + const TString& lin, + const TString& mag) +: _cliente(cliente), _codart(codart), _giac(giac), + _imp(imp), _lin(lin), _mag(mag),_on_sheet(FALSE) +{ } + +TMSP_constraint::TMSP_constraint(TMSP_constraint & line) +: _cliente(line.cliente()), _codart(line.codice()), _giac(line.livgiac()), + _imp(line.codimp()), _lin(line.codlin()), _mag(line.codmag()), _on_sheet(FALSE), + _desc(line.desc()) +{ +} + +/////////////////////////////////////////////////////////// +// TMSP_constraints +/////////////////////////////////////////////////////////// + +TSortable* TMSP_constraints::new_obj(const TToken_string& key) const +{ + long cli; key.get(0, cli); + TCodice_articolo art; key.get(1, art); art.trim(); + TString16 gia; key.get(2, gia); gia.trim(); + TString8 imp; key.get(3, imp); imp.trim(); + TString8 lin; key.get(4, lin); lin.trim(); + TString8 mag; key.get(5, mag); mag.trim(); + return new TMSP_constraint(cli, art, gia, imp, lin, mag); +} + +TMSP_constraint* TMSP_constraints::find(long cliente, + const TString& art, + const TString& gia, + const TString& imp, + const TString& lin, + const TString& mag, + bool create) +{ + _key.format("%ld", cliente); + _key.add(art);_key.trim(); + _key.add(gia);_key.trim(); + _key.add(imp);_key.trim(); + _key.add(lin);_key.trim(); + _key.add(mag);_key.trim(); + TSortable* s = create ? add_obj(_key) : find_obj(_key); + TMSP_constraint *c=(TMSP_constraint*)s; + if (create) + { + if (c->desc().blank()) + c->set_desc(cache().get(LF_ANAMAG,art).get("DESCR")); + } + return c; +} + +////////////////////////////////////////////////////////// +// TMSP_line +/////////////////////////////////////////////////////////// + + +void TMSP_line::fill_sheet_row(TToken_string& row, const TMSP_mask & m, bool codes_only) +{ + TMSP_constraint::fill_sheet_row(row, m, codes_only); + row.add(m.get(F_TIPOCF),F_TIPOCF_SHEET-FIRST_FIELD); +} + +TMSP_line::TMSP_line(long cliente, const TCodice_articolo& codart, + const TString& giac, const TString& imp, + const TString& lin, const TString& mag) + : TMSP_constraint(cliente, codart, giac, imp, lin,mag) +{ } + +TMSP_line::TMSP_line(TMSP_constraint & cons) +:TMSP_constraint(cons) +{ } +TMSP_line::TMSP_line(TMSP_line & line) +:TMSP_constraint((TMSP_constraint &)line) +{ +} + +/////////////////////////////////////////////////////////// +// TMSP_lines +/////////////////////////////////////////////////////////// + +TSortable* TMSP_lines::new_obj(const TToken_string& key) const +{ + long cliente; key.get(0, cliente); + TCodice_articolo art; key.get(1, art); art.trim(); + TString gia; key.get(2, gia); gia.trim(); + TString imp; key.get(3, imp); imp.trim(); + TString lin; key.get(4, lin); lin.trim(); + TString mag; key.get(5, mag); mag.trim(); + return new TMSP_line(cliente, art, gia, imp, lin, mag); +} + +TMSP_line* TMSP_lines::find(long cliente, + const TString& art, + const TString& gia, const TString& imp, + const TString& lin, const TString& mag, + bool create) +{ + _key.format("%ld", cliente); + _key.add(art); + _key.add(gia); + _key.add(imp); + _key.add(lin); + _key.add(mag); + TSortable* s = create ? add_obj(_key) : find_obj(_key); + return (TMSP_line*)s; +} + +TMSP_line* TMSP_lines::find(const TToken_string& row, TCodice_livelli & livelli ,bool create) +{ + TString80 str,giaclev; + _key.cut(0); + + for (int i = 0; i <= 11; i++) + { + row.get(i, str); + str.trim(); + switch (i+FIRST_FIELD) + { + case F_LIV1: + case F_LIV2: + case F_LIV3: + livelli.pack_grpcode(giaclev, str, i+FIRST_FIELD-F_LIV1+1); break; + case F_LIV4: + livelli.pack_grpcode(giaclev, str, 4); + giaclev.trim(); + _key.add(giaclev); + break; // Concatena i livelli + case F_MAGAZZINO: + _key.add(str); + row.get(i+1, str); + str.trim(); + _key << str; + break; // Concatena magazzini e depositi + case F_CLIENTE: + if (str.blank()) str = "0"; + case F_ARTICOLO: + case F_CODIMP: + case F_CODLIN: + _key.add(str); break; // Aggiungi normalmente + } + } + TSortable* s = create ? add_obj(_key) : find_obj(_key); + return (TMSP_line*)s; +} + +/////////////////////////////////////////////////////////// +// TPlan_docs +/////////////////////////////////////////////////////////// + +class TPlan_docs : public TMRP_array +{ + TString16 _num, _doc, _rig; + +protected: + virtual TSortable* new_obj(const TToken_string& key) const; + +public: + TDocumento& find(int anno, long num); + + TRiga_documento& add_to_row(int anno, long num, int riga, const real& qta); + long flush(const TDate& data); + + TPlan_docs(const char* num, const char* tip, const char* rig); + virtual ~TPlan_docs() { } +}; + +TSortable* TPlan_docs::new_obj(const TToken_string& key) const +{ + int anno; key.get(0, anno); + long num; key.get(1, num); + + TDocumento* doc = new TDocumento('D', anno, _num, num); + doc->head().put(DOC_TIPODOC, _doc); + return doc; +} + +TDocumento& TPlan_docs::find(int anno, long num) +{ + _key.format("%d|%ld", anno, num); + return *(TDocumento*)add_obj(_key); +} + +TRiga_documento& TPlan_docs::add_to_row(int anno, long num, int riga, const real& qta) +{ + TDocumento& doc = find(anno, num); + if (riga <= 0 || riga > doc.physical_rows()) + { + TRiga_documento& r = doc.new_row(_rig); + riga = r.get_int(RDOC_NRIGA); + } + TRiga_documento& rdoc = doc[riga]; + real val = rdoc.get(RDOC_QTA); + val += qta; + if (val <= ZERO) + rdoc.put(RDOC_QTA, ZERO); + else + rdoc.put(RDOC_QTA, val); + + return rdoc; +} + +long TPlan_docs::flush(const TDate& data) +{ + const long tot = items(); + if (tot > 0L) + { + TString msg; + msg << "Registrazione dei documenti di planning per il " << data; + TProgind pi(tot, msg, FALSE, TRUE); + TLocalisamfile lfdoc(LF_DOC); + for (long d = 0; d < tot; d++) + { + pi.addstatus(1); + TDocumento& doc = (TDocumento&)find_obj(d); + for (int r = doc.physical_rows(); r > 0; r--) + { + const TRiga_documento& riga = doc[r]; + if (riga.is_articolo() && riga.quantita() == ZERO) + doc.destroy_row(r, TRUE); + } + if (doc.physical_rows()) + doc.write(lfdoc); + else + doc.remove(lfdoc); + } + destroy(); + } + return tot; +} + +TPlan_docs::TPlan_docs(const char* num, const char* tip, const char* rig) + : _num(num), _doc(tip), _rig(rig) +{ +} + + +/////////////////////////////////////////////////////////// +// ritorna se tutto OK +bool TRiga_articolo::find_block(const TSheet_field& sf, const int riga, int &first_row, int &last_row ) +{ + const int narticoli=sf.items(); + if (narticoli<=riga) + return FALSE; + // Calcola l'indice c della riga coi vincoli + const int b1 = sf.cid2index(F_BUCKET1); + + for (first_row = riga; first_row > 0; first_row--) + { + if (sf.cell_disabled(first_row, b1)) + break; + } + if (first_row+1 < narticoli && sf.cell_disabled(first_row+1, b1)) first_row++; + // Calcola l'indice r dell'ultima riga articoli + last_row = riga; + if (last_row <= first_row) last_row=first_row+1; + for ( ; last_row < narticoli-1; last_row++) + { + if (sf.cell_disabled(last_row+1, b1)) + break; + } + return TRUE; +} + +int TRiga_articolo::order_compare( const TToken_string &r1 , const TToken_string &r2 , int level) +{ + TString16 str0, str1; + int cmp = 0; + if (level>=0) + { + for (int i = 2; i <= level && cmp == 0; i++) + { + r1.get(i, str0); + r2.get(i, str1); + cmp=TRiga_articolo::compare_field(str0,str1,short(i+FIRST_FIELD)); + } + } else { + // ordinamenti non standard + short f; + short fields_ACL[] = {F_PRIORITA, F_ARTICOLO, F_CLIENTE, F_SORTCODIMP, F_SORTCODLIN}; + short fields_ALC[] = {F_PRIORITA, F_ARTICOLO, F_SORTCODIMP, F_SORTCODLIN, F_CLIENTE}; + short fields_LAC[] = {F_PRIORITA, F_SORTCODIMP, F_SORTCODLIN, F_ARTICOLO, F_CLIENTE}; + short fields_LCA[] = {F_PRIORITA, F_SORTCODIMP, F_SORTCODLIN, F_CLIENTE, F_ARTICOLO}; + short fields_CLA[] = {F_PRIORITA, F_CLIENTE, F_SORTCODIMP, F_SORTCODLIN, F_ARTICOLO}; + short fields_CAL[] = {F_PRIORITA, F_CLIENTE, F_ARTICOLO, F_SORTCODIMP, F_SORTCODLIN}; + for (int i = 0; i < 5 && cmp == 0; i++) + { + switch (level) + { + case SORT_BY_CAL: + f=fields_CAL[i]; break; + case SORT_BY_CLA: + f=fields_CLA[i]; break; + case SORT_BY_LCA: + f=fields_LCA[i]; break; + case SORT_BY_LAC: + f=fields_LAC[i]; break; + case SORT_BY_ACL: + f=fields_ACL[i]; break; + case SORT_BY_ALC: + f=fields_ALC[i]; break; + default: + NFCHECK("Ordinamento sconosciuto"); + break; + } + r1.get(f-FIRST_FIELD, str0); + r2.get(f-FIRST_FIELD, str1); + cmp=TRiga_articolo::compare_field(str0,str1,f); + } + } + return cmp; +} + + +// aggiunge li codici di linea/impianto se non presenti usando i default sulle lavorazioni critiche +// cio' permette di ordinare per impianto anche le linee di ordine che non hanno solitamente +// questa indicazione ma solo il codice articolo +void complete_codlinea(TToken_string &r2, bool ignore_imp) +{ + static TDistinta_tree *_dist_tree=NULL; + + TString8 swp; + r2.get(F_SORTCODLIN-FIRST_FIELD,swp); + if (swp.blank()) + { + r2.get(F_CODLIN-FIRST_FIELD,swp); + if (swp.blank()) + { + if (_dist_tree==NULL) + _dist_tree= new TDistinta_tree(); + if (_dist_tree->set_root(r2.get(F_ARTICOLO-FIRST_FIELD))) + { + TString codimp(r2.get(F_CODIMP-FIRST_FIELD)); + TArray labors; + TRiga_esplosione * l=_dist_tree->first_critical_labor(labors); + if (l) + { + TLavorazione *curr_labor=TDistinta_tree::find_labor(l); + CHECK(curr_labor,"Lavorazione non trovata"); + for (int nlinea=0; nlinea linee_standard(); nlinea ++) + { + const TRectype &linea_prod= cache().get("LNP",curr_labor->cod_linea(nlinea)); + if ( ignore_imp || codimp.blank() || codimp==linea_prod.get("S6")) + { + r2.add(linea_prod.get("CODTAB"), F_SORTCODLIN-FIRST_FIELD); + r2.add(linea_prod.get("S6"), F_SORTCODIMP-FIRST_FIELD); + return; + } + } + } + } + r2.add('\255', F_SORTCODLIN-FIRST_FIELD); + } + else + { + r2.add(swp, F_SORTCODLIN-FIRST_FIELD); + r2.get(F_CODLIN-FIRST_FIELD,swp); + r2.add(swp, F_SORTCODIMP-FIRST_FIELD); + } + } +} + + +int TRiga_articolo::order_compare(TSheet_field & s, int i1, int i2, int level) +{ + TMask &m=s.mask(); + const bool ascending=!m.get_bool(F_MSP_SORT_ORDER); + int first1, first2, last1, last2; + + if (find_block(s, i1, first1, last1 )) first1--; + if (find_block(s, i2, first2, last2 )) first2--; + + const TToken_string &r1 = s.row(i1); + const TToken_string &r2 = s.row(i2); + if (s.cell_enabled(i1, F_BUCKET1-FIRST_FIELD) && s.cell_enabled(i2, F_BUCKET1-FIRST_FIELD) ) + { + // confronto tra righe dello stesso vincolo + if (first1 == first2 ) + return order_compare( r1 , r2 , level) * (ascending ? 1 : -1); + } else { + if (first1 != first2 && first1==i1 && first2==i2 ) + { + TToken_string &blockr1=(TToken_string &)r1; + TToken_string &blockr2=(TToken_string &)r2;; + complete_codlinea(blockr1, m.get_bool(F_NOIMP_IN)); + complete_codlinea(blockr2, m.get_bool(F_NOIMP_IN)); + // confronto tra blocchi ed eventuale swap direttamente qui nella compare + int cmp = order_compare(blockr1 , blockr2 , level) * (ascending ? 1 : -1); + if (cmp > 0) + { + for (int bubble=first2; bubble<=last2; bubble++) + { + for (int r=bubble; r>bubble+first1-first2; r--) + { + s.swap_rows(r, r-1); + } + } + } + } + } + return 0; +} + +int TRiga_articolo::order_compareCAL(TSheet_field & s, int i1, int i2) +{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_CAL);} +int TRiga_articolo::order_compareCLA(TSheet_field & s, int i1, int i2) +{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_CLA);} +int TRiga_articolo::order_compareALC(TSheet_field & s, int i1, int i2) +{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_ALC);} +int TRiga_articolo::order_compareACL(TSheet_field & s, int i1, int i2) +{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_ACL);} +int TRiga_articolo::order_compareLAC(TSheet_field & s, int i1, int i2) +{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_LAC);} +int TRiga_articolo::order_compareLCA(TSheet_field & s, int i1, int i2) +{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_LCA);} + +int TRiga_articolo::compare_field(TString &str0, TString &str1,short field_no) +{ + int cmp; + switch (field_no) + { + case F_CLIENTE: + { + const long f0 = atol(str0); + const long f1 = atol(str1); + cmp = f0 == f1 ? 0 : (f0 > f1 ? +1 : -1); + } + break; + case F_PRIORITA: + cmp = -str0.compare(str1); + break; + default: + cmp = str0.compare(str1); + break; + } + return cmp; +} + +TRiga_articolo& TRiga_articolo::operator=(TToken_string& r) +{ + this->TToken_string::operator=(r); + return *this; +} + +TRiga_articolo& TRiga_articolo::operator+=(TRiga_articolo& r) +{ + NFCHECK( "Can't add incompatible order line"); + return *this; +} + +TRiga_articolo::TRiga_articolo(const TMSP_constraint& line) + : TToken_string(128) +{ + format("%ld", line.cliente()); + add(line.codice(),F_CLIENTE-FIRST_FIELD); + add(" ",F_PRIORITA-FIRST_FIELD); + + const TString& liv = line.livgiac(); + for (int l = 1; l <= 4; l++) + { + if (livelli_giac().enabled(l)) + add(livelli_giac().unpack_grpcode(liv,l),F_LIV1+l-1-FIRST_FIELD); + else + add(" ",F_LIV1+l-1-FIRST_FIELD); + } + + add(line.desc(),F_DESCART-FIRST_FIELD); + add(line.codimp(),F_CODIMP-FIRST_FIELD); + add(line.codlin(),F_CODLIN-FIRST_FIELD); + + TString8 str = line.codmag().left(3); + add(str, F_MAGAZZINO-FIRST_FIELD); + str = line.codmag().mid(3); + add(str, F_DEPOSITO-FIRST_FIELD); + + const TCodice_um um; + const TQuantita qta_art(line.codice(), um, ZERO); + add(qta_art.um(),F_UM-FIRST_FIELD); + + TMSP_constraint& lin=(TMSP_constraint& )line; + const int last_buck= line.last(); + for (int bu = 0; bu <= last_buck; bu ++) + { + add(lin.qta(bu).string(), bu*2+F_BUCKET0-FIRST_FIELD); + } +} + +/////////////////////////////////////////////////////////// +// Maschera principale +/////////////////////////////////////////////////////////// + + +// Arrotonda la data al bucket e ne restituisce il numero (data iniziale==bucket 0) +int TMSP_mask::round_date(TDate& date, bool up) const +{ + // Dimensione del bucke in giorni + int bucket_size = days_per_bucket(); + + // Riporta la data al primo lunedi prima dell'inizio + TDate inizio = get(F_DADATA); + const int wday = inizio.wday(); + if (wday > 1) inizio -= wday-1; + + // Calcola il bucket di appartenenza + const int days = int(date - inizio); + const int bucket = days / bucket_size; + + if (up) // Arrotonda alla fine del bucket + date = inizio + long((bucket+1 )* bucket_size - 1); + else // Arrotonda all'inizio del bucket + date = inizio + long(bucket * bucket_size); + + return bucket; +} + +void TMSP_mask::round_field(TMask_field& fld, bool up) const +{ + TDate date = fld.get(); + if (date.ok()) + { + round_date(date, up); + fld.set(date); + } +} + +int TMSP_mask::test_codnum(const TCodice_numerazione& num) const +{ + int r=0; + for (int s = 2; s > 0; s--) + { + const short id = s == 2 ? F_NUM_PLA : F_NUM_ORC; + TString_array& nums = sfield(id).rows_array(); + for (int i = nums.items()-1; i >= 0; i--) + { + const char* t = nums.row(i).get(0); + if (num.codice() == t) + { + r|=s; break; + } + } + } + return r; +} + +bool TMSP_mask::test_tipodoc_num(const TSheet_field &sheet_num ,const TSheet_field &sheet_type) +{ + TString16 tipo; + TString_array& nums = sheet_num.rows_array(); + TString_array& types = sheet_type.rows_array(); + for (int j = types.items()-1; j >= 0; j--) + { + bool ok=FALSE; + tipo = types.row(j).get(0) ; + const char * cazzoinculo=(const char * )tipo; + for (int i = nums.items()-1; i >= 0; i--) + { + TCodice_numerazione num(nums.row(i).get(0)); + for (int n = num.ntipi_doc()-1;n >= 0; n--) + { + const char* t = num.tipo_doc(n); + if (tipo == t) + ok = TRUE; + } + } + if (!ok) + return error_box("Il tipo '%s' non appartiene a nessuna delle numerazioni scelte",(const char * )tipo); + } + return TRUE; +} + +bool TMSP_mask::test_status(const TRectype& doc, int s) const +{ + const short id = (s & 2) ? F_TIPI_PLA : F_TIPI_ORC; + TSheet_field& sf = sfield(id); + const int idfr = sf.cid2index(F_DASTATO); + const int idto = sf.cid2index(F_ASTATO); + + const TString16 tipodoc = doc.get(DOC_TIPODOC); + const int statodoc = doc.get_int(DOC_STATO); + bool yes = FALSE; + + TString_array& a = sf.rows_array(); + for (int i = a.items()-1; i >= 0 && !yes; i--) + { + TToken_string& riga = a.row(i); + const char* t = riga.get(0); + if (tipodoc == t) + { + const int state_fr = riga.get_int(idfr); + const int state_to = riga.get_int(idto); + yes = statodoc >= state_fr && statodoc <= state_to; + } + } + + return yes; +} + +// Metodo standard per contare gli elementi di una tabella +// in attesa di tempi migliori per le librerie +/* +static long table_items(const char* tab) +{ + TRelation tabrel(tab); + TCursor tabcur (&tabrel); + long tot = tabcur.items(); + return tot; +} +*/ + +bool TMSP_mask::carica_documenti() +{ + const bool ignore_mag=get_bool(F_NOMAG_IN); + const bool ignore_imp=get_bool(F_NOIMP_IN); + const bool ignore_lin=get_bool(F_NOLIN_IN); + const bool ignore_cli=get_bool(F_NOCLI_IN); + const bool ignore_allcli=get_bool(F_NOCLI_OUT); + const bool is_master_sched = get_bool(F_MSCHEDULEPLAN); + const bool two_level = get_bool(F_2LEVEL_MSP); + + + TDate date_fr = get(F_DADATA); + const int bucket_fr = round_date(date_fr, FALSE); + TDate date_to = get(F_ADATA); + const int bucket_to = round_date(date_to, TRUE); + + const int year_fr = date_fr.year(); + const int year_to = date_to.year(); + + const TString& numplan = get(F_NUM_PLAN); + + TTable num("%NUM"); + TCodice_numerazione cod; + + TRelation rel(LF_DOC); + TCursor cur(&rel); + const TRectype& curr = cur.curr(); + TRectype filter_fr(curr), filter_to(curr); + + _articles.destroy(); + _constraints.destroy(); + _proposed_articles.destroy(); + + // Scandisce tutte le numerazioni considerando solo quelle + // contenenti i tipi documento specificati nella maschera + for (int err = cod.first(num); err == NOERR; err = cod.next(num)) + { + const int tn = test_codnum(cod); + if (tn) + { + // Filtra il cursore in modo da limitarlo alla numerazione + // corrente ed agli anni specificati dalle due date limite + filter_fr.put(DOC_PROVV, "D"); + filter_fr.put(DOC_CODNUM, cod.get("CODTAB")); + filter_fr.put(DOC_ANNO, year_fr); + filter_to.put(DOC_PROVV, "D"); + filter_to.put(DOC_CODNUM, cod.get("CODTAB")); + filter_to.put(DOC_ANNO, year_to); + cur.setregion(filter_fr, filter_to); + TString cfilter; + cfilter << DOC_CODNUM << "==" << '"' << cod.get("CODTAB")<< '"'; + cur.setfilter(cfilter); + const long items = cur.items(); + cur.freeze(TRUE); + + // Scandisce i documenti inevasi e considera solo + // quelli con uno stato nel range corretto + TString msg; + msg.format("Caricamento documenti %s (numerazione '%s')",tn & 1 ? "ordine":"di planning",(const char *)cod.codice()); + TProgind pi(items,msg , TRUE, TRUE); + for (cur = 0; cur.pos() < items; ++cur) + { + pi.addstatus(1); + if (pi.iscancelled()) + return FALSE; + const bool evaso = curr.get_bool(DOC_DOCEVASO); + if (evaso) + continue; + + // Calcola data di consegna per righe che non ce l'hanno + TDate datacons = curr.get(DOC_DATACONS); + if (!datacons.ok()) + datacons = curr.get(DOC_DATADOC); + + if (!test_status(curr, tn)) + continue; + + // Scandisce le righe articolo e memorizza + // le quantita' richieste + TDocumento doc(cur.curr()); + for (int r = doc.physical_rows(); r > 0; r--) + { + // Seleziona le righe articolo non ancora evase + const TRiga_documento& riga = doc[r]; + if (riga.is_articolo()) + { + const real qta = riga.qtaresidua(); + if (qta > ZERO) + { + const TCodice_articolo art = riga.get(RDOC_CODARTMAG); + const TString16 liv = _livelli.enabled() ? riga.get(RDOC_LIVELLO) : ""; + const long cli = (ignore_cli && (tn & 1)) ||ignore_allcli ? 0 : doc.get_long(DOC_CODCF) ; + const TString16 mag = ignore_mag && (tn & 1) ? "" : riga.get(RDOC_CODMAG); + const TString16 imp = ignore_imp && (tn & 1) ? "" : riga.get(RDOC_IMPIANTO); + const TString16 lin = ignore_lin && (tn & 1) ? "" : riga.get(RDOC_LINEA); + const TCodice_um um = riga.get(RDOC_UMQTA); + TQuantita q(art, um, qta); + q.convert2umbase(); + + TDate consegna = riga.get(RDOC_DATACONS); + if (!consegna.ok()) + consegna = datacons; + int buck = round_date(consegna) - bucket_fr + 1; + if (buck < 0) buck = 0; else + if (buck > LAST_BUCKET) buck = LAST_BUCKET; + + TMSP_constraint* line; + if (tn & 1) + { + line = _constraints.find(cli, art, liv, imp, lin, mag, TRUE); + if (two_level && !distinta_master(art)) + { + TString master, ummaster, livmaster,impmaster(imp), linmaster(lin),magmaster; + real expr; + if (!line->has_mastercodes()) + { + int i=0; + while ((i=find_distinta_master(art, master, livmaster, ummaster, expr, impmaster, linmaster, magmaster,i)+1) >0) + { + TMSP_constraint*masterline=_constraints.find(cli, master , livmaster, imp, lin, mag, TRUE); + masterline->add_upperline(*line); + line->add_mastercode(new TMaster_code (master, livmaster, ummaster, expr, cache().get(LF_ANAMAG,master).get_real(ANAMAG_GIORNIRIOR), imp, lin, mag)); + } + } + } + } else { + line = _articles. find(cli, art, liv, imp, lin, mag, TRUE); + } + + if (line->desc().empty()) + line->set_desc(riga.get(RDOC_DESCR)); + + if (buck > 0 && buck < LAST_BUCKET && cod.codice() == numplan) + { + long numdoc; + int numrig; + if (!line->riga(buck, numdoc, numrig)) + { + numdoc = riga.get_long(RDOC_NDOC); + numrig = riga.get_int(RDOC_NRIGA); + line->set_riga(buck, numdoc, numrig);// memorizza la provenienza dal doc + } + } + + line->qta(buck) += q.val(); + real price; + find_price(get(F_TIPOCV),get(F_CODCONDV),get(F_CATVEN_CV), + get(F_TIPOCF), cli, art, + line->qta(buck), price); + line->price(buck) = price; + } + } + } + } + cur.freeze(FALSE); + } + } + + return _constraints.items() > 0L || _articles.items() > 0L; +} + +// cerca il vincolo "migliore" secondo la logica : +// - stesso magazzino , impianto e linea +// - stesso magazzino e impianto +// - stesso magazzino +// - stesso impianto e linea +// - stessa linea +TMSP_constraint* TMSP_mask::find_constraint(const TMSP_line& l, bool force_insert) +{ + const bool ignore_mag=get_bool(F_NOMAG_IN); + const bool ignore_imp=get_bool(F_NOIMP_IN); + const bool ignore_lin=get_bool(F_NOLIN_IN); + const bool ignore_cli=get_bool(F_NOCLI_IN); + + TString16 codmag=ignore_mag ? "" : l.codmag(); + TString16 codimp=ignore_imp ? "" : l.codimp(); + TString16 codlin=ignore_lin ? "" : l.codlin(); + long codcli=ignore_cli ? 0L : l.cliente() ; + // se il magazzino o l'impianto non e' indicato sul vincolo cerca di individuarlo + // in base ai default di linea/impianto + if (codimp.blank()) + { + if (!codlin.blank()) + { + TLinea_prod &linea_prod=*::get_linea(codlin); + codimp=linea_prod.codimp(); + } + } + if (codmag.blank()) + { + if (!codlin.blank()) + { + TLinea_prod &linea_prod=*::get_linea(codlin); + codmag=linea_prod.codmagdep(); + } else + if (!codimp.blank()) + { + TImpianto &impianto=*::get_impianto(codimp); + codmag=impianto.codmagdep(); + } + } + + // cerca il vincolo con - stesso magazzino , impianto e linea + TMSP_constraint* c = _constraints.find(codcli, l.codice(), l.livgiac(), codimp, codlin, codmag); + if (c == NULL ) + { + if (!codmag.blank()) + { + // cerca il vincolo con - stesso magazzino e impianto + c =_constraints.find(codcli, l.codice(), l.livgiac(), codimp, "", codmag); + if (c == NULL) + // cerca il vincolo con - stesso magazzino + c =_constraints.find(codcli, l.codice(), l.livgiac(), "", "", codmag); + } + if (c == NULL) + // cerca il vincolo con - stesso impianto e linea + c =_constraints.find(codcli, l.codice(), l.livgiac(), codimp, codlin, ""); + if (c == NULL) + // cerca il vincolo con - stessa impianto + c =_constraints.find(codcli, l.codice(), l.livgiac(), codimp, "" , ""); + } + if (c == NULL && force_insert) + { + // MA STO VINCOLO MANCA PROPRIO! ALLORA LO INSERISCO + c = _constraints.find(codcli, l.codice(), l.livgiac(), codimp, codlin, codmag, TRUE); + if (c->desc().blank()) + c->set_desc(l.desc()); + } + return c; +} + +int TMSP_mask::find_constr_row(const TMSP_constraint& c) +{ + TSheet_field& sf = sfield(F_ARTICOLI); + const int maxart=sf.items(); + for (int r=0; r 0 && b < LAST_BUCKET) + { + sf.enable_column(F_BUCKET0 + b*2, d < date_to); + sf.enable_column(F_BUCKET0 + b*2+1, d < date_to); + sl.enable_column(F_LBUCKET0 + b, d < date_to); + //su.enable_column(F_LBUCKET0 + b, d < date_to); + } + str = d.string(); + switch(b) + { + case 0: str.insert("< "); break; + //case 9: /* Nothing!! */ ; break; + case LAST_BUCKET: str.insert(">= "); break; + default: d += bucket_size; break; + } + sf.set_column_header(F_BUCKET0 + b*2, str); + sf.set_column_header(F_BUCKET0 + b*2 +1, str); + sl.set_column_header(F_LBUCKET0 + b, str); + //su.set_column_header(F_LBUCKET0 + b, str); + } + + TMSP_constraint* last_constraint = NULL; + + const long totart = _articles.sort(); + TWait_cursor hourglass; + for (long i = 0; i < totart; i++) + { + TMSP_line& line = _articles[i]; + TMSP_constraint* curr_constraint = find_constraint(line,TRUE); + if (last_constraint != curr_constraint) + { + // aggiunge la linea di vincolo + TToken_string& consrow = sf.row(-1); + curr_constraint->fill_sheet_row(consrow, *this); + consrow.add("** Ordini ",F_DESCART-FIRST_FIELD); + sf.disable_cell(sf.items()-1, -1); + // aggiunge la linea della giacenza prog + TToken_string& rowgiac = sf.row(-1); + copy_sheet_row(rowgiac,consrow); + rowgiac.add("** Giacenza teorica",F_DESCART-FIRST_FIELD); + sf.disable_cell(sf.items()-1, -1); + last_constraint = curr_constraint; + curr_constraint->set_on_sheet(); + } + TToken_string& row = sf.row(-1); + line.fill_sheet_row(row, *this); + } + const long totcon = _constraints.sort(); + for (long j = 0; j < totcon; j++) + { + TMSP_constraint& cons = _constraints[j]; + if (!cons.is_on_sheet()) + { + // aggiunge le tre linee + TToken_string& row = sf.row(-1); + cons.fill_sheet_row(row, *this); + cons.set_on_sheet(); + sf.disable_cell(sf.items()-1, -1); + //linea della giacenza prog + TToken_string& rowgiac = sf.row(-1); + copy_sheet_row(rowgiac,row); + sf.disable_cell(sf.items()-1, -1); + //linea articolo (vuota) + TMSP_line line(cons); + line.fill_sheet_row(sf.row(-1), *this); + rowgiac.add("** Giacenza teorica",F_DESCART-FIRST_FIELD); + row.add("** Ordini ",F_DESCART-FIRST_FIELD); + } + } + for (int r = sf.items()-1; r >0 ; ) + { + // init bucket 0 + TCodice_articolo codart(sf.cell(r,sf.cid2index(F_ARTICOLO))); + if (codart.blank()) + r = r-2; + TArticolo_giacenza art(codart); + r=init_bucket0(art, r); + } + sf.force_update(); +} + +bool TMSP_mask::distinta_master(const char *code) +{ + const TRectype &rec=cache().get(LF_DIST,code); + if (rec.empty()) return FALSE; + return rec.get_bool("MASTER"); +} + +int TMSP_mask::find_distinta_master(const char * code, TString & master,TString & livmaster,TString & um, real & expr, TString & imp,TString & lin,TString & magdep, int fromindex) +{ + TArray sons; + if (_dist_tree.set_root(code)) + { + _dist_tree.explode(sons, FALSE, RAGGR_EXP_NONE, 1); + TRiga_esplosione* riga; + while (riga=(TRiga_esplosione* )sons.objptr(fromindex)) + { + if (distinta_master(riga->articolo())) + { + master=riga->articolo(); + livmaster=riga->livello(); + um =riga->um(); + expr =riga->val(); + return fromindex; + } + fromindex=sons.succ(fromindex); + } + } + master=""; + return -1; +} + +bool TMSP_mask::insert_propose(bool verbose) +{ + if (_proposed_articles.items()<=0L) + { + if (verbose) + message_box("Nessuna nuova proposta"); + return FALSE; + } + else + { + add_or_sub_propose(+1); + const long new_rows=_proposed_articles.items(); + TSheet_field& sf = sfield(F_ARTICOLI); + int firstbuck; + TDate firstdate(get_date(F_ADATA)); + for (long new_row=0; new_row < new_rows; new_row++) + { + const TDate & d=_proposed_articles[new_row].time(0).date() ; + firstdate=min(firstdate,d); + } + firstbuck=int((firstdate- get_date(F_DADATA))/days_per_bucket())+1; + if (verbose) + message_box("Quantita' proposte a partire dal %s (colonna %0d)", (const char *)firstdate.string(), int(firstbuck)); + } + return TRUE; +} +bool TMSP_mask::remove_propose(bool verbose) +{ + if (_proposed_articles.items()<=0L) + { + if (verbose) + message_box("Nessuna proposta da annullare"); + return FALSE; + } + add_or_sub_propose(-1); + _proposed_articles.destroy(); + return TRUE; +} + +void TMSP_mask::add_or_sub_propose(char sign) +{ + const long new_rows=_proposed_articles.items(); + TSheet_field& sf = sfield(F_ARTICOLI); + for (long new_row=0; new_row < new_rows; new_row++) + { + const TMRP_line & a=_proposed_articles[new_row]; + TMSP_line line(a.codcli(), a.codice(), a.livgiac(), a.codimp(), a.codlin(), a.codmag()); + + bool line_found=FALSE; + TMSP_constraint* constraint= find_constraint(line,FALSE); + if (constraint==NULL) + { + CHECK( sign>0, "Impossibile trovare il vincolo da soddisfare..."); + // aggiunge le tre linee + constraint=new TMSP_constraint(line); + TToken_string& row = sf.row(-1); + constraint->fill_sheet_row(row, *this); + constraint->set_on_sheet(); + sf.disable_cell(sf.items()-1, -1); + //linea della giacenza prog + TToken_string& rowgiac = sf.row(-1); + copy_sheet_row(rowgiac,row); + sf.disable_cell(sf.items()-1, -1); + //linea articolo (vuota) + TToken_string& emptyrowc = sf.row(-1); + rowgiac.add("** Giacenza teorica",F_DESCART-FIRST_FIELD); + row.add("** Ordini ",F_DESCART-FIRST_FIELD); + } + int art_row; + for (art_row=int(sf.items())-1;art_row >=0; art_row--) + { + TToken_string &row=sf.row(art_row); + long codcli; + TCodice_articolo codart ; + TString16 liv, mag, codimp, codlin, codum; + msprow2codes(row,codcli,codart,liv, mag, codimp, codlin, codum); + + if (!sf.cell_disabled(art_row, F_BUCKET1-FIRST_FIELD)) + { + line_found=(a.codcli()==codcli && a.codice()==codart && a.livgiac()==liv + && a.codimp()==codimp && a.codlin()==codlin && a.codmag()==mag ); + if (line_found) + break; + } else { + TMSP_constraint* currcons=_constraints.find(codcli, codart, liv, codimp, codlin, mag); + if (constraint==currcons) + break; + } + } + if (!line_found) + { + art_row++; + sf.insert(art_row); + TToken_string& artrow = sf.row(art_row); + constraint->fill_sheet_row(artrow, *this,TRUE); + artrow.add(a.codimp(), F_CODIMP-FIRST_FIELD); + artrow.add(a.codlin(), F_CODLIN-FIRST_FIELD); + TString16 str=a.codmag().left(3); + artrow.add(str, F_MAGAZZINO-FIRST_FIELD); + str=a.codmag().mid(3); + artrow.add(str, F_DEPOSITO-FIRST_FIELD); + } + TToken_string& artrow = sf.row(art_row); + const int lastbuck =_proposed_articles[new_row].last_bucket(); + //TDate data_buck; + for (int bucket=0; bucket<=lastbuck ; bucket++) + { + int b= int((_proposed_articles[new_row].time(bucket).date() - get_date(F_DADATA))/days_per_bucket()); + + real art_per_buck(artrow.get(F_BUCKET1 + b*2 - FIRST_FIELD)); + if (sign>0) + art_per_buck+=_proposed_articles[new_row].sched_receipts(bucket); + else + { + if (art_per_buck >= _proposed_articles[new_row].sched_receipts(bucket)) + art_per_buck-=_proposed_articles[new_row].sched_receipts(bucket); + else + art_per_buck=ZERO; + } + artrow.add(art_per_buck.string(), F_BUCKET1 + b*2 - FIRST_FIELD); + real price; + if (!art_per_buck.is_zero()) + find_price(get(F_TIPOCV),get(F_CODCONDV),get(F_CATVEN_CV), + get(F_TIPOCF), a.codcli(), a.codice(), + art_per_buck, price); + artrow.add(price.string(), F_BUCKET1 + b*2 + 1 - FIRST_FIELD); + } + test_art_row(art_row,FALSE); + } + sf.force_update(); +} + + +// compatta le linee togliendo i doppioni +void TMSP_mask::pack_article_sheet() +{ + TSheet_field& sf = sfield(F_ARTICOLI); + TToken_string lastrow; + for (int art_row=int(sf.items())-1; art_row >=0; art_row--) + { + if (!sf.cell_disabled(art_row, F_BUCKET1-FIRST_FIELD)) + { + TToken_string &row=sf.row(art_row); + long codcli = atol(row.get(F_CLIENTE-FIRST_FIELD)); + TCodice_articolo codart = row.get(F_ARTICOLO-FIRST_FIELD); + TString16 codimp= row.get(F_CODIMP-FIRST_FIELD); + TString16 codlin= row.get(F_CODLIN-FIRST_FIELD); + TString16 liv; + _livelli.pack_grpcode(liv, row.get(sf.cid2index(F_LIV1)),1); + _livelli.pack_grpcode(liv, row.get(sf.cid2index(F_LIV2)),2); + _livelli.pack_grpcode(liv, row.get(sf.cid2index(F_LIV3)),3); + _livelli.pack_grpcode(liv, row.get(sf.cid2index(F_LIV4)),4); + TString16 mag; + add_magcode(mag, row.get(F_MAGAZZINO-FIRST_FIELD)); + add_depcode(mag, row.get(F_DEPOSITO-FIRST_FIELD)); + + for (int bucket=0; bucket<=LAST_BUCKET ; bucket++) + { + real art_per_buck(lastrow.get(F_BUCKET1 + bucket*2 - FIRST_FIELD)); + row.add(art_per_buck.string(), F_BUCKET1 + bucket*2 - FIRST_FIELD); + } + } + } + sf.force_update(); +} + + +void TMSP_mask::check_articles() +{ + TSheet_field& sf = sfield(F_ARTICOLI); + int items=sf.items(); + if (items==0) + { + message_box("Nessun articolo da verificare"); + return; + } + TMSPCheck_mask cm(this); + cm.run(); + cm.gopos_mainmask(); +} + +void TMSP_mask::check_capacities() +{ + TSheet_field& sf = sfield(F_LINEE); + int items=sf.items(); + if (items==0) + { + message_box("Nessun carico di linea da verificare"); + return; + } + TCRPCheck_mask cm(this); + cm.run(); + set_focus_field(sf.dlg()); + sf.set_focus_cell(cm.last_row(),cm.last_col()+F_LBUCKET0); +} + +bool TMSP_mask::sort_sheet() +{ + TWait_cursor hg; + TSheet_field& a = sfield(F_ARTICOLI); + bool ok=TRUE; + switch (-get_int(F_MSP_SORT)) + { + case SORT_BY_CAL: + a.sort(TRiga_articolo::order_compareCAL); break; + case SORT_BY_CLA: + a.sort(TRiga_articolo::order_compareCLA); break; + case SORT_BY_ACL: + a.sort(TRiga_articolo::order_compareACL); break; + case SORT_BY_ALC: + a.sort(TRiga_articolo::order_compareALC); break; + case SORT_BY_LCA: + a.sort(TRiga_articolo::order_compareLCA); break; + case SORT_BY_LAC: + a.sort(TRiga_articolo::order_compareLAC); break; + default: + return FALSE; + } + a.force_update(); + return ok; +} + +void TMSP_mask::add_MRP_bucket(TMRP_line& new_article, int nbucket, const real &curr_arts) +{ + TDate data_buck; + data_buck=get_date(F_DADATA); + data_buck+=days_per_bucket()*(nbucket-1); + TMRP_time t(data_buck, 0, "", ""); + new_article.add_sched_rec(t, curr_arts ); +} + + +void TMSP_mask::propose_1stJIT(TMSP_logic logic, bool check_machine, bool check_human) +{ + const bool useextralines=get_bool(F_USENONSTDLIN_MSP); + const bool useextrahours=get_bool(F_USEEXTRAHRS_MSP) ; + const bool lotsizing=get_bool(F_LOTSIZING) ; + const bool no_outcapacity=get_bool(F_OUTOFCAPACITY) ; + const int anticipomin=get_int(F_ANTICIPOMIN); + const int anticipomax=get_int(F_ANTICIPOMAX); + bool ok=TRUE; + // per sicurezza devo (ri-)calcolare il carico attuale..... + _capacities.destroy(); + if (check_machine || check_human) + { + if (ok = load_MRP_lines(_actual_schedule)) + { + nettify_MRP_lines(TRUE,FALSE); + ok = general_review(check_machine, check_human, useextralines, useextrahours,FALSE, no_outcapacity,0, 0,_actual_schedule, logic); + } + } + // (two) levels master scheduling + TMRP_lines _1stlevel; + bool some=FALSE; + for (int level=1; ok && level <= 2; level++) + { + if (ok = load_MRP_lines(_stock_break,level)) + { + _proposed_articles.destroy(); + nettify_MRP_lines(FALSE, lotsizing); + if (ok = general_review(check_machine, check_human, useextralines, useextrahours,lotsizing, no_outcapacity,anticipomin,anticipomax,_stock_break, logic)) + some = insert_propose(some || level==2); + if (level==1) + _1stlevel=_proposed_articles; + if (level==2) + _proposed_articles.add(_1stlevel); + } + } + if (!ok) + remove_propose(); + _capacities.sort(); +} + +/* +void TMSP_mask::propose_firstfit(bool check_machine, bool check_human) +{ + const bool useextralines=get_bool(F_USENONSTDLIN_MSP); + const bool useextrahours=get_bool(F_USEEXTRAHRS_MSP) ; + const bool lotsizing=get_bool(F_LOTSIZING) ; + const bool no_outcapacity=get_bool(F_OUTOFCAPACITY) ; + const int anticipomin=get_int(F_ANTICIPOMIN); + const int anticipomax=get_int(F_ANTICIPOMAX); + bool ok=TRUE; + // per sicurezza devo (ri-)calcolare il carico attuale..... + _capacities.destroy(); + if (check_machine || check_human) + { + if (ok = load_MRP_lines(_actual_schedule)) + { + nettify_MRP_lines(TRUE,FALSE); + ok = firstfit_review(check_machine, check_human, useextralines, useextrahours,FALSE, no_outcapacity,0, 0,_actual_schedule); + } + } + // (two) levels master scheduling + TMrp_lines _1stlevel; + for (int level=1; level <= 2; level++) + { + if (ok && (ok = load_MRP_lines(_stock_break,level))) + { + nettify_MRP_lines(FALSE, lotsizing); + if (ok = firstfit_review(check_machine, check_human, useextralines, useextrahours,lotsizing, no_outcapacity,anticipomin,anticipomax,_stock_break)) + { + insert_propose(); + _1stlevel=_proposed_articles(); + + } + } + } + if (!ok) + remove_propose(); + _capacities.sort(); +} + +// propone i valori con logica Just-in-time +void TMSP_mask::propose_JIT(bool check_machine, bool check_human) +{ + const bool useextralines=get_bool(F_USENONSTDLIN_MSP); + const bool useextrahours=get_bool(F_USEEXTRAHRS_MSP) ; + const bool lotsizing=get_bool(F_LOTSIZING) ; + const bool no_outcapacity=get_bool(F_OUTOFCAPACITY) ; + const int anticipomin=get_int(F_ANTICIPOMIN); + const int anticipomax=get_int(F_ANTICIPOMAX); + bool ok=TRUE; + // per sicurezza devo (ri-)calcolare il carico attuale..... + _capacities.destroy(); + if (check_machine || check_human) + { + if (ok = load_MRP_lines(_actual_schedule)) + { + nettify_MRP_lines(TRUE, FALSE); + ok = JIT_review(check_machine, check_human, useextralines, useextrahours,FALSE, no_outcapacity,0, 0,_actual_schedule); + } + } + // (two) levels master scheduling + for (int level=1; level < 2; level++) + { + if (ok && (ok = load_MRP_lines(_stock_break, 1))) + { + nettify_MRP_lines(FALSE, lotsizing); + if (ok = JIT_review(check_machine, check_human, useextralines, useextrahours,FALSE, no_outcapacity,anticipomin,anticipomax,_stock_break)) + insert_propose(); + } + } + if (!ok) + remove_propose(); + _capacities.sort(); +} + + +bool TMSP_mask::firstfit_review(bool check_machine, bool check_human, bool useextralines, bool useextrahours,bool lotsizing, bool no_outcapacity, int anticipomin,int anticipomax, TMSP_mode mode) +{ + return general_review(check_machine, check_human, useextralines, useextrahours,lotsizing, no_outcapacity, anticipomin,anticipomax, mode, _first_fit_logic); +} + + +bool TMSP_mask::JIT_review(bool check_machine, bool check_human, bool useextralines, bool useextrahours,bool lotsizing, bool no_outcapacity, int anticipomin,int anticipomax, TMSP_mode mode) +{ + return general_review(check_machine, check_human, useextralines, useextrahours,lotsizing, no_outcapacity, anticipomin,anticipomax, mode, _JIT_logic); +} +*/ + +// propone i valori con logica first-fit +// cerca il primo bucket con capacità produttiva +bool TMSP_mask::general_review(bool check_machine, bool check_human, bool useextralines, bool useextrahours,bool lotsizing, bool no_outcapacity, int anticipomin,int anticipomax, TMSP_mode mode, TMSP_logic logic ) +{ + const bool ignore_mag=get_bool(F_NOMAG_IN); + const bool ignore_imp=get_bool(F_NOIMP_IN); + const bool ignore_lin=get_bool(F_NOLIN_IN); + TLavorazione *curr_labor; + TLinea_prod linea_prod; + TArray labors; + + const long max_mrp_rows=_mrp_articles.items(); + const char *msg; + if (mode == _actual_schedule) + msg="Calcolo carico attuale"; + else + msg="Calcolo nuove proposte"; + TProgind pi(max_mrp_rows,msg, TRUE, TRUE); + + for (long mrp_row=0; mrp_row < max_mrp_rows; mrp_row++) + { + pi.addstatus(1); + if (pi.iscancelled()) + return FALSE; + TMRP_line &mrpline=_mrp_articles[mrp_row]; + TString16 livello_di_giacenza(mrpline.livgiac()); + TString16 codlin(mrpline.codlin()); + TString16 codimp(mrpline.codimp()); + bool no_labor=!_dist_tree.set_root(mrpline.codice()); + if (!no_labor) + { + TDate data_buck; + // la logica del ciclo sulle lav e' da invertire: prima il bucket , poi le lavorazioni + // se si vogliono caricare più lavorazioni + TRiga_esplosione * l=_dist_tree.first_critical_labor(labors); + no_labor=(l==NULL); + if (!no_labor) + { + curr_labor=TDistinta_tree::find_labor(l); + // cerca le linee sulle quali e' possibile eseguire questa lavorazione + // e la carica con la lavorazione relativa all'articolo corrente + const int lineestd = curr_labor->linee_standard(); + const int maxlinee = useextralines ? curr_labor->linee() : lineestd; + TCRP_line *crpline,*crpline_imp,*crpline_firm; + const int lastbuck =mrpline.last_bucket(); + for (int bucket=0; bucket<=lastbuck ; bucket++) + { + real curr_arts, art_per_buck(mrpline.net_requirement(bucket)); // quantità da produrre nel bucket + real load, capacity, unit_load, hload, hcapacity, unit_hload ; // carichi di linea + int nbucket, lower_buck, upper_buck; + int attemp=1; // primo tentativo: rimane entro i vincoli di minimo e massimo anticipo utilizando solo le linee STD + // secondo tentativo: rimane entro i vincoli di minimo e massimo anticipo utilizando anche le linee non STD + // terzo tentativo: supera i vincoli di minimo e massimo anticipo utilizando anche le linee non STD + art_per_buck.round(5); + while (art_per_buck > ZERO && attemp <= 3) + { + if (logic == _first_fit_logic) + { + lower_buck = bucket - anticipomax/days_per_bucket(); + upper_buck = (attemp <= 2 ? bucket-anticipomin/days_per_bucket(): LAST_BUCKET); + nbucket=lower_buck; + } else { + lower_buck = (attemp <= 2 ? bucket-anticipomax/days_per_bucket(): 0); + upper_buck = bucket - anticipomin/days_per_bucket(); + nbucket=upper_buck; + } + if (lower_buck<1) + lower_buck=1; + if (nbucket<1) + nbucket=1; + do { + int nlinea, numlinee; + + if (ignore_lin || codlin.blank() ) + { + nlinea=(attemp == 2 ? lineestd : 0 ) ; + numlinee=(attemp == 1 ? lineestd : maxlinee ) ; + } else { + nlinea= curr_labor->find_linea(codlin); + if (nlinea<0) + { + error_box("La linea %s non e' in grado di produrre l'articolo %s", (const char * )codlin, (const char *) _mrp_articles[mrp_row].codice()); + break; + } + numlinee=nlinea+1; + } + while (art_per_buck > ZERO && nlinea >= 0 && nlineacod_linea(nlinea)); + if ( ignore_imp || codimp.blank() || codimp == linea_prod.codimp()) + { + crpline=_capacities.find(linea_prod); + if (crpline==NULL) + crpline=compute_capacity(linea_prod,useextralines, useextrahours); + crpline_imp =_capacities.find(linea_prod.codimp()); + crpline_firm=_capacities.find(); + int human_level=1; + if ( linea_prod.personale_dedicato()) + human_level=3; + else if (linea_prod.get_impianto()->personale_dedicato()) + human_level=2; + // individua il massimo caricabile sulla linea + unit_load = l->val()*curr_labor->um_temporale().converti_in_ore()/curr_labor->produttiv_linea(nlinea); + unit_hload=unit_load*curr_labor->numpers_linea(nlinea); + + capacity = check_machine ? crpline->capacity(nbucket) : MAXCAPACITY; + load = crpline->load(nbucket); + switch (human_level) + { + case 3: + hcapacity = crpline->human_capacity(nbucket) ; + hload = crpline->human_load(nbucket); + break; + case 2: + hcapacity = crpline_imp->human_capacity(nbucket) ; + hload = crpline_imp->human_load(nbucket); + break; + default: + hcapacity = crpline_firm->human_capacity(nbucket) ; + hload = crpline_firm->human_load(nbucket); + break; + } + // ridimensiona al massimo numero di articoli dovuto alle macchine + curr_arts = art_per_buck ; + if (mode != _actual_schedule /*|| no_outcapacity*/) + { + if (load + curr_arts * unit_load > capacity ) + { + curr_arts = (capacity - load ) / unit_load; + curr_arts.floor(); + } + // ridimensiona al massimo numero di articoli dovuto alle macchine + if (check_human && hload + curr_arts * unit_hload > hcapacity) + { + curr_arts = (hcapacity - hload) / unit_hload; + curr_arts.floor(); + } + /* + // elimina i picchi di capacita' (errato) + if (curr_arts != art_per_buck && mode == _actual_schedule) + { + TMRP_line* new_article = _proposed_articles.find(mrpline.codice(), + mrpline.livgiac(), mrpline.codmag(), + linea_prod.codimp() , linea_prod.codice(), mrpline.codcli(), TRUE); + add_MRP_bucket(*new_article, nbucket, curr_arts-art_per_buck ); + }*/ + } + if (curr_arts>ZERO) + { + // aggiunge il carico macchina + art_per_buck-=curr_arts; + load= curr_arts * unit_load; + crpline->add_load(nbucket, load ); + // aggiunge il carico uomo + load*=curr_labor->numpers_linea(nlinea); + switch (human_level) + { + case 3: + crpline->add_human_load(nbucket, load ); + case 2: + crpline_imp->add_human_load(nbucket, load ); + default: + crpline_firm->add_human_load(nbucket, load ); + } + if (mode == _stock_break) + { + TMRP_line* new_article = find_propose(mrpline.codcli(), mrpline.codice(), + mrpline.livgiac(), linea_prod.codimp() , linea_prod.codice(), mrpline.codmag(), TRUE); + add_MRP_bucket(*new_article, nbucket, curr_arts); + } + } + } else + error_box("Articolo %s: impianto %s incompatibile con la linea %s",(const char *)mrpline.codice(), (const char *)codimp, (const char *)linea_prod.codice()); + nlinea++; + } // ciclo sulle linee + if (logic == _first_fit_logic) + nbucket++; + else + nbucket--; + } while(art_per_buck > ZERO && nbucket>=lower_buck && nbucket <= upper_buck ); + attemp++; // altro tentativo + } + } + l=_dist_tree.next_critical_labor(labors); + } + } + if (no_labor) // nessuna lavorazione da controllare o capacita' infinita + { + if (mode == _stock_break) + { + const int lastbuck =mrpline.last_bucket(); + for (int b=0; b<=lastbuck ; b++) + { + real art_per_buck(mrpline. net_requirement(b));// quantità da produrre nel bucket + if (art_per_buck > ZERO) + { + int nbucket; + if (logic == _first_fit_logic) + nbucket = b - anticipomax/days_per_bucket(); + else + nbucket = b - anticipomin/days_per_bucket(); + if (nbucket<1) + nbucket=1; + TMRP_line* new_article = find_propose(mrpline.codcli(), mrpline.codice(), mrpline.livgiac(), + mrpline.codimp() , mrpline.codlin(), mrpline.codmag(), TRUE); + add_MRP_bucket(*new_article, nbucket, art_per_buck); + } + } + } + } + } + return TRUE; +} + + +bool TMSP_mask::capacity_review(bool useextralines, bool useextrahours) +{ + bool ok; + if (!load_MRP_lines(_actual_schedule)) + return FALSE; + nettify_MRP_lines(TRUE); + + _capacities.destroy(); + if (get(F_RECALC_TYPE).left(1)=="1") + ok = general_review(TRUE, TRUE, useextralines, useextrahours, FALSE, FALSE, 0, 0, _actual_schedule,_first_fit_logic); + else if (get(F_RECALC_TYPE).left(3)=="JIT") + ok = general_review(TRUE, TRUE, useextralines, useextrahours, FALSE, FALSE, 0, 0, _actual_schedule,_first_fit_logic); + + _capacities.sort(); + return ok; +} + + +TCRP_line *TMSP_mask::compute_capacity(TLinea_prod &lineaprod, bool useextralines, bool useextrahours) +{ + TMRP_calendar & cal = TMRP_time::get_calendar("", lineaprod.codice()); + TMRP_calendar & cal_imp = TMRP_time::get_calendar("", lineaprod.codimp()); + TMRP_calendar & cal_firm = TMRP_time::get_calendar(""); + CHECK(_capacities.find(lineaprod,FALSE)==NULL,"Errore: impossibile ricalcolare la capacita' di una linea produttiva"); + + TCRP_line *crpline,*crpline_imp,*crpline_firm; + crpline =_capacities.find(lineaprod, "", 0L,TRUE); + const bool compute_imp = (_capacities.find(lineaprod.codimp(), "", "", 0L)==NULL); + crpline_imp =_capacities.find(lineaprod.codimp(), "", "", 0L, TRUE); + const bool compute_firm = (_capacities.find("", "", "", 0L)==NULL); + crpline_firm=_capacities.find("", "", "", 0L, TRUE); + + // calcola la capacita' + TDate data_buck=get_date(F_DADATA); + real capacity,human,human_imp,human_firm; + for (int b=1; b=0 ; day--) + { + cal.add_oremacchina(capacity, data_buck,useextrahours); + if (lineaprod.personale_dedicato()) + cal.add_oreuomo(human, data_buck,useextrahours); + if (compute_imp && lineaprod.get_impianto()->personale_dedicato()) + cal_imp.add_oreuomo(human_imp, data_buck,useextrahours); + if (compute_firm) + cal_firm.add_oreuomo(human_firm, data_buck,useextrahours); + ++data_buck; + } + crpline->set_capacity(b,capacity); + if (human > ZERO) + { + crpline->set_human_capacity(b,human); + crpline_imp->set_human_capacity(b,human+crpline_imp->human_capacity(b)); + crpline_firm->set_human_capacity(b,human+crpline_firm->human_capacity(b)); + } + else + crpline->set_human_capacity(b,ZERO); + if (human_imp > ZERO) + { + crpline_imp->set_human_capacity(b,human_imp+crpline_imp->human_capacity(b)); + crpline_firm->set_human_capacity(b,human_imp+crpline_firm->human_capacity(b)); + } + else + crpline_imp->set_human_capacity(b,ZERO); + if (human_firm > ZERO) + crpline_firm->set_human_capacity(b,human_firm+crpline_firm->human_capacity(b)); + } + return crpline; +} + +TMRP_line* TMSP_mask::find_propose( + long codcli, const char * codart,const char * liv, + const char * codimp,const char * codlin, + const char * mag, bool Force) +{ + return _proposed_articles.find(codart,liv,mag,codimp,codlin,codcli, Force); +} + +// carica le MRP line dallo sheet articoli +void TMSP_mask::msprow2codes(TToken_string &row,long &clifor, TCodice_articolo &art , + TString & liv, TString & mag, TString & imp, TString & lin, TString & um) +{ + clifor = row.get_long(F_CLIENTE-FIRST_FIELD); + art = row.get(F_ARTICOLO-FIRST_FIELD); + _livelli.pack_grpcode(liv, row.get(F_LIV1-FIRST_FIELD),1); + _livelli.pack_grpcode(liv, row.get(F_LIV2-FIRST_FIELD),2); + _livelli.pack_grpcode(liv, row.get(F_LIV3-FIRST_FIELD),3); + _livelli.pack_grpcode(liv, row.get(F_LIV4-FIRST_FIELD),4); + add_magcode(mag,row.get(F_MAGAZZINO-FIRST_FIELD)); + add_depcode(mag,row.get(F_DEPOSITO-FIRST_FIELD)); + imp = row.get(F_CODIMP-FIRST_FIELD); imp.trim(); + lin = row.get(F_CODLIN-FIRST_FIELD); lin.trim(); + um = row.get(F_UM-FIRST_FIELD); um.trim(); +} + +void TMSP_mask::crprow2codes(TToken_string &row, TString & imp, TString & lin, long &clifor, TCodice_articolo &art , + TString & liv, TString & um) +{ + clifor=0L;//clifor = row.get_long(F_CLIENTE-FIRST_FIELD); + //art = row.get(F_ARTICOLO-FIRST_FIELD); + //_livelli.pack_grpcode(liv, row.get(F_LIV1-FIRST_FIELD),1); + //_livelli.pack_grpcode(liv, row.get(F_LIV2-FIRST_FIELD),2); + //_livelli.pack_grpcode(liv, row.get(F_LIV3-FIRST_FIELD),3); + //_livelli.pack_grpcode(liv, row.get(F_LIV4-FIRST_FIELD),4); + imp = row.get(F_CODIMPCRP-FIRST_FIELD); imp.trim(); + lin = row.get(F_CODLINCRP-FIRST_FIELD); lin.trim(); + um = row.get(F_LUM-FIRST_FIELD); um.trim(); +} +// carica le MRP line dallo sheet articoli +bool TMSP_mask::load_MRP_lines(TMSP_mode mode, int level) +{ + TSheet_field& sa = sfield(F_ARTICOLI); + if (sa.items()==0) + { + message_box("Nessun articolo da valutare"); + return FALSE; + } + const int a_buck0 = sa.cid2index(F_BUCKET0); + TDate data_buck; + + _mrp_articles.destroy(); + // calcola gli impegni di produzione per gli articoli dello sheet + bool skip=FALSE; + TMRP_line* last_constraint = NULL; + FOR_EACH_SHEET_ROW(sa, r, row) if (!sa.cell_disabled(r, a_buck0+2) || sa.cell_disabled(r+1, a_buck0+2)) + { + const bool is_constraint=sa.cell_disabled(r, a_buck0+2); + if (is_constraint) + { + const bool has_mastercodes=(*row->get(F_MASTERCODE-FIRST_FIELD)=='M'); + skip = (level == 1 && !has_mastercodes || level == 2 && has_mastercodes ); + } + if (!skip) + { + long clifor; + TCodice_articolo art ; + TString16 liv,mag, imp, lin; + TCodice_um um ; + msprow2codes(*row,clifor, art , liv, mag, imp, lin, um); + + TMRP_line* curr_article = _mrp_articles.find(art, liv, mag, imp, lin, clifor ,TRUE); + if (is_constraint) + last_constraint=curr_article; + + bool added_some=FALSE; + for (int nbucket=LAST_BUCKET-1; nbucket>=0 ; nbucket--) + { + data_buck=get_date(F_DADATA); + data_buck+=days_per_bucket()*nbucket; + const TMRP_time t(data_buck, 0, imp, lin); + real qta=row->get(a_buck0+nbucket*2); + if (qta != ZERO) + { + TQuantita q(art, um, qta); + q.convert2umbase(); + // mette i vincoli nel gross req + // e le celle normali negli sched receipts + switch (mode) + { + case _actual_schedule: + if (!is_constraint) + { + curr_article->add_gross_req(t, q.val()); + curr_article->add_sched_rec(t, q.val()); + } + break; + case _stock_break: + if (is_constraint) + { + curr_article->add_gross_req(t, q.val()); + last_constraint=curr_article; + } else { + if (last_constraint) + last_constraint->add_sched_rec(t, q.val()); + } + break; + } + added_some=TRUE; + } else + if (added_some) + curr_article->set_on_hand(t, ZERO); + if (nbucket == 0) + curr_article->set_on_hand(t, curr_article->giacenza_attuale(qta,data_buck)); + } + } + } + return TRUE; +} + +// is_net_requirement: dice se le quantità presenti sono da considerare gia' come net req o +// se devo prenderle come scheduled rec e il net req lo devo calcolare di conseguenza +bool TMSP_mask::nettify_MRP_lines(bool already_net, bool lotsizing) +{ + // *********** + // gross 2 net + const long max_mrp_rows=_mrp_articles.items(); + for (long mrp_row=0; mrp_row < max_mrp_rows; mrp_row++) + { + // calcola il fabbisogno netto e lo riporta sul bucket seguente + TMRP_line & mrp_line = _mrp_articles[mrp_row]; + const int last = mrp_line.last_bucket(); + for (int bucket = 0; bucket <= last; bucket = mrp_line.next_bucket(bucket)) + { + real netreq,giacres; + if (already_net) + { + // generazione del master schedule plan; le quantità sono da considerare nette + netreq= mrp_line.sched_receipts(bucket); + giacres=0; + mrp_line.set_net_req(bucket, netreq ); + } else { + // generazione delle pianificazioni (commesse, Master Production Plan (non per famiglie), prove di budget ecc) + giacres = mrp_line.on_hand(bucket); + giacres += mrp_line.sched_receipts(bucket); + giacres -= mrp_line.gross_requirement(bucket); + if (lotsizing) + netreq = mrp_line.sizeup_net_requirement(bucket, giacres); + else + { + netreq = -giacres; + netreq = mrp_line.set_net_req(bucket, netreq); + } + giacres += netreq; + } + if (giacres > ZERO) + { + const int nb = mrp_line.next_bucket(bucket); + if (nb <= mrp_line.last_bucket()) + mrp_line.set_on_hand(nb, giacres); + } + } + } + return max_mrp_rows>0; +} + + +int TMSP_mask::days_per_bucket() const +{ + return get_int(F_DAYXBUCK) * (get_int(F_BUCKETS) ? get_int(F_BUCKETS) : get_int(F_BUCKET)); +} + +void TMSP_mask::clear_sheets() +{ + TSheet_field &sa=sfield(F_ARTICOLI); + if (sa.items()>0) + { + sa.destroy(); + sa.force_update(); + } + TSheet_field &sl=sfield(F_LINEE); + if (sl.items()>0) + { + sl.destroy(); + sl.force_update(); + } +// sfield(F_TESTE).destroy(); +// sfield(F_TESTE).force_update(); + xvt_statbar_set(""); +} + +// ********** +// imposta il bucket 0 ; se i flag sulla maschera sono settati, +// - sulla riga delle giacenze progressive : somma la giacenza iniziale +// - sulla riga dell'ordinato progressivo => sottrae la giacenza iniziale +// ********** +// valore di ritorno:restituisce l'ultima linea dello sheet processata +int TMSP_mask::init_bucket0(TArticolo_giacenza &art, int r) +{ + TSheet_field& sf = sfield(F_ARTICOLI); + + const bool add_giac=get_bool(F_MSCHEDULEPLAN);// nettifica la giacenza + + // Calcola l'indice c della riga con la giacenza prog + const int b0 = sf.cid2index(F_BUCKET0); + const int b1 = sf.cid2index(F_BUCKET1); + real planned; + for (int c = r; c > 1; c--) + { + if (sf.cell_disabled(c, b1)) + break; + planned += real(sf.cell(c, b0)); + } + TToken_string &giac_row=sf.row(c); + TToken_string &ord_row=sf.row(c-1); + // calcola codice di magazzino e di livello + TString16 livello; + _livelli.pack_grpcode(livello, giac_row.get(sf.cid2index(F_LIV1)),1); + _livelli.pack_grpcode(livello, giac_row.get(sf.cid2index(F_LIV2)),2); + _livelli.pack_grpcode(livello, giac_row.get(sf.cid2index(F_LIV3)),3); + _livelli.pack_grpcode(livello, giac_row.get(sf.cid2index(F_LIV4)),4); + TString16 codmag; + add_magcode(codmag, giac_row.get(sf.cid2index(F_MAGAZZINO))); + add_depcode(codmag, giac_row.get(sf.cid2index(F_DEPOSITO))); + // calcola i bucket 0 + TQuantita prog_giac(art.codice(),giac_row.get(sf.cid2index(F_UM)),planned); + real giac=art.giacenza_anno(codmag, livello, get_date(F_DADATA).year()); + if (add_giac) + prog_giac +=giac; + prog_giac += giac_row.get(b0); + + giac_row.add(prog_giac.val().string(), b0); + do_test_art_row(r,c,FALSE); + + return c-2; +} + +bool TMSP_mask::do_test_art_row(int r, int c, bool signal) +{ + TSheet_field& sf = sfield(F_ARTICOLI); + TMask & smask= sf.sheet_mask(); + TToken_string & curr_row=sf.row(r); + TToken_string & constr_row=sf.row(c-1); + TToken_string & giac_row=sf.row(c); + TCodice_articolo codart(curr_row.get(sf.cid2index(F_ARTICOLO))); + const int b0 = sf.cid2index(F_BUCKET0); + + // calcola la giacenza proiettata + TQuantita vincolo(codart,giac_row.get(sf.cid2index(F_UM)),ZERO); + TQuantita totale(vincolo),qta(vincolo); + totale += real(sf.cell(c, b0));// giacenza iniziale + for (int b = 1; b < LAST_BUCKET; b++) + { + vincolo.set_val(real(sf.cell(c-1, b0+b*2))); + for (int i = c+1; i <= r; i++) + { + totale += real(sf.cell(i, b0+b*2)); // somma alla giacenza le produzioni + } + totale -= real(sf.cell(c-1, b0+b*2)); // detrae le uscite + giac_row.add(totale.val().string(), b0+b*2); + if (signal && totale.val() < 0) + { + TString err; + const int bucket_size = days_per_bucket(); + const TDate d = get_date(F_DADATA) + long(bucket_size * (b-1)); + err << "Riga " << c+1 << ": Vincolo non ripettato al " << d; + beep(); + signal =FALSE; + xvt_statbar_set(err); + } + } + sf.force_update(c); + if (signal) xvt_statbar_set(""); + + if (constr_row.get_char(sf.cid2index(F_MASTERCODE))=='M') + { + // aggancia i master di 2' livello + TString16 liv; + _livelli.pack_grpcode(liv, curr_row.get(sf.cid2index(F_LIV1)),1); + _livelli.pack_grpcode(liv, curr_row.get(sf.cid2index(F_LIV2)),2); + _livelli.pack_grpcode(liv, curr_row.get(sf.cid2index(F_LIV3)),3); + _livelli.pack_grpcode(liv, curr_row.get(sf.cid2index(F_LIV4)),4); + TString16 imp(curr_row.get(sf.cid2index(F_CODIMP)));//imp.trim(); + TString16 lin(curr_row.get(sf.cid2index(F_CODLIN)));//lin.trim(); + TString16 mag; + add_magcode(mag, curr_row.get(sf.cid2index(F_MAGAZZINO))); + add_depcode(mag, curr_row.get(sf.cid2index(F_DEPOSITO))); + + TMSP_line mspline(curr_row.get_long(F_CLIENTE-FIRST_FIELD), codart, liv, imp, lin, mag); + TMSP_constraint*currconstr=find_constraint(mspline); + + CHECK (currconstr, "Impossibile trovare il vincolo dell'articolo di 1' livello"); + int i=0; + TMaster_code *mc; + while ((mc=currconstr->get_mastercode(i++))!=NULL) + { + TMSP_constraint* line_master=_constraints.find(currconstr->cliente(),mc->articolo() + , mc->livello(), mc->codimp(), mc->codlin(), mc->codmag()); + CHECK (line_master, "Impossibile trovare il vincolo dell'articolo di 2' livello"); + CHECK (line_master->has_upperlines(), "La linea master non risulta avere dipendenze di alcun tipo"); + + int mrow= find_constr_row(*line_master); + real q2make(giac_row.get(sf.cid2index(F_BUCKET0))); + for (int b = 1; b <= LAST_BUCKET; b++) + { + const int b2=b-int(long(mc->leadtime()/days_per_bucket()+0.5)); + if (b2>=0) + { + q2make=real(giac_row.get(sf.cid2index(F_BUCKET0+b*2)))+ + real(constr_row.get(sf.cid2index(F_BUCKET0+b*2)))- + real(giac_row.get(sf.cid2index(F_BUCKET0+b*2-2))); + if (q2make > ZERO) + q2make = (q2make)*mc->expr(); + else + q2make = ZERO; + TMSP_constraint* upperline=line_master->get_upperline(*currconstr); + real oldq2make=upperline->qta(b2); + real totale2make=line_master->qta(b2); + line_master->qta(b2) = line_master->qta(b2) - upperline->qta(b2) + q2make; + upperline->qta(b2) = q2make; + + TToken_string &master_row=sf.row(mrow); + master_row.add(line_master->qta(b2).string(),sf.cid2index(F_BUCKET0+b2*2)); + } + } + sf.force_update(mrow); + int first,last; + TRiga_articolo::find_block(sf, mrow+2, first, last); + do_test_art_row(last, first, signal); + } + } + return c-2; +} + + +bool TMSP_mask::test_art_row(int r, bool signal) +{ + TSheet_field& sf = sfield(F_ARTICOLI); + int c; + if (!TRiga_articolo::find_block(sf, r, c, r)) + return TRUE; + else + { + TToken_string & curr_row=sf.row(r); + TToken_string & constr_row=sf.row(c-1); + // setta la priorita' su tutte le righe del blocco + const int prior =curr_row.get_int(sf.cid2index(F_PRIORITA)); + const int old_prior=constr_row.get_int(sf.cid2index(F_PRIORITA)); + if (old_prior != prior) + { + for (int i = c-1; i<=r; i++) + { + sf.row( i ).add(prior , sf.cid2index(F_PRIORITA)); + sf.force_update(i); + } + } + } + return do_test_art_row(r, c, signal); +} + +bool TMSP_mask::test_load_row(int r, bool signal) +{ + TSheet_field& sf = sfield(F_LINEE); + const int narticoli=sf.items(); + if (narticoli<=r) + return TRUE; + // Calcola l'indice c della riga con la capacita' + const int b0 = sf.cid2index(F_LBUCKET0); + const int b1 = sf.cid2index(F_LBUCKET1); + + for (int c = r; c > 0; c--) + { + if (sf.cell_disabled(c, b1)) + break; + } + // Calcola l'indice r della riga totale di linea + if (r == c) r++; + TToken_string &row=sf.row(c); + real capacita, carico; + for (int b = 1; b < LAST_BUCKET; b++) + { + capacita=real(sf.cell(c, b0+b*2)); + carico=real(sf.cell(r, b0+b*2)); + if (signal && capacita < carico) + { + TString err; + const int bucket_size = days_per_bucket(); + const TDate d = get_date(F_DADATA) + long(bucket_size * (b-1)); + err << "Riga " << c+1 << ": capacita' superata al " << d; + beep(); + signal =FALSE; + xvt_statbar_set(err); + } + } + if (signal) xvt_statbar_set(""); + return signal; +} + + +void TMSP_mask::salva_documenti() +{ + TSheet_field& sf = sfield(F_ARTICOLI); + const int b0 = sf.cid2index(F_BUCKET0); + const int b1 = sf.cid2index(F_BUCKET1); + const int um = sf.cid2index(F_UM); + const TDate date_to = get(F_ADATA); + + TPlan_docs doc_rows(get(F_NUM_PLAN), get(F_TIPO_PLAN), get(F_RIGA_PLAN)); + + const TDate from = get(F_DADATA); + const int bucket_size = days_per_bucket(); + const bool number_by_cli = get_bool(F_NUMBERBYCLI); + + for (int b = 1; b < LAST_BUCKET; b++) + { + const TDate data = from + long(bucket_size * (b-1)); + if (data > date_to) + break; + + const int anno = data.year(); + + FOR_EACH_SHEET_ROW(sf, r, row) if (!sf.cell_disabled(r, b1)) + { + TMSP_line& line = *_articles.find(*row, _livelli, TRUE); + + const real& old = line.qta(b); + const real val = row->get(b0 + b*2); + if ((get(F_DA_MAGAZZ).empty() || line.codmag() >= get(F_DA_MAGAZZ)) && + (get(F_A_MAGAZZ).empty() || line.codmag() <= get(F_A_MAGAZZ)) && + (get(F_DA_IMPIANTO).empty() || line.codimp() >= get(F_DA_IMPIANTO)) && + (get(F_A_IMPIANTO).empty() || line.codimp() <= get(F_A_IMPIANTO))) + { + if (old != val) + { + long numdoc = 0L; + int numrig = 0; + + if (!line.riga(b, numdoc, numrig)) + { + if (number_by_cli) + numdoc = line.cliente() * 100L; + numdoc += data.week(); + } + const real incr = val-old; + TRiga_documento& riga = doc_rows.add_to_row(anno, numdoc, numrig, incr); + if (riga.get(RDOC_CODART).empty()) + { + riga.put(RDOC_CODART, line.codice()); + riga.put(RDOC_CODARTMAG, line.codice()); + riga.put(RDOC_LIVELLO, line.livgiac()); + riga.put(RDOC_CHECKED, "X"); + riga.put(RDOC_CODMAG, line.codmag()); + riga.put(RDOC_LINEA, line.codlin()); + riga.put(RDOC_IMPIANTO, line.codimp()); + riga.put(RDOC_UMQTA, row->get(sf.cid2index(F_UM))); + riga.put(RDOC_DATACONS, data); + riga.put(RDOC_DESCR, row->get(sf.cid2index(F_DESCART))); + + TRectype& doc = (TRectype&)riga.doc().head(); + if (doc.get(DOC_DATACONS).empty()) + { + doc.put(DOC_DATACONS, data); + doc.put(DOC_TIPOCF, "C"); + doc.put(DOC_CODCF, line.cliente()); + } + doc.put(DOC_DATADOC, from); + } + } + } + } + doc_rows.flush(data); + } +} + +// copia i dati della riga al di fuori delle informazioni dei bucket +void TMSP_mask::copy_sheet_row(TToken_string & newrow, const TToken_string & row) +{ + const TSheet_field& sf = sfield(F_ARTICOLI); + const int b0 = sf.cid2index(F_BUCKET0); + TString str; + for (int i = 0; i < b0; i++) + { + row.get(i, str); + newrow.add(str, i); + } +} + +bool TMSP_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + const char * confirm_msg="Le attuali %d linee di articoli verranno perse. Confermi?"; + switch (o.dlg()) + { + case F_DADATA: + if (e == fe_modify) + round_field(o, FALSE); + break; + case F_ADATA: + if (e == fe_modify) + round_field(o, TRUE); + break; + case F_BUCKET: + if (e == fe_modify) + { + round_field(field(F_DADATA), FALSE); + round_field(field(F_ADATA), TRUE); + } + break; + case F_YEAR: + case F_IMPIANTO: + case F_LINEA: + if (e == fe_modify || (o.dlg() == F_YEAR && e == fe_init )) + update_calendar(F_CALENDAR, F_YEAR, F_IMPIANTO, F_LINEA); + break; + case F_TIPI_ORC: + case F_TIPI_PLA: + if (e == fe_init) + { + TSheet_field& s = (TSheet_field&)o; + if (s.items() == 0) + { + s.row(0); + s.force_update(); + } + } + if (e == fe_close) + { + const TSheet_field& s = (const TSheet_field&)o; + FOR_EACH_SHEET_ROW_BACK(s, r, row) + if (!row->empty_items()) + { + bool ok; + if (o.dlg()==F_TIPI_PLA) + ok=test_tipodoc_num(sfield(F_NUM_PLA), s ); + else + ok=test_tipodoc_num(sfield(F_NUM_ORC), s ); + return ok; + } + return error_box("E' necessario inserire almeno una riga"); + } + break; + + case F_NUM_PLAN: + if (e == fe_close) + { + const TSheet_field& s = sfield(F_NUM_PLA); + FOR_EACH_SHEET_ROW_BACK(s, r, row) + if (o.get() == row->get(s.cid2index(F_NUMERAZ))) return TRUE; + return error_box("Numerazione non inclusa tra quelle di planning"); + } + break; + case F_TIPO_PLAN: + if (e == fe_close) + { + const TSheet_field& s = sfield(F_TIPI_PLA); + FOR_EACH_SHEET_ROW_BACK(s, r, row) + if (o.get() == row->get(s.cid2index(F_TIPO))) return TRUE; + return error_box("Tipo documento non incluso tra quelli di planning"); + } + break; + case F_ARTICOLI: + { + TSheet_field& s = (TSheet_field&)o; + switch(e) + { + case se_query_add: + return jolly > 1 && s.items() > 0; + case se_notify_add: + if (jolly > 0) + { + const TToken_string& prev = s.row(int(jolly-1)); + TToken_string& curr = s.row(int(jolly)); + copy_sheet_row(curr,prev); + } + break; + case se_leave: + test_art_row((int)jolly); + break; + default: + break; + } + } + break; + case F_MSP_RESORT: + if (e==fe_button) + sort_sheet(); + break; + case F_LINEE: + { + TSheet_field& s = (TSheet_field&)o; + switch(e) + { + case se_query_add: + return FALSE; + case se_leave: + test_load_row((int)jolly); + break; + } + } + break; + case F_CRP_RESORT: + break; + case F_BUCKET1: + case F_BUCKET2: + case F_BUCKET3: + case F_BUCKET4: + case F_BUCKET5: + case F_BUCKET6: + case F_BUCKET7: + case F_BUCKET8: + case F_BUCKET9: + case F_BUCKET10: + case F_BUCKET11: + case F_BUCKET12: + if (e == fe_modify) + { + const TSheet_field& s = sfield(F_ARTICOLI); + TMask & m=s.sheet_mask(); + TMask_field &fprice=m.field(o.dlg()+1); + real qta(o.get()); + real price(fprice.get()); + if (!qta.is_zero() && price.is_zero()) + find_price(get(F_TIPOCV),get(F_CODCONDV),get(F_CATVEN_CV), + m.get(F_TIPOCF_SHEET), m.get_long(F_CLIENTE), m.get(F_ARTICOLO), + qta , price); + fprice.set(price.string()); + } + case DLG_CANCEL: + if (e == fe_button) + if (jolly == 0L) + { + TSheet_field& s = sfield(F_ARTICOLI); + int lineeart=s.items(); + if (lineeart==0 || yesno_box(confirm_msg,lineeart)) + { + enable(-1); + clear_sheets(); + } else + return FALSE; + } + break; + case DLG_ELABORA: + if (e == fe_button && check_fields()) + { + TSheet_field& s = sfield(F_ARTICOLI); + int lineeart=s.items(); + if (lineeart==0 || yesno_box(confirm_msg,lineeart)) + { + clear_sheets(); + if (carica_documenti()) + { + fill_sheet(); + enable(DLG_SAVEREC, s.items() > 0); + enable(-1, s.items() == 0); + s.set_focus(); + on_field_event((TOperable_field&)field(F_SHOWPRICES), fe_modify, jolly ); + on_field_event((TOperable_field&)field(F_MSP_SORT), fe_init, jolly ); + } + } + } + break; + case F_CANCEL_MSP: + if (e == fe_button) + { + remove_propose(TRUE); + } + break; + case F_RECALC_MSP: + if (e == fe_button && check_fields()) + { + remove_propose(); + const bool useextralines=get_bool(F_USENONSTDLIN_MSP); + const bool useextrahours=get_bool(F_USEEXTRAHRS_MSP) ; + set(F_USENONSTDLIN_CRP ,useextralines ? "X" : ""); + set(F_USEEXTRAHRS_CRP ,useextrahours ? "X" : ""); + if (get(F_RECALC_TYPE)=="1") + propose_1stJIT(_first_fit_logic,TRUE,TRUE); + else if (get(F_RECALC_TYPE)=="1_INFH") + propose_1stJIT(_first_fit_logic,TRUE,FALSE); + else if (get(F_RECALC_TYPE)=="1_INF") + propose_1stJIT(_first_fit_logic,FALSE,FALSE); + else if (get(F_RECALC_TYPE)=="JIT") + propose_1stJIT(_JIT_logic,TRUE,TRUE); + else if (get(F_RECALC_TYPE)=="JIT_INFH") + propose_1stJIT(_JIT_logic,TRUE,FALSE); + else if (get(F_RECALC_TYPE)=="JIT_INF") + propose_1stJIT(_JIT_logic,FALSE,FALSE); + // aggiorna lo sheet delle capacita' + on_field_event((TOperable_field&)field(F_LOADTYPE), fe_modify, jolly ); + sfield(F_ARTICOLI).set_focus(); + } + break; + case F_RECALC_CRP: + if (e == fe_button && check_fields()) + { + if (capacity_review(get_bool(F_USENONSTDLIN_CRP) ,get_bool(F_USEEXTRAHRS_CRP) )) + { + on_field_event((TOperable_field&)field(F_LOADTYPE), fe_modify, jolly ); + sfield(F_LINEE).set_focus(); + } + } + break; + case F_CHECK_MSP: + if (e == fe_button) + { + check_articles(); + } + break; + case F_CHECKLINE: + if (e == fe_button) + { + const TSheet_field& s = sfield(F_ARTICOLI); + TMSPCheck_mask cm(this); + cm.disable(-G_MOVIMENTO); + int curr_row=s.selected(); + const bool is_disabled=s.cell_disabled(curr_row,F_BUCKET1-FIRST_FIELD) ; + const bool is_constr=(is_disabled && curr_row>0 && s.cell_disabled(curr_row-1,F_BUCKET1-FIRST_FIELD)); + if (is_disabled && !is_constr) + curr_row++; + cm.gopos(curr_row, 1); + cm.run(); + cm.gopos_mainmask(); + } + break; + case F_SHOWPRICES: + if (e == fe_modify) + { + TSheet_field& s = sfield(F_ARTICOLI); + const bool on = get_bool(F_SHOWPRICES); + for (int b=LAST_BUCKET ; b>=0 ; b--) + { + s.set_column_width(F_BUCKET0+1+b*2-FIRST_FIELD, on ? 140 : 0); + s.enable_column(F_BUCKET0+1+b*2-FIRST_FIELD, on && b>0 && b < LAST_BUCKET); + // ^^^^- da sostituire con un piu' elegante (ma non implementato): s.show(F_BUCKET0+1+b*2-FIRST_FIELD,on); + } + s.force_update(); + } + case F_CHECK_CRP: + if (e == fe_button) + { + check_capacities(); + } + break; + case F_SHOWPERC: + if (e == fe_modify) + on_field_event((TOperable_field&)field(F_LOADTYPE), fe_modify, jolly ); + break; + case F_LOADTYPE: + if (e == fe_modify) + { + // ************* + // fill sheet of capacities + const bool as_percentage=get_bool(F_SHOWPERC); + const bool show_human=*get(F_LOADTYPE)=='H'; + TSheet_field& sl = sfield(F_LINEE); + sl.destroy(); + //TSheet_field& su = sfield(F_TESTE); + //su.destroy(); + const long max_capacities=_capacities.items(); + for (long c=0; csfield(F_ARTICOLI); + int curr_row=last_row(); + while (sf.cell_disabled(curr_row,F_BUCKET1-FIRST_FIELD) ) + curr_row++; + + sf.select(curr_row,TRUE); + _main_mask->set_focus_field(sf.dlg()); + sf.set_focus_cell(curr_row, last_col()*2+F_BUCKET0); +} + +TMSPCheck_mask::TMSPCheck_mask(TMSP_mask * main_mask, const char *m,TSheet_field * s): + TAutomask(m), _main_mask(main_mask) , _sheet(s) +{ + _last_col=_last_row=_constr_row=-1; + go_top(); +} + +TMSPCheck_mask::TMSPCheck_mask(TMSP_mask * main_mask): + TAutomask("mr2200b.msk"), _main_mask(main_mask), _sheet(&main_mask->sfield(F_ARTICOLI)) +{ + _last_col=_last_row=_constr_row=-1; + go_top(); +} + +//valori di ritorno: +// 0 : nessun errore +// 1 : esistono modifiche +// 2 : esistono nuove proposta +// 4 : giacenza media superiore al voluto +// 8 : sotto stock +int TMSPCheck_mask::fill_mask(const bool show_fields) +{ + int error=0; + if (_last_col==_col && _last_row==_row) + return error; + + const bool is_constr=is_constraint(_row); + TToken_string &row=_sheet->row(_row); + + long codcli ; + TCodice_articolo codart; + TString16 liv, mag, codimp, codlin, um; + _main_mask->msprow2codes(row,codcli,codart,liv,mag,codimp, codlin, um); + + if (_last_row!=_row) + { + _constr_row=find_constraint(_row); + set(FC_RIGA,_row+1); + set(FC_CODCLI,codcli,TRUE); + set(FC_CODART,codart,TRUE); + set(FC_CODIMP,codimp,TRUE); + set(FC_CODLIN,codlin,TRUE); + set(FC_CODMAG,mag.left(3),TRUE); + set(FC_CODDEP,mag.mid(3),TRUE); + } + set(FC_BUCKET,_col); + TDate data_buck(_main_mask->get_date(F_DADATA)); + data_buck += (_col)*_main_mask->days_per_bucket()-1; + set(FC_DATE2,_col==LAST_BUCKET ? "" : data_buck.string()); + data_buck -= _main_mask->days_per_bucket()-1; + set(FC_DATE1,_col==0 ? "" : data_buck.string()); + + set(FC_IS_VINCOLO,is_constr ? "X" : " "); + field(FC_IS_VINCOLO).on_hit(); + if (!is_constr) + { + real art_per_buck(row.get(F_BUCKET0 + _col*2 - FIRST_FIELD)); + set(FC_FINAL_VALUE,art_per_buck.string()); + TMRP_line* new_article = _main_mask->find_propose(codcli, codart,liv,codimp,codlin,mag); + TMSP_line* old_article = _main_mask->find_article(codcli, codart,liv,codimp,codlin,mag); + + real old_value=ZERO; + real new_value=ZERO; + if (old_article) + { + old_value=old_article->qta(_col); + } + if (new_article) + { + TMRP_time t(data_buck,0,"",""); + TMRP_record& mrprec = new_article->record(t); + new_value=mrprec.sched_receipts(); + if (new_value > ZERO) + error|=2; + } + set(FC_STARTING_VALUE,old_value.string()); + set(FC_PROPOSED_VALUE,new_value.string()); + show(FC_PROPOSED_VALUE,!new_value.is_zero()); + show(FC_STARTING_VALUE,!old_value.is_zero()); + if (old_value != art_per_buck) + error|=1; + // mostra i campi + hide(FC_GIAC); + hide(FC_UNDERSTOCK); + } + if (_constr_row>=0) + { + // calcola il sotto stock + real stock(_sheet->cell(_constr_row,F_BUCKET0 + _col*2 - FIRST_FIELD)); + bool stockbreak=stockdays_per_bucket(); + real prev_stock(_sheet->cell(_constr_row,F_BUCKET0 + 2*_col - 1 - FIRST_FIELD)); + real delivery(_sheet->cell(_constr_row-1,F_BUCKET0 + 2*_col - FIRST_FIELD)); + stock=stock-prev_stock+delivery; + if (stock > ZERO) + { + real residuo=stock; + while (residuo > ZERO && (_col + bucket)cell(_constr_row-1,F_BUCKET0 + 2*_col + bucket - FIRST_FIELD); + if (delivery < prev_stock) + { + prev_stock-=delivery; + delivery=ZERO; + } else { + delivery-=prev_stock; + prev_stock=ZERO; + } + residuo-= delivery; + if (residuo < ZERO) residuo=ZERO; + giorni+= residuo; + bucket++; + } + giorni = buck_days*giorni / stock; + const int maxdays(_main_mask->get_int(F_MAXGIORNIGIAC)); + overgiac=(giorni.integer() > maxdays); + error|=overgiac ? 4 : 0; + } + } + set(FC_GIORNIGIAC,giorni.string()); + set(FC_OVERGIORNIGIAC,giorni.string()); + show(FC_GIORNIGIAC, !overgiac); + show(FC_OVERGIORNIGIAC,overgiac); + } + + return error; +} + +void TMSPCheck_mask::fix_actual_pos() +{ + _last_col=_col; + _last_row=_row; +} + +void TMSPCheck_mask::gopos(int row, int col) +{ + _row=row; + _col=col; + fill_mask(); + fix_actual_pos(); +} + + +bool TMSPCheck_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + if (e==fe_button) + { + const int dlg=o.dlg(); + bool redo=TRUE; + const TString4 old_movefilter(get(FC_MOVEFILTER)); + const TString4 new_movefilter(get_int(FC_FINDFILTER) & 1 ? "" : "C"); + switch (dlg) + { + case FC_UP_BAD: + set(FC_MOVEFILTER,new_movefilter); + if (redo = move_to(FC_UP)) + _col = LAST_BUCKET+1; + case FC_LEFT_BAD: + set(FC_MOVEFILTER,new_movefilter); + while (redo) + { + while (move_to(FC_LEFT)) + { + int err=fill_mask() ; + fix_actual_pos(); + if (err & get_int(FC_FINDFILTER)) + { + set(FC_MOVEFILTER,old_movefilter); + return TRUE; + } + } + if (redo = move_to(FC_UP)) + _col = LAST_BUCKET+1; + } + message_box("Ricerca terminata"); + break; + + case FC_DOWN_BAD: + set(FC_MOVEFILTER,new_movefilter); + if (redo = move_to(FC_DOWN)) + _col = -1; + case FC_RIGHT_BAD: + set(FC_MOVEFILTER,new_movefilter); + while (redo) + { + while (redo && move_to(FC_RIGHT)) + { + int err=fill_mask() ; + fix_actual_pos(); + if (err & get_int(FC_FINDFILTER)) + { + set(FC_MOVEFILTER,old_movefilter); + return TRUE; + } + } + if (redo = move_to(FC_DOWN)) + _col = -1; + } + message_box("Ricerca terminata"); + break; + + default: + move_to(dlg); + fill_mask(); + fix_actual_pos(); + } + set(FC_MOVEFILTER,old_movefilter); + } + return TRUE; +} + +int TMSPCheck_mask::find_constraint(int row) +{ + while (row >=0 ) + { + if (is_constraint(row)) + return row; + row--; + } + return -1; +} + +bool TMSPCheck_mask::is_constraint(int row) +{ + return (row > 0 + && _sheet->cell_disabled(row, F_BUCKET1-FIRST_FIELD) + && _sheet->cell_disabled(row-1, F_BUCKET1-FIRST_FIELD)); +} +bool TMSPCheck_mask::is_article(int row) +{ + return !_sheet->cell_disabled(row, F_BUCKET1-FIRST_FIELD); +} + +bool TMSPCheck_mask::move_to(int dlg) +{ + const bool constraints=*get(FC_MOVEFILTER)!='A'; + const bool articles=*get(FC_MOVEFILTER)!='C'; + + CHECK(constraints||articles, "N'do cazzo muovo?"); + const int max_rows=_sheet->items(); + bool skip_row=TRUE; + int old_row=_row; + switch (dlg) + { + case FC_DOWNLEFT: + case FC_DOWNRIGHT: + case FC_DOWN: + while (_row < max_rows-1) + { + _row++; + if (constraints && is_constraint(_row) || articles && is_article(_row)) + break; + } + if (dlg==FC_DOWNRIGHT) _col++; + if (dlg==FC_DOWNLEFT) _col--; + break; // se non sono sulla linea giusta, torno indietro + case FC_UPRIGHT: + case FC_UPLEFT: + case FC_UP: + while (_row >0 ) + { + _row--; + if (constraints && is_constraint(_row) || articles && is_article(_row)) + break; + } + if (dlg==FC_UPRIGHT) _col++; + if (dlg==FC_UPLEFT) _col--; + break; + case FC_LEFT: + _col--; + break; + case FC_RIGHT: + _col++; + break; + } + if (!((articles && is_article(_row) ) || (constraints && is_constraint(_row)))) + _row=old_row; + check_pos_range(); + if (_last_col==_col && _last_row==_row) + return FALSE; + return TRUE; +} + +void TMSPCheck_mask::check_pos_range() +{ + int max_cols=min(get_int(FC_MAXBUCK2CHECK),LAST_BUCKET); + if (max_cols==0) max_cols=LAST_BUCKET; + + const bool constraints=*get(FC_MOVEFILTER)!='A'; + const int max_rows=_sheet->items(); + if (_row>=max_rows) _row=max_rows-1; + if (_row< (constraints ? 1 : 2) ) _row++; + if (_col>=max_cols) _col=max_cols; + if (_col<1) _col=0; +} + + +/////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////// + +TCRPCheck_mask::TCRPCheck_mask(TMSP_mask * main_mask): + TMSPCheck_mask(main_mask, "mr2200c.msk", & main_mask->sfield(F_LINEE)) +{ +} + +void TCRPCheck_mask::check_pos_range() +{ + const bool constraints=*get(FC_MOVEFILTER)!='A'; + const int max_rows=_sheet->items(); + if (_row>=max_rows) _row=max_rows-1; + if (_row< (constraints ? 0 : 1) ) _row++; + if (_col>=LAST_BUCKET) _col=LAST_BUCKET-1; + if (_col<1) _col=1; +} + +bool TCRPCheck_mask::is_constraint(int row) +{ + return (row > 0 + && !_sheet->cell_disabled(row, F_LBUCKET1-FIRST_FIELD) + && _sheet->cell_disabled(row-1, F_LBUCKET1-FIRST_FIELD)); +} + +bool TCRPCheck_mask::is_article(int row) +{ + return (*_sheet->row(row).get(F_CODARTCRP-FIRST_FIELD)>' '); +} + +int TCRPCheck_mask::find_constraint(int row) +{ + const int max=max_rows(); + while (row < max) + { + if (is_constraint(row)) + return row; + row++; + } + return -1; +} + +int TCRPCheck_mask::fill_mask(const bool show_fields) +{ + int error=0; + if (_last_col==_col && _last_row==_row) + return error; + + const bool is_constr=is_constraint(_row); + TSheet_field& sf = _main_mask->sfield(F_LINEE); + TToken_string &row=sf.row(_row); + + long codcli ; + TCodice_articolo codart; + TString16 liv, codimp, codlin, um; + _main_mask->crprow2codes(row,codimp, codlin,codcli,codart,liv,um); + + if (_last_row!=_row) + { + _constr_row=find_constraint(_row); + set(FC_RIGA,_row+1); + set(FC_CODIMP,codimp); + set(FC_CODLIN,codlin); + set(FC_CODCLI,codcli); + set(FC_CODART,codart); + } + set(FC_BUCKET,_col); + TDate data_buck(_main_mask->get_date(F_DADATA)); + data_buck += (_col)*_main_mask->days_per_bucket()-1; + set(FC_DATE2,data_buck.string()); + data_buck -= _main_mask->days_per_bucket()-1; + set(FC_DATE1,data_buck.string()); + + set(FC_IS_VINCOLO,is_constr ? "X" : " "); + field(FC_IS_VINCOLO).on_hit(); + if (!is_constr) + { + // articolo + real art_load(_sheet->cell(_row ,F_LBUCKET1 + _col - 1 - FIRST_FIELD)); + set(FC_ART_LOAD,art_load.string()); + } + if (_constr_row>=0) + { + // vincolo + real load(_sheet->cell(_constr_row ,F_LBUCKET1 + _col - 1 - FIRST_FIELD)); + set(FC_LOAD,load.string()); + show(FC_LOAD,load>ZERO); + real capacity(_sheet->cell(_constr_row -1 ,F_LBUCKET1 + _col - 1 - FIRST_FIELD)); + const bool positive=capacity>ZERO; + set(FC_CAPACITY,capacity.string()); + show(FC_CAPACITY,positive); + capacity-=load; + const bool out=capacity F_DADATA + WARNING "La data finale deve essere maggiore di quella iniziale" + GROUP 1 +END + +LIST F_BUCKETS 1 15 +BEGIN + PROMPT 2 7 "Bucket temporale " + ITEM "1|1 Settimana" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK + ITEM "2|2 Settimane" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK + ITEM "4|1 Mese" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK + ITEM "8|2 Mese" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK + ITEM "13|3 Mesi" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK + ITEM "17|4 Mesi" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK + ITEM "26|6 Mesi" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK + ITEM "52|1 Anno" + MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK + ITEM " |Settimane" + MESSAGE ENABLE,F_BUCKET|"7",F_DAYXBUCK + ITEM "0|1 Giorno" + MESSAGE DISABLE,F_BUCKET|"1",F_BUCKET|"1",F_DAYXBUCK + GROUP 1 +END + +LIST F_DAYXBUCK 1 9 +BEGIN + PROMPT 45 7 "" + FLAGS "D" + ITEM "7|Settimane" + ITEM "1|Giorni " +END + +NUMBER F_BUCKET 2 +BEGIN + PROMPT 58 7 "" + FLAGS "U" + CHECKTYPE REQUIRED + GROUP 1 +END + +TEXT DLG_NULL +BEGIN + PROMPT 12 10 "@bInput" +END + +BOOLEAN F_NOCLI_IN +BEGIN + PROMPT 2 11 "Non suddividere per cliente" + GROUP 1 + MESSAGE TRUE ENABLE, F_NOCLI_OUT + MESSAGE FALSE CLEAR, F_NOCLI_OUT +END + +BOOLEAN F_NOMAG_IN +BEGIN + PROMPT 2 12 "Non suddividere per magazzini" + GROUP 1 +END + +BOOLEAN F_NOIMP_IN +BEGIN + PROMPT 2 13 "Non suddividere per impianti" + GROUP 1 +END + +BOOLEAN F_NOLIN_IN +BEGIN + PROMPT 2 14 "Non suddividere per linee" + GROUP 1 +END + +TEXT DLG_NULL +BEGIN + PROMPT 52 10 "@bOutput" +END +BOOLEAN F_NOCLI_OUT +BEGIN + PROMPT 38 11 "Non suddividere per cliente" + GROUP 1 +END + +ENDPAGE + +PAGE "Elaborazione" -1 -1 80 19 + +BOOL F_MSCHEDULEPLAN +BEGIN + PROMPT 1 1 "Crea il Master Schedule Plan" + MESSAGE TRUE "M",G_MASTERSCHEDULE@ + MESSAGE FALSE "O",G_MASTERSCHEDULE@ + GROUP 1 +END + +BOOL F_2LEVEL_MSP +BEGIN + PROMPT 40 1 "2 level Master Scheduling" + GROUP 1 +END + +LIST DLG_NULL 20 +BEGIN + PROMPT 2 2 "@b" + ITEM "M|Ordini da clienti" + MESSAGE "C",F_TIPOCF|HIDE,F_TIPOCF + ITEM "O|Ordini in input" + MESSAGE SHOW,F_TIPOCF + GROUP G_MASTERSCHEDULE + FLAGS "DG" +END + + +LIST F_TIPOCF 9 +BEGIN + PROMPT 28 2 "di tipo " + ITEM "C|cliente" + ITEM "F|fornitore" +END + + +SPREADSHEET F_NUM_ORC 18 5 +BEGIN + PROMPT 1 3 "" + ITEM "Numerazione" + GROUP 1 +END + +SPREADSHEET F_TIPI_ORC 56 5 +BEGIN + PROMPT 20 3 "" + ITEM "Tipo@4" + ITEM "Descrizione@30" + ITEM "Da stato" + ITEM "A stato" + GROUP 1 +END + +LIST DLG_NULL 20 +BEGIN + PROMPT 2 9 "@b" + ITEM "M|Ordini di produzione" + ITEM "O|Ordini di output" + GROUP G_MASTERSCHEDULE + FLAGS "D" +END + +SPREADSHEET F_NUM_PLA 18 5 +BEGIN + PROMPT 1 10 "" + ITEM "Numerazione" + GROUP 1 +END + +SPREADSHEET F_TIPI_PLA 56 5 +BEGIN + PROMPT 20 10 "" + ITEM "Tipo@4" + ITEM "Descrizione@30" + ITEM "Da stato" + ITEM "A stato" + GROUP 1 +END + +LIST DLG_NULL 20 +BEGIN + PROMPT 2 16 "@b" + ITEM "M|Schedule Plan" + ITEM "O|Ordini generati" + GROUP G_MASTERSCHEDULE + FLAGS "D" +END + +STRING F_NUM_PLAN 4 +BEGIN + PROMPT 27 16 "Numerazione " + FLAGS "U" + USE %NUM + INPUT CODTAB F_NUM_PLAN + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@30" S0 + OUTPUT F_NUM_PLAN CODTAB + CHECKTYPE REQUIRED + GROUP 1 + ADD NONE +END + +STRING F_TIPO_PLAN 4 +BEGIN + PROMPT 50 16 "Tipo " + FLAGS "U" + USE %TIP + INPUT CODTAB F_TIPO_PLAN + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@30" S0 + OUTPUT F_TIPO_PLAN CODTAB + CHECKTYPE REQUIRED + GROUP 1 + ADD NONE +END + +STRING F_RIGA_PLAN 4 +BEGIN + PROMPT 66 16 "Riga " + FLAGS "U" + USE %TRI SELECT S7=="M" + INPUT CODTAB F_RIGA_PLAN + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@30" S0 + OUTPUT F_RIGA_PLAN CODTAB + CHECKTYPE REQUIRED + GROUP 1 + ADD NONE +END + +LIST F_TIPOCV 10 +BEGIN + GROUP 1 + PROMPT 2 18 "Preleva i prezzi da " + ITEM "|Anagrafica" + MESSAGE HIDE,F_CODCONDV|HIDE,F_CATVEN_CV|CHECK,F_CODCONDV + ITEM "L|Listino" + MESSAGE SHOW,F_CODCONDV|SHOW,F_CATVEN_CV|CHECK,F_CODCONDV + ITEM "C|Contratto" + MESSAGE SHOW,F_CODCONDV|HIDE,F_CATVEN_CV|CHECK,F_CODCONDV + ITEM "O|Offerta" + MESSAGE SHOW,F_CODCONDV|HIDE,F_CATVEN_CV|CHECK,F_CODCONDV + +END + +STRING F_CODCONDV 3 +BEGIN + PROMPT 36 18 "" + USE LF_CONDV + INPUT TIPO F_TIPOCV + INPUT CATVEN F_CATVEN_CV + INPUT COD F_CODCONDV + INPUT TIPOCF F_TIPOCF + + DISPLAY "" TIPO + DISPLAY "Cat.ven." CATVEN + DISPLAY "" TIPOCF + DISPLAY "Cli/for@10" CODCF + DISPLAY "Codice" COD + DISPLAY "Descrizione@30" DESCR + + OUTPUT F_TIPOCV TIPO + OUTPUT F_CATVEN_CV CATVEN + OUTPUT F_CODCONDV COD +END + +STRING F_CATVEN_CV 2 +BEGIN + PROMPT 43 18 "Categoria di vendita " + USE CVE + INPUT CODTAB F_CATVEN_CV + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione @50" S0 + OUTPUT F_CATVEN_CV CODTAB + CHECKTYPE REQUIRED +END + +ENDPAGE + +PAGE "M.S.P." -1 -1 78 20 + +GROUPBOX DLG_NULL 39 6 +BEGIN + PROMPT 1 0 "" +END + +BOOL F_SHOWPRICES +BEGIN + PROMPT 2 1 "Mostra prezzi" +END + +LIST F_MSP_SORT 23 +BEGIN + PROMPT 2 2 "Ordina per " + ITEM " | " + ITEM "1|Cliente+Articolo+Linea" + ITEM "2|Cliente+Linea+Articolo" + ITEM "3|Articolo+Linea+Cliente" + ITEM "4|Articolo+Cliente+Linea" + ITEM "5|Linea+Articolo+Cliente" + ITEM "6|Linea+Cliente+Articolo" +END + +BOOL F_MSP_SORT_ORDER +BEGIN + PROMPT 2 3 "Inverti l'ordine" + MESSAGE TRUE PUSH, F_MSP_SORT + MESSAGE FALSE PUSH, F_MSP_SORT +END + +BUTTON F_MSP_RESORT 10 +BEGIN + PROMPT 25 3 "Riordina" +END + +LIST DLG_NULL 20 +BEGIN + FLAGS "D" + PROMPT 2 4 "@b" + ITEM "M|Master Schedule Plan" + ITEM "O|Ordini in Input" + GROUP G_MASTERSCHEDULE + FLAGS "D" +END + + +GROUPBOX DLG_NULL 39 6 +BEGIN + PROMPT 40 0 "" +END + +TEXT DLG_NULL +BEGIN + PROMPT 42 1 "Logica di proposta:" +END + +LIST F_RECALC_TYPE2 35 +BEGIN + FLAGS "D" + PROMPT 42 2 "" + ITEM "1|FirstFit " + ITEM "1_INF|FirstFit (capacita' infinite) " + ITEM "1_INFH|FirstFit (capacita' umane infinite)" + ITEM "JIT|JustInTime " + ITEM "JIT_INF|JustInTime (capacita' infinite)" + ITEM "JIT_INFH|JustInTime (capacita umane infin.)" +END + +BUTTON F_CANCEL_MSP 9 2 +BEGIN + PROMPT 42 3 "ANNULLA" + PICTURE BMP_CANCEL +END + +BUTTON F_RECALC_MSP 9 2 +BEGIN + PROMPT 54 3 "~Ricalcola" + PICTURE BMP_RECALC +END + + +BUTTON F_CHECK_MSP 9 2 +BEGIN + PROMPT 66 3 "Controlla" + PICTURE USER_BMP_CHECK + PICTURE BMP_LENTE +END + +SPREADSHEET F_ARTICOLI +BEGIN + PROMPT 0 5 "" + ITEM " @F3" + ITEM "Cliente@F6" + ITEM "Articolo@F20" + ITEM "Priorita'" + ITEM "Liv.1@10" + ITEM "Liv.2@10" + ITEM "Liv.3@10" + ITEM "Liv.4@10" + ITEM "Descrizione@50" + ITEM "Impianto" + ITEM "Linea" + ITEM "Mag@3" + ITEM "Dep@2" + ITEM "UM." + ITEM "Bucket0" + ITEM "Bucket0" + ITEM "Bucket1" + ITEM "Bucket1" + ITEM "Bucket2" + ITEM "Bucket2" + ITEM "Bucket3" + ITEM "Bucket3" + ITEM "Bucket4" + ITEM "Bucket4" + ITEM "Bucket5" + ITEM "Bucket5" + ITEM "Bucket6" + ITEM "Bucket6" + ITEM "Bucket7" + ITEM "Bucket7" + ITEM "Bucket8" + ITEM "Bucket8" + ITEM "Bucket9" + ITEM "Bucket9" + ITEM "Bucket10" + ITEM "Bucket10" + ITEM "Bucket11" + ITEM "Bucket11" + ITEM "Bucket12" + ITEM "Bucket12" + ITEM "Bucket13" + ITEM "Bucket13" + DEFAULT NONE +END + +ENDPAGE + +PAGE "Generazione" -1 -1 78 20 +GROUPBOX DLG_NULL 78 7 +BEGIN + PROMPT 1 1 "@b Ricalcolo" +END + +LIST F_RECALC_TYPE 35 +BEGIN + PROMPT 2 2 "Logica propositiva " + ITEM "1|FirstFit " + MESSAGE ENABLE,G_FINITE@ + MESSAGE COPY,F_RECALC_TYPE2 + ITEM "1_INF|FirstFit (capacita' infinite) " + MESSAGE DISABLE,G_FINITE@ + MESSAGE COPY,F_RECALC_TYPE2 + ITEM "1_INFH|FirstFit (capacita' umane infinite)" + MESSAGE DISABLE,G_FINITE@ + MESSAGE COPY,F_RECALC_TYPE2 + ITEM "JIT|JustInTime " + MESSAGE ENABLE,G_FINITE@ + MESSAGE COPY,F_RECALC_TYPE2 + ITEM "JIT_INF|JustInTime (capacita' infinite)" + MESSAGE DISABLE,G_FINITE@ + MESSAGE COPY,F_RECALC_TYPE2 + ITEM "JIT_INFH|JustInTime (capacita umane infin.)" + MESSAGE DISABLE,G_FINITE@ + MESSAGE COPY,F_RECALC_TYPE2 +END + +BOOL F_LOTSIZING +BEGIN + PROMPT 2 3 "Ridimensiona in base ai lotti" +END + +BOOL F_OUTOFCAPACITY +BEGIN + FLAGS "D" + PROMPT 2 4 "Elimina gli out-of-capacity" +END + + +//BOOL F_HUMANCHECK_MSP +//BEGIN +// PROMPT 46 2 "Risorse umane limitate" +// GROUP G_FINITE +//END + +NUMBER F_ANTICIPOMIN 3 +BEGIN + PROMPT 2 5 "Anticipo minimo " + FLAGS "U" +END +NUMBER F_ANTICIPOMAX 3 +BEGIN + PROMPT 2 6 "Anticipo massimo " +END +TEXT DLG_NULL +BEGIN + PROMPT 25 5 "giorni" +END +TEXT DLG_NULL +BEGIN + PROMPT 25 6 "giorni" +END + + +NUMBER F_MAXGIORNIGIAC 3 +BEGIN + PROMPT 2 8 "Massima permanenza in giacenza " +END + +TEXT DLG_NULL +BEGIN + PROMPT 39 8 "giorni" +END + +BOOL F_USENONSTDLIN_MSP +BEGIN + PROMPT 2 9 "Abilita linee non standard" +END + +BOOL F_USEEXTRAHRS_MSP +BEGIN + PROMPT 2 10 "Abilita turni straordinari" +END + +GROUPBOX DLG_NULL 78 6 +BEGIN + PROMPT 1 11 "@b Registrazione" +END + +BOOLEAN F_NUMBERBYCLI +BEGIN + PROMPT 2 12 "Numera gli ordini per cliente" + GROUP 1 +END + + + +STRING F_DA_IMPIANTO 5 +BEGIN + FLAGS "U" + PROMPT 2 13 "Dall'impianto " + USE IMP + INPUT CODTAB F_DA_IMPIANTO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_DA_IMPIANTO CODTAB + CHECKTYPE NORMAL +END +STRING F_A_IMPIANTO 5 +BEGIN + FLAGS "U" + PROMPT 26 13 "all'impianto " + COPY USE F_DA_IMPIANTO + INPUT CODTAB F_A_IMPIANTO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_A_IMPIANTO CODTAB + CHECKTYPE NORMAL +END + +STRING F_DA_MAGAZZ 3 +BEGIN + FLAGS "U" + PROMPT 2 14 "Dal magazzino " + USE MAG SELECT CODTAB[4,5]="" + INPUT CODTAB F_DA_MAGAZZ + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_DA_MAGAZZ CODTAB + CHECKTYPE NORMAL +END +STRING F_A_MAGAZZ 3 +BEGIN + FLAGS "U" + PROMPT 26 14 "al magazzino " + COPY USE F_DA_MAGAZZ + INPUT CODTAB F_A_MAGAZZ + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_A_MAGAZZ CODTAB + CHECKTYPE NORMAL +END + + + +ENDPAGE + +PAGE "C.R.P." -1 -1 78 20 + +GROUPBOX DLG_NULL 39 6 +BEGIN + PROMPT 1 0 "" +END + +BOOL F_SHOWPERC +BEGIN + PROMPT 2 1 "Mostra percentuali" +END + +LIST F_CRP_SORT 23 +BEGIN + FLAGS "D" + PROMPT 2 2 "Ordina per " + ITEM "ILA|Impianto+Linea+Articolo" + ITEM "AIL|Articolo+Impianto+Linea" + ITEM "IAL|Impianto+Articolo+Linea" +END + +LIST F_LOADTYPE 20 +BEGIN + PROMPT 2 4 "" + ITEM "M|Carico macchina" + ITEM "H|Carico uomo" +END + +GROUPBOX DLG_NULL 39 6 +BEGIN + PROMPT 40 0 "" +END + +BOOL F_USENONSTDLIN_CRP +BEGIN + PROMPT 55 1 "Linee non standard" +END +BOOL F_USEEXTRAHRS_CRP +BEGIN + PROMPT 55 2 "Turni straordinari" +END + +BUTTON F_RECALC_CRP 9 2 +BEGIN + PROMPT 54 3 "~Ricalcola" + PICTURE BMP_RECALC +END + +BUTTON F_CHECK_CRP 9 2 +BEGIN + PROMPT 66 3 "Controlla" + PICTURE USER_BMP_CHECK + PICTURE BMP_LENTE +END + + +SPREADSHEET F_LINEE +BEGIN + FLAG "D" + PROMPT 0 5 "" + ITEM "Impianto@F6" + ITEM "Linea@F6" + ITEM "Articolo@20" + ITEM "UM" + ITEM "Bucket0" + ITEM "Bucket1" + ITEM "Bucket2" + ITEM "Bucket3" + ITEM "Bucket4" + ITEM "Bucket5" + ITEM "Bucket6" + ITEM "Bucket7" + ITEM "Bucket8" + ITEM "Bucket9" + ITEM "Bucket10" + ITEM "Bucket11" + ITEM "Bucket12" + ITEM "Bucket13" + DEFAULT NONE +END + +ENDPAGE + +PAGE "Calendario" -1 -1 78 20 + +NUMBER F_YEAR 4 +BEGIN + PROMPT 1 1 "Anno " + FLAGS "A" +END + +STRING F_LINEA 5 +BEGIN + PROMPT 25 1 "Linea " + FLAGS "UZ" + USE LNP + INPUT CODTAB F_LINEA + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_LINEA CODTAB + CHECKTYPE NORMAL +END + +STRING F_IMPIANTO 5 +BEGIN + PROMPT 50 1 "Impianto " + FLAGS "UZ" + USE IMP + INPUT CODTAB F_IMPIANTO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_IMPIANTO CODTAB + CHECKTYPE NORMAL +END + +CALENDAR F_CALENDAR -3 -1 +BEGIN + PROMPT 0 2 "" +END + +ENDPAGE +ENDMASK + + +// SPREADSHEETS + +PAGE "Numeraz. clienti" -1 -1 70 10 + +STRING F_NUMERAZ 4 +BEGIN + PROMPT 1 1 "Numerazione " + FLAGS "U" + USE %NUM + INPUT CODTAB F_NUMERAZ + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_NUMERAZ CODTAB + OUTPUT F_DESCNUMERAZ S0 + CHECKTYPE REQUIRED + ADD NONE +END + +STRING F_DESCNUMERAZ 50 +BEGIN + PROMPT 1 2 "Descrizione " + USE %NUM KEY 2 + INPUT S0 F_DESCNUMERAZ + DISPLAY "Descrizione@70" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_NUMERAZ + CHECKTYPE REQUIRED + ADD NONE +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK + +PAGE "Ordini clienti" -1 -1 70 10 + +STRING F_TIPO 4 +BEGIN + PROMPT 1 2 "Tipo " + FLAGS "U" + USE %TIP + INPUT CODTAB F_TIPO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_TIPO CODTAB + OUTPUT F_DESCTIPO S0 + CHECKTYPE REQUIRED + ADD NONE +END + +STRING F_DESCTIPO 50 +BEGIN + PROMPT 26 2 "" + USE %TIP KEY 2 + INPUT S0 F_DESCTIPO + DISPLAY "Descrizione@70" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_TIPO + CHECKTYPE REQUIRED + ADD NONE +END + +NUMBER F_DASTATO 1 +BEGIN + PROMPT 1 3 "Da stato " + USE %STD + INPUT CODTAB F_DASTATO + DISPLAY "Stato" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_DASTATO CODTAB + CHECKTYPE REQUIRED + ADD NONE +END + +NUMBER F_ASTATO 1 +BEGIN + PROMPT 16 3 "A stato " + COPY USE F_DASTATO + INPUT CODTAB F_ASTATO + COPY DISPLAY F_DASTATO + OUTPUT F_ASTATO CODTAB + CHECKTYPE REQUIRED + ADD NONE +END + + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE +ENDMASK + +PAGE "Ordini planning" -1 -1 70 10 + +STRING F_NUMERAZ 4 +BEGIN + PROMPT 1 1 "Numerazione " + FLAGS "U" + USE %NUM + INPUT CODTAB F_NUMERAZ + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_NUMERAZ CODTAB + OUTPUT F_DESCNUMERAZ S0 + CHECKTYPE REQUIRED + ADD NONE +END + +STRING F_DESCNUMERAZ 50 +BEGIN + PROMPT 26 1 "" + USE %NUM KEY 2 + INPUT S0 F_DESCNUMERAZ + DISPLAY "Descrizione@70" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_NUMERAZ + CHECKTYPE REQUIRED + ADD NONE +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + + +ENDPAGE + +ENDMASK + + +PAGE "Ordini planning" -1 -1 70 10 + +STRING F_TIPO 4 +BEGIN + PROMPT 1 2 "Tipo " + FLAGS "U" + USE %TIP + INPUT CODTAB F_TIPO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_TIPO CODTAB + OUTPUT F_DESCTIPO S0 + CHECKTYPE REQUIRED + ADD NONE +END + +STRING F_DESCTIPO 50 +BEGIN + PROMPT 26 2 "" + USE %TIP KEY 2 + INPUT S0 F_DESCTIPO + DISPLAY "Descrizione@70" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_TIPO + CHECKTYPE REQUIRED + ADD NONE +END + +NUMBER F_DASTATO 1 +BEGIN + PROMPT 1 3 "Da stato " + USE %STD + INPUT CODTAB F_DASTATO + DISPLAY "Stato" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_DASTATO CODTAB + CHECKTYPE REQUIRED + ADD NONE +END + +NUMBER F_ASTATO 1 +BEGIN + PROMPT 16 3 "A stato " + COPY USE F_DASTATO + INPUT CODTAB F_ASTATO + COPY DISPLAY F_DASTATO + OUTPUT F_ASTATO CODTAB + CHECKTYPE REQUIRED + ADD NONE +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK + +PAGE "Articoli" -1 -1 80 18 + +LIST F_TIPOCF_SHEET 9 +BEGIN + PROMPT 1 0 "" + FLAGS "DG" + ITEM "C|Cliente " + ITEM "F|Fornitore" +END + +NUMBER F_CLIENTE 6 +BEGIN + PROMPT 14 0 "" + USE LF_CLIFO + INPUT TIPOCF F_TIPOCF_SHEET SELECT + INPUT CODCF F_CLIENTE + DISPLAY "Tipo" TIPOCF + DISPLAY "Codice" CODCF + DISPLAY "Ragione sociale@35" RAGSOC + OUTPUT F_CLIENTE CODCF + OUTPUT F_DESCCLI RAGSOC + CHECKTYPE NORMAL + FLAGS "U" +END + +STRING F_DESCCLI 50 42 +BEGIN + PROMPT 26 0 "" + FLAGS "D" +END + +STRING F_ARTICOLO 20 +BEGIN + PROMPT 1 1 "Articolo " + FLAGS "D" +END + +NUMBER F_PRIORITA 4 +BEGIN + PROMPT 55 1 "Priorita' " + FLAGS "U" +END + +STRING F_DESCART 50 +BEGIN + PROMPT 1 2 "Descrizione " + FLAGS "DG" +END + +STRING F_LIV1 10 +BEGIN + PROMPT 1 3 "Giacenza " + FLAGS "UD" + USE GCG + INPUT CODTAB[1,1] "1" + INPUT CODTAB[2,11] F_LIV1 + DISPLAY "Gruppo@20" CODTAB[2,20] + DISPLAY "Descr.@30" S0 + OUTPUT F_LIV1 CODTAB[2,12] + CHECKTYPE NORMAL + MESSAGE EMPTY CLEAR,F_LIV2|CHECK,F_LIV2 + MESSAGE ENABLE,F_LIV2 +END + +STRING F_LIV2 10 +BEGIN + PROMPT 27 3 "Giacenza " + FLAGS "UD" + USE GCG + INPUT CODTAB[1,1] "2" + INPUT CODTAB[2,11] F_LIV2 + DISPLAY "Gruppo@20" CODTAB[2,20] + DISPLAY "Descr.@30" S0 + OUTPUT F_LIV2 CODTAB[2,12] + CHECKTYPE NORMAL + MESSAGE EMPTY CLEAR,F_LIV3|CHECK,F_LIV3 + MESSAGE ENABLE,F_LIV3 +END + +STRING F_LIV3 10 +BEGIN + PROMPT 1 4 "Giacenza " + FLAGS "UD" + USE GCG + INPUT CODTAB[1,1] "3" + INPUT CODTAB[2,11] F_LIV3 + DISPLAY "Gruppo@20" CODTAB[2,20] + DISPLAY "Descr.@30" S0 + OUTPUT F_LIV3 CODTAB[2,12] + CHECKTYPE NORMAL + MESSAGE EMPTY CLEAR,F_LIV4|CHECK,F_LIV4 + MESSAGE ENABLE,F_LIV4 +END + +STRING F_LIV4 10 +BEGIN + PROMPT 27 4 "Giacenza " + FLAGS "UD" + USE GCG + INPUT CODTAB[1,1] "4" + INPUT CODTAB[2,11] F_LIV4 + DISPLAY "Gruppo@20" CODTAB[2,20] + DISPLAY "Descr.@30" S0 + OUTPUT F_LIV4 CODTAB[2,12] + CHECKTYPE NORMAL +END + +STRING H_CODIMP 5 +BEGIN + PROMPT 1 5 "Impianto " + FLAGS "UHG" + MESSAGE EMPTY COPY,H_CODIMP + MESSAGE COPY,F_CODIMP|CHECK,F_CODIMP +END + + +STRING F_CODIMP 5 +BEGIN + PROMPT 1 5 "Impianto " + FLAGS "U" + USE IMP + INPUT CODTAB F_CODIMP + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODIMP CODTAB + OUTPUT F_DESCIMP S0 + CHECKTYPE NORMAL + ADD NONE +END + +STRING F_DESCIMP 50 37 +BEGIN + PROMPT 25 5 "" + USE IMP KEY 2 + INPUT S0 F_DESCIMP + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice@16" CODTAB + COPY OUTPUT F_CODIMP + CHECKTYPE NORMAL + ADD NONE +END + +STRING F_CODLIN 5 +BEGIN + PROMPT 1 6 "Linea " + FLAGS "U" + USE LNP + INPUT CODTAB F_CODLIN + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODLIN CODTAB + OUTPUT F_DESCLIN S0 + OUTPUT H_CODIMP S6 + CHECKTYPE NORMAL + ADD NONE +END + +STRING F_DESCLIN 50 37 +BEGIN + PROMPT 25 6 "" + USE LNP KEY 2 + INPUT S0 F_DESCLIN + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice@16" CODTAB + COPY OUTPUT F_CODLIN + CHECKTYPE NORMAL + ADD NONE +END + +STRING F_MAGAZZINO 3 +BEGIN + PROMPT 1 7 "Magazzino " + FLAGS "U" + USE MAG + INPUT CODTAB[1,3] F_MAGAZZINO + INPUT CODTAB[4,5] F_DEPOSITO + DISPLAY "Magazzino" CODTAB[1,3] + DISPLAY "Deposito" CODTAB[4,5] + DISPLAY "Descrizione@50" S0 + OUTPUT F_MAGAZZINO CODTAB[1,3] + OUTPUT F_DEPOSITO CODTAB[4,5] + OUTPUT F_DESCMAG S0 + CHECKTYPE NORMAL +END + +STRING F_DEPOSITO 2 +BEGIN + PROMPT 19 7 "" + FLAGS "U" + COPY ALL F_MAGAZZINO + CHECKTYPE NORMAL +END + +STRING F_DESCMAG 50 37 +BEGIN + PROMPT 25 7 "" + USE MAG KEY 2 + INPUT S0 F_DESCMAG + DISPLAY "Descrizione@50" S0 + DISPLAY "Magazzino" CODTAB[1,3] + DISPLAY "Deposito" CODTAB[4,5] + COPY OUTPUT F_MAGAZZINO + CHECKTYPE NORMAL +END + +/* +LIST DLG_NULL 10 +BEGIN + PROMPT 2 8 "" + ITEM "Q|Quantita" + MESSAGE ENABLE,G_QTA@|DISABLE,G_VALORI@ + ITEM "P|Prezzi" + MESSAGE DISABLE,G_QTA@|ENABLE,G_VALORI@ +END +*/ + +STRING F_UM 2 +BEGIN + PROMT 1 8 "Unita' di misura " + FLAGS "D" +END + +NUMBER F_BUCKET0 17 2 +BEGIN + PROMPT 40 8 "0 " + FLAGS "DU" +END + +NUMBER F_BUCKET0_V 15 3 +BEGIN + PROMPT 62 8 "" + FLAGS "DU" +END + +NUMBER F_BUCKET1 17 2 +BEGIN + PROMPT 1 9 "1 " + FLAGS "U" + GROUP G_QTA +END + +NUMBER F_BUCKET1_V 15 3 +BEGIN + PROMPT 22 9 "" + FLAGS "U" + GROUP G_VALORI +END + + +NUMBER F_BUCKET2 17 2 +BEGIN + PROMPT 40 9 "2 " + FLAGS "U" + GROUP G_QTA +END + +NUMBER F_BUCKET2_V 15 3 +BEGIN + PROMPT 62 9 "" + FLAGS "U" + GROUP G_VALORI +END + +NUMBER F_BUCKET3 17 2 +BEGIN + PROMPT 1 10 "3 " + FLAGS "U" + GROUP G_QTA +END + +NUMBER F_BUCKET3_V 15 3 +BEGIN + PROMPT 22 10 "" + FLAGS "U" + GROUP G_VALORI +END + +NUMBER F_BUCKET4 17 2 +BEGIN + PROMPT 40 10 "4 " + FLAGS "U" + GROUP G_QTA +END + +NUMBER F_BUCKET4_V 15 3 +BEGIN + PROMPT 62 10 "" + FLAGS "U" + GROUP G_VALORI +END + +NUMBER F_BUCKET5 17 2 +BEGIN + PROMPT 1 11 "5 " + FLAGS "U" + GROUP G_QTA +END + +NUMBER F_BUCKET5_V 15 3 +BEGIN + PROMPT 22 11 "" + FLAGS "U" + GROUP G_VALORI +END + +NUMBER F_BUCKET6 17 2 +BEGIN + PROMPT 40 11 "6 " + FLAGS "U" + GROUP G_QTA +END + +NUMBER F_BUCKET6_V 15 3 +BEGIN + PROMPT 62 11 "" + FLAGS "U" + GROUP G_VALORI +END + +NUMBER F_BUCKET7 17 2 +BEGIN + PROMPT 1 12 "7 " + FLAGS "U" + GROUP G_QTA +END + +NUMBER F_BUCKET7_V 15 3 +BEGIN + PROMPT 22 12 "" + FLAGS "U" + GROUP G_VALORI +END + +NUMBER F_BUCKET8 17 2 +BEGIN + PROMPT 40 12 "8 " + FLAGS "U" + GROUP G_QTA +END + +NUMBER F_BUCKET8_V 15 3 +BEGIN + PROMPT 62 12 "" + FLAGS "U" + GROUP G_VALORI +END + +NUMBER F_BUCKET9 17 2 +BEGIN + PROMPT 1 13 "9 " + FLAGS "U" + GROUP G_QTA +END + +NUMBER F_BUCKET9_V 15 3 +BEGIN + PROMPT 22 13 "" + FLAGS "U" + GROUP G_VALORI +END + +NUMBER F_BUCKET10 17 2 +BEGIN + PROMPT 40 13 "10" + FLAGS "U" + GROUP G_QTA +END + +NUMBER F_BUCKET10_V 15 3 +BEGIN + PROMPT 62 13 "" + FLAGS "U" + GROUP G_VALORI +END + +NUMBER F_BUCKET11 17 2 +BEGIN + PROMPT 1 14 "11" + FLAGS "U" + GROUP G_QTA +END + +NUMBER F_BUCKET11_V 15 3 +BEGIN + PROMPT 22 14 "" + FLAGS "U" + GROUP G_VALORI +END + +NUMBER F_BUCKET12 17 2 +BEGIN + PROMPT 40 14 "12" + FLAGS "U" + GROUP G_QTA +END + +NUMBER F_BUCKET12_V 15 3 +BEGIN + PROMPT 62 14 "" + FLAGS "U" + GROUP G_VALORI +END + +NUMBER F_BUCKET13 17 2 +BEGIN + PROMPT 1 15 "13" + FLAGS "DU" +END + +NUMBER F_BUCKET13_V 15 3 +BEGIN + PROMPT 22 15 "" + FLAGS "DU" +END + +STRING F_MASTERCODE 1 +BEGIN + PROMPT 22 15 "" + FLAGS "H" +END + +/*STRING F_NEWCODLIN 5 +BEGIN + PROMPT 22 15 "" + FLAGS "H" +END +STRING F_NEWCODIMP 5 +BEGIN + PROMPT 22 15 "" + FLAGS "H" +END*/ + + + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +ENDMASK + +PAGE "Linee" -1 -1 64 14 + +NUMBER H_CODDITTA 5 +BEGIN + PROMPT 1 1 "Ditta " + FLAGS "FRGD" + USE LF_NDITTE KEY 1 + INPUT CODDITTA H_CODDITTA + OUTPUT H_CODDITTA CODDITTA + OUTPUT F_RAGSOC RAGSOC + CHECKTYPE REQUIRED +END + +STRING F_RAGSOC 50 37 +BEGIN + PROMPT 18 1 "" + FLAGS "D" +END + +STRING F_CODIMPCRP 5 +BEGIN + PROMPT 1 2 "Impianto " + FLAGS "U" + USE IMP + INPUT CODTAB F_CODIMPCRP + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODIMPCRP CODTAB + OUTPUT F_DESCIMPCRP S0 + CHECKTYPE NORMAL + ADD NONE +END + +STRING F_DESCIMPCRP 50 37 +BEGIN + PROMPT 18 2 "" + FLAGS "D" +// USE IMP KEY 2 +// INPUT S0 F_DESCIMPCRP +// DISPLAY "Descrizione@50" S0 +// DISPLAY "Codice@16" CODTAB +// COPY OUTPUT F_CODIMPCRP +// CHECKTYPE NORMAL +// ADD NONE +END + +STRING F_CODLINCRP 5 +BEGIN + PROMPT 1 3 "Linea " + FLAGS "UZ" + USE LNP + INPUT CODTAB F_CODLINCRP + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODLINCRP CODTAB + OUTPUT F_DESCLINCRP S0 + CHECKTYPE NORMAL + ADD NONE +END + +STRING F_DESCLINCRP 50 37 +BEGIN + PROMPT 18 3 "" + FLAGS "D" +// USE LNP KEY 2 +// INPUT S0 F_DESCLINCRP +// DISPLAY "Codice" CODTAB +// DISPLAY "Descrizione@50" S0 +// COPY OUTPUT F_CODLINCRP +// CHECKTYPE NORMAL +// ADD NONE +END + +STRING F_CODARTCRP 20 +BEGIN + PROMPT 1 4 "" + FLAGS "" +END + +STRING F_DESCARTCRP 50 +BEGIN + PROMPT 18 4 "" + FLAGS "D" +END + +STRING F_LUM 3 +BEGIN + PROMPT 1 5 "Unita' di misura " + FLAGS "DU" +END + +NUMBER F_LBUCKET0 17 2 +BEGIN + PROMPT 1 6 "0 " + FLAGS "DU" +END + +NUMBER F_LBUCKET1 17 2 +BEGIN + PROMPT 1 7 "1 " + FLAGS "U" +END + +NUMBER F_LBUCKET2 17 2 +BEGIN + PROMPT 22 7 "2 " + FLAGS "U" +END + +NUMBER F_LBUCKET3 17 2 +BEGIN + PROMPT 43 7 "3 " + FLAGS "U" +END + +NUMBER F_LBUCKET4 17 2 +BEGIN + PROMPT 1 8 "4 " + FLAGS "U" +END + +NUMBER F_LBUCKET5 17 2 +BEGIN + PROMPT 22 8 "5 " + FLAGS "U" +END + +NUMBER F_LBUCKET6 17 2 +BEGIN + PROMPT 43 8 "6 " + FLAGS "U" +END + +NUMBER F_LBUCKET7 17 2 +BEGIN + PROMPT 1 9 "7 " + FLAGS "U" +END + +NUMBER F_LBUCKET8 17 2 +BEGIN + PROMPT 22 9 "8 " + FLAGS "U" +END + +NUMBER F_LBUCKET9 17 2 +BEGIN + PROMPT 43 9 "9 " + FLAGS "U" +END + +NUMBER F_LBUCKET10 17 2 +BEGIN + PROMPT 1 10 "10" + FLAGS "U" +END + +NUMBER F_LBUCKET11 17 2 +BEGIN + PROMPT 22 10 "11" + FLAGS "U" +END + +NUMBER F_LBUCKET12 17 2 +BEGIN + PROMPT 43 10 "12" + FLAGS "U" +END + +NUMBER F_LBUCKET13 17 2 +BEGIN + PROMPT 1 11 "13" + FLAGS "DU" +END + + + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +ENDMASK + +PAGE "Teste" -1 -1 64 13 + +STRING F_CODIMPCRP 5 +BEGIN + PROMPT 1 1 "Impianto " + FLAGS "U" + USE IMP + INPUT CODTAB F_CODIMPCRP + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODIMPCRP CODTAB + OUTPUT F_DESCIMPCRP S0 + CHECKTYPE NORMAL +END + +STRING F_DESCIMPCRP 50 37 +BEGIN + PROMPT 24 1 "" + USE IMP KEY 2 + INPUT S0 F_DESCIMPCRP + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice@16" CODTAB + COPY OUTPUT F_CODIMPCRP + CHECKTYPE NORMAL +END + +STRING F_CODLINCRP 5 +BEGIN + PROMPT 1 2 "Linea " + FLAGS "UZ" + USE LNP + INPUT CODTAB F_CODLINCRP + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODLINCRP CODTAB + OUTPUT F_DESCLINCRP S0 + CHECKTYPE NORMAL +END + +STRING F_DESCLINCRP 50 +BEGIN + PROMPT 25 2 "" + FLAGS "UZ" + USE LNP KEY 2 + INPUT S0 F_DESCLINCRP + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + COPY OUTPUT F_CODLINCRP + CHECKTYPE NORMAL +END + +STRING F_CODARTCRP 20 +BEGIN + PROMPT 1 3 "Articolo " + FLAGS "U" +END + +STRING F_DESCARTCRP 50 +BEGIN + PROMPT 15 4 "" +END + + +STRING F_LUM 3 +BEGIN + PROMPT 1 5 "Unita' di misura " + FLAGS "DU" +END + +NUMBER F_LBUCKET0 17 2 +BEGIN + PROMPT 1 6 "0 " + FLAGS "DU" +END + +NUMBER F_LBUCKET1 17 2 +BEGIN + PROMPT 1 7 "1 " + FLAGS "U" +END + +NUMBER F_LBUCKET2 17 2 +BEGIN + PROMPT 22 7 "2 " + FLAGS "U" +END + +NUMBER F_LBUCKET3 17 2 +BEGIN + PROMPT 43 7 "3 " + FLAGS "U" +END + +NUMBER F_LBUCKET4 17 2 +BEGIN + PROMPT 1 8 "4 " + FLAGS "U" +END + +NUMBER F_LBUCKET5 17 2 +BEGIN + PROMPT 22 8 "5 " + FLAGS "U" +END + +NUMBER F_LBUCKET6 17 2 +BEGIN + PROMPT 43 8 "6 " + FLAGS "U" +END + +NUMBER F_LBUCKET7 17 2 +BEGIN + PROMPT 1 9 "7 " + FLAGS "U" +END + +NUMBER F_LBUCKET8 17 2 +BEGIN + PROMPT 22 9 "8 " + FLAGS "U" +END + +NUMBER F_LBUCKET9 17 2 +BEGIN + PROMPT 43 9 "9 " + FLAGS "U" +END + +NUMBER F_LBUCKET10 17 2 +BEGIN + PROMPT 1 10 "10" + FLAGS "DU" +END + + + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +ENDMASK + diff --git a/mr/mr2200b.h b/mr/mr2200b.h new file mode 100755 index 000000000..fa2be2175 --- /dev/null +++ b/mr/mr2200b.h @@ -0,0 +1,59 @@ +#define FC_RIGA 101 +#define FC_BUCKET 102 +#define FC_CODART 103 +#define FC_LIV1 104 +#define FC_LIV2 105 +#define FC_LIV3 106 +#define FC_LIV4 107 +#define FC_CODIMP 108 +#define FC_CODLIN 109 +#define FC_CODCLI 110 +#define FC_CODMAG 111 +#define FC_CODDEP 112 + +#define FC_IS_VINCOLO 113 +#define FC_DATE1 114 +#define FC_DATE2 115 +#define FC_MOVEFILTER 116 +#define FC_FINDFILTER 117 +#define FC_MAXBUCK2CHECK 118 + +// MSP check mask + +#define FC_STARTING_VALUE 120 +#define FC_PROPOSED_VALUE 121 +#define FC_FINAL_VALUE 122 + +#define HC_GIAC 133 +#define FC_GIAC 134 +#define FC_UNDERSTOCK 135 +#define FC_GIORNIGIAC 136 +#define FC_OVERGIORNIGIAC 137 + +// CRP check mask +#define FC_ART_LOAD 120 + +#define FC_LOAD 130 +#define FC_CAPACITY 131 +#define FC_CAPACITY_OUT 132 +#define FC_CAPACITY_REM 133 + + +#define FC_UP 140 +#define FC_DOWN 141 +#define FC_RIGHT 142 +#define FC_LEFT 143 +#define FC_UPLEFT 144 +#define FC_UPRIGHT 145 +#define FC_DOWNLEFT 146 +#define FC_DOWNRIGHT 147 + +#define FC_UP_BAD 150 +#define FC_DOWN_BAD 151 +#define FC_LEFT_BAD 152 +#define FC_RIGHT_BAD 153 + +#define FC_DESCART 160 +#define FC_DESCIMP 161 +#define FC_DESCLIN 162 +#define FC_DESCMAG 163 diff --git a/mr/mr2200b.uml b/mr/mr2200b.uml new file mode 100755 index 000000000..310e3e49d --- /dev/null +++ b/mr/mr2200b.uml @@ -0,0 +1,311 @@ +#include "mr2200b.h" +#include "mr2url.h" +#define G_ARTICOLI 10 +#define G_VINCOLI 20 +PAGE "Controllo planning" -1 -1 76 20 + + +NUMBER FC_RIGA 4 +BEGIN + FLAGS "D" + PROMPT 1 0 "Riga " +END + +NUMBER FC_BUCKET 2 +BEGIN + FLAGS "D" + PROMPT 19 0 "Bucket " +END + +DATE FC_DATE1 +BEGIN + FLAGS "D" + PROMPT 34 0 "(" +END +DATE FC_DATE2 +BEGIN + FLAGS "D" + PROMPT 46 0 "-" +END +TEXT DLG_NULL +BEGIN + PROMPT 58 0 ")" +END + + +NUMBER FC_CODCLI 9 +BEGIN + FLAGS "DR" + PROMPT 1 1 "Cli/forn. " +END + +STRING FC_CODART 20 +BEGIN + FLAGS "DG" + PROMPT 1 2 "Articolo " +END + +STRING FC_DESCART 35 +BEGIN + FLAGS "D" + PROMPT 34 2 "" +END + +STRING FC_CODIMP 5 +BEGIN + FLAGS "DG" + PROMPT 1 4 "Impianto " + USE IMP + INPUT CODTAB FC_CODIMP + OUTPUT FC_CODIMP CODTAB + OUTPUT FC_DESCIMP S0 +END + +STRING FC_DESCIMP 35 +BEGIN + FLAGS "D" + PROMPT 24 4 "" +END + +STRING FC_CODLIN 5 +BEGIN + FLAGS "DG" + PROMPT 1 5 "Linea " + INPUT CODTAB FC_CODLIN + OUTPUT FC_CODLIN CODTAB + OUTPUT FC_DESCLIN S0 +END + +STRING FC_DESCLIN 35 +BEGIN + FLAGS "D" + PROMPT 24 5 "" +END + +STRING FC_CODMAG 3 +BEGIN + FLAGS "D" + PROMPT 1 6 "Magazzino " +END + +STRING FC_CODDEP 2 +BEGIN + FLAGS "D" + PROMPT 16 6 "" + USE MAG + INPUT CODTAB[1,3] FC_CODMAG + INPUT CODTAB[4,5] FC_CODDEP + OUTPUT FC_DESCMAG S0 +END + +STRING FC_DESCMAG 35 +BEGIN + FLAGS "D" + PROMPT 24 6 "" +END + +BOOL FC_IS_VINCOLO +BEGIN + FLAGS "HG" + PROMPT 0 0 "" + MESSAGE FALSE SHOW,G_ARTICOLI@//|HIDE,G_VINCOLI@ + MESSAGE TRUE HIDE,G_ARTICOLI@//|SHOW,G_VINCOLI@ +END + +TEXT DLG_NULL +BEGIN + PROMPT 24 7 "@bARTICOLO" + GROUP G_ARTICOLI +END +TEXT DLG_NULL +BEGIN + PROMPT 60 7 "@bVINCOLO" +END + +TEXT DLG_NULL +BEGIN + PROMPT 1 8 "Q.ta attuale " + GROUP G_ARTICOLI +END +NUMBER FC_FINAL_VALUE 17 2 +BEGIN + FLAGS "D" + PROMPT 19 8 "" + GROUP G_ARTICOLI +END + +NUMBER FC_PROPOSED_VALUE 17 2 +BEGIN + FLAGS "D" + PROMPT 1 9 "@bQ.ta proposta " + GROUP G_ARTICOLI +END + +TEXT DLG_NULL +BEGIN + PROMPT 1 10 "Q.ta iniziale " + GROUP G_ARTICOLI +END +NUMBER FC_STARTING_VALUE 17 2 +BEGIN + FLAGS "D" + PROMPT 19 10 "" + GROUP G_ARTICOLI +END + +NUMBER HC_GIAC 17 2 +BEGIN + FLAGS "HG" + PROMPT 56 8 "" +END + +TEXT DLG_NULL +BEGIN + PROMPT 40 8 "Giacenza " +END + +NUMBER FC_GIAC 17 2 +BEGIN + FLAGS "D" + PROMPT 56 8 "" +END + +NUMBER FC_UNDERSTOCK 17 2 +BEGIN + FLAGS "D" + PROMPT 40 9 "@bSotto stock " +END + +NUMBER FC_GIORNIGIAC 17 2 +BEGIN + FLAGS "D" + PROMPT 40 10 "Giorni " +END +NUMBER FC_OVERGIORNIGIAC 17 2 +BEGIN + FLAGS "D" + PROMPT 40 10 "@bGiorni " +END + +GROUPBOX DLG_NULL 80 10 +BEGIN + PROMPT 0 11 "" +END + +TEXT DLG_NULL +BEGIN + PROMPT 9 12 "@bMovimento" +END + +LIST FC_MOVEFILTER 20 +BEGIN + PROMPT 2 13 "" + ITEM "|Articoli e vincoli" + ITEM "A|Solo linee articolo" + ITEM "C|Solo linee vincolo" +END + +TEXT DLG_NULL +BEGIN + PROMPT 39 12 "@bRicerca" +END + +LIST FC_FINDFILTER 28 +BEGIN + PROMPT 30 13 "" + ITEM "8|Sotto stock" + ITEM "12|Anomalie" + ITEM "4|Eccessiva permanenza" + ITEM "14|Anomalie e nuove proposte" + ITEM "15|Anomalie e modifiche" + ITEM "13|Anomalie e modifiche manuali" + ITEM "2|Nuove proposte" + ITEM "3|Modifiche" + ITEM "1|Modifiche manuali" +END + +NUMBER FC_MAXBUCK2CHECK 2 +BEGIN + PROMPT 62 13 "fino a " +END + + +BUTTON FC_RIGHT_BAD 4 2 +BEGIN + PROMPT 46 16 "" + PICTURE USER_BMP_ARROWRIGHT_RED +END +BUTTON FC_DOWN_BAD 4 2 +BEGIN + PROMPT 40 18 "" + PICTURE USER_BMP_ARROWDOWN_RED +END +BUTTON FC_LEFT_BAD 4 2 +BEGIN + PROMPT 34 16 "" + PICTURE USER_BMP_ARROWLEFT_RED +END +BUTTON FC_UP_BAD 4 2 +BEGIN + PROMPT 40 14 "" + PICTURE USER_BMP_ARROWUP_RED +END + +BUTTON FC_UPLEFT 4 2 +BEGIN + PROMPT 4 14 "<" + PICTURE USER_BMP_ARROWUPLEFT +END + +BUTTON FC_UP 4 2 +BEGIN + PROMPT 10 14 "Su'" + PICTURE USER_BMP_ARROWUP +END + +BUTTON FC_UPRIGHT 4 2 +BEGIN + PROMPT 16 14 ">" + PICTURE USER_BMP_ARROWUPRIGHT +END + +BUTTON FC_RIGHT 4 2 +BEGIN + PROMPT 16 16 ">" + PICTURE USER_BMP_ARROWRIGHT +END + +BUTTON FC_DOWNRIGHT 4 2 +BEGIN + PROMPT 16 18 ">" + PICTURE USER_BMP_ARROWDOWNRIGHT +END + +BUTTON FC_DOWN 4 2 +BEGIN + PROMPT 10 18 "Giu'" + PICTURE USER_BMP_ARROWDOWN +END + +BUTTON FC_DOWNLEFT 4 2 +BEGIN + PROMPT 4 18 "<" + PICTURE USER_BMP_ARROWDOWNLEFT +END + +BUTTON FC_LEFT 4 2 +BEGIN + PROMPT 4 16 "<" + PICTURE USER_BMP_ARROWLEFT +END + + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT 60 18 "" +END + + +ENDPAGE + +ENDMASK diff --git a/mr/mr2200c.uml b/mr/mr2200c.uml new file mode 100755 index 000000000..8d343219a --- /dev/null +++ b/mr/mr2200c.uml @@ -0,0 +1,255 @@ +#include "mr2200b.h" +#include "mr2url.h" +#define G_ARTICOLI 10 +#define G_VINCOLI 20 +PAGE "Controllo capacita'" -1 -1 76 20 + + +NUMBER FC_RIGA 4 +BEGIN + FLAGS "D" + PROMPT 1 0 "Riga " +END + +NUMBER FC_BUCKET 2 +BEGIN + FLAGS "D" + PROMPT 19 0 "Bucket " +END + +DATE FC_DATE1 +BEGIN + FLAGS "D" + PROMPT 34 0 "(" +END +DATE FC_DATE2 +BEGIN + FLAGS "D" + PROMPT 46 0 "-" +END +TEXT DLG_NULL +BEGIN + PROMPT 58 0 ")" +END + + +STRING FC_CODIMP 5 +BEGIN + FLAGS "D" + PROMPT 1 1 "Impianto " +END + +STRING FC_DESCIMP 35 +BEGIN + FLAGS "D" + PROMPT 24 1 "" +END + +STRING FC_CODLIN 5 +BEGIN + FLAGS "D" + PROMPT 1 2 "Linea " +END + +STRING FC_DESCLIN 35 +BEGIN + FLAGS "D" + PROMPT 24 2 "" +END + +STRING FC_CODART 20 +BEGIN + FLAGS "D" + PROMPT 1 3 "Articolo " + GROUP G_ARTICOLI +END + +STRING FC_DESCART 35 +BEGIN + FLAGS "D" + PROMPT 34 3 "" + GROUP G_ARTICOLI +END + +NUMBER FC_CODCLI 9 +BEGIN + FLAGS "DR" + PROMPT 1 4 "Cliente " + GROUP G_ARTICOLI +END + +BOOL FC_IS_VINCOLO +BEGIN + FLAGS "HG" + PROMPT 0 0 "" + MESSAGE FALSE SHOW,G_ARTICOLI@|HIDE,G_VINCOLI@ + MESSAGE TRUE HIDE,G_ARTICOLI@|SHOW,G_VINCOLI@ +END + +TEXT DLG_NULL +BEGIN + PROMPT 24 6 "@bARTICOLO" + GROUP G_ARTICOLI +END +TEXT DLG_NULL +BEGIN + PROMPT 60 6 "@bVINCOLO" +END + +TEXT DLG_NULL +BEGIN + PROMPT 1 7 "Carico " + GROUP G_ARTICOLI +END + +NUMBER FC_ART_LOAD 17 2 +BEGIN + FLAGS "D" + PROMPT 19 7 "" + GROUP G_ARTICOLI +END + +TEXT DLG_NULL +BEGIN + PROMPT 40 7 "Carico totale " +END + +NUMBER FC_LOAD 14 2 +BEGIN + FLAGS "D" + PROMPT 60 7 "" +END + +TEXT DLG_NULL +BEGIN + PROMPT 40 8 "Capacita' massima " +END +NUMBER FC_CAPACITY 14 2 +BEGIN + FLAGS "D" + PROMPT 60 8 "" +END + +NUMBER FC_CAPACITY_OUT 14 2 +BEGIN + FLAGS "D" + PROMPT 40 9 "@bFuori capacita' " +END + +NUMBER FC_CAPACITY_REM 14 2 +BEGIN + FLAGS "D" + PROMPT 40 9 "Capacita' residua " +END + + + +TEXT DLG_NULL +BEGIN + PROMPT 9 12 "@bMovimento" +END +LIST FC_MOVEFILTER 20 +BEGIN + PROMPT 2 13 "" + ITEM "C|Solo linee vincolo" +// ITEM "A|Solo linee articolo" +// ITEM "|Articoli e vincoli" +END + +TEXT DLG_NULL +BEGIN + PROMPT 39 12 "@bRicerca" +END + +LIST FC_FINDFILTER 28 +BEGIN + PROMPT 30 13 "" + ITEM "12|Anomalie" +// ITEM "8|Fuori capacita'" +// ITEM "4|Sotto capacita'" +END + +NUMBER FC_MAXBUCK2CHECK 2 +BEGIN + PROMPT 62 13 "fino a " +END + + +BUTTON FC_RIGHT_BAD 4 2 +BEGIN + PROMPT 46 16 "" + PICTURE USER_BMP_ARROWRIGHT_RED +END +BUTTON FC_DOWN_BAD 4 2 +BEGIN + PROMPT 40 18 "" + PICTURE USER_BMP_ARROWDOWN_RED +END +BUTTON FC_LEFT_BAD 4 2 +BEGIN + PROMPT 34 16 "" + PICTURE USER_BMP_ARROWLEFT_RED +END +BUTTON FC_UP_BAD 4 2 +BEGIN + PROMPT 40 14 "" + PICTURE USER_BMP_ARROWUP_RED +END + +BUTTON FC_UPLEFT 4 2 +BEGIN + PROMPT 4 14 "<" + PICTURE USER_BMP_ARROWUPLEFT +END + +BUTTON FC_UP 4 2 +BEGIN + PROMPT 10 14 "Su'" + PICTURE USER_BMP_ARROWUP +END + +BUTTON FC_UPRIGHT 4 2 +BEGIN + PROMPT 16 14 ">" + PICTURE USER_BMP_ARROWUPRIGHT +END + +BUTTON FC_RIGHT 4 2 +BEGIN + PROMPT 16 16 ">" + PICTURE USER_BMP_ARROWRIGHT +END + +BUTTON FC_DOWNRIGHT 4 2 +BEGIN + PROMPT 16 18 ">" + PICTURE USER_BMP_ARROWDOWNRIGHT +END + +BUTTON FC_DOWN 4 2 +BEGIN + PROMPT 10 18 "Giu'" + PICTURE USER_BMP_ARROWDOWN +END + +BUTTON FC_DOWNLEFT 4 2 +BEGIN + PROMPT 4 18 "<" + PICTURE USER_BMP_ARROWDOWNLEFT +END + +BUTTON FC_LEFT 4 2 +BEGIN + PROMPT 4 16 "<" + PICTURE USER_BMP_ARROWLEFT +END + + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT 60 18 "" +END + +ENDPAGE + +ENDMASK diff --git a/mr/mr2url.h b/mr/mr2url.h new file mode 100755 index 000000000..f5212820f --- /dev/null +++ b/mr/mr2url.h @@ -0,0 +1,18 @@ +#define USER_BMP_CHECK 1661 +#define USER_BMP_ARROWUP 1662 +#define USER_BMP_ARROWDOWN 1663 +#define USER_BMP_ARROWLEFT 1664 +#define USER_BMP_ARROWRIGHT 1665 + +#define USER_BMP_ARROWUPLEFT 1666 +#define USER_BMP_ARROWDOWNLEFT 1667 +#define USER_BMP_ARROWUPRIGHT 1668 +#define USER_BMP_ARROWDOWNRIGHT 1669 +#define USER_BMP_ARROWLEFT_RED 1670 +#define USER_BMP_ARROWRIGHT_RED 1671 +#define USER_BMP_ARROWUP_RED 1672 +#define USER_BMP_ARROWDOWN_RED 1673 + +#define USER_BMP_SELECT_ORDP 1700 +#define USER_BMP_SELECT_ORDF 1701 + diff --git a/mr/mrprassi.men b/mr/mrprassi.men new file mode 100755 index 000000000..d63091120 --- /dev/null +++ b/mr/mrprassi.men @@ -0,0 +1,67 @@ +[PRASSIMR_001] +Caption = "Gestione della produzione" +Picture = +Module = 39 +Flags = "" +Item_01 = "Planning", "mr2 -1", "F" +Item_01 = "MRP", "mr2 -0", "F" +Item_01 = "Archivi", [PRASSIMR_010] +Item_02 = "Stampe archivi", [PRASSIMR_020] +Item_03 = "Stampe", [PRASSIMR_040] +Item_04 = "Servizi", [PRASSIMR_030] +Item_05 = "Configurazione MRP", [PRASSIMR_080] + +[PRASSIMR_010] +Caption = "Gestione archivi" +Picture = +Module = 39 +Flags = "" +Item_01 = "Anagrafica distinte", "db0 -4", "F" +Item_01 = "Tabella lavorazioni", "db0 -0 LAV", "F" +Item_01 = "Tabella ordinamenti", "db0 -0 ORD", "F" +Item_01 = "Tabella variabili", "db0 -0 VAR", "F" +Item_01 = "Tabella impianti", "mr0 -0 IMP", "F" +Item_01 = "Tabella linee di produzione", "mr0 -0 LNP", "F" + +[PRASSIMR_020] +Caption = "Stampa archivi" +Picture = +Module = 39 +Flags = "" +Item_01 = "Anagrafica distinte", "db1 -1", "F" +Item_01 = "Tabella lavorazioni", "ba3 -1 LAV", "F" +Item_01 = "Tabella ordinamenti", "ba3 -1 ORD", "F" +Item_01 = "Tabella variabili", "ba3 -1 VAR", "F" +Item_01 = "Tabella impianti", "mr0 -1 IMP", "F" +Item_01 = "Tabella linee di produzione", "mr0 -1 LNP", "F" + + +[PRASSIMR_040] +Caption = "Stampa" +Picture = +Module = 39 +Flags = "" +Item_01 = "Stampa tabella planning", "mr1 -0", "F" +Item_01 = "Stampa scheduling per linea", "mr1 -0", "F" +Item_01 = "Stampa carico linee", "mr1 -0", "F" +Item_01 = "Stampa produzione articoli", "mr1 -0", "F" +Item_01 = "Esplosione distinte", "db1 -0", "F" +Item_02 = "Implosione", disabled + +[PRASSIMR_030] +Caption = "Servizi" +Picture = +Module = 39 +Flags = "" +Item_01 = "Ricalcolo balance-on-hand", "db2 -3", "F" + + + +[PRASSIMR_080] +Caption = "Configurazione" +Picture = +Module = 39 +Flags = "" +Item_01 = "Parametri di ditta", "mr0 -3", "F" + + diff --git a/sv/sv0100.cpp b/sv/sv0100.cpp index 115ac54cb..93a4eae7f 100755 --- a/sv/sv0100.cpp +++ b/sv/sv0100.cpp @@ -49,6 +49,8 @@ protected: public: static bool multiplo_handler(TMask_field& f, KEY k); static bool chiave_handler(TMask_field& f, KEY k); + static bool campo_handler(TMask_field& f, KEY k); + static bool artfld_handler(TMask_field& f, KEY k); static bool chiave_notify(TSheet_field& s, int r, KEY k); void set_frequency(); @@ -134,11 +136,14 @@ void TPSV_tabapp::fill_field_list(TMask& m) } TCodgiac_livelli cgl; + bool is_articolo = FALSE; + for (l = 0; l <= cgl.last_level(); l++) { if (l && !cgl.enabled(l)) continue; + is_articolo = TRUE; row = "L"; if (l) row << l; @@ -146,6 +151,12 @@ void TPSV_tabapp::fill_field_list(TMask& m) if (l) row << '[' << l << ']'; list.add(row); } + if (is_articolo) + { + row = "B"; + row.add("Campo dell'anagrafica articoli"); + list.add(row); + } list.add("D|Tipo documento"); list.add("V|Categoria vendita"); @@ -160,9 +171,16 @@ bool TPSV_tabapp::user_create() const bool ok = TSV_tabapp::user_create(); TMask& m = *get_mask(MODE_QUERY); + TMask& sm = m.sfield(FPSV_CHIAVE).sheet_mask(); + m.set_handler(FPSV_MULTIPLO, multiplo_handler); m.set_handler(FPSV_CHIAVE, chiave_handler); m.sfield(FPSV_CHIAVE).set_notify(chiave_notify); + + + sm.set_handler(SPSV_CAMPO, campo_handler); + sm.set_handler(SPSV_ARTFLD, artfld_handler); + fill_field_list(m); return ok; @@ -177,6 +195,13 @@ int TPSV_tabapp::read(TMask& m) TToken_string s1 = rec.get("S1"); TToken_string s2 = rec.get("S2"); + TToken_string s4 = rec.get("S4"); + TString s5 = rec.get("S5"); + + if (s4.not_empty()) + if (s4[s4.len() - 1] == '|' && s5[0] == '|') s4 << " "; + s4 < 40; + if (!excedeed) + s4.add(cod); } } TRectype& rec = get_relation()->curr(); rec.put("S1", s1); - rec.put("S2", s2); + rec.put("S2", s2); + rec.put("S4", s4.left(20)); + rec.put("S5", s4.mid(20)); + if (excedeed) + warning_box("Attenzione !! Sono stati definiti\ntroppi campi di anagrafica articoli.\nVerranno memorizzati solo i primi"); } int TPSV_tabapp::write(const TMask& m) @@ -305,7 +344,7 @@ bool TPSV_tabapp::chiave_handler(TMask_field& f, KEY k) found = used.get_pos(str) >= 0; } - if (found) + if (campo[0] != 'B' && found ) { ok = error_box("Il codice %s inserito alla riga %d e' gia'\n" "utilizzato in una riga precedente.", @@ -318,6 +357,54 @@ bool TPSV_tabapp::chiave_handler(TMask_field& f, KEY k) return ok; } +bool TPSV_tabapp::campo_handler(TMask_field& f, KEY k) +{ + if (f.to_check(k,TRUE)) + { + const bool is_fld = f.get()== "B"; + + if (!is_fld) + f.mask().reset(SPSV_ARTFLD); + f.mask().field(SPSV_ARTFLD).check_type(is_fld ? CHECK_REQUIRED : CHECK_NONE); + f.mask().enable(SPSV_ARTFLD, is_fld); + } + return TRUE; +} + +bool TPSV_tabapp::artfld_handler(TMask_field& f, KEY k) +{ + bool ok = TRUE; + switch (k) + { + case K_TAB: + case K_ENTER: + if (!f.empty() && f.to_check(k)) + { + TLocalisamfile anamag(LF_ANAMAG); + const TRectype& rec = anamag.curr(); + TString16 field = f.get(); + int pos = field.find('['); + if (pos > 0) + field.cut(pos); + if (!rec.exist(field)) + ok = f.error_box("Il campo '%s' non esiste.", (const char*)field); + } + break; + case K_F9: + { + TRelation anamag(LF_ANAMAG); + TRelation_description rd(anamag); + if (rd.choose_field(f.get())) + f.set(rd.field_name()); + + } + break; + default: + break; + } + return ok; +} + /////////////////////////////////////////////////////////// // Pseudo main /////////////////////////////////////////////////////////// diff --git a/sv/sv0400a.h b/sv/sv0400a.h index d326e30f9..e5d0c877e 100755 --- a/sv/sv0400a.h +++ b/sv/sv0400a.h @@ -14,6 +14,7 @@ #define F_ZONA 123 #define F_GIACENZA 124 #define F_MAGAZZINO 125 -#define F_CATVEND 126 +#define F_CATVEND 126 +#define F_SPESEDOC 127 #endif diff --git a/sv/sv0400a.uml b/sv/sv0400a.uml index 423c1ee9e..533e5d5c3 100755 --- a/sv/sv0400a.uml +++ b/sv/sv0400a.uml @@ -62,6 +62,12 @@ BEGIN FIELD StatPrestazioni END +BOOLEAN F_SPESEDOC +BEGIN + PROMPT 40 6 "Includi righe Spese" + FIELD StatSpesedoc +END + BOOLEAN F_OMAGGI BEGIN PROMPT 2 7 "Includi righe Omaggi" diff --git a/sv/sv1100.cpp b/sv/sv1100.cpp index e20b7beba..083377797 100755 --- a/sv/sv1100.cpp +++ b/sv/sv1100.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include "../sc/scselect.h" #include "../ve/velib.h" @@ -26,6 +27,7 @@ protected: static bool save_handler(TMask_field& f, KEY k); static bool sheet_notify(TSheet_field& s, int row, KEY k); static bool fieldname_handler(TMask_field& f, KEY k); + static bool cambio_handler(TMask_field& f, KEY k); public: void mask2ini(); @@ -63,6 +65,30 @@ bool TSchede_mask::num_handler(TMask_field& f, KEY k) return ok; } +bool TSchede_mask::cambio_handler(TMask_field& f, KEY k) +{ + bool ok = TRUE; + if (f.to_check(k)) + { + TMask& m = f.mask(); +// if (m.get(F_CAMBIO).empty()) + { + // propone il cambio: giornaliero o da tabella valute + TTable cambi_g("CAM"); + TDate today(-1); + TString16 key(m.get(F_VALUTA)); + key.insert(today.string(ANSI),3); + cambi_g.put("CODTAB",key); + if (cambi_g.read()==NOERR) + m.set(F_CAMBIO,cambi_g.get_real("R10")); + else + m.set(F_CAMBIO,m.get_real(H_CAMBIO)); + } + } + return ok; +} + + bool TSchede_mask::save_handler(TMask_field& f, KEY k) { if (k == K_SPACE) @@ -88,6 +114,7 @@ bool TSchede_mask::fieldname_handler(TMask_field& f, KEY k) return TRUE; } + bool TSchede_mask::sheet_notify(TSheet_field& s, int row, KEY k) { bool ok = TRUE; @@ -173,6 +200,7 @@ TSchede_mask::TSchede_mask() { set_handler(F_TODATE, date_handler); set_handler(F_TONUM, num_handler); + set_handler(F_VALUTA, cambio_handler); set_handler(DLG_SAVEREC, save_handler); init_sheet(F_SINTETICA); @@ -277,12 +305,13 @@ protected: virtual bool destroy(); protected: - void put_real(TRectype& tab, int index, real val, bool importo, const TDocumento& doc); + void put_real(TRectype& tab, int index, real val, real fc, bool importo, const TDocumento& doc); void fill_key(TRectype& tab, const TDocumento& doc); void fill_key(TRectype& tab, const TRiga_documento& rdoc); public: void open_files(int logicnum, ...); + real converti_valute(const TMask & mask, const TDocumento& doc) const; // stampa un documento (stampa sintetica) bool fill_doc(TRectype& tab, const TDocumento& doc); // stampa una riga documento (stampa dettagliata) @@ -304,12 +333,12 @@ public: }; void TStampa_schede::put_real(TRectype& tab, int index, real val, - bool importo, const TDocumento& doc) + real fc, bool importo, const TDocumento& doc) { char erre[4]; sprintf(erre, "R%d", index); - if (importo && doc.in_valuta()) + if (importo ) { - val *= doc.cambio(); + val *= fc; val.round(0); } tab.put(erre, val); @@ -366,6 +395,35 @@ void TStampa_schede::fill_key(TRectype& tab, const TRiga_documento& rdoc) tab.put("S0", _lastkey); } +real TStampa_schede::converti_valute(const TMask & mask, const TDocumento& doc) const +{ + real fc=1.0; + if (doc.in_valuta() ) + if (!doc.cambio().is_zero()) + fc = doc.cambio() ; + else + { + // cambio non ancora indicato sul documento; cerca il cambio di default + // forse in futuro si potra evitare (ovvero ci sarà sempre il cambio sul doc in valuta) + TTable cambi_g("%VAL"); + cambi_g.put("CODTAB",doc.valuta() ); + if (cambi_g.read()==NOERR) + fc=cambi_g.get_real("R10"); + } + if (_mask->get_bool(F_INVALUTA)) + { + if (doc.in_valuta()) + { + if (doc.valuta() != _mask->get(F_VALUTA)) + fc = fc / _mask->get_real(F_CAMBIO); + else + fc =1.0; + } + else + fc = 1.0 / _mask->get_real(F_CAMBIO); + } + return fc; +} bool TStampa_schede::fill_doc(TRectype& tab, const TDocumento& doc) { @@ -375,6 +433,8 @@ bool TStampa_schede::fill_doc(TRectype& tab, const TDocumento& doc) if (!tipo.statistiche()) // documento non abilitato per le statistiche return FALSE; + // fattore di conversione per doc in valuta + real fc=converti_valute(*_mask,doc); fill_key(tab, doc); TString descr(80); @@ -403,7 +463,7 @@ bool TStampa_schede::fill_doc(TRectype& tab, const TDocumento& doc) break; const bool importo = row.get(3)[0] > ' '; real val = doc.get(src); - put_real(tab, r+2, val, importo, doc); + put_real(tab, r+2, val, fc, importo, doc); } return TRUE; @@ -427,6 +487,9 @@ bool TStampa_schede::fill_rdoc(TRectype& tab, const TRiga_documento& rdoc) if (!tipo.statistiche()) // documento non abilitato per le statistiche return FALSE; + // fattore di conversione per doc in valuta + real fc=converti_valute(*_mask, doc); + fill_key(tab, rdoc); TString descr(80); @@ -442,8 +505,8 @@ bool TStampa_schede::fill_rdoc(TRectype& tab, const TRiga_documento& rdoc) } tab.put("S1", descr); - put_real(tab, 0, rdoc.importo(TRUE, FALSE, 0), TRUE, doc); - put_real(tab, 1, rdoc.importo(TRUE, TRUE, 0), TRUE, doc); + put_real(tab, 0, rdoc.importo(TRUE, FALSE, 0), fc, TRUE, doc); // importo netto scontato + put_real(tab, 1, rdoc.importo(TRUE, TRUE, 0), fc, TRUE, doc); // importo lordo scontato TSheet_field& sheet = _mask->sfield(F_DETTAGLIATA); TString_array& arr = sheet.rows_array(); @@ -457,7 +520,7 @@ bool TStampa_schede::fill_rdoc(TRectype& tab, const TRiga_documento& rdoc) break; const bool importo = row.get(3)[0] > ' '; real val = rdoc.get(src); - put_real(tab, r+2, val, importo, doc); + put_real(tab, r+2, val, fc, importo, doc); } return TRUE; @@ -760,9 +823,9 @@ void TStampa_schede::open_files(int logicnum, ...) bool TStampa_schede::create() { - open_files(LF_TABCOM, 0); // File comuni - open_files(LF_TAB, LF_CLIFO, LF_OCCAS, 0); // File ditta - open_files(LF_CFVEN, LF_DOC, LF_RIGHEDOC, 0); // File vendite + open_files(LF_DOC, LF_RIGHEDOC, LF_CONDV, LF_RCONDV, LF_ANAMAG, LF_SCONTI, LF_UMART, + LF_TAB, LF_TABCOM, LF_CLIFO,LF_CFVEN, LF_INDSP, LF_OCCAS, LF_MOVMAG, LF_RMOVMAG,LF_PROVV, 0); + open_files(LF_SVRIEP,LF_SVSTAT,0); _mask = new TSchede_mask; _form = new TSchede_form; diff --git a/sv/sv1100a.frm b/sv/sv1100a.frm index 6a8d6e1d4..02b41576e 100755 --- a/sv/sv1100a.frm +++ b/sv/sv1100a.frm @@ -43,7 +43,7 @@ END STRINGA 4 BEGIN KEY "Ragione sociale" - PROMPT 8 3 "" + PROMPT 9 3 "" FIELD LF_CLIFO->RAGSOC END diff --git a/sv/sv1100a.h b/sv/sv1100a.h index a076cf16a..38917c2c8 100755 --- a/sv/sv1100a.h +++ b/sv/sv1100a.h @@ -8,6 +8,10 @@ #define F_PROVVIS 105 #define F_TIPO 106 #define F_ORDINE 107 +#define F_INVALUTA 108 +#define F_VALUTA 109 +#define F_CAMBIO 111 +#define H_CAMBIO 112 #define F_SINTETICA 201 #define F_DETTAGLIATA 202 diff --git a/sv/sv1100a.uml b/sv/sv1100a.uml index b3595c5e6..0ea8bc2e0 100755 --- a/sv/sv1100a.uml +++ b/sv/sv1100a.uml @@ -154,14 +154,48 @@ ENDPAGE PAGE "Opzioni" -1 -1 60 20 +BOOL F_INVALUTA +BEGIN + PROMPT 1 1 "Stampa schede in valuta" + MESSAGE TRUE SHOW ,F_CAMBIO|SHOW ,F_VALUTA + MESSAGE FALSE HIDE ,F_CAMBIO|HIDE ,F_VALUTA +END + +STRING F_VALUTA 3 +BEGIN + FLAGS "U" + PROMPT 1 2 "Valuta " + USE %VAL + INPUT CODTAB F_VALUTA + DISPLAY "Codice valuta" CODTAB + DISPLAY "Descrizione @40" S0 + OUTPUT F_VALUTA CODTAB + OUTPUT H_CAMBIO R10 + CHECKTYPE REQUIRED +END + +NUMBER F_CAMBIO 7 2 +BEGIN + PROMPT 30 2 "Valore cambio " + PICTURE "####,@#" + NUM_EXPR (#F_CAMBIO!=0) + WARNING "Inserire il valore del cambio" +END + +NUMBER H_CAMBIO 7 2 +BEGIN + FLAGS "H" + PROMPT 42 1 "Valore cambio " +END + TEXT DLG_NULL BEGIN - PROMPT 1 1 "@bCampi per stampa sintetica" + PROMPT 1 3 "@bCampi per stampa sintetica" END SPREADSHEET F_SINTETICA 0 8 BEGIN - PROMPT 1 2 "" + PROMPT 1 4 "" ITEM "Campo@12" ITEM "Intestazione@17" ITEM "Descrizione@50" @@ -170,12 +204,12 @@ END TEXT DLG_NULL BEGIN - PROMPT 1 11 "@bCampi per stampa dettagliata" + PROMPT 1 13 "@bCampi per stampa dettagliata" END -SPREADSHEET F_DETTAGLIATA +SPREADSHEET F_DETTAGLIATA 0 8 BEGIN - PROMPT 1 12 "" + PROMPT 1 14 "" ITEM "Campo@12" ITEM "Intestazione@17" ITEM "Descrizione@50" @@ -186,7 +220,7 @@ ENDPAGE ENDMASK -PAGE "Sheet 1" -1 -1 56 6 +PAGE "Sheet 1" -1 -1 56 7 STRING S_FIELD 15 BEGIN @@ -218,6 +252,7 @@ BEGIN FLAGS "D" END + BUTTON DLG_OK 10 2 BEGIN PROMPT -13 -1 "" @@ -237,7 +272,7 @@ ENDPAGE ENDMASK -PAGE "Sheet 2" -1 -1 56 6 +PAGE "Sheet 2" -1 -1 56 7 STRING S_FIELD 15 BEGIN @@ -269,6 +304,7 @@ BEGIN FLAGS "D" END + BUTTON DLG_OK 10 2 BEGIN PROMPT -13 -1 "" diff --git a/sv/sv1200.cpp b/sv/sv1200.cpp index 5acbf2bf9..20e74087a 100755 --- a/sv/sv1200.cpp +++ b/sv/sv1200.cpp @@ -29,6 +29,7 @@ #define STR_AGENTE "G" #define STR_MAGAZZ "M" #define STR_ZONA "Z" +#define STR_ARTFIELD "B" #define CHR_TOTGEN 'T' #define CHR_TIPODOC 'D' @@ -42,6 +43,7 @@ #define CHR_AGENTE 'G' #define CHR_MAGAZZ 'M' #define CHR_ZONA 'Z' +#define CHR_ARTFIELD 'B' #define COMP_AS_VALUE 'V' #define COMP_AS_DIFF 'D' @@ -294,7 +296,8 @@ public: void TFrequenza_colonne::init(TFrequenza_statistiche f, int m, const TDate& d) { - _frequenza = (f == fs_nulla || m <= 0) ? TPeriodo::frequency() : f; +// _frequenza = (f == fs_nulla || m <= 0) ? TPeriodo::frequency() : f; + _frequenza = (f == fs_nulla || m >0) ? TPeriodo::frequency() : f; _multiplo = (m <= 0) ? divide(_frequenza, TPeriodo::frequency()) : m; _periodo_inizio = d; _data_inizio = _periodo_inizio.first_day(); @@ -359,9 +362,14 @@ class TStampa_stat : public TPrint_application TCodgiac_livelli* _liv_giac; TRecord_cache *_magazz,*_tipodoc,*_catven,*_zone,*_ums; TLocalisamfile * _umart,*_anamag,*_clifor,*_agenti; + TTable *_spp, *_prs; TToken_string _key; TString _last_key; + TString_array _des_fld; + TString_array _file_fld; + TString_array _key_fld; + TString_array _field_fld; TArray _files; bool _ragg_per_um; @@ -385,7 +393,7 @@ class TStampa_stat : public TPrint_application bool _st_totr; // flag stampa totali di riga bool _st_totc; // flag stampa totali di colonna bool _st_tota; // flag stampa totali di "anno" - static TString s_park; // stringa di lavoro + static TString s_park25; // stringa di lavoro // ****************** // stampa file di Output TString _wrk_row; // stringa di lavoro per le righe di stampa @@ -401,13 +409,14 @@ private: // generazione del file di output void set_ragg_per_um(); bool filtro_chiavi(TSVriep_record &curr); - void update_file(const char * key, const char * code,const char tipo, const int level, const int col, TSVriep_record& curr); + void update_file(const char * key, const char * code,const char tipo, const int level, const int col, TSVriep_record& curr, const TString & fld, int row); void genera_file(const char *outfn); // handler per i campi di maschera static bool chiave_notify(TSheet_field& f, int r, KEY k); static bool chiave_handler(TMask_field& f, KEY k); static bool campo_handler(TMask_field& f, KEY k); + static bool artfld_handler(TMask_field& f, KEY k); static bool filename_handler(TMask_field& f, KEY k); static bool codice_handler(TMask_field& f, KEY k); @@ -419,6 +428,7 @@ private: static bool raffronto_handler(TMask_field& f, KEY k); static bool dataraf_handler(TMask_field& f, KEY k); protected: + void open_files(int logicnum, ...) ; virtual bool user_create(); virtual bool user_destroy(); virtual bool set_print(int i); @@ -454,9 +464,9 @@ protected: const TString& nome_colonna1(int c); const TString& nome_colonna2(int c); const TString& nome_totale(int t); - const TString& partkey_name(const char *lev_code) ; - const TString& get_part(TString & lev_code, TSVriep_record & rieprec) const; - const TString& get_descrpart(const char *lev_code, TSVriep_record &rieprec); + const TString& partkey_name(const char *lev_code, int row) ; + const TString& get_part(TString & lev_code, TSVriep_record & rieprec, const TString & fld); // const; + const TString& get_descrpart(const char *lev_code, TSVriep_record &rieprec, const TString & fld, int row); void adjust_record(TRectype &strec, int from) const; const int numlevels() {return selmask().sfield(F_CHIAVE).items();} @@ -467,7 +477,7 @@ public: virtual bool menu(MENU_TAG); }; -TString TStampa_stat::s_park(' ',25); // +TString TStampa_stat::s_park25(' ',25); // alloca la stringa inline TStampa_stat& app() { return (TStampa_stat&)main_app(); } @@ -551,6 +561,11 @@ void TStampa_stat::preprocess_header() set_row_atpos('H',++row,(const char *)_wrk_row,0); _wrk_row.format("dal %s al %s ",(const char *)selmask().get(F_DATAINI),(const char *)selmask().get(F_DATAFIN)); set_row_atpos('H',row,(const char *)_wrk_row,40); + if (printmask().get_bool(F_STRAFFRONTO )) + { + _wrk_row.format("confrontata con i corrispondenti periodi a partire dal %s",(const char *)selmask().get(F_DATARAF)); + set_row_atpos('H',++row,(const char *)_wrk_row,20); + } } set_header(++row,""); set_row_atpos('H',++row," Codice Descrizione",0); @@ -599,60 +614,116 @@ const TString& TStampa_stat::nome_colonna1(int c) const char code_freq=selmask().get(F_MULTIPLO)[0]; const int numero=selmask().get_int(F_NUMERO); // numero di periodi in una col const TFrequenza_statistiche freq = char2frequency(code_freq); + const TFrequenza_statistiche maskfreq = char2frequency(selmask().get(F_FREQUENZA)[0]); const int start=date2period(din,freq); // periodo della prima colonna const int lastp=last_period(din,freq); // numero di periodi in un anno - if (code_freq==selmask().get(F_FREQUENZA)[0]) + if (freq == maskfreq && numero > 1 && maskfreq != fs_giornaliera) { // numerico; può essere un qualsiasi multiplo della freq - s_park.format("%s %d-%d",(const char *)char2freqname(code_freq),1+(start+c*numero-1)%lastp , 1+(start+(c+1)*numero-2)%lastp); + s_park25.format("%s %d÷%d",(const char *)char2freqname(code_freq),1+(start+c*numero-1)%lastp , 1+(start+(c+1)*numero-2)%lastp); } else { - switch (code_freq) + if (freq == maskfreq && maskfreq == fs_giornaliera && numero>1) { - case 'A': - default: - s_park.format("%d^%s",1+(start+c-1)%lastp,(const char *)char2freqname(code_freq)); + // Le date vanno da qualsiasi giorno a qualsiasi giorno + TDate dfrom(app()._freq.column_first_day(c)); + s_park25.format("Dal %s",(const char *)dfrom.string()); } + else + switch (freq) + { + case fs_giornaliera: + { + TDate d(period2date(din.year(), din.day()+c*numero, freq)); + s_park25.format("%s",(const char *)itow(d.wday())); + } + break; + case fs_settimanale: + case fs_quindicinale: + case fs_bimestrale: + case fs_trimestrale: + case fs_quadrimestrale: + case fs_semestrale: + s_park25.format("%d^%s",1+(start+c-1)%lastp,(const char *)char2freqname(code_freq)); + break; + case fs_annuale: + s_park25.format("Anno %d",din.year()+start+c-1); + break; + case fs_mensile: + s_park25.format("%s",itom(start+c) ); + break; + } } - s_park.center_just(_largcol); - return s_park; + s_park25.center_just(_largcol); + return s_park25; } const TString& TStampa_stat::nome_colonna2(int c) { const TDate din=selmask().get(F_DATAINI); // data iniziale const char code_freq=selmask().get(F_MULTIPLO)[0]; + const int numero=selmask().get_int(F_NUMERO); // numero di periodi in una col const TFrequenza_statistiche freq = char2frequency(code_freq); + const TFrequenza_statistiche maskfreq = char2frequency(selmask().get(F_FREQUENZA)[0]); const int lastp=last_period(din,freq); // numero di periodi in un anno const int start=date2period(din,freq); // periodo della prima colonna - s_park=""; + s_park25.cut(0); + + if (freq == maskfreq && numero > 1 && maskfreq==fs_giornaliera ) { - switch (code_freq) - { - case 'G': // giorno - case 'A': // anno - break; - default: - s_park.format(" anno %d",din.year()+int((start+c-1)/lastp)); - } + TDate dto(app()._freq.column_last_day(c)); + s_park25.format("Al %s",(const char *)dto.string()); } - s_park.center_just(LARG_COLVAL); - return s_park; + else + { + switch (freq) + { + case fs_giornaliera: + { + TDate d(period2date(din.year(), din.day()+c*numero, freq)); + s_park25.format("%s",(const char *)d.string()); + } + break; + case fs_annuale: + break; + case fs_mensile: + s_park25.format("%d",din.year()+int((start+c-1)/lastp)); + break; + case fs_settimanale: + case fs_quindicinale: + case fs_bimestrale: + case fs_trimestrale: + case fs_quadrimestrale: + case fs_semestrale: + s_park25.format(" anno %d",din.year()+int((start+c-1)/lastp)); + break; + } + } + s_park25.center_just(LARG_COLVAL); + return s_park25; } const TString& TStampa_stat::nome_totale(int c) { const char code_freq=selmask().get(F_MULTIPLO)[0]; - s_park=""; + s_park25.cut(0); { switch (code_freq) { - case 'A': + case fs_giornaliera: // giorno + case fs_settimanale: + case fs_quindicinale: + case fs_mensile: + case fs_bimestrale: + case fs_trimestrale: + case fs_quadrimestrale: + case fs_semestrale: + case fs_annuale: default: - s_park.format("Totale %d",c); + s_park25.format("Totale %d",c); } } - return s_park; + return s_park25; } void TStampa_stat::set_page(int file, int count) @@ -688,9 +759,22 @@ void TStampa_stat::set_page(int file, int count) TRectype & _rec_grp=(TRectype &)_group_recs[level+1]; const int lencode=_rec_grp.get(SVS_CODICE).len(); adjust_record(strec,lencode); - r << TString(partkey_name(strec.get(SVS_LEVCODE))).upper(0,0); - r << ' ' << strec.get(SVS_CODICE).mid(lencode); - r << ' ' << strec.get(SVS_DESCR); + r = partkey_name(strec.get(SVS_LEVCODE), numlevels() - level - 1); + r.upper(0,0); + if (r == " ") + r.cut(0); + else + r << " "; + const TString & descr = strec.get(SVS_DESCR); + if (descr.not_empty()) + r << descr; + else + r << strec.get(SVS_CODICE).mid(lencode); + + //r << TString(partkey_name(strec.get(SVS_LEVCODE))).upper(0,0); +// r << ' ' << strec.get(SVS_CODICE).mid(lencode); +// r.trim(); +// r << "@13g" << strec.get(SVS_DESCR); set_row_atpos('R',++row,(const char *)r,_indent[level]); } if (level == _liv_riga) @@ -714,7 +798,6 @@ void TStampa_stat::set_page(int file, int count) // fa le set row per la "riga" contenente i valori delle colonne di statistica int TStampa_stat::set_rows_colonne(int row,TRectype &strec) { - // !!!!!!!!! static TRectype last_data(LF_SVSTAT); TString colname,r_totc; real col_value; @@ -853,12 +936,12 @@ void TStampa_stat::set_row_atpos(char section,int nrow,const char * f,int pos) } else //: too much to the right: will be printed next time! repeat_print(); - switch (section) - { - case 'R': set_row(nrow,ss); break; - case 'H': set_header(nrow,ss); break; - case 'F': set_footer(nrow,ss); break; - } + switch (section) + { + case 'R': set_row(nrow,ss); break; + case 'H': set_header(nrow,ss); break; + case 'F': set_footer(nrow,ss); break; + } } // stampa i totali ad ogni break di livello @@ -880,9 +963,9 @@ int TStampa_stat::handle_levchange(int row,const int level) } adjust_record(rec_grp1,lencode); - set_filled_row('R',++row,'-',POS_PRIMACOL,_pagewidth-POS_PRIMACOL); + set_filled_row('R',++row,'-',POS_PRIMACOL,_largcol * _numcol ); _wrk_row ="Totale "; - _wrk_row << partkey_name(rec_grp1.get(SVS_LEVCODE)); + _wrk_row << partkey_name(rec_grp1.get(SVS_LEVCODE), numlevels() - _last_lev_grp - 1); _wrk_row << ' ' << rec_grp1.get(SVS_CODICE).mid(lencode); _wrk_row << ' ' << rec_grp1.get(SVS_DESCR); //_wrk_row.cut(LARG_COLCODICE); there are also @ chars! @@ -911,9 +994,28 @@ void TStampa_stat::reset_grplevels() } } +void TStampa_stat::open_files(int logicnum, ...) +{ + va_list marker; + va_start(marker, logicnum); + while (logicnum > 0) + { + CHECKD(_files.objptr(logicnum) == NULL, "File gia' aperto: ", logicnum); + _files.add(new TLocalisamfile(logicnum), logicnum); + logicnum = va_arg(marker, int); + } +} + bool TStampa_stat::user_create() { + // ************ + // files: documenti e statistiche + open_files(LF_RIGHEDOC, LF_CONDV, LF_RCONDV, LF_ANAMAG, LF_SCONTI, LF_UMART, LF_TAB, LF_TABCOM, LF_CLIFO, + LF_CFVEN, LF_INDSP, LF_OCCAS, LF_MOVMAG, LF_RMOVMAG,LF_PROVV, 0); + open_files(LF_SVRIEP,LF_SVSTAT,0); + + _stats.init(); if (_stats.frequency()==fs_nulla) return error_box("Configurare prima la frequenza statistica per questa ditta"); @@ -929,20 +1031,16 @@ bool TStampa_stat::user_create() _msk->set_handler(F_DATAFIN, datafin_handler); _msk->set_handler(F_RAFFRONTO, raffronto_handler); _msk->set_handler(F_DATARAF, dataraf_handler); - _msk->set_handler(F_CHIAVE, chiave_handler); - _msk->sfield(F_CHIAVE).set_notify(chiave_notify); + _msk->set_handler(F_CHIAVE, chiave_handler); TMask& sm = _msk->sfield(F_CHIAVE).sheet_mask(); sm.set_handler(S_CAMPO, campo_handler); + sm.set_handler(S_ARTFLD, artfld_handler); _print_msk = new TMask("sv1200b"); _export_msk = new TMask("sv1200c"); _export_msk->set_handler(F_FILENAME, filename_handler); // ************ - // files - _files.add(new TLocalisamfile(LF_SVRIEP)); - _files.add(new TLocalisamfile(LF_SVSTAT)); - // ************ // oggetti per la gestione delle parti del codice _liv_art = new TCodart_livelli; _liv_giac = new TCodgiac_livelli; @@ -957,6 +1055,8 @@ bool TStampa_stat::user_create() _anamag = new TLocalisamfile(LF_ANAMAG); _clifor = new TLocalisamfile(LF_CLIFO); _agenti = new TLocalisamfile(LF_AGENTI); + _spp = new TTable("SPP"); + _prs = new TTable("PRS"); // ************ // cursore di stampa @@ -967,6 +1067,7 @@ bool TStampa_stat::user_create() _svcache=NULL; set_real_picture(""); + return TRUE; } @@ -990,6 +1091,8 @@ bool TStampa_stat::user_destroy() delete _anamag; delete _clifor; delete _agenti; + delete _spp; + delete _prs; delete current_cursor()->relation(); return TRUE; @@ -1008,12 +1111,47 @@ bool TStampa_stat::menu(MENU_TAG ) set_column_frequency(); - _key.cut(0); + _key.cut(0); + TRelation anamag(LF_ANAMAG); + TRelation_description rd(anamag); + TSheet_field & s_chiave = selmask().sfield(F_CHIAVE); + TFilename des_file_name("sv1200.ini"); + TConfig c(des_file_name, "Descriptions"); + for (int r = 0; r < sheet.items(); r++) { tmp = sheet.row(r).get(0); if (!tmp.blank()) _key.add(tmp); + if (tmp == STR_ARTFIELD) + { + TString16 field(s_chiave.cell(r,s_chiave.cid2index(S_ARTFLD))); + + if (c.exist(field,2)) + { + TToken_string t(c.get(field, "Descriptions", 2)); + _file_fld.add(t.get(), r); + _key_fld.add(t.get(), r); + _field_fld.add(t.get(), r); + } + if (c.exist(field,1)) + _des_fld.add(c.get(field, "Descriptions", 1), r); + else + { + int pos = field.find('['); + TString16 sub; + + if (pos > 0) + { + sub = field.mid(pos); + field.cut(pos); + } + + TString des(rd.get_field_description(field)); + des << sub; + _des_fld.add(des, r); + } + } } if (k == K_SAVE) @@ -1035,6 +1173,9 @@ bool TStampa_stat::menu(MENU_TAG ) TIsamtempfile * f = new TIsamtempfile(LF_SVSTAT,fname,FALSE,TRUE); set_printmask(); current_cursor()->relation()->replace(f); + // Forza la ricostruzione del cursore... + current_cursor()->setfilter("CODICE>=\"A\""); + current_cursor()->setfilter(""); do_print(1); current_cursor()->relation()->replace(new TLocalisamfile(LF_SVSTAT)); } @@ -1049,8 +1190,8 @@ void TStampa_stat::fill_field_list(TMask& m) // opzioni per il tipo di dato TList_field& tipoart = (TList_field&)m.field(F_TIPOART); TToken_string codes, descr; - codes << RIGA_MERCE << '|' << RIGA_PRESTAZIONI; - descr = "Merce|Prestazioni"; + codes << RIGA_MERCE << '|' << RIGA_PRESTAZIONI << '|' << RIGA_SPESEDOC; + descr = "Merce|Prestazioni|Spese doc."; if (!_stats.omaggio_is_merce()) { codes.add(RIGA_OMAGGI); @@ -1068,11 +1209,14 @@ void TStampa_stat::fill_field_list(TMask& m) TToken_string row(80); TCodart_livelli& cal = *_liv_art; + bool is_articolo = FALSE; + for (int l = 0; l <= cal.last_level(); l++) { if (l && !cal.enabled(l)) continue; + is_articolo = TRUE; row = STR_ARTICOLO; if (l) row << l; @@ -1081,7 +1225,12 @@ void TStampa_stat::fill_field_list(TMask& m) list.add(row); } - + if (is_articolo) + { + row = STR_ARTFIELD; + row.add("Campo dell'anagrafica articoli"); + list.add(row); + } TCodgiac_livelli& cgl = *_liv_giac; for (l = 0; l <= cgl.last_level(); l++) { @@ -1115,14 +1264,7 @@ void TStampa_stat::set_frequency() m.set(F_FREQUENZA, freq); TList_field& multiplo = (TList_field&)m.field(F_MULTIPLO); - if (_stats.frequency() == fs_settimanale) - { - multiplo.reset(); - multiplo.disable(); - } - else - multiplo.enable(); - + TToken_string std_codes("G|S|Q|1|2|3|4|6|A"); TToken_string std_descr("Giorni|Settimane|Quindicine|Mesi|" "Bimestri|Trimestri|Quadrimestri|Semestri|Anni"); @@ -1153,7 +1295,18 @@ void TStampa_stat::set_frequency() } multiplo.replace_items(codes, descr); - + + + if (_stats.frequency() == fs_settimanale) + { + if (m.focus_field().dlg() == F_MULTIPLO) + m.set_focus_field(F_NUMERO); // scappa dal campo + multiplo.reset(); + multiplo.disable(); + } + else + multiplo.enable(); + // setta la durata dell'anno //m.set(F_COL_ANNO, last_period(1992,_stats.frequency())); @@ -1212,12 +1365,12 @@ TString& TStampa_stat::build_key(const TRectype& rec) return _last_key; } -void TStampa_stat::update_file(const char * key, const char *lev_code,const char tipo_dato, const int level, const int col, TSVriep_record& curr) +void TStampa_stat::update_file(const char * key, const char *lev_code,const char tipo_dato, const int level, const int col, TSVriep_record& curr, const TString & fld, int row) { CHECK(col>=0,"Le colonne partono da 0"); - // !!!!!!!!!static - TRectype statrec(LF_SVSTAT); + TRectype *statrec=NULL; + if (!statrec) statrec = new TRectype (LF_SVSTAT); TToken_string cachekey(key); cachekey.rtrim(); // necessario perché la chiave sia buona per l'hash table @@ -1225,24 +1378,32 @@ void TStampa_stat::update_file(const char * key, const char *lev_code,const char cachekey.add(" "); cachekey.add(tipo_dato); - statrec = _svcache->get(cachekey); + *statrec = _svcache->get(cachekey); + if (_svcache->io_result()!=NOERR) { // nuovo record; - statrec.put(SVS_CODICE,key); - statrec.put(SVS_LEVCODE,lev_code); - statrec.put(SVS_LIVELLO,level); - statrec.put(SVS_TIPO,tipo_dato); + statrec->put(SVS_CODICE,key); + statrec->put(SVS_LEVCODE,lev_code); + statrec->put(SVS_LIVELLO,level); + statrec->put(SVS_TIPO,tipo_dato); if (_msk->get(F_TIPODATO)==COLONNA_QTA) - statrec.put(SVS_UMQTA,curr.get(SVR_UMQTA)); + statrec->put(SVS_UMQTA,curr.get(SVR_UMQTA)); } if (*lev_code== CHR_TOTGEN) // totale generale - statrec.put(SVS_DESCR,""); - else - statrec.put(SVS_DESCR,get_descrpart(lev_code,curr).left(SVS_LEN_DESCR)); - put_column(statrec,col,curr); + statrec->put(SVS_DESCR,""); + else + { + TString descr(get_descrpart(lev_code,curr,fld, row)); + for (int pos = descr.find('%'); pos >=0; pos = descr.find('%', pos + 2)) + descr.insert("%", pos); + if (descr.len() > SVS_LEN_DESCR) + descr.cut(SVS_LEN_DESCR); + statrec->put(SVS_DESCR, descr); + } + put_column(*statrec,col,curr); - _svcache->put(statrec); + _svcache->put(*statrec); } @@ -1280,7 +1441,7 @@ void TStampa_stat::standardize_um(TSVriep_record& rieprec, bool force) { if (force || _ragg_per_um) { - static TString um; + static TString um("N."); real fc; if (rieprec.get_char(SVR_TIPOART)==RIGA_MERCE) { @@ -1309,7 +1470,7 @@ void TStampa_stat::standardize_um(TSVriep_record& rieprec, bool force) // aggiunge al valore passat la quantità del record riep, correggendola con il fattore di conv. necessario const real TStampa_stat::fc_um(TRectype & statrec,const TSVriep_record& rieprec) { - static TString um; + static TString um("N."); real fc(1.0); um=rieprec.get(SVR_UMQTA); if (um!=statrec.get(SVS_UMQTA)) @@ -1365,40 +1526,42 @@ void TStampa_stat::invalid_columns(TRectype & statrec) // funzione di filtro del cursore bool TStampa_stat::filtro_chiavi(TSVriep_record &curr) { + // !?!?! static + TString16 code_campo(" "); + TString16 fld_campo; + // !?!?! static + TString val_stringa(32,' '); + TSheet_field & s_chiave = selmask().sfield(F_CHIAVE); const int num_liv_output=s_chiave.items(); TString est1,est2; bool ok=TRUE; + + ok = curr.get_char(SVR_TIPOART) == *selmask().get(F_TIPOART); + for (int l=0; ok && l< num_liv_output; l++) { - static TString code_campo; - static TString val_stringa; - int val_intero; - code_campo=s_chiave.cell(l,s_chiave.cid2index(S_CAMPO)); + fld_campo=s_chiave.cell(l,s_chiave.cid2index(S_ARTFLD)); if (code_campo==STR_CLIFOR) // cliente/fornitore ha in testa il TIPOCF { // ok &= curr.get_char(SVR_TIPOCF)==; !?!?! manca la selezione dei soli cli o for - val_intero=atoi(get_part(code_campo,curr)+1); - } - else if (code_campo==STR_AGENTE) // agente è numerico - val_intero=atoi(get_part(code_campo,curr)); - else - { - val_stringa=get_part(code_campo,curr); + val_stringa=get_part(code_campo,curr, fld_campo)+1; + } else { + val_stringa=get_part(code_campo,curr, fld_campo); val_stringa.trim(); } if (!(est1=s_chiave.cell(l,s_chiave.cid2index(S_DAL))).blank()) { - if (code_campo==STR_CLIFOR || code_campo==STR_AGENTE) // cliente/fornitore o agente sono numerici - ok &= val_intero>=atoi((const char *)est1); + if (code_campo==STR_CLIFOR) // cliente/fornitore e' numerico + ok &= atoi((const char *)val_stringa) >= atoi((const char *)est1); else ok &= val_stringa>=est1; } if (ok && !(est2=s_chiave.cell(l,s_chiave.cid2index(S_AL))).blank()) { - if (code_campo==STR_CLIFOR || code_campo==STR_AGENTE) // cliente/fornitore o agente sono numerici - ok &= val_intero<=atoi((const char *)est2); + if (code_campo==STR_CLIFOR) // cliente/fornitore e' numerico + ok &= atoi((const char *)val_stringa) <= atoi((const char *)est2); else ok &= val_stringa<=est2; } @@ -1446,7 +1609,6 @@ void TStampa_stat::genera_file(const char *outfn) curr.put(SVR_ANNO,m.get_date(F_DATARAF).year()); curr.put(SVR_PERIODO,_stats.date2period(m.get_date(F_DATARAF))); - int err = riep.read(_isgteq); const int num_liv_output=s_chiave.items(); const long start_status=period2long(curr.get_int(SVR_ANNO),curr.get_int(SVR_PERIODO),_stats.frequency()); @@ -1454,11 +1616,14 @@ void TStampa_stat::genera_file(const char *outfn) TProgind statusbar(date2long(m.get_date(F_DATAFIN),_stats.frequency())-start_status , "Creazione del file di output", FALSE, TRUE, 60); + int err = riep.read(_isgteq); _svcache->zap(); // ********************** // ciclo principale: scorre il riepilogo statistiche per anno+periodo // e genera i risultati in una cache + TString16 levcode; + TString16 fld; for (; err == NOERR && (curr.get_int(SVR_ANNO)<=m.get_date(F_DATAFIN).year() || @@ -1475,33 +1640,35 @@ void TStampa_stat::genera_file(const char *outfn) if (col >= first_data && col < _numcol_dati) { - standardize_um(curr); //!?!? eventualmente sarebbe utile forzare l'uso della standard se è una riga non comprendente l'articolo + // NOTA: eventualmente sarebbe utile forzare l'uso della UM standard se è una riga + // non comprendente l'articolo ...... + standardize_um(curr); // costruisce il file statistiche... key.cut(0); for (int l=0; l< num_liv_output; l++) { - static TString16 levcode; levcode=s_chiave.cell(l,s_chiave.cid2index(S_CAMPO)); - key << get_part(levcode,curr); + fld=s_chiave.cell(l,s_chiave.cid2index(S_ARTFLD)); + key << get_part(levcode,curr, fld); // setta il range in base all'algoritmo (Valori/progressivi/mobili) const int range=(alg==ALG_VALORI ? col : alg==ALG_PROGRESSIVI ? ((1+int(col/_col_anno))*_col_anno-1) : (col+_col_anno-1)); if (col>=first_col) // periodo da osservare { if (l==0) for (int c=max(col,0);c <= range ; c++) - update_file(" ",STR_TOTGEN,LINEA_DATI,num_liv_output,c,curr); + update_file(" ",STR_TOTGEN,LINEA_DATI,num_liv_output,c,curr, fld, l); if (*s_chiave.cell(l,s_chiave.cid2index(S_TOTALE))=='X') for (int c=max(col,0);c <= range ; c++) - update_file(key,levcode,LINEA_DATI,num_liv_output-l-1,c,curr); + update_file(key,levcode,LINEA_DATI,num_liv_output-l-1,c,curr, fld, l); } if (first_raffr !=first_col && col >= first_raffr && col<=first_raffr+_numcol_dati) // periodo da confrontare { if (l==0) for (int c=max(col,0); c <= range; c++) - update_file(" Totale",STR_TOTGEN,LINEA_RAFFRONTI, num_liv_output , c -first_raffr,curr); + update_file(" Totale",STR_TOTGEN,LINEA_RAFFRONTI, num_liv_output , c -first_raffr,curr, fld, l); if (*s_chiave.cell(l,s_chiave.cid2index(S_TOTALE))=='X') for (int c=max(col,0); c <= range; c++) - update_file(key,levcode,LINEA_RAFFRONTI,num_liv_output-l-1, c -first_raffr , curr); + update_file(key,levcode,LINEA_RAFFRONTI,num_liv_output-l-1, c -first_raffr , curr, fld, l); } } } @@ -1527,7 +1694,7 @@ void TStampa_stat::set_printmask() if (fname(lev_code_num); else - park="articolo"; + park=" "; break; case CHR_LIVGIAC: // liv giac CHECK(lev_code_num>0,"I livelli di giacenza sono utilizzabili solo singolarmente"); @@ -1585,13 +1752,13 @@ const TString& TStampa_stat::partkey_name(const char *lev_code) park="categoria di vendita"; break; case CHR_CLI: // cliente - park="cliente "; + park="cliente "; break; case CHR_FOR: // fornitore - park="fornitore"; + park="fornitore "; break; case CHR_AGENTE: // agente - park="agente"; + park="agente "; break; case CHR_MAGAZZ: // mag park="magazzino"; @@ -1605,6 +1772,9 @@ const TString& TStampa_stat::partkey_name(const char *lev_code) case CHR_TOTGEN: // totale generale park="generale"; break; + case CHR_ARTFIELD: // campo anagrafica + park=_des_fld.row(row); + break; default: fatal_box("ai chent recognaiz the code of the key part!"); return ""; @@ -1640,7 +1810,7 @@ void TStampa_stat::adjust_record(TRectype &strec, int from) const } -const TString& TStampa_stat::get_part(TString & lev_code, TSVriep_record &rieprec) const +const TString& TStampa_stat::get_part(TString & lev_code, TSVriep_record &rieprec, const TString & fld) // const { static TString park(' ',25); @@ -1648,50 +1818,83 @@ const TString& TStampa_stat::get_part(TString & lev_code, TSVriep_record &riepre switch (lev_code[0]) { case CHR_TIPODOC: // tipo documento - return rieprec.get(SVR_TIPODOC); + park = rieprec.get(SVR_TIPODOC); + break; case CHR_ARTICOLO: // articolo if (lev_code_num==0) { park=rieprec.get(SVR_CODART); - return park.rpad(25); + park.rpad(25); + break; } else { park =_liv_art->unpack_grpcode(rieprec.get(SVR_CODART),lev_code_num); - return park.rpad(_liv_art->code_length(lev_code_num)); + park.rpad(_liv_art->code_length(lev_code_num)); + break; } + case CHR_ARTFIELD: // campo dell' anagrafica articolo + { + const char t = rieprec.get_char(SVR_TIPOART); + TFieldref f; + + f = fld; + int l = f.len(_anamag->curr()); + if (l > 25) + l = 25; + if (t == RIGA_MERCE || t == RIGA_OMAGGI) + { +// park=rieprec.get(SVR_CODART); +// _anamag->put(ANAMAG_CODART, park); +// if (_anamag->read() == NOERR) + const TRectype & rec = cache().get(LF_ANAMAG, rieprec.get(SVR_CODART)); + park = f.read(rec); + park.rpad(l); + } + else + park.spaces(l); + } + break; case CHR_LIVGIAC: // liv giac CHECK(lev_code_num>0,"I livelli di giacenza sono utilizzabili solo singolarmente"); park = _liv_giac->unpack_grpcode(rieprec.get(SVR_GIAC),lev_code_num); - return park.rpad(_liv_giac->code_length(lev_code_num)); + park.rpad(_liv_giac->code_length(lev_code_num)); + break; case CHR_CATVEN: // cat. vendita park=rieprec.get(SVR_CATVEN); - return park.rpad(3); + park.rpad(3); + break; case CHR_FOR: // cliente / fornitore case CHR_CLI: // cliente / fornitore if (rieprec.get_char(SVR_TIPOCF)>' ') lev_code[0]=rieprec.get_char(SVR_TIPOCF); - park.format("%c%6d",lev_code[0],rieprec.get_int(SVR_CODCF)); - return park; + park.format("%c%6ld",lev_code[0],rieprec.get_long(SVR_CODCF)); + break; case CHR_AGENTE: // agente - park.format("%5d",rieprec.get_int(SVR_CODAG)); - return park; + park.format("%5s",(const char*)rieprec.get(SVR_CODAG)); + break; case CHR_MAGAZZ: // mag park=rieprec.get(SVR_MAG); - return park.rpad(3); + park.rpad(3); + break; case CHR_ZONA: // zona park=rieprec.get(SVR_ZONA); - return park.rpad(3); + park.rpad(3); + break; case CHR_UMISURA: // unità di misura park=rieprec.get(SVR_UMQTA); - return park.rpad(3); + park.rpad(3); + break; default: fatal_box("ai chent recognaiz the code of the key part!"); - return ""; + park= ""; } + if (park.blank()) + park.replace(' ','?'); + return park; } -const TString& TStampa_stat::get_descrpart(const char *lev_code, TSVriep_record &rieprec) +const TString& TStampa_stat::get_descrpart(const char *lev_code, TSVriep_record &rieprec, const TString & fld, int row) { int lev_code_num=atoi(lev_code+1); switch (*lev_code) @@ -1699,16 +1902,72 @@ const TString& TStampa_stat::get_descrpart(const char *lev_code, TSVriep_record case CHR_TIPODOC: // tipo documento return _tipodoc->get(rieprec.get(SVR_TIPODOC)).get("S0"); case CHR_ARTICOLO: // articolo - if (lev_code_num==0 || lev_code_num== _liv_art->last_level()) + { + const char t = rieprec.get_char(SVR_TIPOART); + switch (t) { - _anamag->put(ANAMAG_CODART,rieprec.get(SVR_CODART)); - _anamag->read(); - return _anamag->get(ANAMAG_DESCR); + case RIGA_MERCE: + case RIGA_OMAGGI: + if (lev_code_num==0 || lev_code_num== _liv_art->last_level()) + { +// _anamag->put(ANAMAG_CODART,rieprec.get(SVR_CODART)); +// _anamag->read(); +// return _anamag->get(ANAMAG_DESCR); + const TRectype & rec = cache().get(LF_ANAMAG, rieprec.get(SVR_CODART)); + return rec.get(ANAMAG_DESCR); + } + else + { + return _liv_art->group_descr(rieprec.get(SVR_CODART),lev_code_num); + } + break; + case RIGA_PRESTAZIONI: + _prs->setkey(1); + _prs->put("CODTAB",rieprec.get(SVR_CODART)); + _prs->read(); + return _prs->get("S0"); + break; + case RIGA_SPESEDOC: + _prs->setkey(1); + _spp->put("CODTAB",rieprec.get(SVR_CODART)); + _spp->read(); + return _spp->get("S0"); + break; + default: + break; } - else + } + case CHR_ARTFIELD: // campo anagrafica { - return _liv_art->group_descr(rieprec.get(SVR_CODART),lev_code_num); + if (_file_fld.objptr(row) != NULL) + { + TString16 tab(_file_fld.row(row)); + int file = atoi(tab); + const TRectype & anag = cache().get(LF_ANAMAG, rieprec.get(SVR_CODART)); + TFieldref f; + + f = _key_fld.row(row); + const TString & key = f.read(anag); + + if (key.not_empty()) + { + if (file != 0) + { + const TRectype & rec = cache().get(file, key); + + return rec.get(_field_fld.row(row)); + } + else + { + const TRectype & rec = cache().get(tab, key); + + return rec.get(_field_fld.row(row)); + } + } + } + return EMPTY_STRING; } + break; case CHR_LIVGIAC: // liv giac CHECK(lev_code_num>0,"I livelli di giacenza sono utilizzabili solo singolarmente"); return _liv_giac->group_descr(rieprec.get(SVR_GIAC),lev_code_num); @@ -1718,12 +1977,13 @@ const TString& TStampa_stat::get_descrpart(const char *lev_code, TSVriep_record case CHR_CLI: // cliente { _clifor->put(CLI_TIPOCF,rieprec.get_char(SVR_TIPOCF)); - _clifor->put(CLI_CODCF,rieprec.get_int(SVR_CODCF)); + _clifor->put(CLI_CODCF,rieprec.get_long(SVR_CODCF)); _clifor->read(); return _clifor->get(CLI_RAGSOC); } case CHR_AGENTE: // agente _agenti->put(AGE_CODAGE,rieprec.get(SVR_CODAG)); + _agenti->read(); return _agenti->get(AGE_RAGSOC); case CHR_MAGAZZ: // mag return _magazz->get(rieprec.get(SVR_MAG)).get("S0"); @@ -1733,7 +1993,7 @@ const TString& TStampa_stat::get_descrpart(const char *lev_code, TSVriep_record return _ums->get(rieprec.get(SVR_UMQTA)).get("S0"); default: fatal_box("ai chent recognaiz the code of the key part!"); - return ""; + return EMPTY_STRING; } } @@ -1827,7 +2087,8 @@ bool TStampa_stat::dataini_handler(TMask_field& f, KEY k) TDate data(f.get()); const TFrequenza_statistiche base = char2frequency(m.get(F_FREQUENZA)[0]); const TFrequenza_statistiche freq = char2frequency(m.get(F_MULTIPLO)[0]); - floor(data, divide(freq, base) == 0 ? freq : base); + // floor(data, divide(freq, base) == 0 ? freq : base); // perche'? + floor(data, freq); f.set(data.string()); app().recalc_period(); } @@ -1914,6 +2175,12 @@ bool TStampa_stat::codice_handler(TMask_field& f, KEY k) TToken_string s1 = rec.get("S1"); TToken_string s2 = rec.get("S2"); + TToken_string s4 = rec.get("S4"); + TString s5 = rec.get("S5"); + + if (s4.not_empty()) + if (s4[s4.len() - 1] == '|' && s5[0] == '|') s4 << " "; + s4 <= 0; } - if (found) + if (campo[0] != CHR_ARTFIELD && found) { ok = error_box("Il codice %s inserito alla riga %d e' gia'\n" "utilizzato in una riga precedente.", @@ -2060,9 +2332,49 @@ bool TStampa_stat::chiave_handler(TMask_field& f, KEY k) bool TStampa_stat::campo_handler(TMask_field& f, KEY k) { - bool ok = TRUE; - if (f.to_check(k)) - ok = app().test_field(f.get(), f); + if (f.to_check(k, TRUE)) + { + const bool is_fld = f.get()== STR_ARTFIELD; + + if (!is_fld) + f.mask().reset(S_ARTFLD); + f.mask().field(S_ARTFLD).check_type(is_fld ? CHECK_REQUIRED : CHECK_NONE); + f.mask().enable(S_ARTFLD, is_fld); + return app().test_field(f.get(), f); + } + return TRUE; +} + +bool TStampa_stat::artfld_handler(TMask_field& f, KEY k) +{ + bool ok = TRUE; + switch (k) + { + case K_TAB: + case K_ENTER: + if (!f.empty() && f.to_check(k)) + { + TLocalisamfile anamag(LF_ANAMAG); + const TRectype& rec = anamag.curr(); + TString16 field = f.get(); + int pos = field.find('['); + if (pos > 0) + field.cut(pos); + if (!rec.exist(field)) + ok = f.error_box("Il campo '%s' non esiste.", (const char*)field); + } + break; + case K_F9: + { + TRelation anamag(LF_ANAMAG); + TRelation_description rd(anamag); + if (rd.choose_field(f.get())) + f.set(rd.field_name()); + } + break; + default: + break; + } return ok; } diff --git a/sv/sv1200.ini b/sv/sv1200.ini new file mode 100755 index 000000000..74f4b71f8 --- /dev/null +++ b/sv/sv1200.ini @@ -0,0 +1,5 @@ +[Descriptions] +GRMERC[1,3](1)=Gruppo Merceologico +GRMERC[1,3](2)=GMC|GRMERC[1,3]|S0 +GRMERC[4,5](1)=Sottogruppo Merceologico +GRMERC[4,5](2)=GMC|GRMERC|S0 diff --git a/sv/sv1200a.h b/sv/sv1200a.h index d8f38e70d..59933bedf 100755 --- a/sv/sv1200a.h +++ b/sv/sv1200a.h @@ -23,5 +23,6 @@ #define S_DAL 103 #define S_AL 104 #define S_DESCR 105 +#define S_ARTFLD 106 #endif diff --git a/sv/sv1200a.uml b/sv/sv1200a.uml index fdf36ec50..73e3e452d 100755 --- a/sv/sv1200a.uml +++ b/sv/sv1200a.uml @@ -91,7 +91,7 @@ BEGIN PROMPT 74 5 "" FLAGS "U" NUM_EXPR #THIS_FIELD>0 - WARNINIG "Inserire un numero maggiore di zero" + WARNING "Inserire un numero maggiore di zero" END GROUPBOX DLG_NULL 78 5 @@ -104,7 +104,7 @@ BEGIN PROMPT 2 8 "Numero di colonne " FLAGS "U" NUM_EXPR (#THIS_FIELD>0)&&(#THIS_FIELD<37) - WARNINIG "Inserire compreso tra 1 e 36" + WARNING "Inserire compreso tra 1 e 36" END NUMBER F_RAFFRONTO 2 @@ -112,14 +112,14 @@ BEGIN PROMPT 42 8 "Numero di colonne per raffronto " FLAGS "U" // CHECKTYPE REQUIRED - WARNINIG "Inserire un numero di colonne positivo" + WARNING "Inserire un numero di colonne positivo" END DATE F_DATAINI BEGIN PROMPT 2 9 "Dal " CHECKTYPE REQUIRED - WARNINIG "Inserire una data iniziale" + WARNING "Inserire una data iniziale" END DATE F_DATAFIN @@ -127,14 +127,14 @@ BEGIN PROMPT 18 9 "Al " CHECKTYPE REQUIRED VALIDATE DATE_CMP_FUNC > F_DATAINI - WARNINIG "Inserire una data superiore a quella iniziale" + WARNING "Inserire una data superiore a quella iniziale" END DATE F_DATARAF BEGIN PROMPT 53 9 "Raffronta dal " VALIDATE DATE_CMP_FUNC <= F_DATAINI - WARNINIG "Inserire una data inferiore a quella iniziale" + WARNING "Inserire una data inferiore a quella iniziale" END NUMBER F_COL_ANNO 2 @@ -188,13 +188,14 @@ BEGIN ITEM "Dal@20" ITEM "Al@20" ITEM "Descrizione@50" + ITEM "Campo anagrafica\narticolo@17" END ENDPAGE ENDMASK -PAGE "Sheet" -1 -1 52 8 +PAGE "Sheet" -1 -1 65 10 STRING S_CAMPO 2 BEGIN @@ -202,13 +203,14 @@ BEGIN FLAGS "U" SHEET "Campo|Descrizione@50" INPUT S_CAMPO - ITEM "A|Articolo" - ITEM "L|Livello giacenza" - ITEM "V|Categoria vendita" - ITEM "C|Codice cliente" - ITEM "G|Codice agente" - ITEM "M|Codice magazzino" - ITEM "Z|Codice zona" + ITEM "A|Articolo" + ITEM "L|Livello giacenza" + ITEM "V|Categoria vendita" + ITEM "C|Codice cliente" + ITEM "G|Codice agente" + ITEM "M|Codice magazzino" + ITEM "Z|Codice zona" + ITEM "B|Campo dell'anagrafica articoli" OUTPUT S_CAMPO OUTPUT S_DESCR END @@ -234,6 +236,12 @@ BEGIN PROMPT 28 4 "Al " END +STRING S_ARTFLD 17 +BEGIN + PROMPT 1 6 "Campo anagrafica " + FLAGS "BU" +END + BUTTON DLG_CANCEL 10 2 BEGIN PROMPT -13 -1 "" diff --git a/sv/sv1200b.uml b/sv/sv1200b.uml index 867152cf9..ae6e35f15 100755 --- a/sv/sv1200b.uml +++ b/sv/sv1200b.uml @@ -84,7 +84,7 @@ END BOOL F_FLAGT2 BEGIN - PROMPT 2 11 " " + PROMPT 2 11 " " FLAGS "D" MESSAGE TRUE ENABLE,F_FLAGT3 MESSAGE FALSE CLEAR,F_FLAGT3 @@ -92,43 +92,43 @@ END BOOL F_FLAGT3 BEGIN - PROMPT 2 12 " " + PROMPT 2 12 " " MESSAGE TRUE ENABLE,F_FLAGT4 MESSAGE FALSE CLEAR,F_FLAGT4 END BOOL F_FLAGT4 BEGIN - PROMPT 2 13 " " + PROMPT 2 13 " " MESSAGE TRUE ENABLE,F_FLAGT5 MESSAGE FALSE CLEAR,F_FLAGT5 END BOOL F_FLAGT5 BEGIN - PROMPT 2 14 " " + PROMPT 2 14 " " MESSAGE TRUE ENABLE,F_FLAGT6 MESSAGE FALSE CLEAR,F_FLAGT6 END BOOL F_FLAGT6 BEGIN - PROMPT 2 15 " " + PROMPT 2 15 " " MESSAGE TRUE ENABLE,F_FLAGT7 MESSAGE FALSE CLEAR,F_FLAGT7 END BOOL F_FLAGT7 BEGIN - PROMPT 2 16 " " + PROMPT 2 16 " " MESSAGE TRUE ENABLE,F_FLAGT8 MESSAGE FALSE CLEAR,F_FLAGT8 END BOOL F_FLAGT8 BEGIN - PROMPT 2 17 " " + PROMPT 2 17 " " MESSAGE TRUE ENABLE,F_FLAGT9 MESSAGE FALSE CLEAR,F_FLAGT9 END BOOL F_FLAGT9 BEGIN - PROMPT 2 18 " " + PROMPT 2 18 " " END ENDPAGE diff --git a/sv/sv2100.cpp b/sv/sv2100.cpp index 024882da1..a3171502a 100755 --- a/sv/sv2100.cpp +++ b/sv/sv2100.cpp @@ -121,13 +121,17 @@ void TRicalcolo_stats::calc_stats(const TDate& dfr, const TDate& dto) pi.addstatus(1); const TTipo_documento& tipodoc = doc.tipo(); + const bool nota_cr = tipodoc.nota_credito(); if (!tipodoc.statistiche()) continue; for (int r = doc.physical_rows(); r > 0; r--) { const TRiga_documento& rdoc = doc[r]; - _agg.add(rdoc); + if (nota_cr) + _agg.sub(rdoc); + else + _agg.add(rdoc); } records++; diff --git a/sv/svlib01.cpp b/sv/svlib01.cpp index 730f1200b..bcf4a2dd6 100755 --- a/sv/svlib01.cpp +++ b/sv/svlib01.cpp @@ -77,6 +77,7 @@ int divide(TFrequenza_statistiche f1, TFrequenza_statistiche f2) case fs_mensile : return 12; case fs_quindicinale : return 24; case fs_settimanale : return 52; + case fs_giornaliera : return 365 ; default : break; } break; @@ -88,6 +89,7 @@ int divide(TFrequenza_statistiche f1, TFrequenza_statistiche f2) case fs_mensile :return 6; case fs_quindicinale :return 12; case fs_settimanale :return 26; +// case fs_giornaliera : return (365)/2; default :break; } break; @@ -97,6 +99,7 @@ int divide(TFrequenza_statistiche f1, TFrequenza_statistiche f2) case fs_bimestrale :return 2; case fs_mensile :return 4; case fs_quindicinale :return 8; +// case fs_giornaliera : return 365/3; default :break; } case fs_trimestrale: @@ -105,6 +108,7 @@ int divide(TFrequenza_statistiche f1, TFrequenza_statistiche f2) case fs_mensile :return 3; case fs_quindicinale :return 6; case fs_settimanale :return 13; +// case fs_giornaliera : return 365/4; default :break; } break; @@ -113,6 +117,7 @@ int divide(TFrequenza_statistiche f1, TFrequenza_statistiche f2) { case fs_mensile :return 2; case fs_quindicinale :return 4; +// case fs_giornaliera : return 365/6; default :break; } break; @@ -120,6 +125,20 @@ int divide(TFrequenza_statistiche f1, TFrequenza_statistiche f2) if (f2 == fs_quindicinale) return 2; break; + case fs_quindicinale : + switch(f2) + { + case fs_giornaliera : return 15; + default :break; + } + break; + case fs_settimanale : + switch(f2) + { + case fs_giornaliera : return 7; + default :break; + } + break; default: break; } @@ -181,9 +200,36 @@ long date2long(const TDate d, TFrequenza_statistiche f) long period2long(const int anno, const int periodo, TFrequenza_statistiche f) { - return long(anno)*long(last_period(anno,f))+periodo; + if (f==fs_annuale) + return long(anno)*long(100)+periodo; + else + return long(anno)*long(last_period(anno,f))+periodo; } +// calcola approssimativamente la data corrispondente ad una coppia anno/periodo +const TDate & period2date(const int anno, int periodo, TFrequenza_statistiche f) +{ + static TDate d; + d.set_year(anno+(periodo-1)/last_period(anno,f)); + d.set_month(1); + d.set_day(1); + periodo=periodo % last_period(anno,f); + switch(f) + { + case fs_giornaliera: d+=periodo-1; break; + case fs_settimanale: d+=(periodo-1)*7; break; + case fs_quindicinale: d+=(periodo-1)*15; break; + case fs_mensile: d.set_month(periodo); break; + case fs_bimestrale: d.set_month(periodo*2); break; + case fs_trimestrale: d.set_month(periodo*3); break; + case fs_quadrimestrale:d.set_month(periodo*4); break; + case fs_semestrale: d.set_month(periodo*6); break; + } + return d; +} + + + const TDate& floor(TDate& data, TFrequenza_statistiche freq) { @@ -286,6 +332,7 @@ void TStats_agg::init() _frequenza = char2frequency(ini.get_char("Frequenza")); _merce = ini.get_bool("StatMerce"); _prestazioni = ini.get_bool("StatPrestazioni"); + _spesedoc = ini.get_bool("StatSpesedoc"); _omaggi = ini.get_bool("StatOmaggi"); _omaggio_is_merce = ini.get_bool("OmaggioIsMerce"); @@ -354,7 +401,7 @@ TStats_agg::TStats_data& TStats_agg::find(const TRiga_documento& rdoc) key.add(tipo); TString80 codart; - if (tipo != RIGA_PRESTAZIONI) + if (tipo != RIGA_PRESTAZIONI && tipo != RIGA_SPESEDOC) { codart = rdoc.get(RDOC_CODARTMAG); if (codart.empty() && !_art_noanag_grp) @@ -416,20 +463,21 @@ bool TStats_agg::can_add(const TRiga_documento& rdoc) const const TTipo_documento& tip = rdoc.doc().tipo(); bool ok = tip.statistiche(); + const char tipo = rdoc.tipo().tipo(); if (ok) { - const char tipo = rdoc.tipo().tipo(); switch(tipo) { case RIGA_MERCE : ok = _merce; break; case RIGA_OMAGGI : ok = _omaggi; break; case RIGA_PRESTAZIONI: ok = _prestazioni; break; + case RIGA_SPESEDOC : ok = _spesedoc; break; default : ok = FALSE; break; } } - if (ok && !rdoc.is_articolo()) + if (ok && (tipo == RIGA_MERCE || tipo == RIGA_OMAGGI) && !rdoc.is_articolo()) { const TString& codart = rdoc.get(RDOC_CODART); if (codart.empty()) diff --git a/sv/svlib01.h b/sv/svlib01.h index 991c45aff..bd843ccdb 100755 --- a/sv/svlib01.h +++ b/sv/svlib01.h @@ -21,7 +21,7 @@ enum TFrequenza_statistiche { fs_nulla, fs_giornaliera, //@cmember Converte una carattere in una frequenza delle statisitiche TFrequenza_statistiche char2frequency(char c); -//@cmember Converte una frequenza delle statisitiche in un carattere +//@cmember Converte una frequenza delle statistiche in un carattere char frequency2char(TFrequenza_statistiche f); //@cmember Converte una carattere nel nome completo della frequenza TString & char2freqname(char c); @@ -40,6 +40,9 @@ int last_period(const TDate & d, TFrequenza_statistiche f); //Ritorna la parte "periodo" di una data (l'anno si ottiene da year()) int date2period(const TDate& data, TFrequenza_statistiche freq); +//Converte una coppia anno+periodo in un TDate in base alla frequenza passata +const TDate & period2date(const int anno, int periodo, TFrequenza_statistiche f); + //Converte una data in un long in base alla frequenza passata long date2long(const TDate d, TFrequenza_statistiche f); @@ -58,7 +61,7 @@ class TStats_agg : public TObject TAssoc_array _data; TFrequenza_statistiche _frequenza; - bool _merce, _prestazioni, _omaggi, _omaggio_is_merce; + bool _merce, _prestazioni, _spesedoc, _omaggi, _omaggio_is_merce; bool _art_nocode, _art_noanag, _art_noanag_grp; bool _agente, _cliente, _zona, _articolo, _giacenza, _magazzino,_catvend; diff --git a/sv/svlib09.cpp b/sv/svlib09.cpp index 19145decd..2e23da891 100755 --- a/sv/svlib09.cpp +++ b/sv/svlib09.cpp @@ -80,7 +80,7 @@ void TRWrecord_cache::put(const TRectype &r) if (obj != NULL) { // esiste in cache ; tenta di settare il flag a "D"irty; se il flag esiste già è a - TRectype & rec=(TRectype &)*obj; + TRectype & rec=(TRectype &)(*obj); rec=r; _flags.add(cachekey , new TString("D")); } else { diff --git a/sv/svtbpsv.h b/sv/svtbpsv.h index 153a24822..0880de7d6 100755 --- a/sv/svtbpsv.h +++ b/sv/svtbpsv.h @@ -14,5 +14,6 @@ #define SPSV_CAMPO 101 #define SPSV_TOTALE 102 #define SPSV_DESCR 103 +#define SPSV_ARTFLD 104 #endif diff --git a/sv/svtbpsv.uml b/sv/svtbpsv.uml index 2677b548d..8292153a1 100755 --- a/sv/svtbpsv.uml +++ b/sv/svtbpsv.uml @@ -114,6 +114,7 @@ BEGIN ITEM "Campo" ITEM "Totale" ITEM "Descrizione@50" + ITEM "Campo\nanagrafica" END ENDPAGE @@ -129,6 +130,7 @@ BEGIN SHEET "Campo|Descrizione@50" INPUT SPSV_CAMPO ITEM "A|Articolo" + ITEM "B|Campo anagrafica articoli" ITEM "L|Livello giacenza" ITEM "V|Categoria vendita" ITEM "C|Codice cliente" @@ -150,6 +152,12 @@ BEGIN FLAGS "D" END +STRING SPSV_ARTFLD 17 +BEGIN + PROMPT 1 3 "Campo anagrafica " + FLAGS "BU" +END + BUTTON DLG_CANCEL 10 2 BEGIN PROMPT -13 -1 "" diff --git a/ve/bastabe.uml b/ve/bastabe.uml index 0f92a135c..2a585ecf5 100755 --- a/ve/bastabe.uml +++ b/ve/bastabe.uml @@ -1,4 +1,4 @@ -#include "ba3200.h" +#include "..\ba\ba3200.h" PAGE "Stampa Aspetto dei Beni" -1 -1 50 8 STRING F_INIZIO1 3 diff --git a/ve/batbcld.uml b/ve/batbcld.uml index 868ad295d..70d0b9c7e 100755 --- a/ve/batbcld.uml +++ b/ve/batbcld.uml @@ -21,7 +21,7 @@ BEGIN FLAG "UZ" USE %CLD INPUT CODTAB F_CLASSDOG - DISPLAY "Codice" CODTAB + DISPLAY "Codice@10" CODTAB DISPLAY "Descrizione@50" S0 OUTPUT F_CLASSDOG CODTAB OUTPUT F_CLASSDOG1 S0 diff --git a/ve/batbeld.uml b/ve/batbeld.uml index 7e028d276..77c438cd8 100755 --- a/ve/batbeld.uml +++ b/ve/batbeld.uml @@ -4,7 +4,7 @@ TOOLBAR "" 0 20 0 2 #include ENDPAGE -PAGE "Tabella elaborazioni differite" -1 -1 0 0 +PAGE "Elaborazioni differite" -1 -1 0 0 GROUPBOX DLG_NULL 78 5 BEGIN diff --git a/ve/batbmag.uml b/ve/batbmag.uml index 04f54dd1a..d284b4c62 100755 --- a/ve/batbmag.uml +++ b/ve/batbmag.uml @@ -1,6 +1,4 @@ #include "batbmag.h" -#include -#include TOOLBAR "" 0 20 60 2 #include @@ -33,6 +31,7 @@ BEGIN OUTPUT F_CODICE CODTAB[1,3] OUTPUT F_DESCR S0 OUTPUT H_DESCR S0 + OUTPUT F_NATMAG I2 OUTPUT H_GESTGIA B0 OUTPUT F_CODLGIOR S8 OUTPUT F_UNLOC I1 @@ -136,10 +135,7 @@ BEGIN USE LF_COMUNI INPUT STATO "" INPUT COM F_COM - DISPLAY "Codice" COM - DISPLAY "Comune@50" DENCOM - DISPLAY "Prov.@2" PROVCOM - DISPLAY "CAP@5" CAPCOM +#include OUTPUT F_COM COM OUTPUT F_LOC DENCOM OUTPUT F_PROV PROVCOM @@ -154,7 +150,7 @@ BEGIN PROMPT 6 10 "Comune " USE LF_COMUNI KEY 2 INPUT DENCOM F_LOC - COPY DISPLAY F_COM +#include COPY OUTPUT F_COM CHECKTYPE NORMAL END @@ -311,14 +307,14 @@ BEGIN FLAGS "U" FIELD S8 USE REG SELECT I0=9 - INPUT CODTAB[1,4] F_ANNO SELECT + INPUT CODTAB[1,4] F_ANNO INPUT CODTAB[5,7] F_CODLGIOR DISPLAY "Anno" CODTAB[1,4] DISPLAY "Giornale" CODTAB[5,7] DISPLAY "Descrizione@50" S0 - DISPLAY "I" I0 OUTPUT F_CODLGIOR CODTAB[5,7] - CHECKTYPE NORMAL + OUTPUT F_ANNO CODTAB[1,4] + WARNING "Registro non valido come Libro giornale " GROUP G_INFOMAG END diff --git a/ve/batbprs.uml b/ve/batbprs.uml index aca8bf137..80d200a2c 100755 --- a/ve/batbprs.uml +++ b/ve/batbprs.uml @@ -180,7 +180,7 @@ NUMBER F_CONTOV 3 BEGIN PROMPT 22 14 "" FIELD I1 - USE LF_PCON SELECT (CONTO!="") && (SOTTOCONTO=="") && ((INDBIL=="4") || (INDBIL=="1") || (INDBIL=="2")) + USE LF_PCON SELECT (CONTO!="") && (SOTTOCONTO=="") INPUT GRUPPO F_GRUPPOV INPUT CONTO F_CONTOV DISPLAY "Gruppo" GRUPPO @@ -197,10 +197,10 @@ NUMBER F_SOTTOV 6 BEGIN PROMPT 30 14 "" FIELD I2 - USE LF_PCON SELECT (SOTTOCONTO!="") && ((500@->INDBIL=="4") || (500@->INDBIL=="1") || (500@->INDBIL=="2")) + USE LF_PCON SELECT SOTTOCONTO!="" JOIN LF_PCON ALIAS 500 INTO GRUPPO==GRUPPO CONTO==CONTO - INPUT GRUPPO F_GRUPPOV SELECT - INPUT CONTO F_CONTOV SELECT + INPUT GRUPPO F_GRUPPOV + INPUT CONTO F_CONTOV INPUT SOTTOCONTO F_SOTTOV DISPLAY "Gruppo" GRUPPO DISPLAY "Conto" CONTO @@ -219,7 +219,7 @@ STRING F_DESCRCONTOV 50 BEGIN PROMPT 17 15 "" FLAG "U" - USE LF_PCON KEY 2 SELECT (SOTTOCONTO!="") && ((500@->INDBIL=="4") || (500@->INDBIL=="1") || (500@->INDBIL=="2")) + USE LF_PCON KEY 2 SELECT (SOTTOCONTO!="") JOIN LF_PCON ALIAS 500 INTO GRUPPO==GRUPPO CONTO==CONTO INPUT DESCR F_DESCRCONTOV DISPLAY "Descrizione@50" DESCR @@ -243,7 +243,7 @@ NUMBER F_CONTOA 3 BEGIN PROMPT 22 16 "" FIELD I4 - USE LF_PCON SELECT (CONTO!="") && (SOTTOCONTO=="") && ((INDBIL=="3") || (INDBIL=="1") || (INDBIL=="2")) + COPY USE F_CONTOV INPUT GRUPPO F_GRUPPOA INPUT CONTO F_CONTOA DISPLAY "Gruppo" GRUPPO @@ -260,15 +260,11 @@ NUMBER F_SOTTOA 6 BEGIN PROMPT 30 16 "" FIELD I5 - USE LF_PCON SELECT (SOTTOCONTO!="") && ((500@->INDBIL=="3") || (500@->INDBIL=="1") || (500@->INDBIL=="2")) - JOIN LF_PCON ALIAS 500 INTO GRUPPO==GRUPPO CONTO==CONTO - INPUT GRUPPO F_GRUPPOA SELECT - INPUT CONTO F_CONTOA SELECT + COPY USE F_SOTTOV + INPUT GRUPPO F_GRUPPOA + INPUT CONTO F_CONTOA INPUT SOTTOCONTO F_SOTTOA - DISPLAY "Gruppo" GRUPPO - DISPLAY "Conto" CONTO - DISPLAY "Sottoconto" SOTTOCONTO - DISPLAY "Descrizione@50" DESCR + COPY DISPLAY F_SOTTOV OUTPUT F_GRUPPOA GRUPPO OUTPUT F_CONTOA CONTO OUTPUT F_SOTTOA SOTTOCONTO @@ -282,13 +278,9 @@ STRING F_DESCRCONTOA 50 BEGIN PROMPT 17 17 "" FLAG "U" - USE LF_PCON KEY 2 SELECT (SOTTOCONTO!="") && ((500@->INDBIL=="3") || (500@->INDBIL=="1") || (500@->INDBIL=="2")) - JOIN LF_PCON ALIAS 500 INTO GRUPPO==GRUPPO CONTO==CONTO + COPY USE F_DESCRCONTOV INPUT DESCR F_DESCRCONTOA - DISPLAY "Descrizione@50" DESCR - DISPLAY "Gruppo" GRUPPO - DISPLAY "Conto" CONTO - DISPLAY "Sottoconto" SOTTOCONTO + COPY DISPLAY F_DESCRCONTOV COPY OUTPUT F_SOTTOA CHECKTYPE NORMAL WARNING "Il conto deve essere un ricavo" diff --git a/ve/batbrfa.uml b/ve/batbrfa.uml index f28b61167..8b420210a 100755 --- a/ve/batbrfa.uml +++ b/ve/batbrfa.uml @@ -210,12 +210,10 @@ NUMBER F_CONTOA 3 BEGIN PROMPT 25 16 "" FIELD I1 - USE LF_PCON SELECT (CONTO!="") && (SOTTOCONTO=="") + COPY USE F_CONTOV INPUT GRUPPO F_GRUPPOA INPUT CONTO F_CONTOA - DISPLAY "Gruppo" GRUPPO - DISPLAY "Conto" CONTO - DISPLAY "Descrizione@50" DESCR + COPY DISPLAY F_CONTOV OUTPUT F_GRUPPOA GRUPPO OUTPUT F_CONTOA CONTO CHECKTYPE NORMAL @@ -227,15 +225,11 @@ NUMBER F_SOTTOCA 6 BEGIN PROMPT 33 16 "" FIELD I2 - USE LF_PCON SELECT SOTTOCONTO!="" - JOIN LF_PCON ALIAS 500 INTO GRUPPO==GRUPPO CONTO==CONTO - INPUT GRUPPO F_GRUPPOA SELECT - INPUT CONTO F_CONTOA SELECT + COPY USE F_SOTTOCV + INPUT GRUPPO F_GRUPPOA + INPUT CONTO F_CONTOA INPUT SOTTOCONTO F_SOTTOCA - DISPLAY "Gruppo" GRUPPO - DISPLAY "Conto" CONTO - DISPLAY "Sottoconto" SOTTOCONTO - DISPLAY "Descrizione@50" DESCR + COPY DISPLAY F_SOTTOCV OUTPUT F_GRUPPOA GRUPPO OUTPUT F_CONTOA CONTO OUTPUT F_SOTTOCA SOTTOCONTO @@ -249,13 +243,9 @@ STRING F_DESCRA 50 BEGIN PROMPT 19 17 "" FLAG "U" - USE LF_PCON KEY 2 SELECT SOTTOCONTO!="" - JOIN LF_PCON ALIAS 500 INTO GRUPPO==GRUPPO CONTO==CONTO + COPY USE F_DESCRV INPUT DESCR F_DESCRA - DISPLAY "Descrizione@50" DESCR - DISPLAY "Gruppo" GRUPPO - DISPLAY "Conto" CONTO - DISPLAY "Sottoconto" SOTTOCONTO + COPY DISPLAY F_DESCRV COPY OUTPUT F_SOTTOCA CHECKTYPE NORMAL WARNING "Il conto deve essere un ricavo" diff --git a/ve/batbtip.h b/ve/batbtip.h index 49acd768e..e6da555e4 100755 --- a/ve/batbtip.h +++ b/ve/batbtip.h @@ -19,6 +19,10 @@ #define F_SCARES 119 #define F_CODCAUSANT 120 #define F_DESCAUSANT 121 +#define F_CLIFO_OPT 122 +#define F_CONAI 123 +#define F_NATURA 124 +#define F_NOTACREDDEB 125 #define F_STATOF_INS 150 #define F_STATOF_ST 151 diff --git a/ve/batbtip.uml b/ve/batbtip.uml index 42f81575c..91946b63a 100755 --- a/ve/batbtip.uml +++ b/ve/batbtip.uml @@ -59,14 +59,14 @@ END STRING F_PSTAMPA 8 BEGIN - PROMPT 2 7 "Profilo stampa documento " + PROMPT 44 6 "Profilo stampa documento " FIELD S5 CHECKTYPE REQUIRED END NUMBER F_NCOPIE 3 BEGIN - PROMPT 2 8 "Numero di copie " + PROMPT 2 7 "Numero di copie " FIELD I0 NUM_EXPR {(#THIS_FIELD >= 0)} WARNING "Il numero di copie deve essere positivo" @@ -74,7 +74,7 @@ END LIST F_TIPO 24 BEGIN - PROMPT 2 9 "Tipo del documento " + PROMPT 2 8 "Tipo del documento " FIELD I1 ITEM "0|Altro" MESSAGE ENABLE,2@ ITEM "1|Bolla" MESSAGE CLEAR,2@ @@ -84,7 +84,7 @@ END STRING F_CODCAUS 3 BEGIN - PROMPT 2 10 "Codice causale contabile " + PROMPT 2 9 "Codice causale contabile " FIELD S6 USE LF_CAUSALI INPUT CODCAUS F_CODCAUS @@ -99,7 +99,7 @@ END STRING F_DESCAUS 50 BEGIN - PROMPT 2 11 "Descrizione " + PROMPT 2 10 "Descrizione " USE LF_CAUSALI KEY 2 INPUT DESCR F_DESCAUS DISPLAY "Descrizione@50" DESCR @@ -112,7 +112,7 @@ END STRING F_CODCAUSANT 3 BEGIN - PROMPT 2 12 "Codice causale anticipo " + PROMPT 2 11 "Codice causale anticipo " FIELD S10 USE LF_CAUSALI SELECT REG =="" INPUT CODCAUS F_CODCAUSANT @@ -127,7 +127,7 @@ END STRING F_DESCAUSANT 50 BEGIN - PROMPT 2 13 "Descrizione " + PROMPT 2 12 "Descrizione " USE LF_CAUSALI KEY 2 INPUT DESCR F_DESCAUSANT DISPLAY "Descrizione@50" DESCR @@ -138,6 +138,12 @@ BEGIN GROUP 2 END +BOOLEAN F_NOTACREDDEB +BEGIN + PROMPT 2 13 "Nota di credito/debito" + FIELD B7 +END + BOOLEAN F_SPESEAUT BEGIN PROMPT 2 14 "Addebito automatico spese cliente" @@ -226,6 +232,12 @@ BEGIN FIELD B2 END +BOOLEAN F_CLIFO_OPT +BEGIN + PROMPT 44 18 "Cliente/Fornitore non obbligatorio" + FIELD B5 +END + BOOLEAN F_PROVV BEGIN PROMPT 2 19 "Attivo per le provvigioni" @@ -249,6 +261,30 @@ BEGIN WARNING "Stato impossibile" END +BOOLEAN F_CONAI +BEGIN + PROMPT 2 20 "Addebito CONAI" + FIELD B6 +END + +NUMBER F_NATURA 1 +BEGIN + PROMPT 44 20 "Natura transazione " + SHEET "Cod.|Descrizione@66" + INPUT F_NATURA + ITEM "1|Acquisto o vendita (compreso il baratto)" + ITEM "2|Restituzione o sostituzione di merci" + ITEM "3|Aiuti gernativi, privati o finanziati dalla comunita' europea" + ITEM "4|Operazione in vista di una lavorazione per conto terzi o di una riparazione" + ITEM "5|Operazione successiva ad una lavorazione per conto terzi o di una riparazione" + ITEM "6|Movimento di merci senza trasferimento di proprieta' (per noleggio, leasing operativo, ecc.)" + ITEM "7|Operazione a titolo di un programma comune di difesa o di un altro programma intergovernativo di fabbricazione coordinata" + ITEM "8|Fornitura di materiali e macchinari nel quadro di un contratto generale di costruzione o di genio civile" + ITEM "9|Altre transazioni" + OUTPUT F_NATURA + FIELD I2 +END + ENDPAGE PAGE "Stati validi" -1 -1 60 14 diff --git a/ve/bolacq.src b/ve/bolacq.src new file mode 100755 index 000000000..ee7262a89 --- /dev/null +++ b/ve/bolacq.src @@ -0,0 +1,234 @@ +#include "veini.h" +#include "veuml.h" +#include "verig.h" +// Esempio di profilo documento : Profilo Bolla Vendita + +[MAIN] +// Descrizione a caratteri del documento +TYPE=Bolla di vendita +// Dove sono le risorse per il documento +MSKFILE=BOLACQ +FRMFILE=VEBOL.FRM +// modifica +CAMPICALC=TOTMER|TOTPRE|SPESE|SPESIMB|SPESTRA|SPESINC|BOLLI|IMPONIBILI|IMPOSTE|TOTDOC|SCONTOD|SCONTOT|OMAGGI +CALCOLI=BASESCONTO +// Indica se il documento è indirizzato ad un cliente o ad un fornitore +TIPOCF=F + +[PROFILO] +// Si possono indicare, dopo il numero, PROMPT, HELP, WARNING cosi: +// 1|Prompt|Help|Warning + +// TIPOCF = S_NORMALE +// CODCF = S_OBBLIGATORIO +// RAGSOC = S_NORMALE +OCCASEDIT = S_NORMALE //100 +OCFPI = S_DISABILITATO //100 +COFI = S_NORMALE //100 +STATOPAIV = S_NORMALE //100 +PAIVA = S_NORMALE //100 +GOLEM = S_NORMALE //100 +GRRECAPITO = S_NORMALE //100 +INDCF = S_DISABILITATO //100 +CIVCF = S_DISABILITATO //100 +LOCALITACF = S_DISABILITATO //100 +CAPCF = S_DISABILITATO //100 +PROVCOM = S_DISABILITATO //100 +COMCF = S_DISABILITATO //100 +DENCOM = S_DISABILITATO //100 +STATOCF = S_DISABILITATO //100 +DESSTATOCF = S_DISABILITATO //100 +CODVAL1 = S_NORMALE //200 +CODVAL2 = S_NORMALE //200 +NOME_VAL1 = S_NORMALE //200 +NOME_VAL2 = S_NORMALE //200 +CAMBIO = S_NORMALE //200 +DATA_CAMBIO1 = S_NORMALE //200 +DATA_CAMBIO2 = S_NORMALE //200 +CODLIN = S_NASCOSTO //300 +DESLIN = S_NASCOSTO //300 +CODPAG = S_OBBLIGATORIO //400 +DESCODPAG = S_NORMALE //400 +GRSCADENZE = S_NORMALE //500 +DATAINSC = S_NORMALE //500 +DATASCAD1 = S_DISABILITATO //500 +DATASCAD2 = S_DISABILITATO //500 +DATASCAD3 = S_DISABILITATO //500 +DATASCAD4 = S_DISABILITATO //500 +DATASCAD5 = S_DISABILITATO //500 +CODABIA = S_OBBLIGATORIO //600 +CODCABA = S_OBBLIGATORIO //600 +DESBANAPP = S_NORMALE //600 +CODABIP = S_NORMALE //700 +CODCABP = S_NORMALE //700 +DESBANPRE = S_NORMALE //700 +CATVEN = S_NASCOSTO //800 +DESCATVEN = S_DISABILITATO //800 +CODLIST1 = S_NASCOSTO //800 +CODLIST2 = S_NASCOSTO //800 +DESLIST = S_DISABILITATO //800 +CODCONT1 = S_NASCOSTO //810 +CODCONT2 = S_NASCOSTO //810 +DESCONT = S_DISABILITATO //810 +CODCAMP = S_NASCOSTO //820 +DESCAMP = S_DISABILITATO //820 +SCONTOPERC = S_NORMALE //830 +GRINDSPED = S_NASCOSTO //900 +CODINDSP = S_NASCOSTO //900 +RAGSOCSP = S_DISABILITATO //900 +INDSP = S_DISABILITATO //900 +CIVSP = S_DISABILITATO //900 +LOCALITASP = S_DISABILITATO //900 +CAPSP = S_DISABILITATO //900 +COMSP = S_DISABILITATO //900 +DENCOMSP = S_DISABILITATO //900 +PROVCOMSP = S_DISABILITATO //900 +STATOSP = S_DISABILITATO //900 +DESSTATOSP = S_DISABILITATO //900 +DATADOCRIF = S_NORMALE //1000 +NUMDOCRIF = S_NOCHECK //1000 +CODAGVIS = S_NASCOSTO //1110 +DESAGVIS = S_NASCOSTO //1110 +CODAG = S_NASCOSTO //1100 +DESAG = S_NASCOSTO //1100 +CODZON = S_NASCOSTO //1100 +DESZON = S_NASCOSTO //1100 +CODSPMEZZO = S_NASCOSTO //1200 +DESSPMEZZO = S_NASCOSTO //1200 +CODPORTO = S_NASCOSTO //1210 +DESPORTO = S_NASCOSTO //1210 +CODNOTESP1 = S_NASCOSTO //1300 +DESNOTESP1 = S_NASCOSTO //1300 +CODNOTESP2 = S_NASCOSTO //1300 +DESNOTESP2 = S_NASCOSTO //1300 +CAUSTRASP = S_NASCOSTO //1400 +DENCAUSTRASP = S_NASCOSTO //1400 +CODVETT1 = S_NASCOSTO //1500 +CODVETT2 = S_NASCOSTO //1500 +CODVETT3 = S_NASCOSTO //1500 +NOMEVETT1 = S_NASCOSTO //1500 +NOMEVETT2 = S_NASCOSTO //1500 +NOMEVETT3 = S_NASCOSTO //1500 +NCOPIE = S_NASCOSTO //1600 +GRPARTENZA = S_NASCOSTO //1700 +DATAPART = S_NASCOSTO //1700 +ORAPART = S_NASCOSTO //1700 +IMPPAGATO = S_NASCOSTO //1800 +ACCSALDO = S_NASCOSTO //1800 +DOC1 = S_NASCOSTO //1900 +DOC2 = S_NASCOSTO //1900 +DOC3 = S_NASCOSTO //1900 +DATACONS = S_NASCOSTO //2000 +ASPBENI1 = S_NASCOSTO //2100 +DESCRBENI1 = S_NASCOSTO //2100 +ASPBENI2 = S_NASCOSTO //2100 +DESCRBENI2 = S_NASCOSTO //2100 +IMPNETTI = S_NORMALE //2200 +RAGGR = S_NORMALE //2300 +RAGGREFF = S_NORMALE //2300 +SPESEINC = S_NORMALE //2400 +ADDBOLLI = S_NORMALE //2400 +UMTARA = S_NASCOSTO //2710 +TARA = S_NASCOSTO //2710 +DESUMTARA = S_NASCOSTO //2710 +UMPNETTO = S_NASCOSTO //2700 +PNETTO = S_NASCOSTO //2700 +DESUMPNETTO = S_NASCOSTO //2700 +NCOLLI = S_NASCOSTO //2800 +CAUSMAG = S_OBBLIGATORIO //2900 +CAUSMAGC = S_DISABILITATO //2900 +DESCRMAG = S_NORMALE //2900 +DESCRMAGC = S_DISABILITATO //2900 +BLANK = S_DISABILITATO //4000 +CODNOTE = S_NASCOSTO //2500 +NOTECLI = S_NASCOSTO //2500 + + +[DEFAULT] +NDEFAULTS=1 +1=F_CAUSTRASP|VEN + +[SHEET] +NCOLS=18 +1=FR_CODMAG +2=FR_CODDEP +3=FR_CODART +4=FR_LIV1 +5=FR_LIV2 +6=FR_LIV3 +7=FR_LIV4 +8=FR_DESCR +9=FR_UMQTA +10=FR_QTA +11=FR_PREZZO +12=FR_SCONTO +13=FR_PERCPROV +14=FR_CODIVA +15=FR_ADDIVA +16=FR_CAUS +17=FR_CODMAGC +18=FR_CODDEPC + +[RIGHE] +NTIPIRIGA=9 +1=01 +2=02 +3=03 +4=04 +5=05 +6=06 +7=07 +8=08 +9=09 + +[HANDLERS] +NHANDLER=0 +1 = F_ORAPART|1 + +[PROFILOGRUPPO] +101 = S_NASCOSTO +100 = S_NORMALE +200 = S_NORMALE +300 = S_NASCOSTO +400 = S_NORMALE +500 = S_NORMALE +600 = S_NORMALE +700 = S_NORMALE +800 = S_NASCOSTO +810 = S_NASCOSTO +820 = S_NASCOSTO +830 = S_NASCOSTO +900 = S_NASCOSTO +1000 = S_NORMALE +1100 = S_NASCOSTO +1200 = S_NASCOSTO +1210 = S_NASCOSTO +1300 = S_NASCOSTO +1400 = S_NASCOSTO +1500 = S_NASCOSTO +1600 = S_NASCOSTO +1700 = S_NASCOSTO +1800 = S_NASCOSTO +1900 = S_NASCOSTO +2000 = S_NASCOSTO +2100 = S_NASCOSTO +2200 = S_NORMALE +2300 = S_NORMALE +2400 = S_NORMALE +2900 = S_NORMALE +4000 = S_NORMALE + +[ORDINEGRUPPI] +NGROUPS=11 +1=100 +2=200 +3=400 +4=500 +5=600 +6=700 +7=1000 +8=2300 +9=2200 +10=2400 +11=2900 + diff --git a/ve/bollac.src b/ve/bollac.src index 0341ba2a7..9f4fdf965 100755 --- a/ve/bollac.src +++ b/ve/bollac.src @@ -8,8 +8,9 @@ TYPE=Bolla di vendita // Dove sono le risorse per il documento // modifica -CAMPICALC=TOTMER|TOTPRE|SPESE|SPESINC|BOLLI|IMPONIBILI|IMPOSTE|TOTDOC|SCONTOD|SCONTOT|OMAGGI|PROVVD +CAMPICALC=TOTMER|TOTPRE|SPESE|SPESIMB|SPESTRA|SPESINC|BOLLI|IMPONIBILI|IMPOSTE|TOTDOC|SCONTOD|SCONTOT|OMAGGI|TOTPROVV CALCOLI=BASESCONTO +TOTPROVV= // Indica se il documento è indirizzato ad un cliente o ad un fornitore TIPOCF=C @@ -97,15 +98,15 @@ CODPORTO = S_NORMALE //1210 DESPORTO = S_NORMALE //1210 CODNOTESP1 = S_NORMALE //1300 DESNOTESP1 = S_NORMALE //1300 -CODNOTESP2 = S_NASCOSTO //1300 -DESNOTESP2 = S_NASCOSTO //1300 +CODNOTESP2 = S_NORMALE //1300 +DESNOTESP2 = S_NORMALE //1300 CAUSTRASP = S_OBBLIGATORIO //1400 DENCAUSTRASP = S_NORMALE //1400 CODVETT1 = S_NORMALE //1500 -CODVETT2 = S_NASCOSTO //1500 +CODVETT2 = S_NORMALE //1500 CODVETT3 = S_NASCOSTO //1500 NOMEVETT1 = S_NORMALE //1500 -NOMEVETT2 = S_NASCOSTO //1500 +NOMEVETT2 = S_NORMALE //1500 NOMEVETT3 = S_NASCOSTO //1500 NCOPIE = S_NASCOSTO //1600 GRPARTENZA = S_NORMALE //1700 diff --git a/ve/bollaf.src b/ve/bollaf.src index caa64d6b1..b348e955c 100755 --- a/ve/bollaf.src +++ b/ve/bollaf.src @@ -103,7 +103,7 @@ NDEFAULTS=1 1=F_CAUSTRASP|RES [SHEET] -NCOLS=14 +NCOLS=15 1=FR_CODMAG 2=FR_CODDEP 3=FR_CODART @@ -114,10 +114,11 @@ NCOLS=14 8=FR_DESCR 9=FR_UMQTA 10=FR_QTA -11=FR_CODIVA -12=FR_CAUS -13=FR_CODMAGC -14=FR_CODDEPC +11=FR_PREZZO +12=FR_CODIVA +13=FR_CAUS +14=FR_CODMAGC +15=FR_CODDEPC [RIGHE] NTIPIRIGA=1 diff --git a/ve/clifor.cpp b/ve/clifor.cpp index bd2ae676e..a0e2f94aa 100755 --- a/ve/clifor.cpp +++ b/ve/clifor.cpp @@ -1,24 +1,18 @@ #include "clifor.h" TOccasionale::TOccasionale() : TRectype(LF_OCCAS) -{ - _cod = new TRecfield(*this, OCC_CFPI); -} +{ } TOccasionale::TOccasionale(const TRectype& r) : TRectype(r) -{ - _cod = new TRecfield(*this, OCC_CFPI); -} +{ } -TRectype & TOccasionale::operator = (const TRectype& r) +TRectype& TOccasionale::operator = (const TRectype& r) { return TRectype::operator=(r); } TOccasionale::~TOccasionale() -{ - delete _cod; -} +{ } int TCli_for::write_rewrite(TBaseisamfile& f, bool re) const { diff --git a/ve/clifor.h b/ve/clifor.h index 38a321246..0918d5482 100755 --- a/ve/clifor.h +++ b/ve/clifor.h @@ -23,11 +23,9 @@ class TOccasionale : public TRectype { - TRecfield * _cod; - public: - const char * codice() const { return (const char *) *_cod;} - TRectype & operator = (const TRectype& r); + const char* codice() const { return get(OCC_CFPI); } + TRectype& operator = (const TRectype& r); TOccasionale(); TOccasionale(const TRectype& r); diff --git a/ve/f33.dir b/ve/f33.dir index 49e7cb211..53fdbe1a3 100755 --- a/ve/f33.dir +++ b/ve/f33.dir @@ -1,3 +1,3 @@ 33 0 -$doc|0|0|419|31|Documenti di vendita|NDOC|| +$doc|0|0|417|0|Documenti di vendita|NDOC*3|| diff --git a/ve/f33.trr b/ve/f33.trr index cfd81ca92..2386dfc64 100755 --- a/ve/f33.trr +++ b/ve/f33.trr @@ -11,6 +11,7 @@ TIPOCF|1|1|0|Tipo liente ornitore CODCF|3|6|0|Codice Cliente/Fornitore OCFPI|1|16|0|Codice Cliente/Fornitore occasionale OCCAS|8|1|0|Da cancellare, non più usato +ORDCF|3|6|0|Ordinato da (Cliente/Fornitore) CODVAL|1|3|0|Codice valuta CAMBIO|4|15|5|Cambio DATACAMBIO|5|8|0|Data cambio @@ -69,7 +70,6 @@ G1|11|10|0|Campo generale 1 DATAAGG|5|8|0|Data ultimo aggiornamento UTENTE|1|10|0|Utente ultimo aggiornamento COLL_GOLEM|11|10|0|Collegamento lista di GOLEM -DATACONS|5|8|0|Data di consegna DOCEVASO|8|1|0|Ordine evaso 3 PROVV+ANNO+CODNUM+NDOC| diff --git a/ve/f34.dir b/ve/f34.dir index aed017968..a4cb97146 100755 --- a/ve/f34.dir +++ b/ve/f34.dir @@ -1,3 +1,3 @@ 34 0 -$rdoc|10|10|391|31|Righe documenti di vendita|NDOC*3|| +$rdoc|0|0|409|0|Righe documenti di vendita|#33|| diff --git a/ve/f34.trr b/ve/f34.trr index d9b46ae34..413272055 100755 --- a/ve/f34.trr +++ b/ve/f34.trr @@ -1,5 +1,5 @@ 34 -43 +48 CODNUM|1|4|0|Codice Numeriazione ANNO|2|4|0|Anno PROVV|1|1|0|Tipo numerazione

rovvisoria efinitiva @@ -8,6 +8,7 @@ NRIGA|2|3|0|N. riga STATORIGA|1|1|0|Non usato TIPORIGA|1|3|0|Tipo riga GENERATA|8|1|0|Riga generata +GENTIPO|1|1|0|Tipo della riga generata(" "=spese, "C"=CONAI) CODMAG|1|5|0|Codice magazzino e deposito CODART|1|20|0|Codice articolo, codice spesa o codice prestazione CODARTMAG|1|20|0|(=CODART se codice articolo di magazzino, vuoto altrimenti) @@ -16,7 +17,7 @@ LIVELLO|1|15|0|Codice di giacenza DESCR|1|50|0|Descrizione DESCLUNGA|8|1|0|Descrizione estesa caricata DESCEST|11|10|0|Descrizione estesa -PREZZO|4|18|2|Prezzo o valore +PREZZO|4|18|3|Prezzo o valore UMQTA|1|2|0|Unita di misura QTA|4|13|5|Quantita' QTAEVASA|4|13|5|Quantita' evasa @@ -29,7 +30,7 @@ RIGAEVASA|8|1|0|Riga evasa TARA|4|15|2|Tara PNETTO|4|15|2|Peso netto NCOLLI|3|7|0|N.colli -DAEVADERE|8|1|0|???? +DATACONS|5|8|0|Data di consegna SCONTO|1|25|0|Sconto PERCPROV|4|5|2|Percentuale di provvigione IMPFISSO|4|18|2|Importo fisso di provvigione @@ -38,10 +39,14 @@ CODIVA|1|4|0|Codice IVA ADDIVA|8|1|0|Addebito IVA ASPBENI|1|2|0|Aspetto dei beni PSPESA|4|5|2|Percentuale di spesa -CAUSMAG|1|4|0|Causale di magazzino +CAUSMAG|1|5|0|Causale di magazzino MOVMAG|3|7|0|Numero di movimento id magazzino CODMAGC|1|5|0|Codice di magazzino per causale collegata IMPIANTO|1|5|0|Codice impianto di produzione per MRP LINEA|1|5|0|Codice linea di produzione MRP +DACODNUM|1|4|0|Numerazione del documento originale +DAANNO|2|4|0|Anno del documento originale +DAPROVV|1|1|0|Provvisorieta' del documento originale +DANDOC|3|7|0|Numero del documento originale 1 CODNUM+ANNO+PROVV+NDOC+NRIGA| diff --git a/ve/f47.dir b/ve/f47.dir index 8b9793399..cffe58996 100755 --- a/ve/f47.dir +++ b/ve/f47.dir @@ -1,3 +1,3 @@ 47 0 -$anamag|0|0|388|0|Anagrafica di magazzino|NART|| +$anamag|0|0|751|0|Anagrafica di magazzino|NART|| diff --git a/ve/f47.trr b/ve/f47.trr index 627b10eb6..a84270e5c 100755 --- a/ve/f47.trr +++ b/ve/f47.trr @@ -1,5 +1,5 @@ 47 -41 +65 CODART|1|20|0|Codice Articolo DESCR|1|50|0|Descrizione DESCRAGG|11|10|0|Descrizione aggiuntiva @@ -27,20 +27,44 @@ CODFORN|3|6|0|Codice fornitore abituale ARTPROD|8|1|0|Articolo di produzione PPCONF|4|15|5|Pezzi per confezione PPCOLLO|4|15|5|Pezzi per collo -RIORDINO|1|1|0|Ordina a

unto di riordino, abbisogno -CODIVAR|1|4|0|Cocide IVA ridotta +RIORDINO|1|1|0|Ordina a

unto di riordino, abbisogno (MRP), empo +LOTTORIOR|4|15|3|Lotto minimo di riordino +LOTTOIRIOR|4|15|3|Lotto incrementale di riordino +CODIVAR|1|4|0|Codice IVA ridotta TARA|4|15|5|Tara SCONTO|1|25|0|Sconto PERCPROVV|4|5|2|Provvigione DULTCOS1|5|8|0|Data ultimo costo 1 * ULTCOS1|4|15|5|Ultimo costo 1 * +NUMREG1|3|7|0|Num. reg. movimento che ha generato l'ultimo costo +NUMRIG1|2|4|0|Num. riga movimento che ha generato l'ultimo costo DULTCOS2|5|8|0|Data ultimo costo 2 * ULTCOS2|4|15|5|Ultimo costo 2 * +NUMREG2|3|7|0|Num. reg. movimento che ha generato il penultimo costo +NUMRIG2|2|4|0|Num. riga movimento che ha generato il penultimo costo MASSANUN|4|10|3|Massa netta unitaria * UNSUPPUN|4|10|3|Unita' supplementare * +VALSTATUN|4|15|5|Valore statistico unitario PROV|1|5|0|Provincia di origine * +PAESE|1|5|0|Paese di origine * GOLEM|11|10|0|Lista golem -LEADTIME|2|4|0|Giorni lavorativi di lead time per MRP +LEADTIME|4|5|1|Giorni di riordino (lead time per MRP) +CONACC|4|15|5|Peso acciaio (Kg) per CONAI +CONALL|4|15|5|Peso alluminio (Kg) per CONAI +CONCAR|4|15|5|Peso Carta (Kg) per CONAI +CONPLA|4|15|5|Peso Plastica (Kg) per CONAI +CONLEG|4|15|5|Peso Legno (Kg) per CONAI +CONVET|4|15|5|Peso Vetro (Kg) per CONAI +USER1|1|20|0|Campo libero 1 +USER2|1|20|0|Campo libero 2 +USER3|1|20|0|Campo libero 3 +USER4|1|20|0|Campo libero 4 +USER5|1|20|0|Campo libero 5 +USER6|1|20|0|Campo libero 6 +USER7|1|20|0|Campo libero 7 +USER8|1|20|0|Campo libero 8 +USER9|1|20|0|Campo libero 9 +USER10|1|20|0|Campo libero 10 3 CODART| UPPER(DESCR)|X diff --git a/ve/fatacq.src b/ve/fatacq.src new file mode 100755 index 000000000..dfcb4cae5 --- /dev/null +++ b/ve/fatacq.src @@ -0,0 +1,184 @@ +#include "veini.h" +#include "veuml.h" +#include "verig.h" + +[MAIN] +// Descrizione a caratteri del documento +TYPE=Fattura di aquisto +// Dove sono le risorse per il documento +MSKFILE=fatacq +FRMFILE=VEFAT.FRM +// modifica +CAMPICALC=TOTMER|TOTPRE|SPESE|SPESINC|SPESIMB|SPESTRA|BOLLI|IMPONIBILI|IMPOSTE|TOTDOC|SCONTOD|SCONTOT|OMAGGI|PROVVD +CALCOLI=BASESCONTO +TOTPROVV = +// modifica +// Indica se il documento è indirizzato ad un cliente o ad un fornitore +TIPOCF=F + +[PROFILO] +// Si possono indicare, dopo il numero, PROMPT, HELP, WARNING cosi: +// 1|Prompt|Help|Warning + +OCCASEDIT = S_NORMALE //100 +OCFPI = S_DISABILITATO //100 +COFI = S_NORMALE //100 +STATOPAIV = S_NORMALE //100 +PAIVA = S_NORMALE //100 +GOLEM = S_NORMALE +GRRECAPITO = S_NORMALE //100 +INDCF = S_DISABILITATO //100 +CIVCF = S_DISABILITATO //100 +LOCALITACF = S_DISABILITATO //100 +CAPCF = S_DISABILITATO //100 +PROVCOM = S_DISABILITATO //100 +COMCF = S_DISABILITATO //100 +DENCOM = S_DISABILITATO //100 +STATOCF = S_DISABILITATO //100 +DESSTATOCF = S_DISABILITATO //100 +CODVAL1 = S_NORMALE //200 +CODVAL2 = S_NORMALE //200 +NOME_VAL1 = S_NORMALE //200 +NOME_VAL2 = S_NORMALE //200 +CAMBIO = S_NORMALE //200 +DATA_CAMBIO1 = S_NORMALE //200 +DATA_CAMBIO2 = S_NORMALE //200 +CODLIN = S_NORMALE //300 +DESLIN = S_NORMALE //300 +CODPAG = S_OBBLIGATORIO //400 +DESCODPAG = S_NORMALE //400 +GRSCADENZE = S_NORMALE //500 +DATAINSC = S_NORMALE //500 +DATASCAD1 = S_DISABILITATO //500 +DATASCAD2 = S_DISABILITATO //500 +DATASCAD3 = S_DISABILITATO //500 +DATASCAD4 = S_DISABILITATO //500 +DATASCAD5 = S_DISABILITATO //500 +CODABIA = S_OBBLIGATORIO //600 +CODCABA = S_OBBLIGATORIO //600 +DESBANAPP = S_NORMALE //600 +CODABIP = S_NORMALE //700 +CODCABP = S_NORMALE //700 +DESBANPRE = S_NORMALE //700 +CATVEN = S_NORMALE //800 +DESCATVEN = S_DISABILITATO //800 +CODLIST1 = S_NORMALE //800 +CODLIST2 = S_NORMALE //800 +DESLIST = S_DISABILITATO //800 +CODCONT1 = S_NORMALE //810 +CODCONT2 = S_NORMALE //810 +DESCONT = S_DISABILITATO //810 +CODCAMP = S_NORMALE //820 +DESCAMP = S_DISABILITATO //820 +SCONTOPERC = S_NORMALE //830 +DATADOCRIF = S_NORMALE //1000 +NUMDOCRIF = S_NOCHECK //1000 +CODAG = S_NORMALE //1100 +DESAG = S_NORMALE //1100 +CODZON = S_NORMALE //1100 +DESZON = S_NORMALE //1100 +CODPORTO = S_NORMALE //1210 +DESPORTO = S_NORMALE //1210 +CAUSTRASP = S_NORMALE //1400 +DENCAUSTRASP = S_NORMALE //1400 +CODVETT1 = S_NORMALE //1500 +CODVETT2 = S_NASCOSTO //1500 +CODVETT3 = S_NASCOSTO //1500 +NOMEVETT1 = S_NORMALE //1500 +NOMEVETT2 = S_NASCOSTO //1500 +NOMEVETT3 = S_NASCOSTO //1500 +NCOPIE = S_NASCOSTO //1600 +IMPPAGATO = S_NORMALE //1800 +ACCSALDO = S_NORMALE //1800 +DOC1 = S_NASCOSTO //1900 +DOC2 = S_NASCOSTO //1900 +DOC3 = S_NASCOSTO //1900 +IMPNETTI = S_NORMALE //2200 +RAGGREFF = S_NORMALE //2300 +SPESEINC = S_NORMALE //2400 +ADDBOLLI = S_NORMALE //2500 +BLANK = S_DISABILITATO //4000 +CAUSMAG = S_OBBLIGATORIO //2900 +CAUSMAGC = S_DISABILITATO //2900 +DESCRMAG = S_NORMALE //2900 +DESCRMAGC = S_DISABILITATO //2900 + +[DEFAULT] +NDEFAULTS=0 + +[SHEET] +NCOLS=18 +1=FR_CODMAG +2=FR_CODDEP +3=FR_CODART +4=FR_LIV1 +5=FR_LIV2 +6=FR_LIV3 +7=FR_LIV4 +8=FR_DESCR +9=FR_UMQTA +10=FR_QTA +11=FR_PREZZO +12=FR_SCONTO +13=FR_PERCPROV +14=FR_CODIVA +15=FR_ADDIVA +16=FR_CAUS +17=FR_CODMAGC +18=FR_CODDEPC + +[RIGHE] +NTIPIRIGA=9 +1=01 +2=02 +3=03 +4=04 +5=05 +6=06 +7=07 +8=08 +9=09 + +[HANDLERS] +NHANDLER=0 + +[PROFILOGRUPPO] +101 = S_NASCOSTO +100 = S_NORMALE +200 = S_NORMALE +300 = S_NORMALE +400 = S_NORMALE +500 = S_NORMALE +600 = S_NORMALE +700 = S_NORMALE +800 = S_NORMALE +810 = S_NORMALE +820 = S_NORMALE +830 = S_NORMALE +1000 = S_NORMALE +1100 = S_NORMALE +1210 = S_NORMALE +1400 = S_NORMALE +1500 = S_NORMALE +1600 = S_NASCOSTO +1800 = S_NORMALE +1900 = S_NORMALE +2200 = S_NORMALE +2300 = S_NORMALE +2400 = S_NORMALE +2900 = S_NORMALE +4000 = S_NORMALE + +[ORDINEGRUPPI] +NGROUPS=10 +1=1000 +2=100 +3=400 +4=500 +5=600 +6=700 +7=830 +8=1400 +9=1900 +10=2900 + diff --git a/ve/fatturac.src b/ve/fatturac.src index 07e38d58c..53e7827e1 100755 --- a/ve/fatturac.src +++ b/ve/fatturac.src @@ -5,13 +5,10 @@ [MAIN] // Descrizione a caratteri del documento TYPE=Fattura di vendita -// Dove sono le risorse per il documento -MSKFILE=FATTURAC -FRMFILE=FATTURAC.FRM // modifica -CAMPICALC=TOTMER|TOTPRE|SPESE|SPESINC|BOLLI|IMPONIBILI|IMPOSTE|TOTDOC|SCONTOD|SCONTOT|OMAGGI|PROVVD +CAMPICALC=TOTMER|TOTPRE|SPESE|SPESINC|SPESIMB|SPESTRA|BOLLI|IMPONIBILI|IMPOSTE|TOTDOC|SCONTOD|SCONTOT|OMAGGI|TOTPROVV CALCOLI=BASESCONTO -TOTPROVV = PROVVD +TOTPROVV = // modifica // Indica se il documento è indirizzato ad un cliente o ad un fornitore TIPOCF=C @@ -71,14 +68,32 @@ DESCONT = S_DISABILITATO //810 CODCAMP = S_NORMALE //820 DESCAMP = S_DISABILITATO //820 SCONTOPERC = S_NORMALE //830 +GRINDSPED = S_NORMALE //900 +CODINDSP = S_NORMALE //900 +RAGSOCSP = S_DISABILITATO //900 +INDSP = S_DISABILITATO //900 +CIVSP = S_DISABILITATO //900 +LOCALITASP = S_DISABILITATO //900 +CAPSP = S_DISABILITATO //900 +COMSP = S_DISABILITATO //900 +DENCOMSP = S_DISABILITATO //900 +PROVCOMSP = S_DISABILITATO //900 +STATOSP = S_DISABILITATO //900 +DESSTATOSP = S_DISABILITATO //900 DATADOCRIF = S_NORMALE //1000 -NUMDOCRIF = S_NORMALE //1000 +NUMDOCRIF = S_NOCHECK //1000 CODAG = S_NORMALE //1100 DESAG = S_NORMALE //1100 CODZON = S_NORMALE //1100 DESZON = S_NORMALE //1100 +CODSPMEZZO = S_NORMALE //1200 +DESSPMEZZO = S_NORMALE //1200 CODPORTO = S_NORMALE //1210 DESPORTO = S_NORMALE //1210 +CODNOTESP1 = S_NORMALE //1300 +DESNOTESP1 = S_NORMALE //1300 +CODNOTESP2 = S_NORMALE //1300 +DESNOTESP2 = S_NORMALE //1300 CAUSTRASP = S_NORMALE //1400 DENCAUSTRASP = S_NORMALE //1400 CODVETT1 = S_NORMALE //1500 @@ -157,9 +172,12 @@ NHANDLER=0 810 = S_NORMALE 820 = S_NORMALE 830 = S_NORMALE +900 = S_NORMALE 1000 = S_NORMALE 1100 = S_NORMALE +1200 = S_NORMALE 1210 = S_NORMALE +1300 = S_NORMALE 1400 = S_NORMALE 1500 = S_NORMALE 1600 = S_NASCOSTO @@ -173,7 +191,7 @@ NHANDLER=0 4000 = S_NORMALE [ORDINEGRUPPI] -NGROUPS=22 +NGROUPS=25 1=100 2=2500 3=200 @@ -188,12 +206,15 @@ NGROUPS=22 12=810 13=820 14=830 -15=1100 -16=1210 -17=1400 -18=1800 -19=1900 -20=2200 -21=1000 -22=2900 +15=900 +16=1100 +17=1200 +18=1210 +19=1300 +20=1400 +21=1800 +22=1900 +23=2200 +24=1000 +25=2900 diff --git a/ve/listadoc.frm b/ve/listadoc.frm index 195833a5f..8380e1b14 100755 --- a/ve/listadoc.frm +++ b/ve/listadoc.frm @@ -1,6 +1,11 @@ +// Form di stampa lista documenti + USE LF_DOC JOIN LF_RIGHEDOC TO LF_DOC INTO CODNUM==CODNUM ANNO==ANNO PROVV==PROVV NDOC==NDOC -JOIN %TIP TO LF_DOC INTO CODTAB==TIPODOC +JOIN LF_AGENTI TO LF_DOC INTO CODAGE==CODAG +JOIN %TIP TO LF_DOC ALIAS 201 INTO CODTAB==TIPODOC +JOIN %CPG TO LF_DOC ALIAS 202 INTO CODTAB==CODPAG +JOIN %BAN TO LF_DOC ALIAS 203 INTO CODTAB==CODABIA+CODCABA END DESCRIPTION @@ -15,6 +20,13 @@ BEGIN OFFSET 0 0 END +SECTION GRAPHICS ODD 4 + FIGURA 1 1 1 + BEGIN + PROMPT 1 1 "" + END +END + SECTION HEADER ODD 6 STRINGA 1 40 1 @@ -34,296 +46,607 @@ END NUMERO 3 7 BEGIN KEY "Nr. pagina" - PROMPT 137 1 "Pagina " + PROMPT 140 1 "Pagina " MESSAGE _PAGENO END STRINGA 4 25 BEGIN KEY "Intestazione stampa" - PROMPT 45 2 "Stampa lista documenti" + PROMPT 50 2 "Stampa lista documenti" +END + +STRINGA 5 157 +BEGIN + KEY "Separatore" + PROMPT 1 3 "" + MESSAGE _SEPARATOR,157 +END + +STRINGA 6 12 +BEGIN + KEY "Intestazione 1" + PROMPT 1 4 "Cod.num/Tipo" +END + +STRINGA 7 10 +BEGIN + KEY "Intestazione 2" + PROMPT 14 4 "Data doc." +END + +STRINGA 8 8 +BEGIN + KEY "Intestazione 3" + PROMPT 25 4 "Nr. doc." +END + +STRINGA 9 5 +BEGIN + KET "Intestazione 4" + PROMPT 34 4 "Stato" +END + +STRINGA 10 8 +BEGIN + KEY "Intestazione 5" + PROMPT 40 4 "Cod. C/F" +END + +STRINGA 11 30 +BEGIN + KEY "Intestazione 6" + PROMPT 49 4 "Ragione sociale" +END + +STRINGA 12 15 +BEGIN + KEY "Intestazione 7" + PROMPT 80 4 "% Sconto" +END + +STRINGA 13 30 +BEGIN + KEY "Intestazione 8" + PROMPT 96 4 "Cod. Agente" +END + +STRINGA 14 30 +BEGIN + KEY "Intestazione 9" + PROMPT 127 4 "Cod. Pagamento" +END + +STRINGA 11 157 +BEGIN + KEY "Separatore" + PROMPT 1 5 "" + MESSAGE _SEPARATOR,157 END END // HEADER -SECTION BODY ODD 2 COLUMNWISE +SECTION BODY ODD 6 -STRINGA 11 9 +STRINGA 1 4 BEGIN - SPECIAL STRINGA INTESTAZIONE "Cod. num." "Codice numerazione" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" - KEY "Codice numerazione" - PROMPT 1 1 "" - FIELD 33->CODNUM + KEY "Estremi cod. num." + PROMPT 1 1 "@B" + FIELD LF_DOC->CODNUM END -STRINGA 12 9 +STRINGA 2 BEGIN - SPECIAL STRINGA INTESTAZIONE "Tipo doc." "Tipo documento" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" - KEY "Tipo documento" - PROMPT 2 1 "" - FIELD %TIP->S0 + KEY "Estremi tipo doc." + PROMPT 5 1 "/" + FIELD LF_DOC->TIPODOC END -NUMERO 13 8 +DATA 3 10 +BEGIN + KEY "Data documento" + PROMPT 14 1 "" + FIELD 33->DATADOC +END + +NUMERO 4 8 BEGIN SPECIAL STRINGA INTESTAZIONE "Num.doc." "Numero documento" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Numero documento" - PROMPT 3 1 "" + PROMPT 25 1 "" FIELD 33->NDOC PICTURE "#######" END -DATA 14 10 +STRINGA 5 15 BEGIN - SPECIAL STRINGA INTESTAZIONE "Data doc." "Data documento" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" - KEY "Data documento" - PROMPT 4 1 "" - FILED 33->DATADOC -END - -NUMERO 15 7 -BEGIN - SPECIAL STRINGA INTESTAZIONE "" "Codice cliente/fornitore" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "X " "Fincatura sinistra e destra" - KEY "Codice cliente/fornitore" - PROMPT 5 1 "" - FIELD 33->CODCF - PICTURE "#######" -END - -STRINGA 16 25 2 -BEGIN - SPECIAL STRINGA INTESTAZIONE "Ragione sociale" "Ragione sociale" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA " X" "Fincatura sinistra e destra" - KEY "Ragione sociale" - PROMPT 6 1 "" - MESSAGE _CLIENTE,!RAGSOC -END - -STRINGA 17 5 -BEGIN - SPECIAL STRINGA INTESTAZIONE "Stato" "Stato documento" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Stato documento" - PROMPT 7 1 "" + PROMPT 36 1 "@R" FIELD 33->STATO END -STRINGA 18 4 +NUMERO 6 7 BEGIN - SPECIAL STRINGA INTESTAZIONE "Val." "Codice valuta" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" - KEY "Cod. Valuta" - PROMPT 8 1 "" - FIELD 33->CODVAL - MESSAGE COPY,10@|_EDITPICTURE,19,20,21,22 + KEY "Codice C/F" + PROMPT 41 1 "" + PICTURE "#######" + FIELD 33->CODCF END -NUMBER 19 15 +STRINGA 7 30 BEGIN - SPECIAL STRINGA INTESTAZIONE "Tot. Imponibile" "Totale imponibile" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" - KEY "Totale imponibile (con spese)" - PROMPT 9 1 "" - MESSAGE _TOTIMPONIBILI,0|COPY,40 - PICTURE "###.###.###.###" + KEY "Ragione sociale" + PROMPT 49 1 "" + MESSAGE _CLIENTE,!RAGSOC END -NUMBER 20 15 +STRINGA 8 15 BEGIN - SPECIAL STRINGA INTESTAZIONE "@CSpese" "Spese" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" - KEY "Spese" - PROMPT 10 1 "" - PICTURE "###.###.###.###" - FIELD TOTSPE - MESSAGE COPY,41 + KEY "Sconto" + PROMPT 80 1 "" + FIELD 33->SCONTOPERC END -NUMBER 21 15 +STRINGA 9 30 BEGIN - SPECIAL STRINGA INTESTAZIONE "@CIVA" "IVA" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" - KEY "Totale imposte" - PROMPT 11 1 "" - FIELD IMPOSTE - MESSAGE COPY,42 - PICTURE "###.###.###.###" + KEY "Agente" + PROMPT 96 1 "" + MESSAGE _STREXPR,33->CODAG+" "+LF_AGENTI->RAGSOC END -NUMBER 22 15 +STRINGA 10 30 BEGIN - SPECIAL STRINGA INTESTAZIONE "Tot. documento" "Totale documento" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" - KEY "Totale documento" - PROMPT 12 1 "" - FIELD TOTDOC - PICTURE "###.###.###.###" - MESSAGE COPY,43 + KEY "Cod. pagamento" + PROMPT 127 1 "" + MESSAGE _STREXPR,33->CODPAG+" "+202@->S0 END -NUMBER 40 15 +STRINGA 11 15 BEGIN - KEY "Hidden field for computing tot imponibili" - FLAGS "H" - PROMPT 9 1 "" - MESSAGE _NUMEXPR,IF(33->CAMBIO!=0;#40*33->CAMBIO;#40) - MESSAGE ADD,FL->52 + KEY "Valuta" + PROMPT 14 2 "Cod. Valuta " + FIELD 33->CODVAL + MESSAGE _EDITPICTURE,22,24,25,27,28,29,31,32,34 END -NUMBER 41 15 +NUMERO 12 18 BEGIN - KEY "Hidden field for computing tot spese" - PROMPT 10 1 "" - MESSAGE _NUMEXPR,IF(33->CAMBIO!=0;#41*33->CAMBIO;#41) - MESSAGE ADD,FL->53 - FLAGS "H" + KEY "Cambio" + PROMPT 30 2 "Cambio " + FIELD 33->CAMBIO + PICTURE "####,@@@@@" END -NUMBER 42 15 +STRINGA 13 80 BEGIN - KEY "Hidden field for computing tot imposte" - PROMPT 11 1 "" - MESSAGE _NUMEXPR,IF(33->CAMBIO!=0;#42*33->CAMBIO;#42) - MESSAGE ADD,FL->54 - FLAGS "H" + KEY "Banca d'appoggio" + PROMPT 49 2 "" + MESSAGE _STREXPR,"Banca App. "+33->CODABIA+"/"+33->CODCABA+" "+203@->S0 END -NUMBER 43 15 +NUMERO 14 15 BEGIN - KEY "Hidden field for computing tot documento" - PROMPT 12 1 "" - MESSAGE _NUMEXPR,IF(33->CAMBIO!=0;#43*33->CAMBIO;#43) - MESSAGE ADD,FL->55 - FLAGS "H" + PROMPT 120 2 "" + FLAGS "H" + FIELD TOTDOC + MESSAGE COPY,36|COPY,28 END -SECTION RIGHE 2 0 1 FILE LF_RIGHEDOC +NUMERO 15 15 +BEGIN + PROMPT 120 2 "" + FLAGS "H" + MESSAGE _TOTIMPONIBILI,0 + MESSAGE COPY,37 +END + +SECTION H_RIGHE 3 0 2 GROUP + FLAGS "D" + STRINGA 1 20 + BEGIN + PROMPT 1 1 "Codice articolo" + END + + STRINGA 2 35 + BEGIN + PROMPT 23 1 "Descrizione" + END + + STRINGA 3 4 + BEGIN + PROMPT 59 1 "UM" + END + + STRINGA 4 15 + BEGIN + PROMPT 71 1 "Quantita" + END + + STRINGA 5 15 + BEGIN + PROMPT 89 1 "Prezzo" + END + + STRINGA 16 15 + BEGIN + PROMPT 104 1 "Importo" + END + + STRINGA 17 15 + BEGIN + PROMPT 115 1 "% Sconto" + END + + STRINGA 18 7 + BEGIN + PROMPT 130 1 "% Prov" + END + + STRINGA 19 20 + BEGIN + PROMPT 137 1 "Val. provvigioni" + END + + STRINGA 20 157 + BEGIN + KEY "Separatore" + PROMPT 1 2 "" + MESSAGE _SEPARATOR,157 + END +END + +SECTION RIGHE 3 1 1 FILE LF_RIGHEDOC FLAGS "D" - STRINGA 1 9 + STRINGA 1 20 BEGIN PROMPT 1 1 "" + FIELD LF_RIGHEDOC->CODART + MESSAGE _EDITPICTURE,5,6,9 END - STRINGA 2 9 + STRINGA 2 35 BEGIN - PROMPT 2 1 "" - END - - NUMERO 3 8 - BEGIN - PROMPT 3 1 "" - END - - DATA 4 10 - BEGIN - PROMPT 4 1 "" - END - - NUMERO 5 7 - BEGIN - PROMPT 5 1 "" - END - - STRINGA 6 25 - BEGIN - PROMPT 6 1 "" + PROMPT 23 1 "" FIELD LF_RIGHEDOC->DESCR END - - STRINGA 7 5 - BEGIN - PROMPT 7 1 "" - GROUP 10 - FLAGS "H" - MESSAGE _EDITPICTURE,10,12 - END - - STRINGA 8 5 + STRINGA 3 4 BEGIN - PROMPT 7 1 "" - END - - STRINGA 9 4 - BEGIN - PROMPT 8 1 "" + PROMPT 59 1 "" FIELD LF_RIGHEDOC->UMQTA END - NUMBER 10 15 + NUMERO 4 15 BEGIN - PROMPT 9 1 "" - FIELD 34->IMPNN - PICTURE "###.###.###.###" - END - - NUMBER 11 15 - BEGIN - PROMPT 10 1 "" + PROMPT 64 1 "" + FIELD LF_RIGHEDOC->QTA + PICTURE "#########,@@@@@" END - NUMBER 12 15 + NUMERO 5 15 BEGIN - PROMPT 11 1 "" - FIELD LF_RIGHEDOC->IMPOSTA - PICTURE "###.###.###.###" + PROMPT 84 1 "" + FIELD LF_RIGHEDOC->PREZZO + PICTURE "###.###.###" END + + NUMERO 6 15 + BEGIN + PROMPT 100 1 "" + FIELD LF_RIGHEDOC->IMPNN + PICTURE "###.###.###" + END + + STRINGA 7 15 + BEGIN + PROMPT 115 1 "" + FIELD LF_RIGHEDOC->SCONTO + END + + NUMERO 8 6 + BEGIN + PROMPT 130 1 "" + FIELD LF_RIGHEDOC->PERCPROV + PICTURE "###,@@" + END + + NUMERO 9 15 + BEGIN + PROMPT 142 1 "" + FIELD LF_RIGHEDOC->PROVVR + PICTURE "###.###.###" + END +END // SECTION RIGHE + +STRINGA 16 113 +BEGIN + KEY "Separatore Totale documento" + PROMPT 23 3 "" + MESSAGE _SEPARATOR,113 +END + +STRINGA 17 18 +BEGIN + KEY "Intestazione Imponibile IVA (1 colonna)" + PROMPT 23 4 "Imponibile IVA" +END + +STRINGA 18 18 +BEGIN + KEY "Intestazione Imposta (1 colonna)" + PROMPT 53 4 "Imposta" +END + +STRINGA 19 18 +BEGIN + KEY "Intestazione Imponibile IVA (2 colonna)" + PROMPT 75 4 "Imponibile IVA" +END + +STRINGA 20 18 +BEGIN + KEY "Intestazione Imposta (2 colonna)" + PROMPT 106 4 "Imposta" +END + +STRINGA 21 18 +BEGIN + KEY "Intestazione Totale documento" + PROMPT 122 4 "@BTot. documento" +END + +// Tabella riepilogativa imponibili per codice IVA + +NUMBER 22 18 +BEGIN + KEY "Imponibile 1" + PROMPT 26 5 "" + MESSAGE _RIEPILOGOIVA,1,IMP,0 + PICTURE "###.###.###" +END + +STRING 23 4 +BEGIN + KEY "Codice iva 1" + PROMPT 44 5 "" + MESSAGE _RIEPILOGOIVA,1,COD,0 +END + +NUMBER 24 18 +BEGIN + KEY "Imposta 1" + PROMPT 49 5 "" + MESSAGE _RIEPILOGOIVA,1,IVA,1 + PICTURE "###.###.###" +END + +NUMBER 25 18 +BEGIN + KEY "Imponibile 2" + PROMPT 78 5 "" + MESSAGE _RIEPILOGOIVA,1,IMP,0 + PICTURE "###.###.###" +END + +STRING 26 4 +BEGIN + KEY "Codice iva 2" + PROMPT 97 5 "" + MESSAGE _RIEPILOGOIVA,1,COD,0 +END + +NUMBER 27 18 +BEGIN + KEY "Imposta 2" + PROMPT 102 5 "" + MESSAGE _RIEPILOGOIVA,1,IVA,1 + PICTURE "###.###.###" +END + +NUMBER 28 18 +BEGIN + KEY "Totale documento" + PROMPT 121 5 "@B" + PICTURE "###.###.###.###" +END + +NUMBER 29 18 +BEGIN + KEY "Imponibile 3" + PROMPT 25 6 "" + MESSAGE _RIEPILOGOIVA,1,IMP,0 + PICTURE "###.###.###" +END + +STRING 30 4 +BEGIN + KEY "Codice iva 3" + PROMPT 44 6 "" + MESSAGE _RIEPILOGOIVA,1,COD,0 +END + +NUMBER 31 18 +BEGIN + KEY "Imposta 3" + PROMPT 49 6 "" + MESSAGE _RIEPILOGOIVA,1,IVA,1 + PICTURE "###.###.###" +END + +NUMBER 32 18 +BEGIN + KEY "Imponibile 4" + PROMPT 78 6 "" + MESSAGE _RIEPILOGOIVA,1,IMP,0 + PICTURE "###.###.###" +END + +STRING 33 4 +BEGIN + KEY "Codice iva 4" + PROMPT 97 6 "" + MESSAGE _RIEPILOGOIVA,1,COD,0 +END + +NUMBER 34 18 +BEGIN + KEY "Imposta 4" + PROMPT 102 6 "" + MESSAGE _RIEPILOGOIVA,1,IVA,1 + PICTURE "###.###.###" +END + +NUMERO 35 1 +BEGIN + KEY "Flag per Calcolo totali in Lire (moltiplica per il cambio)" + PROMPT 1 7 "" + FLAGS "H" +END + +NUMBER 36 15 +BEGIN + KEY "Campo nascosto per il calcolo Totale documenti" + PROMPT 1 7 "" + MESSAGE _NUMEXPR,IF(((#12!=0)&&(#35==1));#36*#12;#36) + MESSAGE ADD,FL->16|_LISTADOC,STORE,#1 + FLAGS "H" +END + +NUMBER 37 15 +BEGIN + KEY "Campo nascosto per il calcolo Totale imponibili" + PROMPT 40 7 "" + MESSAGE _NUMEXPR,IF(((#12!=0)&&(#35==1));#37*#12;#37) + MESSAGE ADD,FL->17 + FLAGS "H" END END //BODY -SECTION FOOTER LAST 3 - -STRINGA 51 25 -BEGIN - KEY "Totale" - PROMPT 60 1 "@BTotale" +SECTION FOOTER ODD 3 END -NUMBER 52 15 +SECTION FOOTER LAST 11 + +STRINGA 1 130 BEGIN - KEY "Totale imponibili" - PROMPT 84 1 "" + KEY "Separatore Totali" + PROMPT 1 1 "" + MESSAGE _SEPARATOR,130 +END + +STRINGA 2 25 +BEGIN + KEY "TOTALI" + PROMPT 1 2 "TOTALI" +END + +STRINGA 3 20 +BEGIN + KEY "Cod numerazione" + PROMPT 25 2 "COD. NUMERAZIONE" +END + +STRINGA 4 18 +BEGIN + KEY "Totale Documenti" + PROMPT 64 2 "TOTALE DOCUMENTI" +END + +STRING 5 4 +BEGIN + KEY "Cod. numerazione 1" + PROMPT 25 3 "" + MESSAGE _LISTADOC,CODICE,1 +END + +NUMERO 6 18 +BEGIN + KEY "Tot. Cod. numerazione 1" + PROMPT 65 3 "" + MESSAGE _LISTADOC,TOTALE,1 PICTURE "###.###.###.###" END -NUMBER 53 15 +STRING 7 4 BEGIN - KEY "Totale Spese" - PROMPT 100 1 "" + KEY "Cod. numerazione 2" + PROMPT 25 4 "" + MESSAGE _LISTADOC,CODICE,2 +END + +NUMERO 8 18 +BEGIN + KEY "Tot. Cod. numerazione 2" + PROMPT 65 4 "" + MESSAGE _LISTADOC,TOTALE,2 PICTURE "###.###.###.###" END -NUMBER 54 15 +STRING 9 4 BEGIN - KEY "Totale imposte" - PROMPT 116 1 "" + KEY "Cod. numerazione 3" + PROMPT 25 5 "" + MESSAGE _LISTADOC,CODICE,3 +END + +NUMERO 10 18 +BEGIN + KEY "Tot. Cod. numerazione 3" + PROMPT 65 5 "" + MESSAGE _LISTADOC,TOTALE,3 PICTURE "###.###.###.###" END -NUMBER 55 15 +STRING 11 4 BEGIN - KEY "Totale documenti" - PROMPT 132 1 "" + KEY "Cod. numerazione 4" + PROMPT 25 6 "" + MESSAGE _LISTADOC,CODICE,4 +END + +NUMERO 12 18 +BEGIN + KEY "Tot. Cod. numerazione 4" + PROMPT 65 7 "" + MESSAGE _LISTADOC,TOTALE,4 + PICTURE "###.###.###.###" +END + +STRINGA 13 55 +BEGIN + KEY "Separatore Totali Generali" + PROMPT 25 8 "" + MESSAGE _SEPARATOR,55 +END + +STRINGA 14 20 +BEGIN + KEY "TOTALE GENERALE" + PROMPT 25 9 "@BTOTALE GENERALE" +END + +STRINGA 15 22 +BEGIN + KEY "TOTALE IMPONIBILI" + PROMPT 25 10 "@BTOTALE IMPONIBILI" +END + +NUMBER 16 18 +BEGIN + KEY "Totale Generale" + PROMPT 65 9 "" + PICTURE "###.###.###.###" +END + +NUMBER 17 18 +BEGIN + KEY "Totale Imponibili" + PROMPT 65 10 "" PICTURE "###.###.###.###" END diff --git a/ve/ordinec.src b/ve/ordinec.src index e729697e5..8692f0ac7 100755 --- a/ve/ordinec.src +++ b/ve/ordinec.src @@ -8,15 +8,10 @@ // Descrizione a caratteri del documento TYPE=Ordine Cliente -// Dove sono le risorse per il documento -MSKFILE=ORDINEC -FRMFILE=ORDC.FRM // modifica -CAMPICALC=TOTMER|TOTPRE|TOTSPE|SPESINC|BOLLI|SCONTOD|TOTNS|IMPOSTE|TOTDOC|PROVVD +CAMPICALC=TOTMER|TOTPRE|SPESE|SPESIMB|SPESTRA|SPESINC|BOLLI|IMPONIBILI|IMPOSTE|TOTDOC|SCONTOD|SCONTOT|OMAGGI|TOTPROVV CALCOLI=BASESCONTO -TOTALE=TOTDOC -BASESCONTO=BASESCONTO -SPESE=TOTSPE +TOTPROVV = // modifica // Procedure utente da chiamare per il documento ( preprocessarle? ) NUOVO= @@ -29,107 +24,59 @@ USER= // Indica se il documento è indirizzato ad un cliente o ad un fornitore TIPOCF=C -[INSERIMENTO] - -// Stati in cui è possibile effettuare la operazione -STATIVALIDI=1,2,3,4,5,6,7,8,9 - -// Stato finale del documento dopo la operazione -STATOFINALE=1 - -[MODIFICA] - -// Stati in cui è possibile effettuare la operazione -STATIVALIDI=1,2,3,4,5 - -// Stato finale del documento dopo la operazione -STATOFINALE=N - -[CANCELLAZIONE] -STATIVALIDI = 1,5,9 -STATOFINALE = 4 -REMOVE = 0 - -[STAMPA] - -// Stati in cui è possibile effettuare la operazione -STATIVALIDI=1 - -// Stato finale del documento dopo la operazione -STATOFINALE=2 - -[RAGGRUPPA] - -// Stati in cui è possibile effettuare la operazione -STATIVALIDI=6,7,8,9 - -// Stato finale del documento dopo la operazione -STATOFINALE=1 - -[SPECIALE] - -// Stati in cui è possibile effettuare la operazione -STATIVALIDI=1,2,3,4,5,6,7,8,9 - -// Stato finale del documento dopo la operazione -STATOFINALE=9 - [PROFILO] // Si possono indicare, dopo il numero, PROMPT, HELP, WARNING cosi: // 1|Prompt|Help|Warning -// TIPOCF = S_NORMALE -// CODCF = S_OBBLIGATORIO -// RAGSOC = S_NORMALE -OCCAS = S_NASCOSTO -OCFPI = S_NASCOSTO -COFI = S_NORMALE -STATOPAIV = S_NORMALE -PAIVA = S_NORMALE +OCCASEDIT = S_NORMALE //100 +OCFPI = S_DISABILITATO //100 +COFI = S_NORMALE //100 +STATOPAIV = S_NORMALE //100 +PAIVA = S_NORMALE //100 GOLEM = S_NORMALE GRRECAPITO = S_NORMALE //100 -INDCF = S_DISABILITATO -CIVCF = S_DISABILITATO -LOCALITACF = S_DISABILITATO -CAPCF = S_DISABILITATO -PROVCOM = S_DISABILITATO -COMCF = S_DISABILITATO -DENCOM = S_DISABILITATO -STATOCF = S_DISABILITATO -DESSTATOCF = S_DISABILITATO -CODVAL1 = S_NORMALE -CODVAL2 = S_NORMALE -NOME_VAL1 = S_NORMALE -NOME_VAL2 = S_NORMALE -CAMBIO = S_NORMALE -DATA_CAMBIO1 = S_NORMALE -DATA_CAMBIO2 = S_NORMALE -CODLIN = S_NORMALE -DESLIN = S_NORMALE -CODPAG = S_OBBLIGATORIO -DESCODPAG = S_NORMALE +INDCF = S_DISABILITATO //100 +CIVCF = S_DISABILITATO //100 +LOCALITACF = S_DISABILITATO //100 +CAPCF = S_DISABILITATO //100 +PROVCOM = S_DISABILITATO //100 +COMCF = S_DISABILITATO //100 +DENCOM = S_DISABILITATO //100 +STATOCF = S_DISABILITATO //100 +DESSTATOCF = S_DISABILITATO //100 +CODVAL1 = S_NORMALE //200 +CODVAL2 = S_NORMALE //200 +NOME_VAL1 = S_NORMALE //200 +NOME_VAL2 = S_NORMALE //200 +CAMBIO = S_NORMALE //200 +DATA_CAMBIO1 = S_NORMALE //200 +DATA_CAMBIO2 = S_NORMALE //200 +CODLIN = S_NORMALE //300 +DESLIN = S_NORMALE //300 +CODPAG = S_OBBLIGATORIO //400 +DESCODPAG = S_NORMALE //400 GRSCADENZE = S_NORMALE //500 -DATAINSC = S_NORMALE -DATASCAD1 = S_DISABILITATO -DATASCAD2 = S_DISABILITATO -DATASCAD3 = S_DISABILITATO -DATASCAD4 = S_DISABILITATO -DATASCAD5 = S_DISABILITATO -CODABIA = S_OBBLIGATORIO -CODCABA = S_OBBLIGATORIO -DESBANAPP = S_NORMALE -CODABIP = S_NORMALE -CODCABP = S_NORMALE -DESBANPRE = S_NORMALE +DATAINSC = S_NORMALE //500 +DATASCAD1 = S_DISABILITATO //500 +DATASCAD2 = S_DISABILITATO //500 +DATASCAD3 = S_DISABILITATO //500 +DATASCAD4 = S_DISABILITATO //500 +DATASCAD5 = S_DISABILITATO //500 +CODABIA = S_OBBLIGATORIO //600 +CODCABA = S_OBBLIGATORIO //600 +DESBANAPP = S_NORMALE //600 +CODABIP = S_NORMALE //700 +CODCABP = S_NORMALE //700 +DESBANPRE = S_NORMALE //700 CATVEN = S_NORMALE //800 DESCATVEN = S_DISABILITATO //800 -CODLIST1 = S_NORMALE -CODLIST2 = S_NORMALE -DESLIST = S_DISABILITATO -CODCONT1 = S_NORMALE -CODCONT2 = S_NORMALE +CODLIST1 = S_NORMALE //800 +CODLIST2 = S_NORMALE //800 +DESLIST = S_DISABILITATO //800 +CODCONT1 = S_NORMALE //810 +CODCONT2 = S_NORMALE //810 DESCONT = S_DISABILITATO //810 -CODCAMP = S_NORMALE +CODCAMP = S_NORMALE //820 DESCAMP = S_DISABILITATO //820 SCONTOPERC = S_NORMALE //830 GRINDSPED = S_NORMALE //900 @@ -191,18 +138,32 @@ DATACONS = S_NORMALE //2000 BLANK = S_DISABILITATO //4000 [DEFAULT] -// NDEFAULTS=1 +NDEFAULTS=0 // 1=F_CAUSTRASP|VEN [SHEET] -NCOLS=4 -1=2 -2=5 -3=6||30 -4=9 -5=10 -6=13 -7=8 +NCOLS=21 +1=FR_CODMAG +2=FR_CODDEP +3=FR_CODART +4=FR_LIV1 +5=FR_LIV2 +6=FR_LIV3 +7=FR_LIV4 +8=FR_DESCR +9=FR_UMQTA +10=FR_QTA +11=FR_QTAEVASA +12=FR_RIGAEVASA +13=FR_DATACONS +14=FR_PREZZO +15=FR_SCONTO +16=FR_PERCPROV +17=FR_CODIVA +18=FR_ADDIVA +19=FR_CAUS +20=FR_CODMAGC +21=FR_CODDEPC [RIGHE] NTIPIRIGA=9 @@ -228,7 +189,7 @@ NHANDLER=0 300 = S_NORMALE 400 = S_NORMALE 500 = S_NORMALE -600 = S_NASCOSTO +600 = S_NORMALE 700 = S_NORMALE 800 = S_NORMALE 810 = S_NORMALE diff --git a/ve/ordinef.src b/ve/ordinef.src index 4bc33c4e9..5af941fdc 100755 --- a/ve/ordinef.src +++ b/ve/ordinef.src @@ -6,15 +6,12 @@ [MAIN] // Descrizione a caratteri del documento -TYPE=Ordine Cliente +TYPE=Ordine Fornitore + +CAMPICALC=TOTMER|TOTPRE|SPESE|SPESIMB|SPESTRA|SPESINC|BOLLI|IMPONIBILI|IMPOSTE|TOTDOC|SCONTOD|SCONTOT|OMAGGI +CALCOLI=BASESCONTO // Dove sono le risorse per il documento -MSKFILE=ORDINEF -FRMFILE=ORDF.FRM -// modifica -PROGPIEDE=1|2|3|4|5|6 -// modifica -// Procedure utente da chiamare per il documento ( preprocessarle? ) NUOVO= MODIFICA= CANCELLA= @@ -25,64 +22,15 @@ USER= // Indica se il documento è indirizzato ad un cliente o ad un fornitore TIPOCF=F -[INSERIMENTO] - -// Stati in cui è possibile effettuare la operazione -STATIVALIDI=1,2,3,4,5,6,7,8,9 - -// Stato finale del documento dopo la operazione -STATOFINALE=1 - -[MODIFICA] - -// Stati in cui è possibile effettuare la operazione -STATIVALIDI=1,2,3,4,5 - -// Stato finale del documento dopo la operazione -STATOFINALE=N - -[CANCELLAZIONE] -STATIVALIDI = 6,7 -STATOFINALE = 4 -REMOVE = 0 - -[STAMPA] - -// Stati in cui è possibile effettuare la operazione -STATIVALIDI=1,2,3,4,5 - -// Stato finale del documento dopo la operazione -STATOFINALE=6 - -[RAGGRUPPA] - -// Stati in cui è possibile effettuare la operazione -STATIVALIDI=6,7,8,9 - -// Stato finale del documento dopo la operazione -STATOFINALE=1 - -[SPECIALE] - -// Stati in cui è possibile effettuare la operazione -STATIVALIDI=1,2,3,4,5,6,7,8,9 - -// Stato finale del documento dopo la operazione -STATOFINALE=9 - [PROFILO] // Si possono indicare, dopo il numero, PROMPT, HELP, WARNING cosi: // 1|Prompt|Help|Warning -// TIPOCF = S_NORMALE -// CODCF = S_OBBLIGATORIO -// RAGSOC = S_NORMALE -OCCAS = S_NASCOSTO -OCFPI = S_NASCOSTO -// aggiunti 3 -COFI = S_DISABILITATO -STATOPAIV = S_DISABILITATO -PAIVA = S_DISABILITATO +OCCASEDIT = S_NORMALE //100 +OCFPI = S_DISABILITATO //100 +COFI = S_NORMALE //100 +STATOPAIV = S_NORMALE //100 +PAIVA = S_NORMALE //100 GOLEM = S_NORMALE GRRECAPITO = S_NORMALE //100 INDCF = S_DISABILITATO //100 @@ -172,7 +120,7 @@ ACCSALDO = S_NORMALE //1800 DOC1 = S_NASCOSTO //1900 DOC2 = S_NASCOSTO //1900 DOC3 = S_NASCOSTO //1900 -DATACONS = S_NASCOSTO //2000 +DATACONS = S_NORMALE //2000 ASPBENI1 = S_OBBLIGATORIO //2100 DESCRBENI1 = S_NORMALE //2100 ASPBENI2 = S_NASCOSTO //2100 @@ -188,7 +136,6 @@ UMPNETTO = S_NORMALE //2700 PNETTO = S_NORMALE //2700 DESUMPNETTO = S_NASCOSTO //2700 NCOLLI = S_NORMALE //2800 -DATACONS = S_NORMALE //2000 CAUSMAG = S_NORMALE //2900 DESCRMAG = S_DISABILITATO //2900 CAUSMAGC = S_DISABILITATO //2900 @@ -196,7 +143,7 @@ DESCRMAGC = S_DISABILITATO //2900 BLANK = S_DISABILITATO //4000 [SHEET] -NCOLS=20 +NCOLS=21 1=FR_CODMAG 2=FR_CODDEP 3=FR_CODART @@ -209,14 +156,15 @@ NCOLS=20 10=FR_QTA 11=FR_QTAEVASA 12=FR_RIGAEVASA -13=FR_PREZZO -14=FR_SCONTO -15=FR_PERCPROV -16=FR_CODIVA -17=FR_ADDIVA -18=FR_CAUS -19=FR_CODMAGC -20=FR_CODDEPC +13=FR_DATACONS +14=FR_PREZZO +15=FR_SCONTO +16=FR_PERCPROV +17=FR_CODIVA +18=FR_ADDIVA +19=FR_CAUS +20=FR_CODMAGC +21=FR_CODDEPC [RIGHE] NTIPIRIGA=9 @@ -230,9 +178,6 @@ NTIPIRIGA=9 8=08 9=09 - - -// #include [HANDLERS] NHANDLER=0 // S_DISABILITATO = F_ORAPART|1 @@ -244,19 +189,23 @@ NHANDLER=0 300 = S_NORMALE 400 = S_NORMALE 500 = S_NORMALE -600 = S_NASCOSTO +600 = S_NORMALE 700 = S_NORMALE 800 = S_NORMALE -900 = S_NASCOSTO +810 = S_NORMALE +820 = S_NORMALE +830 = S_NORMALE +900 = S_NORMALE 1000 = S_NASCOSTO -1100 = S_NASCOSTO -1200 = S_NASCOSTO -1300 = S_NASCOSTO -1400 = S_NASCOSTO -1500 = S_NASCOSTO +1100 = S_NORMALE +1200 = S_NORMALE +1210 = S_NORMALE +1300 = S_NORMALE +1400 = S_NORMALE +1500 = S_NORMALE 1600 = S_NORMALE -1700 = S_NASCOSTO -1800 = S_NASCOSTO +1700 = S_NORMALE +1800 = S_NORMALE 1900 = S_NASCOSTO 2000 = S_NORMALE 2100 = S_NORMALE diff --git a/ve/sconti.cpp b/ve/sconti.cpp index 8ae5cec65..6ef28a17d 100755 --- a/ve/sconti.cpp +++ b/ve/sconti.cpp @@ -77,7 +77,7 @@ void TCond_vendita::set_prezzo(const real & prezzo, const char * val_rif) { _prezzo = normalize_valuta(prezzo, val_rif); - if (_load_mask && _riga && _riga->id2pos(FR_PREZZO) >= 0 && _riga->field(FR_PREZZO).active()) + if (_load_mask && _riga && _riga->id2pos(FR_PREZZO) >= 0) // && _riga->field(FR_PREZZO).active()) _riga->set(FR_PREZZO, _prezzo); } @@ -360,30 +360,26 @@ void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only) _ivarid = clifo().vendite().get_bool(CFV_IVARID); _load_mask = !load_um_only && !load_scagl_only; - if (codriga.not_empty()) - { - _anamag.setkey(1); - _anamag.put("CODART", codriga); - if (_anamag.read() != NOERR) - { - set_prezzo(ZERO); - set_sconto(""); - set_iva(""); - set_provv(ZERO); - return; - } + _anamag.setkey(1); + _anamag.put("CODART", codriga); + if (codriga.empty() || _anamag.read() != NOERR) + { + set_prezzo(ZERO); + set_sconto(""); + set_iva(""); + set_provv(ZERO); + return; + } - const TString16 umriga(riga().get(FR_UMQTA)); - - if (umriga.not_empty()) - { - _umart.setkey(2); - _umart.put("CODART", codriga); - _umart.put("UM", umriga); - if (_umart.read() != NOERR) - _umart.zero(); - } - } + const TString16 umriga(riga().get(FR_UMQTA)); + if (umriga.not_empty()) + { + _umart.setkey(2); + _umart.put("CODART", codriga); + _umart.put("UM", umriga); + if (_umart.read() != NOERR) + _umart.zero(); + } const bool found_condv = cerca(A_CONTRATTI) || cerca(A_OFFERTE) || cerca(A_LISTINI); const bool cv_scagl = _condv.get_bool("GESTSCAGL"); @@ -397,7 +393,10 @@ void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only) _load_mask = !load_um_only && !load_scagl_only; } else - set_prezzo(_umart.get_real("PREZZO")); + { + _load_mask |= load_um_only; + set_prezzo(_umart.get_real("PREZZO")); + } if (_ivarid) diff --git a/ve/ve0.cpp b/ve/ve0.cpp index b816dae72..179066de6 100755 --- a/ve/ve0.cpp +++ b/ve/ve0.cpp @@ -10,13 +10,16 @@ int main( int argc, char** argv ) switch (r) { case 2: - rt = ve0200( argc, argv ); + rt = ve0200( argc, argv ); // Parametri Vendite break; case 3: - rt = ve0300( argc, argv ); + rt = ve0300( argc, argv ); // Compilatore Profili + break; + case 4: + rt = ve0400( argc, argv ); // Gestione Tabelle break; default: - rt = ve0100( argc, argv ); + rt = ve0100( argc, argv ); // Gestione Documenti break; } exit(0); diff --git a/ve/ve0.h b/ve/ve0.h index f588eb4c8..61bff5117 100755 --- a/ve/ve0.h +++ b/ve/ve0.h @@ -1,18 +1,10 @@ #ifndef __VE0_H #define __VE0_H -#ifdef MAIN -#define extern -#endif - -int ve0100(int argc, char** argv); // Motore di gestione documenti -int ve0200(int argc, char** argv); // Configurazione vendite -int ve0300(int argc, char** argv); // Generatore di maschere - - -#ifdef MAIN -#undef extern -#endif +int ve0100(int argc, char* argv[]); // Motore di gestione documenti +int ve0200(int argc, char* argv[]); // Configurazione vendite +int ve0300(int argc, char* argv[]); // Generatore di maschere +int ve0400(int argc, char* argv[]); // Generatore di tabelle #endif // __VE0_H diff --git a/ve/ve0100.cpp b/ve/ve0100.cpp index 7891e3c91..b82c6cea1 100755 --- a/ve/ve0100.cpp +++ b/ve/ve0100.cpp @@ -90,7 +90,9 @@ void TMotore_application::init_modify_mode( TMask& m ) key << m.get_int(F_ANNO); key << m.get(F_PROVV)[0]; key << m.get_long(F_NDOC); - if (!doc().modificabile()) + + // Non dare messaggi inutili durante la cancellazione automatica + if (autodeleting() != 0x3 && !doc().modificabile()) { if (key != __last_key) warning_box("Documento non modificabile."); @@ -159,9 +161,9 @@ const char* TMotore_application::get_next_key( ) doc.put("CODNUM", cod_num.codice()); doc.put("ANNO", m.get(F_ANNO)); doc.put("PROVV", m.get(F_PROVV)); - - const TRectype cmp_rec(doc.curr()); // record campione - + + TRectype cmp_rec(doc.curr()); // record campione + doc.put( "NDOC", 9999999L ); if (doc.read(_isgreat) == NOERR) doc.prev(); @@ -169,9 +171,10 @@ const char* TMotore_application::get_next_key( ) doc.last(); const long num = ((doc.curr() == cmp_rec) ? doc.get_long( "NDOC" ) : 0) + 1; - key.format( "%d|%d", F_NDOC, num); + + return (format( "%d|%ld", F_NDOC, num)); } - return TRUE; + return ""; } int TMotore_application::read( TMask& m ) @@ -381,7 +384,7 @@ void TMotore_application::print() } } -int ve0100( int argc, char** argv ) +int ve0100( int argc, char* argv[]) { TMotore_application a; diff --git a/ve/ve0100c.cpp b/ve/ve0100c.cpp deleted file mode 100755 index fdc094d98..000000000 --- a/ve/ve0100c.cpp +++ /dev/null @@ -1,270 +0,0 @@ -// Handler di MarcoclaD sui campi delle maschere - -#include -#include - -#include "veuml.h" -#include "veuml1.h" -#include "ve0100.h" -#include "ve0100c.h" - -#include "..\cg\cgpagame.h" -#include "sconti.h" - -bool ora_hndl( TMask_field& field, KEY key ) - -{ - if (field.to_check(key)) - { - TFixed_string ora( field.get( ), 6 ); - - ora.trim( ); - if (ora.not_empty() || field.required() ) - { - if ( isdigit( ora[ 0 ] ) ) - { - if ( ora[ 2 ] != ':') - { - if ( ora.len( ) > 4 ) - ora.overwrite( ":", 2 ); - else - ora.insert( ":", 2 ); - } - } - const bool ok = ((isdigit(ora[0]))&&(isdigit(ora[1]))&&(isdigit(ora[3]))&&(isdigit(ora[4]))) && - ((atoi(&(ora[0]))<24)&&(atoi(&(ora[3]))<60)); - if (ok ) - field.set((ora)); - else - return error_box("Ora errata o formato non valido"); - } - } - return TRUE; -} - -bool dummy_hndl(TMask_field& field, KEY key) -{ - warning_box( "Al campo %d è arrivato un KEY %d", field.dlg( ), key ); - return TRUE; -} - -// Handler per il calcolo delle date di pagamento -bool condpag_hndl( TMask_field& field, KEY key ) -{ - if ( field.to_check(key)) - { - TMask& m = field.mask( ); - TString16 condpag( m.get( F_CODPAG ) ); - TString16 data( m.get( F_DATAINSC ) ); - if ( condpag.not_empty() && data.not_empty()) - { - TPagamento pag( condpag, data ); - pag.set_total( 100, 10, 10 ); - pag.set_rate_auto( ); - const int numrate = pag.n_rate( ); - for( int i = 0; i < numrate; i ++ ) - m.set( F_DATASCAD1 + i, pag.data_rata(i).string()); - for( ; i < 5; i ++ ) - m.hide( F_DATASCAD1 + i ); - } - } - return TRUE; -} - -// handler delle righe - -void row_set_handler( TMask& m, const int field, const int index ) -{ - switch ( index ) - { - case 1: - m.set_handler( field, dummy_hndl ); - break; - default: - yesnofatal_box( FALSE, "Funzione di handler sulla riga non definita( %d ).", index ); - } -} - -HIDDEN TString16 curr_um; -HIDDEN real curr_fc(1.0); - -bool codart_handler( TMask_field& f, KEY key ) -{ - // Se qualcuno cerca di modificare la maschera - if ( key == K_TAB && f.focusdirty()) - { - TMask& row_mask = f.mask(); -// TMask & mask = app().edit_mask(); - TMask & mask = row_mask.get_sheet()->mask(); - TCond_vendita & condv = app().condv(); - - condv.set_testa(&mask); - condv.set_riga(&row_mask); - - TLocalisamfile & anamag = ((TEdit_field &) f).browse()->cursor()->file(); - TLocalisamfile & umart = ((TEdit_field &) row_mask.field(FR_UMQTA)).browse()->cursor()->file(); - - condv.set_anamag(anamag); - condv.set_umart(umart); - TString80 codart(f.get()); - anamag.setkey(1); - anamag.put("CODART", codart); - if (anamag.read() != NOERR) - { - TLocalisamfile codalt(LF_CODCORR); - - codalt.setkey(2); - codalt.put("CODARTALT", codart); - if (codalt.read() == NOERR) - { - codart = codalt.get("CODART"); - anamag.zero(); - anamag.put("CODART", codart); - if (anamag.read() == NOERR) - f.set(codart); - } - } - - if (anamag.good()) - { - const TString16 lingua = mask.get(F_CODLIN); - const TString codart(row_mask.get(FR_CODART)); - TString desc(anamag.get("DESCR")); - - if (lingua.not_empty()) - { - TLocalisamfile deslin(LF_DESLIN); - - deslin.setkey(2); - deslin.put("CODART", codart); - deslin.put("CODLIN", lingua); - if (deslin.read() == NOERR) - desc = deslin.get("DESCR"); - } - row_mask.set(FR_DESCR, desc); - - umart.setkey(1); - umart.zero(); - umart.put("CODART", codart); - if (umart.read(_isgteq) == NOERR && codart == umart.get("CODART")) - { - curr_um = umart.get("UM"); - curr_fc = umart.get_real("FC"); - } - else - { - curr_um.cut(0); - curr_fc = 1.0; - } - row_mask.set(FR_UMQTA, curr_um); - } - - condv.ricerca(); - } - return TRUE; -} - -bool umart_handler( TMask_field& f, KEY key ) -{ - // Se qualcuno cerca di modificare la maschera - if ( key == K_TAB && f.focusdirty()) - { - TMask& row_mask = f.mask( ); -// TMask & mask = app().edit_mask(); - TMask & mask = row_mask.get_sheet()->mask(); - TLocalisamfile & anamag = ((TEdit_field &) row_mask.field(FR_CODART)).browse()->cursor()->file(); - TLocalisamfile & umart = ((TEdit_field &) f).browse()->cursor()->file(); - TCond_vendita & condv = app().condv(); - - condv.set_testa(&mask); - condv.set_riga(&row_mask); - condv.set_anamag(anamag); - condv.set_umart(umart); - condv.ricerca(FALSE); - - const TString16 um(f.get()); - real fc(1.0); - - if (um.not_empty() && curr_um.not_empty() && um != curr_um) - { - umart.setkey(2); - umart.put("CODART", row_mask.get(FR_CODART)); - umart.put("UM", um); - if (umart.read() == NOERR) - { - real qta(row_mask.get_real(FR_QTA)); - qta *= curr_fc; - fc = umart.get_real("FC"); - qta /= fc; - row_mask.set(FR_QTA, qta); - } - - } - curr_um = um; - curr_fc = fc; - } - return TRUE; -} - -bool descr_handler( TMask_field& f, KEY key ) -{ - if (key == K_TAB && f.focusdirty()) - { - const TString s(f.get()); - if (s.find('\n') < 0) - { - TLocalisamfile & anamag = ((TEdit_field &) f).browse()->cursor()->file(); - - anamag.zero(); - anamag.setkey(2); - anamag.put("DESCR", ((TZoom_field &) f).get_first_line()); - if (anamag.read() == NOERR) - { - f.mask().set(FR_CODART, anamag.get("CODART")); - f.mask().field(FR_CODART).set_dirty(); - f.mask().check_field(FR_CODART); - } - } - } - return TRUE; -} - -bool qta_handler( TMask_field& f, KEY key ) -{ - // Se qualcuno cerca di modificare la maschera - if ( key == K_TAB && f.focusdirty()) - { - TMask& row_mask = f.mask( ); -// TMask & mask = app().edit_mask(); - TMask & mask = row_mask.get_sheet()->mask(); - TLocalisamfile & anamag = ((TEdit_field &) row_mask.field(FR_CODART)).browse()->cursor()->file(); - TLocalisamfile & umart = ((TEdit_field &) row_mask.field(FR_UMQTA)).browse()->cursor()->file(); - TCond_vendita & condv = app().condv(); - - condv.set_testa(&mask); - condv.set_riga(&row_mask); - condv.set_anamag(anamag); - condv.set_umart(umart); - condv.ricerca(FALSE); - } - return TRUE; -} - -bool cod_handler( TMask_field& f, KEY key ) -{ - if ( key == K_TAB && f.focusdirty()) - { - TMask& row_mask = f.mask( ); - TMask & mask = row_mask.get_sheet()->mask(); - real cambio = mask.get(F_CAMBIO); - - if (cambio != 0.0) - { - real prezzo = row_mask.get(FR_PREZZO); - - prezzo /= mask.get_real(F_CAMBIO); - row_mask.set(FR_PREZZO, prezzo); - } - } - return TRUE; -} diff --git a/ve/ve0100c.h b/ve/ve0100c.h deleted file mode 100755 index 7d7b67e48..000000000 --- a/ve/ve0100c.h +++ /dev/null @@ -1,14 +0,0 @@ -#define __VE0100C_H - -// Handlers per testata e righe - -bool ora_hndl(TMask_field& field, KEY key); -bool codcli_hndl(TMask_field& field, KEY key); -bool dummy_hndl(TMask_field& field, KEY key); -bool condpag_hndl(TMask_field& field, KEY key); -void row_set_handler(TMask& m, const int field, const int index); -bool codart_handler(TMask_field& f, KEY key); -bool umart_handler(TMask_field& f, KEY key); -bool descr_handler(TMask_field& f, KEY key); -bool qta_handler(TMask_field& f, KEY key); -bool cod_handler(TMask_field& f, KEY key); diff --git a/ve/ve0200.cpp b/ve/ve0200.cpp index de1a25336..68c39802b 100755 --- a/ve/ve0200.cpp +++ b/ve/ve0200.cpp @@ -14,7 +14,7 @@ #include "veconf.h" -#define SINTASSI "Usage: VE0 -2 -[1|2|3|4|5|6]" +#define SINTASSI "Usage: VE0 -2 -[1|2|3|4|5|6|7]" class TConf_vendite : public TConfig_application { @@ -131,15 +131,11 @@ bool TConf_vendite::postprocess_config (TMask& mask, TConfig& config) bool TConf_vendite::user_create( ) { TString16 arg( argv(2) ); - // Il fottuto meno serve per evitare fottutamente che la fottuta confapp - // si fotta il fottuto parametro if( arg[ 0 ] != '-' ) fatal_box( SINTASSI ); _current = arg[1]; TConfig conf(_current == '6' ? CONFIG_STUDIO : CONFIG_DITTA ); if (_current == '6') set_config(CONFIG_STUDIO); - // Prima usavo le lettere ma la fottuta confapp si fotte il fottuto -c per i suoi fottuti - // motivi, cosi uso i fottuti numeri switch( _current ) { case '1': @@ -160,6 +156,9 @@ bool TConf_vendite::user_create( ) case '6': conf.set( "EdMask", "ve0200f", "ve" ); break; + case '7': + conf.set( "EdMask", "ve0200g", "ve" ); + break; default: fatal_box( SINTASSI ); return FALSE; @@ -168,7 +167,7 @@ bool TConf_vendite::user_create( ) return TRUE; } -int ve0200(int argc, char** argv) +int ve0200(int argc, char* argv[]) { TConf_vendite appc; diff --git a/ve/ve0200a.uml b/ve/ve0200a.uml index 3c51f85e8..ef22b5162 100755 --- a/ve/ve0200a.uml +++ b/ve/ve0200a.uml @@ -218,4 +218,166 @@ END ENDPAGE +PAGE "CONAI" 1 1 60 14 + +STRING F_CODACC 8 +BEGIN + PROMPT 1 4 "Cod.spesa acciaio " + FIELD CODACC + USE SPP + FLAGS "U" + INPUT CODTAB F_CODACC + DISPLAY "Codice Spesa " CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODACC CODTAB + OUTPUT F_DESACC S0 + HELP "Codice spesa per contributo acciaio" + CHECKTYPE NORMAL + GROUP 7 +END + +STRING F_DESACC 50 45 +BEGIN + PROMPT 32 4 "" + USE SPP KEY 2 + INPUT S0 F_CODACC + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice Spesa " CODTAB + COPY OUTPUT F_CODACC + GROUP 7 +END + +STRING F_CODALL 8 +BEGIN + PROMPT 1 6 "Cod.spesa alluminio " + FIELD CODALL + FLAGS "U" + COPY USE F_CODACC + INPUT CODTAB F_CODALL + COPY DISPLAY F_CODACC + OUTPUT F_CODALL CODTAB + OUTPUT F_DESALL S0 + CHECKTYPE NORMAL + HELP "Codice spesa per contributo alluminio" + GROUP 7 +END + +STRING F_DESALL 50 45 +BEGIN + PROMPT 32 6 "" + COPY USE F_DESACC + INPUT S0 F_DESALL + COPY DISPLAY F_DESACC + COPY OUTPUT F_CODALL + GROUP 7 +END + +STRING F_CODCAR 8 +BEGIN + PROMPT 1 8 "Cod.spesa carta " + FIELD CODCAR + FLAGS "U" + COPY USE F_CODACC + INPUT CODTAB F_CODCAR + COPY DISPLAY F_CODACC + OUTPUT F_CODCAR CODTAB + OUTPUT F_DESCAR S0 + CHECKTYPE NORMAL + HELP "Codice spesa per contributo carta" + GROUP 7 +END + +STRING F_DESCAR 50 45 +BEGIN + PROMPT 32 8 "" + COPY USE F_DESACC + INPUT S0 F_DESCAR + COPY DISPLAY F_DESACC + COPY OUTPUT F_CODCAR + GROUP 7 +END + +STRING F_CODPLA 8 +BEGIN + PROMPT 1 10 "Cod.spesa plastica " + FIELD CODPLA + FLAGS "U" + COPY USE F_CODACC + INPUT CODTAB F_CODPLA + COPY DISPLAY F_CODACC + OUTPUT F_CODPLA CODTAB + OUTPUT F_DESPLA S0 + CHECKTYPE NORMAL + HELP "Codice spesa per contributo plastica" + GROUP 7 +END + +STRING F_DESPLA 50 45 +BEGIN + PROMPT 32 10 "" + COPY USE F_DESACC + INPUT S0 F_DESPLA + COPY DISPLAY F_DESACC + COPY OUTPUT F_CODPLA + GROUP 7 +END + +STRING F_CODLEG 8 +BEGIN + PROMPT 1 12 "Cod.spesa legno " + FIELD CODLEG + FLAGS "U" + COPY USE F_CODACC + INPUT CODTAB F_CODLEG + COPY DISPLAY F_CODACC + OUTPUT F_CODLEG CODTAB + OUTPUT F_DESLEG S0 + CHECKTYPE NORMAL + HELP "Codice spesa per contributo legno" + GROUP 7 +END + +STRING F_DESLEG 50 45 +BEGIN + PROMPT 32 12 "" + COPY USE F_DESACC + INPUT S0 F_DESLEG + COPY DISPLAY F_DESACC + COPY OUTPUT F_CODLEG + GROUP 7 +END + +STRING F_CODVET 8 +BEGIN + PROMPT 1 14 "Cod.spesa vetro " + FIELD CODVET + FLAGS "U" + COPY USE F_CODACC + INPUT CODTAB F_CODVET + COPY DISPLAY F_CODACC + OUTPUT F_CODVET CODTAB + OUTPUT F_DESVET S0 + CHECKTYPE NORMAL + HELP "Codice spesa per contributo vetro" + GROUP 7 +END + +STRING F_DESVET 50 45 +BEGIN + PROMPT 32 14 "" + COPY USE F_DESACC + INPUT S0 F_DESVET + COPY DISPLAY F_DESACC + COPY OUTPUT F_CODVET + GROUP 7 +END + +STRING F_DESCONAIASS 50 +BEGIN + PROMPT 1 16 "Desc.contributo ass." + FIELD DESCCONAIASS + GROUP 7 +END + +ENDPAGE ENDMASK diff --git a/ve/ve0200f.uml b/ve/ve0200f.uml index b0a2abc13..04ea5ecf2 100755 --- a/ve/ve0200f.uml +++ b/ve/ve0200f.uml @@ -216,9 +216,15 @@ BEGIN COPY OUTPUT F_OMTRIGA END +STRING F_OMDESC 50 +BEGIN + PROMPT 2 4 "Descrizione omaggio " + FIELD DESOMAGGI +END + STRING F_ESTRIGA 4 BEGIN - PROMPT 2 4 "Tipo riga esenzioni " + PROMPT 2 5 "Tipo riga esenzioni " FLAGS "U" USE %TRI SELECT S7=="D" FIELD TRESENZ @@ -232,7 +238,7 @@ END STRING F_ESDRIGA 50 BEGIN - PROMPT 25 5 "" + PROMPT 25 6 "" USE %TRI KEY 2 SELECT S7=="D" INPUT S0 F_ESDRIGA COPY DISPLAY F_ESTRIGA @@ -241,7 +247,7 @@ END STRING F_SCTRIGA 4 BEGIN - PROMPT 2 6 "Tipo riga sconti testa " + PROMPT 2 7 "Tipo riga sconti testa " FLAGS "U" USE %TRI SELECT S7=="C" FIELD TRSCONTI @@ -255,7 +261,7 @@ END STRING F_SCDRIGA 50 BEGIN - PROMPT 25 7 "" + PROMPT 25 8 "" USE %TRI KEY 2 SELECT S7=="C" INPUT S0 F_SCDRIGA COPY DISPLAY F_SCTRIGA diff --git a/ve/ve0200g.uml b/ve/ve0200g.uml new file mode 100755 index 000000000..a952a88be --- /dev/null +++ b/ve/ve0200g.uml @@ -0,0 +1,597 @@ +#include "veconf.h" + +TOOLBAR "" 0 20 0 2 + +BUTTON DLG_OK 10 2 +BEGIN +PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN +PROMPT -22 -1 "" +END + +ENDPAGE + +PAGE "Distinta Base" 1 1 60 14 + +BOOLEAN F_EXPLODEDB +BEGIN + PROMPT 2 2 "Esplosione distinte" + MESSAGE FALSE CLEAR,8@ + MESSAGE TRUE ENABLE,8@ + FIELD EXPLODEDB +END + +GROUPBOX DLG_NULL 78 14 +BEGIN +PROMPT 1 4 "Parametri esplosione" +END + +LISTBOX F_VALCOMP 15 +BEGIN + PROMPT 2 6 "Calcolo valore su " + ITEM " |Prodotto finito" + ITEM "X|Componenti" + FIELD VALCOMP + GROUP 8 +END + +LISTBOX F_TIPOESPL 20 +BEGIN + PROMPT 2 8 "Tipo esplosione " + ITEM " |Scalare" + ITEM "X|Materiali di base" + FIELD TIPOESPL + GROUP 8 +END + +LIST F_RAGGART 34 +BEGIN + PROMPT 2 10 "Raggruppo articoli " + ITEM "0|Nessun raggruppamento" + ITEM "1|Converti nell'unita' principale" + ITEM "1|Converti nell'unita' di distinta" + ITEM "3|Per unita' di misura" + ITEM "4|All'unita' di misura principale" + ITEM "5|All'unita' di misura di distinta" + FIELD RAGGART + GROUP 8 +END + +NUMBER F_LIVELLO 3 +BEGIN + PROMPT 2 12 "Livello esplosione " + FIELD LIVESPL + GROUP 8 +END + +NUMBER F_ORDDB 3 +BEGIN + PROMPT 2 14 "Ordinamento distinta " + USE ORD + INPUT CODTAB F_ORDDB + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_ORDDB CODTAB + OUTPUT F_DESORDDB S0 + FIELD ORDDB + CHECKTYPE NORMAL + GROUP 8 +END + +STRING F_DESORDDB 47 +BEGIN + PROMPT 30 14 "" + FLAGS "D" +END + +BOOLEAN F_ELRORIG +BEGIN + PROMPT 2 16 "Elimino la riga originale" + FIELD ELRORIG + GROUP 8 +END + +ENDPAGE + +PAGE "Articoli" 1 1 60 14 + +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 1 2 "" +END + +BOOLEAN F_CHK_USER1 +BEGIN + PROMPT 2 2 "Campo libero 1" + MESSAGE FALSE CLEAR,11@ + MESSAGE TRUE ENABLE,11@ + FIELD CHK_USER[1] +END + +STRING F_PROMPT_USER1 20 +BEGIN + PROMPT 2 3 "Prompt " + FIELD PROMPT_USER[1] + GROUP 11 +END + +LISTBOX F_TYPE_USER1 7 +BEGIN + PROMPT 30 3 "Tipo " + ITEM "S|Stringa" MESSAGE ENABLE,F_LEN_USER1|CLEAR,F_DEC_USER1 + ITEM "N|Numero" MESSAGE ENABLE,F_LEN_USER1|ENABLE,F_DEC_USER1 + ITEM "I|Importo" MESSAGE ENABLE,F_LEN_USER1|CLEAR,F_DEC_USER1 + ITEM "D|Data" MESSAGE CLEAR,F_LEN_USER1|CLEAR,F_DEC_USER1 + ITEM "X|Si/no" MESSAGE CLEAR,F_LEN_USER1|CLEAR,F_DEC_USER1 + FIELD TYPE_USER[1] + GROUP 11 +END + +NUMBER F_LEN_USER1 2 +BEGIN + PROMPT 45 3 "Lunghezza " + FIELD LEN_USER[1] + GROUP 11 + FLAGS "U" + NUM_EXPR (#THIS_FIELD>0)&&(#THIS_FIELD<=20) + WARNING "La lunghezza del campo deve essere maggiore di 0 e non puo' superare 20 caratteri" +END + +STRING F_DEC_USER1 2 +BEGIN + PROMPT 58 3 "Decimali " + FIELD DEC_USER[1] + GROUP 11 +END + +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 1 5 "" +END + +BOOLEAN F_CHK_USER2 +BEGIN + PROMPT 2 5 "Campo libero 2" + MESSAGE FALSE CLEAR,12@ + MESSAGE TRUE ENABLE,12@ + FIELD CHK_USER[2] +END + +STRING F_PROMPT_USER2 20 +BEGIN + PROMPT 2 6 "Prompt " + FIELD PROMPT_USER[2] + GROUP 12 +END + +LISTBOX F_TYPE_USER2 7 +BEGIN + PROMPT 30 6 "Tipo " + ITEM "S|Stringa" MESSAGE ENABLE,F_LEN_USER2|CLEAR,F_DEC_USER2 + ITEM "N|Numero" MESSAGE ENABLE,F_LEN_USER2|ENABLE,F_DEC_USER2 + ITEM "I|Importo" MESSAGE ENABLE,F_LEN_USER2|CLEAR,F_DEC_USER2 + ITEM "D|Data" MESSAGE CLEAR,F_LEN_USER2|CLEAR,F_DEC_USER2 + ITEM "X|Si/no" MESSAGE CLEAR,F_LEN_USER2|CLEAR,F_DEC_USER2 + FIELD TYPE_USER[2] + GROUP 12 +END + +NUMBER F_LEN_USER2 2 +BEGIN + PROMPT 45 6 "Lunghezza " + FIELD LEN_USER[2] + GROUP 12 + FLAGS "U" + NUM_EXPR (#THIS_FIELD>0)&&(#THIS_FIELD<=20) + WARNING "La lunghezza del campo deve essere maggiore di 0 e non puo' superare 20 caratteri" +END + +STRING F_DEC_USER2 2 +BEGIN + PROMPT 58 6 "Decimali " + FIELD DEC_USER[2] + GROUP 12 +END + +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 1 8 "" +END + +BOOLEAN F_CHK_USER3 +BEGIN + PROMPT 2 8 "Campo libero 3" + MESSAGE FALSE CLEAR,13@ + MESSAGE TRUE ENABLE,13@ + FIELD CHK_USER[3] +END + +STRING F_PROMPT_USER3 20 +BEGIN + PROMPT 2 9 "Prompt " + FIELD PROMPT_USER[3] + GROUP 13 +END + +LISTBOX F_TYPE_USER3 7 +BEGIN + PROMPT 30 9 "Tipo " + ITEM "S|Stringa" MESSAGE ENABLE,F_LEN_USER3|CLEAR,F_DEC_USER3 + ITEM "N|Numero" MESSAGE ENABLE,F_LEN_USER3|ENABLE,F_DEC_USER3 + ITEM "I|Importo" MESSAGE ENABLE,F_LEN_USER3|CLEAR,F_DEC_USER3 + ITEM "D|Data" MESSAGE CLEAR,F_LEN_USER3|CLEAR,F_DEC_USER3 + ITEM "X|Si/no" MESSAGE CLEAR,F_LEN_USER3|CLEAR,F_DEC_USER3 + FIELD TYPE_USER[3] + GROUP 13 +END + +NUMBER F_LEN_USER3 2 +BEGIN + PROMPT 45 9 "Lunghezza " + FIELD LEN_USER[3] + GROUP 13 + FLAGS "U" + NUM_EXPR (#THIS_FIELD>0)&&(#THIS_FIELD<=20) + WARNING "La lunghezza del campo deve essere maggiore di 0 e non puo' superare 20 caratteri" +END + +STRING F_DEC_USER3 2 +BEGIN + PROMPT 58 9 "Decimali " + FIELD DEC_USER[3] + GROUP 13 +END + +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 1 11 "" +END + +BOOLEAN F_CHK_USER4 +BEGIN + PROMPT 2 11 "Campo libero 4" + MESSAGE FALSE CLEAR,14@ + MESSAGE TRUE ENABLE,14@ + FIELD CHK_USER[4] +END + +STRING F_PROMPT_USER4 20 +BEGIN + PROMPT 2 12 "Prompt " + FIELD PROMPT_USER[4] + GROUP 14 +END + +LISTBOX F_TYPE_USER4 7 +BEGIN + PROMPT 30 12 "Tipo " + ITEM "S|Stringa" MESSAGE ENABLE,F_LEN_USER4|CLEAR,F_DEC_USER4 + ITEM "N|Numero" MESSAGE ENABLE,F_LEN_USER4|ENABLE,F_DEC_USER4 + ITEM "I|Importo" MESSAGE ENABLE,F_LEN_USER4|CLEAR,F_DEC_USER4 + ITEM "D|Data" MESSAGE CLEAR,F_LEN_USER4|CLEAR,F_DEC_USER4 + ITEM "X|Si/no" MESSAGE CLEAR,F_LEN_USER4|CLEAR,F_DEC_USER4 + FIELD TYPE_USER[4] + GROUP 14 +END + +NUMBER F_LEN_USER4 2 +BEGIN + PROMPT 45 12 "Lunghezza " + FIELD LEN_USER[4] + GROUP 14 + FLAGS "U" + NUM_EXPR (#THIS_FIELD>0)&&(#THIS_FIELD<=20) + WARNING "La lunghezza del campo deve essere maggiore di 0 e non puo' superare 20 caratteri" +END + +STRING F_DEC_USER4 2 +BEGIN + PROMPT 58 12 "Decimali " + FIELD DEC_USER[4] + GROUP 14 +END + +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 1 14 "" +END + +BOOLEAN F_CHK_USER5 +BEGIN + PROMPT 2 14 "Campo libero 5" + MESSAGE FALSE CLEAR,15@ + MESSAGE TRUE ENABLE,15@ + FIELD CHK_USER[5] +END + +STRING F_PROMPT_USER5 20 +BEGIN + PROMPT 2 15 "Prompt " + FIELD PROMPT_USER[5] + GROUP 15 +END + +LISTBOX F_TYPE_USER5 7 +BEGIN + PROMPT 30 15 "Tipo " + ITEM "S|Stringa" MESSAGE ENABLE,F_LEN_USER5|CLEAR,F_DEC_USER5 + ITEM "N|Numero" MESSAGE ENABLE,F_LEN_USER5|ENABLE,F_DEC_USER5 + ITEM "I|Importo" MESSAGE ENABLE,F_LEN_USER5|CLEAR,F_DEC_USER5 + ITEM "D|Data" MESSAGE CLEAR,F_LEN_USER5|CLEAR,F_DEC_USER5 + ITEM "X|Si/no" MESSAGE CLEAR,F_LEN_USER5|CLEAR,F_DEC_USER5 + FIELD TYPE_USER[5] + GROUP 15 +END + +NUMBER F_LEN_USER5 2 +BEGIN + PROMPT 45 15 "Lunghezza " + FIELD LEN_USER[5] + GROUP 15 + FLAGS "U" + NUM_EXPR (#THIS_FIELD>0)&&(#THIS_FIELD<=20) + WARNING "La lunghezza del campo deve essere maggiore di 0 e non puo' superare 20 caratteri" +END + +STRING F_DEC_USER5 2 +BEGIN + PROMPT 58 15 "Decimali " + FIELD DEC_USER[5] + GROUP 15 +END + +ENDPAGE + +PAGE "Articoli" 1 1 60 14 + +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 1 2 "" +END + +BOOLEAN F_CHK_USER6 +BEGIN + PROMPT 2 2 "Campo libero 6" + MESSAGE FALSE CLEAR,16@ + MESSAGE TRUE ENABLE,16@ + FIELD CHK_USER[6] +END + +STRING F_PROMPT_USER6 20 +BEGIN + PROMPT 2 3 "Prompt " + FIELD PROMPT_USER[6] + GROUP 16 +END + +LISTBOX F_TYPE_USER6 7 +BEGIN + PROMPT 30 3 "Tipo " + ITEM "S|Stringa" MESSAGE ENABLE,F_LEN_USER6|CLEAR,F_DEC_USER6 + ITEM "N|Numero" MESSAGE ENABLE,F_LEN_USER6|ENABLE,F_DEC_USER6 + ITEM "I|Importo" MESSAGE ENABLE,F_LEN_USER6|CLEAR,F_DEC_USER6 + ITEM "D|Data" MESSAGE CLEAR,F_LEN_USER6|CLEAR,F_DEC_USER6 + ITEM "X|Si/no" MESSAGE CLEAR,F_LEN_USER6|CLEAR,F_DEC_USER6 + FIELD TYPE_USER[6] + GROUP 16 +END + +NUMBER F_LEN_USER6 2 +BEGIN + PROMPT 45 3 "Lunghezza " + FIELD LEN_USER[6] + GROUP 16 + FLAGS "U" + NUM_EXPR (#THIS_FIELD>0)&&(#THIS_FIELD<=20) + WARNING "La lunghezza del campo deve essere maggiore di 0 e non puo' superare 20 caratteri" +END + +STRING F_DEC_USER6 2 +BEGIN + PROMPT 58 3 "Decimali " + FIELD DEC_USER[6] + GROUP 16 +END + +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 1 5 "" +END + +BOOLEAN F_CHK_USER7 +BEGIN + PROMPT 2 5 "Campo libero 7" + MESSAGE FALSE CLEAR,17@ + MESSAGE TRUE ENABLE,17@ + FIELD CHK_USER[7] +END + +STRING F_PROMPT_USER7 20 +BEGIN + PROMPT 2 6 "Prompt " + FIELD PROMPT_USER[7] + GROUP 17 +END + +LISTBOX F_TYPE_USER7 7 +BEGIN + PROMPT 30 6 "Tipo " + ITEM "S|Stringa" MESSAGE ENABLE,F_LEN_USER7|CLEAR,F_DEC_USER7 + ITEM "N|Numero" MESSAGE ENABLE,F_LEN_USER7|ENABLE,F_DEC_USER7 + ITEM "I|Importo" MESSAGE ENABLE,F_LEN_USER7|CLEAR,F_DEC_USER7 + ITEM "D|Data" MESSAGE CLEAR,F_LEN_USER7|CLEAR,F_DEC_USER7 + ITEM "X|Si/no" MESSAGE CLEAR,F_LEN_USER7|CLEAR,F_DEC_USER7 + FIELD TYPE_USER[7] + GROUP 17 +END + +NUMBER F_LEN_USER7 2 +BEGIN + PROMPT 45 6 "Lunghezza " + FIELD LEN_USER[7] + GROUP 17 + FLAGS "U" + NUM_EXPR (#THIS_FIELD>0)&&(#THIS_FIELD<=20) + WARNING "La lunghezza del campo deve essere maggiore di 0 e non puo' superare 20 caratteri" +END + +STRING F_DEC_USER7 2 +BEGIN + PROMPT 58 6 "Decimali " + FIELD DEC_USER[7] + GROUP 17 +END + +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 1 8 "" +END + +BOOLEAN F_CHK_USER8 +BEGIN + PROMPT 2 8 "Campo libero 8" + MESSAGE FALSE CLEAR,18@ + MESSAGE TRUE ENABLE,18@ + FIELD CHK_USER[8] +END + +STRING F_PROMPT_USER8 20 +BEGIN + PROMPT 2 9 "Prompt " + FIELD PROMPT_USER[8] + GROUP 18 +END + +LISTBOX F_TYPE_USER8 7 +BEGIN + PROMPT 30 9 "Tipo " + ITEM "S|Stringa" MESSAGE ENABLE,F_LEN_USER8|CLEAR,F_DEC_USER8 + ITEM "N|Numero" MESSAGE ENABLE,F_LEN_USER8|ENABLE,F_DEC_USER8 + ITEM "I|Importo" MESSAGE ENABLE,F_LEN_USER8|CLEAR,F_DEC_USER8 + ITEM "D|Data" MESSAGE CLEAR,F_LEN_USER8|CLEAR,F_DEC_USER8 + ITEM "X|Si/no" MESSAGE CLEAR,F_LEN_USER8|CLEAR,F_DEC_USER8 + FIELD TYPE_USER[8] + GROUP 18 +END + +NUMBER F_LEN_USER8 2 +BEGIN + PROMPT 45 9 "Lunghezza " + FIELD LEN_USER[8] + GROUP 18 + FLAGS "U" + NUM_EXPR (#THIS_FIELD>0)&&(#THIS_FIELD<=20) + WARNING "La lunghezza del campo deve essere maggiore di 0 e non puo' superare 20 caratteri" +END + +STRING F_DEC_USER8 2 +BEGIN + PROMPT 58 9 "Decimali " + FIELD DEC_USER[8] + GROUP 18 +END + +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 1 11 "" +END + +BOOLEAN F_CHK_USER9 +BEGIN + PROMPT 2 11 "Campo libero 9" + MESSAGE FALSE CLEAR,19@ + MESSAGE TRUE ENABLE,19@ + FIELD CHK_USER[9] +END + +STRING F_PROMPT_USER9 20 +BEGIN + PROMPT 2 12 "Prompt " + FIELD PROMPT_USER[9] + GROUP 19 +END + +LISTBOX F_TYPE_USER9 7 +BEGIN + PROMPT 30 12 "Tipo " + ITEM "S|Stringa" MESSAGE ENABLE,F_LEN_USER9|CLEAR,F_DEC_USER9 + ITEM "N|Numero" MESSAGE ENABLE,F_LEN_USER9|ENABLE,F_DEC_USER9 + ITEM "I|Importo" MESSAGE ENABLE,F_LEN_USER9|CLEAR,F_DEC_USER9 + ITEM "D|Data" MESSAGE CLEAR,F_LEN_USER9|CLEAR,F_DEC_USER9 + ITEM "X|Si/no" MESSAGE CLEAR,F_LEN_USER9|CLEAR,F_DEC_USER9 + FIELD TYPE_USER[9] + GROUP 19 +END + +NUMBER F_LEN_USER9 2 +BEGIN + PROMPT 45 12 "Lunghezza " + FIELD LEN_USER[9] + GROUP 19 + FLAGS "U" + NUM_EXPR (#THIS_FIELD>0)&&(#THIS_FIELD<=20) + WARNING "La lunghezza del campo deve essere maggiore di 0 e non puo' superare 20 caratteri" +END + +STRING F_DEC_USER9 2 +BEGIN + PROMPT 58 12 "Decimali " + FIELD DEC_USER[9] + GROUP 19 +END + +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 1 14 "" +END + +BOOLEAN F_CHK_USER10 +BEGIN + PROMPT 2 14 "Campo libero 10" + MESSAGE FALSE CLEAR,20@ + MESSAGE TRUE ENABLE,20@ + FIELD CHK_USER[10] +END + +STRING F_PROMPT_USER10 20 +BEGIN + PROMPT 2 15 "Prompt " + FIELD PROMPT_USER[10] + GROUP 20 +END + +LISTBOX F_TYPE_USER10 7 +BEGIN + PROMPT 30 15 "Tipo " + ITEM "S|Stringa" MESSAGE ENABLE,F_LEN_USER10|CLEAR,F_DEC_USER10 + ITEM "N|Numero" MESSAGE ENABLE,F_LEN_USER10|ENABLE,F_DEC_USER10 + ITEM "I|Importo" MESSAGE ENABLE,F_LEN_USER10|CLEAR,F_DEC_USER10 + ITEM "D|Data" MESSAGE CLEAR,F_LEN_USER10|CLEAR,F_DEC_USER10 + ITEM "X|Si/no" MESSAGE CLEAR,F_LEN_USER10|CLEAR,F_DEC_USER10 + FIELD TYPE_USER[10] + GROUP 20 +END + +NUMBER F_LEN_USER10 2 +BEGIN + PROMPT 45 15 "Lunghezza " + FIELD LEN_USER[10] + GROUP 20 + FLAGS "U" + NUM_EXPR (#THIS_FIELD>0)&&(#THIS_FIELD<=20) + WARNING "La lunghezza del campo deve essere maggiore di 0 e non puo' superare 20 caratteri" +END + +STRING F_DEC_USER10 2 +BEGIN + PROMPT 58 15 "Decimali " + FIELD DEC_USER[10] + GROUP 20 +END + +ENDPAGE + +ENDMASK diff --git a/ve/ve0300.cpp b/ve/ve0300.cpp index 09f0b0d73..89ec0f235 100755 --- a/ve/ve0300.cpp +++ b/ve/ve0300.cpp @@ -11,6 +11,10 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +#ifndef __FSTREAM_H +#include +#endif + #ifndef __CHECKS_H #include #endif @@ -19,10 +23,6 @@ #include #endif -#ifndef __FSTREAM_H -#include -#endif - #ifndef __SCANNER_H #include #endif @@ -63,10 +63,6 @@ #include "veuml1.h" #endif -#ifndef __LFFILES_H -#include "lffiles.h" -#endif - #ifndef __VEINI_H #include "veini.h" #endif @@ -91,7 +87,7 @@ // Numero massimo di linee per pagina -#define MAX_LINES_PER_PAGE 19 +#define MAX_LINES_PER_PAGE 18 #define MASK_FIRST_LINE 6 #define GROUPKEY(x) format( "%5d", x ) @@ -187,6 +183,8 @@ public: int page( ) { return _curpage; }; void page( const int i ){ _curpage = i; }; + void output_row( const TString& row){ _out << row << "\n"; }; + // Funzioni per la lettura/scrittura di CURLINE int line( ) { return _curline; }; void line( const int i ){ _curline = i; }; @@ -221,9 +219,6 @@ public: class TMask_generator { - -private: - // Identificatore corrente per lo sheet int _curid; @@ -304,11 +299,8 @@ public: TMaschera& maschera( ){ return *_m; } - // Costruttore, vuole il nome del file .INI - TMask_generator( const TString& profilo, const TString& tablefile); - // Attiva la generazione della maschera - void genera( const TString& ); + void genera( const TString& profilo); // Genera l'intestazione di una pagina ( non la prima ) void intestazione_pagina( ); @@ -317,16 +309,17 @@ public: void load_table(); TConfig& profilo( ){ return *_pro; } - //TConfig& ditta( ){ return _ditta; } TConfig& groupsini( ){ return _groupsini; } TConfig& fieldsini( ){ return _fieldsini; } + // Costruttore, vuole il nome del file .INI + TMask_generator(const TString& tablefile); + // Distruttore - virtual ~TMask_generator( ); + virtual ~TMask_generator( ) {} }; - TMaschera::TMaschera( const TFilename outfile ) : _out( outfile ) { _curline = 1; @@ -354,9 +347,11 @@ void TMaschera::check( const int i ) case S_OBBLIGATORIO: outline ( "CH REQUIRED" ); break; - default: + case S_NORMALE: outline ( "CH NORMAL" ); break; + default: + break; } } @@ -599,16 +594,73 @@ HIDDEN TProgind * _bar; static void genera_gruppo( const TObject& gruppo ) { - // Per evitare 3000 casts ... - TGruppo & grp = (TGruppo &) gruppo; + // Per evitare 3000 casts + static TMask_generator * _mask_generator = NULL; + if (gruppo.class_id() == CLASS_STRING) + { + TFilename fname((TString &) gruppo); + + if (fname.ext()[0] == '\0') + fname.ext("msk"); + if (fexist(fname)) + { + TScanner scanner(fname); + TString line(128); + TMask_generator & g = *_mask_generator; + TMaschera & m = g.maschera(); + int row = m.line( ) - 1; - grp.present(FALSE); - grp.campi().for_each(verifica_campo); - do_events(); - if(grp.present()) - grp.genera(); - if (_bar) - _bar->addstatus(1); + line = scanner.line(); + + while (scanner.ok()) + { + int row_pos = line.find("%R"); + const bool new_line = (row_pos > 0); + if (!new_line) + row_pos = line.find("%S"); + const bool field = line.left(2) == "%F"; + + + if (field && row > MAX_LINES_PER_PAGE) + { + // Passa alla pagina successiva + m.end( ); + g.intestazione_pagina(); + row = MASK_FIRST_LINE; + } + if (row_pos > 0) + { + if (new_line) + row++; + + TString16 wrk; wrk.format("%02d", row); + + line[row_pos++] = wrk[0]; + line[row_pos] = wrk[1]; + } + if (field) + m.output_row(""); + else + m.output_row(line); + line = scanner.line(); + } + m.line(row + 1); + } + } + else + { + TGruppo & grp = (TGruppo &) gruppo; + + grp.present(FALSE); + if (_mask_generator == NULL) + _mask_generator = &(grp.generatore()); + grp.campi().for_each(verifica_campo); + do_events(); + if(grp.present()) + grp.genera(); + if (_bar) + _bar->addstatus(1); + } } @@ -815,6 +867,7 @@ void TField::genera( ) break; case S_NORMALE : case S_OBBLIGATORIO : + case S_NOCHECK : m.prompt( _x, _y + m.line( ), _prompt ); m.flag( _flag ); break; @@ -824,7 +877,7 @@ void TField::genera( ) if ((_type == T_DATA || _type == T_STRINGA || _type == T_NUMERO || _type == T_MEMO || _type == T_ZOOM || _type == T_GOLEM) && - (_stato == S_OBBLIGATORIO || !_use.blank())) + (_stato == S_OBBLIGATORIO || (!_use.blank()))) m.check( _stato ); if ( !_fieldname.blank( ) ) m.field( _fieldname ); if ( !_items.blank( ) ) m.item( _items ); @@ -848,58 +901,16 @@ void TField::genera( ) // Definizione dei metodi di_generator // ----------------------------------------- -TMask_generator::TMask_generator( const TString& profilo, const TString& tablefile ) : _fieldsini( "ve0300a.ini" ), _groupsini( "ve0300c.ini" )//, _ditta( CONFIG_DITTA ) +TMask_generator::TMask_generator(const TString& tablefile ) : _fieldsini( "ve0300a.ini" ), _groupsini( "ve0300c.ini" ) { CHECK( fexist( "ve0300a.ini" ), "Il file ve0300a.ini non esiste!" ); _fieldsini.list_paragraphs( _fields ); CHECK( fexist( "ve0300b.dat" ), "Il file ve0300b.dat non esiste!" ); carica_tabella( "ve0300b.dat", _tab0300b ); carica_dati_campi( "ve0300a.ini", _gruppi ); - TString16 param( profilo ); - param.lower( ); _tablefile = tablefile; - if( param == "-all" ) - { - TString_array profiles; - - { - TAssoc_array profiles_array; - TRelation rel("%TIP"); - TCursor t( &rel ); - long count = t.items(); - - for( t = 0; t.pos( ) < count; ++t ) - { - const TString profile_name(t.curr().get("S4")); - TFilename profile(profile_name); - - profile.ext("ini"); - if (fexist(profile) && !profiles_array.is_key(profile_name)) - profiles_array.add(profile_name); - } - profiles_array.get_keys(profiles); - } - - TProgind bar( profiles.items(), "Generazione automatica profili", FALSE, TRUE); - const int items = profiles.items(); - - for (int i = 0; i < items; i++) - { - const TString &profile = profiles.row(i); - - genera(profile); - bar.addstatus(1); - } - //_ditta.set( "CHANGED", "", "ve" ); - } - else genera( profilo ); } -TMask_generator::~TMask_generator( ) -{ - -}; - void TMask_generator::carica_dati_campi( const TFilename& fn, TAssoc_array& a ) { TScanner infile( fn ); @@ -1197,283 +1208,79 @@ void TMask_generator::load_table() void TMask_generator::genera( const TString& profilo ) { - int i, last; - TString temp_s; - TFilename proname( profilo ); - - // All'inizio il gruppo h 'chiuso' - _groupopen = FALSE; - - // Forza l'estensione al profilo - proname.ext( "ini" ); - - // Se il file di profilo non esiste, esci con un errore fatale - if (!fexist( proname)) + if( profilo == "-all" ) { - error_box( "Il profilo %s non esiste!", ( const char * )profilo); - return; - } + TString_array profiles; - _pro = new TConfig( proname ); + { + TAssoc_array profiles_array; + TRelation rel("%TIP"); + TCursor t( &rel ); + long count = t.items(); - const TString16 tipocf(_pro->get("TIPOCF", "MAIN")); - TFilename _mskname(profilo); - _mskname.ext( "msk" ); + for( t = 0; t.pos( ) < count; ++t ) + { + const TString profile_name(t.curr().get("S4")); + TFilename profile(profile_name); - do_events(); - // Mi serve per ordinare i gruppi a seconda del documento - TAssoc_array grouporder; + profile.ext("ini"); + if (fexist(profile) && !profiles_array.is_key(profile_name)) + profiles_array.add(profile_name); + } + profiles_array.get_keys(profiles); + } - _m = new TMaschera( _mskname ); + TProgind bar( profiles.items(), "Generazione automatica profili", FALSE, TRUE); + const int items = profiles.items(); - // Definizione della toolbar - _m->outline( "TOOLBAR \"\" 0 20 0 2" ); + for (int i = 0; i < items; i++) + { + const TString &profile = profiles.row(i); - _m->control( T_BOTTONE, DLG_SAVEREC, 1002 ); - _m->begin( ); - _m->prompt( -15, -1, "~Registra" ); - _m->message( "EXIT,20082" ); - _m->picture(BMP_SAVEREC); - _m->picture(BMP_SAVERECDN); - _m->end( ); - - _m->control( T_BOTTONE, DLG_DELREC, 1002 ); - _m->begin( ); - _m->prompt( -25, -1, "~Elimina" ); - _m->message( "EXIT,127" ); - _m->end( ); - - _m->control( T_BOTTONE, 99, 1002 ); - _m->begin( ); - _m->prompt( -35, -1, "E~labora" ); -// _m->message( "EXIT,345" ); - _m->end( ); - - _m->control( T_BOTTONE, DLG_PRINT, 1002 ); - _m->begin( ); - _m->prompt( -45, -1 ); - _m->message( "EXIT,20082" ); - _m->end( ); - - _m->control( T_BOTTONE, DLG_CANCEL, 1002 ); - _m->begin( ); - _m->prompt( -55, -1 ); - _m->message( "EXIT,27" ); - _m->end( ); - - // End della toolbar - _m->end( ); - - - do_events(); - // Header della prima pagina - - _m->pagina( _m->page( )); - - _m->control( T_CORNICE, DLG_NULL, 7806 ); - _m->begin( ); - _m->prompt( 1, 0, "" ); - _m->end( ); - - _m->control( T_STRINGA, F_CODNUM, 4 ); - _m->begin( ); - _m->prompt( 2, 1, "Cod. num. " ); - _m->field("CODNUM"); - _m->use("%NUM", 1); - temp_s.format("CODTAB %d", F_CODNUM); - _m->input(temp_s); - _m->display("\"Codice\" CODTAB~\"Descrizione@50\" S0"); - temp_s.format("%d S0", F_DESNUM); - _m->output(temp_s); - _m->check(S_NORMALE); - _m->flag( "GDU" ); - _m->message( "CO,2@" ); - _m->end( ); - - _m->control( T_STRINGA, F_DESNUM, 50 ); - _m->begin( ); - _m->prompt( 24, 1 ); - _m->flag( "GD" ); - _m->message( "CO,3@" ); - _m->end( ); - - _m->control( T_STRINGA, F_TIPODOC, 4 ); - _m->begin( ); - _m->field( "TIPODOC" ); - _m->prompt( 2, 2, "Tipo doc. " ); - _m->use("%TIP" , 1); - temp_s.format("CODTAB %d", F_TIPODOC); - _m->input(temp_s); - _m->display("\"Codice\" CODTAB~\"Descrizione@50\" S0"); - temp_s.format("%d S0", F_DESTIPODOC); - _m->output(temp_s); - _m->check(S_NORMALE); - _m->flag( "GDU" ); - _m->message( "CO,4@" ); - _m->end( ); - - _m->control( T_LISTA, F_TIPOCF, 9 ); - _m->begin( ); - _m->prompt( 100, 100, "" ); - _m->field( "TIPOCF" ); - if ( tipocf == "C" ) - _m->item("C|Cliente"); - else - _m->item("F|Fornitore"); - _m->flag( "D" ); - _m->end( ); - - _m->control( T_STRINGA, F_PROVV, 1 ); - _m->begin( ); - _m->prompt( 100, 100, "

" ); - _m->field( "PROVV" ); - _m->flag( "D" ); - _m->end( ); - - _m->control( T_STRINGA, F_DESTIPODOC, 50 ); - _m->begin( ); - _m->prompt( 24, 2 ); - _m->flag( "GD" ); - _m->message( "CO,5@" ); - _m->end( ); - - _m->control( T_STRINGA, F_ANNO, 4 ); - _m->begin( ); - _m->prompt( 2, 3, "Esercizio " ); - _m->field( "ANNO" ); - _m->flag( "GD" ); - _m->message( "CO,9@" ); - _m->end( ); - - _m->control( T_NUMERO, F_NDOC, 6 ); - _m->begin( ); - _m->prompt( 24, 3, "Numero doc. " ); - _m->field( "NDOC" ); - _m->message( "CO,6@" ); - _m->flag( "GDR" ); - _m->end( ); - - _m->control( T_DATA, F_DATADOC ); - _m->begin( ); - _m->prompt( 46, 3, "Data " ); - _m->field( "DATADOC" ); - TString m("CO,7@"); - TGruppo * g = (TGruppo *) _gruppi.objptr(GROUPKEY(200)); - - if (g) - { - TArray & f = g->campi(); - bool found = FALSE; - - for (TField * c = (TField *) f.first_item(); !found && c; c = (TField *) f.succ_item()) - found = c->id() == F_DATACAMBIO1; - - if (found && c->stato_reale() != S_NASCOSTO) - m << format("|CO,%d", F_DATACAMBIO1); - } - _m->message(m); - _m->flag( "A" ); - _m->end( ); - - _m->control( T_NUMERO, F_STATO, 1 ); - _m->begin( ); - _m->prompt( 67, 3, "Stato " ); - _m->field( "STATO" ); - _m->message( "CO,8@" ); - _m->flag( "DG" ); - _m->end( ); - -// _m->control( T_STRINGA, F_ANNO, 4 ); -// _m->begin( ); -// _m->prompt( 66, 3, "Es. " ); -// _m->field( "ANNO" ); -// _m->flag( "GD" ); -// _m->message( "CO,9@" ); -// _m->end( ); - - _m->control( T_STRINGA, F_CODCF, 6 ); - _m->begin( ); - if ( tipocf == "C" ) - { - _m->prompt( 2, 4, "Cliente " ); - _m->warning( "Cliente assente" ); - _m->help( "Codice del cliente del documento" ); + genera(profile); + bar.addstatus(1); + } } else { - _m->prompt( 2, 4, "Fornitore " ); - _m->warning( "Fornitore assente" ); - _m->help( "Codice del fornitore del documento" ); - } - _m->flag( "R" ); - _m->field( "CODCF" ); - _m->group( 1 ); - _m->use( LF_CLIFO, 1 ); - temp_s.format( "TIPOCF \"%s\"~CODCF %d", (const char *)tipocf, F_CODCF); - _m->input( temp_s ); - _m->display( "\"Codice\" CODCF~\"Ragione Sociale@50\" RAGSOC~\"Partita IVA@12\" PAIV~\"Sospeso\" SOSPESO" ); - temp_s.format( "%d CODCF~%d RAGSOC", F_CODCF, F_RAGSOC ); - _m->output( temp_s ); - _m->check( S_OBBLIGATORIO ); - temp_s.format( "ADD RU cg0 -1 %s", (const char *)tipocf); - _m->outline( temp_s ); - _m->message( "CO,10@" ); - _m->end( ); - - _m->control( T_STRINGA, F_RAGSOC, 50 ); - _m->begin( ); - if ( tipocf == "C" ) - { - _m->warning( "Cliente assente" ); - _m->help( "Ragione sociale del cliente del documento" ); - } - else - { - _m->warning( "Fornitore assente" ); - _m->help( "Ragione sociale del fornitore del documento" ); - } - _m->prompt( 24, 4, "" ); - _m->group( 1 ); - _m->use( LF_CLIFO, 2 ); - temp_s.format( "TIPOCF \"%s\"~RAGSOC %d", (const char *)tipocf, F_RAGSOC ); - _m->input( temp_s ); - _m->display( "\"Ragione Sociale@50\" RAGSOC~\"Partita IVA@12\" PAIV~\"Codice\" CODCF" ); - temp_s.format( "%d CODCF~%d RAGSOC", F_CODCF, F_RAGSOC ); - _m->output( temp_s ); - _m->check( S_OBBLIGATORIO ); - temp_s.format( "ADD RU cg0 -1 %s", (const char *)tipocf); - _m->outline( temp_s ); - _m->message( "CO,11@" ); - _m->end( ); - _m->line( MASK_FIRST_LINE ); - - _m->_pageopen = TRUE; - - // Generazione - - // Scorro l'array dei gruppi, e ne creo una copia ordinata - // con solo i gruppi visibili - - TArray sortedgroups; - TString16 chiave, chiavegruppo; - last = _pro->get_int( "NGROUPS", "ORDINEGRUPPI" ); - for( i = 1; i <= last; i ++ ) - { + int i, last; + TString temp_s; + TFilename proname( profilo ); + + // All'inizio il gruppo h 'chiuso' + _groupopen = FALSE; + + // Forza l'estensione al profilo + proname.ext( "ini" ); + + // Se il file di profilo non esiste, esci con un errore fatale + if (!fexist( proname)) + { + error_box( "Il profilo %s non esiste!", ( const char * )profilo); + return; + } + + _pro = new TConfig( proname ); + + const TString16 tipocf(_pro->get("TIPOCF", "MAIN")); + TFilename _mskname(profilo); + _mskname.ext( "msk" ); + do_events(); - chiave.format( "%d", i ); - chiavegruppo.GROUPKEY( _pro->get_int( chiave, "ORDINEGRUPPI" ) ); - if( _gruppi.is_key( chiavegruppo ) ) - sortedgroups.add( _gruppi[ (chiavegruppo) ] ); - } - - TString80 message; - - message.format("Generazione profilo : %s", (const char *) profilo); - _bar = new TProgind(sortedgroups.items(), message, FALSE, TRUE); - sortedgroups.for_each( genera_gruppo ); - delete _bar; - if ( _m->_pageopen == TRUE ) - { + // Mi serve per ordinare i gruppi a seconda del documento + TAssoc_array grouporder; + + _m = new TMaschera( _mskname ); + + // Definizione della toolbar + _m->outline( "TOOLBAR \"\" 0 20 0 2" ); + + _m->control( T_BOTTONE, DLG_SAVEREC, 1002 ); + _m->begin( ); + _m->prompt( -15, -1, "~Registra" ); + _m->message( "EXIT,20082" ); + _m->picture(BMP_SAVEREC); + _m->picture(BMP_SAVERECDN); _m->end( ); _m->control( T_BOTTONE, DLG_DELREC, 1002 ); @@ -1485,6 +1292,7 @@ void TMask_generator::genera( const TString& profilo ) _m->control( T_BOTTONE, DLG_ELABORA, 1002 ); _m->begin( ); _m->prompt( -35, -1, "E~labora" ); + _m->picture(BMP_ELABORA); // _m->message( "EXIT,345" ); _m->end( ); @@ -1702,119 +1510,142 @@ void TMask_generator::genera( const TString& profilo ) delete _bar; if ( _m->_pageopen == TRUE ) { + _m->end( ); intestazione_pagina( ); - TTable* frd = NULL; - - if (usefiles) - frd = new TTable( "%FRD" ); - else - load_table(); - - int nr = 1; - int id = 0; - for (const char * cp = s.get(0); cp && *cp; cp = s.get()) + } + + + // Generazione del listbox per i tipi di riga da aggiungere nello sheet + _m->control ( T_LISTA, F_LBTIPORIGA, 30 ); + _m->begin( ); + _m->prompt( 2, 6, "Tipo riga da aggiungere " ); + _m->end( ); + + // Generazione dello sheet : vedi il profilo + TScanner sheet_in( "ve0300b.dat" ); + _m->_out << "SPREADSHEET " << F_SHEET << "\n"; + _m->begin( ); + _m->prompt( 2, 7 ); + do_events(); + for( i = 0; i < _tab0300b.items( ); i ++ ) + genera_item_sheet( _tab0300b.row( i ) ); + _m->end( ); + + _m->end( ); + + // Generazione pagina dei piedi + { + TToken_string s(_pro->get("CAMPICALC", "MAIN")); + const bool usefiles = _tablefile.empty(); + + if (s.not_empty()) { - const TString16 codpiede(cp); - do_events(); + intestazione_pagina( ); + TTable* frd = NULL; + if (usefiles) + frd = new TTable( "%FRD" ); + else + load_table(); + + int nr = 1; + int id = 0; + for (const char * cp = s.get(0); cp && *cp; cp = s.get()) { - frd->zero( ); - frd->put( "CODTAB", codpiede ); - } - _TableItem* t = (_TableItem*) _frdtable.objptr(codpiede); - if ( (usefiles && frd->read( ) == NOERR) || t != NULL ) - { - const TString80 picture(usefiles ? frd->get( "S3") : t->s3() ); - const int len = picture.len() > 0 ? picture.len() : 18; - int dec = picture.find(','); - if (dec >= 0) - dec = len - dec - 1; - else - dec = 0; - - id++; - if ((usefiles && frd->get_bool("B0")) || t->b0()) - _m->control( T_NUMERO, BASE_PIEDE + id, len * 100 + dec); - else - _m->control( T_STRINGA, BASE_PIEDE + id, len * 100); - _m->begin( ); - - TString80 header(usefiles ? frd->get("S0") : t->s0()); - header.left_just(58 - len); - - _m->prompt( 2, 7 + nr, header ); - _m->field(codpiede); - - if (picture.not_empty()) - _m->picture(picture); - _m->flag( "D" ); - _m->end( ); - nr++; - if( nr + MASK_FIRST_LINE > MAX_LINES_PER_PAGE ) + const TString16 codpiede(cp); + do_events(); + if (usefiles) { + frd->zero( ); + frd->put( "CODTAB", codpiede ); + } + _TableItem* t = (_TableItem*) _frdtable.objptr(codpiede); + if ( (usefiles && frd->read( ) == NOERR) || t != NULL ) + { + const TString80 picture(usefiles ? frd->get( "S3") : t->s3() ); + const int len = picture.len() > 0 ? picture.len() : 18; + int dec = picture.find(','); + if (dec >= 0) + dec = len - dec - 1; + else + dec = 0; + + id++; + + if( nr + MASK_FIRST_LINE > MAX_LINES_PER_PAGE ) + { + _m->end( ); + intestazione_pagina( ); + _m->line( MASK_FIRST_LINE ); + nr = 1; + } + + if ((usefiles && frd->get_bool("B0")) || t->b0()) + _m->control( T_NUMERO, BASE_PIEDE + id, len * 100 + dec); + else + _m->control( T_STRINGA, BASE_PIEDE + id, len * 100); + _m->begin( ); + + TString80 header(usefiles ? frd->get("S0") : t->s0()); + header.left_just(58 - len); + + _m->prompt( 2, 7 + nr, header ); + _m->field(codpiede); + + if (picture.not_empty()) + _m->picture(picture); + _m->flag( "D" ); _m->end( ); - intestazione_pagina( ); - _m->line( MASK_FIRST_LINE ); - nr = 1; + nr++; } } + _m->end( ); + + if (frd != NULL) + delete frd; } - _m->end( ); - - if (frd != NULL) - delete frd; } + _m->endmask( ); + + // Stategia al 30/06/95 + // Creo una maschera con tutte le colonne, poi, a RUNTIME, + // dal motore, nascondo e adatto le colonne. + + // Generazione maschera dello sheet + delete _m; + fcopy("verig00.msk", _mskname, TRUE); + delete _pro; } - _m->endmask( ); - - // Stategia al 30/06/95 - // Creo una maschera con tutte le colonne, poi, a RUNTIME, - // dal motore, nascondo e adatto le colonne. - - // Generazione maschera dello sheet - delete _m; - fcopy("verig00.msk", _mskname, TRUE); - delete _pro; } // Applicazione guscio -class TGenMask_application : public TApplication +class TGenMask_application : public TSkeleton_application { bool _use_files; TString _tablefile; protected: - virtual bool use_files() const - { return _use_files; } + virtual bool use_files() const { return _use_files; } - virtual bool create ( ); - virtual bool destroy( ); public: + virtual void main_loop(); // @cmember Disabilita la verifica del modulo : essendo una anagrafica, va sempre abilitata - virtual bool check_autorization() const - {return FALSE;} - void set_files(const bool b = TRUE) {_use_files = b;} - void set_tablefile(const TString& t) {_tablefile = t;} + virtual bool check_autorization() const {return FALSE;} + void set_files(const bool b = TRUE) {_use_files = b;} + void set_tablefile(const TString& t) {_tablefile = t;} }; -bool TGenMask_application::create( ) +void TGenMask_application::main_loop( ) { - TApplication::create( ); - TMask_generator *a = new TMask_generator(argv(2), _tablefile); - delete a; - return FALSE; + TMask_generator gen(_tablefile); + gen.genera(argv(2)); } -bool TGenMask_application::destroy( ) -{ - return TApplication::destroy() ; -} - -int ve0300( int argc, char** argv ) +int ve0300( int argc, char* argv[]) { TGenMask_application a; diff --git a/ve/ve0300a.src b/ve/ve0300a.src index 8073c0acd..67e234c93 100755 --- a/ve/ve0300a.src +++ b/ve/ve0300a.src @@ -229,6 +229,34 @@ TYPE=T_STRINGA PROMPT="" SIZE=50 +[ORDDA] +GROUP=150 +X=2 +Y=0 +MSKID=F_ORDDA +FLAG=R +FIELDNAME=ORDCF +TYPE=T_STRINGA +PROMPT="Ordinato da" +USE=LF_CLIFO +INPUT=TIPOCF F_TIPOCF SELECT~CODCF F_ORDDA +DISPLAY="Codice@6" CODCF~"Ragione sociale@50" RAGSOC~"Partita IVA@12" PAIV +OUTPUT=F_ORDDA CODCF~F_ORDDADES RAGSOC +SIZE=6 + +[ORDDADES] +GROUP=150 +X=24 +Y=0 +MSKID=F_ORDDADES +TYPE=T_STRINGA +PROMPT="" +USE=LF_CLIFO KE 2 +INPUT=TIPOCF F_TIPOCF SELECT~RAGSOC F_ORDDADES +DISPLAY="Ragione sociale@50" RAGSOC~"Codice@6" CODCF~"Partita IVA@12" PAIV +OUTPUT=@F_ORDDA +SIZE=50 + [CODVAL1] //se codice=LIT il campo cambio e' di sola visualizzazione //se non abilitato archivio cambi @@ -1213,7 +1241,7 @@ Y=0 FIELDNAME=NOTE MSKID=F_NOTECLI TYPE=T_ZOOM -PROMPT=" " +PROMPT="" SIZE=7750 [NCOPIE] @@ -1269,8 +1297,8 @@ SIZE=1802 [ACCSALDO] GROUP=1800 -X=2 -Y=1 +X=45 +Y=0 FIELDNAME=ACCSALDO MSKID=F_ACCSALDO TYPE=T_CHECKBOX diff --git a/ve/ve0400.cpp b/ve/ve0400.cpp new file mode 100755 index 000000000..bf9a414f4 --- /dev/null +++ b/ve/ve0400.cpp @@ -0,0 +1,133 @@ +#include +#include +#include +#include + +#include "vetbnum.h" + +/////////////////////////////////////////////////////////// +// TVendite_mask +/////////////////////////////////////////////////////////// + +class TVendite_mask : public TAutomask +{ + TString _tab; // Voglio la tabella sempre sotto mano + +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + + bool is_table(const char* tab) const { return _tab == tab; } + + void get_printer_config(TString& name) const; + bool get_printer_name(TString& name) const; + void reset_printer_config() const; + + bool on_num_event(TOperable_field& o, TField_event e, long jolly); + +public: + TVendite_mask(const char* name); + virtual ~TVendite_mask() { } +}; + +void TVendite_mask::get_printer_config(TString& config) const +{ + config = _tab; + for (TEditable_field* f = get_key_field(1, TRUE); f; + f = get_key_field(1, FALSE)) if (f->shown()) + config << f->get(); +} + +bool TVendite_mask::get_printer_name(TString& name) const +{ + TString16 config; get_printer_config(config); + TConfig ini(CONFIG_STAMPE, config); + if (ini.get_int("Type", NULL, -1, -1) >= 0) + { + const int num = ini.get_int("Number"); + if (num >= 0) + { + TToken_string pn; + os_get_printer_names(pn); + name = pn.get(num); + } + } + return name.not_empty(); +} + +void TVendite_mask::reset_printer_config() const +{ + TString16 config; get_printer_config(config); + TConfig ini(CONFIG_STAMPE, config); + ini.remove_all(); +} + + +bool TVendite_mask::on_num_event(TOperable_field& o, TField_event e, long jolly) +{ + switch(o.dlg()) + { + case NUM_DEFPRINTER: + if (e == fe_button && !query_mode()) + { + TPrinter& pr = printer(); + TString16 config; get_printer_config(config); + pr.read_configuration(config); + pr.set(); + e = fe_init; + } + if (e == fe_init) + { + TString name; get_printer_name(name); + o.set(name); + } + if (e == fe_close && o.empty()) + reset_printer_config(); + break; + default: + break; + } + return TRUE; +} + +bool TVendite_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + if (is_table("NUM")) + return on_num_event(o, e, jolly); + return TRUE; +} + +TVendite_mask::TVendite_mask(const char* name) : TAutomask(name) +{ + const TFixed_string n(name); + _tab = n.mid(4,3); + _tab.upper(); +} + +/////////////////////////////////////////////////////////// +// TVendite_tabapp +/////////////////////////////////////////////////////////// + +class TVendite_tabapp : public TTable_application +{ +protected: + virtual TMask* set_mask(TMask* m); + +public: +}; + +TMask* TVendite_tabapp::set_mask(TMask* m) +{ + if (m == NULL) + { + TFilename mn; get_mask_name(mn); + m = new TVendite_mask(mn); + } + return TTable_application::set_mask(m); +} + +int ve0400(int argc, char* argv[]) +{ + TVendite_tabapp vta; + vta.run(argc, argv, "Tabella Vendite"); + return 0; +} diff --git a/ve/ve1.cpp b/ve/ve1.cpp index 5e1b3db85..75e2092fa 100755 --- a/ve/ve1.cpp +++ b/ve/ve1.cpp @@ -1,16 +1,19 @@ - #include #include -extern int ve1100(int argc, char** argv); // stampa documenti di vendita tramite form derivati +extern int ve1100(int argc, char* argv[]); // stampa documenti di vendita tramite form derivati -int main(int argc, char **argv) { - int rt= -1; - const int r= (argc>1)?(atoi(&argv[1][1])):(-1); +int main(int argc, char **argv) +{ + const int r= (argc>1)? argv[1][1]-'0' : -1; - switch (r) { - case 0: rt= ve1100(argc, argv); break; - default: error_box("Sintassi: %s [-0 {[params]|[L]}]", argv[0]); break; - } - return (rt); + switch (r) + { + case 0: + ve1100(argc, argv); break; + default: + error_box("Sintassi: %s [-0 {[params]|[L]}]", argv[0]); break; + } + exit(0); + return 0; } diff --git a/ve/ve1.url b/ve/ve1.url index cc9a90ccd..18f2fcfa1 100755 --- a/ve/ve1.url +++ b/ve/ve1.url @@ -3,3 +3,6 @@ #define QFIRMNAME "A.G.A. Informatica Srl" #include +MENU TASK_MENUBAR + SUBMENU MENU_FILE "~File" + ITEM BAR_ITEM(1) "~Parametri" diff --git a/ve/ve1100.cpp b/ve/ve1100.cpp index 695a78178..41b9f6e8f 100755 --- a/ve/ve1100.cpp +++ b/ve/ve1100.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -23,7 +24,6 @@ #define LISTADOC "listadoc" #define FAKETOTFLD 9999 - #define Usage "Usage: ve1 -0 {[codnum anno {D|P} dalnum alnum {D|P} [ncopie]] | [L]}" // Queste classi (TDocisamfile e TRDocisamfile) servono nel costruttore di TDocumento_form @@ -35,6 +35,7 @@ class TDocisamfile : public TLocalisamfile { TDocumentoEsteso *_doc; + public: virtual TRectype& curr() const { return (TRectype&) *_doc; } virtual int readat(TRecnotype nrec, word lockop = _nolock); @@ -57,26 +58,37 @@ int TDocisamfile::readat(TRecnotype nrec, word lockop) class TRDocisamfile : public TLocalisamfile { TDocumento *_doc; + bool _normal_next; int _row; + protected: TDocumento& doc() const { return *_doc;} + public: - virtual TRectype& curr() const {return ((_row > 0 && _row <= _doc->rows()) ? (TRectype&) doc()[_row] : TLocalisamfile::curr());} + void set_normal_next(const bool b = TRUE) { _normal_next = TRUE; } + virtual int next(word lockop = _nolock) { return _normal_next ? TLocalisamfile::next(lockop) : NOERR; } + virtual TRectype& curr() const ; void set_row(int r) { _row = r;} - TRDocisamfile(TDocumento* doc) : TLocalisamfile(LF_RIGHEDOC) { _doc = doc; _row = 1;} + TRDocisamfile(TDocumento* doc) : TLocalisamfile(LF_RIGHEDOC) { _doc = doc; _row = 1; _normal_next = FALSE;} virtual ~TRDocisamfile() {}; }; + +TRectype& TRDocisamfile::curr() const +{ + TRectype& rr = ((_row > 0 && _row <= _doc->rows()) ? (TRectype&) doc()[_row] : TLocalisamfile::curr()); + return rr; +} //////////////////////////////////////////////////////////////////////////// // classe TDocumento_form customizzata dalla Form per i documenti //////////////////////////////////////////////////////////////////////////// + class TDocumento_form : public TForm { - static TDocumento_form* _form; TDocisamfile* _docfile; TRDocisamfile* _rdocfile; - TLocalisamfile *_tab; + //TLocalisamfile *_tab; TTable *_tip; TSorted_cursor * _sorted_cur; // Valido solo per i form di lista documenti TRelation &_firmrel; // relazione di gestione dei dati della ditta corrente @@ -85,6 +97,7 @@ class TDocumento_form : public TForm TString_array _exclude_array_t; // array di tipi riga da escludere dalla stampa TString_array _exclude_array_a; // array di articoli da escludere dalla stampa TDocumentoEsteso * _doc; // Documento da stampare + TAssoc_array _doc_totals; // Assocarray per codice numerazione contenente i totali nel caso di stampa lista documenti bool _valid, _cli_loaded; // flag che indica se il form e' valido | se l'oggetto cliente è già stato caricato TString_array _group_decimals; // Array di TToken_string per ogni gruppo definito in GENERAL. // Il primo elelemento della token_string conterra' il numero del gruppo @@ -106,8 +119,6 @@ class TDocumento_form : public TForm protected: virtual void extended_parse_general(TScanner &); // gestione dei parametri estesi nella sezione general virtual bool validate(TForm_item &, TToken_string &); // gestione dei messaggi estesi nei campi - void edit_picture(TForm_item & f, const int dec); - void modify_pictures(); bool print_on_body(int r); // Trascrive la riga 'r' del documento sul body. Ritorna TRUE se va stampata, FALSE se va saltata void print_header(TPrinter& p); // Stampa la testata @@ -117,6 +128,8 @@ protected: static void doc_footer_handler(TPrinter& p); public: + void edit_picture(TForm_item & f, const int dec); + void modify_pictures(); virtual TCursor* cursor() const { return _sorted_cur ? _sorted_cur : TForm::cursor(); } void hide_sections(); bool is_faketotfld(); @@ -141,7 +154,7 @@ TDocumento_form::TDocumento_form(TRectype&/*TDocumentoEsteso**/ doc, TRelation& //_doc = doc; _tip = new TTable("%TIP"); - _tab = new TLocalisamfile(LF_TAB); +// _tab = new TLocalisamfile(LF_TAB); TString nomeform; // TFilename profilo; TString codnum(doc.get(DOC_CODNUM)); @@ -222,14 +235,15 @@ TDocumento_form::TDocumento_form(TRectype&/*TDocumentoEsteso**/ doc, TRelation& TDocumento_form::TDocumento_form(const char* form, TRelation& rel): TForm(form), _firmrel(rel), _valid(FALSE) { _tip = new TTable("%TIP"); - _tab = new TLocalisamfile(LF_TAB); +// _tab = new TLocalisamfile(LF_TAB); _cli_loaded= FALSE; _doc = new TDocumentoEsteso; _docfile = new TDocisamfile(_doc); _rdocfile = new TRDocisamfile(_doc); + _rdocfile->set_normal_next(); relation()->replace(_docfile,0); relation()->replace(_rdocfile,1); - _sorted_cur = new TSorted_cursor(relation(), "PROVV|ANNO|CODNUM|STATO|DATADOC"); + _sorted_cur = new TSorted_cursor(relation(), "PROVV|ANNO|CODNUM|STATO|DATADOC|NDOC"); } TDocumento_form::~TDocumento_form() @@ -242,7 +256,7 @@ TDocumento_form::~TDocumento_form() //if (_doc) delete _doc; if (_sorted_cur) delete _sorted_cur; if (_tip) delete _tip; - if (_tab) delete _tab; + //if (_tab) delete _tab; //if (_docfile) delete _docfile; //if (_rdocfile) delete _rdocfile; } @@ -325,6 +339,7 @@ void TDocumento_form::print_documento() for (int r=1; r<=righe; r++) { _rdocfile->set_row(r); + cursor()->next_match(LF_RIGHEDOC); if (pr.rows_left() <= (body.height()+1)) // salto pagina pr.formfeed(); @@ -335,8 +350,44 @@ void TDocumento_form::print_documento() pr.print(body.row(j)); } + if (_doc->tipo().add_conai() && _doc->clifor().vendite().get_bool("CONAIASS")) + { + TRiga_documento last_row(_doc); + TConfig c(CONFIG_DITTA); + + last_row = _rdocfile->curr(); + _rdocfile->zero(); + TString80 desc(c.get("DESCCONAIASS")); + if (desc.empty()) + desc = "Contributo CONAI assolto"; + _rdocfile->put(RDOC_DESCR, desc); + body.update(); + const word h = body.height(); + if (pr.rows_left() <= h+1) // salto pagina + pr.formfeed(); + + for (word j = 0; j < h; j++) + pr.print(body.row(j)); + + _rdocfile->curr() = last_row; + } + +/* I maroni! set_last_page(TRUE); // Cosi' stampera' l'ultima pagina del footer pr.formfeed(); +*/ + TPrint_section* last_foot = exist('F', last_page, FALSE); + if (last_foot != NULL) + { + const word lfh = last_foot->height(); + const word left = pr.rows_left() + pr.footersize(); + if (lfh > left) // Se l'ultimo footer e' troppo grande ... + pr.formfeed(); // Stampa il footer normale + pr.footerlen(lfh); // Fondamentale! + } + set_last_page(TRUE); + pr.formfeed(); // Stampa l'ultimo footer + // Rimette ad 1 il numero della pagina pr.setcurrentpage(1); } @@ -780,9 +831,18 @@ bool TDocumento_form::validate(TForm_item &cf, TToken_string &s) const bool desclunga = rdoc.get_bool("DESCLUNGA"); if (desclunga) { - const TString & s = rdoc.get("DESCEST"); + const TString & dest = rdoc.get("DESCEST"); - descrizione << s; + descrizione << dest; + } + int nfields = s.items(); + for (int j = 1; j < nfields; j++) + { + const TString & fld = s.get(j); + TForm_item & f = cf.find_field(fld); + const TString & val = f.get(); + if (val.not_empty()) + descrizione << " " << val; } cf.set(descrizione); TParagraph_string p(descrizione, cf.width()); @@ -875,7 +935,7 @@ bool TDocumento_form::validate(TForm_item &cf, TToken_string &s) if (code == "_EDITPICTURE") { const int flds2set = s.items() -1; - TString16 val(cf.get()); + TString16 val(cursor()->file(LF_DOC).get(DOC_CODVAL)); const bool valuta = val.not_empty() && val != "LIT"; for (int i = 1; i<=flds2set; i++) { @@ -884,6 +944,52 @@ bool TDocumento_form::validate(TForm_item &cf, TToken_string &s) } } + if (code == "_SEPARATOR") // Riempitore + { + TString sep; + sep.fill('-',s.get_int(1)); + cf.set(sep); + + return TRUE; + } + + if (code == "_LISTADOC") // Messaggio per riepilogo lista documenti + { + const TString16 what(s.get(1)); + TString16 which(s.get(2)); + if (what == "STORE") + { + if (which[0] == '#') + which.ltrim(1); // Toglie il # + const TString16 codnum(cf.section().find_field(atoi(which)).get()); + const real r(cf.get()); + + real* v = (real*) _doc_totals.objptr(codnum); + if (v == NULL) + _doc_totals.add(codnum,r); + else + *v += r; + } + else + { + TString_array k; + _doc_totals.get_keys(k); + const int index = atoi(which)-1; + if (index < k.items()) + { + TString16 codnum(k.row(index)); + if (what == "CODICE") + cf.set(codnum); + else + if (what == "TOTALE") + { + real& r = (real&) _doc_totals[codnum]; + cf.set(r.string()); + } + } + } + } + return TForm::validate(cf, s); // se il codice del messaggio non è identificato viene passato alla funzione standard } @@ -907,7 +1013,7 @@ enum behaviour #define BY_DATE_KEY 3 -class TStampaDoc_application: public TApplication +class TStampaDoc_application: public TSkeleton_application { TString _codnum; // codice di numerazione char _provv; // stampa documenti provvisiori o definitivi (D o P) @@ -921,16 +1027,14 @@ class TStampaDoc_application: public TApplication bool _definitiva; // flag che indica se la stampa è definitiva o no TRelation *_firmrel; // puntatore alla relazione che gestisce i dati della ditta corrente TDocumento_form *_form; // puntatore al form di stampa - TArray _file; TMask * _selection_mask; TArray_sheet *_clifo_sheet; // Array sheet per la selezione cli/fo TAssoc_array _clifo_sel; // Assoc array con solo i cli/fo selezionati. Facilita il filtro... protected: - void open_files(int logicnum, ...); virtual bool create(); virtual bool destroy(); - virtual bool menu(MENU_TAG); + virtual void main_loop(); bool select(void); virtual void on_firm_change(void); virtual behaviour on_module_change(const TString &, TString &); // funzione chiamata ad ogni cambio modulo durante la stampa @@ -1013,7 +1117,7 @@ void TStampaDoc_application::print_selected() pr.open(); TProgind* pi = pr.printtype() != screenvis ? - new TProgind(cur.items(),"Stampa documenti in corso...",FALSE,TRUE,10) : + new TProgind(cur.items(),"Stampa documenti in corso...",FALSE,TRUE) : NULL; if (!_is_lista) { @@ -1046,8 +1150,8 @@ void TStampaDoc_application::print_selected() // altrimenti prosegue // Carica il numero di copie da stampare per questo form - int ncopie = _ncopie == 0 ? _form->ncopie() : _ncopie; // Numero di copie da stampare per questo documento - if (ncopie == 0) ncopie = 1; + int ncopie = _ncopie <= 0 ? _form->ncopie() : _ncopie; // Numero di copie da stampare per questo documento + if (ncopie <= 0) ncopie = 1; for (int n=0; n < ncopie; n++) { @@ -1058,7 +1162,8 @@ void TStampaDoc_application::print_selected() if (_definitiva && (numerazione_definitiva(_form->doc()) != NOERR)) { // se la stampa è definitiva viene lanciata la procedura di rinumerazione - if (_interattivo) error_box("Non è possibile completare la procedura di numerazione definitiva dei documenti. Errore %d", doc.status()); + if (_interattivo) + error_box("Non è possibile completare la procedura di numerazione definitiva dei documenti. Errore %d", doc.status()); break; } // Totalizza gli importi per eventuale stampa su FAKETOTFLD @@ -1084,8 +1189,6 @@ void TStampaDoc_application::print_selected() rows[1] = hh; rows[2] = fl; rows[3] = 0; - _form->genera_intestazioni(odd_page, hh-1); - _form->genera_fincatura(odd_page, hh-2, fl, rows); _form->cursor()->setkey(_key); darec.put(DOC_DATADOC, _dadata); darec.put(DOC_PROVV, _provv); @@ -1093,7 +1196,11 @@ void TStampaDoc_application::print_selected() arec = darec; arec.put(DOC_DATADOC, _adata); _form->cursor()->setregion(darec,arec); - _form->find_field('B', odd_page, "RIGHE").enable(_selection_mask->get_bool(F_DETTAGLIO)); // Visualizza i dettagli se richiesto + + const bool dettaglio = _selection_mask->get_bool(F_DETTAGLIO); + _form->find_field('B', odd_page, "H_RIGHE").enable(dettaglio); // Visualizza i dettagli righe se richiesto + _form->find_field('B', odd_page, "RIGHE").enable(dettaglio); + set_filter(); if (_form->cursor()->items()) _form->print(); @@ -1174,11 +1281,34 @@ void TStampaDoc_application::set_filter() // NB: se _clifo_sel non contiene nulla, non viene effettuato alcun filtro su CLI/FO (non setta la funzione!!) filtro.format("TIPOCF==\"%c\"", _selection_mask->get(F_TIPOCF)[0]); + const int selval = _selection_mask->get_int(F_SELVAL); + const TString16 val = _selection_mask->get(F_VALUTA); + if (selval == 1) //In Lire + { + filtro << "&&((CODVAL==\"LIT\")"; + filtro << "||(CODVAL==\"\"))"; + } + else + if (selval == 2) // nella valuta specificata + { + filtro << "&&(CODVAL==\""; + filtro << val; + filtro << "\")"; + _form->edit_picture(_form->find_field('F',last_page, 6), 2); // pictures per totali finali + _form->edit_picture(_form->find_field('F',last_page, 8), 2); + _form->edit_picture(_form->find_field('F',last_page, 10), 2); + _form->edit_picture(_form->find_field('F',last_page, 12), 2); + _form->edit_picture(_form->find_field('F',last_page, 16), 2); + _form->edit_picture(_form->find_field('F',last_page, 17), 2); + } + else + _form->find_field('B',odd_page,35).set("1"); // Cosi' effettua i totali generali in lire + // Compone l'espressione filtro... // prende tutte le righe dello spreasheet che non sono totalmente vuote: // (CODNUM=="xxx"&&(STATO=="x"||STATO=="y"||STATO=="z"...)) ---> questo per una singola riga... // se vi sono piu' righe, lo si ripete aggiungendo prima un bellissimo "||" - + bool put_parentheses = FALSE; TSheet_field& sf = (TSheet_field&)_selection_mask->field(F_SHEETNUMS); const int rows = sf.items(); for (int j=0; j=0) + if (put_parentheses) filtro << ")"; // Parentesi finale cur->setfilter(filtro); @@ -1246,23 +1377,22 @@ long TStampaDoc_application::select_cod_range(long from, long to) void TStampaDoc_application::build_clifo_list(const char c) { - TLocalisamfile* clifo = (TLocalisamfile*)_file.objptr(LF_CLIFO); - CHECK(clifo, "Il file LF_CLIFO non risulta aperto"); + TLocalisamfile clifo(LF_CLIFO); _clifo_sheet->destroy(); // Distrugge la lista TToken_string tt; - TRecfield tipocf(clifo->curr(), CLI_TIPOCF); - clifo->zero(); - clifo->put(CLI_TIPOCF, c); + TRecfield tipocf(clifo.curr(), CLI_TIPOCF); + clifo.zero(); + clifo.put(CLI_TIPOCF, c); - for (clifo->read(_isgteq); !clifo->eof(); clifo->next()) // Compila la lista!! + for (clifo.read(_isgteq); !clifo.eof(); clifo.next()) // Compila la lista!! { if (((const char*)tipocf)[0] != c) break; tt = ""; tt.add(" "); - tt.add(clifo->get(CLI_CODCF)); - tt.add(clifo->get(CLI_RAGSOC)); + tt.add(clifo.get(CLI_CODCF)); + tt.add(clifo.get(CLI_RAGSOC)); _clifo_sheet->add(tt); } } @@ -1442,33 +1572,21 @@ bool TStampaDoc_application::filter_clifo(const TRelation* r) //////////////////////////////////////////////////////////////// // Funzioni rimanenti //////////////////////////////////////////////////////////////// -void TStampaDoc_application::open_files(int logicnum, ...) -{ - va_list marker; - va_start(marker, logicnum); - while (logicnum > 0) - { - CHECKD(_file.objptr(logicnum) == NULL, "File gia' aperto: ", logicnum); - _file.add(new TLocalisamfile(logicnum), logicnum); - logicnum = va_arg(marker, int); - } -} bool TStampaDoc_application::create() -{ - TApplication::create(); +{ _firmrel= new TRelation(LF_NDITTE); // istanziamento e impostazione della relazione di gestione della ditta corrente _firmrel->add(LF_ANAG, "TIPOA=TIPOA|CODANAGR=CODANAGR"); _firmrel->add(LF_UNLOC,"CODDITTA=CODDITTA"); // si posiziona sulla prima unita' locale della ditta _firmrel->add(LF_COMUNI, "COM=STATORES+COMRES", 1, LF_ANAG, 100+LF_COMUNI); _firmrel->add(LF_COMUNI, "COM=STATORES+COMRF", 1, LF_ANAG, 200+LF_COMUNI); - open_files(LF_TABCOM, LF_TAB, LF_OCCAS, LF_CLIFO, LF_CFVEN, LF_MOVMAG, LF_RMOVMAG, LF_CONDV, 0); + open_files(LF_TABCOM, LF_TAB, LF_OCCAS, LF_CLIFO, LF_INDSP, LF_CFVEN, LF_MOVMAG, LF_RMOVMAG, LF_CONDV, LF_ANAMAG , LF_SVRIEP, LF_AGENTI, LF_PERCPROV, 0); const int argc = TApplication::argc(); _is_lista = argc == 3 && argv(2)[0] == 'L'; on_firm_change(); _selection_mask = new TMask(_is_lista ? "ve1100b" : "ve1100a"); - _clifo_sheet = new TArray_sheet(-1, -1, -4, -4, "Selezione Clienti/Fornitori", + _clifo_sheet = new TArray_sheet(3, 3, -3, -3, "Selezione Clienti/Fornitori", "@1|Codice@6R|Descrizione@50"); build_clifo_list(); // Costruisce l'array sheet dei clienti (si parte!!) @@ -1516,7 +1634,7 @@ bool TStampaDoc_application::create() if (argc == 2 || _is_lista) { // oppure lancio della maschera _interattivo= TRUE; - dispatch_e_menu(BAR_ITEM(1)); + TSkeleton_application::create(); } else return error_box(Usage); @@ -1556,6 +1674,9 @@ bool TStampaDoc_application::select() _ncopie = m.get_int(F_NCOPIE); if (_alnum == 0) _alnum = 9999999L; + + TString16 config; config << "NUM" << _codnum; + printer().read_configuration(config); } _anno= m.get_int(F_ANNO); @@ -1577,18 +1698,17 @@ bool TStampaDoc_application::select() return FALSE; } -bool TStampaDoc_application::menu(MENU_TAG) +void TStampaDoc_application::main_loop() { - while (select()) print_selected(); - return FALSE; + while (select()) + print_selected(); } // Do all the work! -int ve1100(int argc, char** argv) -{ - +int ve1100(int argc, char* argv[]) +{ TStampaDoc_application a; - const bool cond = argc == 4 && argv[2][0] == 'L'; // List documenti + const bool cond = argc == 4 && argv[2][0] == 'L'; // Lista documenti a.run(argc, argv, cond ? "Lista documenti" : "Stampa documenti di vendita"); return (0); } diff --git a/ve/ve1100.h b/ve/ve1100.h index c51d766c4..cbdb74d7e 100755 --- a/ve/ve1100.h +++ b/ve/ve1100.h @@ -17,7 +17,9 @@ #define F_SELECTED 113 #define BUT_SEL 114 #define BUT_ANN 115 -#define F_DETTAGLIO 116 +#define F_SELVAL 116 +#define F_VALUTA 117 +#define F_DETTAGLIO 118 #define F_SHEETNUMS 201 diff --git a/ve/ve1100a.uml b/ve/ve1100a.uml index 3c900d96a..ba9c8759c 100755 --- a/ve/ve1100a.uml +++ b/ve/ve1100a.uml @@ -1,6 +1,6 @@ #include "ve1100.h" -PAGE "Stampa Documenti Vendita" -1 -1 60 14 +PAGE "Stampa Documenti Vendita" -1 -1 60 15 STRING F_CODNUM 4 4 BEGIN diff --git a/ve/ve2300.cpp b/ve/ve2300.cpp index 298b10591..d98229739 100755 --- a/ve/ve2300.cpp +++ b/ve/ve2300.cpp @@ -79,7 +79,8 @@ TRighe_condizioni_vendita &app() { // funzione che ritorna il riferimento alla c -bool TRighe_condizioni_vendita::user_create() { +bool TRighe_condizioni_vendita::user_create() +{ bool gotcha= FALSE; // booleano di avvenuta inizializzazione _rcondven= "*"; // inizializzazione dell'indicatore del tipo di archivio @@ -91,11 +92,12 @@ bool TRighe_condizioni_vendita::user_create() { if (choose.run() == K_ENTER) _rcondven= choose.get(F_TIPORCV); // prende il tipo di archivio dalla maschera } _rcondven.upper(); // rende la stringa upper-case - _msk= new TMask("VE2300X"); + _msk= new TMask("ve2300x"); TConfig prassid(CONFIG_DITTA, "ve"); // apre il file di configurazione della ditta corrente - switch (_rcondven[0]) { + switch (_rcondven[0]) + { case 'L': // listini - _msk->set_caption("Archivio righe listini"); + _msk->set_caption("Righe listini"); key_hide(*_msk, F_R_C_TIPOCF); // settaggio dei campi da eliminare... { TList_field& l = (TList_field&)_msk->field(F_R_C_TIPOCF); @@ -121,7 +123,7 @@ bool TRighe_condizioni_vendita::user_create() { gotcha= TRUE; break; case 'C': // contratti - _msk->set_caption("Archivio righe contratti"); + _msk->set_caption("Righe contratti"); key_hide(*_msk, F_R_L_CATVEN); // settaggio dei campi da eliminare... key_hide(*_msk, F_R_L_COD); key_hide(*_msk, F_R_O_COD); @@ -146,7 +148,7 @@ bool TRighe_condizioni_vendita::user_create() { gotcha= TRUE; break; case 'O': // offerte - _msk->set_caption("Archivio righe offerte"); + _msk->set_caption("Righe offerte"); key_hide(*_msk, F_R_L_CATVEN); // settaggio dei campi da eliminare... key_hide(*_msk, F_R_C_TIPOCF); { diff --git a/ve/ve2300.uml b/ve/ve2300.uml index 5866ab552..72910969d 100755 --- a/ve/ve2300.uml +++ b/ve/ve2300.uml @@ -1,22 +1,22 @@ #include "ve2300.h" -PAGE "Righre condizioni di vendita " -1 -1 40 10 +PAGE "Righe condizioni di vendita " -1 -1 28 8 -RADIOBUTTON F_TIPORCV 36 +RADIOBUTTON F_TIPORCV 1 26 BEGIN - PROMPT 1 2 "Tipo di archivio " + PROMPT 1 1 "Tipo di archivio " ITEM "L|Listini" ITEM "C|Contratti" ITEM "O|Offerte" END -BUTTON DLG_SELECT 9 2 +BUTTON DLG_SELECT 10 2 BEGIN PROMPT -12 -1 "Selezione" MESSAGE EXIT,K_ENTER END -BUTTON DLG_QUIT 9 2 +BUTTON DLG_QUIT 10 2 BEGIN PROMPT -22 -1 "" END diff --git a/ve/ve2300x.uml b/ve/ve2300x.uml index 0978facb2..25c2b635c 100755 --- a/ve/ve2300x.uml +++ b/ve/ve2300x.uml @@ -1,7 +1,6 @@ -#include #include "ve2300x.h" -TOOLBAR "" 0 20 60 2 +TOOLBAR "" 0 19 0 3 #include ENDPAGE @@ -308,7 +307,7 @@ STRING F_R_C_RICERCA 1 // campo di aggancio per la ricerca sui contratti, nascos BEGIN PROMPT 100 100 "" FLAG "D" - USE LF_RCONDV SELECT (TIPO==#F_R_TIPO)&&(TIPOCF==#F_R_C_TIPOCF)&&(CODCF==#F_R_C_CODCF)&&(COD==#F_R_L_COD) + USE LF_RCONDV SELECT (TIPO==#F_R_TIPO)&&(TIPOCF==#F_R_C_TIPOCF)&&(CODCF==#F_R_C_CODCF)&&(COD==#F_R_C_COD) //INPUT TIPO F_R_TIPO SELECT //INPUT TIPOCF F_R_C_TIPOCF //INPUT CODCF F_R_C_CODCF @@ -331,7 +330,7 @@ STRING F_R_O_RICERCA 1 // campo di aggancio per la ricerca sulle offerte, nascos BEGIN PROMPT 100 100 "" FLAG "D" - USE LF_RCONDV SELECT (TIPO==#F_R_TIPO)&&(COD==#F_R_L_COD) + USE LF_RCONDV SELECT (TIPO==#F_R_TIPO)&&(COD==#F_R_O_COD) //INPUT TIPO F_R_TIPO SELECT //INPUT COD F_R_O_COD INPUT TIPORIGA F_R_TIPORIGA @@ -361,7 +360,7 @@ NUMBER F_R_PREZZO 15 BEGIN PROMPT 2 10 "Prezzo netto " FIELD LF_RCONDV->PREZZO - PICTURE "###.###.###.###" + PICTURE "." END @@ -376,7 +375,7 @@ END NUMBER F_R_PREZZO_LORDO 15 BEGIN PROMPT 46 10 "Prezzo lordo " - PICTURE "###.###.###.###" + PICTURE "." FLAGS "H" END diff --git a/ve/ve2400.cpp b/ve/ve2400.cpp index 696193046..c57cd86e1 100755 --- a/ve/ve2400.cpp +++ b/ve/ve2400.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include "velib.h" #include "..\cg\cglib01.h" @@ -23,8 +24,8 @@ class TMask_anamag: public TMask { int last_annosto; TString16 _um_principale; - TMagazzini _magazzini; - TEsercizi_contabili _esercizi_contabili; + TMagazzini *_magazzini; + TEsercizi_contabili *_esercizi_contabili; static bool handle_codice(TMask_field &, KEY); // handler del campo codice articolo static bool handle_livart(TMask_field &, KEY); // handler dei campi codice articolo (livelli) @@ -41,6 +42,7 @@ class TMask_anamag: public TMask { static bool handle_sheet_um_um(TMask_field &, KEY); // handler del campo UM dello sheet delle unità di misura static bool handle_sheet_um_price(TMask_field &, KEY); // handler del campo PREZZO e PREZZO_LORDO dello sheet delle unità di misura static bool handle_sheet_giac_valgiac(TMask_field &, KEY); // handler + static bool handle_sheet_stomag_stoval(TMask_field &, KEY); // handler static bool handle_autoinsert_livgiac(TMask_field &, KEY); // handler del campo static void sheetgiac_get(TSheet_field &fld_righe, int item); @@ -55,13 +57,14 @@ class TMask_anamag: public TMask { void update_totali_storico(TString & codmag); bool check_totali_storico(); public: + void set_parametered_fields(); void ricalcola_giacenze(); TString16 &um_principale() {return _um_principale;} - TMagazzini & magazzini() {return _magazzini;} - TEsercizi_contabili &esercizi_contabili() {return _esercizi_contabili;} + TMagazzini & magazzini() {return *_magazzini;} + TEsercizi_contabili &esercizi_contabili() {return *_esercizi_contabili;} - TMask_anamag(TRelation * rel,bool mg_autorized); + TMask_anamag(TRelation * rel); virtual ~TMask_anamag(); }; @@ -79,8 +82,10 @@ protected: virtual bool changing_mask(int) { return FALSE; } virtual TRelation *get_relation() const { return _rel; } virtual void init_insert_mode(TMask &); + virtual void on_firm_change(); virtual int read(TMask& m); + void load_um(TMask& m); virtual bool remove(); virtual int write(const TMask& m); virtual int rewrite(const TMask& m); @@ -88,98 +93,98 @@ protected: public: // @cmember Disabilita la verifica del modulo : essendo una anagrafica, va sempre abilitata virtual bool check_autorization() const {return FALSE;} - TAnagrafica_magazzino() {} + TAnagrafica_magazzino() { _rel = NULL; _msk = NULL;} virtual ~TAnagrafica_magazzino() {} }; inline TAnagrafica_magazzino& app() { return (TAnagrafica_magazzino&) main_app(); } - - -// costruttore della maschera anagrafica di magazzino -TMask_anamag::TMask_anamag(TRelation * rel,bool mg_autorized) : TMask("ve2400") +void TMask_anamag::set_parametered_fields() { - _rel=rel; + // *************************************************** + // ABILITAZIONI PARAMETRICHE + + if (livelli_giac) + delete livelli_giac; + if (livelli_art) + delete livelli_art; + if (_esercizi_contabili) + delete _esercizi_contabili; + if (_magazzini) + delete _magazzini; + + _esercizi_contabili = new TEsercizi_contabili; + _magazzini = new TMagazzini; + // imposta il puntatore al gestore livelli giacenze livelli_giac= new TCodgiac_livelli(); livelli_art= new TCodart_livelli(); // imposta il valore dell'anno per le giacenze last_annogiac=-1; last_annosto=-1; - // sheet unità di misura - set_handler(F_SHEETUM, handle_sheet_um); - TSheet_field &f= (TSheet_field &)field(F_SHEETUM); - f.set_notify(notify_sheet_um); - TMask &fm= f.sheet_mask(); - fm.set_handler(FS_CODUM, handle_sheet_um_um); - fm.set_handler(FS_PREZZO, handle_sheet_um_price); - fm.set_handler(FS_PREZZO_LORDO, handle_sheet_um_price); - // sheet descrizioni in lingua - set_handler(F_SHEETDESLIN, handle_sheet_deslin); - // sheet codici corrispondenti - set_handler(F_SHEETCOD, handle_sheet_cod); - // *************************************************** - // ABILITAZIONI PARAMETRICHE - // Abilita la pagina delle giacenze - if (mg_autorized && magazzini().gestmag()) - { - // sheet giacenze - set_handler(F_ANNO, handle_anno); - set_handler(F_SHEETGIAC, handle_sheetgiac); - sfield(F_SHEETGIAC).set_notify(notify_sheet_giac); - sfield(F_SHEETGIAC).set_userget(sheetgiac_get); - sfield(F_SHEETGIAC).set_userput(sheetgiac_put); - sfield(F_SHEETGIAC).sheet_mask().set_handler(F_VALGIAC, handle_sheet_giac_valgiac); - // sheet storico - set_handler(F_SHEETSTOMAG, handle_sheetstomag); - sfield(F_SHEETSTOMAG).set_notify(notify_sheet_sto); - sfield(F_SHEETSTOMAG).set_userget(sheetsto_get); - sfield(F_SHEETSTOMAG).set_userput(sheetsto_put); - set_handler(F_STOANNO, handle_stoanno); - - enable_page(PAGE_GIACENZE,TRUE); - enable_page(PAGE_STORICO,TRUE); - // setta i campi della maschera per la pagina giacenze - TSheet_field &fld_stomag= (TSheet_field &)field(F_SHEETSTOMAG); - TSheet_field &fld_giac= (TSheet_field &)field(F_SHEETGIAC); - // disabilita le colonne quando non sono utilizzati i livelli di giacenza - for (int i=0; i<4; i++) - { - livelli_giac->set_sheetcolumn(fld_giac,F_LIV1+i,i+1); - if (livelli_giac->autoinsert(i+1)) - { - // codice autoinseribile - TMask_field & campo_liv=fld_giac.sheet_mask().field(F_LIV1+i); - campo_liv.check_type(CHECK_SEARCH); - campo_liv.set_handler(handle_autoinsert_livgiac); - } - } - // disabilita la colonna numero distinte - if (FALSE) { - fld_giac.delete_column(fld_giac.cid2index(F_NDIST)); - fld_giac.sheet_mask().field(F_NDIST).enable(FALSE); - } - // abilita la gestione delle ubicazioni (manuale/su tabella) - if (magazzini().gestubi_man()) { - fld_giac.sheet_mask().field(F_UBICAZ).show(FALSE); - fld_giac.sheet_mask().field(F_UBICAZD).show(FALSE); - fld_giac.sheet_mask().field(F_UBICAZ2).show(TRUE); - } else { - fld_giac.sheet_mask().field(F_UBICAZ).show(TRUE); - fld_giac.sheet_mask().field(F_UBICAZD).show(TRUE); - fld_giac.sheet_mask().field(F_UBICAZ2).show(FALSE); - } - // abilita la gestione del monomagazzino - fld_giac.sheet_mask().field(F_DESMAG).enable(magazzini().gestmultimag()); - fld_giac.enable_column(fld_giac.cid2index(F_CODMAG),magazzini().gestmultimag()); - fld_stomag.enable_column(fld_stomag.cid2index(F_STOCODMAG),magazzini().gestmultimag()); + const bool gestmag = app().has_module(MGAUT) && magazzini().gestmag(); - } else { - enable_page(PAGE_GIACENZE,FALSE); - enable_page(PAGE_STORICO,FALSE); + // sheet giacenze + set_handler(F_ANNO, gestmag ? handle_anno : NULL); + set_handler(F_SHEETGIAC, gestmag ? handle_sheetgiac : NULL); + sfield(F_SHEETGIAC).set_notify(gestmag ? notify_sheet_giac : NULL); + sfield(F_SHEETGIAC).set_userget(gestmag ? sheetgiac_get : NULL); + sfield(F_SHEETGIAC).set_userput(gestmag ? sheetgiac_put : NULL); + sfield(F_SHEETGIAC).sheet_mask().set_handler(F_VALGIAC, gestmag ? handle_sheet_giac_valgiac : NULL); + // sheet storico + set_handler(F_SHEETSTOMAG, gestmag ? handle_sheetstomag : NULL); + sfield(F_SHEETSTOMAG).set_notify(gestmag ? notify_sheet_sto : NULL); + sfield(F_SHEETSTOMAG).set_userget(gestmag ? sheetsto_get : NULL); + sfield(F_SHEETSTOMAG).set_userput(gestmag ? sheetsto_put : NULL); + + TMask& stomask = sfield(F_SHEETSTOMAG).sheet_mask(); + stomask.set_handler(F_STOVAL, gestmag ? handle_sheet_stomag_stoval : NULL); + + ((TReal_field&) stomask.field(F_STOVALUN)).set_decimals(TCurrency::get_firm_dec(TRUE)); + ((TReal_field&) stomask.field(F_STOVAL)).set_decimals(TCurrency::get_firm_dec(FALSE)); + + set_handler(F_STOANNO, gestmag ? handle_stoanno : NULL); + + // setta i campi della maschera per la pagina giacenze + TSheet_field &fld_stomag= (TSheet_field &)field(F_SHEETSTOMAG); + TSheet_field &fld_giac= (TSheet_field &)field(F_SHEETGIAC); + // disabilita le colonne quando non sono utilizzati i livelli di giacenza + for (int i=0; i<4; i++) + { + livelli_giac->set_sheetcolumn(fld_giac,F_LIV1+i,i+1); + if (livelli_giac->autoinsert(i+1)) + { + // codice autoinseribile + TMask_field & campo_liv=fld_giac.sheet_mask().field(F_LIV1+i); + campo_liv.check_type(CHECK_SEARCH); + campo_liv.set_handler(gestmag ? handle_autoinsert_livgiac : NULL); + } } + // disabilita la colonna numero distinte + if (FALSE) { + fld_giac.delete_column(fld_giac.cid2index(F_NDIST)); + fld_giac.sheet_mask().field(F_NDIST).enable(FALSE); + } + // abilita la gestione delle ubicazioni (manuale/su tabella) + if (magazzini().gestubi_man()) { + fld_giac.sheet_mask().field(F_UBICAZ).show(FALSE); + fld_giac.sheet_mask().field(F_UBICAZD).show(FALSE); + fld_giac.sheet_mask().field(F_UBICAZ2).show(TRUE); + } else { + fld_giac.sheet_mask().field(F_UBICAZ).show(TRUE); + fld_giac.sheet_mask().field(F_UBICAZD).show(TRUE); + fld_giac.sheet_mask().field(F_UBICAZ2).show(FALSE); + } + // abilita la gestione del monomagazzino + fld_giac.sheet_mask().field(F_DESMAG).enable(magazzini().gestmultimag()); + fld_giac.enable_column(fld_giac.cid2index(F_CODMAG),magazzini().gestmultimag()); + fld_stomag.enable_column(fld_stomag.cid2index(F_STOCODMAG),magazzini().gestmultimag()); + + enable_page(PAGE_GIACENZE,gestmag); + enable_page(PAGE_STORICO,gestmag); + // abilita la visualizzazione dei campi distinti per i livelli articolo if (FALSE) { @@ -212,6 +217,73 @@ TMask_anamag::TMask_anamag(TRelation * rel,bool mg_autorized) : TMask("ve2400") } } +// costruttore della maschera anagrafica di magazzino +TMask_anamag::TMask_anamag(TRelation * rel) : TMask("ve2400") +{ + _rel=rel; + // sheet unità di misura + set_handler(F_SHEETUM, handle_sheet_um); + TSheet_field &f= (TSheet_field &)field(F_SHEETUM); + f.set_notify(notify_sheet_um); + TMask &fm= f.sheet_mask(); + fm.set_handler(FS_CODUM, handle_sheet_um_um); + fm.set_handler(FS_PREZZO, handle_sheet_um_price); + fm.set_handler(FS_PREZZO_LORDO, handle_sheet_um_price); + + f.set_lines_record(*(new TRecord_array(LF_UMART, "NRIGA"))); + + // sheet descrizioni in lingua + set_handler(F_SHEETDESLIN, handle_sheet_deslin); + // sheet codici corrispondenti + set_handler(F_SHEETCOD, handle_sheet_cod); + + livelli_giac = NULL; + livelli_art = NULL; + _esercizi_contabili = NULL; + _magazzini = NULL; + + set_parametered_fields(); + + TConfig c(CONFIG_DITTA); + bool disable_user_page = TRUE; + TString80 prompt; + + for (int i = 1; i <= 10; i++) + { + + if (c.get_bool("CHK_USER", "ve", i)) + { + TEditable_field * f = NULL; + prompt = c.get("PROMPT_USER", "ve", i); + prompt.rpad(20); + const char type = c.get_char("TYPE_USER", "ve", i); + if (type == 'S') + f = &add_string(F_USER1 + i - 1, PAGE_USER, prompt, 2, 3 + i, c.get_int("LEN_USER", "ve", i)); + else + if (type == 'N') + { + f = &add_number(F_USER1 + i - 1, PAGE_USER, prompt, 2, 3 + i, c.get_int("LEN_USER", "ve", i)); + ((TReal_field *) f)->set_decimals(c.get_int("DEC_USER", "ve", i)); + } + else + if (type == 'D') + f = &add_date(F_USER1 + i - 1, PAGE_USER, prompt, 2, 3 + i); + else + if (type == 'I') + f = &add_currency(F_USER1 + i - 1, PAGE_USER, prompt, 2, 3 + i, c.get_int("LEN_USER", "ve", i)); + else + if (type == 'X') + f = &add_boolean(F_USER1 + i - 1, PAGE_USER, prompt, 2, 3 + i); + if (f != NULL) + f->set_field(format("USER%d", i)); + disable_user_page = FALSE; + } + } + + if (disable_user_page) + disable_page(PAGE_USER); +} + void TMask_anamag::sheetsto_put(TSheet_field &sheet_sto, int item) { if (item>1) return; @@ -268,14 +340,20 @@ void TMask_anamag::clear_info_sto() TMask_anamag::~TMask_anamag() { - delete livelli_art; - delete livelli_giac; + if (livelli_art) + delete livelli_art; + if (livelli_giac) + delete livelli_giac; + if (_esercizi_contabili) + delete _esercizi_contabili; + if (_magazzini) + delete _magazzini; } bool TMask_anamag::handle_autoinsert_livgiac(TMask_field &fld, KEY k) { - if (k == K_TAB & fld.focusdirty() && !fld.get().empty()) + if (k == K_TAB && fld.focusdirty() && !fld.empty()) { TMask_anamag & mask=(TMask_anamag &) fld.mask().get_sheet()->mask(); const int levnum=fld.dlg()-F_LIV1+1; @@ -418,18 +496,16 @@ bool TMask_anamag::handle_sheet_um(TMask_field &fld, KEY k) TMask_anamag & m= (TMask_anamag &)(fld.mask()); if (k == K_ENTER) { - if (*f.cell(0,f.cid2index(FS_CODUM))==' ') - return error_box("La prima unità di misura deve essere specificata"); const int items = f.items(); if (items > 0) { + const char *codum=f.cell(0,f.cid2index(FS_CODUM)); + if (*codum==' ') + return error_box("La prima unità di misura deve essere specificata"); TAssoc_array v; // istanzia l'hash table per il controllo di univocità for (int i= 0; iset_parametered_fields(); +} bool TAnagrafica_magazzino::user_create() { @@ -1106,7 +1209,7 @@ bool TAnagrafica_magazzino::user_create() // apre la maschera e dispone gli sheet _rel= new TRelation(LF_ANAMAG); - _msk= new TMask_anamag(_rel,has_module(MGAUT)); + _msk= new TMask_anamag(_rel); return TRUE; } @@ -1131,50 +1234,80 @@ int TAnagrafica_magazzino::read(TMask& m) // ***************************** // LETTURA SHEET UNITA' DI MISURA - - TSheet_field &fld_um= (TSheet_field &)m.field(F_SHEETUM); // prende il sheet delle unità di misura - if (fld_um.items() == 0) - ((TToken_string &)fld_um.row(0)) = "|1"; // aggiunge una riga allo sheet - else - ((TToken_string &)fld_um.row(0)).add("1",fld_um.cid2index(FS_FCUM)); // forza la prima unita' di misura a 1 - fld_um.disable_cell(0, fld_um.cid2index(FS_FCUM)); // mette in sola lettura il secondo campo della prima riga (il fattore di conversione della prima U.M. è fisso a 1) - fld_um.force_update(0); // aggiorna lo stato della riga 0 - TString16 um_principale; - //((TMask_anamag&)m).um_principale=fld_um.cell(0, fld_um.cid2index(FS_CODUM)); - um_principale=fld_um.cell(0, fld_um.cid2index(FS_CODUM)); - m.set(F_UMPRINCIPALE,um_principale); - m.set(F_UMPRINCIPALE2,um_principale); - } // no errors in TRelation_application::read(m); + load_um(m); + } return err; } -bool TAnagrafica_magazzino::remove() - +void TAnagrafica_magazzino::load_um(TMask& m) { - return TRelation_application::remove(); + // ***************************** + // LETTURA SHEET UNITA' DI MISURA + TSheet_field &fld_um= (TSheet_field &)m.field(F_SHEETUM); // prende lo sheet delle unità di misura + get_relation()->lfile().put(ANAMAG_CODART,m.get(F_CODART)); + fld_um.record()->read(*fld_um.putkey(*get_relation())); + fld_um.autoload(*get_relation()); +// else +// ((TToken_string &)fld_um.row(0)).add("1",fld_um.cid2index(FS_FCUM)); // forza la prima unita' di misura a 1 +// fld_um.disable_cell(0, fld_um.cid2index(FS_FCUM)); // mette in sola lettura il secondo campo della prima riga (il fattore di conversione della prima U.M. è fisso a 1) +// fld_um.force_update(0); // aggiorna lo stato della riga 0 + TString16 um_principale; + um_principale=fld_um.cell(0, fld_um.cid2index(FS_CODUM)); + m.set(F_UMPRINCIPALE,um_principale); + m.set(F_UMPRINCIPALE2,um_principale); +} + +bool TAnagrafica_magazzino::remove() +{ + bool ok = TRelation_application::remove(); + if (ok) + { + TMask &m=curr_mask(); + TSheet_field &f= (TSheet_field &)m.field(F_SHEETUM); // prende lo sheet delle unità di misura + TLocalisamfile distinte(LF_DIST); + distinte.put("CODDIST",m.get(F_CODART)); + int err=distinte.read();// esiste la distinta ? + switch(err) + { + case _iskeynotfound : + case _isemptyfile : + case _iseof: + ok &= (f.record()->remove() == NOERR); + break; + } + } + return ok; } int TAnagrafica_magazzino::write(const TMask& m) { - return TRelation_application::write(m); + int err =TRelation_application::write(m); + if (err==NOERR) + { + TSheet_field &f= (TSheet_field &)m.field(F_SHEETUM); // prende lo sheet delle unità di misura + err|=f.record()->write(FALSE); + } + return err; } int TAnagrafica_magazzino::rewrite(const TMask& m) { - const int err =TRelation_application::rewrite(m); + int err =TRelation_application::rewrite(m); + if (err==NOERR) + { + TSheet_field &f= (TSheet_field &)m.field(F_SHEETUM); // prende lo sheet delle unità di misura + err|=f.record()->write(TRUE); + } ((TMask_anamag &)m).ricalcola_giacenze(); return err; } void TAnagrafica_magazzino::init_insert_mode(TMask &m) { + load_um(m); TSheet_field &f= (TSheet_field &)m.field(F_SHEETUM); - if (f.items()==0) - { - ((TToken_string &)f.row(0)) = "|1"; // aggiunge una riga allo sheet - f.disable_cell(0, 1); // mette in sola lettura il secondo campo della prima riga (il fattore di conversione della prima U.M. è fisso a 1) - f.force_update(0); // aggiorna lo stato della riga 0 - } + if (f.items() == 0) + f.row(0) = " |1"; // aggiunge una riga allo sheet } // ************************ diff --git a/ve/ve2400.h b/ve/ve2400.h index ac3359af0..9c7604ee3 100755 --- a/ve/ve2400.h +++ b/ve/ve2400.h @@ -44,7 +44,7 @@ #define F_CLASSEFISD 156 #define F_ARTPROD 157 #define F_TIPOCF 158 -#define F_PRESIDIO 159 +#define F_PRESIDIO 159 #define F_CODIVAR 160 #define F_SCONTO 161 @@ -62,22 +62,23 @@ #define F_PROVOR2 173 #define F_RICARICO 174 #define F_RIORDINO 175 +#define F_A_LOTTORIOR 176 +#define F_A_LOTTOIRIOR 177 +#define F_A_GIORNIRIOR 178 -#define F_LEADTIME 118 +#define F_INDBILA 179 +#define F_INDBILV 180 -#define F_INDBILA 176 -#define F_INDBILV 177 +#define F_GOLEM 181 -#define F_GOLEM 178 +#define H_ANNO 182 +#define F_ANNO 183 +#define F_ANNORIF 184 -#define H_ANNO 180 -#define F_ANNO 181 -#define F_ANNORIF 182 - -#define F_STOANNO 183 -#define F_STOANNORIF 184 -#define F_UMPRINCIPALE 185 -#define F_UMPRINCIPALE2 186 +#define F_STOANNO 185 +#define F_STOANNORIF 186 +#define F_UMPRINCIPALE 187 +#define F_UMPRINCIPALE2 188 #define F_GCA 189 #define F_LIVART1 190 @@ -125,6 +126,29 @@ #define F_CODICELAV 261 #define F_DESCRAGG 262 +#define F_USER1 271 +#define F_USER2 272 +#define F_USER3 273 +#define F_USER4 274 +#define F_USER5 275 +#define F_USER6 276 +#define F_USER7 277 +#define F_USER8 278 +#define F_USER9 279 +#define F_USER10 280 +#define F_CONACC 281 +#define F_CONALL 282 +#define F_CONCAR 283 +#define F_CONPLA 284 +#define F_CONLEG 285 +#define F_CONVET 286 +#define F_VALSTATUN 287 +#define F_PAESEOR 288 + +#define F_NUMREGULC1 300 +#define F_NUMRIGULC1 301 +#define F_NUMREGULC2 302 +#define F_NUMRIGULC2 303 #define G_CODART 1 #define G_DESART 2 @@ -158,9 +182,11 @@ #define F_STOANNOES 103 #define F_NOMETOT 203 #define F_STOQUANT 104 -#define F_STOVAL 105 +#define F_STOVALUN 105 +#define F_STOVAL 106 #define F_STOCODART 120 #define PAGE_GIACENZE 4 #define PAGE_STORICO 5 +#define PAGE_USER 6 #define SIMBOLO_TOTALI '>' diff --git a/ve/ve2400.uml b/ve/ve2400.uml index 94932ae53..be5068ec3 100755 --- a/ve/ve2400.uml +++ b/ve/ve2400.uml @@ -344,12 +344,11 @@ END NUMBER F_SOTTOCA 6 BEGIN - PROMPT 26 9 "" FIELD LF_ANAMAG->SOTTOCA GROUP G_CONACQ - USE LF_PCON SELECT (500@->INDBIL=="3") - JOIN LF_PCON ALIAS 500 INTO GRUPPO==GRUPPO CONTO==CONTO + USE LF_PCON SELECT (500@->INDBIL=="3") + JOIN LF_PCON ALIAS 500 INTO GRUPPO==GRUPPO CONTO==CONTO INPUT GRUPPO F_GRUPPOA INPUT CONTO F_CONTOA INPUT SOTTOCONTO F_SOTTOCA @@ -584,6 +583,7 @@ GROUPBOX DLG_NULL 78 4 BEGIN PROMPT 0 0 "" END + STRING F_CODARTPAGE3 20 BEGIN FLAGS "D" @@ -602,9 +602,9 @@ BEGIN PROMPT 3 4 "Unità di misura articolo" END -SPREADSHEET F_SHEETUM 77 5 +SPREADSHEET F_SHEETUM 78 5 BEGIN - PROMPT 2 5 "Unità di misura " + PROMPT 1 5 "Unità di misura " FLAGS "A" USE LF_UMART KEY NRIGA INPUT CODART F_CODART @@ -616,7 +616,7 @@ END STRING F_UMP 3 BEGIN - PROMPT 1 12 "U.M. peso " + PROMPT 1 10 "U.M. peso " FIELD LF_ANAMAG->UMP FLAG "U" USE %UMS @@ -631,7 +631,7 @@ END NUMBER F_PESO 15 5 BEGIN - PROMPT 1 13 "Peso " + PROMPT 1 11 "Peso " FIELD LF_ANAMAG->PESO VALIDATE REQIF_FUNC 1 F_TARA WARNING "Necessario introdurre il peso se si è introdotta la tara" @@ -639,42 +639,90 @@ END NUMBER F_TARA 15 5 BEGIN - PROMPT 42 13 "Tara " + PROMPT 42 11 "Tara " FIELD LF_ANAMAG->TARA END NUMBER F_MASSANUN 10 3 BEGIN - PROMPT 1 14 "Massa netta unitaria " + PROMPT 1 12 "Massa netta unitaria " FIELD LF_ANAMAG->MASSANUN END NUMBER F_UNSUPPUN 10 3 BEGIN - PROMPT 42 14 "Unità suppl.unitaria " + PROMPT 42 12 "Unità suppl.unitaria " FIELD LF_ANAMAG->UNSUPPUN END NUMBER F_PPCONF 15 5 BEGIN - PROMPT 1 16 "Pz. per confezione " + PROMPT 1 13 "Pz. per confezione " FIELD LF_ANAMAG->PPCONF END NUMBER F_PPCOLLO 15 5 BEGIN - PROMPT 42 16 "Pz. per collo " + PROMPT 42 13 "Pz. per collo " FIELD LF_ANAMAG->PPCOLLO END +NUMBER F_VALSTATUN 15 5 +BEGIN + PROMPT 1 14 "Valore statistico " + FIELD LF_ANAMAG->VALSTATUN +END + +GROUPBOX DLG_NULL 78 4 +BEGIN + PROMPT 0 15 "Pesi per CONAI (Kg.)" + FLAGS "R" +END + +NUMBER F_CONACC 15 5 +BEGIN + PROMPT 1 16 "Acciaio " + FIELD CONACC +END + +NUMBER F_CONALL 15 5 +BEGIN + PROMPT 26 16 "Alluminio " + FIELD CONALL +END + +NUMBER F_CONCAR 15 5 +BEGIN + PROMPT 52 16 "Carta " + FIELD CONCAR +END + +NUMBER F_CONPLA 15 5 +BEGIN + PROMPT 1 17 "Plastica " + FIELD CONPLA +END + +NUMBER F_CONLEG 15 5 +BEGIN + PROMPT 26 17 "Legno " + FIELD CONLEG +END + +NUMBER F_CONVET 15 5 +BEGIN + PROMPT 52 17 "Vetro " + FIELD CONVET +END + TEXT DLG_NULL BEGIN - PROMPT 1 18 "Collegamenti esterni " + PROMPT 1 19 "Collegamenti esterni " END GOLEM F_GOLEM 4 2 BEGIN - PROMPT 24 18 "" + PROMPT 24 19 "" FLAGS "M" FIELD LF_ANAMAG->GOLEM END @@ -750,14 +798,14 @@ BEGIN ITEM "F|Fornitore" END -STRING F_CLASSDOG 10 +STRING F_CLASSDOG 8 BEGIN - PROMPT 1 8 "Classe doganale " + PROMPT 1 8 "Nomenclatura combin. " FIELD LF_ANAMAG->CLASSDOG FLAG "UZ" - USE %CLD + USE %NOC INPUT CODTAB F_CLASSDOG - DISPLAY "Codice" CODTAB + DISPLAY "Codice@10" CODTAB DISPLAY "Descrizione@50" S0 OUTPUT F_CLASSDOG CODTAB OUTPUT F_CLASSDOG1 S0 @@ -770,35 +818,22 @@ BEGIN FLAG "D" END -STRING F_PROVOR 5 +STRING F_PROVOR 2 BEGIN - PROMPT 1 10 "Provincia di origine " + PROMPT 1 9 "Provincia di origine " FIELD LF_ANAMAG->PROV - USE %PRV - INPUT CODTAB F_PROVOR - DISPLAY "Codice" CODTAB - DISPLAY "Provincia@50" S0 - - OUTPUT F_PROVOR CODTAB - OUTPUT F_PROVOR2 S0 - CHECKTYPE NORMAL - WARNING "Provincia assente" END -STRING F_PROVOR2 40 +STRING F_PAESEOR 2 BEGIN - PROMPT 36 10 "" - USE %PRV KEY 2 - INPUT S0 F_PROVOR2 - COPY DISPLAY F_PROVOR - COPY OUTPUT F_PROVOR - CHECKTYPE NORMAL + PROMPT 50 9 "Paese di origine " + FIELD LF_ANAMAG->PAESE END NUMBER F_PROVV 5 2 BEGIN FIELD LF_ANAMAG->PERCPROVV - PROMPT 1 12 "Provvigione " + PROMPT 1 10 "Provvigione " NUM_EXPR (#F_PROVV>=0)&&(#F_PROVV<=100) WARNING "La percentuale di provvigione deve essere compresa tra 0 e 100" END @@ -806,48 +841,89 @@ END NUMBER F_RICARICO 5 2 BEGIN FIELD LF_ANAMAG->PERCRIC - PROMPT 42 12 "Ricarico/margine " + PROMPT 50 10 "Ricarico/margine " FLAGS "U" // NUM_EXPR #F_RICARICO<= // WARNING "La percentuale di ricarico deve essere compresa ..." END +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 0 12 "Riordino" +END + +NUMBER F_A_LOTTORIOR 10 3 +BEGIN + PROMPT 1 13 "Lotto minimo " + FIELD LOTTORIOR +END +NUMBER F_A_LOTTOIRIOR 10 3 +BEGIN + PROMPT 30 13 "Lotto increm. " + FIELD LOTTOIRIOR +END +NUMBER F_A_GIORNIRIOR 5 1 +BEGIN + PROMPT 64 13 "Giorni " + FIELD LEADTIME +END NUMBER F_COSTSTD 15 2 BEGIN - PROMPT 1 15 "Costo standard " + PROMPT 1 16 "Costo standard " FIELD LF_ANAMAG->COSTSTD END NUMBER F_ULC1 15 5 BEGIN - PROMPT 1 16 "Ultimo costo " + PROMPT 1 17 "Ultimo costo " FIELD LF_ANAMAG->ULTCOS1 END DATE F_DATAULC1 BEGIN - PROMPT 42 16 "Data ultimo costo " + PROMPT 35 16 "data " FIELD LF_ANAMAG->DULTCOS1 END +NUMBER F_NUMREGULC1 7 +BEGIN + FLAGS "D" + PROMPT 53 16 "movimento " + FIELD LF_ANAMAG->NUMREG1 +END + +NUMBER F_NUMRIGULC1 4 +BEGIN + FLAGS "D" + PROMPT 72 16 "riga " + FIELD LF_ANAMAG->NUMRIG1 +END + NUMBER F_ULC2 15 5 BEGIN - PROMPT 1 17 "Penultimo costo " + PROMPT 1 18 "Penultimo costo " FIELD LF_ANAMAG->ULTCOS2 END DATE F_DATAULC2 BEGIN - PROMPT 42 17 "Data penultimo costo " + PROMPT 35 17 "data " FIELD LF_ANAMAG->DULTCOS2 END - -NUMBER F_LEADTIME 4 +NUMBER F_NUMREGULC2 7 BEGIN - PROMPT 1 18 "Giorni Lead time " - FIELD LEADTIME + FLAGS "D" + PROMPT 53 17 "movimento " + FIELD LF_ANAMAG->NUMREG2 +END + +NUMBER F_NUMRIGULC2 4 +BEGIN + FLAGS "D" + PROMPT 72 17 "riga " + FIELD LF_ANAMAG->NUMRIG2 END ENDPAGE @@ -921,9 +997,10 @@ BEGIN ITEM "Mag." ITEM "Dep." ITEM "Ubicazione" - ITEM "Scorta min.@10" ITEM "Livello rior.@10" + ITEM "Scorta min.@10" ITEM "Lotto rior.@10" + ITEM "Lotto incr.@10" ITEM "Giorni rior.@10" ITEM "Giacenza @10" ITEM "Val.Giac @12" @@ -951,6 +1028,7 @@ BEGIN ITEM "N.dist." END ENDPAGE + PAGE "Storico" 0 0 70 20 STRING F_CODARTPAGE6 20 @@ -959,6 +1037,7 @@ BEGIN PROMPT 2 1 "Codice art. " GROUP G_CODART END + STRING F_DESCRPAGE6 50 BEGIN FLAGS "D" @@ -1002,6 +1081,7 @@ BEGIN ITEM "Magazzino" ITEM "Esercizio@10" ITEM "Quantità@15" + ITEM "Valore unitario@15" ITEM "Valore@15" END @@ -1046,6 +1126,29 @@ BEGIN END +ENDPAGE + +PAGE "Utente" 0 0 70 20 + +GROUPBOX DLG_NULL 78 4 +BEGIN + PROMPT 0 0 "" +END + +STRING DLG_NULL 20 +BEGIN + FLAGS "D" + PROMPT 2 1 "Codice art. " + GROUP G_CODART +END + +STRING DLG_NULL 50 +BEGIN + FLAGS "D" + PROMPT 2 2 "Descrizione " + GROUP G_DESART +END + ENDPAGE ENDMASK diff --git a/ve/ve2400d.h b/ve/ve2400d.h index 61e75f334..92d02f80f 100755 --- a/ve/ve2400d.h +++ b/ve/ve2400d.h @@ -6,34 +6,35 @@ #define F_CODMAG 105 #define F_CODDEP 106 #define F_UBICAZ 107 -#define F_SCORTAMIN 108 -#define F_LIVRIOR 109 +#define F_LIVRIOR 108 +#define F_SCORTAMIN 109 #define F_LOTTORIOR 110 -#define F_GIORNIRIOR 111 -#define F_GIAC 112 -#define F_VALGIAC 113 -#define F_RIM 114 -#define F_VRIM 115 -#define F_ACQ 116 -#define F_VACQ 117 -#define F_ENTR 118 -#define F_VENTR 119 -#define F_VEN 120 -#define F_VVEN 121 -#define F_USC 122 -#define F_VUSC 123 -#define F_ORDF 124 -#define F_VORDF 125 -#define F_ORDC 126 -#define F_VORDC 127 -#define F_SCARTI 128 -#define F_VSCARTI 129 -#define F_INPRODC 130 -#define F_INPRODF 131 -#define F_ACL 132 -#define F_INCL 133 -#define F_LABELS 134 -#define F_NDIST 135 +#define F_LOTTOIRIOR 111 +#define F_GIORNIRIOR 112 +#define F_GIAC 113 +#define F_VALGIAC 114 +#define F_RIM 115 +#define F_VRIM 116 +#define F_ACQ 117 +#define F_VACQ 118 +#define F_ENTR 119 +#define F_VENTR 120 +#define F_VEN 121 +#define F_VVEN 122 +#define F_USC 123 +#define F_VUSC 124 +#define F_ORDF 125 +#define F_VORDF 126 +#define F_ORDC 127 +#define F_VORDC 128 +#define F_SCARTI 129 +#define F_VSCARTI 130 +#define F_INPRODC 131 +#define F_INPRODF 132 +#define F_ACL 133 +#define F_INCL 134 +#define F_LABELS 135 +#define F_NDIST 136 // colonne non visibili dello Sheet #define F_DESMAG 150 diff --git a/ve/ve2400d.uml b/ve/ve2400d.uml index 533f8d86c..59b4c8c61 100755 --- a/ve/ve2400d.uml +++ b/ve/ve2400d.uml @@ -188,49 +188,54 @@ BEGIN FLAGS "D" END - +NUMBER F_LIVRIOR 10 3 +BEGIN + PROMPT 2 5 "Livello di riordino " + FIELD LIVRIOR +END NUMBER F_SCORTAMIN 10 3 BEGIN - PROMPT 50 4 "Scorta minima " + PROMPT 35 5 "Scorta minima " FIELD SCORTAMIN END -NUMBER F_LIVRIOR 15 3 -BEGIN - PROMPT 2 5 "Riordino: Livello " - FIELD LIVRIOR -END - NUMBER F_LOTTORIOR 10 3 BEGIN - PROMPT 39 5 "Q.ta' minima " - FLAGS "U" + PROMPT 2 6 "Lotto minimo " FIELD LOTTORIOR END -NUMBER F_GIORNIRIOR 2 +NUMBER F_LOTTOIRIOR 10 3 BEGIN - PROMPT 68 5 "Giorni " + PROMPT 35 6 "Lotto increm. " + FLAGS "U" + FIELD LOTTOIRIOR +END + +NUMBER F_GIORNIRIOR 3 +BEGIN + PROMPT 62 6 "Giorni " FLAGS "U" FIELD GIORNIRIOR END NUMBER F_GIAC 15 5 BEGIN - PROMPT 2 6 "Giacenza attuale " + PROMPT 2 7 "Giacenza attuale " FIELD GIAC + MESSAGE CHECK,F_VALGIAC END -NUMBER F_VALGIAC 18 3 +NUMBER F_VALGIAC 15 3 BEGIN FLAG "DG" - PROMPT 46 6 "Valore " + PROMPT 46 7 "Costo m.p." END NUMBER F_RIM 15 5 BEGIN - PROMPT 2 7 "Rimanenze iniziali " + PROMPT 2 8 "Rimanenze iniziali " FIELD RIM MESSAGE CHECK,F_VALGIAC END @@ -238,7 +243,7 @@ END NUMBER F_VRIM 18 3 BEGIN - PROMPT 46 7 "Valore " + PROMPT 46 8 "Valore " FIELD VALRIM MESSAGE CHECK,F_VALGIAC END @@ -246,124 +251,124 @@ END NUMBER F_ACQ 15 5 BEGIN - PROMPT 2 8 "Acquistato " + PROMPT 2 9 "Acquistato " FIELD ACQ MESSAGE CHECK,F_VALGIAC END NUMBER F_VACQ 18 3 BEGIN - PROMPT 46 8 "Valore " + PROMPT 46 9 "Valore " FIELD VALACQ MESSAGE CHECK,F_VALGIAC END NUMBER F_ENTR 15 5 BEGIN - PROMPT 2 9 "Entrato " + PROMPT 2 10 "Entrato " FIELD ENT END NUMBER F_VENTR 18 3 BEGIN - PROMPT 46 9 "Valore " + PROMPT 46 10 "Valore " FIELD VALENT END NUMBER F_VEN 15 5 BEGIN - PROMPT 2 10 "Venduto " + PROMPT 2 11 "Venduto " FIELD VEN END NUMBER F_VVEN 18 3 BEGIN - PROMPT 46 10 "Valore " + PROMPT 46 11 "Valore " FIELD VALVEN END NUMBER F_USC 15 5 BEGIN - PROMPT 2 11 "Uscito " + PROMPT 2 12 "Uscito " FIELD USC END NUMBER F_VUSC 18 3 BEGIN - PROMPT 46 11 "Valore " + PROMPT 46 12 "Valore " FIELD VALUSC END NUMBER F_ORDF 15 5 BEGIN - PROMPT 2 12 "Ordinato fornitori " + PROMPT 2 13 "Ordinato fornitori " FIELD ORDF END NUMBER F_VORDF 18 3 BEGIN - PROMPT 46 12 "Valore " + PROMPT 46 13 "Valore " FIELD VALORDF END NUMBER F_ORDC 15 5 BEGIN - PROMPT 2 13 "Ordinato clienti " + PROMPT 2 14 "Ordinato clienti " FIELD ORDC END NUMBER F_VORDC 18 3 BEGIN - PROMPT 46 13 "Valore " + PROMPT 46 14 "Valore " FIELD VALORDC END NUMBER F_SCARTI 15 5 BEGIN - PROMPT 2 14 "Scarti " + PROMPT 2 15 "Scarti " FIELD SCARTI END NUMBER F_VSCARTI 18 3 BEGIN - PROMPT 46 14 "Valore " + PROMPT 46 15 "Valore " FIELD VALSCARTI END NUMBER F_INPRODC 15 5 BEGIN - PROMPT 2 15 "In produzione (componenti) " + PROMPT 2 16 "In produzione (componenti) " FIELD PRODCOMP END NUMBER F_INPRODF 15 5 BEGIN - PROMPT 2 16 "In produzione (finiti) " + PROMPT 2 17 "In produzione (finiti) " FIELD PRODFIN END NUMBER F_ACL 15 5 BEGIN - PROMPT 2 17 "A conto lavorazione " + PROMPT 2 18 "A conto lavorazione " FIELD ACL END NUMBER F_INCL 15 5 BEGIN - PROMPT 2 18 "In conto lavorazione " + PROMPT 2 19 "In conto lavorazione " FIELD INCL END NUMBER F_LABELS 10 BEGIN - PROMPT 2 19 "Etichette da stampare " + PROMPT 2 20 "Etichette da stampare " FIELD NLABEL FLAGS "D" END NUMBER F_NDIST 15 5 BEGIN - PROMPT 42 19 "Distinte " + PROMPT 42 20 "Distinte " FIELD NDIST END diff --git a/ve/ve2400e.uml b/ve/ve2400e.uml index bb0cdf070..77a23a56d 100755 --- a/ve/ve2400e.uml +++ b/ve/ve2400e.uml @@ -67,15 +67,23 @@ BEGIN PROMPT 2 8 "Quantità " FIELD LF_STOMAG->QUANT CHECKTYPE REQUIRED + MESSAGE CHECK, F_STOVAL WARNING "Indicare la quantità" END +NUMBER F_STOVALUN 18 3 +BEGIN + PROMPT 2 10 "Valore unitario " + FIELD LF_STOMAG->VALORE + CHECKTYPE REQUIRED + MESSAGE CHECK, F_STOVAL + WARNING "Indicare il valore unitario" +END + NUMBER F_STOVAL 18 3 BEGIN - PROMPT 2 10 "Valore " - FIELD LF_STOMAG->VALORE - CHECKTYPE REQUIRED - WARNING "Indicare il valore" + PROMPT 2 11 "Valore " + FLAGS "DG" END STRING F_STOCODART 20 diff --git a/ve/ve3200.cpp b/ve/ve3200.cpp index 93b7b5c0f..f0effa788 100755 --- a/ve/ve3200.cpp +++ b/ve/ve3200.cpp @@ -36,6 +36,7 @@ class TStampa_condizioni_vendita: public TPrint_application { bool _testacomp, _righecomp; // booleani di selezione della stampa completa per testata e righe; bool _testastamp; // booleano di testata completa già stampata bool _gest_val, _gest_um, _gest_sca, _gest_so; // booleani per l'abilitazione di valute, unità di misura, scaglioni e sconti/omaggi + TString _codiva, _um; //int _rcondv_link_id; // id del link ipertestuale all'anagrafica di magazzino protected: static bool tipo_handler(TMask_field& f, KEY k); @@ -43,6 +44,7 @@ protected: virtual bool user_destroy(void); virtual bool set_print(int); virtual void set_page(int, int); + virtual bool preprocess_page(int, int); virtual void preprocess_header(void); virtual void preprocess_footer(void); //virtual void process_link(int, const char *); @@ -138,6 +140,7 @@ bool TStampa_condizioni_vendita::user_create() { _rel= new TRelation(LF_RCONDV); // crea la relazione principale _rel->add(LF_ANAMAG, "CODART==CODRIGA", 1, LF_RCONDV, ART1); _rel->add(LF_ANAMAG, "CODART==CODARTOM", 1, LF_RCONDV, ART2); + _rel->add(LF_UMART, "CODART==CODART", 1, LF_ANAMAG); _rel->add("GMC", "CODTAB[1,3]==CODRIGA", 1, LF_RCONDV, GMC1); _rel->add("GMC", "CODTAB[4,5]==CODRIGA", 1, LF_RCONDV, GMC2); _rel->add("RFA", "CODTAB==CODRIGA", 1, LF_RCONDV, RFA); @@ -241,10 +244,34 @@ bool TStampa_condizioni_vendita::set_print(int) { break; } TRectype a(da); // prepara il record di fine regione - da.put("TIPORIGA", mask.get(F_TIPORIGHE)); - da.put("CODRIGA", mask.get(F_DARIGA_A)); - a.put("TIPORIGA", mask.get(F_TIPORIGHE)); - a.put("CODRIGA", mask.get(F_ARIGA_A)); + const bool filt_by_grm = mask.get_bool(F_GRM_FILT); + if (!filt_by_grm) + { + da.put("TIPORIGA", mask.get(F_TIPORIGHE)); + da.put("CODRIGA", mask.get(F_DARIGA_A)); + a.put("TIPORIGA", mask.get(F_TIPORIGHE)); + a.put("CODRIGA", mask.get(F_ARIGA_A)); + } + else // Elenco righe per articoli ma filtrate sul gruppo merceologico + { + TString filter; + da.put("TIPORIGA", "A");a.put("TIPORIGA", "A"); + if (mask.get(F_DFLT_G_C).not_empty()) + { + filter << "(" << LF_ANAMAG << "->GRMERC>=\"" << mask.get(F_DFLT_G_C); + filter << "\")"; + } + if (mask.get(F_DFLT_G_C).not_empty()) + { + if (filter.not_empty()) + filter << "&&"; + filter << "(" << LF_ANAMAG << "->GRMERC<=\"" << mask.get(F_AFLT_G_C); + filter << "\")"; + } + if (filter.not_empty()) + current_cursor()->setfilter(filter, TRUE); + } + current_cursor()->setregion(da, a); // setta la regione sul cursore force_setpage(); // forza il lancio della set_page() ad ogni record del file da stampare disable_links(); // disabilita tutti i link ipertestuali @@ -271,6 +298,22 @@ UO QOM QBASE CODARTOM PROMAGGIO .. ...............,..... ...............,..... .................... ..................,.. ...... . */ +bool TStampa_condizioni_vendita::preprocess_page(int i, int c) +{ + if (i == LF_RCONDV) + { + TLocalisamfile &rcondv= current_cursor()->file(); + TLocalisamfile &anamag= current_cursor()->file(-ART1); + _codiva = rcondv.get("CODIVA"); + _um = rcondv.get("UM"); + if (_codiva.empty()) + _codiva = anamag.get("CODIVA"); + if (_um.empty()) + _um = current_cursor()->file(LF_UMART).get("UM"); // Prima unità di misura per sto articolo + } + return TRUE; +} + void TStampa_condizioni_vendita::preprocess_header() { reset_header(); // l'header viene resettato int i= 1; // contatore delle linee @@ -310,10 +353,11 @@ void TStampa_condizioni_vendita::preprocess_header() { if (!_righecomp) { // impostazione dell'header delle righe in forma abbreviata - set_header(++i, "@1gT @3gCodice riga @27gDescrizione @77gS @79gQuantita' limite @101gPrezzo "); // setta l'header della chiave, della quantità limite e del prezzo - if ((_condven=="L") || (_condven=="O")) set_header(i, "@24gUM"); // setta l'header dell'unità di misura + set_header(++i, "@1gT @3gCodice riga @27gDescrizione @77gS @79gQuantita' limite @101gPrezzo@117gPz per Conf"); // setta l'header della chiave, della quantità limite e del prezzo + /*if ((_condven=="L") || (_condven=="O")) */ + set_header(i, "@24gUM"); // setta l'header dell'unità di misura set_header(++i, "@27gSconto @53gA @55gIVA @60gProvvig."); // setta l'header della chiave, della quantità limite e del prezzo - if ((_condven=="C") || (_condven=="O")) set_header(i, "@66gLotto"); // setta l'header del lotto + if ((_condven=="C") || (_condven=="O")) set_header(i, "@69gLotto"); // setta l'header del lotto set_header(++i, "@1gUMO @5gQuantita' omaggio @27gQuantita' base @49gCod. art. omagg. @70gPrezzo omaggio"); // setta l'header dello sconto/omaggio if (_condven=="O") set_header(i, "@73gEsaur."); // setta l'header dell'articolo in esaurimento } @@ -408,15 +452,18 @@ void TStampa_condizioni_vendita::set_page(int file, int) { set_row(++i, "Raggruppamento fiscale: @50s", FLD(-RFA, "S0")); break; } - if (condv.get_bool("GESTUM")) set_row(++i, "Unità di misura: @2s @50s", FLD(LF_RCONDV, "UM"), FLD(-UMS1, "S0")); + //if (condv.get_bool("GESTUM")) + set_row(++i, "Unità di misura: #t", &_um); if (condv.get_bool("GESTSCAGL")) { set_row(++i, "Scaglione: @1s", FLD(LF_RCONDV, "NSCAGL")); set_row(++i, "Quantità limite scaglione: @pn", FLD(LF_RCONDV, "QLIM","#########,@@@@@")); } set_row(++i, "Prezzo: @pn", FLD(LF_RCONDV, "PREZZO","###.###.###,@@")); + set_row(++i, "Pz per conf.: @pn", FLD(-ART1, "PPCONF","###.###.###,@@")); set_row(++i, "Sconto: @25s", FLD(LF_RCONDV, "SCONTO")); set_row(++i, "Addebito IVA: @f", FLD(LF_RCONDV, "ADDIVA")); - set_row(++i, "Codice IVA: @4s", FLD(LF_RCONDV, "CODIVA")); + //set_row(++i, "Codice IVA: @4s", FLD(LF_RCONDV, "CODIVA")); + set_row(++i, "Codice IVA: #4t", &_codiva); set_row(++i, "Percentuale di provvigione: @pn", FLD(LF_RCONDV, "PERCPROVV","###,@@")); if (condv.get_bool("GESTSCO")) { set_row(++i, "Quantità merce omaggio: @pn", FLD(LF_RCONDV, "QOM","##########,@@@@@")); @@ -432,10 +479,10 @@ void TStampa_condizioni_vendita::set_page(int file, int) { TLocalisamfile &rcondv= current_cursor()->file(); TLocalisamfile &condv= current_cursor()->file(LF_CONDV); TString tiporiga= rcondv.get("TIPORIGA"); - set_row(++i, "@1g@1s @3g@20s @77g@1s @79g@pn @101g@pn", + set_row(++i, "@1g@1s @3g@20s @77g@1s @79g@pn @101g@pn@117g@pn", FLD(LF_RCONDV, "TIPORIGA"), FLD(LF_RCONDV, "CODRIGA"), FLD(LF_RCONDV, "NSCAGL"), FLD(LF_RCONDV, "QLIM","##########,@@@@@"), - FLD(LF_RCONDV, "PREZZO","###.###.###,@@")); + FLD(LF_RCONDV, "PREZZO","###.###.###,@@"), FLD(-ART1,"PPCONF")); switch (tiporiga[0]) { case 'A': set_row(i, "@27g@50s", FLD(-ART1, "DESCR")); // @@ -450,14 +497,14 @@ void TStampa_condizioni_vendita::set_page(int file, int) { set_row(i, "@27g@50s", FLD(-RFA, "S0")); // break; } - if ((_condven=="L") || (_condven=="O")) - set_row(i, "@24g@2s", FLD(LF_RCONDV, "UM")); // unità di misura + //if ((_condven=="L") || (_condven=="O")) + set_row(i, "@24g#t", &_um /*FLD(LF_RCONDV, "UM")*/); // unità di misura // seconda riga: info accessorie - set_row(++i, "@27g@25s @53g@1s @55g@4s @60g@5.2n", + set_row(++i, "@27g@25s @53g@1s @55g#4t @60g@5.2n", FLD(LF_RCONDV, "SCONTO"), FLD(LF_RCONDV, "ADDIVA"), - FLD(LF_RCONDV, "CODIVA"), FLD(LF_RCONDV, "PERCPROVV","###,@@")); // codice, prezzo... + &_codiva, FLD(LF_RCONDV, "PERCPROVV","###,@@")); // codice, prezzo... if ((_condven=="C") || (_condven=="O")) - set_row(i, "@66g@6s", FLD(LF_RCONDV, "CODLOTTO")); // lotto + set_row(i, "@69g@6s", FLD(LF_RCONDV, "CODLOTTO")); // lotto if (_condven=="O") set_row(i, "@73g@1s", FLD(LF_RCONDV, "ARTES")); // terza riga (opzionale) diff --git a/ve/ve3200x.h b/ve/ve3200x.h index addb5e7ee..e2479e804 100755 --- a/ve/ve3200x.h +++ b/ve/ve3200x.h @@ -40,3 +40,9 @@ #define F_C_COD 143 #define F_O_COD 151 + +#define F_GRM_FILT 152 + +#define F_DFLT_G_C 153 +#define F_AFLT_G_C 154 + diff --git a/ve/ve3200x.uml b/ve/ve3200x.uml index 5a0a40bcd..9ce240c17 100755 --- a/ve/ve3200x.uml +++ b/ve/ve3200x.uml @@ -116,9 +116,19 @@ END LIST F_TIPORIGHE 9 // listbox per tipo di selezione righe BEGIN PROMPT 2 5 "Righe " - ITEM "A|Articolo " //MESSAGE CLEAR,F_DARIGA_A|ENABLE,F_DARIGA_A|SHOW,F_DARIGA_A|CLEAR,F_ARIGA_A|ENABLE,F_ARIGA_A|SHOW,F_ARIGA_A|HIDE,F_DARIGA_G|HIDE,F_DARIGA_R|HIDE,F_ARIGA_G|HIDE,F_ARIGA_R - ITEM "G|Gr. merc." //MESSAGE CLEAR,F_DARIGA_G|ENABLE,F_DARIGA_G|SHOW,F_DARIGA_G|CLEAR,F_ARIGA_G|ENABLE,F_ARIGA_G|SHOW,F_ARIGA_G|HIDE,F_DARIGA_A|HIDE,F_DARIGA_R|HIDE,F_ARIGA_A|HIDE,F_ARIGA_R - ITEM "R|Rag. fis." //MESSAGE CLEAR,F_DARIGA_R|ENABLE,F_DARIGA_R|SHOW,F_DARIGA_R|CLEAR,F_ARIGA_R|ENABLE,F_ARIGA_R|SHOW,F_ARIGA_R|HIDE,F_DARIGA_A|HIDE,F_DARIGA_G|HIDE,F_ARIGA_A|HIDE,F_ARIGA_G + ITEM "A|Articolo " + ITEM "G|Gr. merc." + MESSAGE RESET,F_GRM_FILT|HIDE,F_GRM_FILT|HIDE,15@ + ITEM "R|Rag. fis." + MESSAGE RESET,F_GRM_FILT|HIDE,F_GRM_FILT|HIDE,15@ +END + +BOOLEAN F_GRM_FILT +BEGIN + PROMPT 32 5 "Filtra per gruppo merc." + MESSAGE TRUE SHOW,15@|HIDE,F_DARIGA_A_C|HIDE,F_ARIGA_A_C + MESSAGE FALSE HIDE,15@|SHOW,F_DARIGA_A_C|SHOW,F_ARIGA_A_C + GROUP 2 7 END //BOOLEAN F_TUTTERIGHE // checkbox per selezione di tutte le righe @@ -314,6 +324,18 @@ BEGIN GROUP 2 8 END +STRING F_DFLT_G_C 3 +BEGIN + PROMPT 2 7 "Da " + USE GMC KEY 1 SELECT CODTAB[4,5]=="" + INPUT CODTAB F_DFLT_G_C + DISPLAY "Codice" CODTAB[1,3] + DISPLAY "Descrizione@50" S0 + OUTPUT F_DFLT_G_C CODTAB + CHECKTYPE NORMAL + GROUP 15 +END + STRING F_DARIGA_R_C 5 // riga raggruppamento fiscale di inizio (contratti) BEGIN PROMPT 2 7 "Da " @@ -383,6 +405,18 @@ BEGIN GROUP 2 8 END +STRING F_AFLT_G_C 3 +BEGIN + PROMPT 2 8 "A " + USE GMC KEY 1 SELECT CODTAB[4,5]=="" + INPUT CODTAB F_AFLT_G_C + DISPLAY "Codice" CODTAB[1,3] + DISPLAY "Descrizione@50" S0 + OUTPUT F_AFLT_G_C CODTAB + CHECKTYPE NORMAL + GROUP 15 +END + STRING F_ARIGA_R_C 5 // riga raggruppamento fiscale di fine (contratti) BEGIN PROMPT 2 8 "A " diff --git a/ve/ve3400.cpp b/ve/ve3400.cpp index 97fb18341..cee553fad 100755 --- a/ve/ve3400.cpp +++ b/ve/ve3400.cpp @@ -158,7 +158,7 @@ void TStampa_anagrafica_magazzino::preprocess_header() set_header(++i, "Codice articolo@24gDescrizione@75gGrMer@81gDescrizione gruppo merceologico"); // setta la linea successiva dell'header if (_st_umart || _st_codcorr) set_header(++i, ""); // crea una linea vuota se almeno una stampa condizionale è abilitata if (_st_codcorr) set_header(i, "Cod. art. altern.@20gTipo"); // se è abilitata la stampa dei codici corrispondenti l'header lo indica - if (_st_umart) set_header(i, "@50gUM@53gFatt. conv."); // se è abilitata la stampa delle unità di misura l'header lo indica + if (_st_umart) set_header(i, "@50gUM@53gFatt. conv.@80gPrezzo"); // se è abilitata la stampa delle unità di misura l'header lo indica set_header(++i, "Forn.@7gRagione sociale@58gCosto standard@83gPeso@105gTara"); // la linea successiva contiene il fornitore e altri dati if (_st_umart) set_header(i, "@80gUP"); // su questa linea viene indicata anche l'unità di misura del peso (se abilitata) set_header(++i, "Pezzi x conf.@23gPezzi x collo@45gAR@48gRD"); // l'ultima linea d'header contiene i pezzi per confezione e altri dati @@ -193,30 +193,31 @@ void TStampa_anagrafica_magazzino::set_page(int file, int) { FLD(LF_ANAMAG, "CODART"),FLD(LF_ANAMAG, "DESCR"), FLD(LF_ANAMAG, "GRMERC"), FLD(-GMC, "S0")); // imposta la prima linea di dati - for (word i=1; i<=n_max; i++) { // ciclo sul maggiore dei contatori - set_row(i+1, ""); // vuota la linea di stampa corrente - if (i<=n_codcorr) { // se ci sono ancora codici corrispondenti gli spazi relativi della riga vengono riempiti + + word i = _st_codcorr ? _arr_codcorr->first_row() : 0; + word j = _st_umart ? _arr_umart->first_row() : 0; + + for (word k=1; k<=n_max; k++) + { + set_row(k+1, ""); // vuota la linea di stampa corrente + if (_st_codcorr && _arr_codcorr->exist(i)) + { TString codartalt(_arr_codcorr->row(i, FALSE).get("CODARTALT")); // legge il codice corrispondente dell'articolo TString tipo(_arr_codcorr->row(i, FALSE).get("TIPO")); // legge il tipo - set_row(i+1, "@1g%-20s@22g%1s@24gCodice alternativo", (const char *)codartalt, (const char *)tipo); // setta gli spazi della riga con i valori letti + set_row(k+1, "@1g%-20s@22g%1s@24gCodice alternativo", (const char *)codartalt, (const char *)tipo); // setta gli spazi della riga con i valori letti + i = _arr_codcorr->succ_row(i); } - if (i<=n_umart) { // se ci sono ancora unità di misura gli spazi relativi della riga vengono riempiti - TString um(_arr_umart->row(i, FALSE).get("UM")); // legge l'id dell'unità di misura - real fc(_arr_umart->row(i, FALSE).get_real("FC")); // legge il suo fattore di conversione - set_row(i+1, "@50g%-2s@53g%-s", (const char *)um, fc.string(10, 5)); // setta gli spazi della riga con i valori letti + if (_st_umart && _arr_umart->exist(j)) + { + TString um(_arr_umart->row(j, FALSE).get("UM")); // legge l'id dell'unità di misura + real fc(_arr_umart->row(j, FALSE).get_real("FC")); // legge il suo fattore di conversione + real prezzo(_arr_umart->row(j,FALSE).get_real("PREZZO")); // prezzo relativo + set_row(k+1, "@50g%-2s@53g%-s", (const char *)um, fc.string("##.###,@@@@@")); // setta gli spazi della riga con i valori letti + set_row(k+1, "@70g%s", prezzo.string("###.###.###,@@@")); + j = _arr_umart->succ_row(j); } - //if (i<=n_gmc) { // se ci sono ancora gruppi merceologici gli spazi relativi della riga vengono riempiti - // TString grmerc, descr; // istanzia le due variabili per codice del gruppo e descrizione - // if (i==1) { // se è il primo deve essere letto dal secondo campo GRMERC del file dell'anagrafica - // grmerc= anagr.get("GRMERC2"); // legge il codice del gruppo - // descr= _rel->lfile(-GMC2).get("S0"); // legge la sua descrizione dalla tabella - // } else { // se è il secondo deve essere letto dal terzo campo GRMERC del file dell'anagrafica - // grmerc= anagr.get("GRMERC3"); // legge il codice del gruppo - // descr= _rel->lfile(-GMC3).get("S0"); // legge la sua descriziona dalla tabella - // } - // set_row(i+1, "@75g%-5s@81g%-50s", (const char *)grmerc, (const char *)descr); - //} } + set_row(n_max+2, "@5s@7g@50s@58g@pn@83g@pn@105g@pn", FLD(LF_ANAMAG, "CODFORN"), FLD(LF_CLIFO, "RAGSOC"), FLD(LF_ANAMAG, "COSTSTD","###.###.###,@@"), FLD(LF_ANAMAG, "PESO","#########,@@@@@"), diff --git a/ve/ve5.cpp b/ve/ve5.cpp index 11fc5d6e5..ee2ebf72e 100755 --- a/ve/ve5.cpp +++ b/ve/ve5.cpp @@ -7,8 +7,9 @@ int main(int argc, char** argv) const int k = argc > 1 ? atoi(argv[1]+1) : 0; switch(k) { - case 1 : ve5200(argc, argv); break; - default: ve5100(argc, argv); break; + case 1 : ve5200(argc, argv); break; // Cambia stato + case 2 : ve5300(argc, argv); break; // Copia documenti + default: ve5100(argc, argv); break; // Cancella documenti } exit(0); return 0; diff --git a/ve/ve5.h b/ve/ve5.h index 4aed3a0b9..5a3105f03 100755 --- a/ve/ve5.h +++ b/ve/ve5.h @@ -3,6 +3,7 @@ int ve5100(int argc, char* argv[]); int ve5200(int argc, char* argv[]); +int ve5300(int argc, char* argv[]); #endif diff --git a/ve/ve5100.cpp b/ve/ve5100.cpp index 1e771a18e..708296a8e 100755 --- a/ve/ve5100.cpp +++ b/ve/ve5100.cpp @@ -2,19 +2,16 @@ #include #include -#include #include #include -#include #include -#include #include #include "ve5100a.h" #include "velib.h" -class TDeletedoc_app : public TApplication +class TDeletedoc_app : public TSkeleton_application { TArchive _arc; TString _desc, _last_std; @@ -30,7 +27,7 @@ protected: void delete_tmp_files(bool remove=TRUE); virtual bool create(); virtual bool destroy(); - virtual bool menu(MENU_TAG m); + virtual void main_loop(); static bool state_handler(TMask& m, KEY k); @@ -257,31 +254,29 @@ void TDeletedoc_app::delete_tmp_files(bool remove) bool TDeletedoc_app::create() { - TApplication::create(); - _tmp_dir.temp(); _tmp_dir = _tmp_dir.path(); _tmp_dir << "VE"; - if (!fexist(_tmp_dir)) make_dir(_tmp_dir); + if (!_tmp_dir.exist()) + make_dir(_tmp_dir); _tmp_dir.insert("%"); // Add % sign - dispatch_e_menu(BAR_ITEM(1)); - TTable std("%STD"); std.last(); // Reperisce lo stato eliminabile _last_std = std.get("CODTAB"); - return TRUE; + return TSkeleton_application::create(); } bool TDeletedoc_app::destroy() { _tmp_dir=_tmp_dir.sub(1); // Cut out % sign - if (fexist(_tmp_dir)) rmdir(_tmp_dir); - return TApplication::destroy(); + if (_tmp_dir.exist()) + rmdir(_tmp_dir); + return TSkeleton_application::destroy(); } -bool TDeletedoc_app::menu(MENU_TAG) +void TDeletedoc_app::main_loop() { TMask m("ve5100a"); m.set_handler(state_handler); @@ -302,7 +297,6 @@ bool TDeletedoc_app::menu(MENU_TAG) default: restore_doc(); break; } } - return FALSE; } diff --git a/ve/ve5300.cpp b/ve/ve5300.cpp new file mode 100755 index 000000000..8c65652d9 --- /dev/null +++ b/ve/ve5300.cpp @@ -0,0 +1,271 @@ +#include +#include +#include +#include + +#include "ve5300.h" +#include "velib.h" + +/////////////////////////////////////////////////////////// +// TCopydoc mask +/////////////////////////////////////////////////////////// + +class TCopydoc_mask : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +protected: + int fill_sheet(); + +public: + long get_first_ndoc() const; + TCopydoc_mask() : TAutomask("ve5300a") { open(); } +}; + +int TCopydoc_mask::fill_sheet() +{ + TSheet_field& sf = sfield(F_TIPI_DOC); + sf.destroy(); + + TString16 n1 = get(F_FROM_NUM); + TString16 n2 = get(F_TO_NUM); + if (n1.empty()) n1 = n2; + if (n2.empty()) n2 = n1; + + if (n1.not_empty()) + { + const TCodice_numerazione num1(n1); + TAssoc_array tipi; + int t; + for (t = 0; t < num1.ntipi_doc(); t++) + { + const TString& td = num1.tipo_doc(t); + tipi.add(td, NULL); + } + + const TCodice_numerazione num2(n2); + for (t = 0; t < num2.ntipi_doc(); t++) + { + const TString& td = num2.tipo_doc(t); + if (tipi.is_key(td)) + { + sf.row(-1) << "X|" << td; + sf.check_row(sf.items()-1); + } + } + sf.force_update(); + } + + return sf.items(); +} + +long TCopydoc_mask::get_first_ndoc() const +{ + TLocalisamfile doc(LF_DOC); + TRectype& curr = doc.curr(); + + const TDate dd = get(F_TO_DATA); + const int anno = dd.year(); + const char provv = get(F_TO_PROVV)[0]; + const TString& codnum = get(F_TO_NUM); + + curr.put(DOC_PROVV, provv); + curr.put(DOC_ANNO, anno); + curr.put(DOC_CODNUM, codnum); + curr.put(DOC_NDOC, 9999999L); + + long n = 0; + + const int err = doc.read(_isgreat); + if (err != _isemptyfile) + { + if (err == NOERR) + doc.prev(); + if (curr.get_char(DOC_PROVV) == provv && + curr.get_int(DOC_ANNO) == anno && + curr.get(DOC_CODNUM) == codnum) + n = curr.get_long(DOC_NDOC); + } + + n++; + return n; +} + +bool TCopydoc_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_FROM_NUM: + if (e == fe_modify && !o.empty()) + { + set(F_TO_NUM, o.get()); + set(F_TO_DES, get(F_FROM_DES)); + } + // Fall down + case F_TO_NUM: + if (e == fe_modify && !o.empty()) + { + const int tot = fill_sheet(); + if (tot == 0) + return error_box("Non ci sono tipi documento compatibili"); + } + break; + case F_TIPI_DOC: + if (e == fe_close) + { + TSheet_field& sf = (TSheet_field&)o; + int selected = 0; + FOR_EACH_SHEET_ROW(sf, r, row) + if (row->get_char(0) > ' ') selected++; + if (selected == 0) + return error_box("Non ci sono tipi documento selezionati"); + } + break; + default: + break; + } + return TRUE; +} + +/////////////////////////////////////////////////////////// +// Main program +/////////////////////////////////////////////////////////// + +class TCopydoc_app : public TSkeleton_application +{ +protected: + bool replace(TRectype& rec, const char* field, const TString& oldstr, const TString& newstr) const; + +public: + virtual void main_loop(); +}; + +bool TCopydoc_app::replace(TRectype& rec, const char* field, const TString& oldstr, const TString& newstr) const +{ + bool done = FALSE; + if (oldstr.not_empty()) + { + TString str = rec.get(field); + int last = -1; + for (int start = str.find(oldstr); start > last; str.find(oldstr, last)) + { + const TString aft = str.mid(start+oldstr.len()); + str.cut(start); + str << newstr << aft; + last = start + newstr.len() + 1; + } + if (last >= 0) + { + // Attenzione al campo DESCR che non e' un MEMO! + if (str.len() > 50 && strcmp(field, RDOC_DESCR) == 0) + str.cut(50); + rec.put(field, str); + done = TRUE; + } + } + return done; +} + +void TCopydoc_app::main_loop() +{ + open_files(LF_TAB, LF_TABCOM, LF_DOC, LF_RIGHEDOC, LF_CONDV, LF_RCONDV, + LF_ANAMAG, LF_SCONTI, LF_UMART, LF_CLIFO, LF_CFVEN, LF_INDSP, + LF_OCCAS, LF_MOVMAG, LF_RMOVMAG, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, 0); + + TCopydoc_mask m; + while (m.run() == K_ENTER) + { + TRectype rec_from(LF_DOC); + rec_from.put(DOC_ANNO, m.get(F_FROM_ANNO)); + rec_from.put(DOC_CODNUM, m.get(F_FROM_NUM)); + rec_from.put(DOC_PROVV, m.get(F_FROM_PROVV)); + rec_from.put(DOC_NDOC, m.get(F_NUMFR)); + + TRectype rec_to(rec_from); + rec_to.put(DOC_NDOC, m.get(F_NUMTO)); + + // Costruisce il filtro sui tipi documento selezionati + // Il pipe significa OR per le espressioni + TToken_string filtro(80, '|'); + TSheet_field& sf = m.sfield(F_TIPI_DOC); + FOR_EACH_SHEET_ROW(sf, r, row) + { + if (row->get_char(0) > ' ') + { + filtro.add("("); + filtro << DOC_TIPODOC << "=\"" << row->get(1) << "\")"; + } + } + // Se li ho selezionati tutti e' inutile filtrare + if (m.get(F_FROM_NUM) == m.get(F_TO_NUM) && + sf.items() == filtro.items()) + filtro.cut(0); + + TRelation rel(LF_DOC); + TCursor cur(&rel, filtro, 1, &rec_from, &rec_to); + + const long tot = cur.items(); + if (tot > 0L) + { + if (yesno_box("Confermate la copia di %ld document%c?", + tot, (tot == 1L) ? 'o' : 'i')) + { + const TString& provv = m.get(F_TO_PROVV); + const TDate data = m.get(F_TO_DATA); + TString16 anno; anno << data.year(); + const TString& codnum = m.get(F_TO_NUM); + long ndoc = m.get_first_ndoc(); + + cur.freeze(); + TProgind pi(tot, "Copia in corso...", FALSE, TRUE); + for (cur = 0; cur.pos() < tot; ++cur) + { + pi.addstatus(1); + + TDocumento olddoc(cur.curr()), newdoc; + // Rinumera documento principale + newdoc.put(DOC_PROVV, provv); + newdoc.put(DOC_ANNO, anno); + newdoc.put(DOC_CODNUM, codnum); + newdoc.put(DOC_NDOC, ndoc++); + newdoc.copy_contents(olddoc); + newdoc.put(DOC_DATADOC, data); + + const TString& oldstr = m.get(F_OLD_STR); + const TString& newstr = m.get(F_NEW_STR); + const real perc = m.get_real(F_PERC); + for (int i = newdoc.physical_rows(); i > 0; i--) + { + TRectype& r = newdoc[i]; + if (oldstr.not_empty()) + { + replace(r, RDOC_DESCR, oldstr, newstr); + if (r.get_bool(RDOC_DESCLUNGA)) + replace(r, RDOC_DESCEST, oldstr, newstr); + } + if (!perc.is_zero()) + { + real price = r.get_real(RDOC_PREZZO); + if (!price.is_zero()) + { + price *= (100.0 + perc) / 100.0; + r.put(RDOC_PREZZO, price); + } + } + } + newdoc.write(); + } + } + } + else + warning_box("Nessun documento soddisfa i vincoli indicati"); + } +} + +int ve5300(int argc, char* argv[]) +{ + TCopydoc_app a; + a.run(argc, argv, "Copia documenti"); + return 0; +} \ No newline at end of file diff --git a/ve/ve5300.h b/ve/ve5300.h new file mode 100755 index 000000000..8bce8ae8d --- /dev/null +++ b/ve/ve5300.h @@ -0,0 +1,19 @@ +#define F_FROM_ANNO 201 +#define F_FROM_NUM 202 +#define F_FROM_PROVV 203 +#define F_FROM_DES 204 +#define F_TIPI_DOC 205 +#define F_NUMFR 206 +#define F_NUMTO 207 +#define F_OLD_STR 208 +#define F_NEW_STR 209 +#define F_PERC 210 + +#define F_TO_DATA 301 +#define F_TO_NUM 302 +#define F_TO_PROVV 303 +#define F_TO_DES 304 + +#define F_TIPO_SEL 101 +#define F_TIPO_DOC 102 +#define F_TIPO_DES 103 diff --git a/ve/ve5300a.uml b/ve/ve5300a.uml new file mode 100755 index 000000000..0bbb2e9d1 --- /dev/null +++ b/ve/ve5300a.uml @@ -0,0 +1,201 @@ +#include "ve5300.h" + +TOOLBAR "Bottoni" 0 -3 0 0 + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -11 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -11 "" +END + +ENDPAGE + +PAGE "Copia Documenti" -1 -1 60 10 + +GROUPBOX DLG_NULL 76 5 +BEGIN + PROMPT 1 0 "@bDocumenti sorgente" +END + +NUMBER F_FROM_ANNO 4 +BEGIN + PROMPT 2 1 "Anno " + FLAGS "AU" + CHECKTYPE REQUIRED +END + +LIST F_FROM_PROVV 1 12 +BEGIN + PROMPT 60 1 "" + ITEM "D|Definitivi" + ITEM "P|Provvisori" +END + +STRING F_FROM_NUM 4 +BEGIN + PROMPT 2 2 "Numerazione " + USE %NUM + FLAGS "U" + INPUT CODTAB F_FROM_NUM + DISPLAY "Codice Num." CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_FROM_NUM CODTAB + OUTPUT F_FROM_DES S0 + CHECKTYPE REQUIRED +END + +STRING F_FROM_DES 50 +BEGIN + PROMPT 22 2 "" + USE %NUM KEY 2 + INPUT S0 F_FROM_DES + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice Num." CODTAB + COPY OUTPUT F_FROM_NUM + CHECKTYPE REQUIRED +END + +NUMBER F_NUMFR 6 +BEGIN + PROMPT 2 3 "Da numero " + USE LF_DOC + JOIN LF_CLIFO INTO TIPOCF==TIPOCF CODCF==CODCF + INPUT ANNO F_FROM_ANNO SELECT + INPUT CODNUM F_FROM_NUM SELECT + INPUT PROVV F_FROM_PROVV SELECT + INPUT NDOC F_NUMFR + DISPLAY "Num." CODNUM + DISPLAY "Anno" ANNO + DISPLAY "Provv" PROVV + DISPLAY "Tipo" TIPODOC + DISPLAY "Numero@7" NDOC + DISPLAY "Data@10" DATADOC + DISPLAY "C/F" TIPOCF + DISPLAY "Codice" CODCF + DISPLAY "Ragione Sociale@50" LF_CLIFO->RAGSOC + OUTPUT F_NUMFR NDOC +END + +NUMBER F_NUMTO 6 +BEGIN + PROMPT 26 3 "A numero " + COPY USE F_NUMFR + INPUT ANNO F_FROM_ANNO SELECT + INPUT CODNUM F_FROM_NUM SELECT + INPUT PROVV F_FROM_PROVV SELECT + INPUT NDOC F_NUMTO + COPY DISPLAY F_NUMFR + OUTPUT F_NUMTO NDOC +END + +GROUPBOX DLG_NULL 76 7 +BEGIN + PROMPT 1 5 "@bDocumenti destinazione" +END + +DATE F_TO_DATA +BEGIN + PROMPT 2 6 "Data " + FLAGS "A" + CHECKTYPE REQUIRED +END + +LIST F_TO_PROVV 1 12 +BEGIN + PROMPT 60 6 "" + ITEM "D|Definitivi" + ITEM "P|Provvisori" +END + +STRING F_TO_NUM 4 +BEGIN + PROMPT 2 7 "Numerazione " + FLAGS "U" + COPY USE F_FROM_NUM + INPUT CODTAB F_TO_NUM + COPY DISPLAY F_FROM_NUM + OUTPUT F_TO_NUM CODTAB + OUTPUT F_TO_DES S0 + CHECKTYPE REQUIRED +END + +STRING F_TO_DES 50 +BEGIN + PROMPT 22 7 "" + COPY USE F_FROM_DES + INPUT S0 F_TO_DES + COPY DISPLAY F_FROM_DES + COPY OUTPUT F_TO_NUM + CHECKTYPE REQUIRED +END + +STRING F_OLD_STR 50 +BEGIN + PROMPT 2 8 "Sostituisci " +END + +STRING F_NEW_STR 50 +BEGIN + PROMPT 2 9 "Con " +END + +NUMBER F_PERC 6 2 +BEGIN + PROMPT 2 10 "Percentuale di aumento dei prezzi " +END + +SPREADSHEET F_TIPI_DOC 76 +BEGIN + PROMPT 1 12 "" + ITEM "Selezionato" + ITEM "Tipo" + ITEM "Descrizione@50" +END + +ENDPAGE + +ENDMASK + +PAGE "Tipi" -1 -1 60 6 + +STRING F_TIPO_DOC 4 +BEGIN + PROMPT 1 1 "Tipo " + USE %TIP + INPUT CODTAB F_TIPO_DOC + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_TIPO_DOC CODTAB + OUTPUT F_TIPO_DES S0 + CHECKTYPE REQUIRED + FLAGS "DG" +END + +BOOLEAN F_TIPO_SEL +BEGIN + PROMPT 40 1 "Selezionato" +END + +STRING F_TIPO_DES 50 +BEGIN + PROMPT 6 3 "" + FLAGS "D" +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +ENDMASK diff --git a/ve/ve6100.cpp b/ve/ve6100.cpp index 67bd2ce9e..3531f428a 100755 --- a/ve/ve6100.cpp +++ b/ve/ve6100.cpp @@ -52,10 +52,8 @@ class TContabilizzazione_app : public TApplication TMask *_msk; // maschera di selezione dati TArray_sheet *_num_sheet; // Array sheet selezionabile dei codici numerazione TString_array _tipi_doc; // Array di stringhe contenente i tipi documenti da elaborare - TArray _file; protected: // TApplication - void open_files(int logicnum, ...); // Contabilizza i documenti void contabilize(); // Le 4 seguenti non hanno bisogno di commenti @@ -84,18 +82,6 @@ public: inline TContabilizzazione_app& app() { return (TContabilizzazione_app&) main_app(); } -void TContabilizzazione_app::open_files(int logicnum, ...) -{ - va_list marker; - va_start(marker, logicnum); - while (logicnum > 0) - { - CHECKD(_file.objptr(logicnum) == NULL, "File gia' aperto: ", logicnum); - _file.add(new TLocalisamfile(logicnum), logicnum); - logicnum = va_arg(marker, int); - } -} - bool TContabilizzazione_app::handle_data_range(TMask_field& f, KEY k) { if (k==K_ENTER && f.dirty()) diff --git a/ve/ve6200.cpp b/ve/ve6200.cpp index c555da8d4..45523106a 100755 --- a/ve/ve6200.cpp +++ b/ve/ve6200.cpp @@ -36,7 +36,7 @@ void TFatturazione_bolle_app::open_files(int logicnum, ...) bool TFatturazione_bolle_app::create() { - open_files(LF_TABCOM, LF_CLIFO, LF_CFVEN, LF_DOC, LF_RIGHEDOC, LF_OCCAS, LF_ANAMAG, LF_MOVMAG, LF_RMOVMAG, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, 0); + open_files(LF_TABCOM, LF_TAB, LF_CLIFO, LF_OCCAS, LF_INDSP, LF_CFVEN, LF_DOC, LF_RIGHEDOC, LF_ANAMAG, LF_MOVMAG, LF_RMOVMAG, LF_CONDV, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, 0); dispatch_e_menu(MENU_ITEM(1)); return TRUE; } diff --git a/ve/vearea.men b/ve/vearea.men index 89036bc15..c871e13cc 100755 --- a/ve/vearea.men +++ b/ve/vearea.men @@ -188,6 +188,8 @@ Item_03 = "Contabilizzazione sconti", "ve0 -2 -3", "F" Item_04 = "Contabilizzazione spese e bolli", "ve0 -2 -4", "F" Item_05 = "Contabilizzazione", "ve0 -2 -5", "F" Item_06 = "Gestione spese e bolli", "ve0 -2 -6", "F" +Item_07 = "Articoli e Distinte", "ve0 -2 -7", "F" +Item_08 = "Configurazione contabilita'", "cg5 -1", "F" [ACQVEN_021] Caption = "Servizi" diff --git a/ve/veconf.h b/ve/veconf.h index d60fb972c..f590b6cdb 100755 --- a/ve/veconf.h +++ b/ve/veconf.h @@ -34,6 +34,21 @@ #define F_GESSCOSCA 128 #define F_GESSCOUM 129 +#define F_GESTCONAI 130 +#define F_CODACC 131 +#define F_DESACC 132 +#define F_CODALL 133 +#define F_DESALL 134 +#define F_CODCAR 135 +#define F_DESCAR 136 +#define F_CODPLA 137 +#define F_DESPLA 138 +#define F_CODLEG 139 +#define F_DESLEG 140 +#define F_CODVET 141 +#define F_DESVET 142 +#define F_DESCONAIASS 143 + // Campi per ve0200b.uml #define F_GESAGE 101 #define F_TIPOPERC 102 @@ -87,15 +102,7 @@ #define F_RICERCAAN3 108 #define F_RICERCAAN4 109 #define F_SCONTO_LORDO 110 -#define F_EXPLODEDB 111 -#define F_VALCOMP 112 -#define F_TIPOESPL 113 -#define F_RAGGART 114 -#define F_LIVELLO 115 -#define F_ORDDB 116 -#define F_DESORDDB 117 -#define F_ELRORIG 118 -#define F_IVASTORNO 119 +#define F_IVASTORNO 111 // Campi per ve0200f.uml #define F_IMPSPINC1 101 @@ -128,6 +135,66 @@ #define F_SCTRIGA 128 #define F_SCDRIGA 129 #define F_BOLLIES 130 +#define F_OMDESC 131 +// Campi per ve0200g.uml +#define F_EXPLODEDB 101 +#define F_VALCOMP 102 +#define F_TIPOESPL 103 +#define F_RAGGART 104 +#define F_LIVELLO 105 +#define F_ORDDB 106 +#define F_DESORDDB 107 +#define F_ELRORIG 108 +#define F_CHK_USER1 120 +#define F_CHK_USER2 121 +#define F_CHK_USER3 122 +#define F_CHK_USER4 123 +#define F_CHK_USER5 124 +#define F_CHK_USER6 125 +#define F_CHK_USER7 126 +#define F_CHK_USER8 127 +#define F_CHK_USER9 128 +#define F_CHK_USER10 129 +#define F_PROMPT_USER1 130 +#define F_PROMPT_USER2 131 +#define F_PROMPT_USER3 132 +#define F_PROMPT_USER4 133 +#define F_PROMPT_USER5 134 +#define F_PROMPT_USER6 135 +#define F_PROMPT_USER7 136 +#define F_PROMPT_USER8 137 +#define F_PROMPT_USER9 138 +#define F_PROMPT_USER10 139 +#define F_TYPE_USER1 140 +#define F_TYPE_USER2 141 +#define F_TYPE_USER3 142 +#define F_TYPE_USER4 143 +#define F_TYPE_USER5 144 +#define F_TYPE_USER6 145 +#define F_TYPE_USER7 146 +#define F_TYPE_USER8 147 +#define F_TYPE_USER9 148 +#define F_TYPE_USER10 149 +#define F_LEN_USER1 150 +#define F_LEN_USER2 151 +#define F_LEN_USER3 152 +#define F_LEN_USER4 153 +#define F_LEN_USER5 154 +#define F_LEN_USER6 155 +#define F_LEN_USER7 156 +#define F_LEN_USER8 157 +#define F_LEN_USER9 158 +#define F_LEN_USER10 159 +#define F_DEC_USER1 160 +#define F_DEC_USER2 161 +#define F_DEC_USER3 162 +#define F_DEC_USER4 163 +#define F_DEC_USER5 164 +#define F_DEC_USER6 165 +#define F_DEC_USER7 166 +#define F_DEC_USER8 167 +#define F_DEC_USER9 168 +#define F_DEC_USER10 169 #endif diff --git a/ve/veini.h b/ve/veini.h index 40196468c..c3e8d47f1 100755 --- a/ve/veini.h +++ b/ve/veini.h @@ -11,8 +11,9 @@ #define S_NASCOSTO 0 #define S_DISABILITATO 1 -#define S_NORMALE 2 -#define S_OBBLIGATORIO 3 +#define S_NOCHECK 2 +#define S_NORMALE 3 +#define S_OBBLIGATORIO 4 // #define F_LBTIPORIGA 175 // #define NPIEDI 40 diff --git a/ve/velib.h b/ve/velib.h index 27a78d83f..6c1a573b2 100755 --- a/ve/velib.h +++ b/ve/velib.h @@ -5,14 +5,6 @@ #include #endif -#ifndef __RECARRAY_H -#include -#endif - -#ifndef __VARREC_H -#include -#endif - #ifndef __VARMASK_H #include #endif @@ -59,6 +51,8 @@ class TDocumento; class TRiga_documento; class TCond_vendita; class TIVA; +class TArticolo_giacenza; +class TCache_articoli; bool scontoexpr2perc(const char * exp, bool signal , TString & goodexp, real & val_perc ); @@ -225,7 +219,6 @@ class TTipo_documento : public TRectype // velib03 TString_array _defaults; // Defaults per i campi della maschera TString_array _sheet_columns; // Colonne dello spreadsheet TString_array _handlers; // Handlers - TString16 _sconto_riga; TString16 _imponibile; TString16 _imposta; TString16 _totale; @@ -256,7 +249,6 @@ public: const TString_array& keys_descrs(); const TString_array& sheet_columns(); const TString_array& handlers(); - const TString& sconto_riga(); const TString& mask_name() const { return get("S4");} const TString& causale() const { return get("S6"); } @@ -295,12 +287,15 @@ public: const TString & stati_iniziali_stampa() const {return get("S2").mid(49,20); } bool stato_with_mov_mag(const char stato) const; bool scarica_residuo() const { return is_ordine() || get_bool("B4"); } - + bool clifo_optional() const { return get_bool("B5"); } + TFormula_documento * first_formula() { return succ_formula(TRUE); } TFormula_documento * succ_formula(bool restart = FALSE); const int ncopie() const { return get_int("I0"); } bool spese_aut() const { return get_bool("B0"); } + bool nota_credito() const { return get_bool("B7"); } + bool add_conai() const { return get_bool("B6"); } TTipo_documento(const char* tipodoc = NULL); TTipo_documento(const TRectype& rec); @@ -382,6 +377,7 @@ class TRiga_documento : public TAuto_variable_rectype // velib02 static TAssoc_array _tipi; static TAssoc_array _spese; static TAssoc_array _ive; + static TCache_articoli * _articoli; bool _iva_calc; protected: @@ -390,6 +386,7 @@ protected: virtual TRiga_documento & copy(const TRiga_documento & r); TObject* dup() const { return new TRiga_documento(*this); } + virtual void set_variables(TExpression * e) const ; static void test_firm(); @@ -433,9 +430,12 @@ public: bool sola_descrizione() const; void forza_sola_descrizione(); - virtual TRiga_documento & operator =(const TRiga_documento & r) { return copy(r);} - virtual TRectype & operator =(const TRectype & r); - virtual TRectype & operator =(const char * r); + void set_original_doc_key(const TDocumento& orig); + void reset_original_doc_key(); + + virtual TRiga_documento& operator =(const TRiga_documento& r) { return copy(r);} + virtual TRectype& operator =(const TRectype & r); + virtual TRectype& operator =(const char * r); bool raggruppabile(const TRiga_documento& r, TToken_string& campi) const; TRiga_documento& operator +=(const TRiga_documento& r); @@ -455,7 +455,8 @@ public: real quantita() const { return get_real(RDOC_QTA); } real qtaresidua() const; real valore(bool totale, int ndec) const; - + TArticolo_giacenza * articolo() const; + TRiga_documento(TDocumento* doc, const char* tipo = NULL); TRiga_documento(const TRiga_documento & row); TRiga_documento(const TRiga_documento& rec, TDocumento* doc, @@ -543,7 +544,6 @@ protected: virtual bool key_complete() { return numero() > 0; } virtual bool renum() { return renum_ndoc() > 0;} void set_riga_sconto(); - void set_riga_esenzione(); int write_rewrite(TBaseisamfile & f, bool re) const; virtual TDocumento & copy(const TDocumento & d); virtual TObject* dup() const { return new TDocumento(*this); } @@ -556,8 +556,9 @@ protected: void init(); void check_modules(); + virtual void set_variables(TExpression * e) const ; -public: +public: void dirty_fields(); TAssoc_array & tabella_iva() { update_tabella_iva(); return _tabella_iva; } @@ -628,6 +629,8 @@ public: void set_fields(TAuto_variable_rectype & rec); + void set_riga_esenzione(); + real spese_incasso(real & imp, int ndec, TTipo_importo netto = _lordo) const ; real bolli(real & imp, int ndec, TTipo_importo netto = _lordo) const ; @@ -643,12 +646,15 @@ public: TPagamento & pagamento(); void update_spese_aut(TString_array & spese, bool preserve_old = FALSE, TSheet_field * sh = NULL); + real calc_conai_qta(int type); + void update_conai(); bool is_generic() const { return tipo_valido() && tipo().is_generic(); } bool is_fattura() const { return tipo_valido() && tipo().is_fattura(); } bool is_bolla() const { return tipo_valido() && tipo().is_bolla(); } bool is_ordine() const { return tipo_valido() && tipo().is_ordine(); } bool is_evaso() const; + bool is_nota_credito() const; TDocumento (); TDocumento (const TDocumento & d); @@ -919,6 +925,7 @@ enum error_type { counter_p_ant_error, cau_abb_error, write_part_error, + intra_mov_error, generic_error }; @@ -947,6 +954,8 @@ class TContabilizzazione : public TElaborazione // velib04b *_part, *_scad, *_pags, + *_intra, + *_rintra, *_occas, *_docfile, *_rdocfile; @@ -967,6 +976,7 @@ class TContabilizzazione : public TElaborazione // velib04b // Parametri da leggere all'inizio dell'elaborazione tramite load_parameters() bool _nump_cfg; // se TRUE prende il numero rif. partita dal numero protocollo bool _sc_enabled;// se TRUE il saldaconto di ditta e' abilitato + bool _in_enabled;// se TRUE il modulo INTRA e' abilitato TToken_string _search_seq; // Sequenza di ricerca del conto costo/ricavo la correttezza dell'ordinamento // va controllata nel programma di modifica parametri: // "" = fine ordinamento @@ -1005,7 +1015,7 @@ protected: // Crea le righe iva sul movimento error_type create_iva_rows(TDocumento&); // Crea la riga di totale documento - error_type create_total_doc_row(); + error_type create_total_doc_row(TDocumento&); // Compila le righe del movimento error_type compile_rows_mov(TDocumento&); // scrive le scadenze @@ -1015,9 +1025,9 @@ protected: // restituisce la sezione per sto cliente char sezione() const; // Cerca il conto cliente per il movimento d'anticipo - error_type search_clifo_bill(); + error_type search_clifo_bill(TString &); // Cerca il conto di contropartita per il movimento d'anticipo - error_type search_counter_bill(TString16 &); + error_type search_counter_bill(TDocumento&); // compila la testata del movimento di anticipo error_type compile_head_anticipo(TDocumento&); // compila le righe del movimento di anticipo @@ -1026,6 +1036,8 @@ protected: error_type write_pagamento_anticipo(TDocumento&); // scrive il movimento di anticipo pagamento error_type write_anticipo(TDocumento&); + // scrive il movimento INTRA + error_type write_intra(TDocumento&); // Cambia lo stato del documento error_type change_doc_status(TDocumento&); // Visualizza l'ultimo errore rilevato @@ -1034,6 +1046,8 @@ protected: bool good() const { return _error == no_error;} // Ritorna TRUE se il saldaconto e' abilitato (verifica anche la causale del documento corrente) bool sc_enabled() const ; + // Ritorna TRUE se il modulo INTRA e' abilitato (verifica anche la causale del documento corrente) + bool in_enabled() const ; public: virtual bool elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, const TDate& data_elab, bool interattivo = FALSE); @@ -1089,7 +1103,7 @@ protected: // Effettua il raggruppamento vero e proprio degli effetti (solo se ci sono elementi nell'assoc_array void group_bills(TDocumento&); // Istanzia il pagamento corrente - void calc_pagamento(TDocumento&, TString&, TString&); + void calc_pagamento(TDocumento&); // Scrive i record array degli effetti raggruppati error_type write_groups(); // Cambia lo stato dei gruppi di documenti raggruppati in effetti @@ -1102,8 +1116,9 @@ public: virtual bool elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, const TDate& data_elab, bool interattivo = FALSE); - const long bills() { return _total_bills; } - void set_group(TAssoc_array& a) { _group_array = a; } + long bills() const { return _total_bills; } + void set_group(TAssoc_array& a) { _group_array = a; } + TGenerazione_effetti(const char* cod); TGenerazione_effetti(const TRectype& rec); virtual ~TGenerazione_effetti(); @@ -1142,7 +1157,6 @@ class TDocumentoEsteso : public TDocumento { // Parametri del documento dec_parm _parm; // Parametri per gli arrotondamenti - TTable * _iva; // Tabella codici IVA // Totali del documento ricalcolati non appena la tabellina di riepilogo IVA e' completa // real _importi_netti, _imposte; @@ -1159,21 +1173,19 @@ class TDocumentoEsteso : public TDocumento TString_array _scadenze_array;// Array che contiene le scadenze ("|") int _scadenze_current; // indice per identificare l'elementi corrente sull'array (-1 se non ha ancora calcolato) -public: - +public: // Funzioni per il riepilogo IVA const bool summary_compiled() { return _sum_filter > -1; } void compile_summary(); // Aggiorna la tabella riepilogativa void summary_filter(byte selector); // filtra la tabellina secondo il filtro corrente se non e' gia' stato fatto void summary_reset(bool force=FALSE); // riposiziona l'array dei codici IVA (_order_array). Se il parametro e' TRUE forza il ricalcolo della tabella void summary_set_next(); // seleziona il prossimo elemento del filtro - const TRiepilogo_iva& sum_current() { return _sum_current; } // ritorna la riga corrente del filtro corrente + const TRiepilogo_iva& sum_current() const { return _sum_current; } // ritorna la riga corrente del filtro corrente const char * summary_get(const TString& w); // ritorna l'informazione richiesta estratta dall'elemento corrente int summary_items() { return tabella_iva().items();} // ritorna il numero di righe in totale della tabellina - const TAssoc_array& summary() { return _summary_table; } - const TArray& summary_array() { return _summary_array;} + const TAssoc_array& summary() const { return _summary_table; } + const TArray& summary_array() const { return _summary_array;} - // Funzioni per il ricalcolo delle scadenze void scadenze_reset(); // riposiziona sulla prima scadenza void scadenze_recalc(); // resetta e ricalcola le scadenze diff --git a/ve/velib02.cpp b/ve/velib02.cpp index 1f2bd78e9..6e7ede444 100755 --- a/ve/velib02.cpp +++ b/ve/velib02.cpp @@ -1,16 +1,42 @@ +#include #include #include +#include "sconti.h" #include "velib.h" #include "vepriv.h" - #include "verig.h" -#include "sconti.h" -#endif +#include "../mg/mglib.h" -#ifndef __RDOC_H #include "rdoc.h" -#endif + +// TArticolo_cache +/////////////////////////////////////////////////////////// +class TCache_articoli : public TRecord_cache +{ +protected: + virtual TObject* rec2obj(const TRectype& rec) const; + +public: + TArticolo_giacenza& art(const char* key); + TCache_articoli(); + virtual ~TCache_articoli() { } +}; + +TCache_articoli::TCache_articoli() + : TRecord_cache(LF_ANAMAG, 1) +{ } + +TObject* TCache_articoli::rec2obj(const TRectype& curr) const +{ + return new TArticolo_giacenza(curr); +} + +TArticolo_giacenza & TCache_articoli::art(const char* key) +{ + TArticolo_giacenza& art = (TArticolo_giacenza&)query(key); + return art; +} /////////////////////////////////////////////////////////// // Tipo riga di un documento @@ -142,6 +168,7 @@ long TRiga_documento::_firm = -1; TAssoc_array TRiga_documento::_tipi; TAssoc_array TRiga_documento::_spese; TAssoc_array TRiga_documento::_ive; +TCache_articoli * TRiga_documento::_articoli = NULL; TRiga_documento::TRiga_documento(TDocumento* doc, const char * tipo) : TAuto_variable_rectype(LF_RIGHEDOC), _doc(doc), _iva_calc(FALSE) @@ -257,6 +284,39 @@ TRiga_documento & TRiga_documento::copy(const TRiga_documento & r) return *this; } +void TRiga_documento::set_variables(TExpression * e) const +{ + const int items = e->numvar(); + for (int i = 0; i < items; i++) + { + const TFieldref field(e->varname(i), LF_RIGHEDOC); + + switch (field.file()) + { + case LF_ANAMAG : + { + const TArticolo_giacenza * art = articolo(); + + if (art != NULL) + e->setvar(i, art->get(field.name())); + } + break; + case LF_DOC : + e->setvar(i, doc().get(field.name())); + break; + case LF_CLIFO : + e->setvar(i, doc().clifor().get(field.name())); + break; + case LF_CFVEN : + e->setvar(i, doc().clifor().vendite().get(field.name())); + break; + default: + e->setvar(i, get(field.name())); + break; + } + } +} + void TRiga_documento::test_firm() { const long new_firm = prefix().get_codditta(); @@ -300,9 +360,9 @@ bool TRiga_documento::raggruppabile(const TRiga_documento& r, TToken_string& cam TRiga_documento& TRiga_documento::operator +=(const TRiga_documento& r) { TToken_string campi("QTA|NCOLLI|QTAEVASA"); - for (const char* c = campi.get(0); c && ok; c = campi.get()) + for (const char* c = campi.get(0); c; c = campi.get()) { - real num(r.get_real(c)); + real num = r.get_real(c); if (!num.is_zero()) { num += get_real(c); @@ -657,6 +717,7 @@ void TRiga_documento::autosave(TSheet_field & f) codmagc.left_just(3); codmagc << row.get( f.cid2index(FR_CODDEPC )); put( "CODMAGC", codmagc); + put( "DATACONS", row.get( f.cid2index(FR_DATACONS )) ); put( "CODARTMAG", row.get( f.cid2index(FR_CODARTMAG )) ); put( "CHECKED", row.get( f.cid2index(FR_CHECKED )) ); put( RDOC_QTAGG1, row.get( f.cid2index(FR_QTAGG1 )) ); @@ -733,6 +794,7 @@ void TRiga_documento::autoload(TSheet_field & f) const TString16 codmagc(get("CODMAGC")); row.add( codmagc.left(3), f.cid2index(FR_CODMAGC )); row.add( codmagc.mid(3), f.cid2index(FR_CODDEPC )); + row.add( get("DATACONS"), f.cid2index(FR_DATACONS )); row.add( get( "CODARTMAG" ), f.cid2index(FR_CODARTMAG)); row.add( get( "CHECKED" ), f.cid2index(FR_CHECKED)); row.add( get( RDOC_QTAGG1), f.cid2index(FR_QTAGG1)); @@ -744,3 +806,30 @@ void TRiga_documento::autoload(TSheet_field & f) row.add( get( RDOC_LINEA) , f.cid2index(FR_LINEA)); } +TArticolo_giacenza * TRiga_documento::articolo() const +{ + if (_articoli == NULL) + _articoli = new TCache_articoli(); + + const TString & codart = get(RDOC_CODARTMAG); + if (codart.empty()) + return NULL; + return &(_articoli->art(codart)); +} + +void TRiga_documento::set_original_doc_key(const TDocumento& orig) +{ + put(RDOC_DACODNUM, orig.get(DOC_CODNUM)); + put(RDOC_DAANNO, orig.get(DOC_ANNO)); + put(RDOC_DAPROVV, orig.get(DOC_PROVV)); + put(RDOC_DANDOC, orig.get(DOC_NDOC)); +} + +void TRiga_documento::reset_original_doc_key() +{ + zero(RDOC_DACODNUM); + zero(RDOC_DAANNO); + zero(RDOC_DAPROVV); + zero(RDOC_DANDOC); +} + diff --git a/ve/velib03.cpp b/ve/velib03.cpp index a3f8e4e31..1e57698e0 100755 --- a/ve/velib03.cpp +++ b/ve/velib03.cpp @@ -1,41 +1,24 @@ #include +#include #include #include -#include #include +#include "sconti.h" +#include "veini.h" #include "velib.h" #include "vepriv.h" +#include "veuml.h" + +#include "../cg/cg2103.h" +#include "../cg/cglib01.h" +#include "../mg/mglib.h" +#include "../mg/movmag.h" +#include "../pr/prlib.h" +#include "../sv/svlib01.h" #include -#include "veuml.h" -#include "veini.h" - -#include "../mg/mglib.h" - -#ifndef __SCONTI_H -#include "sconti.h" -#endif - -#ifndef __SVLIB01_H -#include "../sv/svlib01.h" -#endif - -#ifndef __CGLIB01_H -#include "../cg/cglib01.h" -#endif - -#ifndef __CG2103_H -#include "../cg/cg2103.h" -#endif - -#ifndef __PRLIB_H -#include "../pr/prlib.h" -#endif - -#include "../mg/movmag.h" - // calcola il prezzo per le spese void sppr_calc(TRectype & rec, const TString & valuta_doc, const real & cambio, real & prezzo) { @@ -60,25 +43,25 @@ void sppr_calc(TRectype & rec, const TString & valuta_doc, const real & cambio, /////////////////////////////////////////////////////////// // Movimento di magazzino /////////////////////////////////////////////////////////// + class TMov_mag_doc : public TMov_mag { - const TDocumento * _doc; - TString_array _codmagc; + TString_array _codmagc; protected: virtual const char * codmag_rauto(int r) const; public: void add_magc(const char* magc) { _codmagc.add(magc); } - TMov_mag_doc(const TDocumento * d) : _doc(d) {} + TMov_mag_doc() { } virtual ~TMov_mag_doc() {} }; - -const char * TMov_mag_doc::codmag_rauto(int r) const + +const char* TMov_mag_doc::codmag_rauto(int r) const { TRecord_array & b = body(); - if (r > b.rows()) // Can't check non-existant rows + if (r > b.rows()) // Can't check non-existent rows return NULL; TRectype & row = b[r]; @@ -92,7 +75,7 @@ const char * TMov_mag_doc::codmag_rauto(int r) const if (b[i].get_char(RMOVMAG_TIPORIGA) == 'D') j++; - return j>=0 ? _codmagc.row(j) : NULL; + return j >=0 ? _codmagc.row(j) : NULL; } /////////////////////////////////////////////////////////// @@ -120,11 +103,17 @@ TTipo_documento::~TTipo_documento() } int TTipo_documento::read(const char* tipodoc) -{ +{ +/* TTable t("%TIP"); put("CODTAB", tipodoc); int err = TRectype::read(t); - _formule = ""; +*/ + *this = cache().get("%TIP", tipodoc); + int err = empty() ? _iskeynotfound : NOERR; + + _formule.cut(0); + if (err == NOERR) read_formule(); else @@ -179,15 +168,14 @@ const TString_array& TTipo_documento::sheet_columns() TString16 col; TFilename pn(profile_name()); pn.ext("ini"); - TConfig prof(pn); + TConfig prof(pn, "SHEET"); int ncols = prof.get_int( "NCOLS", "SHEET" ); - for ( int i = 1; i <= ncols; i ++ ) + for (int i = 1; i <= ncols; i++) { col.format( "%d", i ); _sheet_columns.add(prof.get(col, "SHEET")); } } - return _sheet_columns; } @@ -211,20 +199,6 @@ const TString_array& TTipo_documento::handlers() return _handlers; } -const TString& TTipo_documento::sconto_riga() -{ - if (_sconto_riga.empty()) - { - TFilename pn = profile_name(); - pn.ext("ini"); - TConfig prof(pn); - _sconto_riga = prof.get("GESSCORIGA"); - if (_sconto_riga.empty()) - _sconto_riga = "N"; - } - return _sconto_riga; -} - void TTipo_documento::set_defaults(TMask& m) { const int items = _defaults.items(); @@ -234,12 +208,12 @@ void TTipo_documento::set_defaults(TMask& m) TString16 chiave; TFilename pn(profile_name()); pn.ext("ini"); - TConfig prof(pn); - const int ndefaults = prof.get_int("NDEFAULTS", "DEFAULT"); + TConfig prof(pn, "DEFAULT"); + const int ndefaults = prof.get_int("NDEFAULTS"); for(int i = 1; i <= ndefaults; i++) { chiave.format("%d", i); - _defaults.add(prof.get(chiave, "DEFAULT")); + _defaults.add(prof.get(chiave)); } } @@ -254,79 +228,109 @@ void TTipo_documento::set_defaults(TMask& m) void TTipo_documento::read_formule() { TFilename profile(profile_name()); - profile.ext("ini"); - - TConfig prof(profile); + TConfig prof(profile, "MAIN"); + prof.write_protect(); // Altrimenti non si distrugge!!! - _formule = prof.get("CAMPICALC", "MAIN"); - _formule.add(prof.get("CALCOLI", "MAIN")); - _totale = prof.get("TOTALE", "MAIN"); + _formule = prof.get("CAMPICALC"); + _formule.add(prof.get("CALCOLI")); + _totale = prof.get("TOTALE"); if (_totale.empty()) _totale = "TOTDOC"; - +/* TTable frd("%FRD"); - frd.put("CODTAB", _totale); if (frd.read() != NOERR) _formule_documento.add(_totale, new TFormula_documento(_documento, _totale, "IMPONIBILI()+IMPOSTE()"), TRUE); +*/ + const TRectype& for_tot = cache().get("%FRD", _totale); + if (for_tot.empty()) + _formule_documento.add(_totale, new TFormula_documento(_documento, _totale, "IMPONIBILI()+IMPOSTE()"), TRUE); + if (_formule.find(_totale) < 0) _formule.add(_totale); _totale_netto = "_"; _totale_netto << _totale; - _basesconto = prof.get("BASESCONTO", "MAIN"); + _basesconto = prof.get("BASESCONTO"); if (_basesconto.empty()) _basesconto = "BASESCONTO"; +/* frd.put("CODTAB", _basesconto); if (frd.read() != NOERR) _formule_documento.add(_basesconto, new TFormula_documento(_documento, _basesconto, "SOMMA(\"IMPONIBILE()\", \"(TIPO() != 'S') && (TIPO() != 'C')\")"), TRUE); +*/ + const TRectype& for_bas = cache().get("%FRD", _basesconto); + if (for_bas.empty()) + _formule_documento.add(_basesconto, new TFormula_documento(_documento, _basesconto, "SOMMA(\"IMPONIBILE()\", \"(TIPO() != 'S') && (TIPO() != 'C')\")"), TRUE); + if (_formule.find(_basesconto) < 0) _formule.add(_basesconto); - _spese = prof.get("SPESE", "MAIN"); + _spese = prof.get("SPESE"); if (_spese.empty()) _spese = "SPESE"; - + +/* frd.put("CODTAB", _spese); if (frd.read() != NOERR) _formule_documento.add(_spese, new TFormula_documento(_documento, _spese, "SOMMA(\"IMPONIBILE()\", \"TIPO() == 'S'\")"), TRUE); +*/ + const TRectype& for_spe = cache().get("%FRD", _spese); + if (for_spe.empty()) + _formule_documento.add(_spese, new TFormula_documento(_documento, _spese, "SOMMA(\"IMPONIBILE()\", \"TIPO() == 'S'\")"), TRUE); + if (_formule.find(_spese) < 0) _formule.add(_spese); - _totvalres = prof.get("TOTVALRES", "MAIN"); + _totvalres = prof.get("TOTVALRES"); if (_totvalres.empty()) _totvalres = "TOTVALRES"; - _totvalore = prof.get("TOTVALORE", "MAIN"); + _totvalore = prof.get("TOTVALORE"); if (_totvalore.empty()) _totvalore = "TOTVALORE"; - + +/* frd.put("CODTAB", _totvalres); if (frd.read() != NOERR) _formule_documento.add(_totvalres, new TFormula_documento(_documento, _totvalres, "VALDOC(0)"), TRUE); +*/ + const TRectype& for_tvr = cache().get("%FRD", _totvalres); + if (for_tvr.empty()) + _formule_documento.add(_totvalres, new TFormula_documento(_documento, _totvalres, "VALDOC(0)"), TRUE); + if (_formule.find(_totvalres) < 0) _formule.add(_totvalres); +/* frd.put("CODTAB", _totvalore); if (frd.read() != NOERR) _formule_documento.add(_totvalore, new TFormula_documento(_documento, _totvalore, "VALDOC(1)"), TRUE); +*/ + const TRectype& for_tva = cache().get("%FRD", _totvalore); + if (for_tva.empty()) + _formule_documento.add(_totvalore, new TFormula_documento(_documento, _totvalore, "VALDOC(1)"), TRUE); + if (_formule.find(_totvalore) < 0) _formule.add(_totvalore); if (provvigioni()) { - TString80 campo(prof.get("TOTPROVV", "MAIN")); - + TString80 campo(prof.get("TOTPROVV")); if (campo.empty()) campo = "TOTPROVV"; - +/* frd.put("CODTAB", campo); - _totprovv = "_"; - _totprovv << campo; if (frd.read() != NOERR) frd.zero(); +*/ + const TRectype& frd = cache().get("%FRD", campo); + + _totprovv = "_"; + _totprovv << campo; + TString80 expr(frd.get("S1")); if (expr.empty()) expr = "SOMMA(\"PROVV()\")"; @@ -442,7 +446,7 @@ TExpr_documento::TExpr_documento(const char* expression, TTypeexp type, : TExpression(type), _doc(doc), _row(row) { if (!set(expression, type)) - error_box("Wrong expression : %s", expression); + error_box("Wrong expression : '%s'", expression); } int TExpr_documento::parse_user_func(const char * name, int nparms) const @@ -805,7 +809,8 @@ TFormula_documento::TFormula_documento(const TRectype& rec) { _tab = "%"; _tab << rec.get("COD"); - _expr = new TExpr_documento(expr_string(), expr_type()); + const TTypeexp et = expr_type(); + _expr = new TExpr_documento(expr_string(), et); } TFormula_documento::~TFormula_documento() @@ -838,8 +843,9 @@ int TFormula_documento::read(const char* codice, const char * expr, bool numexpr if (err == NOERR) { - const TString& e = expr_string(); - _expr = new TExpr_documento(e, expr_type()); + const TTypeexp et = expr_type(); + const TString e = expr_string(); // Copio espressione proveniente da record + _expr = new TExpr_documento(e, et); } else { @@ -945,6 +951,28 @@ void TDocumento::check_modules() } } +void TDocumento::set_variables(TExpression * e) const +{ + const int items = e->numvar(); + for (int i = 0; i < items; i++) + { + const TFieldref field(e->varname(i), LF_DOC); + + switch (field.file()) + { + case LF_CLIFO : + e->setvar(i, clifor().get(field.name())); + break; + case LF_CFVEN : + e->setvar(i, clifor().vendite().get(field.name())); + break; + default: + e->setvar(i, get(field.name())); + break; + } + } +} + void TDocumento::test_firm() { const long new_firm = prefix().get_codditta(); @@ -1010,12 +1038,29 @@ real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const real tot_bolli; static TArray sca_bolli; static TArray imp_bolli; + static real bolli_es; static int nscagl; TLocalisamfile clifo(LF_CLIFO); short estero = 2; if (get_bool("ADDBOLLI")) { + if (sca_bolli.objptr(0) == NULL) + { + TConfig conf(CONFIG_STUDIO); + + bolli_es = (real) conf.get("BOLLIES", "ve"); + for (nscagl = 0; nscagl < 7; nscagl++) + { + real s(conf.get("SPBOSCA", "ve", nscagl + 1)); + real i(conf.get("SPBOIMP", "ve", nscagl + 1)); + + if (s == ZERO && i == ZERO) + break; + sca_bolli.add(s, nscagl); + imp_bolli.add(i, nscagl); + } + } if (ndec == AUTO_DECIMALS) ndec = in_valuta() ? 3 : 0; real cambio = get_real("CAMBIO"); @@ -1039,6 +1084,8 @@ real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const const real imponibile = importo - imposte - imp_spese; tot_bolli = ZERO; + if (_esenzione != NULL) + tot_bolli = bolli_es; pag.set_total(imponibile, imposte, imp_spese); pag.set_rate_auto(); @@ -1051,21 +1098,6 @@ real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const { case _ric_ban: { - if (sca_bolli.objptr(0) == NULL) - { - TConfig conf(CONFIG_STUDIO); - - for (nscagl = 0; nscagl < 7; nscagl++) - { - real s(conf.get("SPBOSCA", "ve", nscagl + 1)); - real i(conf.get("SPBOIMP", "ve", nscagl + 1)); - - if (s == ZERO && i == ZERO) - break; - sca_bolli.add(s, nscagl); - imp_bolli.add(i, nscagl); - } - } for (int i = 0; i < nscagl - 1; i++) if ((real &) sca_bolli[i] >= imp) break; @@ -1193,24 +1225,25 @@ void TDocumento::copy_data(TRectype& dst, const TRectype& src) { dst.put("NRIGA", nriga); dst.zero(RDOC_MOVMAG); + TString memo(1024); + memo = src.get("DESCEST"); + dst.put("DESCEST", memo); } else - dst.zero(DOC_MOVMAG); - + dst.zero(DOC_MOVMAG); } -void TDocumento::copy_contents(const TDocumento & src) +void TDocumento::copy_contents(const TDocumento& src) { copy_data(head(), src.head()); destroy_rows(); - const int rows = src.physical_rows(); - - for (int i = 0; i < rows ; i++) + const int rows = src.physical_rows(); + for (int i = 1; i <= rows ; i++) { - const TRiga_documento & s = src[i]; + const TRiga_documento& s = src[i]; TRiga_documento & r = new_row(s.tipo().codice()); - copy_data(r, s); + r.set_original_doc_key(src); } } @@ -1428,12 +1461,7 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const myself.stato(stato_finale); } else - { -// if (_stato_originale == stato()) -// if (!modificabile() && !yesno_box("Documento non modificabile,\nSi desidera continuare ugualmente")) -// return NOERR; myself._stato_originale = stato(); - } const bool check_movmag = dongle().active(MGAUT) && tipo().mov_mag(); const char stato_doc(stato()); @@ -1454,7 +1482,9 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const } myself.update_spese_aut(spese); } - + + myself.update_conai(); + int err = NOERR; long num = get_long("MOVMAG"); @@ -1462,12 +1492,13 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const if (check_movmag) { - TMov_mag_doc mov(this); + TMov_mag_doc mov; TLocalisamfile m(LF_MOVMAG); mov.zero(); if (num == 0 && do_movmag) { +/* num = atol(mov.get_next_key()); mov.put(MOVMAG_NUMREG, num); while (mov.write(m) == _isreinsert) @@ -1475,6 +1506,11 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const num++; mov.put(MOVMAG_NUMREG, num); } +*/ + err = mov.write(m); + if (err != NOERR) + return err; + num = mov.get_long(MOVMAG_NUMREG); myself.put("MOVMAG", num); } if (num > 0) @@ -1499,10 +1535,13 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const b[i + 1].get_char(RMOVMAG_TIPORIGA) == riga_automatica) b.destroy_row(i + 1); } + else + if (r.get_bool(RMOVMAG_ESPLOSA)) + b.destroy_row(i); } b.pack(); - TDate d(get("DATADOC")); + const TDate d(get("DATADOC")); mov.put(MOVMAG_ANNOES, mov.codice_esercizio(d)); mov.put(MOVMAG_DATAREG, d); mov.put(MOVMAG_DATACOMP, d); @@ -1521,7 +1560,6 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const { mov.put(MOVMAG_EXNUMDOC, ex_numdoc); const TDate ex_d(get("DATADOCRIF")); - mov.put(MOVMAG_EXDATADOC, ex_d); } mov.put(MOVMAG_CATVEN, get("CATVEN")); @@ -1555,7 +1593,7 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const r_num = num; r.put("MOVMAG", r_num); } - + const real qta = scarica_residuo ? r.qtaresidua(): r.quantita(); if (r_num == num && qta != ZERO) @@ -1570,7 +1608,8 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const rm.put(RMOVMAG_UM, r.get("UMQTA")); rm.put(RMOVMAG_QUANT, qta); - real prezzo(r.get("PREZZO")); +// real prezzo(r.get("PREZZO")); + real prezzo(r.prezzo(TRUE, FALSE)); prezzo*=cambio; rm.put(RMOVMAG_PREZZO, prezzo); @@ -1591,7 +1630,7 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const if (r_num == num) r.zero("MOVMAG"); } - ((TDocumento *)this)->zero("MOVMAG"); + myself.zero("MOVMAG"); } } } @@ -1655,11 +1694,15 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const { TString80 key(get(DOC_PROVV)); key << get(DOC_ANNO); key << get(DOC_CODNUM); key << get(DOC_NDOC); TObject * o = _docs_to_agg.objptr(key); + const bool is_nota_credito = tipo().nota_credito(); if (o != NULL) _docs_to_agg.remove(key); for (int i = physical_rows(); i > 0; i--) - _st_agg.add(myself.row(i)); + if (is_nota_credito) + _st_agg.sub(myself.row(i)); + else + _st_agg.add(myself.row(i)); if (_docs_to_agg.items() == 0) _st_agg.update(); } @@ -1678,7 +1721,7 @@ int TDocumento::remove(TBaseisamfile& f) const if (num > 0) { - TMov_mag_doc mov(this); + TMov_mag_doc mov; TLocalisamfile m(LF_MOVMAG); mov.put(MOVMAG_NUMREG, num); while (mov.read(m, _isequal, _testandlock) == _islocked) @@ -1715,23 +1758,23 @@ TProvvigioni_agente& TDocumento::calc_provvigioni(const bool generata) { CHECK (_provv_agente, "Bad TProvvigione_agente object"); - TString agente(get(DOC_CODAG)); - const int anno = TDocumento::anno(); - TString codnum(numerazione()); - const long ndoc = numero(); - TDate datadoc(data()); + TString16 agente(get(DOC_CODAG)); + const int anno = TDocumento::anno(); + TString16 codnum(numerazione()); + const long ndoc = numero(); + TDate datadoc(data()); while (_provv_agente->read(agente, anno,codnum,ndoc) == _islocked) // Legge le provvigioni per questo documento if (!yesno_box("Dati agente %s in uso da un altro utente. Riprovo?", (const char*) agente)) return *_provv_agente; - const real perc = _provv_agente->perc_fatt(); - real tot_doc(totale_doc()); - real tot_netto(totale_netto()); - real tot_provv = provvigione(); - real provv_fat = (tot_provv / 100.0) * perc; // Provvigione sul fatturato (rata 0) + const real perc = _provv_agente->perc_fatt(); + real tot_doc(totale_doc()); + real tot_netto(totale_netto()); + real tot_provv = provvigione(); + real provv_fat = (tot_provv / 100.0) * perc; // Provvigione sul fatturato (rata 0) provv_fat.round(); - real provv_pag = tot_provv - provv_fat; // Provvigione sul pagato (da suddivere secondo il pagamento) + real provv_pag = tot_provv - provv_fat; // Provvigione sul pagato (da suddivere secondo il pagamento) const real change(cambio()); // Calcolo rate per provvigioni e documento @@ -1740,36 +1783,27 @@ TProvvigioni_agente& TDocumento::calc_provvigioni(const bool generata) real totspese = spese(); real totimposte = imposta(); real totimponibili = tot_doc - totimposte - totspese; - const bool valuta = in_valuta(); - const TString16 codcaus(tipo().causale()); - if (codcaus.not_empty()) - { - TLocalisamfile caus(LF_CAUSALI); - TLocalisamfile rcaus(LF_RCAUSALI); - TCausale c(codcaus, datadoc.year()); - const char sez = c.sezione_clifo(); - const bool swap = (c.reg().iva() == iva_vendite) ^ sez == 'D'; - if (swap) - { - tot_doc = -tot_doc; - tot_netto = -tot_netto; - tot_provv = -tot_provv; - provv_fat = -provv_fat; - provv_pag = -provv_pag; - totspese = -totspese; - totimposte = -totimposte; - totimponibili = -totimponibili; - } + if (is_nota_credito()) // Se il documento e' una nota di credito, cambia segno + { + tot_doc = -tot_doc; + tot_netto = -tot_netto; + tot_provv = -tot_provv; + provv_fat = -provv_fat; + provv_pag = -provv_pag; + totspese = -totspese; + totimposte = -totimposte; + totimponibili = -totimponibili; } - if (valuta) + if (in_valuta()) { real val1 = totimponibili * change; real val2 = totimposte * change; real val3 = totspese * change; - pag1.set_total_valuta(totimponibili, totimposte, totspese, change, val1, val2, val3); - pag2->set_total_valuta(provv_pag, ZERO, ZERO, change, provv_pag*change, ZERO, ZERO); + TString16 codval = valuta(); + pag1.set_total_valuta(totimponibili, totimposte, totspese, change, val1, val2, val3, codval); + pag2->set_total_valuta(provv_pag, ZERO, ZERO, change, provv_pag*change, ZERO, ZERO, codval); } else { @@ -1804,8 +1838,8 @@ TProvvigioni_agente& TDocumento::calc_provvigioni(const bool generata) rt.set_rata(i); rt.set_datascad(i == 0 ? datadoc : pag1.data_rata(i-1)); rt.set_tipopag(i == 0 ? 1 : pag1.tipo_rata(i-1)); - rt.set_imprata(i == 0 ? ZERO : pag1.importo_rata(i-1,valuta ? TRUE : FALSE)); - rt.set_impprovv(i == 0 ? provv_fat : pag2->importo_rata(i-1,valuta ? TRUE : FALSE)); + rt.set_imprata(i == 0 ? ZERO : pag1.importo_rata(i-1,in_valuta())); + rt.set_impprovv(i == 0 ? provv_fat : pag2->importo_rata(i-1,in_valuta())); if (generata) rt.set_generata(); } @@ -2188,15 +2222,27 @@ real TDocumento::spese() const return ZERO; } -TPagamento & TDocumento::pagamento() +TPagamento& TDocumento::pagamento() { - const TString16 codpag(get("CODPAG")); - + const char tipocf = get_char(DOC_TIPOCF); + const long codcf = get_long(DOC_CODCF); + _pag.set_clifo(codcf, tipocf); + + TDate data_in = get_date(DOC_DATAINSC); + if (data_in.empty()) + data_in = get_date(DOC_DATADOC); + + TString16 codpag(get(DOC_CODPAG)); if (codpag != _pag.code()) { _pag.set_code(codpag); _pag.read(); + _pag.set_inizio(data_in /* , TRUE */); // Perche' rispetta rate TRUE? } + + if (data_in != _pag.get_inizio()) + _pag.set_inizio(data_in /* , TRUE */); // Perche' rispetta rate TRUE? + return _pag; } @@ -2351,8 +2397,9 @@ void TDocumento::update_spese_aut(TString_array & spese_aut, bool preserve_old, for (int i = nrows; i > 0; i--) { TRiga_documento & r = row(i); + bool tipo_spese = r.get("GENTIPO").empty(); - if (r.tipo().tipo() == RIGA_SPESEDOC && r.is_generata()) + if (r.tipo().tipo() == RIGA_SPESEDOC && r.is_generata() && tipo_spese) { if (preserve_old) return; @@ -2427,6 +2474,125 @@ void TDocumento::update_spese_aut(TString_array & spese_aut, bool preserve_old, put("SPESEUPD", TRUE); } +real TDocumento::calc_conai_qta(int type) +{ + const char * const __conai_art_names[] = {"CONACC", "CONALL", "CONCAR", "CONPLA", "CONLEG", "CONVET"}; + const char * const __conai_cf_names[] = {"ESACC", "ESALL", "ESCAR", "ESPLA", "ESLEG", "ESVET"}; + real qta = ZERO; + real perc_esenz = clifor().vendite().get(__conai_cf_names[type]); + + if (perc_esenz < 100.0) + { + const int nrows = physical_rows(); + for (int i = nrows; i > 0; i--) + { + TRiga_documento & r = row(i); + TArticolo_giacenza * art = r.articolo(); + if (art != NULL) + { + real row_qta = r.get_real("QTA"); + + qta += row_qta*art->get_real(__conai_art_names[type]); + } + } + if (qta > ZERO) + qta *= (1 - perc_esenz/100.0); + } + return qta; +} + +void TDocumento::update_conai() +{ + if (tipo().add_conai()) + { + bool cli_add_conai = clifor().vendite().get_bool("ADDCONAI"); + TString_array conai_sp(6); + + { + TConfig c(CONFIG_DITTA); + + conai_sp.add(c.get("CODACC")); + conai_sp.add(c.get("CODALL")); + conai_sp.add(c.get("CODCAR")); + conai_sp.add(c.get("CODPLA")); + conai_sp.add(c.get("CODLEG")); + conai_sp.add(c.get("CODVET")); + } + bool updated[6] = {FALSE,FALSE,FALSE,FALSE,FALSE,FALSE}; + + const int nrows = physical_rows(); + for (int i = nrows; i > 0; i--) + { + TRiga_documento & r = row(i); + const bool tipo_conai = r.get_char("GENTIPO") == 'C'; + + if (r.tipo().tipo() == RIGA_SPESEDOC && r.is_generata() && tipo_conai) + { + const TString16 cod(r.get("CODART")); + const int pos = conai_sp.find(cod); + + if (pos >= 0) + { + if (cli_add_conai) + { + real qta = calc_conai_qta(pos); + if (qta > ZERO) + r.put("QTA", qta); + else + destroy_row(i, TRUE); + } + else + destroy_row(i, TRUE); + updated[pos] = TRUE; + } + } + } + if (cli_add_conai) + { + TString16 cod_iva_cli = clifor().vendite().get("ASSFIS"); + TSpesa_prest sp; + + for (i = 0; i < 6; i++) + { + if (!updated[i]) + { + real qta = calc_conai_qta(i); + + if (qta > ZERO) + { + const TString & s = conai_sp.row(i); + if (sp.read(s) != NOERR) + message_box("Codice spesa %s assente", (const char *) s); + else + { + TString16 tipo(sp.tipo_riga()); + TRiga_documento & riga = new_row(tipo); + + riga.put("CODART", s); + riga.generata(); + riga.put("GENTIPO", "C"); + riga.put("DESCR", sp.descrizione()); + riga.put("QTA", qta); + + const real cambio = get_real("CAMBIO"); + const TString16 valuta = get("CODVAL"); + real prezzo = sp.prezzo(); + + sppr_calc(sp, valuta, cambio, prezzo); + riga.put("PREZZO", prezzo); + riga.put("UMQTA", sp.um()); + if (cod_iva_cli.empty()) + riga.put("CODIVA", sp.cod_iva()); + else + riga.put("CODIVA", cod_iva_cli); + } + } + } + } + } + } +} + bool TDocumento::is_evaso() const { bool ok = is_ordine() || is_generic(); @@ -2438,3 +2604,24 @@ bool TDocumento::is_evaso() const } return ok; } + +bool TDocumento::is_nota_credito() const +{ + const TString16 codcaus(tipo().causale()); + bool swap = FALSE; + + // Controlla prima l'esistenza del flag nota-credito sul tipo documento; + // se non e' settato controlla la causale + if (tipo().nota_credito()) + swap = TRUE; + else + if (codcaus.not_empty()) + { + TLocalisamfile caus(LF_CAUSALI); + TLocalisamfile rcaus(LF_RCAUSALI); + TCausale c(codcaus, data().year()); + const char sez = c.sezione_clifo(); + swap = (c.reg().iva() == iva_vendite) ^ sez == 'D'; + } + return swap; +} diff --git a/ve/velib04.cpp b/ve/velib04.cpp index 36efb8d84..11cd60f74 100755 --- a/ve/velib04.cpp +++ b/ve/velib04.cpp @@ -398,14 +398,15 @@ TCopia_documento::TCopia_documento(const char* cod) } bool TCopia_documento::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, - const TDate& data_elab, bool interattivo) + const TDate& data_elab, bool interattivo) { CHECK(doc_in.items() == doc_out.items(), "Si deve specificare un numero uguale di documenti in entrata ed in uscita"); for (int d = 0; d < doc_in.items(); d++) { - TDocumento & doc_src = doc_in[d]; - TDocumento & doc_dest = doc_out[d]; + TDocumento& doc_src = doc_in[d]; + TDocumento& doc_dest = doc_out[d]; doc_dest.copy_contents(doc_src); + doc_dest.put(DOC_DATADOC, data_elab); } return TRUE; } diff --git a/ve/velib04a.cpp b/ve/velib04a.cpp index c53ddfacf..d9f6cc255 100755 --- a/ve/velib04a.cpp +++ b/ve/velib04a.cpp @@ -29,7 +29,7 @@ void TFatturazione_bolle::stati_validi(TToken_string& stati) const { // const TString& s7 = get("S7"); stati.cut(0); - TString16 s; +// TString16 s; for (int i = 0; i < TElaborazione::_max_tipi_doc_elab; i++) { // s = s7.mid(i*4, 1); @@ -134,7 +134,7 @@ bool TFatturazione_bolle::raggruppa(TDocumento& doc_in, TDocumento& doc_out) bool elaborata = FALSE; - // Raggruppo le righe se e' settato il falg di raggruppamento e + // Raggruppo le righe se e' settato il flag di raggruppamento e // se la riga non contiene solo una descrizione if (ragg_rig && !rindesc) // Se devo raggruppare le righe ... { @@ -154,8 +154,9 @@ bool TFatturazione_bolle::raggruppa(TDocumento& doc_in, TDocumento& doc_out) } if (!elaborata) // Se la riga non e' stata gia' sommata ... { - TRiga_documento& rout = doc_out.new_row(); // ... crea una riga nuova e ... - doc_out.copy_data(rout, rin); // ... copiaci tutti i campi della riga sorgente. + TRiga_documento& rout = doc_out.new_row(); // ... crea una riga nuova e + doc_out.copy_data(rout, rin); // copiaci tutti i campi della riga sorgente. + rout.set_original_doc_key(doc_in); // memorizza il codice del documento originale } } diff --git a/ve/velib04b.cpp b/ve/velib04b.cpp index dadcdc2ee..14ddd5ea3 100755 --- a/ve/velib04b.cpp +++ b/ve/velib04b.cpp @@ -1,3 +1,5 @@ +#include +#include #include #include @@ -468,6 +470,8 @@ TContabilizzazione::TContabilizzazione(const char* cod) _part = new TLocalisamfile(LF_PARTITE); _scad = new TLocalisamfile(LF_SCADENZE); _pags = new TLocalisamfile(LF_PAGSCA); // Per far funzionare TPartita + _intra = new TLocalisamfile(LF_INTRA); + _rintra = new TLocalisamfile(LF_RINTRA); _occas = new TLocalisamfile(LF_OCCAS); _docfile = new TLocalisamfile(LF_DOC); _rdocfile = new TLocalisamfile(LF_RIGHEDOC); // Per far funzionare TDocumento,TPartita ecc.. @@ -497,6 +501,8 @@ TContabilizzazione::TContabilizzazione(const TRectype& rec) _part = new TLocalisamfile(LF_PARTITE); _scad = new TLocalisamfile(LF_SCADENZE); _pags = new TLocalisamfile(LF_PAGSCA); // Per far funzionare TPartita + _intra = new TLocalisamfile(LF_INTRA); + _rintra = new TLocalisamfile(LF_RINTRA); _occas = new TLocalisamfile(LF_OCCAS); _docfile = new TLocalisamfile(LF_DOC); _rdocfile = new TLocalisamfile(LF_RIGHEDOC); // Per far funzionare TDocumento,TPartita ecc.. @@ -538,6 +544,8 @@ TContabilizzazione::~TContabilizzazione() delete _part; delete _scad; delete _pags; + delete _intra; + delete _rintra; delete _occas; delete _docfile; delete _rdocfile; @@ -560,6 +568,7 @@ bool TContabilizzazione::load_parameters() return FALSE; } _sc_enabled = conf.get_bool("GesSal","cg"); + _in_enabled = main_app().has_module(INAUT, CHK_DONGLE); _nump_cfg = conf.get_bool("RifPro","cg"); int gr,co; @@ -608,7 +617,7 @@ bool TContabilizzazione::load_parameters() bool TContabilizzazione::test_swap() { const char sez = _caus->sezione_clifo(); - const bool s = (_caus->reg().iva() == iva_vendite) ^ sez == 'D'; + const bool s = (_caus->reg().iva() == iva_vendite) ^ (sez == 'D'); return s; } @@ -637,6 +646,13 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc) // Reperisce la data documento TDate datadoc(doc.data()); + const bool acquisto = doc.get_char(DOC_TIPOCF) == 'F'; + if (acquisto) + { + TDate datarif(doc.get(DOC_DATADOCRIF)); + if (datarif.ok()) + datadoc = datarif; + } if (!datadoc.ok()) { _error = datadoc_error; @@ -666,6 +682,13 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc) TCodice_numerazione cod_num(doc.numerazione()); // calcola il numero documento aggiungendo l'eventuale prefisso/postfisso. TString numdoc(cod_num.complete_num(doc.numero())); + if (acquisto) + { + TString numdocrif(doc.get(DOC_NUMDOCRIF)); + if (numdocrif.not_empty()) + numdoc = numdocrif; + } + if (numdoc.empty() || cod_num.status() != NOERR) { _error = nr_doc_error; @@ -843,11 +866,12 @@ error_type TContabilizzazione::search_costo_ricavo(TBill& conto, const TRiga_doc _anamag->put(ANAMAG_CODART,r.get(RDOC_CODART)); if (_anamag->read() != NOERR) // se non trova l'articolo saltera' anche gmc,smc,rfa. skip_art_related = TRUE; - + + TString16 tok; // Scorre la stringa di ricerca for (int i=0;good() && iIVA2bill(codiva,conto)) break; // se lo trova esce } else @@ -892,9 +916,9 @@ error_type TContabilizzazione::search_costo_ricavo(TBill& conto, const TRiga_doc if (skip_art_related) continue; const bool is_fis = tok == "RF"; TTable * tab = is_fis ? _rfa : _gmc; - TString codtab(_anamag->get(is_fis ? ANAMAG_GRMERC : ANAMAG_RAGGFIS)); - if (tok == "GM") - codtab.cut(2); // gli ultimi 2 si riferiscono al sottogruppo. + TString codtab(_anamag->get(is_fis ? ANAMAG_RAGGFIS : ANAMAG_GRMERC)); + if (tok == "GM" && codtab.len() > 3) + codtab.cut(3); // gli ultimi 2 si riferiscono al sottogruppo. tab->put("CODTAB",codtab); if (tab->read() == NOERR) { @@ -943,6 +967,31 @@ error_type TContabilizzazione::search_costo_ricavo(TBill& conto, const TRiga_doc so = tab->get_long(is_cli ? "I2" : "I5"); conto.set(gr,co,so); } + + if (!conto.find() && t == 'P') // Cerca il conto nella stringa di ricerca (solo per prestazioni) + { + TString16 tok; + // Scorre la stringa di ricerca ma solo per causale o CLI/FO + for (int i=0;good() && iIVA2bill(codiva,conto)) break; + } + } + } break; // case 'P','S' } case 'C': @@ -1006,7 +1055,10 @@ error_type TContabilizzazione::add_iva_row(const TBill& conto, const TRiga_docum if (tipo_r == 'O') { if (_ivasto.empty()) - return ivasto_error; + { + _error = ivasto_error; + return _error; + } const real imp_om = r.imponibile_omaggio(); @@ -1078,7 +1130,7 @@ void TContabilizzazione::calculate_spese(real& spese, real& sp_iva, int ndec, bo TIVA_element el_tmp; TString key; - if (!zio.ok()) + if (zio.ok()) { sp_iva = iva(spese,sp_cod,ndec); tipo = zio.tipo(); @@ -1283,7 +1335,7 @@ error_type TContabilizzazione::create_iva_rows(TDocumento& doc) return _error; } -error_type TContabilizzazione::create_total_doc_row() +error_type TContabilizzazione::create_total_doc_row(TDocumento& doc) // Crea la riga contabile di totale documento { TRectype& rec_cg = _movimento->cg(0); @@ -1292,45 +1344,25 @@ error_type TContabilizzazione::create_total_doc_row() const long numreg = head.get_long(MOV_NUMREG); TDate datareg(head.get_date(MOV_DATAREG)); real totdoc(head.get_real(MOV_TOTDOC)); + char rowtype = 'T'; TLocalisamfile& cli_file = _clifo->lfile(); TString16 tipocf(cli_file.get(CLI_TIPOCF)); const long codcf = cli_file.get_long(CLI_CODCF); int gruppo = 0, conto = 0; - // Trova il mastro del cliente/fornitore - // cerca prima sul record del cliente/fornitore - if (_clifo->good()) - { - gruppo = cli_file.get_int(CLI_GRUPPO); - conto = cli_file.get_int(CLI_CONTO); - } + TString16 catven(doc.get(DOC_CATVEN)); - // poi sulla categoria di vendita (solo per i clienti) - if ((gruppo == 0 || conto == 0) && tipocf == "C") + if (search_clifo_bill(catven) == no_error) { - TString16 cod_cve(_clifo->lfile(LF_CFVEN).get(CFV_CATVEN)); - _cve->put("CODTAB",cod_cve); - if (_cve->read() == NOERR) - { - gruppo = _cve->get_int("I3"); - conto = _cve->get_int("I4"); - } + gruppo = _co_cliente.gruppo(); + conto = _co_cliente.conto(); } + else + _error = conto_error; TString descr; descr = head.get(MOV_DESCR);// La descrizione della riga di totale documento la prende dalla testata - // se ancora non e' stato trovato piglia quello della causale - if (gruppo == 0 || conto == 0) - { - TBill zio; - _caus->bill(1,zio); - gruppo = zio.gruppo(); - conto = zio.conto(); - } - - if (gruppo == 0 || conto == 0) - _error = conto_error; TRectype& first_iva_row = _movimento->iva(0); const char tc = first_iva_row.get_char(RMI_TIPOC); @@ -1338,7 +1370,8 @@ error_type TContabilizzazione::create_total_doc_row() const int coc = first_iva_row.get_int(RMI_CONTO); const long soc =first_iva_row.get_long(RMI_SOTTOCONTO); rec_cg.put(RMV_ANNOES,annoes);rec_cg.put(RMV_NUMREG,numreg); - rec_cg.put(RMV_NUMRIG,1); rec_cg.put(RMV_SEZIONE,tipocf == "C" ? "D" : "A"); + const char sezione = _caus->sezione(1); + rec_cg.put(RMV_NUMRIG,1); rec_cg.put(RMV_SEZIONE, sezione); // qui rec_cg.put(RMV_DATAREG,datareg); rec_cg.put(RMV_TIPOC,tipocf); rec_cg.put(RMV_GRUPPO,gruppo);rec_cg.put(RMV_CONTO,conto); rec_cg.put(RMV_SOTTOCONTO,codcf); rec_cg.put(RMV_DESCR,descr); @@ -1398,7 +1431,7 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc) // Crea la riga di totale documento if (good()) - create_total_doc_row(); + create_total_doc_row(doc); // crea le righe di contabilita' if (good()) if (!_movimento->recalc_cg_rows(_caus)) @@ -1419,17 +1452,14 @@ error_type TContabilizzazione::write_scadenze(TDocumento& doc) // Scrive le scadenze. Liberamente tratto da cg2104.cpp. { TRectype& head = _movimento->lfile().curr(); - const TString16 codpag(head.get(MOV_CODPAG)); - TString16 data(doc.get(DOC_DATAINSC));// Il costruttore di TPagamento vuole un const char * - // Se la data di scadenza non e' compilata prende quella del documento - if (data.empty()) - data = doc.get(DOC_DATADOC); - - TPagamento * pagamento = new TPagamento(codpag, data); + + TPagamento& pag = doc.pagamento(); + real totspese = doc.spese(); real totimposte = doc.imposta(); real totimponibili = doc.totale_doc() - totimposte - totspese; - const bool valuta = head.get(MOV_CODVAL).not_empty(); + const TString16 codval = head.get(MOV_CODVAL); + const bool valuta = codval.not_empty(); if (valuta) { const real change(head.get_real(MOV_CAMBIO)); @@ -1437,11 +1467,11 @@ error_type TContabilizzazione::write_scadenze(TDocumento& doc) real val2 = totimposte * change; real val3 = totspese * change; real val1 = head.get_real(MOV_TOTDOC) - val2 - val3; // Cosi' corregge eventuali scompensi di poche lirette - pagamento->set_total_valuta( totimponibili, totimposte, totspese, change, val1, val2 ,val3); + pag.set_total_valuta( totimponibili, totimposte, totspese, change, val1, val2, val3, codval); } else - pagamento->set_total( totimponibili, totimposte, totspese ); - pagamento->set_rate_auto( ); + pag.set_total( totimponibili, totimposte, totspese ); + pag.set_rate_auto( ); const long nreg = head.get_long(MOV_NUMREG); const int anno = head.get_int(MOV_ANNOIVA); @@ -1472,9 +1502,7 @@ error_type TContabilizzazione::write_scadenze(TDocumento& doc) const int row = newgame->prima_fattura(nreg); // Riga fattura di questo movimento TRiga_partite& partita = row <= 0 ? newgame->new_row() : newgame->riga(row); nuova_riga = partita.get_int(PART_NRIGA); - - TPagamento& pag = *pagamento; - + // put data on partita partita.put(PART_TIPOMOV, tmov); partita.put(PART_NREG, nreg); @@ -1516,11 +1544,12 @@ error_type TContabilizzazione::write_scadenze(TDocumento& doc) const TString abipr(doc.get(DOC_CODABIP)), cabpr(doc.get(DOC_CODCABP)), abi(doc.get(DOC_CODABIA)), - cab(doc.get(DOC_CODCABA)); - + cab(doc.get(DOC_CODCABA)); partita.elimina_rata(-1); // Elimina tutte le rate eventuali const int nr = pag.n_rate(); + + const TString16 codpag(head.get(MOV_CODPAG)); for (i = 0; i < nr; i++) { TRiga_scadenze& scadenza = partita.new_row(); @@ -1550,7 +1579,6 @@ error_type TContabilizzazione::write_scadenze(TDocumento& doc) delete newgame; } - delete pagamento; return _error; } @@ -1562,6 +1590,27 @@ error_type TContabilizzazione::write_all(TDocumento& doc) // a write_all TRectype& head = _movimento->lfile().curr(); long numreg = head.get_long(MOV_NUMREG); + if (test_swap()) + { + const real totdoc = -head.get_real(MOV_TOTDOC); + const real totdocval = -head.get_real(MOV_TOTDOCVAL); + + head.put(MOV_TOTDOC, totdoc); + head.put(MOV_TOTDOCVAL, totdocval); + + const int items = _movimento->iva_items(); + + for (int i = items - 1 ; i >= 0; i--) + { + TRectype & rec_iva = _movimento->iva(i); + + const real imponibile = -rec_iva.get_real(RMI_IMPONIBILE); + const real imposta = -rec_iva.get_real(RMI_IMPOSTA); + + rec_iva.put(RMI_IMPONIBILE, imponibile); + rec_iva.put(RMI_IMPOSTA, imposta); + } + } while (_movimento->write() == _isreinsert) head.put(MOV_NUMREG,++numreg); if (_movimento->status() != NOERR) @@ -1650,25 +1699,37 @@ char TContabilizzazione::sezione() const return sezione; } -error_type TContabilizzazione::search_clifo_bill() +error_type TContabilizzazione::search_clifo_bill(TString & catven) { _error = no_error; TLocalisamfile& clifo = _clifo->lfile(); const long codcf = clifo.get_long(CLI_CODCF); const char tipocf = clifo.get_char(CLI_TIPOCF); _co_cliente.set(0,0,0); - _co_cliente.set(clifo.get_int(CLI_GRUPPO),clifo.get_int(CLI_CONTO),codcf,tipocf); - if (!_co_cliente.ok()) // se non e' valido, reperiscilo dalla riga #1 della causale + + // Reperisce il conto del cliente nel seguente ordine, appena ne trova uno valido: + // - Categoria vendita + // - file clienti + // - causale + + _cve->put("CODTAB", catven); + if (_cve->read() == NOERR) + _co_cliente.set(_cve->get_int("I1"), _cve->get_int("I2"),codcf,tipocf); + if (!_co_cliente.ok()) { - _caus->bill(1,_co_cliente); // conto della riga 1 - _co_cliente.codclifo() = codcf; - if (!_co_cliente.ok()) - _error = clifo_error; + _co_cliente.set(clifo.get_int(CLI_GRUPPO),clifo.get_int(CLI_CONTO),codcf,tipocf); + if (!_co_cliente.ok()) // se non e' valido, reperiscilo dalla riga #1 della causale + { + _caus->bill(1,_co_cliente); // conto della riga 1 + _co_cliente.codclifo() = codcf; + if (!_co_cliente.ok()) + _error = clifo_error; + } } return _error; } -error_type TContabilizzazione::search_counter_bill(TString16 & codpag) +error_type TContabilizzazione::search_counter_bill(TDocumento& doc) { _error = no_error; // cerca il conto relativo alla riga di causale: @@ -1684,14 +1745,11 @@ error_type TContabilizzazione::search_counter_bill(TString16 & codpag) // Se il saldaconto e' attivo prende il conto relativo al tipo pagamento // Altrimenti sempre la riga 2 if (sc_enabled()) - { - - TPagamento * pagamento = new TPagamento(codpag); - int tipopag = pagamento->tipo_rata(0); // Quello della prima rata... prolly is right .. ;P + { + int tipopag = doc.pagamento().tipo_rata(0); // Quello della prima rata... prolly is right .. ;P _caus->bill(tipopag>0 && tipopag<8 ? tipopag+1:2,_co_controp); if (!_co_controp.ok()) _caus->bill(2,_co_controp); - delete pagamento; } else _caus->bill(2,_co_controp); @@ -1709,7 +1767,8 @@ error_type TContabilizzazione::compile_rows_anticipo(TDocumento& doc) // seconda riga. Se il saldaconto esiste si consulta la riga relativa al // tipo di pagamento. TString16 codpag(doc.get(DOC_CODPAG)); - if (search_clifo_bill() == no_error && search_counter_bill(codpag) == no_error) + TString16 catven(doc.get(DOC_CATVEN)); + if (search_clifo_bill(catven) == no_error && search_counter_bill(doc) == no_error) { const real importo = doc.get_real(DOC_IMPPAGATO); TLocalisamfile& mov = _anticipo->lfile(); @@ -1947,6 +2006,123 @@ error_type TContabilizzazione::write_anticipo(TDocumento& doc) return _error; } +error_type TContabilizzazione::write_intra(TDocumento& doc) +{ + // Scrive il movimento INTRA raggruppando per NATURA+NOMENCLATURA+CONSEGNA+TRASPORTO+PAESE+PAESEORIG+PROV + // Siccome NATURA, CONSEGNA, TRASPORTO e PAESE sono relativi alla testata del documento, + // il raggruppamento effettivo viene fatto solo per NOMENCLATURA+PAESEORIG+PROV + // NB: per i profani (come me :P) NOMENCLATURA COMBINATA e CLASSE DOGANALE sono la medesima cosa. + + TLocalisamfile& intra = *_intra; + + // Un po' di cache... + TDB_cache& cchh = cache(); + TRecord_array rintra(LF_RINTRA, "NUMRIG"); + TAssoc_array righe; + + const TRectype& rm = _movimento->lfile().curr(); + const TRectype& por_rec = cchh.get("%POR", doc.get(DOC_CODPORTO)); + const TString16 consegna(por_rec.get("S3")); // condizioni di consegna + const int trasporto = por_rec.get_int("I0"); // tipo di trasporto... + const int natura = doc.tipo().get_int("I2"); // natura della transazione, valida per tutte le righe del documento + const long numreg = rm.get_long(MOV_NUMREG); + TString16 nomenclatura, paeseorig, provincia, paese, codmag, commag; + real totale_righe; + const real cambio = doc.cambio(); + const bool is_val = doc.in_valuta(); + const bool is_cessione = rm.get(MOV_TIPO)=="C"; + + paese = _clifo->lfile().get(CLI_STATOPAIV); // Paese del cliente/fornitore... + + // Scorre le righe documento (prendendo solamente quelle relative agli articoli veri e propri) + // Effettuando il raggruppamento in un comodo TAssoc_array + TToken_string key; + const int items = doc.physical_rows(); + int numrig = 1; + for (int i=1; i<=items; i++) + { + const TRiga_documento& rr = doc[i]; + if (rr.is_articolo()) + { + key = ""; + codmag = rr.get(RDOC_CODMAG); + const TRectype& rec_anamag = cchh.get(LF_ANAMAG, rr.get(RDOC_CODARTMAG)); + commag = cchh.get("MAG", codmag, "S5"); // Comune del magazzino + nomenclatura = rec_anamag.get(ANAMAG_CLASSDOG); + paeseorig = !is_cessione ? rec_anamag.get(ANAMAG_PAESE) : ""; // Campo solo per Acquisti + provincia = is_cessione ? rec_anamag.get(ANAMAG_PROV) : cchh.get(LF_COMUNI, commag, "PROVCOM"); + key.add(nomenclatura); + key.add(paeseorig); + key.add(provincia); + + TRectype* rc = (TRectype*) righe.objptr(key); + if (rc == NULL) + { + rc = new TRectype(LF_RINTRA); + rc->put("NUMREG", numreg); + rc->put("NUMRIG", numrig++); + rc->put("NATURA", natura); + rc->put("CONSEGNA", consegna); + rc->put("TRASPORTO", trasporto); + rc->put("UMS", cchh.get("%NOC", nomenclatura, "S5")); + rc->put("NOMENCL", nomenclatura); + rc->put("PAESE", paese); + rc->put("PAESEORIG", paeseorig); + rc->put("PROV", provincia); + righe.add(key, rc); + } + const real qta = rr.quantita(); + const real imp = rr.importo(TRUE, FALSE); + const real imp_val = imp * cambio; + real ammlire = rc->get_real("AMMLIRE"); + real ammvaluta = rc->get_real("AMMVALUTA"); + real massakg = rc->get_real("MASSAKG"); + real massaums = rc->get_real("MASSAUMS"); + real valstat = rc->get_real("VALSTAT"); + + ammlire += is_val ? imp_val : imp; + ammvaluta += is_val ? imp : ZERO; + massakg += qta * rec_anamag.get_real(ANAMAG_MASSANUN); + massaums += qta * rec_anamag.get_real(ANAMAG_UNSUPPUN); + valstat += qta * rec_anamag.get_real(ANAMAG_VALSTATUN); + + rc->put("AMMLIRE", ammlire); + rc->put("AMMVALUTA", ammvaluta); + rc->put("MASSAKG", massakg); + rc->put("MASSAUMS", massaums); + rc->put("VALSTAT", valstat); + + totale_righe += is_val ? imp_val : imp; + } + } + + // Copia il contenuto dell'assoc nel record array + TRectype* rc = new TRectype(LF_RINTRA); + rc->put("NUMREG", numreg); + rintra.set_key(rc); + for(rc = (TRectype*) righe.first_item(); rc != NULL; rc = (TRectype*) righe.succ_item()) + rintra.add_row(rc); + // Testa (de coccio...) + intra.zero(); + intra.put("NUMREG", numreg); + intra.put("DATAREG", rm.get_date(MOV_DATAREG)); + intra.put("TIPOMOV", is_cessione ? 'C' : 'A'); // 'C' cessione 'A' acquisto + intra.put("TIPOCF", rm.get(MOV_TIPO)); + intra.put("CODCF", rm.get_long(MOV_CODCF)); + intra.put("TOTDOC", rm.get_real(MOV_TOTDOC)); + intra.put("TOTDOCIMM", totale_righe); + intra.put("CODVAL", rm.get(MOV_CODVAL)); + intra.put("CAMBIO", rm.get_real(MOV_CAMBIO)); + if (intra.write() == _isdupkey) // Sebbene non debba succedere, si effettua una riscrittura + intra.rewrite(); + + // righe! + if (intra.status() != NOERR || rintra.write(TRUE) != NOERR) // Forza la riscrittura se necessario + _error = intra_mov_error; + + return _error; +} + void TContabilizzazione::display_error(TDocumento& doc) { TString msg; @@ -2056,6 +2232,10 @@ void TContabilizzazione::display_error(TDocumento& doc) msg.format("Mancano i conti per gli abbuoni nella causale indicata per il pagamento anticipo relativamente al documento %s/%ld." "Verificare la correttezza della causale.",(const char*)numerazione,numero); break; + case intra_mov_error: + msg.format("Si è verificato un errore nella scrittura del movimento intracomunitario relativamente al documento %s/%ld." + "Verificare la consistenza dei files relativi ai movimenti intracomunitari.",(const char*)numerazione,numero); + break; default: // errori generici o non indicati vengono visualizzati nel punto dell'errore //msg.format("E' stato rilevato un errore generico contabilizzando il documento %s/%ld.", // (const char*)numerazione,numero); @@ -2070,6 +2250,14 @@ bool TContabilizzazione::sc_enabled() const { bool rt = _sc_enabled; if (_caus != NULL) rt &= _caus->saldaconto(); + if (_clifo != NULL) rt &= !_clifo->lfile().get_bool(CLI_OCCAS); // Saldaconto solo se C/F non occasionale + return rt; +} + +bool TContabilizzazione::in_enabled() const +{ + bool rt = _in_enabled; + if (_caus != NULL) rt &= _caus->intra(); return rt; } @@ -2106,6 +2294,9 @@ bool TContabilizzazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc { if (doc.get_real(DOC_IMPPAGATO) != ZERO) write_anticipo(doc); + + if (good() && in_enabled()) + write_intra(doc); if (good()) { diff --git a/ve/velib04c.cpp b/ve/velib04c.cpp index c6e729774..4f09ba2e3 100755 --- a/ve/velib04c.cpp +++ b/ve/velib04c.cpp @@ -15,8 +15,6 @@ // TGenerazione_effetti /////////////////////////////////////////////////////////// -static TPagamento* _pagamento = NULL; - TGenerazione_effetti::TGenerazione_effetti(const char* cod) : TElaborazione(cod) { @@ -169,7 +167,9 @@ error_type TGenerazione_effetti::write_groups() for (int i = 0; i ZERO) // Gli effetti negativi non vanno scritti + err = effetto.write(*_efffile); // Pensa a tutto lui per rinumerare... } if (err != NOERR) { @@ -282,90 +282,94 @@ void TGenerazione_effetti::group_bills(TDocumento& doc) _error = codpag_error; return; } - TString16 data(doc.get(DOC_DATAINSC)); - - if (data.empty()) - data = doc.get(DOC_DATADOC); - + const real totale_fatt = doc.totale_doc(); const bool valuta = doc.in_valuta(); const real change = doc.cambio(); const TDate datafatt = doc.get_date(DOC_DATADOC); - - if (totale_fatt - doc.get_real(DOC_IMPPAGATO) > ZERO && !doc.get_bool(DOC_ACCSALDO)) // procede se non e' a saldo + const bool is_nota_credito = doc.is_nota_credito(); + + // Qui il controllo sul residuo da pagare per il documento corrente non va effettuato, + // proprio perchè si sta effettuando un raggruppamento di effetti; eventuali documenti + // con importo negativi (assimilati a note di credito) vanno presi in considerazione + // per la composizione dell'importo finale dell'effetto. Un effetto puo' essere composto + // anche da righe di valore negativo ma esso non verrà scritto solo nel caso in cui l'importo + // totale (la somma delle singole righe) sia negativo a sua volta + { - calc_pagamento(doc,codpag,data); - CHECK(_pagamento,"Failed to create a TPagamento"); - const int numrate = _pagamento->n_rate( ); + calc_pagamento(doc); + + TPagamento& pag = doc.pagamento(); + const int numrate = pag.n_rate( ); if (numrate < 1) { _error = scadenze_error; - delete _pagamento; - _pagamento = NULL; return; } // Scorre le scadenze for (n = 1; n <= numrate && good(); n++) { - // Se non esiste effetto n-esimo (corrisponde al numero di rata corrente+offset) - // lo genera con la relativa riga. Se esiste vi somma gli importi ed accoda la riga - const bool is_new = n+offset > _effetti_array.items(); - if (is_new) // Nuovo effetto: crea effetto con i dati di questo documento (e' il primo che incontro nella scansione) + if (valid_type(pag.tipo_rata(n-1))) { - TEffetto effetto; - // Setta i dati della testata; - effetto.put(EFF_DATASCAD, _pagamento->data_rata(n-1)); - effetto.put(EFF_TIPOPAG,_pagamento->tipo_rata(n-1)); - effetto.put(EFF_ULTCLASS,_pagamento->ulc_rata(n-1)); - effetto.put(EFF_CODCF, doc.get_long(DOC_CODCF)); - effetto.put(EFF_CODVAL, doc.get(DOC_CODVAL)); - effetto.put(EFF_CAMBIO, change); - effetto.put(EFF_DATACAMBIO,doc.get_date(DOC_DATACAMBIO)); - effetto.put(EFF_CODABI,doc.get(DOC_CODABIA)); - effetto.put(EFF_CODCAB,doc.get(DOC_CODCABA)); - effetto.put(EFF_EFFCOMP,TRUE); - _effetti_array.add(effetto); - } - // aggiorna totale effetto (testata) - TEffetto& effetto=(TEffetto&)_effetti_array[n+offset-1]; - importo = effetto.get_real(EFF_IMPORTO); - imprata = _pagamento->importo_rata(n-1,FALSE); - importo += imprata; - effetto.put(EFF_IMPORTO,importo); - if (valuta) - { - importoval = effetto.get_real(EFF_IMPORTOVAL); - imprataval = _pagamento->importo_rata(n-1,TRUE); - importoval += imprataval; - effetto.put(EFF_IMPORTOVAL,importoval); - } - // Crea la nuova riga di questo effetto - const int rows = effetto.rows_r(); - TRectype& riga = effetto.row_r(rows+1,TRUE); - // reffetto.put(REFF_NPROGTR,nprog); - riga.put(REFF_NRIGATR,rows+1); - riga.put(REFF_NRATA,n); - riga.put(REFF_DATAFATT, datafatt); - riga.put(REFF_PROVV,provv); - riga.put(REFF_ANNODOC,anno); - riga.put(REFF_CODNUM,codnum); - riga.put(REFF_NFATT,numdoc); - riga.put(REFF_IMPFATT,totale_fatt); - riga.put(REFF_IMPORTO,imprata); - if (valuta) - { - riga.put(REFF_IMPFATTVAL,totale_fatt); - real totfatlit = totale_fatt*change; - riga.put(REFF_IMPFATT,totfatlit); - riga.put(REFF_IMPORTOVAL,imprataval); + // Se non esiste effetto n-esimo (corrisponde al numero di rata corrente+offset) + // lo genera con la relativa riga. Se esiste vi somma gli importi ed accoda la riga + const bool is_new = n+offset > _effetti_array.items(); + if (is_new) // Nuovo effetto: crea effetto con i dati di questo documento (e' il primo che incontro nella scansione) + { + TEffetto effetto; + // Setta i dati della testata; + effetto.put(EFF_DATASCAD, pag.data_rata(n-1)); + effetto.put(EFF_TIPOPAG,pag.tipo_rata(n-1)); + effetto.put(EFF_ULTCLASS,pag.ulc_rata(n-1)); + effetto.put(EFF_CODCF, doc.get_long(DOC_CODCF)); + effetto.put(EFF_CODVAL, doc.get(DOC_CODVAL)); + effetto.put(EFF_CAMBIO, change); + effetto.put(EFF_DATACAMBIO,doc.get_date(DOC_DATACAMBIO)); + effetto.put(EFF_CODABI,doc.get(DOC_CODABIA)); + effetto.put(EFF_CODCAB,doc.get(DOC_CODCABA)); + effetto.put(EFF_EFFCOMP,TRUE); + _effetti_array.add(effetto); + } + // aggiorna totale effetto (testata) + TEffetto& effetto=(TEffetto&)_effetti_array[n+offset-1]; + importo = effetto.get_real(EFF_IMPORTO); + imprata = pag.importo_rata(n-1,FALSE); + if (is_nota_credito) + imprata = -imprata; + importo += imprata; + effetto.put(EFF_IMPORTO,importo); + if (valuta) + { + importoval = effetto.get_real(EFF_IMPORTOVAL); + imprataval = pag.importo_rata(n-1,TRUE); + if (is_nota_credito) + imprataval = -imprataval; + importoval += imprataval; + effetto.put(EFF_IMPORTOVAL,importoval); + } + // Crea la nuova riga di questo effetto + const int rows = effetto.rows_r(); + TRectype& riga = effetto.row_r(rows+1,TRUE); + // reffetto.put(REFF_NPROGTR,nprog); + riga.put(REFF_NRIGATR,rows+1); + riga.put(REFF_NRATA,n); + riga.put(REFF_DATAFATT, datafatt); + riga.put(REFF_PROVV,provv); + riga.put(REFF_ANNODOC,anno); + riga.put(REFF_CODNUM,codnum); + riga.put(REFF_NFATT,numdoc); + riga.put(REFF_IMPFATT,totale_fatt); + riga.put(REFF_IMPORTO,imprata); + if (valuta) + { + riga.put(REFF_IMPFATTVAL,totale_fatt); + real totfatlit = totale_fatt*change; + riga.put(REFF_IMPFATT,totfatlit); + riga.put(REFF_IMPORTOVAL,imprataval); + } } } // Ciclo sulle scadenze - if (_pagamento) - { - delete _pagamento; - _pagamento = NULL; - } } } // Ciclo sui documenti di questo gruppo offset=_effetti_array.items(); @@ -387,32 +391,35 @@ bool TGenerazione_effetti::valid_type(int pag) const return _valid_array[pag]; } -void TGenerazione_effetti::calc_pagamento(TDocumento& doc, TString& codpag, TString& data) +void TGenerazione_effetti::calc_pagamento(TDocumento& doc) { - _pagamento = new TPagamento(codpag, data); + TPagamento& pag = doc.pagamento(); + const real change = doc.cambio(); real totspese = doc.spese(); real totimposte = doc.imposta(); real pagato = doc.get(DOC_IMPPAGATO); real totimponibili = doc.totale_doc() - totimposte - totspese; + const bool valuta = doc.in_valuta(); if (valuta) { + const TString16 codval = doc.valuta(); real val1 = totimponibili * change; real val2 = totimposte * change; real val3 = totspese * change; - _pagamento->set_total_valuta( totimponibili, totimposte, totspese, change, val1, val2 ,val3); + pag.set_total_valuta( totimponibili, totimposte, totspese, change, val1, val2 ,val3, doc.valuta()); } else - _pagamento->set_total( totimponibili, totimposte, totspese ); - _pagamento->set_rate_auto(); + pag.set_total( totimponibili, totimposte, totspese ); + pag.set_rate_auto(); //Riaggiusta le rate a seconda del valore gia' pagato real rata,v; - const int numrate = _pagamento->n_rate( ); + const int numrate = pag.n_rate( ); for (int i = 0; i< numrate; i++) { - rata = _pagamento->importo_rata(i,valuta); + rata = pag.importo_rata(i,valuta); if (rata > pagato) { v = rata - pagato; @@ -423,20 +430,20 @@ void TGenerazione_effetti::calc_pagamento(TDocumento& doc, TString& codpag, TStr v = ZERO; pagato -= rata; } - _pagamento->set_imprata(i, v, valuta); + pag.set_imprata(i, v, valuta); if (valuta) { v *= change; v.round(); - _pagamento->set_imprata(i, v, FALSE); + pag.set_imprata(i, v, FALSE); } } // Scorre all'indietro per rimuovere le rate a 0, evitando fastidiose // complicazioni dovute al pack delle rate effettuato dalla remove_rate() for (i=numrate-1; i>=0; i--) { - if (_pagamento->importo_rata(i,valuta) == ZERO) - _pagamento->remove_rata(i); + if (pag.importo_rata(i,valuta) == ZERO) + pag.remove_rata(i); } } @@ -456,112 +463,111 @@ void TGenerazione_effetti::generate_bill(TDocumento& doc) // bill in inglese sig // 7 - Tratta accettata // 8 - Rapporti interbancari diretti // Caso mai tale insieme risultasse incompleto od errato basta solo modificare l'enum posto all'inizio del programma - - TString16 codpag(doc.get(DOC_CODPAG)); - - _cpg->put("CODTAB",codpag); - if (_cpg->read()!= NOERR) + + if (!doc.is_nota_credito()) // I documenti immessi come note di credito non generano effetti...(che senso hanno gli effetti con importi negativi?) { - _error = codpag_error; - return; - } - TString16 data(doc.get(DOC_DATAINSC)); - - if (data.empty()) - data = doc.get(DOC_DATADOC); - - const real totale_fatt = doc.totale_doc(); // Importo in valuta - if (totale_fatt - doc.get_real(DOC_IMPPAGATO) > ZERO && !doc.get_bool(DOC_ACCSALDO)) // procede se non e' a saldo - { - const bool valuta = doc.in_valuta(); - const real change = doc.cambio(); - - // calcolo delle scadenze - calc_pagamento(doc,codpag,data); - - CHECK(_pagamento,"Failed to create a TPagamento"); - const int numrate = _pagamento->n_rate( ); - if (numrate < 1) + TString16 codpag(doc.get(DOC_CODPAG)); + + _cpg->put("CODTAB",codpag); + if (_cpg->read()!= NOERR) { - _error = scadenze_error; + _error = codpag_error; return; } - - _efffile->last(); - // Variabili per la scrittura dell'effetto - long nprog = _efffile->get_long(EFF_NPROGTR)+1; - const long codcf = doc.get_long(DOC_CODCF); - const TString16 codval(doc.get(DOC_CODVAL)); - const TDate data_cambio = doc.get_date(DOC_DATACAMBIO); - const long codabi = doc.get_long(DOC_CODABIA); - const long codcab = doc.get_long(DOC_CODCABA); - const TString16 provv(doc.get(DOC_PROVV)); - const int anno = doc.get_int(DOC_ANNO); - const TString16 codnum(doc.get(DOC_CODNUM)); - const long nfatt = doc.get_long(DOC_NDOC); - const TDate datafatt = doc.get_date(DOC_DATADOC); - TRectype& effetto = _efffile->curr(); - TRectype& reffetto = _refffile->curr(); - real importo; - for (int i = 0; i < numrate && good(); i++) + TString16 data(doc.get(DOC_DATAINSC)); + + if (data.empty()) + data = doc.get(DOC_DATADOC); + + const real totale_fatt = doc.totale_doc(); // Importo in valuta + if (totale_fatt - doc.get_real(DOC_IMPPAGATO) > ZERO && !doc.get_bool(DOC_ACCSALDO)) // procede se non e' a saldo { - if (valid_type(_pagamento->tipo_rata(i))) + const bool valuta = doc.in_valuta(); + const real change = doc.cambio(); + + // calcolo delle scadenze + calc_pagamento(doc); + + TPagamento & pag = doc.pagamento(); +// CHECK(pag,"Failed to create a TPagamento"); + const int numrate = pag.n_rate( ); + if (numrate < 1) { - effetto.zero(); - reffetto.zero(); - effetto.put(EFF_NPROGTR,nprog); - effetto.put(EFF_DATASCAD, _pagamento->data_rata(i)); - effetto.put(EFF_TIPOPAG,_pagamento->tipo_rata(i)); - effetto.put(EFF_ULTCLASS,_pagamento->ulc_rata(i)); - effetto.put(EFF_CODCF, codcf); - effetto.put(EFF_CODVAL, codval); - if (valuta) + _error = scadenze_error; + return; + } + + _efffile->last(); + // Variabili per la scrittura dell'effetto + long nprog = _efffile->get_long(EFF_NPROGTR)+1; + const long codcf = doc.get_long(DOC_CODCF); + const TString16 codval(doc.get(DOC_CODVAL)); + const TDate data_cambio = doc.get_date(DOC_DATACAMBIO); + const long codabi = doc.get_long(DOC_CODABIA); + const long codcab = doc.get_long(DOC_CODCABA); + const TString16 provv(doc.get(DOC_PROVV)); + const int anno = doc.get_int(DOC_ANNO); + const TString16 codnum(doc.get(DOC_CODNUM)); + const long nfatt = doc.get_long(DOC_NDOC); + const TDate datafatt = doc.get_date(DOC_DATADOC); + TRectype& effetto = _efffile->curr(); + TRectype& reffetto = _refffile->curr(); + real importo; + for (int i = 0; i < numrate && good(); i++) + { + if (valid_type(pag.tipo_rata(i))) { - effetto.put(EFF_CAMBIO, change); - effetto.put(EFF_DATACAMBIO,data_cambio); + effetto.zero(); + reffetto.zero(); + effetto.put(EFF_NPROGTR,nprog); + effetto.put(EFF_DATASCAD, pag.data_rata(i)); + effetto.put(EFF_TIPOPAG,pag.tipo_rata(i)); + effetto.put(EFF_ULTCLASS,pag.ulc_rata(i)); + effetto.put(EFF_CODCF, codcf); + effetto.put(EFF_CODVAL, codval); + if (valuta) + { + effetto.put(EFF_CAMBIO, change); + effetto.put(EFF_DATACAMBIO,data_cambio); + } + effetto.put(EFF_CODABI,codabi); + effetto.put(EFF_CODCAB,codcab); + effetto.put(EFF_EFFCOMP,TRUE); + if (i == numrate - 1) effetto.put(EFF_ULTRATA,TRUE); + // Put sulla riga dell'effetto + reffetto.put(REFF_NPROGTR,nprog); + reffetto.put(REFF_NRIGATR,1); + reffetto.put(REFF_DATAFATT, datafatt); + reffetto.put(REFF_NRATA,i+1); + reffetto.put(REFF_PROVV,provv); + reffetto.put(REFF_ANNODOC,anno); + reffetto.put(REFF_CODNUM,codnum); + reffetto.put(REFF_NFATT,nfatt); + importo = pag.importo_rata(i,FALSE); + effetto.put(EFF_IMPORTO,importo); + reffetto.put(REFF_IMPFATT,totale_fatt); + reffetto.put(REFF_IMPORTO,importo); + if (valuta) + { + importo = pag.importo_rata(i,TRUE); // Importo in valuta + real totfatlit = totale_fatt*change; //Not sure about this... + effetto.put(EFF_IMPORTOVAL,importo); + reffetto.put(REFF_IMPFATTVAL,totale_fatt); + reffetto.put(REFF_IMPFATT,totfatlit); + reffetto.put(REFF_IMPORTOVAL,importo); + } + + if (_efffile->write() == NOERR && _refffile->write() == NOERR) + { + _total_bills++; + nprog++; + } + else _error = write_error; } - effetto.put(EFF_CODABI,codabi); - effetto.put(EFF_CODCAB,codcab); - effetto.put(EFF_EFFCOMP,TRUE); - if (i == numrate - 1) effetto.put(EFF_ULTRATA,TRUE); - // Put sulla riga dell'effetto - reffetto.put(REFF_NPROGTR,nprog); - reffetto.put(REFF_NRIGATR,1); - reffetto.put(REFF_DATAFATT, datafatt); - reffetto.put(REFF_NRATA,i+1); - reffetto.put(REFF_PROVV,provv); - reffetto.put(REFF_ANNODOC,anno); - reffetto.put(REFF_CODNUM,codnum); - reffetto.put(REFF_NFATT,nfatt); - importo = _pagamento->importo_rata(i,FALSE); - effetto.put(EFF_IMPORTO,importo); - reffetto.put(REFF_IMPFATT,totale_fatt); - reffetto.put(REFF_IMPORTO,importo); - if (valuta) - { - importo = _pagamento->importo_rata(i,TRUE); // Importo in valuta - real totfatlit = totale_fatt*change; //Not sure about this... - effetto.put(EFF_IMPORTOVAL,importo); - reffetto.put(REFF_IMPFATTVAL,totale_fatt); - reffetto.put(REFF_IMPFATT,totfatlit); - reffetto.put(REFF_IMPORTOVAL,importo); - } - - if (_efffile->write() == NOERR && _refffile->write() == NOERR) - { - _total_bills++; - nprog++; - } - else _error = write_error; } } } - if (_pagamento) - { - delete _pagamento; - _pagamento = NULL; - } if (good() && _can_write) change_doc_status(doc); } @@ -569,7 +575,6 @@ void TGenerazione_effetti::generate_bill(TDocumento& doc) // bill in inglese sig bool TGenerazione_effetti::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, const TDate& data_elab, bool interattivo) { - _pagamento = NULL; _error = no_error; _can_write = TRUE; _total_bills = 0L; diff --git a/ve/velib05.cpp b/ve/velib05.cpp index 4f3835e5e..112147ff2 100755 --- a/ve/velib05.cpp +++ b/ve/velib05.cpp @@ -31,9 +31,14 @@ const char * TCodice_numerazione::complete_num(long num) int TCodice_numerazione::read(const char* codnum) { +/* TTable t("%NUM"); put("CODTAB", codnum); int err = TRectype::read(t); +*/ + *this = cache().get("%NUM", codnum); + int err = empty() ? _iskeynotfound : NOERR; + if (err != NOERR) NFCHECK("Codice numerazione errato: %s", codnum); return err; @@ -158,10 +163,13 @@ void TDocumentoEsteso::scadenze_recalc() _scadenze_array.destroy(); _scadenze_current = -1; TRectype& hh = head(); +/* TString16 codpag(hh.get("CODPAG")); TString16 data(hh.get("DATAINSC")); if (data.empty()) data = hh.get("DATADOC"); TPagamento pag( codpag, data); +*/ + TPagamento& pag = pagamento(); real totspese = spese();//tot_spese(); real totimposte = imposta();//tot_imposte(); real pagato = hh.get(DOC_IMPPAGATO); @@ -169,14 +177,14 @@ void TDocumentoEsteso::scadenze_recalc() real totimponibili = totale_doc() - totimposte - totspese;//tot_documento() - totimposte - totspese; if (saldo || pagato > totimponibili) totimponibili = ZERO; - const bool valuta = in_valuta(); - if (valuta) + if (in_valuta()) { const real change(cambio()); real val1 = totimponibili * change; real val2 = totimposte * change; real val3 = totspese * change; - pag.set_total_valuta( totimponibili, totimposte, totspese, change, val1, val2 ,val3); + TString16 codval = valuta(); + pag.set_total_valuta( totimponibili, totimposte, totspese, change, val1, val2 ,val3, codval); } else pag.set_total( totimponibili, totimposte, totspese ); @@ -185,7 +193,7 @@ void TDocumentoEsteso::scadenze_recalc() real v,rata; for (int i = 0; i< numrate; i++) { - rata = pag.importo_rata(i,valuta); + rata = pag.importo_rata(i, in_valuta()); if (rata > pagato) { v = rata - pagato; @@ -208,24 +216,28 @@ void TDocumentoEsteso::scadenze_recalc() _scadenze_current++; } -const char * TDocumentoEsteso::scadenze_get(const TString& w) +const char* TDocumentoEsteso::scadenze_get(const TString& w) { - TString ret; + // TString ret; // Pena di morte + const char* ret = ""; if (_scadenze_current == -1) // calcola le scadenze e le mette in _scadenze_array scadenze_recalc(); if (_scadenze_current > -1 && _scadenze_current < _scadenze_array.items()) { - if (w == "DATA") ret = _scadenze_array.row(_scadenze_current).get(0); // ritorna la data di scadenza - if (w == "IMPORTO") ret = _scadenze_array.row(_scadenze_current).get(1); // ritorna l'importo in scadenza + if (w == "DATA") + ret = _scadenze_array.row(_scadenze_current).get(0); // ritorna la data di scadenza + if (w == "IMPORTO") + ret = _scadenze_array.row(_scadenze_current).get(1); // ritorna l'importo in scadenza } - return (const char*)ret; + return ret; } void TDocumentoEsteso::scadenze_set_next() { - if (_scadenze_current < _scadenze_array.items() && _scadenze_current >= 0) + if (_scadenze_current >= 0 && + _scadenze_current < _scadenze_array.items() ) _scadenze_current++; } @@ -254,7 +266,7 @@ real TDocumentoEsteso::tot_imponibili(byte selector) TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec) : TDocumento(rec), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1) { - _iva = new TTable("%IVA"); + // _iva = new TTable("%IVA"); // Inizializza i parametri di default _parm.pri_lit = 0; _parm.pri_val = 3; _parm.qta_lit = 3; _parm.qta_val = 3; @@ -265,19 +277,13 @@ TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec, dec_parm & parm) : TDocumento(rec), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1) { _parm = parm; - _iva = new TTable("%IVA"); } TDocumentoEsteso::TDocumentoEsteso() : TDocumento(), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1) -{ - _iva = new TTable("%IVA"); -} +{ } TDocumentoEsteso::~TDocumentoEsteso() -{ - if (_iva != NULL) - delete _iva; -} +{ } diff --git a/ve/velib06.cpp b/ve/velib06.cpp index 4d1e1a02b..a36af092d 100755 --- a/ve/velib06.cpp +++ b/ve/velib06.cpp @@ -63,6 +63,12 @@ TDocumento_mask::TDocumento_mask(const char* td) if (id2pos( F_OCCASEDIT ) > 0 ) set_handler( F_OCCASEDIT, occas_handler ); set_handler( F_CODCF, clifo_handler ); + if (_doc.tipo().clifo_optional()) + { + field(F_CODCF).check_type(CHECK_NORMAL); + field(F_RAGSOC).check_type(CHECK_NORMAL); + } + set_handler( F_CODPAG, condpag_hndl ); set_handler( F_DATAINSC, condpag_hndl ); set_handler( F_CODNOTE, note_hndl ); @@ -86,7 +92,7 @@ TDocumento_mask::TDocumento_mask(const char* td) _livelli_giac = new TCodgiac_livelli; - for ( i = MAX_GIAC_LEVEL; i > 0; i--) + for ( i = _livelli_giac->max_levels(); i > 0; i--) { const short pos = _sheet->cid2index(FR_LIV1 + i -1); if (_livelli_giac->enabled(i)) @@ -209,6 +215,9 @@ void TDocumento_mask::configura_sheet(TSheet_field& sheet) TTipo_documento& tdoc = (TTipo_documento&) _doc.tipo(); const TString_array& sheet_columns = tdoc.sheet_columns(); int ncols = sheet_columns.items(); + + TToken_string colonne; + colonne = "0"; for (int i = 0; i < ncols; i ++ ) { @@ -217,15 +226,17 @@ void TDocumento_mask::configura_sheet(TSheet_field& sheet) const int coltomove = sheet.cid2index(field_id); to_delete.reset(coltomove); - const TString descr(sheet_col.get( 1 )); - + const TString80 descr(sheet_col.get(1)); if (descr.not_empty() ) sheet.set_column_header( field_id, descr); - const int size( sheet_col.get_int(2)); - + const int size = sheet_col.get_int(2); if (size != 0) sheet.set_column_width( field_id, size); + + colonne.add(field_id); + if (size != 0) + colonne << ',' << size; } to_delete.reset(0); @@ -252,11 +263,14 @@ void TDocumento_mask::configura_sheet(TSheet_field& sheet) */ for ( i = MAX_COLUMNS - 1; i >= 0; i-- ) - if( to_delete[i] ) - { - sheet.enable_column( i + FIRST_FIELD, FALSE); - sheet.delete_column( i + FIRST_FIELD); - } + if( to_delete[i] ) + { + sheet.enable_column( i + FIRST_FIELD, FALSE); + sheet.delete_column( i + FIRST_FIELD); + } + + if (!sheet.user_saved_columns_order()) + sheet.set_columns_order(&colonne); } @@ -287,7 +301,9 @@ void TDocumento_mask::next_page(int p) if (fr) _doc.put(fr->name(), mf.get()); } - + + _doc.set_riga_esenzione(); + for (int i = _last_prog; i > 0; i--) { const short id = BASE_PIEDE + i; @@ -594,7 +610,9 @@ void TDocumento_mask::reset_masks(const TString& tipo_doc) FOR_EACH_ASSOC_OBJECT(_maskriga, h, k, o) { TMask* m = (TMask*)o; - m->enable_default(); + m->enable_default(); + if (!_sheet->exist_column(FR_PREZZO)) + m->hide(FR_PREZZO); } last_tipo_doc = tipo_doc; } @@ -616,7 +634,6 @@ void TDocumento_mask::doc2mask(bool reload_clifo) TSheet_field& s = sfield(F_SHEET); s.destroy( ); - reset_masks(get(F_TIPODOC)); const int righe = doc().physical_rows(); for (int i = 0; i < righe; i++) @@ -627,6 +644,8 @@ void TDocumento_mask::doc2mask(bool reload_clifo) s.check_row(i, 0x2); } + reset_masks(get(F_TIPODOC)); + s.force_update(); } @@ -685,7 +704,7 @@ TVariable_mask* TDocumento_mask::riga_mask(int numriga) if (cur) { const int num = cur->file().num(); - if (num == LF_ANAMAG) + if (num == LF_ANAMAG || num == LF_CODCORR) { m->set_handler( FR_CODMAG, codmag_handler ); m->set_handler( FR_CODMAGC, codmag_coll_handler ); @@ -693,11 +712,20 @@ TVariable_mask* TDocumento_mask::riga_mask(int numriga) m->set_handler( FR_LIV1, liv_handler ); m->set_handler( FR_LIV2, liv_handler ); m->set_handler( FR_LIV3, liv_handler ); + m->set_handler( FR_LIV4, liv_handler ); m->set_handler( FR_UMQTA, umart_handler ); m->set_handler( FR_CODARTMAG, codartmag_handler ); m->set_handler( FR_DESCR, descr_handler ); m->set_handler( FR_QTA, qtaart_handler ); - } + if (livelli().autoinsert(1)) + m->field(FR_LIV1).check_type(CHECK_NONE); + if (livelli().autoinsert(2)) + m->field(FR_LIV2).check_type(CHECK_NONE); + if (livelli().autoinsert(3)) + m->field(FR_LIV3).check_type(CHECK_NONE); + if (livelli().autoinsert(4)) + m->field(FR_LIV4).check_type(CHECK_NONE); + } else if (tipo_r == RIGA_SPESEDOC || tipo_r == RIGA_PRESTAZIONI) m->set_handler( FR_CODART, sppr_handler ); @@ -706,6 +734,7 @@ TVariable_mask* TDocumento_mask::riga_mask(int numriga) } } m->set_handler(FR_QTAEVASA, qta_evasa_handler); + m->set_handler(FR_CAUS, causmag_handler); m->set_handler( FR_CODIVA, iva_handler ); } @@ -762,12 +791,21 @@ bool TDocumento_mask::ss_notify( TSheet_field& ss, int r, KEY key ) s.left_just(3); s << ven_rec.get(CFV_CODDEP); } - else + else { - s = m._std_mag; - s.left_just(3); - s << m._std_dep; - } + s = m.get(F_CAUSMAG); + TTable c("%CAU"); + c.put("CODTAB", s); + + if (c.read() == NOERR) + s = c.get("S10"); + else + { + s = m._std_mag; + s.left_just(3); + s << m._std_dep; + } + } riga.put("CODMAG", s); riga.autoload(ss); ss.check_row(r); @@ -900,6 +938,7 @@ public: static bool tipo_elaborazione_handler( TMask_field& f, KEY key ); static bool tipo_documento_handler( TMask_field& f, KEY key ); static bool codnum_handler( TMask_field& f, KEY key ); + static bool list_elab_handler( TMask_field& f, KEY key ); // @cmember Costruttore (crea la maschera leggendo la descrizione dal file .msk) TElabora_mask(const char* title, TMask * main_mask); // @cmember Distruttore @@ -917,7 +956,7 @@ void TElabora_mask::update_list() int items = 0; if (from_elab) - items = _elab.select(elabs, tipo, stato, tipo_elab, stato_elab) ; + items = _elab.select(elabs, tipo, stato, "", "" /*tipo_elab, stato_elab*/) ; else items = _elab.select(elabs, tipo_elab, stato_elab, tipo, stato) ; @@ -936,7 +975,8 @@ void TElabora_mask::update_list() codes.add(format("%s", (const char *)_elab[elabs.row(i)].codice())); descrs.add((const char *)_elab[elabs.row(i)].descrizione()); } - f.replace_items(codes, descrs); + if (codes != f.get_codes()) + f.replace_items(codes, descrs); } @@ -950,8 +990,10 @@ bool TElabora_mask::elabora() TLista_documenti out; TDocumento & app_doc = ((TDocumento_mask *)_main)->doc(); long numdoc = get_long(F_NDOC_ELAB); + bool update_header = get_bool(F_UPDATE_HEADER); - TDocumento d(*get(F_PROVV_ELAB), get_int(F_ANNO_ELAB), get(F_CODNUM_ELAB), numdoc); + TDocumento* newdoc = new TDocumento(*get(F_PROVV_ELAB), get_int(F_ANNO_ELAB), get(F_CODNUM_ELAB), numdoc); + TDocumento& d = *newdoc; if (numdoc <= 0) { @@ -974,6 +1016,25 @@ bool TElabora_mask::elabora() d.zero(DOC_CAUSMAG); } + if (update_header) + { + const TString16 tipo_doc(app_doc.get(DOC_TIPODOC)); + const TString16 caus_mag(app_doc.get(DOC_CAUSMAG)); + const long movmag = app_doc.get_long(DOC_MOVMAG); + + TDocumento::copy_data(app_doc.head(), d.head()); + + const TDate datadoc = app_doc.get_date(DOC_DATADOC); + const TDate datainsc = app_doc.get_date(DOC_DATAINSC); + const bool equal = !datainsc.ok() || datadoc == datainsc; + + if (equal) + d.zero(DOC_DATAINSC); + app_doc.put(DOC_TIPODOC, tipo_doc); + app_doc.put(DOC_CAUSMAG, caus_mag); + app_doc.put(DOC_MOVMAG, movmag); + } + const bool from_elab = !get_bool(F_TYPE); TElaborazione * e = curr_elab(); @@ -1012,6 +1073,9 @@ bool TElabora_mask::elabora() in.rewrite(); } } + + delete newdoc; + return update_mask; } @@ -1135,9 +1199,10 @@ bool TElabora_mask::tipo_elaborazione_handler( TMask_field& f, KEY key ) bool TElabora_mask::tipo_documento_handler( TMask_field& f, KEY key ) { - if (f.to_check(key, TRUE)) + if (key != K_ENTER && f.to_check(key, TRUE)) { - TElabora_mask & m = (TElabora_mask &) f.mask(); + TElabora_mask & m = (TElabora_mask &) f.mask(); + m.update_list(); m.update_ndoc_filter(); } @@ -1146,10 +1211,21 @@ bool TElabora_mask::tipo_documento_handler( TMask_field& f, KEY key ) bool TElabora_mask::codnum_handler( TMask_field& f, KEY key ) { - if (f.to_check(key, TRUE)) + if (key != K_ENTER && f.to_check(key, TRUE)) + { + TElabora_mask & m = (TElabora_mask &) f.mask(); + + m.update_ndoc_filter(); + } + return TRUE; +} + +bool TElabora_mask::list_elab_handler( TMask_field& f, KEY key ) +{ + if (key == K_SPACE) { TElabora_mask & m = (TElabora_mask &) f.mask(); - m.update_ndoc_filter(); + m.update_ndoc_filter(TRUE); } return TRUE; } @@ -1161,6 +1237,7 @@ TElabora_mask::TElabora_mask(const char* title, TMask * main_mask) set_handler(F_TIPODOC_ELAB, tipo_documento_handler); set_handler(F_STATODOC_ELAB, tipo_documento_handler); set_handler(F_CODNUM_ELAB, codnum_handler); + set_handler(F_ELAB, list_elab_handler); set(F_ANNO_ELAB, _main->get(F_ANNO)); set(F_TIPOCF_ELAB, _main->get(F_TIPOCF)); @@ -1174,14 +1251,15 @@ bool TDocumento_mask::elabora_handler( TMask_field& f, KEY key ) TDocumento_mask& m = (TDocumento_mask&)f.mask(); if (m.check_fields()) // Check values { - TElabora_mask selection("ve0100b", &m); - if (selection.run() == K_ENTER) + TElabora_mask* selection = new TElabora_mask("ve0100b", &m); // No woman no stack + if (selection->run() == K_ENTER) { m.mask2doc(); - bool update_mask = selection.elabora(); + bool update_mask = selection->elabora(); if (update_mask) m.doc2mask(FALSE); - } + } + delete selection; } } return TRUE; diff --git a/ve/velib01a.cpp b/ve/velib06a.cpp similarity index 80% rename from ve/velib01a.cpp rename to ve/velib06a.cpp index 01e00a76a..9916c19d7 100755 --- a/ve/velib01a.cpp +++ b/ve/velib06a.cpp @@ -1,14 +1,10 @@ #include +#include +#include + #include "velib.h" #include "vepriv.h" -#ifndef __PROGIND_H -#include -#endif - -#ifndef __TABUTIL_H -#include - #ifndef __VERIG_H #include "verig.h" #endif @@ -82,27 +78,31 @@ bool condpag_hndl( TMask_field& field, KEY key ) if ( field.to_check(key) || (key == K_TAB && !m.is_running())) { - const TString16 condpag(m.get(F_CODPAG)); - TString16 data(m.get(F_DATAINSC)); - - if (data.empty()) - data = m.get(F_DATADOC); - if ( condpag.not_empty()) + const TString& condpag = m.get(F_CODPAG); + if (condpag.not_empty()) { - TPagamento pag(condpag, data); + TDocumento& doc = m.doc(); + // Aggiorna dati necessari per determinare il pagamento + doc.put(DOC_CODPAG, condpag); + doc.put(DOC_DATADOC, m.get(F_DATADOC)); + doc.put(DOC_DATAINSC, m.get(F_DATAINSC)); + doc.put(DOC_TIPOCF, m.get(F_TIPOCF)); + doc.put(DOC_CODCF, m.get(F_CODCF)); + TPagamento& pag = doc.pagamento(); + pag.set_total(100, 10, 10); + pag.set_rate_auto(); - pag.set_total( 100, 10, 10 ); - pag.set_rate_auto( ); + const int max_rate = 5; int numrate = pag.n_rate( ); - if (numrate > 5) - numrate = 5; - for( int i = 0; i < numrate; i ++ ) + if (numrate > max_rate) + numrate = max_rate; + for(int i = 0; i < numrate; i++) { - m.show( F_DATASCAD1 + i ); - m.set( F_DATASCAD1 + i, pag.data_rata(i).string()); + m.show(F_DATASCAD1+i); + m.set(F_DATASCAD1+i, pag.data_rata(i).string()); } - for( ; i < 5; i ++ ) - m.hide( F_DATASCAD1 + i ); + for( ; i < max_rate; i++) + m.hide(F_DATASCAD1+i); } } return TRUE; @@ -244,15 +244,18 @@ bool iva_handler( TMask_field& f, KEY key ) { const int pos_p = row_mask.id2pos(FR_PREZZO); const int pos_q = row_mask.id2pos(FR_QTA); + const bool pe = pos_p >= 0 && row_mask.fld(pos_p).enabled(); + const bool qe = pos_q >= 0 && row_mask.fld(pos_q).enabled(); + const bool pf = pe && row_mask.fld(pos_p).get().not_empty(); + const bool qf = qe && row_mask.fld(pos_q).get().not_empty(); + bool required = FALSE; - - if (pos_p >= 0) - required |= row_mask.fld(pos_p).enabled() ? row_mask.fld(pos_p).get().not_empty() : FALSE; - if (pos_q >= 0) - required |= row_mask.fld(pos_q).enabled() ? row_mask.fld(pos_q).get().not_empty() : FALSE; - + + if (pf && !(qe && !qf)) + required = TRUE; + if (required) - return f.error_box("Il codice IVA e' obbligatorio se quantita' e prezzo sono indicati."); + return f.error_box("Il codice IVA e' obbligatorio."); } } return TRUE; @@ -320,11 +323,11 @@ bool codmag_coll_handler( TMask_field& f, KEY key ) return TRUE; } -bool codart_handler( TMask_field& f, KEY key ) +bool codart_handler(TMask_field& f, KEY key ) { TMask& row_mask = f.mask(); - TDocumento_mask & mask = (TDocumento_mask &) row_mask.get_sheet()->mask(); - TSheet_field & sh = (TSheet_field &)mask.field(F_SHEET); + TDocumento_mask& mask = (TDocumento_mask &) row_mask.get_sheet()->mask(); + TSheet_field& sh = (TSheet_field &)mask.field(F_SHEET); const int current_doc_row = sh.selected() + 1; if (f.to_check(key, TRUE)) @@ -387,8 +390,6 @@ bool codart_handler( TMask_field& f, KEY key ) desc << " (OMAGGIO)"; if (lingua.not_empty()) { - if (mask.doc()[((TSheet_field &)mask.field(F_SHEET)).selected() + 1].is_omaggio()) - desc << " (OMAGGIO)"; TLocalisamfile deslin(LF_DESLIN); deslin.setkey(2); @@ -429,35 +430,32 @@ bool codart_handler( TMask_field& f, KEY key ) if (key == K_F8 && !sh.sheet_mask().is_running()) { - TConfig d(CONFIG_DITTA, "ve"); - const bool explode_db = d.get_bool("EXPLODEDB"); - const bool valcomp = d.get_bool("VALCOMP"); - const bool matbase = d.get_bool("TIPOESPL"); - const bool raggart = d.get_bool("RAGGART"); - const bool elrorig = d.get_bool("ELRORIG"); - const int livello = d.get_int("LIVESPL"); - const int ordin = d.get_int("ORDDB"); + TConfig cfgd(CONFIG_DITTA, "ve"); + const bool explode_db = cfgd.get_bool("EXPLODEDB"); if (explode_db) { - TCodice_articolo a(f.get()); + const bool valcomp = cfgd.get_bool("VALCOMP"); + const bool matbase = cfgd.get_bool("TIPOESPL"); + const TExplosion_grouping raggart = TExplosion_grouping(cfgd.get_int("RAGGART")); + const bool elrorig = cfgd.get_bool("ELRORIG"); + const int livello = cfgd.get_int("LIVESPL"); + const int ordin = cfgd.get_int("ORDDB"); + TDistinta_tree db; TArray components; - db.set_root(a); + TDocumento & doc = mask.doc(); + TRiga_documento & curr_row = doc[current_doc_row]; + sh.update_row(current_doc_row - 1); + curr_row.autosave(sh); - const int items = db.explode(components, matbase, (int)raggart, livello, "A", ordin); + db.set_root(curr_row); + const int items = db.explode(components, matbase, raggart, livello, "A", ordin); if (items > 0) { TProgind pi(items, "Esplosione in corso...",FALSE, TRUE); int row = current_doc_row; - TDocumento & doc = mask.doc(); - TRiga_documento & curr_row = doc[current_doc_row]; - const TString16 tiporiga(curr_row.tipo().codice()); - - sh.update_row(current_doc_row - 1); - curr_row.autosave(sh); - real qta_fin = curr_row.get_real(RDOC_QTA); - + const TString16 tiporiga(curr_row.tipo().codice()); TString_array& str_arr = sh.rows_array(); for (int i = components.first(); i < items; i = components.succ(i)) @@ -466,7 +464,7 @@ bool codart_handler( TMask_field& f, KEY key ) TRiga_esplosione & r = (TRiga_esplosione &) components[i]; TRiga_documento & new_row = doc.insert_row(row + 1, tiporiga); //sh.insert(row, FALSE); - str_arr.add("",row); + str_arr.insert(new TToken_string, row); TDocumento::copy_data(new_row, curr_row); new_row.put(RDOC_CODART, r.articolo()); @@ -476,7 +474,7 @@ bool codart_handler( TMask_field& f, KEY key ) new_row.zero(RDOC_DESCEST); new_row.put(RDOC_CHECKED, ""); new_row.put(RDOC_UMQTA, r.um()); - new_row.put(RDOC_QTA, r.val() * qta_fin); + new_row.put(RDOC_QTA, r.val()); new_row.autoload(sh); sh.check_row(row++); new_row.autosave(sh); @@ -514,7 +512,6 @@ bool codartmag_handler( TMask_field& f, KEY key ) if (!to_check) { TSheet_field * s = m.get_sheet(); - if (s) to_check = !s->mask().is_running(); } @@ -530,7 +527,7 @@ bool codartmag_handler( TMask_field& f, KEY key ) bool liv_handler( TMask_field& f, KEY key ) { - if (key == K_TAB & f.focusdirty() && !f.get().empty()) + if (key == K_TAB && f.focusdirty() && !f.get().empty()) { TDocumento_mask & mask=(TDocumento_mask &) f.mask().get_sheet()->mask(); const int levnum=f.dlg()-FR_LIV1+1; @@ -539,7 +536,7 @@ bool liv_handler( TMask_field& f, KEY key ) mask.livelli().autoinsert(levnum, f); } - if (f.to_check(key, TRUE)) + if (f.to_check(key, TRUE) && (f.dlg() < FR_LIV4)) { TMask& row_mask = f.mask(); TMask_field & next = row_mask.field(f.dlg() + 1); @@ -602,6 +599,11 @@ bool umart_handler( TMask_field& f, KEY key ) qta /= fc; qta.round(5); row_mask.set(FR_QTA, qta); + qta = row_mask.get_real(FR_QTAEVASA); + qta *= curr_fc; + qta /= fc; + qta.round(5); + row_mask.set(FR_QTAEVASA, qta); } } @@ -612,6 +614,63 @@ bool umart_handler( TMask_field& f, KEY key ) return TRUE; } +bool um_handler( TMask_field& f, KEY key ) +{ + // Se qualcuno cerca di modificare la maschera + if ( key == K_TAB && f.focusdirty()) + { + TMask& row_mask = f.mask( ); + TDocumento_mask & mask = (TDocumento_mask &) row_mask.get_sheet()->mask(); + TTable & ums = (TTable &) ((TEdit_field &) f).browse()->cursor()->file(); + + const TString16 um(f.get()); + real fc(1.0); + + if (um.not_empty() && curr_um.not_empty() && um != curr_um) + { + ums.put("CODTAB", curr_um); + if (ums.read() == NOERR) + { + real qta(row_mask.get_real(FR_QTA)); + const TString16 umsrif0(ums.get("S7")); + const real fc0 = ums.get_real("R10"); + if (um == umsrif0) + fc = fc0; + else + { + ums.put("CODTAB", um); + if (ums.read() == NOERR) + { + const real fc1 = ums.get_real("R10"); + const TString16 umsrif1(ums.get("S7")); + + + if (fc1 > ZERO) + { + if (curr_um == umsrif1) + fc = 1 / fc1; + else + if (umsrif0 == ums.get("S7")) + fc = fc0 / ums.get_real("R10"); + } + } + } + qta *= fc; + qta.round(5); + row_mask.set(FR_QTA, qta); + qta = row_mask.get_real(FR_QTAEVASA); + qta *= fc; + qta.round(5); + row_mask.set(FR_QTAEVASA, qta); + } + + } + curr_um = um; + curr_fc = fc; + } + return TRUE; +} + bool descr_handler( TMask_field& f, KEY key ) { if (key == K_TAB && f.focusdirty()) @@ -635,7 +694,7 @@ bool descr_handler( TMask_field& f, KEY key ) return TRUE; } -bool qta_handler( TMask_field& f, KEY key ) +bool qtaart_handler( TMask_field& f, KEY key ) { // Se qualcuno cerca di modificare la maschera if ( key == K_TAB && f.focusdirty()) @@ -695,6 +754,30 @@ bool qta_evasa_handler( TMask_field& f, KEY key ) return TRUE; } +bool causmag_handler( TMask_field& f, KEY key ) +{ + if (f.to_check(key)) + { + TMask& row_mask = f.mask( ); + TDocumento_mask & mask = (TDocumento_mask &) row_mask.get_sheet()->mask(); + TString16 causmag(f.get()); + + if (causmag.empty()) + causmag = mask.get(F_CAUSMAG); + + TTable c("%CAU"); + c.put("CODTAB", causmag); + + if (c.read() == NOERR) + { + TString16 codmag(c.get("S10")); + row_mask.set(FR_CODMAG, codmag.left(3), TRUE); + row_mask.set(FR_CODDEP, codmag.mid(3), TRUE); + } + } + return TRUE; +} + bool sppr_handler( TMask_field& f, KEY key ) { TMask& row_mask = f.mask(); diff --git a/ve/veprassi.men b/ve/veprassi.men index ca63a3d2c..fab0b738d 100755 --- a/ve/veprassi.men +++ b/ve/veprassi.men @@ -26,6 +26,7 @@ Flags = "" Item_01 = "Stampa riepilogo documenti immessi", "ve1 -0 L", "F" Item_02 = "Scarico e ripristino documenti", "ve5 -0", "F" Item_03 = "Cambiamento stato documenti", "ve5 -1", "F" +Item_04 = "Copia documenti", "ve5 -2", "F" [PRASSIVE_052] Caption = "Configurazione" diff --git a/ve/vepriv.h b/ve/vepriv.h index 5b9fcbb51..0d3cd267a 100755 --- a/ve/vepriv.h +++ b/ve/vepriv.h @@ -15,7 +15,10 @@ bool codmag_handler(TMask_field& f, KEY key); bool codmag_coll_handler(TMask_field& f, KEY key); bool codart_handler(TMask_field& f, KEY key); bool umart_handler(TMask_field& f, KEY key); +bool um_handler(TMask_field& f, KEY key); bool descr_handler(TMask_field& f, KEY key); +bool qtaart_handler(TMask_field& f, KEY key); bool qta_handler(TMask_field& f, KEY key); - -#endif \ No newline at end of file +bool qta_evasa_handler(TMask_field& f, KEY key); +bool causmag_handler(TMask_field& f, KEY key); +#endif diff --git a/ve/verig.uml b/ve/verig.uml index 4a5d921d4..0c4fe9b53 100755 --- a/ve/verig.uml +++ b/ve/verig.uml @@ -84,6 +84,9 @@ IFDEF(CH_CODMAG) CHECKTYPE CH_CODMAG ELSEIF CHECKTYPE NORMAL +ENDIF +IFDEF(MS_CODMAG) + MESSAGE MS_CODMAG ENDIF FIELD CODMAG[1,3] END @@ -133,6 +136,9 @@ IFDEF(FL_CODDEP) ENDIF FLAGS "U" KEY 1 +IFDEF(MS_CODDEP) + MESSAGE MS_CODDEP +ENDIF FIELD CODMAG[4,5] END @@ -149,6 +155,9 @@ END ENDIF ENDIF + +IF(defined(F_CODART) || defined(F_CODALT)) + IFDEF(F_CODART) STRING FR_CODART 20 BEGIN @@ -170,9 +179,43 @@ IFDEF(FL_CODART) FLAGS FL_CODART ENDIF FLAGS "U" +IFDEF(MS_CODART) + MESSAGE MS_CODART +ENDIF FIELD CODART ADD RUN ve2 -3 END +ENDIF + +IFDEF(F_CODALT) +STRING FR_CODART 20 +BEGIN +IFDEF(X_CODALT) + PROMPT X_CODART Y_CODART PR_CODART +ELSEIF + PROMPT 2 6 "Articolo " +ENDIF + USE LF_CODCORR KEY 2 + JOIN LF_ANAMAG INTO CODART==CODART + INPUT CODARTALT FR_CODART + DISPLAY "Codice\nalternativo@20" CODARTALT + DISPLAY "Descrizione@50" LF_ANAMAG->DESCR + DISPLAY "Codice@20" CODART + OUTPUT FR_CODART CODART + WARNING "Articolo assente" +IFDEF(CH_CODALT) + CHECKTYPE CH_CODALT +ENDIF +IFDEF(FL_CODALT) + FLAGS FL_CODALT +ENDIF + FLAGS "U" +IFDEF(MS_CODALT) + MESSAGE MS_CODALT +ENDIF + FIELD CODART +END +ENDIF STRING FR_CODARTMAG 20 BEGIN @@ -205,6 +248,9 @@ ELSEIF OUTPUT FR_LIV1 CODTAB[2,] MESSAGE EMPTY RESET,FR_LIV2|RESET,FR_LIV3|RESET,FR_LIV4 MESSAGE ENABLE,FR_LIV2 +IFDEF(MS_LIV1) + MESSAGE MS_LIV1 +ENDIF CHECKTYPE NORMAL ENDIF END @@ -227,6 +273,9 @@ ENDIF OUTPUT FR_LIV2 CODTAB[2,] MESSAGE EMPTY RESET,FR_LIV3|RESET,FR_LIV4 MESSAGE ENABLE,FR_LIV3 +IFDEF(MS_LIV2) + MESSAGE MS_LIV2 +ENDIF CHECKTYPE NORMAL END @@ -248,6 +297,9 @@ ENDIF OUTPUT FR_LIV3 CODTAB[2,] MESSAGE EMPTY RESET,FR_LIV4 MESSAGE ENABLE,FR_LIV4 +IFDEF(MS_LIV3) + MESSAGE MS_LIV3 +ENDIF CHECKTYPE NORMAL END @@ -267,6 +319,9 @@ ENDIF DISPLAY "Gruppo@10" CODTAB[2,] DISPLAY "Descrizione@30" S0 OUTPUT FR_LIV4 CODTAB[2,] +IFDEF(MS_LIV4) + MESSAGE MS_LIV4 +ENDIF CHECKTYPE NORMAL END ENDIF @@ -291,6 +346,9 @@ ENDIF OUTPUT FR_UMQTASP S7 OUTPUT FR_CODIVA S3 MESSAGE DIRTY,FR_CODIVA|K_TAB,FR_CODIVA +IFDEF(MS_CODSP) + MESSAGE MS_CODSP +ENDIF FIELD CODART FLAGS "U" IFDEF(CH_CODSP) @@ -319,6 +377,9 @@ ENDIF OUTPUT FR_UMQTASP S7 OUTPUT FR_CODIVA S3 MESSAGE DIRTY,FR_CODIVA|K_TAB,FR_CODIVA|DISABLE,FR_QTA +IFDEF(MS_CODSPV) + MESSAGE MS_CODSPV +ENDIF FIELD CODART FLAGS "U" IFDEF(CH_CODSPV) @@ -348,6 +409,9 @@ ENDIF OUTPUT FR_UMQTASP S7 OUTPUT FR_CODIVA S3 MESSAGE DIRTY,FR_CODIVA|K_TAB,FR_CODIVA +IFDEF(MS_CODSPQ) + MESSAGE MS_CODSPQ +ENDIF FIELD CODART FLAGS "U" IFDEF(CH_CODSPQ) @@ -377,6 +441,9 @@ ENDIF FIELD CODART FLAGS "U" MESSAGE DIRTY,FR_CODIVA|K_TAB,FR_CODIVA +IFDEF(MS_CODSPP) + MESSAGE MS_CODSPP +ENDIF IFDEF(CH_CODSPP) CHECKTYPE CH_CODSPP ELSEIF @@ -405,6 +472,9 @@ ENDIF OUTPUT FR_UMQTASP S7 OUTPUT FR_CODIVA S3 MESSAGE DIRTY,FR_CODIVA|K_TAB,FR_CODIVA +IFDEF(MS_CODPRS) + MESSAGE MS_CODPRS +ENDIF FIELD CODART FLAGS "U" IFDEF(CH_CODPRS) @@ -433,6 +503,9 @@ ENDIF OUTPUT FR_UMQTASP S7 OUTPUT FR_CODIVA S3 MESSAGE DIRTY,FR_CODIVA|K_TAB,FR_CODIVA +IFDEF(MS_CODPRSV) + MESSAGE MS_CODPRSV +ENDIF FIELD CODART FLAGS "U" IFDEF(CH_CODPRSV) @@ -462,6 +535,9 @@ ENDIF OUTPUT FR_UMQTASP S7 OUTPUT FR_CODIVA S3 MESSAGE DIRTY,FR_CODIVA|K_TAB,FR_CODIVA +IFDEF(MS_CODPRSQ) + MESSAGE MS_CODPRSQ +ENDIF FIELD CODART FLAGS "U" IFDEF(CH_CODPRSQ) @@ -490,6 +566,9 @@ ENDIF OUTPUT FR_UMQTASP S7 OUTPUT FR_CODIVA S3 MESSAGE DIRTY,FR_CODIVA|K_TAB,FR_CODIVA +IFDEF(MS_CODPRSP) + MESSAGE MS_CODPRSP +ENDIF FIELD CODART FLAGS "U" IFDEF(CH_CODPRSP) @@ -507,6 +586,9 @@ IFDEF(X_DESCR) PROMPT X_DESCR Y_DESCR PR_DESCR ELSEIF PROMPT 2 7 "Descrizione " +ENDIF +IFDEF(MS_DESCR) + MESSAGE MS_DESCR ENDIF FIELD DESCR END @@ -526,6 +608,9 @@ ENDIF DISPLAY "Codice@20" CODART OUTPUT FR_DESCRART DESCR ADD RUN ve2 -3 +IFDEF(MS_DESCRART) + MESSAGE MS_DESCRART +ENDIF FIELD DESCR END ENDIF @@ -543,6 +628,9 @@ ENDIF DISPLAY "Descrizione@50" S0 DISPLAY "Codice spesa" CODTAB COPY OUTPUT FR_CODSP +IFDEF(MS_DESCRSP) + MESSAGE MS_DESCRSP +ENDIF FIELD DESCR END ENDIF @@ -560,6 +648,9 @@ ENDIF DISPLAY "Descrizione@50" S0 DISPLAY "Codice spesa" CODTAB COPY OUTPUT FR_CODSPV +IFDEF(MS_DESCRSPV) + MESSAGE MS_DESCRSPV +ENDIF FIELD DESCR END ENDIF @@ -567,7 +658,7 @@ ENDIF IFDEF(F_DESCRSPQ) ZOOM FR_DESCRSPQ 50 BEGIN -IFDEF(X_DESCRSPV) +IFDEF(X_DESCRSPQ) PROMPT X_DESCRSPQ Y_DESCRSPQ PR_DESCRSPQ ELSEIF PROMPT 2 7 "Descrizione " @@ -577,6 +668,9 @@ ENDIF DISPLAY "Descrizione@50" S0 DISPLAY "Codice spesa" CODTAB COPY OUTPUT FR_CODSPQ +IFDEF(MS_DESCRSPQ) + MESSAGE MS_DESCRSPQ +ENDIF FIELD DESCR END ENDIF @@ -594,6 +688,9 @@ ENDIF DISPLAY "Descrizione@50" S0 DISPLAY "Codice spesa" CODTAB COPY OUTPUT FR_CODSPP +IFDEF(MS_DESCRSPP) + MESSAGE MS_DESCRSPP +ENDIF FIELD DESCR END ENDIF @@ -611,6 +708,9 @@ ENDIF DISPLAY "Descrizione@50" S0 DISPLAY "Codice prestazione" CODTAB COPY OUTPUT FR_CODPRS +IFDEF(MS_DESCRPRS) + MESSAGE MS_DESCRPRS +ENDIF FIELD DESCR END ENDIF @@ -628,6 +728,9 @@ ENDIF DISPLAY "Descrizione@50" S0 DISPLAY "Codice prestazione" CODTAB COPY OUTPUT FR_CODPRSV +IFDEF(MS_DESCRPRSV) + MESSAGE MS_DESCRPRSV +ENDIF FIELD DESCR END ENDIF @@ -645,6 +748,9 @@ ENDIF DISPLAY "Descrizione@50" S0 DISPLAY "Codice prestazione" CODTAB COPY OUTPUT FR_CODPRSQ +IFDEF(MS_DESCRPRSQ) + MESSAGE MS_DESCRPRSQ +ENDIF FIELD DESCR END ENDIF @@ -662,6 +768,9 @@ ENDIF DISPLAY "Descrizione@50" S0 DISPLAY "Codice prestazione" CODTAB COPY OUTPUT FR_CODPRSP +IFDEF(MS_DESCRPRSP) + MESSAGE MS_DESCRPRSP +ENDIF FIELD DESCR END ENDIF @@ -681,6 +790,9 @@ ENDIF DISPLAY "Codice@20" UM DISPLAY "Descrizione@50" %UMS->S0 OUTPUT FR_UMQTA UM +IFDEF(MS_UMQTA) + MESSAGE MS_UMQTA +ENDIF FIELD UMQTA FLAG "U" IFDEF(CH_UMQTA) @@ -702,6 +814,9 @@ ENDIF DISPLAY "Codice" CODTAB DISPLAY "Descrizione@50" S0 OUTPUT FR_UMQTA2 CODTAB +IFDEF(MS_UMQTA2) + MESSAGE MS_UMQTA2 +ENDIF FIELD UMQTA FLAG "U" IFDEF(CH_UMQTA) @@ -725,6 +840,9 @@ ENDIF DISPLAY "Codice" CODTAB DISPLAY "Descrizione@50" S0 OUTPUT FR_UMQTASP CODTAB +IFDEF(MS_UMQTASP) + MESSAGE MS_UMQTASP +ENDIF FIELD UMQTA FLAG "U" IFDEF(CH_UMQTASP) @@ -743,9 +861,18 @@ IFDEF(X_QTA) ELSEIF PROMPT 21 9 "Qta' " ENDIF -IFDEF(F_PSPESA) +IFDEF(F_PERCSP) FLAGS "H" ENDIF +IFDEF(FL_QTA) + FLAGS FL_QTA +ENDIF +IFDEF(MS_QTA) + MESSAGE MS_QTA +ENDIF +IFDEF(NC_QTA) + NUM_CALC NC_QTA +ENDIF FIELD QTA END @@ -758,6 +885,15 @@ ELSEIF ENDIF IFDEF(F_QTA) FLAGS "H" +ENDIF +IFDEF(FL_PERCSP) + FLAGS FL_PERCSP +ENDIF +IFDEF(MS_PERCSP) + MESSAGE MS_PERCSP +ENDIF +IFDEF(NC_PERCSP) + NUM_CALC NC_PERCSP ENDIF FIELD QTA END @@ -770,6 +906,15 @@ IFDEF(X_PREZZO) PROMPT X_PREZZO Y_PREZZO PR_PREZZO ELSEIF PROMPT 42 9 "Prezzo " +ENDIF +IFDEF(FL_PREZZO) + FLAGS FL_PREZZO +ENDIF +IFDEF(MS_PREZZO) + MESSAGE MS_PREZZO +ENDIF +IFDEF(NC_PREZZO) + NUM_CALC NC_PREZZO ENDIF FIELD PREZZO END @@ -782,18 +927,36 @@ IFDEF(X_VALORE) PROMPT X_VALORE Y_VALORE PR_VALORE ELSEIF PROMPT 42 9 "Valore " +ENDIF +IFDEF(FL_VALORE) + FLAGS FL_VALORE +ENDIF +IFDEF(MS_VALORE) + MESSAGE MS_VALORE +ENDIF +IFDEF(NC_VALORE) + NUM_CALC NC_VALORE ENDIF FIELD PREZZO END ENDIF IFDEF(F_QTAEVASA) -NUMBER FR_QTAEVASA 11 3 +NUMBER FR_QTAEVASA 13 5 BEGIN IFDEF(X_QTAEVASA) PROMPT X_QTAEVASA Y_QTAEVASA PR_QTAEVASA ELSEIF - PROMPT 17 10 "Q.ta evasa " + PROMPT 15 10 "Qta' evasa " +ENDIF +IFDEF(FL_QTAEVASA) + FLAGS FL_QTAEVASA +ENDIF +IFDEF(MS_QTAEVASA) + MESSAGE MS_QTAEVASA +ENDIF +IFDEF(NC_QTAEVASA) + NUM_CALC NC_QTAEVASA ENDIF FIELD QTAEVASA END @@ -819,6 +982,9 @@ IFDEF(X_RIGAEVASA) ELSEIF PROMPT 53 10 "Consegna " ENDIF +IFDEF(FL_DATACONS) + FLAGS FL_DATACONS +ENDIF FIELD DATACONS END ENDIF @@ -830,6 +996,15 @@ IFDEF(X_TARA) PROMPT X_TARA Y_TARA PR_TARA ELSEIF PROMPT 2 11 "Tara " +ENDIF +IFDEF(FL_TARA) + FLAGS FL_TARA +ENDIF +IFDEF(MS_TARA) + MESSAGE MS_TARA +ENDIF +IFDEF(NC_TARA) + NUM_CALC NC_TARA ENDIF FIELD TARA END @@ -842,6 +1017,15 @@ IFDEF(X_PNETTO) PROMPT X_PNETTO Y_PNETTO PR_PNETTO ELSEIF PROMPT 30 11 "Peso netto " +ENDIF +IFDEF(FL_PNETTO) + FLAGS FL_PNETTO +ENDIF +IFDEF(MS_PNETTO) + MESSAGE MS_PNETTO +ENDIF +IFDEF(NC_PNETTO) + NUM_CALC NC_PNETTO ENDIF FIELD PNETTO END @@ -854,6 +1038,15 @@ IFDEF(X_NCOLLI) PROMPT X_NCOLLI Y_NCOLLI PR_NCOLLI ELSEIF PROMPT 2 12 "N.Colli " +ENDIF +IFDEF(FL_NCOLLI) + FLAGS FL_NCOLLI +ENDIF +IFDEF(MS_NCOLLI) + MESSAGE MS_NCOLLI +ENDIF +IFDEF(NC_NCOLLI) + NUM_CALC NC_NCOLLI ENDIF FIELD NCOLLI END @@ -878,6 +1071,12 @@ IFDEF(X_SCONTO) PROMPT X_SCONTO Y_SCONTO PR_SCONTO ELSEIF PROMPT 2 13 "Sconto " +ENDIF +IFDEF(FL_SCONTO) + FLAGS FL_SCONTO +ENDIF +IFDEF(MS_SCONTO) + MESSAGE MS_SCONTO ENDIF FIELD SCONTO END @@ -890,6 +1089,15 @@ IFDEF(X_PERCPROV) PROMPT X_PERCPROV Y_PERCPROV PR_PERCPROV ELSEIF PROMPT 42 13 "Perc.Provv. " +ENDIF +IFDEF(FL_PERCPROV) + FLAGS FL_PERCPROV +ENDIF +IFDEF(MS_PERCPROV) + MESSAGE MS_PERCPROV +ENDIF +IFDEF(NC_PERCPROV) + NUM_CALC NC_PERCPROV ENDIF FIELD PERCPROV END @@ -902,6 +1110,12 @@ IFDEF(X_IMPFISUN) PROMPT X_IMPFISUN Y_IMPFISUN PR_IMPFISUN ELSEIF PROMPT 2 14 "Importo provv.unitario" +ENDIF +IFDEF(FL_IMPFISUN) + FLAGS FL_IMPFISUN +ENDIF +IFDEF(MS_IMPFISUN) + MESSAGE MS_IMPFISUN ENDIF FIELD IMPFISUN END @@ -915,6 +1129,12 @@ IFDEF(X_IMPFISSO) PROMPT X_IMPFISSO Y_IMPFISSO PR_IMPFISSO ELSEIF PROMPT 42 14 "Imp.Provv. " +ENDIF +IFDEF(FL_IMPFISSO) + FLAGS FL_IMPFISSO +ENDIF +IFDEF(MS_IMPFISSSO) + MESSAGE MS_IMPFISSO ENDIF FIELD IMPFISSO END @@ -935,11 +1155,17 @@ ENDIF OUTPUT FR_CODIVA CODTAB OUTPUT FR_DESIVA S0 FLAGS "U" +IFDEF(FL_CODIVA) + FLAGS FL_CODIVA +ENDIF VALIDATE ZEROFILL_FUNC 2 IFDEF(CH_CODIVA) CHECKTYPE CH_CODIVA ELSEIF CHECKTYPE NORMAL +ENDIF +IFDEF(MS_CODIVA) + MESSAGE MS_CODIVA ENDIF FIELD CODIVA END @@ -958,6 +1184,12 @@ ENDIF DISPLAY "Codice@20" CODTAB OUTPUT FR_CODIVA CODTAB OUTPUT FR_DESIVA S0 +IFDEF(FL_DESIVA) + FLAGS FL_DESIVA +ENDIF +IFDEF(MS_DESIVA) + MESSAGE MS_DESIVA +ENDIF END ENDIF ENDIF @@ -989,6 +1221,12 @@ ENDIF OUTPUT FR_ASPBENI CODTAB OUTPUT FR_DESASP S0 FLAGS "UZ" +IFDEF(FL_ASPBENI) + FLAGS FL_ASPBENI +ENDIF +IFDEF(MS_ASPBENI) + MESSAGE MS_ASPBENI +ENDIF IFDEF(CH_ASPBENI) CHECKTYPE CH_ASPBENI ELSEIF @@ -1025,6 +1263,12 @@ ENDIF OUTPUT FR_CAUS CODTAB OUTPUT FR_DESCRCAUS S0 FLAGS "U" +IFDEF(FL_CAUS) + FLAGS FL_CAUS +ENDIF +IFDEF(MS_CAUS) + MESSAGE MS_CAUS +ENDIF IFDEF(CH_CAUS) CHECKTYPE CH_CAUS ELSEIF @@ -1070,6 +1314,9 @@ ENDIF FLAGS "U" IFDEF(FL_CODMAGC) FLAGS FL_CODMAGC +ENDIF +IFDEF(MS_CODMAGC) + MESSAGE MS_CODMAGC ENDIF KEY 1 IFDEF(CH_CODMAGC) @@ -1114,6 +1361,9 @@ ENDIF OUTPUT FR_CODDEPC CODTAB[4,5] OUTPUT FR_DESDEPC S0 MESSAGE DIRTY,FR_CODMAGC|K_TAB,FR_CODMAGC +IFDEF(MS_CODDEPC) + MESSAGE MS_CODDEPC +ENDIF IFDEF(CH_CODDEPC) CHECKTYPE CH_CODDEPC ELSEIF @@ -1148,6 +1398,15 @@ IFDEF(X_QTAGG1) PROMPT X_QTAGG1 Y_QTAGG1 PR_QTAGG1 ELSEIF PROMPT 2 6 "Qta' agg.1 " +ENDIF +IFDEF(FL_QTAGG1) + FLAGS FL_QTAGG1 +ENDIF +IFDEF(MS_QTAGG1) + MESSAGE MS_QTAGG1 +ENDIF +IFDEF(NC_QTAGG1) + NUM_CALC NC_QTAGG1 ENDIF FIELD QTAGG1 END @@ -1160,6 +1419,15 @@ IFDEF(X_QTAGG2) PROMPT X_QTAGG2 Y_QTAGG2 PR_QTAGG2 ELSEIF PROMPT 28 6 "2 " +ENDIF +IFDEF(FL_QTAGG2) + FLAGS FL_QTAGG2 +ENDIF +IFDEF(MS_QTAGG2) + MESSAGE MS_QTAGG2 +ENDIF +IFDEF(NC_QTAGG2) + NUM_CALC NC_QTAGG2 ENDIF FIELD QTAGG2 END @@ -1172,6 +1440,15 @@ IFDEF(X_QTAGG3) PROMPT X_QTAGG3 Y_QTAGG3 PR_QTAGG3 ELSEIF PROMPT 44 6 "3 " +ENDIF +IFDEF(FL_QTAGG3) + FLAGS FL_QTAGG3 +ENDIF +IFDEF(MS_QTAGG3) + MESSAGE MS_QTAGG3 +ENDIF +IFDEF(NC_QTAGG3) + NUM_CALC NC_QTAGG3 ENDIF FIELD QTAGG3 END @@ -1184,6 +1461,15 @@ IFDEF(X_QTAGG4) PROMPT X_QTAGG4 Y_QTAGG4 PR_QTAGG4 ELSEIF PROMPT 12 7 "4 " +ENDIF +IFDEF(FL_QTAGG4) + FLAGS FL_QTAGG4 +ENDIF +IFDEF(MS_QTAGG4) + MESSAGE MS_QTAGG4 +ENDIF +IFDEF(NC_QTAGG1) + NUM_CALC NC_QTAGG4 ENDIF FIELD QTAGG4 END @@ -1196,6 +1482,15 @@ IFDEF(X_QTAGG5) PROMPT X_QTAGG5 Y_QTAGG5 PR_QTAGG5 ELSEIF PROMPT 28 7 "5 " +ENDIF +IFDEF(FL_QTAGG5) + FLAGS FL_QTAGG5 +ENDIF +IFDEF(MS_QTAGG5) + MESSAGE MS_QTAGG5 +ENDIF +IFDEF(NC_QTAGG5) + NUM_CALC NC_QTAGG5 ENDIF FIELD QTAGG5 END diff --git a/ve/verig00.uml b/ve/verig00.uml index 955ee8439..b25528e4e 100755 --- a/ve/verig00.uml +++ b/ve/verig00.uml @@ -22,7 +22,7 @@ DEFINE_FIELD(PERCPROV) DEFINE_FIELD(IMPFISSO) DEFINE_FIELD(IMPFISUN) DEFINE_FIELD(CODIVA) -DEFINE_FIELD(DESIVA) +DEFINE_FIELD(DESIVA) DEFINE_FIELD(ADDIVA) DEFINE_FIELD(ASPBENI) DEFINE_FIELD(DESASP) diff --git a/ve/verig01.uml b/ve/verig01.uml index 775d8e41f..650292cc3 100755 --- a/ve/verig01.uml +++ b/ve/verig01.uml @@ -20,6 +20,9 @@ DEFINE_FIELD(DESCRART) DEFINE_FIELD(UMQTA) DEFINE_FIELD(QTA) DEFINE_FIELD(PREZZO) +DEFINE_FIELD(QTAEVASA) +DEFINE_FIELD(RIGAEVASA) +DEFINE_FIELD(DATACONS) F_POS(PREZZO, 42, 9,"Prezzo " ) DEFINE_FIELD(SCONTO) F_POS(SCONTO, 2, 11,"Sconto " ) diff --git a/ve/verig06.uml b/ve/verig06.uml index a172ada60..aaa73a572 100755 --- a/ve/verig06.uml +++ b/ve/verig06.uml @@ -9,6 +9,9 @@ DEFINE_FIELD(DESCRPRS) DEFINE_FIELD(UMQTASP) DEFINE_FIELD(QTA) DEFINE_FIELD(PREZZO) +DEFINE_FIELD(QTAEVASA) +DEFINE_FIELD(RIGAEVASA) +DEFINE_FIELD(DATACONS) DEFINE_FIELD(SCONTO) F_POS(SCONTO, 2, 11,"Sconto " ) DEFINE_FIELD(CODIVA) diff --git a/ve/verig09.uml b/ve/verig09.uml index 10c17aa9a..e0e2586f2 100755 --- a/ve/verig09.uml +++ b/ve/verig09.uml @@ -20,6 +20,9 @@ DEFINE_FIELD(DESCRART) DEFINE_FIELD(UMQTA) DEFINE_FIELD(QTA) DEFINE_FIELD(PREZZO) +DEFINE_FIELD(QTAEVASA) +DEFINE_FIELD(RIGAEVASA) +DEFINE_FIELD(DATACONS) DEFINE_FIELD(CODIVA) F_POS(CODIVA, 2, 11,"Cod. IVA " ) DEFINE_FIELD(DESIVA) diff --git a/ve/verigdef.h b/ve/verigdef.h index ed068e984..a1488178a 100755 --- a/ve/verigdef.h +++ b/ve/verigdef.h @@ -13,5 +13,8 @@ #define F_FLG(name, flags) !!define FL_##name flags ; #define F_CHK(name, type) !!define CH_##name type ; +#define F_MSG(name, msg, fld) !!define MS_##name msg,fld ; +#define F_NCALC(name, expr) !!define NC_##name expr ; + INCLDEF("verig.h") diff --git a/ve/vetbnum.h b/ve/vetbnum.h new file mode 100755 index 000000000..4284aa2a5 --- /dev/null +++ b/ve/vetbnum.h @@ -0,0 +1,36 @@ +#define NUM_CODTAB 101 +#define NUM_DESNUM 102 +#define NUM_ULTNUM 103 +#define NUM_ULTNUMPROV 104 +#define NUM_PREFISSO 105 +#define NUM_SUFFISSO 106 +#define NUM_ULTDATA 107 +#define NUM_ANNO 108 +#define NUM_TIPO 109 +#define NUM_NODATADOCTEST 110 + +#define NUM_DEFPRINTER 121 + +#define NUM_TIPODOC1 210 +#define NUM_DESDOC1 211 +#define NUM_TIPODOC2 212 +#define NUM_DESDOC2 213 +#define NUM_TIPODOC3 214 +#define NUM_DESDOC3 215 +#define NUM_TIPODOC4 216 +#define NUM_DESDOC4 217 +#define NUM_TIPODOC5 218 +#define NUM_DESDOC5 219 +#define NUM_TIPODOC6 220 +#define NUM_DESDOC6 221 +#define NUM_TIPODOC7 222 +#define NUM_DESDOC7 223 +#define NUM_TIPODOC8 224 +#define NUM_DESDOC8 225 +#define NUM_TIPODOC9 226 +#define NUM_DESDOC9 227 +#define NUM_TIPODOC10 228 +#define NUM_DESDOC10 229 +#define NUM_NUMPROVV 230 +#define NUM_NUMAUTO 231 +#define NUM_ULTDATAPROV 232 diff --git a/ve/vetbnum.uml b/ve/vetbnum.uml new file mode 100755 index 000000000..3d7c61871 --- /dev/null +++ b/ve/vetbnum.uml @@ -0,0 +1,370 @@ +#include "vetbnum.h" + +TOOLBAR "" 0 19 78 3 +#include "toolbar.h" +ENDPAGE + +PAGE "Numerazione documenti" -1 -1 78 19 + +GROUPBOX DLG_NULL 75 7 +BEGIN + PROMPT 1 0 "" + FLAGS "R" +END + +STRING NUM_CODTAB 4 +BEGIN + PROMPT 2 2 "Codice " + FIELD CODTAB + USE %NUM + CHECKTYPE REQUIRED + INPUT CODTAB NUM_CODTAB + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT NUM_CODTAB CODTAB + OUTPUT NUM_DESNUM S0 + KEY 1 + FLAGS "UZ" +END + +STRING NUM_DESNUM 50 +BEGIN + PROMPT 2 4 "Descrizione " + FIELD S0 + HELP "Descrizione numerazione" + USE %NUM KEY 2 + CHECKTYPE REQUIRED + INPUT S0 NUM_DESNUM + DISPLAY "Descrizione@60" S0 + DISPLAY "Codice" CODTAB + OUTPUT NUM_CODTAB CODTAB + OUTPUT NUM_DESNUM S0 + KEY 2 +END + +STRING NUM_PREFISSO 7 +BEGIN + PROMPT 2 8 "Prefisso per la numerazione " + FIELD S6 +END + +STRING NUM_SUFFISSO 7 +BEGIN + PROMPT 2 10 "Suffisso per la numerazione " + FIELD S7 +END + +BOOLEAN NUM_NUMPROVV +BEGIN + PROMPT 2 12 "Utilizzo della numerazione provvisoria" + FIELD B0 +END + +BOOLEAN NUM_NUMAUTO +BEGIN + PROMPT 2 14 "Utilizzo della numerazione automatica" + FIELD B1 +END + +BOOLEAN NUM_NODATADOCTEST +BEGIN + PROMPT 2 16 "Nessun controllo sulla sequenza delle date dei documenti" + FIELD B2 +END + +STRING NUM_DEFPRINTER 60 +BEGIN + PROMPT 2 18 "Usa stampante " + FLAGS "B" +END + +ENDPAGE + +PAGE "Tipi documento validi" -1 -1 78 19 + +GROUPBOX DLG_NULL 70 15 +BEGIN + PROMPT 1 1 "Tipi di documento validi per la numerazione" +END + +LIST NUM_TIPO 24 +BEGIN + PROMPT 2 2 "Tipo dei documenti " + FIELD I1 + ITEM "|Altro" + ITEM "1|Bolla" + ITEM "2|Fattura" + ITEM "3|Ordine" +END + +STRING NUM_TIPODOC1 4 +BEGIN + PROMPT 2 4 "" + FLAGS "U" + USE %TIP SELECT I1==#NUM_TIPO + INPUT CODTAB NUM_TIPODOC1 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT NUM_TIPODOC1 CODTAB + OUTPUT NUM_DESDOC1 S0 + WARNING "Tipo documento errato" + FIELD S2[1,4] + CHECKTYPE NORMAL +END + +STRING NUM_DESDOC1 50 +BEGIN + PROMPT 12 4 "" + USE %TIP KEY 2 SELECT I1==#NUM_TIPO + INPUT S0 NUM_DESDOC1 + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT NUM_TIPODOC1 + WARNING "Tipo documento errato" + CHECKTYPE NORMAL +END + +STRING NUM_TIPODOC2 4 +BEGIN + PROMPT 2 5 "" + FLAGS "U" + COPY USE NUM_TIPODOC1 + INPUT CODTAB NUM_TIPODOC2 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT NUM_TIPODOC2 CODTAB + OUTPUT NUM_DESDOC2 S0 + WARNING "Tipo documento errato" + FIELD S2[5,8] + CHECKTYPE NORMAL +END + +STRING NUM_DESDOC2 50 +BEGIN + PROMPT 12 5 "" + COPY USE NUM_DESDOC1 + INPUT S0 NUM_DESDOC2 + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT NUM_TIPODOC2 + WARNING "Tipo documento errato" + CHECKTYPE NORMAL +END + +STRING NUM_TIPODOC3 4 +BEGIN + PROMPT 2 6 "" + FLAGS "U" + COPY USE NUM_TIPODOC1 + INPUT CODTAB NUM_TIPODOC3 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT NUM_TIPODOC3 CODTAB + OUTPUT NUM_DESDOC3 S0 + WARNING "Tipo documento errato" + FIELD S2[9,12] + CHECKTYPE NORMAL +END + +STRING NUM_DESDOC3 50 +BEGIN + PROMPT 12 6 "" + COPY USE NUM_DESDOC1 + INPUT S0 NUM_DESDOC3 + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT NUM_TIPODOC3 + WARNING "Tipo documento errato" + CHECKTYPE NORMAL +END + +STRING NUM_TIPODOC4 4 +BEGIN + PROMPT 2 7 "" + FLAGS "U" + COPY USE NUM_TIPODOC1 + INPUT CODTAB NUM_TIPODOC4 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT NUM_TIPODOC4 CODTAB + OUTPUT NUM_DESDOC4 S0 + WARNING "Tipo documento errato" + FIELD S2[13,16] + CHECKTYPE NORMAL +END + +STRING NUM_DESDOC4 50 +BEGIN + PROMPT 12 7 "" + COPY USE NUM_DESDOC1 + INPUT S0 NUM_DESDOC4 + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT NUM_TIPODOC4 + WARNING "Tipo documento errato" + CHECKTYPE NORMAL +END + +STRING NUM_TIPODOC5 4 +BEGIN + PROMPT 2 8 "" + FLAGS "U" + COPY USE NUM_TIPODOC1 + INPUT CODTAB NUM_TIPODOC5 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT NUM_TIPODOC5 CODTAB + OUTPUT NUM_DESDOC5 S0 + WARNING "Tipo documento errato" + FIELD S2[17,20] + CHECKTYPE NORMAL +END + +STRING NUM_DESDOC5 50 +BEGIN + PROMPT 12 8 "" + COPY USE NUM_DESDOC1 + INPUT S0 NUM_DESDOC5 + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT NUM_TIPODOC5 + WARNING "Tipo documento errato" + CHECKTYPE NORMAL +END + +STRING NUM_TIPODOC6 4 +BEGIN + PROMPT 2 9 "" + FLAGS "U" + COPY USE NUM_TIPODOC1 + INPUT CODTAB NUM_TIPODOC6 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT NUM_TIPODOC6 CODTAB + OUTPUT NUM_DESDOC6 S0 + WARNING "Tipo documento errato" + FIELD S2[21,24] + CHECKTYPE NORMAL +END + +STRING NUM_DESDOC6 50 +BEGIN + PROMPT 12 9 "" + COPY USE NUM_DESDOC1 + INPUT S0 NUM_DESDOC6 + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT NUM_TIPODOC6 + WARNING "Tipo documento errato" + CHECKTYPE NORMAL +END + +STRING NUM_TIPODOC7 4 +BEGIN + PROMPT 2 10 "" + FLAGS "U" + COPY USE NUM_TIPODOC1 + INPUT CODTAB NUM_TIPODOC7 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT NUM_TIPODOC7 CODTAB + OUTPUT NUM_DESDOC7 S0 + WARNING "Tipo documento errato" + FIELD S2[25,28] + CHECKTYPE NORMAL +END + +STRING NUM_DESDOC7 50 +BEGIN + PROMPT 12 10 "" + COPY USE NUM_DESDOC1 + INPUT S0 NUM_DESDOC7 + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT NUM_TIPODOC7 + WARNING "Tipo documento errato" + CHECKTYPE NORMAL +END + +STRING NUM_TIPODOC8 4 +BEGIN + PROMPT 2 11 "" + FLAGS "U" + COPY USE NUM_TIPODOC1 + INPUT CODTAB NUM_TIPODOC8 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT NUM_TIPODOC8 CODTAB + OUTPUT NUM_DESDOC8 S0 + WARNING "Tipo documento errato" + FIELD S2[29,32] + CHECKTYPE NORMAL +END + +STRING NUM_DESDOC8 50 +BEGIN + PROMPT 12 11 "" + COPY USE NUM_DESDOC1 + INPUT S0 NUM_DESDOC8 + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT NUM_TIPODOC8 + WARNING "Tipo documento errato" + CHECKTYPE NORMAL +END + +STRING NUM_TIPODOC9 4 +BEGIN + PROMPT 2 12 "" + FLAGS "U" + COPY USE NUM_TIPODOC1 + INPUT CODTAB NUM_TIPODOC9 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT NUM_TIPODOC9 CODTAB + OUTPUT NUM_DESDOC9 S0 + WARNING "Tipo documento errato" + FIELD S2[33,36] + CHECKTYPE NORMAL +END + +STRING NUM_DESDOC9 50 +BEGIN + PROMPT 12 12 "" + COPY USE NUM_DESDOC1 + INPUT S0 NUM_DESDOC9 + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT NUM_TIPODOC9 + WARNING "Tipo documento errato" + CHECKTYPE NORMAL +END + +STRING NUM_TIPODOC10 4 +BEGIN + PROMPT 2 13 "" + FLAGS "U" + COPY USE NUM_TIPODOC1 + INPUT CODTAB NUM_TIPODOC10 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT NUM_TIPODOC10 CODTAB + OUTPUT NUM_DESDOC10 S0 + WARNING "Tipo documento errato" + FIELD S2[37,40] + CHECKTYPE NORMAL +END + +STRING NUM_DESDOC10 50 +BEGIN + PROMPT 12 13 "" + COPY USE NUM_DESDOC1 + INPUT S0 NUM_DESDOC10 + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT NUM_TIPODOC10 + WARNING "Tipo documento errato" + CHECKTYPE NORMAL +END + +ENDMASK diff --git a/ve/veuml.h b/ve/veuml.h index f35ff651d..7b881d533 100755 --- a/ve/veuml.h +++ b/ve/veuml.h @@ -84,6 +84,8 @@ #define F_CODLIST1 203 #define F_CODCONT1 204 #define F_CODZON 205 +#define F_ORDDA 206 +#define F_ORDDADES 207 #define F_SELECT 101 #endif // veuml.h