#include #include #include #include #include #include #include "at7.h" // nomi dei campi #include "soggetti.h" #include "storico.h" #include "donaz.h" class TAggiornaDon : public TPrintapp { TMask* _msk; TRelation* _rel; int _cur; TLocalisamfile* _donaz; TLocalisamfile* _storico; TRecord_array* _sdonazioni; TRecord_array* _sstorico; 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: TAggiornaDon() {} }; HIDDEN inline TAggiornaDon& app() { return (TAggiornaDon&) main_app(); } bool TAggiornaDon::preprocess_page(int file, int counter) { bool rewrite = FALSE; TRectype& recsog = current_cursor()->curr(); const TDate dataisc = recsog.get(SOG_DATAISC); const TDate datadim = recsog.get(SOG_DATADIM); const long codice = recsog.get_long(SOG_CODICE); const TString16 codsez = recsog.get(SOG_CODSEZ); const TString16 codsot = recsog.get(SOG_CODSOT); TRectype* keys = new TRectype(LF_STORICO); keys->put(SOG_CODICE, codice); int errs = _sstorico->read(keys); TRectype* keyd = new TRectype(LF_DONAZ); keyd->put(DON_CODICE, codice); int errd = _sdonazioni->read(keyd); if (errd == NOERR) { TDate datadon; for (int r=1; r<=_sdonazioni->rows(); r++) { TRectype& riga = _sdonazioni->row(r, TRUE); datadon = riga.get(DON_DATADON); if (dataisc.ok()) // ha la data iscrizione { if (datadon >= dataisc) // la data donazione è superiore alla data iscrizione if (datadim.ok()) // ha la data dimisssione if (datadon <= datadim) // la data donazione è inferiore alla data dimissione { riga.put(DON_CODSEZ, codsez); riga.put(DON_CODSOT, codsot); rewrite = TRUE; } else // la data donazione è superiore alla data dimissione { // c'è un errore, quindi uso sezione/sottogruppo del soggetto riga.put(DON_CODSEZ, codsez); riga.put(DON_CODSOT, codsot); rewrite = TRUE; } else // non ha data dimissione { riga.put(DON_CODSEZ, codsez); riga.put(DON_CODSOT, codsot); rewrite = TRUE; } else // la data donazione è inferiore alla data iscrizione { bool trovato = FALSE; for (int l=1; l<=_sstorico->rows(); l++) { const TRectype& rigas = _sstorico->row(l); const TDate data1 = rigas.get(STO_DATAISC); const TDate data2 = rigas.get(STO_DATADIM); if ((datadon >= data1) && (datadon <= data2)) { trovato = TRUE; riga.put(DON_CODSEZ, rigas.get(STO_CODSEZ)); riga.put(DON_CODSOT, rigas.get(STO_CODSOT)); rewrite = TRUE; } } if (!trovato) // non ha trovato nello storico un periodo corrispondente alla data donazione { riga.put(DON_CODSEZ, codsez); riga.put(DON_CODSOT, codsot); rewrite = TRUE; } } } else // non ha la data di iscrizione { riga.put(DON_CODSEZ, codsez); riga.put(DON_CODSOT, codsot); rewrite = TRUE; } } if (rewrite) _sdonazioni->rewrite(); } return rewrite; } void TAggiornaDon::set_page(int file, int cnt) { set_row(1,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########")); //set_row(1,"@10g@S", FLD(LF_SOGGETTI,SOG_COGNOME)); //set_row(1,"@36g@S", FLD(LF_SOGGETTI,SOG_NOME)); } bool TAggiornaDon::set_print(int) { KEY tasto; tasto = _msk->run(); if (tasto == K_ENTER) { reset_files(); add_file(LF_SOGGETTI); reset_print(); return TRUE; } else return FALSE; } bool TAggiornaDon::user_create() { _msk = new TMask("at7500a"); _rel = new TRelation(LF_SOGGETTI); _donaz = new TLocalisamfile(LF_DONAZ); _storico = new TLocalisamfile(LF_STORICO); _sdonazioni = new TRecord_array(LF_DONAZ,DON_PROGDON); _sstorico = new TRecord_array(LF_STORICO,STO_PROGSTO); _cur = add_cursor(new TCursor(_rel, "", 1)); return TRUE; } bool TAggiornaDon::user_destroy() { delete _msk; delete _rel; delete _donaz; delete _storico; delete _sdonazioni; delete _sstorico; return TRUE; } int at7500(int argc, char* argv[]) { TAggiornaDon a; a.run(argc, argv, "Aggiornamento sez./sot. su archivio donazioni"); return 0; }