Nuova gestione avanzata saldo alla data

git-svn-id: svn://10.65.10.50/branches/R_10_00@22907 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2013-12-13 09:41:33 +00:00
parent a9a4ffad45
commit 572327d74c
4 changed files with 372 additions and 61 deletions

View File

@ -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);
}
}

View File

@ -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

View File

@ -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 <helpbar.h>
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 <elabar.h>
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

View File

@ -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