202 lines
4.1 KiB
C++
202 lines
4.1 KiB
C++
|
#include <applicat.h>
|
||
|
#include <automask.h>
|
||
|
#include <progind.h>
|
||
|
|
||
|
#include "pg0001.h"
|
||
|
#include "pg0001500a.h"
|
||
|
#include "../cg/cglib01.h"
|
||
|
#include "../mg/mglib.h"
|
||
|
#include "../mg/movmag.h"
|
||
|
#include "../mg/rmovmag.h"
|
||
|
|
||
|
class TMaskpg00015 : public TAutomask
|
||
|
{
|
||
|
protected:
|
||
|
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||
|
|
||
|
public:
|
||
|
TMaskpg00015() : TAutomask("pg0001500a") { }
|
||
|
virtual ~TMaskpg00015() { }
|
||
|
};
|
||
|
|
||
|
bool TMaskpg00015::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
class TCopiaMovMg : public TSkeleton_application
|
||
|
{
|
||
|
virtual bool check_autorization() const {return false;}
|
||
|
virtual const char * extra_modules() const {return "ba";}
|
||
|
|
||
|
protected:
|
||
|
virtual void main_loop();
|
||
|
|
||
|
public:
|
||
|
};
|
||
|
|
||
|
void TCopiaMovMg::main_loop()
|
||
|
{
|
||
|
TMaskpg00015 m;
|
||
|
|
||
|
while (m.run() != K_QUIT)
|
||
|
{
|
||
|
TEsercizi_contabili es;
|
||
|
TArray movs;
|
||
|
const long damov = m.get_long(F_DANUM);
|
||
|
const long amov = m.get_long(F_ANUM);
|
||
|
const TDate newdate = m.get_date(F_DATAMOV);
|
||
|
TMov_mag mov;
|
||
|
TRectype rec(LF_MOVMAG);
|
||
|
long newnmov = atol(mov.get_next_key());
|
||
|
const real valtot = m.get_real(F_VALTOT);
|
||
|
const int qmax = m.get_int(F_QMAX);
|
||
|
const real minval = m.get_real(F_VMIN);
|
||
|
const int cmax = m.get_int(F_CMAX);
|
||
|
real actval;
|
||
|
|
||
|
{
|
||
|
TProgind rd(amov - damov + 1, "Lettura");
|
||
|
|
||
|
for (long n = damov; n <= amov; n++)
|
||
|
{
|
||
|
rec.zero();
|
||
|
rec.put(MOVMAG_NUMREG, n),
|
||
|
|
||
|
mov.read(rec);
|
||
|
mov.body();
|
||
|
mov.renum_mov(newnmov++);
|
||
|
mov.put(MOVMAG_DATAREG, newdate);
|
||
|
mov.put(MOVMAG_DATACOMP, newdate);
|
||
|
mov.put(MOVMAG_ANNOES, es.date2esc(newdate));
|
||
|
|
||
|
const int nrows = mov.body().rows();
|
||
|
|
||
|
for (int r = 1; r <= nrows; r++)
|
||
|
{
|
||
|
const TRectype & row = mov.body().row(r);
|
||
|
const real qta = row.get_int(RMOVMAG_QUANT);
|
||
|
const real prezzo = row.get_real(RMOVMAG_PREZZO);
|
||
|
real val = prezzo * qta;
|
||
|
|
||
|
val.round(2);
|
||
|
actval += val;
|
||
|
}
|
||
|
movs.add(mov);
|
||
|
if (!rd.iscancelled())
|
||
|
rd.addstatus(1L);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
real varp = valtot / actval;
|
||
|
|
||
|
varp.round(6);
|
||
|
|
||
|
const real sign = varp > UNO ? UNO : -UNO;
|
||
|
int cnt = 0;
|
||
|
int loops = 0;
|
||
|
{
|
||
|
TProgind c(100, "Calcolo");
|
||
|
|
||
|
while (sign * actval < sign * valtot && loops < 100)
|
||
|
{
|
||
|
const int nmov = movs.items();
|
||
|
|
||
|
actval = ZERO;
|
||
|
for (int i = 0; i < nmov; i++)
|
||
|
{
|
||
|
TMov_mag &mov = (TMov_mag &) movs[i];
|
||
|
const int nrows = mov.body().rows();
|
||
|
int r;
|
||
|
|
||
|
for (r = 1; r <= nrows; r++)
|
||
|
{
|
||
|
TRectype & row = (TRectype &) mov.body().row(r);
|
||
|
const real qta = row.get_real(RMOVMAG_QUANT);
|
||
|
const real prezzo = row.get_real(RMOVMAG_PREZZO);
|
||
|
|
||
|
real v = varp * qta;
|
||
|
|
||
|
v.round(0);
|
||
|
int newqta = v.integer();
|
||
|
|
||
|
if (prezzo >= minval && newqta > qmax)
|
||
|
newqta = qmax;
|
||
|
else
|
||
|
if (qta.integer() == newqta)
|
||
|
{
|
||
|
cnt++;
|
||
|
if (cnt == cmax)
|
||
|
{
|
||
|
cnt = 0;
|
||
|
if (sign > ZERO)
|
||
|
newqta++;
|
||
|
else
|
||
|
newqta--;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (sign > ZERO)
|
||
|
{
|
||
|
if (newqta < qta.integer())
|
||
|
newqta = qta.integer();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (newqta > qta.integer())
|
||
|
newqta = qta.integer();
|
||
|
}
|
||
|
|
||
|
if (newqta < 0)
|
||
|
newqta = 0;
|
||
|
|
||
|
real val = prezzo * newqta;
|
||
|
|
||
|
val.round(2);
|
||
|
actval += val;
|
||
|
row.put(RMOVMAG_QUANT, newqta);
|
||
|
}
|
||
|
for (r = nrows; r > 0; r--)
|
||
|
{
|
||
|
const TRectype & row = mov.body().row(r);
|
||
|
const int qta = row.get_int(RMOVMAG_QUANT);
|
||
|
if (qta == 0)
|
||
|
mov.body().destroy_row(r, true);
|
||
|
}
|
||
|
}
|
||
|
varp = valtot / actval;
|
||
|
varp.round(6);
|
||
|
loops++;
|
||
|
if (!c.iscancelled())
|
||
|
c.addstatus(1L);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
TString msg;
|
||
|
|
||
|
msg.format("Valore totale %s, devo registrare", (const char *) actval.stringa());
|
||
|
|
||
|
if (yesno_box(msg))
|
||
|
{
|
||
|
const int nmov = movs.items();
|
||
|
TProgind w(nmov, "Scrittura");
|
||
|
TLocalisamfile movmag(LF_MOVMAG);
|
||
|
|
||
|
for (int i = 0; i < nmov; i++)
|
||
|
{
|
||
|
TMov_mag &mov = (TMov_mag &) movs[i];
|
||
|
mov.write(movmag);
|
||
|
if (!w.iscancelled())
|
||
|
w.addstatus(1L);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int pg0001500(int argc, char* argv[])
|
||
|
{
|
||
|
TCopiaMovMg a;
|
||
|
a.run(argc, argv, "Copia Movimenti di magazzino");
|
||
|
return 0;
|
||
|
}
|