1997-08-18 14:20:21 +00:00
|
|
|
#include <applicat.h>
|
|
|
|
#include <progind.h>
|
|
|
|
|
|
|
|
#include "sv2.h"
|
|
|
|
#include "svlib01.h"
|
|
|
|
#include "sv2100a.h"
|
|
|
|
|
|
|
|
#include "svriep.h"
|
|
|
|
|
2000-05-05 15:25:49 +00:00
|
|
|
class TRicalcolo_stats : public TSkeleton_application
|
1997-08-18 14:20:21 +00:00
|
|
|
{
|
|
|
|
TStats_agg _agg;
|
2003-09-12 14:31:37 +00:00
|
|
|
static TDate _datamin;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
void calcola_data_minima();
|
1997-08-18 14:20:21 +00:00
|
|
|
|
|
|
|
protected:
|
2000-05-05 15:25:49 +00:00
|
|
|
virtual void main_loop();
|
1997-08-18 14:20:21 +00:00
|
|
|
virtual bool create();
|
|
|
|
virtual void on_config_change();
|
|
|
|
|
|
|
|
public:
|
2001-04-30 15:10:48 +00:00
|
|
|
static bool datein_handler(TMask_field& f, KEY k);
|
1997-08-18 14:20:21 +00:00
|
|
|
bool kill_stats(const TDate& dfr, const TDate& dto);
|
|
|
|
void calc_stats(const TDate& dfr, const TDate& dto);
|
|
|
|
};
|
|
|
|
|
2003-09-12 14:31:37 +00:00
|
|
|
TDate TRicalcolo_stats::_datamin;
|
|
|
|
|
1997-08-18 14:20:21 +00:00
|
|
|
bool TRicalcolo_stats::create()
|
|
|
|
{
|
|
|
|
open_files(LF_TABCOM, 0); // File comuni
|
|
|
|
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_SVRIEP, 0); // File statistiche
|
|
|
|
|
2000-05-05 15:25:49 +00:00
|
|
|
return TSkeleton_application::create();
|
1997-08-18 14:20:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void TRicalcolo_stats::on_config_change()
|
|
|
|
{
|
|
|
|
_agg.init();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TRicalcolo_stats::kill_stats(const TDate& dfr, const TDate& dto)
|
|
|
|
{
|
2011-10-31 11:40:02 +00:00
|
|
|
TFast_isamfile fdoc(LF_SVRIEP);
|
|
|
|
TRelation rel(LF_SVRIEP);
|
1997-08-18 14:20:21 +00:00
|
|
|
TRectype recfrom(LF_SVRIEP), recto(LF_SVRIEP);
|
|
|
|
|
|
|
|
if (dfr.ok())
|
|
|
|
{
|
|
|
|
recfrom.put(SVR_ANNO, dfr.year());
|
|
|
|
recfrom.put(SVR_PERIODO, _agg.date2period(dfr));
|
|
|
|
}
|
|
|
|
if (dto.ok())
|
|
|
|
{
|
|
|
|
recto.put(SVR_ANNO, dto.year());
|
|
|
|
recto.put(SVR_PERIODO, _agg.date2period(dto));
|
|
|
|
}
|
|
|
|
|
|
|
|
TCursor cur(&rel, "", 1, &recfrom, &recto);
|
|
|
|
const long items = cur.items();
|
2011-10-31 11:40:02 +00:00
|
|
|
TProgind pi(items, TR("Azzeramento statistiche"), false, true);
|
1997-08-18 14:20:21 +00:00
|
|
|
cur.freeze();
|
|
|
|
|
|
|
|
for (cur = 0; cur.pos() < items; ++cur)
|
|
|
|
{
|
|
|
|
pi.addstatus(1);
|
2003-05-29 08:05:53 +00:00
|
|
|
const int err = rel.remove();
|
1997-08-18 14:20:21 +00:00
|
|
|
if (err != NOERR)
|
2003-05-29 08:05:53 +00:00
|
|
|
{
|
|
|
|
error_box(FR("Errore %d durante l'azzeramento archivi"), err);
|
2011-10-31 11:40:02 +00:00
|
|
|
return false;
|
2003-05-29 08:05:53 +00:00
|
|
|
}
|
1997-08-18 14:20:21 +00:00
|
|
|
}
|
|
|
|
|
2011-10-31 11:40:02 +00:00
|
|
|
return true;
|
1997-08-18 14:20:21 +00:00
|
|
|
}
|
|
|
|
|
2003-09-12 14:31:37 +00:00
|
|
|
void TRicalcolo_stats::calcola_data_minima()
|
|
|
|
{
|
|
|
|
TWait_cursor hourglass;
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
1997-09-19 09:54:48 +00:00
|
|
|
|
1997-08-18 14:20:21 +00:00
|
|
|
void TRicalcolo_stats::calc_stats(const TDate& dfr, const TDate& dto)
|
|
|
|
{
|
2011-10-31 11:40:02 +00:00
|
|
|
TFast_isamfile fdoc(LF_DOC);
|
|
|
|
|
1997-08-18 14:20:21 +00:00
|
|
|
TRectype recfrom(LF_DOC), recto(LF_DOC);
|
2000-05-05 15:25:49 +00:00
|
|
|
if (dfr.ok())
|
2003-05-29 08:05:53 +00:00
|
|
|
{
|
2000-05-05 15:25:49 +00:00
|
|
|
recfrom.put(DOC_DATADOC, dfr);
|
2003-05-29 08:05:53 +00:00
|
|
|
recfrom.put(DOC_PROVV, "D");
|
|
|
|
}
|
1997-08-18 14:20:21 +00:00
|
|
|
if (dto.ok())
|
2003-05-29 08:05:53 +00:00
|
|
|
{
|
1997-08-18 14:20:21 +00:00
|
|
|
recto.put(DOC_DATADOC, dto);
|
2003-05-29 08:05:53 +00:00
|
|
|
recto.put(DOC_PROVV, "D");
|
|
|
|
}
|
1997-08-18 14:20:21 +00:00
|
|
|
|
|
|
|
TRelation rel(LF_DOC);
|
2011-10-31 11:40:02 +00:00
|
|
|
const TRectype& curr = rel.curr();
|
|
|
|
|
1997-08-18 14:20:21 +00:00
|
|
|
TCursor cur(&rel, "PROVV='D'", 3, &recfrom, &recto);
|
|
|
|
const long items = cur.items();
|
2000-05-05 15:25:49 +00:00
|
|
|
cur.freeze();
|
|
|
|
|
2012-12-04 16:47:00 +00:00
|
|
|
TString msg; msg << TR("Ricalcolo statistiche");
|
|
|
|
if (dfr.ok())
|
|
|
|
msg << TR(" dal ") << dfr;
|
|
|
|
if (dto.ok())
|
|
|
|
msg << TR(" al ") << dto;
|
|
|
|
TProgind pi(items, msg, false, true);
|
2011-10-31 11:40:02 +00:00
|
|
|
|
1997-08-18 14:20:21 +00:00
|
|
|
long records = 0;
|
|
|
|
_agg.reset();
|
|
|
|
|
|
|
|
for (cur = 0; cur.pos() < items; ++cur)
|
|
|
|
{
|
|
|
|
pi.addstatus(1);
|
|
|
|
|
2011-10-31 11:40:02 +00:00
|
|
|
const TTipo_documento& tipodoc = cached_tipodoc(curr.get(DOC_TIPODOC));
|
1997-08-18 14:20:21 +00:00
|
|
|
if (!tipodoc.statistiche())
|
|
|
|
continue;
|
2011-10-31 11:40:02 +00:00
|
|
|
|
|
|
|
const TDocumento doc(rel.curr());
|
|
|
|
|
2000-05-05 15:25:49 +00:00
|
|
|
const bool nota_cr = tipodoc.nota_credito();
|
1997-12-16 14:10:05 +00:00
|
|
|
for (int r = doc.physical_rows(); r > 0; r--)
|
1997-08-18 14:20:21 +00:00
|
|
|
{
|
|
|
|
const TRiga_documento& rdoc = doc[r];
|
1999-04-06 15:34:39 +00:00
|
|
|
if (nota_cr)
|
|
|
|
_agg.sub(rdoc);
|
|
|
|
else
|
|
|
|
_agg.add(rdoc);
|
1997-08-18 14:20:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
records++;
|
|
|
|
if (records % 1000 == 0)
|
|
|
|
_agg.update();
|
|
|
|
}
|
|
|
|
_agg.update();
|
1997-10-31 16:51:04 +00:00
|
|
|
if (_agg.empty())
|
2003-05-29 08:05:53 +00:00
|
|
|
warning_box(TR("L'archivio riepilogativo delle statistiche ora ricalcolato risulta vuoto"));
|
1997-08-18 14:20:21 +00:00
|
|
|
}
|
|
|
|
|
2001-04-30 15:10:48 +00:00
|
|
|
bool TRicalcolo_stats::datein_handler(TMask_field& f, KEY k)
|
|
|
|
{
|
|
|
|
if (f.to_check(k))
|
|
|
|
{
|
2003-09-12 14:31:37 +00:00
|
|
|
const TDate inizio = f.get();
|
|
|
|
if (inizio < _datamin)
|
|
|
|
return f.error_box(FR("Impossibile effettuare la ricostruzione statistiche\nad una data antecedente il %s"), _datamin.string());
|
2001-04-30 15:10:48 +00:00
|
|
|
}
|
2011-10-31 11:40:02 +00:00
|
|
|
return true;
|
2001-04-30 15:10:48 +00:00
|
|
|
}
|
1997-09-19 09:54:48 +00:00
|
|
|
|
2000-05-05 15:25:49 +00:00
|
|
|
void TRicalcolo_stats::main_loop()
|
1997-08-18 14:20:21 +00:00
|
|
|
{
|
2003-09-12 14:31:37 +00:00
|
|
|
calcola_data_minima();
|
|
|
|
|
2012-12-04 16:47:00 +00:00
|
|
|
if (argc() >= 3 && _stricmp(argv(2), "-A") == 0)
|
1997-08-18 14:20:21 +00:00
|
|
|
{
|
2012-12-04 16:47:00 +00:00
|
|
|
const TDate dto(TODAY);
|
|
|
|
TDate dfr = dto;
|
|
|
|
dfr.set_day(1);
|
|
|
|
dfr.addmonth(-12);
|
|
|
|
if (dfr < _datamin)
|
|
|
|
dfr = _datamin;
|
1997-08-18 14:20:21 +00:00
|
|
|
if (kill_stats(dfr, dto))
|
|
|
|
calc_stats(dfr, dto);
|
|
|
|
}
|
2012-12-04 16:47:00 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
TMask m("sv2100a");
|
|
|
|
m.set_handler(F_FROMDATE, datein_handler);
|
|
|
|
m.set(F_FROMDATE, _datamin);
|
|
|
|
|
|
|
|
while (m.run() == K_ENTER)
|
|
|
|
{
|
|
|
|
const TDate dfr(m.get(F_FROMDATE));
|
|
|
|
const TDate dto(m.get(F_TODATE));
|
|
|
|
if (kill_stats(dfr, dto))
|
|
|
|
calc_stats(dfr, dto);
|
|
|
|
}
|
|
|
|
}
|
1997-08-18 14:20:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int sv2100(int argc, char* argv[])
|
|
|
|
{
|
|
|
|
TRicalcolo_stats app;
|
2004-09-24 20:41:12 +00:00
|
|
|
app.run(argc, argv, TR("Ricalcolo statistiche"));
|
1997-08-18 14:20:21 +00:00
|
|
|
return 0;
|
|
|
|
}
|