git-svn-id: svn://10.65.10.50/branches/R_10_00@23130 c028cbd2-c16b-5b4b-a496-9718f37d4682

This commit is contained in:
guy 2015-11-04 14:09:21 +00:00
parent 1d7113ae36
commit e564c49cef
16 changed files with 164 additions and 599 deletions

View File

@ -1900,7 +1900,7 @@ TStudy_mask::TStudy_mask() : TAutomask(TR("Scelta studio"), 1, 60, 3)
bool TMenu_application::choose_study() bool TMenu_application::choose_study()
{ {
// Disbilita le voci di personalizzazione // Disabilita le voci di personalizzazione
enable_options_menu(false); enable_options_menu(false);
TStudy_mask m; TStudy_mask m;

View File

@ -636,7 +636,7 @@ void TMenulist_window::update()
return; // Nothing to draw return; // Nothing to draw
const bool db = ADVANCED_GRAPHICS; const bool db = ADVANCED_GRAPHICS;
TImage* img = db ? _images.image(_image_name) : NULL; // Delay time before clearing TImage* img = db ? _images.image(_image_name) : NULL;
if (img != NULL) if (img != NULL)
{ {
@ -969,57 +969,44 @@ void draw_spider(WINDOW w, int mode, const PNT& mouse)
{ {
RCT client; xvt_vobj_get_client_rect(w, &client); RCT client; xvt_vobj_get_client_rect(w, &client);
if (client.right > 128 && client.bottom > 64) const int nRadius = 48;
if (client.right > 2*nRadius && client.bottom > 2*nRadius)
{ {
const PNT p0 = { client.top+64, client.right-64 }; // Centro del ragno const PNT p0 = { client.top+3*nRadius/2, client.right-3*nRadius/2 }; // Centro dello smile
CBRUSH brush_yellow; brush_yellow.color = COLOR_YELLOW; brush_yellow.pat = PAT_SOLID;
xvt_dwin_set_std_cpen(w, TL_PEN_BLACK);
if (mode & 0x1) if (mode & 0x1)
{ {
// Disegno il filo // Disegno la faccina
const PNT p1 = { client.top, p0.h }; xvt_dwin_set_cbrush(w, &brush_yellow);
xvt_dwin_set_std_cpen(w, TL_PEN_LTGRAY); RCT rct; xvt_rect_set(&rct, p0.h-nRadius, p0.v-nRadius, p0.h+nRadius, p0.v+nRadius);
xvt_dwin_draw_set_pos(w, p0); xvt_dwin_draw_line(w, p1);
// Disegno il corpicino
xvt_dwin_set_std_cpen(w, TL_PEN_BLACK);
xvt_dwin_set_std_cbrush(w, TL_BRUSH_BLACK);
RCT rct; xvt_rect_set(&rct, p0.h-20, p0.v-10, p0.h+20, p0.v+10);
xvt_dwin_draw_oval(w, &rct); xvt_dwin_draw_oval(w, &rct);
// Disegno le 4 paia di zampette
const int leg = 20;
const int foot = 10;
for (int i = 0; i < 4; i++)
{
PNT p[8];
p[0].h = rct.left-leg-3*i; p[0].v = rct.bottom-3*i; // Zampa sinistra
p[1].h = p[0].h+foot; p[1].v = p[0].v;
p[2].h = p[0].h; p[2].v = p[0].v-leg-3*i;
p[3] = p0; // Centro del corpo
p[4].h = 2*p0.h-p[2].h; p[4].v = p[2].v; // Zampa destra simmetrica
p[5].h = 2*p0.h-p[1].h; p[5].v = p[1].v;
p[6].h = 2*p0.h-p[0].h; p[6].v = p[0].v;
xvt_dwin_draw_polyline(w, p, 7);
}
} }
if (mode & 0x2) if (mode & 0x2)
{ {
const int eye = 7; const int eye = nRadius/4;
const int pupil = 3; const int pupil = 2*eye/3;
RCT rct; // rettangolo jolly RCT rct; // rettangolo jolly
// Disegno gli occhietti // Disegno gli occhietti
xvt_dwin_set_std_cpen(w, TL_PEN_BLACK);
for (int i = 0; i < 2; i++) for (int i = 0; i < 2; i++)
{ {
// Calcolo il centro dell'occhietto // Calcolo il centro dell'occhietto
const PNT p1 = { p0.v-eye, i == 0 ? p0.h-(5*eye/4) : p0.h+(5*eye/4) }; const PNT p1 = { p0.v-eye, i == 0 ? p0.h-(5*eye/4) : p0.h+(5*eye/4) };
// Disegno il bulbo // Disegno il bulbo
xvt_rect_set(&rct, p1.h-eye, p1.v-eye, p1.h+eye, p1.v+eye); xvt_rect_set(&rct, p1.h-eye, p1.v-2*eye, p1.h+eye, p1.v+2*eye);
xvt_dwin_set_std_cbrush(w, TL_BRUSH_WHITE); xvt_dwin_set_std_cbrush(w, TL_BRUSH_WHITE);
xvt_dwin_draw_oval(w, &rct); xvt_dwin_draw_oval(w, &rct);
// Disegno la pupilla // Disegno la pupilla
const int dx = mouse.h <= rct.left ? -pupil : (mouse.h >= rct.right ? +pupil : 0); const double angle = atan2(double(mouse.v - p1.v), double(mouse.h - p1.h));
const int dy = mouse.v <= rct.top ? -pupil : (mouse.v >= rct.bottom ? +pupil : 0); const int mx = eye-pupil+1; int dx = mouse.h - p1.h;
const int my = 2*eye-pupil+1; int dy = mouse.v - p1.v;
if (abs(dx) > mx || abs(dy) > my)
{
dx = int(cos(angle)*mx+0.5);
dy = int(sin(angle)*my+0.5);
}
xvt_rect_set(&rct, p1.h-pupil+dx, p1.v-pupil+dy, p1.h+pupil+dx, p1.v+pupil+dy); xvt_rect_set(&rct, p1.h-pupil+dx, p1.v-pupil+dy, p1.h+pupil+dx, p1.v+pupil+dy);
xvt_dwin_set_std_cbrush(w, TL_BRUSH_BLACK); xvt_dwin_set_std_cbrush(w, TL_BRUSH_BLACK);
xvt_dwin_draw_oval(w, &rct); xvt_dwin_draw_oval(w, &rct);
@ -1028,9 +1015,21 @@ void draw_spider(WINDOW w, int mode, const PNT& mouse)
// Disegno la boccuccia aperta se il mouse e' vicino // Disegno la boccuccia aperta se il mouse e' vicino
const int dx = mouse.h-p0.h, dy = mouse.v-p0.v; const int dx = mouse.h-p0.h, dy = mouse.v-p0.v;
const bool vicino = dx*dx+dy*dy < 65536; const bool vicino = dx*dx+dy*dy < 65536;
xvt_dwin_set_std_cbrush(w, vicino ? TL_BRUSH_WHITE : TL_BRUSH_BLACK); xvt_rect_set(&rct, p0.h-nRadius/2, p0.v+nRadius/4, p0.h+nRadius/2, p0.v+3*nRadius/4);
xvt_rect_set(&rct, p0.h-eye, p0.v, p0.h+eye, p0.v+eye); if (vicino)
{
xvt_dwin_set_std_cbrush(w, TL_BRUSH_BLACK);
xvt_dwin_draw_oval(w, &rct); xvt_dwin_draw_oval(w, &rct);
}
else
{
const int my = (rct.top + rct.bottom)/2;
xvt_dwin_set_std_cpen(w, TL_PEN_HOLLOW);
xvt_dwin_set_cbrush(w, &brush_yellow);
xvt_dwin_draw_oval(w, &rct);
xvt_dwin_set_std_cpen(w, TL_PEN_BLACK);
xvt_dwin_draw_arc(w, &rct, rct.left, my, rct.right, my);
}
// Il puntatore del mouse diventa una mosca vicino al ragno // Il puntatore del mouse diventa una mosca vicino al ragno
xvt_win_set_cursor(w, vicino ? 8883 : CURSOR_ARROW); xvt_win_set_cursor(w, vicino ? 8883 : CURSOR_ARROW);

View File

@ -89,7 +89,9 @@ bool TEdit_file::browse_cursor(TCursor& cursor, const TFilename& fname)
} }
head << '@' << max(len, (int)strlen(n)); head << '@' << max(len, (int)strlen(n));
if (t == _realfld || t == _intfld || t == _longfld || t == _wordfld || t == _realfld) if (t == _realfld || t == _intfld || t == _longfld || t == _wordfld || t == _realfld)
head << 'R'; head << 'R'; else
if (t == _boolfld)
head << 'C';
} }
const bool superprassi = user() == ::dongle().administrator(); const bool superprassi = user() == ::dongle().administrator();
@ -107,23 +109,20 @@ bool TEdit_file::browse_cursor(TCursor& cursor, const TFilename& fname)
if (ch == K_DEL && sheet.one_checked()) if (ch == K_DEL && sheet.one_checked())
{ {
const long checked = sheet.checked(); const long checked = sheet.checked();
if (yesno_box(FR("Si desidera cancellare i %ld record indicati?"), checked)) if (yesno_box(FR("Cancellare %ld record?"), checked))
{ {
const long items = sheet.items(); const long items = sheet.items();
cursor.freeze(TRUE); cursor.freeze();
TProgind pi(items, TR("Attendere..."), true, true); TProgress_monitor pi(checked, TR("Cancellazione"), true);
for (TRecnotype j = 0; j < items; j++) for (TRecnotype j = 0; j < items; j++) if (sheet.checked(j))
{
if (!pi.setstatus(j))
break;
if (sheet.checked(j))
{ {
cursor = j; cursor = j;
cursor.file().remove(); cursor.file().remove();
sheet.uncheck(j); sheet.uncheck(j);
if (!pi.add_status())
break;
} }
} cursor.freeze(false);
cursor.freeze(FALSE);
} }
// Forza update del cursore // Forza update del cursore
@ -144,7 +143,7 @@ bool TEdit_file::browse_cursor(TCursor& cursor, const TFilename& fname)
edit_record(curr); edit_record(curr);
break; break;
case K_DEL: // delete record case K_DEL: // delete record
if (yesno_box(TR("Confermare la cancellazione del record"))) if (delete_box(TR("Confermare la cancellazione del record")))
cursor.file().remove(); cursor.file().remove();
break; break;
case K_INS: // insert new record case K_INS: // insert new record
@ -164,7 +163,7 @@ bool TEdit_file::browse_file(int logicnum, const TFilename& name, const TString&
if (logicnum >= LF_USER) if (logicnum >= LF_USER)
{ {
TSystemisamfile test(logicnum); TSystemisamfile test(logicnum);
int err = test.open_ex(); const int err = test.open_ex();
if (err != NOERR) if (err != NOERR)
return error_box(FR("Impossibile aprire il file %d: errore %d"), logicnum, err); return error_box(FR("Impossibile aprire il file %d: errore %d"), logicnum, err);
test.close(); test.close();
@ -221,6 +220,8 @@ void TEdit_file::edit_record(TRectype& rec)
short nid = 100; short nid = 100;
bool grouped = false; bool grouped = false;
const int x = 3;
FOR_EACH_ARRAY_ROW(flds, i, row) FOR_EACH_ARRAY_ROW(flds, i, row)
{ {
// add fields ONE by ONE // add fields ONE by ONE
@ -242,33 +243,34 @@ void TEdit_file::edit_record(TRectype& rec)
switch (rec.type(cp)) switch (rec.type(cp))
{ {
case _alfafld: case _alfafld:
m.add_string(nid++,curpage, s, 3, currow, len, "_", len > 50 ? 50 : len); m.add_string(nid++,curpage, s, x, currow, len, "_", len > 50 ? 50 : len);
break; break;
case _intfld: case _intfld:
case _longfld: case _longfld:
case _wordfld: case _wordfld:
case _realfld: case _realfld:
m.add_number(nid++, curpage, s, 3, currow, len, "", rec.ndec(cp)); m.add_number(nid++, curpage, s, x, currow, len, "", rec.ndec(cp));
break; break;
case _datefld: case _datefld:
m.add_date(nid++, curpage, s, 3, currow, ""); m.add_date(nid++, curpage, s, x, currow, "");
break; break;
case _charfld: case _charfld:
m.add_string(nid++, curpage, s, 3, currow, 1, ""); m.add_string(nid++, curpage, s, x, currow, 1, "");
break; break;
case _boolfld: case _boolfld:
m.add_boolean(nid++, curpage, s, 3, currow, ""); m.add_boolean(nid++, curpage, s, x, currow, "");
break; break;
case _intzerofld: case _intzerofld:
case _longzerofld: case _longzerofld:
m.add_number(nid++, curpage, s, 3, currow, len, "Z", 0); m.add_number(nid++, curpage, s, x, currow, len, "Z", 0);
break; break;
case _memofld: case _memofld:
m.add_zoom( nid++, curpage, s, 3, currow, 50, "", 50 ); m.add_zoom( nid++, curpage, s, x, currow, 50, "", 50 );
break; break;
default: default:
break; break;
} }
m.field(nid-1).set(rec.get(cp)); m.field(nid-1).set(rec.get(cp));
if (((i+1) % fpp) == 0 || i == recs-1) if (((i+1) % fpp) == 0 || i == recs-1)

View File

@ -82,7 +82,7 @@ clock_t TTest_application::start_progind(const long items, const char* prompt)
clock_t TTest_application::stop_progind() clock_t TTest_application::stop_progind()
{ {
clock_t t = clock(); const clock_t t = clock();
if (_pi != NULL) if (_pi != NULL)
{ {
delete _pi; delete _pi;

View File

@ -198,30 +198,17 @@ protected:
virtual bool use_files() const { return false; } virtual bool use_files() const { return false; }
virtual bool test_assistance_year() const; virtual bool test_assistance_year() const;
void garble_module(word n, TString& str1, TString& str2) const;
void garble_users(word u, TString& str1, TString& str2) const;
void garble_year(word year, TString& str1, TString& str2) const;
word& serno() { return _serno; } word& serno() { return _serno; }
void init_mask(); void init_mask();
void update_listino();
void load_masklistino(TMask & m);
void save_masklistino(TMask & m);
int build_sheet(bool on = true); int build_sheet(bool on = true);
static void keyext(const TString & s, word * v); static void keyext(const TString & s, word * v);
static void encode_second_key(); static void encode_second_key();
static bool k_notify(TSheet_field& f, int r, KEY k); static bool k_notify(TSheet_field& f, int r, KEY k);
static bool change_users_handler(TMask_field&, KEY key);
static bool maxuser_handler(TMask_field& fld, KEY key);
static bool change_assist_handler(TMask_field&, KEY key);
static bool assist_handler(TMask_field& fld, KEY key);
static bool print_handler(TMask_field& fld, KEY key); static bool print_handler(TMask_field& fld, KEY key);
static bool printlist_handler(TMask_field& fld, KEY key); static bool printlist_handler(TMask_field& fld, KEY key);
static bool aggiorna_listino_handler(TMask_field& fld, KEY key);
static bool modifica_listino_handler(TMask_field& fld, KEY key);
static bool aga_handler(TMask_field& fld, KEY key); static bool aga_handler(TMask_field& fld, KEY key);
static bool sh_nposti_handler(TMask_field& fld, KEY key); static bool sh_nposti_handler(TMask_field& fld, KEY key);
static bool sh_acquisto_handler(TMask_field& fld, KEY key); static bool sh_acquisto_handler(TMask_field& fld, KEY key);
@ -231,8 +218,6 @@ protected:
bool new_module_requested(); bool new_module_requested();
bool dongle_update_needed() const; bool dongle_update_needed() const;
void print_request();
void print_answer();
void print_status(); void print_status();
public: public:
@ -276,246 +261,9 @@ void TAttivazione_moduli::garble_dongle(word k[4]) const
::dongle().garble(k); ::dongle().garble(k);
} }
void TAttivazione_moduli::garble_module(word n, TString& str1, TString& str2) const #define YEAR_MIN 2121
{
const TDate today(_msk->get(F_DT));
const long val = today.date2julian();
word data[4];
data[0] = word(_msk->get_int(F_SN));
data[1] = word(val >> 16);
data[2] = n;
data[3] = word(val & 0xFFFF);
garble_dongle(data);
str1.format("%04X%04X", data[0], data[1]);
str2 = ::dongle().module_code2name(n);
str2.upper();
str2 = garble_md5(str2);
}
const TString& TAttivazione_moduli::garble_md5(const char* strin) const
{
const TDate today(_msk->get(F_DT));
TString80 chiaro, cifrato;
chiaro.format("%8ld%d%s", today.date2ansi(), _msk->get_int(F_SN), strin);
xvt_str_md5(chiaro, cifrato.get_buffer(32));
cifrato.upper();
return cifrato.right(8);
}
const TString& TAttivazione_moduli::garble_md5(long numin) const
{
TString16 strin; strin.format("%ld", numin);
return garble_md5(strin);
}
void TAttivazione_moduli::garble_users(word u, TString& str1, TString& str2) const
{
const TDate today(_msk->get(F_DT));
const long val = today.date2julian();
word data[4];
data[0] = u;
data[1] = word(val >> 16);
data[2] = word(_msk->get_int(F_SN));
data[3] = word(val & 0xFFFF);
garble_dongle(data);
str1.format("%04X%04X", data[0], data[1]);
str2 = garble_md5(u);
}
void TAttivazione_moduli::garble_year(word y, TString& str1, TString& str2) const
{
const TDate today(_msk->get(F_DT));
const long val = today.date2julian();
word data[4];
data[0] = word(_msk->get_int(F_SN));
data[1] = word(val >> 16);
data[2] = y;
data[3] = word(val & 0xFFFF);
garble_dongle(data);
str1.format("%04X%04X", data[0], data[1]);
str2 = garble_md5(y);
}
bool TAttivazione_moduli::maxuser_handler(TMask_field& fld, KEY key)
{
bool ok = true;
if (key == K_TAB && !fld.empty())
{
const int utenti = atoi(fld.get());
if (utenti > 0 && utenti < 1000)
{
TString8 str1, str2;
app().garble_users(utenti, str1, str2);
fld.mask().set(102, str1);
fld.mask().set(103, str2);
}
}
if (key == K_ENTER)
{
const int utenti = atoi(fld.get());
if (utenti <= 0 || utenti >= 1000)
ok = fld.error_box(TR("Numero di utenti errato"));
}
return ok;
}
bool TAttivazione_moduli::change_users_handler(TMask_field& fld, KEY key)
{
if (key == K_SPACE)
{
TDongle& d = ::dongle();
if (d.hardware() == _dongle_ssa)
return message_box(TR("E' necessario contattare attivazione_moduli@sirio-is.it"));
TMask m(TR("Utenti"), 1, 26, 7);
m.add_number(101, 0, PR("Utenti "), 1, 1, 4, "U");
m.add_string(102, 0, PR("Codice "), 1, 2, 8, "DU");
if (d.type() == _user_dongle)
{
m.set(101, d.max_users());
m.enable(102);
}
else
{
m.set_handler(101, maxuser_handler);
m.add_string(103, 0, PR("WebCod "), 1, 3, 8, "DU");
}
m.add_button(DLG_OK, 0, "", -12, -1, 10, 2);
m.add_button(DLG_CANCEL, 0, "", -22, -1, 10, 2);
if (m.run() == K_ENTER)
{
const int utenti = m.get_int(101);
if (d.type() == _user_dongle)
{
if (utenti > 0 && utenti < 1000)
{
if (m.field(102).empty())
{
app()._wanted_users = utenti;
if (utenti > 0)
fld.message_box(TR("Premere 'Stampa'\nper richiedere l'attivazione di %d utenti."),
utenti);
}
else
{
TString8 str1, str2;
app().garble_users(utenti, str1, str2);
if ((m.get(102) == str1) || (m.get(102) == str2))
{
d.set_max_users(utenti);
fld.mask().set(F_USERS, utenti);
}
else
fld.error_box(TR("Codice errato"));
}
}
else
fld.error_box(TR("Numero di utenti errato"));
}
else
app()._wanted_users = utenti;
}
}
return true;
}
#define YEAR_MIN 2081
#define YEAR_MAX 2777 #define YEAR_MAX 2777
bool TAttivazione_moduli::assist_handler(TMask_field& fld, KEY key)
{
bool ok = true;
if (key == K_TAB && !fld.empty())
{
const int year = atoi(fld.get());
if (year >= YEAR_MIN && year <= YEAR_MAX)
{
TString16 str1, str2;
app().garble_year(year, str1, str2);
fld.mask().set(102, str1);
fld.mask().set(103, str2);
}
}
if (key == K_ENTER)
{
const int year = atoi(fld.get());
if (year < YEAR_MIN || year > YEAR_MAX)
ok = fld.error_box(TR("Anno di assitenza errato"));
}
return ok;
}
bool TAttivazione_moduli::change_assist_handler(TMask_field& fld, KEY key)
{
if (key == K_SPACE)
{
TDongle& d = ::dongle();
if (d.hardware() == _dongle_ssa)
return message_box(TR("E' necessario contattare attivazione_moduli@sirio-is.it"));
TMask m(TR("Assistenza"), 1, 26, 9);
m.add_number(101, 0, PR("Anno "), 1, 1, 4, "U");
m.add_string(102, 0, PR("Codice "), 1, 2, 8, "DU");
if (d.type() == _user_dongle)
{
m.set(101, d.year_assist());
m.enable(102);
}
else
{
m.add_string(103, 0, PR("WebCod "), 1, 3, 8, "DU");
m.set_handler(101, assist_handler);
}
m.add_button(DLG_OK, 0, "", -12, -1, 10, 2);
m.add_button(DLG_CANCEL, 0, "", -22, -1, 10, 2);
if (m.run() == K_ENTER)
{
word year = m.get_int(101);
if (d.type() == _user_dongle)
{
if (year >= YEAR_MIN && year <= YEAR_MAX)
{
if (m.field(102).empty())
{
app()._wanted_assist = year;
fld.message_box(FR("Premere 'Stampa'\nper richiedere il contratto di assistenza per l'anno %u."),
year);
}
else
{
TString16 str1, str2;
app().garble_year(year, str1, str2);
bool ok = (m.get(102) == str1) || (m.get(102) == str2);
if (ok)
{
d.set_year_assist(year);
fld.mask().set(F_ASSIST, year);
}
else
fld.error_box(TR("Codice errato"));
}
}
else
fld.error_box(TR("Anno errato"));
}
else
app()._wanted_assist = year;
}
}
return true;
}
bool TAttivazione_moduli::print_handler(TMask_field& fld, KEY key) bool TAttivazione_moduli::print_handler(TMask_field& fld, KEY key)
{ {
if (key == K_SPACE) if (key == K_SPACE)
@ -581,7 +329,6 @@ void TAttivazione_moduli::init_mask()
const int nmod = build_sheet(); const int nmod = build_sheet();
const TDongle& d = ::dongle(); const TDongle& d = ::dongle();
_msk->set(F_SN, d.number()); _msk->set(F_SN, d.number());
_msk->set(F_DT, oggi);
_msk->set(F_USERS, d.max_users()); _msk->set(F_USERS, d.max_users());
_msk->set(F_ASSIST, d.year_assist()); _msk->set(F_ASSIST, d.year_assist());
} }
@ -593,90 +340,6 @@ bool TAttivazione_moduli::k_notify(TSheet_field& f, int r, KEY k)
return true; return true;
} }
void TAttivazione_moduli::print_request()
{
TRequest_form form("ba1500a");
TForm_item& num = form.find_field('B', odd_page, 101);
TForm_item& descr = form.find_field('B', odd_page, 102);
TForm_item& codice = form.find_field('B', odd_page, 103);
TForm_item& price = form.find_field('B', odd_page, 104);
TForm_item& manut = form.find_field('B', odd_page, 105);
TInstall_ini ini;
ini.write_protect();
const bool special = _wanted_assist > ::dongle().year_assist() || _wanted_users != 0;
const word users = max(_wanted_users, ::dongle().max_users());
TWait_cursor hourglass;
TSheet_field& sheet = _msk->sfield(F_MODULI);
int found = 0;
TString str;
FOR_EACH_SHEET_ROW(sheet, r, row)
{
const int module = row->get_int(2) ;
const bool active = ::dongle().active(module);
const bool wanted = *row->get(1) > ' ';
if (!special && active)
continue;
if (!wanted && !active)
continue;
if (found == 0)
{
printer().open();
form.find_field('H',odd_page,1).set(dongle().reseller());
form.update_serno(_msk->get(F_SN));
form.update_dongle();
form.update_os();
}
str.format("%3d", ++found);
num.set(str);
str = row->get(0);
descr.set(str);
str = active ? TR("*ATTIVO*") : "";
codice.set(str);
form.print(-1);
}
if (special && found > 0)
{
codice.set("");
price.set("");
manut.set("");
if (_wanted_users != 0)
{
str.format("%3d", ++found);
num.set(str);
str.format(FR("Variazione del numero utenti da %u a %u"),
::dongle().max_users(), _wanted_users);
descr.set(str);
form.print(-1);
}
if (_wanted_assist > ::dongle().year_assist())
{
str.format("%3d", ++found);
num.set(str);
str.format(FR("Contratto di assistenza per l'anno %u"), _wanted_assist);
descr.set(str);
form.print(-1);
}
}
if (found)
{
form.print_footer();
printer().close();
}
}
void TAttivazione_moduli::print_status() void TAttivazione_moduli::print_status()
{ {
TRequest_form form("ba1500a"); TRequest_form form("ba1500a");
@ -708,114 +371,11 @@ void TAttivazione_moduli::print_status()
printer().close(); printer().close();
} }
void TAttivazione_moduli::print_answer()
{
TString str;
int found = 0;
TRequest_form form("ba1500a");
TForm_item& num = form.find_field('B', odd_page, 101);
TForm_item& descr = form.find_field('B', odd_page, 102);
TForm_item& codice = form.find_field('B', odd_page, 103);
TSheet_field& sheet = _msk->sfield(F_MODULI);
FOR_EACH_SHEET_ROW(sheet, r, row) if (*row->get(1) > ' ')
{
const int module = _im->get_module_by_order(r);
if (module != BAAUT)
{
if (found == 0)
{
printer().open();
form.update_serno(_msk->get(F_SN));
form.update_dongle();
form.update_os();
}
str.format("%3d", ++found);
num.set(str);
str = row->get(0);
descr.set(str);
str = row->get(3);
codice.set(str);
form.print(-1);
}
}
if (_wanted_users != 0 || _wanted_assist != 0)
{
if (found == 0)
{
printer().open();
form.update_serno(_msk->get(F_SN));
form.update_dongle();
}
if (_wanted_users != 0)
{
str.format("%3d", ++found);
num.set(str);
str.format(FR("Variazione del numero utenti da %u a %u"),
::dongle().max_users(), _wanted_users);
descr.set(str);
TString8 str1, str2;
garble_users(_wanted_users, str1, str2);
codice.set(str1);
form.print(-1);
}
if (_wanted_assist != 0)
{
str.format("%3d", ++found);
num.set(str);
str.format(FR("Contratto di assistenza per l'anno %u"), _wanted_assist);
descr.set(str);
TString8 str1, str2;
garble_year(_wanted_assist, str1, str2);
codice.set(str1);
form.print(-1);
}
}
if (found)
{
form.print_footer();
printer().close();
}
}
bool TAttivazione_moduli::new_module_requested()
{
TSheet_field& sheet = _msk->sfield(F_MODULI);
bool found = false;
FOR_EACH_SHEET_ROW(sheet, r, row)
{
if (*row->get(1) > ' ') // Wanted!
{
const int module = row->get_int(2);
if (!::dongle().active(module)) // Not active yet?
{
found = true;
break;
}
}
}
return found;
}
void TAttivazione_moduli::print() void TAttivazione_moduli::print()
{ {
if (::dongle().type() == _user_dongle)
{
if (new_module_requested())
print_request();
else
print_status(); print_status();
} }
else
print_answer();
}
// Questo programma non deve bloccarsi per l'anno di assistenza! // Questo programma non deve bloccarsi per l'anno di assistenza!
bool TAttivazione_moduli::test_assistance_year() const bool TAttivazione_moduli::test_assistance_year() const
@ -877,6 +437,7 @@ bool TAttivazione_moduli::destroy()
void TAttivazione_moduli::main_loop() void TAttivazione_moduli::main_loop()
{ {
init_mask();
_msk->run(); _msk->run();
} }

View File

@ -1,22 +1,9 @@
/*
#define F_K1 201
#define F_K2 202
#define F_K3 206
#define F_K4 207
*/
#define F_SN 211 #define F_SN 211
#define F_DT 212
#define F_MODULI 213 #define F_MODULI 213
#define F_USERS 214 #define F_USERS 214
#define F_ASSIST 216 #define F_ASSIST 216
#define F_PRINT 218 #define F_PRINT 218
/*
#define F_AGGLISTINO 220
#define F_MODLISTINO 221
#define F_PRINTLIST 222
*/
#define F_NOMEMOD 101 #define F_NOMEMOD 101
#define F_ENABLE 102 #define F_ENABLE 102
#define F_CODE 103 #define F_CODE 103

View File

@ -2247,6 +2247,6 @@ int ba1600(int argc, char* argv[])
app.run(argc, argv, TR("Creazione Patch")); app.run(argc, argv, TR("Creazione Patch"));
} }
else else
error_box(FR("L'utente %s non e' abilitato all'esecuzione di questo programma"), (const char*)user()); cantaccess_box(TR("questo programma"));
return 0; return 0;
} }

View File

@ -209,6 +209,12 @@ bool TInstaller_mask::add_module(TConfig& ini, const TString& module, bool patch
if (!is_visible_patch(ini)) if (!is_visible_patch(ini))
return false; return false;
int year,v,t,p;
main_app().get_version_info(year,v,t,p);
const int anno = ini.get_int("Versione")/10000;
if (anno < year)
return false;
const int numpatch = ini.get_int("Patch"); const int numpatch = ini.get_int("Patch");
TString4 strpatch; TString4 strpatch;
if (numpatch > 0) if (numpatch > 0)
@ -259,7 +265,7 @@ bool TInstaller_mask::should_precheck_module(int modnumber) const
//..alle varie installazioni client, e quindi basta checkare i moduli sulla chiave come per qualsiasi.. //..alle varie installazioni client, e quindi basta checkare i moduli sulla chiave come per qualsiasi..
//..altra installazione //..altra installazione
const TDongle& d = dongle(); const TDongle& d = dongle();
if (station_type() == 2 && d.hardware() != _dongle_network) if (station_type() == 2 && !d.network())
{ {
//se sei un server hai tutti i moduli da installare //se sei un server hai tutti i moduli da installare
ok = d.shown(modnumber); ok = d.shown(modnumber);
@ -272,7 +278,7 @@ bool TInstaller_mask::should_precheck_module(int modnumber) const
{ {
switch (modnumber) switch (modnumber)
{ {
case CAAUT: ok = d.active(CMAUT); break; // Se non hai l'analitica ritenta con le commesse case CAAUT: ok = d.active(CMAUT) || d.active(CIAUT); break; // Se non hai l'analitica ritenta con le commesse
case TPAUT: ok = d.active(DCAUT); break; // Se non hai Pack ritenta con il CONAI case TPAUT: ok = d.active(DCAUT); break; // Se non hai Pack ritenta con il CONAI
default: break; default: break;
} }
@ -287,7 +293,7 @@ bool TInstaller_mask::should_precheck_module(int modnumber) const
int TInstaller_mask::test_station_type() const int TInstaller_mask::test_station_type() const
{ {
const int type = ini_get_int(CONFIG_INSTALL, "Main", "Type", 1); const int type = ini_get_int(CONFIG_INSTALL, "Main", "Type", 1);
return type; return type; // 1=Local; 2=Server; 3=Client
} }
int TInstaller_mask::precheck_modules(bool only_newer) int TInstaller_mask::precheck_modules(bool only_newer)
@ -373,7 +379,6 @@ int TInstaller_mask::precheck_modules(bool only_newer)
return items(); return items();
} }
int TInstaller_mask::get_module_number(const TString& module) const int TInstaller_mask::get_module_number(const TString& module) const
{ {
int aut = -1; int aut = -1;
@ -437,7 +442,7 @@ bool TInstaller_mask::autoload()
if (internet) if (internet)
{ {
if (!(xvt_net_get_status() & 0x4)) //la connessione web funziona?... if (!(xvt_net_get_status() & 0x4)) //la connessione web funziona?...
return warning_box("Impossibile connettersi al sito con gli aggiornamenti\nVerificare che la connessione Internet sia attiva !"); return warning_box("Impossibile connettersi al sito degli aggiornamenti\nVerificare che la connessione Internet sia attiva !");
parse_internet_path(http_server, http_path); //controlla il path internet scritto nel campo sulla maschera parse_internet_path(http_server, http_path); //controlla il path internet scritto nel campo sulla maschera
@ -543,14 +548,14 @@ bool TInstaller_mask::autoload()
{ {
{ {
TProgress_monitor pi(1, TR("Controllo lista aggiornamenti"), false); // progind NON bloccabile: causa errore impossibile! TProgress_monitor pi(1, TR("Controllo lista aggiornamenti"), false); // progind NON bloccabile: causa errore impossibile!
http_dir(http_server, http_path, modules); TFilename pattern = http_path; pattern.add("*a.ini");
http_dir(http_server, pattern, modules);
} }
TProgress_monitor pi(modules.items(), TR("Download lista aggiornamenti")); TProgress_monitor pi(modules.items(), TR("Download lista aggiornamenti"));
for (int i = modules.last(); i >= 0; i--) for (int i = modules.last(); i >= 0; i--)
{ {
TString& str = modules.row(i); TString& str = modules.row(i);
if (str.ends_with("a.ini", true))
{
/* Triste nescessita': si rischia di non caricare nessuna patch /* Triste nescessita': si rischia di non caricare nessuna patch
const TString& module = str.left(2); const TString& module = str.left(2);
const int patch = atoi(str.mid(2, 4)); const int patch = atoi(str.mid(2, 4));
@ -570,18 +575,14 @@ bool TInstaller_mask::autoload()
if (!ininame.exist() && !http_get(http_server, remote, ininame)) if (!ininame.exist() && !http_get(http_server, remote, ininame))
{ {
error_box(FR("Errore di trasferimento del file %s"), (const char*)remote); cantread_box(remote);
modules.destroy(i); modules.destroy(i, true);
} }
str = ininame; str = ininame;
}
else
modules.destroy(i);
if (!pi.add_status()) if (!pi.add_status())
break; break;
} }
modules.pack();
} }
else //normal patches else //normal patches
{ {
@ -669,11 +670,11 @@ bool TInstaller_mask::autoload()
add_module(ini, module, true); add_module(ini, module, true);
} }
update_version(); update_version();
enable(F_INSTALL, !modules.empty());
const bool ok = precheck_modules() > 0; const bool ok = precheck_modules() > 0;
if (!ok) if (!ok)
error_box(FR("Non e' stato trovato nessun modulo da installare\nin %s"), (const char*)path); error_box(FR("Non ci sono moduli da installare nella cartella\n%s"), (const char*)path);
return ok; return ok;
} }
@ -1839,7 +1840,7 @@ TInstaller_mask::TInstaller_mask()
rf.disable(); rf.disable();
bool ko = !is_program_dir(path); bool ko = !is_program_dir(path);
if (ko) if (ko)
warning_box(TR("La cartella origine dei programmi NON è valida!\nSelezionarne una valida e premere 'Invio'.")); error_box(TR("La cartella origine dei programmi NON è valida!"));
enable(F_PATH, ko); enable(F_PATH, ko);
} }
@ -1862,24 +1863,28 @@ TInstaller_mask::TInstaller_mask()
//decide quale e' il percorso di installazione //decide quale e' il percorso di installazione
//ha un cd o un disco di rete -> si aggiorna da questo... //ha un cd o un disco di rete -> si aggiorna da questo...
disable(F_INSTALL); // Non posso premerlo in assenza di moduli
if (path.exist()) if (path.exist())
{ {
if (efield(F_PATH).active() || _station_type == 3) // Per i client è obbligatorio installare da disco if (efield(F_PATH).active() || _station_type == 3) // Per i client è obbligatorio installare da disco
{
autoload(); autoload();
enable(F_INSTALL, one_checked());
}
} }
else //senno' cerca su internet se trova un path internet completo e la connessione funzionante else //senno' cerca su internet se trova un path internet completo e la connessione funzionante
{ {
if (_station_type != 3 && webpath.find("//") > 0) if (_station_type != 3 && webpath.find("//") > 0)
{ {
set(F_TYPE, "1", 0x1); set(F_TYPE, "1", 0x1);
//autoload(); // Niente autoload! //autoload(); // Niente più autoload!
} }
} }
DIRECTORY dir; DIRECTORY dir; xvt_fsys_get_dir(&dir);
xvt_fsys_get_dir(&dir);
xvt_fsys_convert_dir_to_str(&dir, path.get_buffer(), path.size()); xvt_fsys_convert_dir_to_str(&dir, path.get_buffer(), path.size());
set(F_CURPATH, path); set(F_CURPATH, path);
} }
TInstaller_mask::~TInstaller_mask() TInstaller_mask::~TInstaller_mask()
@ -1927,7 +1932,7 @@ bool TInstaller::create()
else //se e' standalone o server... else //se e' standalone o server...
{ {
if (user() != ::dongle().administrator()) if (user() != ::dongle().administrator())
return error_box(TR("Solo l'amministratore puo' aggiornare questa postazione!")); return cantaccess_box(NULL);
} }
return TSkeleton_application::create(); return TSkeleton_application::create();

View File

@ -1,26 +1,27 @@
#include "ba1701.h" #include "ba1701.h"
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#define STRICT
#include <windows.h> #include <windows.h>
bool run_as_admin() bool run_as_admin()
{ {
bool yes = true; bool yes = true;
TOKEN_ELEVATION_TYPE elevationType = (TOKEN_ELEVATION_TYPE)0; // N/A for < Vista OSVERSIONINFO VerInfo = { 0 }; VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
OSVERSIONINFO VerInfo = { 0 };
VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
::GetVersionEx(&VerInfo); ::GetVersionEx(&VerInfo);
if (VerInfo.dwMajorVersion >= 6) // If Vista or newer, if (VerInfo.dwMajorVersion >= 6) // If Vista or newer,
{ {
HANDLE hToken = NULL; // read elevation type HANDLE hToken = NULL; // read elevation type
BOOL bOK = ::OpenProcessToken(GetCurrentProcess(), TOKEN_READ, &hToken); BOOL bOK = ::OpenProcessToken(::GetCurrentProcess(), TOKEN_READ, &hToken);
if (bOK) if (bOK)
{ {
DWORD infoLen; TOKEN_ELEVATION_TYPE elevationType = (TOKEN_ELEVATION_TYPE)0; // N/A for < Vista
DWORD infoLen = 0;
yes = ::GetTokenInformation(hToken, TokenElevationType, // type of info to retrieve yes = ::GetTokenInformation(hToken, TokenElevationType, // type of info to retrieve
&elevationType, // receives return value &elevationType, // receives return value
sizeof(elevationType), &infoLen) != 0; // receives returned length sizeof(elevationType), &infoLen) != 0; // receives returned length
::CloseHandle(hToken);
} }
} }
return yes; return yes;

View File

@ -201,11 +201,11 @@ bool TArchive_app::split_file(const TFilename& archive, unsigned long max_chunk)
int disk = 0; int disk = 0;
unsigned long scritti = 0; unsigned long scritti = 0;
FILE* i = fopen(archive, "rb"); FILE* i = NULL; fopen_s(&i, archive, "rb");
if (i == NULL) if (i == NULL)
return FALSE; return FALSE;
FILE* o = fopen(output, "wb"); FILE* o = NULL; fopen_s(&o, output, "wb");
const int BUFSIZE = 1024*16; const int BUFSIZE = 1024*16;
TString buf(BUFSIZE); TString buf(BUFSIZE);
@ -225,7 +225,7 @@ bool TArchive_app::split_file(const TFilename& archive, unsigned long max_chunk)
TString4 ext; ext.format("z%02d", ++disk); TString4 ext; ext.format("z%02d", ++disk);
output.ext(ext); output.ext(ext);
o = fopen(output, "wb"); fopen_s(&o, output, "wb");
scritti = 0; scritti = 0;
} }

View File

@ -418,10 +418,10 @@ bool Tdninst_mask::load_odbc(TString_array& a) const
<< "\nORDER BY Codice"; << "\nORDER BY Codice";
TODBC_recordset att(query); TODBC_recordset att(query);
TProgind pi(att.items(), dsn); TProgress_monitor pi(att.items(), dsn);
for (bool ok = att.move_first(); ok; ok = att.move_next()) for (bool ok = att.move_first(); ok; ok = att.move_next())
{ {
if (!pi.addstatus(1)) break; if (!pi.add_status()) break;
const int key = att.get("Codice").as_int(); const int key = att.get("Codice").as_int();
if (key > 0) if (key > 0)
@ -533,12 +533,12 @@ bool Tdninst_mask::load_xml(TString_array& a) const
list_files(path, xml); list_files(path, xml);
TString msg; msg.format(FR("Scansione %s: %d files"), (const char*)path, xml.items()); TString msg; msg.format(FR("Scansione %s: %d files"), (const char*)path, xml.items());
TProgind pi(xml.items(), msg); TProgress_monitor pi(xml.items(), msg);
TFilename fname, tmpname; TFilename fname, tmpname;
TFilename tmpdir; tmpdir.tempdir(); tmpdir.add("www"); TFilename tmpdir; tmpdir.tempdir(); tmpdir.add("www");
FOR_EACH_ARRAY_ROW(xml, r, row) FOR_EACH_ARRAY_ROW(xml, r, row)
{ {
if (!pi.addstatus(1)) break; if (!pi.add_status()) break;
fname = *row; fname = *row;
const TString& n = fname.name_only(); const TString& n = fname.name_only();
const int sn = atoi(n); const int sn = atoi(n);
@ -1120,15 +1120,8 @@ protected:
bool Tdninst_manager::create() bool Tdninst_manager::create()
{ {
if (user() != dongle().administrator()) if (user().compare(dongle().administrator(),-1,true) || !has_module(GDAUT))
return error_box(TR("Utente non abilitato")); return cantaccess_box(title());
const TString& host = get_hostname();
if (!is_power_station() &&
!host.ends_with("giardini", true) &&
host.compare("pccopw7", -1, true) != 0 &&
host.compare("pcpiccolow7", -1, true) != 0)
return error_box(FR("Postazione %s non abilitata"), (const char*)host);
TSheet_field::set_line_number_width(4); // Numero di chiavette ~ 1000 TSheet_field::set_line_number_width(4); // Numero di chiavette ~ 1000

View File

@ -877,6 +877,7 @@ TRecordset* TQuery_mask::new_recordset() const
if (rex != NULL && rex->items() == 0) if (rex != NULL && rex->items() == 0)
{ {
if (sql.starts_with("USE ", true) || sql.find("SELECT ")>=0)
warning_box(TR("Nessuna riga risultato")); warning_box(TR("Nessuna riga risultato"));
delete rex; delete rex;
rex = NULL; rex = NULL;

View File

@ -4,11 +4,11 @@ TOOLBAR "topbar" 0 0 0 2
#include <relapbar.h> #include <relapbar.h>
ENDPAGE ENDPAGE
PAGE "Codici Indetrabilita'" -1 -1 78 15 PAGE "Codici Indetrabilità" -1 -1 78 15
GROUPBOX DLG_NULL 78 3 GROUPBOX DLG_NULL 78 3
BEGIN BEGIN
PROMPT 1 1 "Codice Indetrabilita'" PROMPT 1 1 "Codice Indetrabilità"
END END
STRING F_CODICE 1 STRING F_CODICE 1
@ -49,7 +49,7 @@ END
STRING F_TIPO 1 STRING F_TIPO 1
BEGIN BEGIN
PROMPT 2 6 "Tipo " PROMPT 2 6 "Tipo "
SHEET "Codice|Tipo indetraibilita'@75" SHEET "Codice|Tipo indetraibilità@75"
INPUT F_TIPO INPUT F_TIPO
ITEM "1|IVA indetraibile su acquisti riferiti a ricavi esenti" ITEM "1|IVA indetraibile su acquisti riferiti a ricavi esenti"
ITEM "3|IVA indicata per passaggi interni al solo fine del calcolo di ventilazione" ITEM "3|IVA indicata per passaggi interni al solo fine del calcolo di ventilazione"
@ -68,7 +68,7 @@ END
NUMBER F_PERC 6 2 NUMBER F_PERC 6 2
BEGIN BEGIN
PROMPT 2 7 "% d'indetraibilita' " PROMPT 2 7 "% d'indetraibilità "
NUM_EXPR #F_PERC<=100 NUM_EXPR #F_PERC<=100
WARNING "Percentuale non valida" WARNING "Percentuale non valida"
FLAGS "U" FLAGS "U"

View File

@ -22,3 +22,4 @@
#define FLD_DETRAZIONE 123 #define FLD_DETRAZIONE 123
#define CHK_SERVIZI 124 #define CHK_SERVIZI 124
#define FLD_DESCR_I1 125 #define FLD_DESCR_I1 125
#define FLD_INDET_S4 126

View File

@ -130,6 +130,20 @@ BEGIN
CHECKTYPE NORMAL CHECKTYPE NORMAL
END END
STRING FLD_INDET_S4 1
BEGIN
PROMPT 2 5 "Codice indetraibilità "
USE %DET
INPUT CODTAB FLD_INDET_S4
DISPLAY "Codice" CODTAB
DISPLAY "Tipo" I0
DISPLAY "Percentuale@R" R0
DISPLAY "Descrizione@50" S0
OUTPUT FLD_INDET_S4 CODTAB
CHECKTYPE NORMAL
FIELD S4
END
GROUPBOX DLG_NULL 78 4 GROUPBOX DLG_NULL 78 4
BEGIN BEGIN
PROMPT 1 6 "@bComunicazione operazioni rilevanti ai fini dell'IVA (Spesometro)" PROMPT 1 6 "@bComunicazione operazioni rilevanti ai fini dell'IVA (Spesometro)"
@ -242,7 +256,7 @@ END
LIST LST_TABIVA_S4 1 43 LIST LST_TABIVA_S4 1 43
BEGIN BEGIN
PROMPT 3 15 "Regime agricolo " PROMPT 3 15 "Regime agricolo "
FIELD S4 FIELD I4
HELP "Indicare il tipo di gestione per regime agricolo" HELP "Indicare il tipo di gestione per regime agricolo"
ITEM " |Regime normale" ITEM " |Regime normale"
ITEM "1|Vendite regime agricolo" ITEM "1|Vendite regime agricolo"

View File

@ -4,11 +4,11 @@ TOOLBAR "topbar" 0 0 0 2
#include <relapbar.h> #include <relapbar.h>
ENDPAGE ENDPAGE
PAGE "Nomenclatura Combinata" -1 -1 78 18 PAGE "Nomenclatura Combinata INTRA" 0 2 0 0
GROUPBOX DLG_NULL 78 7 GROUPBOX DLG_NULL 78 7
BEGIN BEGIN
PROMPT 1 1 "@bCodice Nomenclatura" PROMPT 1 1 "@bNomenclatura Combinata"
END END
NUMBER NOC_CODICE1 4 NUMBER NOC_CODICE1 4
@ -43,12 +43,13 @@ BEGIN
VALIDATE REQIF_FUNC 1 NOC_CODICE3 VALIDATE REQIF_FUNC 1 NOC_CODICE3
END END
NUMBER NOC_CODICE3 2 STRING NOC_CODICE3 2
BEGIN BEGIN
PROMPT 26 3 "" PROMPT 26 3 ""
FLAGS "Z"
COPY ALL NOC_CODICE1 COPY ALL NOC_CODICE1
FIELD CODTAB[7,8] FIELD CODTAB[7,8]
CHECKTYPE NORMAL
VALIDATE FIXLEN_FUNC 2
KEY 1 KEY 1
END END
@ -65,18 +66,18 @@ BEGIN
CHECKTYPE REQUIRED CHECKTYPE REQUIRED
FIELD S0 FIELD S0
KEY 2 KEY 2
ENDPAGE END
GROUPBOX DLG_NULL 78 7 GROUPBOX DLG_NULL 78 7
BEGIN BEGIN
PROMPT 1 8 "@bUnita' di misura supplementare" PROMPT 1 8 "@bUnità di misura supplementare"
FLAGS "R" FLAGS "R"
GROUP 1 GROUP 1
END END
LIST NOC_UMS_OBB 1 50 LIST NOC_UMS_OBB 1 50
BEGIN BEGIN
PROMPT 2 10 "Obbligatorieta' " PROMPT 2 10 "Obbligatorietà "
ITEM " |Non obbligatoria" ITEM " |Non obbligatoria"
MESSAGE NORMAL,NOC_UMS_CODICE MESSAGE NORMAL,NOC_UMS_CODICE
ITEM "A|Obbligatoria per acquisti" ITEM "A|Obbligatoria per acquisti"
@ -91,7 +92,7 @@ END
STRING NOC_UMS_CODICE 2 STRING NOC_UMS_CODICE 2
BEGIN BEGIN
PROMPT 2 12 "Unita' " PROMPT 2 12 "Unità "
USE %UMS USE %UMS
FLAGS "U" FLAGS "U"
INPUT CODTAB NOC_UMS_CODICE INPUT CODTAB NOC_UMS_CODICE
@ -100,7 +101,7 @@ BEGIN
OUTPUT NOC_UMS_CODICE CODTAB OUTPUT NOC_UMS_CODICE CODTAB
OUTPUT NOC_UMS_DESCR S0 OUTPUT NOC_UMS_DESCR S0
CHECKTYPE NORMAL CHECKTYPE NORMAL
WARNING "Inserire l'unita` di misura obbligatoria" WARNING "Inserire l'unità di misura obbligatoria"
FIELD S5 FIELD S5
GROUP 1 GROUP 1
END END