campo-sirio/lv/lv3500.cpp

236 lines
6.1 KiB
C++
Executable File

#include <applicat.h>
#include <automask.h>
#include "../ve/velib.h"
#include "lv3500a.h"
///////////////////////////
//// TSITMAG_MSK ////
///////////////////////////
//classe TSitmag_msk
class TSitmag_msk: public TAutomask
{
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
void calcola_qta_magazzino() const;
public:
TSitmag_msk();
};
//CALCOLA_QTA_MAGAZZINO: metodo che si preoccupa di riempire lo sheet
//con le quantità relative all'articolo / anno selezionati nei vari depositi
//ogni volta che viene modificato un campo dell'articolo o il campo anno
void TSitmag_msk::calcola_qta_magazzino() const
{
//recupero le variabili di interesse
const TString80 codart = field(F_CODART).get();
const int anno = field(F_ANNO).get_long();
//Instanzio l'oggetto che mi permette di recuperare le quantità riceercate
const TArticolo_giacenza art(codart);
//Instanzio lo sheet, e recupero le posizioni di maggior interesse
//(vengono usate più volte all'interno del programma)
TSheet_field& sheet = sfield(F_RIGHE);
const int posgiac = sheet.cid2index(S_GIAC);
const int posordf = sheet.cid2index(S_ORDFOR);
const int posordc = sheet.cid2index(S_ORDCLI);
const int posdisp = sheet.cid2index(S_DISP);
const int rows = sheet.items() - 1;
//calcolo dei totali
long totgiac = 0L;
long totordf = 0L;
long totordc = 0L;
long totdisp = 0L;
//per ogni magazzino
for(int i = 0; i < rows; i++)
{
//recupero una riga alla volta
TToken_string& row = sheet.row(i);
//recupero il codice del deposito
TString8 codmag = row.get(sheet.cid2index(S_CODMAG)); codmag.rpad(3);
const TString4 coddep = row.get(sheet.cid2index(S_CODDEP));
//costruisco il codice magazzino + deposito
codmag << coddep;
//inizializzo le quantità di interesse(la giacenza a quella corrente, le altre a zero)
const long giac = art.giacenza_anno(codmag, "", anno).integer();
long ordf = 0L;
long ordc = 0L;
long disp = 0L;
//cerco il record dell'articolo selzionato corrispondente all'anno corrente
TRecord_array& rmag = art.mag(anno);
int j = art.find_mag(anno, codmag, "");
//se lo trovo ricavo i valori degli ordini fornitori e clienti
//e poi calcolo la disponibilità seconda la formula
//disponibilità = giacenza + ordini_fornitori - ordini_clienti
if(j >= 0)
{
const TRectype& rec = rmag.row(j);
ordf = rec.get_long(MAG_ORDF);
ordc = rec.get_long(MAG_ORDC);
disp = giac + ordf - ordc;
}
//scrivo le varie quntità che ho ricavato
row.add(giac, posgiac);
row.add(ordf, posordf);
row.add(ordc, posordc);
row.add(disp, posdisp);
totgiac += giac;
totordf += ordf;
totordc += ordc;
totdisp += disp;
}
//scrivo i totali nelle posizioni corrette
TToken_string& row = sheet.row(rows);
row.add(totgiac, posgiac);
row.add(totordf, posordf);
row.add(totordc, posordc);
row.add(totdisp, posdisp);
sheet.force_update();
}
//ON_FIELD_EVENT: metodo che gestisce gli eventi sui campi della maschera
bool TSitmag_msk::on_field_event(TOperable_field& f, TField_event e, long jolly)
{
switch (f.dlg())
{
case DLG_CANCEL:
//alla pressione del bottone annulla azzero tutte le quantità,
//svuoto i campi codart e desart e restituisco il focus al campo codart
if(e == fe_button)
{
reset(F_CODART);
reset(F_DESART);
TSheet_field& sheet = sfield(F_RIGHE);
const int rows = sheet.items();
for (int i = 0; i <= rows; i++)
{
TToken_string& row = sheet.row(i);
row.add(0L, sheet.cid2index(S_GIAC));
row.add(0L, sheet.cid2index(S_ORDFOR));
row.add(0L, sheet.cid2index(S_ORDCLI));
row.add(0L, sheet.cid2index(S_DISP));
}
sheet.force_update();
field(F_CODART).set_focus();
return false;
}
break;
case F_CODART:
if (e == fe_modify && !f.empty())
calcola_qta_magazzino();
break;
case F_ANNO:
if (e == fe_modify)
calcola_qta_magazzino();
break;
case F_RIGHE:
if (e == se_query_add)
return false;
break;
default: break;
}
return true;
}
//metodo costruttore che precarica i campi di interesse sulla maschera
TSitmag_msk::TSitmag_msk():TAutomask("lv3500a")
{
//precarico i campi fissi
const TDate oggi(TODAY);
set(F_ANNO, esercizi().date2esc(oggi));
TISAM_recordset mag("USE MAG");
TSheet_field& sheet = sfield(F_RIGHE);
for (bool ok = mag.move_first(); ok; ok = mag.move_next())
{
const TString4 codmag = mag.get("CODTAB").as_string().left(3);
const TString4 coddep = mag.get("CODTAB").as_string().mid(3);
if (coddep.full())
{
TToken_string& row = sheet.row(-1);
row.add(codmag, sheet.cid2index(S_CODMAG));
row.add(coddep, sheet.cid2index(S_CODDEP));
//questo if mi permette di fare la decodifica del campo descrizione deposito
sheet.check_row(sheet.items() - 1);
}
}
TToken_string& row = sheet.row(-1);
row.add(TR("TOTALI"), sheet.cid2index(S_DESDEP));
sheet.force_update();
}
/////////////////////////////
//// TSitmag_app ////
/////////////////////////////
//classe TSitmag_app
class TSitmag_app : public TSkeleton_application
{
TSitmag_msk* _msk;
protected:
virtual bool create();
virtual bool destroy();
public:
bool transfer();
virtual void main_loop();
};
//CREATE: metodo costruttore
bool TSitmag_app::create()
{
_msk = new TSitmag_msk;
return TSkeleton_application::create();
}
//DESTROY: metodo distruttore
bool TSitmag_app::destroy()
{
delete _msk;
return TApplication::destroy();
}
//TRANSFER: metodo principale dell'elaborazione, che non deve fare niente
//perchè viene tutto gestito nella maschera
bool TSitmag_app::transfer()
{
return true;
}
void TSitmag_app::main_loop()
{
while (_msk->run() == K_ENTER)
transfer();
}
int lv3500(int argc, char *argv[])
{
TSitmag_app a;
a.run (argc, argv, "Situazione magazzino");
return TRUE;
}