From 2afc3025a0ea5a328fdba77987b2ab66c8481d56 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 22 Apr 1999 15:31:16 +0000 Subject: [PATCH] Patch level : xx.282 Files correlati : Ricompilazione Demo : [ ] Commento : Riportata la versione 01.05 patch 282 git-svn-id: svn://10.65.10.50/trunk@8080 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- mr/check.bmp | Bin 0 -> 694 bytes mr/darrowd.bmp | Bin 0 -> 246 bytes mr/darrowd2.bmp | Bin 0 -> 246 bytes mr/darrowdl.bmp | Bin 0 -> 246 bytes mr/darrowdr.bmp | Bin 0 -> 246 bytes mr/darrowl.bmp | Bin 0 -> 246 bytes mr/darrowl2.bmp | Bin 0 -> 246 bytes mr/darrowr.bmp | Bin 0 -> 246 bytes mr/darrowr2.bmp | Bin 0 -> 246 bytes mr/darrowu.bmp | Bin 0 -> 246 bytes mr/darrowu2.bmp | Bin 0 -> 246 bytes mr/darrowul.bmp | Bin 0 -> 246 bytes mr/darrowur.bmp | Bin 0 -> 246 bytes mr/mr0.url | 2 + mr/mr01.bmp | Bin 0 -> 96118 bytes mr/mr0100.cpp | 178 ++++++---- mr/mr0400.cpp | 63 ++-- mr/mr0400.h | 11 +- mr/mr0400a.uml | 114 +++++-- mr/mr1.url | 4 +- mr/mr2.url | 4 +- mr/mr2200.cpp | 701 ++++++++++++++++++++++----------------- mr/mr2200a.h | 1 + mr/mr2200a.uml | 24 +- mr/mr2200b.h | 5 + mr/mr2200b.uml | 40 ++- mr/mrplib.cpp | 867 ++++++++++++++++++++++++++++++++++++++++++++++-- mr/mrplib.h | 228 ++++++++++++- mr/mrtbimp.h | 57 ++++ mr/mrtbimp.uml | 477 +++++++++++++++++++++++++- mr/mrtblnp.h | 53 ++- mr/mrtblnp.uml | 495 ++++++++++++++++++++++++++- mr/selordf.bmp | Bin 0 -> 958 bytes mr/selordp.bmp | Bin 0 -> 958 bytes 34 files changed, 2850 insertions(+), 474 deletions(-) create mode 100755 mr/check.bmp create mode 100755 mr/darrowd.bmp create mode 100755 mr/darrowd2.bmp create mode 100755 mr/darrowdl.bmp create mode 100755 mr/darrowdr.bmp create mode 100755 mr/darrowl.bmp create mode 100755 mr/darrowl2.bmp create mode 100755 mr/darrowr.bmp create mode 100755 mr/darrowr2.bmp create mode 100755 mr/darrowu.bmp create mode 100755 mr/darrowu2.bmp create mode 100755 mr/darrowul.bmp create mode 100755 mr/darrowur.bmp create mode 100755 mr/mr01.bmp create mode 100755 mr/selordf.bmp create mode 100755 mr/selordp.bmp diff --git a/mr/check.bmp b/mr/check.bmp new file mode 100755 index 0000000000000000000000000000000000000000..21c7127ea64262249af016f9fb59c35323da0475 GIT binary patch literal 694 zcmah_v2DaK47>ynD4jA!#&`s2vxc3LmH3@ieLPWWkEBkea;LWg1h8RBBt`Oc6!rf3 z^NcQu_Ko^MeWgC(LJM5idJq1Y3~(dohoj{Y%d*g`(E3JeI#IclqPYb>5n#p%#DR!2 zBEZTH%MFWEni6Ig2?QTIOr6XM>GBVI+qew({ z=T+(f#$LveKd_Hsck$RgC7&Od28$)=`-*&tfmWE2Vh+w=2*y#Nyfz=#4{m7~lDP=h z?^Ig}F|wU!5Klk%k~8Q6(=B0cck;|@ddCUloa<|AbA;hwd8f9eI*(`l^PvF0@b~=; literal 0 HcmV?d00001 diff --git a/mr/darrowd.bmp b/mr/darrowd.bmp new file mode 100755 index 0000000000000000000000000000000000000000..9e764e32b95d9aa277cdc284c79aeb69c1f05b01 GIT binary patch literal 246 zcmbVDu?>JQ3=0wma0Yj<^F~%S+Obo`S-q+qi|w)?G2zyBWGCBRZQz8h;PP;?Sw)h5 w2^y9u4TEB|QVN_!*SFp|fq0A{0ceyE;_>$EO|iR*?9L#<7{rUvh1P!F-!r{b*#H0l literal 0 HcmV?d00001 diff --git a/mr/darrowd2.bmp b/mr/darrowd2.bmp new file mode 100755 index 0000000000000000000000000000000000000000..0ddb97bd7f0f816777c0e2d4639e355c6e2b73c0 GIT binary patch literal 246 zcmbVDu@QhE5PR<&z%iV|-gShMQbzd7RhSA&OoEMfRtA#%CI8!AZQy{d;PP;?Sw)h5 w2^y9u4TEB|QVN_!*SFp|fq0A{0ceyE;`R3IO|iR*?9L#<7{rs%h1P!F-)Qh!VE_OC literal 0 HcmV?d00001 diff --git a/mr/darrowdl.bmp b/mr/darrowdl.bmp new file mode 100755 index 0000000000000000000000000000000000000000..dfb808ea72e3808e245e9c708d08aa74434bf0bd GIT binary patch literal 246 zcmZup!4ZHk2*W!Ea17`0?;2bu0Dtz!TAfOt7{He&ElERCw*8_i0j=oe?TO|zdg33z z3A6ViAf7bF0Egju$vs|ZoEQQ0TNrxGn7O@d#VIjQsoYK^Z)FoiO`C!dvEYnIEr6~c LQVUc{>Je)nq#IRf literal 0 HcmV?d00001 diff --git a/mr/darrowdr.bmp b/mr/darrowdr.bmp new file mode 100755 index 0000000000000000000000000000000000000000..cb276f88d4f6eeed929c3a49b1d31945b7d73bb9 GIT binary patch literal 246 zcmZvS!4-fo2t(_84&WHh;oUXb4TPIL;aZ(akC@Qjl$HeY+4ej2I$$e$89k*rKn?v9 z5W-r!K{2M*8l1r6CwES0JVp@t7Gh^=IcK^KXTY6-oH%+c2P}#lu!sdLqPQ~b{kpr@ Ja2+le@C&iKRcQbK literal 0 HcmV?d00001 diff --git a/mr/darrowl.bmp b/mr/darrowl.bmp new file mode 100755 index 0000000000000000000000000000000000000000..de3a0a7981cce13020a6e362f1d051b999906594 GIT binary patch literal 246 zcmZ{c!41G5329c+_D)+kE& zm!V-<$_O}CX{{ky^cd-#8^GZe%>L!5K-PgHLDnFLn(!{qWOf@Yy*y6Ve+p^1xY)VgrrWYss`i4OVyA#kc;<59LULk#!C;{ Cq+2Nf literal 0 HcmV?d00001 diff --git a/mr/darrowr.bmp b/mr/darrowr.bmp new file mode 100755 index 0000000000000000000000000000000000000000..cfab0896a41b829c9d13157706b3d7645b10f7ce GIT binary patch literal 246 zcmZ{cF%p0v3MJrS#PuwHE91ZLxxno$?D|l_R8K#FJj6H~5 zzl20#jNVYjP)eaIX#IxPGyz8zvj0@Z7girwOkg;VJ2 literal 0 HcmV?d00001 diff --git a/mr/darrowu2.bmp b/mr/darrowu2.bmp new file mode 100755 index 0000000000000000000000000000000000000000..b9fab93a9907c18e3284e59d1e34b07319c5402f GIT binary patch literal 246 zcmbV@u@QhU3xwscc3U wehCwWrF2j^n!A$tRY#>%7mcNfqn{07SD?;Q#;t literal 0 HcmV?d00001 diff --git a/mr/darrowur.bmp b/mr/darrowur.bmp new file mode 100755 index 0000000000000000000000000000000000000000..484fbb7a0e6a053c96bfc4806cc6f7af693726f4 GIT binary patch literal 246 zcmZvT!3}^g2t{k+0FL1t-d%%kV7;|B8LLxqt^b3GF%imtz^B`8DdGTD)biAnW;dGa zpTMEnS^$bR_1-}m!(SSM9SX@6q`Xmc^cJiVv|yE>kybEDu2N1_y-fTkc21m-JRvbU JajBd?aRV-ERN(*s literal 0 HcmV?d00001 diff --git a/mr/mr0.url b/mr/mr0.url index 20b583c28..96d83e03f 100755 --- a/mr/mr0.url +++ b/mr/mr0.url @@ -1,3 +1,5 @@ +#define APPNAME eurocamp +#define QAPPNAME "eurocampo" #include /* mr0 -0 Gestione tabelle */ diff --git a/mr/mr01.bmp b/mr/mr01.bmp new file mode 100755 index 0000000000000000000000000000000000000000..a01b95c1f3816efcccfe047d7395f43ee6096526 GIT binary patch literal 96118 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�{HtYwN2};cX9tYLCpS>Gi*Lc_pmFh!X$cY+ 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 != lin || _calendar->impianto() != imp) - { - if (cf.dirty()) - { - TString str(80); - str = "Il calendario "; - switch (_calendar->tipo()) - { - case 'L': str << "della linea " << _calendar->linea(); break; - case 'I': str << "del impianto " << _calendar->impianto(); break; - default : str << "standard"; break; - } - str << " e' stato modificato:\nsi desidera salvare le modifiche effettuate?"; - if (yesno_box(str)) - _calendar->rewrite(); - } - - _calendar->set(lin, imp); - cf.set_dirty(FALSE); - changed = TRUE; - } - } - cf.set_calendar(_calendar, get_int(F_YEAR)); + cf.set_calendar(&calendar(), get_int(F_YEAR)); return changed; } @@ -93,31 +83,16 @@ bool TMRP_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) switch (o.dlg()) { case F_IMPIANTO: - if (e == fe_close && o.empty()) - { - TConfig ini(CONFIG_DITTA, "mr"); - bool gestione_impianti = ini.get_bool("GESTIMPIANTI"); - if (gestione_impianti) - return error_box("E' necessario specificare un impianto"); - } + break; case F_CODICE: case F_TYPE: if (e == fe_modify) - { - if (init_calendar()) - { - TCalendar_field& cf = (TCalendar_field&)field(F_CALENDAR); - cf.win().force_update(); - } - } + init_calendar(); break; case F_YEAR: if (e == fe_init || e == fe_modify) { - TCalendar_field& cf = (TCalendar_field&)field(F_CALENDAR); - cf.set_calendar(_calendar, get_int(F_YEAR)); - if (is_running()) - cf.win().force_update(); + update_calendar(F_CALENDAR, F_YEAR); } break; default: @@ -129,43 +104,46 @@ bool TMRP_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) bool TMRP_mask::save_calendar() const { - if (_calendar != NULL) - { - TCalendar_field& cf = (TCalendar_field&)field(F_CALENDAR); - if (cf.dirty()) - _calendar->rewrite(); - } + TCalendar_field& cf = (TCalendar_field&)field(F_CALENDAR); + if (cf.dirty()) + calendar().rewrite(); return TRUE; } -bool TMRP_mask::remove_calendar() const +bool TMRP_mask::remove_calendar() { - if (_calendar != NULL) + const TString& tn = app().get_tabname(); + const char tipo = tn[0]; + if (calendar().tipo() != tipo) { - const TString& tn = app().get_tabname(); - const char tipo = tn[0]; - if (_calendar->tipo() != tipo) - { - if (tipo == 'L') - _calendar->set(get(F_CODICE), get(F_IMPIANTO)); - else - _calendar->set(NULL, get(F_CODICE)); - CHECK(_calendar->tipo() == tipo, "Tipo calendario incongruente"); - } - _calendar->remove(); + if (tipo == 'L') + calendar().set(get(F_CODICE), get(F_IMPIANTO)); + else + calendar().set(NULL, get(F_CODICE)); + CHECK(calendar().tipo() == tipo, "Tipo calendario incongruente"); } + calendar().remove(); return TRUE; } TMRP_mask::TMRP_mask(const char* name, int num) - : TCalendar_mask(name, num), _calendar(NULL) + : TCalendar_mask(name, num) { + const TString& tn = app().get_tabname(); + if (tn == "LNP") + { + TConfig ini(CONFIG_DITTA, "mr"); + bool gestione_impianti = ini.get_bool("GESTIMPIANTI"); + if (!gestione_impianti) + { + disable(F_IMPIANTO); + disable(F_DESCIMPIANTO); + } + } } TMRP_mask::~TMRP_mask() { - if (_calendar) - delete _calendar; } /////////////////////////////////////////////////////////// @@ -174,10 +152,13 @@ TMRP_mask::~TMRP_mask() class TMRPtables : public TTable_application { + void read_turni(TMask& m); + void write_turni(const TMask& m); protected: virtual TString& get_mask_name(TString& name) const; virtual TMask* set_mask(TMask* m); + virtual int read(TMask& m); virtual int write(const TMask& m); virtual int rewrite(const TMask& m); virtual bool remove(); @@ -198,8 +179,12 @@ TMask* TMRPtables::set_mask(TMask* m) { if (m == NULL) { + const TString& tn = get_tabname(); TString name; get_mask_name(name); - m = new TMRP_mask(name); + if (tn == "IMP" || tn == "LNP") + m = new TMRP_mask(name); + else + m = new TMask(name); } return TTable_application::set_mask(m); } @@ -219,14 +204,58 @@ void TMRPtables::remove_calendar(const TMask& m) const TString& tn = get_tabname(); if (tn == "IMP" || tn == "LNP") { - const TMRP_mask& cm = (const TMRP_mask&)m; + TMRP_mask& cm = (TMRP_mask&)m; cm.remove_calendar(); } } +void TMRPtables::read_turni(TMask& m) +{ + TUnita_produttiva up(file().curr()); + for (int t=7; t >=0; t--) + { + const id= F_T1HINIZIO+t*5; + m.set(id,up.ora_inizio_turno(t)); + m.set(id+1,up.min_inizio_turno(t)); + m.set(id+2,up.ore_durata_turno(t)); + m.set(id+3,up.min_durata_turno(t)); + m.set(id+4,up.raw_numpers_turno(t)); + } +} +void TMRPtables::write_turni(const TMask& m) +{ + TUnita_produttiva & up=(TUnita_produttiva &)file().curr(); + for (int t=0; t < 8; t++) + { + const id= F_T1HINIZIO+t*5; + up.set_inizio_turno(t, m.get_int(id), m.get_int(id+1)); + up.set_durata_turno(t, m.get_int(id+2), m.get_int(id+3)); + up.set_numpers_turno(t, m.get_int(id+4)); + } +} + +int TMRPtables::read(TMask& m) +{ + const int err = TTable_application::read(m); + if (err == NOERR) + { + const TString& tn = get_tabname(); + if (tn == "IMP"||tn == "LNP" ) + { + read_turni(m); + } + } + return err; +} + int TMRPtables::write(const TMask& m) { + const TString& tn = get_tabname(); + if (tn == "IMP"||tn == "LNP" ) + { + write_turni(m); + } const int err = TTable_application::write(m); if (err == NOERR) save_calendar(m); @@ -235,6 +264,11 @@ int TMRPtables::write(const TMask& m) int TMRPtables::rewrite(const TMask& m) { + const TString& tn = get_tabname(); + if (tn == "IMP"||tn == "LNP" ) + { + write_turni(m); + } const int err = TTable_application::rewrite(m); if (err == NOERR) save_calendar(m); diff --git a/mr/mr0400.cpp b/mr/mr0400.cpp index d409a7983..0e6ec1fa2 100755 --- a/mr/mr0400.cpp +++ b/mr/mr0400.cpp @@ -21,6 +21,15 @@ public: bool TConf_MRP_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { + switch (o.dlg()) + { + case F_YEAR: + if (e == fe_init || e == fe_modify) + update_calendar(F_CALENDAR, F_YEAR); + break; + default: + break; + } return TRUE; } @@ -39,7 +48,6 @@ TConf_MRP_mask::~TConf_MRP_mask() ////////////////////////////////////////////////// class TConf_MRP_application : public TConfig_application { - TMRP_calendar* _calendar; TConf_MRP_mask *_mask; protected: @@ -53,71 +61,62 @@ public: virtual bool user_create(); virtual bool user_destroy(); - TConf_MRP_application() : TConfig_application(CONFIG_DITTA) { _mask = NULL; _calendar = NULL;} + TConf_MRP_application() : TConfig_application(CONFIG_DITTA) { _mask = NULL;} virtual ~TConf_MRP_application() {} }; -bool TConf_MRP_application::preprocess_config (TMask& mask, TConfig& config) +bool TConf_MRP_application::preprocess_config (TMask& mask, TConfig& c) { - TToken_string ora_inizio("",':'); - + TMRP_config& config=(TMRP_config&)c; for (int i = 0; i < NTURNI; i++) { - // Traduce le ore ed i minuti const short h = F_T1HINIZIO+(i*4); - ora_inizio = config.get("TINIZIO","mr", i); - mask.set(h,ora_inizio.get(0)); // Hour... - mask.set(h+1,ora_inizio.get(1)); // Minutes... - const long tdurata = config.get_long("TDURATA", "mr", i); - const int hours = (int)tdurata / 60; // numero di ore - const int minutes = (int)tdurata % 60; // numero di minuti - mask.set(h+2, hours); - mask.set(h+3, minutes); + // inizio turno + mask.set(h , config.ora_inizio_turno(i)); // Hour... + mask.set(h+1, config.min_inizio_turno(i)); // Minutes... + // durata turno + mask.set(h+2, config.ore_durata_turno(i)); + mask.set(h+3, config.min_durata_turno(i)); + mask.set(F_T1NUMPERS+i,config.numpers_turno(i)); } // Carica il calendario - TCalendar_field& cf = (TCalendar_field&)mask.field(F_CALENDAR); - cf.set_calendar(_calendar, mask.get_int(F_YEAR)); - cf.win().force_update(); + ((TCalendar_mask&)mask).update_calendar(F_CALENDAR, F_YEAR); + return TRUE; } -bool TConf_MRP_application::postprocess_config (TMask& mask, TConfig& config) +bool TConf_MRP_application::postprocess_config (TMask& mask, TConfig& c) { - TToken_string ora_inizio("",':'); + TMRP_config& config=(TMRP_config&)c; for (int i = 0; i < NTURNI; i++) { // Traduce le ore ed i minuti const short h = F_T1HINIZIO+(i*4); - ora_inizio.add(mask.get(h),0); // Hour... - ora_inizio.add(mask.get(h+1),1); // Minutes - config.set("TINIZIO",ora_inizio,"mr", TRUE, i); - const int durata_h = mask.get_int(h+2); - const int durata_m = mask.get_int(h+3); - const long minutes = durata_h * 60 + durata_m; - config.set("TDURATA", minutes, "mr", TRUE, i); + config.set_inizio_turno(i,mask.get_int(h) ,mask.get_int(h+1)); + config.set_durata_turno(i,mask.get_int(h+2),mask.get_int(h+3)); + // numero di persone + config.set_numpers_turno(i,mask.get_int(F_T1NUMPERS+i)); } - config.set("GESTIMPIANTI", mask.get_bool(F_GESTIMPIANTI) ? "X" : "", "mr", TRUE); - config.set("NTURNI", mask.get(F_NTURNI), "mr", TRUE); + config.set_gestimpianti(mask.get_bool(F_GESTIMPIANTI)); + config.set_turni(mask.get_int(F_NTURNI)); TString paragraph(config.get_paragraph()); config.set_paragraph(""); // Akkrokkio per salvare il calendario... - _calendar->write(); + ((const TCalendar_mask&)mask).calendar().write(); config.set_paragraph(paragraph); // re-read return TRUE; } + bool TConf_MRP_application::user_create() { TConfig conf(CONFIG_DITTA); conf.set( "EdMask", "mr0400a", "mr"); - _calendar = new TMRP_calendar(); // Calendario standard return TRUE; } bool TConf_MRP_application::user_destroy() { - if (_calendar) - delete _calendar; return TRUE; } diff --git a/mr/mr0400.h b/mr/mr0400.h index 766d8284e..2ac1b5ac3 100755 --- a/mr/mr0400.h +++ b/mr/mr0400.h @@ -35,10 +35,19 @@ #define F_T8MINIZIO 132 #define F_T8HDURATA 133 #define F_T8MDURATA 134 +#define F_T1NUMPERS 135 +#define F_T2NUMPERS 136 +#define F_T3NUMPERS 137 +#define F_T4NUMPERS 138 +#define F_T5NUMPERS 139 +#define F_T6NUMPERS 140 +#define F_T7NUMPERS 141 +#define F_T8NUMPERS 142 #define F_YEAR 201 #define F_CALENDAR 202 - +#define F_DEFAULT_IMP 203 +#define F_DEFAULT_LNP 204 #endif diff --git a/mr/mr0400a.uml b/mr/mr0400a.uml index 84d38faa7..ce019b65a 100755 --- a/mr/mr0400a.uml +++ b/mr/mr0400a.uml @@ -18,10 +18,37 @@ PAGE "Parametri ditta" -1 -1 65 15 BOOLEAN F_GESTIMPIANTI BEGIN - PROMPT 2 2 "Gestione impianti " - FIELD GESTIMPIANTI + PROMPT 2 1 "Gestione impianti " + FIELD GESTIMPIANTI + MESSAGE TRUE SHOW,F_DEFAULT_IMP + MESSAGE FALSE HIDE,F_DEFAULT_IMP END +STRING F_DEFAULT_LNP 5 +BEGIN + PROMPT 2 2 "Linea di default " + FIELD DEFAULT_CODLIN + USE LNP + INPUT CODTAB F_DEFAULT_LNP + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_DEFAULT_LNP CODTAB + OUTPUT F_DEFAULT_IMP S6 +END + +STRING F_DEFAULT_IMP 5 +BEGIN + PROMPT 42 2 "Impianto di default " + FIELD DEFAULT_CODIMP + USE IMP + INPUT CODTAB F_DEFAULT_IMP + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_DEFAULT_IMP CODTAB +END + + + LISTBOX F_NTURNI 3 BEGIN PROMPT 2 4 "Numero turni " @@ -50,11 +77,12 @@ BEGIN NUM_EXPR {(#THIS_FIELD <= 23)} WARNING "Ora non valida" FLAGS "Z" + CHECKTYPE REQUIRED END NUMBER F_T1MINIZIO 2 BEGIN - PROMPT 30 5 "" + PROMPT 30 5 ":" NUM_EXPR {(#THIS_FIELD <= 59)} WARNING "Ora non valida" FLAGS "Z" @@ -66,16 +94,22 @@ BEGIN NUM_EXPR {(#THIS_FIELD <= 23)} WARNING "Ora non valida" FLAGS "Z" + CHECKTYPE REQUIRED END NUMBER F_T1MDURATA 2 BEGIN - PROMPT 47 5 "" + PROMPT 47 5 ":" NUM_EXPR {(#THIS_FIELD <= 59)} WARNING "Ora non valida" FLAGS "Z" END +NUMBER F_T1NUMPERS 3 +BEGIN + PROMPT 52 5 "Persone impiegate " +END + NUMBER F_T2HINIZIO 2 BEGIN PROMPT 2 6 "Ora inizio secondo turno " @@ -87,7 +121,7 @@ END NUMBER F_T2MINIZIO 2 BEGIN - PROMPT 30 6 "" + PROMPT 30 6 ":" GROUP 2 12 13 14 15 16 17 18 28 NUM_EXPR {(#THIS_FIELD <= 59)} WARNING "Ora non valida" @@ -105,13 +139,19 @@ END NUMBER F_T2MDURATA 2 BEGIN - PROMPT 47 6 "" + PROMPT 47 6 ":" GROUP 2 12 13 14 15 16 17 18 28 NUM_EXPR {(#THIS_FIELD <= 59)} WARNING "Ora non valida" FLAGS "Z" END +NUMBER F_T2NUMPERS 3 +BEGIN + PROMPT 52 6 "Persone impiegate " + GROUP 2 12 13 14 15 16 17 18 28 +END + NUMBER F_T3HINIZIO 2 BEGIN PROMPT 2 7 "Ora inizio terzo turno " @@ -123,7 +163,7 @@ END NUMBER F_T3MINIZIO 2 BEGIN - PROMPT 30 7 "" + PROMPT 30 7 ":" GROUP 3 13 14 15 16 17 18 28 38 NUM_EXPR {(#THIS_FIELD <= 59)} WARNING "Ora non valida" @@ -141,13 +181,19 @@ END NUMBER F_T3MDURATA 2 BEGIN - PROMPT 47 7 "" + PROMPT 47 7 ":" GROUP 3 13 14 15 16 17 18 28 38 NUM_EXPR {(#THIS_FIELD <= 59)} WARNING "Ora non valida" FLAGS "Z" END +NUMBER F_T3NUMPERS 3 +BEGIN + PROMPT 52 7 "Persone impiegate " + GROUP 3 13 14 15 16 17 18 28 38 +END + NUMBER F_T4HINIZIO 2 BEGIN @@ -160,7 +206,7 @@ END NUMBER F_T4MINIZIO 2 BEGIN - PROMPT 30 8 "" + PROMPT 30 8 ":" GROUP 4 14 15 16 17 18 28 38 48 NUM_EXPR {(#THIS_FIELD <= 59)} WARNING "Ora non valida" @@ -178,13 +224,19 @@ END NUMBER F_T4MDURATA 2 BEGIN - PROMPT 47 8 "" + PROMPT 47 8 ":" GROUP 4 14 15 16 17 18 28 38 48 NUM_EXPR {(#THIS_FIELD <= 59)} WARNING "Ora non valida" FLAGS "Z" END +NUMBER F_T4NUMPERS 3 +BEGIN + PROMPT 52 8 "Persone impiegate " + GROUP 4 14 15 16 17 18 28 38 48 +END + NUMBER F_T5HINIZIO 2 BEGIN PROMPT 2 9 "Ora inizio quinto turno " @@ -196,7 +248,7 @@ END NUMBER F_T5MINIZIO 2 BEGIN - PROMPT 30 9 "" + PROMPT 30 9 ":" GROUP 5 15 16 17 18 28 38 48 58 NUM_EXPR {(#THIS_FIELD <= 59)} WARNING "Ora non valida" @@ -214,13 +266,19 @@ END NUMBER F_T5MDURATA 2 BEGIN - PROMPT 47 9 "" + PROMPT 47 9 ":" GROUP 5 15 16 17 18 28 38 48 58 NUM_EXPR {(#THIS_FIELD <= 59)} WARNING "Ora non valida" FLAGS "Z" END +NUMBER F_T5NUMPERS 3 +BEGIN + PROMPT 52 9 "Persone impiegate " + GROUP 5 15 16 17 18 28 38 48 58 +END + NUMBER F_T6HINIZIO 2 BEGIN PROMPT 2 10 "Ora inizio sesto turno " @@ -232,7 +290,7 @@ END NUMBER F_T6MINIZIO 2 BEGIN - PROMPT 30 10 "" + PROMPT 30 10 ":" GROUP 6 16 17 18 28 38 48 58 68 NUM_EXPR {(#THIS_FIELD <= 59)} WARNING "Ora non valida" @@ -250,13 +308,19 @@ END NUMBER F_T6MDURATA 2 BEGIN - PROMPT 47 10 "" + PROMPT 47 10 ":" GROUP 6 16 17 18 28 38 48 58 68 NUM_EXPR {(#THIS_FIELD <= 59)} WARNING "Ora non valida" FLAGS "Z" END +NUMBER F_T6NUMPERS 3 +BEGIN + PROMPT 52 10 "Persone impiegate " + GROUP 6 16 17 18 28 38 48 58 68 +END + NUMBER F_T7HINIZIO 2 BEGIN PROMPT 2 11 "Ora inizio settimo turno " @@ -268,7 +332,7 @@ END NUMBER F_T7MINIZIO 2 BEGIN - PROMPT 30 11 "" + PROMPT 30 11 ":" GROUP 7 17 18 28 38 48 58 68 78 NUM_EXPR {(#THIS_FIELD <= 59)} WARNING "Ora non valida" @@ -286,13 +350,18 @@ END NUMBER F_T7MDURATA 2 BEGIN - PROMPT 47 11 "" + PROMPT 47 11 ":" GROUP 7 17 18 28 38 48 58 68 78 NUM_EXPR {(#THIS_FIELD <= 59)} WARNING "Ora non valida" FLAGS "Z" END +NUMBER F_T7NUMPERS 3 +BEGIN + PROMPT 52 11 "Persone impiegate " + GROUP 7 17 18 28 38 48 58 68 78 +END NUMBER F_T8HINIZIO 2 BEGIN @@ -305,7 +374,7 @@ END NUMBER F_T8MINIZIO 2 BEGIN - PROMPT 30 12 "" + PROMPT 30 12 ":" GROUP 8 18 28 38 48 58 68 78 NUM_EXPR {(#THIS_FIELD <= 59)} WARNING "Ora non valida" @@ -323,13 +392,20 @@ END NUMBER F_T8MDURATA 2 BEGIN - PROMPT 47 12 "" + PROMPT 47 12 ":" GROUP 8 18 28 38 48 58 68 78 NUM_EXPR {(#THIS_FIELD <= 59)} WARNING "Ora non valida" FLAGS "Z" END +NUMBER F_T8NUMPERS 3 +BEGIN + PROMPT 52 12 "Persone impiegate " + GROUP 8 18 28 38 48 58 68 78 +END + + ENDPAGE PAGE "Calendario" -1 -1 65 15 @@ -337,7 +413,7 @@ PAGE "Calendario" -1 -1 65 15 NUMBER F_YEAR 4 BEGIN PROMPT 1 1 "Anno " - FLAGS "AD" + FLAGS "A" END CALENDAR F_CALENDAR -3 -1 diff --git a/mr/mr1.url b/mr/mr1.url index c87eba8ca..b77732e26 100755 --- a/mr/mr1.url +++ b/mr/mr1.url @@ -1,5 +1,5 @@ -#define APPNAME EURO_MR -#define QAPPNAME "EURO_MR" +#define APPNAME eurocamp +#define QAPPNAME "eurocampo" #include /* mr1 -0 Generazione MRP Reports */ diff --git a/mr/mr2.url b/mr/mr2.url index 290e76747..e55a6b25b 100755 --- a/mr/mr2.url +++ b/mr/mr2.url @@ -1,5 +1,5 @@ -#define APPNAME EURO_MR -#define QAPPNAME "EURO_MR" +#define APPNAME eurocamp +#define QAPPNAME "eurocamp" #include #include "mr2url.h" diff --git a/mr/mr2200.cpp b/mr/mr2200.cpp index 2976710cc..68c618d76 100755 --- a/mr/mr2200.cpp +++ b/mr/mr2200.cpp @@ -16,6 +16,10 @@ #include "mr2200a.h" #include "mr2200b.h" +// albero per le ricerche sulle dist +TDistinta_tree _dist_tree; +// funzioni di ricerca distinta master +bool distinta_master(const char *code); const real MAXCAPACITY("999999999.99"); /////////////////////////////////////////////////////////// @@ -70,7 +74,7 @@ public: int _numrig; real _qta; real _price; - + virtual TObject* dup() const; TMSP_record() : _numdoc(0L), _numrig(0) { } }; @@ -87,6 +91,7 @@ public: int last() const { return _buckets.last(); } int pred(int i) const { return _buckets.pred(i); } + virtual TMSP_record_array& operator=(const TMSP_record_array& a); TMSP_record& operator[](int b); }; @@ -234,6 +239,22 @@ public: virtual ~TMaster_code() {} }; +class TMSP_line2 : public TObject +{ + bool _used; + TMSP_constraint *_constraint; + TArray _mastercodes; +public: + bool used() {return _used;} + void set_use(bool on) {_used=on;} + void add_mastercode (TMaster_code *); + TMaster_code *get_mastercode (int i=0); + TMSP_constraint &constraint() {return *_constraint;} + TMSP_line2(const TMSP_constraint &c); + virtual ~TMSP_line2() {} +}; + + class TMSP_constraints : public TMRP_array { protected: @@ -259,7 +280,8 @@ class TMSP_constraint : public TSortable TString _desc; bool _on_sheet; - TArray _mastercodes; // codici di livello 2 per articoli NON master + bool _check_master; + TArray _lines2; // 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; @@ -280,20 +302,27 @@ public: 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); + int find_distinta_master(const TMSP_constraint & constr, TString & master, TString & livmaster,TString & um,real & expr, TString & imp,TString & lin,TString & magdep, int fromindex=0); + void set_mastercode_check(bool on); + bool mastercodes2check() const ; + + TMSP_line2 * use_mspline2(TMSP_constraint&line); + TMSP_line2 * use_mspline2(TToken_string &row, TSheet_field & sf); + void discard_line2(TMSP_line2 * ); + void reset_unused_line2(); + TMSP_line2 * get_unused_line2(); + + TMSP_constraint* add_upperline(const 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 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); + 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; } @@ -305,16 +334,17 @@ public: const TString& giac, const TString& imp, const TString& lin, const TString& mag); - TMSP_constraint(TMSP_constraint & cons); + TMSP_constraint(const 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); + 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); @@ -334,7 +364,7 @@ public: 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* find(const TToken_string& row, bool create=FALSE); TMSP_line& operator[](long i) const { return (TMSP_line&)find_obj(i); } @@ -344,7 +374,6 @@ public: class TMSP_mask : public TCalendar_mask { - TCodgiac_livelli _livelli; // quantità provenienti dai documenti "ordine": TMSP_constraints _constraints; @@ -359,10 +388,6 @@ class TMSP_mask : public TCalendar_mask // 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); @@ -390,23 +415,20 @@ protected: 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); + int find_constr_row(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); + bool do_test_art_row(int r, int c, bool signal); + void do_test_art_2ndlevel(TMSP_line2 *mspline, bool erase=FALSE); + 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 , @@ -477,6 +499,17 @@ public: }; +/////////////////////////////////////////////////////////// +TObject* TMSP_record::dup() const +{ + TMSP_record* o=new TMSP_record(); + o->_numdoc=_numdoc; + o->_numrig=_numrig; + o->_qta=_qta; + o->_price=_price; + return o; +} + /////////////////////////////////////////////////////////// TMSP_record& TMSP_record_array::operator[](int b) { @@ -490,6 +523,13 @@ TMSP_record& TMSP_record_array::operator[](int b) return *rec; } +TMSP_record_array& TMSP_record_array::operator=(const TMSP_record_array& a) +{ + _buckets = a._buckets; + return *this; +} + + /////////////////////////////////////////////////////////// @@ -684,6 +724,29 @@ TMaster_code::TMaster_code(const char *code, const char *liv,const char *ummaste } +/////////////////////////////////////////////////////////// +// TMSP_line2 +/////////////////////////////////////////////////////////// + +void TMSP_line2::add_mastercode (TMaster_code *mc) +{ + _mastercodes.add(mc); +} + +TMaster_code *TMSP_line2::get_mastercode (int i) +{ + if (i>=0 && i < _mastercodes.items()) + return (TMaster_code *) _mastercodes.objptr(i); + return NULL; +} + +TMSP_line2::TMSP_line2(const TMSP_constraint &c) +{ + _constraint = new TMSP_constraint(c); + *_constraint = c; +} + + /////////////////////////////////////////////////////////// // TMSP_constraint /////////////////////////////////////////////////////////// @@ -711,9 +774,8 @@ int TMSP_constraint::compare(const TSortable& s) const // 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) +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); @@ -725,8 +787,8 @@ void TMSP_constraint::fill_sheet_row(TToken_string& row, const TMSP_mask & m, bo 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); + if (livelli_giac().enabled(l)) + row.add(livelli_giac().unpack_grpcode(liv,l),F_LIV1+l-1-FIRST_FIELD); else row.add(" ",F_LIV1+l-1-FIRST_FIELD); } @@ -755,7 +817,7 @@ void TMSP_constraint::fill_sheet_row(TToken_string& row, const TMSP_mask & m, bo needs=price(bu); row.add(needs.string(), bu*2+F_BUCKET0+1-FIRST_FIELD); } - row.add(has_mastercodes() ? "M" : " ",F_MASTERCODE-FIRST_FIELD); + row.add(mastercodes2check() ? "M" : " ",F_MASTERCODE-FIRST_FIELD); } bool TMSP_constraint::riga(int buck, long& ndoc, int& nrig) @@ -773,29 +835,148 @@ void TMSP_constraint::set_riga(int buck, long ndoc, int nrig) b._numrig = nrig; } -bool TMSP_constraint::has_mastercodes() const +int TMSP_constraint::find_distinta_master(const TMSP_constraint & constr, TString & master,TString & livmaster,TString & um, real & expr, TString & imp,TString & lin,TString & magdep, int fromindex) { - return _mastercodes.items()>0; + TArray sons; + if (_dist_tree.set_root(constr.codice())) + { + _dist_tree.set_global("_LIVELLO",constr.livgiac()); + _dist_tree.set_global("_IMPIANTO",constr.codimp()); + _dist_tree.set_global("_LINEA",constr.codlin()); + _dist_tree.set_global("_MAGAZZINO",constr.codmag()); + _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; } -void TMSP_constraint::add_mastercode(TMaster_code *mc) + +bool TMSP_constraint::mastercodes2check() const { - _mastercodes.add(mc); + return _check_master; } -TMaster_code *TMSP_constraint::get_mastercode(int i) +void TMSP_constraint::set_mastercode_check(bool on) { - if (i>=0 && i < _mastercodes.items()); - return (TMaster_code *) _mastercodes.objptr(i); + _check_master=on; +} + +TMSP_line2 *TMSP_constraint::use_mspline2(TToken_string & row, TSheet_field & sf) +{ + TString16 liv; + TString8 mag,imp,lin; + long codcli=row.get_long(F_CLIENTE-FIRST_FIELD); + livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV1)),1); + livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV2)),2); + livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV3)),3); + livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV4)),4); + imp=row.get(sf.cid2index(F_CODIMP)); + lin=row.get(sf.cid2index(F_CODLIN)); + add_magcode(mag, row.get(sf.cid2index(F_MAGAZZINO))); + add_depcode(mag, row.get(sf.cid2index(F_DEPOSITO))); + codcli=row.get_long(F_CLIENTE-FIRST_FIELD); + TMSP_line mspline(codcli, codice(), liv, imp, lin, mag); + for (int b= 1 ; b< LAST_BUCKET ; b++) + { + real q(row.get(sf.cid2index(F_BUCKET0+b*2))); + mspline.qta(b) = q; + } + return use_mspline2(mspline); +} + + + +TMSP_line2 *TMSP_constraint::use_mspline2(TMSP_constraint &line) +{ + TMSP_line2 *a=NULL; + for (int i=_lines2.items()-1; i>=0 && a==NULL; i--) + { + a=(TMSP_line2 *) _lines2.objptr(i); + if (a->constraint() != line) + a=NULL; + } + if (a == NULL) + { + TString master; + TString4 ummaster; + TString16 livmaster; + TString8 impmaster(codimp()), linmaster(codlin()),magmaster(codmag()); + real expr; + int dm=0; + while ((dm=find_distinta_master(line, master, livmaster, ummaster, expr, impmaster, linmaster, magmaster,dm)+1) >0) + { + if (a == NULL) + { + a = new TMSP_line2(line); + _lines2.add(a); + } + a->add_mastercode(new TMaster_code (master, livmaster, ummaster, expr, cache().get(LF_ANAMAG,master).get_real(ANAMAG_GIORNIRIOR), codimp(), codlin(), codmag())); + } + } + if (a) + { + a->set_use(TRUE); + a->constraint() = line; + } + return a; +} + +void TMSP_constraint::reset_unused_line2() +{ + TMSP_line2 *a; + for (int i=_lines2.items()-1; i>=0; i--) + { + a=(TMSP_line2 *) _lines2.objptr(i); + a->set_use(FALSE); + } +} + +TMSP_line2 * TMSP_constraint::get_unused_line2() +{ + TMSP_line2 *a; + for (int i=_lines2.items()-1; i>=0; i--) + { + a=(TMSP_line2 *) _lines2.objptr(i); + if (!a->used()) + return a; + } return NULL; } +void TMSP_constraint::discard_line2(TMSP_line2 * l) +{ + TMSP_line2 *a; + int i=_lines2.items(); + while (--i>=0) + { + a=(TMSP_line2 *) _lines2.objptr(i); + if (a==l) + { + _lines2.destroy(i,TRUE); + break; + } + } +} + bool TMSP_constraint::has_upperlines() const { return _upperlines.items()>0; } -void TMSP_constraint::add_upperline(TMSP_constraint& mc) +TMSP_constraint * TMSP_constraint::add_upperline(const TMSP_constraint& mc) { if (_upperlines.items()==0) { @@ -804,7 +985,7 @@ void TMSP_constraint::add_upperline(TMSP_constraint& mc) codimp(),codlin(),codmag(),TRUE); *myself=*this; } - _upperlines.find(mc.cliente(), mc.codice(), mc.livgiac(), + return _upperlines.find(mc.cliente(), mc.codice(), mc.livgiac(), mc.codimp(),mc.codlin(),mc.codmag(),TRUE); } @@ -821,7 +1002,7 @@ TMSP_constraint & TMSP_constraint::operator=(const TMSP_constraint & line) _giac=line.livgiac(); _imp=line.codimp(); _lin=line.codlin(); - _mag=line.codmag(); + _mag=line.codmag(); _on_sheet=_on_sheet; _desc=line.desc(); _bucket_qta=line._bucket_qta; @@ -836,13 +1017,13 @@ TMSP_constraint::TMSP_constraint(long cliente, const TString& lin, const TString& mag) : _cliente(cliente), _codart(codart), _giac(giac), - _imp(imp), _lin(lin), _mag(mag),_on_sheet(FALSE) + _imp(imp), _lin(lin), _mag(mag),_on_sheet(FALSE),_check_master(FALSE) { } -TMSP_constraint::TMSP_constraint(TMSP_constraint & line) +TMSP_constraint::TMSP_constraint(const 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()) + _check_master(FALSE), _desc(line.desc()) { } @@ -890,7 +1071,7 @@ TMSP_constraint* TMSP_constraints::find(long cliente, /////////////////////////////////////////////////////////// -void TMSP_line::fill_sheet_row(TToken_string& row, const TMSP_mask & m, bool codes_only) +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); @@ -941,7 +1122,7 @@ TMSP_line* TMSP_lines::find(long cliente, return (TMSP_line*)s; } -TMSP_line* TMSP_lines::find(const TToken_string& row, TCodice_livelli & livelli ,bool create) +TMSP_line* TMSP_lines::find(const TToken_string& row, bool create) { TString80 str,giaclev; _key.cut(0); @@ -955,9 +1136,9 @@ TMSP_line* TMSP_lines::find(const TToken_string& row, TCodice_livelli & livelli case F_LIV1: case F_LIV2: case F_LIV3: - livelli.pack_grpcode(giaclev, str, i+FIRST_FIELD-F_LIV1+1); break; + livelli_giac().pack_grpcode(giaclev, str, i+FIRST_FIELD-F_LIV1+1); break; case F_LIV4: - livelli.pack_grpcode(giaclev, str, 4); + livelli_giac().pack_grpcode(giaclev, str, 4); giaclev.trim(); _key.add(giaclev); break; // Concatena i livelli @@ -1152,8 +1333,6 @@ int TRiga_articolo::order_compare( const TToken_string &r1 , const TToken_strin // 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()) @@ -1161,13 +1340,11 @@ void complete_codlinea(TToken_string &r2, bool ignore_imp) 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))) + 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); + TRiga_esplosione * l=_dist_tree.first_critical_labor(labors); if (l) { TLavorazione *curr_labor=TDistinta_tree::find_labor(l); @@ -1195,6 +1372,13 @@ void complete_codlinea(TToken_string &r2, bool ignore_imp) } } +bool distinta_master(const char *code) +{ + const TRectype &rec=cache().get(LF_DIST,code); + if (rec.empty()) + return FALSE; + return rec.get_bool("MASTER"); +} int TRiga_articolo::order_compare(TSheet_field & s, int i1, int i2, int level) { @@ -1333,18 +1517,22 @@ int TMSP_mask::round_date(TDate& date, bool up) const // 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; - + if (bucket_size>1) // non vado a giorni + { + 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 + int bucket; + if (days<0) + bucket = -1; + else + bucket = days / bucket_size; + if (up || days<0) // 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; } @@ -1532,7 +1720,7 @@ bool TMSP_mask::carica_documenti() if (qta > ZERO) { const TCodice_articolo art = riga.get(RDOC_CODARTMAG); - const TString16 liv = _livelli.enabled() ? riga.get(RDOC_LIVELLO) : ""; + const TString16 liv = livelli_giac().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); @@ -1552,21 +1740,7 @@ bool TMSP_mask::carica_documenti() 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)); - } - } - } + line->set_mastercode_check(two_level && !distinta_master(art)); } else { line = _articles. find(cli, art, liv, imp, lin, mag, TRUE); } @@ -1673,7 +1847,7 @@ TMSP_constraint* TMSP_mask::find_constraint(const TMSP_line& l, bool force_inser return c; } -int TMSP_mask::find_constr_row(const TMSP_constraint& c) +int TMSP_mask::find_constr_row(TMSP_constraint& cons) { TSheet_field& sf = sfield(F_ARTICOLI); const int maxart=sf.items(); @@ -1681,10 +1855,10 @@ int TMSP_mask::find_constr_row(const TMSP_constraint& c) { TToken_string &row=sf.row(r); 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); + livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV1)),1); + livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV2)),2); + livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV3)),3); + livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV4)),4); TString16 imp(row.get(sf.cid2index(F_CODIMP)));imp.trim(); TString16 lin(row.get(sf.cid2index(F_CODLIN)));lin.trim(); TString16 mag; @@ -1692,24 +1866,37 @@ int TMSP_mask::find_constr_row(const TMSP_constraint& c) add_depcode(mag, row.get(sf.cid2index(F_DEPOSITO ))); if (sf.cell_disabled(r, sf.cid2index(F_BUCKET1))) { - if (c.cliente()==row.get_long(sf.cid2index(F_CLIENTE)) && - c.codice() == row.get(sf.cid2index(F_ARTICOLO)) && - c.livgiac() == liv&& - c.codimp()== imp && - c.codlin()==lin && - c.codmag()==mag ) + if (cons.cliente()==row.get_long(sf.cid2index(F_CLIENTE)) && + cons.codice() == row.get(sf.cid2index(F_ARTICOLO)) && + cons.livgiac() == liv&& + cons.codimp()== imp && + cons.codlin()==lin && + cons.codmag()==mag ) return r; else r+=2; } } - return -1; + // 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); + return sf.items()-3; } void TMSP_mask::fill_sheet() { - //TSheet_field& su = sfield(F_TESTE); TSheet_field& sl = sfield(F_LINEE); TSheet_field& sf = sfield(F_ARTICOLI); @@ -1803,37 +1990,6 @@ void TMSP_mask::fill_sheet() 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) @@ -1982,10 +2138,10 @@ void TMSP_mask::pack_article_sheet() 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); + livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV1)),1); + livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV2)),2); + livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV3)),3); + livelli_giac().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)); @@ -2065,7 +2221,7 @@ void TMSP_mask::add_MRP_bucket(TMRP_line& new_article, int nbucket, const real & new_article.add_sched_rec(t, curr_arts ); } - +// propone secondo la logica FirstFit o JIT void TMSP_mask::propose_1stJIT(TMSP_logic logic, bool check_machine, bool check_human) { const bool useextralines=get_bool(F_USENONSTDLIN_MSP); @@ -2107,94 +2263,6 @@ void TMSP_mask::propose_1stJIT(TMSP_logic logic, bool check_machine, bool check_ _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 ) @@ -2238,7 +2306,7 @@ bool TMSP_mask::general_review(bool check_machine, bool check_human, bool useext // 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; + TCRP_line *crpline_lin,*crpline_imp,*crpline_firm; const int lastbuck =mrpline.last_bucket(); for (int bucket=0; bucket<=lastbuck ; bucket++) { @@ -2287,9 +2355,9 @@ bool TMSP_mask::general_review(bool check_machine, bool check_human, bool useext linea_prod= cache().get("LNP",curr_labor->cod_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_lin=_capacities.find(linea_prod); + if (crpline_lin==NULL) + crpline_lin=compute_capacity(linea_prod,useextralines, useextrahours); crpline_imp =_capacities.find(linea_prod.codimp()); crpline_firm=_capacities.find(); int human_level=1; @@ -2301,13 +2369,13 @@ bool TMSP_mask::general_review(bool check_machine, bool check_human, bool useext 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); + capacity = check_machine ? crpline_lin->capacity(nbucket) : MAXCAPACITY; + load = crpline_lin->load(nbucket); switch (human_level) { case 3: - hcapacity = crpline->human_capacity(nbucket) ; - hload = crpline->human_load(nbucket); + hcapacity = crpline_lin->human_capacity(nbucket) ; + hload = crpline_lin->human_load(nbucket); break; case 2: hcapacity = crpline_imp->human_capacity(nbucket) ; @@ -2348,13 +2416,13 @@ bool TMSP_mask::general_review(bool check_machine, bool check_human, bool useext // aggiunge il carico macchina art_per_buck-=curr_arts; load= curr_arts * unit_load; - crpline->add_load(nbucket, load ); + crpline_lin->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 ); + crpline_lin->add_human_load(nbucket, load ); case 2: crpline_imp->add_human_load(nbucket, load ); default: @@ -2436,8 +2504,8 @@ TCRP_line *TMSP_mask::compute_capacity(TLinea_prod &lineaprod, bool useextraline 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); + TCRP_line *crpline_lin,*crpline_imp,*crpline_firm; + crpline_lin =_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); @@ -2463,15 +2531,15 @@ TCRP_line *TMSP_mask::compute_capacity(TLinea_prod &lineaprod, bool useextraline cal_firm.add_oreuomo(human_firm, data_buck,useextrahours); ++data_buck; } - crpline->set_capacity(b,capacity); + crpline_lin->set_capacity(b,capacity); if (human > ZERO) { - crpline->set_human_capacity(b,human); + crpline_lin->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); + crpline_lin->set_human_capacity(b,ZERO); if (human_imp > ZERO) { crpline_imp->set_human_capacity(b,human_imp+crpline_imp->human_capacity(b)); @@ -2482,7 +2550,7 @@ TCRP_line *TMSP_mask::compute_capacity(TLinea_prod &lineaprod, bool useextraline if (human_firm > ZERO) crpline_firm->set_human_capacity(b,human_firm+crpline_firm->human_capacity(b)); } - return crpline; + return crpline_lin; } TMRP_line* TMSP_mask::find_propose( @@ -2499,10 +2567,10 @@ void TMSP_mask::msprow2codes(TToken_string &row,long &clifor, TCodice_articolo & { 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); + livelli_giac().pack_grpcode(liv, row.get(F_LIV1-FIRST_FIELD),1); + livelli_giac().pack_grpcode(liv, row.get(F_LIV2-FIRST_FIELD),2); + livelli_giac().pack_grpcode(liv, row.get(F_LIV3-FIRST_FIELD),3); + livelli_giac().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(); @@ -2513,12 +2581,13 @@ void TMSP_mask::msprow2codes(TToken_string &row,long &clifor, TCodice_articolo & 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); + 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); + //livelli_giac().pack_grpcode(liv, row.get(F_LIV1-FIRST_FIELD),1); + //livelli_giac().pack_grpcode(liv, row.get(F_LIV2-FIRST_FIELD),2); + //livelli_giac().pack_grpcode(liv, row.get(F_LIV3-FIRST_FIELD),3); + //livelli_giac().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(); @@ -2701,19 +2770,22 @@ int TMSP_mask::init_bucket0(TArticolo_giacenza &art, int r) 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); + livelli_giac().pack_grpcode(livello, giac_row.get(sf.cid2index(F_LIV1)),1); + livelli_giac().pack_grpcode(livello, giac_row.get(sf.cid2index(F_LIV2)),2); + livelli_giac().pack_grpcode(livello, giac_row.get(sf.cid2index(F_LIV3)),3); + livelli_giac().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) + { + real giac=art.giacenza_anno(codmag, livello, get_date(F_DADATA).year()); prog_giac +=giac; - prog_giac += giac_row.get(b0); + } + // ??? prog_giac += giac_row.get(b0); + prog_giac -= ord_row.get(b0); giac_row.add(prog_giac.val().string(), b0); do_test_art_row(r,c,FALSE); @@ -2760,65 +2832,91 @@ bool TMSP_mask::do_test_art_row(int r, int c, bool signal) 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))); + TString8 mag,imp,lin; + long codcli=constr_row.get_long(F_CLIENTE-FIRST_FIELD); + livelli_giac().pack_grpcode(liv, constr_row.get(sf.cid2index(F_LIV1)),1); + livelli_giac().pack_grpcode(liv, constr_row.get(sf.cid2index(F_LIV2)),2); + livelli_giac().pack_grpcode(liv, constr_row.get(sf.cid2index(F_LIV3)),3); + livelli_giac().pack_grpcode(liv, constr_row.get(sf.cid2index(F_LIV4)),4); + imp=constr_row.get(sf.cid2index(F_CODIMP)); + lin=constr_row.get(sf.cid2index(F_CODLIN)); + add_magcode(mag, constr_row.get(sf.cid2index(F_MAGAZZINO))); + add_depcode(mag, constr_row.get(sf.cid2index(F_DEPOSITO))); + TMSP_constraint*currconstr=_constraints.find(codcli, codart, liv, imp, lin, mag); - 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_line2 *art2ndlev; + currconstr->reset_unused_line2(); + while (r>c) { - 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"); + TToken_string & curr_row=sf.row(r); + // aggancia i master di 2' livello + if (art2ndlev=currconstr->use_mspline2(curr_row, sf)) + do_test_art_2ndlevel(art2ndlev); + r--; + } + while (art2ndlev=currconstr->get_unused_line2()) + { + do_test_art_2ndlevel(art2ndlev,TRUE); + currconstr->discard_line2(art2ndlev); + } + } + return signal == FALSE; +} - int mrow= find_constr_row(*line_master); - real q2make(giac_row.get(sf.cid2index(F_BUCKET0))); - for (int b = 1; b <= LAST_BUCKET; b++) +void TMSP_mask::do_test_art_2ndlevel(TMSP_line2 *art2ndlev, bool erase) +{ + TSheet_field& sf = sfield(F_ARTICOLI); + TMask & smask= sf.sheet_mask(); + int i=0; + TMaster_code *mc; + while ((mc=art2ndlev->get_mastercode(i++))!=NULL) + { + TMSP_constraint* master_constr=_constraints.find(art2ndlev->constraint().cliente(),mc->articolo() + , mc->livello(), mc->codimp(), mc->codlin(), mc->codmag()); + if (master_constr==NULL) + { + master_constr=_constraints.find(art2ndlev->constraint().cliente(),mc->articolo(), mc->livello(), mc->codimp(), mc->codlin(), mc->codmag(),TRUE); + } + + int mrow= find_constr_row(*master_constr); + TMSP_constraint* upperline=master_constr->get_upperline(art2ndlev->constraint()); + real difference; + bool changed=FALSE; + for (int b = 1; b <= LAST_BUCKET; b++) + { + const real r2=mc->leadtime()/days_per_bucket()+0.5; + const int b2=b-int(r2.integer()); + if (b2>=0) { - const int b2=b-int(long(mc->leadtime()/days_per_bucket()+0.5)); - if (b2>=0) + if (!erase) + difference= art2ndlev->constraint().qta(b2)*mc->expr(); + if (upperline) + difference -= upperline->qta(b2); + else + upperline = master_constr->add_upperline(art2ndlev->constraint()); + if (difference != ZERO) { - 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; - + upperline->qta(b2) = upperline->qta(b2) + difference; + master_constr->qta(b2) = master_constr->qta(b2) + difference; + // ricostruisce il vincolo della linea master sullo sheet TToken_string &master_row=sf.row(mrow); - master_row.add(line_master->qta(b2).string(),sf.cid2index(F_BUCKET0+b2*2)); + master_row.add(master_constr->qta(b2).string(),sf.cid2index(F_BUCKET0+b2*2)); + changed=TRUE; } } + } + if (changed) + { sf.force_update(mrow); int first,last; TRiga_articolo::find_block(sf, mrow+2, first, last); - do_test_art_row(last, first, signal); + do_test_art_row(last, first, FALSE); } } - return c-2; } - bool TMSP_mask::test_art_row(int r, bool signal) { TSheet_field& sf = sfield(F_ARTICOLI); @@ -2907,7 +3005,7 @@ void TMSP_mask::salva_documenti() FOR_EACH_SHEET_ROW(sf, r, row) if (!sf.cell_disabled(r, b1)) { - TMSP_line& line = *_articles.find(*row, _livelli, TRUE); + TMSP_line& line = *_articles.find(*row, TRUE); const real& old = line.qta(b); const real val = row->get(b0 + b*2); @@ -3196,7 +3294,7 @@ bool TMSP_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { const TSheet_field& s = sfield(F_ARTICOLI); TMSPCheck_mask cm(this); - cm.disable(-G_MOVIMENTO); + //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)); @@ -3292,7 +3390,7 @@ TMSP_mask::TMSP_mask() sf.set_append(FALSE); for (short l = 0; l < 4; l++) - _livelli.set_sheetcolumn(sf, F_LIV1+l, l+1); + livelli_giac().set_sheetcolumn(sf, F_LIV1+l, l+1); TConfig ini(CONFIG_DITTA, "mg"); if (!ini.get_bool("GESDEPOSITI")) @@ -3335,7 +3433,7 @@ void TMSPCheck_mask::gopos_mainmask() while (sf.cell_disabled(curr_row,F_BUCKET1-FIRST_FIELD) ) curr_row++; - sf.select(curr_row,TRUE); + sf.select(curr_row/*,TRUE*/); _main_mask->set_focus_field(sf.dlg()); sf.set_focus_cell(curr_row, last_col()*2+F_BUCKET0); } @@ -3478,7 +3576,10 @@ int TMSPCheck_mask::fill_mask(const bool show_fields) show(FC_OVERGIORNIGIAC,overgiac); } - return error; + if (get_int(FC_FINDFILTER)==-1) + return codart==get(FC_ARTICLE2FIND); + else + return error; } void TMSPCheck_mask::fix_actual_pos() @@ -3504,21 +3605,29 @@ bool TMSPCheck_mask::on_field_event(TOperable_field& o, TField_event e, long jol bool redo=TRUE; const TString4 old_movefilter(get(FC_MOVEFILTER)); const TString4 new_movefilter(get_int(FC_FINDFILTER) & 1 ? "" : "C"); + const int findfilter=get_int(FC_FINDFILTER); switch (dlg) { case FC_UP_BAD: + case FC_LEFT_BAD: + case FC_DOWN_BAD: + case FC_RIGHT_BAD: set(FC_MOVEFILTER,new_movefilter); + break; + } + switch (dlg) + { + case FC_UP_BAD: 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)) + while ((findfilter>0 || _col>LAST_BUCKET) && move_to(FC_LEFT)) { int err=fill_mask() ; fix_actual_pos(); - if (err & get_int(FC_FINDFILTER)) + if (err & findfilter) { set(FC_MOVEFILTER,old_movefilter); return TRUE; @@ -3531,18 +3640,16 @@ bool TMSPCheck_mask::on_field_event(TOperable_field& o, TField_event e, long jol 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)) + while ((findfilter>0 || _col<0)&& move_to(FC_RIGHT)) { int err=fill_mask() ; fix_actual_pos(); - if (err & get_int(FC_FINDFILTER)) + if (err & findfilter) { set(FC_MOVEFILTER,old_movefilter); return TRUE; diff --git a/mr/mr2200a.h b/mr/mr2200a.h index f60438590..ef4ca8fe0 100755 --- a/mr/mr2200a.h +++ b/mr/mr2200a.h @@ -94,6 +94,7 @@ // sheet articoli #define LAST_BUCKET 13 +#define F_CHECKLINE 100 #define F_TIPOCF_SHEET 101 #define F_CLIENTE 102 #define F_ARTICOLO 103 diff --git a/mr/mr2200a.uml b/mr/mr2200a.uml index dfbc58a5d..57f747a19 100755 --- a/mr/mr2200a.uml +++ b/mr/mr2200a.uml @@ -364,7 +364,7 @@ END BOOL F_MSP_SORT_ORDER BEGIN - PROMPT 2 3 "Inverti l'ordine" + PROMPT 2 3 "Ordine inverso" MESSAGE TRUE PUSH, F_MSP_SORT MESSAGE FALSE PUSH, F_MSP_SORT END @@ -395,13 +395,13 @@ BEGIN PROMPT 42 1 "Logica di proposta:" END -LIST F_RECALC_TYPE2 35 +LIST F_RECALC_TYPE2 34 BEGIN FLAGS "D" PROMPT 42 2 "" - ITEM "1|FirstFit " - ITEM "1_INF|FirstFit (capacita' infinite) " - ITEM "1_INFH|FirstFit (capacita' umane infinite)" + ITEM "1|FirstFit " + ITEM "1_INF|FirstFit (capacita' infinite) " + ITEM "1_INFH|FirstFit (capacita' umane infin.) " ITEM "JIT|JustInTime " ITEM "JIT_INF|JustInTime (capacita' infinite)" ITEM "JIT_INFH|JustInTime (capacita umane infin.)" @@ -990,6 +990,7 @@ ENDMASK PAGE "Articoli" -1 -1 80 18 + LIST F_TIPOCF_SHEET 9 BEGIN PROMPT 1 0 "" @@ -1405,7 +1406,7 @@ END STRING F_MASTERCODE 1 BEGIN - PROMPT 22 15 "" + PROMPT 42 15 "MasterCode" FLAGS "H" END @@ -1424,12 +1425,19 @@ END*/ BUTTON DLG_OK 10 2 BEGIN - PROMPT -12 -1 "" + PROMPT -13 -1 "" +END + +BUTTON F_CHECKLINE 10 2 +BEGIN + PROMPT -23 -1 "" + PICTURE USER_BMP_CHECK + PICTURE BMP_LENTE END BUTTON DLG_CANCEL 10 2 BEGIN - PROMPT -22 -1 "" + PROMPT -33 -1 "" END ENDPAGE diff --git a/mr/mr2200b.h b/mr/mr2200b.h index fa2be2175..bfe7f9066 100755 --- a/mr/mr2200b.h +++ b/mr/mr2200b.h @@ -1,3 +1,7 @@ +#define G_ARTICOLI 10 +#define G_VINCOLI 20 +#define G_MOVIMENTO 30 + #define FC_RIGA 101 #define FC_BUCKET 102 #define FC_CODART 103 @@ -17,6 +21,7 @@ #define FC_MOVEFILTER 116 #define FC_FINDFILTER 117 #define FC_MAXBUCK2CHECK 118 +#define FC_ARTICLE2FIND 119 // MSP check mask diff --git a/mr/mr2200b.uml b/mr/mr2200b.uml index 310e3e49d..586629bfc 100755 --- a/mr/mr2200b.uml +++ b/mr/mr2200b.uml @@ -1,7 +1,5 @@ #include "mr2200b.h" #include "mr2url.h" -#define G_ARTICOLI 10 -#define G_VINCOLI 20 PAGE "Controllo planning" -1 -1 76 20 @@ -214,14 +212,25 @@ LIST FC_FINDFILTER 28 BEGIN PROMPT 30 13 "" ITEM "8|Sotto stock" + MESSAGE HIDE,FC_ARTICLE2FIND|SHOW,FC_MAXBUCK2CHECK ITEM "12|Anomalie" + MESSAGE HIDE,FC_ARTICLE2FIND|SHOW,FC_MAXBUCK2CHECK ITEM "4|Eccessiva permanenza" + MESSAGE HIDE,FC_ARTICLE2FIND|SHOW,FC_MAXBUCK2CHECK ITEM "14|Anomalie e nuove proposte" + MESSAGE HIDE,FC_ARTICLE2FIND|SHOW,FC_MAXBUCK2CHECK ITEM "15|Anomalie e modifiche" + MESSAGE HIDE,FC_ARTICLE2FIND|SHOW,FC_MAXBUCK2CHECK ITEM "13|Anomalie e modifiche manuali" + MESSAGE HIDE,FC_ARTICLE2FIND|SHOW,FC_MAXBUCK2CHECK ITEM "2|Nuove proposte" + MESSAGE HIDE,FC_ARTICLE2FIND|SHOW,FC_MAXBUCK2CHECK ITEM "3|Modifiche" + MESSAGE HIDE,FC_ARTICLE2FIND|SHOW,FC_MAXBUCK2CHECK ITEM "1|Modifiche manuali" + MESSAGE HIDE,FC_ARTICLE2FIND|SHOW,FC_MAXBUCK2CHECK + ITEM "-1|Codice articolo" + MESSAGE SHOW,FC_ARTICLE2FIND|HIDE,FC_MAXBUCK2CHECK END NUMBER FC_MAXBUCK2CHECK 2 @@ -229,44 +238,62 @@ BEGIN PROMPT 62 13 "fino a " END +STRING FC_ARTICLE2FIND 20 +BEGIN + PROMPT 30 14 "Codice " + FLAGS "U" + USE LF_ANAMAG + INPUT CODART FC_ARTICLE2FIND + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT FC_ARTICLE2FIND CODART +END + BUTTON FC_RIGHT_BAD 4 2 BEGIN - PROMPT 46 16 "" + PROMPT 46 17 "" PICTURE USER_BMP_ARROWRIGHT_RED + GROUP G_MOVIMENTO END BUTTON FC_DOWN_BAD 4 2 BEGIN PROMPT 40 18 "" PICTURE USER_BMP_ARROWDOWN_RED + GROUP G_MOVIMENTO END BUTTON FC_LEFT_BAD 4 2 BEGIN - PROMPT 34 16 "" + PROMPT 34 17 "" PICTURE USER_BMP_ARROWLEFT_RED + GROUP G_MOVIMENTO END BUTTON FC_UP_BAD 4 2 BEGIN - PROMPT 40 14 "" + PROMPT 40 16 "" PICTURE USER_BMP_ARROWUP_RED + GROUP G_MOVIMENTO END BUTTON FC_UPLEFT 4 2 BEGIN PROMPT 4 14 "<" PICTURE USER_BMP_ARROWUPLEFT + GROUP G_MOVIMENTO END BUTTON FC_UP 4 2 BEGIN PROMPT 10 14 "Su'" PICTURE USER_BMP_ARROWUP + GROUP G_MOVIMENTO END BUTTON FC_UPRIGHT 4 2 BEGIN PROMPT 16 14 ">" PICTURE USER_BMP_ARROWUPRIGHT + GROUP G_MOVIMENTO END BUTTON FC_RIGHT 4 2 @@ -279,18 +306,21 @@ BUTTON FC_DOWNRIGHT 4 2 BEGIN PROMPT 16 18 ">" PICTURE USER_BMP_ARROWDOWNRIGHT + GROUP G_MOVIMENTO END BUTTON FC_DOWN 4 2 BEGIN PROMPT 10 18 "Giu'" PICTURE USER_BMP_ARROWDOWN + GROUP G_MOVIMENTO END BUTTON FC_DOWNLEFT 4 2 BEGIN PROMPT 4 18 "<" PICTURE USER_BMP_ARROWDOWNLEFT + GROUP G_MOVIMENTO END BUTTON FC_LEFT 4 2 diff --git a/mr/mrplib.cpp b/mr/mrplib.cpp index b9ea61866..65b997b5c 100755 --- a/mr/mrplib.cpp +++ b/mr/mrplib.cpp @@ -1,14 +1,207 @@ #include +#include +#include #include +#include +#include +#include // file functions #include "mrplib.h" +/////////////////////////////////////////////////////////// +// TMRP_time +////////////////////////////////////////////////////////// +TAssoc_array TMRP_time::_frate_indovino; + +TMRP_calendar& TMRP_time::get_calendar(const char* codimp,const char* codlin) +{ + TToken_string k; + k.add(codimp); + k.add(codlin); + TMRP_calendar* cal = (TMRP_calendar*)_frate_indovino.objptr(k); + if (cal == NULL) + { + if (_frate_indovino.items() > 16) + _frate_indovino.destroy(); // troppi calendari fanno male alla salute... + + cal = new TMRP_calendar(codlin, codimp); + _frate_indovino.add(k, cal); + } + return *cal; +} + +TMRP_calendar& TMRP_time::calendario() +{ + return TMRP_time::get_calendar(_imp, _lin); +} + +int TMRP_time::compare(const TSortable& s) const +{ + const TMRP_time& t = (const TMRP_time&)s; + int res; + if (_date == t._date) + res = _hour - t._hour; + else + res = _date > t._date ? +1 : -1; + return res; +} + +TMRP_time& TMRP_time::add_time(int days, long hours,bool macchina) +{ + TMRP_calendar& cal = calendario(); + if (days != 0) + { + cal.next_working_day(_date, days); + _hour = 0; + } + while (hours != 0) + { + real junk; + const int ore = macchina ? cal.add_oremacchina(junk, _date):cal.add_oreuomo(junk, _date); + const long tot = _hour + hours; + if (tot < 0 || tot > ore) + { + if (hours >= 0) + { + cal.next_working_day(_date); + hours -= ore - _hour; + _hour = 0; + } + else + { + cal.prev_working_day(_date); + hours += _hour; + _hour = (macchina ? cal.add_oremacchina(junk, _date) : cal.add_oreuomo(junk,_date)); + } + } + else + { + _hour = int(tot); + hours = 0; + } + } + return *this; +} + +void TMRP_time::set(const TDate& d, int h, const char* imp, const char* lin) +{ + _date = d; + _hour = h; + _imp = imp; + _lin = lin; +} + +TMRP_time::TMRP_time() : _hour(0) +{ } + +TMRP_time::TMRP_time(const TDate& d, int h, const char* imp, const char* lin) +: _date(d), _hour(h), _imp(imp), _lin(lin) +{ } + +/////////////////////////////////////////////////////////// +// TMRP_array +/////////////////////////////////////////////////////////// + +TSortable* TMRP_array::add_obj(const TToken_string& key) +{ + TSortable* obj = (TSortable*)_by_key.objptr(key); + if (obj == NULL) + { + obj = new_obj(key); + _by_key.add(key, obj); + _by_idx.add(obj); + } + return obj; +} + +void TMRP_array::add(TMRP_array &a, bool force) +{ + TString_array keys; + a._by_key.get_keys(keys); + for (int o=keys.items()-1; o >= 0; o--) + { + TString & key = keys.row(o); + TSortable* obj = (TSortable*)a._by_key.objptr(key)->dup(); + TSortable* oldobj = (TSortable*)_by_key.objptr(key); + if (oldobj == NULL || force) + { + _by_key.add(key, obj); + _by_idx.add(obj); + } + } +} + +TMRP_array & TMRP_array::operator=(const TMRP_array& a) +{ + _by_key=a._by_key; + _by_idx=a._by_idx; + return *this; +} + +TMRP_array::TMRP_array(const TMRP_array& a) +{ + *this = TMRP_array::operator=(a); +} + +// Ordina gli articoli secondo il noto algoritmo Fantini-Truffelli +// per array di oggetti su cui non e' definito un ordinamento completo +long TMRP_array::sort() +{ + const long last = items()-1; + + TProgind* pi = NULL; + if (last >= 16) + pi = new TProgind(last, "Ordinamento", FALSE, TRUE); + else + begin_wait(); + + for (long i = 0; i < last; i++) + { + if (pi) pi->addstatus(1); + TSortable* best = &find_obj(i); + bool swapped = TRUE; + while (swapped) + { + swapped = FALSE; + for (long j = i+1; j <= last; j++) + { + TSortable& other = find_obj(j); + if (other.compare(*best) > 0) + { +// swap(i, j); +// best = &other; + best = (TSortable*)_by_idx.remove(int(j), TRUE); + _by_idx.TArray::insert(best, int(i)); + swapped = TRUE; + } + } + } + } + + if (pi) + delete pi; + else + end_wait(); + + return last+1; +} + +void TMRP_array::destroy() +{ + _by_key.destroy(); + _by_idx.destroy(); +} + +/////////////////////////////////////////////////////////// +// TMRP_calendar +/////////////////////////////////////////////////////////// + TString16 TMRP_calendar::_days; TToken_string TMRP_calendar::_holidays; void TMRP_calendar::init_default() { - TConfig cfg(CONFIG_DITTA, "mr"); + TMRP_config cfg; // Inizializza i turni dei 5 giorni feriali a 1 // Inizializza i turni di sabato e domenica a 0 // Inizializza i turni dei giorni festivi a 0 @@ -16,6 +209,29 @@ void TMRP_calendar::init_default() // Inizializza la lista delle feste comandate tranne la Pasqua _holidays = cfg.get("Feste", NULL, -1, "01-01|06-01|25-04|01-05|15-08|01-11|08-12|25-12|26-12"); + TUnita_produttiva * up=NULL; + if (_codlin.not_empty()) + up=new TLinea_prod(_codlin); + else if (_codimp.not_empty()) + up=new TImpianto(_codimp); + + for (int t = 0; t < 8; t++) + { + if (up) + { + // turni di linea + _lungturno[t] = up->durata_turno(t); + _inizturno[t] = up->inizio_turno(t); + _persturno[t] = up->numpers_turno(t); + } + else + { + // turni di ditta + _lungturno[t] = cfg.durata_turno(t); + _inizturno[t] = cfg.inizio_turno(t); + _persturno[t] = cfg.numpers_turno(t); + } + } } bool TMRP_calendar::is_holiday(int g, int m) const @@ -287,6 +503,61 @@ int TMRP_calendar::set_turni(const TDate& data, int mini, int maxi) return 0; } +int TMRP_calendar::add_oreuomo(real & var,const TDate& date, bool max) +{ + int minuti = 0L; + const int tm = max ? turni_max(date) : turni_min(date); + for (int t = tm-1; t >= 0; t--) + minuti += _lungturno[t] * _persturno[t] ; + var +=(minuti / 60 ); + return minuti / 60 ; +} + +int TMRP_calendar::add_oreuomo_max(real & var,const TDate& date) +{ + return add_oreuomo(var, date,TRUE); +} + +int TMRP_calendar::add_oremacchina(real & var,const TDate& date, bool max) +{ + const int tm = max ? turni_max(date) : turni_min(date); + int minuti = 0L; + for (int t = tm-1; t >= 0; t--) + { + minuti += _lungturno[t]; + const int start=_inizturno[t]; + const int end=_inizturno[t]+_lungturno[t]-1; + for (int pt = t-1; pt >= 0; pt--) + { + int overlap ; + if (_inizturno[pt] end) + overlap = end + 1 - start ; + else + overlap = _inizturno[pt] + _lungturno[pt] -1 - start; + } + else + { + if (end > _inizturno[pt]+_lungturno[pt]) + overlap = _lungturno[pt]; + else + overlap = end + 1 - _inizturno[pt] ; + } + if (overlap >= 0) + minuti -= overlap; + } + } + var +=(minuti / 60 ); + return (minuti / 60 ); +} + +int TMRP_calendar::add_oremacchina_max(real & var,const TDate& date) +{ + return add_oremacchina(var, date,TRUE); +} + int TMRP_calendar::write() const { if (!_codlin.blank()) @@ -295,9 +566,13 @@ int TMRP_calendar::write() const if (!_codimp.blank()) return write_cal('I'); - TConfig cfg(CONFIG_DITTA, "mr"); - cfg.set("Turni", _days); - cfg.set("Feste", _holidays); + if (_days.not_empty()) + { + TConfig cfg(CONFIG_DITTA, "mr"); + cfg.set("Turni", _days); + cfg.set("Feste", _holidays); + } + return NOERR; } @@ -315,8 +590,8 @@ void TMRP_calendar::set(const char* linea, const char* impianto) _exc_lin.destroy(); _exc_imp.destroy(); - _codlin = linea; - _codimp = impianto; + _codlin = linea; _codlin.rpad(5); + _codimp = impianto; _codimp.rpad(5); if (_codlin.not_empty()) { @@ -348,9 +623,22 @@ char TMRP_calendar::tipo() const return 'S'; } +TDate& TMRP_calendar::next_working_day(TDate& work, int gap) +{ + const int delta = gap >= 0 ? +1 : -1; + const int steps = gap >= 0 ? gap : -gap; + for (int i = 0; i < steps; i++) + { + do work += delta; + while (turni_min(work) <= 0); + } + return work; +} + TMRP_calendar::TMRP_calendar(const char* linea, const char* impianto) { set(linea, impianto); + init_default(); } /////////////////////////////////////////////////////////// @@ -391,17 +679,40 @@ void TCalendar_win::handler(WINDOW win, EVENT* ep) const int last = TDate::last_day(month, _anno); if (day >= 1 && day <= last) { - TMask m("Turni del giorno", 1, 40, 7); - m.add_date(101, 0, "Data ", 1, 1, "D"); - m.add_string(102, 0, "", 19, 1, 9, "D"); - m.add_boolean(103, 0, "Festa", 31, 1); - m.add_list(104, 0, "Turni minimi ", 1, 3, 8, "", " |0|1|2|3|4|5|6", "Standard|Nessuno|1 turno|2 turni|3 turni|4 turni|5 turni|6 turni"); - m.add_list(105, 0, "Turni massimi ", 1, 4, 8, "", " |0|1|2|3|4|5|6", "Standard|Nessuno|1 turno|2 turni|3 turni|4 turni|5 turni|6 turni"); - m.add_number(106, 0, "= ", 31, 3, 1, "D"); - m.add_number(107, 0, "= ", 31, 4, 1, "D"); - + const bool is_std=_calendario->tipo()=='S' ; + TString calname; + switch (_calendario->tipo()) + { + case 'S': + calname="Calendario standard"; + break; + case 'I': + calname="Calendario impianto "; + calname << '"'<< _calendario->impianto() << '"'; + break; + case 'L': + calname="Calendario linea "; + calname << '"'<< _calendario->linea() << '"'; + break; + } + TMask m(calname, 1, 40, 8); + m.add_static(DLG_NULL, 0, "Turni del giorno ", 1, 1); + m.add_date(101, 0, "", 1, 2, "D"); + m.add_string(102, 0, "", 19, 2, 9, "D"); + m.add_boolean(103, 0, "Festa", 31, 2, is_std ? "":"D"); + if (is_std) + { + m.add_list(104, 0, "Turni minimi ", 1, 4, 8, "", "0|1|2|3|4|5|6|7|8", "Nessuno|1 turno|2 turni|3 turni|4 turni|5 turni|6 turni|7 turni|8 turni"); + m.add_list(105, 0, "Turni massimi ", 1, 5, 8, "", "0|1|2|3|4|5|6|7|8", "Nessuno|1 turno|2 turni|3 turni|4 turni|5 turni|6 turni|7 turni|8 turni"); + } else { + m.add_list(104, 0, "Turni minimi ", 1, 4, 8, "", " |0|1|2|3|4|5|6|7|8", "Standard|Nessuno|1 turno|2 turni|3 turni|4 turni|5 turni|6 turni|7 turni|8 turni"); + m.add_list(105, 0, "Turni massimi ", 1, 5, 8, "", " |0|1|2|3|4|5|6|7|8", "Standard|Nessuno|1 turno|2 turni|3 turni|4 turni|5 turni|6 turni|7 turni|8 turni"); + } + m.add_number(106, 0, "= ", 31, 4, 1, "D"); + m.add_number(107, 0, "= ", 31, 5, 1, "D"); m.add_button(DLG_OK, 0, "", -12, -1, 10, 2); m.add_button(DLG_CANCEL, 0, "", -22, -1, 10, 2); + const TDate d(day, month, _anno); const bool festa = _calendario->is_holiday(d); m.set(101, d.string()); @@ -448,12 +759,22 @@ void TCalendar_win::update() { TField_window::update(); + const TDate today(TODAY); + const int this_year = today.year(); + const int this_month = today.month(); + const int this_day = today.day(); + _pixmap = TRUE; TString16 str; str << _anno; set_color(COLOR_BLACK, COLOR_WHITE); - printat(1, 1, str); + + if (_anno == this_year) + set_font(XVT_FFN_FIXED, XVT_FS_BOLD); + stringat(1, 1, str); + if (_anno == this_year) + set_font(); RCT rct; xvt_vobj_get_client_rect(win(), &rct); @@ -463,14 +784,24 @@ void TCalendar_win::update() const int x = rct.right * (i+1) / 33; line(x, 0, x, rct.bottom); str.format("%2d", i); - printat(x+2, 0, str); + + if (i == this_day) + set_font(XVT_FFN_FIXED, XVT_FS_BOLD); + stringat(x+2, 0, str); + if (i == this_day) + set_font(); } for (j = 1; j <= 12; j++) { const int y = rct.bottom * j / 13; line(0, y, rct.right, y); str = itom(j); str.cut(3); - printat(1, y, str); + + if (j == this_month) + set_font(XVT_FFN_FIXED, XVT_FS_BOLD); + stringat(1, y, str); + if (j == this_month) + set_font(); } TMRP_calendar* defcal = NULL; @@ -489,13 +820,39 @@ void TCalendar_win::update() { const int x = rct.right * (i+1) / 33; const TDate data(i, j, _anno); - set_color(cal->is_red(data) ? COLOR_RED : COLOR_BLACK, COLOR_WHITE); int tmin, tmax; cal->turni(data, tmin, tmax); + + COLOR colore = COLOR_BLACK; + if (cal->is_red(data)) + colore = COLOR_RED; + else + { + if (tmin != 0) + { + const TDate ieri = data-1L; + if (cal->turni_min(ieri) == 0) + { + const TDate domani = data+1L; + if (cal->turni_min(domani) == 0) + colore = COLOR_MAGENTA; + } + } + else + colore = COLOR_BLUE; + } + set_color(colore, COLOR_WHITE); + + if (j == this_month && i == this_day) + set_font(XVT_FFN_FIXED, XVT_FS_BOLD); + str.format("%d", tmin); - printat(x+2, y, str); + stringat(x+2, y, str); str.format("%2d", tmax); - printat(x+2, y+CHARY-3, str); + stringat(x+2, y+BASEY/2, str); + + if (j == this_month && i == this_day) + set_font(); } } @@ -536,12 +893,84 @@ void TCalendar_field::set_calendar(TMRP_calendar* cal, int year) { TCalendar_win& cw = (TCalendar_win&)win(); cw.set_calendar(cal, year); + cw.force_update(); } /////////////////////////////////////////////////////////// // TCalendar_mask /////////////////////////////////////////////////////////// +/* +void TCalendar_mask::make_profile_name(TFilename& f) const +{ + f =::firm2dir(-1); // Directory dati + f.add("config"); // Directory config + f.add(user()); // Directory config + if (!f.exist()) + make_dir(f); + f.add(source_file()); // Nome Maschera + f.ext("ini"); // Estensione +} + +void TCalendar_mask::save_profile() +{ + TFilename prof; + make_profile_name(prof); + + ofstream ini(prof); + for (int i = 0; i < fields(); i++) + { + TMask_field& f = fld(i); + if (f.is_loadable()) + { + if (f.is_sheet()) + { + TSheet_field& s = (TSheet_field&)f; + FOR_EACH_SHEET_ROW(s, r, row) + ini << f.dlg() << '[' << r << "] = " << *row << endl; + } + else + { + ini << f.dlg() << " = " << f.get() << endl; + } + } + } +} + +void TCalendar_mask::load_profile() +{ + TFilename prof; + make_profile_name(prof); + if (prof.exist()) + { + TScanner ini(prof); + while (ini.good()) + { + TString& line = ini.line(); + int id, idx; + const int num = sscanf(line, "%d[%d] = ", &id, &idx); + if (num > 0 && id2pos(id) >= 0) // Riga valida + { + TMask_field& f = field(id); + if (f.is_loadable()) + { + const int eq = line.find('='); + line.ltrim(eq+2); // Considera solo il valore del campo + if (num == 1) + f.set(line); else + if (num == 2 && f.is_sheet()) + { + TSheet_field& sf = (TSheet_field&)f; + if (idx == 0) sf.destroy(); // Cancella tutto se inserisci la prima riga + sf.row(idx) = line; + } + } + } + } + } +} +*/ + TMask_field* TCalendar_mask::parse_field(TScanner& scanner) { const TString& k = scanner.key(); @@ -550,9 +979,405 @@ TMask_field* TCalendar_mask::parse_field(TScanner& scanner) return TAutomask::parse_field(scanner); } +void TCalendar_mask::update_calendar(short calendar, short year, short plant, short line) +{ + TCalendar_field& cf = (TCalendar_field&)field(calendar); + TString16 linea = line > 0 ? get(line) : EMPTY_STRING; + TString16 impianto = plant > 0 ? get(plant) : EMPTY_STRING; + int anno = year >= 0 ? get_int(year) : 0; + _calendar.set(linea, impianto); + cf.set_calendar(&_calendar, anno); +} + TCalendar_mask::TCalendar_mask(const char* name, int num) { read_mask(name, num, 0); set_handlers(); } + +//*********************************** +// +//*********************************** +static TMRP_config *_confditta=NULL; + +TMRP_config & mrp_config() +{ + if (_confditta==NULL) + _confditta= new TMRP_config(); + return *_confditta; +} + + +//*********************************** +int TMRP_config::ora_inizio_turno(int i) +{ + return (int)inizio_turno(i) / 60; // numero di minuti +} + +int TMRP_config::min_inizio_turno(int i) +{ + return (int)inizio_turno(i) % 60; // numero di minuti +} + +int TMRP_config::inizio_turno(int i) +{ + return get_int("TINIZIO","mr", i); +} + +int TMRP_config::ore_durata_turno(int i) +{ + return (int)durata_turno(i) / 60; +} + +int TMRP_config::min_durata_turno(int i) +{ + return (int)durata_turno(i) % 60; +} + +int TMRP_config::durata_turno(int i) +{ + return get_int("TDURATA", "mr", i); +} + +int TMRP_config::numpers_turno(int t) +{ + return get_int("NUMPERS", "mr", t); +} + +void TMRP_config::set_inizio_turno(int i,int ore, int minuti) +{ + const int time = ore * 60 + minuti; + set_inizio_turno(i,time); +} + +void TMRP_config::set_durata_turno(int i,int ore, int minuti) +{ + const int time = ore * 60 + minuti; + set_durata_turno(i,time); +} + +void TMRP_config::set_inizio_turno(int i,int time) +{ + set("TINIZIO", time, "mr", TRUE, i); +} + +void TMRP_config::set_durata_turno(int i,int time) +{ + set("TDURATA", time, "mr", TRUE, i); +} + +//******** +TImpianto * get_impianto(const char * codice) +{ + static TImpianto *buffer=NULL; + if (!buffer) + buffer= new TImpianto(); + *buffer=cache().get("IMP",codice); + return buffer; +} +TLinea_prod* get_linea(const char * codice) +{ + static TLinea_prod *buffer=NULL; + if (!buffer) + buffer= new TLinea_prod(); + *buffer=cache().get("LNP",codice); + return buffer; +} + + +const char *TUnita_produttiva::erre1(int t) +{ + static char _erre[4] = "R0"; + _erre[1]='0'+char(t); + CHECK(t>=0 && t<8, "Errore nel numero di turno"); + return _erre; +} +const char *TUnita_produttiva::erre2(int t) +{ + static char _erre[4] = "R10"; + _erre[2]='0'+char(t); + CHECK(t>=0 && t<8, "Errore nel numero di turno"); + return _erre; +} +#define M_INIZIO 10000L +#define M_DURATA 1L +//#define M_PERSON 0.05 +// inizio turno +int TUnita_produttiva::inizio_turno(int t) +{ + real r=get_real(erre1(t)); + r=r/M_INIZIO; + const int i=(int)r.round().integer(); + return i; +} +void TUnita_produttiva::set_inizio_turno(int t,int time) +{ + real r(time); + r = r * M_INIZIO; + r = r + long(TUnita_produttiva::durata_turno(t))*M_DURATA; + put(erre1(t), r); +} +// durata turno +int TUnita_produttiva::durata_turno(int t) +{ + real r=get_real(erre1(t)); + r=r-real(long(TUnita_produttiva::inizio_turno(t))*M_INIZIO); + r=r/M_DURATA; + const int i=(int)r.round().integer(); + return i; +} +void TUnita_produttiva::set_durata_turno(int t,int time) +{ + real r(TUnita_produttiva::inizio_turno(t)); + r = r * M_INIZIO; + r = r + long(time)*M_DURATA; + put(erre1(t), r); +} +// persone per turno +int TUnita_produttiva::raw_numpers_turno(int t) +{ + real r(get_real(erre2(t))); + return (int)r.round().integer(); +} + +int TUnita_produttiva::numpers_turno(int t) +{ + int val; + if (!TUnita_produttiva::personale_dedicato()) + val=raw_numpers_turno(t); + if (val==0) + val=get_int("I1"); + else + val= mrp_config().numpers_turno(t); + return val; + /*int r=raw_numpers_turno(t); + if (r==0) + return numpers_turno(); + else + return r;*/ +} +void TUnita_produttiva::set_numpers_turno(int t, int pers) +{ + real r(pers); + put(erre2(t), r); +} + + +void TUnita_produttiva::set_inizio_turno(int t,int ore, int minuti) +{ + const int time=ore*60+minuti; + set_inizio_turno(t,time); +} +void TUnita_produttiva::set_durata_turno(int t,int ore, int minuti) +{ + const int time=ore*60+minuti; + set_durata_turno(t,time); +} + +int TUnita_produttiva::ora_inizio_turno(int t) +{ + return inizio_turno(t)/60; +} +int TUnita_produttiva::min_inizio_turno(int t) +{ + return inizio_turno(t)%60; +} +int TUnita_produttiva::ore_durata_turno(int t) +{ + return durata_turno(t)/60; +} +int TUnita_produttiva::min_durata_turno(int t) +{ + return durata_turno(t)%60; +} + +const char * TUnita_produttiva::codmag() const +{ + TString16 s(codmagdep()); + return s.sub(0,3); +} + +const char * TUnita_produttiva::coddep() const +{ + TString16 s(codmagdep()); + return s.sub(3,5); +} + +// *************************** +// ****** TImpianto +TImpianto::TImpianto(const char* cod) + : TUnita_produttiva() +{ + settab("IMP"); + if (cod && *cod) + { + TTable t("IMP"); + t.put("CODTAB",cod); + t.read(); + } +} + + +// *************************** +// ****** TLinea_prod +TRectype & TUnita_produttiva::operator=(const TRectype & rec) +{ + TRectype ::operator=(rec); + return *this ; +} +TRectype & TImpianto::operator=(const TRectype & rec) +{ + TUnita_produttiva::operator=(rec); + return *this ; +} +TRectype & TLinea_prod::operator=(const TRectype & rec) +{ + TUnita_produttiva::operator=(rec); + return *this ; +} + +const char * TLinea_prod::codimp() const +{ + static char _codimp[5]; + return strcpy(_codimp, get("S6")); +} + +TLinea_prod::TLinea_prod(const char* cod ) + : TUnita_produttiva() +{ + settab("LNP"); + if (cod && *cod) + { + TTable t("LNP"); + put("CODTAB",cod); + read(t); + } +} + +const char * TLinea_prod::codmagdep() const +{ + const char * cod=TUnita_produttiva::codmagdep() ; + if (*cod==0) + { + TImpianto* imp=((TLinea_prod *)this)->get_impianto(); + if (imp) + return imp->codmagdep(); + } + return cod; +} + + +int TLinea_prod::inizio_turno(int t) +{ + int val; + if (TUnita_produttiva::num_turni()!=0) + val=TUnita_produttiva::inizio_turno(t); + else + { + TImpianto* imp=get_impianto(); + if (imp && imp->num_turni()!=0) + val=imp->inizio_turno(t); + else + val=mrp_config().inizio_turno(t); + } + return val; +} +int TLinea_prod::durata_turno(int t) +{ + int val; + if (TUnita_produttiva::num_turni()!=0) + val=TUnita_produttiva::durata_turno(t); + else + { + TImpianto* imp=get_impianto(); + if (imp && imp->num_turni()!=0) + val=imp->durata_turno(t); + else + val=mrp_config().durata_turno(t); + } + return val; +} +int TLinea_prod::numpers_turno(int t) +{ + int val; + if (TUnita_produttiva::num_turni()!=0) + val=TUnita_produttiva::numpers_turno(t); + else + { + TImpianto* imp=get_impianto(); + if (imp) + val=imp->numpers_turno(t); + } + return val; +} + +int TLinea_prod::num_turni() +{ + int val=TUnita_produttiva::num_turni(); + if (val==0) + { + TImpianto* imp=get_impianto(); + if (imp) + val=imp->num_turni(); + if (val==0) + val=mrp_config().num_turni(); + } + return val; +} + + +TImpianto * TLinea_prod::get_impianto() const +{ + const char * imp = codimp(); + if (imp && *imp) + return ::get_impianto(imp); + else + return NULL; +} + +static TCodgiac_livelli *_livelli=NULL; + +TCodgiac_livelli &livelli_giac() +{ + if (_livelli==NULL) + _livelli=new TCodgiac_livelli(); + return *_livelli; +} + + +void find_price(const TString &tipocv, const TString &codcv, const TString &codcatven, + const char *tipocf, long codcf, + const char * codice, const real & qta, real & price) +{ + static TCondizione_vendita *_condv =NULL; + + bool retry=TRUE; + if (_condv == NULL) + _condv = new TCondizione_vendita(new TConfig (CONFIG_DITTA)); + + switch (tipocv[0]) + { + case 'C': + if (codcf == 0L && _condv->config_ditta().get_bool("GESCONCC", "ve")) + break; // necessario il codice del cli/for + case 'O': + case 'L': + _condv -> put_condv(tipocv,codcv,codcatven, + tipocf, codcf ? format("%ld",codcf) : ""); + if (_condv->ricerca(codice, qta)) + { + price = _condv->get_prezzo(); + retry=FALSE; + } + break; + } + if (retry) + { + TToken_string key(codice); + key.add(1); + price = cache().get(LF_UMART,key).get_real(UMART_PREZZO); + } +} + + diff --git a/mr/mrplib.h b/mr/mrplib.h index 8ff3809e2..9f226ef85 100755 --- a/mr/mrplib.h +++ b/mr/mrplib.h @@ -5,10 +5,64 @@ #include #endif +#ifndef __ASSOC_H +#include +#endif + +#ifndef __DBLIB_H +#include "../db/dblib.h" +#endif +#ifndef __MGLIB_H +#include "../mg/mglib.h" +#endif + + +class TMRP_array : public TObject +{ + TAssoc_array _by_key; + TPointer_array _by_idx; + + void swap(long i, long j) { _by_idx.swap(int(i), int(j)); } + +protected: + TToken_string _key; // Token string di lavoro + + virtual TSortable* new_obj(const TToken_string& key) const pure; + TSortable* add_obj(const TToken_string& key); + TSortable* find_obj(const TToken_string& key) const + { return (TSortable*)_by_key.objptr(key); } + TSortable& find_obj(long n) const + { return (TSortable&)_by_idx[int(n)]; } + +public: + long items() const { return _by_key.items(); } + void destroy(); + long sort(); + void add(TMRP_array &a, bool force=FALSE); + + // I metodi add(), find() e operator[] devono essere dichiarati + // dalle classi derivate e ritornare i tipi giusti tramite cast + // TSortable* add(const char* key, bool create) + // { return (TSortable*)add_obj(key); } + // TSortable* find(const char* key) const + // { return (TSortable*)find_obj(key); } + // TSortable& operator[](long index) const + // { return (TSortable&)*find_obj(index); } + TMRP_array & operator=(const TMRP_array& a); + + TMRP_array() { } + TMRP_array(const TMRP_array& a); + virtual ~TMRP_array() { } +}; + class TMRP_calendar : public TObject { static TString16 _days; static TToken_string _holidays; + int _inizturno[8]; + int _lungturno[8]; + int _persturno[8]; + TAssoc_array _exc_imp, _exc_lin; TString16 _codimp, _codlin; @@ -26,6 +80,17 @@ public: int turni_max(const TDate& date) { int mini, maxi; turni(date, mini, maxi); return maxi; } + + // ore minime e massime ad una certa data + int add_oremacchina(real & var,const TDate& date, bool max=FALSE); + int add_oremacchina_max(real & var,const TDate& date); + + int add_oreuomo(real & var,const TDate& date, bool max=FALSE); + int add_oreuomo_max(real & var,const TDate& date); + + TDate& next_working_day(TDate& from, int gap = 1); + TDate& prev_working_day(TDate& from, int gap = 1) + { return next_working_day(from, -gap); } int set_turni(const TDate& date, int mini, int maxi); @@ -53,7 +118,7 @@ class TCalendar_field : public TWindowed_field protected: // TWindowed_field virtual TField_window* create_window(int x, int y, int dx, int dy, WINDOW parent); -public: +public: void set_calendar(TMRP_calendar* cal, int year = 0); TCalendar_field(TMask* m) : TWindowed_field(m) { } @@ -62,12 +127,173 @@ public: class TCalendar_mask : public TAutomask { + TMRP_calendar _calendar; + protected: virtual TMask_field* parse_field(TScanner& scanner); +// void make_profile_name(TFilename& f) const; public: + TMRP_calendar& calendar() { return _calendar; } +// void save_profile(); +// void load_profile(); + + const TMRP_calendar& calendar() const { return _calendar; } + void update_calendar(short calendar, short year, short plant = 0, short line = 0); + TCalendar_mask(const char* name, int num = 0); virtual ~TCalendar_mask() {}; }; + +class TMRP_time : public TSortable +{ + static TAssoc_array _frate_indovino; + + TString16 _imp, _lin; + TDate _date; + int _hour; + + TMRP_calendar& calendario(); + void copy(const TMRP_time& t) { set(t._date, t._hour, t._imp, t._lin); } + +public: + static TMRP_calendar& get_calendar(const char* codimp=NULL,const char* ccodlin=NULL); + + virtual int compare(const TSortable& s) const; + + TMRP_time& add_time(int days, long hours = 0, bool macchina=TRUE); + TMRP_time& sub_time(int days, long hours = 0, bool macchina=TRUE) { return add_time(-days, -hours,macchina); } + + void set(const TDate& d, int h, const char* imp, const char* lin); + TMRP_time& operator=(const TMRP_time& t) { copy(t); return *this; } + + const TDate& date() const { return _date; } + + TMRP_time(); + TMRP_time(const TDate& d, int h, const char* imp, const char* lin); + TMRP_time(const TMRP_time& t) { copy(t); } + virtual ~TMRP_time() { } +}; + +class TMRP_config : public TConfig +{ +protected: + void set_inizio_turno(int t,int time); + void set_durata_turno(int t,int time); + +public: + // ** + void set_inizio_turno(int t,int ore, int minuti); + void set_durata_turno(int t,int ore, int minuti); + void set_numpers_turno(int t, int pers) {set("NUMPERS", pers, "mr", TRUE, t);} + void set_turni(int n) {set("NTURNI", n, "mr", TRUE);} + void set_gestimpianti(bool gi) {set("GESTIMPIANTI", gi ? "X" : "", "mr", TRUE); } + + // ** + int inizio_turno(int t); + int durata_turno(int t); + // ** + int ora_inizio_turno(int t); + int min_inizio_turno(int t); + int ore_durata_turno(int t); + int min_durata_turno(int t); + int num_turni() {return get_int("NTURNI", "mr");} + int numpers_turno(int t); + bool gestimpianti() {return get_bool("GESTIMPIANTI","mr"); } + + TMRP_config() : TConfig(CONFIG_DITTA,"mr") {} + virtual ~TMRP_config() {} +}; + +class TUnita_produttiva : public TRectype +{ + const char *erre1(int t); // campo durata e inizio turno + const char *erre2(int t); // numero persone +protected: + void set_inizio_turno(int t,int time); + void set_durata_turno(int t,int time); + +public: + const char * codice() const {return get("CODTAB");} + const char * descr() const {return get("S0");} + + int raw_numpers_turno(int t) ; + // ** + void set_inizio_turno(int t,int ore, int minuti); + void set_durata_turno(int t,int ore, int minuti); + void set_numpers_turno(int t, int pers); + + virtual int num_turni() {return get_int("I0");} + virtual int inizio_turno(int t); + virtual int durata_turno(int t); + // ** + int ora_inizio_turno(int t); + int min_inizio_turno(int t); + int ore_durata_turno(int t); + int min_durata_turno(int t); + // numero di persone sul turno + virtual int numpers_turno(int t) ; + // flag di personale dedicato + virtual bool personale_dedicato() const { return get_bool("B0"); } + + virtual const char * codmagdep() const { return get("S7"); } + const char * codmag() const ; + const char * coddep() const ; + + virtual TRectype & operator=(const TRectype& rec); + + TUnita_produttiva(const TUnita_produttiva& rec) : TRectype (rec){} + TUnita_produttiva(const TRectype& rec) : TRectype (rec){} + TUnita_produttiva() : TRectype (LF_TAB){} + virtual ~TUnita_produttiva() { } +}; + +class TImpianto : public TUnita_produttiva +{ +protected: + TObject* dup() const { return new TImpianto(*this); } + +public: + virtual TRectype & operator=(const TRectype& rec); + // ** + TImpianto(const char* cod = "") ; + TImpianto(const TRectype& rec) : TUnita_produttiva (rec) {} + TImpianto(const TImpianto& rec) : TUnita_produttiva (rec){} + virtual ~TImpianto() { } +}; + +class TLinea_prod : public TUnita_produttiva +{ +protected: + TObject* dup() const { return new TLinea_prod(*this); } +public: + TImpianto * get_impianto() const; + // ** + const char * codimp() const; + virtual const char * codmagdep() const ; + bool to_check() const {return !get_bool("B9");} // + int check_level() const {return !get_bool("I2");} // + + // ** + virtual int num_turni() ; + virtual int inizio_turno(int t); + virtual int durata_turno(int t); + virtual int numpers_turno(int t) ; + + virtual TRectype & operator=(const TRectype& rec); + + TLinea_prod(const char* cod = "") ; + TLinea_prod(const TRectype& rec) : TUnita_produttiva (rec) {} + TLinea_prod(const TLinea_prod& rec) : TUnita_produttiva (rec){} + virtual ~TLinea_prod() { } +}; + +TImpianto * get_impianto(const char * codice); +TLinea_prod* get_linea(const char * codice); +TCodgiac_livelli &livelli_giac(); + +void find_price(const TString &tipocv, const TString &codcv, const TString &codcatven, + const char * tipocf, long codcf, const char * codice, const real & qta, real & price); + #endif diff --git a/mr/mrtbimp.h b/mr/mrtbimp.h index b34b48cf0..e48b9cb19 100755 --- a/mr/mrtbimp.h +++ b/mr/mrtbimp.h @@ -4,4 +4,61 @@ #define F_CODICE 101 #define F_DESC 102 +#define F_TURNI 103 +#define F_PERSONE 104 +#define F_PERSONESPEC 105 +#define H_PERSONESPEC 106 + +#define F_T1HINIZIO 110 +#define F_T1MINIZIO 111 +#define F_T1HDURATA 112 +#define F_T1MDURATA 113 +#define F_T1NUMPERS 114 +#define F_T2HINIZIO 115 +#define F_T2MINIZIO 116 +#define F_T2HDURATA 117 +#define F_T2MDURATA 118 +#define F_T2NUMPERS 119 +#define F_T3HINIZIO 120 +#define F_T3MINIZIO 121 +#define F_T3HDURATA 122 +#define F_T3MDURATA 123 +#define F_T3NUMPERS 124 +#define F_T4HINIZIO 125 +#define F_T4MINIZIO 126 +#define F_T4HDURATA 127 +#define F_T4MDURATA 128 +#define F_T4NUMPERS 129 +#define F_T5HINIZIO 130 +#define F_T5MINIZIO 131 +#define F_T5HDURATA 132 +#define F_T5MDURATA 133 +#define F_T5NUMPERS 134 +#define F_T6HINIZIO 135 +#define F_T6MINIZIO 136 +#define F_T6HDURATA 137 +#define F_T6MDURATA 138 +#define F_T6NUMPERS 139 +#define F_T7HINIZIO 140 +#define F_T7MINIZIO 141 +#define F_T7HDURATA 142 +#define F_T7MDURATA 143 +#define F_T7NUMPERS 144 +#define F_T8HINIZIO 145 +#define F_T8MINIZIO 146 +#define F_T8HDURATA 147 +#define F_T8MDURATA 148 +#define F_T8NUMPERS 149 +#define F_CODMAG 160 +#define F_DESMAG 161 +#define F_CODDEP 162 +#define F_DESDEP 163 + + + +#define F_YEAR 201 +#define F_TYPE 202 +#define F_CALENDAR 203 + + #endif diff --git a/mr/mrtbimp.uml b/mr/mrtbimp.uml index cc661c5b0..365107e37 100755 --- a/mr/mrtbimp.uml +++ b/mr/mrtbimp.uml @@ -1,6 +1,26 @@ -#include "mrtblnp.h" +#include "mrtbimp.h" -TOOLBAR "" 0 19 80 3 +// gruppi turni "Minori o uguali a X" +#define GL1 10 +#define GL2 11 +#define GL3 12 +#define GL4 13 +#define GL5 14 +#define GL6 15 +#define GL7 16 +#define GL8 17 +// gruppi turni "Maggiori di X" +#define GM1 20 +#define GM2 21 +#define GM3 22 +#define GM4 23 +#define GM5 24 +#define GM6 25 +#define GM7 26 +#define GM8 27 +#define GPERS 30 + +TOOLBAR "" 0 -2 -1 -1 #include ENDPAGE @@ -39,7 +59,458 @@ BEGIN OUTPUT F_CODICE CODTAB CHECKTYPE REQUIRED END - + +LISTBOX F_TURNI 3 +BEGIN + PROMPT 2 7 "Numero turni " + ITEM "0|" + MESSAGE CLEAR,GL1@|CLEAR,GM1@ + ITEM "1|1" + MESSAGE CLEAR,GM1@|ENABLE,GL1@ + ITEM "2|2" + MESSAGE CLEAR,GM2@|ENABLE,GL2@ + ITEM "3|3" + MESSAGE CLEAR,GM3@|ENABLE,GL3@ + ITEM "4|4" + MESSAGE CLEAR,GM4@|ENABLE,GL4@ + ITEM "5|5" + MESSAGE CLEAR,GM5@|ENABLE,GL5@ + ITEM "6|6" + MESSAGE CLEAR,GM6@|ENABLE,GL6@ + ITEM "7|7" + MESSAGE CLEAR,GM7@|ENABLE,GL7@ + ITEM "8|8" + MESSAGE CLEAR,GM8@|ENABLE,GL8@ + FIELD I0 +END + +BOOL F_PERSONESPEC +BEGIN + PROMPT 40 7 "Utilizza personale proprio" + FIELD B0 + MESSAGE TRUE SHOW,GPERS@|ENABLE,F_PERSONE + MESSAGE FALSE HIDE,GPERS@ +END + +NUMBER F_PERSONE 3 +BEGIN + PROMPT 26 8 "Persone su un turno " + FIELD I1 + GROUP GPERS +END + +TEXT DLG_NULL +BEGIN + PROMPT 2 8 "Ora inizio" +END + +TEXT DLG_NULL +BEGIN + PROMPT 16 8 "Durata " +END + +NUMBER F_T1HINIZIO 2 +BEGIN + GROUP GL1 GL2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 3 9 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" + CHECKTYPE REQUIRED +END + +NUMBER F_T1MINIZIO 2 +BEGIN + GROUP GL1 GL2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 6 9 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T1HDURATA 2 +BEGIN + GROUP GL1 GL2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 16 9 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" + CHECKTYPE REQUIRED +END + +NUMBER F_T1MDURATA 2 +BEGIN + GROUP GL1 GL2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 19 9 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T1NUMPERS 3 +BEGIN + GROUP GL1 GL2 GL3 GL4 GL5 GL6 GL7 GL8 GPERS + PROMPT 46 9 "" +END + +NUMBER F_T2HINIZIO 2 +BEGIN + GROUP GM1 GL2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 3 10 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" + CHECKTYPE REQUIRED +END + +NUMBER F_T2MINIZIO 2 +BEGIN + GROUP GM1 GL2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 6 10 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T2HDURATA 2 +BEGIN + GROUP GM1 GL2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 16 10 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" + CHECKTYPE REQUIRED +END + +NUMBER F_T2MDURATA 2 +BEGIN + GROUP GM1 GL2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 19 10 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T2NUMPERS 3 +BEGIN + GROUP GM1 GL2 GL3 GL4 GL5 GL6 GL7 GL8 GPERS + PROMPT 46 10 "" +END + +NUMBER F_T3HINIZIO 2 +BEGIN + GROUP GM1 GM2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 3 11 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" + CHECKTYPE REQUIRED +END + +NUMBER F_T3MINIZIO 2 +BEGIN + GROUP GM1 GM2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 6 11 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T3HDURATA 2 +BEGIN + GROUP GM1 GM2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 16 11 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" + CHECKTYPE REQUIRED +END + +NUMBER F_T3MDURATA 2 +BEGIN + GROUP GM1 GM2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 19 11 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T3NUMPERS 3 +BEGIN + GROUP GM1 GM2 GL3 GL4 GL5 GL6 GL7 GL8 GPERS + PROMPT 46 11 "" +END + +NUMBER F_T4HINIZIO 2 +BEGIN + GROUP GM1 GM2 GM3 GL4 GL5 GL6 GL7 GL8 + PROMPT 3 12 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T4MINIZIO 2 +BEGIN + GROUP GM1 GM2 GM3 GL4 GL5 GL6 GL7 GL8 + PROMPT 6 12 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T4HDURATA 2 +BEGIN + GROUP GM1 GM2 GM3 GL4 GL5 GL6 GL7 GL8 + PROMPT 16 12 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T4MDURATA 2 +BEGIN + GROUP GM1 GM2 GM3 GL4 GL5 GL6 GL7 GL8 + PROMPT 19 12 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T4NUMPERS 3 +BEGIN + GROUP GM1 GM2 GM3 GL4 GL5 GL6 GL7 GL8 GPERS + PROMPT 46 12 "" +END + +NUMBER F_T5HINIZIO 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GL5 GL6 GL7 GL8 + PROMPT 3 13 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T5MINIZIO 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GL5 GL6 GL7 GL8 + PROMPT 6 13 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T5HDURATA 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GL5 GL6 GL7 GL8 + PROMPT 16 13 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T5MDURATA 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GL5 GL6 GL7 GL8 + PROMPT 19 13 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T5NUMPERS 3 +BEGIN + GROUP GM1 GM2 GM3 GM4 GL5 GL6 GL7 GL8 GPERS + PROMPT 46 13 "" +END + +NUMBER F_T6HINIZIO 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GL6 GL7 GL8 + PROMPT 3 14 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T6MINIZIO 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GL6 GL7 GL8 + PROMPT 6 14 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T6HDURATA 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GL6 GL7 GL8 + PROMPT 16 14 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T6MDURATA 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GL6 GL7 GL8 + PROMPT 19 14 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T6NUMPERS 3 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GL6 GL7 GL8 GPERS + PROMPT 46 14 "" +END + +NUMBER F_T7HINIZIO 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GM6 GL7 GL8 + PROMPT 3 15 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T7MINIZIO 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GM6 GL7 GL8 + PROMPT 6 15 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T7HDURATA 2 +BEGIN + PROMPT 16 15 "" + GROUP GM1 GM2 GM3 GM4 GM5 GM6 GL7 GL8 + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T7MDURATA 2 +BEGIN + PROMPT 19 15 ":" + GROUP GM1 GM2 GM3 GM4 GM5 GM6 GL7 GL8 + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T7NUMPERS 3 +BEGIN + PROMPT 46 15 "" + GROUP GM1 GM2 GM3 GM4 GM5 GM6 GL7 GL8 GPERS +END + +NUMBER F_T8HINIZIO 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GM6 GM7 GL8 + PROMPT 3 16 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T8MINIZIO 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GM6 GM7 GL8 + PROMPT 6 16 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T8HDURATA 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GM6 GM7 GL8 + PROMPT 16 16 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T8MDURATA 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GM6 GM7 GL8 + PROMPT 19 16 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T8NUMPERS 3 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GM6 GM7 GL8 GPERS + PROMPT 46 16 "" +END + + +STRING F_CODMAG 3 +BEGIN + FLAGS "U" + PROMPT 2 18 "Magazzino " + FIELD S7[1,3] + USE MAG SELECT CODTAB[4,5]="" + INPUT CODTAB F_CODMAG + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODMAG CODTAB[1,3] + OUTPUT F_CODDEP CODTAB[4,5] + OUTPUT F_DESMAG S0 + CHECKTYPE NORMAL + MESSAGE EMPTY RESET,F_CODDEP|RESET,F_DESDEP + MESSAGE ENABLE,F_CODDEP|ENABLE,F_DESDEP +END + +STRING F_DESMAG 50 +BEGIN + FLAGS "U" + PROMPT 20 18 "" + USE MAG KEY 2 + INPUT S0 F_DESMAG + COPY DISPLAY F_CODMAG + COPY OUTPUT F_CODMAG +END + + +STRING F_CODDEP 2 +BEGIN + FLAGS "U" + PROMPT 2 19 "Deposito " + FIELD S7[4,5] + USE MAG // SELECT CODTAB[4,5]!="" + INPUT CODTAB[1,3] F_CODMAG + INPUT CODTAB[4,5] F_CODDEP + DISPLAY "Cod.Mag." CODTAB[1,3] + DISPLAY "Cod.Dep" CODTAB[4,5] + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODMAG CODTAB[1,3] + OUTPUT F_CODDEP CODTAB[4,5] + OUTPUT F_DESDEP S0 + CHECKTYPE NORMAL + MESSAGE EMPTY RESET,F_DESDEP +END + +STRING F_DESDEP 50 +BEGIN + FLAGS "U" + PROMPT 20 19 "" + USE MAG KEY 2 + INPUT S0 F_DESDEP + COPY DISPLAY F_CODDEP + COPY OUTPUT F_CODDEP + CHECKTYPE NORMAL +END + + + ENDPAGE PAGE "Calendario" -1 -1 65 15 diff --git a/mr/mrtblnp.h b/mr/mrtblnp.h index 6528eda7b..37450718c 100755 --- a/mr/mrtblnp.h +++ b/mr/mrtblnp.h @@ -6,7 +6,58 @@ #define F_IMPIANTO 103 #define F_DESCIMPIANTO 104 -#define F_PERSONE 105 +#define F_PERSONESPEC 105 +#define F_PERSONE 106 + +#define F_NO_CRP 107 +#define F_CRP_LEVEL 108 + +#define F_TURNI 109 +#define F_T1HINIZIO 110 +#define F_T1MINIZIO 111 +#define F_T1HDURATA 112 +#define F_T1MDURATA 113 +#define F_T1NUMPERS 114 +#define F_T2HINIZIO 115 +#define F_T2MINIZIO 116 +#define F_T2HDURATA 117 +#define F_T2MDURATA 118 +#define F_T2NUMPERS 119 +#define F_T3HINIZIO 120 +#define F_T3MINIZIO 121 +#define F_T3HDURATA 122 +#define F_T3MDURATA 123 +#define F_T3NUMPERS 124 +#define F_T4HINIZIO 125 +#define F_T4MINIZIO 126 +#define F_T4HDURATA 127 +#define F_T4MDURATA 128 +#define F_T4NUMPERS 129 +#define F_T5HINIZIO 130 +#define F_T5MINIZIO 131 +#define F_T5HDURATA 132 +#define F_T5MDURATA 133 +#define F_T5NUMPERS 134 +#define F_T6HINIZIO 135 +#define F_T6MINIZIO 136 +#define F_T6HDURATA 137 +#define F_T6MDURATA 138 +#define F_T6NUMPERS 139 +#define F_T7HINIZIO 140 +#define F_T7MINIZIO 141 +#define F_T7HDURATA 142 +#define F_T7MDURATA 143 +#define F_T7NUMPERS 144 +#define F_T8HINIZIO 145 +#define F_T8MINIZIO 146 +#define F_T8HDURATA 147 +#define F_T8MDURATA 148 +#define F_T8NUMPERS 149 + +#define F_CODMAG 160 +#define F_DESMAG 161 +#define F_CODDEP 162 +#define F_DESDEP 163 #define F_YEAR 201 #define F_TYPE 202 diff --git a/mr/mrtblnp.uml b/mr/mrtblnp.uml index 05bc8323d..bab8329b8 100755 --- a/mr/mrtblnp.uml +++ b/mr/mrtblnp.uml @@ -1,10 +1,30 @@ #include "mrtblnp.h" -TOOLBAR "" 0 19 80 3 +// gruppi turni "Minori o uguali a X" +#define GL1 10 +#define GL2 11 +#define GL3 12 +#define GL4 13 +#define GL5 14 +#define GL6 15 +#define GL7 16 +#define GL8 17 +// gruppi turni "Maggiori di X" +#define GM1 20 +#define GM2 21 +#define GM3 22 +#define GM4 23 +#define GM5 24 +#define GM6 25 +#define GM7 26 +#define GM8 27 +#define GPERS 30 + +TOOLBAR "" 0 -2 -1 -1 #include ENDPAGE -PAGE "Linee di produzione" -1 -1 65 15 +PAGE "Linee di produzione" -1 -1 80 20 GROUPBOX DLG_NULL 78 5 BEGIN @@ -50,9 +70,9 @@ BEGIN DISPLAY "Descrizione@50" S0 OUTPUT F_IMPIANTO CODTAB OUTPUT F_DESCIMPIANTO S0 - CHECKTYPE NORMAL + CHECKTYPE REQUIRED FIELD S6 - WARNING "Impianto assente" + WARNING "E' necessario specificare un impianto" END STRING F_DESCIMPIANTO 50 @@ -67,18 +87,473 @@ BEGIN WARNING "Impianto assente" END -GROUPBOX DLG_NULL 78 4 +BOOL F_NO_CRP BEGIN - PROMPT 1 6 "" -END + PROMPT 2 6 "Escludi dal Capacity Review " + FIELD B9 + MESSAGE FALSE HIDE,F_CRP_LEVEL + MESSAGE TRUE SHOW,F_CRP_LEVEL + +END + +LIST F_CRP_LEVEL 25 +BEGIN + PROMPT 40 6 "Livello " + ITEM "0|Master Schedule" + FIELD I2 +END + +LISTBOX F_TURNI 3 +BEGIN + PROMPT 2 7 "Numero turni " + ITEM "0|" + MESSAGE CLEAR,GL1@|CLEAR,GM1@ + ITEM "1|1" + MESSAGE CLEAR,GM1@|ENABLE,GL1@ + ITEM "2|2" + MESSAGE CLEAR,GM2@|ENABLE,GL2@ + ITEM "3|3" + MESSAGE CLEAR,GM3@|ENABLE,GL3@ + ITEM "4|4" + MESSAGE CLEAR,GM4@|ENABLE,GL4@ + ITEM "5|5" + MESSAGE CLEAR,GM5@|ENABLE,GL5@ + ITEM "6|6" + MESSAGE CLEAR,GM6@|ENABLE,GL6@ + ITEM "7|7" + MESSAGE CLEAR,GM7@|ENABLE,GL7@ + ITEM "8|8" + MESSAGE CLEAR,GM8@|ENABLE,GL8@ + FIELD I0 +END + +BOOL F_PERSONESPEC +BEGIN + PROMPT 40 7 "Utilizza personale specializzato" + FIELD B0 + MESSAGE TRUE SHOW,GPERS@|ENABLE,F_PERSONE + MESSAGE FALSE HIDE,GPERS@ +END NUMBER F_PERSONE 3 BEGIN - PROMPT 2 7 "Persone " - FLAGS "U" - FIELD I0 + PROMPT 26 8 "Persone su un turno " + FIELD I1 + GROUP GPERS END +TEXT DLG_NULL +BEGIN + PROMPT 2 8 "Ora inizio" +END + +TEXT DLG_NULL +BEGIN + PROMPT 16 8 "Durata " +END + +NUMBER F_T1HINIZIO 2 +BEGIN + GROUP GL1 GL2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 3 9 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" + CHECKTYPE REQUIRED +END + +NUMBER F_T1MINIZIO 2 +BEGIN + GROUP GL1 GL2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 6 9 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T1HDURATA 2 +BEGIN + GROUP GL1 GL2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 16 9 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" + CHECKTYPE REQUIRED +END + +NUMBER F_T1MDURATA 2 +BEGIN + GROUP GL1 GL2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 19 9 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T1NUMPERS 3 +BEGIN + GROUP GL1 GL2 GL3 GL4 GL5 GL6 GL7 GL8 GPERS + PROMPT 46 9 "" +END + +NUMBER F_T2HINIZIO 2 +BEGIN + GROUP GM1 GL2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 3 10 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" + CHECKTYPE REQUIRED +END + +NUMBER F_T2MINIZIO 2 +BEGIN + GROUP GM1 GL2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 6 10 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T2HDURATA 2 +BEGIN + GROUP GM1 GL2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 16 10 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" + CHECKTYPE REQUIRED +END + +NUMBER F_T2MDURATA 2 +BEGIN + GROUP GM1 GL2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 19 10 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T2NUMPERS 3 +BEGIN + GROUP GM1 GL2 GL3 GL4 GL5 GL6 GL7 GL8 GPERS + PROMPT 46 10 "" +END + +NUMBER F_T3HINIZIO 2 +BEGIN + GROUP GM1 GM2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 3 11 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" + CHECKTYPE REQUIRED +END + +NUMBER F_T3MINIZIO 2 +BEGIN + GROUP GM1 GM2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 6 11 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T3HDURATA 2 +BEGIN + GROUP GM1 GM2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 16 11 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" + CHECKTYPE REQUIRED +END + +NUMBER F_T3MDURATA 2 +BEGIN + GROUP GM1 GM2 GL3 GL4 GL5 GL6 GL7 GL8 + PROMPT 19 11 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T3NUMPERS 3 +BEGIN + GROUP GM1 GM2 GL3 GL4 GL5 GL6 GL7 GL8 GPERS + PROMPT 46 11 "" +END + +NUMBER F_T4HINIZIO 2 +BEGIN + GROUP GM1 GM2 GM3 GL4 GL5 GL6 GL7 GL8 + PROMPT 3 12 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T4MINIZIO 2 +BEGIN + GROUP GM1 GM2 GM3 GL4 GL5 GL6 GL7 GL8 + PROMPT 6 12 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T4HDURATA 2 +BEGIN + GROUP GM1 GM2 GM3 GL4 GL5 GL6 GL7 GL8 + PROMPT 16 12 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T4MDURATA 2 +BEGIN + GROUP GM1 GM2 GM3 GL4 GL5 GL6 GL7 GL8 + PROMPT 19 12 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T4NUMPERS 3 +BEGIN + GROUP GM1 GM2 GM3 GL4 GL5 GL6 GL7 GL8 GPERS + PROMPT 46 12 "" +END + +NUMBER F_T5HINIZIO 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GL5 GL6 GL7 GL8 + PROMPT 3 13 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T5MINIZIO 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GL5 GL6 GL7 GL8 + PROMPT 6 13 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T5HDURATA 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GL5 GL6 GL7 GL8 + PROMPT 16 13 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T5MDURATA 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GL5 GL6 GL7 GL8 + PROMPT 19 13 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T5NUMPERS 3 +BEGIN + GROUP GM1 GM2 GM3 GM4 GL5 GL6 GL7 GL8 GPERS + PROMPT 46 13 "" +END + +NUMBER F_T6HINIZIO 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GL6 GL7 GL8 + PROMPT 3 14 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T6MINIZIO 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GL6 GL7 GL8 + PROMPT 6 14 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T6HDURATA 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GL6 GL7 GL8 + PROMPT 16 14 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T6MDURATA 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GL6 GL7 GL8 + PROMPT 19 14 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T6NUMPERS 3 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GL6 GL7 GL8 GPERS + PROMPT 46 14 "" +END + +NUMBER F_T7HINIZIO 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GM6 GL7 GL8 + PROMPT 3 15 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T7MINIZIO 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GM6 GL7 GL8 + PROMPT 6 15 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T7HDURATA 2 +BEGIN + PROMPT 16 15 "" + GROUP GM1 GM2 GM3 GM4 GM5 GM6 GL7 GL8 + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T7MDURATA 2 +BEGIN + PROMPT 19 15 ":" + GROUP GM1 GM2 GM3 GM4 GM5 GM6 GL7 GL8 + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T7NUMPERS 3 +BEGIN + PROMPT 46 15 "" + GROUP GM1 GM2 GM3 GM4 GM5 GM6 GL7 GL8 GPERS +END + +NUMBER F_T8HINIZIO 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GM6 GM7 GL8 + PROMPT 3 16 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T8MINIZIO 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GM6 GM7 GL8 + PROMPT 6 16 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T8HDURATA 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GM6 GM7 GL8 + PROMPT 16 16 "" + NUM_EXPR {(#THIS_FIELD <= 23)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T8MDURATA 2 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GM6 GM7 GL8 + PROMPT 19 16 ":" + NUM_EXPR {(#THIS_FIELD <= 59)} + WARNING "Ora non valida" + FLAGS "Z" +END + +NUMBER F_T8NUMPERS 3 +BEGIN + GROUP GM1 GM2 GM3 GM4 GM5 GM6 GM7 GL8 GPERS + PROMPT 46 16 "" +END + + + +STRING F_CODMAG 3 +BEGIN + FLAGS "U" + PROMPT 2 18 "Magazzino " + FIELD S7[1,3] + USE MAG SELECT CODTAB[4,5]="" + INPUT CODTAB F_CODMAG + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODMAG CODTAB[1,3] + OUTPUT F_CODDEP CODTAB[4,5] + OUTPUT F_DESMAG S0 + CHECKTYPE NORMAL + MESSAGE EMPTY RESET,F_CODDEP|RESET,F_DESDEP + MESSAGE ENABLE,F_CODDEP|ENABLE,F_DESDEP +END + +STRING F_DESMAG 50 +BEGIN + FLAGS "U" + PROMPT 20 18 "" + USE MAG KEY 2 + INPUT S0 F_DESMAG + COPY DISPLAY F_CODMAG + COPY OUTPUT F_CODMAG +END + + +STRING F_CODDEP 2 +BEGIN + FLAGS "U" + PROMPT 2 19 "Deposito " + FIELD S7[4,5] + USE MAG // SELECT CODTAB[4,5]!="" + INPUT CODTAB[1,3] F_CODMAG + INPUT CODTAB[4,5] F_CODDEP + DISPLAY "Cod.Mag." CODTAB[1,3] + DISPLAY "Cod.Dep" CODTAB[4,5] + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODMAG CODTAB[1,3] + OUTPUT F_CODDEP CODTAB[4,5] + OUTPUT F_DESDEP S0 + CHECKTYPE NORMAL + MESSAGE EMPTY RESET,F_DESDEP +END + +STRING F_DESDEP 50 +BEGIN + FLAGS "U" + PROMPT 20 19 "" + USE MAG KEY 2 + INPUT S0 F_DESDEP + COPY DISPLAY F_CODDEP + COPY OUTPUT F_CODDEP + CHECKTYPE NORMAL +END + + ENDPAGE PAGE "Calendario" -1 -1 65 15 diff --git a/mr/selordf.bmp b/mr/selordf.bmp new file mode 100755 index 0000000000000000000000000000000000000000..48ece4bb0ca93537adc44406e52a42790b9a65a8 GIT binary patch literal 958 zcmbVKF;2uV5FB(!?l2MM6}0@|dMX-49>^k z$rPku6l!7!^pE}hILbG;ZOx+P9@JKqp?K{|bn?x)ft^{@vcJ~o2-meLwdy<%kndk@ zz%^f8jCE#Uz^W~?pLO5a(bvt6XSPJV6R)l&^zG?vViaA%Y8BM80&K<*jark+BHJ6` z>qG~+Q{nYIdM-uq#d<-@`)|QB_w|hq543PLL3j0aqm8XpU17^q=cE2u=l7ElJ3zkU UIMnyuq0>@oKj}K;v{P8MKhPn3_5c6? literal 0 HcmV?d00001 diff --git a/mr/selordp.bmp b/mr/selordp.bmp new file mode 100755 index 0000000000000000000000000000000000000000..38fa2ccf40a2cb56e6d8d1669fa42df8f388f1c9 GIT binary patch literal 958 zcmb7CF>b>!47?%*yj2Z4X6V`DA=N;z_ZmEHnQ#_o7+5sHc?W&>X5{JWqRsoLzcda=238ET8 z@@O_J!u{>ouk2QNK-WA#^-iiZ)Pr1 zVJ0A9OqS|$Oxc7Z888Ayn-rGm9=rQtP+n`;hC=krE!-tTT6@tje0GiHt`TPz?{98_ zpSkWM+dTGA-hXh7$DQ-C1a%obX0DG4Q#GpBS)VTS#3{~5byc4Y9Ww`+2WsL?C9p4< z+X0Qmhz4fCRuQm+jZJY!_}pfe!tCr>iZ`)*7?vW&3p-i;*ws5)JupoZIJ3*vjRK*v k8vC)r?YPmy+P`h(T_?tJ`+C3E5&5@$Fl#@RtBK-%1G?Ll7ytkO literal 0 HcmV?d00001