#ifndef __APPLICAT_H #include #endif #ifndef __MASK_H #include #endif #ifndef __FORM_H #include #endif #ifndef __RELATION_H #include #endif #ifndef __URLDEFID_H #include #endif #ifndef __SHEET_H #include #endif #ifndef __LFFILES_H #include #endif #include "sc2.h" #include "sc2100a.h" class TStampaEC_application : public TApplication { enum what {clienti, fornitori}; // begin AARGH TRelation* _clifo_rel; TCursor* _cli_cur_k1; TCursor* _cli_cur_k2; TCursor* _for_cur_k1; TCursor* _for_cur_k2; TCursor_sheet* _cli_sh_k1; TCursor_sheet* _cli_sh_k2; TCursor_sheet* _for_sh_k1; TCursor_sheet* _for_sh_k2; // end AARGH what _what; int _key; TBit_array _selected; TRelation* _ditta; protected: virtual bool create(); virtual bool destroy(); virtual bool menu(MENU_TAG m); long select_clifo_range(TMask& m, long from, long to); static TStampaEC_application& app() { return (TStampaEC_application&)main_app(); } // handlers static bool bfrom_handler(TMask_field& f, KEY k); static bool bto_handler(TMask_field& f, KEY k); static bool ffrom_handler(TMask_field& f, KEY k); static bool fto_handler(TMask_field& f, KEY k); static bool breset_handler(TMask_field& f, KEY k); static bool bselect_handler(TMask_field& f, KEY k); static bool rclifo_handler(TMask_field& f, KEY k); static bool rsortcf_handler(TMask_field& f, KEY k); void set_clifo_limits(TMask&); public: bool select_ec(); // starting point bool print_selected(); bool print_ec(long clifo); TCursor_sheet* cur_sheet(); // utils per handlers void reset_sheets(TMask& m); void set_what(what w) {_what = w; } void set_key (int k) {_key = k; } TStampaEC_application(); virtual ~TStampaEC_application() {} }; // handlers bool TStampaEC_application::bfrom_handler(TMask_field& f, KEY k) { if (k == K_SPACE) { app().cur_sheet()->disable_check(); if (app().cur_sheet()->run() == K_ENTER) { TToken_string& t = app().cur_sheet()->row(app().cur_sheet()->selected()); long cod1 = t.get_long(1); long cod2 = f.mask().get_long(F_CFCODTO); f.mask().set(F_CFCODFR, cod1); app().select_clifo_range(f.mask(), cod1, cod2); } } return TRUE; } bool TStampaEC_application::bto_handler(TMask_field& f, KEY k) { if (k == K_SPACE) { app().cur_sheet()->disable_check(); if (app().cur_sheet()->run() == K_ENTER) { TToken_string& t = app().cur_sheet()->row(app().cur_sheet()->selected()); long cod2 = t.get_long(1); long cod1 = f.mask().get_long(F_CFCODFR); f.mask().set(F_CFCODTO, cod2); app().select_clifo_range(f.mask(), cod1, cod2); } } return TRUE; } bool TStampaEC_application::ffrom_handler(TMask_field& f, KEY k) { if (!f.focusdirty()) return TRUE; if (k == K_TAB) { long cod1 = atol(f.get()); long cod2 = f.mask().get_long(F_CFCODTO); app().select_clifo_range(f.mask(), cod1, cod2); } else if (k == K_F9) app().bfrom_handler(f.mask().field(B_CFCODFR), K_SPACE); return TRUE; } bool TStampaEC_application::fto_handler(TMask_field& f, KEY k) { if (!f.focusdirty()) return TRUE; if (k == K_TAB) { long cod2 = atol(f.get()); long cod1 = f.mask().get_long(F_CFCODFR); app().select_clifo_range(f.mask(), cod1, cod2); } else if (k == K_F9) app().bfrom_handler(f.mask().field(B_CFCODTO), K_SPACE); return TRUE; } bool TStampaEC_application::breset_handler(TMask_field& f, KEY k) { if (k == K_SPACE) app().reset_sheets(f.mask()); return TRUE; } bool TStampaEC_application::bselect_handler(TMask_field& f, KEY k) { if (k == K_SPACE) { app().cur_sheet()->enable_check(); app().cur_sheet()->run(); } app().set_clifo_limits(f.mask()); return TRUE; } bool TStampaEC_application::rclifo_handler(TMask_field& f, KEY k) { if (k == K_SPACE) { app().set_what(f.get() == "1" ? clienti : fornitori); app().reset_sheets(f.mask()); } return TRUE; } bool TStampaEC_application::rsortcf_handler(TMask_field& f, KEY k) { if (k == K_SPACE) { app().set_key(atoi(f.get())); app().reset_sheets(f.mask()); } return TRUE; } long TStampaEC_application::select_clifo_range(TMask& m, long from, long to) { long nsel = 0; if (cur_sheet()->items() == 0) { beep(); return 0l; } if (to == 0l) to = cur_sheet()->row(cur_sheet()->items() - 1).get_long(1); if (from == 0l) from = cur_sheet()->row(0).get_long(1); if (from > to) { long tmp = to; to = from; from = tmp; } bool go = FALSE; bool cod1ok = FALSE, cod2ok = FALSE; long last = 0l; long firs = 0l; for (long i = 0; i < cur_sheet()->items(); i++) { TToken_string& tt = cur_sheet()->row(i); long cod = tt.get_long(1); if (cod >= from && cod <= to) { cur_sheet()->check(i); nsel ++; if (firs == 0l) firs = cod; last = cod; } else cur_sheet()->uncheck(i); if (cod == from) cod1ok = TRUE; if (cod == to) cod2ok = TRUE; } if (!cod1ok) from = firs; if (!cod2ok) to = last; m.set(F_CFCODFR, from); m.set(F_CFCODTO, to); m.set(F_NSEL, nsel); return 0l; } void TStampaEC_application::reset_sheets(TMask& m) { _cli_sh_k1->uncheck(-1); _cli_sh_k2->uncheck(-1); _for_sh_k1->uncheck(-1); _for_sh_k2->uncheck(-1); m.set(F_CFCODFR,""); m.set(F_CFCODTO,""); } bool TStampaEC_application::select_ec() { TMask m("sc2100a"); KEY k; m.set_handler(R_CLIFO, rclifo_handler); m.set_handler(R_SORTCF, rsortcf_handler); m.set_handler(B_CFCODFR, bfrom_handler); m.set_handler(B_CFCODTO, bto_handler); m.set_handler(B_SELECT, bselect_handler); m.set_handler(B_RESET, breset_handler); m.set_handler(F_CFCODFR, ffrom_handler); m.set_handler(F_CFCODTO, fto_handler); if (_ditta->good()) { m.set(F_COMSEND, _ditta->lfile(LF_COMUNI).get("COM")); m.set(F_LUOGOSEND, _ditta->lfile(LF_COMUNI).get("DENCOM")); } while ((k = m.run()) != K_ESC) if (k == K_ENTER) print_selected(); return k != K_ESC; } void TStampaEC_application::set_clifo_limits(TMask& m) { long first = 0, last = 0; bool primo = FALSE; for (int i = 0; i < cur_sheet()->items(); i++) { if (cur_sheet()->checked(i)) { TToken_string& t = cur_sheet()->row(i); long kod = t.get_long(1); if (!primo++) first = last = kod; if (first > kod) first = kod; if (last < kod) last = kod; } } m.set(F_CFCODFR, first); m.set(F_CFCODTO, last); } bool TStampaEC_application::print_selected() { for (int i = 0; i < cur_sheet()->items(); i++) { if (cur_sheet()->checked(i)) { TToken_string& t = cur_sheet()->row(i); print_ec(t.get_long(1)); } } return TRUE; } bool TStampaEC_application::print_ec(long clifo) { return TRUE; } TCursor_sheet* TStampaEC_application::cur_sheet() { if (_key == 1) return (_what == clienti ? _cli_sh_k1 : _for_sh_k1); else return (_what == clienti ? _cli_sh_k2 : _for_sh_k2); } bool TStampaEC_application::create() { TApplication::create(); // crea relazioni, cursori e cursor_sheets _clifo_rel = new TRelation(LF_CLIFO); _cli_cur_k1 = new TCursor(_clifo_rel, "TIPOCF=\"C\"", 1); _cli_cur_k2 = new TCursor(_clifo_rel, "TIPOCF=\"C\"", 2); _for_cur_k1 = new TCursor(_clifo_rel, "TIPOCF=\"F\"", 1); _for_cur_k2 = new TCursor(_clifo_rel, "TIPOCF=\"F\"", 2); _cli_sh_k1 = new TCursor_sheet(_cli_cur_k1, " |CODCF|RAGSOC", "Selezione clienti per codice", "@1|Codice|Ragione Sociale@50"); _cli_sh_k2 = new TCursor_sheet(_cli_cur_k2, " |RAGSOC|CODCF", "Selezione clienti per ragione sociale", "@1|Ragione Sociale@50|Codice"); _for_sh_k1 = new TCursor_sheet(_for_cur_k1, " |CODCF|RAGSOC", "Selezione fornitori per codice", "@1|Codice|Ragione Sociale@50"); _for_sh_k2 = new TCursor_sheet(_for_cur_k2, " |RAGSOC|CODCF", "Selezione fornitori per ragione sociale", "@1|Ragione Sociale@50|Codice"); // relasiun per la ditta defiga _ditta = new TRelation(LF_NDITTE); _ditta->add(LF_ANAG, "TIPOA==TIPOA|CODANAGR==CODANAGR"); _ditta->add(LF_COMUNI, "COM==COMRF(COMRES)", 1, LF_ANAG); _ditta->zero(); _ditta->lfile().put("CODDITTA", get_firm()); _ditta->read(); dispatch_e_menu(MENU_ITEM(1)); return TRUE; } bool TStampaEC_application::destroy() { delete _for_sh_k2; delete _for_sh_k1; delete _cli_sh_k2; delete _cli_sh_k1; delete _for_cur_k2; delete _for_cur_k1; delete _cli_cur_k2; delete _cli_cur_k1; delete _clifo_rel; return TApplication::destroy(); } bool TStampaEC_application::menu(MENU_TAG m) { if (m == MENU_ITEM(1)) return select_ec(); else return TApplication::menu(m); } TStampaEC_application::TStampaEC_application() : _selected(10000), _what(clienti), _key(1) { } int sc2100(int argc, char** argv) { TStampaEC_application app; app.run(argc, argv, "Stampa Estratti Conto"); return 0; }