From d0d0ded00e4fc4aea6ff8af598d0060509b9a1dd Mon Sep 17 00:00:00 2001 From: Alessandro Bonazzi Date: Thu, 16 Jul 2026 17:18:12 +0200 Subject: [PATCH] Patch level : 12.00 1414 Files correlati : ba8.exe Commento : Aggiornato stampatore di report --- src/ba/ba8500.cpp | 474 ++++++++++++++++++++-------------------------- src/ba/ba8500.h | 21 +- 2 files changed, 227 insertions(+), 268 deletions(-) diff --git a/src/ba/ba8500.cpp b/src/ba/ba8500.cpp index 21844d230..9835669e0 100755 --- a/src/ba/ba8500.cpp +++ b/src/ba/ba8500.cpp @@ -11,309 +11,253 @@ #include "ba8400.h" #include "ba8500.h" + /////////////////////////////////////////////////////////// // Utility /////////////////////////////////////////////////////////// -bool cod2app(const char* tok, TString& app) +bool _cod2app(const char* tok, TString& app) { - if (tok != NULL && isalpha(tok[0]) && isalpha(tok[1]) && atoi(tok+2) > 1000) - { - TFilename f; - f.strncpy(tok, 3); - f.ext("exe"); - if (!f.custom_path()) - return false; + if (tok != nullptr && isalpha(tok[0]) && isalpha(tok[1]) && atoi(tok + 2) > 1000) + { + TFilename f; + f.strncpy(tok, 3); + f.ext("exe"); + if (!f.custom_path()) + return false; - app.strncpy(tok, 3); - app << " -" << char(tok[3]-1); - return true; - } - return false; + app.strncpy(tok, 3); + app << " -" << char(tok[3] - 1); + return true; + } + return false; } -bool get_xml_attr(const TString& line, const char* attr, TString& value) +bool _get_xml_attr(const TString& line, const char* attr, TString& value) { - TString str; str << ' ' << attr << "=\""; - const int pos = line.find(str); - if (pos >= 0) - { - const int apicia = line.find('"', pos)+1; - const int apicic = line.find('"', apicia); - if (apicic > apicia) - { - value = line.sub(apicia, apicic); - return true; - } - } - return false; + TString str; str << ' ' << attr << "=\""; + const int pos = line.find(str); + if (pos >= 0) + { + const int apicia = line.find('"', pos) + 1; + const int apicic = line.find('"', apicia); + if (apicic > apicia) + { + value = line.ssub(apicia, apicic); + return true; + } + } + return false; } -bool get_xml_child(const TString& line, const char* tag, TString& value) +bool _get_xml_child(const TString& line, const char* tag, TString& value) { - TString80 str; str << '<' << tag << '>'; - const int pos = line.find(str); - if (pos >= 0) - { - const int apicia = line.find('>', pos)+1; - const int apicic = line.find('<', apicia); - if (apicic > apicia) - { - value = line.sub(apicia, apicic); - return true; - } - } - return false; + TString80 str; str << '<' << tag << '>'; + const int pos = line.find(str); + if (pos >= 0) + { + const int apicia = line.find('>', pos) + 1; + const int apicic = line.find('<', apicia); + if (apicic > apicia) + { + value = line.ssub(apicia, apicic); + return true; + } + } + return false; } -bool rep2app(const char* name, TString& app, TString& desc) +HIDDEN bool rep2app(const char* name, TString& app, TString& desc) { - app = desc = ""; + app = desc = ""; - TFilename report_name(name); - report_name.ext("rep"); - if (!report_name.custom_path()) - return false; + TFilename report_name(name); + report_name.ext("rep"); + if (!report_name.custom_path()) + return false; - TString stringona; - TScanner scan(report_name); - for (int i = 0; i < 3 && scan.good(); i++) // Leggo solo le prime righe - stringona << scan.line(); + TString stringona; + TScanner scan(report_name); + for (int i = 0; i < 3 && scan.good(); i++) // Leggo solo le prime righe + stringona << scan.line(); - get_xml_child(stringona, "description", desc); + _get_xml_child(stringona, "description", desc); - get_xml_attr(stringona, "command", app); - if (app.not_empty()) - return app != "ba8 -4"; //in questo caso e' stata definita nel report l'applicazione per stamparlo ed e' diversa da me stesso (ba8 -4) + _get_xml_attr(stringona, "command", app); + if (app.not_empty()) + return app != "ba8 -4"; //in questo caso e' stata definita nel report l'applicazione per stamparlo ed e' diversa da me stesso (ba8 -4) - return cod2app(report_name.name(), app); + return _cod2app(report_name.name(), app); } -/////////////////////////////////////////////////////////// -// TKlarkKent_mask -/////////////////////////////////////////////////////////// - -class TKlarkKent_mask : public TAutomask +HIDDEN TVariant* str2var(const char* str) { -protected: - virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + TVariant* var = nullptr; + if (str && *str) + { + const int len = strlen(str); + if (len <= 8 && real::is_natural(str)) + var = new TVariant(atol(str)); else + if (len <= 15 && real::is_real(str)) + var = new TVariant(real(str)); + else + var = new TVariant(str); + } + else + var = new TVariant; + return var; +} -public: - TKlarkKent_mask() : TAutomask("ba8500a") { } -}; -bool TKlarkKent_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +HIDDEN const char *rep2mask(const char * name) { - switch (o.dlg()) - { - case F_REPORT: - if (e == fe_button) - { - TFilename path; - if (select_custom_file(path, "rep", "C")) - { - o.set(path); - e = fe_modify; - } - } - if (e == fe_init || e == fe_modify) - { - TFilename name = o.get(); - TString app, desc; - rep2app(name, app, desc); - set(F_FORM, desc); - set(F_DOC, app); - enable(DLG_PRINT, desc.not_empty()); - } - break; - case DLG_EDIT: - if (e == fe_button && !field(F_REPORT).empty()) - { - TString str; - str << "ba8 -2 " << get(F_REPORT); - TExternal_app app(str); - app.run(true); - } - break; - default: - break; - } - return true; + TFilename & maskname = (TFilename &)get_tmp_string(); + + maskname = name; + maskname.ext("msk"); + return (const char *)maskname; } /////////////////////////////////////////////////////////// // TKlarkKent_app /////////////////////////////////////////////////////////// -TReport* TKlarkKent_app::create_report(const char* name) const +bool TKlarkKent_app::user_create() { - TReport* r = new TReport; - r->load(name); + TString80 name, val; + const int args = argc(); - TString custom_query; - TFilename filename(name); + for (int i = 2; i < args; i++) + { + const TFixed_string arg(argv(i)); + const int uguale = arg.find('='); - filename = filename.name(); - - const TString module = (filename[3] >= '0') && (filename[3] <= '9') ? filename.left(2) : ""; - - get_custom_query(module, filename, custom_query); - if (custom_query.full()) - r->set_recordset(custom_query); - return r; -} - -static TVariant* str2var(const char* str) -{ - TVariant* var = NULL; - if (str && *str) - { - const int len = strlen(str); - if (len <= 8 && real::is_natural(str)) - var = new TVariant(atol(str)); else - if (len <= 15 && real::is_real(str)) - var = new TVariant(real(str)); - else - var = new TVariant(str); - } - else - var = new TVariant; - return var; -} - -void TKlarkKent_app::main_loop() -{ - TString_array arr; // Lista dei reports - TAssoc_array vars; // Variabili utente - bool trans = false; - - TString80 name, val; - for (int i = 2; i < argc(); i++) - { - const TFixed_string arg(argv(i)); - const int uguale = arg.find('='); - if (uguale > 0) - { - name = arg.left(uguale); name.trim(); - val = arg.mid(uguale+1); val.trim(); - if (name.full()) - { - TVariant* var = str2var(val); - if (name[0] != '#') - name.insert("#"); - vars.add(name, var); - } - } - else - { - if (arg.starts_with("-i")) - { - trans = true; - TFilename ininame = arg.mid(2); - TConfig ini(ininame, "Vars"); - TAssoc_array& inivars = ini.list_variables(); - FOR_EACH_ASSOC_STRING(inivars, obj, key, str) - { - TVariant* var = str2var(str); - name = key; - if (name[0] != '#') - name.insert("#"); - vars.add(name, var); - } - } - else - { - TFilename rep = arg; - rep.ext("rep"); - if (rep.custom_path()) - arr.add(arg); - } - } - } - - if (arr.items() == 0) - arr.add(EMPTY_STRING); - - bool can_repeat = false; - do - { - TReport* report = NULL; - TReport_book book; - FOR_EACH_ARRAY_ROW(arr, r, row) - { - TFilename report_name = *row; - // Controlla se trattasi di tabella comune o di ditta - if (report_name[0] == '%' || report_name.len() == 3) - { - TTable tab(report_name); - report_name = tab.module(); - report_name << "st" << row->right(3); - } - report_name.ext("rep"); - if (row->blank() || !report_name.custom_path()) - { - TKlarkKent_mask m; - m.set(F_REPORT, report_name); - if (m.run() == K_ENTER) - { - report_name = m.get(F_REPORT); - report_name.ext("rep"); - report_name.custom_path(); - *row = report_name; - } - } - - TString appname, desc; - const bool custom_app = rep2app(report_name, appname, desc); - const TString& cust_cmd = cmd2name(appname); - const TString& this_cmd = cmd2name(argv(0), argv(1)); - if (custom_app && (cust_cmd != this_cmd)) //il contenuto dell && serve ad evitare spiacevoli infinite esecuzioni.. - { //..e conseguenti forzati spegnimenti del computer - appname << ' ' << report_name; - if (vars.items() > 0) - { - FOR_EACH_ASSOC_OBJECT(vars, h, name, var) - appname<< ' ' << name << '=' << ((TVariant *) var)->as_string(); + if (uguale > 0) + { + name = arg.sleft(uguale); name.trim(); + val = arg.smid(uguale + 1); val.trim(); + if (name.full()) + { + TVariant* var = str2var(val); + if (name[0] != '#') + name.insert("#"); + _vars.add(name, var); + } + } + else + { + if (arg.starts_with("-i")) + { + _trans = true; + TFilename ininame = arg.smid(2); + TConfig ini(ininame, "Vars"); + TAssoc_array& inivars = ini.list_variables(); + FOR_EACH_ASSOC_STRING(inivars, obj, key, str) + { + TVariant* var = str2var(str); + name = key; + if (name[0] != '#') + name.insert("#"); + _vars.add(name, var); } - TExternal_app app(appname); - app.run(true); - } - else - { - if (report != NULL) - delete report; - report = create_report(report_name); - if (report != NULL) - { - TRecordset* pset = report->recordset(); - if (pset != NULL && vars.items() > 0) - { - FOR_EACH_ASSOC_OBJECT(vars, h, name, var) - pset->set_var(name, *(TVariant*)var, true); - } - const bool ok = book.add(*report); - if (ok && !trans && arr.items() == 1) // Controlla se e' pensabile ripetere la stampa - { - TFilename msk = report_name; - msk.ext("msk"); - can_repeat = msk.custom_path(); // Posso ripetere se ho una maschera collegata - } - else - can_repeat = false; - } - } - } // ciclo sulla lista dei report da stampare + } + else + { + TFilename repname = arg; + if (repname[0] == '%' || repname.len() == 3) + { + TTable tab(repname); + repname = tab.module(); + repname << "st" << TString(arg).sright(3); + } + repname.ext("rep"); + if (repname.custom_path()) + _reps.add(repname); + } + } + } - // L'anteprima funziona bene solo se non si distrugge il report corrente - if (report != NULL) - { - if (book.pages() > 0) - book.print_or_preview(); - delete report; - report = NULL; - } + if (_reps.items() == 0) + return false; - } while (can_repeat); + _repname = _reps[0]; + _repname.ext("rep"); + + TFilename maskname = rep2mask(_repname); + + _mask = new TSimpleAutomask(maskname); + return true; +} + +bool TKlarkKent_app::user_destroy() +{ + safe_delete(_mask); + safe_delete(_rep); + return true; +} + +TReport & TKlarkKent_app::get_report(const TAutomask & m) +{ + safe_delete(_rep); + _rep = new TProgram_report; + _rep->load(_repname); + return *_rep; +} + +void TKlarkKent_app::set_vars(TReport & rep) +{ + TRecordset* recset = rep.recordset(); + + if (recset != nullptr && _vars.items() > 0) + { + recset->clear_variables(); + FOR_EACH_ASSOC_OBJECT(_vars, h, name, var) + recset->set_var(name, *(TVariant*)var, true); + } +} + +void TKlarkKent_app::execute_print(TReport_book & book, TAutomask & mask, TReport & rep, export_type & type) +{ + set_vars(rep); + rep.mask2report(mask); + rep.set_export_sections(type); + book.add(rep, type); + FOR_EACH_ARRAY_ROW(_reps, r, row) + { + if (r > 0) + { + TString appname, desc; + const bool custom_app = rep2app(*row, appname, desc); + const TString& cust_cmd = cmd2name(appname); + const TString& this_cmd = cmd2name(argv(0), argv(1)); + + if (custom_app && (cust_cmd != this_cmd)) //il contenuto dell && serve ad evitare spiacevoli infinite esecuzioni.. + { //..e conseguenti forzati spegnimenti del computer + appname << ' ' << *row; + if (_vars.items() > 0) + { + FOR_EACH_ASSOC_OBJECT(_vars, h, name, var) + appname << ' ' << name << '=' << ((TVariant *)var)->as_string(); + } + TExternal_app app(appname); + app.run(true); + } + else + { + TSimpleAutomask mask(rep2mask(*row)); + + if (mask.run() != K_ESC) + { + TProgram_report rrep(*row); + + set_vars(rrep); + rrep.mask2report(mask); + rrep.set_export_sections(type); + book.add(rrep, type); + } + } + } + } } int ba8500(int argc, char* argv[]) diff --git a/src/ba/ba8500.h b/src/ba/ba8500.h index 31664e986..db0431bf5 100755 --- a/src/ba/ba8500.h +++ b/src/ba/ba8500.h @@ -9,11 +9,26 @@ #include #endif -class TKlarkKent_app : public TSkeleton_application +#ifndef __REPAPP_H +#include +#endif + +class TKlarkKent_app : public TReport_application { + TFilename _repname; + TSimpleAutomask * _mask; + TReport * _rep; + bool _trans; + TString_array _reps; // Lista dei reports + TAssoc_array _vars; // Variabili utente + protected: - virtual TReport* create_report(const char* name) const; - virtual void main_loop(); + virtual bool user_create() override; + virtual bool user_destroy() override; + virtual TAutomask & get_mask() override { return *_mask; } + virtual TReport & get_report(const TAutomask & m) override; + virtual void execute_print(TReport_book & book, TAutomask & mask, TReport & rep, export_type & type) override; + void set_vars(TReport & rep); }; #endif