From 0b7472f1db9a31979fad6e14fd20370fd062673b Mon Sep 17 00:00:00 2001 From: guy <guy@c028cbd2-c16b-5b4b-a496-9718f37d4682> Date: Tue, 24 Jun 2014 12:42:42 +0000 Subject: [PATCH] Correzioni per DBService: creazione righe vuote indesiderate git-svn-id: svn://10.65.10.50/branches/R_10_00@22962 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- mr/mr2200.cpp | 262 +++++++++++++++++++++++++------------------------ mr/mr2200.h | 8 +- mr/mr2200a.uml | 8 +- mr/mr2201.cpp | 4 + 4 files changed, 146 insertions(+), 136 deletions(-) diff --git a/mr/mr2200.cpp b/mr/mr2200.cpp index 397bdf88e..71b916267 100755 --- a/mr/mr2200.cpp +++ b/mr/mr2200.cpp @@ -849,10 +849,10 @@ TMSP_constraint* TPlanning_mask::find_constraint(const TMSP_line& l, bool force_ } } - TString da_rdoc_key(l.da_rdoc_key()); + const TString da_rdoc_key = l.da_rdoc_key(); // cerca il vincolo con - stesso magazzino , impianto e linea - TMSP_constraint* c = _constraints.find(codcli, l.articolo(), l.livgiac(), codimp, codlin, codmag, EMPTY_STRING, da_rdoc_key); + TMSP_constraint* c = _constraints.find(codcli, l.articolo(), l.livgiac(), codimp, codlin, codmag, EMPTY_STRING, da_rdoc_key); if (c == NULL ) { long try_cli = codcli; @@ -1153,7 +1153,7 @@ bool TPlanning_mask::remove_propose(bool verbose) bool remove_all = false; bool some = _proposed_articles.items() > 0L; // proposte attuali if (some) - remove = (!verbose || yesno_box(TR("Vuoi annullare le nuove proposte?"))); + remove = (!verbose || yesno_box(TR("Si desiderano annullare le nuove proposte?"))); if (!some && verbose) { if (load_MRP_lines(_actual_plan)) @@ -1161,8 +1161,8 @@ bool TPlanning_mask::remove_propose(bool verbose) some = _mrp_articles.items() > 0L; if (some) { - remove = (noyes_box(TR("Vuoi annullare tutte le pianificazioni non confermate?"))); - if (remove && get_bool(F_RESCHEDULING) && noyes_box(TR("Vuoi annullare anche le pianificazioni confermate?"))) + remove = (delete_box(TR("Si desiderano annullare tutte le pianificazioni non confermate?"))); + if (remove && get_bool(F_RESCHEDULING) && delete_box(TR("Vuoi annullare anche le pianificazioni confermate?"))) remove_all = true; } if (!remove) @@ -1211,11 +1211,11 @@ void TPlanning_mask::add_or_sub_propose(char sign, bool scheduled) TSheet_field& sf = sfield(F_ARTICOLI); for (long new_row=0; new_row < new_rows; new_row++) { - const TMRP_line & a=_proposed_articles[new_row]; + const TMRP_line& a = _proposed_articles[new_row]; TMSP_line line(a.codclifor(), a.articolo(), a.livgiac(), a.codimp(), a.codlin(), a.codmagdep(), a.codmagdep_coll(), a.da_rdoc_key()); bool line_found = false; - TMSP_constraint* constraint = find_constraint(line, false); + TMSP_constraint* constraint = find_constraint(line, false); if (constraint == NULL) { if (sign < 0) @@ -1247,12 +1247,15 @@ void TPlanning_mask::add_or_sub_propose(char sign, bool scheduled) if (!sf.cell_disabled(art_row, F_BUCKET1-FIRST_FIELD)) { - line_found=(a.codclifor()==codcli && a.articolo()==codart && a.livgiac()==liv - && a.codimp()==codimp && a.codlin()==codlin && a.codmagdep()==mag && a.da_rdoc_key() == da_rdoc_key); + line_found=(a.codclifor()==codcli && a.articolo()==codart && a.livgiac()==liv && + a.codimp()==codimp && a.codlin()==codlin && a.codmagdep()==mag && + (a.da_rdoc_key() == da_rdoc_key) || (a.da_rdoc_key().blank() && da_rdoc_key.blank())); if (line_found) break; - } else { - TMSP_constraint* currcons=_constraints.find(codcli, codart, liv, codimp, codlin, mag, magc, da_rdoc_key); + } + else + { + TMSP_constraint* currcons = _constraints.find(codcli, codart, liv, codimp, codlin, mag, magc, da_rdoc_key); if (constraint == currcons) break; } @@ -1485,7 +1488,8 @@ void TPlanning_mask::propose_1stJIT(TMSP_logic logic, bool check_machine, bool c TDate dbuck(starting_date()); dbuck +=buck*days_per_bucket(); round_date(dbuck); - message_box(FR("Quantita' proposte a partire dal %s (colonna %d)"), (const char *)dbuck.string(),buck); + message_box(FR("Quantit� proposte a partire dal %s (colonna %d)"), + (const char *)dbuck.string(),buck); } else message_box(TR("Nessuna nuova proposta")); @@ -1501,132 +1505,136 @@ void TPlanning_mask::propose_1stJIT(TMSP_logic logic, bool check_machine, bool c } -void TPlanning_mask::review_cell(long mrp_row, int bucket, bool check_machine, bool check_human, bool useextralines, bool useextrahours,bool lotsizing, bool no_outcapacity, int anticipomin,int anticipomax, TMSP_mode mode, TMSP_logic logic, const char * msg, bool firstfitxbucket) +void TPlanning_mask::review_cell(long mrp_row, int bucket, bool check_machine, bool check_human, bool useextralines, bool useextrahours, + bool lotsizing, bool no_outcapacity, int anticipomin,int anticipomax, + TMSP_mode mode, TMSP_logic logic, const char * msg, bool firstfitxbucket) { const bool ignore_mag = get_bool(F_NOMAG_IN); const bool ignore_imp = get_bool(F_NOIMP_IN); const bool ignore_lin = get_bool(F_NOLIN_IN); - TMRP_line &mrpline = _mrp_articles[mrp_row]; - TToken_string * row = mrpline.sheet_row(); - TDate data_buck(starting_date()); - data_buck += days_per_bucket()*(bucket-1); - round_date(data_buck); - const TMRP_time mrp_time(data_buck, 0, "",""); - TMRP_record & mrp_rec= mrpline.record(mrp_time); - real art_per_buck = mrp_rec.net_requirement(); // quantit� da produrre nel bucket + TMRP_line &mrpline = _mrp_articles[mrp_row]; + TToken_string * row = mrpline.sheet_row(); + TDate data_buck(starting_date()); + data_buck += days_per_bucket()*(bucket-1); + round_date(data_buck); + const TMRP_time mrp_time(data_buck, 0, "",""); + TMRP_record & mrp_rec= mrpline.record(mrp_time); + real art_per_buck = mrp_rec.net_requirement(); // quantit� da produrre nel bucket - if (art_per_buck > ZERO) - { - real pieces, curr_arts; + if (art_per_buck > ZERO) + { + real pieces, curr_arts; - int lastbuck = mrpline.last_bucket(); - TString16 livello_di_giacenza(mrpline.livgiac()); - TString8 codlin(mrpline.codlin()); - TString8 codimp(mrpline.codimp()); - if (row != NULL) - { - codlin = row->get(F_CODLIN-FIRST_FIELD); - codimp = row->get(F_CODIMP-FIRST_FIELD); - } - dist_tree().set_global("_LIVELLO",livello_di_giacenza); - dist_tree().set_global("_IMPIANTO",codimp); - dist_tree().set_global("_LINEA",codlin); - dist_tree().set_global("_MAGDEP",mrpline.codmagdep()); - bool no_limits=(logic == _uniform_logic && !check_machine) - || !dist_tree().set_root(mrpline.articolo()); + int lastbuck = mrpline.last_bucket(); + TString16 livello_di_giacenza(mrpline.livgiac()); + TString8 codlin(mrpline.codlin()); + TString8 codimp(mrpline.codimp()); + if (row != NULL) + { + codlin = row->get(F_CODLIN-FIRST_FIELD); + codimp = row->get(F_CODIMP-FIRST_FIELD); + } + dist_tree().set_global("_LIVELLO",livello_di_giacenza); + dist_tree().set_global("_IMPIANTO",codimp); + dist_tree().set_global("_LINEA",codlin); + dist_tree().set_global("_MAGDEP",mrpline.codmagdep()); + bool no_limits=(logic == _uniform_logic && !check_machine) + || !dist_tree().set_root(mrpline.articolo()); + if (!no_limits) + { + TArray labors; + TRiga_esplosione * l=dist_tree().first_critical_labor(labors); + + no_limits = (l == NULL); + + bool first_buck = true; + if (!no_limits) { - TArray labors; - TRiga_esplosione * l=dist_tree().first_critical_labor(labors); - - no_limits = (l == NULL); - - bool first_buck = true; - - if (!no_limits) - { - TLavorazione *curr_labor = TDistinta_tree::find_labor(l); - // cerca le linee sulle quali e' possibile eseguire questa lavorazione - // e la carica con la lavorazione relativa all'articolo corrente - const int lineestd = curr_labor->linee_standard(); - const int maxlinee = useextralines ? curr_labor->linee() : lineestd; - const real perc_min_lav = curr_labor->percentuale_minima(); - TCRP_line *crpline_art,*crpline_lin,*crpline_imp,*crpline_firm; + TLavorazione *curr_labor = TDistinta_tree::find_labor(l); + // cerca le linee sulle quali e' possibile eseguire questa lavorazione + // e la carica con la lavorazione relativa all'articolo corrente + const int lineestd = curr_labor->linee_standard(); + const int maxlinee = useextralines ? curr_labor->linee() : lineestd; + const real perc_min_lav = curr_labor->percentuale_minima(); + TCRP_line *crpline_art,*crpline_lin,*crpline_imp,*crpline_firm; - real load, capacity, unit_load, hload, hcapacity, unit_hload ; // carichi di linea - int nbucket, lower_buck, upper_buck; - int attemp=1; // primo tentativo: rimane entro i vincoli di minimo e massimo anticipo utilizando solo le linee STD - // secondo tentativo: rimane entro i vincoli di minimo e massimo anticipo utilizando anche le linee non STD - // terzo tentativo: supera i vincoli di minimo e massimo anticipo utilizando anche le linee non STD - art_per_buck.round(5); - //if (nbucket>bucket) - if (art_per_buck > mrpline.net_requirement(lastbuck) && mode != _actual_plan) + real load, capacity, unit_load, hload, hcapacity, unit_hload ; // carichi di linea + int nbucket, lower_buck, upper_buck; + int attemp=1; // primo tentativo: rimane entro i vincoli di minimo e massimo anticipo utilizando solo le linee STD + // secondo tentativo: rimane entro i vincoli di minimo e massimo anticipo utilizando anche le linee non STD + // terzo tentativo: supera i vincoli di minimo e massimo anticipo utilizando anche le linee non STD + art_per_buck.round(5); + //if (nbucket>bucket) + if (art_per_buck > mrpline.net_requirement(lastbuck) && mode != _actual_plan) + { + // il sotto stock si propagherebbe fino alla fine ? + art_per_buck = mrpline.net_requirement(lastbuck) ; + mrpline.set_net_req(bucket,art_per_buck); + } + + int max_attempts = 3; + + // non anticipare articoli che potrebbero avere figli non anticipati automaticamente + if (!no_limits && get_bool(F_NOANTICIPI_MSP)) + max_attempts = 2; + + while (art_per_buck > ZERO && attemp <= max_attempts) + { + if (logic == _JIT_logic) { - // il sotto stock si propagherebbe fino alla fine ? - art_per_buck = mrpline.net_requirement(lastbuck) ; - mrpline.set_net_req(bucket,art_per_buck); - } - - int max_attempts = 3; - - // non anticipare articoli che potrebbero avere figli non anticipati automaticamente - if (!no_limits && get_bool(F_NOANTICIPI_MSP)) - max_attempts = 2; - - while (art_per_buck > ZERO && attemp <= max_attempts) - { - if (logic == _JIT_logic) - { - lower_buck = (attemp <= 2 ? bucket-anticipomax/days_per_bucket() : 1); - upper_buck = bucket - anticipomin/days_per_bucket(); + lower_buck = (attemp <= 2 ? bucket-anticipomax/days_per_bucket() : 1); + upper_buck = bucket - anticipomin/days_per_bucket(); } else { - lower_buck = bucket - anticipomax/days_per_bucket(); - if (firstfitxbucket) - upper_buck = LAST_BUCKET; - else - upper_buck = (attemp <= 2 ? bucket-anticipomin/days_per_bucket(): LAST_BUCKET); - } - if (lower_buck<1) - lower_buck=1; - if (!firstfitxbucket && upper_buck>bucket) - upper_buck=bucket; - nbucket= (logic == _JIT_logic) ? upper_buck : lower_buck; + lower_buck = bucket - anticipomax/days_per_bucket(); + if (firstfitxbucket) + upper_buck = LAST_BUCKET; + else + upper_buck = (attemp <= 2 ? bucket-anticipomin/days_per_bucket(): LAST_BUCKET); + } + if (lower_buck<1) + lower_buck=1; + if (!firstfitxbucket && upper_buck>bucket) + upper_buck=bucket; + nbucket= (logic == _JIT_logic) ? upper_buck : lower_buck; - int nlinea = -1, numlinee; + int nlinea = -1, numlinee; - if (ignore_lin || codlin.blank() ) - { - if (codlin.blank()) - { - nlinea=(attemp == 2 ? lineestd : 0 ) ; - numlinee=(attemp == 1 ? lineestd : maxlinee ) ; - } - else // l'utente ha fissato la linea - { - if (attemp == 1) - { - nlinea = curr_labor->find_linea(codlin); - numlinee = nlinea + 1; - } - if (nlinea < 0) - { - nlinea = 0; - numlinee = (attemp < 3 ? lineestd : maxlinee ) ; - } - } + if (ignore_lin || codlin.blank() ) + { + if (codlin.blank()) + { + nlinea=(attemp == 2 ? lineestd : 0 ) ; + numlinee=(attemp == 1 ? lineestd : maxlinee ) ; + } + else // l'utente ha fissato la linea + { + if (attemp == 1) + { + nlinea = curr_labor->find_linea(codlin); + numlinee = nlinea + 1; + } + if (nlinea < 0) + { + nlinea = 0; + numlinee = (attemp < 3 ? lineestd : maxlinee ) ; + } + } - } else { - nlinea= curr_labor->find_linea(codlin); - if (nlinea<0) - { - error_box(FR("La linea %s non e' in grado di produrre l'articolo %s"), (const char * )codlin, (const char *) _mrp_articles[mrp_row].articolo()); - break; - } - numlinee=nlinea+1; - } + } + else + { + nlinea= curr_labor->find_linea(codlin); + if (nlinea<0) + { + error_box(FR("La linea %s non e' in grado di produrre l'articolo %s"), (const char * )codlin, (const char *) _mrp_articles[mrp_row].articolo()); + break; + } + numlinee=nlinea+1; + } while (art_per_buck > ZERO // ho un sotto-stock da risolvere && nlinea >= 0 && nlinea<numlinee && nbucket>=lower_buck && nbucket <= upper_buck) // sono entro il range definito { @@ -1906,8 +1914,7 @@ bool TPlanning_mask::general_review(bool check_machine, bool check_human, bool u pi.addstatus(1); for (long mrp_row=0; mrp_row < max_mrp_rows; mrp_row++) { - pi.addstatus(1); - if (pi.iscancelled()) + if (!pi.addstatus(1)) return false; review_cell(mrp_row, bucket, check_machine, check_human, useextralines, useextrahours, lotsizing, no_outcapacity, anticipomin, anticipomax, mode, logic, msg, false); } @@ -2062,12 +2069,15 @@ void TPlanning_mask::msprow2codes(TToken_string &row,long &clifor, TCodice_artic lin = row.get(F_CODLIN-FIRST_FIELD); lin.trim(); um = row.get(F_UM-FIRST_FIELD); um.trim(); - const TString val = row.get(F_DESCART-FIRST_FIELD); + const TFixed_string val = row.get(F_DESCART-FIRST_FIELD); const int pos = val.find('�'); if (pos >= 0) + { da_rdoc_key = val.mid(pos+1); + da_rdoc_key.trim(); + } else - da_rdoc_key = EMPTY_STRING; + da_rdoc_key.cut(0); } void TPlanning_mask::crprow2codes(TToken_string &row, TString & imp, TString & lin, long &clifor, TCodice_articolo &art , @@ -3560,9 +3570,7 @@ bool TPlanning_mask::on_field_event(TOperable_field& o, TField_event e, long jol break; case F_CANCEL_MSP: if (e == fe_button) - { remove_propose(true); - } break; case F_RECALC_MSP: if (e == fe_button && check_fields()) diff --git a/mr/mr2200.h b/mr/mr2200.h index ea6f52e7a..b2d9471bf 100755 --- a/mr/mr2200.h +++ b/mr/mr2200.h @@ -3,7 +3,6 @@ #include <applicat.h> #include <colmask.h> -#include "mrplib.h" #include "mr2100.h" #include "mr2201.h" @@ -147,7 +146,7 @@ public: bool sortMSPsheet(); bool sortCRPsheet(); - virtual bool is_acq_planning() { return FALSE;} + virtual bool is_acq_planning() { return false;} TSelect_color_mask & sel() { return _sel_color; } TPlanning_mask(); virtual ~TPlanning_mask() { } @@ -162,12 +161,11 @@ protected: void openfiles() ; virtual TPlanning_mask& mask() {return *_m;} virtual void main_loop(); - virtual bool firm_change_enabled() const { return FALSE; } + virtual bool firm_change_enabled() const { return false; } virtual bool TPlanning_app::menu(MENU_TAG mt); public: TPlanning_app() : _m(NULL) {} }; - -#endif // __MR2200_H \ No newline at end of file +#endif // __MR2200_H diff --git a/mr/mr2200a.uml b/mr/mr2200a.uml index 9858476a8..46446668e 100755 --- a/mr/mr2200a.uml +++ b/mr/mr2200a.uml @@ -486,7 +486,7 @@ END LIST F_RECALC_TYPE 35 BEGIN - PROMPT 2 1 "Logica propositiva " + PROMPT 2 1 "Logica proposte " #ifndef _IS_ACQ ITEM "1|FirstFit " MESSAGE ENABLE,G_FINITE@ @@ -525,12 +525,12 @@ END BOOL F_FFBUCKET_MSP BEGIN - PROMPT 60 1 "First Fit sui bucket" + PROMPT 58 1 "Bucket First Fit" END STRING F_PRIORITY 60 BEGIN - PROMPT 2 2 "Priorita' " + PROMPT 2 2 "Priorit� " END BOOL F_LOTSIZING @@ -779,7 +779,7 @@ END BOOL F_MSP_SORT_PRILIN BEGIN - PROMPT 52 3 "Priorit� di linea" + PROMPT 55 3 "Priorit� di linea" END BUTTON F_MSP_RESORT 9 diff --git a/mr/mr2201.cpp b/mr/mr2201.cpp index 5ff3ec727..78fafd853 100755 --- a/mr/mr2201.cpp +++ b/mr/mr2201.cpp @@ -1219,6 +1219,7 @@ void TMSP_constraint::init() __userflds = new TToken_string(c.get("USERFLDS")); __sep = c.get_char("FLDSEP", NULL, -1, ';'); } + _da_rdoc_key.trim(); } TMSP_constraint::TMSP_constraint(long cliente, @@ -1347,7 +1348,10 @@ TMSP_constraint* TMSP_constraints::find(const TToken_string& row, bool create) const int pos = str.find('�'); if (pos >= 0) + { _key.add(str.mid(pos +1)); + _key.rtrim(); + } else _key.add("");