diff --git a/ba/ba8.cpp b/ba/ba8.cpp index ac8c5efad..c2a24db29 100755 --- a/ba/ba8.cpp +++ b/ba/ba8.cpp @@ -1,14 +1,14 @@ #include - #include "ba8.h" int main(int argc, char** argv) { - const int n = argc > 1 ? atoi(argv[1]+1) : 0; + const int n = argc > 1 ? (argv[1][1]-'0') : 0; switch (n) { - case 1: ba8200(argc, argv); break; - default: ba8100(argc, argv); break; + case 1: ba8200(argc, argv); break; // Query Generator + case 2: ba8300(argc, argv); break; // Report Generator + default: ba8100(argc, argv); break; // Record Selector } return 0; } \ No newline at end of file diff --git a/ba/ba8.h b/ba/ba8.h index ae7950f19..567ef4834 100755 --- a/ba/ba8.h +++ b/ba/ba8.h @@ -1,4 +1,5 @@ int ba8100(int argc, char* argv[]); int ba8200(int argc, char* argv[]); +int ba8300(int argc, char* argv[]); diff --git a/ba/ba8200.cpp b/ba/ba8200.cpp index 24547b915..8645e6771 100755 --- a/ba/ba8200.cpp +++ b/ba/ba8200.cpp @@ -369,7 +369,6 @@ public: bool save_if_needed(); bool delete_query(); - void get_sql_path(TFilename& path) const; bool get_qry_path(TFilename& path) const; TRelation_node* curr_node(); @@ -750,7 +749,7 @@ void TQuery_mask::export(TQueryExportFormat fmt) strcpy(fs.type, ext); strcpy(fs.name, get(F_CODICE)); strcpy(fs.creator, "AGA"); - const bool good = xvt_dm_post_file_save(&fs, TR("Esporta")) == FL_OK; + const bool good = xvt_dm_post_file_save(&fs, TR("Esportazione")) == FL_OK; xvt_fsys_restore_dir(); if (good) @@ -764,32 +763,24 @@ void TQuery_mask::export(TQueryExportFormat fmt) } } -void TQuery_mask::get_sql_path(TFilename& path) const -{ - path = firm2dir(-1); - path.add("sql"); - if (!path.exist()) - make_dir(path); -} - bool TQuery_mask::get_qry_path(TFilename& path) const { const TString& name = get(F_CODICE); - if (name.not_empty()) + const bool ok = name.not_empty(); + if (ok) { - get_sql_path(path); + get_sql_directory(path); path.add(name); path.ext("qry"); } - return name.not_empty(); + return ok; } bool TQuery_mask::select_query() { TEdit_field& fld = efield(F_CODICE); - TFilename dirname; - get_sql_path(dirname); + TFilename dirname; get_sql_directory(dirname); xvt_fsys_save_dir(); @@ -813,7 +804,6 @@ bool TQuery_mask::select_query() return good; } - static bool xml_save_tree_handler(TTree& tree, void* jolly, word flags) { TXmlItem* rel = (TXmlItem*)jolly; @@ -861,9 +851,9 @@ bool TQuery_mask::save_fields_sheet(TXmlItem& xml) TXmlItem& field = fields.AddChild("field"); field.SetAttr("Table", row->get(0)); field.SetAttr("Name", row->get(1)); - field.SetAttr("Hidden", *row->get(2) > ' '); - field.SetAttr("Sort", *row->get(3) > ' '); - field.SetAttr("Group", *row->get(4) > ' '); + field.SetAttr("Hidden", tok_get_bool(*row,2)); + field.SetAttr("Sort", tok_get_bool(*row,3)); + field.SetAttr("Group", tok_get_bool(*row,4)); const char* str = row->get(5); if (str && *str > ' ') field.SetAttr("Expr", str); @@ -997,9 +987,8 @@ bool TQuery_mask::load_query() bool ok = path.exist(); if (ok) { - ifstream qry(path); TXmlItem xml; - ok = xml.Read(qry); + ok = xml.Load(path); if (ok) { _curr_query = path; @@ -1224,40 +1213,25 @@ TQuery_mask::TQuery_mask() : TAutomask("ba8200a"), _curr_num(0), _is_dirty(false } /////////////////////////////////////////////////////////// -// TSql_app +// TSQL_query_app /////////////////////////////////////////////////////////// -class TSql_app : public TSkeleton_application +class TSQL_query_app : public TSkeleton_application { - TQuery_mask* _msk; - public: - virtual bool create(); virtual void main_loop(); - virtual bool destroy(); }; -void TSql_app::main_loop() +void TSQL_query_app::main_loop() { - _msk->run(); + TQuery_mask* msk = new TQuery_mask; + msk->run(); + delete msk; } -bool TSql_app::create() -{ - _msk = new TQuery_mask; - return TSkeleton_application::create(); -} - -bool TSql_app::destroy() -{ - delete _msk; - return TSkeleton_application::destroy(); -} - - int ba8200(int argc, char* argv[]) { - TSql_app app; - app.run(argc, argv, "Query"); + TSQL_query_app app; + app.run(argc, argv, TR("Query Generator")); return 0; } diff --git a/ba/ba8201.cpp b/ba/ba8201.cpp index 6c9f039c1..8fcc6a89e 100755 --- a/ba/ba8201.cpp +++ b/ba/ba8201.cpp @@ -8,6 +8,18 @@ #include "ba8201.h" +/////////////////////////////////////////////////////////// +// Utility +/////////////////////////////////////////////////////////// + +void get_sql_directory(TFilename& name) +{ + name = firm2dir(-1); + name.add("sql"); + if (!name.exist()) + make_dir(name); +} + /////////////////////////////////////////////////////////// // Private interface /////////////////////////////////////////////////////////// @@ -49,13 +61,8 @@ public: void TSQLite::build_curr_path(TFilename& name) const { - name = firm2dir(-1); - name.add("sql"); - if (!name.exist()) - make_dir(name); - - TString16 firm; - firm.format("%05ldA.sql", prefix().get_codditta()); + TString16 firm; firm.format("%05ldA.sql", prefix().get_codditta()); + get_sql_directory(name); name.add(firm); } @@ -386,7 +393,7 @@ TSQLite::~TSQLite() void TSQL_query::reset() { _firstrow = _items = 0; - _pagesize = 256; + _pagesize = 512; _page.destroy(); _column.destroy(); } @@ -459,6 +466,9 @@ static int query_get_rows(void* jolly, int argc, char** values, char** columns) const TString_array* TSQL_query::row(TRecnotype n) { + if (n < 0 || n >= items()) + return NULL; + if (n < _firstrow || n >= _firstrow+_page.items()) { TString sql = _sql; @@ -469,7 +479,10 @@ const TString_array* TSQL_query::row(TRecnotype n) sql.cut(semicolon); sql.trim(); _page.destroy(); - _firstrow = n; + if (n >= _pagesize) + _firstrow = n-_pagesize/8; // Prendo qualche riga dalla pagina precedente, per velocizzare il pagina su + else + _firstrow = n; sql << "\nLIMIT " << _pagesize << " OFFSET " << _firstrow << ';'; } _TheDataBase.exec(sql, query_get_rows, &_page); @@ -589,7 +602,7 @@ bool TSQL_query::save_as_silk(const TFilename& path) if (pi.iscancelled()) break; const TString_array* arr = row(n); - const int last = arr != NULL ? arr->last() : 0; + const int last = arr->last(); for (int c = 0; c <= last; c++) { out << "C;Y" << (n+2) << ";X" << (c+1) << ";K\""; diff --git a/ba/ba8201.h b/ba/ba8201.h index 6c3ed8beb..7f365304c 100755 --- a/ba/ba8201.h +++ b/ba/ba8201.h @@ -67,5 +67,11 @@ public: TQuery_sheet(TSQL_query& sql); }; +/////////////////////////////////////////////////////////// +// Utility +/////////////////////////////////////////////////////////// + +void get_sql_directory(TFilename& path); + #endif diff --git a/ba/ba8300.cpp b/ba/ba8300.cpp new file mode 100755 index 000000000..20a32b4b3 --- /dev/null +++ b/ba/ba8300.cpp @@ -0,0 +1,139 @@ +#include + +#include +#include +#include +#include +#include + +#include "ba8201.h" +#include "ba8300.h" + +class TReport_mask : public TAutomask +{ +protected: + virtual void handler(WINDOW win, EVENT* ep); + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +protected: + bool select_query(); + bool select_report(); + +public: + TReport_mask() : TAutomask("ba8300a") { } +}; + +bool TReport_mask::select_report() +{ + TEdit_field& fld = efield(F_CODICE); + + TFilename dirname; get_sql_directory(dirname); + + xvt_fsys_save_dir(); + + FILE_SPEC fs; + xvt_fsys_convert_str_to_dir(dirname, &fs.dir); + + strcpy(fs.type, "rep"); + strcpy(fs.name, "*"); + strcpy(fs.creator, "AGA"); + + const bool good = xvt_dm_post_file_open(&fs, (char*)fld.prompt()) == FL_OK; + + xvt_fsys_restore_dir(); + + if (good) + { + char name[_MAX_FNAME]; + xvt_fsys_parse_pathname (fs.name, NULL, NULL, name, NULL, NULL); + fld.set(name); + } + return good; +} + +bool TReport_mask::select_query() +{ + TFilename path; get_sql_directory(path); + + xvt_fsys_save_dir(); + + FILE_SPEC fs; + xvt_fsys_convert_str_to_dir(path, &fs.dir); + + strcpy(fs.type, "qry"); + strcpy(fs.name, "*"); + strcpy(fs.creator, "AGA"); + + bool good = xvt_dm_post_file_open(&fs, "Selezione query") == FL_OK; + + xvt_fsys_restore_dir(); + + if (good) + { + xvt_fsys_convert_dir_to_str(&fs.dir, path.get_buffer(), path.size()); + path.add(fs.name); + TXmlItem item; item.Load(path); + const TXmlItem* sql = item.FindFirst("sql"); + good = sql != NULL; + if (good) + { + TString str; sql->GetEnclosedText(str); + set(F_SQL, str); + } + } + return good; +} + +void TReport_mask::handler(WINDOW win, EVENT* ep) +{ + TAutomask::handler(win, ep); +} + +bool TReport_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_CODICE: + if (e == fe_button) + select_report(); + break; + case F_NEW_QRY: + if (e == fe_button) + { + TExternal_app q("ba8 -1"); + q.run(); + } + break; + case F_IMPORT_QRY: + if (e == fe_button) + select_query(); + break; + default: + break; + } + return true; +} + +/////////////////////////////////////////////////////////// +// TReporter_app +/////////////////////////////////////////////////////////// + +class TReporter_app : public TSkeleton_application +{ +protected: + virtual void main_loop(); +}; + +void TReporter_app::main_loop() +{ + TReport_mask* msk = new TReport_mask; + msk->run(); + delete msk; +} + +int ba8300(int argc, char* argv[]) +{ + TReporter_app app; + app.run(argc, argv, TR("Report Generator")); + return 0; +} diff --git a/ba/ba8300.h b/ba/ba8300.h new file mode 100755 index 000000000..819e8d480 --- /dev/null +++ b/ba/ba8300.h @@ -0,0 +1,6 @@ +#define F_CODICE 101 +#define F_DESCR 102 +#define F_SQL 103 +#define F_IMPORT_QRY 104 +#define F_NEW_QRY 105 + diff --git a/ba/ba8300a.uml b/ba/ba8300a.uml new file mode 100755 index 000000000..15d39e711 --- /dev/null +++ b/ba/ba8300a.uml @@ -0,0 +1,81 @@ +#include "ba8300.h" + +TOOLBAR "" 0 -2 0 2 + +BUTTON DLG_SAVEREC 10 2 +BEGIN + PROMPT -15 -11 "" + PICTURE BMP_SAVEREC + PICTURE BMP_SAVERECDN +END + +BUTTON DLG_NEWREC 10 2 +BEGIN + PROMPT -25 -11 "~Nuovo" + PICTURE BMP_NEWREC + PICTURE BMP_NEWRECDN +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -35 -11 "" + PICTURE BMP_DELREC + PICTURE BMP_DELRECDN +END + +BUTTON DLG_FINDREC 10 2 +BEGIN + PROMPT -45 -11 "Ri~cerca" + PICTURE BMP_FINDREC +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -55 -11 "" +END + +ENDPAGE + +PAGE "Report" -1 -1 78 23 + +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 1 0 "Report" +END + +STRING F_CODICE 16 +BEGIN + PROMPT 2 1 "Codice " + FLAGS "B" + WARNING "E' necessario specificare il codice" + CHECKTYPE REQUIRED +END + +STRING F_DESCR 50 46 +BEGIN + PROMPT 30 1 "" +END + +GROUPBOX DLG_NULL 78 -1 +BEGIN + PROMPT 1 3 "Origine dei dati" +END + +BUTTON F_NEW_QRY 20 1 +BEGIN + PROMPT 30 3 "Nuova query" +END + +BUTTON F_IMPORT_QRY 20 1 +BEGIN + PROMPT 57 3 "Importa query" +END + +MEMO F_SQL 76 -2 +BEGIN + PROMPT 2 3 "" +END + +ENDPAGE + +ENDMASK