campo-sirio/mg/mg1300.cpp
guy 844e3440ee Iniziato calcolo inventario alla data
git-svn-id: svn://10.65.10.50/branches/R_10_00@22792 c028cbd2-c16b-5b4b-a496-9718f37d4682
2013-01-30 17:00:01 +00:00

236 lines
6.3 KiB
C++

#include <applicat.h>
#include <automask.h>
#include <progind.h>
#include <recarray.h>
#include <relation.h>
#include <recset.h>
#include <toolfld.h>
#include "mglib.h"
#include "mg1300a.h"
#include "../mg/mag.h"
#include "../mg/movmag.h"
#include "../mg/rmovmag.h"
class TSaldodata_mask : public TAutomask
{
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TSaldodata_mask() : TAutomask("mg1300a") {}
};
bool TSaldodata_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
if (e == fe_button && o.dlg() == DLG_PREVIEW)
{
TString query;
query = "USE &MAG";
const TString& codmag = get(get_bool(F_USEDEP) ? F_DEP : F_MAG);
if (codmag.full())
{
query << "\nFROM CODTAB=" << codmag
<< "\nTO CODTAB=" << codmag;
}
TISAM_recordset recset(query);
TCursor_sheet s(recset.cursor(), "CODTAB[1,5]|CODTAB[6,25]|CODTAB[26,35]|R0|R1|D0", TR("Situazione"),
HR("Mag+Dep|Articolo@20|Livello@10|Giacenza@12V|Fisico@12V|Data@10"), 0, 1);
s.run();
}
return true;
}
class TSaldodata_app : public TSkeleton_application
{
protected:
void reset_saldi(const TDate& data, const TString& codmag);
void init_saldi_iniziali(const TDate& data, bool use_dep,const TString& codmag, TAssoc_array& saldi);
void update_saldi(const TDate& data, bool use_dep, const TString& codmag, TAssoc_array& saldi);
void rebuild_saldi(const TDate& data, bool use_dep, const TString& codmag);
public:
virtual void main_loop();
};
void TSaldodata_app::reset_saldi(const TDate& data, const TString& codmag)
{
TFast_isamfile mag(LF_TABMOD);
TString query;
query = "USE &MAG";
if (codmag.full())
{
query << "\nFROM CODTAB=" << codmag
<< "\nTO CODTAB=" << codmag;
}
TISAM_recordset recset(query);
TProgind pi(recset.items(), TR("Azzeramento"));
TRectype& rec = recset.cursor()->curr();
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{
if (!pi.addstatus(1))
break;
rec.zero("R0");
rec.zero("R1");
rec.put("D0", data);
rec.rewrite(mag);
}
}
void TSaldodata_app::init_saldi_iniziali(const TDate& data, bool use_dep, const TString& codmag, TAssoc_array& saldi)
{
TString limit;
limit << " ANNOES=" << (data.year()-1);
if (codmag.full())
limit << " CODMAG=" << codmag;
TString query;
query << "USE " << LF_MAG << " KEY 2"
<< "\nFROM" << limit << "\nTO" << limit;
TISAM_recordset recset(query);
TToken_string key;
TProgind pi(recset.items(), TR("Saldi iniziali"));
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{
if (!pi.addstatus(1))
break;
const real g = recset.get(MAG_GIAC).as_real();
if (!g.is_zero())
{
key = recset.get(MAG_CODMAG).as_string();
if (!use_dep) key.cut(3);
key.add(recset.get(MAG_CODART).as_string());
key.add(recset.get(MAG_LIVELLO).as_string());
real* giac = (real*)saldi.objptr(key);
if (giac == NULL)
saldi.add(key, g);
else
*giac += g;
}
}
}
void TSaldodata_app::update_saldi(const TDate& data, bool use_dep, const TString& mag, TAssoc_array& saldi)
{
TString query;
query << "USE MOVMAG KEY 2 SELECT BETWEEN(DATAREG,0," << data.date2ansi() << ')'
<< "\nFROM ANNOES=" << data.year()
<< "\nTO ANNOES=" << data.year();
TISAM_recordset recset(query);
TProgind pi(recset.items(), TR("Scansione movimenti"));
TToken_string key;
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{
if (!pi.addstatus(1))
break;
const TString8 hcaus = recset.get(MOVMAG_CODCAUS).as_string();
key = recset.get(MOVMAG_NUMREG).as_string();
TRecord_array righe(key, LF_RMOVMAG);
for (int i = righe.last_row(); i > 0; i = righe.pred_row(i))
{
real qta = recset.get(RMOVMAG_QUANT).as_real();
if (qta.is_zero())
continue;
const TString& rcaus = recset.get(RMOVMAG_CODCAUS).as_string();
const TCausale_magazzino& caus = cached_causale_magazzino(rcaus.full() ? rcaus : hcaus);
const int sgn = caus.sgn(s_giac);
if (sgn != 0 && caus.update_qta())
{
TString8 codmag = recset.get(RMOVMAG_CODMAG).as_string();
if (!use_dep) codmag.cut(3);
if (mag.full() && codmag != mag)
continue;
const TString80 codart = recset.get(RMOVMAG_CODART).as_string();
const TString4 um = recset.get(RMOVMAG_UM).as_string();
TArticolo& art = cached_article(codart);
qta = art.convert_to_um(qta, EMPTY_STRING, um);
key = codmag;
key.add(codart);
key.add(recset.get(RMOVMAG_LIVGIAC).as_string());
real* giac = (real*)saldi.objptr(key);
if (giac == NULL)
{
giac = new real;
saldi.add(key, giac);
}
if (sgn > 0)
*giac += qta;
else
*giac -= qta;
}
}
}
}
void TSaldodata_app::rebuild_saldi(const TDate& data, bool use_dep, const TString& codmag)
{
TAssoc_array saldi;
init_saldi_iniziali(data, use_dep, codmag, saldi);
update_saldi(data, use_dep, codmag, saldi);
TFast_isamfile mag(LF_TABMOD);
TToken_string k;
TString80 codtab;
TProgind pi(saldi.items(), TR("Salvataggio inventario"));
FOR_EACH_ASSOC_OBJECT(saldi, hash, key, obj)
{
if (!pi.addstatus(1))
break;
k = key;
codtab.format("%-5s%-20s", k.get(0), k.get(1));
const char* liv = k.get(2);
if (liv && *liv > ' ')
codtab << liv;
mag.put("MOD", "MG");
mag.put("COD", "MAG");
mag.put("CODTAB", codtab);
if (mag.read() != NOERR)
{
mag.zero();
mag.put("MOD", "MG");
mag.put("COD", "MAG");
mag.put("CODTAB", codtab);
mag.write();
}
mag.put("R0", *(real*)obj);
mag.put("D0", data);
if (mag.rewrite() != NOERR)
{
cantwrite_box("inventario alla data");
break;
}
}
}
void TSaldodata_app::main_loop()
{
TSaldodata_mask m;
while (m.run()==K_ENTER)
{
const TDate al = m.get(F_DATA);
const bool use_dep = m.get_bool(F_USEDEP);
const TString& mag = m.get(use_dep ? F_DEP : F_MAG);
reset_saldi(al, mag);
rebuild_saldi(al, use_dep, mag);
}
}
int mg1300(int argc, char* argv[])
{
TSaldodata_app a;
a.run(argc, argv, TR("Giacenza alla data"));
return 0;
}