diff --git a/ca/ca3700.cpp b/ca/ca3700.cpp index 6078a3123..dbff84f42 100755 --- a/ca/ca3700.cpp +++ b/ca/ca3700.cpp @@ -247,6 +247,7 @@ protected: void crea_righe_rdoc(const TPrint_rendiconto_ca_mask& msk); void crea_trr(const TFilename& trr) const; void salva_rmovana(const TRectype& rmovana, const TRectype& movana); + real somma_budget(const TString& codconto, const char* tipomovana); public: @@ -259,6 +260,8 @@ public: static const TPrint_rendiconto_ca_recordset* myself = NULL; +TPrint_rendiconto_ca_recordset* rendiconto_recordset() { return (TPrint_rendiconto_ca_recordset* ) myself;} + //metodo per riconoscere se il record corrente soddisfa i filtri della maschera...strafighissimo! bool TPrint_rendiconto_ca_recordset::valid_record(const TRelation& rel) const { @@ -309,7 +312,7 @@ bool TPrint_rendiconto_ca_recordset::mov_filter(const TRelation* rel) void TPrint_rendiconto_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)) + TRectype darec(cur.curr()), arec(cur.curr()); darec.put(RMOVANA_CODCONTO, _daconto); darec.put(RMOVANA_DATACOMP, _dadata); arec.put(RMOVANA_CODCONTO, _aconto); @@ -320,28 +323,80 @@ void TPrint_rendiconto_ca_recordset::set_custom_filter(TCursor& cur) const cur.set_filterfunction(mov_filter, true); } +//metodo per il calcolo del budget PREVENTIVO o VARIAZIONE (sezione di raggruppamento sul report) +real TPrint_rendiconto_ca_recordset::somma_budget(const TString& codconto, const char* tipomovana) +{ + real budget = ZERO; + + TRelation rel_rmovana(LF_RMOVANA); + rel_rmovana.add(LF_MOVANA, "NUMREG==NUMREG"); + + //..crea un cursore su movana per avere solo i conti di tipo tipomovana, con il codice conto + //selezionato e la datacomp compresa nell'intervallo date + TRectype da_rmovana(LF_RMOVANA); + da_rmovana.put(RMOVANA_CODCONTO, codconto); + da_rmovana.put(RMOVANA_DATACOMP, _dadata); + TRectype a_rmovana(LF_RMOVANA); + a_rmovana.put(RMOVANA_CODCONTO, codconto); + a_rmovana.put(RMOVANA_DATACOMP, _adata); + + TString filtro; + filtro << "(MOVANA_TIPODOC==" << tipomovana << ")"; + + TCursor cur_rmovana(&rel_rmovana, filtro, 2, &da_rmovana, &a_rmovana); + const long rmovana_items = cur_rmovana.items(); + cur_rmovana.freeze(); + + if (rmovana_items > 0) + { + const TRectype& movana = rel_rmovana.curr(LF_MOVANA); + for (cur_rmovana = 0; cur_rmovana.pos() < rmovana_items; ++cur_rmovana) + { + if (movana.get_char(MOVANA_SEZIONE) == 'D') + budget -= movana.get_real(MOVANA_TOTDOC); + if (movana.get_char(MOVANA_SEZIONE) == 'A') + budget += movana.get_real(MOVANA_TOTDOC); + } + } + return budget; +} const TVariant& TPrint_rendiconto_ca_recordset::get(const char* column_name) const { - if (strcmp(column_name, "#COSTO") == 0) - { - TVariant& var = get_tmp_var(); - var = _codcosto; - return var; - } - if (strcmp(column_name, "#COMMESSA") == 0) - { - TVariant& var = get_tmp_var(); - var = _codcms; - return var; - } - if (strcmp(column_name, "#FASE") == 0) - { - TVariant& var = get_tmp_var(); - var = _codfas; - return var; - } + if (*column_name == '#') + { + if (strcmp(column_name, "#COSTO") == 0) + { + TVariant& var = get_tmp_var(); + var = _codcosto; + return var; + } + if (strcmp(column_name, "#COMMESSA") == 0) + { + TVariant& var = get_tmp_var(); + var = _codcms; + return var; + } + if (strcmp(column_name, "#FASE") == 0) + { + TVariant& var = get_tmp_var(); + var = _codfas; + return var; + } + if (strcmp(column_name, "#PREVENTIVO") == 0) + { + TVariant& var = get_tmp_var(); + var = rendiconto_recordset()->somma_budget(get(RMOVANA_CODCONTO).as_string(), "P"); + return var; + } + if (strcmp(column_name, "#VARIAZIONE") == 0) + { + TVariant& var = get_tmp_var(); + var = rendiconto_recordset()->somma_budget(get(RMOVANA_CODCONTO).as_string(), "V"); + return var; + } + } return TISAM_recordset::get(column_name); } @@ -353,8 +408,8 @@ void TPrint_rendiconto_ca_recordset::salva_rmovana(const TRectype& rmovana, cons { //scegli i campi da mettere _tmp->curr().put("CONTO", rmovana.get(RMOVANA_CODCONTO)); //conto - _tmp->curr().put("DCODNUM", movana.get(MOVANA_DCODNUM)); //codnum del documento che origina il movana - _tmp->curr().put("DATAREG", movana.get(MOVANA_DATAREG)); //data del movana + _tmp->curr().put("CODNUM", movana.get(MOVANA_DCODNUM)); //codnum del documento che origina il movana + _tmp->curr().put("DATA", movana.get(MOVANA_DATAREG)); //data del movana _tmp->curr().put("NUMREG", movana.get(MOVANA_NUMREG)); _tmp->curr().put("NUMDOCRIF", movana.get(MOVANA_DNDOC)); _tmp->curr().put("DATADOCRIF", movana.get(MOVANA_DATADOC)); @@ -497,7 +552,7 @@ void TPrint_rendiconto_ca_recordset::crea_righe_rdoc(const TPrint_rendiconto_ca_ void TPrint_rendiconto_ca_recordset::crea_trr(const TFilename& trr) const { ofstream of(trr); - of << 1005 << endl; + of << 1000 << endl; of << 13 << endl; of << "CONTO|1|20|0|Conto analitico" << endl; of << "CODNUM|1|4|0|Numerazione documento" << endl; @@ -519,8 +574,12 @@ void TPrint_rendiconto_ca_recordset::crea_trr(const TFilename& trr) const void TPrint_rendiconto_ca_recordset::set_filter(const TPrint_rendiconto_ca_mask& msk, int cms_row) { //se esiste il file temporano con tracciato persomalizzato lo cancella e lo ricrea vuoto - TFilename trr; trr.temp(); trr.add("rendiconto.trr"); - TFilename dbf(trr); dbf.ext("dbf"); + TFilename trr; + trr.temp("rendy"); + TFilename dbf(trr); + + trr.ext("trr"); + dbf.ext("dbf"); //crea il file .trr in base ai parametri del metodo crea_trr(trr);