#include #include #include #include #include #include #include #include #include "lv4900a.h" #include "lvrcondv.h" //////////////// // MASCHERA // //////////////// class TPrezzi_mask : public TAutomask { private: protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); public: TPrezzi_mask() : TAutomask("lv4900a") { TPrice p; set(F_DECIMALS, p.decimals()); } }; bool TPrezzi_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) { case F_DATA: if (e == fe_init && o.empty()) { const TDate oggi(TODAY); const int curr_month = oggi.month(); const int next_month = (((curr_month+2) % 12) / 3 * 3)+1; const int next_year = oggi.year() + (next_month < curr_month ? 1 : 0); const TDate d(1, next_month, next_year); o.set(d.string()); } break; default: break; } return true; } //////////////////////// // TPrice_recordset // //////////////////////// class TPrice_recordset : public TISAM_recordset { int _mode; bool _roundup; int _decimals; real _perc, _incmin; protected: virtual const TVariant& get_field(int logic, const char* field) const; public: TPrice_recordset(const TMask& m); }; const TVariant& TPrice_recordset::get_field(int logic, const char* field) const { if ((logic == 0 || logic == LF_LVRCONDV) && strncmp(field, "NEW", 3) == 0) { const TFixed_string base(field+3); if (((_mode & 1) && (base == LVRCONDV_PREZZO)) || ((_mode & 2) && (base == LVRCONDV_PREZNOL))) { const real old_price = TISAM_recordset::get_field(logic, base).as_real(); if (old_price > ZERO) { real new_price = old_price * (CENTO + _perc) / CENTO; if (_roundup) new_price.ceil(_decimals); else new_price.round(_decimals); if (new_price == old_price && _perc > ZERO) new_price += _incmin; TVariant& tmp = get_tmp_var(); tmp.set(new_price); return tmp; } } } return TISAM_recordset::get_field(logic, field); } TPrice_recordset::TPrice_recordset(const TMask& m) : TISAM_recordset("USE LVRCONDV") { _mode = m.get_int(F_PREZZO); _decimals = m.get_int(F_DECIMALS); _roundup = m.get_bool(F_ARROTONDA); _perc = m.get_real(F_PERC); _incmin = m.get_real(F_MINIMO); const TString4 nil = "???"; const TString& por = m.get_bool(F_USEPORTO) ? m.get(F_PORTO) : nil; const TString& cco = m.get_bool(F_USECATCON) ? m.get(F_CATCON) : nil; const TString& cve = m.get_bool(F_USECATVEN) ? m.get(F_CATVEN) : nil; const bool cfven_needed = por != nil || cco != nil || cve != nil; TString select; if (cfven_needed) { if (por != nil) select << "&&(CFVEN.CODPORTO==\""<< por << "\")"; if (cco != nil) select << "&&(CFVEN.CODCATC==\"" << cco << "\")"; if (cve != nil) select << "&&(CFVEN.CATVEN==\"" << cve << "\")"; } const TString& dca = m.get(F_FROMCODART); const TString& aca = m.get(F_TOCODART); if (dca.full() || aca.full()) select << "&&(BETWEEN(CODART,\"" << dca << "\",\"" << aca << "\"))"; TString query; query << "USE LVRCONDV SELECT (BETWEEN(\""<< m.get(F_DATA) << "\",LVCONDV.DATAIN,LVCONDV.DATASC))"; switch (_mode) { case 1: query << "&&(STR(PREZZO>0))"; break; case 2: query << "&&(STR(PREZNOL>0))"; break; default: query << "&&(STR((PREZZO>0)||(PREZNOL>0)))"; break; } query << select; query << "\nJOIN LVCONDV INTO CODCF==CODCF CODCONT==CODCONT"; if (cfven_needed) query << "\nJOIN CFVEN INTO TIPOCF=\"C\" CODCF==CODCF"; query << "\nFROM CODCF=" << m.get(F_FROMCLI) << "\nTO CODCF=" << m.get(F_TOCLI); set(query); } //////////////////// // Applicazione // //////////////////// class TAggiornamento_prezzi : public TSkeleton_application { public: virtual void main_loop(); }; void TAggiornamento_prezzi::main_loop() { TPrezzi_mask m; while (m.run() == K_ENTER) { TPrice_recordset* pr = new TPrice_recordset(m); TReport rep; if (rep.load("lv4900")) { rep.set_recordset(pr); rep.preview(); } if (m.get_bool(F_DEFINITIVO) && yesno_box(TR("Si desiderano registrare i nuovi prezzi?"))) { const int mode = m.get_int(F_PREZZO); // 1, 2, 3 TProgind pi(pr->items(), title(), false, true); const TRectype& curr = pr->cursor()->curr(); TFast_isamfile file(LF_LVRCONDV); for (bool ok = pr->move_first(); ok; ok = pr->move_next()) { if (!pi.addstatus(1)) break; file.curr() = curr; if (mode & 1) file.put(LVRCONDV_PREZZO, pr->get("NEW"LVRCONDV_PREZZO).as_real()); if (mode & 2) file.put(LVRCONDV_PREZNOL, pr->get("NEW"LVRCONDV_PREZNOL).as_real()); const int err = file.rewrite(); if (err != NOERR) { cantwrite_box(file.description()); break; } } } } } int lv4900(int argc, char* argv[]) { TAggiornamento_prezzi a; a.run(argc, argv, TR("Aggiornamento prezzi")); return 0; }