#include #include #include #include #include #include #include #include "felib.h" #include "../cg/cg2103.h" #include #include #include #include /////////////////////////////////////////////////////////// // TTest_spesometro_msk /////////////////////////////////////////////////////////// class TTest_spesometro_msk : public TAutomask { private: void log_msg(const TRectype& mov, const char* msg, TLog_report& log) const; bool update_file(TLocalisamfile& f, const char* msg, TLog_report& log) const; bool is_nota_variazione(const TRectype& mov) const; bool elabora(int num, TLog_report& log); bool _definitiva; protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); public: TTest_spesometro_msk() : TAutomask("fe0400a") {} }; void TTest_spesometro_msk::log_msg(const TRectype& mov, const char* msg, TLog_report& log) const { TString str; switch (mov.num()) { case LF_ALLEG: str << "Riga " << mov.get(ALL_PROGR); break; case LF_MOV : str << "Movimento " << mov.get(MOV_NUMREG); break; case LF_DOC : str << "Documento " << mov.get(DOC_CODNUM) << ' ' << mov.get(DOC_ANNO) << '/' << mov.get(DOC_NDOC); break; default: break; } if (str.full()) { str << ": " << msg; log.log(1, str); } } bool TTest_spesometro_msk::update_file(TLocalisamfile& f, const char* msg, TLog_report& log) const { int err = NOERR; log_msg(f.curr(), msg, log); if (_definitiva) { err = f.rewrite(); if (err != NOERR) { TString msg; msg << TR("Impossibile aggiornare il file ") << f.description() << TR(": errore ") << err; log.log(2, msg); } } return err == NOERR; } bool TTest_spesometro_msk::is_nota_variazione(const TRectype& mov) const { bool yes = false; switch (mov.num()) { case LF_MOV: yes = mov.get_int(MOV_TIPOMOV) == 2; // Nota di credito/debito per saldaconto break; case LF_DOC: { const TString& tipodoc = mov.get(DOC_TIPODOC); const TString& codcaus = cache().get("%TIP", tipodoc, "S6"); if (codcaus.full()) { const TRectype& caus = cache().get(LF_CAUSALI, codcaus); yes = caus.get_int(CAU_TIPOMOV) == 2; // Nota di credito/debito per saldaconto } } break; default: yes = fe_is_nota_variazione(mov); break; } return yes; } bool TTest_spesometro_msk::elabora(int num, TLog_report& log) { const TString& anno = get(101); TString str; str << "USE " << num; switch (num) { case LF_ALLEG: str << "\nFROM ANNO=" << anno << "\nTO ANNO=" << anno; break; case LF_MOV: str << "KEY 2\nFROM DATAREG=" << anno << "0101\nTO DATAREG=" << anno << "1231"; break; case LF_DOC: str << "\nFROM PROVV=D ANNO=" << anno << "\nTO PROVV=D ANNO=" << anno; default: break; } TISAM_recordset recset(str); TLocalisamfile& file = recset.cursor()->file(); TRectype& curr = file.curr(); _definitiva = get_bool(102); if (_definitiva) str = TR("Aggiornamento"); else str = TR("Controllo"); str << ' ' << file.description(); str << TR(" Anno ") << anno; log.log(0, ""); log.log(1, str); log.log(0, ""); TProgind pi(recset.items(), str, true, true); bool done = true; for (bool ok = recset.move_first(); ok && done; ok = recset.move_next()) { if (!pi.addstatus(1)) break; } return done; } bool TTest_spesometro_msk::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) { case DLG_OK: case DLG_ELABORA: if (e == fe_button) { TLog_report log; for (int pos = id2pos(100+LF_ALLEG); pos >= 0 && pos < fields(); pos++) { const TMask_field& f = fld(pos); if (!f.is_kind_of(CLASS_BOOLEAN_FIELD)) break; if (f.get().full()) { if (!elabora(f.dlg() - 100, log)) break; } } log.preview(); return false; } break; default: break; } return true; } /////////////////////////////////////////////////////////// // TTest_spesometro_app /////////////////////////////////////////////////////////// class TTest_spesometro_app : public TSkeleton_application { public: virtual void main_loop(); }; void TTest_spesometro_app::main_loop() { TTest_spesometro_msk msk; msk.run(); } /////////////////////////////////////////////////////////// // main /////////////////////////////////////////////////////////// int fe0400(int argc, char* argv[]) { TTest_spesometro_app app; app.run(argc, argv, TR("Controllo file Spesometro")); return 0; }