From 621266b2dcc8f508b6655958bf8e031e6f92fb84 Mon Sep 17 00:00:00 2001 From: guy Date: Wed, 2 Feb 2005 16:28:42 +0000 Subject: [PATCH] Patch level : 2.2 210 Files correlati : Ricompilazione Demo : [ ] Commento : git-svn-id: svn://10.65.10.50/trunk@12653 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ca/ca2100.cpp | 70 ++++++++++++++--------- ca/ca2100a.h | 2 +- ca/ca2100a.uml | 14 ++++- ca/calib01.cpp | 148 ++++++++++++++++++++++++++++++++++++++++++++++++- ca/calib01.h | 19 ++++++- ca/f151.dir | 2 +- ca/f151.trr | 23 +++++--- 7 files changed, 233 insertions(+), 45 deletions(-) diff --git a/ca/ca2100.cpp b/ca/ca2100.cpp index f8c33fb82..c00b671a2 100755 --- a/ca/ca2100.cpp +++ b/ca/ca2100.cpp @@ -18,15 +18,39 @@ class TMovanal_msk : public TAutomask protected: virtual bool on_field_event(TOperable_field& o, TField_event fe, long jolly); virtual bool can_be_closed() const; + virtual bool on_key(KEY key); public: + void show_locked_buttons(); + TMovanal_msk(); virtual ~TMovanal_msk() { } }; bool TMovanal_msk::can_be_closed() const { - return !get_bool(F_BLOCCATO); + return mode() != MODE_MOD || !get_bool(F_BLOCCATO); +} + +bool TMovanal_msk::on_key(KEY key) +{ + if (key == K_SHIFT + K_F12 && !can_be_closed()) + { + enable(F_BLOCCATO); + return true; + } + return TAutomask::on_key(key); +} + +void TMovanal_msk::show_locked_buttons() +{ + const bool editmode = mode() == MODE_MOD; + const bool unlocked = can_be_closed(); + show (F_BLOCCATO, editmode); + enable(F_BLOCCATO, unlocked); + enable(DLG_SAVEREC, unlocked && edit_mode()); // Abilito il "Registra" solo in modo modifica + enable(DLG_DELREC, unlocked && editmode); + enable(DLG_QUIT, unlocked); } bool TMovanal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly) @@ -93,6 +117,10 @@ bool TMovanal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly totrig.sezione() == 'D' ? TR("Dare") : TR("Avere")); } break; + case F_BLOCCATO: + if (e == fe_modify) + show_locked_buttons(); + break; default: break; } @@ -194,11 +222,9 @@ const TString& TMovanal_app::somma_campi(TToken_string& row, int first) const int TMovanal_app::write_rows(const TMask& m) { - TRecord_array a(LF_RMOVANA, RMOVANA_NUMRIG); - TRectype* key = new TRectype(LF_RMOVANA); - key->put(RMOVANA_NUMREG, m.get(F_NUMREG)); - a.set_key(key); - + TAnal_mov& mov = (TAnal_mov&)_rel->curr(); + mov.destroy_rows(); + TSheet_field& sheet = _msk->sfield(F_RIGHE); // Calcola le posizioni dei campi multilivello generati @@ -210,7 +236,7 @@ int TMovanal_app::write_rows(const TMask& m) // Scandisce lo sheet e riempie il recarray FOR_EACH_SHEET_ROW(sheet, i, row) { - TRectype& rec = a.row(i+1, true); // Crea una riga nuova + TRectype& rec = mov.new_row(); // Crea una riga nuova rec.put(RMOVANA_ANNOES, m.get(F_ANNOES)); rec.put(RMOVANA_DATAREG, m.get(F_DATAREG)); rec.put(RMOVANA_DESCR, row->get(sheet.cid2index(S_DESCR))); @@ -231,7 +257,6 @@ int TMovanal_app::write_rows(const TMask& m) rec.put(RMOVANA_CODFASE, somma_campi(*row, pos_fas)); rec.put(RMOVANA_CODCONTO, somma_campi(*row, pos_con)); } - a.rewrite(); return NOERR; } @@ -257,9 +282,8 @@ void TMovanal_app::spezza_campo(const TString& str, TToken_string& row, int firs void TMovanal_app::read_rows(const TMask& m) { - TRectype key (LF_RMOVANA); - key.put(RMOVANA_NUMREG, _msk->get(F_NUMREG)); - TRecord_array a(key, RMOVANA_NUMRIG); + const TAnal_mov& mov = (const TAnal_mov&)_rel->curr(); + const TRecord_array& a = mov[LF_RMOVANA]; TSheet_field& sheet = m.sfield(F_RIGHE); sheet.destroy(); @@ -295,9 +319,8 @@ int TMovanal_app::write(const TMask& m) int err = m.get_bool(F_BLOCCATO) ? _islocked : NOERR; if (err == NOERR) { + write_rows(m); err = TRelation_application::write(m); - if (err == NOERR) - write_rows(m); } return err; } @@ -307,47 +330,40 @@ int TMovanal_app::rewrite(const TMask& m) int err = m.get_bool(F_BLOCCATO) ? _islocked : NOERR; if (err == NOERR) { + write_rows(m); err = TRelation_application::rewrite(m); - if (err == NOERR) - write_rows(m); } return err; } int TMovanal_app::read(TMask& m) { - int err = TRelation_application::read(m); + const int err = TRelation_application::read(m); if (err == NOERR) - { read_rows(m); - } return err; } void TMovanal_app::init_query_mode(TMask& m) { - m.enable(F_BLOCCATO); - m.enable(DLG_SAVEREC); - m.enable(DLG_QUIT); + ((TMovanal_msk&)m).show_locked_buttons(); } void TMovanal_app::init_insert_mode(TMask& m) { - m.enable(F_BLOCCATO); - m.enable(DLG_SAVEREC); + ((TMovanal_msk&)m).show_locked_buttons(); } void TMovanal_app::init_modify_mode(TMask& m) { - const bool unlocked = m.can_be_closed(); - m.enable(F_BLOCCATO, unlocked); - m.enable(DLG_SAVEREC, unlocked); - m.enable(DLG_QUIT, unlocked); + ((TMovanal_msk&)m).show_locked_buttons(); } bool TMovanal_app::user_create() { _rel = new TRelation(LF_MOVANA); + _rel->lfile().set_curr(new TAnal_mov); + _msk = new TMovanal_msk; return true; } diff --git a/ca/ca2100a.h b/ca/ca2100a.h index 4488811eb..0e802eabc 100755 --- a/ca/ca2100a.h +++ b/ca/ca2100a.h @@ -15,6 +15,7 @@ #define F_DARE 115 #define F_AVERE 116 #define F_BLOCCATO 117 +#define F_TIPO 118 #define F_NUMREG2 201 #define F_ANNOES2 202 @@ -22,7 +23,6 @@ #define F_DESCR2 204 #define F_RIGHE 300 - #define S_DARE 101 #define S_AVERE 102 #define S_DESCR 103 diff --git a/ca/ca2100a.uml b/ca/ca2100a.uml index 8d33ecb0a..2cfee9c63 100755 --- a/ca/ca2100a.uml +++ b/ca/ca2100a.uml @@ -91,6 +91,7 @@ BEGIN DISPLAY "Descrizione@60" S0 OUTPUT F_TIPODOC CODTAB CHECKTYPE NORMAL + FIELD TIPODOC END STRING F_DESCR 50 @@ -141,15 +142,24 @@ BEGIN PROMPT 1 14 "@bMovimento" END +LIST F_TIPO 1 25 +BEGIN + PROMPT 2 15 "Tipo " + ITEM " |Normale" + ITEM "P|Preventivo" + ITEM "V|Variazione preventivo" + FIELD TIPOMOV +END + CURRENCY F_TOTDOC 18 BEGIN - PROMPT 2 15 "Totale documento " + PROMPT 2 16 "Totale documento " FIELD TOTDOC END LISTBOX F_SEZIONE 1 5 BEGIN - PROMPT 39 15 "" + PROMPT 39 16 "" ITEM "D|Dare" ITEM "A|Avere" FIELD SEZIONE diff --git a/ca/calib01.cpp b/ca/calib01.cpp index 324a402db..62b1b4bfd 100755 --- a/ca/calib01.cpp +++ b/ca/calib01.cpp @@ -4,6 +4,10 @@ #include #include +#include "movana.h" +#include "rmovana.h" +#include "saldana.h" + /////////////////////////////////////////////////////////// // TMultilevel_code_info /////////////////////////////////////////////////////////// @@ -931,9 +935,147 @@ bool TAnal_app::user_destroy() // TAnal_mov /////////////////////////////////////////////////////////// +TImporto& TAnal_mov::saldo(const TRectype& row) +{ + TToken_string key; + key.add(get(MOVANA_TIPOMOV)); + key.add(get(MOVANA_ANNOES)); + key.add(row.get(RMOVANA_CODCCOSTO)); + key.add(row.get(RMOVANA_CODCMS)); + key.add(row.get(RMOVANA_CODFASE)); + key.add(row.get(RMOVANA_CODCONTO)); + + TImporto* imp = (TImporto*)_saldi.objptr(key); + if (imp == NULL) + { + imp = new TImporto; + _saldi.add(key, imp); + } + return *imp; +} + +void TAnal_mov::load_saldi(bool reset) +{ + if (reset) + _saldi.destroy(); + + const TRecord_array& a = body(LF_RMOVANA); + for (int i = a.last_row(); i > 0; i--) + { + const TRectype& row = a[i]; + const TImporto imp(row.get_char(RMOVANA_SEZIONE), row.get_real(RMOVANA_IMPORTO)); + TImporto& sld = saldo(row); + if (reset) + sld -= imp; + else + sld += imp; + } +} + +void TAnal_mov::update_saldi(bool kill) +{ + if (!kill) + load_saldi(false); + + save_saldi(); + + if (kill) + _saldi.destroy(); + else + load_saldi(true); +} + +void TAnal_mov::save_saldi() +{ + TLocalisamfile saldi(LF_SALDANA); + FOR_EACH_ASSOC_OBJECT(_saldi, h, k, o) + { + const TImporto& imp = (const TImporto&)o; + if (!imp.is_zero()) + { + TToken_string key = k; + const char tipo = key.get_char(0); + saldi.put(SALDANA_ANNO, key.get()); + saldi.put(SALDANA_COSTO, key.get()); + saldi.put(SALDANA_COMMESSA, key.get()); + saldi.put(SALDANA_FASE, key.get()); + saldi.put(SALDANA_CONTO, key.get()); + + int err = saldi.read(_isequal, _testandlock); + if (err != NOERR) + { + saldi.put(SALDANA_ANNO, key.get(1)); + saldi.put(SALDANA_COSTO, key.get()); + saldi.put(SALDANA_COMMESSA, key.get()); + saldi.put(SALDANA_FASE, key.get()); + saldi.put(SALDANA_CONTO, key.get()); + saldi.write(); + } + + const char* fld_sez = NULL; + const char* fld_val = NULL; + switch (tipo) + { + case 'P': fld_sez = SALDANA_SEZIONEP; fld_val = SALDANA_SEZIONEP; break; + case 'V': fld_sez = SALDANA_SEZIONEV; fld_val = SALDANA_SEZIONEV; break; + default : fld_sez = SALDANA_SEZIONE; fld_val = SALDANA_SEZIONE; break; + } + TImporto saldo(saldi.get_char(fld_sez), saldi.get_real(fld_val)); + saldo += imp; + saldo.normalize(); + + saldi.put(fld_sez, saldo.sezione()); + saldi.put(fld_val, saldo.valore()); + saldi.rewrite(); + } + } +} + +int TAnal_mov::readat(TBaseisamfile& f, TRecnotype nrec, word lockop) +{ + const int err = TMultiple_rectype::readat(f, nrec, lockop); + load_saldi(true); + return err; +} + +int TAnal_mov::read(TBaseisamfile& f, word op, word lockop) +{ + const int err = TMultiple_rectype::read(f, op, lockop); + load_saldi(true); + return err; +} + +int TAnal_mov::write(TBaseisamfile& f) const +{ + const int err = TMultiple_rectype::write(f); + if (err == NOERR) + { + ((TAnal_mov*)this)->update_saldi(false); + } + return err; +} + +int TAnal_mov::rewrite(TBaseisamfile& f) const +{ + const int err = TMultiple_rectype::rewrite(f); + if (err == NOERR) + { + ((TAnal_mov*)this)->update_saldi(false); + } + return err; +} + +int TAnal_mov::remove(TBaseisamfile& f) const +{ + const int err = TMultiple_rectype::remove(f); + if (err == NOERR) + ((TAnal_mov*)this)->update_saldi(true); + return err; +} + int TAnal_mov::read(long numreg, word lock) { - put("NUMREG", numreg); + put(MOVANA_NUMREG, numreg); return TMultiple_rectype::read(_isequal, lock); } @@ -941,9 +1083,11 @@ TAnal_mov::TAnal_mov(long numreg) : TMultiple_rectype(LF_MOVANA) { add_file(LF_RMOVANA, "NUMRIG"); if (numreg > 0) - read (numreg); + read(numreg); } + + /////////////////////////////////////////////////////////// // Utilities /////////////////////////////////////////////////////////// diff --git a/ca/calib01.h b/ca/calib01.h index ce421ab88..d8e4d9510 100755 --- a/ca/calib01.h +++ b/ca/calib01.h @@ -113,10 +113,23 @@ protected: class TAnal_mov : public TMultiple_rectype { -public: - int read(long numreg, word lockop = _nolock); + TAssoc_array _saldi; - //costruttore +protected: + TImporto& saldo(const TRectype& rec); + void load_saldi(bool reset); + void update_saldi(bool kill); + void save_saldi(); + +public: + virtual int readat(TBaseisamfile& f, TRecnotype nrec, word lockop); + virtual int read(TBaseisamfile& f, word op, word lockop); + virtual int write(TBaseisamfile& f) const; + virtual int rewrite(TBaseisamfile& f) const; + virtual int remove(TBaseisamfile& f) const; + +public: + int read(long numreg, word lockop = _nolock); // Funzione read di comodo TAnal_mov(long numreg = 0); }; diff --git a/ca/f151.dir b/ca/f151.dir index 25e50b524..acca6f128 100755 --- a/ca/f151.dir +++ b/ca/f151.dir @@ -1,3 +1,3 @@ 151 0 -$parana|0|0|46|0|Parametri rip.centri di costo/commesse||| +$saldana|0|0|142|0|Saldi contabilita' analitica||| diff --git a/ca/f151.trr b/ca/f151.trr index 2620a8afa..b9ea5c1d7 100755 --- a/ca/f151.trr +++ b/ca/f151.trr @@ -1,10 +1,15 @@ 151 -5 -TIPO|1|3|0| Centro di costo, Commessa -COD|1|20|0|Centro di costo/commessa -NRIGA|1|3|0|Numero riga -CODRIP|1|4|0|Codice Ripartizione -VALRIP|4|15|5|Valore -2 -TIPO+COD+NRIGA| -TIPO+CODRIP+COD|X +11 +ANNO|9|4|0|Codice esercizio +COSTO|1|20|0|Centro Di costo +COMMESSA|1|20|0|Commessa +FASE|1|20|0|Fase +CONTO|1|20|0|Conto +SEZIONE|7|1|0|Sezione (Normale) +SALDO|4|18|3|Saldo (Normale) +SEZIONEP|7|1|0|Sezione (Preventivo) +SALDOP|4|18|3|Saldo (Preventivo) +SEZIONEV|7|1|0|Sezione (Variazione preventivo) +SALDOV|4|18|3|Saldo (Variazione preventivo) +1 +ANNO+COSTO+COMMESSA+FASE+CONTO|