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
const bool exclude_aliens = msk.get_bool(F_EXCLUDE_ALIENS);
const bool anal = dongle().active(CAAUT);
TString query = "USE CESPI\nSELECT ";
query << "(ANSI(DTCOMP)<=#DATAFINE)"; //" << msk.get_date(F_DATAFINE).date2ansi() << ")";
query << "(ANSI(DTCOMP)<=#DATAFINE)";
//cespiti alienati esclusi?
if (exclude_aliens)
query << "&&((DTALIEN='')||(ANSI(DTALIEN)>=#DATAINIZIO))"; // << msk.get_date(F_DATAINIZIO).date2ansi() << "))";
query << "&&((DTALIEN='')||(ANSI(DTALIEN)>=#DATAINIZIO))";
//categorie
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
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 << "&&(BETWEEN(SALCECMS.CODCMS,#DACODCMS,#ACODCMS))";
query << "&&(BETWEEN(SALCECMS.CODFASE,#DACODFASE,#ACODFASE))";
query << "&&";
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";
}
@ -158,18 +169,13 @@ void TStampa_sintetica_recordset::set_filter(const TStampa_sintetica_mask& msk)
if (exclude_aliens)
set_var("#DATAINIZIO", msk.get_date(F_DATAINIZIO).date2ansi());
if (anal)
{
const TString& codcdc = msk.get(F_CODCDC);
set_var("#DACODCDC", codcdc);
set_var("#ACODCDC", codcdc);
const TString& codcms = msk.get(F_CODCMS);
set_var("#DACODCMS", codcms);
set_var("#ACODCMS", codcms);
const TString& codfase = msk.get(F_CODFASE);
set_var("#DACODFASE", codfase);
set_var("#ACODFASE", codfase);
}
//set var condizionali in analitica
if (codcdc.full())
set_var("#CODCDC", codcdc);
if (codcms.full())
set_var("#CODCMS", codcms);
if (codfase.full())
set_var("#CODFASE", codfase);
}
@ -183,14 +189,31 @@ class TStampa_sintetica_rep : public TReport
int _group_codimp, _group_codloc;
TString _codcdc, _codcms, _codfase;
TCespite _cespite;
real _percutil;
TString16 _cespi_percutil;
protected:
real val_amm(const TRectype& rec_saldi) const;
virtual bool get_usr_val(const TString& name, TVariant& var) const;
real perc_util() const;
public:
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)
{
_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;
}
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 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();
if (anno_acq == _anno)
{
valamm = val_amm(_cespite.sal_pro());
}
}
if (!valamm.is_zero())
{
@ -304,34 +365,7 @@ bool TStampa_sintetica_rep::get_usr_val(const TString& name, TVariant& var) cons
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
{
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);
return true;
}
if (name == "#CESSELIM") //cessioni elminiazioni
{
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_QPPRIVATE) + rec_movam.get_real(MOVAM_FPRIVATO);
}
cesselim *= perc_util();
var = cesselim;
return true;
}

View File

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

View File

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

View File

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

View File

@ -231,6 +231,7 @@ END
STRING S_DESFASE 50 37
BEGIN
PROMPT 35 3 ""
FLAGS "D"
END
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!?)
//------------------------------------------------------------
//ricava la % di utilizzo di un cespite in un esercizio, date cms/fase/cdc
real ceca_perc_util(const TString& cespite, const int anno,
const TString& cms, const TString& fase, const TString& cdc)
real ceca_percutil(const TString& idcespite, int anno,
const TString& cdc, const TString& cms, const TString& fase)
{
//controllo su date inizio e fine del periodo di utilizzo del cespite nell'esercizio selezionato
const TRectype& cespi = cache().get(LF_CESPI, cespite);
//const int codcat = cespi.get_int(CESPI_CODCAT);
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)
TString query;
query << "USE SALCECMS";
//se c'è almeno un filtro su cdc/cms/fase scatta la select analitica!
if (cdc.full() || cms.full() || fase.full())
{
//
for (int i = 1; i <= salcecms.last_row(); i++)
{
if (cms.full() && cms != salcecms[i].get(SALCECMS_CODCMS))
continue;
if (cdc.full() && cdc != salcecms[i].get(SALCECMS_CODCDC))
continue;
if (fase.full() && fase != salcecms[i].get(SALCECMS_CODFASE))
continue;
perc += ceca_calc_perc_util_cesp(salcecms[i], dtini, dtfine);
}
query << "\nSELECT ";
if (cdc.full())
query << "(BETWEEN(SALCECMS.CODCDC,#CODCDC,#CODCDC))&&";
if (cms.full())
query << "(BETWEEN(SALCECMS.CODCMS,#CODCMS,#CODCMS))&&";
if (fase.full())
query << "(BETWEEN(SALCECMS.CODFASE,#CODFASE,#CODFASE))&&";
query.rtrim(2);
}
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)
{
//adeesso prende la percentuale di utilizzo del cespite nella commessa..
real percutil = salcecms_rec.get_real(SALCECMS_PERCUTIL);
//normalizza la percentuale...
percutil = percutil / CENTO;
TISAM_recordset recset(query);
//prende il codice commessa del record..
TString80 codcms = salcecms_rec.get(SALCECMS_CODCMS);
//..ed accede cosi' alla tabella delle commesse
const TRectype& cms = cache().get(LF_COMMESSE, codcms);
//prende le date di inizio e fine commessa dalla tabella per poterle confrontare con le date limite
//del cespite nell'esercizio
TDate dtfine = dtfineces;
//se esiste una data di proroga (DATAPROR) -> la data fine commessa e' la data proroga,altrimenti e'
//la normale data fine commessa (DATAFINE)
TDate dtfinecms = cms.get_date(COMMESSE_DATAPROR);
if (!dtfinecms.ok())
dtfinecms = cms.get_date(COMMESSE_DATAFINE);
if (dtfinecms.ok() && (dtfinecms < dtfineces))
dtfine = dtfinecms;
//in fase di settaggio variabili fa lo stesso ragionamento della select
recset.set_var("#IDCESPITE", idcespite);
recset.set_var("#CODES", long(anno));
if (cdc.full())
recset.set_var("#CODCDC", cdc);
if (cms.full())
recset.set_var("#CODCMS", cms);
if (fase.full())
recset.set_var("#CODFASE", fase);
TDate dtini = dtinices;
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);
const long items = recset.items();
//...e la porta in giorni rispetto al totale di utilizzo dei giorni del cespite nell'esercizio
//(il 100% sono i giorni di utilizzo del cespite in tutte le commesse dell'esercizio)
percutil *= delta_cms;
real percutil = ZERO;
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{
real perc = recset.get(SALCECMS_PERCUTIL).as_real();
percutil += perc;
}
percutil /= CENTO;
return percutil;
}

View File

@ -9,6 +9,8 @@
#include <automask.h>
#endif
#include <recset.h>
class TDitta_cespiti
{
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
//-------------------------------------------
real ceca_perc_util(const TString& cespite, const int anno,
const TString& cms, const TString& fase, const TString& cdc);
real ceca_calc_perc_util_cesp(const TRectype& salcecms_rec,
const TDate& dtinices, const TDate& dtfineces);
real ceca_percutil(const TString& idcespite, int anno,
const TString& cdc, const TString& cms, const TString& fase);
#endif