#include #include #include #include #include "pr1200a.h" #include "percprov.h" static word __lenfields[4]; class TPercprovv_form : public TForm { TString _conf; protected: virtual bool validate(TForm_item &, TToken_string &); public: void set_conf(const char* s) { _conf = s;} TPercprovv_form(const char *); virtual ~TPercprovv_form(){}; }; TPercprovv_form::TPercprovv_form(const char* name): TForm() { read(name); } bool TPercprovv_form::validate(TForm_item &cf, TToken_string &s) { const TString code(s.get(0)); TString valore; if (code == "_FILLFIELDS") { TString value(cf.get()), x; const int l = _conf.len(); short flid = 0; for (int i = 0; i < l; i++) { switch (_conf[i]) { case 'C': flid = FRM_CLI; break; case 'V': flid = FRM_CVE; break; case 'A': flid = FRM_AGE; break; case 'P': flid = FRM_PAG; break; case 'S': flid = FRM_SCO; break; case 'Z': flid = FRM_ZON; break; case 'M': flid = FRM_ART; break; case 'E': flid = FRM_GMC; break; case 'R': flid = FRM_SMC; break; case 'F': flid = FRM_RFA; break; default: flid = 0; break; } if (flid == 0) break; // Estrae il valore da value in x tramite __lenfields[] x = value.left(__lenfields[i]); value.ltrim(__lenfields[i]); // Setta il TForm_item corrispondente TForm_item& fi = find_field('B', odd_page, flid); fi.set(x); } } return TForm::validate(cf, s); } class TStampa_percprovv : public TSkeleton_application { TTable *_apr; TMask * _m; protected: void compose_ranges(const TString& k, TString& s1, TString& s2); static bool codarc_handler(TMask_field& fld, KEY k); virtual bool create(); virtual bool destroy(); virtual void main_loop(); }; inline TStampa_percprovv& app() { return (TStampa_percprovv&) main_app();} bool TStampa_percprovv::codarc_handler(TMask_field& fld, KEY k) { if (fld.to_check(k) && k == K_TAB) { TMask& m = fld.mask(); TTable* apr = app()._apr; apr->put("CODTAB", fld.get()); if (apr->read() == NOERR) { TString s3(apr->get("S3")); const int len = s3.len(); m.hide(-G_ALL); m.reset(-G_ALL); for (int i = 0; ifield(id_from).size(); if (id_from == F_FROMCLIENTE) // I codici clienti vanno allineati a destra! formato.format("%%%ds",__lenfields[i]); else formato.format("%%-%ds",__lenfields[i]); // Gli altri a sinistra ws.format(formato,(const char*)_m->get(id_from)); s1 << ws; ws.format(formato,(const char*)_m->get(id_to)); s2 << ws; } } void TStampa_percprovv::main_loop() { TRectype from(LF_PERCPROV), to(LF_PERCPROV); TString codpr, s1,s2, s3; _m->hide(-G_ALL); while (_m->run() == K_ENTER) { TPercprovv_form frm("pr1200a"); codpr = _m->get(F_CODPR); // Codice archivio _apr->put("CODTAB", codpr); if (_apr->read() == NOERR) // legge la stringa di definizione dei campi s3 = _apr->get("S3"); else s3 = "----"; // Compone le stringhe per from e to compose_ranges(s3, s1, s2); from.zero(); from.put(PER_CODPR, codpr); from.put(PER_KEYORD,s1); to = from; to.put(PER_KEYORD, s2); TCursor* cur = frm.cursor(); cur->setregion(from, to); if (cur->items() == 0L) { warning_box(TR("Non vi sono elementi da stampare nell'intervallo indicato.")); continue; } for (short k = FRM_CLI; k <= FRM_RFA; k++) // Nasconde tutti gli items del cazzo { TForm_item& fi = frm.find_field('B', odd_page, k); fi.hide(); } // Ripristina solo quelli necessari cambiandogli la coordinata y in sequenza (tanto al massimo // sono 4) const int l = s3.len(); short flid = 0; for (int i=0; i < l; i++) { switch (s3[i]) { case 'C': flid = FRM_CLI; break; case 'V': flid = FRM_CVE; break; case 'A': flid = FRM_AGE; break; case 'P': flid = FRM_PAG; break; case 'S': flid = FRM_SCO; break; case 'Z': flid = FRM_ZON; break; case 'M': flid = FRM_ART; break; case 'E': flid = FRM_GMC; break; case 'R': flid = FRM_SMC; break; case 'F': flid = FRM_RFA; break; default: flid = 0; break; } if (flid == 0) break; TForm_item& fi = frm.find_field('B', odd_page, flid); fi.show(); fi.y() = i+1; } frm.set_conf(s3); frm.print(); } } bool TStampa_percprovv::create() { open_files(LF_PERCPROV, LF_TAB, LF_TABCOM, LF_CLIFO, LF_AGENTI, 0); _m = new TMask ("pr1200a"); _m->set_handler(F_CODPR, codarc_handler); _apr = new TTable("APR"); return TSkeleton_application::create(); } bool TStampa_percprovv::destroy() { delete _m; delete _apr; return TSkeleton_application::destroy(); } int pr1200(int argc, char* argv[]) { TStampa_percprovv a; a.run(argc,argv,TR("Stampa % di provvigione")); return 0; }