#include #include #include #include #include #include #include #include #include "ba4600.h" /////////////////////////////////////////////////////////// // TSoci_sheet /////////////////////////////////////////////////////////// const char* const PHYSICAL_HEAD = "Codice|Cognome@30|Nome@20"; const char* const JURASSIC_HEAD = "Codice|Ragione sociale@50"; class TSoci_sheet : public TArray_sheet { bool _physical; protected: const char* lastcode(); public: TSoci_sheet(bool); void add_socio(const TString& codice, const TString& ragione, int elem = -1); }; TSoci_sheet::TSoci_sheet(bool fis) : TArray_sheet(-1,-1, 0, 0, "Soci", fis ? PHYSICAL_HEAD : JURASSIC_HEAD), _physical(fis) {} const char* TSoci_sheet::lastcode() { if (items() < 1) return ""; return data(items()-1).get(0); } void TSoci_sheet::add_socio(const TString& codice, const TString& ragione, int elem) { if (elem == -1 && codice == lastcode()) return; TToken_string t(60); t.add(codice); if (_physical) { t.add(ragione.left(30)); t.add(ragione.mid(30)); } else t.add(ragione); if (elem < 0) add(t); else row(elem) = t; } /////////////////////////////////////////////////////////// // TQuery_socio /////////////////////////////////////////////////////////// class TQuery_socio { TString _tipo; // tipo = F | G int _anno; // anno TString _carica; // codice carica TString _qualifica; // richiesta qualifica TString _q740; // quadro 740 TString _q750; // quadro 750 public: TQuery_socio(const TMask* mask); const TString& tipo() const { return _tipo; } int test(const TRectype& rec) const; }; TQuery_socio::TQuery_socio(const TMask* mask) { _tipo = mask->get(LST_SC1_TIPOASOC); _anno = atoi(mask->get(FLD_SC1_ANNO)); _carica = mask->get(FLD_SC1_CODCAR); _qualifica = mask->get(LST_SC1_RICQUAL); _q740 = mask->get(LST_SC2_Q740); _q750 = mask->get(LST_SC2_QUATTPREV); } int TQuery_socio::test(const TRectype& r) const { if (_tipo != r.get("TIPOASOC")) return 1; if (_anno > 0 && _anno != r.get_int("ANNO")) return 2; if (_carica.not_empty() && _carica != r.get("CODCAR")) return 3; if (_qualifica.not_empty() && _qualifica != r.get("RICQUAL")) return 4; if (_q740.not_empty() && _q740 != r.get("Q740")) return 5; if (_q750.not_empty() && _q750 != r.get("QUATTPREV")) return 6; return 0; } /////////////////////////////////////////////////////////// // TQuery_application /////////////////////////////////////////////////////////// class TQuery_application : public TApplication { const TPrinter* _printer; TLocalisamfile* _soci; TLocalisamfile* _anag; TLocalisamfile* _ditte; TMask* _mask; void create_files(); void create_masks(); void destroy_masks(); void destroy_files(); protected: virtual bool create(); virtual bool destroy(); virtual bool menu(MENU_TAG m); bool do_query(); public: TQuery_application(); }; TQuery_application::TQuery_application() : _mask(NULL) {} void TQuery_application::create_files() { _soci = new TLocalisamfile(LF_SOCI); _soci->setkey(3); _anag = new TLocalisamfile(LF_ANAG); _ditte = new TLocalisamfile(LF_NDITTE); } void TQuery_application::destroy_files() { delete _ditte; delete _anag; delete _soci; } void TQuery_application::create_masks() { _mask = new TMask("ba5000"); } void TQuery_application::destroy_masks() { delete _mask; } bool TQuery_application::create() { TApplication::create(); create_files(); create_masks(); dispatch_e_menu(MENU_ITEM(1)); return TRUE; } bool TQuery_application::destroy() { destroy_masks(); destroy_files(); return TApplication::destroy(); } bool TQuery_application::menu(MENU_TAG m) { while (do_query()); return FALSE; } const char* head(const TRectype& r, const char* name, const char* title) { if (title == NULL) title = name; if (r.exist(name)) { TString h(r.length(name)); h.spaces(); h.overwrite(title, 0); strcpy(__tmp_string, h); } else strcpy(__tmp_string, title); return __tmp_string; } bool TQuery_application::do_query() { if (_mask->run() != K_F9) return FALSE; TQuery_socio query(_mask); TSoci_sheet s(query.tipo() == "F"); // Create sheet TRectype& soci = _soci->curr(); TRectype& anag = _anag->curr(); TRectype& ditte = _ditte->curr(); soci.zero(); _mask->autosave(); for (_soci->read(_isgteq); !_soci->eof(); _soci->next()) // Fill sheet { if (query.test(soci) == 0) s.add_socio(soci.get("CODANAGRSO"), ""); } TString ragsoc(80), cur_codice(10); for (int i = 0; i < s.items(); i++) { TToken_string& t = (TToken_string&) s.row(i); t.restart(); cur_codice = t.get(); anag.zero(); anag.put("TIPOA", query.tipo()); anag.put("CODANAGR", cur_codice); if (_anag->read() != NOERR) ragsoc = "Anagrafica assente"; else ragsoc = _anag->curr().get("RAGSOC"); s.add_socio(cur_codice, ragsoc, i); } if (s.items() == 0) { warning_box("Nessuna corrispondenza"); return TRUE; } while(s.run() == K_ENTER) { TToken_string& r = s.row(); r.restart(); TString codice(r.get()); TString nome(r.get()); TToken_string h(128); h.add("Anno"); h.add(head(ditte, "CODDITTA", "Codice")); h.add(head(ditte, "RAGSOC", "Ragione sociale")); h.add("Carica|Qualifica|740|750"); h.add(head(soci, "PERCQUAZ", "% Quote")); TArray_sheet d(-1,-1, 0, 0, nome, h); soci.zero(); soci.put("TIPOASOC", query.tipo()); soci.put("CODANAGRSO", codice); TToken_string row(128); for (_soci->read(_isgteq); !_soci->eof(); _soci->next()) { if (codice != soci.get("CODANAGRSO")) break; if (query.test(soci) != 0) continue; row = soci.get("ANNO"); ditte.zero(); row.add(soci.get("CODDITTA")); ditte.put("CODDITTA", row.get(1)); if (_ditte->read() != NOERR) row.add("Ditta assente"); else row.add(ditte.get("RAGSOC")); row.add(soci.get("CODCAR")); row.add(soci.get("RICQUAL")); row.add(soci.get("Q740")); row.add(soci.get("QUATTPREV")); row.add(soci.get("PERCQUAZ")); d.add(row); } d.run(); } return TRUE; } int main(int argc,char** argv) { TQuery_application qa; qa.run(argc, argv, "Ricerca Soci"); return TRUE; }