diff --git a/ef/ef0.cpp b/ef/ef0.cpp index 6addf04c6..67c0fb7d6 100755 --- a/ef/ef0.cpp +++ b/ef/ef0.cpp @@ -18,7 +18,10 @@ int main(int argc, char** argv) break; case 2: res = ef0300(argc,argv); - break; + break; + case 3: + res = ef0400(argc,argv); + break; default: error_box(usage, argv[0]); break; diff --git a/ef/ef0.h b/ef/ef0.h index ae65c8d2e..f69f8d872 100755 --- a/ef/ef0.h +++ b/ef/ef0.h @@ -4,6 +4,7 @@ int ef0100(int argc, char* argv[]); int ef0200(int argc, char* argv[]); int ef0300(int argc, char* argv[]); +int ef0400(int argc, char* argv[]); #endif // __EF0_H diff --git a/ef/ef0.url b/ef/ef0.url index b571277c1..10b8ae37e 100755 --- a/ef/ef0.url +++ b/ef/ef0.url @@ -14,4 +14,10 @@ MENU MENU_BAR(1) MENUBAR MENU_BAR(2) MENU MENU_BAR(2) - SUBMENU MENU_FILE "~File" \ No newline at end of file + SUBMENU MENU_FILE "~File" + +/* ef0 -3 */ +MENUBAR MENU_BAR(3) + +MENU MENU_BAR(3) + SUBMENU MENU_FILE "~File" \ No newline at end of file diff --git a/ef/ef0100.cpp b/ef/ef0100.cpp index c78769f52..f20010059 100755 --- a/ef/ef0100.cpp +++ b/ef/ef0100.cpp @@ -46,13 +46,15 @@ public: // restituisce un riferimento all' applicazione inline TVariazione_effetti& app() {return (TVariazione_effetti&)main_app();} + // quando si va in query mode resetta i due campi della maschera void TVariazione_effetti::init_query_mode(TMask&) { _msk->reset(F_TOTIMP); _msk->reset(F_TOTIMPVAL); } -// quando si va in insert mode resetta i due campi della maschera, + +// quando si va in insert mode resetta i due campi della maschera relativi ai totali, // inserisce una riga vuota nello sheet e setta il flag dirty dello sheet // per forzare l'utente all'inserimento di una riga void TVariazione_effetti::init_insert_mode(TMask&) @@ -62,7 +64,8 @@ void TVariazione_effetti::init_insert_mode(TMask&) TToken_string riga("|||||||||"); righe_sheet().row(0)=riga; righe_sheet().set_dirty(); -} +} + // ritorna il prossimo numero valido di chiave const char* TVariazione_effetti::get_next_key() { @@ -78,18 +81,21 @@ const char* TVariazione_effetti::get_next_key() } return format("%d|%ld",F_NPROGTR,nprogtr); } + // ritorna un riferimento allo sheet dei cessionari TSheet_field& TVariazione_effetti::cess_sheet() const { TSheet_field& o_sheet = (TSheet_field&)_msk->field(F_SHEET_EFF); return o_sheet; } + // ritorna un riferimento allo sheet delle righe TSheet_field& TVariazione_effetti::righe_sheet() const { TSheet_field& r_sheet = (TSheet_field&)_msk->field(F_SHEET_RIGHE); return r_sheet; } + // metodo che permette di scivere su file i dati inseriti nella maschera; // comune alla write e alla rewrite void TVariazione_effetti::common_f(const TMask& m) @@ -144,6 +150,7 @@ void TVariazione_effetti::common_f(const TMask& m) } _effetto->renum(_effetto->numero()); } + // carica nella maschera i dati dai files int TVariazione_effetti::read(TMask& m) { @@ -169,11 +176,13 @@ int TVariazione_effetti::read(TMask& m) riga.add(rec.get(CES_RAGSOC)); riga.add(rec.get(CES_LOCALITA)); riga.add(rec.get(CES_STATO)); - codcom = rec.get(CES_COM); - riga.add(codcom); + + codcom = rec.get(CES_COM);//per caricare nello sheet dei cessionari la denominazione + riga.add(codcom); //del comune di cui si conosce il codice _com->zero(); _com->put("COM", codcom); if (_com->read() == NOERR) riga.add(_com->get(COM_DENCOM)); + shcess.row(i-1)=riga; } items = _effetto->rows_r(); @@ -197,6 +206,7 @@ int TVariazione_effetti::read(TMask& m) } return err; } + // riscrive i dati su file int TVariazione_effetti::rewrite(const TMask& m) { @@ -204,6 +214,7 @@ int TVariazione_effetti::rewrite(const TMask& m) TLocalisamfile f(LF_EFFETTI); return _effetto->rewrite(f); } + // scrive i dati su file int TVariazione_effetti::write(const TMask& m) { @@ -214,6 +225,7 @@ int TVariazione_effetti::write(const TMask& m) _rel->read();// rilegge per posizionare correttamente la relazione return err; } + // rimuove i dati dell'effetto bool TVariazione_effetti::remove() { @@ -235,6 +247,7 @@ bool TVariazione_effetti::user_create() righe_sheet().set_notify(impeff_notify); return TRUE; } + bool TVariazione_effetti::user_destroy() { delete _msk; @@ -245,6 +258,7 @@ bool TVariazione_effetti::user_destroy() delete _com; return TRUE; } + // handler che permette di effettuare il controllo sul fatto che venga inserita // almeno una riga per un effetto bool TVariazione_effetti::handle_sheet(TMask_field &f, KEY k) @@ -264,12 +278,13 @@ bool TVariazione_effetti::handle_sheet(TMask_field &f, KEY k) } if (!found) { - error_box("L'effetto deve contenere almeno una riga!"); + error_box("L'effetto non può contenere righe con importo nullo!"); return FALSE; } } return TRUE; } + // handler che permette il controllo sulla abilitazione dei campi collegati // al codice valuta bool TVariazione_effetti::codval_handler(TMask_field& f, KEY k) @@ -299,6 +314,7 @@ bool TVariazione_effetti::codval_handler(TMask_field& f, KEY k) } return TRUE; } + // funzione chiamata dal notify dello sheet per effettuare il calcolo degli importi totali // (in lire ed in valuta) dell'effetto void TVariazione_effetti::calcola_totali() @@ -318,6 +334,7 @@ void TVariazione_effetti::calcola_totali() m->set(F_TOTIMP, impeff); m->set(F_TOTIMPVAL, impeffval); } + // notify per il calcolo dei totali dell'effetto e per il controllo che non vengano eliminate // tutte le righe dell'effetto, almeno una deve rimanere bool TVariazione_effetti::impeff_notify(TSheet_field& s, int r, KEY key) diff --git a/ef/ef0100.h b/ef/ef0100.h index 9a15039f9..14153e288 100755 --- a/ef/ef0100.h +++ b/ef/ef0100.h @@ -1,55 +1,54 @@ #ifndef __EF0100_H #define __EF0100_H -// campi maschera ef0100a.msk +// campi maschera ef0100a.uml -#define F_NPROGTR 101 -#define F_CODCF 102 -#define F_CFRAGSOC 103 -#define F_DATASCAD 104 -#define F_TIPOPAG 105 -#define F_ULTCLASS 106 -#define F_CODVAL 107 -#define F_DATACAM 108 -#define F_CAMBIO 109 -#define F_ULTRATA 110 -#define F_SHEET_RIGHE 111 -#define F_TOTIMP 112 -#define F_TOTIMPVAL 113 -#define F_CODABI 114 -#define F_CODCAB 115 -#define F_CODABIP 116 -#define F_CODCABP 117 -#define F_DATAEMISS 118 -#define F_NUMEMISS 119 -#define F_EFFSTAMP 120 -#define F_TIPODIST 121 -#define F_NDIST 122 -#define F_DATADIST 123 -#define F_DISTSTAM 124 -#define F_NRIGADIST 125 -#define F_DATARIBA 126 -#define F_DISRIBAEST 127 -#define F_EFFCONT 128 -#define F_EFFCOMP 129 -#define F_SHEET_EFF 130 -// Identificatori campi per lo spreadsheet "Obbligati principali" -#define F_RAGSOC 101 -#define F_LOCALITA 102 -#define F_STATO 103 -#define F_COM 104 -#define F_DENCOM 105 - -// Identificatori campi per lo spreadsheet "Righe Effetto" -#define F_IMPFATT 101 -#define F_IMPEFF 102 -#define F_IMPFATTVAL 103 -#define F_IMPEFFVAL 104 -#define F_ANNO 105 -#define F_NUMPART 106 -#define F_NUMRIGA 107 -#define F_NUMRATA 108 -#define F_NUMFATT 109 -#define F_DATAFATT 110 +#define F_NPROGTR 101 +#define F_CODCF 102 +#define F_CFRAGSOC 103 +#define F_DATASCAD 104 +#define F_TIPOPAG 105 +#define F_ULTCLASS 106 +#define F_CODVAL 107 +#define F_DATACAM 108 +#define F_CAMBIO 109 +#define F_ULTRATA 110 +#define F_SHEET_RIGHE 111 +#define F_TOTIMP 112 +#define F_TOTIMPVAL 113 +#define F_CODABI 114 +#define F_CODCAB 115 +#define F_CODABIP 116 +#define F_CODCABP 117 +#define F_DATAEMISS 118 +#define F_NUMEMISS 119 +#define F_EFFSTAMP 120 +#define F_TIPODIST 121 +#define F_NDIST 122 +#define F_DATADIST 123 +#define F_DISTSTAM 124 +#define F_NRIGADIST 125 +#define F_DATARIBA 126 +#define F_DISRIBAEST 127 +#define F_EFFCONT 128 +#define F_EFFCOMP 129 +#define F_SHEET_EFF 130 +// campi maschera ef0100b.uml +#define F_RAGSOC 101 +#define F_LOCALITA 102 +#define F_STATO 103 +#define F_COM 104 +#define F_DENCOM 105 +// campi maschera ef0100c.uml +#define F_IMPFATT 101 +#define F_IMPEFF 102 +#define F_IMPFATTVAL 103 +#define F_IMPEFFVAL 104 +#define F_ANNO 105 +#define F_NUMPART 106 +#define F_NUMRIGA 107 +#define F_NUMRATA 108 +#define F_NUMFATT 109 +#define F_DATAFATT 110 #endif // __EF0100_H diff --git a/ef/ef0101.cpp b/ef/ef0101.cpp index 86472871d..23a8bb879 100755 --- a/ef/ef0101.cpp +++ b/ef/ef0101.cpp @@ -2,11 +2,13 @@ #include "reffetti.h" #include "cession.h" #include "ef0101.h" + // costruttore di default TEffetto::TEffetto() : TRectype(LF_EFFETTI), _righe(LF_REFFETTI, "NRIGATR"), _cess(LF_CESS, "NRIGA") { } + // costuisce l'effetto con il record passato TEffetto::TEffetto(TRectype& rec) : TRectype(LF_EFFETTI), _righe(LF_REFFETTI, "NRIGATR"), _cess(LF_CESS, "NRIGA") @@ -14,12 +16,14 @@ TEffetto::TEffetto(TRectype& rec) TLocalisamfile f(LF_EFFETTI); read(f,rec); } + //setta i campi per la prima chiave (nprogtr) del file void TEffetto::put_key(TRectype& rec, long numeff) const { CHECKD(numeff >= 0, "Numero effetto non valido ", numeff); rec.put("NPROGTR",numeff); } + //setta i campi per la quarta chiave (tipodist+ndist+nrigadist) del file void TEffetto::put_key(TRectype& rec,char tipodist, long ndist, long nrigadist) { @@ -30,6 +34,7 @@ void TEffetto::put_key(TRectype& rec,char tipodist, long ndist, long nrigadist) rec.put("NDIST", ndist); rec.put("NRIGADIST", nrigadist); } + // ritorna la prossima chiave utilizzabile (il prossimo numero progressivo) long TEffetto::get_next_key(const long codcf) const { @@ -51,6 +56,7 @@ long TEffetto::get_next_key(const long codcf) const n++; return n; } + // rinumera la chiave 1 long TEffetto::renum(long numeff) { @@ -60,9 +66,9 @@ long TEffetto::renum(long numeff) numeff = get_next_key(codcf); } char num[7]; sprintf(num, "%ld", numeff); - renum_key("NPROGTR", num); // aggiorna testata + renum_key("NPROGTR", num); // aggiorna testata _righe.renum_key("NPROGTR", num); // aggiorna righe ok - _cess.renum_key("NPROGTR", num); // aggiorna cessionari ok + _cess.renum_key("NPROGTR", num); // aggiorna cessionari ok return numeff; } @@ -74,15 +80,14 @@ int TEffetto::next(TBaseisamfile& f) return err; } - // permette di leggere il record passato nel file passato, comune alla lettura // per chiave 1 e per chiave 4 int TEffetto::leggi(TLocalisamfile &f, const TRectype& r) { int err = TRectype::read(f); const long nu = numero(); - TRectype *k_reff = new TRectype(LF_REFFETTI), - *k_cess = new TRectype(LF_CESS); + TRectype *k_reff = new TRectype(LF_REFFETTI),//necessari per poter andare a leggere i due record array + *k_cess = new TRectype(LF_CESS); //cessionari e righe effetto put_key(*k_reff, nu); put_key(*k_cess, nu); if (err == NOERR) @@ -106,12 +111,14 @@ int TEffetto::leggi(TLocalisamfile &f, const TRectype& r) } return err; } + // legge il record passato, con chiave 1 int TEffetto::read(TLocalisamfile& f, const TRectype& rec) { head() = rec; return leggi(f, rec); } + // legge l'effetto usando la chiave 4 int TEffetto::read(TLocalisamfile& f, char tipodist, long ndist, long nrigadist) { @@ -120,11 +127,10 @@ int TEffetto::read(TLocalisamfile& f, char tipodist, long ndist, long nrigadist) put_key(rec, tipodist, ndist, nrigadist); head() = rec; int err = leggi(f, rec); - /*if (err == _iskeynotfound) - err = f.next();*/ return err; } -// scrive l'effetto, sempre usando la chiave 1 + +// scrive l'effetto, usando la chiave 1 int TEffetto::write(TLocalisamfile& f, bool force) { const bool nuovo = numero() <= 0; // E' nuovo! @@ -167,6 +173,7 @@ int TEffetto::write(TLocalisamfile& f, bool force) } return err; } + // rimuove l'effetto int TEffetto::remove(TLocalisamfile& f)const { diff --git a/ef/ef0101.h b/ef/ef0101.h index 314d1b285..28d1c8fcb 100755 --- a/ef/ef0101.h +++ b/ef/ef0101.h @@ -1,6 +1,7 @@ #ifndef __RELATION_H #include #endif + class TEffetto:public TRectype { TRecord_array _righe,// righe dell'effetto diff --git a/ef/ef0300.cpp b/ef/ef0300.cpp index 50327558c..c80404d2f 100755 --- a/ef/ef0300.cpp +++ b/ef/ef0300.cpp @@ -22,17 +22,13 @@ protected: virtual void init_query_mode(TMask&); virtual void init_insert_mode(TMask&); virtual void init_modify_mode(TMask&); - virtual const char* get_next_key(); - virtual int read(TMask& m); virtual int rewrite(const TMask& m); virtual int write(const TMask& m); virtual bool remove(); - virtual TMask* get_mask(int mode) {return _msk;} virtual bool changing_mask(int mode) {return FALSE;} - static bool codval_handler(TMask_field& f, KEY k); static bool importo_handler(TMask_field& f, KEY k); static bool imp_aut_handler(TMask_field& f, KEY k); @@ -43,25 +39,19 @@ protected: static bool from_data_handler(TMask_field& f, KEY k); static bool to_data_handler(TMask_field& f, KEY k); static bool ordina_handler(TMask_field& f, KEY k); - static void calcola_totale(); static void calcola(); static void aggiungi(); static void carica_riba(); static void ord_data(); static void ord_fatt(); - TSheet_field& righe_sheet() const; TSheet_field& righe_sel_sheet() const; - bool cerca(long num); - bool user_create(); bool user_destroy(); - void aggiorna(); void elimina(); - TToken_string* common_f(const TMask& m); public: virtual TRelation* get_relation() const {return _rel;} @@ -86,10 +76,8 @@ void TVariazione_distinte::init_insert_mode(TMask&) { _msk->reset(F_TOTIMP); _msk->reset(F_TOTIMPVAL); - _msk->enable(F_TOTIMPVAL); _msk->enable(F_CODVAL); - _msk->disable(F_NUMBER); _msk->disable(F_TIPODIST); } @@ -109,13 +97,11 @@ const char* TVariazione_distinte::get_next_key() effetti.put("NDIST",ndist); effetti.setkey(4); int err = effetti.read(_isgteq); - if ( (err == _iskeynotfound) || (err == _iseof) ) //se non esiste alcuna distinta: { // il numero sarà 1 err == NOERR; return format("%d|%ld", F_NUMBER, ndist); } - while (err == NOERR) //se esitono già delle distinte: { // le leggo tutte e ne prendo il effetti.setkey(4); // numero, al verificarsi della fine file @@ -147,7 +133,6 @@ bool TVariazione_distinte::cerca(long num) bool trovato = FALSE; int items = _distinta->items(); TArray& righedist = _distinta->righe(); - for (int i = 0; i < items; i++)//ciclo sugli elementi dell'array { //se l'array è vuoto non trova nulla ed esce subito TEffetto& eff = (TEffetto&)righedist[i]; @@ -155,18 +140,17 @@ bool TVariazione_distinte::cerca(long num) if (num_eff == num) { trovato = TRUE; - break; + break;// esco quando ho già trovato l'effetto che cercavo } } return trovato; } -//Metodo che permette di scivere sull'array gli effetti presenti nello sheet +//Metodo che permette di scivere sull'array (in memoria) gli effetti presenti nello sheet void TVariazione_distinte::aggiorna() { TSheet_field& shrighe = righe_sheet(); int items = shrighe.items(); - for (int i = 0; i < items; i++) { TToken_string& row = shrighe.row(i); @@ -196,9 +180,7 @@ TToken_string* TVariazione_distinte::common_f(const TMask& m) TDate datadist = (TDate)m.get(F_DATA); long codabi = m.get_long(F_CODABIP); long codcab = m.get_long(F_CODCABP); - m.autosave(*_rel); - TToken_string* datidist= new TToken_string; datidist->cut(0); datidist->add(tipodist); @@ -209,12 +191,10 @@ TToken_string* TVariazione_distinte::common_f(const TMask& m) return datidist; } - int TVariazione_distinte::read(TMask& m) { m.autoload(*_rel); int err = _rel->status(); - if (err == NOERR) { err = _distinta->reset(); //resetto l'array che contiene gli effetti nella distinta @@ -226,7 +206,6 @@ int TVariazione_distinte::read(TMask& m) shrighe.reset(); int items = _distinta->items(); TArray& righedist = _distinta->righe(); - for (int i = 0; i < items; i++) // carico tutti gli effetti della distinta nello sheet { TEffetto& eff = (TEffetto&)righedist[i]; @@ -234,13 +213,11 @@ int TVariazione_distinte::read(TMask& m) riga.add(' '); riga.add(eff.get(EFF_NPROGTR)); riga.add(eff.get(EFF_DATASCAD)); - long codcf = eff.get_long(EFF_CODCF); //prendo la ragione sociale del cliente _clifo->zero(); //conoscendone il codice _clifo->put("TIPOCF", 'C'); _clifo->put("CODCF", codcf); if (_clifo->read() == NOERR) riga.add(_clifo->get("RAGSOC")); - if (eff.rows_r() == 1) //se l'effetto contiene solo una riga metto i { //riferimenti al documento ed al numero di rata const TRectype& rec_r = eff.row_r(1); @@ -254,7 +231,6 @@ int TVariazione_distinte::read(TMask& m) riga.add(("Varie")); riga.add(("Varie")); } - TString codval(3); //gestisco il controllo sulla presenza o meno di una valuta codval = eff.get(EFF_CODVAL); if (i == 0) @@ -266,10 +242,8 @@ int TVariazione_distinte::read(TMask& m) m.set(F_CODVAL, codval); } riga.add(codval); - riga.add(eff.get(EFF_IMPORTO)); riga.add(eff.get(EFF_IMPORTOVAL)); - shrighe.row(i) = riga; } } @@ -279,7 +253,7 @@ int TVariazione_distinte::read(TMask& m) //Si prendono tutte le righe dello sheet e si controlla il primo campo se e' a true si distrugge // la riga e si aggiorna il file. -// GLI EFFETTI PRESENTI NELLO SHEET DEVONO GIA ESSERE STATI REGISTRATI. +// GLI EFFETTI PRESENTI NELLO SHEET DEVONO GIA ESSERE STATI REGISTRATI NEL FILE. void TVariazione_distinte::elimina() { TEffetto eff; @@ -290,24 +264,19 @@ void TVariazione_distinte::elimina() TSheet_field& sf = (TSheet_field&)_msk->field(F_SHEET_RIBA); bool condition = FALSE, deleted = FALSE; TArray& righedist = distinta->righe(); - for (int i = 0, k = i+1; i < sf.items(); i++, k++)//ciclo sugli elementi dello sheet { if (deleted) i--; //per posizionarsi correttamente sulla prima riga dello sheet - if (sf.items() == 1) { error_box("IMPOSSIBILE CANCELLARE: La distinta deve contenere almeno un effetto!"); break; } - TToken_string& row = sf.row(i); condition = *row.get(0) == 'X'; - if (condition) { long num = row.get_long(1); - for (int j = 0; j < distinta->items(); j++)//ciclo sugli elementi dell'array { TEffetto& eff = (TEffetto&)righedist[j]; @@ -318,7 +287,6 @@ void TVariazione_distinte::elimina() break; } } - sf.destroy(i); deleted = TRUE; eff.read(file, tipodist, ndist, k); eff.zero("TIPODIST"); @@ -337,23 +305,18 @@ int TVariazione_distinte::rewrite(const TMask& m) { TSheet_field& sf = righe_sheet(); bool condition = FALSE; - for (int i = 0; i < sf.items(); i++) { TToken_string& row = sf.row(i); if (condition = *row.get(0) == 'X') break; } - if (condition) if (yesno_box("Vuoi veramete eliminare gli effetti selezionati")) elimina(); //elimino gli effetti nello sheet che sono selezionati con la "X" - int err = _distinta->reset(); //resetto l'array che contiene gli effetti nella distinta char tipodist = m.get(F_TIPODIST)[0]; long ndist = m.get_long(F_NUMBER); - aggiorna(); - err = _distinta->rewrite(common_f(m)); if (err == NOERR) { //riposiziono la relazione @@ -372,11 +335,8 @@ int TVariazione_distinte::write(const TMask& m) int err = _distinta->reset(); //resetto l'array che contiene gli effetti nella distinta char tipodist = m.get(F_TIPODIST)[0]; long ndist = m.get_long(F_NUMBER); - aggiorna(); - err = _distinta->write(TRUE, common_f(m)); - if (err == NOERR) { //riposiziono la relazione _rel->lfile().setkey(4); @@ -390,13 +350,12 @@ int TVariazione_distinte::write(const TMask& m) } //Metodo che permette di eliminare una distinta, l'eliminazione consiste nell'andare a togliere -// dagli effetti presenti i dati ad essa relativi. +// dagli effetti i dati ad essa relativi. bool TVariazione_distinte::remove() { TMask* m = app()._msk; char tipodist = m->get(F_TIPODIST)[0]; long ndist = m->get_long(F_NUMBER); - int err = _distinta->remove(tipodist, ndist) == NOERR; return err; } @@ -410,9 +369,7 @@ bool TVariazione_distinte::user_create() _cession = new TLocalisamfile(LF_CESS); _clifo = new TLocalisamfile(LF_CLIFO); _distinta = new TDistinta; - set_search_field(F_NUMBER); //setto il campo di ricerca della distinta - _msk->set_handler(F_CODVAL, codval_handler); _msk->set_handler(F_IMP, importo_handler); _m2->set_handler(F_TOTIMPDIST, imp_aut_handler); @@ -421,10 +378,8 @@ bool TVariazione_distinte::user_create() _m2->set_handler(F_DADATA, from_data_handler); _m2->set_handler(F_ADATA, to_data_handler); _m2->set_handler(F_TIPORD, ordina_handler); - righe_sheet().set_notify(impdist_notify); righe_sel_sheet().set_notify(imp_notify); - return TRUE; } @@ -437,7 +392,6 @@ bool TVariazione_distinte::user_destroy() delete _cession; delete _clifo; delete _distinta; - return TRUE; } @@ -458,21 +412,18 @@ void TVariazione_distinte::carica_riba() TSheet_field& sf = (TSheet_field&)m2->field(F_SHEET); sf.reset(); int err, i = 0; - err = eff.read(f, tipodist, ndist, nrigadist); while ( (err == NOERR) && (tipodist == 0) ) - { //carico tutti gli effetti che soddisfano alla condizio nello sheet + { //carico tutti gli effetti che soddisfano alla condizione nello sheet riga.cut(0); riga.add(' '); riga.add(eff.get(EFF_NPROGTR)); riga.add(eff.get(EFF_DATASCAD)); - long codcf = eff.get_long(EFF_CODCF); clifo->zero(); clifo->put("TIPOCF", 'C'); clifo->put("CODCF", codcf); if (clifo->read() == NOERR) riga.add(clifo->get("RAGSOC")); - if (eff.rows_r() == 1) //se l'effetto contiene solo una riga metto i { //riferimenti al documento ed al numero di rata const TRectype& rec_r = eff.row_r(1); @@ -486,13 +437,10 @@ void TVariazione_distinte::carica_riba() riga.add(("Varie")); riga.add(("Varie")); } - riga.add(eff.get(EFF_CODVAL)); riga.add(eff.get(EFF_IMPORTO)); riga.add(eff.get(EFF_IMPORTOVAL)); - sf.row(i) = riga; - i++; f.setkey(4); err = eff.next(f); @@ -506,7 +454,6 @@ bool TVariazione_distinte::codval_handler(TMask_field& f, KEY k) { TMask &m = f.mask(); TString val(f.get()); - if (f.to_check(k, TRUE)) { const bool condition = (val == "LIT" || val.empty()); @@ -523,7 +470,6 @@ bool TVariazione_distinte::importo_handler(TMask_field& f, KEY k) { TMask& m = f.mask(); TSheet_field& sf_riba = (TSheet_field&)m.field(F_SHEET_RIBA); - if (f.to_check(k, TRUE)) { const int mode = m.mode(); @@ -533,7 +479,6 @@ bool TVariazione_distinte::importo_handler(TMask_field& f, KEY k) long imp_pres = m.get_long(F_TOTIMP); long imp = m.get_long(F_IMP); long impdist = imp - imp_pres; - if (impdist > 0) { app().begin_wait(); @@ -544,7 +489,6 @@ bool TVariazione_distinte::importo_handler(TMask_field& f, KEY k) m2->set(F_TOTIMPDIST, impdist); m2->run(); } - if (impdist < 0) error_box("Il valore di presentazione non può superare l'importo della distinta"); } @@ -559,7 +503,6 @@ bool TVariazione_distinte::importo_handler(TMask_field& f, KEY k) bool TVariazione_distinte::imp_aut_handler(TMask_field& f, KEY k) { TMask& m2 = f.mask(); - if (f.to_check(k, TRUE)) { TMask* m = app()._msk; @@ -567,22 +510,17 @@ bool TVariazione_distinte::imp_aut_handler(TMask_field& f, KEY k) TSheet_field& sf_riba = (TSheet_field&)m->field(F_SHEET_RIBA); long impdist = m->get_long(F_IMP) - m->get_long(F_TOTIMP); long tot_imp_dist = m2.get_long(F_TOTIMPDIST), impsel = 0; - if (tot_imp_dist != 0 && impdist != 0) { TString val = m->get(F_CODVAL); int items = sf.items(); - for(int i = 0; i < items; i++) { TToken_string& row = sf.row(i); TString codval = row.get(7); - if (codval == " " || codval == "LIT")//se la valuta non appare o è lire codval.trim(); //faccio in modo che vengano presi gli effetti con valuta inesistente - long imp = row.get_long(8); - if ((imp <= tot_imp_dist) && ((impsel+imp) <= tot_imp_dist)) { if ((sf_riba.items() == 0) && (val.empty()|| val == "LIT"))//se non è stata specificata una valuta si prende quella del @@ -590,14 +528,12 @@ bool TVariazione_distinte::imp_aut_handler(TMask_field& f, KEY k) m->set(F_CODVAL, codval); val = m->get(F_CODVAL); } - if (codval == val) { row.add('X',0);//seleziono l'effetto poichè soddisfa alle condizione richieste impsel += imp; } } - if (impsel <= tot_imp_dist) continue; else break; } @@ -608,14 +544,12 @@ bool TVariazione_distinte::imp_aut_handler(TMask_field& f, KEY k) return TRUE; } - //Handler per gestire la pressione del bottone conferma della maschera per l'aggiunta delle // riba (ef0300c) bool TVariazione_distinte::conferma_handler(TMask_field& f, KEY k) { TMask* msk = app()._msk; TSheet_field& sf_riba = (TSheet_field&)msk->field(F_SHEET_RIBA); - if (k==K_ENTER) { TMask& m = f.mask(); @@ -623,12 +557,10 @@ bool TVariazione_distinte::conferma_handler(TMask_field& f, KEY k) TSheet_field& sf = (TSheet_field&)m.field(F_SHEET); int items = sf.items(); bool condition = FALSE; - for (int i = 0; i < items; i++) { TToken_string& row = sf.row(i); condition = *row.get(0)== 'X'; - if (condition) { row[0] = ' '; @@ -661,7 +593,6 @@ bool TVariazione_distinte::from_data_handler(TMask_field& f, KEY k) bool deleted = FALSE; TDate data = m.get_date(F_DADATA); TSheet_field& sf = (TSheet_field&)m.field(F_SHEET); - for(int i = 0; i < sf.items(); i++) { if (deleted) i--; @@ -690,7 +621,6 @@ bool TVariazione_distinte::to_data_handler(TMask_field& f, KEY k) bool deleted = FALSE; TDate data = m.get_date(F_ADATA); TSheet_field& sf = (TSheet_field&)m.field(F_SHEET); - for(int i = 0; i < sf.items(); i++) { if (deleted) i--; diff --git a/ef/ef0301.cpp b/ef/ef0301.cpp index a136d8783..c3a79c2e3 100755 --- a/ef/ef0301.cpp +++ b/ef/ef0301.cpp @@ -3,16 +3,19 @@ #include "cession.h" #include "ef0301.h" +// costruttore di default TDistinta::TDistinta(const TRectype& rec) { read(rec); } +// costruisce la distinta del tipo e numero passati TDistinta::TDistinta(const char tipo, const long numero) { read(tipo,numero); } +// permette di leggere la distinta del tipo e numero passati int TDistinta::read(const char tipo, const long numero) { int err = NOERR; @@ -21,27 +24,29 @@ int TDistinta::read(const char tipo, const long numero) for (int i=0; err == NOERR ; i++) { TEffetto* effetto = new TEffetto; - err = effetto->read(f, tipo, numero, i+1); + err = effetto->read(f, tipo, numero, i+1);//legge un effetto per chiave 4 if (err == NOERR) _righe_dist.add(effetto); } - if ((_righe_dist.items()>0)||(err == _iseof) ) - err = NOERR; + if ((_righe_dist.items()>0)||(err == _iseof) )//se ho letto degli effetti della distinta ed ho + err = NOERR; //trovato la fine file elimino l'errore return err; } - + +// permette di leggere il record passato int TDistinta::read(const TRectype& rec) { CHECK(rec.num() == LF_EFFETTI,"Can't read distinta from a different record type"); const char tipo = rec.get_char(EFF_TIPODIST); const long numero = rec.get_long(EFF_NDIST); - return read(tipo,numero); + return read(tipo,numero);//legge la distinta } +// scrive la distinta int TDistinta::write(bool force, TToken_string* dati_dist) { int err = NOERR; - const int elem = items(); + const int elem = items(); //quanti effetti sono nella distinta (nell'array in memoria) TLocalisamfile f(LF_EFFETTI); for (int i=0; iget_long()); effetto.put("CODCABP", dati_dist->get_long()); effetto.put("NRIGADIST", i+1); - - err = effetto.rewrite(f); + err = effetto.rewrite(f);//riscrivo l'effetto con i dati della distinta a cui appartiene } return err; } +// rimuove la distinta int TDistinta::remove(char tipodist, long ndist) { int err; - //elimino dal file + //elimino dal file il collegamento tra gli effetti e la distinta TLocalisamfile file(LF_EFFETTI); for (int i = 0; i < items(); i++) { @@ -76,6 +81,6 @@ int TDistinta::remove(char tipodist, long ndist) effetto.zero("CODCABP"); err = effetto.rewrite(file); } - reset(); + reset();//elimino gli effetti dalla memoria return err; } diff --git a/ef/ef0400.cpp b/ef/ef0400.cpp new file mode 100755 index 000000000..d9fcaf1c8 --- /dev/null +++ b/ef/ef0400.cpp @@ -0,0 +1,229 @@ +#include +#include //per definizione BAR_ITEM +#include +#include +#include +#include +#include +#include +#include +#include "ef0.h" +#include "ef0101.h" +#include "ef0400.h" + +//Classe per l'eliminazione di effetti di effetti con selezione per gruppi +class TEliminazione_effetti: public TApplication +{ + TMask *_msk; + TRelation *_rel; + TLocalisamfile *_reff, *_cession; + TRectype *_from, *_to; + virtual bool create() ; + virtual bool destroy() ; + virtual bool menu(MENU_TAG); +protected: + static bool from_numero_handler(TMask_field& f, KEY k); + static bool to_numero_handler(TMask_field& f, KEY k); + static bool from_data_handler(TMask_field& f, KEY k); + static bool to_data_handler(TMask_field& f, KEY k); + static bool conferma_handler(TMask_field& f, KEY k); + static bool annulla_handler(TMask_field& f, KEY k); + static void elimina(); +public: + TEliminazione_effetti() {}; + virtual ~TEliminazione_effetti() {}; +}; + +inline TEliminazione_effetti& app() +{ + return (TEliminazione_effetti&)main_app(); +} + +bool TEliminazione_effetti::create() +{ + _msk = new TMask("ef0400a"); + _rel = new TRelation(LF_EFFETTI); + _reff = new TLocalisamfile(LF_REFFETTI); + _cession = new TLocalisamfile(LF_CESS); + _rel->first(); + _from = new TRectype(_rel->lfile().curr()); + _rel->last(); + _to = new TRectype(_rel->lfile().curr()); + _msk->set_handler(F_DA_RIBA, from_numero_handler); + _msk->set_handler(F_A_RIBA, to_numero_handler); + _msk->set_handler(F_DA_DATA, from_data_handler); + _msk->set_handler(F_A_DATA, to_data_handler); + _msk->set_handler(DLG_OK, conferma_handler); + _msk->set_handler(DLG_CANCEL, annulla_handler); + dispatch_e_menu(BAR_ITEM(1)); + return TRUE; +} + +bool TEliminazione_effetti::destroy() +{ + delete _msk; + delete _rel; + delete _reff; + delete _cession; + delete _from; + delete _to; + return TRUE; +} + +//Carica maschera eliminazione effetti +bool TEliminazione_effetti::menu(MENU_TAG) +{ + KEY key = K_ENTER; + while (key != K_QUIT)//finchè non si chiude la maschera + { + key = _msk->run(); + } + return FALSE; +} + +//Handler per la gestione della prima chiave (from) del cursore per numero +bool TEliminazione_effetti::from_numero_handler(TMask_field& f, KEY k) +{ + TMask &m = f.mask(); + if (k == K_TAB) + { + if (!f.get().empty()) + { + TRectype* from = app()._from; + long num = m.get_long(F_DA_RIBA); + from->put("NPROGTR", num); + } + } + return TRUE; +} + +//Handler per la gestione della seconda chiave (to) del cursore per numero +bool TEliminazione_effetti::to_numero_handler(TMask_field& f, KEY k) +{ + TMask &m = f.mask(); + if (k == K_TAB) + { + if (!f.get().empty()) + { + TRectype* to = app()._to; + long num = m.get_long(F_A_RIBA); + to->put("NPROGTR", num); + } + } + return TRUE; +} + +//Handler per la gestione della prima chiave (from) del cursore per data +bool TEliminazione_effetti::from_data_handler(TMask_field& f, KEY k) +{ + TMask &m = f.mask(); + if (k == K_TAB) + { + if (!f.get().empty()) + { + TRectype* from = app()._from; + TDate data = m.get(F_DA_DATA); + long num = m.get_long(F_DA_RIBA); + from->put("NPROGTR", num); + from->put("DATASCAD", data); + } + } + return TRUE; +} + +//Handler per la gestione della seconda chiave (to) del cursore per numero +bool TEliminazione_effetti::to_data_handler(TMask_field& f, KEY k) +{ + TMask &m = f.mask(); + if (k == K_TAB) + { + if (!f.get().empty()) + { + TRectype* to = app()._to; + TDate data = m.get(F_A_DATA); + long num = m.get_long(F_A_RIBA); + to->put("NPROGTR", num); + to->put("DATASCAD", data); + } + } + return TRUE; +} + +//Si effettua l'istanziazione del cursore e si eliminano gli effetti che vi appartengono +void TEliminazione_effetti::elimina() +{ + const TRectype *from = app()._from; + const TRectype *to = app()._to; + TMask *m = app()._msk; + TRelation *rel = app()._rel; + const char* filter; + int key; + char op1 = m->get(F_TIPOSEL)[0]; + char op2 = m->get(F_TIPOCANC)[0]; + + switch (op1) //scelgo la chiave per il cursore + { + case 'N': //selezione effetti per numero + key = 1; + break; + case 'D': //selezione effetti per data + key = 3; + break; + } + + switch (op2) //scelgo il filtro per il cursore + { + case 'S': //cancello effetti stampati + filter = "EFFSTAMP=\"X\""; + break; + case 'C': //cancello effetti contabilizzati + filter = "EFFCONT=\"X\""; + break; + default : //cancello tutti gli effetti + filter = ""; + break; + } + + TCursor cur(rel,filter,key,from,to); + TLocalisamfile& delfile = cur.file(); + + long n = cur.items(); + cur.freeze(); + + for (cur=0; cur.pos() < n; ++cur) + { + TEffetto eff(delfile.curr()); + eff.remove(delfile); + } +} + +//Handler per gestire la conferma della cancellazione degli effetti +bool TEliminazione_effetti::conferma_handler(TMask_field& f, KEY k) +{ + TMask &m = f.mask(); + if (k == K_SPACE) + { + if (yesno_box("Vuoi veramete eliminare gli effetti selezionati")) + elimina(); + } + return TRUE; +} + +//Handler per gestire la conferma dell'annullamento dei dati inseriti nella maschera +bool TEliminazione_effetti::annulla_handler(TMask_field& f, KEY k) +{ + TMask &m = f.mask(); + if (k == K_SPACE) + { + if (yesno_box("Vuoi veramete annullare i dati inseriti")) + m.reset(); + } + return TRUE; +} + +int ef0400(int argc, char* argv[]) +{ + TEliminazione_effetti a ; + a.run(argc, argv, "Eliminazione Effetti"); + return 0; +} \ No newline at end of file diff --git a/ef/ef0400.h b/ef/ef0400.h new file mode 100755 index 000000000..7c9c0f507 --- /dev/null +++ b/ef/ef0400.h @@ -0,0 +1,13 @@ +#ifndef __EF0400_H +#define __EF0400_H + +// campi maschera ef0400a.msk + +#define F_TIPOSEL 101 +#define F_TIPOCANC 102 +#define F_DA_RIBA 103 +#define F_A_RIBA 104 +#define F_DA_DATA 105 +#define F_A_DATA 106 + +#endif // __EF0400_H diff --git a/ef/ef0400a.uml b/ef/ef0400a.uml new file mode 100755 index 000000000..56c4f3723 --- /dev/null +++ b/ef/ef0400a.uml @@ -0,0 +1,108 @@ +#include "ef0400.h" + +PAGE "Eliminazione Effetti" -1 -1 65 14 + +LIST F_TIPOSEL 24 +BEGIN + PROMPT 2 1 "Tipo Selezione " + ITEM "N|Numero progressivo" + MESSAGE DISABLE,2@ + MESSAGE ENABLE,1@ + ITEM "D|Data scadenza" + MESSAGE DISABLE,1@ + MESSAGE ENABLE,2@ +END + +LIST F_TIPOCANC 24 +BEGIN + PROMPT 2 3 "Tipo Cancellazione " + ITEM "T|Tutti" + ITEM "S|Quelli stampati" + ITEM "C|Quelli contabilizzati" +END + +GROUPBOX DLG_NULL 55 3 +BEGIN + PROMPT 1 5 "Selezione effetti per numero progressivo" + GROUP 1 +END + +NUMBER F_DA_RIBA 7 0 +BEGIN + PROMPT 2 6 "Dalla Riba " + GROUP 1 + FIELD LF_EFFETTI->NPROGTR + USE LF_EFFETTI KEY 1 + INPUT NPROGTR F_DA_RIBA + DISPLAY "Nr. progressivo" NPROGTR + DISPLAY "Data scadenza" DATASCAD + OUTPUT F_DA_RIBA NPROGTR + CHECKTYPE NORMAL +END + +NUMBER F_A_RIBA 7 0 +BEGIN + PROMPT 30 6 "Alla Riba " + GROUP 1 + FIELD LF_EFFETTI->NPROGTR + USE LF_EFFETTI KEY 1 + INPUT NPROGTR F_A_RIBA + DISPLAY "Nr. progressivo" NPROGTR + DISPLAY "Data scadenza" DATASCAD + OUTPUT F_A_RIBA NPROGTR + CHECKTYPE NORMAL +END + +GROUPBOX DLG_NULL 55 3 +BEGIN + PROMPT 1 9 "Selezione effetti per data scadenza" + GROUP 2 +END + +DATA F_DA_DATA +BEGIN + PROMPT 2 10 "Dalla Data " + GROUP 2 + FIELD LF_EFFETTI->DATASCAD + USE LF_EFFETTI KEY 3 + INPUT DATASCAD F_DA_DATA + DISPLAY "Data scadenza" DATASCAD + DISPLAY "Nr. progressivo" NPROGTR + OUTPUT F_DA_DATA DATASCAD + OUTPUT F_DA_RIBA NPROGTR + CHECKTYPE NORMAL +END + +DATA F_A_DATA +BEGIN + PROMPT 30 10 "Alla Data " + GROUP 2 + FIELD LF_EFFETTI->DATASCAD + USE LF_EFFETTI KEY 3 + INPUT DATASCAD F_A_DATA + DISPLAY "Data scadenza" DATASCAD + DISPLAY "Nr. progressivo" NPROGTR + OUTPUT F_A_DATA DATASCAD + OUTPUT F_A_RIBA NPROGTR + CHECKTYPE NORMAL +END + +BUTTON DLG_OK 9 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_CANCEL 9 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_QUIT 9 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE +ENDMASK + +