campo-sirio/ce/ce4100.cpp
luca 963544bc88 Patch level :10.0
Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
cespiti per analitica in corso d'opera


git-svn-id: svn://10.65.10.50/trunk@20489 c028cbd2-c16b-5b4b-a496-9718f37d4682
2010-05-25 08:49:51 +00:00

169 lines
4.3 KiB
C++
Executable File

#include<automask.h>
#include<relapp.h>
#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;
}