From 140f6b3dad1699e53c33640a217880f04bf6efe1 Mon Sep 17 00:00:00 2001 From: luca Date: Tue, 28 Jun 2005 15:00:00 +0000 Subject: [PATCH] Patch level :2.2 140 Files correlati : Ricompilazione Demo : [ ] Commento :prima versione funzionante della stampa mastrini analitica (da testare) git-svn-id: svn://10.65.10.50/trunk@13229 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ca/ca3200.cpp | 237 +++++++++++++++++++++++++++++++++++++++++++++----- ca/ca3200.h | 13 ++- ca/ca3200.uml | 15 ---- 3 files changed, 222 insertions(+), 43 deletions(-) diff --git a/ca/ca3200.cpp b/ca/ca3200.cpp index 1f2242ea6..ecde1f2b0 100755 --- a/ca/ca3200.cpp +++ b/ca/ca3200.cpp @@ -1,7 +1,9 @@ #include #include +#include #include +#include "pconana.h" #include "movana.h" #include "rmovana.h" @@ -29,9 +31,9 @@ public: const TString& TPrint_mastrini_ca_mask::get_compatible_library() const { TString& lib = get_tmp_string(); - lib = "ca3200"; - const int stp = get_int(F_TIPOCONTI); - lib << (stp == 1 ? 'a' : 'b'); // tipo di report da usare + lib = "ca3200a"; +// const int stp = get_int(F_TIPOCONTI); +// lib << (stp == 1 ? 'a' : 'b'); // tipo di report da usare in caso di report multipli return lib; } @@ -66,7 +68,7 @@ bool TPrint_mastrini_ca_mask::on_field_event(TOperable_field& o, TField_event e, case F_TIPOCONTI: if (e == fe_init || e == fe_modify) { - test_compatible_report(); //in base al tipo di conti da stampare setta i report compatibili + test_compatible_report(); //in base al tipo di conti da stampare setta i report compatibili (solo nel caso di rep multipli) } break; case F_REPORT: @@ -221,12 +223,13 @@ TPrint_mastrini_ca_mask::TPrint_mastrini_ca_mask() } -/////////////////////////////////////////////////////////// -// RECORDSET -/////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////// +// RECORDSET PRINCIPALE (caso standard: conti movimentati) +/////////////////////////////////////////////////////////////// class TPrint_mastrini_ca_recordset : public TISAM_recordset { +protected: int _anno; int _tipoconti; int _tipimov; @@ -244,7 +247,7 @@ protected: const TImporto& saldo_iniziale(const char* conto) const; public: - void set_filter(const TPrint_mastrini_ca_mask& msk, int cms_row); + virtual void set_filter(const TPrint_mastrini_ca_mask& msk, int cms_row); TPrint_mastrini_ca_recordset(const TString& sql) : TISAM_recordset(sql) { } }; @@ -255,10 +258,6 @@ bool TPrint_mastrini_ca_recordset::valid_record(const TRelation& rel) const { //prima controlla la testata... const TRectype& mov = rel.curr(LF_MOVANA); - - const TDate data = mov.get(MOVANA_DATACOMP); - if (data < _dadata || (_adata.ok() && data > _adata)) - return false; const char tipomov = mov.get_char(MOVANA_TIPOMOV); int tipomov_int = 0; @@ -304,9 +303,11 @@ bool TPrint_mastrini_ca_recordset::mov_filter(const TRelation* rel) void TPrint_mastrini_ca_recordset::set_custom_filter(TCursor& cur) const { //filtro sui conti selezionati sulla maschera - TRectype darec(cur.curr()), arec(cur.curr()); //record corrente (rmovana (solo movimentati) o pconana(altri casi)) - darec.put("CODCONTO", _daconto); - arec.put("CODCONTO", _aconto); + TRectype darec(cur.curr()), arec(cur.curr()); //record corrente (rmovana (solo movimentati)) + darec.put(RMOVANA_CODCONTO, _daconto); + darec.put(RMOVANA_DATACOMP, _dadata); + arec.put(RMOVANA_CODCONTO, _aconto); + arec.put(RMOVANA_DATACOMP, _adata); cur.setregion(darec, arec); myself = this; @@ -390,17 +391,199 @@ void TPrint_mastrini_ca_recordset::set_filter(const TPrint_mastrini_ca_mask& msk case 'P': _tipimov = 6; break; default: _tipimov = 7; break; } - _tipoconti = msk.get(F_TIPOCONTI)[0]; - + _tipoconti = msk.get_int(F_TIPOCONTI); } +///////////////////////////////////////////////////////////////////////////////// +// RECORDSET SECONDARIO (casi alternativi: conti con saldo != 0 e tutti i conti) +///////////////////////////////////////////////////////////////////////////////// + +class TPrint_mastrini_ca_alternative_recordset : public TPrint_mastrini_ca_recordset +{ + TIsamtempfile* _tmp_rmovana; +protected: + const TImporto& saldo_finale(const char* conto) const; + virtual void set_custom_filter(TCursor& cur) const; + +public: + virtual void set_filter(const TPrint_mastrini_ca_mask& msk, int cms_row); + TPrint_mastrini_ca_alternative_recordset(const TString& sql); + ~TPrint_mastrini_ca_alternative_recordset() { delete _tmp_rmovana; } +}; + +TPrint_mastrini_ca_alternative_recordset::TPrint_mastrini_ca_alternative_recordset(const TString& sql) + : TPrint_mastrini_ca_recordset(sql) +{ + _tmp_rmovana = NULL; +} + + +const TImporto& TPrint_mastrini_ca_alternative_recordset::saldo_finale(const char* conto) const +{ + TAnal_bill bill(conto, _codcosto, _codcms, _codfas); + const TSaldanal& saldo = ca_saldo(bill, _dadata, _adata, _tipimov); + return saldo._fin; +} + +void TPrint_mastrini_ca_alternative_recordset::set_custom_filter(TCursor& cur) const +{ + //crea un file temporaneo che non viene distrutto ad inizio stampa effettiva + TIsamtempfile* tmp = new TIsamtempfile(LF_RMOVANA, "anal", false, false); + relation()->replace(tmp); //sostituisce il vero file rmovana con quello temporaneo +} + +void TPrint_mastrini_ca_alternative_recordset::set_filter(const TPrint_mastrini_ca_mask& msk, int cms_row) +{ + //se esiste non vuoto il file temporano con tracciato rmovana lo cancella e lo ricrea vuoto + if (_tmp_rmovana != NULL) + delete _tmp_rmovana; + + _tmp_rmovana = new TIsamtempfile(LF_RMOVANA, "anal", true, true); + + //prende un po' di dati dalla maschera + _daconto, _aconto, _codcosto = _codcms = _codfas = ""; + if (cms_row >= 0) + { + TSheet_field& sf = msk.sfield(F_RIGHE); + TMask& sm = sf.sheet_mask(); + sf.update_mask(cms_row); + TRelation rel(LF_RMOVANA); + sm.autosave(rel); + _codcosto = rel.curr().get(RMOVANA_CODCCOSTO); + _codcms = rel.curr().get(RMOVANA_CODCMS); + _codfas = rel.curr().get(RMOVANA_CODFASE); + } + + for (int i = 0; msk.id2pos(F_CDC1_INI+i) > 0; i++) + { + _daconto << msk.get(F_CDC1_INI+i); + _aconto << msk.get(F_CDC1_FIN+i); + } + + _dadata = msk.get_date(F_DATAINI); + _adata = msk.get_date(F_DATAFIN); + + _tipimov = 0; + switch (msk.get(F_TIPIMOV)[0]) + { + case 'N': _tipimov = 1; break; + case 'P': _tipimov = 6; break; + default: _tipimov = 7; break; + } + + _tipoconti = msk.get_int(F_TIPOCONTI); + + //scandisce il piano dei conti analitico creando un cursore con i conti nell'intervallo scelto sulla maschera + TRelation rel_pconana(LF_PCONANA); + + TRectype daconto(LF_PCONANA); + daconto.put(PCONANA_CODCONTO, _daconto); + TRectype aconto(LF_PCONANA); + aconto.put(PCONANA_CODCONTO, _aconto); + + //solo i gr/co/sottoc completi interessano!!! + int contolen = 0; + const TMultilevel_code_info& info = ca_multilevel_code_info(LF_PCONANA); + for (int l = info.levels()-1; l >= 0; l--) + contolen += info.len(l); + + TString filtro; + filtro << "LEN(CODCONTO)==" << contolen; + + TCursor cur_pconana(&rel_pconana, filtro, 1, &daconto, &aconto); + const long pconana_items = cur_pconana.items(); + cur_pconana.freeze(); + TProgind pi(pconana_items, "Scansione conti..."); + + //scandisce il piano dei conti.. + for (cur_pconana = 0; cur_pconana.pos() < pconana_items; ++cur_pconana) + { + pi.addstatus(1); + TRectype& current_pconana_rec = cur_pconana.curr(); + const TString conto = current_pconana_rec.get(PCONANA_CODCONTO); + + bool aggiungi = true; + if (_tipoconti == 2) //se si è scelto di stampare solo quelli con saldo != 0... + { + const TImporto& saldo_fin = saldo_finale(conto); + aggiungi = !saldo_fin.is_zero(); + } + if (aggiungi) //se il conto va aggiunto (casi: conti con saldo !=0 trovato, tutti i conti comunque).. + { + TRelation rel_rmovana(LF_RMOVANA); + rel_rmovana.add(LF_MOVANA, "NUMREG==NUMREG"); //aggiunge le testate x avere i tipi mov. + + //..crea un cursore su rmovana per vedere se i conti selezionati hanno veri movimenti che soddisfano + //i parametri del filtro sulla maschera + TRectype da_rmovana(LF_RMOVANA); + da_rmovana.put(RMOVANA_CODCONTO, conto); + da_rmovana.put(RMOVANA_DATACOMP, _dadata); + TRectype a_rmovana(LF_RMOVANA); + a_rmovana.put(RMOVANA_CODCONTO, conto); + a_rmovana.put(RMOVANA_DATACOMP, _adata); + + TString filtro; + if (_codcosto.not_empty()) + filtro << "(" << RMOVANA_CODCCOSTO << "==\"" << _codcosto << "\")"; + if (_codcms.not_empty()) + { + if (filtro.not_empty()) + filtro << "&&"; + filtro << "(" << RMOVANA_CODCMS << "==\"" << _codcms << "\")"; + } + if (_codfas.not_empty()) + { + if (filtro.not_empty()) + filtro << "&&"; + filtro << "(" << RMOVANA_CODFASE << "==\"" << _codfas << "\")"; + } + + TCursor cur_rmovana(&rel_rmovana, filtro, 2, &da_rmovana, &a_rmovana); + const long rmovana_items = cur_rmovana.items(); + cur_rmovana.freeze(); + bool almeno_uno_aggiunto = false; + if (rmovana_items > 0) + { + for (cur_rmovana = 0; cur_rmovana.pos() < rmovana_items; ++cur_rmovana) + { + //deve coincidere anche il tipomov! sarebbe stato troppo semplice... + const char tipomov = rel_rmovana.curr(LF_MOVANA).get_char(MOVANA_TIPOMOV); + int tipomov_int = 0; + switch (tipomov) + { + case 'P': tipomov_int = 2; break; + case 'V': tipomov_int = 4; break; + default: tipomov_int = 1; break; + } + if ((_tipimov & tipomov_int) != 0) + { + _tmp_rmovana->write(cur_rmovana.curr()); // aggiunge i record al file temporaneo + almeno_uno_aggiunto = true; + } + } + } + //se non ha aggiunto nemmeno un record valido.. + //crea un record di rmovana con il solo conto,datacomp e lo aggiunge al file temporaneo + if (!almeno_uno_aggiunto) + { + TRectype fake_rmovana_rec(LF_RMOVANA); + fake_rmovana_rec.put(RMOVANA_CODCONTO, conto); + fake_rmovana_rec.put(RMOVANA_DATACOMP, _dadata); + _tmp_rmovana->write(fake_rmovana_rec); + } + + } //end if aggiungi + + } //end for su pconana_items + +} + //////////////////////////////////////////////////////// // REPORT //////////////////////////////////////////////////////// class TPrint_mastrini_ca_rep : public TAnal_report { -int _anno; protected: virtual bool set_recordset(const TString& sql); @@ -423,8 +606,22 @@ bool TPrint_mastrini_ca_rep::set_recordset(const TString& sql) void TPrint_mastrini_ca_rep::set_filter(const TPrint_mastrini_ca_mask& msk, int cms_row) { - TPrint_mastrini_ca_recordset* rs = (TPrint_mastrini_ca_recordset*)recordset(); - rs->set_filter(msk, cms_row); + const int tipoconti = msk.get_int(F_TIPOCONTI); + + TPrint_mastrini_ca_recordset* recset = NULL; + + const char* query ="USE RMOVANA KEY 2\nJOIN MOVANA INTO NUMREG==NUMREG"; + switch (tipoconti) + { + case 1: + recset = new TPrint_mastrini_ca_recordset(query); + break; + default: + recset = new TPrint_mastrini_ca_alternative_recordset(query); + break; + } + recset->set_filter(msk, cms_row); + TAnal_report::set_recordset(recset); } //////////////////////////////////////////////////////// diff --git a/ca/ca3200.h b/ca/ca3200.h index a7d1cc3d3..b546c677d 100755 --- a/ca/ca3200.h +++ b/ca/ca3200.h @@ -19,16 +19,13 @@ #define F_DES4_FIN 239 //campi sulla maschera -#define F_DATAINI 290 -#define F_DATAFIN 291 -#define F_STAMPA_PROG_ATT 292 -#define F_STAMPA_SALDI_PROG 293 -#define F_STAMPA_SALDI_SCAL 294 -#define F_TIPOCONTI 295 -#define F_TIPIMOV 296 +#define F_DATAINI 250 +#define F_DATAFIN 251 +#define F_TIPOCONTI 252 +#define F_TIPIMOV 253 //sheet di pagina 2 -#define F_RIGHE 300 +#define F_RIGHE 260 #define S_CDC1 101 #define S_CDC2 102 diff --git a/ca/ca3200.uml b/ca/ca3200.uml index 7c2612e1a..8f9a2ec13 100755 --- a/ca/ca3200.uml +++ b/ca/ca3200.uml @@ -109,21 +109,6 @@ DATE F_DATAFIN BEGIN PROMPT 62 17 "" END - -BOOLEAN F_STAMPA_PROG_ATT -BEGIN - PROMPT 2 18 "Stampa progressivi attuali" -END - -BOOLEAN F_STAMPA_SALDI_PROG -BEGIN - PROMPT 30 18 "Stampa saldi progressivi" -END - -BOOLEAN F_STAMPA_SALDI_SCAL -BEGIN - PROMPT 55 18 "Stampa saldo scalare" -END LIST F_TIPOCONTI 24 BEGIN