#include #include #include #include #include #include #include "ca2500a.h" class TBoard_msk : public TAutomask { protected: virtual long handler(WINDOW task, EVENT* ep); virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); void update_sheet(); public: TBoard_msk(); }; void TBoard_msk::update_sheet() { TSheet_field& s = sfield(F_FILES); if (s.empty()) { const TPrefix& prf = prefix(); const TIsam_handle ff[] = { LF_CLIFO, LF_PCON, LF_MOV, LF_RMOV, LF_RMOVIVA, LF_PCONANA, LF_MOVANA, LF_RMOVANA, LF_RMOVANAC, LF_COMMESSE, LF_CDC, LF_FASI, 0 }; for (int i = 0; ff[i]; i++) { const TIsam_handle lf = ff[i]; const TFilename fn = prf.get_filename(lf); TToken_string& row = s.row(-1); row.format(" |%d", lf); row.add(fn.name_only()); } } TString query; FOR_EACH_SHEET_ROW(s, r, row) { query.format("USE %d", row->get_int(1)); TISAM_recordset c(query); row->add(c.items(), 3); } s.force_update(); } long TBoard_msk::handler(WINDOW task, EVENT* ep) { if (ep->type == E_TIMER) { if (is_running()) stop_run(K_ENTER); } return TAutomask::handler(task, ep); } bool TBoard_msk::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) { case F_DATA_INI: case F_DATA_FIN: if (e == fe_modify) update_sheet(); break; case F_FILES: if (e == se_query_add || e == se_query_del) return false; default: break; } return true; } TBoard_msk::TBoard_msk() : TAutomask("ca2500a") { TDate d(TODAY); set(F_DATA_FIN, d); d.set_day(1); set(F_DATA_INI, d, true); update_sheet(); } class TBoard_app : public TSkeleton_application { protected: bool create_table(const TString& DSN, TIsam_handle lf) const; bool esporta(const TString& DSN, TIsam_handle lf, const TDate& datef, const TDate& datet) const; public: virtual void main_loop(); }; bool TBoard_app::create_table(const TString& DSN, TIsam_handle lf) const { TString query(1024); TString table = prefix().get_filename(lf).name_only(); table.upper(); TODBC_recordset set(""); if (!set.connect(DSN)) return false; // query.format("SELECT * FROM %s.INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='%s'", // (const char*)recset.dsn(), (const char*)table); query.format("SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='%s'", (const char*)table); set.set(query); if (set.items()) return true; query.cut(0) << "CREATE TABLE " << table << " (\n"; const RecDes& rd = prefix().get_recdes(lf); const bool access = set.driver() == ODBC_access; for (int f = 0; f < rd.NFields; f++) { const RecFieldDes& fd = rd.Fd[f]; if (f) query << ','; query << fd.Name << " "; switch (fd.TypeF) { case _alfafld: query << "varchar(" << fd.Len << ')'; break; case _realfld: { if (access) query << "currency"; else query << "decimal(" << fd.Len << ',' << fd.Dec << ')'; break; } case _datefld: query << "date"; break; case _boolfld: query << "bit"; break; case _memofld: { if (access) query << "longtext"; else query << "varchar(max)"; break; } default : query << "int"; break; } } //query << ", CONSTRAINT Key0 PRIMARY KEY ("; query << ", PRIMARY KEY ("; for (int i = 0; i < rd.Ky[0].NkFields; i++) { const RecFieldDes& fd = rd.Fd[rd.Ky[0].FieldSeq[i] % 100]; if (i > 0) query << ", "; query << " " << fd.Name; } query << "));"; set.exec(query); set.exec("COMMIT;"); return true; } bool TBoard_app::esporta(const TString& DSN, TIsam_handle lf, const TDate& datef, const TDate& datet) const { TString sqlquery, dbfquery; TToken_string keyexpr; TODBC_recordset sqlset("", true); if (!sqlset.connect(DSN)) return false; if (!create_table(DSN, lf)) return false; TString table = prefix().get_filename(lf).name_only(); table.upper(); sqlquery.cut(0) << "SELECT * FROM " << table; dbfquery << "USE " << lf; sqlset.begin(); sqlset.set(sqlquery); sqlset.move_first(); TISAM_recordset dbfset(dbfquery); TString msg("Esportazione tabella "); msg << table; TProgind p(dbfset.items(), msg); if (dbfset.items() == 0) { if (sqlset.items() > 0L) { TString table = prefix().get_filename(lf).name_only(); table.upper(); TString query("DELETE FROM "); query << table << ";"; sqlset.exec(query); } } else if (sqlset.items() == 0L) { for (bool go = dbfset.move_first(); go&& !p.iscancelled(); go = dbfset.move_next()) { p.addstatus(1L); sqlset.create_rec(dbfset); } } else { for (bool go = dbfset.move_first(); go && !p.iscancelled(); go = dbfset.move_next()) { int cmp = 1; p.addstatus(1L); if (!sqlset.eof()) { cmp = sqlset.compare_key(dbfset); while (!sqlset.eof() && cmp > 0) { sqlset.remove_rec(dbfset); sqlset.move_next(); cmp = sqlset.compare_key(dbfset); } } if (cmp == 0) { if (sqlset.compare_rec(dbfset)) // record modificato sqlset.update_rec(dbfset); sqlset.move_next(); } else sqlset.create_rec(dbfset); } } sqlset.commit(); return true; } void TBoard_app::main_loop() { TBoard_msk m; bool batch = false; int mins = 1; if (argc() > 2) { const TFixed_string a(argv(2)); batch = toupper(a[1]) == 'M'; mins = atoi(a.right(1)); if (mins <1) mins = 1; } if (batch) { const WINDOW task =TASK_WIN; WINDOW tray = xvt_trayicon_create(task, 10212, name()); // Washing machine if (tray != NULL_WIN) xvt_vobj_set_visible(task, FALSE); xvt_timer_create(m.win(), mins * 60 * 1000L); while (m.run() == K_ENTER) { TSheet_field& s = m.sfield(F_FILES); const TString& DSN = m.get(F_DSN); const TDate datef = m.get(F_DATA_INI); const TDate datet = m.get(F_DATA_FIN); xvt_vobj_set_visible(task, TRUE); FOR_EACH_SHEET_ROW(s, r, row) if (row->get_char(0) > ' ') esporta(DSN, row->get_int(1), datef, datet); xvt_vobj_set_visible(task, FALSE); } xvt_trayicon_destroy(tray); } else { while (m.run() == K_ENTER) { TSheet_field& s = m.sfield(F_FILES); const TString& DSN = m.get(F_DSN); const TDate datef = m.get(F_DATA_INI); const TDate datet = m.get(F_DATA_FIN); FOR_EACH_SHEET_ROW(s, r, row) if (row->get_char(0) > ' ') esporta(DSN, row->get_int(1), datef, datet); } } } int ca2500(int argc, char* argv[]) { TBoard_app app; app.run(argc, argv, TR("Invio a Board")); return 0; }