#include #include #include #include #include "lf.h" #include "donaz.h" #include "soggetti.h" #include "sezioni.h" #include "at6.h" #include "at6500a.h" //#define ALIAS_LDN 100 class TRiepilogoDonazioni : public TPrintapp { TRelation* _rel; TMask* _msk; int _cur; TDate _dataini, _datafin; TString16 _codsez, _codsot; int _mese,_anno; //bool _primedon; TAssoc_array* _totali_mese; TAssoc_array* _totali_anno; TAssoc_array* _totali_sezione; protected: virtual bool user_create(); virtual bool user_destroy(); virtual bool set_print(int m); virtual void set_page(int file, int cnt); virtual bool preprocess_page(int file, int counter); public: void crea_intestazione(); void header_sezione(const TString16 codsez, const TString16 codsot); TMask& app_mask() { return *_msk; } TRiepilogoDonazioni() {} }; HIDDEN inline TRiepilogoDonazioni& app() { return (TRiepilogoDonazioni&) main_app(); } void TRiepilogoDonazioni::set_page(int file, int cnt) { } bool TRiepilogoDonazioni::preprocess_page(int file, int counter) { TRectype& recsog = current_cursor()->curr(LF_SOGGETTI); // salto pagina se cambio sezione const TString16 codsez = recsog.get(SOG_CODSEZ); const TString16 codsot = recsog.get(SOG_CODSOT); if ((_codsez != codsez) || (_codsot != codsot)) { if (_codsez != "**") //printer().formfeed(); riepilogo_sezione(); _codsez = codsez; _codsot = codsot; _mese = -1; _anno = -1; header_sezione(codsez, codsot); } const TDate datadon = current_cursor()->curr().get(DON_DATADON); const int mese = datadon.month(); const int anno = datadon.year(); if (_mese != mese) { if (_mese != -1) riepilogo_mese(); _mese = mese; } if (_anno != anno) { if (_anno != -1) riepilogo_anno(); _anno = anno; } const char* tipodon = current_cursor()->curr().get(DON_TIPODON); if (_totali_mese.is_key(tipodon)) _totali_mese[tipodon]++; else _totali_mese.add(tipodon,1); if (_totali_anno.is_key(tipodon)) _totali_anno[tipodon]++; else _totali_anno.add(tipodon,1); return TRUE; } bool TRiepilogoDonazioni::set_print(int m) { KEY tasto; tasto = _msk->run(); if (tasto == K_ENTER) { _dataini = _msk->get_date(F_DATAINI); _datafin = _msk->get_date(F_DATAFIN); //_primedon = _msk->get_bool(F_PRIMEDON); TString80 chiave = ""; chiave = "90->CODSEZ|90->CODSOT|92->DATADON|"; // filtro per sezione/sottogruppo TString80 filtro = ""; if // filtro per data TRectype da(LF_DONAZ); TRectype a (LF_DONAZ); if (_dataini.ok()) da.put(DON_DATADON, _dataini); if (_datafin.ok()) a.put(DON_DATADON, _datafin); _cur = add_cursor(new TSorted_cursor(_rel, (const char*) chiave, "", 2, &da, &a)); // manca il filtro da sez./sot. a sez./sot. //current_cursor()->setfilter((const char*) filtro, TRUE); _codsez = "**"; _codsot = "**"; _mese = -1; _anno = -1; reset_files(); add_file(LF_DONAZ); reset_print(); crea_intestazione(); return TRUE; } else return FALSE; } void TRiepilogoDonazioni::crea_intestazione() { reset_header(); TString sep(132); sep = "RIEPILOGO DONAZIONI "; if (_dataini.ok()) { sep << " DAL "; sep << _dataini.string(); } if (_datafin.ok()) { sep << " AL "; sep << _datafin.string(); } sep.center_just(); set_header(2, "@0g%s", (const char*) sep); TString16 data_stampa = _data_stampa.string(); set_header(2,"@0g%10s", (const char*) data_stampa); sep = ""; sep << "Pag. @#"; set_header(2, "@120g%s", (const char*) sep); sep = ""; sep.fill('-'); set_header(3, (const char *) sep); } bool TRiepilogoDonazioni::user_create() { _rel = new TRelation(LF_DONAZ); _rel->add(LF_SOGGETTI, "CODICE==CODICE"); //_rel->add("LDN", "CODTAB==LUOGODON",1,0,ALIAS_LDN); _msk = new TMask("at6500a"); _totali_mese = new TAssoc_array(); _totali_anno = new TAssoc_array(); _totali_sezione = new TAssoc_array(); return TRUE; } bool TRiepilogoDonazioni::user_destroy() { delete _msk; delete _rel; delete _totali_mese; delete _totali_anno; delete _totali_sezione; return TRUE; } int at6500(int argc, char* argv[]) { TRiepilogoDonazioni a; a.run(argc, argv, "Riepilogo donazioni"); return 0; }