#include #include #include #include #include #include "donaz.h" #include "soggetti.h" #include "sezioni.h" #include "at6.h" #include "at6300a.h" #define ALIAS_LDN 100 class TControlloDonazioni : public TPrintapp { TRelation* _rel; TMask* _msk; int _counter; int _cur; TDate _dataold, _dataini, _datafin; TString16 _tipodon, _luogodon, _luogoold, _sezold; TString16 _sezini, _sotini, _tipostampa,_ordinamento; TParagraph_string _cognome_nome; 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_data(const TDate data, const TString16 luogo, const TString16 sezione); TMask& app_mask() { return *_msk; } TControlloDonazioni() : _cognome_nome("",35) {} }; HIDDEN inline TControlloDonazioni& app() { return (TControlloDonazioni&) main_app(); } void TControlloDonazioni::set_page(int file, int cnt) { set_row(1,"@0g#D", &_counter); set_row(1,"@7g@pn", FLD(LF_DONAZ,DON_ETICHETTA,"#########")); set_row(1,"@17g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########")); set_row(1,"@26g@S", FLD(LF_SOGGETTI,SOG_TESSAVIS)); set_row(1,"@34g#a", &_cognome_nome); set_row(1,"@70g@ld", FLD(LF_SOGGETTI,SOG_DATANASC)); set_row(1,"@81g@S", FLD(LF_SOGGETTI,SOG_CODSEZ)); set_row(1,"@84g@S", FLD(LF_SOGGETTI,SOG_CODSOT)); set_row(1,"@87g@ld", FLD(LF_DONAZ,DON_DATADON)); set_row(1,"@98g@S", FLD(LF_DONAZ,DON_TIPODON)); set_row(1,"@104g@S", FLD(LF_DONAZ, DON_LUOGODON)); set_row(1,"@110g@S", FLD(LF_SOGGETTI, SOG_GRUPPOAB0)); set_row(1,"@114g@S", FLD(LF_SOGGETTI, SOG_RHANTID)); } bool TControlloDonazioni::preprocess_page(int file, int counter) { // contatore soggetti stampati // per ora non c'è TString80 nome = current_cursor()->curr(LF_SOGGETTI).get(SOG_COGNOME); nome << " "; nome << current_cursor()->curr(LF_SOGGETTI).get(SOG_NOME); _cognome_nome = nome; // salto pagina se cambio punto di rottura switch (_tipostampa[0]) { case 'D': { const TDate datanew = current_cursor()->curr().get(DON_DATADON); if (datanew != _dataold ) { if (_dataold.ok()) printer().formfeed(); _dataold = datanew; header_data(datanew,"",""); _counter = 0; } } break; case 'L': { const TString16 luogonew = current_cursor()->curr().get(DON_LUOGODON); if (luogonew != _luogoold ) { if (_luogoold != "****") printer().formfeed(); _luogoold = luogonew; header_data(NULLDATE,luogonew,""); _counter = 0; } } break; case 'S': { TString16 seznew = current_cursor()->curr(LF_SOGGETTI).get(SOG_CODSEZ); seznew << "/"; seznew << current_cursor()->curr(LF_SOGGETTI).get(SOG_CODSOT); if (seznew != _sezold ) { if (_sezold != "****") printer().formfeed(); _sezold = seznew; header_data(NULLDATE,"",seznew); _counter = 0; } } break; } _counter++; return TRUE; } void TControlloDonazioni::header_data(const TDate data, const TString16 luogo, const TString16 sezione) { TString intestazione(132); intestazione = "STAMPA DI CONTROLLO DONAZIONI "; switch (_tipostampa[0]) { case 'D': { intestazione << "PER DATA "; intestazione << data; } break; case 'L': { intestazione << "PER LUOGO "; intestazione << luogo; } break; case 'S': { intestazione << "PER SEZIONE "; intestazione << sezione; } break; } intestazione.center_just(); set_header(1,"@0g%s", (const char*) intestazione); intestazione = "Pag. @#"; set_header(1, "@110g%s", (const char*) intestazione); return; } bool TControlloDonazioni::set_print(int m) { KEY tasto; tasto = _msk->run(); if (tasto == K_ENTER) { _sezini = _msk->get(F_SEZINI); _sotini = _msk->get(F_SOTINI); _dataini = _msk->get_date(F_DATAINI); _datafin = _msk->get_date(F_DATAFIN); _tipodon = _msk->get(F_TIPODON); _luogodon = _msk->get(F_LUOGODON); _tipostampa = _msk->get(F_TIPOSTAMPA); _ordinamento = _msk->get(F_ORDINAMENTO); TString80 chiave = ""; switch (_tipostampa[0]) { case 'D': chiave = "92->DATADON|"; break; case 'L': chiave = "92->LUOGODON|92->DATADON|"; break; case 'S': chiave = "90->CODSEZ|90->CODSOT|92->DATADON|"; break; } switch (_ordinamento[0]) { case 'C': chiave << "UPPER(90->COGNOME)|UPPER(90->NOME)"; break; case 'I': chiave << "92->PROGINS"; break; case 'E': chiave << "92->ETICHETTA"; break; } TString80 filtro = ""; // filtro per tipo donazione if (_tipodon.not_empty()) filtro = format("(TIPODON == \"%s\")",(const char*)_tipodon); // filtro per luogo donazione if (_luogodon.not_empty()) { if (filtro.empty()) filtro = format("(LUOGODON == \"%s\")",(const char*)_luogodon); else { filtro << " && "; filtro << format("(LUOGODON == \"%s\")",(const char*)_luogodon); } } // filtro per sezione/sottogruppo if (_sezini.not_empty()) { if (filtro.empty()) filtro = format("(90->CODSEZ == \"%s\")",(const char*)_sezini); else { filtro << " && "; filtro << format("(90->CODSEZ == \"%s\")",(const char*)_sezini); } if (_sotini.not_empty()) { if (filtro.empty()) filtro = format("(90->CODSOT == \"%s\")",(const char*)_sotini); else { filtro << " && "; filtro << format("(90->CODSOT == \"%s\")",(const char*)_sotini); } } } // 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)); current_cursor()->setfilter((const char*) filtro, TRUE); _counter = 0; _dataold = NULLDATE; _luogoold = "****"; _sezold = "****"; reset_files(); add_file(LF_DONAZ); reset_print(); crea_intestazione(); return TRUE; } else return FALSE; } void TControlloDonazioni::crea_intestazione() { reset_header(); TString sep(132); sep = "Selezioni della stampa: "; if (_sezini.not_empty()) { sep << "Sez. "; sep << _sezini; if (_sotini.not_empty()) { sep << "/"; sep << _sotini; } sep << "; "; } if (_dataini.ok()) { sep << "Dal "; sep << _dataini.string(); } if (_datafin.ok()) { sep << " Al "; sep << _datafin.string(); } if (_dataini.ok() || _datafin.ok()) sep << "; "; if (_tipodon.not_empty()) { sep << "Tipo "; sep << _tipodon; sep << "; "; } if (_luogodon.not_empty()) { sep << "Luogo "; sep << _luogodon; sep << "; "; } sep.center_just(); set_header(2,"@0g%s", (const char*) sep); set_header(3,"@0gProg.@7gEt.sacca@17gCodice@26gTessera@34gCognome e nome@70gNato il@81gSe/So@87gData don.@98gTipo@104gLuogo@110gGr.@114gRh"); set_header(4,"@0g------@7g---------@17g--------@26g-------@34g-----------------------------------@70g----------@81g-----@87g----------@98g----@104g-----@110g---@114g---"); } bool TControlloDonazioni::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("at6300a"); return TRUE; } bool TControlloDonazioni::user_destroy() { delete _msk; delete _rel; return TRUE; } int at6300(int argc, char* argv[]) { TControlloDonazioni a; a.run(argc, argv, "Stampa di controllo donazioni"); return 0; }