From fadf0f5faa66082a23fcf6be076757178375119e Mon Sep 17 00:00:00 2001 From: Alessandro Bonazzi Date: Mon, 13 Dec 2021 22:21:30 +0100 Subject: [PATCH] Patch level : 12.0 1100 Files correlati : f151.dir f151.trr ca1.exe ca2.exe ca3.exe ca3100.uml ca3100a.rep ca3100b.rep ca3200.uml ca3200a.rep ca3200b.rep ca3300.uml ca3300a.rep ca3300b.rep ca3300c.rep ca3300d.rep ca3600.uml ca3600a.rep ca3700.uml ca3700a.rep ca3700b.rep ca3800.uml ca3800a.rep ca3800as.rep ca3800b.rep ca3800bs.rep ca3800c.rep ca3800cs.rep ca3883.cpp ca3900.uml ca3900a.rep Commento : MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Aggiunta contabilitĆ  separata alle stampe di analitica. Aggiunto meccanismo per lanciare le stampe in batch. Sintassi: ca3 -7 -b rint|xport|Ecel|PD|esto|Base|isualizza> #include #include -#include +#include +#include "commesse.h" +#include "cdc.h" +#include "fasi.h" #include "movana.h" #include "rmovana.h" @@ -19,121 +22,63 @@ class TPrint_movimenti_ca_mask : public TAnal_report_mask { protected: bool on_field_event(TOperable_field& o, TField_event e, long jolly); - const TString& get_report_class() const; - bool test_compatible_report(); void create_page2(); int create_page2_sheet(int lf, int& y, short& dlg, bool required); + public: - TPrint_movimenti_ca_mask(); + virtual const TString & get_report_class() const; + TPrint_movimenti_ca_mask(); virtual ~TPrint_movimenti_ca_mask() {} }; -const TString& TPrint_movimenti_ca_mask::get_report_class() const +const TString & TPrint_movimenti_ca_mask::get_report_class() const { - TString& classe = get_tmp_string(); - classe = "ca3100"; - const int stp = get_int(F_TIPOSTAMPA); - classe << (stp == 1 ? 'a' : 'b'); // tipo di report da usare - return classe; -} + TString classe = TAnal_report_mask::get_report_class(); + const int stp = get_int(F_TIPOSTAMPA); -bool TPrint_movimenti_ca_mask::test_compatible_report() -{ - TFilename lib = get_report_class(); - const TString& name = get(F_REPORT); - bool ok = name.not_empty(); - if (ok) - { - TReport rep; - ok = rep.load(name); - if (ok) - { - const TString& classe = rep.get_class(); - ok = classe == lib; - } - } - if (!ok) - { - set(F_REPORT, lib); - lib.ext("rep"); - ok = lib.custom_path(); - } - return ok; + classe.cut(6); + classe << (stp == 1 ? 'a' : 'b'); // tipo di report da usare + return get_tmp_string() = classe; } bool TPrint_movimenti_ca_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) { - case DLG_PRINT: - if (e == fe_button) - { - main_app().print(); - return false; - } - break; - case DLG_PREVIEW: - if (e == fe_button) - { - main_app().preview(); - return false; - } - break; - case F_TIPOSTAMPA: - if (e == fe_init || e == fe_modify) - { - test_compatible_report(); //in base al tipo stampa setta i report compatibili - } - break; - case F_REPORT: - if (e == fe_button) - { - const TString8 lib = get_report_class(); - TFilename path = o.get(); - if (select_custom_file(path, "rep", lib)) - { - path = path.name(); - path.ext(""); - o.set(path); - } - } else - if (e == fe_close) - { - if (!test_compatible_report()) - return error_box(TR("Impossibile trovare un report compatibile")); - } - break; - case F_DATAINI: - case F_DATAFIN: - if (e == fe_close) - { - const TString& anno = get(F_ANNO); - if (anno.not_empty()) //se l'anno esercizio esiste... + case F_TIPOSTAMPA: + if (e == fe_modify || e == fe_init) + set_report_class(); + break; + case F_DATAINI: + case F_DATAFIN: + if (e == fe_close) { - const TRectype& esc = cache().get("ESC", anno); - const TDate datainiesc = esc.get("D0"); - const TDate datafinesc = esc.get("D1"); - if (o.empty()) + const TString& anno = get(F_ANNO); + if (anno.not_empty()) //se l'anno esercizio esiste... { - const TDate dataesc = o.dlg() == F_DATAINI ? datainiesc : datafinesc; - o.set(dataesc.string()); - } - else - { - const TDate d = o.get(); - if (d < datainiesc || d > datafinesc) - return error_box(TR("La data deve essere compresa nell'esercizio selezionato")); + const TRectype& esc = cache().get("ESC", anno); + const TDate datainiesc = esc.get("D0"); + const TDate datafinesc = esc.get("D1"); + if (o.empty()) + { + const TDate dataesc = o.dlg() == F_DATAINI ? datainiesc : datafinesc; + o.set(dataesc.string()); + } + else + { + const TDate d = o.get(); + if (d < datainiesc || d > datafinesc) + return error_box(TR("La data deve essere compresa nell'esercizio selezionato")); + } } } - } - break; - - default: break; + break; + default: + break; } return true; } - TPrint_movimenti_ca_mask::TPrint_movimenti_ca_mask() :TAnal_report_mask("ca3100") { @@ -146,7 +91,6 @@ TPrint_movimenti_ca_mask::TPrint_movimenti_ca_mask() create_sheet(F_RIGHE); } - /////////////////////////////////////////////////////////// // RECORDSET /////////////////////////////////////////////////////////// @@ -158,12 +102,12 @@ class TPrint_movimenti_ca_recordset : public TISAM_recordset char _tipomov; long _danumreg, _anumreg; TString4 _dacaus, _acaus; - TString _codcosto, _codcms, _codfas; + TString _codcosto, _codcms, _codfas, _contsep; protected: + const TVariant& get(const char* column_name) const; static bool mov_filter(const TRelation* rel); bool valid_record(const TRelation& rel) const; - virtual void set_custom_filter(TCursor& cur) const; public: @@ -171,28 +115,33 @@ public: TPrint_movimenti_ca_recordset(const TString& sql) : TISAM_recordset(sql) { } }; -static const TPrint_movimenti_ca_recordset* myself = NULL; +static const TPrint_movimenti_ca_recordset* myself = nullptr; //metodo per riconoscere se il record corrente soddisfa i filtri della maschera...strafighissimo! bool TPrint_movimenti_ca_recordset::valid_record(const TRelation& rel) const { //prima controlla la testata... const TRectype& mov = rel.curr(LF_MOVANA); + const TRectype& rmov = rel.curr(LF_RMOVANA); switch (_tipoord) { case 1: //controllo sul numreg { const long numreg = mov.get_long(MOVANA_NUMREG); - if (numreg < _danumreg || ( _anumreg >= _danumreg && numreg > _anumreg )) + const int nr = rmov.get_int(RMOVANA_NUMRIG); + + if (nr > 1) + int i = 1; + if (!between(numreg, _danumreg, _anumreg)) return false; } break; case 2: //controllo sulle date { - const char* datefld = _anno > 0 ? MOVANA_DATACOMP : MOVANA_DATAREG; - const TDate data = mov.get(datefld); - if (data < _dadata || ( _adata.ok() && data > _adata )) + const TDate data = mov.get(_anno > 0 ? MOVANA_DATACOMP : MOVANA_DATAREG); + + if (!data.between(_dadata, _adata)) return false; } break; @@ -213,32 +162,36 @@ bool TPrint_movimenti_ca_recordset::valid_record(const TRelation& rel) const if (tipomov != _tipomov) return false; } - //..poi le righe (devono comparire solo le righe con cdc/cms/fsc che appaiono nello sheet) - const TRectype& rmov = rel.curr(LF_RMOVANA); - - if (_codcosto.not_empty()) - { - const TString& cos = rmov.get(RMOVANA_CODCCOSTO); - if (!cos.starts_with(_codcosto)) + if (_codcosto.full() && !rmov.get(RMOVANA_CODCCOSTO).starts_with(_codcosto)) return false; - } - if (_codcms.not_empty()) - { - const TString& cms = rmov.get(RMOVANA_CODCMS); - if (!cms.starts_with(_codcms)) + if (_codcms.full() && !rmov.get(RMOVANA_CODCMS).starts_with(_codcms)) return false; - } - if (_codfas.not_empty()) - { - const TString& fas = rmov.get(RMOVANA_CODFASE); - if (!fas.starts_with(_codfas)) + if (_codfas.full() && !rmov.get(RMOVANA_CODFASE).starts_with(_codfas)) return false; - } - + if (_contsep.full() && _contsep != mov.get(MOVANA_CONTSEP)) + return false; return true; } +const TVariant& TPrint_movimenti_ca_recordset::get(const char* column_name) const +{ + const TFixed_string fld(column_name); + + if (fld == "#COSTO") + return get_tmp_var() = _codcosto; + else + if (fld == "#COMMESSA") + return get_tmp_var() = _codcms; + else + if (fld == "#FASE") + return get_tmp_var() = _codfas; + else + if (fld == "#CONTSEP") + return get_tmp_var() = _contsep; + return TISAM_recordset::get(column_name); +} + bool TPrint_movimenti_ca_recordset::mov_filter(const TRelation* rel) { return myself->valid_record(*rel); @@ -286,10 +239,9 @@ void TPrint_movimenti_ca_recordset::set_filter(const TPrint_movimenti_ca_mask& m _acaus = msk.get(F_CAUSALEFIN); _tipomov = msk.get(F_TIPOMOV)[0]; + _contsep = msk.get(F_CONTSEP); } - - //////////////////////////////////////////////////////// // REPORT //////////////////////////////////////////////////////// @@ -302,6 +254,8 @@ class TPrint_movimenti_ca_rep : public TAnal_report protected: virtual bool set_recordset(const TString& sql); virtual bool get_usr_val(const TString& name, TVariant& var) const; + virtual const char * get_excel_header_section() { return get_class() == "ca3100a" ? "H0|H1|H2" : "H0|H2|H3"; } + virtual void set_dbase_fixed_fields(bool on = true); public: void set_filter(const TPrint_movimenti_ca_mask& msk, int cms_row); @@ -314,26 +268,30 @@ bool TPrint_movimenti_ca_rep::get_usr_val(const TString& name, TVariant& var) co var.set(_anno); return true; } - if (name == "#DADATA") - { - var.set(_dadata); - return true; - } - if (name == "#ADATA") - { - var.set(_adata); - return true; - } - if (name == "#DANUMREG") - { - var.set(_danumreg); - return true; - } - if (name == "#ANUMREG") - { - var.set(_anumreg); - return true; - } + else + if (name == "#DADATA") + { + var.set(_dadata); + return true; + } + else + if (name == "#ADATA") + { + var.set(_adata); + return true; + } + else + if (name == "#DANUMREG") + { + var.set(_danumreg); + return true; + } + else + if (name == "#ANUMREG") + { + var.set(_anumreg); + return true; + } return TAnal_report::get_usr_val(name, var); } @@ -343,6 +301,12 @@ bool TPrint_movimenti_ca_rep::set_recordset(const TString& sql) return TReport::set_recordset(rs); } +void TPrint_movimenti_ca_rep::set_dbase_fixed_fields(bool on) +{ + field("B1.201")->show(on); + field("B1.202")->show(on); +} + void TPrint_movimenti_ca_rep::set_filter(const TPrint_movimenti_ca_mask& msk, int cms_row) { _anno = msk.get_int(F_ANNO); @@ -359,64 +323,93 @@ void TPrint_movimenti_ca_rep::set_filter(const TPrint_movimenti_ca_mask& msk, in //////////////////////////////////////////////////////// // APPLICAZIONE //////////////////////////////////////////////////////// -class TPrint_movimenti_ca : public TSkeleton_application +class TPrint_movimenti_ca : public TReport_application { - TPrint_movimenti_ca_mask* _mask; + TPrint_movimenti_ca_mask * _mask; + TPrint_movimenti_ca_rep * _rep; protected: virtual const char * extra_modules() const {return "cm";} //funziona anche con autorizzazione CM + virtual TReport & get_report(const TAutomask & m); + virtual TTrec * get_dbase_recdesc(TReport & rep, const TAutomask & mask); + virtual TAutomask & get_mask(); + virtual void execute_print(TReport_book & book, TAutomask & mask, TReport & rep, export_type type = _export_printer); + virtual const char * output_name(const TAutomask & mask, const TReport & rep) const { return "lmov"; } + // @cmember Distruzione dei dati dell'utente + virtual bool user_destroy(); - void print_or_preview(const bool stampa); - virtual void print(); - virtual void preview(); - - virtual void main_loop(); +public: + TPrint_movimenti_ca() : _mask(nullptr), _rep(nullptr) {} + ~TPrint_movimenti_ca() {} }; - -void TPrint_movimenti_ca::print_or_preview(const bool stampa) +TReport & TPrint_movimenti_ca::get_report(const TAutomask & m) { - //costruzione della query x il report in base ai parametri della maschera - TSheet_field& sheet = _mask->sfield(F_RIGHE); - const int n_righe_sheet = sheet.items(); - //se lo sheet č vuoto aggiunge una riga vuota - if (n_righe_sheet == 0) - sheet.insert(); - - //report e book - TReport_book book; //book dei report - - TPrint_movimenti_ca_rep rep; - rep.load(_mask->get(F_REPORT)); - - FOR_EACH_SHEET_ROW(sheet, r, row) - { - rep.set_filter(*_mask, r); - book.add(rep); - } - - if (stampa) - book.print(); //stampa il book dei report - else - book.preview(); //anteprima il book dei report + if (_rep == nullptr) + _rep = new TPrint_movimenti_ca_rep; + _rep->load(_mask->get(DLG_REPORT)); + return * _rep; } -void TPrint_movimenti_ca::print() +TTrec * TPrint_movimenti_ca::get_dbase_recdesc(TReport & rep, const TAutomask & mask) { - print_or_preview(true); + TTrec * desc = new TTrec; + TToken_string def; + TRectype cms(LF_COMMESSE); + TRectype fasi(LF_FASI); + TRectype cdc(LF_CDC); + TRectype rmovana(LF_RMOVANA); + TRectype movana(LF_MOVANA); + const int tipostampa = mask.get_int(F_TIPOSTAMPA); + + desc->add_fielddef(rmovana.rec_des(), RMOVANA_NUMRIG); + desc->add_fielddef(cdc.rec_des(), CDC_CODCOSTO); + desc->add_fielddef(cms.rec_des(), COMMESSE_CODCMS); + desc->add_fielddef(fasi.rec_des(), FASI_CODFASE); + desc->add_fielddef(rmovana.rec_des(), RMOVANA_CODCONTO); + desc->add_fielddef(rmovana.rec_des(), RMOVANA_DESCR); + desc->add_fielddef(movana.rec_des(), MOVANA_TIPOMOV); + desc->add_fielddef("DARE", _realfld, 18, 2); + desc->add_fielddef("AVERE", _realfld, 18, 2); + desc->add_fielddef(movana.rec_des(), MOVANA_NUMREG); + desc->add_fielddef(movana.rec_des(), MOVANA_CONTSEP); + + TToken_string keydef(MOVANA_NUMREG, '+'); + + keydef.add(RMOVANA_NUMRIG); + + desc->add_keydef(keydef, true); + return desc; } -void TPrint_movimenti_ca::preview() +TAutomask & TPrint_movimenti_ca::get_mask() { - print_or_preview(false); + if (_mask == nullptr) + _mask = new TPrint_movimenti_ca_mask; + return *_mask; } -void TPrint_movimenti_ca::main_loop() +void TPrint_movimenti_ca::execute_print(TReport_book & book, TAutomask & mask, TReport & rep, export_type type) { - _mask = new TPrint_movimenti_ca_mask; - _mask->run(); - delete _mask; - _mask = NULL; + //costruzione della query x il report in base ai parametri della maschera + TSheet_field & sheet = mask.sfield(F_RIGHE); + const int n_righe_sheet = sheet.items(); + + //se lo sheet č vuoto aggiunge una riga vuota + if (n_righe_sheet == 0) + sheet.insert(); + FOR_EACH_SHEET_ROW(sheet, r, row) + { + ((TPrint_movimenti_ca_rep &) rep).set_filter((TPrint_movimenti_ca_mask &) mask, r); + book.add(rep, type); + } +} + +bool TPrint_movimenti_ca::user_destroy() +{ + safe_delete(_mask); + safe_delete(_rep); + return TReport_application::user_destroy(); } int ca3100(int argc, char* argv[]) diff --git a/src/ca/ca3100.h b/src/ca/ca3100.h index 21991b612..a1f6283fb 100755 --- a/src/ca/ca3100.h +++ b/src/ca/ca3100.h @@ -14,8 +14,9 @@ #define F_NUMEROFIN 210 #define F_CAUSALEINI 211 #define F_CAUSALEFIN 212 -#define F_REPORT 213 #define F_TIPOMOV 214 +#define F_CONTSEP 215 +#define F_DESCONTSEP 216 //sheet di pagina 2 #define F_RIGHE 400 diff --git a/src/ca/ca3100.uml b/src/ca/ca3100.uml index e56fd336e..81d0a6aa9 100755 --- a/src/ca/ca3100.uml +++ b/src/ca/ca3100.uml @@ -1,25 +1,15 @@ #include "ca3100.h" #include "camask.h" +#define ALL_EXPORT +#define CLASS_NAME "ca3100a" + TOOLBAR "topbar" 0 0 0 2 #include ENDPAGE -TOOLBAR "bottombar" 0 -2 0 1 - -STRING F_REPORT 256 66 -BEGIN - PROMPT 1 -2 "Report " - FLAGS "B" - CHECKTYPE REQUIRED -END - -STRING DLG_PROFILE 50 -BEGIN - PROMPT 1 -1 "Profilo " - PSELECT -END - +TOOLBAR "bottombar" 0 -3 0 1 +#include ENDPAGE PAGE "Parametri stampa" 0 0 0 2 @@ -151,9 +141,35 @@ BEGIN ITEM "T|Trasferito" END +STRING F_CONTSEP 6 +BEGIN + PROMPT 1 10 "Cont. separata " + USE &NPENT + INPUT CODTAB F_CONTSEP + DISPLAY "Codice@6" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CONTSEP CODTAB + OUTPUT F_DESCONTSEP S0 + CHECKTYPE NORMAL + FIELD CONTSEP + MODULE NP +END + +STRING F_DESCONTSEP 50 48 +BEGIN + PROMPT 26 10 "" + USE &NPENT KEY 2 + INPUT S0 F_DESCONTSEP + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice@6" CODTAB + COPY OUTPUT F_CONTSEP + CHECKTYPE NORMAL + MODULE NP +END + SPREADSHEET F_RIGHE -1 -1 BEGIN - PROMPT 1 12 "Selezione su CdC / Commesse / Fasi" + PROMPT 0 12 "Selezione su CdC / Commesse / Fasi" ITEM "Cdc1" ITEM "Cdc2" ITEM "Cdc3" diff --git a/src/ca/ca3100a.rep b/src/ca/ca3100a.rep index 519db804b..7ace1b3a3 100755 --- a/src/ca/ca3100a.rep +++ b/src/ca/ca3100a.rep @@ -1,8 +1,8 @@ - + Movimenti CA per numero registrazione -
+ -
+ -
+ -
-
+