Patch level :10.0 374

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :modificato il ricalcolo saldi analitico; adesso, scegliendo un anno, è in grado di stabilire da quale anno partire per il ricalcolo saldi in modo da includere tutti i movimenti che per qualche motivo hanno a che fare con quell'anno


git-svn-id: svn://10.65.10.50/trunk@19113 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2009-07-15 14:40:58 +00:00
parent 9e8bad6ed9
commit 749cdab39c
4 changed files with 83 additions and 62 deletions

View File

@ -1,8 +1,6 @@
#include <applicat.h>
#include <automask.h>
#include <progind.h>
#include <recarray.h>
#include <relation.h>
#include <recset.h>
#include "calib01.h"
#include "ca2.h"
@ -20,13 +18,56 @@
class TRic_saldi_msk : public TAutomask
{
protected:
virtual bool on_field_event(TOperable_field& o, TField_event fe, long jolly) { return true; }
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TRic_saldi_msk();
virtual ~TRic_saldi_msk(){};
};
bool TRic_saldi_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
{
case F_ANNO:
if (e == fe_init || e == fe_modify)
{
//in base all'esercizio selezionato dall'utonto, questo magico programma cerca quale è il movimento con data..
//..competenza più antica che interessa l'esercizio selezionato (ricordiamo che i movimenti possono avere..
//..durata pluriennale, da istruzioni adolfiche) ed esegue dall'esercizio contenente tale data il ricalcolo..
//..dei saldi (Silvan non sei nessuno!)
const int selected_anno = atoi(o.get());
TEsercizi_contabili esc;
TDate datainiesc, datafinesc;
esc.code2range(selected_anno, datainiesc, datafinesc);
TString query;
query << "USE MOVANA\nSELECT (BETWEEN(DATAFCOMP,#DATAINIESC,0))||(AUTOFCOMP==\"X\")";
TISAM_recordset recset(query);
recset.set_var("#DATAINIESC", datainiesc);
TDate datacomp = datainiesc;
const long recset_items = recset.items();
TProgind pi(recset_items, "Ricerca movimenti che interessano l'esercizio selezionato...", true, true);
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{
if (!pi.addstatus(1))
break;
const TDate curr_date = recset.get(MOVANA_DATACOMP).as_date();
if (curr_date < datacomp)
datacomp = curr_date;
}
const int first_anno = esc.date2esc(datacomp);
set(F_FIRST_ANNO, first_anno);
}
break;
default:
break;
}
return true;
}
TRic_saldi_msk::TRic_saldi_msk() :TAutomask ("ca2300a") { }
///////////////////////////////////////////////////////////
@ -83,7 +124,7 @@ protected:
virtual bool destroy();
virtual void main_loop();
static bool elabora_movimento(const TRelation& rel, void* pJolly) { return true; }
static bool remove_saldo(const TRelation& rel, void* pJolly);
bool remove_saldi(const int first_anno);
public:
TRic_saldi_app() {}
@ -102,24 +143,22 @@ bool TRic_saldi_app::destroy()
return TSkeleton_application::destroy();
}
bool TRic_saldi_app::remove_saldo(const TRelation& rel, void* pJolly)
{
const int anno = *(int*)pJolly;
TRectype& rec = rel.curr();
const int curr_anno = rec.get_int(SALDANA_ANNO);
//azzeratore dei saldi anno corrente
if (curr_anno == anno)
((TRelation &)rel).remove();
else //azzeratore dei preventivi/variazioni di altri anni
bool TRic_saldi_app::remove_saldi(const int first_anno)
{
//deve azzerare i saldi a partire dal primo anno di interesse
TString query;
query << "USE SALDANA\nFROM ANNO=#ANNO";
TISAM_recordset recset(query);
recset.set_var("#ANNO", long(first_anno));
const long recset_items = recset.items();
TProgind pi(recset_items, "Azzeramento saldi...", true, true);
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{
const real saldop = rec.get_real(SALDANA_SALDOP);
const real saldov = rec.get_real(SALDANA_SALDOV);
if (!saldop.is_zero() || !saldov.is_zero())
{
rec.zero(SALDANA_SALDOP);
rec.zero(SALDANA_SALDOV);
((TRelation&)rel).rewrite();
}
if (!pi.addstatus(1))
break;
recset.cursor()->file().remove();
}
return true;
}
@ -133,51 +172,26 @@ void TRic_saldi_app::main_loop()
//2 Azzeramento e ricalcolo dei saldi dei movimenti di tipo preventivo o variazione per TUTTI gli esercizi..
//..questo perche' i movimenti P e T possono essere "spalmati" su piu' anni
//AZZERAMENTO dei saldi normali e temporanei dell'anno selezionato, preventivi e variazione di tutti..
//..gli esercizi che trova
const int anno = _mask->get_int(F_ANNO);
TRelation rel_saldi(LF_SALDANA);
//AZZERAMENTO dei saldi
const int first_anno = _mask->get_int(F_FIRST_ANNO);
remove_saldi(first_anno);
TCursor cur_saldi(&rel_saldi);
const long items_saldi = cur_saldi.items();
cur_saldi.scan(remove_saldo, (void*)&anno, "Azzeramento saldi...");
//FASE 1
//ricostruzione dei saldi normali e temporanei dell'anno selezionato
//RICOSTRUZIONE saldi (eventualmente spammati su piu' anni)
TEsercizi_contabili esc;
const TDate datainies = esc[anno].inizio();
const TDate datafines = esc[anno].fine();
const TDate datainies = esc[first_anno].inizio();
TRelation rel_movana(LF_MOVANA);
TRectype darec(LF_MOVANA), arec(LF_MOVANA);
TRectype darec(LF_MOVANA);
darec.put(MOVANA_DATACOMP, datainies);
arec.put(MOVANA_DATACOMP, datafines);
TString filter = "(TIPOMOV=='')||(TIPOMOV=='T')";
TCursor cur_movana(&rel_movana, filter, 2, &darec, &arec);
TCursor cur_movana(&rel_movana, "", 2, &darec);
const long items = cur_movana.items();
//usa la scan dei TCursor,quindi niente progind e for,x' gia' nel metodo
if (items > 0)
{
TAnal_mov_ric* amr = new TAnal_mov_ric;
amr->set_annoes(anno);
rel_movana.lfile().set_curr(amr); //il record principale della rel e' un TMov_anal!!
cur_movana.scan(elabora_movimento, this, "Ricostruzione saldi consuntivi e temporanei...");
rel_movana.lfile().set_curr(new TRectype(LF_MOVANA)); //il record principale della rel e' un TMov_anal!!
}
//FASE 2
//ricostruzione saldi di preventivo spammati su piu' anni
filter = "(TIPOMOV='P')||(TIPOMOV='V')";
TCursor cur_movana_prev(&rel_movana, filter);
const long preventivi_items = cur_movana_prev.items();
if (preventivi_items > 0)
if (items > 0)
{
TAnal_mov_ric* amr = new TAnal_mov_ric;
amr->set_annoes(0);
rel_movana.lfile().set_curr(amr); //il record principale della rel e' un TMov_anal!!
cur_movana_prev.scan(elabora_movimento, this, "Ricostruzione saldi preventivi...");
cur_movana.scan(elabora_movimento, this, "Ricostruzione saldi...");
rel_movana.lfile().set_curr(new TRectype(LF_MOVANA)); //il record principale della rel e' un TMov_anal!!
}
}

View File

@ -1 +1,2 @@
#define F_ANNO 101
#define F_ANNO 101
#define F_FIRST_ANNO 102

View File

@ -20,12 +20,12 @@ END
TEXT DLG_NULL
BEGIN
PROMPT 3 4 "tempo. Siate certi di voler proseguire."
PROMPT 2 4 "tempo. Siate certi di voler proseguire."
END
NUMBER F_ANNO 4
BEGIN
PROMPT 3 6 "Codice esercizio "
PROMPT 3 6 "Esercizio da ricalcolare "
USE ESC
INPUT CODTAB F_ANNO
DISPLAY "Codice Esercizio" CODTAB
@ -34,11 +34,17 @@ BEGIN
OUTPUT F_ANNO CODTAB
CHECKTYPE REQUIRED
FLAGS "Z"
HELP "Codice esercizio per il quale si desidera il ricalcolo dei saldi"
HELP "Codice esercizio dal quale si desidera parta il ricalcolo dei saldi"
WARNING "Il codice esercizio e' obbligatorio"
ADD RUN cg0 -5 esc
END
NUMBER F_FIRST_ANNO 4
BEGIN
PROMPT 3 7 "Primo esercizio interessato "
FLAGS "D"
END
ENDPAGE
ENDMASK

View File

@ -313,10 +313,10 @@ MESSAGE RESET,169
</postscript>
</field>
</section>
<section type="Foot" level="3" height="2">
<section type="Foot" level="3" height="2.5">
<font italic="1" face="Arial Narrow" bold="1" size="8" />
<field border="1" x="2" y="0.25" type="Linea" width="169" height="0" pattern="1" />
<field x="1" y="0.5" type="Array" width="40" pattern="1">
<field x="1" y="0.5" type="Array" width="25" height="2" pattern="1">
<source>H3.101</source>
<list>
<li Value="TOTALI Commesse avviate in esercizi precedenti" Code="0" />