diff --git a/ca/ca2.cpp b/ca/ca2.cpp index 4d30cb90a..533b83171 100755 --- a/ca/ca2.cpp +++ b/ca/ca2.cpp @@ -10,6 +10,7 @@ int main(int argc, char** argv) case 1: ca2200(argc, argv); break; // ripartizione movimenti analitica case 2: ca2300(argc, argv); break; // ricalcolo saldi case 3: ca2400(argc, argv); break; // ricalcolo righe competenza + case 4: ca2500(argc, argv); break; // esportazione a Board default: ca2100(argc, argv); break; // gestione movimenti } return 0; diff --git a/ca/ca2.h b/ca/ca2.h index cfd24a5df..844471f28 100755 --- a/ca/ca2.h +++ b/ca/ca2.h @@ -5,5 +5,6 @@ int ca2100(int argc, char* argv[]); int ca2200(int argc, char* argv[]); int ca2300(int argc, char* argv[]); int ca2400(int argc, char* argv[]); +int ca2500(int argc, char* argv[]); #endif // __CA2_H diff --git a/ca/ca2500.cpp b/ca/ca2500.cpp new file mode 100644 index 000000000..e3b82b822 --- /dev/null +++ b/ca/ca2500.cpp @@ -0,0 +1,228 @@ +#include +#include +#include +#include +#include +#include + +#include "ca2500a.h" + +class TBoard_msk : public TAutomask +{ +protected: + 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(); +} + +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(TODBC_recordset& recset, 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(TODBC_recordset& recset, TIsam_handle lf) const +{ + TString query(1024); + TString table = prefix().get_filename(lf).name_only(); table.upper(); + +// 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); + recset.set(query); + if (recset.items()) + return true; + + query.cut(0) << "CREATE TABLE " << table << " (\n"; + const RecDes& rd = prefix().get_recdes(lf); + const bool access = recset.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 << "));"; + recset.exec(query); + recset.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(""); + if (!sqlset.connect(DSN)) + return false; + + if (!create_table(sqlset, lf)) + return false; + + TString table = prefix().get_filename(lf).name_only(); table.upper(); + + sqlquery.cut(0) << "SELECT * FROM " << table; + dbfquery << "USE " << lf; + // switch (lf) + // { + // default: break; + // } + + sqlset.begin(); + + sqlset.set(sqlquery); + sqlset.move_first(); + + TISAM_recordset dbfset(dbfquery); + TString msg("Esportazione tabella "); msg << table; + TProgind p(dbfset.items(), msg); + + 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 (cmp > 0) + { + sqlset.remove_rec(dbfset); + sqlset.move_next(); + sqlset.compare_key(dbfset); + } + } + + if (cmp == 0) + { + if (sqlset.compare_rec(dbfset)) // record modificato + sqlset.update_rec(dbfset); + } + else + sqlset.create_rec(dbfset); + sqlset.move_next(); + } + sqlset.commit(); + return true; +} + +void TBoard_app::main_loop() +{ + TBoard_msk m; + 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; +} diff --git a/ca/ca2500a.h b/ca/ca2500a.h new file mode 100644 index 000000000..fad2d9c13 --- /dev/null +++ b/ca/ca2500a.h @@ -0,0 +1,4 @@ +#define F_DSN 250 +#define F_DATA_INI 251 +#define F_DATA_FIN 252 +#define F_FILES 253 diff --git a/ca/ca2500a.uml b/ca/ca2500a.uml new file mode 100644 index 000000000..b16d1715c --- /dev/null +++ b/ca/ca2500a.uml @@ -0,0 +1,77 @@ +#include "ca2500a.h" + +TOOLBAR "topbar" 0 0 0 2 + +#include + +ENDPAGE + +PAGE "Invio a Board" 0 2 0 0 + +STRING F_DSN 260 40 +BEGIN + PROMPT 1 0 "ODBC DSN " +END + +DATE F_DATA_INI +BEGIN + PROMPT 1 2 "Data iniziale " +END + +DATE F_DATA_FIN +BEGIN + PROMPT 1 3 "Data finale " +END + +SPREADSHEET F_FILES 78 -1 +BEGIN + PROMPT 1 5 "" + ITEM "Selezione" + ITEM "Numero" + ITEM "Denominazione@40" + ITEM "Record@8" +END + +STRING DLG_PROFILE 260 50 +BEGID + PROMPT 1 -1 "Profilo " + PSELECT +END + +ENDPAGE + +ENDMASK + +PAGE "Riga" -1 -1 60 5 + +BOOLEAN 101 +BEGIN + PROMPT 1 1 "Selezionato per invio" +END + +NUMBER 102 2 +BEGIN + PROMPT 1 3 "File " + FLAGS "L" +END + +STRING 103 32 +BEGIN + PROMPT 10 2 "" + FLAGS "L" +END + +NUMBER 104 8 +BEGIN + PROMPT 30 1 "" + FLAGS "L" +END + +BUTTON DLG_CANCEL 8 2 +BEGIN + PROMPT -11 -1 "" +END + +ENDPAGE + +ENDMASK