Eliminato ricalcolo statistiche in tempo reale. Ora solo batch.
git-svn-id: svn://10.65.10.50/branches/R_10_00@23145 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
2138f9839e
commit
6c31e4ce6a
219
sv/sv2100.cpp
219
sv/sv2100.cpp
@ -9,11 +9,10 @@
|
|||||||
|
|
||||||
class TRicalcolo_stats : public TSkeleton_application
|
class TRicalcolo_stats : public TSkeleton_application
|
||||||
{
|
{
|
||||||
TStats_agg _agg;
|
static TStats_agg _agg;
|
||||||
static TDate _datamin;
|
static TAssoc_array _tipi_doc;
|
||||||
|
static TDate _datalast;
|
||||||
protected:
|
static bool tipi_stat_filter(const TRelation* r);
|
||||||
void calcola_data_minima();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void main_loop();
|
virtual void main_loop();
|
||||||
@ -22,18 +21,20 @@ protected:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
static bool datein_handler(TMask_field& f, KEY k);
|
static bool datein_handler(TMask_field& f, KEY k);
|
||||||
|
static bool datefin_handler(TMask_field& f, KEY k);
|
||||||
bool kill_stats(const TDate& dfr, const TDate& dto);
|
bool kill_stats(const TDate& dfr, const TDate& dto);
|
||||||
void calc_stats(const TDate& dfr, const TDate& dto);
|
void calc_stats(const TDate& dfr, const TDate& dto);
|
||||||
};
|
};
|
||||||
|
|
||||||
TDate TRicalcolo_stats::_datamin;
|
TStats_agg TRicalcolo_stats::_agg;
|
||||||
|
TDate TRicalcolo_stats::_datalast;
|
||||||
|
TAssoc_array TRicalcolo_stats::_tipi_doc;
|
||||||
|
|
||||||
bool TRicalcolo_stats::create()
|
bool TRicalcolo_stats::create()
|
||||||
{
|
{
|
||||||
open_files(LF_TABCOM, 0); // File comuni
|
open_files(LF_TABCOM, 0); // File comuni
|
||||||
open_files(LF_TAB, LF_CLIFO, LF_OCCAS, 0); // File ditta
|
open_files(LF_TAB, LF_CLIFO, LF_OCCAS, 0); // File ditta
|
||||||
open_files(LF_CFVEN, LF_DOC, LF_RIGHEDOC, 0); // File vendite
|
open_files(LF_CFVEN, LF_DOC, LF_RIGHEDOC, 0); // File vendite
|
||||||
open_files(LF_SVRIEP, 0); // File statistiche
|
|
||||||
|
|
||||||
return TSkeleton_application::create();
|
return TSkeleton_application::create();
|
||||||
}
|
}
|
||||||
@ -41,6 +42,51 @@ bool TRicalcolo_stats::create()
|
|||||||
void TRicalcolo_stats::on_config_change()
|
void TRicalcolo_stats::on_config_change()
|
||||||
{
|
{
|
||||||
_agg.init();
|
_agg.init();
|
||||||
|
|
||||||
|
TWait_cursor hourglass;
|
||||||
|
|
||||||
|
TISAM_recordset tip("USE %TIP");
|
||||||
|
const TRectype& rec_tip = tip.cursor()->curr();
|
||||||
|
for (bool ok = tip.move_first(); ok; ok = tip.move_next())
|
||||||
|
{
|
||||||
|
if (rec_tip.get_bool("B2")) // E' un tipo per le statistiche
|
||||||
|
_tipi_doc.add(rec_tip.get("CODTAB"), NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
TDate datamin = TDate(TODAY); datamin.set_day(1); datamin.set_month(1);
|
||||||
|
|
||||||
|
TISAM_recordset doc("USE DOC KEY 3");
|
||||||
|
const TRectype& rec_doc = doc.cursor()->curr();
|
||||||
|
for (bool ok = doc.move_first(); ok; ok = doc.move_next())
|
||||||
|
{
|
||||||
|
const TString& tipodoc = rec_doc.get(DOC_TIPODOC);
|
||||||
|
if (_tipi_doc.is_key(tipodoc))
|
||||||
|
{
|
||||||
|
TDate dd = rec_doc.get(DOC_DATADOC);
|
||||||
|
if (dd.ok())
|
||||||
|
{
|
||||||
|
datamin = floor(dd, _agg.frequency());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const int anno = rec_doc.get_int(DOC_ANNO);
|
||||||
|
if (anno > 1900)
|
||||||
|
{
|
||||||
|
datamin = TDate(1, 1, anno);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_datalast = ini_get_string(CONFIG_DITTA, "sv", "UltimoCalcolo");
|
||||||
|
if (_datalast < datamin)
|
||||||
|
{
|
||||||
|
_datalast = datamin;
|
||||||
|
--_datalast;
|
||||||
|
}
|
||||||
|
ceil(_datalast, _agg.frequency());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TRicalcolo_stats::kill_stats(const TDate& dfr, const TDate& dto)
|
bool TRicalcolo_stats::kill_stats(const TDate& dfr, const TDate& dto)
|
||||||
@ -62,56 +108,23 @@ bool TRicalcolo_stats::kill_stats(const TDate& dfr, const TDate& dto)
|
|||||||
|
|
||||||
TCursor cur(&rel, "", 1, &recfrom, &recto);
|
TCursor cur(&rel, "", 1, &recfrom, &recto);
|
||||||
const long items = cur.items();
|
const long items = cur.items();
|
||||||
TProgind pi(items, TR("Azzeramento statistiche"), false, true);
|
TProgress_monitor pi(items, TR("Azzeramento statistiche"), false);
|
||||||
cur.freeze();
|
cur.freeze();
|
||||||
|
|
||||||
for (cur = 0; cur.pos() < items; ++cur)
|
for (cur = 0; cur.pos() < items; ++cur)
|
||||||
{
|
{
|
||||||
pi.addstatus(1);
|
pi.add_status();
|
||||||
const int err = rel.remove();
|
const int err = rel.remove();
|
||||||
if (err != NOERR)
|
if (err != NOERR)
|
||||||
{
|
return error_box(FR("Errore %d durante l'azzeramento archivi"), err);
|
||||||
error_box(FR("Errore %d durante l'azzeramento archivi"), err);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TRicalcolo_stats::calcola_data_minima()
|
bool TRicalcolo_stats::tipi_stat_filter(const TRelation* r)
|
||||||
{
|
{
|
||||||
TWait_cursor hourglass;
|
return _tipi_doc.is_key(r->curr().get(DOC_TIPODOC));
|
||||||
|
|
||||||
TAssoc_array tipi_doc;
|
|
||||||
|
|
||||||
TRelation rel_tip("%TIP");
|
|
||||||
TCursor cur_tip(&rel_tip);
|
|
||||||
const TRecnotype items_tip = cur_tip.items();
|
|
||||||
cur_tip.freeze();
|
|
||||||
for (cur_tip = 0L; cur_tip.pos() < items_tip; ++cur_tip)
|
|
||||||
{
|
|
||||||
const TRectype& rec_tip = rel_tip.curr();
|
|
||||||
if (rec_tip.get_bool("B2")) // E' un tipo per le statistiche
|
|
||||||
tipi_doc.add(rec_tip.get("CODTAB"), NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
TRelation rel_doc(LF_DOC);
|
|
||||||
TCursor cur_doc(&rel_doc, "", 3);
|
|
||||||
const TRectype& rec_doc = rel_doc.curr();
|
|
||||||
const TRecnotype items_doc = cur_doc.items();
|
|
||||||
cur_doc.freeze();
|
|
||||||
|
|
||||||
for (cur_doc = 0L; cur_doc.pos() < items_doc; ++cur_doc)
|
|
||||||
{
|
|
||||||
const TString& tipodoc = rec_doc.get(DOC_TIPODOC);
|
|
||||||
if (tipi_doc.is_key(tipodoc))
|
|
||||||
{
|
|
||||||
_datamin = rec_doc.get(DOC_DATADOC);
|
|
||||||
_datamin.set_day(1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TRicalcolo_stats::calc_stats(const TDate& dfr, const TDate& dto)
|
void TRicalcolo_stats::calc_stats(const TDate& dfr, const TDate& dto)
|
||||||
@ -131,45 +144,52 @@ void TRicalcolo_stats::calc_stats(const TDate& dfr, const TDate& dto)
|
|||||||
}
|
}
|
||||||
|
|
||||||
TRelation rel(LF_DOC);
|
TRelation rel(LF_DOC);
|
||||||
const TRectype& curr = rel.curr();
|
|
||||||
|
|
||||||
TCursor cur(&rel, "PROVV='D'", 3, &recfrom, &recto);
|
TCursor cur(&rel, "PROVV='D'", 3, &recfrom, &recto);
|
||||||
const long items = cur.items();
|
cur.set_filterfunction(tipi_stat_filter);
|
||||||
|
|
||||||
|
TRecnotype items = 0;
|
||||||
|
{
|
||||||
|
TProgress_monitor pi(1, TR("Selezione documenti"), false);
|
||||||
|
items = cur.items();
|
||||||
|
}
|
||||||
cur.freeze();
|
cur.freeze();
|
||||||
|
|
||||||
TString msg; msg << TR("Ricalcolo statistiche");
|
TString msg; msg << TR("Ricalcolo");
|
||||||
if (dfr.ok())
|
if (dfr.ok())
|
||||||
msg << TR(" dal ") << dfr;
|
msg << TR(" dal ") << dfr;
|
||||||
if (dto.ok())
|
if (dto.ok())
|
||||||
msg << TR(" al ") << dto;
|
msg << TR(" al ") << dto;
|
||||||
TProgind pi(items, msg, false, true);
|
TProgress_monitor pi(items, msg, false);
|
||||||
|
|
||||||
long records = 0;
|
TRecnotype records = 0;
|
||||||
_agg.reset();
|
_agg.reset();
|
||||||
|
const TRectype& curr = rel.curr();
|
||||||
|
|
||||||
for (cur = 0; cur.pos() < items; ++cur)
|
for (cur = 0; cur.pos() < items; ++cur)
|
||||||
{
|
{
|
||||||
pi.addstatus(1);
|
pi.add_status();
|
||||||
|
const TString& tipodoc = curr.get(DOC_TIPODOC);
|
||||||
const TTipo_documento& tipodoc = cached_tipodoc(curr.get(DOC_TIPODOC));
|
if (!_tipi_doc.is_key(tipodoc))
|
||||||
if (!tipodoc.statistiche())
|
continue; // Dovrebbe già essere filtrato
|
||||||
continue;
|
|
||||||
|
|
||||||
const TDocumento doc(rel.curr());
|
const TDocumento doc(rel.curr());
|
||||||
|
const bool nota_cr = doc.tipo().nota_credito();
|
||||||
const bool nota_cr = tipodoc.nota_credito();
|
FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc)
|
||||||
for (int r = doc.physical_rows(); r > 0; r--)
|
|
||||||
{
|
{
|
||||||
const TRiga_documento& rdoc = doc[r];
|
|
||||||
if (nota_cr)
|
if (nota_cr)
|
||||||
_agg.sub(rdoc);
|
_agg.sub(*rdoc);
|
||||||
else
|
else
|
||||||
_agg.add(rdoc);
|
_agg.add(*rdoc);
|
||||||
}
|
}
|
||||||
|
|
||||||
records++;
|
records++;
|
||||||
if (records % 1000 == 0)
|
if (records % 1000 == 0)
|
||||||
|
{
|
||||||
_agg.update();
|
_agg.update();
|
||||||
|
TString m; m << msg << '\n' << records << TR(" documenti elaborati");
|
||||||
|
pi.set_text(m);
|
||||||
|
xvt_app_process_pending_events();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_agg.update();
|
_agg.update();
|
||||||
if (_agg.empty())
|
if (_agg.empty())
|
||||||
@ -180,25 +200,59 @@ bool TRicalcolo_stats::datein_handler(TMask_field& f, KEY k)
|
|||||||
{
|
{
|
||||||
if (f.to_check(k))
|
if (f.to_check(k))
|
||||||
{
|
{
|
||||||
const TDate inizio = f.get();
|
const TMask& m = f.mask();
|
||||||
if (inizio < _datamin)
|
const bool def = m.get_bool(F_DEFINITIVE);
|
||||||
return f.error_box(FR("Impossibile effettuare la ricostruzione statistiche\nad una data antecedente il %s"), _datamin.string());
|
|
||||||
|
const TDate data = f.get();
|
||||||
|
TDate inizio = data; floor(inizio, _agg.frequency());
|
||||||
|
if (data != inizio)
|
||||||
|
f.set(inizio.string());
|
||||||
|
|
||||||
|
TDate consiglio = _datalast; ++consiglio;
|
||||||
|
if (def)
|
||||||
|
{
|
||||||
|
if (inizio > consiglio)
|
||||||
|
return f.error_box(FR("Impossibile effettuare la ricostruzione statistiche\nda una data successiva al %s"), consiglio.stringa());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (inizio < consiglio)
|
||||||
|
return f.error_box(FR("Impossibile effettuare la ricostruzione statistiche\nda una data antecedente il %s"), consiglio.stringa());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TRicalcolo_stats::datefin_handler(TMask_field& f, KEY k)
|
||||||
|
{
|
||||||
|
if (f.to_check(k))
|
||||||
|
{
|
||||||
|
const TMask& m = f.mask();
|
||||||
|
const TDate inizio = m.get_bool(F_FROMDATE);
|
||||||
|
const TDate data = f.get();
|
||||||
|
TDate fine = data; ceil(fine, _agg.frequency());
|
||||||
|
if (data != fine)
|
||||||
|
f.set(fine.string());
|
||||||
|
|
||||||
|
if (fine <= inizio)
|
||||||
|
return f.error_box(FR("Impossibile effettuare la ricostruzione statistiche\nfino ad una data antecedente il %s"), inizio.stringa());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void TRicalcolo_stats::main_loop()
|
void TRicalcolo_stats::main_loop()
|
||||||
{
|
{
|
||||||
calcola_data_minima();
|
if (argc() >= 3 && xvt_str_same(argv(2), "-A"))
|
||||||
|
|
||||||
if (argc() >= 3 && _stricmp(argv(2), "-A") == 0)
|
|
||||||
{
|
{
|
||||||
const TDate dto(TODAY);
|
TDate dto(TODAY); ceil(dto, _agg.frequency());
|
||||||
TDate dfr = dto;
|
TDate dfr = dto; floor(dfr, _agg.frequency());
|
||||||
dfr.set_day(1);
|
|
||||||
dfr.addmonth(-12);
|
dfr.addmonth(-12);
|
||||||
if (dfr < _datamin)
|
if (dfr <= _datalast)
|
||||||
dfr = _datamin;
|
{
|
||||||
|
dfr = _datalast;
|
||||||
|
++dfr;
|
||||||
|
}
|
||||||
if (kill_stats(dfr, dto))
|
if (kill_stats(dfr, dto))
|
||||||
calc_stats(dfr, dto);
|
calc_stats(dfr, dto);
|
||||||
}
|
}
|
||||||
@ -206,14 +260,27 @@ void TRicalcolo_stats::main_loop()
|
|||||||
{
|
{
|
||||||
TMask m("sv2100a");
|
TMask m("sv2100a");
|
||||||
m.set_handler(F_FROMDATE, datein_handler);
|
m.set_handler(F_FROMDATE, datein_handler);
|
||||||
m.set(F_FROMDATE, _datamin);
|
m.set_handler(F_TODATE, datefin_handler);
|
||||||
|
if (_datalast.ok())
|
||||||
|
{
|
||||||
|
TDate fd = _datalast; ++fd;
|
||||||
|
m.set(F_FROMDATE, fd);
|
||||||
|
m.set(F_LASTDATE, _datalast);
|
||||||
|
}
|
||||||
|
|
||||||
while (m.run() == K_ENTER)
|
while (m.run() == K_ENTER)
|
||||||
{
|
{
|
||||||
|
const bool def = m.get_bool(F_DEFINITIVE);
|
||||||
const TDate dfr(m.get(F_FROMDATE));
|
const TDate dfr(m.get(F_FROMDATE));
|
||||||
const TDate dto(m.get(F_TODATE));
|
const TDate dto(m.get(F_TODATE));
|
||||||
if (kill_stats(dfr, dto))
|
if (kill_stats(dfr, def ? TDate() : dto))
|
||||||
calc_stats(dfr, dto);
|
calc_stats(dfr, dto);
|
||||||
|
if (def)
|
||||||
|
{
|
||||||
|
_datalast = dto.ok() ? dto : TDate(TODAY);
|
||||||
|
ini_set_string(CONFIG_DITTA, "sv", "UltimoCalcolo", _datalast);
|
||||||
|
m.set(F_LASTDATE, _datalast);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __SV2100A_H
|
#ifndef __SV2100A_H
|
||||||
#define __SV2100A_H
|
#define __SV2100A_H
|
||||||
|
|
||||||
#define F_FROMDATE 101
|
#define F_FROMDATE 101
|
||||||
#define F_TODATE 102
|
#define F_TODATE 102
|
||||||
|
|
||||||
|
#define F_DEFINITIVE 103
|
||||||
|
#define F_LASTDATE 104
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,10 +1,6 @@
|
|||||||
#include "sv2100a.h"
|
#include "sv2100a.h"
|
||||||
|
|
||||||
TOOLBAR "topbar" 0 0 0 2
|
PAGE "Ricalcolo statistiche" -1 -1 28 6
|
||||||
#include <stdbar.h>
|
|
||||||
ENDPAGE
|
|
||||||
|
|
||||||
PAGE "Ricalcolo statistiche" -1 -1 30 6
|
|
||||||
|
|
||||||
DATE F_FROMDATE
|
DATE F_FROMDATE
|
||||||
BEGIN
|
BEGIN
|
||||||
@ -17,6 +13,23 @@ BEGIN
|
|||||||
PROMPT 1 2 "Alla data "
|
PROMPT 1 2 "Alla data "
|
||||||
END
|
END
|
||||||
|
|
||||||
|
BOOLEAN F_DEFINITIVE
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 4 "Calcolo definitivo"
|
||||||
|
MESSAGE FALSE NORMAL,F_TODATE
|
||||||
|
MESSAGE TRUE REQUIRED,F_TODATE
|
||||||
|
END
|
||||||
|
|
||||||
|
DATE F_LASTDATE
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 5 "Ultimo "
|
||||||
|
FLAGS "D"
|
||||||
|
END
|
||||||
|
|
||||||
|
ENDPAGE
|
||||||
|
|
||||||
|
TOOLBAR "topbar" 0 0 0 2
|
||||||
|
#include <elabar.h>
|
||||||
ENDPAGE
|
ENDPAGE
|
||||||
|
|
||||||
ENDMASK
|
ENDMASK
|
Loading…
x
Reference in New Issue
Block a user