// ba3200 Stampa tabelle // // legge un file con estensione .rpt che descrive la stampa. // Vedi file leggimi.txt per il formato del file // #include #include #include #include #include #include "ba3.h" #include "ba3200.h" #define FOOTER_LEN 4 // se non ridefinito nel .rpt class BA3200_application : public TPrintapp { // TTable* _tab; TString _tabname; TFilename _rptname; TRelation* _rel; TCursor *_cur; TMask* _msk; TString _maskname; // TScanner *_rpt; int _logicnum; public: virtual void user_create() ; virtual void user_destroy() ; virtual bool set_print(int) ; virtual void set_page(int, int); void leggi_rpt(); void set_headers(); void set_rows(); void set_footers(); void set_translations(); BA3200_application(const char * tabname) : _tabname(tabname) {} virtual ~BA3200_application() {} }; bool BA3200_application::set_print(int) { TRectype from(_rel->lfile()->curr()); TRectype to (_rel->lfile()->curr()); from.zero(); to.zero(); const KEY tasto = _msk->run(); if (tasto == K_ENTER) { const int campi_maschera = _msk->fields(); // - 2; Tolgo bottoni... for (int i = 0; i < campi_maschera; i++) { const TMask_field& campo_maschera = _msk->fld(i); const char* val = campo_maschera.get(); const TFieldref* campo_ref = campo_maschera.field(); if (*val && campo_ref != NULL && campo_ref->ok()) { if (campo_maschera.in_group(1)) campo_ref->write(val, from); else if (campo_maschera.in_group(2)) campo_ref->write(val, to); } } _cur->filter ("", from.empty() ? NULL : &from, to.empty() ? NULL : &to); return TRUE; } return FALSE; } void BA3200_application::set_page (int , int ) { leggi_rpt(); } void BA3200_application::set_headers() { TString NomeTabella, sep, formato_intesta, testo_intesta; int LungRiga, riga_intesta=0, last_riga=1; TToken_string line; reset_header (); TScanner rpt(_rptname); rpt.paragraph("Headers"); // Leggo la lunghezza della riga (usata per centrare l'intestazione) line = rpt.line(); LungRiga = line.get_int(); // Leggo il nome della tabella line = rpt.line(); NomeTabella = line.get(); // Centro il nome della tabella e aggiungo il numero di pagina NomeTabella.center_just (LungRiga); NomeTabella.overwrite ("Pag. @#", NomeTabella.len()-8); set_header (last_riga, "%s", (const char *)NomeTabella); last_riga++; // Aggiungo una riga vuota per separare prima intestazione sep.fill ('-', LungRiga); set_header (last_riga, "%s", (const char *)sep); line = rpt.line(); while ( (line != "") && (line[0] != '[') ) { riga_intesta = atoi (line.get()); formato_intesta = line.get(); testo_intesta = (const char *) line.get(); if (riga_intesta) set_header (last_riga+riga_intesta, (const char *)formato_intesta, (const char *)testo_intesta); line = rpt.line(); } if (riga_intesta) last_riga += riga_intesta; last_riga++; set_header (last_riga, (const char *)sep); last_riga++; sep.fill(' '); set_header (last_riga, (const char *)sep); } void BA3200_application::set_rows() { TToken_string line; TFieldref campo; int from, to, riga_record; TString formato_campo, picture; const char * name; TScanner rpt(_rptname); rpt.paragraph("Rows"); line = rpt.line(); while ( (line != "") && (line[0] != '[') ) { riga_record = line.get_int(); campo = line.get(); from = campo.from(); to = campo.to(); name = campo.name(); formato_campo = line.get(); formato_campo.trim(); if (formato_campo.lower() == "@pn") picture = line.get(); else picture = ""; if (to == -1) if (picture != "") set_row (riga_record, formato_campo, FLD(_logicnum,name,picture) ); else set_row (riga_record, formato_campo, FLD(_logicnum,name) ); else set_row (riga_record, formato_campo, FLD(_logicnum,name,from,to) ); line = (const char *) rpt.line(); } } void BA3200_application::set_footers() { TToken_string line; int footer_len, riga; TString formato, testo; reset_footer(); TScanner rpt(_rptname); rpt.paragraph("Footers"); line = rpt.line(); footer_len = line.get_int(); if (footer_len) printer().footerlen (footer_len); line = rpt.line(); while ( (line != "") && (line[0] != '[') ) { riga = line.get_int(); formato = line.get(); testo = line.get(); set_footer (riga, (const char *)formato, (const char*)testo); line = rpt.line(); } } void BA3200_application::set_translations() { TString campo, from, to; TToken_string line; int logicnum; TScanner rpt(_rptname); rpt.paragraph("Translations"); line = rpt.line(); while ( (line != "") && (line[0] != '[') ) { logicnum = line.get_int(); campo = line.get(); from = line.get(); to = line.get(); set_translation (logicnum, (char*)(const char *)campo, (char*)(const char *)from, (char*)(const char *)to); line = rpt.line(); } } void BA3200_application::leggi_rpt() { set_rows(); } void BA3200_application::user_create() { _rptname << "batb" << _tabname << ".rpt" ; if (!fexist(_rptname)) fatal_box("Impossibile aprire il file '%s'", (const char*)_rptname); // _tab = new TTable (_tabname); _rel = new TRelation (_tabname); _cur = new TCursor (_rel); _maskname << "bast" << _tabname; _msk = new TMask (_maskname) ; add_cursor (_cur); add_file (_tabname); _logicnum = _cur->file()->num(); reset_print (); printer().footerlen (FOOTER_LEN); for (int i=1; i <= FOOTER_LEN; i++) set_footer(i, "%s", " "); set_headers(); set_footers(); set_translations(); } void BA3200_application::user_destroy() { delete _msk; delete _cur; delete _rel; // delete _tab; } int ba3200(int argc, char* argv[]) { BA3200_application a(argv[2]) ; a.run(argc, argv, "Tabella"); return 0; }