diff --git a/mg/mg1300.cpp b/mg/mg1300.cpp index 58680b6f2..93d20c290 100644 --- a/mg/mg1300.cpp +++ b/mg/mg1300.cpp @@ -15,6 +15,8 @@ #include "../mg/movmag.h" #include "../mg/rmovmag.h" +#include "rdoc.h" + /////////////////////////////////////////////////////////// // TSaldodata_mask /////////////////////////////////////////////////////////// @@ -22,6 +24,9 @@ class TSaldodata_mask : public TAutomask { protected: + void preview(bool zero_giac); + void load_physical(); + void save_movmag(); virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); public: @@ -33,42 +38,62 @@ static bool reset_cb(const TRelation& rel, void* pJolly) return rel.file().remove() == NOERR; } +void TSaldodata_mask::preview(bool zero_giac) +{ + TString query; + query = "USE &MAG"; + + if (zero_giac) + query << "\nSELECT (S7=\"\")"; + + 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); + + 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(); +} bool TSaldodata_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) { + case F_DATA: + if (e == fe_init || e == fe_modify) + { + const TDate d(o.get()); + int anno = d.year(); + if (d.month() < 10) + anno--; + set(F_ANNO, anno); + set(F_DATACOMP, TDate(31,12,anno)); + } + break; case DLG_PREVIEW: if (e == fe_button) - { - 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); - - 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(); - } + preview(false); + break; + case DLG_FINDREC: + if (e == fe_button) + preview(true); break; case DLG_DELREC: if (e == fe_button && noyes_box(TR("Si desiderano azzerare tutte le giacenze alla data?"))) @@ -78,6 +103,14 @@ bool TSaldodata_mask::on_field_event(TOperable_field& o, TField_event e, long jo return false; // Otherwise quits! } break; + case DLG_SAVEREC: + if (e == fe_button && check_fields() && yesno_box(TR("Si desiderano caricare le giacenza fisiche?"))) + load_physical(); + break; + case DLG_NEXTREC: + if (e == fe_button && check_fields() && yesno_box(TR("Si desiderano generare i movimenti di magazzino?"))) + save_movmag(); + break; default: break; } @@ -132,6 +165,158 @@ TSaldo_info& TAssoc_saldi::info(const char* key) return *i; } +void TSaldodata_mask::load_physical() +{ + const int anno = get_int(F_ANNO); + const TString& codnum = get(F_CODNUM); + const TString& dacod = get(F_ARTINI); + const TString& acod = get(F_ARTFIN); + TString query; + query << "USE RDOC SELECT (CODARTMAG!=\"\")"; + if (dacod.full() || acod.full()) + query << "&&(BETWEEN(CODARTMAG,\"" << dacod << "\",\"" << acod << "\"))"; + query << "\nFROM PROVV=D ANNO=" << anno << " CODNUM=" << codnum; + query << "\nTO PROVV=D ANNO=" << anno << " CODNUM=" << codnum; + + TAssoc_array saldi; + TISAM_recordset docs(query); + if (!docs.empty()) + { + TProgind pi(docs.items(), TR("Scansione rilevazioni inventariali")); + const TRectype& rec = docs.cursor()->curr(); + TString80 key; + for (bool ok = docs.move_first(); ok; ok = docs.move_next()) + { + if (!pi.addstatus(1)) + break; + + const TString& codmag = rec.get(RDOC_CODMAG); + const TString& codart = rec.get(RDOC_CODARTMAG); + const TString& livgiac = rec.get(RDOC_LIVELLO); + if (codmag.empty() || codart.empty()) + continue; + key.format("%-5s%-20s%s", (const char*)codmag, (const char*)codart, (const char*)livgiac); + real* p = (real*)saldi.objptr(key); + if (p == NULL) + { + p = new real; + saldi.add(key, p); + } + *p += rec.get_real(RDOC_QTA); + } + } + + if (!saldi.empty()) + { + const TDate oggi(TODAY); + TProgind pi(saldi.items(), TR("Aggiornamento giacenza fisica")); + TFast_isamfile mag(LF_TABMOD); + FOR_EACH_ASSOC_OBJECT(saldi, h, k, o) + { + if (!pi.addstatus(1)) + break; + mag.put("MOD", "MG"); + mag.put("COD", "MAG"); + mag.put("CODTAB", k); + int err = mag.read(_isequal, _lock); + if (err != NOERR) + { + mag.zero(); + mag.put("MOD", "MG"); + mag.put("COD", "MAG"); + mag.put("CODTAB", k); + mag.put("R2", *(real*)o); + mag.put("S0", TR("Articolo senza giacenza")); + mag.put("D0", oggi); + err = mag.write(); + } + else + { + mag.put("R2", *(real*)o); + err = mag.rewrite(); + } + } + } +} + +void TSaldodata_mask::save_movmag() +{ + const TDate data_comp = get(F_DATACOMP); + + TLocalisamfile f(LF_MOVMAG); + const bool giac_eff = get_int(F_GIAC) != 0; + + const int max_rows = 400; + int nmov = 0; + + TMov_mag* mm = NULL; + + const bool use_dep = get_bool(F_USEDEP); + const TString& codmag = get(use_dep ? F_DEP : F_MAG); + + TString query; + query = "USE &MAG"; + if (codmag.full()) + { + query << "\nFROM CODTAB=" << codmag + << "\nTO CODTAB=" << codmag; + } + + TISAM_recordset mag(query); + TProgind pi(mag.items(), TR("Generazione movimenti")); + + TString8 last_mag; + + for (bool ok = mag.move_first(); ok; ok = mag.move_next()) + { + if (!pi.addstatus(1)) + break; + + TString8 curr_mag = mag.get("CODTAB").as_string().left(3); + curr_mag.cut(3); + + if (mm == NULL || mm->rows() >= max_rows || curr_mag != last_mag) + { + last_mag = curr_mag; + if (mm) + { + nmov += mm->write(f) == NOERR; + delete mm; + } + mm = new TMov_mag; + mm->put(MOVMAG_ANNOES, get(F_ANNO)); + mm->put(MOVMAG_CODCAUS, get(F_CAUSALE)); + mm->put(MOVMAG_DATAREG, data_comp); + mm->put(MOVMAG_DATACOMP, data_comp); + mm->put(MOVMAG_CODCAUS, get(F_CAUSALE)); + mm->put(MOVMAG_DESCR, TR("Differenze inventariali")); + } + + real diff = mag.get("R2").as_real(); + diff -= mag.get(giac_eff ? "R1" : "R0").as_real(); + if (!diff.is_zero()) + { + TRectype& rmovmag = mm->new_row(); + const TString& codtab = mag.get("CODTAB").as_string(); + rmovmag.put(RMOVMAG_CODMAG, codtab.left(5)); + rmovmag.put(RMOVMAG_CODART, codtab.mid(5, 20)); + rmovmag.put(RMOVMAG_LIVGIAC,codtab.mid(25)); + rmovmag.put(RMOVMAG_UM, mag.get("S1").as_string()); + rmovmag.put(RMOVMAG_QUANT, diff); + } + } + + if (mm) + { + if (mm->rows() > 0) + nmov += mm->write(f) == NOERR; + delete mm; + mm = NULL; + } + + message_box(FR("Sono stati generati %d movimenti"), nmov); +} + /////////////////////////////////////////////////////////// // TSaldodata_app /////////////////////////////////////////////////////////// @@ -140,9 +325,10 @@ 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_saldi& saldi); + void init_saldi_iniziali(const TDate& data, bool use_dep,const TString& codmag, + const TString& dacod, const TString& acod, 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); + void rebuild_saldi(const TDate& data, bool use_dep, const TString& codmag, const TString& dacod, const TString& acod); public: virtual void main_loop(); @@ -174,7 +360,8 @@ 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_saldi& saldi) +void TSaldodata_app::init_saldi_iniziali(const TDate& data, bool use_dep, const TString& codmag, + const TString& dacod, const TString& acod, TAssoc_saldi& saldi) { TEsercizi_contabili esc; const int esercizio_corrente = esc.date2esc(data); @@ -188,13 +375,15 @@ void TSaldodata_app::init_saldi_iniziali(const TDate& data, bool use_dep, const if (precedente_aperto) // Esercizio aperto { TString limit; - limit << " ANNOES=" << (data.year()-1); + limit << "ANNOES=" << (data.year()-1); if (codmag.full()) limit << " CODMAG=" << codmag; + limit << " CODART="; TString query; query << "USE " << LF_MAG << " KEY 2" - << "\nFROM" << limit << "\nTO" << limit; + << "\nFROM " << limit << dacod + << "\nTO " << limit << acod; TISAM_recordset recset(query); TToken_string key; @@ -275,10 +464,11 @@ 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) +void TSaldodata_app::rebuild_saldi(const TDate& data, bool use_dep, const TString& codmag, + const TString& dacod, const TString& acod) { TAssoc_saldi saldi; - init_saldi_iniziali(data, use_dep, codmag, saldi); + init_saldi_iniziali(data, use_dep, codmag, dacod, acod, saldi); update_saldi(data, use_dep, codmag, saldi); TFast_isamfile mag(LF_TABMOD); @@ -336,8 +526,10 @@ void TSaldodata_app::main_loop() 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); + const TString& dacod = m.get(F_ARTINI); + const TString& acod = m.get(F_ARTFIN); reset_saldi(al, mag); - rebuild_saldi(al, use_dep, mag); + rebuild_saldi(al, use_dep, mag, dacod, acod); } } diff --git a/mg/mg1300a.h b/mg/mg1300a.h index 4dbd924c1..a55bd7eac 100644 --- a/mg/mg1300a.h +++ b/mg/mg1300a.h @@ -1,4 +1,13 @@ -#define F_DATA 101 -#define F_USEDEP 102 -#define F_MAG 103 -#define F_DEP 104 +#define F_DATA 101 +#define F_USEDEP 102 +#define F_MAG 103 +#define F_DEP 104 +#define F_ARTINI 105 +#define F_ARTFIN 106 + +#define F_ANNO 111 +#define F_CODNUM 112 + +#define F_CAUSALE 121 +#define F_GIAC 122 +#define F_DATACOMP 123 diff --git a/mg/mg1300a.uml b/mg/mg1300a.uml index 0e01f6dfe..d4f9d4d4f 100644 --- a/mg/mg1300a.uml +++ b/mg/mg1300a.uml @@ -1,23 +1,80 @@ #include "mg1300a.h" -PAGE "Giacenza alla data" -1 -1 46 3 +TOOLBAR "topbar" 0 0 0 2 + +BUTTON DLG_PREVIEW 2 2 +BEGIN + PROMPT 1 1 "Situazione" + PICTURE TOOL_PREVIEW +END + +BUTTON DLG_FINDREC 2 2 +BEGIN + PROMPT 1 1 "No Giacenza" + PICTURE TOOL_PREVIEW +END + +BUTTON DLG_NULL 2 2 +BEGIN + PROMPT 1 1 "" +END + +BUTTON DLG_OK 2 2 +BEGIN + PROMPT 1 1 "Giacenza" + PICTURE TOOL_ELABORA +END + +BUTTON DLG_SAVEREC 2 2 +BEGIN + PROMPT 1 1 "Fisica" + PICTURE TOOL_ELABORA +END + +BUTTON DLG_NEXTREC 2 2 +BEGIN + PROMPT 1 1 "Movimento" + PICTURE TOOL_ELABORA +END + +BUTTON DLG_NULL 2 2 +BEGIN + PROMPT 1 1 "" +END + +BUTTON DLG_DELREC 2 2 +BEGIN + PROMPT 1 1 "Azzera" + PICTURE TOOL_DELREC +END + +#include + +ENDPAGE + +PAGE "Giacenza alla data" -1 -1 64 8 + +GROUPBOX DLG_NULL 45 7 +BEGIN + PROMPT 1 0 "@bGiacenza alla data" +END DATE F_DATA BEGIN - PROMPT 1 0 "Data " + PROMPT 2 1 "Data " FLAGS "A" END BOOLEAN F_USEDEP BEGIN - PROMPT 1 1 "Suddivisione per deposito" + PROMPT 2 2 "Suddivisione per deposito" MESSAGE FALSE HIDE,F_DEP|SHOW,F_MAG MESSAGE TRUE HIDE,F_MAG|SHOW,F_DEP END STRING F_MAG 3 BEGIN - PROMPT 1 2 "Magazzino " + PROMPT 2 3 "Magazzino " USE MAG SELECT CODTAB[4,4]='' INPUT CODTAB F_MAG DISPLAY "Codice" CODTAB @@ -29,7 +86,7 @@ END STRING F_DEP 5 BEGIN - PROMPT 1 2 "Deposito " + PROMPT 2 3 "Deposito " USE MAG SELECT CODTAB[4,4]!='' INPUT CODTAB F_DEP COPY DISPLAY F_MAG @@ -39,26 +96,81 @@ BEGIN HELP "Elabora tutti i depositi se vuoto" END -ENDPAGE - -TOOLBAR "topbar" 0 0 0 2 - -BUTTON DLG_PREVIEW 2 2 +STRING F_ARTINI 20 BEGIN - PROMPT 1 1 "Situazione" - PICTURE TOOL_PREVIEW + PROMPT 2 4 "Dall'articolo " + USE LF_ANAMAG + INPUT CODART F_ARTINI + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_ARTINI CODART + CHECKTYPE SEARCH END -BUTTON DLG_DELREC 2 2 +STRING F_ARTFIN 20 BEGIN - PROMPT 1 1 "Azzera" - PICTURE TOOL_DELREC + PROMPT 2 5 "All'articolo " + COPY USE F_ARTINI + INPUT CODART F_ARTFIN + COPY DISPLAY F_ARTINI + OUTPUT F_ARTFIN CODART + CHECKTYPE SEARCH END -#include +GROUPBOX DLG_NULL 45 3 +BEGIN + PROMPT 1 7 "@bGiacenza fisica" +END + +NUMBER F_ANNO 4 +BEGIN + PROMPT 2 8 "Anno " + CHECKTYPE REQUIRED +END + +STRING F_CODNUM 4 +BEGIN + PROMPT 23 8 "Numerazione " + FLAGS "U" + USE %NUM + INPUT CODTAB F_CODNUM + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODNUM CODTAB + CHECKTYPE REQUIRED +END + +GROUPBOX DLG_NULL 45 4 +BEGIN + PROMPT 1 10 "@bMovimento di rettifica inventariale" +END + +STRING F_CAUSALE 5 +BEGIN + PROMPT 2 11 "Causale " + USE %CAU SELECT (S7="C")&&(S2[1,1]="+") + INPUT CODTAB F_CAUSALE + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CAUSALE CODTAB + CHECKTYPE REQUIRED + ADD RUN mg0 -0 %CAU +END + +DATE F_DATACOMP +BEGIN + PROMPT 20 11 "Competenza " + CHECKTYPE REQUIRED +END + +LISTBOX F_GIAC 1 12 +BEGIN + PROMPT 2 12 "Calcolo in base a giacenza " + ITEM "0|Corrente" + ITEM "1|Effettiva" +END ENDPAGE - ENDMASK diff --git a/mg/mglib.h b/mg/mglib.h index c00aa3834..8248f4de9 100755 --- a/mg/mglib.h +++ b/mg/mglib.h @@ -584,15 +584,13 @@ public: TArticolo & articolo(int row) const { return cached_article(body()[row].get(RMOVMAG_CODART));} TArticolo_giacenza & articolo_giacenza(int row) const { return cached_article_balances(body()[row].get(RMOVMAG_CODART));} TCausale_magazzino& causale(int row) const; - const TCausale_magazzino& causale(const char* cod = NULL) const; + const TCausale_magazzino& causale(const char* cod = NULL) const; void renum_mov(const long numreg); - // @member: effettua l'aggiornamento dei saldi di una giacenza void update_balances(TRectype& magrec, int numrig, bool plus = true); void update_balances_clifo(TRectype& cliforec, int numrig, bool plus = true); - // int codice_esercizio(const TDate& d) const; // costruttori e distruttori