////////////////////////////////////////////////////////////// // Stampa documenti ////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include #include #include #include #include "../ve/velib.h" #include "si0200a.h" class TDocisamfile : public TLocalisamfile { TDocumento _doc; public: virtual TRectype& curr() const { return (TRectype&) _doc; } virtual int readat(TRecnotype nrec, word lockop = _nolock); TDocisamfile() : TLocalisamfile(LF_DOC) {} virtual ~TDocisamfile() {}; }; int TDocisamfile::readat(TRecnotype nrec, word lockop) { int err = TBaseisamfile::readat(nrec, _nolock); if (err == NOERR) err = _doc.read(TBaseisamfile::curr()); return err; } class TListe_form : public TForm { // @access Protected Member protected: public: virtual bool validate(TForm_item& fld, TToken_string& val); TListe_form(const char* form, const char * code = "", int editlevel = 0, const char* desc = ""); virtual ~TListe_form() {} }; bool TListe_form::validate(TForm_item& fld, TToken_string& val) { return TForm::validate(fld, val); } TListe_form::TListe_form(const char* form, const char* code, int editlevel, const char* desc) : TForm(form, code, editlevel, desc) { relation()->lfile().set_curr(new TDocumento); } class TListe_application: public TSkeleton_application { TMask * _select_mask; TListe_form * _form; TFilename _formname; protected: virtual bool create(); virtual bool destroy(); char tipo_lista() const { return _formname[6]; } void set_limits(); virtual void main_loop(); virtual const char * extra_modules() const { return "BA"; } public: TListe_application() : _select_mask(NULL), _form(NULL) {}; virtual ~TListe_application() {}; }; inline TListe_application& app() { return (TListe_application&) main_app(); } bool TListe_application::create() { if (argc() < 3) return error_box("manca il nome del form di stampa"); open_files(LF_DOC, LF_RIGHEDOC, LF_CONDV, LF_RCONDV, LF_ANAMAG, LF_SCONTI, LF_UMART, LF_TAB, LF_TABCOM, LF_CLIFO, LF_CFVEN, LF_INDSP, LF_OCCAS, LF_PCON, LF_MOVMAG, LF_RMOVMAG, LF_MAG, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_ATTIV, LF_CAUSALI, 0); _formname = argv(2); _select_mask = new TMask("si0200a"); _form = new TListe_form(_formname); return TSkeleton_application::create(); } void TListe_application::set_limits() { TCursor * c = _form->cursor(); TRelation * r = c->relation(); TString16 tipo(_select_mask->get(F_TIPOCF)); TString16 cli_fr(_select_mask->get(F_CODFR)); TString16 cli_to(_select_mask->get(F_CODTO)); TRectype from(LF_CLIFO); from.put("TIPOCF", tipo); TRectype to(from); if (cli_fr.empty() && cli_to.empty()) { TString16 rag_fr(_select_mask->get(F_RAGSOCFR)); if (rag_fr.not_empty()) from.put("RAGSOC", rag_fr); TString16 rag_to(_select_mask->get(F_RAGSOCTO)); if (rag_to.not_empty()) to.put("RAGSOC", rag_to); c->setkey(2); } else { TString16 cli_fr(_select_mask->get(F_CODFR)); if (cli_fr.not_empty()) from.put("CODCF", cli_fr); TString16 rag_to(_select_mask->get(F_CODTO)); if (rag_to.not_empty()) to.put("CODCF", cli_to); c->setkey(1); } c->setregion(from, to); TString filter; filter << format("((33->ANNO==%d)", _select_mask->get_int(F_ANNO)); filter << format("&&(33->PROVV==\"%c\")", _select_mask->get(F_PROVV)[0]); TSheet_field & s = _select_mask->sfield(F_SHEETNUMS); const int rows = s.items(); for (int i = 0; i < rows; i++) { TString numfilter; TToken_string r = s.row(i); numfilter << format("&&(33->CODNUM==\"%s\")", (const char *)r.get(0)); for (int j = 0; j < 6; j++) { const int stato = r.get_int(); if (stato > 0) numfilter << format("&&(33->STATO==%d)", stato); } if (numfilter.not_empty()) filter << numfilter; } TDate data_fr(_select_mask->get(F_DA_DATADOC)); if (data_fr.ok()) filter << format("&&(ANSI(33->DATADOC)>=%s)", (const char *) data_fr.string(ANSI)); TDate data_to(_select_mask->get(F_A_DATADOC)); if (data_to.ok()) filter << format("&&(ANSI(33->DATADOC)>=%s)", (const char *) data_to.string(ANSI)); TDate art_fr(_select_mask->get(F_DA_DATADOC)); if (art_fr.ok()) filter << format("&&(34->CODARTMAG>=\"%s\")", (const char *) art_fr); TDate art_to(_select_mask->get(F_A_DATADOC)); if (art_to.ok()) filter << format("&&(34->CODARTMAG>=\"%s\")", (const char *) art_to); filter << ")"; c->setfilter(filter, TRUE); } bool TListe_application::destroy() { delete _select_mask; delete _form; return TApplication::destroy(); } void TListe_application::main_loop() { while (_select_mask->run() != K_ESC) { set_limits(); _form->print(); } } // Do all the work! int si0200(int argc, char* argv[]) { TListe_application a; a.run(argc, argv, "Lista documenti"); return (0); }