diff --git a/ef/ef0100.cpp b/ef/ef0100.cpp index 9c5f982eb..658841585 100755 --- a/ef/ef0100.cpp +++ b/ef/ef0100.cpp @@ -4,209 +4,343 @@ #include #include #include -#include "effetti.h" -#include "cession.h" +#include +#include +#include +#include #include "ef0.h" #include "ef0100.h" #include "ef0101.h" -class Variazione_Effetti: public TRelation_application +//Classe per la gestione di effetti con metodi +// standard di: inserimento, modifica, cancellazione. +class TVariazione_effetti: public TRelation_application { - TMask* _msk; - TEffObb *_rel; - + TMask *_msk; + TEffetto *_effetto; + TRelation *_rel; + TLocalisamfile *_reff, *_cess, *_com; +protected: + virtual void init_query_mode(TMask&); + virtual void init_insert_mode(TMask&); + static bool handle_sheet(TMask_field& f, KEY); + static bool codval_handler(TMask_field& f, KEY k); + static bool impeff_notify(TSheet_field& s, int r, KEY key); virtual const char* get_next_key(); - TSheet_field& obb_sheet() const; - void obb_pack(); + TSheet_field& cess_sheet() const; + TSheet_field& righe_sheet() const; void common_f(const TMask& m); + static void calcola_totali(); virtual int read(TMask& m); virtual int rewrite(const TMask& m); virtual int write(const TMask& m); + virtual bool remove(); bool user_create(); bool user_destroy(); - virtual TMask* get_mask(int mode) {return _msk;} - virtual bool changing_mask(int mode) {return FALSE;} + virtual TMask* get_mask(int mode) {return _msk;} + virtual bool changing_mask(int mode) {return FALSE;} public: - static bool codcf_handler(TMask_field& f, KEY k); - static bool effcomp_handler(TMask_field& f, KEY k); virtual TRelation* get_relation() const {return _rel;} - Variazione_Effetti() {} + TVariazione_effetti() {}; + virtual ~TVariazione_effetti() {}; }; +inline TVariazione_effetti& app() {return (TVariazione_effetti&)main_app();} -const char* Variazione_Effetti::get_next_key() +void TVariazione_effetti::init_query_mode(TMask&) +{ + _msk->reset(F_TOTIMP); + _msk->reset(F_TOTIMPVAL); +} + +void TVariazione_effetti::init_insert_mode(TMask&) +{ + _msk->reset(F_TOTIMP); + _msk->reset(F_TOTIMPVAL); + 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() { TLocalisamfile& effetti=_rel->lfile(); long nprogtr=1L; - - if (!effetti.empty()) + if ( !effetti.empty() ) { effetti.zero(); effetti.setkey(1); effetti.last(); - if (effetti.good()) + if ( effetti.good() ) nprogtr+=effetti.get_long(EFF_NPROGTR); } return format("%d|%ld",F_NPROGTR,nprogtr); } -TSheet_field& Variazione_Effetti::obb_sheet() const +//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); + TSheet_field& o_sheet = (TSheet_field&)_msk->field(F_SHEET_EFF); return o_sheet; } -void Variazione_Effetti::obb_pack() +//Ritorna un riferimento allo sheet delle righe +TSheet_field& TVariazione_effetti::righe_sheet() const { - TArray& rows=obb_sheet().rows_array(); - int nr=rows.items(); - - for (int i=0;ifield(F_SHEET_RIGHE); + return r_sheet; } -void Variazione_Effetti::common_f(const TMask& m) +//Metodo che permette di scivere su file i dati inseriti nella maschera; +// comune a write e rewrite +void TVariazione_effetti::common_f(const TMask& m) { - long nprogtr=m.get_long(F_NPROGTR); - - _rel->lfile().zero(); + long nprogtr = m.get_long(F_NPROGTR); + m.autosave(*_rel); - // LF_CESS SAVER! - _rel->destroy_rows(); - obb_pack(); - TArray& rows=obb_sheet().rows_array(); - for (int i=0; iobbligato(i); + _effetto->head() = _rel->curr(); + + TSheet_field& shcess = cess_sheet(); + TSheet_field& shrighe = righe_sheet(); + + int items = shcess.items(); + _effetto->destroy_rows_c(); + int ii = 0; + for (int i = 0; i < items; i++) + { + TToken_string& row = shcess.row(i); + if ( row.items()!= 0 ) + { + TRectype& rec = _effetto->row_c(ii+1, TRUE); + row.restart(); + rec.zero(); + rec.put(CES_NPROGTR, nprogtr); + rec.put(CES_NRIGA, ii+1); + rec.put(CES_RAGSOC, row.get()); + rec.put(CES_LOCALITA, row.get()); + rec.put(CES_STATO, row.get_int()); + rec.put(CES_COM, row.get()); + ii++; + } + } + + items = shrighe.items(); + _effetto->destroy_rows_r(); + ii = 0; + for (i = 0; i < items; i++) + { + TToken_string& row = shrighe.row(i); + real imp_eff(row.get(1)); + if (imp_eff == 0.0) continue; row.restart(); + TRectype& rec = _effetto->row_r(ii+1, TRUE); rec.zero(); - rec.put(CES_NPROGTR,nprogtr); - rec.put(CES_NRIGA,i+1); - rec.put(CES_RAGSOC,row.get()); - rec.put(CES_LOCALITA,row.get()); - rec.put(CES_STATO,row.get_int()); - rec.put(CES_COM,row.get()); + rec.put(REFF_NPROGTR, nprogtr); + rec.put(REFF_NRIGATR, ii+1); + rec.put(REFF_IMPFATT, row.get()); + rec.put(REFF_IMPORTO, row.get()); + rec.put(REFF_IMPFATTVAL, row.get()); + rec.put(REFF_IMPORTOVAL, row.get()); + rec.put(REFF_ANNO, row.get_int()); + rec.put(REFF_NUMPART, row.get()); + rec.put(REFF_NRIGA, row.get_int()); + rec.put(REFF_NRATA, row.get_int()); + rec.put(REFF_NFATT, row.get()); + rec.put(REFF_DATAFATT, row.get()); + ii++; } + _effetto->renum(_effetto->numero()); } -int Variazione_Effetti::read(TMask& m) +int TVariazione_effetti::read(TMask& m) { m.autoload(*_rel); - // LF_CESS loader! - TToken_string riga(80); - obb_sheet().reset(); - for (int i=0; i<_rel->obbligati_items();i++) + int err = _rel->status(); + if (err == NOERR) { - TRectype& rec=_rel->obbligato(i); - riga.cut(0); - riga.add(rec.get(CES_RAGSOC)); - riga.add(rec.get(CES_LOCALITA)); - riga.add(rec.get(CES_STATO)); - riga.add(rec.get(CES_COM)); - obb_sheet().row(i)=riga; + err = _effetto->read(_rel->curr()); + if (err == NOERR) + { + TString16 codcom(3); + TToken_string riga(80); + + TSheet_field& shcess = cess_sheet(); + shcess.reset(); + TSheet_field& shrighe = righe_sheet(); + shrighe.reset(); + + int items = _effetto->rows_c(); + for (int i = 1; i <= items; i++) + { + const TRectype& rec = _effetto->row_c(i); + riga.cut(0); + 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); + _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(); + for (i = 1; i <= items; i++) + { + const TRectype& rec = _effetto->row_r(i); + riga.cut(0); + riga.add(rec.get(REFF_IMPFATT)); + riga.add(rec.get(REFF_IMPORTO)); + riga.add(rec.get(REFF_IMPFATTVAL)); + riga.add(rec.get(REFF_IMPORTOVAL)); + riga.add(rec.get(REFF_ANNO)); + riga.add(rec.get(REFF_NUMPART)); + riga.add(rec.get(REFF_NRIGA)); + riga.add(rec.get(REFF_NRATA)); + riga.add(rec.get(REFF_NFATT)); + riga.add(rec.get(REFF_DATAFATT)); + shrighe.row(i-1) = riga; + } + } } - return _rel->status(); + return err; } -int Variazione_Effetti::rewrite(const TMask& m) +int TVariazione_effetti::rewrite(const TMask& m) { common_f(m); - return _rel->rewrite(TRUE); + return _effetto->rewrite(); } -int Variazione_Effetti::write(const TMask& m) +int TVariazione_effetti::write(const TMask& m) { common_f(m); - return _rel->write(TRUE); + int err = _effetto->write(); + if (err == NOERR) + _rel->read(); // per posizionare correttamente la relazione + return err; +} + +bool TVariazione_effetti::remove() +{ + return _effetto->remove() == NOERR; } - -bool Variazione_Effetti::user_create() +bool TVariazione_effetti::user_create() { _msk = new TMask("ef0100a") ; - _rel = new TEffObb; - - _msk->set_handler(F_CODCF,codcf_handler); - _msk->set_handler(F_EFFCOMP,effcomp_handler); + _rel = new TRelation(LF_EFFETTI); + _reff = new TLocalisamfile(LF_REFFETTI); + _cess = new TLocalisamfile(LF_CESS); + _com = new TLocalisamfile(LF_COMUNI); + _effetto = new TEffetto; + _msk->set_handler(F_CODVAL, codval_handler); + _msk->set_handler(F_SHEET_RIGHE, handle_sheet); + righe_sheet().set_append(FALSE); + righe_sheet().set_notify(impeff_notify); return TRUE; } -bool Variazione_Effetti::user_destroy() +bool TVariazione_effetti::user_destroy() { delete _msk; delete _rel; + delete _effetto; + delete _reff; + delete _cess; + delete _com; return TRUE; } -bool Variazione_Effetti::codcf_handler(TMask_field& f, KEY k) +//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) { - long codcf = atol(f.get()), n = 0; - TString ragsoc(50); - TToken_string line; - TLocalisamfile clifo(LF_CLIFO); - TArray_sheet cli(-1,-1,59,20,"Clienti","Codice|Ragione sociale@50|Sospeso|Codice fiscale@18"); - - switch (k) + TMask& m = f.mask(); + const int mode = m.mode(); + if ( k==K_ENTER && (mode== MODE_INS || mode== MODE_MOD) ) + { + + TSheet_field& sf = (TSheet_field&)m.field(F_SHEET_RIGHE); + int items = sf.items(); + bool found=FALSE; + for (int i=0; i< items && !found; i++) + { + TToken_string& row=sf.row(i); + real imp_eff(row.get(1)); + if (imp_eff != 0.0) found=TRUE; + } + if (!found) + { + error_box("L'effetto deve contenere almeno una riga!"); + return FALSE; + } + } + return TRUE; +} + +//Permette il controllo sulla abilitazione dei campi collegati al codice +// valuta +bool TVariazione_effetti::codval_handler(TMask_field& f, KEY k) +{ + TMask &m = f.mask(); + TString val(f.get()); + if (f.to_check(k, TRUE)) { - case K_TAB: - if (f.focusdirty()) // When changing focus put customer's name - { - clifo.zero(); - clifo.setkey(1); - clifo.put(CLI_TIPOCF,"C"); - clifo.put(CLI_CODCF,codcf); - clifo.read(); - if (clifo.good()) - { - ragsoc=clifo.get(CLI_RAGSOC); - f.mask().set(F_CFRAGSOC,(const char*)ragsoc); - } else - return FALSE; - } - break; - case K_F8: // If F8 was pressed perform customer's search - clifo.setkey(1); - clifo.first(); - while (clifo.good() && clifo.get(CLI_TIPOCF)=="C") - { - line.cut(0); - if (codcf == clifo.get_long(CLI_CODCF)) n=cli.items(); - line.add(clifo.get(CLI_CODCF)); - line.add(clifo.get(CLI_RAGSOC)); - line.add(clifo.get(CLI_SOSPESO)); - line.add(clifo.get(CLI_COFI)); - cli.add(line); - clifo.next(); - } - cli.select(n); - if (cli.run()==K_ENTER) - { - line=cli.row(-1); - f.set(line.get(0)); - f.mask().set(F_CFRAGSOC,line.get(1)); - } - break; - default: - break; - } + const bool condition = (val == "LIT" || val.empty()); + m.enable(-1,!condition); + TSheet_field& sf = (TSheet_field&)m.field(F_SHEET_RIGHE); + if (condition){ + m.reset(-1); + m.reset(F_TOTIMPVAL); + int items = sf.items(); + for (int i= 0; i < items; i++){ + TToken_string& row = sf.row(i); + row.add(" ", 2); + row.add(" ", 3); + } + } + sf.enable_column(F_IMPFATTVAL, !condition); + sf.enable_column(F_IMPEFFVAL, !condition); + sf.force_update(); + } return TRUE; } -bool Variazione_Effetti::effcomp_handler(TMask_field& f, KEY k) -{ - if (!f.mask().get(F_NRATA).empty()) - f.set("X"); +void TVariazione_effetti::calcola_totali() +{ + TMask* m = app()._msk; + TSheet_field& sf = (TSheet_field&)m->field(F_SHEET_RIGHE); + int items = sf.items(); + real imp, impval, impeff, impeffval; + for (int i = 0; i < items; i++) + { + TToken_string& row = sf.row(i); + imp = row.get(1); + impeff += imp; + impval = row.get(3); + impeffval += impval; + } + m->set(F_TOTIMP, impeff); + m->set(F_TOTIMPVAL, impeffval); +} + +bool TVariazione_effetti::impeff_notify(TSheet_field& s, int r, KEY key) +{ + if (s.to_check(key, TRUE)) calcola_totali(); + if (key == K_DEL && s.items()==1) + { + error_box("IMPOSSIBILE CANCELLARE: L'effetto deve contenere almeno una riga!"); + return FALSE; + } return TRUE; } int ef0100(int argc, char* argv[]) { - Variazione_Effetti a ; - a.run(argc, argv, "Gestione effetti"); + TVariazione_effetti a ; + a.run(argc, argv, "Gestione Effetti"); return 0; } diff --git a/ef/ef0100.h b/ef/ef0100.h index 281427645..9a15039f9 100755 --- a/ef/ef0100.h +++ b/ef/ef0100.h @@ -3,44 +3,53 @@ // campi maschera ef0100a.msk -#define F_NPROGTR 101 -#define F_CODCF 102 +#define F_NPROGTR 101 +#define F_CODCF 102 #define F_CFRAGSOC 103 -#define F_TIPOPAG 104 -#define F_DATASCAD 105 -#define F_IMPORTO 106 -#define F_NFATT 107 -#define F_DATAFATT 108 -#define F_IMPFATT 109 -#define F_NRATA 110 -#define F_ULTRATA 111 -#define F_CODABI 112 -#define F_CODCAB 113 -#define F_DATAEMISS 114 -#define F_NUMEMISS 115 -#define F_IMPBOLLO 116 -#define F_EFFSTAMP 117 -#define F_SHEET_EFF 118 -#define F_TIPODIST 119 -#define F_DATADIST 121 -#define F_NDIST 122 -#define F_NRIGADIST 123 +#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_CODABIP 125 -#define F_CODCABP 126 -#define F_EFFCONT 127 -#define F_CODFOR 128 -#define F_ULTCLASS 129 -#define F_DATARIBA 130 -#define F_DISRIBAEST 131 -#define F_EFFCOMP 132 - - +#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_LOCALITA 102 #define F_STATO 103 -#define F_COM 104 +#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 + #endif // __EF0100_H diff --git a/ef/ef0100a.uml b/ef/ef0100a.uml index 6cc5567bc..bb8bb4a7e 100755 --- a/ef/ef0100a.uml +++ b/ef/ef0100a.uml @@ -6,108 +6,77 @@ TOOLBAR "" 0 20 0 2 ENDPAGE -PAGE "Gestione Effetti" 0 -1 0 19 +PAGE "Gestione Effetti 1/3" 0 -1 0 19 -GROUPBOX DLG_NULL 78 4 +GROUPBOX DLG_NULL 78 5 BEGIN - PROMPT 1 0 "Dati effetto" + PROMPT 1 1 "" END NUMBER F_NPROGTR 7 BEGIN - PROMPT 2 1 "Numero " + PROMPT 2 2 "Numero " FIELD LF_EFFETTI->NPROGTR FLAGS "R" KEY 1 USE LF_EFFETTI KEY 1 JOIN LF_CLIFO TO LF_EFFETTI KEY 1 INTO CODCF=CODCF TIPOCF="C" INPUT NPROGTR F_NPROGTR - DISPLAY "Nr. Progressivo" NPROGTR + DISPLAY "Nr. progressivo" NPROGTR DISPLAY "Codice cliente" CODCF DISPLAY "Data scadenza" DATASCAD - DISPLAY "Data fattura" DATAFATT - DISPLAY "Numero fattura" NFATT - DISPLAY "Importo fattura @R" IMPFATT - DISPLAY "Importo effetto @R" IMPORTO - DISPLAY "Tipo" TIPOPAG - DISPLAY "Nr distinta" NDIST DISPLAY "Tipo distinta" TIPODIST + DISPLAY "Nr. distinta" NDIST OUTPUT F_NPROGTR NPROGTR OUTPUT F_CODCF CODCF OUTPUT F_DATASCAD DATASCAD + OUTPUT F_TIPOPAG TIPOPAG OUTPUT F_CFRAGSOC LF_CLIFO->RAGSOC CHECKTYPE REQUIRED - HELP "Inserire il numero progressivo dell'effetto" END NUMBER F_CODCF 6 BEGIN - PROMPT 2 2 "Cod. cliente " + PROMPT 2 3 "Cod. cliente " FIELD LF_EFFETTI->CODCF - KEY 2 - USE LF_EFFETTI KEY 2 - JOIN LF_CLIFO TO LF_EFFETTI KEY 1 INTO CODCF=CODCF TIPOCF="C" + USE LF_CLIFO + INPUT TIPOCF "C" INPUT CODCF F_CODCF - INPUT NPROGTR F_NPROGTR + DISPLAY "Ragione sociale@60" RAGSOC + DISPLAY "Codice" CODCF +/* DISPLAY "Codice cliente" CODCF DISPLAY "Nr. progressivo" NPROGTR DISPLAY "Data scadenza" DATASCAD - DISPLAY "Data fattura" DATAFATT - DISPLAY "Numero fattura" NFATT - DISPLAY "Importo fattura @R" IMPFATT - DISPLAY "Importo effetto @R" IMPORTO - DISPLAY "Tipo" TIPOPAG - DISPLAY "Nr distinta" NDIST DISPLAY "Tipo distinta" TIPODIST + DISPLAY "Nr. distinta" NDIST COPY OUTPUT F_NPROGTR - CHECKTYPE REQUIRED - HELP "Inserire il codice del cliente. F8 ricerca cliente." -END - -STRING F_CFRAGSOC 50 -BEGIN - PROMPT 25 2 "" - USE LF_CLIFO KEY 2 - INPUT TIPOCF "C" - INPUT RAGSOC F_CFRAGSOC - DISPLAY "Ragione sociale@50" RAGSOC - DISPLAY "Codice" CODCF +*/ OUTPUT F_CODCF CODCF OUTPUT F_CFRAGSOC RAGSOC CHECKTYPE REQUIRED END -LIST F_TIPOPAG 18 +STRING F_CFRAGSOC 50 BEGIN - PROMPT 2 4 "Tipo effetto " - FIELD LF_EFFETTI->TIPOPAG - ITEM "2|Tratta" - MESSAGE DISABLE,F_CODFOR|RESET,F_CODFOR - ITEM "3|Ricevuta bancaria" - MESSAGE DISABLE,F_CODFOR|UNDO,F_CODFOR - ITEM "4|Cessione" - MESSAGE ENABLE,F_CODFOR|UNDO,F_CODFOR - ITEM "5|Paghero'" - MESSAGE DISABLE,F_CODFOR|UNDO,F_CODFOR - HELP "Inserire il tipo dell'effetto" -END - -STRING F_ULTCLASS 1 -BEGIN - PROMPT 42 4 "Ulteriore classificazione " - FIELD LF_EFFETTI->ULTCLASS - USE %CLR - INPUT CODTAB[1,1] F_TIPOPAG SELECT - INPUT CODTAB[2,2] F_ULTCLASS - DISPLAY "Classificazione" CODTAB[2,2] - DISPLAY "Descrizione@50" S0 - OUTPUT F_ULTCLASS CODTAB[2,2] - HELP "Inserire l'ulteriore classificazione dell'effetto" + PROMPT 25 3 "" + USE LF_CLIFO KEY 2 + //JOIN LF_EFFETTI TO LF_CLIFO KEY 2 INTO CODCF==CODCF + INPUT TIPOCF "C" + INPUT RAGSOC F_CFRAGSOC + DISPLAY "Ragione sociale@60" RAGSOC + DISPLAY "Codice" CODCF + /*DISPLAY "Nr. progressivo" LF_EFFETTI->NPROGTR + DISPLAY "Data scadenza" LF_EFFETTI->DATASCAD + DISPLAY "Tipo distinta" LF_EFFETTI->TIPODIST + DISPLAY "Nr. distinta" LF_EFFETTI->NDIST*/ + COPY OUTPUT F_CODCF + CHECKTYPE REQUIRED END DATE F_DATASCAD BEGIN - PROMPT 2 5 "Data scadenza " + PROMPT 2 4 "Data scadenza " FIELD LF_EFFETTI->DATASCAD KEY 3 USE LF_EFFETTI KEY 3 @@ -115,281 +84,308 @@ BEGIN INPUT DATASCAD F_DATASCAD INPUT NPROGTR F_NPROGTR DISPLAY "Data scadenza" DATASCAD - DISPLAY "Nr progressivo" NPROGTR + DISPLAY "Nr. progressivo" NPROGTR DISPLAY "Codice cliente" CODCF - DISPLAY "Data fattura" DATAFATT - DISPLAY "Numero fattura" NFATT - DISPLAY "Importo fattura @R" IMPFATT - DISPLAY "Importo effetto @R" IMPORTO - DISPLAY "Tipo" TIPOPAG - DISPLAY "Nr distinta" NDIST + DISPLAY "Tipo pag." TIPOPAG + DISPLAY "Nr. distinta" NDIST DISPLAY "Tipo distinta" TIPODIST COPY OUTPUT F_NPROGTR CHECKTYPE REQUIRED - HELP "Inserire la data di scadenza dell'effetto" END -NUMBER F_IMPORTO 15 +LIST F_TIPOPAG 24 BEGIN - PROMPT 42 5 "Importo effetto " - FIELD LF_EFFETTI->IMPORTO + PROMPT 2 6 "Tipo pagamento " + FIELD LF_EFFETTI->TIPOPAG + ITEM "2|Tratta" + ITEM "3|Ricevuta Bancaria" + ITEM "4|Cessione" + ITEM "5|Paghero'" + ITEM "6|Lettera di credito" + ITEM "7|Tratta accettata" + ITEM "8|Rapporti interb. diretti" + ITEM "9|Bonifici" +END + +STRING F_ULTCLASS 1 +BEGIN + PROMPT 46 6 "Ulteriore classificazione " + FIELD LF_EFFETTI->ULTCLASS + USE %CLR + INPUT CODTAB[1,1] F_TIPOPAG SELECT + INPUT CODTAB[2,2] F_ULTCLASS + DISPLAY "Classificazione" CODTAB[2,2] + DISPLAY "Descrizione@50" S0 + OUTPUT F_ULTCLASS CODTAB[2,2] +END + +STRING F_CODVAL 3 +BEGIN + PROMPT 2 7 "Codice valuta " + FIELD LF_EFFETTI->CODVAL + FLAGS "UZ" + USE %VAL + INPUT CODTAB F_CODVAL + DISPLAY "Codice" CODTAB + DISPLAY "Nome@50" S0 + OUTPUT F_CODVAL CODTAB + CHECKTYPE NORMAL +END + +DATA F_DATACAM +BEGIN + PROMPT 46 7 "Data cambio " + FIELD LF_EFFETTI->DATACAMBIO FLAGS "R" - PICTURE "." - HELP "Inserire l'importo dell'effetto" - VALIDATE NOT_EMPTY_FUNC - WARNING "Manca l'importo dell'effetto" + USE CAM + INPUT CODTAB[1,3] F_CODVAL SELECT + INPUT CODTAB[4,11] F_DATACAM + DISPLAY "Valuta@9" CODTAB[1,3] + DISPLAY "Data@12" D0 + DISPLAY "Cambio@19" R10 + OUTPUT F_DATACAM D0 + OUTPUT F_CAMBIO R10 + CHECKTYPE SEARCH + GROUP 1 END -STRING F_NFATT 7 -BEGIN - PROMPT 2 7 "Nr. fattura " - FIELD LF_EFFETTI->NFATT - VALIDATE NOT_EMPTY_FUNC - HELP "Inserire il numero della fattura" - WARNING "Manca il numero della fattura" -END - -DATE F_DATAFATT -BEGIN - PROMPT 2 8 "Data fattura " - FIELD LF_EFFETTI->DATAFATT - VALIDATE NOT_EMPTY_FUNC - HELP "Inserire la data della fattura" - WARNING "Manca la data della fattura" -END - -NUMBER F_IMPFATT 15 -BEGIN - PROMPT 42 8 "Importo fattura " - FIELD LF_EFFETTI->IMPFATT - FLAGS "R" - PICTURE "." - NUM_EXPR {#THIS_FIELD>=#F_IMPORTO} - HELP "Inserire l'importo della fattura" - WARNING "L'importo dell'effetto deve essere contenuto nell'importo di fattura" -END - -NUMBER F_NRATA 3 -BEGIN - PROMPT 2 9 "Nr. rata " - FIELD LF_EFFETTI->NRATA - HELP "Inserire il numero della rata" +NUMBER F_CAMBIO 15 5 +BEGIN + PROMPT 2 8 "Cambio " + FIELD LF_EFFETTI->CAMBIO + FLAGS "RU" + PICTURE ".5" + CHECKTYPE REQUIRED + WARNING "E' stata specificata una valuta senza il cambio relativo" + GROUP 1 END BOOLEAN F_ULTRATA BEGIN - PROMPT 42 9 "Ultima rata" + PROMPT 46 8 "Ultima rata" FIELD LF_EFFETTI->ULTRATA - HELP "Inserire se e' l'ultima rata relativa alla fattura" END -GROUPBOX DLG_NULL 38 4 +SPREADSHEET F_SHEET_RIGHE 76 7 BEGIN - PROMPT 1 10 "Banca d'appoggio" + PROMPT 2 10 "RIGHE EFFETTO" + ITEM "Importo fatt.@18" + ITEM "Importo effet.@18" + ITEM "Imp.fatt.val.@18" + ITEM "Imp.effet.val.@18" + ITEM "Anno partita" + ITEM "Nr. partita" + ITEM "Nr. riga" + ITEM "Nr. rata" + ITEM "Nr. fattura" + ITEM "Data fattura" +END + +NUMBER F_TOTIMP 18 2 +BEGIN + PROMPT 2 18 "Totale importi " + FLAG "D" +END + +NUMBER F_TOTIMPVAL 18 3 +BEGIN + PROMPT 2 19 "Totale importi in valuta " + FLAG "D" + //GROUP 1 +END + +ENDPAGE + +PAGE "Gestione Effetti 2/3" 0 -1 0 19 + +GROUPBOX DLG_NULL 38 4 +BEGIN + PROMPT 1 1 "BANCA D'APPOGGIO" END NUMBER F_CODABI 5 BEGIN - PROMPT 2 11 "Codice ABI " + PROMPT 2 2 "Codice ABI " FIELD LF_EFFETTI->CODABI FLAGS "RZ" - USE %BAN KEY 1 SELECT CODTAB ?="?????" + USE %BAN KEY 1 SELECT CODTAB ?= "?????" INPUT CODTAB F_CODABI DISPLAY "Codice ABI" CODTAB[1,5] - DISPLAY "Codice CAB" CODTAB[6,10] DISPLAY "Denominazione@50" S0 OUTPUT F_CODABI CODTAB[1,5] OUTPUT F_CODCAB CODTAB[6,10] CHECKTYPE REQUIRED - HELP "Inserire il codice ABI della banca d'appoggio" + WARNING "Codice ABI assente" END NUMBER F_CODCAB 5 BEGIN - PROMPT 2 12 "Codice CAB " + PROMPT 2 3 "Codice CAB " FIELD LF_EFFETTI->CODCAB FLAGS "RZ" - USE %BAN + USE %BAN KEY 1 SELECT CODTAB ?= "??????????" INPUT CODTAB[1,5] F_CODABI INPUT CODTAB[6,10] F_CODCAB - COPY DISPLAY F_CODABI + DISPLAY "Codice ABI" CODTAB[1,5] + DISPLAY "Codice CAB" CODTAB[6,10] + DISPLAY "Denominazione@50" S0 OUTPUT F_CODABI CODTAB[1,5] OUTPUT F_CODCAB CODTAB[6,10] CHECKTYPE REQUIRED - HELP "Inserire il codice CAB della banca d'appoggio" + VALIDATE REQIF_FUNC 1 F_CODCABP + WARNING "Banca assente" END GROUPBOX DLG_NULL 38 4 BEGIN - PROMPT 41 10 "Banca di presentazione" + PROMPT 41 1 "BANCA DI PRESENTAZIONE" END NUMBER F_CODABIP 5 BEGIN - PROMPT 42 11 "Codice ABI " + PROMPT 42 2 "Codice ABI " FIELD LF_EFFETTI->CODABIP FLAGS "RZ" - USE %BAN KEY 1 SELECT CODTAB ?="?????" + USE %BAN KEY 1 SELECT CODTAB ?= "?????" INPUT CODTAB F_CODABIP DISPLAY "Codice ABI" CODTAB[1,5] - DISPLAY "Codice CAB" CODTAB[6,10] DISPLAY "Denominazione@50" S0 OUTPUT F_CODABIP CODTAB[1,5] OUTPUT F_CODCABP CODTAB[6,10] CHECKTYPE NORMAL - HELP "Inserire il codice ABI della banca di presentazione effetti" + WARNING "Codice ABI assente" END NUMBER F_CODCABP 5 BEGIN - PROMPT 42 12 "Codice CAB " + PROMPT 42 3 "Codice CAB " FIELD LF_EFFETTI->CODCABP FLAGS "RZ" - USE %BAN + USE %BAN KEY 1 SELECT CODTAB ?= "??????????" INPUT CODTAB[1,5] F_CODABIP INPUT CODTAB[6,10] F_CODCABP - COPY DISPLAY F_CODABIP + DISPLAY "Codice ABI" CODTAB[1,5] + DISPLAY "Codice CAB" CODTAB[6,10] + DISPLAY "Denominazione@50" S0 OUTPUT F_CODABIP CODTAB[1,5] OUTPUT F_CODCABP CODTAB[6,10] - CHECKTYPE NORMAL - HELP "Inserire il codice CAB della banca di presentazione effetti" + CHECKTYPE NORMAL + VALIDATE REQIF_FUNC 1 F_CODCABP + WARNING "Banca assente" END + GROUPBOX DLG_NULL 78 4 BEGIN - PROMPT 1 14 "Dati stampa" + PROMPT 1 5 "" END DATE F_DATAEMISS BEGIN - PROMPT 2 15 "Data di emissione " + PROMPT 2 6 "Data di emissione " FIELD LF_EFFETTI->DATAEMISS END NUMBER F_NUMEMISS 8 BEGIN - PROMPT 48 15 "Nr. di emissione " + PROMPT 42 6 "Nr. di emissione " FIELD LF_EFFETTI->NUMEMISS END -NUMBER F_IMPBOLLO 15 -BEGIN - PROMPT 2 16 "Importo bollo " - FIELD LF_EFFETTI->IMPBOLLO - FLAGS "R" - PICTURE "." -END - BOOLEAN F_EFFSTAMP BEGIN - PROMPT 48 16 "Effetto stampato" + PROMPT 2 7 "Effetto stampato" FIELD LF_EFFETTI->EFFSTAMP END -ENDPAGE - -PAGE "Pag. 2" 0 -1 0 19 - -GROUPBOX DLG_NULL 78 4 +GROUPBOX DLG_NULL 78 5 BEGIN - PROMPT 1 0 "Dati distinta" + PROMPT 1 9 "" END LIST F_TIPODIST 15 BEGIN - PROMPT 2 1 "Tipo distinta " + PROMPT 2 10 "Tipo distinta " FIELD LF_EFFETTI->TIPODIST ITEM " |** Nessuno **" MESSAGE DISABLE,2@|RESET,2@ ITEM "I|All'incasso" - MESSAGE ENABLE,2@|UNDO,2@ + MESSAGE ENABLE,2@ ITEM "B|Salvo buon fine" - MESSAGE ENABLE,2@|UNDO,2@ + MESSAGE ENABLE,2@ ITEM "S|Allo sconto" - MESSAGE ENABLE,2@|UNDO,2@ - HELP "Inserire il tipo di distinta" + MESSAGE ENABLE,2@ END NUMBER F_NDIST 8 BEGIN - PROMPT 53 1 "Nr Distinta " + PROMPT 52 10 "Nr. distinta " FIELD LF_EFFETTI->NDIST FLAGS "D" VALIDATE NOT_EMPTY_FUNC - HELP "Inserire il numero della distinta" WARNING "Numero di distinta obbligatorio se si e' inserito il tipo di distinta" GROUP 2 END DATE F_DATADIST BEGIN - PROMPT 2 2 "Data distinta " + PROMPT 2 11 "Data distinta " FIELD LF_EFFETTI->DATADIST FLAGS "D" - HELP "Inserire la data della distinta" GROUP 2 END BOOLEAN F_DISTSTAM BEGIN - PROMPT 36 2 "Stampata" + PROMPT 2 12 "Distinta stampata" FIELD LF_EFFETTI->DISTSTAM FLAGS "D" - HELP "Inserire se la distinta e' stato stampata" GROUP 2 END NUMBER F_NRIGADIST 6 BEGIN - PROMPT 53 2 "Nr di riga " + PROMPT 52 12 "Nr. di riga " FIELD LF_EFFETTI->NRIGADIST FLAGS "D" - HELP "Inserire il numero di riga della distinta" GROUP 2 END GROUPBOX DLG_NULL 78 3 BEGIN - PROMPT 1 4 "Dati Ri.Ba." + PROMPT 1 14 "" END DATE F_DATARIBA BEGIN - PROMPT 2 5 "Data Ri.Ba. " + PROMPT 2 15 "Data Ri.Ba. " FIELD LF_EFFETTI->DATARIBA - HELP "Inserire la data della Ricevuta Bancaria" END BOOLEAN F_DISRIBAEST BEGIN - PROMPT 49 5 "Distinta Ri.Ba. estratta" + PROMPT 52 15 "Distinta Ri.Ba. estratta" FIELD LF_EFFETTI->DISRIBAEST END -NUMBER F_CODFOR 6 -BEGIN - PROMPT 2 7 "Cod. fornitore " - FIELD LF_EFFETTI->CODFOR - USE LF_CLIFO KEY 1 - INPUT TIPOCF "F" - INPUT CODCF F_CODFOR - DISPLAY "Codice" CODCF - DISPLAY "Ragione Sociale@50" RAGSOC - DISPLAY "Sospeso" SOSPESO - OUTPUT F_CODFOR CODCF - CHECKTYPE NORMAL - HELP "Inserire il codice del fornitore relativo alla cessione" -END - BOOLEAN F_EFFCONT BEGIN - PROMPT 49 7 "Effetto contabilizzato" + PROMPT 2 17 "Effetto contabilizzato" FIELD LF_EFFETTI->EFFCONT - HELP "Inserire se l'effetto e' contabilizzato" END -SPREADSHEET F_SHEET_EFF 76 4 +BOOLEAN F_EFFCOMP BEGIN - PROMPT 2 10 "Obbligati principali" + PROMPT 52 17 "Effetto completato" + FIELD LF_EFFETTI->EFFCOMP +END + +ENDPAGE + +PAGE "Gestione Effetti 3/3" 0 -1 0 19 + +SPREADSHEET F_SHEET_EFF 76 8 +BEGIN + PROMPT 2 1 "OBBLIGATI PRINCIPALI" ITEM "Ragione Sociale@50" ITEM "Localita'@35" ITEM "Stato" @@ -397,14 +393,10 @@ BEGIN ITEM "Comune@50" END -BOOLEAN F_EFFCOMP -BEGIN - PROMPT 2 15 "Effetto compilato" - FIELD LF_EFFETTI->EFFCOMP -END - ENDPAGE ENDMASK +#include "ef0100c.uml" #include "ef0100b.uml" + diff --git a/ef/ef0100b.uml b/ef/ef0100b.uml index 76f5c5501..3c5ae0d63 100755 --- a/ef/ef0100b.uml +++ b/ef/ef0100b.uml @@ -4,76 +4,76 @@ PAGE "Obbligati principali" -1 -1 76 12 STRING F_RAGSOC 50 BEGIN - PROMPT 2 2 "Rag. sociale " - HELP "Inserire la ragione sociale dell'obbligato" + PROMPT 2 2 "Rag. sociale " + HELP "Inserire la ragione sociale dell'obbligato" END STRING F_LOCALITA 35 BEGIN - PROMPT 2 4 "Localita " - HELP "Inserire la localita dell'obbligato" + PROMPT 2 4 "Localita' " + HELP "Inserire la localita dell'obbligato" END NUMBER F_STATO 3 BEGIN - PROMPT 60 4 "Stato " - FLAGS "RZ" - USE %STA - INPUT CODTAB F_STATO - DISPLAY "Codice" CODTAB - DISPLAY "Stato@50" S0 - OUTPUT F_STATO CODTAB - CHECKTYPE NORMAL - WARNING "Stato assente" - HELP "Inserire lo stato in cui risiede l'obbligato" + PROMPT 60 4 "Stato " + FLAGS "RZ" + USE %STA + INPUT CODTAB F_STATO + DISPLAY "Codice" CODTAB + DISPLAY "Stato@50" S0 + OUTPUT F_STATO CODTAB + CHECKTYPE NORMAL + WARNING "Stato assente" + HELP "Inserire lo stato in cui risiede l'obbligato" END STRING F_COM 4 BEGIN - PROMPT 2 6 "Comune " - FLAGS "U" - USE LF_COMUNI - INPUT STATO F_STATO - INPUT COM F_COM - DISPLAY "Stato" STATO - DISPLAY "Codice" COM - DISPLAY "Comune@50" DENCOM - OUTPUT F_STATO STATO - OUTPUT F_COM COM - OUTPUT F_DENCOM DENCOM - CHECKTYPE NORMAL - WARNING "Comune assente" - HELP "Inserire il comune in cui risiede l'obbligato" - ADD MASK ba4100a + PROMPT 2 6 "Comune " + FLAGS "U" + USE LF_COMUNI + INPUT STATO F_STATO + INPUT COM F_COM + DISPLAY "Stato" STATO + DISPLAY "Codice" COM + DISPLAY "Comune@50" DENCOM + OUTPUT F_STATO STATO + OUTPUT F_COM COM + OUTPUT F_DENCOM DENCOM + CHECKTYPE NORMAL + WARNING "Comune assente" + HELP "Inserire il comune in cui risiede l'obbligato" + ADD MASK ba4100a END STRING F_DENCOM 50 BEGIN - PROMPT 24 6 "" - USE LF_COMUNI KEY 2 - INPUT DENCOM F_DENCOM - DISPLAY "Comune @50" DENCOM - DISPLAY "Stato" STATO - DISPLAY "Codice" COM - COPY OUTPUT F_COM - CHECKTYPE NORMAL - ADD MASK ba4100a + PROMPT 24 6 "" + USE LF_COMUNI KEY 2 + INPUT DENCOM F_DENCOM + DISPLAY "Comune @50" DENCOM + DISPLAY "Stato" STATO + DISPLAY "Codice" COM + COPY OUTPUT F_COM + CHECKTYPE NORMAL + ADD MASK ba4100a END BUTTON DLG_OK 9 2 BEGIN - PROMPT -13 -1 "" + PROMPT -13 -1 "" END BUTTON DLG_CANCEL 9 2 BEGIN - PROMPT -23 -1 "" + PROMPT -23 -1 "" END BUTTON DLG_DELREC 9 2 BEGIN - PROMPT -33 -1 "Elimina" - MESSAGE EXIT, K_DEL + PROMPT -33 -1 "Elimina" + MESSAGE EXIT, K_DEL END ENDPAGE diff --git a/ef/ef0101.cpp b/ef/ef0101.cpp index 4af28fce2..6d72cdc0d 100755 --- a/ef/ef0101.cpp +++ b/ef/ef0101.cpp @@ -1,121 +1,186 @@ -#include "effetti.h" +#include "effetti.h" +#include "reffetti.h" #include "cession.h" #include "ef0101.h" ///////////////////////////////////////////////////////////// - - -TEffObb::TEffObb():TRelation(LF_EFFETTI), _oldobbligati(0) +//////// Riga Effetto +///////////////////////////////////////////////////////////// +TRiga_effetto::TRiga_effetto(TEffetto* eff) + : TRectype(LF_REFFETTI), _eff(eff) { - add(LF_CESS,"NPROGTR=NPROGTR"); } -void TEffObb::destroy_rows() +TRiga_effetto::TRiga_effetto(const TRiga_effetto& rec, TEffetto* eff) + : TRectype(rec), _eff(eff) { - _obbligati.destroy(); } -TRectype& TEffObb::obbligato(int i) -{ - TRectype *r=(TRectype*)_obbligati.objptr(i); +///////////////////////////////////////////////////////////// +////////// Effetto +///////////////////////////////////////////////////////////// +TEffetto::TEffetto() + : TRectype(LF_EFFETTI), _righe(LF_REFFETTI, "NRIGATR"), _cess(LF_CESS, "NRIGA") +{ +} - if (r == NULL) +TEffetto::TEffetto(TRectype& rec) + : TRectype(LF_EFFETTI), _righe(LF_REFFETTI, "NRIGATR"), _cess(LF_CESS, "NRIGA") +{ + read(rec); +} + +void TEffetto::set_key(TRectype& rec, long numeff) const +{ + CHECKD(numeff >= 0, "Numero effetto non valido ", numeff); + rec.put("NPROGTR",numeff); +} + +void TEffetto::set_key4(TRectype& rec,char tipodist, long ndist, long nrigadist) +{ + CHECK(tipodist == 'I' || tipodist == 'S' || tipodist == 'B', "Tipo distinta"); + CHECKD(ndist >= 0, "Numero distinta non valido ", ndist); + CHECKD(nrigadist >= 0, "Numero riga distinta non valido ", nrigadist); + + rec.put("TIPODIST", tipodist); + rec.put("NDIST", ndist); + rec.put("NRIGADIST", nrigadist); +} + +long TEffetto::get_next_key(const long codcf) const +{ + static long n = 0; + if (n == 0) { - r = new TRectype(LF_CESS); - _obbligati.add(r,i); - } - return *r; + TLocalisamfile eff(LF_EFFETTI); + TRectype& curr = eff.curr(); + set_key(curr, 9999999L); + + const int err = eff.read(_isgreat); + + if (err != _isemptyfile) + { + if (err == NOERR) + eff.prev(); + if (curr.get_long("CODCF")==codcf) + n = curr.get_long("NPROGTR"); + } + } + n++; + return n; } -int TEffObb::read_obbligati() +long TEffetto::renum(long numeff) { - const TLocalisamfile& robb = lfile(LF_CESS); + if (numeff <= 0) + { + long codcf = codicec(); + numeff = get_next_key(codcf); + } + char num[7]; sprintf(num, "%ld", numeff); + renum_key("NPROGTR", num); // aggiorna testata + _righe.renum_key("NPROGTR", num); // aggiorna righe ok + _cess.renum_key("NPROGTR", num); // aggiorna cessionari ok + return numeff; +} - position_rels(); - destroy_rows(); - for (bool ok=is_first_match(LF_CESS);ok;ok=next_match(LF_CESS)) +int TEffetto::read(const TRectype& rec) +{ + head() = rec; + TRectype *k_reff = new TRectype(LF_REFFETTI), *k_cess= new TRectype(LF_CESS); + const long nu = numero(); + CHECK(nu > 0, "Numero effetto nullo."); + set_key(*k_reff, nu); + set_key(*k_cess, nu); + + TLocalisamfile eff(LF_EFFETTI); + int err = TRectype::read(eff); + if (err == NOERR) { - const int nriga=robb.get_int(CES_NRIGA) -1; - obbligato(nriga)=robb.curr(); + _righe.read(k_reff); + _cess.read(k_cess); + } + else + { + head() = rec; + destroy_rows_r(); + destroy_rows_c(); + _cess.set_key(k_cess); + _righe.set_key(k_reff); } - _oldobbligati=obbligati_items(); - return NOERR; -} - -int TEffObb::read(TIsamop op, TReclock lockop, TDate& atdate) -{ - int err=file().read(op,lockop,atdate); - if (err==NOERR) read_obbligati(); return err; } -int TEffObb::write_rec(bool re, const TRectype& rec, TLocalisamfile& f) -{ - if (re) - { - const bool scrivi= (f.rewrite(rec)!=NOERR); - if (scrivi) f.write(rec); - } else - f.write(rec); - return f.status(); +int TEffetto::read(char tipodist, long ndist, long nrigadist) +{ + TRectype rec(LF_EFFETTI); + set_key4(rec, tipodist,ndist, nrigadist); + return read(rec); } -int TEffObb::cancella(TLocalisamfile& f, int da, int a) -{ - const long nprogtr=lfile().get_long(EFF_NPROGTR); +int TEffetto::write(bool force) +{ + const bool nuovo = numero() <= 0; // E' nuovo di zecca! + if (nuovo && force) // quindi ... + force = FALSE; // ... non fare la rewrite - for (int i=da; i<=a;i++) + TLocalisamfile eff(LF_EFFETTI); + int err = NOERR; + if (force) { - f.zero(); - f.put(CES_NPROGTR,nprogtr); - f.put(CES_NRIGA,i); - if (f.read(_isequal,_lock)==NOERR) - f.remove(); + if ((err=_righe.write(force)) == NOERR) err = _cess.write(force); + if (err == NOERR) + { + err = TRectype::rewrite(eff); + if (err != NOERR) + err = TRectype::write(eff); + } + } + else + { + if (nuovo) + { + TEffetto& myself = *(TEffetto*)this; + if (numero() <= 0) + myself.renum(); + do + { + err = TRectype::write(eff); + if (err == _isreinsert) + myself.renum(); + } while (err == _isreinsert); + } + else + { + err = TRectype::write(eff); + if (err != NOERR) + err = TRectype::rewrite(eff); + } + if (err == NOERR) + if ((err=_righe.write(force)) == NOERR) err= _cess.write(force); } - return f.status(); + return err; } -int TEffObb::registra(bool re, bool force) -{ - TLocalisamfile& c=lfile(LF_EFFETTI); - int err=write_rec(re,c.curr(),c); - if (err!=NOERR) return err; - - TLocalisamfile& robb=lfile(LF_CESS); - const long nprogtr=c.get_long(CES_NPROGTR); - - for (int i=0; i #endif +class TEffetto; +///////////////////////////////////////////////// +// classe per gestire le righe di un effetto //////////////////////////////////////////////// - -class TEffObb:public TRelation +class TRiga_effetto : public TRectype { - // @DPRIV - TArray _obbligati; - int _oldobbligati; - // @END + TEffetto * _eff; protected: - // @FPROT - int write_rec(bool re, const TRectype& r, TLocalisamfile& f); - int cancella(TLocalisamfile& f, int da, int a); - int registra(bool re, bool force); - int read_obbligati(); - // @END -public: - virtual int next(TReclock lockop=_nolock) {return (lfile().next(lockop) || read_obbligati());} - virtual int prev(TReclock lockop=_nolock) {return (lfile().prev(lockop) || read_obbligati());} - virtual int first(TReclock lockop=_nolock) {return (lfile().first(lockop) || read_obbligati());} - virtual int last(TReclock lockop=_nolock) {return (lfile().last(lockop) || read_obbligati());} - virtual int skip(TReclock lockop=_nolock) {return (lfile().skip(lockop) || read_obbligati());} - virtual int read(TIsamop = _isgteq, TReclock lockop = _nolock, TDate& atdate = (TDate&) botime); - virtual int write(bool force=TRUE, TDate& atdate = (TDate&) botime); - virtual int rewrite(bool force=TRUE, TDate& atdate = (TDate&) botime); - virtual int remove(TDate& atdate = (TDate&) botime); - - TRectype& obbligato(int i); - int obbligati_items() const {return _obbligati.items();} - void destroy_rows(); - - TEffObb(); - virtual ~TEffObb() {} + TObject* dup() const // duplica l'oggetto corrente + { return new TRiga_effetto(*this); } +public: + int numeror() const // restituisce il numero della riga + { return get_int("NRIGATR");} + void set_numeror(int numero) // setta il valore del numero di riga con quello passato + { put("NRIGATR", numero);} + void set_eff(TEffetto * eff) // setta l'effetto con quello passato + { _eff = eff; } + const TEffetto & eff() const + { CHECK(_eff, "Effetto nullo"); return *_eff;} + TRiga_effetto(TEffetto* eff); + TRiga_effetto(const TRiga_effetto& rec, TEffetto* eff); + virtual ~TRiga_effetto() {} +}; + +///////////////////////////////////////////////// +// classe per gestire gli effetti +//////////////////////////////////////////////// +class TEffetto:public TRectype +{ + TRecord_array _righe,_cess; +protected: + + long get_next_key(const long codcf) const; // ritorna la prossima chiave + +public: + long renum(long numeff = 0); // rinumera le chiavi + + const TRectype& head() const + { return *this; } // Ritorna la testata dell'effetto + TRectype& head() + { return *this; } + + TRecord_array& righe() {return _righe;} + TRecord_array& cess() {return _cess;} + TRectype& row_c(int i, bool create=FALSE) + { return _cess.row(i,create); } // ritorna la riga i dei cessionari + TRectype& row_r(int i, bool create=FALSE) + { return _righe.row(i,create); } // ritorna la riga i delle righe + + int rows_r() const // ritorna il numero delle righe presenti + { return _righe.rows(); } // nelle righe effetto + int rows_c() const // ritorna il numero delle righe presenti + { return _cess.rows(); } // nei cessionari + + bool destroy_row_r(int n, bool pack = FALSE) // elimina l'elemento riga nella posizione n + { return _righe.destroy_row(n, pack); } // nelle righe effetto + void destroy_rows_r() // elimina tutti gli elementi riga + { _righe.destroy_rows(); } // nelle righe effetto + + bool destroy_row_c(int n, bool pack = FALSE) // elimina l'elemento riga nella posizione n + { return _cess.destroy_row(n, pack); } // nei cessionari + void destroy_rows_c() // elimina tutti gli elementi riga + { _cess.destroy_rows(); } // nei cessionari + int read(const TRectype& rec); + int read(char tipodist, long ndist, long nrigadist); + int write(bool force=FALSE); + int rewrite() + { return write(TRUE); } + int remove()const; + long numero() const // metodi per ritornare i campi chiave + { return get_long("NPROGTR"); } // del file EFFETTI + long codicec() const + { return get_long("CODCF"); } + TDate datasc() const + { return get_date("DATASCAD"); } + char tipodist() const + { return get_char("TIPODIST"); } + long ndist() const + { return get_long("NDIST"); } + long nrgdist() const + { return get_long("NRIGADIST"); } + void set_key4(TRectype& rec,char tipodist, long ndist, long nrigadist); //setta i campi per la quarta chiave del file + void set_key(TRectype& rec,long numeff) const; //setta i campi per la chiave + TEffetto(); + TEffetto(TRectype& rec); + virtual ~TEffetto() {} };