#include #include #include "ce4100a.h" //============================================================================================= //maschera class TCesp_per_cms_mask: public TAutomask { int _pos_cms, _pos_fase, _pos_cdc, _pos_util, _pos_cop, _pos_fondo; public: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); real TCesp_per_cms_mask::somma_perc() const; TCesp_per_cms_mask(); }; TCesp_per_cms_mask::TCesp_per_cms_mask() : TAutomask ("ce4100a") { //setta le posizioni dei campi dello sheet TSheet_field& sf_righe = sfield(F_RIGHE); _pos_cms = sf_righe.cid2index(S_CODCMS); _pos_fase = sf_righe.cid2index(S_CODFASE); _pos_cdc = sf_righe.cid2index(S_CODCDC); _pos_util = sf_righe.cid2index(S_PERCUTIL); _pos_cop = sf_righe.cid2index(S_PERCCOPE); _pos_fondo = sf_righe.cid2index(S_FONDO); } real TCesp_per_cms_mask::somma_perc() const { TSheet_field& ss = sfield(F_RIGHE); real tot_perc; FOR_EACH_SHEET_ROW(ss,i,r) tot_perc += real(r->get(_pos_util)); return tot_perc; } bool TCesp_per_cms_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) { case F_RIGHE: if (e == se_notify_add) { TSheet_field& ss = (TSheet_field&)o; real residuo = CENTO - somma_perc(); if (residuo > 0) { TToken_string& row = ss.row(jolly); row.add(residuo.string(),_pos_util); } } if (e == fe_close && (insert_mode() || edit_mode())) { //controllo sulle percentuali totali di un cespite if (somma_perc() != CENTO) return noyes_box("La percentuale complessiva di utilizzo del cespite e' diversa da 100" "\nSi desidera proseguire ugualmente?"); TAssoc_array keys_list; TSheet_field& ss = sfield(F_RIGHE); FOR_EACH_SHEET_ROW(ss,i,r) { //controllo di esistenza codici commessa e cdc const TString& cms = r->get(_pos_cms); if (cms.blank()) return error_box("Specificare la commessa sulla riga %d", i+1); const TString& cdc = r->get(_pos_cdc); if (cdc.blank()) return error_box("Specificare il centro di costo sulla riga %d", i+1); //controllo di duplicazione chiave della riga (cms/fase/cdc) TToken_string row_key; row_key.add(cms); const TString& fase = r->get(_pos_fase); row_key.add(fase); row_key.add(cdc); if (keys_list.is_key(row_key)) return error_box("Codice riga %s duplicato", (const char *)row_key); keys_list.add(row_key); } } break; default: break; } return true; } //=============================================================================================== //Applicazione class TCesp_per_cms: public TRelation_application { TCesp_per_cms_mask *_msk; // maschera principale TRelation *_rel; // relazione principale //metodi virtuali obbligatori per gli oggetti TRelation_application protected: virtual bool user_create(); virtual bool user_destroy(); virtual TMask* get_mask(int mode) { return _msk; } virtual bool changing_mask(int mode) { return false;} virtual void init_query_mode(TMask& m); virtual void init_query_insert_mode(TMask& m); virtual void init_insert_mode(TMask& m); virtual void init_modify_mode(TMask& m); virtual TRelation* get_relation() const { return _rel; } public: virtual ~TCesp_per_cms() {} }; //metodi per la maschera //abilita i campi per inserimento nuovo cespite,attivando i campi del gruppo 2 (che fanno riferimento al file LF_CESPI) void TCesp_per_cms::init_query_insert_mode(TMask& m) { m.enable(-2); m.show(-2); m.hide(-1); } //abilita i campi per ricercare un cespite gia' inserito,attivando i campi del gruppo 1(LF_SALCECMS) void TCesp_per_cms::init_query_mode(TMask& m) { m.show(-1); m.hide(-2); m.set(F_DESC,""); } void TCesp_per_cms::init_insert_mode(TMask& m) { m.hide(-1); m.disable(-2); } void TCesp_per_cms::init_modify_mode(TMask& m) { m.hide(-2); } bool TCesp_per_cms::user_create() { _rel = new TRelation(LF_SALCECMS); _msk = new TCesp_per_cms_mask; return true; } bool TCesp_per_cms::user_destroy() { delete _rel; delete _msk; return true; } int ce4100(int argc, char* argv[]) { TCesp_per_cms a; a.run(argc,argv,TR("Distribuzione analitica cespiti")); return 0; }