Migliorato calcolo inventario alla data

git-svn-id: svn://10.65.10.50/branches/R_10_00@22799 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2013-02-07 14:24:33 +00:00
parent d410a1fb99
commit eeabd564c9
3 changed files with 140 additions and 53 deletions

View File

@ -10,17 +10,22 @@
#include "mg1300a.h"
#include "../cg/cglib01.h"
#include "../mg/mag.h"
#include "../mg/movmag.h"
#include "../mg/rmovmag.h"
///////////////////////////////////////////////////////////
// TSaldodata_mask
///////////////////////////////////////////////////////////
class TSaldodata_mask : public TAutomask
{
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TSaldodata_mask() : TAutomask("mg1300a") {}
TSaldodata_mask();
};
bool TSaldodata_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
@ -37,19 +42,85 @@ bool TSaldodata_mask::on_field_event(TOperable_field& o, TField_event e, long jo
<< "\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);
TToken_string fields = "CODTAB[1,5]|CODTAB[6,25]|CODTAB[26,35]|S7|R0|R1|R2|D0|S6|I0|I1|I2|I3|I4|I5|S0";
TToken_string heads = HR("Mag+Dep|Articolo@20|Livello@10|UM|Giacenza@12V|Effettiva@12V|Fisica@12V|Data@10|Gr.Mer.|Gr.A|Cnt.A|Sott.A|Gr.V|Cnt.V|Sott.V|Descrizione@50");
if (!ini_get_bool(CONFIG_DITTA, "mg", "GESDEPOSITI"))
{
fields.add("CODTAB[1,3]", 0);
heads.add(HR("Mag"), 0);
}
if (!ini_get_bool(CONFIG_DITTA, "mg", "GESLIVGIAC"))
{
fields.destroy(2);
heads.destroy(2);
}
TCursor_sheet s(recset.cursor(), fields, TR("Situazione"), heads, 0, 1);
s.run();
}
return true;
}
TSaldodata_mask::TSaldodata_mask() : TAutomask("mg1300a")
{
const bool lg = ini_get_bool(CONFIG_DITTA, "mg", "GESLIVGIAC");
enable(F_USEDEP, lg);
}
///////////////////////////////////////////////////////////
// TSaldo_info
///////////////////////////////////////////////////////////
struct TSaldo_info : public TObject
{
real _giac;
real _giac_eff;
TString4 _um;
TString8 _grmerc;
TString80 _desc;
TBill _billa, _billv;
};
class TAssoc_saldi : public TAssoc_array
{
public:
TSaldo_info& info(const char* key);
};
TSaldo_info& TAssoc_saldi::info(const char* key)
{
TSaldo_info* i = (TSaldo_info*)objptr(key);
if (i == NULL)
{
i = new TSaldo_info;
TToken_string k(key);
const TFixed_string codart = k.get(1);
const TArticolo& art = cached_article(codart);
i->_desc = art.get(ANAMAG_DESCR);
i->_um = art.first_um();
i->_grmerc = art.get(ANAMAG_GRMERC);
i->_billa.set(art.get_int(ANAMAG_GRUPPOA), art.get_int(ANAMAG_CONTOA), art.get_long(ANAMAG_SOTTOCA));
i->_billv.set(art.get_int(ANAMAG_GRUPPOV), art.get_int(ANAMAG_CONTOV), art.get_long(ANAMAG_SOTTOCV));
add(key, i);
}
return *i;
}
///////////////////////////////////////////////////////////
// TSaldodata_app
///////////////////////////////////////////////////////////
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 init_saldi_iniziali(const TDate& data, bool use_dep,const TString& codmag, TAssoc_saldi& saldi);
void update_saldi(const TDate& data, bool use_dep, const TString& codmag, TAssoc_saldi& saldi);
void rebuild_saldi(const TDate& data, bool use_dep, const TString& codmag);
public:
@ -82,41 +153,46 @@ void TSaldodata_app::reset_saldi(const TDate& data, const TString& codmag)
}
}
void TSaldodata_app::init_saldi_iniziali(const TDate& data, bool use_dep, const TString& codmag, TAssoc_array& saldi)
void TSaldodata_app::init_saldi_iniziali(const TDate& data, bool use_dep, const TString& codmag, TAssoc_saldi& 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())
TEsercizi_contabili esc;
const TDate chiusura = esc.esercizio(data).chiusura_mag();
if (!chiusura.ok())
{
if (!pi.addstatus(1))
break;
const real g = recset.get(MAG_GIAC).as_real();
if (!g.is_zero())
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())
{
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;
if (!pi.addstatus(1))
break;
const real giac = recset.get(MAG_GIAC).as_real();
const real cl = recset.get(MAG_INCL).as_real() - recset.get(MAG_ACL).as_real();
if (!giac.is_zero() || !cl.is_zero())
{
key = recset.get(MAG_CODMAG).as_string();
if (key.empty()) key.spaces(5);
if (!use_dep) key.cut(3);
key.add(recset.get(MAG_CODART).as_string());
key.add(recset.get(MAG_LIVELLO).as_string());
TSaldo_info& info = saldi.info(key);
info._giac += giac;
info._giac_eff += giac - cl;
}
}
}
}
void TSaldodata_app::update_saldi(const TDate& data, bool use_dep, const TString& mag, TAssoc_array& saldi)
void TSaldodata_app::update_saldi(const TDate& data, bool use_dep, const TString& mag, TAssoc_saldi& saldi)
{
TString query;
query << "USE MOVMAG KEY 2 SELECT BETWEEN(DATAREG,0," << data.date2ansi() << ')'
@ -140,10 +216,13 @@ void TSaldodata_app::update_saldi(const TDate& data, bool use_dep, const TString
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())
const int sgn_giac = caus.sgn(s_giac);
const int sgn_icl = caus.sgn(s_incl);
const int sgn_acl = caus.sgn(s_acl);
if ((sgn_giac != 0 || sgn_icl != 0 || sgn_acl != 0) && caus.update_qta())
{
TString8 codmag = recset.get(RMOVMAG_CODMAG).as_string();
if (codmag.empty()) codmag.spaces(5);
if (!use_dep) codmag.cut(3);
if (mag.full() && codmag != mag)
continue;
@ -157,16 +236,11 @@ void TSaldodata_app::update_saldi(const TDate& data, bool use_dep, const TString
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;
TSaldo_info& info = saldi.info(key);
info._giac += qta * sgn_giac;
info._giac_eff += qta * sgn_giac;
info._giac_eff += qta * sgn_icl;
info._giac_eff += qta * sgn_acl;
}
}
}
@ -174,7 +248,7 @@ void TSaldodata_app::update_saldi(const TDate& data, bool use_dep, const TString
void TSaldodata_app::rebuild_saldi(const TDate& data, bool use_dep, const TString& codmag)
{
TAssoc_array saldi;
TAssoc_saldi saldi;
init_saldi_iniziali(data, use_dep, codmag, saldi);
update_saldi(data, use_dep, codmag, saldi);
@ -203,7 +277,19 @@ void TSaldodata_app::rebuild_saldi(const TDate& data, bool use_dep, const TStrin
mag.put("CODTAB", codtab);
mag.write();
}
mag.put("R0", *(real*)obj);
const TSaldo_info& info = *(const TSaldo_info*)obj;
mag.put("S0", info._desc);
mag.put("R0", info._giac);
mag.put("R1", info._giac_eff);
mag.put("S6", info._grmerc);
mag.put("S7", info._um);
mag.put("I0", info._billa.gruppo());
mag.put("I1", info._billa.conto());
mag.put("I2", info._billa.sottoconto());
mag.put("I3", info._billv.gruppo());
mag.put("I4", info._billv.conto());
mag.put("I5", info._billv.sottoconto());
mag.put("D0", data);
if (mag.rewrite() != NOERR)
{

View File

@ -1457,15 +1457,16 @@ void TArticolo_giacenza::put_costo_standard(const real& costo)
}
// calcola la giacenza corretta dai campi Conto Lavoro e Produzione
real TArticolo_giacenza::giacenza_corretta(const TRectype& rec,bool giac_eff,bool valorizza_componenti) const
real TArticolo_giacenza::giacenza_corretta(const TRectype& rec, bool giac_eff, bool valorizza_componenti) const
{
CHECK(rec.num() == LF_MAG, "Il record passato deve essere di LF_MAG");
CHECK(rec.num() == LF_MAG, "Record non su LF_MAG");
real giacenza(rec.get_real(MAG_GIAC));
if (giac_eff)
{
giacenza -= rec.get_real(MAG_INCL);
giacenza += rec.get_real(MAG_ACL);
giacenza += valorizza_componenti ? ZERO : (rec.get_real(MAG_PRODFIN)-rec.get_real(MAG_PRODCOMP));
if (!valorizza_componenti)
giacenza += rec.get_real(MAG_PRODFIN)-rec.get_real(MAG_PRODCOMP);
}
return giacenza;
}
@ -1483,7 +1484,7 @@ real TArticolo_giacenza::giacenza_anno(const char* codmag, const char* livello,
{
const TRectype& rec = rmag.row(i);
if (!rec.get(MAG_CODMAG).empty())
giac += rec.get_real("GIAC");
giac += rec.get_real(MAG_GIAC);
}
return giac;
}
@ -1614,7 +1615,7 @@ void TArticolo_giacenza_data::al(const TDate& data, const char* codmag, const ch
const TString& codart = rmovmag.get(RMOVMAG_CODART);
if (codart == codice() && datacomp >= inizio && datacomp <= data)
{
const TString16 codmag = rmovmag.get(RMOVMAG_CODMAG);
const TString8 codmag = rmovmag.get(RMOVMAG_CODMAG);
const TString16 livello = rmovmag.get(RMOVMAG_LIVGIAC);
const long nreg = rmovmag.get_int(RMOVMAG_NUMREG);
const int nrig = rmovmag.get_int(RMOVMAG_NRIG);

View File

@ -835,7 +835,7 @@ void TMov_mag::update_balances_clifo(TRectype & clifomagrec, const TSaldo_mag_cl
void TMov_mag::update_balances(TRectype& magrec, int numrig, bool plus)
{
const TRectype & rec = body()[numrig];
const TRectype& rec = body()[numrig];
TSaldo_mag saldo(*this, rec);
const TCausale_magazzino& caus = cached_causale_magazzino(saldo.codcaus());
TArticolo& art = articolo(numrig);