diff --git a/src/mr/mr0400.cpp b/src/mr/mr0400.cpp index d64891479..a68e3513b 100755 --- a/src/mr/mr0400.cpp +++ b/src/mr/mr0400.cpp @@ -191,7 +191,7 @@ bool TConf_MRP_application::user_create() bool TConf_MRP_application::user_destroy() { - return TConfig_application:user_destroy(); + return TConfig_application::user_destroy(); } int mr0400(int argc, char* argv[]) diff --git a/src/mr/mr0500.cpp b/src/mr/mr0500.cpp index 0724b432a..d613d6258 100755 --- a/src/mr/mr0500.cpp +++ b/src/mr/mr0500.cpp @@ -1,901 +1,905 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../ve/velib04.h" -#include "mr0500a.h" -#include "mr0500b.h" -#include "mr0500c.h" -#include "mrplib.h" - -/////////////////////////////////////////////////////////// -// TElabora_mask -/////////////////////////////////////////////////////////// -class TElabora_mask : public TAutomask -{ - -protected: - virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); - -public: - TElabora_mask() : TAutomask("mr0500c") { } -}; - -bool TElabora_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) -{ - return true; -} - -/////////////////////////////////////////////////////////// -// TLoadfile_mask -/////////////////////////////////////////////////////////// -class TLoadfile_mask : public TAutomask -{ - -protected: - virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); - -public: - TLoadfile_mask() : TAutomask("mr0500b") { } -}; - -bool TLoadfile_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) -{ - switch (o.dlg()) //eventi, tipo pressione dei tasti - { - case F_FILE: - if(e==fe_button) //se e (che é l'evento) = pressione del bottone 'cerca' (fe button) - { - TFilename fname=o.get(); //se il nome del file non esiste -> gli assegna automaticamente il nome - if(fname == "") //articoli.dat - fname = "articoli"; - fname.ext("dat"); - - DIRECTORY dir; xvt_fsys_get_dir(&dir); //funzioni di xvt (grafica); utilizzate per creare la finestra di ricerca del - - FILE_SPEC fs; xvt_fsys_convert_str_to_fspec(fname, &fs); - const bool good = xvt_dm_post_file_open(&fs, "Selezionare il file ...") == FL_OK; - - xvt_fsys_set_dir(&dir); - - if (good) - { - xvt_fsys_convert_dir_to_str(&fs.dir, fname.get_buffer(), fname.size()); //converte il nome della directory in una - fname.add(fs.name); //stringa aggiungendo il path del file - o.set(fname); //mostra il campo sul video (la funzione set) - } - - } - if(e==fe_init && o.get().empty()) - o.set("prod.dat"); - if(e==fe_close) //se e = alla pressione del bottone 'chiudi' (fe_close) controlla che il campo sia stato - { //riempito correttamente nella maschera - TFilename n = o.get(); - return n.exist(); - } - break; - default: - break; - } - return true; -} - -/////////////////////////////////////////////////////////// -// TRilprod_mask -/////////////////////////////////////////////////////////// -typedef enum TTipo_rec { _no_type = 0, _start = 1, _end = 2, _rett = 3}; - -class TRilprod_mask : public TAutomask -{ - -protected: - virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); - virtual bool on_key(KEY key); - -public: - void load_prod_file(const char * nomefile, bool savefile, bool only_errors, TArray & warn_perc, TString_array & warning); - void display_error(TViswin & v, const char * msg, TTracciato_record & t, TRecord_text & r); - void print_record(TViswin & v, TTipo_rec t , TProduzione & r); - TRilprod_mask(); - virtual ~TRilprod_mask() {} - -}; - -TRilprod_mask::TRilprod_mask() : TAutomask("mr0500a") -{ - enable(F_DATALOG, main_app().has_module(POAUT, CHK_DONGLE)); - sfield(F_TEMPI).set_append(false); -} - -bool TRilprod_mask::on_key(KEY key) -{ - //shift+f12 per abilitare il riquadro della bolla di produzione - if (key == K_SHIFT + K_F12) - { - enable(-GR_BOLPROD); - return true; - } - return TAutomask::on_key(key); -} - -bool TRilprod_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) -{ - bool ok = true; - switch (o.dlg()) - { - case F_TEMPI: - if (e == se_notify_add || e == se_notify_del) - { - TSheet_field & sh = (TSheet_field &)o; - TMask_field & q = field(F_QTA); - TMask_field & s = field(F_SCARTO); - const int items = sh.items(); - const bool enable = items == 0; - - if (enable) - { - q.enable(); q.reset(); - s.enable(); s.reset(); - } - else - { - q.disable(); - s.disable(); - } - } - else - if (e == se_leave) - { - TSheet_field & sh = (TSheet_field &)o; - TMask_field & q = field(F_QTA); - TMask_field & s = field(F_SCARTO); - const int items = sh.items(); - if (items > 0) - { - real qta; - real scarto; - - for (int i = 0; i < items; i++) - { - TToken_string & r = sh.row(i); - - qta += (real)r.get(sh.cid2index(FS_QTA)); - scarto += (real)r.get(sh.cid2index(FS_SCARTO)); - } - q.set(qta.string()); - s.set(scarto.string()); - } - } - break; - case FS_ORAINI : - case FS_MININI : - case FS_SECINI : - case FS_ORAFIN : - case FS_MINFIN : - case FS_SECFIN : - if (e == fe_modify || e == fe_close) - { - //i campi ore/min/sec vanno zero filled - TString8 stringa; - if (o.get().not_empty()) - { - int numero = atoi(o.get()); - stringa.format("%02d", numero); - o.set(stringa); - } - } - break; - case H_PROG : - if (e == fe_modify && key_valid(1)) - stop_run(K_AUTO_ENTER); - break; - case DLG_ELABORA : - if (e == fe_button) - { - TElabora_mask m; - - if (m.run() == K_ENTER) - { - TConsuntivazione_produzione c(m.get(F_CODICE_EL)); - TLista_documenti docs; - TDate d(m.get(F_DATA_EL)); - - if (c.elabora(docs, docs, d, true)) - docs[0].rewrite(); - } - } - break; - case F_DATALOG : - if (e == fe_button) - { - TLoadfile_mask m; - TArray warn_perc; - TString_array warning; - - if (m.run() == K_ENTER) - { - short dlg = F_PERC1; - for (int i = 0; i < 4; i++) - { - const real perc(m.get(dlg++)); - warn_perc.add(perc); - const TString & s = m.get(dlg++); - warning.add(s); - } - load_prod_file(m.get(F_FILE), m.get_bool(F_SAVE), m.get_bool(F_ONLY_ERRORS), warn_perc, warning); - } - } - default: - break; - } - return ok; -} - -void TRilprod_mask::display_error(TViswin & v, const char * msg, TTracciato_record & t, TRecord_text & r) -{ - TString riga; - const int nfields = t.tracciati_campo().items(); - - v.add_line(""); - v.add_line(format(FR("Errore : %s"), msg)); - TString l; - for (int f = 0; f < nfields; f++) - { - const TTracciato_campo & c = t.get(f); - const TString & name = c.name(); - TString val(r.get(f)); - TString s; - - val.trim(); - s.format(" %s = %s", (const char *) name, (const char *) val); - - if (l.len() + s.len() > 80) - { - v.add_line(l); - l.cut(0); - } - l << s; - } - if (l.not_empty()) - v.add_line(l); -} - -void TRilprod_mask::print_record(TViswin & v, TTipo_rec t , TProduzione & r) -{ - TString riga; - const int nfields = r.rec_des().NFields; - - v.add_line(""); - if (t == _start) - v.add_line(TR("Record elaborato - inizio produzione")); else - if (t == _end) - v.add_line(TR("Record elaborato - fine produzione")); else - if (t == _rett) - v.add_line(TR("Record elaborato - rettifica")); - TString l; - for (int i = 0; i < nfields; i++) - { - const TString & name = r.fieldname(i); - const TString & val = r.get(name); - TString s; - s.format(" %s = %s", (const char*)name, (const char*)val); - if (l.len() + s.len() > 80) - { - v.add_line(l); - l.cut(0); - } - l << s; - } - if (l.full()) - v.add_line(l); -} - -void TRilprod_mask::load_prod_file(const char* nomefile, bool savefile, bool only_errors, TArray & warn_perc, TString_array & warning) -{ - TViswin vwin(NULL, TR("Importazione produzione"), FALSE, TRUE, TRUE); - TFile_text prod(nomefile,"mr0500a.ini"); //crea un oggetto articoli di tipo TFile_text - TRecord_text rec; //crea un record vuoto con nome articolocor - TTracciato_record & trec = *(prod.t_rec("")); - const int nfields = trec.tracciati_campo().items(); - int type_field = 0; - int ord_field = 0; - int cod_field = 0; - TProduzione prd; - TLocalisamfile rigaord(LF_RIGHEDOC); - TString val; - TString codart; - TLocalisamfile fp(LF_RILPROD); - TRectype cmp(fp.curr()); - const long max = fsize(nomefile); - TProgind p(max, format(FR("Importazione produzione : file %s"), nomefile)); - - for (int f = 0; f < nfields; f++) - { - const TTracciato_campo & c = trec.get(f); - const TString name = c.name(); - - if (name == "TIPO") - type_field = f; - else - if (name == "ORDINE") - ord_field = f; - else - if (name == "CODART") - cod_field = f; - } - vwin.open_modal(); - prod.open(); //applico il metodo open che apre il file in lettura (contenuta in TFile_text) - while(prod.ok_r()) //ok_r é una funzione che indica la fine del file - { - if(prod.read(rec) == NOERR) - { - const TTipo_rec tipo = (TTipo_rec) atoi(rec.get(type_field)); - - p.setstatus((long)prod.read_file()->tellg()); - if (tipo == _no_type) - { - display_error(vwin, TR("Tipo record non valido - record scartato"), trec, rec); - continue; - } - - const TString ordval(rec.get(ord_field)); - - if (ordval.blank()) - { - display_error(vwin, TR("Record vuoto - record scartato"), trec, rec); - continue; - } - if (ordval.find('.') < 0) - { - display_error(vwin, TR("Riga ordine errata - record scartato"), trec, rec); - continue; - } - - TToken_string ord(ordval, '.'); ord.trim(); - const TString codnum(ord.get(0)); - const int anno = ord.get_int(); - const int ndoc = ord.get_long(); - const int nriga = ord.get_int(); - TDate d; - TString h; - real qta; - real scarto; - TString operatore; - - - rigaord.zero(); - rigaord.put("CODNUM", codnum); - rigaord.put("ANNO", anno); - rigaord.put("PROVV", "D"); - rigaord.put("NDOC", ndoc); - rigaord.put("NRIGA", nriga); - - codart.cut(0); - TDate datao(TODAY); - - if (rigaord.read(_isequal) != NOERR) - display_error(vwin, TR("Riga ordine inesistente"), trec, rec); - else - { - codart = rigaord.get("CODART"); - TToken_string key; - key.add("D"); - key.add(anno); - key.add(codnum); - key.add(ndoc); - - const TRectype & doc = cache().get(LF_DOC, key); - datao = doc.get_date("DATADOC"); - } - TString codart_new(rec.get(cod_field)); - - codart_new.trim(); - codart_new.replace('-', '_'); - const int err = prd.read_ordp(codnum, anno, 'D', ndoc, nriga); - TDate datarec; - bool nuovo = (err != NOERR); - if (!nuovo) - { - fp.setkey(4); - cmp.zero(); - cmp.put("CODNUM", codnum); - cmp.put("ANNO", anno); - cmp.put("PROVV", "D"); - cmp.put("NDOC", ndoc); - cmp.put("NRIGA", nriga); - fp.curr() = cmp; - if (codart_new.not_empty()) - { - nuovo = true; - for (int err = fp.read(); (err == NOERR) && (fp.curr() == cmp); err = fp.next()) - { - if (codart_new == fp.get("CODART")) - { - nuovo = false; - datarec = fp.get_date("DATA"); - break; - } - } - } - else - { - TRecnotype r = -1L; - for (int err = fp.read(); (err == NOERR) && (fp.curr() == cmp); err = fp.next()) - { - const TRecnotype pos = fp.recno(); - if (r < pos) - r = pos; - } - if (r >= 0L) - { - fp.readat(r); - codart_new = fp.curr().get("CODART"); - datarec = fp.get_date("DATA"); - } - } - } - if (codart_new.empty()) - { - display_error(vwin, TR("Articolo nullo - record scartato"), trec, rec); - continue; - } - else - { - const TRectype & anamag = cache().get(LF_ANAMAG, codart_new); - - if (anamag.empty()) - { - display_error(vwin, TR("Articolo inesistente - record scartato"), trec, rec); - continue; - } - } - - if (nuovo) - { - prd.zero(); - prd.put("CODNUM", codnum); - prd.put("ANNO", anno); - prd.put("PROVV", "D"); - prd.put("NDOC", ndoc); - prd.put("NRIGA", nriga); - prd.put("DATA", datao); - } - else - prd.read_art(codart_new, datarec, 0); - - for (int f = 0; f < nfields; f++) - { - const TTracciato_campo & c = trec.get(f); - const TString name = c.name(); - - val = rec.get(f); - val.trim(); - - if (!val.empty() || tipo == _rett) - { - if (name == "TIPO" || name == "ORDINE") - continue; - else - if (name == "DATA") - { - if (val.len() == 8) - val.insert("20", 6); - d = val; - } - else - if (name == "ORA") - { - h = val.left(2); - h << val.mid(3, 2) << val.right(2); - } - else - if (name == "QTA") - qta = (real) val; - else - if (name == "SCARTO") - scarto = (real) val; - else - { - if (name == "CODART") - val.replace('-', '_'); - prd.put(name, val); - if (name == "OPERATORE") - operatore = val; - } - } - - } - if (prd.get("IMPIANTO").empty()) - { - const TString16 linea(prd.get("LINEA")); - if (linea.not_empty()) - { - const TLinea_prod lp(linea); - const TString16 imp(lp.codimp()); - if (imp.not_empty()) - prd.put("IMPIANTO", imp); - } - } - if (!only_errors) - print_record(vwin, tipo, prd); - if (tipo == _start) - { - const int rows = prd.body().rows(); - bool found = false; - bool seq_err = false; - - for (int i = 1; !found && i <= rows; i++) - { - const TRectype & row = prd.body()[i]; - found = d == row.get_date("DATAINI") && h == row.get("ORAINI"); - if (row.get("DATAFINE").empty()) - seq_err = true; - } - if (seq_err) - display_error(vwin, TR("Inizio senza fine precedente"), trec, rec); - if (!found) - { - TRectype & row = prd.body().row(rows + 1, true); - row.put("DATAINI", d); - row.put("ORAINI", h); - row.put("OPERATORE", operatore); - } - if (nuovo) - prd.write(); - else - prd.rewrite(); - } - else - if (tipo == _end) - { - const int rows = prd.body().rows(); - bool found = false; - - int i; - for (i = rows; i > 0; i--) - { - const TRectype & row = prd.body()[i]; - found = (d == row.get_date("DATAFINE") && h == row.get("ORAFINE")) || - row.get("DATAFINE").empty(); - if (found) - break; - } - if (!found) - { - TRectype & row = prd.body().row(rows + 1, true); - i = rows + 1; - display_error(vwin, TR("Fine senza inizio"), trec, rec); - } - TRectype & row = prd.body()[i]; - - row.put("DATAFINE", d); - row.put("ORAFINE", h); - - real diff = qta - row.get_real("QTA"); - real tot = prd.get_real("QTA") + diff; - - row.put("QTA", qta); - prd.put("QTA", tot); - diff = scarto - row.get_real("SCARTO"); - tot = prd.get_real("SCARTO") + diff; - row.put("SCARTO", scarto); - prd.put("SCARTO", tot); - prd.rewrite(); - } - else - { - const int rows = prd.body().rows(); - - for (int i = 1; i <= rows; i++) - { - TRectype & row = prd.body()[i]; - if (i < rows) - { - row.zero("QTA"); - row.zero("SCARTO"); - } - else - { - row.put("QTA", qta); - row.put("SCARTO", scarto); - } - } - prd.put("QTA", qta); - prd.put("SCARTO", scarto); - prd.rewrite(); - } - - if (tipo > _start) // Controllo lo scarto solo dopo _start - { - const real tot(prd.get_real("QTA") + prd.get_real("SCARTO")); - if (tot > ZERO) - { - real perc = prd.get_real("SCARTO") * CENTO / tot; - perc.round(2); - for (int j = 3; j >= 0; j--) - { - if ((const real&)warn_perc[j] > ZERO && perc > (const real&)warn_perc[j]) - { - TString warn; - warn.format("@b%s - percentuale %s", (const char *) warning.row(j), perc.string()); - display_error(vwin, warn, trec, rec); - break; - } - } - } - } - } - } - prod.close(); - if (savefile) - { - TFilename dest(nomefile); - dest = dest.path(); - TString filemask(dest); - TString_array arr; - TDate filedate(TODAY); - int cnt = 0; - - filemask << format("pr%02d%02d*.dat", filedate.month(), filedate.day()); - list_files(filemask, arr); - - const int items = arr.items(); - if (items > 0) - { - arr.sort(); - cnt = atoi(arr.row(items - 1).right(5)); - } - cnt++; - - dest << format("pr%02d%02d%02d.dat", filedate.month(), filedate.day(), cnt); - if (fcopy(nomefile, dest)) - remove_file(nomefile); - - } - vwin.close_print(); - vwin.close_modal(); - KEY k = vwin.run(); - if (k == K_CTRL+'S') // Ho premuto Stampa - printer().print_txt(vwin.text()); -} - -/////////////////////////////////////////////////////////// -// TRilprod_app -/////////////////////////////////////////////////////////// - -class TRilprod_app : public TRelation_application -{ - TRelation* _rel; - TRilprod_mask* _msk; - - virtual int read( TMask& m ); - virtual int write( const TMask& m ); - virtual int rewrite( const TMask& m ); - virtual bool remove(); - -protected: - virtual TMask* get_mask(int) { return _msk; } - virtual TRelation* get_relation() const { return _rel; } - virtual bool user_create(); - virtual bool user_destroy(); - virtual void init_insert_mode(TMask& m); - virtual void init_modify_mode(TMask& m); - virtual bool changing_mask (int) {return false; } - virtual bool get_next_key(TToken_string& key); -}; - -void TRilprod_app::init_insert_mode(TMask& m) -{ - m.disable(-GR_BOLPROD); - m.field(F_QTA).enable(); - m.field(F_SCARTO).enable(); -} - -void TRilprod_app::init_modify_mode(TMask& m) -{ - m.disable(-GR_BOLPROD); -} - -bool TRilprod_app::user_create() -{ - _rel = new TRelation(LF_RILPROD); - _msk = new TRilprod_mask(); - return true; -} - -bool TRilprod_app::user_destroy() -{ - if (_msk != NULL) - delete _msk; - if (_rel != NULL) - delete _rel; - return true; -} - -bool TRilprod_app::get_next_key(TToken_string& key) -{ - TMask& m = curr_mask( ); - - if (m.get(F_CODART).empty() || m.get(F_DATA).empty()) - return false; - - TProduzione p; - - int n = 0; - - TLocalisamfile ril(LF_RILPROD); - TRectype& curr = ril.curr(); - - curr.put("CODART", m.get(F_CODART)); - curr.put("DATA", m.get_date(F_DATA)); - curr.put("PROG", 999); - - const int err = ril.read(_isgreat); - - if (err != _isemptyfile) - { - if (err == NOERR) - ril.prev(); - if (curr.get("CODART") == m.get(F_CODART) && - curr.get("DATA") == m.get_date(F_DATA)) - n = curr.get_int("PROG"); - } - - n++; - - key.format("%d|%d", F_PROG, n); - return true; -} - -int TRilprod_app::read( TMask& m ) -{ - TProduzione p; - int err = TRelation_application::read(m); - - if (err != NOERR) - return err; - p.TMultiple_rectype::read(_rel->curr()); - - const int rows = p.body().rows(); - TSheet_field & sh = m.sfield(F_TEMPI); - - sh.reset(); - for (int i = 0 ; i < rows; i++) - { - TToken_string & r = sh.row(i); - const TRectype & row = p.body()[i + 1]; - r.add(row.get("DATAINI")); - const TString & oraini = row.get("ORAINI"); - r.add(oraini.left(2)); - r.add(oraini.mid(2, 2)); - r.add(oraini.right(2)); - r.add(row.get("DATAFINE")); - const TString & orafin = row.get("ORAFINE"); - r.add(orafin.left(2)); - r.add(orafin.mid(2, 2)); - r.add(orafin.right(2)); - r.add(row.get("QTA")); - r.add(row.get("SCARTO")); - r.add(row.get("OPERATORE")); - sh.check_row(i); - } - - const bool on = m.sfield(F_TEMPI).items() == 0; - - m.field(F_QTA).enable(on); - m.field(F_SCARTO).enable(on); - return NOERR; -} - -int TRilprod_app::write( const TMask& m ) -{ - TProduzione p; - TSheet_field & sh = m.sfield(F_TEMPI); - const int rows = sh.items(); - - p.zero(); - m.autosave(*_rel); - p.head() = _rel->curr(); - for (int i = 0 ; i < rows; i++) - { - TToken_string & r = sh.row(i); - TRectype & row = p.body().row(i + 1, true); - - row.put("DATAINI", r.get(0)); - TString8 ora(r.get()); - TString8 w(r.get()); - if (w.blank()) - w = "00"; - ora << w; - w = r.get(); - if (w.blank()) - w = "00"; - ora << w; - row.put("ORAINI", ora); - row.put("DATAFINE", r.get()); - ora = r.get(); - w = r.get(); - if (w.blank()) - w = "00"; - ora << w; - w = r.get(); - if (w.blank()) - w = "00"; - ora << w; - row.put("ORAFINE", ora); - row.put("QTA", r.get()); - row.put("SCARTO", r.get()); - row.put("OPERATORE", r.get()); - } - const int err = p.write(); - - _rel->curr() = p.head(); - _rel->read(); - return err; -} - -int TRilprod_app::rewrite( const TMask& m ) -{ - TProduzione p; - TSheet_field & sh = m.sfield(F_TEMPI); - const int rows = sh.items(); - - m.autosave(*_rel); - p.TMultiple_rectype::read(_rel->curr()); - p.head() = _rel->curr(); - p.destroy_rows(); - for (int i = 0 ; i < rows; i++) - { - TToken_string & r = sh.row(i); - TRectype & row = p.body().row(i + 1, true); - - row.put("DATAINI", r.get(0)); - TString16 ora(r.get()); - TString8 w(r.get()); - if (w.blank()) - w = "00"; - ora << w; - w = r.get(); - if (w.blank()) - w = "00"; - ora << w; - row.put("ORAINI", ora); - row.put("DATAFINE", r.get()); - ora = r.get(); - w = r.get(); - if (w.blank()) - w = "00"; - ora << w; - w = r.get(); - if (w.blank()) - w = "00"; - ora << w; - row.put("ORAFINE", ora); - row.put("QTA", r.get()); - row.put("SCARTO", r.get()); - row.put("OPERATORE", r.get()); - } - return p.rewrite(); -} - -bool TRilprod_app::remove() -{ - TProduzione p; - - _msk->autosave(*_rel); - p.TMultiple_rectype::read(_rel->curr()); - return p.remove() == NOERR; -} - -int mr0500(int argc, char* argv[]) -{ - TRilprod_app app; - app.run(argc, argv, TR("Rilevazione Produzione")); - return 0; -} +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../ve/velib04.h" +#include "mr0500a.h" +#include "mr0500b.h" +#include "mr0500c.h" +#include "mrplib.h" + +/////////////////////////////////////////////////////////// +// TElabora_mask +/////////////////////////////////////////////////////////// +class TElabora_mask : public TAutomask +{ + +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +public: + TElabora_mask() : TAutomask("mr0500c") { } +}; + +bool TElabora_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + return true; +} + +/////////////////////////////////////////////////////////// +// TLoadfile_mask +/////////////////////////////////////////////////////////// +class TLoadfile_mask : public TAutomask +{ + +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +public: + TLoadfile_mask() : TAutomask("mr0500b") { } +}; + +bool TLoadfile_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) //eventi, tipo pressione dei tasti + { + case F_FILE: + if(e==fe_button) //se e (che é l'evento) = pressione del bottone 'cerca' (fe button) + { + TFilename fname=o.get(); //se il nome del file non esiste -> gli assegna automaticamente il nome + if(fname == "") //articoli.dat + fname = "articoli"; + fname.ext("dat"); + + DIRECTORY dir; xvt_fsys_get_dir(&dir); //funzioni di xvt (grafica); utilizzate per creare la finestra di ricerca del + + FILE_SPEC fs; xvt_fsys_convert_str_to_fspec(fname, &fs); + const bool good = xvt_dm_post_file_open(&fs, "Selezionare il file ...") == FL_OK; + + xvt_fsys_set_dir(&dir); + + if (good) + { + xvt_fsys_convert_dir_to_str(&fs.dir, fname.get_buffer(), fname.size()); //converte il nome della directory in una + fname.add(fs.name); //stringa aggiungendo il path del file + fname.ext("dat"); + o.set(fname); //mostra il campo sul video (la funzione set) + } + + } + if(e==fe_init && o.get().empty()) + o.set("prod.dat"); + if(e==fe_close) //se e = alla pressione del bottone 'chiudi' (fe_close) controlla che il campo sia stato + { //riempito correttamente nella maschera + TFilename n = o.get(); + return n.exist(); + } + break; + default: + break; + } + return true; +} + +/////////////////////////////////////////////////////////// +// TRilprod_mask +/////////////////////////////////////////////////////////// +typedef enum TTipo_rec { _no_type = 0, _start = 1, _end = 2, _rett = 3}; + +class TRilprod_mask : public TAutomask +{ + +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + virtual bool on_key(KEY key); + +public: + void load_prod_file(const char * nomefile, bool savefile, bool only_errors, TArray & warn_perc, TString_array & warning); + void display_error(TViswin & v, const char * msg, TTracciato_record & t, TRecord_text & r); + void print_record(TViswin & v, TTipo_rec t , TProduzione & r); + TRilprod_mask(); + virtual ~TRilprod_mask() {} + +}; + +TRilprod_mask::TRilprod_mask() : TAutomask("mr0500a") +{ + enable(F_DATALOG, main_app().has_module(POAUT, CHK_DONGLE)); + sfield(F_TEMPI).set_append(false); +} + +bool TRilprod_mask::on_key(KEY key) +{ + //shift+f12 per abilitare il riquadro della bolla di produzione + if (key == K_SHIFT + K_F12) + { + enable(-GR_BOLPROD); + return true; + } + return TAutomask::on_key(key); +} + +bool TRilprod_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + bool ok = true; + switch (o.dlg()) + { + case F_TEMPI: + if (e == se_notify_add || e == se_notify_del) + { + TSheet_field & sh = (TSheet_field &)o; + TMask_field & q = field(F_QTA); + TMask_field & s = field(F_SCARTO); + const int items = sh.items(); + const bool enable = items == 0; + + if (enable) + { + q.enable(); q.reset(); + s.enable(); s.reset(); + } + else + { + q.disable(); + s.disable(); + } + } + else + if (e == se_leave) + { + TSheet_field & sh = (TSheet_field &)o; + TMask_field & q = field(F_QTA); + TMask_field & s = field(F_SCARTO); + const int items = sh.items(); + if (items > 0) + { + real qta; + real scarto; + + for (int i = 0; i < items; i++) + { + TToken_string & r = sh.row(i); + + qta += (real)r.get(sh.cid2index(FS_QTA)); + scarto += (real)r.get(sh.cid2index(FS_SCARTO)); + } + q.set(qta.string()); + s.set(scarto.string()); + } + } + break; + case FS_ORAINI : + case FS_MININI : + case FS_SECINI : + case FS_ORAFIN : + case FS_MINFIN : + case FS_SECFIN : + if (e == fe_modify || e == fe_close) + { + //i campi ore/min/sec vanno zero filled + TString8 stringa; + if (o.get().not_empty()) + { + int numero = atoi(o.get()); + stringa.format("%02d", numero); + o.set(stringa); + } + } + break; + case H_PROG : + if (e == fe_modify && key_valid(1)) + stop_run(K_AUTO_ENTER); + break; + case DLG_ELABORA : + if (e == fe_button) + { + TElabora_mask m; + + if (m.run() == K_ENTER) + { + TConsuntivazione_produzione c(m.get(F_CODICE_EL)); + TLista_documenti docs; + TDate d(m.get(F_DATA_EL)); + + if (c.elabora(docs, docs, d, true)) + docs[0].rewrite(); + } + } + break; + case F_DATALOG : + if (e == fe_button) + { + TLoadfile_mask m; + TArray warn_perc; + + TString_array warning; + + if (m.run() == K_ENTER) + { + short dlg = F_PERC1; + for (int i = 0; i < 4; i++) + { + const real perc(m.get(dlg++)); + warn_perc.add(perc); + const TString & s = m.get(dlg++); + warning.add(s); + } + load_prod_file(m.get(F_FILE), m.get_bool(F_SAVE), m.get_bool(F_ONLY_ERRORS), warn_perc, warning); + } + } + default: + break; + } + return ok; +} + +void TRilprod_mask::display_error(TViswin & v, const char * msg, TTracciato_record & t, TRecord_text & r) +{ + TString riga; + const int nfields = t.tracciati_campo().items(); + + v.add_line(""); + v.add_line(format(FR("Errore : %s"), msg)); + TString l; + for (int f = 0; f < nfields; f++) + { + const TTracciato_campo & c = t.get(f); + const TString & name = c.name(); + TString val(r.get(f)); + TString s; + + val.trim(); + s.format(" %s = %s", (const char *) name, (const char *) val); + + if (l.len() + s.len() > 80) + { + v.add_line(l); + l.cut(0); + } + l << s; + } + if (l.not_empty()) + v.add_line(l); +} + +void TRilprod_mask::print_record(TViswin & v, TTipo_rec t , TProduzione & r) +{ + TString riga; + const int nfields = r.rec_des().NFields; + + v.add_line(""); + if (t == _start) + v.add_line(TR("Record elaborato - inizio produzione")); + else + if (t == _end) + v.add_line(TR("Record elaborato - fine produzione")); + else + if (t == _rett) + v.add_line(TR("Record elaborato - rettifica")); + TString l; + for (int i = 0; i < nfields; i++) + { + const TString & name = r.fieldname(i); + const TString & val = r.get(name); + TString s; + s.format(" %s = %s", (const char*)name, (const char*)val); + if (l.len() + s.len() > 80) + { + v.add_line(l); + l.cut(0); + } + l << s; + } + if (l.full()) + v.add_line(l); +} + +void TRilprod_mask::load_prod_file(const char* nomefile, bool savefile, bool only_errors, TArray & warn_perc, TString_array & warning) +{ + TViswin vwin(NULL, TR("Importazione produzione"), FALSE, TRUE, TRUE); + TFile_text prod(nomefile,"mr0500a.ini"); //crea un oggetto articoli di tipo TFile_text + TRecord_text rec; //crea un record vuoto con nome articolocor + TTracciato_record & trec = *(prod.t_rec("")); + const int nfields = trec.tracciati_campo().items(); + int type_field = 0; + int ord_field = 0; + int cod_field = 0; + TProduzione prd; + TLocalisamfile rigaord(LF_RIGHEDOC); + TString val; + TString codart; + TLocalisamfile fp(LF_RILPROD); + TRectype cmp(fp.curr()); + const long max = fsize(nomefile); + TProgind p(max, format(FR("Importazione produzione : file %s"), nomefile)); + + for (int f = 0; f < nfields; f++) + { + const TTracciato_campo & c = trec.get(f); + const TString name = c.name(); + + if (name == "TIPO") + type_field = f; + else + if (name == "ORDINE") + ord_field = f; + else + if (name == "CODART") + cod_field = f; + } + vwin.open_modal(); + prod.open(); //applico il metodo open che apre il file in lettura (contenuta in TFile_text) + while(prod.ok_r()) //ok_r é una funzione che indica la fine del file + { + if(prod.read(rec) == NOERR) + { + const TTipo_rec tipo = (TTipo_rec) atoi(rec.get(type_field)); + + p.setstatus((long)prod.read_file()->tellg()); + if (tipo == _no_type) + { + display_error(vwin, TR("Tipo record non valido - record scartato"), trec, rec); + continue; + } + + const TString ordval(rec.get(ord_field)); + + if (ordval.blank()) + { + display_error(vwin, TR("Record vuoto - record scartato"), trec, rec); + continue; + } + if (ordval.find('.') < 0) + { + display_error(vwin, TR("Riga ordine errata - record scartato"), trec, rec); + continue; + } + + TToken_string ord(ordval, '.'); ord.trim(); + const TString codnum(ord.get(0)); + const int anno = ord.get_int(); + const int ndoc = ord.get_long(); + const int nriga = ord.get_int(); + TDate recdate; + TString rechour; + real qta; + real scarto; + TString operatore; + + + rigaord.zero(); + rigaord.put("CODNUM", codnum); + rigaord.put("ANNO", anno); + rigaord.put("PROVV", "D"); + rigaord.put("NDOC", ndoc); + rigaord.put("NRIGA", nriga); + + codart.cut(0); + TDate datao(TODAY); + + if (rigaord.read(_isequal) != NOERR) + display_error(vwin, TR("Riga ordine inesistente"), trec, rec); + else + { + codart = rigaord.get("CODART"); + TToken_string key; + key.add("D"); + key.add(anno); + key.add(codnum); + key.add(ndoc); + + const TRectype & doc = cache().get(LF_DOC, key); + datao = doc.get_date("DATADOC"); + } + TString codart_new(rec.get(cod_field)); + + codart_new.trim(); + codart_new.replace('-', '_'); + const int err = prd.read_ordp(codnum, anno, 'D', ndoc, nriga); + TDate datarec; + bool nuovo = (err != NOERR); + if (!nuovo) + { + fp.setkey(4); + cmp.zero(); + cmp.put("CODNUM", codnum); + cmp.put("ANNO", anno); + cmp.put("PROVV", "D"); + cmp.put("NDOC", ndoc); + cmp.put("NRIGA", nriga); + fp.curr() = cmp; + if (codart_new.not_empty()) + { + nuovo = true; + for (int err = fp.read(); (err == NOERR) && (fp.curr() == cmp); err = fp.next()) + { + if (codart_new == fp.get("CODART")) + { + nuovo = false; + datarec = fp.get_date("DATA"); + break; + } + } + } + else + { + TRecnotype r = -1L; + for (int err = fp.read(); (err == NOERR) && (fp.curr() == cmp); err = fp.next()) + { + const TRecnotype pos = fp.recno(); + if (r < pos) + r = pos; + } + if (r >= 0L) + { + fp.readat(r); + codart_new = fp.curr().get("CODART"); + datarec = fp.get_date("DATA"); + } + } + } + if (codart_new.empty()) + { + display_error(vwin, TR("Articolo nullo - record scartato"), trec, rec); + continue; + } + else + { + const TRectype & anamag = cache().get(LF_ANAMAG, codart_new); + + if (anamag.empty()) + { + display_error(vwin, TR("Articolo inesistente - record scartato"), trec, rec); + continue; + } + } + + if (nuovo) + { + prd.zero(); + prd.put("CODNUM", codnum); + prd.put("ANNO", anno); + prd.put("PROVV", "D"); + prd.put("NDOC", ndoc); + prd.put("NRIGA", nriga); + prd.put("DATA", datao); + } + else + prd.read_art(codart_new, datarec, 0); + + for (int f = 0; f < nfields; f++) + { + const TTracciato_campo & c = trec.get(f); + const TString name = c.name(); + + val = rec.get(f); + val.trim(); + + if (!val.empty() || tipo == _rett) + { + if (name == "TIPO" || name == "ORDINE") + continue; + else + if (name == "DATA") + { + if (val.len() == 8) + val.insert("20", 6); + recdate = val; + } + else + if (name == "ORA") + { + rechour = val.left(2); + rechour << val.mid(3, 2) << val.right(2); + } + else + if (name == "QTA") + qta = (real) val; + else + if (name == "SCARTO") + scarto = (real) val; + else + { + if (name == "CODART") + val.replace('-', '_'); + prd.put(name, val); + if (name == "OPERATORE") + operatore = val; + } + } + + } + if (prd.get("IMPIANTO").empty()) + { + const TString16 linea(prd.get("LINEA")); + if (linea.not_empty()) + { + const TLinea_prod lp(linea); + const TString16 imp(lp.codimp()); + if (imp.not_empty()) + prd.put("IMPIANTO", imp); + } + } + if (!only_errors) + print_record(vwin, tipo, prd); + if (tipo == _start) + { + const int rows = prd.body().rows(); + bool found = false; + bool seq_err = false; + + for (int i = 1; !found && i <= rows; i++) + { + const TRectype & row = prd.body()[i]; + found = recdate == row.get_date("DATAINI") && rechour == row.get("ORAINI"); + if (row.get("DATAFINE").empty()) + seq_err = true; + } + if (seq_err) + display_error(vwin, TR("Inizio senza fine precedente"), trec, rec); + if (!found) + { + TRectype & row = prd.body().row(rows + 1, true); + row.put("DATAINI", recdate); + row.put("ORAINI", rechour); + row.put("OPERATORE", operatore); + } + if (nuovo) + prd.write(); + else + prd.rewrite(); + } + else + if (tipo == _end) + { + const int rows = prd.body().rows(); + bool found = false; + + int i; + for (i = rows; i > 0; i--) + { + const TRectype & row = prd.body()[i]; + found = (recdate == row.get_date("DATAFINE") && rechour == row.get("ORAFINE")) || + row.get("DATAFINE").empty(); + if (found) + break; + } + if (!found) + { + TRectype & row = prd.body().row(rows + 1, true); + i = rows + 1; + display_error(vwin, TR("Fine senza inizio"), trec, rec); + } + TRectype & row = prd.body()[i]; + + row.put("DATAFINE", recdate); + row.put("ORAFINE", rechour); + + real diff = qta - row.get_real("QTA"); + real tot = prd.get_real("QTA") + diff; + + row.put("QTA", qta); + prd.put("QTA", tot); + diff = scarto - row.get_real("SCARTO"); + tot = prd.get_real("SCARTO") + diff; + row.put("SCARTO", scarto); + prd.put("SCARTO", tot); + prd.rewrite(); + } + else + { + const int rows = prd.body().rows(); + + for (int i = 1; i <= rows; i++) + { + TRectype & row = prd.body()[i]; + if (i < rows) + { + row.zero("QTA"); + row.zero("SCARTO"); + } + else + { + row.put("QTA", qta); + row.put("SCARTO", scarto); + } + } + prd.put("QTA", qta); + prd.put("SCARTO", scarto); + prd.rewrite(); + } + + if (tipo > _start) // Controllo lo scarto solo dopo _start + { + const real tot(prd.get_real("QTA") + prd.get_real("SCARTO")); + if (tot > ZERO) + { + real perc = prd.get_real("SCARTO") * CENTO / tot; + perc.round(2); + for (int j = 3; j >= 0; j--) + { + if ((const real&)warn_perc[j] > ZERO && perc > (const real&)warn_perc[j]) + { + TString warn; + warn.format("@b%s - percentuale %s", (const char *) warning.row(j), perc.string()); + display_error(vwin, warn, trec, rec); + break; + } + } + } + } + } + } + prod.close(); + if (savefile) + { + TFilename dest(nomefile); + dest = dest.path(); + TString filemask(dest); + TString_array arr; + TDate filedate(TODAY); + int cnt = 0; + + filemask << format("pr%02d%02d*.dat", filedate.month(), filedate.day()); + list_files(filemask, arr); + + const int items = arr.items(); + if (items > 0) + { + arr.sort(); + cnt = atoi(arr.row(items - 1).right(5)); + } + cnt++; + + dest << format("pr%02d%02d%02d.dat", filedate.month(), filedate.day(), cnt); + if (fcopy(nomefile, dest)) + remove_file(nomefile); + + } + vwin.close_print(); + vwin.close_modal(); + KEY k = vwin.run(); + if (k == K_CTRL+'S') // Ho premuto Stampa + printer().print_txt(vwin.text()); +} + +/////////////////////////////////////////////////////////// +// TRilprod_app +/////////////////////////////////////////////////////////// + +class TRilprod_app : public TRelation_application +{ + TRelation* _rel; + TRilprod_mask* _msk; + + virtual int read( TMask& m ); + virtual int write( const TMask& m ); + virtual int rewrite( const TMask& m ); + virtual bool remove(); + +protected: + virtual TMask* get_mask(int) { return _msk; } + virtual TRelation* get_relation() const { return _rel; } + virtual bool user_create(); + virtual bool user_destroy(); + virtual void init_insert_mode(TMask& m); + virtual void init_modify_mode(TMask& m); + virtual bool changing_mask (int) {return false; } + virtual bool get_next_key(TToken_string& key); +}; + +void TRilprod_app::init_insert_mode(TMask& m) +{ + m.disable(-GR_BOLPROD); + m.field(F_QTA).enable(); + m.field(F_SCARTO).enable(); +} + +void TRilprod_app::init_modify_mode(TMask& m) +{ + m.disable(-GR_BOLPROD); +} + +bool TRilprod_app::user_create() +{ + _rel = new TRelation(LF_RILPROD); + _msk = new TRilprod_mask(); + return true; +} + +bool TRilprod_app::user_destroy() +{ + if (_msk != NULL) + delete _msk; + if (_rel != NULL) + delete _rel; + return true; +} + +bool TRilprod_app::get_next_key(TToken_string& key) +{ + TMask& m = curr_mask( ); + + if (m.get(F_CODART).empty() || m.get(F_DATA).empty()) + return false; + + TProduzione p; + + int n = 0; + + TLocalisamfile ril(LF_RILPROD); + TRectype& curr = ril.curr(); + + curr.put("CODART", m.get(F_CODART)); + curr.put("DATA", m.get_date(F_DATA)); + curr.put("PROG", 999); + + const int err = ril.read(_isgreat); + + if (err != _isemptyfile) + { + if (err == NOERR) + ril.prev(); + if (curr.get("CODART") == m.get(F_CODART) && + curr.get("DATA") == m.get_date(F_DATA)) + n = curr.get_int("PROG"); + } + + n++; + + key.format("%d|%d", F_PROG, n); + return true; +} + +int TRilprod_app::read( TMask& m ) +{ + TProduzione p; + int err = TRelation_application::read(m); + + if (err != NOERR) + return err; + p.TMultiple_rectype::read(_rel->curr()); + + const int rows = p.body().rows(); + TSheet_field & sh = m.sfield(F_TEMPI); + + sh.reset(); + for (int i = 0 ; i < rows; i++) + { + TToken_string & r = sh.row(i); + const TRectype & row = p.body()[i + 1]; + r.add(row.get("DATAINI")); + const TString & oraini = row.get("ORAINI"); + r.add(oraini.left(2)); + r.add(oraini.mid(2, 2)); + r.add(oraini.right(2)); + r.add(row.get("DATAFINE")); + const TString & orafin = row.get("ORAFINE"); + r.add(orafin.left(2)); + r.add(orafin.mid(2, 2)); + r.add(orafin.right(2)); + r.add(row.get("QTA")); + r.add(row.get("SCARTO")); + r.add(row.get("OPERATORE")); + sh.check_row(i); + } + + const bool on = m.sfield(F_TEMPI).items() == 0; + + m.field(F_QTA).enable(on); + m.field(F_SCARTO).enable(on); + return NOERR; +} + +int TRilprod_app::write( const TMask& m ) +{ + TProduzione p; + TSheet_field & sh = m.sfield(F_TEMPI); + const int rows = sh.items(); + + p.zero(); + m.autosave(*_rel); + p.head() = _rel->curr(); + for (int i = 0 ; i < rows; i++) + { + TToken_string & r = sh.row(i); + TRectype & row = p.body().row(i + 1, true); + + row.put("DATAINI", r.get(0)); + TString8 ora(r.get()); + TString8 w(r.get()); + if (w.blank()) + w = "00"; + ora << w; + w = r.get(); + if (w.blank()) + w = "00"; + ora << w; + row.put("ORAINI", ora); + row.put("DATAFINE", r.get()); + ora = r.get(); + w = r.get(); + if (w.blank()) + w = "00"; + ora << w; + w = r.get(); + if (w.blank()) + w = "00"; + ora << w; + row.put("ORAFINE", ora); + row.put("QTA", r.get()); + row.put("SCARTO", r.get()); + row.put("OPERATORE", r.get()); + } + const int err = p.write(); + + _rel->curr() = p.head(); + _rel->read(); + return err; +} + +int TRilprod_app::rewrite( const TMask& m ) +{ + TProduzione p; + TSheet_field & sh = m.sfield(F_TEMPI); + const int rows = sh.items(); + + m.autosave(*_rel); + p.TMultiple_rectype::read(_rel->curr()); + p.head() = _rel->curr(); + p.destroy_rows(); + for (int i = 0 ; i < rows; i++) + { + TToken_string & r = sh.row(i); + TRectype & row = p.body().row(i + 1, true); + + row.put("DATAINI", r.get(0)); + TString16 ora(r.get()); + TString8 w(r.get()); + if (w.blank()) + w = "00"; + ora << w; + w = r.get(); + if (w.blank()) + w = "00"; + ora << w; + row.put("ORAINI", ora); + row.put("DATAFINE", r.get()); + ora = r.get(); + w = r.get(); + if (w.blank()) + w = "00"; + ora << w; + w = r.get(); + if (w.blank()) + w = "00"; + ora << w; + row.put("ORAFINE", ora); + row.put("QTA", r.get()); + row.put("SCARTO", r.get()); + row.put("OPERATORE", r.get()); + } + return p.rewrite(); +} + +bool TRilprod_app::remove() +{ + TProduzione p; + + _msk->autosave(*_rel); + p.TMultiple_rectype::read(_rel->curr()); + return p.remove() == NOERR; +} + +int mr0500(int argc, char* argv[]) +{ + TRilprod_app app; + app.run(argc, argv, TR("Rilevazione Produzione")); + return 0; +} diff --git a/src/mr/mr0500a-Denso.ini b/src/mr/mr0500a-Denso.ini new file mode 100644 index 000000000..4b1fec0a1 --- /dev/null +++ b/src/mr/mr0500a-Denso.ini @@ -0,0 +1,29 @@ +[MAIN] +DECSEP = +FIELDSEP = | +RECORDSEP = +RECORDSIZE = +SKIPLINES = 0 +TYPEFIELD = -1 +TYPELEN = 0 +TYPEPOS = -1 + +[RECORD] +LENGTH(0) = 1 +LENGTH(1) = 20 +LENGTH(2) = 20 +LENGTH(3) = 5 +LENGTH(4) = 15 +LENGTH(5) = 1 +LENGTH(6) = 5 +LENGTH(7) = 8 +LENGTH(8) = 8 +NAME(0) = TIPO +NAME(1) = ORDINE +NAME(2) = CODART +NAME(3) = LINEA +NAME(4) = QTA +NAME(5) = CHIUSO +NAME(6) = OPERATORE +NAME(7) = DATA +NAME(8) = ORA