From a20f793f789ff1191769d7c81e68e7efaf689b4a Mon Sep 17 00:00:00 2001 From: angelo Date: Mon, 10 Mar 1997 14:51:08 +0000 Subject: [PATCH] Aggiunta stampa lista documenti. git-svn-id: svn://10.65.10.50/trunk@4190 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ve/listadoc.frm | 208 ++++++++++++++++++++++++++++++++++++++++++++++++ ve/ve1.cpp | 4 +- ve/ve1.url | 15 +--- ve/ve1100.cpp | 160 +++++++++++++++++++++++++------------ 4 files changed, 321 insertions(+), 66 deletions(-) create mode 100755 ve/listadoc.frm diff --git a/ve/listadoc.frm b/ve/listadoc.frm new file mode 100755 index 000000000..14a3c2a01 --- /dev/null +++ b/ve/listadoc.frm @@ -0,0 +1,208 @@ +USE 33 +JOIN %TIP TO 33 INTO CODTAB==TIPODOC +END + +DESCRIPTION +BEGIN + 33->* "Documenti di vendita" + 20->* "Clienti/Fornitori" + %TIP->* "Tabella tipi documento" +END + +GENERAL +BEGIN + OFFSET 0 0 + FONT "Courier New" + SIZE 12 +END + +SECTION HEADER ODD 6 + +STRINGA 1 40 1 +BEGIN + KEY "nome ditta" + PROMPT 1 1 "Ditta " + MESSAGE _DITTA, !RAGSOC +END + +STRINGA 2 10 +BEGIN + KEY "Data" + PROMPT 120 1 "Data " + MESSAGE _DATA +END + +NUMERO 3 7 +BEGIN + KEY "Nr. pagina" + PROMPT 137 1 "Pagina " + MESSAGE _PAGENO +END + +NUMERO 4 25 +BEGIN + KEY "Intestazione stampa" + PROMPT 45 2 "Stampa lista documenti" +END + +STRINGA 5 146 +BEGIN + KEY "Separatore (iniziale)" + PROMPT 1 3 "------------------------------------------------------------------------------------------------------------------------------------------------------" +END + +STRINGA 6 8 +BEGIN + KEY "Intestazione (Cod. numerazione)" + PROMPT 1 4 "Cod. num." +END + +STRINGA 7 9 +BEGIN + KEY "Intestazione (Tipo doc.)" + PROMPT 11 4 "Tipo doc." +END + +STRINGA 8 8 +BEGIN + KEY "Intestazione (Numero doc.)" + PROMPT 22 4 "Nr. doc." +END + +STRINGA 9 9 +BEGIN + KEY "Intestazione (Data doc.)" + PROMPT 31 4 "Data doc." +END + +STRINGA 10 7 +BEGIN + KEY "Intestazione (Cliente)" + PROMPT 48 4 "Cliente" +END + +STRINGA 11 10 +BEGIN + KEY "Intestazione (Stato doc.)" + PROMPT 75 4 "Stato doc." +END + +STRINGA 12 10 +BEGIN + KEY "Intestazione (Imponibile)" + PROMPT 86 4 "Imponibile" +END + +STRINGA 13 10 +BEGIN + KEY "Intestazione (Spese)" + PROMPT 111 4 "Spese" +END + +STRINGA 14 10 +BEGIN + KEY "Intestazione (IVA)" + PROMPT 128 4 "IVA" +END + +STRINGA 15 14 +BEGIN + KEY "Intestazione (Importo totale)" + PROMPT 132 4 "Importo totale" +END + +STRINGA 16 146 +BEGIN + KEY "Separatore (finale)" + PROMPT 1 5 "------------------------------------------------------------------------------------------------------------------------------------------------------" +END + +END + +SECTION BODY ODD 2 + +STRINGA 17 4 +BEGIN + KEY "Codice numerazione" + PROMPT 1 1 "" + FIELD 33->CODNUM +END + +STRINGA 18 9 +BEGIN + KEY "Tipo documento" + PROMPT 11 1 "" + FIELD %TIP->S0 +END + +NUMERO 19 7 +BEGIN + KEY "Numero documento" + PROMPT 22 1 "" + FIELD 33->NDOC + PICTURE "#######" +END + +DATA 20 10 +BEGIN + KEY "Data documento" + PROMPT 31 1 "" + FILED 33->DATADOC +END + +NUMERO 21 7 +BEGIN + KEY "Codice cliente" + PROMPT 42 1 "" + FIELD 33->CODCF + PICTURE "#######" +END + +STRINGA 22 25 2 +BEGIN + KEY "Cliente ragione sociale" + PROMPT 51 1 "" + MESSAGE _CLIENTE,!RAGSOC +END + +STRINGA 23 1 +BEGIN + KEY "Stato documento" + PROMPT 76 1 "" + FIELD 33->STATO +END + +NUMBER 24 15 +BEGIN + KEY "Totale imponibile" + PROMPT 86 1 "" + MESSAGE _TOTIMPONIBILI,1 + PICTURE "###.###.###.###" +END + +NUMBER 25 15 +BEGIN + KEY "Spese" + PROMPT 101 1 "" + PICTURE "###.###.###.###" + FIELD TOTSPE +END + +NUMBER 26 15 +BEGIN + KEY "Totale imposte" + PROMPT 116 1 "" + FIELD IMPOSTE + PICTURE "###.###.###.###" +END + +NUMBER 27 15 +BEGIN + KEY "Totale documento" + PROMPT 131 1 "" + FIELD TOTDOC + PICTURE "###.###.###.###" +END + +END + diff --git a/ve/ve1.cpp b/ve/ve1.cpp index fb0ef0c93..5e1b3db85 100755 --- a/ve/ve1.cpp +++ b/ve/ve1.cpp @@ -2,7 +2,7 @@ #include #include -extern int ve1100(int argc, char* argv[]); // stampa documenti di vendita tramite form derivati +extern int ve1100(int argc, char** argv); // stampa documenti di vendita tramite form derivati int main(int argc, char **argv) { int rt= -1; @@ -10,7 +10,7 @@ int main(int argc, char **argv) { switch (r) { case 0: rt= ve1100(argc, argv); break; - default: error_box("Sintassi: %s [-0 [params]]", argv[0]); break; + default: error_box("Sintassi: %s [-0 {[params]|[L]}]", argv[0]); break; } return (rt); } diff --git a/ve/ve1.url b/ve/ve1.url index be57df197..02e9af4ce 100755 --- a/ve/ve1.url +++ b/ve/ve1.url @@ -8,23 +8,12 @@ SUBMENU MENU_FILE "~File" ITEM BAR_ITEM(1) "~Parametri" -MENUBAR MENU_BAR(1) +/* ve1 -0 */ +MENUBAR MENU_BAR(1) MENU MENU_BAR(1) SUBMENU MENU_FILE "~File" ITEM BAR_ITEM(1) "~Parametri" - MENUBAR MENU_BAR(2) - - MENU MENU_BAR(2) - SUBMENU MENU_FILE "~File" - ITEM BAR_ITEM(1) "~Parametri" - - MENUBAR MENU_BAR(3) - - MENU MENU_BAR(3) - SUBMENU MENU_FILE "~File" - ITEM BAR_ITEM(1) "~Parametri" - diff --git a/ve/ve1100.cpp b/ve/ve1100.cpp index 8d2462102..1befb97a6 100755 --- a/ve/ve1100.cpp +++ b/ve/ve1100.cpp @@ -18,7 +18,8 @@ #include "velib02.h" -#define Usage "Usage: ve1 -1 [codnum anno {D|P} dalnum alnum {D|P} [ncopie]]" +#define LISTADOC "listadoc" +#define Usage "Usage: ve1 -0 {[codnum anno {D|P} dalnum alnum {D|P} [ncopie]] | [L]}" // Queste classi (TDocisamfile e TRDocisamfile) servono nel costruttore di TDocumento_form // in modo da sostituire i file della relazione, ovvero LF_DOC e LF_RIGHEDOC. @@ -28,13 +29,26 @@ class TDocisamfile : public TLocalisamfile { - TDocumento *_doc; + TDocumentoEsteso *_doc; public: virtual TRectype& curr() const { return (TRectype&) *_doc; } - TDocisamfile(TDocumento* doc) : TLocalisamfile(LF_DOC) { _doc = doc;} + virtual int readat(TRecnotype nrec, word lockop = _nolock); + TDocisamfile(TDocumentoEsteso* doc) : TLocalisamfile(LF_DOC) { _doc = doc;} virtual ~TDocisamfile() {}; }; +int TDocisamfile::readat(TRecnotype nrec, word lockop) +{ + int err = TBaseisamfile::readat(nrec, _nolock); + if (err == NOERR) + if ((err=_doc->read(curr())) == NOERR) + { + _doc->summary_reset(); + _doc->summary_filter(1); + } + return err; + //return err == NOERR ? _doc->read(curr()) : err; +} class TRDocisamfile : public TLocalisamfile { TDocumento *_doc; @@ -65,6 +79,7 @@ class TDocumento_form : public TForm TString_array _exclude_array; // array di coppie tipo/articolo da escludere dalla stampa TDocumentoEsteso * _doc; // Documento da stampare bool _valid, _cli_loaded; // flag che indica se il form e' valido | se l'oggetto cliente è già stato caricato + bool _is_lista; // flag che indica se il form e' usato per la stampa della lista documenti TString_array _group_decimals; // Array di TToken_string per ogni gruppo definito in GENERAL. // Il primo elelemento della token_string conterra' il numero del gruppo // il secondo il n.ro di decimali per importi in lire ed il terzo il n.ro @@ -104,6 +119,7 @@ public: TString_array & exclude_list() { return _exclude_array; } TDocumentoEsteso& doc() { return *_doc; } TDocumento_form(TRectype&/*TDocumentoEsteso **/ doc, TRelation& rel, const bool definitiva, const bool interattivo); + TDocumento_form(const char* form, TRelation& rel); virtual ~TDocumento_form(); }; @@ -155,6 +171,7 @@ TDocumento_form::TDocumento_form(TRectype&/*TDocumentoEsteso**/ doc, TRelation& read(nomeform); _cliente= new TCliFor; _cli_loaded= FALSE; + _is_lista = FALSE; _doc = new TDocumentoEsteso(doc); // istanzia TDocumentoEsteso _docfile = new TDocisamfile(_doc); @@ -194,6 +211,20 @@ TDocumento_form::TDocumento_form(TRectype&/*TDocumentoEsteso**/ doc, TRelation& pr.footerlen(foot.height()); } +// costruttore per stampa lista documenti (uso convenzionale dei forms) +TDocumento_form::TDocumento_form(const char* form, TRelation& rel): TForm(form), _firmrel(rel), _valid(FALSE) +{ + _is_lista = TRUE; + _rdocfile=NULL; + _tip = new TTable("%TIP"); + _tab = new TLocalisamfile(LF_TAB); + _cliente= new TCliFor; + _cli_loaded= FALSE; + _doc = new TDocumentoEsteso; + _docfile = new TDocisamfile(_doc); + relation()->replace(_docfile,0); +} + TDocumento_form::~TDocumento_form() { delete _cliente; @@ -649,7 +680,7 @@ bool TDocumento_form::validate(TForm_item &cf, TToken_string &s) { // + %COMUNI (213@) Comune di nascita TLocalisamfile &doc= (cursor())->file(LF_DOC); TString16 tipocf= doc.get("TIPOCF"), codcf= doc.get("CODCF"), ocfpi= doc.get("OCFPI"); - if (!_cli_loaded ) { // il cliente è sulla testata del documento di vendita, quindi può essere caricato una volta sola per tutte + if (!_cli_loaded || _is_lista) { // il cliente è sulla testata del documento di vendita, quindi può essere caricato una volta sola per tutte _cliente->load(tipocf[0], atol(codcf), ocfpi); _cliente->add(LF_COMUNI, "COM=STATOCF+COMCF", 1, LF_CLIFO, 100+LF_COMUNI); _cliente->add(LF_COMUNI, "COM=STATONASC+COMNASC", 1, LF_CLIFO, 200+LF_COMUNI); @@ -659,7 +690,10 @@ bool TDocumento_form::validate(TForm_item &cf, TToken_string &s) { if (in[0]=='!') { in.ltrim(1); if (in=="RAGSOC") + { valore = _cliente->get(LF_CLIFO, "RAGSOC"); + valore.strip_d_spaces(); + } if (in=="IND") valore = _cliente->get(LF_CLIFO, "INDCF"); if (in=="NUM") @@ -791,6 +825,13 @@ bool TDocumento_form::validate(TForm_item &cf, TToken_string &s) { cf.put_paragraph(pg); } + // Messaggio per stampare la data di oggi + if (code== "_DATA") + { + TString16 pg(TDate(TODAY).string()); + cf.put_paragraph(pg); + } + if (code== "_RIEPILOGOIVA") { // tabella riepilogo aliquote iva e relative imposte // sintassi: _RIEPILOGOIVA,,, @@ -924,6 +965,7 @@ class TStampaDoc_application: public TApplication long _dalnum, _alnum; // estremi di numerazione dei documenti TDate _dadata, _adata; // estremi di data dei documenti bool _interattivo; // flag che indica se il prog. funziona in interattivo o in batch + bool _is_lista; // flga che indica se e' stata selezionata la lista documenti bool _definitiva; // flag che indica se la stampa è definitiva o no TRelation *_firmrel; // puntatore alla relazione che gestisce i dati della ditta corrente TDocumento_form *_form; // puntatore al form di stampa @@ -977,7 +1019,7 @@ void TStampaDoc_application::print_selected() error_box("Non vi sono documenti da stampare nell'intervallo indicato"); return; } - _definitiva= query_final_print(); // legge il flag di stampa definitiva + if (!_is_lista) _definitiva= query_final_print(); // legge il flag di stampa definitiva TPrinter& pr = printer(); pr.open(); @@ -985,51 +1027,60 @@ void TStampaDoc_application::print_selected() TProgind* pi = pr.printtype() != screenvis ? new TProgind(cur.items(),"Stampa documenti in corso...",FALSE,TRUE,10) : NULL; - - cur.setregion(darec, arec); - const long items = cur.items(); - behaviour whattodo = go; - bool first_inst = TRUE; - //TDocumentoEsteso *documento = new TDocumentoEsteso; - //cur.file().set_curr(documento); - for (long i = 0; i < items; i++) + if (!_is_lista) { - cur = i; // Posiziona il documento - _form = new TDocumento_form(cur.curr()/*documento*/, *_firmrel, _definitiva, _interattivo); // Istanzia il form - - if (!_form->valid()) break; // interrompe la stampa se il doc corrente non e' tra i tipi validi - const TString &modulo= _form->get_module_code(); // legge dal form il codice del modulo di carta per la stampa - if (modulo_prec.empty()) modulo_prec = modulo; // se siamo al primo passaggio la variabile di modulo precedente viene riempita - else first_inst = FALSE; - const bool module_changed = modulo != modulo_prec; - if (first_inst || module_changed) - if (!_form->doc_arrange()) // Setta l'offset o posiziona manualmente - break; // Se vi sono errori interrompe la stampa - if (module_changed) whattodo = on_module_change(modulo, modulo_prec); // se il modulo è cambiato dalla stampa precedente interroga la funzione per sapere che comportamento tenere - if (whattodo==cancel) break; // se non si può procedere la stampa viene interrotta - if (whattodo==skip) continue; // Salta il documento corrente - // altrimenti prosegue - - // Carica il numero di copie da stampare per questo form - int ncopie = _ncopie == 0 ? _form->ncopie() : _ncopie; // Numero di copie da stampare per questo documento - if (ncopie == 0) ncopie = 1; - - for (int n=0; n < ncopie; n++) + cur.setregion(darec, arec); + const long items = cur.items(); + behaviour whattodo = go; + bool first_inst = TRUE; + //TDocumentoEsteso *documento = new TDocumentoEsteso; + //cur.file().set_curr(documento); + for (long i = 0; i < items; i++) { - print_documento(); - _form->doc().summary_reset(); - _form->doc().scadenze_reset(); - } - delete _form; - - if (_definitiva && (numerazione_definitiva(doc) != NOERR)) - { // se la stampa è definitiva viene lanciata la procedura di rinumerazione - if (_interattivo) error_box("Non è possibile completare la procedura di numerazione definitiva dei documenti"); - break; - } - } + cur = i; // Posiziona il documento + _form = new TDocumento_form(cur.curr()/*documento*/, *_firmrel, _definitiva, _interattivo); // Istanzia il form + + if (!_form->valid()) break; // interrompe la stampa se il doc corrente non e' tra i tipi validi + const TString &modulo= _form->get_module_code(); // legge dal form il codice del modulo di carta per la stampa + if (modulo_prec.empty()) modulo_prec = modulo; // se siamo al primo passaggio la variabile di modulo precedente viene riempita + else first_inst = FALSE; + const bool module_changed = modulo != modulo_prec; + if (first_inst || module_changed) + if (!_form->doc_arrange()) // Setta l'offset o posiziona manualmente + break; // Se vi sono errori interrompe la stampa + if (module_changed) whattodo = on_module_change(modulo, modulo_prec); // se il modulo è cambiato dalla stampa precedente interroga la funzione per sapere che comportamento tenere + if (whattodo==cancel) break; // se non si può procedere la stampa viene interrotta + if (whattodo==skip) continue; // Salta il documento corrente + // altrimenti prosegue - // Non viene fatta la delete documento perche' gia' presente nella distruzione del cursore, avendo fatto una set_curr() + // Carica il numero di copie da stampare per questo form + int ncopie = _ncopie == 0 ? _form->ncopie() : _ncopie; // Numero di copie da stampare per questo documento + if (ncopie == 0) ncopie = 1; + + for (int n=0; n < ncopie; n++) + { + print_documento(); + _form->doc().summary_reset(); + _form->doc().scadenze_reset(); + } + delete _form; + + if (_definitiva && (numerazione_definitiva(doc) != NOERR)) + { // se la stampa è definitiva viene lanciata la procedura di rinumerazione + if (_interattivo) error_box("Non è possibile completare la procedura di numerazione definitiva dei documenti"); + break; + } + } + + // Non viene fatta la delete documento perche' gia' presente nella distruzione del cursore, avendo fatto una set_curr() + } + else // Lista documenti + { + _form = new TDocumento_form(LISTADOC,*_firmrel); + _form->cursor()->setregion(darec,arec); + _form->print(); + delete _form; + } if (pi != NULL) delete pi; printer().close(); @@ -1148,7 +1199,7 @@ bool TStampaDoc_application::create() _firmrel->add(LF_COMUNI, "COM=STATORES+COMRF", 1, LF_ANAG, 200+LF_COMUNI); const int argc = TApplication::argc(); - if (argc>2) + if (argc>3) { // 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 @@ -1173,13 +1224,16 @@ bool TStampaDoc_application::create() return FALSE; } else - if (argc == 2) + { + _is_lista = argc == 3 && argv(2)[0] == 'L'; + if (argc == 2 || _is_lista) { // oppure lancio della maschera _interattivo= TRUE; dispatch_e_menu(BAR_ITEM(1)); } else return error_box(Usage); + } return TRUE; } @@ -1199,6 +1253,8 @@ void TStampaDoc_application::on_firm_change() bool TStampaDoc_application::select() { TMask m("ve1100a"); + + if (_is_lista) m.hide(F_NCOPIE); TString wdate; m.set_handler(F_DA_DATADOC, date2num_handler); m.set_handler(F_A_DATADOC, date2num_handler); @@ -1231,10 +1287,12 @@ bool TStampaDoc_application::menu(MENU_TAG) } // Do all the work! -int ve1100(int argc, char* argv[]) +int ve1100(int argc, char** argv) { + TStampaDoc_application a; - a.run(argc, argv, "Stampa documenti di vendita"); + const bool cond = argc == 4 && argv[2][0] == 'L'; // List documenti + a.run(argc, argv, cond ? "Lista documenti" : "Stampa documenti di vendita"); return (0); }