From 649a9819c8685cc57598c1b5b6ee5c9b9f71c7df Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 16 Apr 1999 12:02:04 +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@8058 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ba/ba0.cpp | 12 +- ba/ba1.cpp | 4 +- ba/ba1100.cpp | 229 ++++++----- ba/ba1400.cpp | 95 ++--- ba/ba1600.cpp | 7 +- ba/ba1700.cpp | 15 - ba/ba2200.cpp | 2 +- ba/ba7.cpp | 3 +- ba/bacnv.cpp | 4 +- ba/bafax.cpp | 2 +- ba/bainst.cpp | 149 ++++--- ba/bainst.h | 1 + ba/batbcam.h | 1 + ba/batbcam.uml | 2 +- cg/cg1600.cpp | 2 +- cg/cg2102.cpp | 1 + cg/cg3400.cpp | 2 +- cg/cg4300.cpp | 14 - cg/cg4301.cpp | 3 +- cg/cg4304.cpp | 2 +- cg/cg4400.cpp | 21 +- cg/cg5500.cpp | 83 ++-- cg/cg5500.h | 2 +- cg/cg6600.cpp | 2 +- cg/cg6804.cpp | 2 +- cg/cglib04.h | 3 +- cg/cgsaldac.cpp | 2 +- db/db0.cpp | 3 +- db/db0.h | 1 + db/db0.url | 9 + db/db0100.cpp | 798 ++++++------------------------------- db/db0500.cpp | 389 +++++++++++++++--- db/db0500a.h | 43 +- db/db0500a.uml | 75 +++- db/db0500b.uml | 185 +++++++-- db/db0500c.uml | 29 +- db/db1.cpp | 1 - db/db1.url | 5 +- db/db1100.cpp | 60 +-- db/db1100a.frm | 2 - db/db1100a.h | 2 +- db/db1100a.uml | 39 +- db/db2.url | 4 +- db/db2400.cpp | 9 +- db/dblib.cpp | 938 +++++++++++++++++++++++++++++++++++++------- db/dblib.h | 175 +++++++-- db/dbstord.uml | 32 +- db/dbtblav.h | 28 +- db/dbtblav.uml | 307 +++++++++++---- db/dbtbord.rpt | 4 +- db/dbtbord.uml | 19 +- db/dbtbvar.uml | 6 +- db/f112.dir | 2 +- db/f112.trr | 10 +- include/default.url | 6 +- include/form.cpp | 52 +-- include/isam.cpp | 8 +- mg/mglib.h | 4 +- mg/mglib02.cpp | 3 +- mg/mglib02a.cpp | 256 ++++++------ pr/prlib01.cpp | 2 +- ve/sconti.h | 3 +- ve/ve0.url | 4 +- ve/ve0100.cpp | 39 -- ve/ve0100.h | 8 - ve/ve0100b1.h | 1 + ve/velib.h | 2 - ve/velib02.cpp | 2 +- ve/velib03.cpp | 4 +- 69 files changed, 2519 insertions(+), 1715 deletions(-) diff --git a/ba/ba0.cpp b/ba/ba0.cpp index aa2b6ceaa..a3436530d 100755 --- a/ba/ba0.cpp +++ b/ba/ba0.cpp @@ -449,9 +449,10 @@ class TMenuitem : public TObject TString _caption, _action; char _type; COLOR _color; - int _exist : 2; - bool _firm : 2; - bool _password : 2; + int _exist : 2; + bool _enabled : 2; + bool _firm : 2; + bool _password : 2; bool _reloadmenu : 2; protected: @@ -599,7 +600,10 @@ void TMenuitem::create(const char* t) { if (_action.find('.') < 0) _action << ".men"; - menu().read(_action, _action); + if (fexist(_action)) + menu().read(_action, _action); + else + _action.cut(0); _type = '['; } diff --git a/ba/ba1.cpp b/ba/ba1.cpp index fc4f09a0d..fec62c4e6 100755 --- a/ba/ba1.cpp +++ b/ba/ba1.cpp @@ -24,8 +24,8 @@ int main(int argc,char** argv) ba1700(argc,argv); break; case 7: ba1800(argc,argv); break; - case 8: - ba1900(argc,argv); break; +// case 8: +// ba1900(argc,argv); break; quest cosa e' default: ba1100(argc,argv); break; // Manutenzione } diff --git a/ba/ba1100.cpp b/ba/ba1100.cpp index 03b85e0d2..2a88118d3 100755 --- a/ba/ba1100.cpp +++ b/ba/ba1100.cpp @@ -591,124 +591,123 @@ void TManutenzione_app::edit_riga (long riga_sel, TToken_string& riga) switch (tasto) { - case K_F4: - if (logicnum > 1) - { - const TFilename filename(_mask->get(FLD_NOME)); - const TString tabella(_mask->get(F_TAB)); - TEdit_file ef; - ef.browse(logicnum, filename, tabella); - } - break; - case K_F5: - case K_F6: - case K_F8: - if (!superprassi) - { - error_box("Funzione non ammessa per l'utente %s", (const char*)user()); - break; - } - case K_F7: - case K_ENTER: - { - strcpy (dep.SysName,_mask->get (FLD_NOME)); - dep.EOD = atol(_mask->get (FLD_EOD)); - dep.Flags = atol(_mask->get (FLD_FLAG)); - strcpy (dep.Des,_mask->get (FLD_DESC)); - strcpy (dep.FCalc,_mask->get (FLD_FORMULA)); - const TRecnotype eox = _mask->get_bool(FLD_EXTEND) ? _mask->get_long(FLD_EOX) : oldeox; + case K_F4: + if (logicnum > 1) + { + const TFilename filename(_mask->get(FLD_NOME)); + const TString tabella(_mask->get(F_TAB)); + TEdit_file ef; + ef.browse(logicnum, filename, tabella); + } + break; + case K_F5: + case K_F6: + case K_F8: + if (!superprassi) + { + error_box("Funzione non ammessa per l'utente %s", (const char*)user()); + break; + } + case K_F7: + case K_ENTER: + { + strcpy (dep.SysName,_mask->get (FLD_NOME)); + dep.EOD = atol(_mask->get (FLD_EOD)); + dep.Flags = atol(_mask->get (FLD_FLAG)); + strcpy (dep.Des,_mask->get (FLD_DESC)); + strcpy (dep.FCalc,_mask->get (FLD_FORMULA)); + const TRecnotype eox = _mask->get_bool(FLD_EXTEND) ? _mask->get_long(FLD_EOX) : oldeox; - _browse->dir()->get(logicnum, _lock, _nordir, _sysdirop); - _browse->dir()->set(dep.SysName, dep.EOD, dep.Flags, - dep.Des, dep.FCalc); - _browse->dir()->put(logicnum, _nordir, _sysdirop); + _browse->dir()->get(logicnum, _lock, _nordir, _sysdirop); + _browse->dir()->set(dep.SysName, dep.EOD, dep.Flags, + dep.Des, dep.FCalc); + _browse->dir()->put(logicnum, _nordir, _sysdirop); - if (eox != oldeox) - { - TSystemisamfile f(logicnum); - d.get(logicnum); - TFilename f_name(d.name()); - f_name.ext("dbf"); - if (f_name.exist()) - f.extend(eox); - else - f.build(eox); - _browse->dir()->get(logicnum, _nolock, _nordir, _sysdirop); - } - if (tasto == K_F5 && logicnum > 1) - { - TSystemisamfile f(logicnum); - f.pack(); - //Pack supplementare tramite FOXPRO (da togliere con CodeBase 6) -#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_WIN32 - if (logicnum > 2 && logicnum < 6 && f.status() == NOERR) - if (fexist("packaga.exe")) - { - d.get(logicnum); - TFilename f_name(d.name()); - f_name.ext("dbf"); - f_name.replace('/','\\'); // A volte rimangono delle slash - TString cmd("packaga -t"); - cmd << " " << f_name; - TExternal_app packapp(cmd); - packapp.run(FALSE,FALSE); - } + if (eox != oldeox) + { + TSystemisamfile f(logicnum); + d.get(logicnum); + TFilename f_name(d.name()); + f_name.ext("dbf"); + if (f_name.exist()) + f.extend(eox); + else + f.build(eox); + _browse->dir()->get(logicnum, _nolock, _nordir, _sysdirop); + } + if (tasto == K_F5 && logicnum > 1) + { + TSystemisamfile f(logicnum); + f.pack(); + //Pack supplementare tramite FOXPRO (da togliere con CodeBase 6) +#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_WIN32 +#if !defined(CB6) + if (logicnum > 2 && logicnum < 6 && f.status() == NOERR) + if (fexist("packaga.exe")) + { + d.get(logicnum); + TFilename f_name(d.name()); + f_name.ext("dbf"); + f_name.replace('/','\\'); // A volte rimangono delle slash + TString cmd("packaga -t"); + cmd << " " << f_name; + TExternal_app packapp(cmd); + packapp.run(FALSE,FALSE); + } #endif - } - break; - case K_F6: - { - _rec = new TRec_sheet(logicnum, _mask->get(F_TAB)); - _rec->edit(); - delete _rec; - _rec = NULL; - } - break; - case K_F7: - { - TMask m("ba1100b"); - - TFilename nout(dumpfilename(dep)); - m.set(FLD_OUTFILE, nout); - - if (m.run() == K_ENTER) - { - nout = m.get(FLD_OUTFILE); - if (nout.not_empty()) - { - TSystemisamfile f(logicnum); - const char fs = *esc(m.get(FLD_FS)); - const char fd = *esc(m.get(FLD_FD)); - const char rs = *esc(m.get(FLD_RS)); - const bool withdel = m.get_bool(FLD_WITHDEL); - const int keyno = m.get_int(FLD_KEYNO); - f.dump(nout, keyno, fs, fd, rs, withdel); - } - } - } - break; - case K_F8: - { - TMask m("ba1100c"); - TFilename ninp(dumpfilename(dep)); - m.set(FLD_INFILE, ninp); - if (m.run() == K_ENTER) - { - TSystemisamfile f(logicnum); - char fs = *esc(m.get(FLD_FS)); - char fd = *esc(m.get(FLD_FD)); - char rs = *esc(m.get(FLD_RS)); - ninp = m.get(FLD_INFILE); - f.load(ninp, fs, fd, rs); - } - } - break; - default: - break; - } - } - default: - break; +#endif + } + else + if (tasto == K_F6) + { + _rec = new TRec_sheet(logicnum, _mask->get(F_TAB)); + _rec->edit(); + delete _rec; + _rec = NULL; + } + else + if(tasto == K_F7) + { + TMask m("ba1100b"); + + TFilename nout(dumpfilename(dep)); + m.set(FLD_OUTFILE, nout); + + if (m.run() == K_ENTER) + { + nout = m.get(FLD_OUTFILE); + if (nout.not_empty()) + { + TSystemisamfile f(logicnum); + const char fs = *esc(m.get(FLD_FS)); + const char fd = *esc(m.get(FLD_FD)); + const char rs = *esc(m.get(FLD_RS)); + const bool withdel = m.get_bool(FLD_WITHDEL); + const int keyno = m.get_int(FLD_KEYNO); + f.dump(nout, keyno, fs, fd, rs, withdel); + } + } + } + else + if (tasto == K_F8) + { + TMask m("ba1100c"); + TFilename ninp(dumpfilename(dep)); + m.set(FLD_INFILE, ninp); + if (m.run() == K_ENTER) + { + TSystemisamfile f(logicnum); + char fs = *esc(m.get(FLD_FS)); + char fd = *esc(m.get(FLD_FD)); + char rs = *esc(m.get(FLD_RS)); + ninp = m.get(FLD_INFILE); + f.load(ninp, fs, fd, rs); + } + } + } + break; + default: + break; } } diff --git a/ba/ba1400.cpp b/ba/ba1400.cpp index 04f1a1d48..5e6e429f4 100755 --- a/ba/ba1400.cpp +++ b/ba/ba1400.cpp @@ -305,51 +305,56 @@ TSubmenu& TMenu::get_submenu(const char* name) void TMenu::import(const char* filename, TString& first) { TSubmenu* sub; - TScanner scan(filename); - first.cut(0); - while (scan.good()) - { - TString& line = scan.line(); - if (line[0] == '[') - { - if (first.empty()) - first = line; - sub = &get_submenu(line); - } else - if (line.compare("Caption", 7, TRUE) == 0) - { - CHECK(sub, "Invalid menu file"); - const int equal = line.find('='); - CHECK(equal > 0, "Invalid menu Caption"); - line.ltrim(equal+1); - line.strip("\""); - *sub = line; - } else - if (line.compare("Module", 6, TRUE) == 0) - { - CHECK(sub, "Invalid menu file"); - const int equal = line.find('='); - CHECK(equal > 0, "Invalid menu Module"); - sub->set_module(atoi(line.mid(equal+1))); - } else - if (line.compare("Item", 4, TRUE) == 0) - { - CHECK(sub, "Invalid menu file"); - const int equal = line.find('='); - CHECK(equal > 0, "Invalid menu Item"); - line.ltrim(equal+1); - line.trim(); - TMenu_item& child = sub->add_child(line); - const int bracket = line.rfind('<'); - if (bracket > 0) - { - TString16 name = line.mid(bracket+1); - name.strip("< >"); - import(name, name); - child.cmd() = name; - } - } - } + TScanner scan(filename); + first.cut(0); + while (scan.good()) + { + TString& line = scan.line(); + if (line[0] == '[') + { + if (first.empty()) + first = line; + sub = &get_submenu(line); + } else + if (line.compare("Caption", 7, TRUE) == 0) + { + CHECK(sub, "Invalid menu file"); + const int equal = line.find('='); + CHECK(equal > 0, "Invalid menu Caption"); + line.ltrim(equal+1); + line.strip("\""); + *sub = line; + } else + if (line.compare("Module", 6, TRUE) == 0) + { + CHECK(sub, "Invalid menu file"); + const int equal = line.find('='); + CHECK(equal > 0, "Invalid menu Module"); + sub->set_module(atoi(line.mid(equal+1))); + } else + if (line.compare("Item", 4, TRUE) == 0) + { + CHECK(sub, "Invalid menu file"); + const int equal = line.find('='); + CHECK(equal > 0, "Invalid menu Item"); + line.ltrim(equal+1); + line.trim(); + const int bracket = line.rfind('<'); + if (bracket > 0) + { + TString16 name = line.mid(bracket+1); + name.strip("< >"); + if (fexist(name)) + { + import(name, name); + TMenu_item& child = sub->add_child(line); + child.cmd() = name; + } + } + else + sub->add_child(line); + } + } } TSubmenu& TMenu::add_submenu(const char* para, int parent_module) diff --git a/ba/ba1600.cpp b/ba/ba1600.cpp index c3ab74e78..faa087596 100755 --- a/ba/ba1600.cpp +++ b/ba/ba1600.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include "ba1.h" @@ -34,7 +35,7 @@ public: class TFascicolator : public TCreazione_dischi { protected: - virtual bool use_files() const { return TRUE; } +// virtual bool use_files() const { return TRUE; } virtual void main_loop(); public: virtual bool modify_mode() { return TRUE;} @@ -421,6 +422,7 @@ void TFconv_ini::export_module(const char* module, const char* summary) // TAuto_token_string /////////////////////////////////////////////////////////// +/* TAuto_token_string& TAuto_token_string::create(const char* ts) { // Copia la stringa @@ -438,7 +440,7 @@ TAuto_token_string& TAuto_token_string::create(const char* ts) return *this; } - +*/ /////////////////////////////////////////////////////////// // Maschera composizione del modulo /////////////////////////////////////////////////////////// @@ -915,7 +917,6 @@ protected: static bool creazip_handler(TMask_field& f, KEY k); static bool modules_notify(TSheet_field& f, int row, KEY k); static bool import_export_handler(TMask_field& f, KEY k); -<<<<<<< ba1600.cpp static bool patchl_handler(TMask_field& f, KEY k); diff --git a/ba/ba1700.cpp b/ba/ba1700.cpp index ca33c91f8..0bb0f9053 100755 --- a/ba/ba1700.cpp +++ b/ba/ba1700.cpp @@ -245,21 +245,6 @@ void TInstaller_mask::update_version() force_update(); } -bool is_internet_path(const TString& addr) -{ - if (addr.compare("www.", 4, TRUE) == 0) - return TRUE; - - if (addr.compare("http:", 5, TRUE) == 0) - return TRUE; - - int a1, a2, a3, a4; - if (sscanf(addr, "%d.%d.%d.%d", &a1, &a2, &a3, &a4) == 4) - return TRUE; - - return FALSE; -} - // Cerca nel percorso specificato sulla maschera tutti i possibili files .ini // utilizzabili per un'installazione e li inserisce nello spreadsheet bool TInstaller_mask::autoload() diff --git a/ba/ba2200.cpp b/ba/ba2200.cpp index 73c6b16b8..5e484fe55 100755 --- a/ba/ba2200.cpp +++ b/ba/ba2200.cpp @@ -18,7 +18,7 @@ protected: virtual bool create(); virtual void main_loop(); static bool test_firm(TMask_field& f, KEY k); - KEY query(long& firm, char& floppy, TString& desc, bool& tmp) const; + KEY query(long& firm, char& floppy, TString& desc, bool& temp, bool& zip) const; public: void stop_job(); diff --git a/ba/ba7.cpp b/ba/ba7.cpp index 2fb62fc34..f3f06c57d 100755 --- a/ba/ba7.cpp +++ b/ba/ba7.cpp @@ -7,7 +7,8 @@ int main(int argc, char** argv) switch (r) { - default: + case 0: + default: ba7100(argc, argv) ; break; } diff --git a/ba/bacnv.cpp b/ba/bacnv.cpp index f6f5d17ed..3d1909b17 100755 --- a/ba/bacnv.cpp +++ b/ba/bacnv.cpp @@ -11,7 +11,7 @@ #include -#if XVT_OS == XVT_OS_WIN +#if (XVT_OS == XVT_OS_WIN) || (XVT_OS == XVT_OS_WIN32) #include #define RMDIR _rmdir #else @@ -1573,7 +1573,7 @@ void TConversione_archivi::convert_cap() const file = new TTable(cod); dir.get(file->num(), _nolock, _nordir, _sysdirop); - const bool good_file = dir.is_com() ^ _codditta != 0; + const bool good_file = dir.is_com() ^ (_codditta != 0); if (!good_file) { delete file; diff --git a/ba/bafax.cpp b/ba/bafax.cpp index a3cf3d1e8..9b3c5cdf7 100755 --- a/ba/bafax.cpp +++ b/ba/bafax.cpp @@ -420,7 +420,7 @@ void TFax_mask::set_field(const char* field, const char* value) const TString& TFax_mask::get_field(const char* field) { TMask_field* f = lookup(field); - return f ? f->get() : ""; + return f ? f->get() : EMPTY_STRING; } bool TFax_mask::code_handler(TMask_field& f, KEY k) diff --git a/ba/bainst.cpp b/ba/bainst.cpp index b0bbc6061..aae83b950 100755 --- a/ba/bainst.cpp +++ b/ba/bainst.cpp @@ -2,6 +2,7 @@ #include #include #include +#include // prototipi #include "bainsta.h" #include "bainst.h" @@ -38,6 +39,8 @@ int TSystemtempfile::load( if (fl == NULL) { error_box("Non riesco ad aprire il file %s",from); + clearerr(fl); + setstatus(2); return 2; } TRecnotype r = 0, e = 0, nitems = 0, nread = 0; @@ -55,24 +58,10 @@ int TSystemtempfile::load( if (ditte.read() == NOERR) attprev = ditte.get("CODATTPREV"); } - if (fl == NULL) - { - clearerr(fl); - setstatus(err); - return err; - } - char w[80]; - while ((fgets(w, 80, fl) != NULL)) - { - if (strncmp(w, "[Data]", 6) == 0) - { - nitems = ftell(fl); - break; - } - } fseek(fl, 0L, SEEK_END); - nitems = ftell(fl) - nitems; + nitems = ftell(fl); fclose(fl); + TScanner f(from); //open(); @@ -80,7 +69,7 @@ int TSystemtempfile::load( TToken_string s(1024, fs); bool fixedlen = (fs == '\0'); int nflds = curr().items(); - TArray fld(nflds); + TString_array fld(nflds); int len[MaxFields]; TString sfd(3); TString s1(64); @@ -88,49 +77,54 @@ int TSystemtempfile::load( if (f.paragraph("Header")) { - f.equal(); - const long level = atol(f.line()); - if (level > get_std_level()) - error_box("L'archivio %s e' stato generato con gli archivi di livello %ld%/%ld.\n Il livello attuale e' %ld/%ld.\n Convertire gli archivi e ripetere l' operazione.", - from, level/100, level%100, get_std_level()/100, get_std_level()%100); - //lcf = getlcf(level); + int equal; + TString key; nflds = 0; - TToken_string s2(f.line()); - int p = s2.find('='); - if (p > 0) + while ((equal = f.line().find('=')) > 0) { - s1 = s2.left(p); - s2.ltrim(p+1); - } - else s1.cut(0); - while (s1 == "Fields") - { - for (const char * fd = s2.get(); fd != NULL; fd = s2.get()) + key = f.token().left(equal); + key.trim(); + if (key == "Version") { - TToken_string wfd(fd, ','); - fld.add(new TString(wfd.get())); - len[nflds] = wfd.get_int(); - nflds++; - } - s2 = f.line(); - p = s2.find('='); - if (p > 0) + const long level = atol(f.token().mid(equal+1)); + if (level > prefix().filelevel()) + error_box("L'archivio %s e' stato generato con gli archivi di livello %ld%/%ld.\n Il livello attuale e' %ld/%ld.\n Convertire gli archivi e ripetere l' operazione.", + from, level/100, level%100, get_std_level()/100, get_std_level()%100); +// lcf = getlcf(level); + } else + if (key == "File") { - s1 = s2.left(p); - s2.ltrim(p+1); - } - else s1.cut(0); + const int logic = atoi(f.token().mid(equal+1)); + if (logic != num()) + error_box("L'archivio %s e' stato generato dal file %d", + from, logic); + } else + if (key == "Fields") + { + TToken_string riga = f.token().mid(equal+1); + TToken_string wfd(32, ','); + FOR_EACH_TOKEN(riga, fd) + { + wfd = fd; wfd.strip_spaces(); + fld.add(wfd.get(0)); + len[nflds] = wfd.get_int(); + nflds++; + } + } } } - else - { + + if (nflds == 0 || fld.items() == 0) + { + nflds = curr().items(); for (int j = 0; j < nflds; j++) { - fld.add(TString(curr().fieldname(j)), j); + fld.add(curr().fieldname(j), j); const TString & wfld = (const TString & ) fld[j]; len[j] = (curr().type(wfld) == _datefld) ? 10 : curr().length(wfld); } } + if (!f.paragraph("Data")) { error_box("Formato dei dati non valido"); @@ -161,7 +155,7 @@ int TSystemtempfile::load( } if ((r + e) % 50 == 0) { - s1.format("Imp. archivio %s\n%6ld records %6ld errori - %3d", filename(), r, e, last); + s1.format("Imp. archivio %d\n%6ld records %6ld errori - %3d", _logicnum, r, e, last); p.set_text(s1); } p.setstatus(nread + 1); @@ -189,21 +183,29 @@ int TSystemtempfile::load( s2++; s2[strlen(s2) - 1] = '\0'; } + if (curr().type((const TString&) fld[j]) == _memofld) + s1 = esc(s2); + else + s1 = s2; put((const TString&) fld[j], s2); } } - if (write() == NOERR) r++; + int err = write(); + if (err == _isreinsert) + err = rewrite(); + + if (err == NOERR) + r++; else { -#ifdef DBG - yesnofatal_box("Numero linea relativa all'errore: %ld",r+e+1); -#endif + error_box("Errore di scrittura alla riga %ld", r+e+1); e++; last = status(); + break; } s = f.line(); } - s1.format("Imp. archivio %s\n%6ld records %6ld errori - %3d", filename(), r, e, last); + s1.format("Imp. archivio %d\n%6ld records %6ld errori - %3d", _logicnum, r, e, last); p.set_text(s1); //close(); setstatus(err); @@ -257,12 +259,15 @@ int TSystemtempfile::dump( len[j] = (t == _datefld) ? 10 : curr().length(wfld); } TRecnotype i = 0; - const TRecnotype nitems = nkey ? items() : filehnd()->d->EOD; - s.format("Esportazione archivio %s", filename()); - TProgind p(nitems, s, TRUE, TRUE, 70); - TString s1; - fprintf(f, "[Header]\nVersion=%ld", prefix().filelevel()); + const TRecnotype nitems = items(); + + s.format("Esportazione archivio %s", filename()); + TProgind p(nitems, s, TRUE, TRUE, 70); + TString s1,sfld; + + fprintf(f, "[Header]\nVersion=%ld\nFile=%d", + prefix().filelevel(), num()); for (int k = 0; k < nflds; k++) { if ((k % 10) == 0) fprintf(f, "\nFields="); @@ -290,7 +295,17 @@ int TSystemtempfile::dump( s1 = ""; if (j && fs) s1 << fs; if (fd) s1 << fd; - s1 << get((const TString&)fld[j]); + sfld = get((const TString&)fld[j]); + if (curr().type((const TString&) fld[j]) == _memofld) + { + int p = 0; + while ((p = sfld.find('\n', 0)) >= 0) + { + sfld.overwrite("\\", p); + sfld.insert("n", p+1); + } + } + s1 << sfld; if (fd) s1 << fd; } s << s1; @@ -321,8 +336,18 @@ int TSystemtempfile::dump( s1 = ""; if (j && fs) s1 << fs; if (fd) s1 << fd; - s1 << get((const TString&)fld[j]); - if (fd) s1 << fd; + s1 = get((const TString&)fld[j]); + if (curr().type((const TString&) fld[j]) == _memofld) + { + int p = 0; + while ((p = sfld.find('\n', 0)) >= 0) + { + sfld.overwrite("\\", p); + sfld.insert("n", p+1); + } + } + s1 << sfld; + if (fd) s1 << fd; } s << s1; } diff --git a/ba/bainst.h b/ba/bainst.h index 54a582c4f..2b5737cfd 100755 --- a/ba/bainst.h +++ b/ba/bainst.h @@ -1,5 +1,6 @@ #include #include +#include #define G_PREINST 1 int bainst00(int argc, char** argv); diff --git a/ba/batbcam.h b/ba/batbcam.h index e20961306..17facc45b 100755 --- a/ba/batbcam.h +++ b/ba/batbcam.h @@ -6,3 +6,4 @@ #define FLD_TABCAM_R10 106 #define FLD_TABCAM_D0 107 #define FLD_TABCAM_I2 108 +#define FLD_DATACAM_COPY 109 diff --git a/ba/batbcam.uml b/ba/batbcam.uml index 323cdf699..094132e80 100755 --- a/ba/batbcam.uml +++ b/ba/batbcam.uml @@ -29,7 +29,7 @@ BEGIN OUTPUT FLD_TABCAM_I2 I2 OUTPUT FLD_TABCAM_B1 B1 CHECKTYPE FORCED - MESSAGE COPY,FLD_CODVAL_COPY +// MESSAGE COPY,FLD_CODVAL_COPY WARNING "Valuta assente" END diff --git a/cg/cg1600.cpp b/cg/cg1600.cpp index b1f6b4b9c..c5a1d9fec 100755 --- a/cg/cg1600.cpp +++ b/cg/cg1600.cpp @@ -473,7 +473,7 @@ bool TStampa_IVdirettiva::data_bil_raff (TMask_field& f, KEY key) a()._anno_esercizio_raf = anno; } else - anno == 1; + anno = 1; /**** if (dataraf == botime) { diff --git a/cg/cg2102.cpp b/cg/cg2102.cpp index 12c7297c4..4aeb8def7 100755 --- a/cg/cg2102.cpp +++ b/cg/cg2102.cpp @@ -534,6 +534,7 @@ HIDDEN bool imptot_error(const TImporto& imptot, const TImporto& impsal, bool va { TImporto cassa(impsal); cassa.swap_section(); TImporto residuo(imptot); residuo -= cassa; residuo.normalize(imptot.sezione()); + bool ok = TRUE; if (!residuo.is_zero()) { diff --git a/cg/cg3400.cpp b/cg/cg3400.cpp index 6bc398aca..4fec205dd 100755 --- a/cg/cg3400.cpp +++ b/cg/cg3400.cpp @@ -1655,7 +1655,7 @@ bool TStampa_giornale::data_a_hndl (TMask_field& f, KEY k) { if (dtda.not_empty()) { - if (data_da.year() != data_a.year()); + if (data_da.year() != data_a.year()) return f.warning_box("Le date specificate non appartengono allo stesso anno"); if (data_da > data_a) return f.warning_box("La data di partenza non puo' essere maggiore della data finale"); diff --git a/cg/cg4300.cpp b/cg/cg4300.cpp index 7c967fc7e..696341f98 100755 --- a/cg/cg4300.cpp +++ b/cg/cg4300.cpp @@ -45,20 +45,6 @@ void _Iva11Array::zero(const char* fld_name) } // Methods of _ProrataItem -void _ProrataItem::set(const int a, const real& c, const real& p, const bool fl) -{ - _current_perc = c; - _previous_ok = a < 1998 ? TRUE : fl; - - if (a > 1997) // Se siamo prima del 1997 la percentuale prec vale 0 - { - if (!_previous_ok) // Se non ha trovato la percentuale anno precedente - _previous_perc = c; // usa quella attuale ricordandosi la segnalazione - else - _previous_perc = p; - } -} - // Calcola prorata con percentuale identificata dall'anno passato // se la % prorata relativa all'anno indicato non esiste, ritorna 0 diff --git a/cg/cg4301.cpp b/cg/cg4301.cpp index 07fb3ebd6..c601ed71c 100755 --- a/cg/cg4301.cpp +++ b/cg/cg4301.cpp @@ -17,6 +17,7 @@ #include #include #include +#include // -------------------- QUI comincia l'avventura -------------------------- // Datemi un punto di appoggio ****************** @@ -245,7 +246,7 @@ bool TLiquidazione_app::update_firm(int month, bool recalc) for (int i = atoi(_year); i>=anno; i--) { - _year = format("%d", i); + _year = format("%d", i); if (look_pla(cattiv, FALSE)) // Reperisce percentuale prorata anno indicato (se esiste la tabella) pa.add(_year, _pla->get_real("R8")); } diff --git a/cg/cg4304.cpp b/cg/cg4304.cpp index 6c7aa0b3b..ea1ecce79 100755 --- a/cg/cg4304.cpp +++ b/cg/cg4304.cpp @@ -538,7 +538,7 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool real rit_iva(s1.get(1)); const bool is_rit= tipodet != 0 && month == 13 && rit_imp != 0.0; //Se fattura in ritardo con tipo detr. != 0 e si sta calcolando l'annuale const tipo_sospensione sosp_imp = _reg->get_bool("B1") ? (tipo_sospensione) _reg->get_int("I9") : nessuna; - issosp |= sosp_imp != nessuna; // Setta il flag di presenza registri in sospensione (qualsiasi tipo: normale, vol_affari, liquidazione) + issosp |= (sosp_imp != nessuna); // Setta il flag di presenza registri in sospensione (qualsiasi tipo: normale, vol_affari, liquidazione) // ACHTUNG! Corrispettivi da ventileer possono ventilare // ad un altro codiva; in tal caso si scrive quello diff --git a/cg/cg4400.cpp b/cg/cg4400.cpp index 4e3d11c6b..e2f4e5dc6 100755 --- a/cg/cg4400.cpp +++ b/cg/cg4400.cpp @@ -7,6 +7,25 @@ #include "cg4400a.h" #include "cg4400b.h" #include "cglib01.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + static enum tipo_sospensione { nessuna, normale, vol_affari, liquidazione }; @@ -241,7 +260,7 @@ void TStampa_registri_app::get_dati_ditta() unloc.read(); if (unloc.read() == NOERR) { - TRectype dep = look_comuni (unloc.get(ULC_COMULC)); + TRectype & dep =look_comuni (unloc.get(ULC_COMULC)); _comunefis = dep.get(COM_DENCOM); _provfis = dep.get(COM_PROVCOM); _cap = dep.get(COM_CAPCOM); diff --git a/cg/cg5500.cpp b/cg/cg5500.cpp index 865e7bd3f..a54c781cd 100755 --- a/cg/cg5500.cpp +++ b/cg/cg5500.cpp @@ -47,7 +47,7 @@ void Visliq_app::set_freqviva() _freqviva = _lia->get("S7"); else { - TLocalisamfile ditte(LF_NDITTE,TRUE); + TLocalisamfile ditte(LF_NDITTE); ditte.zero(); ditte.put("CODDITTA", get_firm()); ditte.read(); @@ -647,8 +647,7 @@ bool Visliq_app::vis_one(int m) end_wait(); TProgind* pp = new TProgind(10l,"Estrazione liquidazione: prego attendere", FALSE,FALSE); - liq.run(); - if (liq.error()) + if (liq.run() != 0) { beep(); return FALSE; @@ -659,7 +658,7 @@ bool Visliq_app::vis_one(int m) brw.goto_pos(brw.lines()-16l, 9); delete pp; - TViswin* vsw = brw.vis_win(); + TViswin & vsw = brw.vis_win(); bool is_delega = FALSE; real vers; TDate date; TString abi(5), cab(5), con(3); @@ -822,7 +821,7 @@ bool Visliq_app::vis_one(int m) } -void Visliq_app::recalc_liq_data(TViswin* vsw, real& rimb, real& rett, real& vers, +void Visliq_app::recalc_liq_data(TViswin & vsw, real& rimb, real& rett, real& vers, real& acc, TString& d1, TString& d2, TDate& date, TString& abi, TString& cab, TString& con) { @@ -908,47 +907,47 @@ void Visliq_app::recalc_liq_data(TViswin* vsw, real& rimb, real& rett, real& ver // una sburlata di search ...... int x = 0; long lvers = -1l; - long line = vsw->search("CALCOLO LIQUIDAZIONE D'IMPOSTA", x); + long line = vsw.search("CALCOLO LIQUIDAZIONE D'IMPOSTA", x); int wasdebt = ris.sign(); - long lrisd = vsw->search("RISULTATO", x, line, TRUE); // RISULTATO a debito - long lrisc = vsw->search("RISULTATO", x, lrisd+1l, TRUE); // credito - long lrettc = vsw->search("Rettifiche IVA a credito",x,line,TRUE); - long lrettd = vsw->search("Rettifiche IVA a debito", x,line,TRUE); - long lacct = vsw->search("Versamento acconto dicembre",x,line,TRUE); - long lrimb = vsw->search("Iva chiesta a rimborso",x,line,TRUE); - long lintr = vsw->search("Interesse",x,line,TRUE); - long livdv = vsw->search("IVA DOVUTA",x,line,TRUE); - long lrivr = vsw->search("Versamenti effettuati",x,line,TRUE); + long lrisd = vsw.search("RISULTATO", x, line, TRUE); // RISULTATO a debito + long lrisc = vsw.search("RISULTATO", x, lrisd+1l, TRUE); // credito + long lrettc = vsw.search("Rettifiche IVA a credito",x,line,TRUE); + long lrettd = vsw.search("Rettifiche IVA a debito", x,line,TRUE); + long lacct = vsw.search("Versamento acconto dicembre",x,line,TRUE); + long lrimb = vsw.search("Iva chiesta a rimborso",x,line,TRUE); + long lintr = vsw.search("Interesse",x,line,TRUE); + long livdv = vsw.search("IVA DOVUTA",x,line,TRUE); + long lrivr = vsw.search("Versamenti effettuati",x,line,TRUE); if (wasdebt != 0) - lvers = vsw->search(wasdebt < 0 ? "CREDITO ATTUALE" : "IVA DA VERSARE", + lvers = vsw.search(wasdebt < 0 ? "CREDITO ATTUALE" : "IVA DA VERSARE", x, line, TRUE); if (lvers == -1l) - lvers = vsw->search("IVA A DEBITO DA NON VERSARE", x, line, TRUE); + lvers = vsw.search("IVA A DEBITO DA NON VERSARE", x, line, TRUE); if (lvers == -1l) lvers = lrisc+1l; // ... seguita da una sburlata di replace - vsw->replace(lrimb, rimb.string("###.###.###.###"), 75); - vsw->replace(lrisd, risdb.string("###.###.###.###"), 75); - vsw->replace(lrisc, riscr.string("###.###.###.###"), 58); - vsw->replace(lacct, acc.string("###.###.###.###"), 58); + vsw.replace(lrimb, rimb.string("###.###.###.###"), 75); + vsw.replace(lrisd, risdb.string("###.###.###.###"), 75); + vsw.replace(lrisc, riscr.string("###.###.###.###"), 58); + vsw.replace(lacct, acc.string("###.###.###.###"), 58); if (rett.sign() > 0) { - vsw->replace(lrettd, rett.string("###.###.###.###"), 75); - vsw->replace(lrettc, " ", 58); + vsw.replace(lrettd, rett.string("###.###.###.###"), 75); + vsw.replace(lrettc, " ", 58); } else if (rett.sign() < 0) { real rabs = abs(rett); - vsw->replace(lrettc, rabs.string("###.###.###.###"), 58); - vsw->replace(lrettd, " ", 75); + vsw.replace(lrettc, rabs.string("###.###.###.###"), 58); + vsw.replace(lrettd, " ", 75); } else { - vsw->replace(lrettc, " ", 58); - vsw->replace(lrettd, " ", 75); + vsw.replace(lrettc, " ", 58); + vsw.replace(lrettd, " ", 75); } if (risul.sign() < 0) // Significa che in questo momento il risultato e' a credito @@ -958,15 +957,15 @@ void Visliq_app::recalc_liq_data(TViswin* vsw, real& rimb, real& rett, real& ver ln.overwrite(rabs.string("###.###.###.###"), 58); if (lintr > 0) // Quindi niente riga "Interessi " ... { - vsw->replace(lintr," ",23); - vsw->replace(lintr," ",33); - vsw->replace(lintr," ",41); - vsw->replace(lintr," ",75); + vsw.replace(lintr," ",23); + vsw.replace(lintr," ",33); + vsw.replace(lintr," ",41); + vsw.replace(lintr," ",75); } if (livdv > 0) // ...ed "IVA DOVUTA" { - vsw->replace(livdv," ",23); - vsw->replace(livdv," ",75); + vsw.replace(livdv," ",23); + vsw.replace(livdv," ",75); } } else if (risul.sign() > 0) // ... altrimenti siamo a debito, in tal caso si hanno gli interessi (solo trimestrali of course) @@ -977,30 +976,30 @@ void Visliq_app::recalc_liq_data(TViswin* vsw, real& rimb, real& rett, real& ver if (lintr == -1) { lintr = lrisc + 2; - vsw->replace(lintr, "Interesse", 23); - vsw->replace(lintr, itt.stringa(6,2), 33); - vsw->replace(lintr, "%", 43); + vsw.replace(lintr, "Interesse", 23); + vsw.replace(lintr, itt.stringa(6,2), 33); + vsw.replace(lintr, "%", 43); } if (livdv == -1) { livdv = lrisc + 1; - vsw->replace(livdv, "IVA DOVUTA", 23); + vsw.replace(livdv, "IVA DOVUTA", 23); } if (lintr > 0) - vsw->replace(lintr, intr.string("###.###.###.###"), 75); + vsw.replace(lintr, intr.string("###.###.###.###"), 75); if (livdv > 0) { - vsw->replace(livdv, risul.string("###.###.###.###"), 75); + vsw.replace(livdv, risul.string("###.###.###.###"), 75); risul += intr; } } ln.overwrite("IVA DA VERSARE", 23); ln.overwrite(risul.string("###.###.###.###"), 75); } - vsw->replace(lvers, ln, 0); - vsw->replace(lrivr, vers.string("###.###.###.###"), 58); + vsw.replace(lvers, ln, 0); + vsw.replace(lrivr, vers.string("###.###.###.###"), 58); - vsw->refresh(); + vsw.refresh(); } void Visliq_app::recalc_next_liq(int start_month, TSheet_field* sl, TSheet_field* sv) diff --git a/cg/cg5500.h b/cg/cg5500.h index 0672edc29..d0ab8006e 100755 --- a/cg/cg5500.h +++ b/cg/cg5500.h @@ -99,7 +99,7 @@ public: TTable* del() { return _del; } // riaggiusta la liquidazione del mese dato - void recalc_liq_data(TViswin* v, real& rimb, real& rett, real& vers, + void recalc_liq_data(TViswin & v, real& rimb, real& rett, real& vers, real& acc, TString& d1, TString& d2, TDate& date, TString& abi, TString& cab, TString& con); diff --git a/cg/cg6600.cpp b/cg/cg6600.cpp index 89a148bff..8821db71f 100755 --- a/cg/cg6600.cpp +++ b/cg/cg6600.cpp @@ -57,7 +57,7 @@ public: virtual bool create(); virtual bool destroy(); - virtual bool menu(MENU_TAG m); + virtual void main_loop(); virtual bool check_autorization() const {return FALSE;} virtual void on_config_change(); diff --git a/cg/cg6804.cpp b/cg/cg6804.cpp index c039cc34e..3908f22c8 100755 --- a/cg/cg6804.cpp +++ b/cg/cg6804.cpp @@ -1179,7 +1179,7 @@ bool TVar_sc::codval_handler(TMask_field& f, KEY k) TConfig conf (CONFIG_DITTA); TString valuta = conf.get("GesVal"); - if (codval.not_empty && valuta.empty()) + if (codval.not_empty() && valuta.empty()) return f.warning_box("Non e' possibile indicare il codice valuta se non indicata la gestione valuta sui parametri ditta"); if (codval.empty() && valuta.not_empty()) return f.warning_box("Il codice valuta deve essere indicato in quanto indicata la gestione in valuta sui parametri ditta"); diff --git a/cg/cglib04.h b/cg/cglib04.h index 663991631..1f8fb4ddc 100755 --- a/cg/cglib04.h +++ b/cg/cglib04.h @@ -22,7 +22,8 @@ class TProgind; #include #include #include -#include +#include +#include #define TEMP_CAUS "tcaus" #define TEMP_RCAUS "trcaus" diff --git a/cg/cgsaldac.cpp b/cg/cgsaldac.cpp index 8164c0cfd..fb90bdc3d 100755 --- a/cg/cgsaldac.cpp +++ b/cg/cgsaldac.cpp @@ -1247,7 +1247,7 @@ bool TPartita::esistono_abbuoni_diffcam(long nreg) const const TString& TPartita::codice_valuta() const { const int ultima = last(); - return ultima > 0 ? riga(ultima).codice_valuta() : EMPTY_STRING; + return ultima > 0 ? riga(ultima).codice_valuta() : (const TString &) EMPTY_STRING; } bool TPartita::in_valuta() const diff --git a/db/db0.cpp b/db/db0.cpp index 9775f263e..e0b67513d 100755 --- a/db/db0.cpp +++ b/db/db0.cpp @@ -4,9 +4,10 @@ int main(int argc, char** argv) { - int n = argc > 1 ? atoi(argv[1]+1) : 0; + int n = argc > 1 ? (argv[1][1] - '0') : 0; switch(n) { + case 4: db0500(argc, argv); break; default: db0100(argc, argv); break; } exit(0); diff --git a/db/db0.h b/db/db0.h index 381aa76d9..176a75e8e 100755 --- a/db/db0.h +++ b/db/db0.h @@ -2,5 +2,6 @@ #define __DB0_H int db0100(int argc, char* argv[]); +int db0500(int argc, char* argv[]); #endif diff --git a/db/db0.url b/db/db0.url index a8c25c557..86c291703 100755 --- a/db/db0.url +++ b/db/db0.url @@ -1,2 +1,11 @@ +#define APPNAME EURO_DB +#define QAPPNAME "EURO_DB" +#define QFIRMNAME "A.G.A. Informatica Srl" + #include + +MENU TASK_MENUBAR + SUBMENU MENU_FILE "~File" + + diff --git a/db/db0100.cpp b/db/db0100.cpp index 3c5a3a47d..efb0357e8 100755 --- a/db/db0100.cpp +++ b/db/db0100.cpp @@ -1,733 +1,189 @@ +#include "db0.h" + +#include +#include +#include #include "dblib.h" -#include -#include -#include -#include +#include "dbtblav.h" -#include "../mg/mglib.h" -#include "../mg/anamag.h" - -#include "db0100a.h" - -/////////////////////////////////////////////////////////// -// Funzione di richiesta stringa che andra' in libreria -/////////////////////////////////////////////////////////// - -#include - -bool query_string(const char* prompt, TString& str, int width = 50, const char* flags= "") +class TLavorazione_tab : public TLavorazione { - int maskwidth = width+2; - if (maskwidth < 26) - maskwidth = 26; - if (maskwidth > 78) - maskwidth = 78; - - TMask m(prompt, 1, maskwidth, 5); - m.add_string(DLG_USER, 0, "", 1, 1, width, flags, width > 76 ? 76 : width); - m.add_button(DLG_CANCEL, 0, "", -12, -1, 10, 2); - m.add_button(DLG_OK, 0, "", -22, -1, 10, 2); - m.set(DLG_USER, str); - bool ok = m.run() == K_ENTER; - if (ok) - str = m.get(DLG_USER); - return ok; -} - -/////////////////////////////////////////////////////////// -// TDistinta_sheet -/////////////////////////////////////////////////////////// - -class TDistinta_sheet : public TSheet -{ - TArray _data; - -protected: - virtual void get_row(long n, TToken_string& row); - virtual long get_items() const { return _data.items(); } - public: - TArray& rows_array() { return _data; } - TDistinta_sheet(); - virtual ~TDistinta_sheet() { } + void put_sheet(TSheet_field & s); + void fill_sheet(TSheet_field & s); + TLavorazione_tab (const TRectype r) : TLavorazione(r) {} + TLavorazione_tab (const char* cod) : TLavorazione(cod) {} + virtual ~TLavorazione_tab (){} }; -void TDistinta_sheet::get_row(long n, TToken_string& row) +void TLavorazione_tab::fill_sheet(TSheet_field & sheet) { - const TRiga_esplosione& re = (const TRiga_esplosione&)_data[int(n)]; - row.cut(0); - row.add(re.tipo()); - row.add(re.articolo()); - row.add(re.giacenza()); - row.add(re.um()); - row.add(re.val().string(0, 5)); - row.add(re.livello()); - row.add(re.ordinamento()); -} - -TDistinta_sheet::TDistinta_sheet() -: TSheet(-1, -1, 0, 20, "Esplosione", "Tipo|Codice@20|Giacenza@15|UM|Quantita'@18R|Liv.@R|Sort@8R") -{ -} - -/////////////////////////////////////////////////////////// -// TQuery_mask -/////////////////////////////////////////////////////////// - -class TQuery_mask : public TAutomask -{ - TDistinta_tree& _tree; - TToken_string _curr; - -protected: - virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); - -public: - const TToken_string& curr() const { return _curr; } - void restart_tree(); - - TQuery_mask(TDistinta_tree& tree); - virtual ~TQuery_mask() { } -}; - -void TQuery_mask::restart_tree() -{ - _tree.restart(); - while (!_tree.is_leaf()) + sheet.destroy(); + int righe = 0; + const int maxlinee = linee(); + for (int j = 0; j < maxlinee ; j++) { - _tree.expand(); - _tree.goto_firstson(); - if (_tree.has_rbrother()) - break; + TToken_string& row = sheet.row(righe); + row=cod_linea(j); + if (!row.blank()) + { + row.add(raw_numpers_linea(j) ,F_LNUMPERS-101); + row.add(raw_produttiv_linea(j).string() ,F_LPRODUTTIV-101); + sheet.check_row(righe); + righe++; + } } - - TTree_field& tf = tfield(F_TREE); - tf.win().update_thumb(0, 0); - tf.win().force_update(); } -bool TQuery_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +void TLavorazione_tab::put_sheet(TSheet_field& sheet) { - switch (o.dlg()) + int righe = sheet.items(); + + bool ok=TRUE; + int l=0; + reset_linee(); + for (int i = 0; i < righe ; i++) { - case F_CODICE: - if (e == fe_modify) + TToken_string & row=sheet.row(i); + TString16 linea =row.get(F_CODLIN-101); + if (!linea.blank()) { - TTree_field& tf = tfield(F_TREE); - const TCodice_articolo val = o.get(); - if (val.not_empty() && _tree.has_root()) + ok=FALSE; + // aggiunge il codice linea + linea.trim(); + if (set_cod_linea(l,linea)) { - long pos = _tree.find_node(val); - if (pos <= 0) - { - if (_tree.set_root(val)) - pos = 1; - } - if (pos > 0) - { - tf.select_current(); - do { _tree.expand(); } while (_tree.goto_father()); - pos = _tree.find_node(val, SCAN_PRE_ORDER | SCAN_IGNORING_UNEXPANDED); - - TField_window& win = tf.win(); - const TPoint& range = win.range(); - if (pos > range.y) - win.set_scroll_max(win.columns(), pos+win.rows()); - - win.update_thumb(-1, pos-1); - win.force_update(); - tf.set_focus(); - } - } - else - { - _tree.set_root(val); - } - tf.win().force_update(); - } - case F_SORT: - if (e == fe_init || e == fe_modify) - { - int sk = atoi(o.get()); - _tree.set_sort_key(sk); - if (e == fe_modify) - restart_tree(); - } - break; - case F_TREE: - if (e == fe_modify) - { - _tree.curr_id(_curr); - TCodice_articolo code; _tree.curr_code(code); - set(F_CODICE, code); - } - break; - case DLG_SELECT: - if (e == fe_button) - { - const TString& str = get(F_CODICE); - if (str.not_empty()) - set(F_CODICEQ, str); - else - return FALSE; - } - break; - case F_COPY: - if (e == fe_button) - { - const TString oldcode = get(F_CODICE); - TLocalisamfile dist(LF_DIST); - dist.put("CODDIST", oldcode); - if (dist.read() == NOERR) - { - TString newcode; - if (query_string("Nuovo codice", newcode, 20, "U")) + // aggiunge il numero persone + linea=row.get(F_LNUMPERS-101); + linea.rtrim(); + if (set_numpers_linea(l,atoi(linea))) { - if (newcode.not_empty() && newcode != oldcode) - { - dist.put("CODDIST", newcode); - const int err = dist.write(); - if (err == NOERR) - { - TRecord_array rdist(LF_RDIST, "NRIG"); - rdist.renum_key("CODDIST", oldcode); - if (rdist.read(rdist.key()) == NOERR) - { - rdist.renum_key("CODDIST", newcode); - rdist.write(); - } - } - else - { - if (err == _isreinsert) - error_box("La distinta '%s' e' gia' stata inserita", (const char*)newcode); - else - error_box("Errore %d durante la registrazione della distinta '%s'", err, (const char*)newcode); - } - } + // aggiunge il fattore di produttivitą + linea=row.get(F_LPRODUTTIV-101); + linea.cut(5); + linea.rtrim(); + if (!set_produttiv_linea(l,real(linea))) + break; + ok=TRUE; } + else break; } - else - error_box("Il codice '%s' non corrisponde ad una distinta valida", (const char*)oldcode); + else break; + l++; } - break; - case F_EXPLODE: - if (e == fe_button) - { - TCodice_articolo art = get(F_CODICE); - if (art.not_empty()) - { - _tree.set_root(art); - restart_tree(); - } - if (_tree.goto_root()) - { - _tree.curr_code(art); - TString80 caption; - caption << "Esplosione " << art; - - TMask m("db0100c"); - m.set_caption(caption); - m.set(F_SORT, get(F_SORT)); - m.set(F_ARTICOLI, "X"); - m.set(F_LAVORAZIONI, "X"); - m.set(F_VIRTUALI, "X"); - if (m.run() == K_ENTER) - { - TDistinta_sheet a; - a.set_caption(caption); - int sk = m.get_int(F_SORT); - int md = m.get_int(F_MAXDEPTH); - int gr = m.get_int(F_GROUPMODE); - bool mb = m.get_bool(F_MATBASE); - bool lq = m.get_bool(F_LASTQTA); - - TString16 fi; - if (m.get_bool(F_ARTICOLI)) fi << 'A'; - if (m.get_bool(F_LAVORAZIONI)) fi << 'L'; - if (m.get_bool(F_VIRTUALI)) fi << 'V'; - if (fi.len() == 3) fi.cut(0); - - _tree.explode(a.rows_array(), mb, gr, md, fi, sk, lq); - a.run(); - } - } - } - break; - default: - break; - } - return TRUE; -} - -TQuery_mask::TQuery_mask(TDistinta_tree& dt) - : TAutomask("db0100a"), _tree(dt) -{ - TTree_field& tree = tfield(F_TREE); - tree.set_tree(&_tree); -} - -/////////////////////////////////////////////////////////// -// TDistinta_mask -/////////////////////////////////////////////////////////// - -class TDistinta_mask : public TAutomask -{ - TDistinta_tree& _tree; - - TRecord_cache _ord; - - bool on_distsheet_event(TOperable_field& o, TField_event e, long jolly); - bool on_parmsheet_event(TOperable_field& o, TField_event e, long jolly); - -protected: - virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); - bool test_row(const TToken_string& row); - -public: - TDistinta_mask(TDistinta_tree& dt); - virtual ~TDistinta_mask() { } -}; - -bool TDistinta_mask::test_row(const TToken_string& row) -{ - const TCodice_articolo father = get(F_CODICE); - - TCodice_articolo code; row.get(1, code); - bool ok = code != father; - if (ok && _tree.find_node(father) > 0) - { - TToken_string path; _tree.curr_id(path); - path.add(code); - ok = !_tree.is_cyclic(path); } if (!ok) - error_box("Il codice '%s' non puo' essere utilizzato\n" - "in quanto la distinta risulterebbe ciclica.", (const char*)code); - - // Se e' una lavorazione - if (get(F_TIPO)[0] == 'L') { - ok = row[0] == 'L' && _tree.is_lav(code); - if (!ok) - error_box("Il codice '%s' non e' una lavorazione", (const char*)code); + set_cod_linea(l,""); + message_box("Impossibile memorizzare piu' di %d righe",l); } - - return ok; } -bool TDistinta_mask::on_distsheet_event(TOperable_field& o, TField_event e, long jolly) + + +class TDistinta_tables : public TTable_application { - const short id = o.dlg(); - switch (id) - { - case F_SHEET: - if (e == se_notify_add || e == se_notify_modify || e == fe_close) - { - TSheet_field& sheet = (TSheet_field&)o; - const int nrig = int(jolly); - TToken_string& row = sheet.row(nrig); - switch(e) - { - case se_notify_add: - row.add("A", F_TIPOCOMP-FIRST_FIELD); // Forza il listbox ad articolo - row.add("1", F_EXPR-FIRST_FIELD); - break; - case se_notify_modify: - return test_row(row); - case fe_close: - { - TString80 code; - for (int n = sheet.items()-1; n >= 0; n--) - { - const TToken_string& row = sheet.row(n); - row.get(F_CODART-FIRST_FIELD, code); - if (!code.blank()) - { - if (!test_row(row)) - return FALSE; - } - else - sheet.destroy(n); - } - } - if (sheet.items() == 0) - error_box("E' necessario inserire almeno una riga nella distinta"); - break; - default: - break; - } - } - break; - case F_CODART: - case F_CODLAV: - case F_CODDIS: - if (e == fe_modify || e == fe_init) - { - TMask& m = o.mask(); - const TEdit_field& ef = (const TEdit_field&)o; - const TRectype& rec = ef.browse()->cursor()->curr(); - switch(rec.num()) - { - case LF_ANAMAG: - m.set(F_DESCOMP, rec.get(ANAMAG_DESCR)); - m.enable(F_UMEXPR); - if (m.get(F_UMEXPR).empty()) - { - const TCodice_articolo art = o.get(); - const TQuantita qta(art); - m.set(F_UMEXPR, qta.um()); - } - break; - case LF_DIST : - m.set(F_DESCOMP, rec.get("DESCR")); - m.set(F_UMEXPR, rec.get("UM")); - m.disable(F_UMEXPR); - break; - default : - m.set(F_DESCOMP, rec.get("S0")); - m.set(F_UMEXPR, rec.get("S6")); - m.disable(F_UMEXPR); - break; - } - } - break; - case F_EXPR: - if (e == fe_modify) - { - const TString& str = o.get(); - if (str.not_empty()) - { - TDistinta_expr expr; - if (expr.set(str)) - { - if (expr.numvar() > 0) - { - TDecoder var("VAR"); - for (int v = expr.numvar()-1; v >= 0; v--) - { - const char* name = expr.varname(v); - if (var.decode(name).empty()) - return error_box("La variabile %s non e' definita in tabella", name); - } - } - else - o.set(expr.as_string()); - } - else - return error_box("Errore di sintassi: %s", expr.last_token()); - } - else - return error_box("L'espressione deve essere specificata"); - } - break; - case F_SORT1: - case F_SORT2: - case F_SORT3: - case F_SORT4: - case F_SORT5: - if (e == fe_modify && o.empty()) - { - TString16 key; key << (o.dlg() - F_SORT1 + 1); - bool completo = _ord.get(key).get_bool("B0"); - if (completo) - return error_box("Il criterio di ordinamento %s deve essere specificato", - (const char*)key); - } - break; - default: - break; - } - return TRUE; -} - -bool TDistinta_mask::on_parmsheet_event(TOperable_field& o, TField_event e, long jolly) -{ - const short id = o.dlg(); - switch (id) - { - case F_PARAM: - if (e == fe_modify || e == fe_close) - { - const TString& str = o.get(); - if (!isalpha(str[0]) && str[0] != '_') - return error_box("Il nome del parametro deve iniziare con un carattere alfabetico o con _"); - for (const char* s = str; *s; s++) - { - if (!isalnum(*s) && *s != '_') - return error_box("Il nome del parametro puo' contenere solo caratteri alfanumerici o _"); - } - } - break; - default: - break; - } - return TRUE; -} - - -static _sort_key = 0; - -static int compare_sheet_rows(const TObject** o1, const TObject** o2) -{ - TToken_string* s1 = (TToken_string*)*o1; - TToken_string* s2 = (TToken_string*)*o2; - - const int key_pos = F_SORT1 - FIRST_FIELD + _sort_key - 1; - long k1 = s1->get_long(key_pos); - long k2 = s2->get_long(key_pos); - - if (k1 == 0) k1 = 100000000L; - if (k2 == 0) k2 = 100000000L; - - return k1 == k2 ? 0 : (k1 > k2 ? +1 : -1); -} - -bool TDistinta_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) -{ - const short id = o.dlg(); - switch (id) - { - case F_CODICE: - if (e == fe_init) - { - bool virtuale = TRUE; - const TString& code = o.get(); - const char type = _tree.get_type(code); - switch(type) - { - case 'A': - { - set(F_TIPO, "A", TRUE); - - TDecoder mag(LF_ANAMAG, ANAMAG_DESCR); - set(F_DESCR, mag.decode(code)); - - const TQuantita qta(code); - set(F_UM, qta.um()); - } - break; - case 'L': - { - set(F_TIPO, "L", TRUE); - TTable lav("LAV"); - lav.put("CODTAB", code); - if (lav.read() == NOERR) - { - set(F_DESCR, lav.get("S0")); - set(F_UM, lav.get("S6")); - set(F_PREZZO, lav.get("R0")); - } - } - break; - default: - set(F_TIPO, "V", TRUE); - break; - } - } - break; - case F_SORT: - if (e == fe_modify) - { - TSheet_field& sf = sfield(F_SHEET); - _sort_key = atoi(o.get()); - if (_sort_key > 0) - { - TString_array& a = sf.rows_array(); - a.TArray::sort(compare_sheet_rows); - } - else - { - TRelation rel(LF_DIST); - sf.autoload(rel); - } - sf.force_update(); - } - break; - case F_SHEET: - return on_distsheet_event(o, e, jolly); - default: - if (id >= 101 && id < 500) // E' in uno sheet? - { - switch (jolly) - { - case 1 : return on_distsheet_event(o, e, jolly); - case 2 : return on_parmsheet_event(o, e, jolly); - default: break; - } - } - break; - } - return TRUE; -} - -TDistinta_mask::TDistinta_mask(TDistinta_tree& dt) - : TAutomask("db0100b"), _tree(dt), _ord("ORD") -{ - TSheet_field& sf = sfield(F_SHEET); - TMask& sm = sf.sheet_mask(); - TString16 key; - int i; - for (i = 4; i >= 0; i--) - { - key.format("%d", i+1); - const bool kill = _ord.get(key).empty(); - if (kill) - { - const short id = F_SORT1+i; - sm.hide(id); - sf.delete_column(id); - } - } - - TCodgiac_livelli cgl; - for (i = 4; i > 0; i--) - { - const short id = F_LIV1+i; - const bool kill = !cgl.enabled(i); - if (kill) - { - sm.hide(id); - sf.delete_column(id); - } - else - { - const TString & header = cgl.name(i); - const int len = header.len() + 1; - const int f_len = cgl.code_length(i); - sf.set_column_header(id, header); - sf.set_column_width(id, (len > f_len ? len : f_len) * 8); - } - } -} - - -/////////////////////////////////////////////////////////// -// TDistinta_app -/////////////////////////////////////////////////////////// - -class TDistinta_app : public TRelation_application -{ - TDistinta_tree _tree; - TRelation* _therel; - TQuery_mask* _querymask; - TDistinta_mask* _themask; - int _mode; - - void parms2rel(const TMask& m); - protected: - virtual bool user_create(); - virtual bool user_destroy(); - virtual TRelation* get_relation() const { return _therel; } - virtual bool changing_mask(int mode); - virtual TMask* get_mask(int mode); virtual int read(TMask& m); virtual int write(const TMask& m); virtual int rewrite(const TMask& m); + virtual bool user_create(); + virtual TString& get_mask_name(TString& name) const; + + virtual TMask * set_mask(TMask * _m); public: + void rows2rel(const TMask& m); }; -bool TDistinta_app::user_create() -{ - _therel = new TRelation(LF_DIST); - _querymask = new TQuery_mask(_tree); - _themask = new TDistinta_mask(_tree); - return TRUE; -} -bool TDistinta_app::user_destroy() +bool TDistinta_tables::user_create() { - delete _themask; - delete _querymask; - delete _therel; - return TRUE; -} - -bool TDistinta_app::changing_mask(int mode) -{ - bool was_query = _mode == MODE_QUERY || _mode == MODE_QUERYINS; - bool is_query = mode == MODE_QUERY || mode == MODE_QUERYINS; - return was_query != is_query; -} - -TMask* TDistinta_app::get_mask(int mode) -{ - const bool is_query = mode == MODE_QUERY || mode == MODE_QUERYINS; - _mode = mode; - return is_query ? (TMask*)_querymask : (TMask*)_themask; -} - -int TDistinta_app::read(TMask& m) -{ - const int err = TRelation_application::read(m); - - if (err == NOERR) + bool err = TTable_application::user_create(); + if (get_tabname() == "LAV") { - TSheet_field& sheet = m.sfield(F_SHEET); - FOR_EACH_SHEET_ROW(sheet, nrig, row) - sheet.check_row(nrig); - - TToken_string memo(1024, '\n'); - memo = _therel->curr().get("PARAMETRI"); - const int righe = memo.items(); - TSheet_field& params = m.sfield(F_PARAMS); - params.destroy(); - for (int i = 0; i < righe; i++) - { - TToken_string& row = params.row(i); - memo.get(i, row); - int equal = row.find('='); - if (equal > 0) - row[equal] = '|'; - } + TLavorazione_tab *lav= new TLavorazione_tab(""); + get_relation()->lfile().set_curr(lav); } - return err; } -void TDistinta_app::parms2rel(const TMask& m) +TMask * TDistinta_tables::set_mask(TMask* _m) { - TToken_string memo(1024, '\n'); - TSheet_field& parms = m.sfield(F_PARAMS); - TString var; - FOR_EACH_SHEET_ROW(parms, r, row) + TMask* mask = TTable_application::set_mask(_m); + if (get_tabname() == "LAV") { - var = row->get(0); - if (!var.blank()) + TSheet_field& sheet = mask->sfield(F_SHEET); + if (!has_module(MRAUT)) + mask->disable_page(1); + } + return mask; +} + + +TString& TDistinta_tables::get_mask_name(TString& name) const +{ + name = get_tabname(); + name.insert("dbtb", 0); + return name; +} + +int TDistinta_tables::read(TMask& m) +{ + int err = TTable_application::read(m); + if (err == NOERR) + { + if (get_tabname() == "LAV") { - memo.add(var); - memo << '='; - memo << row->get(); + TSheet_field& sheet = m.sfield(F_SHEET); + if (sheet.shown()) + { + TLavorazione_tab &lav=(TLavorazione_tab &)get_relation()->curr(); + lav.fill_sheet(sheet); + sheet.force_update(); + } } } - _therel->curr().put("PARAMETRI", memo); - - // Azzera albero per rispecchiare eventuali modifiche - _querymask->restart_tree(); + return err; } -int TDistinta_app::write(const TMask& m) +void TDistinta_tables::rows2rel(const TMask& m) { - parms2rel(m); - return TRelation_application::write(m); + if (get_tabname() == "LAV") + { + TSheet_field& sheet = m.sfield(F_SHEET); + TLavorazione_tab &lav=(TLavorazione_tab &)get_relation()->curr(); + lav.put_sheet(sheet); + } } -int TDistinta_app::rewrite(const TMask& m) +int TDistinta_tables::write(const TMask& m) { - parms2rel(m); - return TRelation_application::rewrite(m); + rows2rel(m); + int err = TTable_application::write(m); + return err; +} + +int TDistinta_tables::rewrite(const TMask& m) +{ + rows2rel(m); + int err = TTable_application::rewrite(m); + return err; } /////////////////////////////////////////////////////////// -// db0100 gestione distinte +// Main program /////////////////////////////////////////////////////////// int db0100(int argc, char* argv[]) { - TDistinta_app a; - a.run(argc, argv, "Distinta base"); + if (argc > 2) + { + TString name; + name << "Tabella " << argv[2]; + TDistinta_tables dt; + dt.run(argc, argv, name); + } return 0; } diff --git a/db/db0500.cpp b/db/db0500.cpp index b0c9917d3..9fbbfbe9f 100755 --- a/db/db0500.cpp +++ b/db/db0500.cpp @@ -36,10 +36,48 @@ bool query_string(const char* prompt, TString& str, int width = 50, const char* return ok; } +/////////////////////////////////////////////////////////// +// TDistinta_app +/////////////////////////////////////////////////////////// +class TQuery_mask; +class TDistinta_mask; + +class TDistinta_app : public TRelation_application +{ + TDistinta_tree _tree; + TRelation* _therel; + TQuery_mask* _querymask; + TDistinta_mask* _themask; + int _mode; + + void parms2rel(const TMask& m); + +protected: + virtual void init_insert_mode(TMask &); + virtual bool user_create(); + virtual bool user_destroy(); + virtual TRelation* get_relation() const { return _therel; } + virtual bool changing_mask(int mode); + virtual TMask* get_mask(int mode); + virtual void init_query_mode(TMask& m); + virtual int read(TMask& m); + virtual int write(const TMask& m); + virtual int rewrite(const TMask& m); + virtual bool remove(); + +public: + TRelation & relation() {return *_therel;} +}; + +TDistinta_app& app() +{ return (TDistinta_app&)main_app();} + + /////////////////////////////////////////////////////////// // TDistinta_sheet /////////////////////////////////////////////////////////// + class TDistinta_sheet : public TSheet { TArray _data; @@ -194,9 +232,11 @@ bool TQuery_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) if (newcode.not_empty() && newcode != oldcode) { dist.put("CODDIST", newcode); + TString environment=dist.get("PARAMETRI"); const int err = dist.write(); if (err == NOERR) - { + { + // copia le righe di distinta TRecord_array rdist(LF_RDIST, "NRIG"); rdist.renum_key("CODDIST", oldcode); if (rdist.read(rdist.key()) == NOERR) @@ -204,6 +244,27 @@ bool TQuery_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) rdist.renum_key("CODDIST", newcode); rdist.write(); } + // copia le righe delle UM + TRecord_array um(LF_UMART, "NRIGA"); + um.renum_key("CODART", newcode); + int err=um.read(um.key()) ; + if (um.rows() == 0) + err = _iskeynotfound; + switch (err) + { + case _isemptyfile: + case _iskeynotfound: + um.renum_key("CODART", oldcode); + if (um.read(um.key()) == NOERR ) + { + um.renum_key("CODART", newcode); + um.write(); + } + break; + case NOERR: + dist.put("UM", um.row(1).get("UM")); + break; + } } else { @@ -246,23 +307,38 @@ bool TQuery_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) a.set_caption(caption); int sk = m.get_int(F_SORT); int md = m.get_int(F_MAXDEPTH); - int gr = m.get_int(F_GROUPMODE); + TExplosion_grouping gr = TExplosion_grouping(m.get_int(F_GROUPMODE)); bool mb = m.get_bool(F_MATBASE); - bool lq = m.get_bool(F_LASTQTA); - bool iv = m.get_bool(F_IGNOREVIRT); TString16 fi; if (m.get_bool(F_ARTICOLI)) fi << 'A'; if (m.get_bool(F_LAVORAZIONI)) fi << 'L'; if (m.get_bool(F_VIRTUALI)) fi << 'V'; - if (fi.len() == 3) fi.cut(0); + if (m.get_bool(F_GHOST)) fi << 'G'; - _tree.explode(a.rows_array(), mb, gr, md, fi, sk, lq, iv); + _tree.explode(a.rows_array(), mb, gr, md, fi, sk); a.run(); } } } break; + case F_VAR_IMPIANTO: + if (e == fe_modify || e == fe_init) + { + _tree.set_global("_IMPIANTO",o.get()); + if (_tree.goto_root()) + restart_tree(); + } + break; + case F_HIDE_GHOST: + if (e == fe_modify) + { + const char ig=*o.get(); + _tree.set_ignore_ghost(ig > ' '); + if (_tree.goto_root()) + restart_tree(); + } + break; default: break; } @@ -284,20 +360,65 @@ class TDistinta_mask : public TAutomask { TDistinta_tree& _tree; - TRecord_cache _ord; + void set_um_rif(int row); bool on_distsheet_event(TOperable_field& o, TField_event e, long jolly); + bool on_unitsheet_event(TOperable_field& o, TField_event e, long jolly); bool on_parmsheet_event(TOperable_field& o, TField_event e, long jolly); protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); bool test_row(const TToken_string& row); + void load_um(); public: TDistinta_mask(TDistinta_tree& dt); virtual ~TDistinta_mask() { } }; +void TDistinta_mask::load_um() +{ + // ***************************** + // LETTURA SHEET UNITA' DI MISURA + char tree_type=_tree.get_type(get(F_CODICE)); + + TSheet_field &units= (TSheet_field &)field(F_UNITA); // prende lo sheet delle unitą di misura + if (tree_type=='L') + { + units.destroy(); + } + else + { + app().relation().lfile().put("CODDIST",get(F_CODICE)); + units.record()->read(*units.putkey(app().relation())); + units.autoload(app().relation()); + } + units.disable_cell(0, units.cid2index(FU_FC)); + const bool virtuale=tree_type!='A' && tree_type !='L'; + units.enable_column(units.cid2index(FU_UM),virtuale); + units.enable_column(units.cid2index(FU_DESC),virtuale); + units.enable_column(units.cid2index(FU_FC),virtuale); + units.enable_column(units.cid2index(FU_PREZZO),virtuale); + if (units.items()==0) + units.row(0) << get(F_UM) << "|1"; // aggiunge una riga allo sheet + if (units.items()==1) + { + set(F_UM,units.cell(0,units.cid2index(FU_UM))); + set(F_UMART1ST,get(F_UM)); + } + TString16 um; + FOR_EACH_SHEET_ROW_BACK(units, u, urow) + { + urow->get(units.cid2index(FU_UM), um); + if (!um.blank() && um == get(F_UM)) + { + set_um_rif(u); + break; + } + } +} + + bool TDistinta_mask::test_row(const TToken_string& row) { const TCodice_articolo father = get(F_CODICE); @@ -325,6 +446,90 @@ bool TDistinta_mask::test_row(const TToken_string& row) return ok; } +// Forza la riga row ad essere quella dell'unita' di distinta +void TDistinta_mask::set_um_rif(int row) +{ + TSheet_field& sht = sfield(F_UNITA); + const int chk = sht.cid2index(FU_RIF); + const int fc = sht.cid2index(FU_FC); + const int cod = sht.cid2index(FU_UM); + TToken_string& first = sht.row(row); + first.add("X", chk); + set(F_UM, first.get(cod), TRUE); + set(F_FCUMART, first.get(fc), TRUE); + sht.force_update(row); +} + +bool TDistinta_mask::on_unitsheet_event(TOperable_field& o, TField_event e, long jolly) +{ + static bool was_checked = FALSE; + + TSheet_field& sht = (TSheet_field&)o; + const int chk = sht.cid2index(FU_RIF); + const int cod = sht.cid2index(FU_UM); + + switch(e) + { + case se_query_modify: + sht.sheet_mask().enable(DLG_DELREC, jolly > 0L); + was_checked = *sht.cell(int(jolly), chk) > ' '; + break; + case se_query_del: + return get_bool(F_VIRTUALE) && jolly > 0L; // Impedisce di cancellare l'unita' di misura base + case se_notify_del: + if (was_checked) + set_um_rif(0); + break; + case se_notify_modify: + { + const bool is_checked = *sht.cell(int(jolly), chk) > ' '; + if (is_checked != was_checked) + { + if (was_checked) + set_um_rif(0); + else + { + FOR_EACH_SHEET_ROW(sht, r, row) + { + if (r == jolly) + set_um_rif(r); + else + { + if (*row->get(chk) > ' ') + { + row->add(" ", chk); + sht.force_update(r); + } + } + } + } + was_checked = is_checked; + } + if (jolly == 0L) + set(F_UMART1ST,sht.cell(0,sht.cid2index(FU_UM))); + } + break; + case se_query_add: + if (!get_bool(F_VIRTUALE)) + return FALSE; + break; + case se_notify_add: + if (jolly == 0L) + { + const int fc = sht.cid2index(FU_FC); + sht.disable_cell(0, fc); + sht.row(0).add("1", fc); + } + break; + case fe_close: + if (sht.items() == 0 || *sht.cell(0,0)<=' ') + return sht.error_box("E' necessario specificare l'unita' di misura principale"); + break; + default: break; + } + return TRUE; +} + bool TDistinta_mask::on_distsheet_event(TOperable_field& o, TField_event e, long jolly) { const short id = o.dlg(); @@ -340,8 +545,9 @@ bool TDistinta_mask::on_distsheet_event(TOperable_field& o, TField_event e, long { case se_notify_add: row.add("A", F_TIPOCOMP-FIRST_FIELD); // Forza il listbox ad articolo - row.add("1", F_EXPR-FIRST_FIELD); // Forza la quantita' ad 1 + row.add("", F_EXPR-FIRST_FIELD); // Forza la quantita' ad 1 row.add(nrig+1, F_SORT0-FIRST_FIELD); // Inizializza numero riga + sheet.set_focus_cell(nrig,F_TIPOCOMP-FIRST_FIELD); break; case se_notify_modify: return test_row(row); @@ -387,14 +593,15 @@ bool TDistinta_mask::on_distsheet_event(TOperable_field& o, TField_event e, long const TCodice_articolo art = o.get(); if (art.not_empty() && _tree.is_mag(art)) { - const TQuantita qta(art); + TCodice_um um = "$$"; // Unita' distinta + TQuantita qta(art, um, ZERO); m.set(F_UMEXPR, qta.um()); } } break; case LF_DIST : m.set(F_DESCOMP, rec.get("DESCR")); - m.set(F_UMEXPR, rec.get("UM")); + //m.set(F_UMEXPR, rec.get("UM")); break; default : m.set(F_DESCOMP, rec.get("S0")); @@ -441,7 +648,7 @@ bool TDistinta_mask::on_distsheet_event(TOperable_field& o, TField_event e, long if ((fe_modify || fe_close) && o.empty()) { TString16 key; key << (o.dlg() - F_SORT1 + 1); - bool completo = _ord.get(key).get_bool("B0"); + bool completo = cache().get("ORD", key).get_bool("B0"); if (completo) { TAutomask& m = (TAutomask&)o.mask(); @@ -462,7 +669,7 @@ bool TDistinta_mask::on_parmsheet_event(TOperable_field& o, TField_event e, long const short id = o.dlg(); switch (id) { - case F_PARAM: + case FV_PARAM: if (e == fe_modify || e == fe_close) { const TString& str = o.get(); @@ -517,12 +724,8 @@ bool TDistinta_mask::on_field_event(TOperable_field& o, TField_event e, long jol { set(F_TIPO, "A", TRUE); - TArticolo mag (code); - + TArticolo mag (code); set(F_DESCR, mag.get(ANAMAG_DESCR)); - - const TQuantita qta(code); - set(F_UM, qta.um()); set(F_PREZZO, mag.get(ANAMAG_COSTSTD)); set(F_PESO, mag.get(ANAMAG_PESO)); set(F_UMP, mag.get(ANAMAG_UMP)); @@ -545,6 +748,7 @@ bool TDistinta_mask::on_field_event(TOperable_field& o, TField_event e, long jol set(F_TIPO, "V", TRUE); break; } + load_um(); } } break; @@ -567,6 +771,8 @@ bool TDistinta_mask::on_field_event(TOperable_field& o, TField_event e, long jol sf.force_update(); } break; + case F_UNITA: + return on_unitsheet_event(o, e, jolly); case F_SHEET: return on_distsheet_event(o, e, jolly); default: @@ -585,16 +791,17 @@ bool TDistinta_mask::on_field_event(TOperable_field& o, TField_event e, long jol } TDistinta_mask::TDistinta_mask(TDistinta_tree& dt) - : TAutomask("db0500b"), _tree(dt), _ord("ORD") + : TAutomask("db0500b"), _tree(dt) { TSheet_field& sf = sfield(F_SHEET); + sf.set_append(FALSE); TMask& sm = sf.sheet_mask(); TString16 key; int i; for (i = 4; i >= 0; i--) { key.format("%d", i+1); - const bool kill = _ord.get(key).empty(); + const bool kill = cache().get("ORD",key).empty(); if (kill) { const short id = F_SORT1+i; @@ -608,59 +815,72 @@ TDistinta_mask::TDistinta_mask(TDistinta_tree& dt) { const short id = F_LIV1+i-1; cgl.set_sheetcolumn(sf,id,i); -/* const bool kill = !cgl.enabled(i); - if (kill) - { - sm.hide(id); - sf.delete_column(id); - } - else - { - const TString & header = cgl.name(i); - const int len = header.len() + 1; - const int f_len = cgl.code_length(i); - sf.set_column_header(id, header); - sf.set_column_width(id, (len > f_len ? len : f_len) * 8); - }*/ } + TSheet_field& su = sfield(F_UNITA); + su.set_lines_record(*(new TRecord_array(LF_UMART, "NRIGA"))); - _ord.test_file_changes(); + cache().test_file_changes(LF_TAB); } /////////////////////////////////////////////////////////// // TDistinta_app /////////////////////////////////////////////////////////// - -class TDistinta_app : public TRelation_application -{ - TDistinta_tree _tree; - TRelation* _therel; - TQuery_mask* _querymask; - TDistinta_mask* _themask; - int _mode; - - void parms2rel(const TMask& m); - -protected: - virtual bool user_create(); - virtual bool user_destroy(); - virtual TRelation* get_relation() const { return _therel; } - virtual bool changing_mask(int mode); - virtual TMask* get_mask(int mode); - virtual void init_query_mode(TMask& m); - virtual int read(TMask& m); - virtual int write(const TMask& m); - virtual int rewrite(const TMask& m); - -public: -}; - bool TDistinta_app::user_create() { _therel = new TRelation(LF_DIST); _querymask = new TQuery_mask(_tree); _themask = new TDistinta_mask(_tree); + +/* + if (noyes_box("Rinumero le righe delle distinte?")) + if (noyes_box("Sicuro?")) + if (noyes_box("Sicuro sicuro?")) + if (noyes_box("Sicuro sicuro sicuro?")) + { + int err; + TString cod="";int nrig; + TLocalisamfile rdist(LF_RDIST); + err = rdist.read(_isfirst); + while (err == NOERR) + { + if (cod != rdist.get("CODDIST")) + { + cod = rdist.get("CODDIST"); + nrig=1; + } + rdist.put("SORT1",nrig); + rdist.rewrite(); + rdist.put("NRIG",rdist.get_int("NRIG")+1); + err = rdist.read(_isgteq); + nrig++; + } + } + + if (noyes_box("Rinumero le unita' di misura articoli?")) + if (noyes_box("Sicuro?")) + if (noyes_box("Sicuro sicuro?")) + if (noyes_box("Sicuro sicuro sicuro?")) + { + int err; + TString cod="";int nrig; + TLocalisamfile umart(LF_UMART); + err = umart.read(_isfirst); + while (err == NOERR) + { + if (cod != umart.get("CODART")) + { + cod = umart.get("CODART"); + nrig=1; + } + umart.put("PREZZO",nrig); + umart.rewrite(); + umart.put("NRIGA",umart.get_int("NRIGA")+1); + err = umart.read(_isgteq); + nrig++; + } + } +*/ return TRUE; } @@ -672,6 +892,14 @@ bool TDistinta_app::user_destroy() return TRUE; } +void TDistinta_app::init_insert_mode(TMask &m) +{ + TSheet_field &f= (TSheet_field &)m.field(F_UNITA); + if (f.items() == 0) + f.row(0) = " |1"; // aggiunge una riga allo sheet +} + + bool TDistinta_app::changing_mask(int mode) { bool was_query = _mode == MODE_QUERY || _mode == MODE_QUERYINS; @@ -701,7 +929,7 @@ int TDistinta_app::read(TMask& m) FOR_EACH_SHEET_ROW(sheet, nrig, row) { sheet.check_row(nrig); - sheet.row(nrig).add(nrig+1, F_SORT0 - FIRST_FIELD); + sheet.row(nrig).add(nrig+1, sheet.cid2index(F_SORT0)); } TToken_string memo(1024, '\n'); @@ -746,15 +974,52 @@ void TDistinta_app::parms2rel(const TMask& m) int TDistinta_app::write(const TMask& m) { parms2rel(m); - return TRelation_application::write(m); + int err = TRelation_application::write(m); + if (err == NOERR) + { + TSheet_field& f = m.sfield(F_UNITA); // prende lo sheet delle unitą di misura + err = f.record()->write(FALSE); + } + return err; } int TDistinta_app::rewrite(const TMask& m) { parms2rel(m); - return TRelation_application::rewrite(m); + int err = TRelation_application::rewrite(m); + if (err == NOERR) + { + TSheet_field& f= m.sfield(F_UNITA); // prende lo sheet delle unitą di misura + err = f.record()->write(TRUE); + } + return err; } +bool TDistinta_app::remove() +{ + bool ok = TRelation_application::remove(); + if (ok) + { + TMask &m=curr_mask(); + TSheet_field &f= (TSheet_field &)m.field(F_UNITA); // prende lo sheet delle unitą di misura + TLocalisamfile anamag(LF_ANAMAG); + anamag.put("CODART",m.get(F_CODICE)); + int err=anamag.read();// esiste l'articolo + switch(err) + { + case _iskeynotfound : + case _isemptyfile : + case _iseof: + ok = f.record()->remove()==NOERR; + break; + default: + break; + } + } + return ok; +} + + /////////////////////////////////////////////////////////// // db0500 gestione distinte /////////////////////////////////////////////////////////// diff --git a/db/db0500a.h b/db/db0500a.h index 04b48582b..cc2885aae 100755 --- a/db/db0500a.h +++ b/db/db0500a.h @@ -10,16 +10,34 @@ #define F_VIRTUALE 506 #define F_COPY 507 #define F_EXPLODE 508 +#define F_HIDE_GHOST 509 + #define F_DESCR 510 #define F_ARTPROD 511 -#define F_PREZZO 512 -#define F_UM 513 -#define F_PESO 514 -#define F_UMP 515 +#define F_ARTACQ 512 +#define F_PREZZO 513 +#define F_UM 514 +#define F_PESO 515 +#define F_UMP 516 +#define F_UMART1ST 517 +#define F_FCUMART 518 +#define F_MASTER 519 #define F_SHEET 520 -#define F_PARAMS 521 +#define F_UNITA 521 +#define F_PARAMS 522 + +#define F_VAR_IMPIANTO 550 +#define F_VAR_LINEA 551 +#define F_VAR_MAG 552 +#define F_VAR_DEP 553 +#define F_VAR_LIV1 554 +#define F_VAR_LIV2 555 +#define F_VAR_LIV3 556 +#define F_VAR_LIV4 557 +#define F_VAR_DATA 558 + #define F_TIPOCOMP 101 #define F_CODART 102 @@ -40,16 +58,21 @@ #define F_SORT5 114 #define F_SORT0 115 -#define F_PARAM 101 -#define F_VALUE 102 +#define FU_UM 101 +#define FU_FC 102 +#define FU_PREZZO 103 +#define FU_RIF 104 +#define FU_DESC 105 + +#define FV_PARAM 101 +#define FV_VALUE 102 #define F_MATBASE 101 #define F_MAXDEPTH 102 #define F_ARTICOLI 103 #define F_LAVORAZIONI 104 #define F_VIRTUALI 105 -#define F_GROUPMODE 106 -#define F_LASTQTA 107 -#define F_IGNOREVIRT 108 +#define F_GHOST 106 +#define F_GROUPMODE 107 #endif diff --git a/db/db0500a.uml b/db/db0500a.uml index 49df7d9c1..6aff6d829 100755 --- a/db/db0500a.uml +++ b/db/db0500a.uml @@ -47,14 +47,16 @@ ENDPAGE PAGE "Distinta base" -1 -1 80 20 -GROUPBOX DLG_NULL 78 4 +STRING DLG_PROFILE 30 BEGIN - PROMPT 1 1 "Distinta" + FLAGS "H" + PROMPT 1 1 "" + PSELECT END STRING F_CODICE 20 BEGIN - PROMPT 2 2 "Cerca " + PROMPT 2 1 "Cerca " FLAGS "GU" USE LF_DIST JOIN LF_ANAMAG INTO CODART==CODDIST @@ -64,14 +66,15 @@ BEGIN OUTPUT F_CODICE CODDIST CHECKTYPE REQUIRED FIELD CODDIST + DEFAULT NONE END STRING F_CODICEQ 20 BEGIN - PROMPT 47 2 "Codice " + PROMPT 2 2 "Articolo " FIELD CODDIST KEY 1 - USE LF_ANAMAG + USE LF_ANAMAG JOIN LF_UMART INTO CODART=CODART NRIGA=1 INPUT CODART F_CODICEQ DISPLAY "Codice@20" CODART @@ -81,28 +84,80 @@ BEGIN ADD RUN ve2 -3 MESSAGE COPY,F_CODICE FLAGS "U" + DEFAULT NONE +END + +STRING F_DESCR 50 40 +BEGIN + KEY 2 + PROMPT 34 2 "" + USE LF_ANAMAG KEY 2 + JOIN LF_UMART INTO CODART=CODART NRIGA=1 + INPUT DESCR F_DESCR + DISPLAY "Descrizione@50" DESCR + DISPLAY "Codice@20" CODART + OUTPUT F_CODICEQ CODART + OUTPUT F_CODICE CODART + CHECKTYPE NORMAL + ADD RUN ve2 -3 + FLAGS "U" + DEFAULT NONE +END + +STRING F_VAR_IMPIANTO 5 +BEGIN + FLAGS "UF" + PROMPT 2 3 "Impianto " + USE IMP + INPUT CODTAB F_VAR_IMPIANTO + DISPLAY "Codice " CODTAB + DISPLAY "Descrizione@50" S0 + OUPUT F_VAR_IMPIANTO CODTAB + MESSAGE CHECK, F_VAR_LINEA + CHECKTYPE FORCED +END + +STRING F_VAR_LINEA 5 +BEGIN + FLAGS "UF" + PROMPT 20 3 "Linea " + USE LNP + INPUT CODTAB F_VAR_LINEA + DISPLAY "Codice " CODTAB + DISPLAY "Descrizione@50" S0 + DISPLAY "Impianto" S6 + OUPUT F_VAR_LINEA CODTAB + OUPUT F_VAR_IMPIANTO S6 + CHECKTYPE FORCED END NUMBER F_SORT 1 BEGIN - PROMPT 2 3 "Ordinamento " + PROMPT 2 4 "Ordinamento " USE ORD INPUT CODTAB F_SORT DISPLAY "Codice ordinamento" CODTAB DISPLAY "Descrizione@50" S0 OUTPUT F_SORT CODTAB OUTPUT F_SORTDESC S0 - CHECKTYPE NORMAL + CHECKTYPE FORCED FLAGS "U" MESSAGE EMPTY "Immissione",F_SORTDESC - NUM_EXPR #F_SORT<=5 - WARNING "L'ordinamento deve essere compreso tra 0 e 5" + DEFAULT NONE END STRING F_SORTDESC 50 BEGIN - PROMPT 24 3 "" + PROMPT 24 4 "" FLAGS "D" + DEFAULT NONE +END + +BOOL F_HIDE_GHOST +BEGIN + FLAGS "Fh" + PROMPT 2 5 "Nascondi le distinte virtuali non di produzione" + DEFAULT NONE END TREE F_TREE -3 -1 diff --git a/db/db0500b.uml b/db/db0500b.uml index 7767ab7e2..c626bbd49 100755 --- a/db/db0500b.uml +++ b/db/db0500b.uml @@ -65,6 +65,7 @@ BEGIN FIELD CODDIST END + LIST F_TIPO 1 12 BEGIN PROMPT 54 2 "Tipo " @@ -80,8 +81,8 @@ END BOOLEAN F_VIRTUALE BEGIN PROMPT 50 50 "Virtuale" - MESSAGE FALSE DISABLE,1@ - MESSAGE TRUE ENABLE,1@ + MESSAGE FALSE DISABLE,1@|ENABLE,F_ARTACQ + MESSAGE TRUE ENABLE,1@|CLEAR,F_ARTACQ FLAGS "DG" FIELD VIRTUALE END @@ -103,46 +104,72 @@ BOOLEAN F_ARTPROD BEGIN PROMPT 2 5 "Articolo di produzione" FIELD ARTPROD - GROUP 1 - FLAGS "D" END -NUMBER F_PREZZO 15 +BOOLEAN F_ARTACQ BEGIN - PROMPT 2 6 "Costo " - PICTURE "." + PROMPT 32 5 "Articolo di acquisto" + FIELD ARTACQ +END + +BOOLEAN F_MASTER +BEGIN + PROMPT 60 5 "Articolo Master" + FIELD MASTER +END + +CURRENCY F_PREZZO 15 +BEGIN + PROMPT 2 6 "Costo " FIELD PREZZO GROUP 1 - FLAGS "D" + FLAGS "DU" END -STRING F_UM 3 +STRING F_UM 2 BEGIN - PROMPT 42 6 "Unita' di misura " - USE %UMS - INPUT CODTAB F_UM - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@60" S0 - OUTPUT F_UM CODTAB + PROMPT 26 6 "Unita' di misura " + FLAGS "DG" + USE LF_UMART KEY 2 + JOIN LF_UMART ALIAS 200 INTO CODART==CODART + INPUT CODART F_CODICE SELECT + INPUT UM F_UM + OUTPUT F_UM UM + OUTPUT F_FCUMART FC + OUTPUT F_UMART1ST 200@->UM + CHECKTYPE NORMAL FIELD UM - GROUP 1 - FLAGS "D" +END + +NUMBER F_FCUMART 18 5 +BEGIN + PROMPT 50 6 "= " + PICTURE "###.###.###,@@@@@" + FLAG "D" + CHECKTYPE REQUIRED +END + +STRING F_UMART1ST 2 +BEGIN + PROMPT 74 6 "" + FLAG "D" END NUMBER F_PESO 15 5 BEGIN - PROMPT 2 7 "Peso " + PROMPT 2 7 "Peso " FIELD PESO GROUP 1 FLAGS "D" END -STRING F_UMP 3 +STRING F_UMP 2 BEGIN - PROMPT 42 7 "Unita' di misura del peso " - COPY USE F_UM + PROMPT 26 7 "Unita' di misura del peso " + USE %UMS INPUT CODTAB F_UMP - COPY DISPLAY F_UM + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 OUTPUT F_UMP CODTAB FIELD UMP GROUP 1 @@ -196,21 +223,39 @@ ENDPAGE PAGE "Parametri" -1 -1 80 20 -GROUPBOX DLG_NULL 78 3 -BEGIN - PROMPT 1 1 "Distinta" -END - STRING F_CODICEQ 20 BEGIN - PROMPT 2 2 "Codice " + PROMPT 1 1 "Distinta " FLAGS "D" FIELD CODDIST END +TEXT DLG_NULL +BEGIN + PROMPT 1 2 "@bUnita' di misura" +END + +SPREADSHEET F_UNITA 0 5 +BEGIN + PROMPT 0 3 "" + ITEM "Codice" + ITEM "Fatt. Convers.@18" + ITEM "Prezzo Netto@18" + ITEM "Unita' di riferimento" + ITEM "Descrizione@50" + USE LF_UMART KEY NRIGA + INPUT CODART F_CODICE + FLAGS "A" +END + +TEXT DLG_NULL +BEGIN + PROMPT 1 9 "@bElenco Variabili" +END + SPREADSHEET F_PARAMS BEGIN - PROMPT 0 4 "" + PROMPT 0 10 "" ITEM "Variabile@20" ITEM "Valore@70" END @@ -219,7 +264,7 @@ ENDPAGE ENDMASK -PAGE "Distinta" -1 -1 68 14 +PAGE "Distinta" -1 -1 68 15 GROUPBOX DLG_NULL 66 6 BEGIN @@ -234,7 +279,7 @@ BEGIN ITEM "L|Lavorazione" MESSAGE HIDE,F_CODART|SHOW,F_CODLAV|HIDE,F_CODDIS|HIDE,F_CODVAR|DISABLE,F_UMEXPR ITEM "D|Distinta" - MESSAGE HIDE,F_CODART|HIDE,F_CODLAV|SHOW,F_CODDIS|HIDE,F_CODVAR|DISABLE,F_UMEXPR + MESSAGE HIDE,F_CODART|HIDE,F_CODLAV|SHOW,F_CODDIS|HIDE,F_CODVAR|ENABLE,F_UMEXPR ITEM "V|Variabile" MESSAGE HIDE,F_CODART|HIDE,F_CODLAV|HIDE,F_CODDIS|SHOW,F_CODVAR|CLEAR,F_UMEXPR FIELD TIPO @@ -362,7 +407,7 @@ END STRING F_UMEXPR 2 BEGIN PROMPT 2 7 "Unita' di misura " - USE LF_UMART KEY 2 + USE LF_UMART KEY 2 SELECT CODART==#F_CODART JOIN LF_ANAMAG INTO CODART==CODART INPUT CODART F_CODART SELECT INPUT UM F_UMEXPR @@ -381,6 +426,8 @@ BEGIN PROMPT 2 8 "" FIELD EXPR FLAGS "U" + CHECKTYPE REQUIRED + WARNING "Necessario la quantita'" END GROUPBOX DLG_NULL 66 3 @@ -448,22 +495,88 @@ ENDPAGE ENDMASK +PAGE "Unita'" -1 -1 66 7 + +STRING FU_UM 2 +BEGIN + PROMPT 1 1 "Unita' " + FLAGS "U" + USE %UMS + INPUT CODTAB FU_UM + DISPLAY "Unita'" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT FU_UM CODTAB + OUTPUT FU_DESC S0 + CHECKTYPE REQUIRED + FILED UM +END + +STRING FU_DESC 50 +BEGIN + PROMPT 13 1 "" + USE %UMS KEY 2 + INPUT S0 FU_DESC + DISPLAY "Descrizione@50" S0 + DISPLAY "Unita'@20" CODTAB + COPY OUTPUT FU_UM + CHECKTYPE REQUIRED +END + +NUMBER FU_FC 18 5 +BEGIN + PROMPT 1 2 "Fattore di conversione " + PICTURE ".5" + FIELD FC + CHECKTYPE REQUIRED +END + +CURRENCY FU_PREZZO 18 +BEGIN + PROMPT 1 3 "Prezzo Netto " + FLAGS "U" + FIELD PREZZO +END + +BOOLEAN FU_RIF +BEGIN + PROMPT 1 4 "Unita' di riferimento per distinta" +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK + PAGE "Variabili" -1 -1 64 5 -STRING F_PARAM 20 +STRING FV_PARAM 20 BEGIN PROMPT 1 1 "Variabile " USE VAR - INPUT CODTAB F_PARAM + INPUT CODTAB FV_PARAM DISPLAY "Codice@20" CODTAB DISPLAY "Numerico@B" B0 DISPLAY "Descrizione@50" S0 - OUTPUT F_PARAM CODTAB + OUTPUT FV_PARAM CODTAB CHECKTYPE REQUIRED FLAGS "U" END -STRING F_VALUE 70 50 +STRING FV_VALUE 70 50 BEGIN PROMPT 1 2 "Valore " END diff --git a/db/db0500c.uml b/db/db0500c.uml index 2f809c6ff..18b356cf3 100755 --- a/db/db0500c.uml +++ b/db/db0500c.uml @@ -6,12 +6,10 @@ RADIOBUTTON F_MATBASE 1 31 BEGIN PROMPT 1 1 "Tipo" ITEM " |Scalare" - MESSAGE ENABLE,F_LASTQTA ITEM "X|Materiali di base" - MESSAGE CLEAR,F_LASTQTA END -GROUPBOX DLG_NULL 32 5 +GROUPBOX DLG_NULL 32 6 BEGIN PROMPT 33 1 "Visualizza" END @@ -29,6 +27,13 @@ END BOOLEAN F_VIRTUALI BEGIN PROMPT 34 4 "Distinte virtuali" + MESSAGE TRUE ENABLE,F_GHOST + MESSAGE FALSE CLEAR,F_GHOST +END + +BOOLEAN F_GHOST +BEGIN + PROMPT 34 5 "Distinte non di produzione" END NUMBER F_MAXDEPTH 3 @@ -37,16 +42,6 @@ BEGIN FLAGS "U" END -BOOLEAN F_LASTQTA -BEGIN - PROMPT 2 6 "Disabilita ricalcolo quantita'" -END - -BOOLEAN F_IGNOREVIRT -BEGIN - PROMPT 2 7 "Escludi distinte virtuali che non sono prodotti" -END - NUMBER F_SORT 1 BEGIN PROMPT 2 8 "Ordina " @@ -71,9 +66,11 @@ LIST F_GROUPMODE 1 48 BEGIN PROMPT 2 9 "Raggruppa " ITEM "0|Nessun raggruppamento" - ITEM "1|Alla prima unita' di misura" - ITEM "2|All'unita' di misura di riferimento" - ITEM "3|Per unita' di misura" + ITEM "1|Raggruppa per unita' di misura" + ITEM "2|Converti nell'unita' principale" + ITEM "3|Raggruppa all'unita' di misura principale" + ITEM "4|Converti nell'unita' di misura di distinta" + ITEM "5|Raggruppa all'unita' di misura di distinta" END BUTTON DLG_OK 10 2 diff --git a/db/db1.cpp b/db/db1.cpp index 1d03b9bf5..f86a8002a 100755 --- a/db/db1.cpp +++ b/db/db1.cpp @@ -10,7 +10,6 @@ int main(int argc, char** argv) case 1: db1200(argc, argv); break; - case 0: default: db1100(argc, argv); break; diff --git a/db/db1.url b/db/db1.url index 9191b9d6f..05eeb6ee7 100755 --- a/db/db1.url +++ b/db/db1.url @@ -1,10 +1,9 @@ -#define APPNAME campo -#define QAPPNAME "campo" +#define APPNAME EURO_DB +#define QAPPNAME "EURO_DB" #define QFIRMNAME "A.G.A. Informatica Srl" #include - MENU TASK_MENUBAR SUBMENU MENU_FILE "~File" diff --git a/db/db1100.cpp b/db/db1100.cpp index 53085a2a0..dded51db0 100755 --- a/db/db1100.cpp +++ b/db/db1100.cpp @@ -35,20 +35,20 @@ enum seltype { by_num, by_date }; enum expltype { mat_base, scalare}; enum valtype { no_val, last_cost, average_cost, pond_cost, last2cost, std_cost, LIFO_annuale, LIFO_storico, FIFO_annuale, FIFO_storico }; -enum grptype { no_grp, first_um, ref_um, normal_um }; struct _ParmStruct { seltype _selections; expltype _explosion; valtype _valorization; - grptype _group_by; + TExplosion_grouping _group_by; TString16 _anno_es, _from_num, _to_num, _sl_mag, _mb_mag; // Ma perche'... TDate _from_date, _to_date, _obs_date; long _from_doc, _to_doc; int _year, _periods, _det_lev, _ordering; - bool _last_qta, _vis_art, _vis_lav, _vis_vir, _fabbisogno, - _val_magmb, _val_depmb, _cfr_scmin, _separate_dists; + bool _vis_art, _vis_lav, _vis_vir, _vis_gho, + _fabbisogno, _val_magmb, _val_depmb, + _cfr_scmin, _separate_dists; }; struct _CallBackStruct @@ -166,14 +166,13 @@ public: void set_value(const real& r) { _value = r; } void set_residuo(const real& r) { _residuo = r; } TRiga_esplosione2print() {}; - TRiga_esplosione2print(const TDistinta_tree& tree, - const TExplosion_params& ep); + TRiga_esplosione2print(const TDistinta_tree& tree); TRiga_esplosione2print(const TRiga_esplosione& re); ~TRiga_esplosione2print() {}; }; -TRiga_esplosione2print::TRiga_esplosione2print(const TDistinta_tree& tree, const TExplosion_params& ep) - : TRiga_esplosione(tree, ep) +TRiga_esplosione2print::TRiga_esplosione2print(const TDistinta_tree& tree) + : TRiga_esplosione(tree) { } @@ -345,7 +344,7 @@ static bool valorizza_nodo(TTree& node, void* jolly, word when) dist_node.curr_id(__path); if (dist_node.goto_firstson()) { - dist_node.explode(exploded, TRUE, 2); + dist_node.explode(exploded, TRUE, RAGGR_EXP_BASE); dist_node.goto_node(__path); const int items = exploded.items(); // Se 0 siamo su di una foglia... @@ -640,9 +639,10 @@ void TExplode_distinta_form::set_explosion_rows(TArray& exp_array) if (disp < zero_ref) { r = zero_ref - disp; - r2p->set_qta2order(aaa.convert_to_um(r, re.um())); // In UM locale... + const real cv = aaa.convert_to_um(r, re.um()); // In UM locale... + r2p->set_qta2order(cv); if (!re.mat_base()) - _residui.add(re.path(), r); + _residui.add(re.path(), cv); } if (disp > zero_ref) @@ -670,8 +670,14 @@ void TExplode_distinta_form::set_explosion_rows(TArray& exp_array) // Se l'utente non vuole la valorizzazione sul calcolo // disponibilita', stampa quella sul fabbisogno richiesto const real& qta = !(tipo == 'A' && _p->_fabbisogno) ? re.val() * _d->qta() : r2p->qta2order(); +#ifdef DBG CHECK(_valori.objptr(k),"Perke' mi ritrovo senza un elemento nella cache dei valori?!?!?"); - r = *(real*)_valori.objptr(k); +#else + if (_valori.objptr(k) == NULL) + r = ZERO; + else +#endif + r = *(real*)_valori.objptr(k); r *= qta; r2p->set_value(r); @@ -684,7 +690,7 @@ void TExplode_distinta_form::print() { // Explode & deflagrate... - if (!_distinta.set_root(_d->cod())) + if (!_distinta.set_root(_d->cod(), _d->um())) return; // Inizializza lo sfondo delle pagine normali se no col piffero che stampa la fincatura... @@ -703,12 +709,12 @@ void TExplode_distinta_form::print() if (_p->_vis_art) fi << 'A'; if (_p->_vis_lav) fi << 'L'; - if (_p->_vis_vir) fi << 'V'; - if (fi.len() == 3) fi.cut(0); + if (_p->_vis_vir) fi << 'V'; + if (_p->_vis_gho) fi << 'G'; _distinta.curr_code((TCodice_articolo& )_d->cod()); _distinta.explode(explosion_array, _p->_explosion == mat_base, _p->_group_by, - _p->_det_lev, fi, _p->_ordering, _p->_last_qta); + _p->_det_lev, fi, _p->_ordering); // Dopo l'esplosione mette in testa all'array la riga di definizione della Distinta stessa: // codice + UM + Fabbisogno (sostanzialmente si tratta di un TRiga_esplosione) explosion_array.insert(_d->head_obj(), 0); @@ -721,7 +727,7 @@ void TExplode_distinta_form::print() // I know this is kinda dog-programming setter._p = _p; // but it seems quite reasonable setting a couple setter._a = &_valori; // of pointers and passing'em in a struct - _distinta.set_root(_d->cod()); + _distinta.set_root(_d->cod(), _d->um()); _distinta.scan_depth_first(valorizza_nodo, &setter); } @@ -823,11 +829,12 @@ inline TEsplosione_distinta_app& app() { return (TEsplosione_distinta_app&) mai TRiga_esplosione * _Dist2Explode::head_obj() { - TRiga_esplosione * re = new TRiga_esplosione; + TQuantita qta(_cod, _um, 1.00); - re->set(_cod, _um, real(1.00)); - re->set_tipo('A'); // La testata e' cmq un articolo... disse Zorba Il Greco a Sinuhe L'Egiziano - re->set_path(_cod); + TDistinta_tree tree; + tree.set_root(qta); + + TRiga_esplosione * re = new TRiga_esplosione(tree); return re; } @@ -853,6 +860,7 @@ void _Dist2Explode::set(TToken_string& t) _livgiac.trim(); _mag.format("%3s", (const char*)t.get(5)); _mag << t.get(6); + _mag.trim(); _um = t.get(7); _qta = t.get(8); _datacons = t.get(10); @@ -969,7 +977,7 @@ bool TEsplosione_distinta_app::check_articoli(TMask_field& f, KEY k) bool TEsplosione_distinta_app::create() { - open_files(LF_UMART, LF_OCCAS, LF_CLIFO, LF_DOC, LF_RIGHEDOC, LF_INDSP, LF_CFVEN, LF_TABCOM, LF_MAG, LF_DIST, 0); + open_files(LF_UMART, LF_OCCAS, LF_CLIFO, LF_DOC, LF_RIGHEDOC, LF_INDSP, LF_CFVEN, LF_TABCOM, LF_MAG, LF_DIST, LF_STOMAG, 0); _mask = new TMask("db1100a"); TSheet_field& sa = (TSheet_field&) _mask->field(F_SHEETART); sa.sheet_mask().set_handler(F_QTA, check_articoli); @@ -1173,7 +1181,7 @@ void TEsplosione_distinta_app::main_loop() _parameters._selections = (seltype) _mask->get_int(F_TIPOSEL); _parameters._explosion = (expltype) _mask->get_int(F_STAMPA); _parameters._valorization = (valtype) _mask->get_int(F_VALORIZZAZIONE); - _parameters._group_by = (grptype) _mask->get_int(F_GROUPMODE); + _parameters._group_by = (TExplosion_grouping) _mask->get_int(F_GROUPMODE); _parameters._year = _mask->get_int(F_ANNO); _parameters._from_num = _mask->get(F_NUMFROM); _parameters._to_num = _mask->get(F_NUMTO); @@ -1199,10 +1207,10 @@ void TEsplosione_distinta_app::main_loop() _parameters._vis_art = _mask->get_bool(F_ARTICOLI); _parameters._vis_vir = _mask->get_bool(F_VIRTUALI); _parameters._vis_lav = _mask->get_bool(F_LAVORAZIONI); + _parameters._vis_gho = _mask->get_bool(F_GHOST); _parameters._fabbisogno= _mask->get_bool(F_FABBISOGNO); - _parameters._last_qta = _mask->get_bool(F_LASTQTA); - _parameters._sl_mag = _mask->get(F_SLMAG); _parameters._sl_mag << _mask->get(F_SLDEP); - _parameters._mb_mag = _mask->get(F_MBMAG); _parameters._mb_mag << _mask->get(F_MBDEP); + _parameters._sl_mag = _mask->get(F_SLMAG); _parameters._sl_mag << _mask->get(F_SLDEP); + _parameters._mb_mag = _mask->get(F_MBMAG); _parameters._mb_mag << _mask->get(F_MBDEP); _parameters._val_magmb = _mask->get_bool(F_VALMAGMB); _parameters._val_depmb = _mask->get_bool(F_VALDEPMB); _parameters._cfr_scmin = _mask->get_bool(F_SCMIN); diff --git a/db/db1100a.frm b/db/db1100a.frm index 1ba6b72e3..6f5e58a9f 100755 --- a/db/db1100a.frm +++ b/db/db1100a.frm @@ -13,8 +13,6 @@ END GENERAL BEGIN OFFSET 0 0 - FONT "Courier New" - SIZE 10 END diff --git a/db/db1100a.h b/db/db1100a.h index 3ec184199..23293f37a 100755 --- a/db/db1100a.h +++ b/db/db1100a.h @@ -14,7 +14,7 @@ #define F_STAMPA 112 #define F_DETTAGLIO 113 #define F_VALORIZZAZIONE 114 -#define F_LASTQTA 115 +#define F_GHOST 115 #define F_ARTICOLI 116 #define F_LAVORAZIONI 117 #define F_VIRTUALI 118 diff --git a/db/db1100a.uml b/db/db1100a.uml index 4774d6ff3..4831ccf0a 100755 --- a/db/db1100a.uml +++ b/db/db1100a.uml @@ -139,9 +139,9 @@ LISTBOX F_STAMPA 18 BEGIN PROMPT 2 9 "Esplosione " ITEM "0|Materiali di base" - MESSAGE ENABLE,F_LASTQTA|ENABLE,F_GROUPMODE + MESSAGE ENABLE,F_GROUPMODE ITEM "1|Scalare" - MESSAGE CLEAR,F_LASTQTA|CLEAR,F_GROUPMODE + MESSAGE CLEAR,F_GROUPMODE END NUMBER F_DETTAGLIO 3 @@ -150,21 +150,16 @@ BEGIN FLAGS "U" END -BOOLEAN F_LASTQTA -BEGIN - PROMPT 2 10 "Disabilita ricalcolo quantita'" -END - BOOLEAN F_FABBISOGNO BEGIN - PROMPT 2 11 "Calcola disponibilita'" + PROMPT 2 10 "Calcola disponibilita'" MESSAGE TRUE ENABLE,4@ MESSAGE FALSE CLEAR,4@|CLEAR,6@ END BOOLEAN F_SEPARATE BEGIN - PROMPT 2 12 "Separa distinte" + PROMPT 2 11 "Separa distinte" END BOOLEAN F_SCMIN @@ -269,26 +264,32 @@ BEGIN GROUP 6 END -GROUPBOX DLG_NULL 30 5 +GROUPBOX DLG_NULL 30 6 BEGIN - PROMPT 1 13 "Visualizza" + PROMPT 1 12 "Visualizza" END BOOLEAN F_ARTICOLI BEGIN - PROMPT 2 14 "Articoli" + PROMPT 2 13 "Articoli" END BOOLEAN F_LAVORAZIONI BEGIN - PROMPT 2 15 "Lavorazioni" + PROMPT 2 14 "Lavorazioni" END BOOLEAN F_VIRTUALI BEGIN - PROMPT 2 16 "Distinte virtuali" + PROMPT 2 15 "Distinte virtuali" END +BOOLEAN F_GHOST +BEGIN + PROMPT 2 16 "Distinte non di produzione" +END + + NUMBER F_SORT 1 BEGIN PROMPT 2 18 "Ordina " @@ -313,9 +314,11 @@ LIST F_GROUPMODE 1 53 BEGIN PROMPT 2 19 "Raggruppa " ITEM "0|Nessun raggruppamento" - ITEM "1|Alla prima unita' di misura" - ITEM "2|All'unita' di misura di riferimento" - ITEM "3|Per unita' di misura" + ITEM "1|Raggruppa per unita' di misura" + ITEM "2|Converti nell'unita' principale" + ITEM "3|Raggruppa all'unita' di misura principale" + ITEM "4|Converti nell'unita' di misura di distinta" + ITEM "5|Raggruppa all'unita' di misura di distinta" END ENDPAGE @@ -450,7 +453,7 @@ END STRING F_UMEXPR 2 BEGIN PROMPT 2 7 "Unita' di misura " - USE LF_UMART KEY 2 + USE LF_UMART KEY 2 SELECT CODART==#F_CODDIS JOIN LF_ANAMAG INTO CODART==CODART INPUT CODART F_CODDIS SELECT INPUT UM F_UMEXPR diff --git a/db/db2.url b/db/db2.url index 302efb883..d87e0ec4e 100755 --- a/db/db2.url +++ b/db/db2.url @@ -1,5 +1,5 @@ -#define APPNAME campo -#define QAPPNAME "campo" +#define APPNAME EURO_DB +#define QAPPNAME "EURO_DB" #define QFIRMNAME "A.G.A. Informatica Srl" #include diff --git a/db/db2400.cpp b/db/db2400.cpp index 9567864fe..d274243fa 100755 --- a/db/db2400.cpp +++ b/db/db2400.cpp @@ -58,7 +58,7 @@ real TValorizzazione_mask::valore(const TCodice_articolo& dis, const char* liv) TArray boom; // Esplosione ai materiali di base // raggruppati alla unita' di misura di riferimento - _tree.explode(boom, TRUE, 2); + _tree.explode(boom, TRUE, RAGGR_EXP_BASE); for (int r = boom.last(); r >= 0; r--) { const TRiga_esplosione& esp = (const TRiga_esplosione&)boom[r]; @@ -98,14 +98,12 @@ real TValorizzazione_mask::valore(const TCodice_articolo& dis, const char* liv) total = real(val.decode(dis)); } break; - case 'V': + default : { TDecoder dist(LF_DIST, "PREZZO"); total = real(dist.decode(dis)); } break; - default : - NFCHECK("L'articolo %s non esiste", (const char*)cod); } _valori.add(cod, total); } @@ -133,7 +131,7 @@ void TValorizzazione_mask::elabora() TProgind pi(items, "Valorizzazione in corso...", TRUE, TRUE); TBrowsefile_field& bf = (TBrowsefile_field&)field(F_PREVIEW); - TViswin& vw = *bf.vis_win(); + TViswin& vw = bf.vis_win(); vw.destroy_lines(); _valori.destroy(); @@ -214,6 +212,7 @@ void TValorizzazione_mask::salva() lav.rewrite(); } break; + case 'G': case 'V': dis.put("CODDIST", key); if (dis.read(_isequal, _lock) == NOERR) diff --git a/db/dblib.cpp b/db/dblib.cpp index fe38d1906..defa87e1d 100755 --- a/db/dblib.cpp +++ b/db/dblib.cpp @@ -1,9 +1,17 @@ +#include +#include + #include +#include +#include +#include "tabutil.h" #include "dblib.h" #include "../mg/anamag.h" -#include "../mg/umart.h" +#include "../mg/umart.h" +#include "../mg/rmovmag.h" +#include "../include/rdoc.h" /////////////////////////////////////////////////////////// // TQuantita' @@ -11,6 +19,7 @@ TDecoder* TQuantita::_umart1 = NULL; TDecoder* TQuantita::_umart2 = NULL; +TDecoder* TQuantita::_umdist = NULL; real TQuantita::get_factor(const TCodice_um& um) const { @@ -22,7 +31,11 @@ real TQuantita::get_factor(const TCodice_um& um) const else { if (_umart2 == NULL) + { _umart2 = new TDecoder(LF_UMART, UMART_FC, 2); + _umart2->test_file_changes(); + _umart2->set_items_limit(256); + } TString80 code; code << _articolo << '|' << (um.empty() ? _um : um); @@ -30,34 +43,70 @@ real TQuantita::get_factor(const TCodice_um& um) const if (val.not_empty()) fc = real(val); } - return fc; } +real TQuantita::find_umbase(TCodice_um& um) +{ + if (_umart1 == NULL) + { + _umart1 = new TDecoder(LF_UMART, UMART_UM, 1); + _umart1->test_file_changes(); + _umart1->set_items_limit(256); + } + + TString80 code; + code << _articolo << "|1"; + const TString& new_um = _umart1->decode(code); + if (new_um.blank()) + { + if (_umdist == NULL) + { + _umdist = new TDecoder(LF_DIST, UMART_UM, 1); + _umdist->test_file_changes(); + _umdist->set_items_limit(256); + } + um = _umdist->decode(_articolo); + } + else + um = new_um; + return 1.0; +} + +real TQuantita::find_umdist(TCodice_um& um) +{ + if (_umdist == NULL) + { + _umdist = new TDecoder(LF_DIST, UMART_UM, 1); + _umdist->test_file_changes(); + _umdist->set_items_limit(256); + } + um = _umdist->decode(_articolo); + if (um.blank()) + find_umbase(um); + return get_factor(um); +} + void TQuantita::set_articolo(const TCodice_articolo& art, const TCodice_um& um) { _articolo = art; - if (um.blank()) - { - if (_umart1 == NULL) - _umart1 = new TDecoder(LF_UMART, UMART_UM, 1); - - TString80 code; - code << _articolo << "|1"; - const TString& new_um = _umart1->decode(code); - if (!new_um.blank()) - _um = new_um; - _conv = 1.0; - } - else + if (isalnum(um[0])) { _um = um; _conv = get_factor(_um); } + else + { + if (um.blank()) + _conv = find_umbase(_um); + else + _conv = find_umdist(_um); + } - CHECK(!_um.blank(), "Unita' di misura nulla"); + if (!art.blank() && _um.blank()) + NFCHECK("Unita' di misura nulla per %s", (const char*)art); CHECK(_conv > ZERO, "Invalid conversion factor"); } @@ -69,14 +118,13 @@ void TQuantita::copy(const TQuantita& q) _val = q._val; } - void TQuantita::convert(real& val, const TCodice_um& from_um, const TCodice_um& to_um) const { CHECK(!from_um.blank() && !to_um.blank(), "Unita' di misura nulla"); if (from_um != to_um) { - if (!_val.is_zero()) + if (!val.is_zero()) { const real mul = get_factor(from_um); const real div = get_factor(to_um); @@ -86,12 +134,35 @@ void TQuantita::convert(real& val, const TCodice_um& from_um, } } -void TQuantita::convert_to_base() +void TQuantita::convert2umdist() +{ + TCodice_um dummy; + _conv = find_umdist(dummy); + if (dummy != _um) + { + convert(_val, _um, dummy); + _um = dummy; + } +} + +void TQuantita::convert2umbase() +{ + TCodice_um dummy; + find_umbase(dummy); + if (dummy != _um) + { + CHECK(_conv > ZERO, "Invalid conversion factor"); + _val *= _conv; + _um = dummy; + _conv = 1.0; + } +} + +real TQuantita::base_val() const { CHECK(_conv > ZERO, "Invalid conversion factor"); - _val *= _conv; - TCodice_um dummy; - set_articolo(_articolo, dummy); + real v = _conv * _val; + return v; } int TQuantita::compare(const TSortable& s) const @@ -104,12 +175,30 @@ int TQuantita::compare(const TSortable& s) const return -qta.sign(); } +const TQuantita& TQuantita::operator +=(const real& qta) +{ + _val += qta; + return *this; +} + +const TQuantita& TQuantita::operator -=(const real& qta) +{ + _val -= qta; + return *this; +} + const TQuantita& TQuantita::operator +=(const TQuantita& q) { - real qta = q._val; - if (_um != q._um) - convert(qta, q._um, _um); - _val += qta; + if (!_um.blank()) + { + real qta = q._val; + if (_um != q._um) + convert(qta, q._um, _um); + _val += qta; + } + else + copy(q); + return *this; } @@ -147,12 +236,6 @@ TQuantita::TQuantita() : _conv(1.0) { } -TQuantita::TQuantita(const TCodice_articolo& art) -{ - TCodice_um dummy; - set(art, dummy, ZERO); -} - TQuantita::TQuantita(const TCodice_articolo& art, const TCodice_um& um, const real& val) { set(art, um, val); @@ -165,6 +248,194 @@ TQuantita::~TQuantita() { } +/////////////////////////////////////////////////////////// +// TLavorazione +/////////////////////////////////////////////////////////// + + +// @cmember Legge il file

con il tipo di record +int TLavorazione::read(TBaseisamfile& f, word op , word lockop) +{ + int err=TRectype::read(f, op, lockop ); + get_linee(); + return err; +} +// @cmember Legge il file

con il tipo di record alla posizione desiderata +int TLavorazione::readat(TBaseisamfile& f, TRecnotype nrec, word lockop ) +{ + int err=TRectype::readat(f, nrec, lockop ); + get_linee(); + return err; +} +// @cmember Aggiunge il record al file +int TLavorazione::write(TBaseisamfile& f) const +{ + ((TLavorazione *)this)->put_linee(); + return TRectype::write(f) ; +} +// @cmember Riscrive il record sul fil +int TLavorazione::rewrite(TBaseisamfile& f) const +{ + ((TLavorazione *)this)->put_linee(); + return TRectype::rewrite(f) ; +} + +const char * TLavorazione::cod_impianto(int l) +{ + return cache().get("LNP",cod_linea(l)).get("S6"); +} + +void TLavorazione::reset_linee() +{ + _linee.cut(0); +} + +void TLavorazione::get_linee() +{ + char esse[3] ="S1"; + reset_linee(); + for (char s = '1'; s <= '5'; s++) + { + esse[1]=s; + _linee << get(esse); + } +} + +void TLavorazione::put_linee() +{ + char esse[3]= "S1"; + int from=0, len=70; + TString str; + for (char s='1'; s<='5'; s++) + { + if (s > '3') len=20; + esse[1]=s; + str=_linee.mid(from,len); + put(esse, str); + from+=len; + } +} + + +int TLavorazione::linee() const +{ + return _linee.items()/3; +} + +int TLavorazione::linee_standard() const +{ + const int maxl = get_int("I1"); + const int lin = linee(); + return (maxl > 0 && maxl < lin) ? maxl : lin; +} + +/*const TString& TLavorazione::linea(int l) const +{ + const int n = l / 14; + CHECKD(n >= 0 && n <= 2, "Bad linea index ", l); + char esse[3] = { 'S', char('1'+ n), '\0' }; + TString& str = _linee.cod_linea(); + const int pos = (l % 14) * 5; + return str.mid(pos, 5); +}*/ + +const char * TLavorazione::cod_linea(int l) +{ + return _linee.get(l*3); +} + +const int TLavorazione::raw_numpers_linea(int l) +{ + return atoi(_linee.get(l*3+1)); +} + +const int TLavorazione::numpers_linea(int l) +{ + real np(raw_numpers_linea(l)); + if (np.is_zero()) + np = get_real("R2"); + return (int)np.integer(); +} + +const real TLavorazione::raw_produttiv_linea(int l) +{ + return real(_linee.get(l*3+2)); +} + +const real TLavorazione::produttiv_linea(int l) +{ + real prod(raw_produttiv_linea(l)); + if (prod.is_zero()) + prod = get_real("R1"); + return prod; +} + +const int TLavorazione::find_linea(const TString& linea) +{ + _linee.restart(); + + if (linea.empty()) // Se la linea da cercare e' blank, ritorna la prima disponibile + return 0; + + for (int l = 0; ;l++) + { + const char* c = _linee.get(l*3); + if (!c || *c == '\0') + break; + if (linea == c) + return l; + } + + return -1; +} + +bool TLavorazione::set_cod_linea(int l, const char *c) +{ + _linee.add(c, l*3); + return _linee.len()<250; +} + +bool TLavorazione::set_numpers_linea(int l, int pers) +{ + _linee.add(pers,l*3+1); + return _linee.len()<250; +} + +bool TLavorazione::set_produttiv_linea(int l, real & prod) +{ + _linee.add(prod.string(),l*3+2); + return _linee.len()<250; +} + + + +TLavorazione::TLavorazione(const char* cod) + : TRectype(LF_TAB) +{ + if (cod && *cod) + { + TTable lav("LAV"); + put("CODTAB", cod); + read(lav); + } else + settab("LAV"); +} + +TRectype & TLavorazione::operator =(const TRectype& rec) +{ + TRectype::operator =(rec); + get_linee(); + return *this; +} + + +TLavorazione::TLavorazione(const TRectype& rec) : TRectype(rec) +{ get_linee();} + +TLavorazione::TLavorazione(const TLavorazione& rec) : TRectype(rec) +{ _linee = rec._linee;} + + /////////////////////////////////////////////////////////// // TDistinta_expr /////////////////////////////////////////////////////////// @@ -201,6 +472,19 @@ bool TDistinta_tree::curr_code(TCodice_articolo& code) const code = _tmp; return code.not_empty(); } +/* +bool TDistinta_tree::curr_father(TCodice_articolo& code) const +{ + const int level=_path.items(); + code.cut(0); + if (level==1) + return FALSE; + _path.get(level-1, _tmp); + isola_codice(_tmp); + code = _tmp; + return code.not_empty(); +}*/ + bool TDistinta_tree::curr_giac(TString& code) const { @@ -229,22 +513,53 @@ const char* TDistinta_tree::curr_um(TCodice_um& code) const return code; } -real TDistinta_tree::curr_qta(bool last_only) const +real TDistinta_tree::curr_qta() const { - real qta = 1.0; + real tot = 1.0; const int last = _path.items()-1; - if (last > 0) + TCodice_articolo art; + TCodice_um um; + real val; + TQuantita qta; + for (int i = 0; i <= last; i++) { - for (int i = last; i > 0; i--) + _path.get(i, _tmp); + _tmp.get(5, val); + if (i < last) + { + _tmp.get(0, art); + _tmp.get(4, um); + qta.set(art, um, val); + qta.convert2umdist(); + val = qta.val(); + } + tot *= val; + if (tot.is_zero()) + break; + } + return tot; +} + +char TDistinta_tree::curr_type() const +{ + _path.get(-2, _tmp); + char ap = _tmp.get_char(6); + return ap; +} + +int TDistinta_tree::curr_depth() const +{ + int depth = _path.items()-1; + if (_ignore_ghost) + { + for (int i = depth; i > 0; i--) { _path.get(i, _tmp); - real val; _tmp.get(5, val); - qta *= val; - if (last_only || qta.is_zero()) - break; + char ap = _tmp.get_char(6); + if (ap == 'G') depth--; } } - return qta; + return depth; } bool TDistinta_tree::goto_node(const TString &id) @@ -307,10 +622,35 @@ TObject* TDistinta_tree::curr_node() const return (TObject*)&_path; } +const TString& TDistinta_tree::describe(const TCodice_articolo& codart) const +{ + const TString& da = ((TDecoder&)_mag).decode(codart); + if (da.not_empty()) + return da; + + const TString& dl = ((TDecoder&)_lav).decode(codart); + if (dl.not_empty()) + return dl; + + const TString& dd = cache().get(LF_DIST,codart, "DESCR"); + return dd; +} + bool TDistinta_tree::get_description(TString& desc) const { - _path.get(-2, desc); - isola_codice(desc); + TCodice_articolo codart; curr_code(codart); + desc = describe(codart); + if (desc.empty()) + { + desc = codart; + desc << " - ???"; + } + else + { + desc.insert(" - ", 0); + desc.insert(codart, 0); + } + return TRUE; } @@ -322,7 +662,13 @@ TImage* TDistinta_tree::image(bool selected) const else { if (is_leaf()) - img = get_res_image(BMP_FILE); + { + TCodice_articolo art; curr_code(art); + if (art == "???") + img = get_res_image(BMP_STOP); + else + img = get_res_image(BMP_FILE); + } else img = TBidirectional_tree::image(selected); } @@ -331,26 +677,78 @@ TImage* TDistinta_tree::image(bool selected) const void TDistinta_tree::restart() { - _dist.destroy(); - _rdist.destroy(); _vars.destroy(); _mag.destroy(); _lav.destroy(); + rec_cache(LF_RDIST).destroy(); + shrink_all(); - goto_root(); } -bool TDistinta_tree::set_root(const TCodice_articolo& str) +bool TDistinta_tree::set_root(const TQuantita& qta) { - const bool ok = find(str, 1) != NULL; + const bool ok = find(qta.articolo(), 1) != NULL; if (ok) { - _root = str; + _root = qta.articolo(); + _root << ", ,0,0," + << qta.um() << ',' << qta.val() + << ',' << get_type(qta.articolo()); restart(); } return ok; } +bool TDistinta_tree::set_root(const TCodice_articolo& art, + const char* um, real qta) +{ + bool ok = find(art, 1) != NULL; + if (ok) + { + const TCodice_um umart = um; + const TQuantita q(art, umart, qta); + ok = set_root(q); + } + return ok; +} + +bool TDistinta_tree::set_root(const TRectype & rec) +{ + const int logicnum = rec.num(); + TCodice_um umart; + TCodice_articolo art; + real qta; + clear_globals(); + + switch (logicnum) + { + case LF_RIGHEDOC: + art = rec.get(RDOC_CODARTMAG); + umart = rec.get(RDOC_UMQTA); + qta = rec.get_real(RDOC_QTA); + set_global("_RADICE", art); + set_global("_MAGAZZINO", rec.get(RDOC_CODMAG)); + set_global("_LIVELLO", rec.get(RDOC_LIVELLO)); + set_global("_LINEA", rec.get(RDOC_LINEA)); + set_global("_IMPIANTO", rec.get(RDOC_IMPIANTO)); + break; + case LF_RMOVMAG: + art = rec.get(RMOVMAG_CODART); + umart = rec.get(RMOVMAG_UM); + qta = rec.get_real(RMOVMAG_QUANT); + set_global("_RADICE", art); + set_global("_MAGAZZINO", rec.get(RMOVMAG_CODMAG)); + set_global("_LIVELLO", rec.get(RMOVMAG_LIVGIAC)); + set_global("_LINEA", ZERO); + set_global("_IMPIANTO", ZERO); + break; + default: + NFCHECK("set root con un record (file n. %d) non previsto", logicnum); + break; + } + return set_root(art, umart, qta); +} + bool TDistinta_tree::has_root() const { return _root.not_empty(); @@ -412,15 +810,42 @@ static int compare_rdist(const TObject** o1, const TObject** o2) return k1 == k2 ? 0 : (k1 > k2 ? +1 : -1); } +static int compare_rdist_key(const TObject** o1, const TObject** o2) +{ + const TToken_string* s1 = (const TToken_string *)(*o1); + const TToken_string* s2 = (const TToken_string *)(*o2); + + + const TRectype& r1 = cache().get(LF_RDIST,*s1); + const TRectype& r2 = cache().get(LF_RDIST,*s2); + TString16 field; + field << "SORT" << _sort_key; + long sk1 = r1.get_long(field); + long sk2 = r2.get_long(field); + if (sk1 == 0 && sk2 == 0) + { + sk1 = r1.get_long("NRIG"); + sk2 = r2.get_long("NRIG"); + } + else + { + if (sk1 == 0) sk1 = 100000000L; + if (sk2 == 0) sk2 = 100000000L; + } + return sk1 == sk2 ? 0 : (sk1 > sk2 ? +1 : -1); +} + + const TRectype* TDistinta_tree::find(const TCodice_articolo& father, int child) const { TString80 key = father; key << '|' << child; - const TRectype& rec = ((TDistinta_tree*)this)->_rdist.get(key); + const TRectype& rec = cache().get(LF_RDIST,key); + return rec.empty() ? NULL : &rec; } -int TDistinta_tree::build_children_list(const TCodice_articolo& father, TPointer_array& children) const +int TDistinta_tree::build_children_pointers(const TCodice_articolo& father, TPointer_array& children) const { for (int nrig = 1; ; nrig++) { @@ -430,7 +855,7 @@ int TDistinta_tree::build_children_list(const TCodice_articolo& father, TPointer children.add((TRectype*)rec); } const int total = children.items(); - if (total > 1) + if (total > 1 && _sort > 0) { _sort_key = _sort; children.sort(compare_rdist); @@ -438,11 +863,32 @@ int TDistinta_tree::build_children_list(const TCodice_articolo& father, TPointer return total; } +int TDistinta_tree::build_children_list(const TCodice_articolo& father, TArray& children) const +{ + TToken_string key; + for (int nrig = 1; ; nrig++) + { + const TRectype* rec = find(father, nrig); + if (rec == NULL) + break; + key.add(father,0); + key.add(nrig,1); + children.add(key); + } + const int total = children.items(); + if (total > 1 && _sort > 0) + { + _sort_key = _sort; + children.sort((COMPARE_FUNCTION)compare_rdist_key); + } + return total; +} + bool TDistinta_tree::has_son() const { if (_max_depth > 0) { - const int depth = _path.items()-1; + const int depth = curr_depth(); if (depth >= _max_depth) return FALSE; } @@ -452,13 +898,12 @@ bool TDistinta_tree::has_son() const TCodice_articolo key; curr_code(key); _curr = find(key, 1); - // Se c'e' almeno un figlio ed e' necessario ordinare - if (_curr != NULL && _sort > 0) + // Se ci sono almeno due figli ed e' necessario ordinare + if (_sort > 0 && find(key, 2) != NULL) { TPointer_array children; - const int total = build_children_list(key, children); - if (total > 1) - _curr = (TRectype*)children.objptr(0); + const int total = build_children_pointers(key, children); + _curr = (TRectype*)children.objptr(0); } return _curr != NULL; } @@ -466,31 +911,33 @@ bool TDistinta_tree::has_son() const void TDistinta_tree::add_child() { - const char tipo = _curr->get_char("TIPO"); - const TString& comp = _curr->get("CODCOMP"); + TCodice_articolo comp = _curr->get("CODCOMP"); + if (_curr->get_char("TIPO") == 'V') // Espando la variabile + { + TString cod = get_string(comp); + if (cod.blank() || cod.len() > comp.size()) + cod = "???"; + comp = cod; + } + _path.add(comp); // 0 - Codice articolo - if (tipo == 'V') - _path.add(get_string(comp)); - else - _path.add(comp); // Codice articolo - - _path << ',' << _curr->get("LIVELLO");// Livello giacenza + _path << ',' << _curr->get("LIVELLO");// 1 - Livello giacenza long num = _curr->get_long("NRIG"); - _path << ',' << num; // Numero componente + _path << ',' << num; // 2 - Numero componente if (_sort > 0) { TString16 field; field << "SORT" << _sort; num = _curr->get_long(field); } - _path << ',' << num; // Numero ordinamento + _path << ',' << num; // 3 - Numero ordinamento - _path << ',' << _curr->get("UM"); // Unita' di misura + _path << ',' << _curr->get("UM"); // 4 - Unita' di misura const TString& expr = _curr->get("EXPR"); const real qta = evaluate_numexpr(expr); - _path << ',' << qta; // Quantita' - + _path << ',' << qta; // 5 - Quantita' + _path << ',' << get_type(comp); // 6 - Articolo, Lavorazione, Virtuale, Ghost push_vars(); } @@ -526,8 +973,8 @@ bool TDistinta_tree::has_rbrother() const if (_sort > 0) { TPointer_array children; - const int last = build_children_list(father, children)-1; - if (last > 0) + const int last = build_children_pointers(father, children)-1; + if (last > 0) // Ci sono almeno due fratelli { for (int c = last; c >= 0; c--) { @@ -577,8 +1024,8 @@ bool TDistinta_tree::has_lbrother() const if (_sort > 0) { TPointer_array children; - const int last = build_children_list(father, children)-1; - if (last > 0) + const int last = build_children_pointers(father, children)-1; + if (last > 0) // Ci sono almeno due fratelli { for (int c = last; c > 0; c--) { @@ -664,13 +1111,27 @@ bool TDistinta_tree::is_lav(const char* c) const char TDistinta_tree::get_type(const char* c) const { - char type = 'V'; - if (is_mag(c)) - type = 'A'; - else + char type = ' '; // Tipo sconosciuto + if (c && *c > ' ') { - if (is_lav(c)) - type = 'L'; + if (is_mag(c)) + type = 'A'; // Articolo di magazzino + else + { + if (is_lav(c)) + type = 'L'; // Lavorazione + else + { + if (find(c, 1)) // E' una distinta + { + const TString& artprod = cache().get(LF_DIST, c, "ARTPROD"); + if (artprod.blank()) + type = 'G'; // Distinta fantasma + else + type = 'V'; // Distinta virtuale + } + } + } } return type; } @@ -678,7 +1139,7 @@ char TDistinta_tree::get_type(const char* c) const void TDistinta_tree::set_sort_key(int k) { - CHECK(k >= 0 && k <= 5, "Chiave distinta errata"); + CHECKD(k >= 0 && k <= 5, "Chiave distinta errata: ", k); _sort = k; } @@ -707,24 +1168,104 @@ void TDistinta_tree::set_global(const char* name, const char* val) void TDistinta_tree::set_global(const char* name, const real& val) { _globals.add(name, val, TRUE); +} + +TObject * TDistinta_tree::get_global(const char* name, word classname) +{ + // defaults + TObject* val = _globals.objptr(name); + if (val && val->class_id() != classname) + return NULL; + if (classname==CLASS_STRING ) + { + if (((TString *)val)->blank()) + val = global_default_str(name); + } + else + { + if (((real *)val)->is_zero()) + val = global_default_real(name); + } + return val; +} + +TObject * TDistinta_tree::global_default_str(const char* name) +{ + TConfig ini(CONFIG_DITTA,"db"); + TObject* val=NULL; + int c=0; + TToken_string var; + while (!(var = ini.get("GLOBAL_STR",NULL,c++)).blank()) + { + if (strcmp(var.get(0),name)==0 && *var.get(1)>' ') + { + val= new TString(var.get(1)); + break; + } + } + if (!val) + { + // more defaults + ini.set_paragraph("mr"); + if (strcmp("_IMPIANTO",name)==0) + val= new TString(ini.get("DEFAULT_CODIMP")); + else if (strcmp("_LINEA",name)==0) + val= new TString(ini.get("DEFAULT_CODLIN")); + else + { + ini.set_paragraph("mg"); + // + //if (strcmp("_MAGAZZINO",name)) + // val= new TString(ini.get("DEFAULT_CODMAGDEP")); + } + } + if (val) + _globals.add(name, val ,TRUE); + return val; +} + +TObject * TDistinta_tree::global_default_real(const char* name) +{ + TConfig ini(CONFIG_DITTA,"db"); + TObject* val=NULL; + int c=0; + TToken_string var; + while (!(var = ini.get("GLOBAL_REAL",NULL,c++)).blank()) + { + if (strcmp(var.get(0),name)==0 && *var.get(1)>' ') + { + val= new real(var.get(1)); + break; + } + } + if (val) + _globals.add(name, val ,TRUE); + return val; } const TString& TDistinta_tree::get_string(const char* var) { + // local vars for (int s = 0; s < _stack.count(); s++) { TAssoc_array& a = (TAssoc_array&)_stack.peek(s); - TObject* val = a.objptr(var); + const TObject* val = a.objptr(var); if (val) { if (val->class_id() == CLASS_STRING) - return (TString&)*val; + return (const TString&)*val; } } - TObject* val = _globals.objptr(var); - if (val && val->class_id() == CLASS_STRING) - return (TString&)*val; - + // globals & special vars + static TCodice_articolo _varvalue; + if (strcmp(var, "_DISTINTA")==0) + { + curr_code(_varvalue); + return _varvalue; + } + TObject* val = get_global(var, CLASS_STRING); + if (val) + return (const TString&)*val; return EMPTY_STRING; } @@ -733,17 +1274,25 @@ const real& TDistinta_tree::get_real(const char* var) for (int s = 0; s < _stack.count(); s++) { TAssoc_array& a = (TAssoc_array&)_stack.peek(s); - TObject* val = a.objptr(var); + const TObject* val = a.objptr(var); if (val) { if (val->class_id() != CLASS_STRING) - return (real&)*val; + return (const real&)*val; + else + break; + } + else + { + val = a.objptr("_GHOST"); + if (val == NULL) // Non sono ghost per cui non posso andar oltre + break; } } - TObject* val = _globals.objptr(var); + const TObject* val = _globals.objptr(var); if (val && val->class_id() != CLASS_STRING) - return (real&)*val; + return (const real&)*val; return ZERO; } @@ -752,7 +1301,8 @@ void TDistinta_tree::evaluate(TDistinta_expr& e) { for (int v = e.numvar()-1; v >= 0; v--) { - const char* name = e.varname(v); + TString name = e.varname(v); + name.upper(); const TTypeexp vartype = get_var_type(name); if (vartype == _numexpr) e.setvar(v, get_real(name)); @@ -783,12 +1333,15 @@ void TDistinta_tree::push_vars() TAssoc_array* vars = new TAssoc_array; _stack.push(vars); - TCodice_articolo var; curr_code(var); - const TString& memo_field = _dist.decode(var); - + const char tipo = curr_type(); + if (tipo == 'G') + vars->add("_GHOST", real(1.0)); + + TCodice_articolo art; curr_code(art); + const TString& memo_field = cache().get(LF_DIST, art, "PARAMETRI"); if (!memo_field.blank()) { - TString80 expr; + TString var, expr; TDistinta_expr e; TToken_string memo(memo_field, '\n'); @@ -799,7 +1352,7 @@ void TDistinta_tree::push_vars() if (equal) { *equal = '\0'; - var = str; + var = str; var.trim(); expr = equal + 1; const TTypeexp exprtype = get_var_type(var); e.set(expr, exprtype); @@ -822,7 +1375,7 @@ struct TExplosion_params int _max_depth; int _sort_key; bool _materiali_base; - bool _last_qta; + bool _ignore_ghost; }; static bool explode_callback(TTree& node, void* jolly, word when) @@ -834,89 +1387,111 @@ static bool explode_callback(TTree& node, void* jolly, word when) return FALSE; // Don't explode roots const TExplosion_params& ep = *(const TExplosion_params*)jolly; - if (ep._materiali_base && !tree.is_leaf()) - return FALSE; // Please, leaves only + const bool is_leaf = tree.is_leaf(); - TRiga_esplosione er(tree, ep); - - const char type = er.tipo(); - if (ep._filter.not_empty()) + if (ep._materiali_base && !is_leaf) { - if (ep._filter.find(type) < 0) + if (ep._max_depth <= 0 || tree.curr_depth() < ep._max_depth) + return FALSE; // Please, leaves only + } + + if (is_leaf) + { + TCodice_articolo art; tree.curr_code(art); + if (art == "???") return FALSE; } + if (ep._sort_key > 0) { - if (er.ordinamento() <= 0) + const long sk = tree.curr_sort(); + if (sk <= 0) return FALSE; // Non fa parte dell'ordinamento } + const char type = tree.curr_type(); + if (ep._filter.find(type) < 0) + return FALSE; + + TRiga_esplosione* er = new TRiga_esplosione(tree); + er->set_mat_base(is_leaf); ep._array->add(er); } return FALSE; } -int TDistinta_tree::raggruppa(TArray& boom, int mode) const +int TDistinta_tree::raggruppa(TArray& boom, TExplosion_grouping mode) const { for (int i = 0; i < boom.items(); i++) { TRiga_esplosione& qta1 = (TRiga_esplosione&)boom[i]; - if (mode == 2) - qta1.convert_to_base(); + if (mode == RAGGR_EXP_UMBASE || mode == RAGGR_EXP_BASE) + qta1.convert2umbase(); else + if (mode == RAGGR_EXP_UMDIST || mode == RAGGR_EXP_DIST) + qta1.convert2umdist(); - for (int j = boom.items()-1; j > i; j--) + if (mode == RAGGR_EXP_UMBASE || + mode == RAGGR_EXP_UMDIST || + mode == RAGGR_EXP_EACHUM) { - TRiga_esplosione& qta2 = (TRiga_esplosione&)boom[j]; - if (qta1.articolo() != qta2.articolo()) - continue; + for (int j = boom.items()-1; j > i; j--) + { + TRiga_esplosione& qta2 = (TRiga_esplosione&)boom[j]; + if (qta1.articolo() != qta2.articolo()) + continue; - if (mode == 3 && qta1.um() != qta2.um()) - continue; + if (mode == RAGGR_EXP_EACHUM && qta1.um() != qta2.um()) + continue; - qta1 += qta2; - boom.destroy(j, TRUE); + qta1 += qta2; + boom.destroy(j, TRUE); + } } } return boom.items(); } int TDistinta_tree::explode(TArray& boom, - bool mb, int gr, int md, - const char* filter, int sk, - bool lq) + bool mb, TExplosion_grouping gr, int md, + const char* filter, int sk) { - const int old_sk = get_sort_key(); - const int old_md = get_max_depth(); - if (mb) md = 0; - - set_sort_key(sk); - set_max_depth(md); + const int old_sk = get_sort_key(); + const int old_md = get_max_depth(); + const bool old_iv = get_ignore_ghost(); TExplosion_params ep; ep._array = &boom; ep._materiali_base = mb; ep._raggruppa = gr; ep._max_depth = md; - ep._filter = filter; ep._sort_key = sk; - ep._last_qta = lq; + ep._filter = filter; + if (ep._filter.empty()) + ep._filter = "ALV"; + ep._ignore_ghost = ep._filter.find('G') < 0; + set_sort_key (ep._sort_key); + set_max_depth(ep._max_depth); + set_ignore_ghost(ep._ignore_ghost); + + boom.destroy(); // Non si sa mai! scan_depth_first(explode_callback, &ep); set_sort_key(old_sk); set_max_depth(old_md); + set_ignore_ghost(old_iv); - if (gr) + if (gr != RAGGR_EXP_NONE) raggruppa(boom, gr); return boom.items(); } TDistinta_tree::TDistinta_tree() - : _rdist(LF_RDIST), _sort(0), _max_depth(0), - _dist(LF_DIST, "PARAMETRI"), _vars("VAR", "B0"), - _mag(LF_ANAMAG, "DESCR"), _lav("LAV") + : _sort(0), _max_depth(0), _ignore_ghost(FALSE), + _vars("VAR", "B0"), _mag(LF_ANAMAG, "DESCR"), + _lav("LAV") { } @@ -924,27 +1499,77 @@ TDistinta_tree::~TDistinta_tree() { } + +TRiga_esplosione *TDistinta_tree::first_critical_labor(TArray & labors, TExplosion_grouping raggum) +{ + return first_labor(labors,raggum); +} + +TRiga_esplosione *TDistinta_tree::next_critical_labor(TArray & labors) +{ + return next_labor(labors); +} + + +TRiga_esplosione *TDistinta_tree::first_labor(TArray & labors, TExplosion_grouping raggum) +{ + static TLavorazione *curr_labor=NULL; + explode(labors,FALSE,raggum, 1,"L"); + TRiga_esplosione *l=(TRiga_esplosione *)labors.first_item(); + return l; +} + +TRiga_esplosione *TDistinta_tree::next_labor(TArray & labors) +{ + TRiga_esplosione *l=(TRiga_esplosione *)labors.succ_item(); + return l; +} + +TLavorazione *TDistinta_tree::find_labor(TRiga_esplosione *l) +{ + static TLavorazione *curr_labor=NULL; + if (l) + { + if (curr_labor==NULL) curr_labor=new TLavorazione(); + curr_labor->put("CODTAB",l->articolo()); + TTable tablav("LAV"); + curr_labor->read(tablav); + return curr_labor; + } + return NULL; +} + /////////////////////////////////////////////////////////// // TRiga_esplosione /////////////////////////////////////////////////////////// -void TRiga_esplosione::init(const TDistinta_tree& tree, - const TExplosion_params& ep) +void TRiga_esplosione::init(const TDistinta_tree& tree) { TCodice_articolo art; tree.curr_code(art); TCodice_um um; tree.curr_um(um); - real val = tree.curr_qta(ep._last_qta); + real val = tree.curr_qta(); set(art, um, val); tree.curr_giac(_giac); - _tipo = tree.get_type(art); + _tipo = tree.curr_type(); _sort = tree.curr_sort(); - _livello = tree.curr_depth(); + _mat_base = FALSE; + // set path and code + tree.curr_id(_path); // path } -TRiga_esplosione::TRiga_esplosione(const TDistinta_tree& tree, - const TExplosion_params& ep) +static TString _tmp_path; + +const char * TRiga_esplosione::father() { - init(tree, ep); + _tmp_path = _path; + const int index = _tmp_path.rfind('|'); + _tmp_path.cut(index == -1 ? 0 : index); + return _tmp_path; +} + +TRiga_esplosione::TRiga_esplosione(const TDistinta_tree& tree) +{ + init(tree); } TRiga_esplosione::TRiga_esplosione(const TRiga_esplosione& re) @@ -952,6 +1577,33 @@ TRiga_esplosione::TRiga_esplosione(const TRiga_esplosione& re) { _giac = re._giac; _tipo = re._tipo; - _livello = re._livello; + _path = re._path; _sort = re._sort; + _mat_base = re._mat_base; } + +TRiga_esplosione::TRiga_esplosione() + : TQuantita() +{ + _tipo = '\0'; + _sort = 0L; + _mat_base = FALSE; +} + +TUm_tempo::TUm_tempo(char c) +{ + switch (c) + { + case 'M': // minutes + _ore=1/60; + break; + case 'S': // seconds + _ore=1/60/60; + break; + case 'H': // hours + default: + _ore=1; + break; + } +} + diff --git a/db/dblib.h b/db/dblib.h index 1708b2cfb..50b6cb6af 100755 --- a/db/dblib.h +++ b/db/dblib.h @@ -22,6 +22,9 @@ class TCodice_articolo : public TFixed_string { char _str20[21]; +protected: + virtual TObject* dup() const { return new TCodice_articolo(_str20); } + public: TCodice_articolo(const char* s = "") : TFixed_string(_str20, 21) { set(s); } @@ -46,21 +49,85 @@ class TCodice_um : public TFixed_string { char _str2[3]; +protected: + virtual TObject* dup() const { return new TCodice_um(_str2); } + public: TCodice_um(const char* s = "") : TFixed_string(_str2, 3) - { set(s); } + { strncpy(s,2); } TCodice_um(const TString& s) : TFixed_string(_str2, 3) - { set(s); } + { strncpy(s,2); } TCodice_um(const TCodice_um& s) : TFixed_string(_str2, 3) - { set(s); } + { strncpy(s,2); } const TString& operator =(const char* s) - { return set(s); } + { strncpy(s,2); return *this; } const TString& operator =(const TString& s) - { return set((const char*)s); } + { strncpy(s,2); return *this; } const TString& operator =(const TCodice_um& s) - { return set((const char*)s); } + { strncpy(s,2); return *this; } }; +/////////////////////////////////////////////////////////// +// TLavorazione +/////////////////////////////////////////////////////////// +class TUm_tempo : public TObject +{ + real _ore; +public: + real & converti_in_ore() {return _ore;} + TUm_tempo(char c); + ~TUm_tempo() {} +}; + +class TLavorazione : public TRectype +{ + + TString16 _codimp ; + TToken_string _linee ; +protected: + TObject* dup() const { return new TLavorazione(*this); } +public: + const char * codice() const {return get("CODTAB");} + const char * descr() const {return get("S0");} + const char * um() const {return get("S6");} + TUm_tempo um_temporale() const {return (TUm_tempo)get_char("I7");} + void reset_linee(); + void get_linee(); + void put_linee(); + + int linee_standard() const; + int linee() const; + + const char * cod_impianto(int l); + const char * cod_linea(int l); + // numero addetti impiegati + const int raw_numpers_linea(int l); + const int numpers_linea(int l); + // produttivitą + const real raw_produttiv_linea(int l); + const real produttiv_linea(int l); + + const int find_linea(const TString& linea); + bool set_cod_linea(int l, const char *c); + bool set_numpers_linea(int l, int pers); + bool set_produttiv_linea(int l, real & prod); + + // @cmember Legge il file

con il tipo di record + virtual int read(TBaseisamfile& f, word op = _isequal, word lockop = _nolock); + // @cmember Legge il file

con il tipo di record alla posizione desiderata + virtual int readat(TBaseisamfile& f, TRecnotype nrec, word lockop = _nolock); + // @cmember Aggiunge il record al file + virtual int write(TBaseisamfile& f) const; + // @cmember Riscrive il record sul file + virtual int rewrite(TBaseisamfile& f) const; + // operatore di copia + virtual TRectype & operator =(const TRectype& rec); + + TLavorazione(const char* cod = "") ; + TLavorazione(const TRectype& rec) ; + TLavorazione(const TLavorazione& rec) ; + virtual ~TLavorazione() { } +}; /////////////////////////////////////////////////////////// // TQuantita' @@ -75,8 +142,9 @@ class TQuantita : public TSortable real _conv; // Fattore di conversione alla base real _val; // Valore attuale - static TDecoder* _umart1; // Decoder per trovare unita' base + static TDecoder* _umart1; // Decoder per trovare unita' base articolo static TDecoder* _umart2; // Decoder per trovare conversione + static TDecoder* _umdist; // Decoder per trovare unita' base distinta protected: virtual int compare(const TSortable& s) const; @@ -86,12 +154,17 @@ protected: real get_factor(const TCodice_um& um) const; void convert(real& val, const TCodice_um& from_um, const TCodice_um& to_um) const; + real find_umbase(TCodice_um& um); + real find_umdist(TCodice_um& um); + public: virtual bool ok() const { return !_um.blank(); } const TQuantita& operator =(const TQuantita& q) { copy(q); return q; } + const TQuantita& operator +=(const real& q); + const TQuantita& operator -=(const real& q); const TQuantita& operator +=(const TQuantita& q); const TQuantita& operator -=(const TQuantita& q); const TQuantita& operator =(const real& q); @@ -100,18 +173,21 @@ public: const TCodice_articolo& articolo() const { return _articolo; } const TCodice_um& um() const { return _um; } - const real& val() const { return _val; } + const real& conv() const { return _conv; } + const real& val() const { return _val; } + real base_val() const; void set_articolo(const TCodice_articolo& art, const TCodice_um& um); + void set_val(const real& val) {_val=val;} void set(const TCodice_articolo& art, const TCodice_um& um, const real& val) { set_articolo(art, um); _val = val; } - void convert_to_base(); + void convert2umbase(); + void convert2umdist(); TQuantita(); - TQuantita(const TCodice_articolo& art); - TQuantita(const TCodice_articolo& art, const TCodice_um& um, const real& val); TQuantita(const TQuantita& q); + TQuantita(const TCodice_articolo& art, const TCodice_um& um, const real& val); virtual ~TQuantita(); }; @@ -133,14 +209,33 @@ public: // TDistinta_tree /////////////////////////////////////////////////////////// +enum TExplosion_grouping +{ + RAGGR_EXP_NONE = 0, // Nessun raggruppamento + RAGGR_EXP_EACHUM = 1, // Raggruppa ogni articolo per unitą di misura + RAGGR_EXP_BASE = 2, // Non raggruppare ma converti alla UM di base + RAGGR_EXP_UMBASE = 3, // Raggruppa le unitą di misura, esprimendo il totale nella UM di base + RAGGR_EXP_DIST = 4, // Non raggruppare ma converti alla UM di distinta + RAGGR_EXP_UMDIST = 5, // Raggruppa le unitą di misura, esprimendo il totale nella UM di distinta +}; + + +// _RADICE : CODICE DELLA DISTINTA AL PRIMO LIVELLO +// _DISTINTA : CODICE DELLA DISTINTA +// _MAGAZZINO : CODICE MAGAZZINO/DEPOSITO +// _LIVELLO : LIVELLO DI GIACENZA +// _LINEA : CODICE LINEA DI PRODUZIONE +// _IMPIANTO : CODICE IMPIANTO + +class TRiga_esplosione; class TDistinta_tree : public TBidirectional_tree { - TCodice_articolo _root; + TString _root; TToken_string _path; int _sort, _max_depth; + bool _ignore_ghost; - TDecoder _dist, _vars, _mag, _lav; - TRecord_cache _rdist; + TDecoder _vars, _mag, _lav; static const TRectype* _curr; static TToken_string _tmp; @@ -154,7 +249,8 @@ protected: void add_child(); void kill_child(); const TRectype* find(const TCodice_articolo& father, int child) const; - int build_children_list(const TCodice_articolo& father, TPointer_array& child) const; + int build_children_pointers(const TCodice_articolo& father, TPointer_array& children) const; + int build_children_list(const TCodice_articolo& father, TArray& children) const; TTypeexp get_var_type(const char* var); const TString& get_string(const char* var); @@ -166,12 +262,16 @@ protected: void push_vars(); void pop_vars(); - int raggruppa(TArray& boom, int mode) const; + int raggruppa(TArray& boom, TExplosion_grouping mode) const; protected: // TTree virtual void node2id(const TObject* node, TString& id) const; + TObject * get_global(const char* name, word classname); + TObject * global_default_str(const char* name); + TObject * global_default_real(const char* name); public: + static TLavorazione * find_labor(TRiga_esplosione *l); virtual bool goto_root(); virtual bool goto_firstson(); virtual bool goto_rbrother(); @@ -187,27 +287,40 @@ public: virtual TImage* image(bool selected) const; virtual TObject* curr_node() const; - bool set_root(const TCodice_articolo& str); + bool set_root(const TQuantita& qta); + bool set_root(const TCodice_articolo& art, const char* um = "", real qta = 1.0); + bool set_root(const TRectype & rec); + long find_node(const TCodice_articolo& str, word flags = SCAN_PRE_ORDER); void set_sort_key(int k); int get_sort_key() const { return _sort; } + bool get_ignore_ghost() { return _ignore_ghost; } void set_max_depth(int m) { _max_depth = m; } int get_max_depth() const { return _max_depth; } + bool set_ignore_ghost(bool i) { return _ignore_ghost = i; } void restart(); // reset all and go to root - int explode(TArray& boom, bool mb = FALSE, int gr = 0, int md = 0, - const char* filter = NULL, int sk = 0, bool lq = FALSE); + int explode(TArray& boom, bool mat_base = FALSE, + TExplosion_grouping raggr = RAGGR_EXP_NONE, + int max_depth = 0, const char* filter = NULL, + int sort_key = 0); bool curr_code(TCodice_articolo& code) const; bool curr_giac(TString& code) const; int curr_comp(TString& code) const; long curr_sort() const; const char* curr_um(TCodice_um& code) const; - real curr_qta(bool last = FALSE) const; - int curr_depth() const { return _path.items()-1; } + real curr_qta() const; + int curr_depth() const; + char curr_type() const; + TRiga_esplosione *first_labor(TArray & labors, TExplosion_grouping raggum=RAGGR_EXP_UMBASE); + TRiga_esplosione *next_labor(TArray & labors); + TRiga_esplosione *first_critical_labor(TArray & labors, TExplosion_grouping raggum=RAGGR_EXP_UMBASE); + TRiga_esplosione *next_critical_labor(TArray & labors); + bool is_cyclic(const TToken_string& path) const; bool is_cyclic() const { return is_cyclic(_path); } bool is_root() const; @@ -216,6 +329,7 @@ public: bool is_mag(const char* c = NULL) const; bool is_lav(const char* c = NULL) const; char get_type(const char* c = NULL) const; + const TString& describe(const TCodice_articolo& codart) const; void clear_globals(); void set_global(const char* var, const char* val); @@ -233,24 +347,31 @@ struct TExplosion_params; class TRiga_esplosione : public TQuantita { + TToken_string _path; TString16 _giac; long _sort; - int _livello; char _tipo; + bool _mat_base; protected: virtual TObject* dup() const { return new TRiga_esplosione(*this); } - void init(const TDistinta_tree& tree, const TExplosion_params& ep); + void init(const TDistinta_tree& tree); public: + const TToken_string& path() const { return _path; } const TString& giacenza() const { return _giac; } long ordinamento() const { return _sort; } - int livello() const { return _livello; } + int livello() const { return _path.items() - 1; } char tipo() const { return _tipo; } - + char mat_base() const { return _mat_base; } + + void set_tipo(char c) { _tipo = c; } + void set_mat_base(bool b) { _mat_base = b; } + void set_path(const char* p) { _path = p;} + const char * father(); + TRiga_esplosione(); - TRiga_esplosione(const TDistinta_tree& tree, - const TExplosion_params& ep); + TRiga_esplosione(const TDistinta_tree& tree); TRiga_esplosione(const TRiga_esplosione& re); virtual ~TRiga_esplosione() { } }; diff --git a/db/dbstord.uml b/db/dbstord.uml index 67b869b25..3d3f28d04 100755 --- a/db/dbstord.uml +++ b/db/dbstord.uml @@ -1,14 +1,14 @@ #include "../ba/ba3200.h" PAGE "Stampa tabella ordinamenti "-1 -1 76 15 -GROUPBOX DLG_NULL 74 5 +GROUPBOX DLG_NULL 74 4 BEGIN - PROMPT 1 1 "Da" + PROMPT 1 2 "Da" END STRING F_INIZIO1 1 BEGIN - PROMPT 2 3 "" + PROMPT 2 3 "Codice " USE ORD INPUT CODTAB F_INIZIO1 DISPLAY "Codice@10" CODTAB @@ -18,13 +18,13 @@ BEGIN GROUP 1 FIELD CODTAB FLAGS "U" - CHECKTYPE SEARCH + CHECKTYPE NORMAL END -STRING F_INIZIO2 50 +STRING F_INIZIO2 25 50 BEGIN - PROMPT 15 3 "" - USE ORD + PROMPT 2 4 "Descrizione " + USE ORD KEY 2 INPUT S0 F_INIZIO2 DISPLAY "Descrizione@50" S0 DISPLAY "Codice" CODTAB @@ -33,17 +33,17 @@ BEGIN GROUP 1 FIELD S0 FLAGS "U" - CHECKTYPE SEARCH + CHECKTYPE NORMAL END -GROUPBOX DLG_NULL 74 5 +GROUPBOX DLG_NULL 74 4 BEGIN - PROMPT 1 6 "A" + PROMPT 1 7 "A" END STRING F_FINE1 1 BEGIN - PROMPT 2 8 "" + PROMPT 2 8 "Codice " USE ORD INPUT CODTAB F_FINE1 DISPLAY "Codice@10" CODTAB @@ -53,13 +53,13 @@ BEGIN GROUP 2 FIELD CODTAB FLAGS "U" - CHECKTYPE SEARCH + CHECKTYPE NORMAL END -STRING F_FINE2 50 +STRING F_FINE2 30 50 BEGIN - PROMPT 15 8 "" - USE ORD + PROMPT 2 9 "Descrizione " + USE ORD KEY 2 INPUT S0 F_FINE2 DISPLAY "Descrizione@50" S0 DISPLAY "Codice" CODTAB @@ -68,7 +68,7 @@ BEGIN GROUP 2 FIELD S0 FLAGS "U" - CHECKTYPE SEARCH + CHECKTYPE NORMAL END BUTTON DLG_OK 10 2 diff --git a/db/dbtblav.h b/db/dbtblav.h index c501cb684..1d01eeffa 100755 --- a/db/dbtblav.h +++ b/db/dbtblav.h @@ -1,7 +1,23 @@ -#define F_CODICE 101 -#define F_DESCR 102 -#define F_COSUNIT 103 -#define F_UNMIS 104 -#define F_STAMPA 105 -#define F_UMDESC 106 +#define F_CODICE 101 +#define F_DESCR 102 +#define F_COSUNIT 103 +#define F_UNMIS 104 +#define F_STAMPA 105 +#define F_UMDESC 106 +#define F_CODICEART 107 +#define F_SEARCHART 108 +#define F_SHEET 109 +#define F_NUMPERS 110 +#define F_PRODUTTIV 111 +#define F_UNTEMPO 112 +#define F_DESUNTEMPO 113 +#define F_UNMIS2 114 +#define F_LINEESTD 115 + +#define F_CODLIN 101 +#define F_DESCRLIN 102 +#define F_CODIMP 103 +#define F_LNUMPERS 104 +#define F_LPRODUTTIV 105 +#define F_DESCRIMP 120 diff --git a/db/dbtblav.uml b/db/dbtblav.uml index 2f086ea00..07b55630e 100755 --- a/db/dbtblav.uml +++ b/db/dbtblav.uml @@ -2,79 +2,238 @@ TOOLBAR "" 0 19 80 3 #include ENDPAGE - PAGE "Anagrafica lavorazioni" -1 -1 65 15 - - GROUPBOX DLG_NULL 78 5 - BEGIN - PROMPT 1 1 "" - END - STRING F_CODICE 20 - BEGIN - PROMPT 2 2 "Codice " - FIELD CODTAB - KEY 1 - USE LAV - INPUT CODTAB F_CODICE - DISPLAY "Codice@20" CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT F_CODICE CODTAB - OUTPUT F_DESCR S0 - CHECKTYPE REQUIRED - FLAGS "U" - END - STRING F_DESCR 50 - BEGIN - PROMPT 2 4 "Descrizione " - FIELD S0 - KEY 2 - USE LAV KEY 2 - INPUT S0 F_DESCR - DISPLAY "Descrizione@50" S0 - DISPLAY "Codice@20" CODTAB - OUTPUT F_DESCR S0 - OUTPUT F_CODICE CODTAB - CHECKTYPE REQUIRED - END - GROUPBOX DLG_NULL 78 8 - BEGIN - PROMPT 1 6 "" - END - STRING F_UNMIS 2 - BEGIN - PROMPT 2 7 "Unitą di misura " - FIELD S6 - USE %UMS - INPUT CODTAB F_UNMIS - DISPLAY "Unitą di misura@2" CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT F_UNMIS CODTAB - OUTPUT F_UMDESC S0 - CHECKTYPE REQUIRED - END - STRING F_UMDESC 50 - BEGIN - PROMPT 22 7 " " - USE %UMS KEY 2 - INPUT S0 F_UMDESC - DISPLAY "Descrizione@50" S0 - DISPLAY "Unitą di misura@2" CODTAB - OUTPUT F_UMDESC S0 - OUTPUT F_UNMIS CODTAB - CHECKTYPE REQUIRED - END - NUMBER F_COSUNIT 15 - BEGIN - PROMPT 2 9 "Costo unitario " - PICTURE "." - FIELD R0 - END - BOOLEAN F_STAMPA - BEGIN - PROMPT 2 11 "Stampa nelle esplosioni" - FIELD B0 - END - ENDPAGE - ENDMASK + +PAGE "Anagrafica lavorazioni" -1 -1 65 15 + +GROUPBOX DLG_NULL 78 5 +BEGIN + PROMPT 1 1 "" +END + +STRING F_CODICE 20 +BEGIN + PROMPT 2 2 "Codice " + FLAGS "U" + FIELD CODTAB + KEY 1 + USE LAV + INPUT CODTAB F_CODICE + DISPLAY "Codice@20" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODICE CODTAB + OUTPUT F_DESCR S0 + CHECKTYPE NORMAL + MESSAGE COPY,F_SEARCHART|CHECK,F_SEARCHART +END + +STRING F_SEARCHART 20 +BEGIN + FLAGS "HG" + PROMPT 2 3 "Codice " + USE LF_ANAMAG + INPUT CODART F_SEARCHART + OUTPUT F_CODICEART CODART + MESSAGE CHECK,F_CODICEART + MESSAGE EMPTY RESET,F_CODICEART + CHECKTYPE SEARCH + WARNING "ricerca articolo errata" +END + +STRING F_CODICEART 20 +BEGIN + FLAGS "HG" + PROMPT 42 3 "" + STR_EXPR #F_CODICEART=="" + MESSAGE EMPTY RESET,F_CODICEART + MESSAGE RESET,F_CODICEART + WARNING "Il codice e' gia' utilizzato per gli articoli" +END + +STRING F_DESCR 50 +BEGIN + PROMPT 2 4 "Descrizione " + FIELD S0 + KEY 2 + USE LAV KEY 2 + INPUT S0 F_DESCR + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice@20" CODTAB + OUTPUT F_DESCR S0 + OUTPUT F_CODICE CODTAB + CHECKTYPE REQUIRED +END + +GROUPBOX DLG_NULL 78 5 +BEGIN + PROMPT 1 6 "" +END + +STRING F_UNMIS 2 +BEGIN + FLAGS "U" + PROMPT 2 7 "Unita' di misura " + FIELD S6 + USE %UMS + INPUT CODTAB F_UNMIS + DISPLAY "Unitą di misura@2" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_UNMIS CODTAB + OUTPUT F_UMDESC S0 + CHECKTYPE REQUIRED + MESSAGE COPY,F_UNMIS2 +END + +STRING F_UMDESC 50 +BEGIN + PROMPT 22 7 " " + USE %UMS KEY 2 + INPUT S0 F_UMDESC + DISPLAY "Descrizione@50" S0 + DISPLAY "Unitą di misura@2" CODTAB + OUTPUT F_UMDESC S0 + OUTPUT F_UNMIS CODTAB + CHECKTYPE REQUIRED +END + +NUMBER F_COSUNIT 15 3 +BEGIN + PROMPT 2 9 "Costo unitario " + PICTURE "." + FIELD R0 +END + +BOOLEAN F_STAMPA +BEGIN + PROMPT 51 9 "Stampa nelle esplosioni" + FIELD B0 +END + +ENDPAGE + +PAGE "Parametri di MRP" -1 -1 65 15 + +NUMBER F_NUMPERS 3 +BEGIN + PROMPT 1 2 "Persone impiegate in media " + FIELD R2 +// CHECKTYPE REQUIRED +END + +NUMBER F_PRODUTTIV 8 3 +BEGIN + PROMPT 1 3 "Produttivita' media " + FIELD R1 + CHECKTYPE REQUIRED +END + +STRING F_UNMIS2 2 +BEGIN + FLAGS "DG" + PROMPT 38 3 "espressa in " +END + +LIST F_UNTEMPO 8 +BEGIN + FLAGS "U" + PROMPT 53 3 " per " + FIELD S7 + ITEM "H|ora" + ITEM "M|minuto" + ITEM "S|secondo" +END + +NUMBER F_LINEESTD 2 +BEGIN + FLAGS "U" + PROMPT 1 4 "Numero di linee standard " + FIELD I1 +END + + + +SPREADSHEET F_SHEET +BEGIN + FLAGS "I" + PROMPT 0 6 "" + ITEM "Linea@5" + ITEM "Descrizione@30" + ITEM "Impianto" + ITEM "Persone" + ITEM "Produttivita'" +END + +ENDPAGE + +ENDMASK - +PAGE "Righe" -1 -1 66 12 + +STRING F_CODLIN 5 +BEGIN + PROMPT 1 1 "Linea " + FLAGS "U" + USE LNP + JOIN IMP ALIAS 100 INTO CODTAB==S6 + INPUT CODTAB F_CODLIN + DISPLAY "Linea" CODTAB + DISPLAY "Descrizione@50" S0 + DISPLAY "Impianto" S6 + DISPLAY "Descrizione" 100@->S0 + OUTPUT F_CODLIN CODTAB + OUTPUT F_DESCRLIN S0 + OUTPUT F_CODIMP S6 + OUTPUT F_DESCRIMP 100@->S0 + CHECKTYPE REQUIRED +END + +STRING F_DESCRLIN 50 +BEGIN + PROMPT 1 2 "Descrizione " + FLAGS "D" +END + +STRING F_CODIMP 5 +BEGIN + PROMPT 1 3 "Impianto " + FLAGS "D" +END + +STRING F_DESCRIMP 50 +BEGIN + PROMPT 1 4 "Descrizione " + FLAGS "D" +END + +NUMBER F_LNUMPERS 3 +BEGIN + PROMPT 1 6 "N. persone " +END + +NUMBER F_LPRODUTTIV 8 3 +BEGIN + PROMPT 1 8 "Produttivita'" +END + + + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" + PICTURE BMP_DELREC + PICTURE BMP_DELRECDN +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK diff --git a/db/dbtbord.rpt b/db/dbtbord.rpt index b95bc85c5..1ffc5ce8f 100755 --- a/db/dbtbord.rpt +++ b/db/dbtbord.rpt @@ -1,6 +1,6 @@ [Headers] 80 -Tabella "ORD" +Tabella Ordinamenti di distinte 1|@3g%s|Codice 1|@10g%s|Descrizione 1|@56g%s|Completa @@ -10,4 +10,4 @@ Tabella "ORD" 1|CODTAB|@3g@1,ls 1|S0|@10g@50,ls 1|B0|@60g@5,ls -1|B1|@68g@5,ls \ No newline at end of file +1|B1|@68g@5,ls diff --git a/db/dbtbord.uml b/db/dbtbord.uml index eb7bf2ccc..4f4e71a68 100755 --- a/db/dbtbord.uml +++ b/db/dbtbord.uml @@ -23,6 +23,8 @@ BEGIN OUTPUT F_DESC S0 CHECKTYPE REQUIRED FLAGS "U" + NUM_EXPR #F_SORT<=5 + WARNING "L'ordinamento deve essere compreso tra 0 e 5" END STRING F_DESC 50 @@ -39,19 +41,20 @@ BEGIN CHECKTYPE REQUIRED END +BOOLEAN F_GLOBALE +BEGIN + PROMPT 2 10 "Globale" + FIELD B1 + MESSAGE FALSE ENABLE,F_COMPLETA + MESSAGE TRUE CLEAR,F_COMPLETA +END + BOOLEAN F_COMPLETA BEGIN - PROMPT 2 10 "Completa" - MESSAGE TRUE ENABLE,F_GLOBALE - MESSAGE FALSE CLEAR,F_GLOBALE + PROMPT 20 10 "Completa" FIELD B0 END -BOOLEAN F_GLOBALE -BEGIN - PROMPT 20 10 "Globale" - FIELD B1 -END ENDPAGE ENDMASK diff --git a/db/dbtbvar.uml b/db/dbtbvar.uml index bec505537..d0e8b55ab 100755 --- a/db/dbtbvar.uml +++ b/db/dbtbvar.uml @@ -35,9 +35,11 @@ ENDPAGE OUTPUT F_CODICE CODTAB CHECKTYPE REQUIRED END - BOOLEAN F_VAR + LISTBOX F_VAR 10 BEGIN - PROMPT 2 6 "Variabile numerica" + PROMPT 2 6 "Tipo " + ITEM "|stringa" + ITEM "X|numerico" FIELD B0 END ENDPAGE diff --git a/db/f112.dir b/db/f112.dir index 967ce5900..9b002dc22 100755 --- a/db/f112.dir +++ b/db/f112.dir @@ -1,3 +1,3 @@ 112 0 -$dist|0|0|121|0|Distinte||| +$dist|0|0|132|0|Distinte||| diff --git a/db/f112.trr b/db/f112.trr index c86474528..c92a359cc 100755 --- a/db/f112.trr +++ b/db/f112.trr @@ -1,12 +1,16 @@ 112 -8 +12 CODDIST|1|20|0|Codice distinta VIRTUALE|8|1|0|Distinta virtuale (non e' un articolo) +ARTPROD|8|1|0|Articolo di produzione +ARTACQ|8|1|0|Articolo di acquisto DESCR|1|50|0|Descrizione UMP|1|3|0|Unita' di misura del peso PESO|4|15|5|Peso UM|1|3|0|Unita' di misura -PREZZO|4|18|2|Costo -PARAMETRI|11|10|0|Parametri (var1 = valore1, var2= valore2, ecc.) +PREZZO|4|18|2|Costo di produzione +LEADTIME|6|4|0|Lead time espresso in giorni lavorativi per MRP +LEADHOURS|3|5|0|Lead time espresso in ore lavorative per MRP +PARAMETRI|11|10|0|Elenco delle variabili 1 CODDIST| diff --git a/include/default.url b/include/default.url index b99897e15..0d2bcd6c5 100755 --- a/include/default.url +++ b/include/default.url @@ -4,12 +4,12 @@ #endif #ifndef LIBDIR -#define LIBDIR f:\xvt.450\win_x86\ptk\lib +#define LIBDIR c:\xvt.458\w32_x86\lib #endif #ifndef RESDIR -#define RESDIR f:/p.due/bmp -#define QRESDIR "f:/p.due/bmp/" +#define RESDIR c:/p.32/bmp +#define QRESDIR "c:/p.32/bmp/" #endif #ifndef QFIRMNAME diff --git a/include/form.cpp b/include/form.cpp index 7a1439103..fdff22b58 100755 --- a/include/form.cpp +++ b/include/form.cpp @@ -642,18 +642,18 @@ void TForm_item::print_on(TToken_string& row) const const TString& TForm_item::picture() const { - CHECK(0, "Can't get the picture of a generic form item!"); - return _prompt; + NFCHECK("Can't get the picture of a generic form item!"); + return EMPTY_STRING; } void TForm_item::set_picture(const char*) { - CHECK(0, "Can't set the picture of a generic form item!"); + NFCHECK("Can't set the picture of a generic form item!"); } TToken_string& TForm_item::memo_info() { - CHECK(0, "Can't get a memo of a generic form item!"); + NFCHECK("Can't get a memo of a generic form item!"); return (TToken_string &) EMPTY_STRING; } @@ -1077,7 +1077,7 @@ void TForm_string::put_paragraph(const char* s) #ifdef DBG if (plen>0 && *s) - yesno_box("Nei form la stampa di un item su pił righe con prompt ora non pone pił il prompt isolato sulla prima riga ma allinea a sinistra del prompt "); + NFCHECK("Nei form la stampa di un item su pił righe con prompt ora non pone pił il prompt isolato sulla prima riga ma allinea a sinistra del prompt "); #endif for (int i=0; (s = p.get()) != NULL && i < h; i++) { @@ -3101,37 +3101,12 @@ void TForm::arrange_form() TString str_pos; TMask m("ba2100c"); -#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT -/* - char defPrinter[80]; - char szDevice[50]; - - // get default printer driver - GetProfileString ("windows", "device", ",,,", defPrinter, sizeof(defPrinter)); - TToken_string pdev (defPrinter, ','); - GetProfileString ("devices", pdev, "", szDevice, sizeof(szDevice)); - pdev.add(szDevice); - device = pdev.get(2); - device = device.left(4); //Legge solo LPTx... - */ -#else - TString device(printer.printername()); - FILE* lpt = fopen(device,"w"); - - if (lpt == NULL) - fatal_box("Impossibile aprire il device %s.",device); -#endif - // _ipy viene assunto uguale per entrambi i posizionamneti str_pos = "\017"; // Questo e' 15 in ottale... for (i=1; i < _ipy; i++) str_pos << "\n"; -#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT - os_spool_row(str_pos); -#else - fprintf(lpt,"%s",(const char*) str_pos); - fflush(lpt); // Salta le righe... - fclose(lpt); -#endif + os_open_spool_row(printer().printername()); + os_spool_row(str_pos); + os_close_spool_row(); str_pos = ""; //Azzera la stringa di posizionamento for (i=1; i < _ipx; i++) str_pos << " "; //Aggiunge gli spazi necessari... if (_ipx > 0) @@ -3144,16 +3119,9 @@ void TForm::arrange_form() // TString bspc; bspc.fill('\b',str_pos.len()); // Questi servono per tornare indietro... do { -#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT + os_open_spool_row(printer().printername()); os_spool_row(str_pos); -#else - lpt = fopen(device,"w"); - if (lpt == NULL) fatal_box("Impossibile aprire il device %s.",device); -// fprintf(lpt,"%s",(const char*) bspc); - fprintf(lpt,"%s\r",(const char*) str_pos); - fflush(lpt); - fclose(lpt); -#endif + os_close_spool_row(); } while (m.run() == K_ESC); // cicla sulla stampa posizionamento... /* const int h = height(odd_page); str_pos.cut(0); diff --git a/include/isam.cpp b/include/isam.cpp index d357e7643..335c5cd46 100755 --- a/include/isam.cpp +++ b/include/isam.cpp @@ -2045,7 +2045,9 @@ int TSystemisamfile::load( if (fl == NULL) { error_box("Impossibile aprire il file %s",from); - return err = 2; + clearerr(fl); + setstatus(2); + return 2; } TRecnotype r = 0, e = 0, nitems = 0; TString16 firm, year, attprev("00000"); @@ -2075,8 +2077,8 @@ int TSystemisamfile::load( } TScanner f(from); - TToken_string s(1024, fs); bool fixedlen = (fs == '\0'); + TToken_string s(1024, fixedlen ? char(255) : fs); int nflds = curr().items(); TString_array fld(nflds); int len[MaxFields]; @@ -2266,6 +2268,8 @@ int TSystemisamfile::dump( rjust.set(j, t == _intfld || t == _longfld || t == _realfld || t == _wordfld || t == _intzerofld || t == _longzerofld); len[j] = (t == _datefld) ? 10 : curr().length(wfld); + if (fixedlen && t == _memofld) + return error_box("Non e' possibile scaricare a lunghezza fissa un file con campi memo"); } TRecnotype i = 0; // const TRecnotype nitems = nkey ? items() : filehnd()->d->EOD; diff --git a/mg/mglib.h b/mg/mglib.h index 52af2d61e..90436de1c 100755 --- a/mg/mglib.h +++ b/mg/mglib.h @@ -8,8 +8,8 @@ #include #endif -#ifndef __MSKSHEET_H -class TSheet_field; +#ifndef __MASK_H +#include #endif #ifndef __FORM_H diff --git a/mg/mglib02.cpp b/mg/mglib02.cpp index 74053ec79..f628b263d 100755 --- a/mg/mglib02.cpp +++ b/mg/mglib02.cpp @@ -11,7 +11,6 @@ #include "anamag.h" #include "mag.h" -#ifndef __CGLIB01_H #include "..\cg\cglib01.h" #include "..\ve\veconf.h" @@ -1085,7 +1084,7 @@ real TArticolo_giacenza::giacenza_corretta(const TRectype & rec ,bool giac_eff,b { giacenza += rec.get_real(MAG_INCL); giacenza -= rec.get_real(MAG_ACL); - giacenza += valorizza_componenti ? 0 : (rec.get_real(MAG_PRODFIN)-rec.get_real(MAG_PRODCOMP)); + giacenza += valorizza_componenti ? ZERO : (rec.get_real(MAG_PRODFIN)-rec.get_real(MAG_PRODCOMP)); } return giacenza; } diff --git a/mg/mglib02a.cpp b/mg/mglib02a.cpp index a1f9794fb..568108c42 100755 --- a/mg/mglib02a.cpp +++ b/mg/mglib02a.cpp @@ -20,76 +20,6 @@ // ********************* // movimenti di magazzino -// causali - -int TCausale_magazzino::sgn(TTipo_saldomag tiposaldo) -{ - static TString *segni=NULL; if (segni==NULL) segni=new TString80; - *segni=get("S2"); - switch (tiposaldo) - { - case s_giac: - return atoi(segni->mid(0,2)); - case s_acq: - return atoi(segni->mid(2,2)); - case s_ent: - return atoi(segni->mid(4,2)); - case s_ven: - return atoi(segni->mid(6,2)); - case s_usc: - return atoi(segni->mid(8,2)); - case s_ordc: - return atoi(segni->mid(10,2)); - case s_ordf: - return atoi(segni->mid(12,2)); - case s_incl: - return atoi(segni->mid(14,2)); - case s_acl: - return atoi(segni->mid(16,2)); - case s_prodc: - return atoi(segni->mid(18,2)); - case s_prodf: - return atoi(segni->mid(20,2)); - case s_rim: - return atoi(segni->mid(22,2)); - case s_scart: - return atoi(segni->mid(24,2)); - case s_label: - return atoi(segni->mid(26,2)); - case s_user1: - return atoi(segni->mid(28,2)); - case s_user2: - return atoi(segni->mid(30,2)); - case s_user3: - return atoi(segni->mid(32,2)); - case s_user4: - return atoi(segni->mid(34,2)); - case s_user5: - return atoi(segni->mid(36,2)); - case s_user6: - return atoi(segni->mid(38,2)); - default: - return 0; - } -} - -bool TCausale_magazzino::is_fiscale() -{ - return (tipomov()=='S' || tipomov()=='C' ); -} - - -TCausale_magazzino::TCausale_magazzino(const char * codice): - TRectype(LF_TABCOM) -{ - TTable f("%CAU"); - - settab("CAU"); - put("CODTAB", codice); - if (TRectype::read(f) != NOERR) - zero(); -} - // movimenti // dati della linea di movimento di magazzino class TLine_movmag : public TObject @@ -138,7 +68,7 @@ int TLine_movmag::operator==(TLine_movmag &l) // ******************************** // TMov_mag -TRecord_cache TMov_mag::cache_causali("%CAU"); +TRecord_cache TMov_mag::_cache_causali("%CAU"); TMov_mag::TMov_mag() : TMultiple_rectype(LF_MOVMAG), @@ -151,6 +81,12 @@ TMov_mag::~TMov_mag() { } +const TCausale_magazzino& TMov_mag::causale(const char* cod) const +{ + if (cod == NULL || *cod == '\0') + cod = get(MOVMAG_CODCAUS); + return (TCausale_magazzino&)_cache_causali.get(cod); +} void TMov_mag::zero(char c) { @@ -174,19 +110,11 @@ void TMov_mag::set_body_key(TRectype & rowrec) } -void TMov_mag::synchronize_bodies() +void TMov_mag::load_rows_file(int logicnum) { - TMultiple_rectype::synchronize_bodies(); - // reset delle strutture per il controlli delle variazioni dei saldi - if (autoload_enabled()) - { - _annoes=get(MOVMAG_ANNOES); - lines_to_add.destroy(); - lines_to_subtract.destroy(); - const int nrows = rows(); - for (int i = 1; i<= nrows; i++) - line_deleted(line2key(i), line2data(i)); - } + CHECK(logicnum==LF_RMOVMAG,"L'unico file collegabile ai movimenti sono le righe"); + TMultiple_rectype::load_rows_file(logicnum); + mark_current_lines(); } @@ -194,8 +122,10 @@ int TMov_mag::remove(TBaseisamfile& f) const { int res; if ((res=TMultiple_rectype::remove(f))==NOERR ) + { // effettua la variazione dei saldi ((TMov_mag *)this)->update_balances(); + } return res; } @@ -206,9 +136,12 @@ void TMov_mag::add_extrarows() const if (add_explrows()) add_autorows(); } + bool TMov_mag::add_autorows() const { bool added=FALSE; + TString16 codmag; + // aggiunge le righe automatiche for (int r = rows(); r > 0; r--) { @@ -217,11 +150,11 @@ bool TMov_mag::add_autorows() const TString16 codcaus(row.get(RMOVMAG_CODCAUS)); if (codcaus.empty()) codcaus=get(MOVMAG_CODCAUS); - TCausale_magazzino & cau=(TCausale_magazzino & )cache_causali.get(codcaus); + const TCausale_magazzino& cau = causale(codcaus); codcaus=cau.caus_collegata(); if (codcaus.not_empty()) { - TCausale_magazzino & cau_coll=(TCausale_magazzino & )cache_causali.get(codcaus); + const TCausale_magazzino& cau_coll = causale(codcaus); // if (!cau_coll.esplodente()) { // deve esserci una riga collegata @@ -229,8 +162,11 @@ bool TMov_mag::add_autorows() const { // manca, la inserisco TRectype * linea_auto = new TRectype(row); - const char * codmag = cau_coll.default_magdep(); - if (codmag != NULL) + + codmag = codmag_rauto(r); + if (codmag.empty()) + codmag = cau_coll.default_magdep(); + if (codmag.not_empty()) linea_auto->put(RMOVMAG_CODMAG, codmag); const char * prezzo = prezzo_rauto(r); if (prezzo != NULL) @@ -250,8 +186,10 @@ bool TMov_mag::add_autorows() const bool TMov_mag::add_explrows() const { TDistinta_tree distinta; + TArticolo articolo; TArray boom; bool added=FALSE; + // aggiunge le righe da explosione distinta for (int r = rows(); r > 0; r--) { @@ -260,15 +198,18 @@ bool TMov_mag::add_explrows() const TString16 codcaus(row.get(RMOVMAG_CODCAUS)); if (codcaus.empty()) codcaus=get(MOVMAG_CODCAUS); - TCausale_magazzino & cau=(TCausale_magazzino & )cache_causali.get(codcaus); + const TCausale_magazzino& cau = causale(codcaus); if (cau.esplodente() && !b[r].get_bool(RMOVMAG_ESPLOSA)) { // devono esserci n righe automatiche esplose //if (!b.exist(r + 1) || !b[r + 1].get_bool(RMOVMAG_ESPLOSA)) { + // mancano le righe, le inserisco + const char tipo_costo = cau.get("S11")[0]; + const int livello = cau.get_int("I0"); // mancano le righe, le inserisco distinta.set_root(row.get(RMOVMAG_CODART)); - distinta.explode(boom); + distinta.explode(boom, FALSE, RAGGR_EXP_NONE, livello, "A"); TString codmag(codmag_rauto(r)); real prezzo(prezzo_rauto(r)); TRectype * linea_auto; @@ -278,11 +219,17 @@ bool TMov_mag::add_explrows() const linea_auto = new TRectype(row); linea_auto->put(RMOVMAG_CODART, riga_esp.articolo()); linea_auto->put(RMOVMAG_UM, riga_esp.um()); - linea_auto->put(RMOVMAG_QUANT, riga_esp.val()*row.get_real(RMOVMAG_QUANT)); + linea_auto->put(RMOVMAG_QUANT, riga_esp.val()); if (codmag.not_empty()) linea_auto->put(RMOVMAG_CODMAG, codmag); - if (!prezzo.is_zero()) - linea_auto->put(RMOVMAG_PREZZO, prezzo); + //if (!prezzo.is_zero()) + articolo.read(riga_esp.articolo()); + if (tipo_costo == 'U') + prezzo = articolo.get_real(ANAMAG_ULTCOS1); + else + if (tipo_costo == 'S') + prezzo = articolo.get_real(ANAMAG_COSTSTD); + linea_auto->put(RMOVMAG_PREZZO, prezzo); linea_auto->put(RMOVMAG_NRIG, r+1+newrow); linea_auto->put(RMOVMAG_ESPLOSA, TRUE); //linea_auto->put(RMOVMAG_TIPORIGA, (char) riga_automatica); @@ -292,26 +239,28 @@ bool TMov_mag::add_explrows() const } } // ora ci sono, mi basta eliminare la riga "padre" - b.destroy_row(r,TRUE); + if (boom.items() > 0) + b.destroy_row(r,TRUE); } } // ciclo righe return added; } - int TMov_mag::write(TBaseisamfile& f) const { int res; add_extrarows(); - TMov_mag &myself=((TMov_mag &)*this); - - const int nrows = rows(); - - for (int i = 1; i <= nrows; i++) - myself.line_inserted(line2key(i), line2data(i)); if ((res=TMultiple_rectype::write(f))==NOERR ) - // effettua la variazione dei saldi + { + TMov_mag &myself=((TMov_mag &)*this); + + const int nrows = rows(); + + for (int i = 1; i <= nrows; i++) + myself.line_inserted(line2key(i), line2data(i)); + // effettua la variazione dei saldi myself.update_balances(); + } return res; } @@ -319,25 +268,33 @@ int TMov_mag::rewrite(TBaseisamfile& f) const { int res; add_extrarows(); - // memorizza le variazioni - - const int nrows = rows(); - - for (int i = 1; i <= nrows; i++) - ((TMov_mag *)this)->line_inserted(line2key(i), line2data(i)); if ((res=TMultiple_rectype::rewrite(f))==NOERR ) - // effettua la variazione dei saldi - ((TMov_mag *)this)->update_balances(); + { + TMov_mag &myself=((TMov_mag &)*this); + + const int nrows = rows(); + + for (int i = 1; i <= nrows; i++) + myself.line_inserted(line2key(i), line2data(i)); + // effettua la variazione dei saldi + myself.update_balances(); + } return res; } -const char *TMov_mag::get_next_key() +const char* TMov_mag::get_next_key() { static TString16 nextcod; TLocalisamfile f(LF_MOVMAG); f.last(); - int a=atoi(f.get(MOVMAG_NUMREG))+1; - return nextcod.format("%d",a); + long a = f.get_long(MOVMAG_NUMREG)+1; + return nextcod.format("%ld", a); +} + +bool TMov_mag::key_complete() +{ + const bool ok = head().get_long(MOVMAG_NUMREG) > 0L; + return ok; } //******* @@ -347,17 +304,8 @@ const char *TMov_mag::get_next_key() int TMov_mag::force_update_bal() { int res; - // reset delle strutture per il controlli delle variazioni dei saldi - _annoes=get(MOVMAG_ANNOES); - lines_to_add.destroy(); - lines_to_subtract.destroy(); - - // memorizza le variazioni - const int nrows = rows(); - - for (int i= 1; i <= nrows; i++) - line_inserted(line2key(i), line2data(i)); + mark_current_lines(FALSE); res=update_balances(); return res; } @@ -375,6 +323,7 @@ TLine_movmag & TMov_mag::line2data(int nrig) const return line; } + TToken_string & TMov_mag::line2key(int numriga) const { static TToken_string _key; @@ -399,13 +348,13 @@ TString TMov_mag::key2field(TToken_string &key,const char *fieldname) if (strcmp(fieldname,RMOVMAG_LIVGIAC)==0) return key.get(2); CHECKS(FALSE, "Nome di campo non appartenente al file righe mov ", fieldname); - return ""; + return EMPTY_STRING; } -int TMov_mag::line_inserted(TToken_string &k,TLine_movmag &r) +int TMov_mag::line_inserted(TToken_string &k, TLine_movmag &r) { - if (_annoes != get(MOVMAG_ANNOES)) + if (_annoes != get(MOVMAG_ANNOES) || _datacomp != get_date(MOVMAG_DATACOMP)) lines_to_add.add(k,r); else { @@ -419,9 +368,10 @@ int TMov_mag::line_inserted(TToken_string &k,TLine_movmag &r) return 0; } -int TMov_mag::line_deleted(TToken_string &k,TLine_movmag &r) + +int TMov_mag::line_deleted(TToken_string &k, TLine_movmag &r) { - if (_annoes != get(MOVMAG_ANNOES)) + if (_annoes != get(MOVMAG_ANNOES) || _datacomp != get_date(MOVMAG_DATACOMP)) lines_to_subtract.add(k,r); else { @@ -435,6 +385,24 @@ int TMov_mag::line_deleted(TToken_string &k,TLine_movmag &r) return 0; } + +void TMov_mag::mark_current_lines(const bool as_deleted) +{ + const int nrows = rows(); // lasciare la riga qui perchč comporta il caricamento del body + _annoes =get(MOVMAG_ANNOES); + _datacomp=get_date(MOVMAG_DATACOMP); + lines_to_add.destroy(); + lines_to_subtract.destroy(); + for (int i = 1; i<= nrows; i++) + { + if (as_deleted) + line_deleted(line2key(i), line2data(i)); + else + line_inserted(line2key(i), line2data(i)); + } +} + + bool TMov_mag::unlock_anamag(const char *codart) { TLocalisamfile anamag(LF_ANAMAG); @@ -487,14 +455,14 @@ int TMov_mag::update_balances() TString_array keys_to_add,keys_to_remove; - ((TMov_mag *)this)->lines_to_add.get_keys(keys_to_add); - ((TMov_mag *)this)->lines_to_subtract.get_keys(keys_to_remove); + /*((TMov_mag *)this)->*/lines_to_add.get_keys(keys_to_add); + /*((TMov_mag *)this)->*/lines_to_subtract.get_keys(keys_to_remove); // aggiunge i saldi nuovi keys_to_add.sort(); TToken_string * curr_key=(TToken_string *)keys_to_add.first_item(); - + int nriga=1; while (curr_key) { const TString cod(key2field(*curr_key,RMOVMAG_CODART)) ; @@ -503,11 +471,11 @@ int TMov_mag::update_balances() { // lock gained TLine_movmag & line_mov=(TLine_movmag &)lines_to_add[*curr_key]; - TCausale_magazzino & causmag=(TCausale_magazzino &)cache_causali.get(line_mov.codcaus()); + const TCausale_magazzino& causmag = causale(line_mov.codcaus()); if (causmag.update_ultcos()) { - curr_art.update_ultcosti(line_mov.prezzo(),get_date("DATACOMP")); + curr_art.update_ultcosti(line_mov.prezzo(),get_date("DATACOMP"), get_long("NUMREG"),nriga++); curr_art.rewrite(); } giac_putkey(mag,get(MOVMAG_ANNOES),*curr_key); @@ -570,6 +538,8 @@ int TMov_mag::update_balances() updated_bal=FALSE; curr_key=(TToken_string *)keys_to_remove.succ_item(); } + mark_current_lines(); + return updated_bal; } @@ -577,7 +547,7 @@ int TMov_mag::update_balances() // in base alla causale e alla modifica fatta (con segno + o -) int TMov_mag::update_balances(TRectype & magrec, const TLine_movmag &l,int rett_sign) { - TCausale_magazzino & caus=(TCausale_magazzino &)cache_causali.get(l.codcaus()); + const TCausale_magazzino& caus = causale(l.codcaus()); TLocalisamfile umart(LF_UMART); real diff,diff_val; @@ -640,7 +610,7 @@ void TMov_mag::update_balance(TRectype & magrec, const char * fieldname, real di HIDDEN TEsercizi_contabili _esercizi; -int TMov_mag::codice_esercizio(TDate &d) +int TMov_mag::codice_esercizio(const TDate &d) { return _esercizi.date2esc(d); } @@ -693,7 +663,7 @@ void copy_oldbalances(TRectype & oldmag,TRectype & mag) //********************** -bool rebuild_balances(const TString16 annoes, +bool rebuild_balances(const TString& annoes, const TTipo_valorizz tipo_valorizz, const char* catven, const char* codlis) { @@ -705,7 +675,7 @@ bool rebuild_balances(const TString16 annoes, TArticolo_giacenza * a_g= new TArticolo_giacenza; // record dell'articolo di magazzino rel2.lfile().set_curr(a_g); - int ok=TRUE; + bool ok=TRUE; // Aggiorna il cazzillo per caricare eventuali date di chiusura e altre amenita' simili _esercizi.update(); @@ -719,7 +689,7 @@ bool rebuild_balances(const TString16 annoes, const long maxart=cur2.objects(); information.format("Ricostruzione saldi esercizio %s: azzeramento...",(const char *)annoes); - TProgind barra_art(maxart,information, TRUE, TRUE, 60); + TProgind barra_art(maxart,information, FALSE, TRUE); for (long a=0; a r.rata()) return 1; // Numero maggiore else - if (_nrata < r.rata()); + if (_nrata < r.rata()) return -1; // Numero minore return 0; // Stesso numero di rata diff --git a/ve/sconti.h b/ve/sconti.h index 032a64a58..76a10d3c7 100755 --- a/ve/sconti.h +++ b/ve/sconti.h @@ -6,8 +6,7 @@ #endif #ifndef __VELIB_H -class TMask; -class TDocumento_mask; +#include "velib.h" #endif #ifndef __CONFIG_H diff --git a/ve/ve0.url b/ve/ve0.url index cc9a90ccd..be5531063 100755 --- a/ve/ve0.url +++ b/ve/ve0.url @@ -1,5 +1,5 @@ -#define APPNAME campo -#define QAPPNAME "campo" +#define APPNAME eurocamp +#define QAPPNAME "eurocampo" #define QFIRMNAME "A.G.A. Informatica Srl" #include diff --git a/ve/ve0100.cpp b/ve/ve0100.cpp index b82c6cea1..cb5a2085b 100755 --- a/ve/ve0100.cpp +++ b/ve/ve0100.cpp @@ -205,45 +205,6 @@ int TMotore_application::rewrite( const TMask& m ) // C 90 } // Riempie lo sheet con le righe documento specificate nel .ini -void TMotore_application::ini2mask(TConfig& ini, TMask& msk, bool query) -{ - TRelation_application::ini2mask(ini, msk, query); // Default processing - if (query) - { - } - else - { - TSheet_field& f = msk.sfield(F_SHEET); - TTipo_riga_documento tr; - - // Scorre tutti i pragrafi delle righe documento - for (int i = 1; ini.set_paragraph(format("%d,%d", LF_RIGHEDOC, i)); i++) - { - // Considera solo i tipi riga validi - const TString16 tipo = ini.get(RDOC_TIPORIGA); - if (tr.read(tipo) == NOERR) - { - // Crea una nuova riga documento - TRiga_documento& rec = _doc->new_row(tipo); - // Riempie i campi della nuova riga - TAssoc_array& var = ini.list_variables(); - FOR_EACH_ASSOC_STRING(var, obj, key, val) - { - if (stricmp(key, RDOC_NRIGA) != 0) // Ignora il numero riga - rec.put(key, val); - } - // solo la insert chiama la post_insert necessaria alla disabilitazione verifichiamo - // l'autoload ?? -// f.insert(-1, FALSE); - // Aggiunge la riga allo sheet - rec.autoload(f); - f.check_row(rec.numero()-1); - } - } - } -} - - void TMotore_application::open_files(int logicnum, ...) { va_list marker; diff --git a/ve/ve0100.h b/ve/ve0100.h index 89c808226..d3b92d92d 100755 --- a/ve/ve0100.h +++ b/ve/ve0100.h @@ -68,7 +68,6 @@ protected: void ini2mask(TConfig& ini, TMask& m, bool query); public: virtual TRelation* get_relation( ) const { return _rel;} - virtual bool get_next_key(TToken_string& key); // Funzioni di accesso alle variabili private @@ -84,13 +83,6 @@ public: virtual ~TMotore_application( ) { } virtual const char* get_next_key( ); - - const char tipocf( ) { return _tipocf; } - void tipocf( const char tcf ) { _tipocf = tcf; } - - TSheet_field & ss( ) const { return *_sheet; } - TMotore_application( ) { _pro = NULL; } - virtual ~TMotore_application( ) { if ( _pro ) delete _pro; } }; inline TMotore_application& app() { return (TMotore_application &) main_app(); } diff --git a/ve/ve0100b1.h b/ve/ve0100b1.h index 946812cde..3dab7cd2a 100755 --- a/ve/ve0100b1.h +++ b/ve/ve0100b1.h @@ -14,3 +14,4 @@ #define F_TIPOCF_ELAB 114 #define F_CODCF_ELAB 115 #define F_DATADOC_ELAB 116 +#define F_UPDATE_HEADER 117 diff --git a/ve/velib.h b/ve/velib.h index 6c1a573b2..30c17424f 100755 --- a/ve/velib.h +++ b/ve/velib.h @@ -346,8 +346,6 @@ public: TObject* dup() const { return new TTipo_riga_documento(codice()); } public: - int read(const char* tiporig); - const TString& profile_name() const { return _name;} const TString& mask_name() const { return profile_name();} const TString& codice() const { return get("CODTAB");} diff --git a/ve/velib02.cpp b/ve/velib02.cpp index 6e7ede444..03e4e70c0 100755 --- a/ve/velib02.cpp +++ b/ve/velib02.cpp @@ -2,8 +2,8 @@ #include #include -#include "sconti.h" #include "velib.h" +#include "sconti.h" #include "vepriv.h" #include "verig.h" #include "../mg/mglib.h" diff --git a/ve/velib03.cpp b/ve/velib03.cpp index 1e57698e0..634ae7451 100755 --- a/ve/velib03.cpp +++ b/ve/velib03.cpp @@ -4,9 +4,9 @@ #include #include -#include "sconti.h" #include "veini.h" #include "velib.h" +#include "sconti.h" #include "vepriv.h" #include "veuml.h" @@ -2621,7 +2621,7 @@ bool TDocumento::is_nota_credito() const TLocalisamfile rcaus(LF_RCAUSALI); TCausale c(codcaus, data().year()); const char sez = c.sezione_clifo(); - swap = (c.reg().iva() == iva_vendite) ^ sez == 'D'; + swap = ((c.reg().iva() == iva_vendite) ^ (sez == 'D')); } return swap; }