Patch level :10.0

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
fine immissione cespiti in analitica
registro sintetico cespiti analiticizzato


git-svn-id: svn://10.65.10.50/trunk@20546 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2010-06-07 15:48:02 +00:00
parent 8d7e5c7128
commit b7424d5550
7 changed files with 148 additions and 179 deletions

View File

@ -120,13 +120,12 @@ void TStampa_sintetica_recordset::set_filter(const TStampa_sintetica_mask& msk)
{ {
//parametri per costruzione query //parametri per costruzione query
const bool exclude_aliens = msk.get_bool(F_EXCLUDE_ALIENS); const bool exclude_aliens = msk.get_bool(F_EXCLUDE_ALIENS);
const bool anal = dongle().active(CAAUT);
TString query = "USE CESPI\nSELECT "; TString query = "USE CESPI\nSELECT ";
query << "(ANSI(DTCOMP)<=#DATAFINE)"; //" << msk.get_date(F_DATAFINE).date2ansi() << ")"; query << "(ANSI(DTCOMP)<=#DATAFINE)";
//cespiti alienati esclusi? //cespiti alienati esclusi?
if (exclude_aliens) if (exclude_aliens)
query << "&&((DTALIEN='')||(ANSI(DTALIEN)>=#DATAINIZIO))"; // << msk.get_date(F_DATAINIZIO).date2ansi() << "))"; query << "&&((DTALIEN='')||(ANSI(DTALIEN)>=#DATAINIZIO))";
//categorie //categorie
const TString& dacat = msk.get(F_FROM_CAT); const TString& dacat = msk.get(F_FROM_CAT);
@ -140,11 +139,23 @@ void TStampa_sintetica_recordset::set_filter(const TStampa_sintetica_mask& msk)
} }
//parte analitica //parte analitica
if (anal) const TString& codcdc = msk.get(F_CODCDC);
const TString& codcms = msk.get(F_CODCMS);
const TString& codfase = msk.get(F_CODFASE);
if (codcdc.full() || codcms.full() || codfase.full())
{ {
query << "&&(BETWEEN(SALCECMS.CODCDC,#DACODCDC,#ACODCDC))"; query << "&&";
query << "&&(BETWEEN(SALCECMS.CODCMS,#DACODCMS,#ACODCMS))";
query << "&&(BETWEEN(SALCECMS.CODFASE,#DACODFASE,#ACODFASE))"; if (codcdc.full())
query << "(BETWEEN(SALCECMS.CODCDC,#CODCDC,#CODCDC))&&";
if (codcms.full())
query << "(BETWEEN(SALCECMS.CODCMS,#CODCMS,#CODCMS))&&";
if (codfase.full())
query << "(BETWEEN(SALCECMS.CODFASE,#CODFASE,#CODFASE))&&";
query.rtrim(2);
query << "\nJOIN SALCECMS INTO IDCESPITE=IDCESPITE"; query << "\nJOIN SALCECMS INTO IDCESPITE=IDCESPITE";
} }
@ -158,18 +169,13 @@ void TStampa_sintetica_recordset::set_filter(const TStampa_sintetica_mask& msk)
if (exclude_aliens) if (exclude_aliens)
set_var("#DATAINIZIO", msk.get_date(F_DATAINIZIO).date2ansi()); set_var("#DATAINIZIO", msk.get_date(F_DATAINIZIO).date2ansi());
if (anal) //set var condizionali in analitica
{ if (codcdc.full())
const TString& codcdc = msk.get(F_CODCDC); set_var("#CODCDC", codcdc);
set_var("#DACODCDC", codcdc); if (codcms.full())
set_var("#ACODCDC", codcdc); set_var("#CODCMS", codcms);
const TString& codcms = msk.get(F_CODCMS); if (codfase.full())
set_var("#DACODCMS", codcms); set_var("#CODFASE", codfase);
set_var("#ACODCMS", codcms);
const TString& codfase = msk.get(F_CODFASE);
set_var("#DACODFASE", codfase);
set_var("#ACODFASE", codfase);
}
} }
@ -183,14 +189,31 @@ class TStampa_sintetica_rep : public TReport
int _group_codimp, _group_codloc; int _group_codimp, _group_codloc;
TString _codcdc, _codcms, _codfase; TString _codcdc, _codcms, _codfase;
TCespite _cespite; TCespite _cespite;
real _percutil;
TString16 _cespi_percutil;
protected: protected:
real val_amm(const TRectype& rec_saldi) const; real val_amm(const TRectype& rec_saldi) const;
virtual bool get_usr_val(const TString& name, TVariant& var) const; virtual bool get_usr_val(const TString& name, TVariant& var) const;
real perc_util() const;
public: public:
void set_filter(const TStampa_sintetica_mask& msk); void set_filter(const TStampa_sintetica_mask& msk);
}; };
//metodo per avere, solo al cambio cespite, la % di utilizzo per la chiave cespite/anno/cdc/cms/fase
//serve nel caso si utilizzi il cespite in analitica (selezioni su cdc/cms/fase)
real TStampa_sintetica_rep::perc_util() const
{
const TString& curr_cespite = _cespite.get(CESPI_IDCESPITE);
if (curr_cespite != _cespi_percutil)
{
(TString&)_cespi_percutil = curr_cespite;
(real&)_percutil = ceca_percutil(_cespi_percutil, _anno, _codcdc, _codcms, _codfase);
}
return _percutil;
}
void TStampa_sintetica_rep::set_filter(const TStampa_sintetica_mask& msk) void TStampa_sintetica_rep::set_filter(const TStampa_sintetica_mask& msk)
{ {
_anno = msk.get_int(F_ESERCIZIO); _anno = msk.get_int(F_ESERCIZIO);
@ -282,7 +305,43 @@ bool TStampa_sintetica_rep::get_usr_val(const TString& name, TVariant& var) cons
return true; return true;
} }
if (name == "#PERCAMM") // percentuale ammortamento
if (name == "#QAMMMV") //quote ammortamento su movimento esercizio corrente
{
real quote_ammmv;
const TArray& array_ammmv = _cespite.ammmv();
for (int i = 0; i < array_ammmv.items(); i++)
{
const TRectype& rec_ammmv = (const TRectype&)array_ammmv[i];
quote_ammmv += rec_ammmv.get_real(AMMMV_QNOR) + rec_ammmv.get_real(AMMMV_QACC) +
rec_ammmv.get_real(AMMMV_QANT) + rec_ammmv.get_real(AMMMV_QPERSE) +
rec_ammmv.get_real(AMMMV_QPPRIVATE) + rec_ammmv.get_real(AMMMV_FPRIVATO);
}
quote_ammmv *= perc_util();
var = quote_ammmv;
return true;
}
if (name == "#QAMM") //quote ammortamento esercizio corrente
{
const TRectype& rec_ammce = _cespite.amm_pro();
real quote_amm = real(rec_ammce.get_real(AMMCE_QNOR) + rec_ammce.get_real(AMMCE_QACC) +
rec_ammce.get_real(AMMCE_QANT) + rec_ammce.get_real(AMMCE_QPERSE) +
rec_ammce.get_real(AMMCE_QPPRIVATE) + rec_ammce.get_real(AMMCE_FPRIVATO));
quote_amm *= perc_util();
var = quote_amm;
return true;
}
if (name == "#QAMM_FPRIVATO") //fondo ammortamento privato corrente
{
const TRectype& rec_ammce = _cespite.amm_pro();
real famm = rec_ammce.get_real(AMMCE_FPRIVATO);
famm *= perc_util();
var = famm;
return true;
}
if (name == "#PERCAMM") // percentuale ammortamento
{ {
real percamm; real percamm;
real valamm = val_amm(_cespite.sal_ini()); real valamm = val_amm(_cespite.sal_ini());
@ -290,7 +349,9 @@ bool TStampa_sintetica_rep::get_usr_val(const TString& name, TVariant& var) cons
{ {
const int anno_acq = _cespite.get_date(CESPI_DTCOMP).year(); const int anno_acq = _cespite.get_date(CESPI_DTCOMP).year();
if (anno_acq == _anno) if (anno_acq == _anno)
{
valamm = val_amm(_cespite.sal_pro()); valamm = val_amm(_cespite.sal_pro());
}
} }
if (!valamm.is_zero()) if (!valamm.is_zero())
{ {
@ -304,34 +365,7 @@ bool TStampa_sintetica_rep::get_usr_val(const TString& name, TVariant& var) cons
return true; return true;
} }
if (name == "#QAMMMV") //quote ammortamento su movimento esercizio corrente
{
real quote_ammmv;
const TArray& array_ammmv = _cespite.ammmv();
for (int i = 0; i < array_ammmv.items(); i++)
{
const TRectype& rec_ammmv = (const TRectype&)array_ammmv[i];
quote_ammmv += rec_ammmv.get_real(AMMMV_QNOR) + rec_ammmv.get_real(AMMMV_QACC) +
rec_ammmv.get_real(AMMMV_QANT) + rec_ammmv.get_real(AMMMV_QPERSE) +
rec_ammmv.get_real(AMMMV_QPPRIVATE) + rec_ammmv.get_real(AMMMV_FPRIVATO);
}
var = quote_ammmv;
return true;
}
if (name == "#QAMM") //quote ammortamento esercizio corrente
{
const TRectype& rec_ammce = _cespite.amm_pro();
var = real(rec_ammce.get_real(AMMCE_QNOR) + rec_ammce.get_real(AMMCE_QACC) +
rec_ammce.get_real(AMMCE_QANT) + rec_ammce.get_real(AMMCE_QPERSE) +
rec_ammce.get_real(AMMCE_QPPRIVATE) + rec_ammce.get_real(AMMCE_FPRIVATO));
return true;
}
if (name == "#QAMM_FPRIVATO") //fondo ammortamento privato corrente
{
const TRectype& rec_ammce = _cespite.amm_pro();
var = rec_ammce.get_real(AMMCE_FPRIVATO);
return true;
}
if (name == "#FAMM") //fondo ammortamento alla fine dell'esercizio precedente if (name == "#FAMM") //fondo ammortamento alla fine dell'esercizio precedente
{ {
const TRectype& rec_ammce = _cespite.amm_ini(); const TRectype& rec_ammce = _cespite.amm_ini();
@ -347,6 +381,8 @@ bool TStampa_sintetica_rep::get_usr_val(const TString& name, TVariant& var) cons
var = rec_ammce.get_real(AMMCE_FPRIVATO); var = rec_ammce.get_real(AMMCE_FPRIVATO);
return true; return true;
} }
if (name == "#CESSELIM") //cessioni elminiazioni if (name == "#CESSELIM") //cessioni elminiazioni
{ {
real cesselim; real cesselim;
@ -358,6 +394,7 @@ bool TStampa_sintetica_rep::get_usr_val(const TString& name, TVariant& var) cons
rec_movam.get_real(MOVAM_QANT) + rec_movam.get_real(MOVAM_QPERSE) + rec_movam.get_real(MOVAM_QANT) + rec_movam.get_real(MOVAM_QPERSE) +
rec_movam.get_real(MOVAM_QPPRIVATE) + rec_movam.get_real(MOVAM_FPRIVATO); rec_movam.get_real(MOVAM_QPPRIVATE) + rec_movam.get_real(MOVAM_FPRIVATO);
} }
cesselim *= perc_util();
var = cesselim; var = cesselim;
return true; return true;
} }

View File

@ -6,10 +6,7 @@
#define F_DATAFINE 105 #define F_DATAFINE 105
#define F_GRUPPO 106 #define F_GRUPPO 106
#define F_SPECIE 107 #define F_SPECIE 107
#define F_D_GRUPPO 108 #define F_DESC_GRSP 108
#define F_D_SPECIE 109
#define F_CODTAB 110
#define F_D_CODTAB 111
#define F_FROM_CAT 112 #define F_FROM_CAT 112
#define F_D_FROM_CAT 113 #define F_D_FROM_CAT 113

View File

@ -6,15 +6,14 @@ ENDPAGE
PAGE "Registro cespiti sintetico" 0 2 0 0 PAGE "Registro cespiti sintetico" 0 2 0 0
GROUPBOX DLG_NULL 78 6 GROUPBOX DLG_NULL 78 5
BEGIN BEGIN
PROMPT 1 0 "" PROMPT 1 1 ""
FLAGS "R"
END END
NUMBER F_CODDITTA 5 NUMBER F_CODDITTA 5
BEGIN BEGIN
PROMPT 2 1 "Ditta " PROMPT 2 2 "Ditta "
FLAGS "DF" FLAGS "DF"
USE LF_NDITTE USE LF_NDITTE
INPUT CODDITTA F_CODDITTA INPUT CODDITTA F_CODDITTA
@ -24,13 +23,13 @@ END
STRING F_RAGSOC 55 STRING F_RAGSOC 55
BEGIN BEGIN
PROMPT 20 1 "" PROMPT 20 2 ""
FLAGS "D" FLAGS "D"
END END
NUMBER F_ESERCIZIO 4 NUMBER F_ESERCIZIO 4
BEGIN BEGIN
PROMPT 2 2 "Esercizio " PROMPT 2 3 "Esercizio "
FLAGS "Z" FLAGS "Z"
USE CCE USE CCE
JOIN ESC ALIAS 105 INTO CODTAB==CODTAB JOIN ESC ALIAS 105 INTO CODTAB==CODTAB
@ -46,58 +45,44 @@ END
DATE F_DATAINIZIO DATE F_DATAINIZIO
BEGIN BEGIN
PROMPT 20 2 "Data inizio " PROMPT 20 3 "Data inizio "
FLAGS "D" FLAGS "D"
END END
DATE F_DATAFINE DATE F_DATAFINE
BEGIN BEGIN
PROMPT 45 2 "Data fine " PROMPT 45 3 "Data fine "
FLAGS "D" FLAGS "D"
END END
NUMBER F_GRUPPO 2 NUMBER F_GRUPPO 2
BEGIN BEGIN
PROMPT 2 3 "Gruppo " PROMPT 2 4 "Gruppo "
FLAGS "Z" FLAGS "Z"
USE CCB KEY 1
JOIN %CGR ALIAS 106 INTO CODTAB==CODTAB[5,6]
INPUT CODTAB[1,4] F_ESERCIZIO SELECT
INPUT CODTAB[5,6] F_GRUPPO
INPUT CODTAB[7,10] F_SPECIE
DISPLAY "Codice" CODTAB[5,6]
DISPLAY "Descrizione@60" 106@->S0
OUTPUT F_GRUPPO CODTAB[5,6]
OUTPUT F_D_GRUPPO 106@->S0
CHECKTYPE NORMAL
END END
STRING F_SPECIE 4 STRING F_SPECIE 4
BEGIN BEGIN
PROMPT 2 4 "Specie " PROMPT 17 4 "Specie "
FLAGS "_" FLAGS "_"
USE CCB KEY 1 USE CCB
JOIN %CAT ALIAS 107 INTO CODTAB[1,2]==CODTAB[5,6] CODTAB[3,6]==CODTAB[7,10] JOIN %CAT ALIAS 400 INTO CODTAB=CODTAB[5,10]
INPUT CODTAB[1,4] F_ESERCIZIO SELECT INPUT CODTAB[1,4] F_ESERCIZIO SELECT
INPUT CODTAB[5,6] F_GRUPPO SELECT INPUT CODTAB[5,6] F_GRUPPO
INPUT CODTAB[7,10] F_SPECIE INPUT CODTAB[7,10] F_SPECIE
DISPLAY "Gruppo" CODTAB[5,6] DISPLAY "Gruppo" CODTAB[5,6]
DISPLAY "Specie" CODTAB[7,10] DISPLAY "Specie" CODTAB[7,10]
DISPLAY "Descrizione@60" 107@->S0 DISPLAY "Descrizione@50" 400@->S0
OUTPUT F_GRUPPO CODTAB[5,6]
OUTPUT F_SPECIE CODTAB[7,10] OUTPUT F_SPECIE CODTAB[7,10]
OUTPUT F_D_SPECIE 107@->S0 OUTPUT F_DESC_GRSP 400@->S0
CHECKTYPE NORMAL CHECKTYPE FORCED
GROUP 1
END END
STRING F_D_GRUPPO 60 55 STRING F_DESC_GRSP 60 44
BEGIN BEGIN
PROMPT 20 3 "" PROMPT 31 4 ""
FLAGS "D"
END
STRING F_D_SPECIE 60 55
BEGIN
PROMPT 20 4 ""
FLAGS "D" FLAGS "D"
END END

View File

@ -261,7 +261,7 @@ bool TCesp_anal_mask::on_field_event(TOperable_field& o, TField_event e, long jo
//maschera principale //maschera principale
//------------------- //-------------------
case F_IDCESPITE: //case F_IDCESPITE:
case F_IDCESPITE_N: case F_IDCESPITE_N:
case F_ESERCIZIO: case F_ESERCIZIO:
if (e == fe_modify || e == fe_close) if (e == fe_modify || e == fe_close)

View File

@ -231,6 +231,7 @@ END
STRING S_DESFASE 50 37 STRING S_DESFASE 50 37
BEGIN BEGIN
PROMPT 35 3 "" PROMPT 35 3 ""
FLAGS "D"
END END
STRING S_CODCDC 20 STRING S_CODCDC 20

View File

@ -438,100 +438,50 @@ bool null_fields(const TRectype& rec, const char* fld0, const char* fld1, const
//Metodi per cespiti in analitica (come maiali nello spazio!?) //Metodi per cespiti in analitica (come maiali nello spazio!?)
//------------------------------------------------------------ //------------------------------------------------------------
//ricava la % di utilizzo di un cespite in un esercizio, date cms/fase/cdc //ricava la % di utilizzo di un cespite in un esercizio, date cms/fase/cdc
real ceca_perc_util(const TString& cespite, const int anno, real ceca_percutil(const TString& idcespite, int anno,
const TString& cms, const TString& fase, const TString& cdc) const TString& cdc, const TString& cms, const TString& fase)
{ {
//controllo su date inizio e fine del periodo di utilizzo del cespite nell'esercizio selezionato TString query;
const TRectype& cespi = cache().get(LF_CESPI, cespite); query << "USE SALCECMS";
//const int codcat = cespi.get_int(CESPI_CODCAT); //se c'è almeno un filtro su cdc/cms/fase scatta la select analitica!
if (cdc.full() || cms.full() || fase.full())
TDate dtinies, dtfines;
TEsercizi_contabili esc;
esc.code2range(anno, dtinies, dtfines);
//controlli sulle date esercizio - cespite; il cespite potrebbe essere entrato in funzione..
//..o essere stato alienato durante l'esercizio selezionato
TDate dtfine = dtfines;
const TDate dtalien = cespi.get_date(CESPI_DTALIEN);
if (dtalien.ok() && (dtalien < dtfines))
dtfine = dtalien;
TDate dtini = dtinies;
const TDate dtfunz = cespi.get_date(CESPI_DTFUNZ);
if (dtfunz.ok() && (dtfunz > dtinies))
dtini = dtfunz;
//..a questo punto dtini e dtfine rappresentano il periodo di utilizzo del cespite
//nell'esercizio selezionato
//quindi il periodo di utilizzo del cespite nell'esercizio,in giorni,sara'...
const long delta_cesp = dtfine - dtini + 1;
//se il delta viene negativo il cespite è tutto nel passato o nel futuro, quindi la sua % di utilizzo..
//..sarà ZERO!!! e il calcolo si chiuderà qui!
if (delta_cesp <= 0)
return ZERO;
//token_string con le coppie cespite/anno, per poter avere poi le varie % di utilizzo di tale cespite,
//..in quell'anno, suddivise per cms/cdc/fase (stesso principio di funzionamento dei SALDANA)
TToken_string key;
key.add(cespite);
key.add(anno);
TRecord_array salcecms(key, LF_SALCECMS);
//ciclo su SALCECMS data una chiave cespite/anno (si fa solo se salcecms non e' vuoto,
//e' inutile perdere tempo..) alla ricerca di tutte le righe con gli ammortamenti di..
//..quel cespite in quell'anno sparsi su varie cdc/cms/fasi
real perc;
if (salcecms.rows() > 0)
{ {
// query << "\nSELECT ";
for (int i = 1; i <= salcecms.last_row(); i++) if (cdc.full())
{ query << "(BETWEEN(SALCECMS.CODCDC,#CODCDC,#CODCDC))&&";
if (cms.full() && cms != salcecms[i].get(SALCECMS_CODCMS)) if (cms.full())
continue; query << "(BETWEEN(SALCECMS.CODCMS,#CODCMS,#CODCMS))&&";
if (cdc.full() && cdc != salcecms[i].get(SALCECMS_CODCDC)) if (fase.full())
continue; query << "(BETWEEN(SALCECMS.CODFASE,#CODFASE,#CODFASE))&&";
if (fase.full() && fase != salcecms[i].get(SALCECMS_CODFASE)) query.rtrim(2);
continue;
perc += ceca_calc_perc_util_cesp(salcecms[i], dtini, dtfine);
}
} }
return perc; else //se non si è scelto alcun parametro analitico -> la percentuale è 100% comunque!
} return 1;
query << "\nFROM IDCESPITE=#IDCESPITE CODES=#CODES";
query << "\nTO IDCESPITE=#IDCESPITE CODES=#CODES";
real ceca_calc_perc_util_cesp(const TRectype& salcecms_rec, const TDate& dtinices, const TDate& dtfineces) TISAM_recordset recset(query);
{
//adeesso prende la percentuale di utilizzo del cespite nella commessa..
real percutil = salcecms_rec.get_real(SALCECMS_PERCUTIL);
//normalizza la percentuale...
percutil = percutil / CENTO;
//prende il codice commessa del record.. //in fase di settaggio variabili fa lo stesso ragionamento della select
TString80 codcms = salcecms_rec.get(SALCECMS_CODCMS); recset.set_var("#IDCESPITE", idcespite);
//..ed accede cosi' alla tabella delle commesse recset.set_var("#CODES", long(anno));
const TRectype& cms = cache().get(LF_COMMESSE, codcms); if (cdc.full())
//prende le date di inizio e fine commessa dalla tabella per poterle confrontare con le date limite recset.set_var("#CODCDC", cdc);
//del cespite nell'esercizio if (cms.full())
TDate dtfine = dtfineces; recset.set_var("#CODCMS", cms);
//se esiste una data di proroga (DATAPROR) -> la data fine commessa e' la data proroga,altrimenti e' if (fase.full())
//la normale data fine commessa (DATAFINE) recset.set_var("#CODFASE", fase);
TDate dtfinecms = cms.get_date(COMMESSE_DATAPROR);
if (!dtfinecms.ok())
dtfinecms = cms.get_date(COMMESSE_DATAFINE);
if (dtfinecms.ok() && (dtfinecms < dtfineces))
dtfine = dtfinecms;
TDate dtini = dtinices; const long items = recset.items();
const TDate dtinicms = cms.get_date(COMMESSE_DATAINIZIO);
if ((dtinicms.ok()) && (dtinicms > dtinices))
dtini = dtinicms;
//intervallo giorni di utilizzo cespite nella commessa
const real delta_cms = real(dtfine - dtini + 1) / real(dtfineces - dtinices + 1);
//...e la porta in giorni rispetto al totale di utilizzo dei giorni del cespite nell'esercizio real percutil = ZERO;
//(il 100% sono i giorni di utilizzo del cespite in tutte le commesse dell'esercizio) for (bool ok = recset.move_first(); ok; ok = recset.move_next())
percutil *= delta_cms; {
real perc = recset.get(SALCECMS_PERCUTIL).as_real();
percutil += perc;
}
percutil /= CENTO;
return percutil; return percutil;
} }

View File

@ -9,6 +9,8 @@
#include <automask.h> #include <automask.h>
#endif #endif
#include <recset.h>
class TDitta_cespiti class TDitta_cespiti
{ {
long _ditta; long _ditta;
@ -74,10 +76,7 @@ bool null_fields(const TRectype& rec, const char* fld0, const char* fld1, const
//Metodi da usare nei cespiti per analitica //Metodi da usare nei cespiti per analitica
//------------------------------------------- //-------------------------------------------
real ceca_perc_util(const TString& cespite, const int anno, real ceca_percutil(const TString& idcespite, int anno,
const TString& cms, const TString& fase, const TString& cdc); const TString& cdc, const TString& cms, const TString& fase);
real ceca_calc_perc_util_cesp(const TRectype& salcecms_rec,
const TDate& dtinices, const TDate& dtfineces);
#endif #endif