#include #include #include #include #include #include #include #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; }