#include #include #include #include "felib.h" #include "fe0100a.h" /////////////////////////////////////////////////////////// // TSomma_spesometro_msk /////////////////////////////////////////////////////////// class TSomma_spesometro_msk : public TAutomask { protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); void elabora(const TString_array& a, const TFilename& n) const; bool str2fname(const TString& name, TFilename& n) const; bool row2fname(const TToken_string& row, TFilename& n) const; void enable_buttons(); public: TSomma_spesometro_msk() : TAutomask("fe0300a") { load_profile(); } ~TSomma_spesometro_msk() { save_profile(); } }; bool TSomma_spesometro_msk::str2fname(const TString& name, TFilename& n) const { if (name.blank() || name.len() < 4) return false; if (name.full() && name[1] != ':') { n = get(F_OUTFOLDER); n.add(name); } else n = name; n.replace('/', '\\'); return n.exist(); } bool TSomma_spesometro_msk::row2fname(const TToken_string& row, TFilename& n) const { TString80 name; row.get(0, name); return str2fname(name, n); } void TSomma_spesometro_msk::elabora(const TString_array& infiles, const TFilename& outfile) const { int anno = 2010; TFilename n; if (row2fname(infiles.row(0), n)) { const TDati_rilevanti_set s(n); anno = s.anno(); } TDati_rilevanti_set outset(anno); const int tipologia = outset.add_header(*this); if (tipologia != 2) // Invio i record solo quando non si tratta di annullamento { FOR_EACH_ARRAY_ROW(infiles, r, row) if (row2fname(*row, n)) { const int len = outset.record_length(); ifstream s(n, ios::binary); TString row(len); while (!s.eof()) { s.read(row.get_buffer(), len); if (row[0] != '0' && row[0] != '9') outset.new_rec(row); } } } outset.add_footer(); outset.sort(); outset.save_as(outfile); if (outset.items() > 15000) { outset.split(outfile); const int n = (outset.items()-1) / 15000 + 1; warning_box(FR("E' stato generato il file %s, separato in %d parti da 15000 record."), (const char*)outfile, n); } else message_box(FR("E' stato generato il file %s"), (const char*)outfile); TDati_rilevanti_rep rep(outfile); rep.preview(); } void TSomma_spesometro_msk::enable_buttons() { const TSheet_field& righe = sfield(F_RIGHE); enable(DLG_ELABORA, !righe.empty()); TFilename n; enable(DLG_PREVIEW, str2fname(get(F_OUTFILE), n)); } bool TSomma_spesometro_msk::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) { case DLG_ELABORA: if (e == fe_button && check_fields()) { TFilename n; str2fname(get(F_OUTFILE), n); TSheet_field& righe = sfield(F_RIGHE); TString_array& a = righe.rows_array(); if (!a.empty() && n.full()) { elabora(a, n); enable_buttons(); } } break; case DLG_USER: if (e == fe_button) { TFilename fn; if (str2fname(o.mask().get(101), fn)) { TDati_rilevanti_rep rep(fn); rep.preview(); } } break; case DLG_PREVIEW: if (e == fe_button) { TFilename fn; if (str2fname(get(F_OUTFILE), fn)) { TDati_rilevanti_rep rep(fn); rep.preview(); } } break; case F_OUTFOLDER: if ((e == fe_init || e == fe_modify) && !o.empty()) { TSheet_field& righe = sfield(F_RIGHE); TFilename dir = o.get(); dir.add("Spe*.txt"); TString_array& a = righe.rows_array(); a.destroy(); list_files(dir, a); TFilename fn; FOR_EACH_ARRAY_ROW(a, r, row) { fn = row->get(0); *row = fn.name(); row->add(fsize(fn) / 1800); const time_t t = xvt_fsys_file_attr(fn, XVT_FILE_ATTR_MTIME); if (t > 0) { const struct tm& lt = *localtime(&t); const TDate d(lt.tm_mday, lt.tm_mon+1, 1900+lt.tm_year); row->add(d); TString8 ora; ora.format("%02d:%02d:%02d", lt.tm_hour, lt.tm_min, lt.tm_sec); row->add(ora); } } // Elimina dalla lista il file di output if (str2fname(get(F_OUTFILE), fn)) { TFilename fr; FOR_EACH_ARRAY_ROW(a, r, row) { row2fname(*row, fr); if (fr.compare(fn, -1, true) == 0) { a.destroy(r, true); break; } } } righe.force_update(); enable_buttons(); } break; case F_RIGHE: if (e == se_query_add || e == se_query_del) return false; break; default: break; } return true; } /////////////////////////////////////////////////////////// // TSomma_spesometro_app /////////////////////////////////////////////////////////// class TSomma_spesometro_app : public TSkeleton_application { public: virtual void main_loop(); }; void TSomma_spesometro_app::main_loop() { TSomma_spesometro_msk msk; msk.run(); } /////////////////////////////////////////////////////////// // main /////////////////////////////////////////////////////////// int fe0300(int argc, char* argv[]) { TSomma_spesometro_app app; app.run(argc, argv, TR("Somma file Spesometro")); return 0; }