git-svn-id: svn://10.65.10.50/branches/R_10_00@22792 c028cbd2-c16b-5b4b-a496-9718f37d4682
236 lines
6.3 KiB
C++
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;
|
|
}
|
|
|