Patch level :10.0

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :riportata esportazione rendiconto


git-svn-id: svn://10.65.10.50/trunk@18715 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2009-04-16 09:41:08 +00:00
parent b6f46b1b03
commit 589a23f49a
4 changed files with 371 additions and 235 deletions

View File

@ -3,6 +3,7 @@
#include <execp.h> #include <execp.h>
#include <progind.h> #include <progind.h>
#include <reprint.h> #include <reprint.h>
#include <reputils.h>
#include <doc.h> #include <doc.h>
#include <rdoc.h> #include <rdoc.h>
#include "../cg/cg2103.h" #include "../cg/cg2103.h"
@ -146,7 +147,7 @@ bool TPrint_rendiconto_ca_mask::on_field_event(TOperable_field& o, TField_event
_print_mode = 'A'; _print_mode = 'A';
stop_run(K_ENTER); stop_run(K_ENTER);
return false; return false;
} }
break; break;
case DLG_EXPORT: case DLG_EXPORT:
if (e == fe_button) if (e == fe_button)
@ -259,7 +260,6 @@ TPrint_rendiconto_ca_mask::TPrint_rendiconto_ca_mask()
class TPrint_rendiconto_ca_recordset : public TISAM_recordset class TPrint_rendiconto_ca_recordset : public TISAM_recordset
{ {
TExternisamfile* _tmp;
bool _riclassificato; bool _riclassificato;
bool _reverse_cos_ric; bool _reverse_cos_ric;
bool _implode_rows; bool _implode_rows;
@ -273,40 +273,38 @@ protected:
bool _vitaintera; bool _vitaintera;
long _danumreg, _anumreg; long _danumreg, _anumreg;
TString _daconto, _aconto, _codcosto, _codcms, _codfas; TString _daconto, _aconto, _codcosto, _codcms, _codfas;
protected: //da libreria
virtual const TVariant& get(const char* column_name) const;
protected: protected:
static bool mov_filter(const TRelation* rel); static bool mov_filter(const TRelation* rel);
bool valid_record(const TRelation& rel) const; bool valid_record(const TRelation& rel) const;
virtual void set_custom_filter(TCursor& cur) const; virtual void set_custom_filter(TCursor& cur) const;
void crea_righe_da_rmovana(); void crea_righe_da_rmovana(TLocalisamfile& tmp, TLog_report& log);
void crea_righe_da_rdoc(const TPrint_rendiconto_ca_mask& msk); void crea_righe_da_rdoc(TLocalisamfile& tmp, const TPrint_rendiconto_ca_mask& msk, TLog_report& log);
void crea_trr(const TFilename& trr) const; void crea_trr(const TFilename& trr) const;
void scrive_riga(const TRectype& rmovana, const TRectype& movana, const TDocumento* doc); void scrive_riga(TLocalisamfile& tmp, const TRectype& rmovana, const TRectype& movana, const TDocumento* doc,
void scrive_riga_speciale(const TDocumento* doc, const TString_array& special_docs); TLog_report& log);
void scrive_riga_speciale(TLocalisamfile& tmp, const TDocumento* doc, const TString_array& special_docs);
int sort_indbil(int indbil) const; int sort_indbil(int indbil) const;
const TString& riclassifica(const TBill& zio, TRectype& tmpcurr) const; const TString& riclassifica(const TBill& zio, TRectype& tmpcurr) const;
const TString& riclassifica(const TString& contone, TRectype& tmpcurr) const; const TString& riclassifica(const TString& contone, TRectype& tmpcurr) const;
real get_budget(const TString& conto, char tipo) const;
bool is_causale_rateo_risconto(const char* codcaus); bool is_causale_rateo_risconto(const char* codcaus);
public: //da libreria
virtual const TVariant& get(const char* column_name) const;
public: public:
virtual void set_filter(const TPrint_rendiconto_ca_mask& msk, int cms_row); void set_filter(const TPrint_rendiconto_ca_mask& msk, int cms_row, TLog_report& log);
void set_cms_cdc_fase(const char* cdc, const char* cms, const char* fase);
real get_budget(const TString& conto, char tipo) const;
TPrint_rendiconto_ca_recordset(const TString& sql); TPrint_rendiconto_ca_recordset(const TString& sql);
~TPrint_rendiconto_ca_recordset(); ~TPrint_rendiconto_ca_recordset();
}; };
static TPrint_rendiconto_ca_recordset* myself = NULL;
TPrint_rendiconto_ca_recordset::TPrint_rendiconto_ca_recordset(const TString& sql) TPrint_rendiconto_ca_recordset::TPrint_rendiconto_ca_recordset(const TString& sql)
: TISAM_recordset(sql), _riclassificato(false), _tmp(NULL) : TISAM_recordset(sql), _riclassificato(false)
{ {
//Controlla sul file di configurazione di CA (ditta.ini,[ca]) se esistono causali di tipo.. //Controlla sul file di configurazione di CA (ditta.ini,[ca]) se esistono causali di tipo..
//..rateo/risconto che devono essere calcolate come solo maturato (Eva Braun request) //..rateo/risconto che devono essere calcolate come solo maturato (Eva Braun request)
@ -326,55 +324,57 @@ TPrint_rendiconto_ca_recordset::~TPrint_rendiconto_ca_recordset()
{ } { }
//filtro ulteriore sul file rendy.dbf già creato
void TPrint_rendiconto_ca_recordset::set_custom_filter(TCursor& cur) const void TPrint_rendiconto_ca_recordset::set_custom_filter(TCursor& cur) const
{ {
relation()->replace(_tmp); //sostituisce il vero file rmovana con quello temporaneo //la region serve solo nella chiave 1!!!
if (cur.key() == 1)
//filtro sul file esterno (_tmp, cioè 1000) sui conti selezionati sulla maschera {
TRectype darec(cur.curr()), arec(cur.curr()); //curr perchè è il file externisamfile //filtro sul file esterno (tmp, cioè rendy.dbf) sui conti selezionati sulla maschera
darec.zero(); TRectype darec(cur.curr()), arec(cur.curr()); //curr perchè è il file externisamfile
arec.zero(); darec.zero();
arec.zero();
if (_daconto.not_empty()) if (_daconto.not_empty())
{ {
darec.put("ORDCONT", 1); darec.put("ORDCONT", 1);
darec.put("CONTO", _daconto); darec.put("CONTO", _daconto);
} }
if (_aconto.not_empty()) if (_aconto.not_empty())
{ {
arec.put("ORDCONT", 5); arec.put("ORDCONT", 5);
arec.put("CONTO", _aconto); arec.put("CONTO", _aconto);
} }
cur.setregion(darec, arec);
}
//filtro sulla data(non avendo anche codnum non ho la chiave completa per mettere la data nella setregion) //filtro sulla data(non avendo anche codnum non ho la chiave completa per mettere la data nella setregion)
TString filtro; TString filtro;
if (_dadata.ok()) if (_dadata.ok() || _adata.ok())
filtro << "(ANSI(DATA)>=" << _dadata << ")"; {
if (_vitaintera)
filtro << "(BETWEEN(DATA," << _dadata.date2ansi() << ",0))";
else
filtro << "(BETWEEN(DATA," << _dadata.date2ansi() << "," << _adata.date2ansi() << "))";
}
if (_adata.ok() && !_vitaintera) //se vitaintera non si può avere una data limite superiore //vera selezione sui conti
if (_daconto.full() || _aconto.full())
{ {
if (filtro.not_empty()) if (filtro.not_empty())
filtro << "&&"; filtro << "&&";
filtro << "(ANSI(DATA)<=" << _adata << ")"; if (_daconto == _aconto)
filtro << "(CONTO[1," << _daconto.len() << "]==\"" << _daconto << "\")";
else
filtro << "(BETWEEN(CONTO,\"" << _daconto << "\",\"" << _aconto << "~\"))";
} }
if (_daconto.not_empty())
{
if (filtro.not_empty())
filtro << "&&";
filtro << "(CONTO>='" << _daconto << "')";
}
if (_aconto.not_empty())
{
if (filtro.not_empty())
filtro << "&&";
filtro << "(CONTO<='" << _aconto << "~')";
}
cur.setregion(darec, arec);
cur.setfilter(filtro); cur.setfilter(filtro);
}
myself = (TPrint_rendiconto_ca_recordset*)this; void TPrint_rendiconto_ca_recordset::set_cms_cdc_fase(const char* cdc, const char* cms, const char* fase)
{
_codcosto = cdc;
_codcms = cms;
_codfas = fase;
} }
//sconvolgente metodo per la normalizzazione dei conti //sconvolgente metodo per la normalizzazione dei conti
@ -590,15 +590,26 @@ bool TPrint_rendiconto_ca_recordset::is_causale_rateo_risconto(const char* codca
} }
//compila i campi del file temporaneo che sara' poi stampato //compila i campi del file temporaneo che sara' poi stampato
void TPrint_rendiconto_ca_recordset::scrive_riga(const TRectype& rmovana, const TRectype& movana, const TDocumento* doc) void TPrint_rendiconto_ca_recordset::scrive_riga(TLocalisamfile& tmp, const TRectype& rmovana, const TRectype& movana,
const TDocumento* doc, TLog_report& log)
{ {
TRectype& tmpcurr = _tmp->curr(); TRectype& tmpcurr = tmp.curr();
tmpcurr.zero(); tmpcurr.zero();
TString8 codnum_desc; //codnum da usare sia per compilare il campo "CODNUM" TString8 codnum_desc; //codnum da usare sia per compilare il campo "CODNUM"
codnum_desc.cut(0); codnum_desc.cut(0);
//----- CONTI -----// //----- CONTI -----//
TString codconto = rmovana.get(RMOVANA_CODCONTO); const TString80 codconto_originale = rmovana.get(RMOVANA_CODCONTO);
if (codconto_originale.blank())
{
TString error_string;
const long error_numreg = rmovana.get_long(RMOVANA_NUMREG);
const int error_numrig = rmovana.get_int(RMOVANA_NUMRIG);
error_string.format("NON esiste il conto sulla riga %d del movimento %ld !!", error_numrig, error_numreg);
log.log(2, error_string);
return;
}
TString80 codconto = codconto_originale;
TString codcontocg; TString codcontocg;
int indbil = 0; int indbil = 0;
@ -738,7 +749,7 @@ void TPrint_rendiconto_ca_recordset::scrive_riga(const TRectype& rmovana, const
{ {
//Controlla se il documento di origine (padre del documento da cui deriva l'attuale riga.. //Controlla se il documento di origine (padre del documento da cui deriva l'attuale riga..
//..di analitica) era una FDR/FDE... //..di analitica) era una FDR/FDE...
const TCodice_numerazione& kodice_num = cached_numerazione(babbo_codnum); const TCodice_numerazione kodice_num(babbo_codnum);
//Se lo era... //Se lo era...
if (kodice_num.fattura_emettere_ricevere()) if (kodice_num.fattura_emettere_ricevere())
{ {
@ -902,6 +913,12 @@ F=IMF*/
//----Scrittura Conti sul file----// //----Scrittura Conti sul file----//
//Scrittura dei conti (i valori delle variabili sono stati settati nella parte iniziale del metodo) //Scrittura dei conti (i valori delle variabili sono stati settati nella parte iniziale del metodo)
//mette i conti nel file (se piano dei conti puramente contabile i valori coincidono) //mette i conti nel file (se piano dei conti puramente contabile i valori coincidono)
if (codconto.blank())
{
TString error_message;
error_message.format("Il conto %s non è riclassificato!", codcontocg);
log.log(2, error_message);
}
tmpcurr.put("CONTO", codconto); //conto tmpcurr.put("CONTO", codconto); //conto
tmpcurr.put("CONTOCG", codcontocg); //conto_cg tmpcurr.put("CONTOCG", codcontocg); //conto_cg
@ -931,7 +948,7 @@ F=IMF*/
//scrive sul file di appoggio il record appena riempito //scrive sul file di appoggio il record appena riempito
int err = _tmp->write(); int err = tmp.write();
//se e' in modalita' di ricompattamento righe ripartite.. //se e' in modalita' di ricompattamento righe ripartite..
if (_implode_rows) if (_implode_rows)
@ -942,7 +959,7 @@ F=IMF*/
{ {
const int new_nriga = tmpcurr.get_int("NRIGA") + 1; const int new_nriga = tmpcurr.get_int("NRIGA") + 1;
tmpcurr.put("NRIGA", new_nriga); tmpcurr.put("NRIGA", new_nriga);
err = _tmp->write(); err = tmp.write();
} }
} }
@ -951,7 +968,7 @@ F=IMF*/
//compila i campi del file temporaneo che sara' poi stampato per i documenti speciali.. //compila i campi del file temporaneo che sara' poi stampato per i documenti speciali..
//..quali le fatture da emettere e ricevere, la cui lista e' nel ca_config //..quali le fatture da emettere e ricevere, la cui lista e' nel ca_config
void TPrint_rendiconto_ca_recordset::scrive_riga_speciale(const TDocumento* doc, const TString_array& special_docs) void TPrint_rendiconto_ca_recordset::scrive_riga_speciale(TLocalisamfile& tmp, const TDocumento* doc, const TString_array& special_docs)
{ {
//prende il tipocf che gli serve un po' ovunque in seguito.. //prende il tipocf che gli serve un po' ovunque in seguito..
const char tipocf = doc->get_char(DOC_TIPOCF); const char tipocf = doc->get_char(DOC_TIPOCF);
@ -963,7 +980,7 @@ void TPrint_rendiconto_ca_recordset::scrive_riga_speciale(const TDocumento* doc,
if (special_docs.find(rigadoc.get(RDOC_DACODNUM)) > 0) if (special_docs.find(rigadoc.get(RDOC_DACODNUM)) > 0)
{ {
TRectype& tmpcurr = _tmp->curr(); TRectype& tmpcurr = tmp.curr();
tmpcurr.zero(); tmpcurr.zero();
TString8 codnum_desc; TString8 codnum_desc;
codnum_desc.cut(0); codnum_desc.cut(0);
@ -1095,7 +1112,7 @@ void TPrint_rendiconto_ca_recordset::scrive_riga_speciale(const TDocumento* doc,
tmpcurr.put("FATTURATO", importo); tmpcurr.put("FATTURATO", importo);
} }
_tmp->write(); tmp.write();
} //if(special_docs... } //if(special_docs...
} // for (inti=1;i<=rows... } // for (inti=1;i<=rows...
@ -1103,7 +1120,7 @@ void TPrint_rendiconto_ca_recordset::scrive_riga_speciale(const TDocumento* doc,
//scanning delle righe dei movimenti di analitica //scanning delle righe dei movimenti di analitica
void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana() void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana(TLocalisamfile& tmp, TLog_report& log)
{ {
TRelation rel_rmovana(LF_RMOVANA); TRelation rel_rmovana(LF_RMOVANA);
rel_rmovana.add(LF_MOVANA, "NUMREG==NUMREG"); //aggiunge le testate x avere tipi mov e descr rel_rmovana.add(LF_MOVANA, "NUMREG==NUMREG"); //aggiunge le testate x avere tipi mov e descr
@ -1187,7 +1204,7 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana()
const int last_row = righe_compattate.last_row(); const int last_row = righe_compattate.last_row();
for (int i = righe_compattate.first_row(); i > 0 && i <= last_row; i = righe_compattate.succ_row(i)) for (int i = righe_compattate.first_row(); i > 0 && i <= last_row; i = righe_compattate.succ_row(i))
scrive_riga(righe_compattate.row(i), old_movana, NULL); scrive_riga(tmp, righe_compattate.row(i), old_movana, NULL, log);
} }
//aggiorna il valore di testata con quella nuova per il prossimo movimento //aggiorna il valore di testata con quella nuova per il prossimo movimento
old_movana = movana; old_movana = movana;
@ -1211,14 +1228,15 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana()
{ {
if (!pi.addstatus(1)) if (!pi.addstatus(1))
break; break;
scrive_riga(rmovana, movana, NULL); scrive_riga(tmp, rmovana, movana, NULL, log);
} }
} }
} }
} }
//scanning delle righe dei documenti //scanning delle righe dei documenti
void TPrint_rendiconto_ca_recordset::crea_righe_da_rdoc(const TPrint_rendiconto_ca_mask& msk) void TPrint_rendiconto_ca_recordset::crea_righe_da_rdoc(TLocalisamfile& tmp, const TPrint_rendiconto_ca_mask& msk,
TLog_report& log)
{ {
TRelation rel_rdoc(LF_RIGHEDOC); TRelation rel_rdoc(LF_RIGHEDOC);
rel_rdoc.add(LF_DOC, "CODNUM==CODNUM|ANNO==ANNO|PROVV==PROVV|NDOC==NDOC"); //aggiunge le testate rel_rdoc.add(LF_DOC, "CODNUM==CODNUM|ANNO==ANNO|PROVV==PROVV|NDOC==NDOC"); //aggiunge le testate
@ -1395,13 +1413,13 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rdoc(const TPrint_rendiconto_
if (_codfas.not_empty() && rmov.get(RMOVANA_CODFASE) != _codfas) if (_codfas.not_empty() && rmov.get(RMOVANA_CODFASE) != _codfas)
continue; continue;
scrive_riga(rmov, mov, &doc); //documenti "normali" scrive_riga(tmp, rmov, mov, &doc, log); //documenti "normali"
} //for int j... } //for int j...
} }
else else
{ {
//righe di documento configurate come da emettere/ricevere (documenti speciali) //righe di documento configurate come da emettere/ricevere (documenti speciali)
scrive_riga_speciale(&doc, num_fdr); scrive_riga_speciale(tmp, &doc, num_fdr);
} }
} //if (numregca==0... } //if (numregca==0...
@ -1445,17 +1463,19 @@ void TPrint_rendiconto_ca_recordset::crea_trr(const TFilename& trr) const
of << "DATADOCRIF|5|8|0|Data documento riferimento" << endl; of << "DATADOCRIF|5|8|0|Data documento riferimento" << endl;
of << "DESC|1|50|0|Descrizione movimento o documento" << endl; of << "DESC|1|50|0|Descrizione movimento o documento" << endl;
of << "DESCRIGA|1|50|0|Descrizione riga movimento o documento" << endl; of << "DESCRIGA|1|50|0|Descrizione riga movimento o documento" << endl;
of << "DOCORIG|11|10|0|Riferimenti ordine/bolla" << endl; of << "DOCORIG|1|50|0|Riferimenti ordine/bolla" << endl;
of << "FATTURATO|4|18|5|Fatturato" << endl; of << "FATTURATO|4|18|5|Fatturato" << endl;
of << "MATURATO|4|18|5|Maturato" << endl; of << "MATURATO|4|18|5|Maturato" << endl;
of << "IMPEGNATO|4|18|5|Impegnato" << endl; of << "IMPEGNATO|4|18|5|Impegnato" << endl;
of << "CONTOCG|1|12|0|Conto contabile" << endl; of << "CONTOCG|1|12|0|Conto contabile" << endl;
of << "HIDDEN|8|1|0|Record nascosto" << endl; of << "HIDDEN|8|1|0|Record nascosto" << endl;
of << 1 << endl; of << 3 << endl;
of << "ORDCONT+CONTO+DATA+CODNUM+NUMRD+NUMREG+NRIGA" << endl; of << "ORDCONT+CONTO+DATA+CODNUM+NUMRD+NUMREG+NRIGA" << endl;
of << "CODCMS+CONTO+DATA|X" << endl;
of << "CODCOSTO+CONTO+DATA|X" << endl;
} }
void TPrint_rendiconto_ca_recordset::set_filter(const TPrint_rendiconto_ca_mask& msk, int cms_row) void TPrint_rendiconto_ca_recordset::set_filter(const TPrint_rendiconto_ca_mask& msk, int cms_row, TLog_report& log)
{ {
//se esiste il file temporano con tracciato persomalizzato lo cancella e lo ricrea vuoto //se esiste il file temporano con tracciato persomalizzato lo cancella e lo ricrea vuoto
TFilename trr; //file tracciato record TFilename trr; //file tracciato record
@ -1468,13 +1488,10 @@ void TPrint_rendiconto_ca_recordset::set_filter(const TPrint_rendiconto_ca_mask&
//crea il file .trr in base ai parametri del metodo //crea il file .trr in base ai parametri del metodo
crea_trr(trr); crea_trr(trr);
//svuota la memoria dal vecchio file temporaneo
if (_tmp != NULL)
delete _tmp;
//crea in memoria il nuovo file temporaneo e lo azzera (non si sa mai..) //crea in memoria il nuovo file temporaneo e lo azzera (non si sa mai..)
_tmp = new TExternisamfile(dbf, trr); TExternisamfile tmp(dbf, trr, true);
_tmp->zap(); tmp.zap();
//prende un po' di dati dalla maschera... //prende un po' di dati dalla maschera...
_piano, _daconto, _aconto, _codcosto, _codcms, _codfas = ""; _piano, _daconto, _aconto, _codcosto, _codcms, _codfas = "";
@ -1537,9 +1554,9 @@ void TPrint_rendiconto_ca_recordset::set_filter(const TPrint_rendiconto_ca_mask&
//metodi per riempire il file da cui generare il report //metodi per riempire il file da cui generare il report
//dati estratti dalle righe movimenti di contabilita' analitica //dati estratti dalle righe movimenti di contabilita' analitica
crea_righe_da_rmovana(); crea_righe_da_rmovana(tmp, log);
//dati estratti dalle righe documenti //dati estratti dalle righe documenti
crea_righe_da_rdoc(msk); crea_righe_da_rdoc(tmp, msk, log);
} }
@ -1554,7 +1571,7 @@ protected:
virtual bool get_usr_val(const TString& name, TVariant& var) const; virtual bool get_usr_val(const TString& name, TVariant& var) const;
public: public:
void set_filter(const TPrint_rendiconto_ca_mask& msk, int cms_row); void set_filter(const TPrint_rendiconto_ca_mask& msk, int cms_row, const int recset_key, TLog_report& log);
}; };
bool TPrint_rendiconto_ca_rep::get_usr_val(const TString& name, TVariant& var) const bool TPrint_rendiconto_ca_rep::get_usr_val(const TString& name, TVariant& var) const
@ -1568,15 +1585,17 @@ bool TPrint_rendiconto_ca_rep::set_recordset(const TString& sql)
return TAnal_report::set_recordset(rs); return TAnal_report::set_recordset(rs);
} }
void TPrint_rendiconto_ca_rep::set_filter(const TPrint_rendiconto_ca_mask& msk, int cms_row) void TPrint_rendiconto_ca_rep::set_filter(const TPrint_rendiconto_ca_mask& msk, int cms_row, const int recset_key, TLog_report& log)
{ {
TAnal_report::set_recordset(NULL); // Forza azzeramento file Rendy.dbf prima di ricostruirlo TAnal_report::set_recordset(NULL); // Forza azzeramento file Rendy.dbf prima di ricostruirlo
const char* query ="USE 1000\nJOIN MOVANA INTO NUMREG==NUMRD\nJOIN RMOVANA INTO NUMREG==NUMRD NUMRIG==NRIGA"; TString query ="USE RENDY.DBF";
query << " KEY " << recset_key << "\n";
query << "JOIN MOVANA INTO NUMREG==NUMRD\nJOIN RMOVANA INTO NUMREG==NUMRD NUMRIG==NRIGA";
TPrint_rendiconto_ca_recordset* recset = new TPrint_rendiconto_ca_recordset(query); TPrint_rendiconto_ca_recordset* recset = new TPrint_rendiconto_ca_recordset(query);
recset->set_filter(msk, cms_row); recset->set_filter(msk, cms_row, log);
TAnal_report::set_recordset(recset); TAnal_report::set_recordset(recset);
} }
@ -1588,10 +1607,10 @@ class TPrint_rendiconto_ca : public TSkeleton_application
TPrint_rendiconto_ca_mask* _msk; TPrint_rendiconto_ca_mask* _msk;
protected: protected:
void print_or_preview(bool pr); virtual void print();
virtual void print() { print_or_preview(true); } void esporta_csv_row(ostream& file_to_date, const int first_level, const TString& cod_cms_cdc,
virtual void preview() { print_or_preview(false); } const real importi[5][4], real importi_totali[5][4]);
void esporta_csv(TRecordset& rendy, const int r); void esporta_csv(TPrint_rendiconto_ca_recordset& rendy, const int r);
void incrementa(TToken_string& riga, const int col, const real& valore) const; void incrementa(TToken_string& riga, const int col, const real& valore) const;
public: public:
@ -1599,10 +1618,10 @@ public:
virtual void main_loop(); virtual void main_loop();
}; };
void TPrint_rendiconto_ca::print_or_preview(bool pr) void TPrint_rendiconto_ca::print()
{ {
if (_msk != NULL) if (_msk != NULL)
_msk->send_key(K_SPACE, pr ? DLG_PRINT : DLG_PREVIEW); _msk->send_key(K_SPACE, DLG_PRINT);
} }
void TPrint_rendiconto_ca::incrementa(TToken_string& riga, const int col, const real& valore) const void TPrint_rendiconto_ca::incrementa(TToken_string& riga, const int col, const real& valore) const
@ -1612,88 +1631,176 @@ void TPrint_rendiconto_ca::incrementa(TToken_string& riga, const int col, const
riga.add(r.string(), col); riga.add(r.string(), col);
} }
//metodo di alto livello per l'esportazione dei dati di totale in un file per excel void TPrint_rendiconto_ca::esporta_csv_row(ostream& file_to_date, const int first_level, const TString& cod_cms_cdc,
void TPrint_rendiconto_ca::esporta_csv(TRecordset& rendy, const int r) const real importi[5][4], real importi_totali[5][4])
{ {
TMask& mask = *_msk;
TSheet_field& sheet = mask.sfield(F_RIGHE);
TString codcms; ca_extract_sheet_field(sheet, r, LF_COMMESSE, codcms);
TString cdc; ca_extract_sheet_field(sheet, r, LF_CDC, cdc);
TString codfase; ca_extract_sheet_field(sheet, r, LF_FASI, codfase);
//crea una token string su cui mettere i valori dei record letti dal file .dbf //crea una token string su cui mettere i valori dei record letti dal file .dbf
TToken_string riga(512, '\t'); TToken_string riga(512, '\t');
if (get_first_level().logic() == LF_COMMESSE) riga.add(cod_cms_cdc);
//decodifica della commessa/cdc (non è ammessa una commessa "TOTALI" che lo incasina
if (cod_cms_cdc != "TOTALI")
riga.add(cache().get(first_level, cod_cms_cdc, "DESCRIZ"));
//in base al valore di indbil e budget i valori degli importi vengono posizionati nel record
for (int indbil = 1; indbil <= 4; indbil++)
{ {
riga.add(codcms); int col = 0;
riga.add(cache().get(LF_COMMESSE, codcms, COMMESSE_DESCRIZ));
riga.add(cdc);
riga.add(codfase);
}
else
{
riga.add(cdc);
riga.add(cache().get(LF_CDC, cdc, CDC_DESCRIZ));
riga.add(codcms);
riga.add(codfase);
}
//recordset sul file .dbf, da scandire tutto uno per volta
for (bool ok = rendy.move_first(); ok; ok = rendy.move_next())
{
const int indbil = rendy.get("ORDCONT").as_int();
const bool budget = rendy.get("HIDDEN").as_bool();
const real impegnato = rendy.get("IMPEGNATO").as_real();
const real fatturato = rendy.get("FATTURATO").as_real();
const real maturato = rendy.get("MATURATO").as_real();
//in base al valore di indbil e budget i valori degli importi vengono posizionati nel record
int col;
switch (indbil) switch (indbil)
{ {
case 1: col = 18; break; //attività case 1: col = 16; break; //attività
case 2: col = 25; break; //passività case 2: col = 23; break; //passività
case 3: col = 4; break; //costi case 3: col = 2; break; //costi (o ricavi se selezionato il flag di inversione sulla maschera)
case 4: col = 11; break; //ricavi case 4: col = 9; break; //ricavi (o costi se selezionato il flag di inversione sulla maschera)
default: break;
} }
//simpatico metodo algoritmico per stabilire la colonna iniziale di sezione, invalidato da richieste dinamica/crpa //colonne budget/impegnato/maturato/fatturato
//const int col = 4 + (7*(indbil-1)); for (int j = 0; j < 4; j++)
{
riga.add(importi[indbil][j].string(), col + j);
importi_totali[indbil][j] += importi[indbil][j];
}
//lo schema è questo: budget\impegnato\fatturato\maturato\da impegnare\da fatturare\da maturare //colonne da_impegnare/da_maturare/da_fatturare
if (budget) const real da_impegnare = importi[indbil][0] - importi[indbil][1];
{ riga.add(da_impegnare.string(), col + 4);
incrementa(riga, col, impegnato);
} const real da_maturare = importi[indbil][1] - importi[indbil][2];
else riga.add(da_maturare.string(), col + 5);
{
incrementa(riga, col + 1, impegnato); const real da_fatturare = importi[indbil][1] - importi[indbil][3];
incrementa(riga, col + 2, fatturato); riga.add(da_fatturare.string(), col + 6);
incrementa(riga, col + 3, maturato); }
//il da maturare è più incasinato, perchè deve tener conto di valori già totalizzati sulla riga //scrive in excel mode
const real imp_budget = riga.get(col); for (int i = 2; i < 30; i++)
const real imp_consuntivo = riga.get(col + 1);
const real da_impegnare = imp_budget - imp_consuntivo;
riga.add(da_impegnare.string(), col + 4); //da impegnare
incrementa(riga, col + 5, impegnato - fatturato); //da fatturare
incrementa(riga, col + 6, impegnato - maturato); //da maturare
}
} //for (bool ok = rendy.move_first()...
for (int i = 4; i < 32; i++)
{ {
const real r = riga.get(i); const real r = riga.get(i);
if (!r.is_zero()) if (!r.is_zero())
riga.add(r.stringe(), i); {
TString80 str;
str << r;
str.replace('.', ',');
riga.add(str, i);
}
} }
//aggiunge la riga al file da esportare
file_to_date << riga << endl;
}
//metodo di alto livello per l'esportazione dei dati di totale in un file per excel
void TPrint_rendiconto_ca::esporta_csv(TPrint_rendiconto_ca_recordset& rendy, const int r)
{
//primo livello di configurazione
const int first_level = get_first_level().logic();
//piano dei conti riclassificato?
TConfig& cfg = ca_config();
const bool riclassificato = cfg.get_bool("UsePdcc");
//aggiorna il file da esportare appendendo la nuova riga //aggiorna il file da esportare appendendo la nuova riga
TFilename path = mask.get(F_PATH); TFilename path = _msk->get(F_PATH);
path.lower(); path.lower();
path.add("rendiconto.xls"); path.add("rendiconto.xls");
ofstream file_to_date(path, ios::app); ofstream file_to_date(path, ios::app);
file_to_date << riga << endl;
//array bidimensionale con gli importi per indbil e colonna
real importi[5][4];
//array bidimensionale con gli importi totali finali
real importi_totali[5][4];
TString80 last_codice, curr_codice, last_conto, curr_conto;
//recordset sul file .dbf, da scandire tutto uno per volta
rendy.requery();
for (bool ok = rendy.move_first(); ok; ok = rendy.move_next())
{
curr_codice = rendy.get(first_level == LF_COMMESSE ? "CODCMS" : "CODCOSTO").as_string();
//operazioni da fare al cambio commessa/cdc (codice primo livello)
if (curr_codice != last_codice)
{
//controlla se last_codice sia pieno per non aggiungere una inutile riga di zeri all'inizio
if (last_codice.full())
esporta_csv_row(file_to_date, first_level, last_codice, importi, importi_totali);
memset(importi, 0, sizeof(importi)); //Allah! Azzeratore dell'array con i totali per commessa (o cdc)
last_codice = curr_codice; //memorizza il cambio codice
last_conto = ""; //azzera l'ultimo conto
}
curr_conto = rendy.get("CONTO").as_string();
//gestione dei budget: va fatta attraverso i saldi!!! come nella stampa, onde evitare pericolose dimenticanze..
//..di movimenti budget in anni diversi da quello considerato
const bool hidden = rendy.get("HIDDEN").as_bool();
const int indbil = rendy.get("ORDCONT").as_int();
if (hidden && curr_conto.full() && (curr_conto != last_conto))
{
//preparazione dei parametri per il calcolo dei saldi
TSheet_field& sf = _msk->sfield(F_RIGHE);
TString80 codcms, codcdc, codfas;
if (first_level == LF_CDC)
{
codcdc = curr_codice;
ca_extract_sheet_field(sf, r, LF_COMMESSE, codcms);
ca_extract_sheet_field(sf, r, LF_FASI, codfas);
}
else
{
codcms = curr_codice;
ca_extract_sheet_field(sf, r, LF_CDC, codcdc);
ca_extract_sheet_field(sf, r, LF_FASI, codfas);
}
//calcola i saldana usando la get_budget come in stampa
rendy.set_cms_cdc_fase(codcdc, codcms, codfas);
real budget = rendy.get_budget(curr_conto, 'P');
budget += rendy.get_budget(curr_conto, 'V');
importi[indbil][0] += budget;
last_conto = curr_conto;
}
//lo schema è questo: budget\impegnato\maturato\fatturato\da impegnare\da maturare\da fatturare
//aggiorna budget
//aggiorna tutti gli altri campi
if (!hidden)
{
const real impegnato = rendy.get("IMPEGNATO").as_real();
const real fatturato = rendy.get("FATTURATO").as_real();
const real maturato = rendy.get("MATURATO").as_real();
importi[indbil][1] += impegnato;
importi[indbil][2] += maturato;
importi[indbil][3] += fatturato;
}
} //for (bool ok = rendy.move_first()...
//gestione speciale dell'ultima riga
if (last_codice.full())
{
esporta_csv_row(file_to_date, first_level, last_codice, importi, importi_totali);
//aggiunge la riga con i totali
TToken_string str_tot = _msk->sfield(F_RIGHE).row(r);
//la riga con i totali ci va solo se non è stato specificato il primo livello (es. commessa o cdc)
const TFixed_string first_field = str_tot.get(0);
if (first_field.blank())
{
str_tot.replace('|', ' ');
str_tot.strip_double_spaces();
str_tot.insert("TOTALI\t");
//riga con gli importi totali;per ottenerla basta chiamare la esporta_csv_row con gli array invertiti, in modo che..
//..venga aggiornato l'array degli importi_totali; l'altro verrà sputtanato ma chi se ne frega! è già stato..
//..esportato qualche riga sopra
esporta_csv_row(file_to_date, first_level, str_tot, importi_totali, importi);
//doppia riga vuota di stacco
file_to_date << endl << endl;
}
}
} }
//metodo per accattarsi o' primo livello della configurazione CA //metodo per accattarsi o' primo livello della configurazione CA
@ -1709,6 +1816,7 @@ void TPrint_rendiconto_ca::main_loop()
{ {
_msk = new TPrint_rendiconto_ca_mask; _msk = new TPrint_rendiconto_ca_mask;
TPrint_rendiconto_ca_mask& mask = *_msk; TPrint_rendiconto_ca_mask& mask = *_msk;
const int first_level = get_first_level().logic(); //primo livello nella configurazione CA
while (true) while (true)
{ {
@ -1717,6 +1825,10 @@ void TPrint_rendiconto_ca::main_loop()
if (key != K_ENTER && key != K_F6) if (key != K_ENTER && key != K_F6)
break; break;
//chiave di ordinamento del recordset; di base è 1 (utilizzato per la stampa); va lasciata qui per essere resettata..
//..ad ogni giro, in modo da sistemarsi quando si passa da esportazione a stampa e viceversa!
int recset_key = 1;
//resetta e prepara le intestazioni del file rendiconto.xls //resetta e prepara le intestazioni del file rendiconto.xls
if (key == K_F6) if (key == K_F6)
{ {
@ -1727,11 +1839,19 @@ void TPrint_rendiconto_ca::main_loop()
//intestazione primaria //intestazione primaria
TToken_string intestazione_1(512, '\t'); TToken_string intestazione_1(512, '\t');
//l'intestazione primaria dipende anche dalla configurazione dei livelli!
intestazione_1.add("Commessa"); if (first_level == LF_COMMESSE) //commessa-cdc
intestazione_1.add("Descr. commessa"); {
intestazione_1.add("C.d.C."); intestazione_1.add("Commessa");
intestazione_1.add("Fase"); intestazione_1.add("Descr. commessa");
recset_key = 2; //chiave del recordset per commessa
}
else //cdc-commessa
{
intestazione_1.add("C.d.C.");
intestazione_1.add("Descr. cdc");
recset_key = 3; //chiave del recordset per centro di costo
}
const bool reverse_cos_ric = mask.get_bool(F_REV_COSRIC); //occhio al flag di rovesciamento const bool reverse_cos_ric = mask.get_bool(F_REV_COSRIC); //occhio al flag di rovesciamento
@ -1765,9 +1885,10 @@ void TPrint_rendiconto_ca::main_loop()
//intestazione secondaria //intestazione secondaria
TToken_string intestazione_2(512, '\t'); TToken_string intestazione_2(512, '\t');
//campi descrittivi iniziali vuoti (solo intestazione_1)
for (int k = 0; k < 4; k++) for (int k = 0; k < 2; k++)
intestazione_2.add(""); intestazione_2.add("");
for (int l = 0; l < 4; l++) for (int l = 0; l < 4; l++)
{ {
for (int n = 0; n < 7; n++) for (int n = 0; n < 7; n++)
@ -1776,16 +1897,16 @@ void TPrint_rendiconto_ca::main_loop()
{ {
case 0: intestazione_2.add("Budget"); break; case 0: intestazione_2.add("Budget"); break;
case 1: intestazione_2.add("Impegnato"); break; case 1: intestazione_2.add("Impegnato"); break;
case 2: intestazione_2.add("Fatturato"); break; case 2: intestazione_2.add("Maturato"); break;
case 3: intestazione_2.add("Maturato"); break; case 3: intestazione_2.add("Fatturato"); break;
case 4: intestazione_2.add("Da impegnare"); break; case 4: intestazione_2.add("Da impegnare"); break;
case 5: intestazione_2.add("Da fatturare"); break; case 5: intestazione_2.add("Da maturare"); break;
case 6: intestazione_2.add("Da maturare"); break; case 6: intestazione_2.add("Da fatturare"); break;
} }
} }
} }
file_to_date << intestazione_2 << endl; file_to_date << intestazione_2 << endl;
} } //if(key==K_F6)
//report e book dei report //report e book dei report
TReport_book book; TReport_book book;
@ -1795,6 +1916,10 @@ void TPrint_rendiconto_ca::main_loop()
TPrint_rendiconto_ca_rep rep; TPrint_rendiconto_ca_rep rep;
rep.load(path); rep.load(path);
//log report con segnalazioni su errori (tipo conti inesistenti o robaccia simile..)
TLog_report log(TR("Errori rilevati"));
log.kill_duplicates();
TSheet_field& sheet = mask.sfield(F_RIGHE); TSheet_field& sheet = mask.sfield(F_RIGHE);
TString video_string; //stringa che compare nella progind TString video_string; //stringa che compare nella progind
if (sheet.empty()) //se non ci sono righe sullo sheet (selezione su tutte le cms/cdc)... if (sheet.empty()) //se non ci sono righe sullo sheet (selezione su tutte le cms/cdc)...
@ -1819,13 +1944,13 @@ void TPrint_rendiconto_ca::main_loop()
for (int l = liv1.levels()-2; l >= 0; l--) //se la struttura è a più livelli costruisce la tokenstring for (int l = liv1.levels()-2; l >= 0; l--) //se la struttura è a più livelli costruisce la tokenstring
row.insert("|", liv1.total_len(l)); row.insert("|", liv1.total_len(l));
rep.set_filter(mask, 0); //fa la set filter sulla prima riga (che è quella usata) rep.set_filter(mask, 0, recset_key, log); //fa la set filter sulla prima riga (che è quella usata)
//se stampa o anteprima.. //se stampa o anteprima..
if (key == K_ENTER) if (key == K_ENTER)
book.add(rep); book.add(rep);
else //esportazione in excel else //esportazione in excel
esporta_csv(*rep.recordset(), 0); esporta_csv((TPrint_rendiconto_ca_recordset&)*rep.recordset(), 0);
} }
sheet.destroy(); //cancella le commesse aggiunte in automatico sullo sheet sheet.destroy(); //cancella le commesse aggiunte in automatico sullo sheet
} }
@ -1833,22 +1958,25 @@ void TPrint_rendiconto_ca::main_loop()
{ {
FOR_EACH_SHEET_ROW(sheet, r, row) //per ogni cdc/cms che appare nello sheet di pag.1 della msk.. FOR_EACH_SHEET_ROW(sheet, r, row) //per ogni cdc/cms che appare nello sheet di pag.1 della msk..
{ {
rep.set_filter(mask, r); //..chiama il metodone globale che crea e compila il file.. rep.set_filter(mask, r, recset_key, log); //..chiama il metodone globale che crea e compila il file..
//..temporaneo i cui dati riempiranno il report //..temporaneo i cui dati riempiranno il report
//se stampa o anteprima //se stampa o anteprima
if (key == K_ENTER) if (key == K_ENTER)
book.add(rep); //aggiunge il report relativo alla cdc/cms corrente al book book.add(rep); //aggiunge il report relativo alla cdc/cms corrente al book
else //esportazione in excel else //esportazione in excel
esporta_csv(*rep.recordset(), r); esporta_csv((TPrint_rendiconto_ca_recordset&)*rep.recordset(), r); //il recordset è del tipo TPrint_rendiconto
} }
} }
//se stampa o anteprima //se stampa o anteprima
if (key == K_ENTER) if (log.recordset()->items() > 0)
log.preview();
if (key == K_ENTER) //stampa o anteprima
{ {
if (mask.print_mode() == 'A') if (mask.print_mode() == 'A')
book.preview(); book.preview();
else else
book.print(); book.print();
} }
} //while(true)... } //while(true)...

View File

@ -11,7 +11,7 @@
<field x="70" type="Testo" width="10" pattern="1" text="Data stampa"> <field x="70" type="Testo" width="10" pattern="1" text="Data stampa">
<font italic="1" face="Courier New" size="8" /> <font italic="1" face="Courier New" size="8" />
</field> </field>
<field x="80" type="Data" width="10" pattern="1"> <field x="82" type="Data" width="10" pattern="1">
<source>#SYSTEM.DATE</source> <source>#SYSTEM.DATE</source>
</field> </field>
<field x="157" type="Testo" width="4" pattern="1" text="Pag."> <field x="157" type="Testo" width="4" pattern="1" text="Pag.">
@ -33,13 +33,14 @@
<field x="88" y="3.5" type="Testo" width="4" pattern="1" text="Riga" /> <field x="88" y="3.5" type="Testo" width="4" pattern="1" text="Riga" />
<field x="93" y="3.5" type="Testo" width="15" pattern="1" text="Descrizione riga" /> <field x="93" y="3.5" type="Testo" width="15" pattern="1" text="Descrizione riga" />
<field x="117" y="3.5" type="Testo" align="center" width="12" pattern="1" text="Ordine&#2F;Bolla" /> <field x="117" y="3.5" type="Testo" align="center" width="12" pattern="1" text="Ordine&#2F;Bolla" />
<field x="132" y="3.5" type="Testo" align="right" width="12" pattern="1" text="Fatturato" /> <field x="131" y="3.5" type="Testo" align="right" width="13" pattern="1" text="Fatturato" />
<field x="145" y="3.5" type="Testo" align="right" width="12" pattern="1" text="Maturato" /> <field x="144" y="3.5" type="Testo" align="right" width="13" pattern="1" text="Maturato" />
<field x="158" y="3.5" type="Testo" align="right" width="12" pattern="1" text="Impegnato" /> <field x="157" y="3.5" type="Testo" align="right" width="13" pattern="1" text="Impegnato" />
<field border="1" x="1" y="4.5" type="Linea" width="169" height="0" pattern="1" /> <field border="1" x="1" y="4.5" type="Linea" width="169" height="0" pattern="1" />
<field x="1" y="3.5" type="Testo" width="15" id="121" pattern="1" text="Rif. Contabile" /> <field x="1" y="3.5" type="Testo" width="15" id="121" pattern="1" text="Rif. Contabile" />
</section> </section>
<section type="Head" level="1" height="11"> <section type="Head" level="1" height="11">
<prescript description="H1 PRESCRIPT">MESSAGE RESET,F1</prescript>
<field border="1" radius="100" x="1" type="Testo" valign="center" align="center" shade_offset="25" width="167" height="2.5" text="RENDICONTO"> <field border="1" radius="100" x="1" type="Testo" valign="center" align="center" shade_offset="25" width="167" height="2.5" text="RENDICONTO">
<font face="Courier New" bold="1" size="16" /> <font face="Courier New" bold="1" size="16" />
</field> </field>
@ -144,12 +145,7 @@
<section type="Head" level="2" height="2"> <section type="Head" level="2" height="2">
<groupby>ORDCONT+CONTO</groupby> <groupby>ORDCONT+CONTO</groupby>
<font italic="1" face="Courier New" size="8" /> <font italic="1" face="Courier New" size="8" />
<prescript description="H2 PRESCRIPT">MESSAGE RESET,F2.400 <prescript description="H2 PRESCRIPT">MESSAGE RESET,F2</prescript>
MESSAGE RESET,F2.500
MESSAGE RESET,F2.600
MESSAGE RESET,F2.700
MESSAGE RESET,F2.800
MESSAGE RESET,F2.900</prescript>
<field x="1" y="0.5" type="Stringa" bg_color="#C0C0C0" width="23"> <field x="1" y="0.5" type="Stringa" bg_color="#C0C0C0" width="23">
<font italic="1" face="Courier New" bold="1" size="8" /> <font italic="1" face="Courier New" bold="1" size="8" />
<source>CONTO</source> <source>CONTO</source>
@ -235,15 +231,15 @@ MESSAGE RESET,F2.900</prescript>
<field x="116" y="0.5" type="Stringa" align="right" dynamic_height="1" width="15" height="20" pattern="1"> <field x="116" y="0.5" type="Stringa" align="right" dynamic_height="1" width="15" height="20" pattern="1">
<source>DOCORIG</source> <source>DOCORIG</source>
</field> </field>
<field x="132" y="0.5" type="Valuta" align="right" width="12" pattern="1" text="###.###.###,@@"> <field x="131" y="0.5" type="Valuta" align="right" width="13" pattern="1" text="###.###.###,@@">
<source>FATTURATO</source> <source>FATTURATO</source>
<postscript description="B1.0 POSTSCRIPT">MESSAGE ADD,F2.400</postscript> <postscript description="B1.0 POSTSCRIPT">MESSAGE ADD,F2.400</postscript>
</field> </field>
<field x="145" y="0.5" type="Valuta" align="right" width="12" pattern="1" text="###.###.###,@@"> <field x="144" y="0.5" type="Valuta" align="right" width="13" pattern="1" text="###.###.###,@@">
<source>MATURATO</source> <source>MATURATO</source>
<postscript description="B1.0 POSTSCRIPT">MESSAGE ADD,F2.600</postscript> <postscript description="B1.0 POSTSCRIPT">MESSAGE ADD,F2.600</postscript>
</field> </field>
<field x="158" y="0.5" type="Valuta" align="right" width="12" pattern="1" text="###.###.###,@@"> <field x="157" y="0.5" type="Valuta" align="right" width="13" pattern="1" text="###.###.###,@@">
<source>IMPEGNATO</source> <source>IMPEGNATO</source>
<postscript description="B1.0 POSTSCRIPT">MESSAGE ADD,F2.800</postscript> <postscript description="B1.0 POSTSCRIPT">MESSAGE ADD,F2.800</postscript>
</field> </field>
@ -310,7 +306,7 @@ MESSAGE RESET,F2.900</prescript>
<field x="90" y="4" type="Testo" width="42" pattern="1" text="TOTALE DA FATTURARE, MATURARE, IMPEGNARE &#3E;&#3E;&#3E;"> <field x="90" y="4" type="Testo" width="42" pattern="1" text="TOTALE DA FATTURARE, MATURARE, IMPEGNARE &#3E;&#3E;&#3E;">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="143" y="6.5" type="Testo" width="15" pattern="1" text="BUDGET &#3E;&#3E;&#3E;"> <field x="142" y="6.5" type="Testo" width="15" pattern="1" text="BUDGET &#3E;&#3E;&#3E;">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="90.37" y="6.75" type="Testo" width="15" pattern="1" text="PASSIVITA'"> <field x="90.37" y="6.75" type="Testo" width="15" pattern="1" text="PASSIVITA'">
@ -322,7 +318,7 @@ MESSAGE RESET,F2.900</prescript>
<field x="90.03" y="9.43" type="Testo" width="42" pattern="1" text="TOTALE DA FATTURARE, MATURARE, IMPEGNARE &#3E;&#3E;&#3E;"> <field x="90.03" y="9.43" type="Testo" width="42" pattern="1" text="TOTALE DA FATTURARE, MATURARE, IMPEGNARE &#3E;&#3E;&#3E;">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="143" y="12" type="Testo" width="15" pattern="1" text="BUDGET &#3E;&#3E;&#3E;"> <field x="142" y="12" type="Testo" width="15" pattern="1" text="BUDGET &#3E;&#3E;&#3E;">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="89.9" y="12.4" type="Testo" width="15" pattern="1" text="COSTI"> <field x="89.9" y="12.4" type="Testo" width="15" pattern="1" text="COSTI">
@ -334,7 +330,7 @@ MESSAGE RESET,F2.900</prescript>
<field x="90.4" y="15.03" type="Testo" width="42" pattern="1" text="TOTALE DA FATTURARE, MATURARE, IMPEGNARE &#3E;&#3E;&#3E;"> <field x="90.4" y="15.03" type="Testo" width="42" pattern="1" text="TOTALE DA FATTURARE, MATURARE, IMPEGNARE &#3E;&#3E;&#3E;">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="143" y="17.75" type="Testo" width="15" pattern="1" text="BUDGET &#3E;&#3E;&#3E;"> <field x="142" y="17.75" type="Testo" width="15" pattern="1" text="BUDGET &#3E;&#3E;&#3E;">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="90.03" y="18.09" type="Testo" width="15" pattern="1" text="RICAVI"> <field x="90.03" y="18.09" type="Testo" width="15" pattern="1" text="RICAVI">
@ -346,99 +342,99 @@ MESSAGE RESET,F2.900</prescript>
<field x="90" y="20.75" type="Testo" width="42" pattern="1" text="TOTALE DA FATTURARE, MATURARE, IMPEGNARE &#3E;&#3E;&#3E;"> <field x="90" y="20.75" type="Testo" width="42" pattern="1" text="TOTALE DA FATTURARE, MATURARE, IMPEGNARE &#3E;&#3E;&#3E;">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="158" y="1" type="Valuta" align="right" width="12" id="301" pattern="1" hide_zero="1" text="###.###.###,@@"> <field x="157" y="1" type="Valuta" align="right" width="13" id="301" pattern="1" hide_zero="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="158" y="6.5" type="Valuta" align="right" width="12" id="302" pattern="1" hide_zero="1" text="###.###.###,@@"> <field x="157" y="6.5" type="Valuta" align="right" width="13" id="302" pattern="1" hide_zero="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="158" y="12" type="Valuta" align="right" width="12" id="303" pattern="1" hide_zero="1" text="###.###.###,@@"> <field x="157" y="12" type="Valuta" align="right" width="13" id="303" pattern="1" hide_zero="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="158" y="17.75" type="Valuta" align="right" width="12" id="304" pattern="1" hide_zero="1" text="###.###.###,@@"> <field x="157" y="17.75" type="Valuta" align="right" width="13" id="304" pattern="1" hide_zero="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="132" y="2.5" type="Valuta" align="right" width="12" id="401" pattern="1" text="###.###.###,@@"> <field x="131" y="2.5" type="Valuta" align="right" width="13" id="401" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="132" y="8" type="Valuta" align="right" width="12" id="402" pattern="1" text="###.###.###,@@"> <field x="131" y="8" type="Valuta" align="right" width="13" id="402" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="132" y="13.5" type="Valuta" align="right" width="12" id="403" pattern="1" text="###.###.###,@@"> <field x="131" y="13.5" type="Valuta" align="right" width="13" id="403" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="132" y="19.25" type="Valuta" align="right" width="12" id="404" pattern="1" text="###.###.###,@@"> <field x="131" y="19.25" type="Valuta" align="right" width="13" id="404" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="132" y="4" type="Valuta" align="right" width="12" id="501" pattern="1" text="###.###.###,@@"> <field x="131" y="4" type="Valuta" align="right" width="13" id="501" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
<source>#801-#401</source> <source>#801-#401</source>
</field> </field>
<field x="132" y="9.5" type="Valuta" align="right" width="12" id="502" pattern="1" text="###.###.###,@@"> <field x="131" y="9.5" type="Valuta" align="right" width="13" id="502" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
<source>#802-#402</source> <source>#802-#402</source>
</field> </field>
<field x="132" y="15" type="Valuta" align="right" width="12" id="503" pattern="1" text="###.###.###,@@"> <field x="131" y="15" type="Valuta" align="right" width="13" id="503" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
<source>#803-#403</source> <source>#803-#403</source>
</field> </field>
<field x="132" y="20.75" type="Valuta" align="right" width="12" id="504" pattern="1" text="###.###.###,@@"> <field x="131" y="20.75" type="Valuta" align="right" width="13" id="504" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
<source>#804-#404</source> <source>#804-#404</source>
</field> </field>
<field x="145" y="2.5" type="Valuta" align="right" width="12" id="601" pattern="1" text="###.###.###,@@"> <field x="144" y="2.5" type="Valuta" align="right" width="13" id="601" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="145" y="8" type="Valuta" align="right" width="12" id="602" pattern="1" text="###.###.###,@@"> <field x="144" y="8" type="Valuta" align="right" width="13" id="602" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="145" y="13.5" type="Valuta" align="right" width="12" id="603" pattern="1" text="###.###.###,@@"> <field x="144" y="13.5" type="Valuta" align="right" width="13" id="603" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="145" y="19.25" type="Valuta" align="right" width="12" id="604" pattern="1" text="###.###.###,@@"> <field x="144" y="19.25" type="Valuta" align="right" width="13" id="604" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="145" y="4" type="Valuta" align="right" width="12" id="701" pattern="1" text="###.###.###,@@"> <field x="144" y="4" type="Valuta" align="right" width="13" id="701" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
<source>#801-#601</source> <source>#801-#601</source>
</field> </field>
<field x="145" y="9.5" type="Valuta" align="right" width="12" id="702" pattern="1" text="###.###.###,@@"> <field x="144" y="9.5" type="Valuta" align="right" width="13" id="702" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
<source>#802-#602</source> <source>#802-#602</source>
</field> </field>
<field x="145" y="15" type="Valuta" align="right" width="12" id="703" pattern="1" text="###.###.###,@@"> <field x="144" y="15" type="Valuta" align="right" width="13" id="703" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
<source>#803-#603</source> <source>#803-#603</source>
</field> </field>
<field x="145" y="20.75" type="Valuta" align="right" width="12" id="704" pattern="1" text="###.###.###,@@"> <field x="144" y="20.75" type="Valuta" align="right" width="13" id="704" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
<source>#804-#604</source> <source>#804-#604</source>
</field> </field>
<field x="158" y="2.5" type="Valuta" align="right" width="12" id="801" pattern="1" text="###.###.###,@@"> <field x="157" y="2.5" type="Valuta" align="right" width="13" id="801" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="158" y="8" type="Valuta" align="right" width="12" id="802" pattern="1" text="###.###.###,@@"> <field x="157" y="8" type="Valuta" align="right" width="13" id="802" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="158" y="13.5" type="Valuta" align="right" width="12" id="803" pattern="1" text="###.###.###,@@"> <field x="157" y="13.5" type="Valuta" align="right" width="13" id="803" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="158" y="19.25" type="Valuta" align="right" width="12" id="804" pattern="1" text="###.###.###,@@"> <field x="157" y="19.25" type="Valuta" align="right" width="13" id="804" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="158" y="4" type="Valuta" align="right" width="12" id="901" pattern="1" text="###.###.###,@@"> <field x="157" y="4" type="Valuta" align="right" width="13" id="901" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
<source>#301-#801</source> <source>#301-#801</source>
</field> </field>
<field x="158.03" y="9.43" type="Valuta" align="right" width="12" id="902" pattern="1" text="###.###.###,@@"> <field x="157.03" y="9.43" type="Valuta" align="right" width="13" id="902" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
<source>#302-#802</source> <source>#302-#802</source>
</field> </field>
<field x="158" y="15" type="Valuta" align="right" width="12" id="903" pattern="1" text="###.###.###,@@"> <field x="157" y="15" type="Valuta" align="right" width="13" id="903" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
<source>#303-#803</source> <source>#303-#803</source>
</field> </field>
<field x="158" y="20.75" type="Valuta" align="right" width="12" id="904" pattern="1" text="###.###.###,@@"> <field x="157" y="20.75" type="Valuta" align="right" width="13" id="904" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
<source>#304-#804</source> <source>#304-#804</source>
</field> </field>
@ -451,7 +447,7 @@ MESSAGE RESET,F2.900</prescript>
<field x="90" y="2.5" type="Testo" width="42" pattern="1" text="Da fatturare, maturare, impegnare &#3E;&#3E;&#3E;"> <field x="90" y="2.5" type="Testo" width="42" pattern="1" text="Da fatturare, maturare, impegnare &#3E;&#3E;&#3E;">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
</field> </field>
<field x="132" y="1" type="Valuta" align="right" width="12" id="400" pattern="1" text="###.###.###,@@"> <field x="131" y="1" type="Valuta" align="right" width="13" id="400" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
<postscript description="F2.400 POSTSCRIPT">#THIS @ \ prende il proprio valore <postscript description="F2.400 POSTSCRIPT">#THIS @ \ prende il proprio valore
"F1." \ decide il campo destinazione in base al valore di INDBIL,che gli viene passato dal programma.. "F1." \ decide il campo destinazione in base al valore di INDBIL,che gli viene passato dal programma..
@ -462,11 +458,11 @@ MESSAGE RESET,F2.900</prescript>
+! \ esegue la ADD sul campo di destinazione +! \ esegue la ADD sul campo di destinazione
</postscript> </postscript>
</field> </field>
<field x="132" y="2.5" type="Valuta" align="right" width="12" id="500" pattern="1" text="###.###.###,@@"> <field x="131" y="2.5" type="Valuta" align="right" width="13" id="500" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
<source>#800-#400</source> <source>#800-#400</source>
</field> </field>
<field x="145" y="1" type="Valuta" align="right" width="12" id="600" pattern="1" text="###.###.###,@@"> <field x="144" y="1" type="Valuta" align="right" width="13" id="600" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
<postscript description="F2.600 POSTSCRIPT">#THIS @ <postscript description="F2.600 POSTSCRIPT">#THIS @
"F1." "F1."
@ -476,11 +472,11 @@ MESSAGE RESET,F2.900</prescript>
+ +
+!</postscript> +!</postscript>
</field> </field>
<field x="145" y="2.5" type="Valuta" align="right" width="12" id="700" pattern="1" text="###.###.###,@@"> <field x="144" y="2.5" type="Valuta" align="right" width="13" id="700" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
<source>#800-#600</source> <source>#800-#600</source>
</field> </field>
<field x="158" y="1" type="Valuta" align="right" width="12" id="800" pattern="1" text="###.###.###,@@"> <field x="157" y="1" type="Valuta" align="right" width="13" id="800" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
<postscript description="F2.800 POSTSCRIPT">#THIS @ <postscript description="F2.800 POSTSCRIPT">#THIS @
"F1." "F1."
@ -490,7 +486,7 @@ MESSAGE RESET,F2.900</prescript>
+ +
+!</postscript> +!</postscript>
</field> </field>
<field x="158" y="2.5" type="Valuta" align="right" width="12" id="900" pattern="1" text="###.###.###,@@"> <field x="157" y="2.5" type="Valuta" align="right" width="13" id="900" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
<source>#H2.700+#H2.800-#800</source> <source>#H2.700+#H2.800-#800</source>
</field> </field>
@ -498,5 +494,4 @@ MESSAGE RESET,F2.900</prescript>
<section type="Foot" level="3"> <section type="Foot" level="3">
<prescript description="F3 PRESCRIPT">0 #B1.100 !</prescript> <prescript description="F3 PRESCRIPT">0 #B1.100 !</prescript>
</section> </section>
<sql>USE 1000</sql>
</report> </report>

View File

@ -736,7 +736,11 @@ bool TSimple_anal_msk::on_field_event(TOperable_field& o, TField_event e, long j
TEdit_field& e = efield(id); TEdit_field& e = efield(id);
e.set(tok); e.set(tok);
e.show(); e.show();
last = &e; //attenzione!!! modifica necessaria per poter ripulire in automatico i campi inutili al cambio struttura..
//..del piano dei conti (selezionandone una diversa sull'albero della maschera) e per non avere un warning..
//..dalla last->check() che andrebbe a fare la check su un campo vuoto
if (tok && *tok)
last = &e;
} }
if (last != NULL) if (last != NULL)
{ {

View File

@ -725,6 +725,13 @@ public:
TSaldi_cache(); TSaldi_cache();
}; };
static TImporto get_imp(const TRecordset& rs, const char* sez, const char* imp)
{
const char sezione = rs.get(sez).as_string()[0];
const real importo = rs.get(imp).as_real();
return TImporto(sezione, importo);
}
// Calcolo saldo annuale di un conto reale NON riclassificato // Calcolo saldo annuale di un conto reale NON riclassificato
bool TSaldi_cache::int_saldo_annuale(const TAnal_bill& b, int da_anno, int ad_anno, word tipo, bool TSaldi_cache::int_saldo_annuale(const TAnal_bill& b, int da_anno, int ad_anno, word tipo,
TImporto& dare, TImporto& avere) const TImporto& dare, TImporto& avere) const
@ -774,29 +781,26 @@ bool TSaldi_cache::int_saldo_annuale(const TAnal_bill& b, int da_anno, int ad_an
for (TRecnotype i = 0; saldini.move_to(i); i++) for (TRecnotype i = 0; saldini.move_to(i); i++)
{ {
char sez = ' '; TImporto imp;
real imp;
if (tipo & _saldanal_consuntivo) if (tipo & _saldanal_consuntivo)
{ {
sez = saldini.get(SALDANA_SEZIONE).as_string()[0]; imp += get_imp(saldini, SALDANA_SEZIONE, SALDANA_SALDO);
imp = saldini.get(SALDANA_SALDO).as_real();
} }
if (tipo & _saldanal_preventivo) if (tipo & _saldanal_preventivo)
{ {
sez = saldini.get(SALDANA_SEZIONEP).as_string()[0]; imp += get_imp(saldini, SALDANA_SEZIONEP, SALDANA_SALDOP);
imp = saldini.get(SALDANA_SALDOP).as_real();
} }
if (tipo & _saldanal_variazione) if (tipo & _saldanal_variazione)
{ {
sez = saldini.get(SALDANA_SEZIONEV).as_string()[0]; imp += get_imp(saldini, SALDANA_SEZIONEV, SALDANA_SALDOV);
imp = saldini.get(SALDANA_SALDOV).as_real();
} }
if (sez > ' ') if (!imp.is_zero())
{ {
if (sez == 'D') if (imp.sezione() == 'D')
dare += TImporto('D', imp); dare += imp;
else else
avere += TImporto('A', imp); avere += imp;
movim = true; movim = true;
} }
} }
@ -1027,6 +1031,11 @@ TSaldi_cache::TSaldi_cache() : TCache(3881) // Numero primo
const TSaldanal& ca_saldo(const TAnal_bill& bill, const TDate& dal, const TDate& al, word tipi) const TSaldanal& ca_saldo(const TAnal_bill& bill, const TDate& dal, const TDate& al, word tipi)
{ {
static TSaldi_cache* cache = NULL; static TSaldi_cache* cache = NULL;
if (tipi == 0 && cache != NULL)
{
delete cache;
cache = NULL;
}
if (cache == NULL) if (cache == NULL)
cache = new TSaldi_cache; cache = new TSaldi_cache;
return cache->saldo(bill, dal, al, tipi); return cache->saldo(bill, dal, al, tipi);