#include #include #include #include #include #include #include #include #include #include #include #include "ve1100.h" #include "ve0100b.h" //////////////////////////////////////////////////////////////////////////// // classe TDocVen_Form customizzata dalla Form per i documenti di vendita //////////////////////////////////////////////////////////////////////////// class TDocVen_Form: public TForm { TRelation &_firmrel; // relazione di gestione dei dati della ditta corrente TString _module; // codice del modulo di carta associato a questo al form protected: virtual void extended_parse_general(TScanner &); // gestione dei parametri estesi nella sezione general virtual bool validate(TForm_item &, TToken_string &); // gestione dei messaggi estesi nei campi public: const TString &get_module_code() { return _module; } // ritorna il codice del modulo di carta TDocVen_Form(const char *, TRelation &); }; TDocVen_Form::TDocVen_Form(const char* name, TRelation &rel): TForm(name), _firmrel(rel) {} void TDocVen_Form::extended_parse_general(TScanner &scanner) { if (scanner.popkey() == "MO") _module = scanner.string(); // se viene riconosciuto il token per l'impostazione del modulo legge il codice... else scanner.push(); // ...altrimenti rimette il token nella coda dello scanner } bool TDocVen_Form::validate(TForm_item &cf, TToken_string &s) { const TString code(s.get(0)); // prende il primo parametro, il codice del messaggio if (code== "_ISAMREAD") { // lettura generica di un file del database // sintassi: _ISAMREAD,,[!!...],{|[!!...]} // dove: è il numero logico del file o il nome della tabella // è un'espressione del tipo = // è un'espressione di costanti numeriche, stringhe e valori di campi della form (indicati con il loro numero preceduto da #) // è un'espressione del tipo = (se è un gruppo deve essere seguito da @) oppure solo (il campo della form è quello corrente) int i, j, poseq, posrv, itms; pagetype pt; char sec; TLocalisamfile *file; TString f_code(s.get()); // prende il codice del file da leggere if (atoi(f_code) != 0) file= new TLocalisamfile(atoi(f_code)); // se il codice è numerico allora è un file else file= new TTable(f_code); // altrimenti è una tabella file->zero(); // vuota il record corrente del file TToken_string in(s.get(), '!'); for (i=0; iput(fld, (const char *)rval); // scrive il risultato dell'espressione nel campo del file } if (file->read()== NOERR) { // tenta una lettura del file TToken_string out(s.get(), '!'); for (i=0; iget(curr); // preleva il nome del campo del file e lo legge dal record cf.set(dat); // setta il campo letto dal file nel campo corrente della form } else { TString fld(curr.left(poseq)); // preleva il nome del campo del form alla sinistra dell'uguale const TString &dat= file->get(curr.mid(posrv)); // preleva il nome del campo del file alla destra dell'uguale e lo legge dal record if (fld[0]=='#') fld.ltrim(1); if (fld.right(1)== "@") { // se c'è la a-commerciale è un gruppo if (fld.find("->") != -1) { // se nel gruppo c'è la freccia si riferisce ad un'altra sezione sec= fld[0]; if (fld[1] != '-') pt= char2page(fld[1]); else pt= even_page; itms= section(sec, pt).fields(); } else { // altrimenti si riferisce alla sezione corrente sec= cf.section().section_type(); pt= cf.section().page_type(); itms= cf.section().fields(); } for (j=0; j,, // dove: nome tabella da leggere // costante stringa o riferimento a campo della form (preceduto da '#') da usare come chiave di ricerca // identificativo del campo da leggere dalla tabella TTable tab(s.get()); // prende il nome della tabella tab.zero(); // vuota il record corrente della tabella TString in(s.get()); // prende il valore o il campo da usare come codice di ricerca if (in.left(1)== '#') { in.ltrim(1); TForm_item &fi= cf.find_field(in); in= fi.get(); } tab.put("CODTAB", in); // setta la chiave nella tabella if (tab.read()== NOERR) { const TString &fld= s.get(); // prende il nome del campo da leggere... cf.set(tab.get(fld)); // ...e lo scrive nel campo del form } return (TRUE); } // fine _TABLEREAD if (code== "_DITTA") { // lettura dei dati della ditta // sintassi: _DITTA,{|} // dove: è un riferimento alla relazione di gestione dei dati della ditta (es. 113@->DENCOM è la denominazione del comune di residenza della ditta) // è uno delle macro seguenti: // !RAGSOC ragione sociale // !IND indirizzo (fiscale se c'è, oppure di residenza) // !NUM numero civico (fiscale se c'è, oppure di residenza) // !CAP CAP (fiscale se c'è, oppure di residenza) // !COM comune (fiscale se c'è, oppure di residenza) // !IVA partita iva // !CF codice fiscale // !TEL numero di telefono (con prefisso) // !FAX numero di fax (con prefisso) // nota: la relazione di della ditta è così strutturata: // %NDITTE (9) Dati ditte // + %ANAGR (6) Anagrafica generale (indirizzo, ecc.) // + %COMUNI (113@) Comune di residenza // + %COMUNI (213@) Comune di residenza fiscale TString in(s.get()); if (in[0]=='!') { in.ltrim(1); bool _fisc= _firmrel.lfile(6).get("INDRF").not_empty(); if (in=="RAGSOC") cf.set(_firmrel.lfile().get("RAGSOC")); if (in=="IND") { if (_fisc) cf.set(_firmrel.lfile(6).get("INDRF")); else cf.set(_firmrel.lfile(6).get("INDRES")); } if (in=="NUM") { if (_fisc) cf.set(_firmrel.lfile(6).get("CIVRF")); else cf.set(_firmrel.lfile(6).get("CIVRES")); } if (in=="CAP") { if (_fisc) cf.set(_firmrel.lfile(6).get("CAPRF")); else cf.set(_firmrel.lfile(6).get("CAPRES")); } if (in=="COM") { if (_fisc) cf.set(_firmrel.lfile(-213).get("DENCOM")); else cf.set(_firmrel.lfile(-113).get("DENCOM")); } if (in=="IVA") cf.set(_firmrel.lfile(6).get("PAIV")); if (in=="CF") cf.set(_firmrel.lfile(6).get("COFI")); if (in=="TEL") { TString tel(_firmrel.lfile().get("PTEL")); tel << "/" << _firmrel.lfile().get("TEL"); cf.set(tel); } if (in=="FAX") { TString tel(_firmrel.lfile().get("PFAX")); tel << "/" << _firmrel.lfile().get("FAX"); cf.set(tel); } } else { TFieldref fref(s.get(), 0); cf.set(fref.read(&_firmrel)); } return (TRUE); } // fine _DITTA if (code== "_CIFRELETTERE") { // conversione di un reale da cifre a lettere // sintassi: _CIFRELETTERE[,] // dove: è il campo della form (preceduto da '#') da cui prendere il valore, se non è specificato è sottointeso il campo corrente // nota: prende il valore del campo specificato e scrive la sua conversione in lettere nel campo corrente TString in; if (s.items()==2) { in= s.get(); if (in[0]== '#') in.ltrim(1); TForm_item &fi= cf.find_field(in); in= fi.get(); } else in= cf.get(); real n(in); cf.set(n.string("LETTERE")); return (TRUE); } // fine _CIFRELETTERE return TForm::validate(cf, s); // se il codice del messaggio non è identificato viene passato alla funzione standard } ////////////////////////////////////////////////////////////////////////////////////////////// // classe TStampa_Doc_Vendita customizzata dalla TApplication per l'applicazione principale ////////////////////////////////////////////////////////////////////////////////////////////// enum behaviour { skip, go, cancel }; class TStampa_Doc_Vendita: public TApplication { TString _codnum; // codice di numerazione TString _provv; // stampa provvisioria int _anno; // anno della documentazione long _dalnum, _alnum; // estremi di numerazione dei documenti bool _interattivo; // flag che indica se il prog. funziona in interattivo o in batch bool _definitiva; // flag che indica se la stampa è definitiva o no TRelation *_firmrel; // puntatore alla relazione che gestisce i dati della ditta corrente protected: virtual bool create(void); virtual bool destroy(void); virtual bool menu(MENU_TAG); int select(void); virtual void print(void); virtual void on_firm_change(void); virtual behaviour on_module_change(const TString &, TString &); // funzione chiamata ad ogni cambio modulo durante la stampa virtual bool query_final_print(void); // funzione chiamata all'inizializzazione per sapere se la stampa è definitiva }; bool TStampa_Doc_Vendita::create() { TApplication::create(); _firmrel= new TRelation(LF_NDITTE); // istanziamento e impostazione della relazione di gestione della ditta corrente _firmrel->add(LF_ANAG, "TIPOA=TIPOA|CODANAGR=CODANAGR"); _firmrel->add(LF_COMUNI, "COM=COMRES", 1, LF_ANAG, 100+LF_COMUNI); _firmrel->add(LF_COMUNI, "COM=COMRF", 1, LF_ANAG, 200+LF_COMUNI); if (argc()>2) { // lettura dei parametri iniziali dalla linea di comando _codnum= argv(2); // il primo parametro è il codice di numerazione _anno= atoi(argv(3)); // il secondo è l'anno _provv= argv(4); // il terzo è il flag di numerazione provvisoria _dalnum= atol(argv(5)); // il quarto è il numero di documento di partenza _alnum= atol(argv(6)); // il quinto è il numero di documento di fine _definitiva= (strcmp(argv(7), "D")==0); // il sesto è se la stampa è definitiva (rinumerazione dei documenti) _interattivo= FALSE; print(); } else { // oppure lancio della maschera _interattivo= TRUE; dispatch_e_menu(BAR_ITEM(1)); } return TRUE; } bool TStampa_Doc_Vendita::destroy() { delete _firmrel; // distruzione della relazione di gestione della ditta corrente return TApplication::destroy(); } void TStampa_Doc_Vendita::on_firm_change() { TLocalisamfile &firmfile= _firmrel->lfile(); firmfile.put("CODDITTA", get_firm()); _firmrel->read(); } int TStampa_Doc_Vendita::select() { TMask m("ve1100a"); if (m.run() == K_ENTER) { _codnum= m.get(F_CODNUM); // lettura dei dati dalla maschera _anno= m.get_int(F_ANNO); _provv= m.get(F_PROVV); _dalnum= m.get_long(F_DA_NDOC); _alnum= m.get_long(F_A_NDOC); return 1; } else return 0; // 0 indica che non si è usciti con "Conferma" dalla maschera } bool TStampa_Doc_Vendita::menu(MENU_TAG) { // procedura di dispatch dei menu int s; while ((s= select()) != 0) if (s==1) print(); // se la selezione della maschera ritorna 1 viene lanciata la stampa return FALSE; } void TStampa_Doc_Vendita::print() { _definitiva= query_final_print(); // legge il flag di stampa definitiva printer().open(); // apre la stampante TFilename nomeform, profilo; // istanzia le stringhe per il nome del form di stampa e del profilo di configurazione TString modulo_prec; // istanzia la stringa per l'inseguimento del modulo di carta TTable tip("%TIP"); // istanzia la tabella dei tipi di documento per i profili TRelation rel(LF_DOC); // istanzia la relazione sul file principale TCursor cur(&rel); // crea il cursore principale dalla relazione TLocalisamfile &doc= cur.file(); // prende il riferimento al file principale doc.zero(); // vuota il record del file doc.put("CODNUM", _codnum); // compone la chiave per il record di inizio cursore doc.put("ANNO", _anno); doc.put("PROVV", _provv); doc.put("NDOC", _dalnum); doc.read(); // posiziona il file sul record TRectype darec= doc.curr(); // copia il record di inizio cursore doc.zero(); // vuota il record del file doc.put("CODNUM", _codnum); // compone la chiave per il record di fine cursore doc.put("ANNO", _anno); doc.put("PROVV", _provv); doc.put("NDOC", _alnum); doc.read(); // posiziona il file sul record TRectype arec= doc.curr(); // copia il record di fine cursore cur.setregion(darec, arec); // imposta il filtro sul cursore di stampa (nell'ordine giusto :-) for (cur= 0; cur.pos()