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