Patch level :

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
mr0100.cpp       Gestione tabelle IMP ed LNP
mrplib.*         Gestione calendari: lettura, scrittura, cancellazione
mrtbimp.uml      Tabella impianti
mrtblnp.uml      Tabella linee di produzione
mrtblnp.h        Simboli comuni alle due tabelle precedenti


git-svn-id: svn://10.65.10.50/trunk@7160 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1998-09-29 08:36:35 +00:00
parent 044adbb207
commit 899baaebcb
6 changed files with 334 additions and 119 deletions

View File

@ -23,45 +23,92 @@ protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
bool init_calendar();
bool save_calendar() const;
bool remove_calendar() const;
TMRP_mask(const char* name, int num = 0);
virtual ~TMRP_mask();
};
bool TMRP_mask::init_calendar()
{
bool changed = FALSE;
TString16 lin, imp;
if (app().get_tabname() == "LNP")
{
switch (get(F_TYPE)[0])
{
case 'L': lin = get(F_CODICE); imp = get(F_IMPIANTO); break;
case 'I': imp = get(F_IMPIANTO); break;
default : break;
}
}
else
{
if (get(F_TYPE) == "I")
imp = get(F_CODICE);
}
TCalendar_field& cf = (TCalendar_field&)field(F_CALENDAR);
if (_calendar == NULL)
{
_calendar = new TMRP_calendar(lin, imp);
changed = TRUE;
}
else
{
if (_calendar->linea() != 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));
return changed;
}
bool TMRP_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
const TString16 tn = app().get_tabname();
const TString& tn = app().get_tabname();
if (tn == "IMP" || tn == "LNP")
{
switch (o.dlg())
{
case F_CODICE:
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");
}
case F_CODICE:
case F_TYPE:
if (e == fe_modify)
{
TString16 lin, imp;
if (tn == "LNP")
if (init_calendar())
{
switch (get(F_TYPE)[0])
{
case 'L': lin = get(F_CODICE); imp = get(F_IMPIANTO); break;
case 'I': imp = get(F_IMPIANTO); break;
default : break;
}
TCalendar_field& cf = (TCalendar_field&)field(F_CALENDAR);
cf.win().force_update();
}
else
{
if (get(F_TYPE) == "I")
imp = get(F_CODICE);
}
if (_calendar == NULL)
_calendar = new TMRP_calendar(lin, imp);
else
_calendar->set(lin, imp);
TCalendar_field& cf = (TCalendar_field&)field(F_CALENDAR);
cf.set_calendar(_calendar, get_int(F_YEAR));
cf.win().force_update();
}
break;
case F_YEAR:
@ -80,10 +127,39 @@ bool TMRP_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
return TRUE;
}
bool TMRP_mask::save_calendar() const
{
if (_calendar != NULL)
{
TCalendar_field& cf = (TCalendar_field&)field(F_CALENDAR);
if (cf.dirty())
_calendar->rewrite();
}
return TRUE;
}
bool TMRP_mask::remove_calendar() const
{
if (_calendar != NULL)
{
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();
}
return TRUE;
}
TMRP_mask::TMRP_mask(const char* name, int num)
: TCalendar_mask(name, num), _calendar(NULL)
{
set_handlers();
}
TMRP_mask::~TMRP_mask()
@ -101,6 +177,14 @@ class TMRPtables : public TTable_application
protected:
virtual TString& get_mask_name(TString& name) const;
virtual TMask* set_mask(TMask* m);
virtual int write(const TMask& m);
virtual int rewrite(const TMask& m);
virtual bool remove();
public:
void save_calendar(const TMask& m);
void remove_calendar(const TMask& m);
};
TString& TMRPtables::get_mask_name(TString& name) const
@ -120,6 +204,51 @@ TMask* TMRPtables::set_mask(TMask* m)
return TTable_application::set_mask(m);
}
void TMRPtables::save_calendar(const TMask& m)
{
const TString& tn = get_tabname();
if (tn == "IMP" || tn == "LNP")
{
const TMRP_mask& cm = (const TMRP_mask&)m;
cm.save_calendar();
}
}
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;
cm.remove_calendar();
}
}
int TMRPtables::write(const TMask& m)
{
const int err = TTable_application::write(m);
if (err == NOERR)
save_calendar(m);
return err;
}
int TMRPtables::rewrite(const TMask& m)
{
const int err = TTable_application::rewrite(m);
if (err == NOERR)
save_calendar(m);
return err;
}
bool TMRPtables::remove()
{
const bool ok = TTable_application::remove();
if (ok)
remove_calendar(curr_mask());
return ok;
}
int mr0100(int argc, char* argv[])
{
if (argc > 2)

View File

@ -38,7 +38,7 @@ bool TMRP_calendar::is_red(const TDate& date) const
return is_holiday(date);
}
void TMRP_calendar::add_holiday(int g, int m)
void TMRP_calendar::declare_holiday(int g, int m)
{
if (!is_holiday(g, m))
{
@ -62,18 +62,87 @@ void TMRP_calendar::suppress_holiday(int g, int m)
void TMRP_calendar::read_cal(const TString& key, char tipo)
{
TTable cal(tipo == 'L' ? "CAL" : "CAI");
cal.put("CODTAB", key);
TString80 s1;
TString16 codtab = tipo == 'L' ? _codlin : _codimp;
codtab << key;
cal.put("CODTAB", codtab);
TString* s1 = new TString(62);
if (cal.read() == NOERR)
s1 = cal.get("S1");
s1.left_just(62);
*s1 = cal.get("S1");
const int l1 = s1->len();
if (l1 < s1->size())
{
const TString spc(s1->size()-l1, ' ');
*s1 << spc;
}
if (tipo == 'L')
_exc_lin.add(key, s1);
else
_exc_imp.add(key, s1);
}
int TMRP_calendar::turni(const TDate& data, int& mini, int& maxi)
int TMRP_calendar::write_cal(char tipo) const
{
int err = NOERR;
TTable cal((tipo == 'L') ? "CAL" : "CAI");
TAssoc_array& ass = tipo == 'L' ? ((TMRP_calendar*)this)->_exc_lin
: ((TMRP_calendar*)this)->_exc_imp;
TString codtab, s0;
FOR_EACH_ASSOC_STRING(ass, hash, key, str)
{
codtab = tipo == 'L' ? _codlin : _codimp;
codtab.left_just(5); codtab << key;
cal.zero();
cal.put("CODTAB", codtab);
const TFixed_string s1(str);
if (!s1.blank())
{
const int anno = atoi(codtab.mid(5, 4));
const int mese = atoi(codtab.mid(9, 2));
if (tipo == 'L')
{
s0 = "Linea ";
s0 << _codlin;
}
else
{
s0 = "Impianto ";
s0 << _codimp;
}
s0 << ' ' << anno << ' ' << itom(mese);
cal.put("S0", s0);
cal.put("S1", s1);
err = cal.write();
if (err != NOERR)
err = cal.rewrite();
if (err != NOERR)
{
error_box("Errore %d nell'aggiornamento del calendario %s",
err, (const char*)codtab);
break;
}
}
else
err = cal.remove();
}
return err;
}
int TMRP_calendar::remove_cal(const TString& code, char tipo) const
{
TTable cal(tipo == 'L' ? "CAL" : "CAI");
TString16 codtab = code; codtab.left_just(5);
cal.put("CODTAB", codtab);
for (int err = cal.read(_isgteq); err == NOERR; err = cal.next())
{
if (codtab == cal.get("CODTAB").left(5))
cal.remove();
else
break;
}
return NOERR;
}
int TMRP_calendar::turni(const TDate& data, int& mini, int& maxi, bool as_is)
{
const int year = data.year();
const int month = data.month();
@ -83,29 +152,30 @@ int TMRP_calendar::turni(const TDate& data, int& mini, int& maxi)
mini = maxi = -1;
if (_codlin.not_empty())
{
str.format("%5s%4d%02d", _codlin, year, month);
str.format("%04d%02d", year, month);
if (_exc_lin.objptr(str) == NULL)
read_cal(str, 'L');
const TString& turn = (const TString&)_exc_lin[str];
mini = turn[day] - '0';
maxi = turn[day+31] - '0';
mini = turn[day-1] - '0';
maxi = turn[day+30] - '0';
if (as_is || (mini >= 0 && maxi >= 0))
return 3;
}
if (mini >= 0 && maxi >= 0)
return 3;
if (_codimp.not_empty())
{
str.format("%5s%4d%02d", _codimp, year, month);
str.format("%04d%02d", year, month);
if (_exc_imp.objptr(str) == NULL)
read_cal(str, 'I');
const TString& turn = (const TString&)_exc_imp[str];
mini = turn[day] - '0';
maxi = turn[day+31] - '0';
mini = turn[day-1] - '0';
maxi = turn[day+30] - '0';
if (as_is || (mini >= 0 && maxi >= 0))
return 2;
}
if (mini >= 0 && maxi >= 0)
return 2;
if (_days.empty())
init_default();
@ -121,13 +191,13 @@ int TMRP_calendar::turni(const TDate& data, int& mini, int& maxi)
if (data == festa)
{
if (mini < 0) mini = _days[7] - '0';
if (maxi < 0) maxi = _days[7] - '0';
if (maxi < 0) maxi = _days[15] - '0';
break;
}
}
if (mini >= 0 && maxi >= 0)
return 1;
}
if (mini >= 0 && maxi >= 0)
return 1;
// Usa giorni default
const int giorno = data.wday() - 1;
@ -145,36 +215,36 @@ int TMRP_calendar::set_turni(const TDate& data, int mini, int maxi)
if (_codlin.not_empty())
{
str.format("%5s%4d%02d", _codlin, year, month);
str.format("%04d%02d", year, month);
if (_exc_lin.objptr(str) == NULL)
read_cal(str, 'L');
TString& turn = (TString&)_exc_lin[str];
if (mini >= 0 && mini <= 9)
turn[day] = '0' + mini;
turn[day-1] = '0' + mini;
else
turn[day] = ' ';
turn[day-1] = ' ';
if (maxi >= 0 && maxi <= 9)
turn[day+31] = '0' + maxi;
turn[day+30] = '0' + maxi;
else
turn[day+31] = ' ';
turn[day+30] = ' ';
return 3;
}
if (_codimp.not_empty())
{
str.format("%5s%4d%02d", _codimp, year, month);
str.format("%04d%02d", year, month);
if (_exc_imp.objptr(str) == NULL)
read_cal(str, 'I');
TString& turn = (TString&)_exc_imp[str];
if (mini >= 0 && mini <= 9)
turn[day] = '0' + mini;
turn[day-1] = '0' + mini;
else
turn[day] = ' ';
turn[day-1] = ' ';
if (maxi >= 0 && maxi <= 9)
turn[day+31] = '0' + maxi;
turn[day+30] = '0' + maxi;
else
turn[day+31] = ' ';
turn[day+30] = ' ';
return 2;
}
@ -203,10 +273,12 @@ int TMRP_calendar::set_turni(const TDate& data, int mini, int maxi)
}
const int giorno = data.wday() - 1;
if (mini >= 0 && mini <= 9)
_days[giorno] = '0' + mini;
else
_days[giorno] = '0';
if (maxi >= 0 && maxi <= 9)
_days[giorno+8] = '0' + maxi;
else
@ -215,53 +287,27 @@ int TMRP_calendar::set_turni(const TDate& data, int mini, int maxi)
return 0;
}
int TMRP_calendar::write()
int TMRP_calendar::write() const
{
int err = NOERR;
if (!_codlin.blank())
return write_cal('L');
if (_codlin.not_empty())
{
TTable cal("CAL");
FOR_EACH_ASSOC_STRING(_exc_lin, hash, key, str)
{
cal.put("CODTAB", key);
cal.put("S1", str);
err = cal.rewrite();
if (err != NOERR)
err = cal.write();
if (err != NOERR)
{
error_box("Errore %d nell'aggiornamento del calendario.", err);
break;
}
}
return err;
}
if (_codimp.not_empty())
{
TTable cal("CAI");
FOR_EACH_ASSOC_STRING(_exc_imp, hash, key, str)
{
cal.put("CODTAB", key);
cal.put("S1", (const TString&)_exc_imp[key]);
err = cal.rewrite();
if (err != NOERR)
err = cal.write();
if (err != NOERR)
{
error_box("Errore %d nell'aggiornamento del calendario.", err);
break;
}
}
return err;
}
if (!_codimp.blank())
return write_cal('I');
TConfig cfg(CONFIG_DITTA, "mr");
cfg.set("Turni", _days);
cfg.set("Feste", _holidays);
return err;
return NOERR;
}
int TMRP_calendar::remove() const
{
if (_codlin.not_empty())
return remove_cal(_codlin, 'L');
if (_codimp.not_empty())
return remove_cal(_codimp, 'I');
return NOERR;
}
void TMRP_calendar::set(const char* linea, const char* impianto)
@ -278,7 +324,7 @@ void TMRP_calendar::set(const char* linea, const char* impianto)
lnp.put("CODTAB", _codlin);
if (lnp.read() == NOERR)
{
if (_codimp.empty())
if (impianto == NULL)
_codimp = lnp.get("S6");
}
else
@ -293,6 +339,15 @@ void TMRP_calendar::set(const char* linea, const char* impianto)
}
}
char TMRP_calendar::tipo() const
{
if (!_codlin.blank())
return 'L';
if (!_codimp.blank())
return 'I';
return 'S';
}
TMRP_calendar::TMRP_calendar(const char* linea, const char* impianto)
{
set(linea, impianto);
@ -313,6 +368,7 @@ protected:
public:
void set_calendar(TMRP_calendar* cal, int year = 0);
TMRP_calendar* get_calendar() { return _calendario; }
TCalendar_win(int x, int y, int dx, int dy,
WINDOW parent, TWindowed_field* owner);
@ -341,6 +397,8 @@ void TCalendar_win::handler(WINDOW win, EVENT* ep)
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");
m.add_button(DLG_OK, 0, "", -12, -1, 10, 2);
m.add_button(DLG_CANCEL, 0, "", -22, -1, 10, 2);
@ -349,9 +407,13 @@ void TCalendar_win::handler(WINDOW win, EVENT* ep)
m.set(101, d.string());
m.set(102, itow(d.wday()));
m.set(103, festa ? "X" : "");
int mini, maxi; _calendario->turni(d, mini, maxi);
int mini, maxi;
_calendario->turni(d, mini, maxi, TRUE);
m.set(104, mini);
m.set(105, maxi);
_calendario->turni(d, mini, maxi, FALSE);
m.set(106, mini);
m.set(107, maxi);
if (m.run() == K_ENTER && m.dirty())
{
const char mi = m.get(104)[0];
@ -364,11 +426,11 @@ void TCalendar_win::handler(WINDOW win, EVENT* ep)
if (fe != festa)
{
if (fe)
_calendario->add_holiday(d.day(), d.month());
_calendario->declare_holiday(d.day(), d.month());
else
_calendario->suppress_holiday(d.day(), d.month());
}
owner().set_dirty();
force_update();
}
}
@ -470,7 +532,6 @@ TField_window* TCalendar_field::create_window(int x, int y, int dx, int dy, WIND
return new TCalendar_win(x, y, dx, dy, parent, this);
}
void TCalendar_field::set_calendar(TMRP_calendar* cal, int year)
{
TCalendar_win& cw = (TCalendar_win&)win();
@ -492,5 +553,6 @@ TMask_field* TCalendar_mask::parse_field(TScanner& scanner)
TCalendar_mask::TCalendar_mask(const char* name, int num)
{
read_mask(name, num, 0);
set_handlers();
}

View File

@ -15,9 +15,11 @@ class TMRP_calendar : public TObject
protected:
void init_default();
void read_cal(const TString& key, char tipo);
int write_cal(char tipo) const;
int remove_cal(const TString& code, char tipo) const;
public:
int turni(const TDate& date, int& mini, int& maxi);
int turni(const TDate& date, int& mini, int& maxi, bool as_is = FALSE);
int turni_min(const TDate& date)
{ int mini, maxi; turni(date, mini, maxi); return mini; }
@ -27,16 +29,20 @@ public:
int set_turni(const TDate& date, int mini, int maxi);
int write();
int rewrite() { return write(); }
int write() const;
int rewrite() const { return write(); }
int remove() const;
void add_holiday(int g, int m);
void declare_holiday(int g, int m);
void suppress_holiday(int g, int m);
bool is_holiday(int g, int m) const;
bool is_holiday(const TDate& date) const;
bool is_red(const TDate& date) const;
void set(const char* linea, const char* impianto);
void set(const char* linea = NULL, const char* impianto = NULL);
const TString& linea() const { return _codlin; }
const TString& impianto() const { return _codimp; }
char tipo() const;
TMRP_calendar(const char* linea = NULL, const char* impianto = NULL);
virtual ~TMRP_calendar() { }
@ -58,6 +64,7 @@ class TCalendar_mask : public TAutomask
{
protected:
virtual TMask_field* parse_field(TScanner& scanner);
public:
TCalendar_mask(const char* name, int num = 0);
virtual ~TCalendar_mask() {};

View File

@ -1,10 +1,11 @@
#include "mrtbimp.h"
#include "mrtblnp.h"
TOOLBAR "" 0 19 80 3
#include <toolbar.h>
ENDPAGE
PAGE "Tabella IMP" -1 -1 65 15
PAGE "Impianti" -1 -1 65 15
GROUPBOX DLG_NULL 78 5
BEGIN
PROMPT 1 1 ""
@ -41,4 +42,27 @@ END
ENDPAGE
PAGE "Calendario" -1 -1 65 15
NUMBER F_YEAR 4
BEGIN
PROMPT 1 1 "Anno "
FLAGS "A"
END
RADIOBUTTON F_TYPE 28
BEGIN
PROMPT 16 0 ""
ITEM "I|Impianto"
ITEM "S|Standard"
FLAGS "Z"
END
CALENDAR F_CALENDAR -3 -1
BEGIN
PROMPT 0 2 ""
END
ENDPAGE
ENDMASK

View File

@ -6,9 +6,7 @@
#define F_IMPIANTO 103
#define F_DESCIMPIANTO 104
#define F_PERSONE 105
#define F_TURNI 106
#define F_YEAR 201
#define F_TYPE 202

View File

@ -52,6 +52,7 @@ BEGIN
OUTPUT F_DESCIMPIANTO S0
CHECKTYPE NORMAL
FIELD S6
WARNING "Impianto assente"
END
STRING F_DESCIMPIANTO 50
@ -62,7 +63,8 @@ BEGIN
DISPLAY "Codice@20" CODTAB
DISPLAY "Descrizione@50" S0
COPY OUTPUT F_IMPIANTO
CHECKTYPE REQUIRED
CHECKTYPE NORMAL
WARNING "Impianto assente"
END
GROUPBOX DLG_NULL 78 4
@ -77,13 +79,6 @@ BEGIN
FIELD I0
END
NUMBER F_TURNI 1
BEGIN
PROMPT 2 8 "Turni standard "
FLAGS "U"
FIELD I1
END
ENDPAGE
PAGE "Calendario" -1 -1 65 15
@ -94,12 +89,13 @@ BEGIN
FLAGS "A"
END
LIST F_TYPE 1 10
RADIOBUTTON F_TYPE 42
BEGIN
PROMPT 21 1 "Tipo "
PROMPT 16 0 ""
ITEM "L|Linea"
ITEM "I|Impianto"
ITEM "S|Standard"
FLAGS "Z"
END
CALENDAR F_CALENDAR -3 -1
@ -107,7 +103,6 @@ BEGIN
PROMPT 0 2 ""
END
ENDPAGE