#include #include #include #include #include #include #include #include #include #include #include #include #include "ba3.h" #include "ba3600.h" #define ALIAS 50 extern char __tmp [MAXSTR]; static TFixed_string tmp(__tmp, MAXSTR); const int TABLBU = (int)TTable::name2log("%LBU"); const int TABINL = (int)TTable::name2log("%INL"); class BA3600_application : public TPrintapp { struct ind_lib { char mese[3]; char anno[5]; char nini_plib[6]; long num_riga; long nfin_plib; long codditta; char cod_reg[4]; long nini_put; long nfin_put; char cod_vid[4]; bool stamp_bol; bool pag_ann; }; TMask* _msk; TTable* _tab_inl; TTable* _tab_lbu; TTable* _tab_reg; TLocalisamfile* _nditte; TSort* _sort; TProgind* _prog; ind_lib* _lib; const char* _buff; TDate _datastampa; int _tipo_stampa, _meseda, _mesea; long _anno, _numini_paglib, _numfin_paglib, _numini_pagut, _numfin_pagut; long _codditta, _pag_fin, _num_riga, _nfin_plib_prec; TString _cod_lib, _rag_soc, _cod_reg, _descrizione, _cod_vidimaz; TString _cod_lib_stampa, _stamp_bollato_str; bool _stamp_bollato, _pag_ann, _pag_fuori_sequenza; public: bool menu (MENU_TAG m) { return TPrintapp::menu(m) ; } void user_create() ; void user_destroy(); bool set_print(int); virtual bool preprocess_page (int,int); virtual print_action postprocess_page (int,int); virtual void preprocess_header(); virtual void set_page(int,int); void init_sort(); void crea_sort(); bool preprocess_prova(int); bool preprocess_bollato(); void crea_intestazione(); const char* ragsoc_ditta(long); const char* descrizione_codreg(TString&); void setta_righe_prova(); void setta_righe_bollato(); BA3600_application() {} }; void BA3600_application::init_sort() { _lib = new ind_lib; _sort = new TSort (sizeof(ind_lib)); _sort -> addsortkey((char*)&(_lib->mese) - (char*)&(_lib->mese),2); _sort -> addsortkey((char*)&(_lib->anno) - (char*)&(_lib->anno),4); _sort -> addsortkey((char*)&(_lib->nini_plib) - (char*)&(_lib->nini_plib),5); _sort->init(); } //Crea sort ordina i record della tabella %INL per mese registrazione, anno //registrazione e numero iniziale pagine registro libro unico void BA3600_application::crea_sort() { long anno,numini_paglib,numfin_paglib,codditta,numini_pagut,numfin_pagut; TString cod_reg,cod_vidimaz,dep,app; long mese, ultimo_mese; bool stamp_bollato = FALSE; bool pagine_ann = FALSE; bool stampato = FALSE; mese = 0; ultimo_mese = 0; init_sort(); _tab_lbu->zero(); // TString dep (format ("%4d%-3s", _anno, (const char*) _cod_lib)); // sprintf(__tmp, "%4d", _anno); // strcat (__tmp, _cod_lib); dep = format ("%4d", _anno); dep << format ("%-3s", (const char*) _cod_lib); _tab_lbu->put("CODTAB", (const char*) dep); if (_tab_lbu->read(_isequal) == NOERR) { _tab_inl->zero(); app = format("%4d" , _anno); app << format("%-3s", (const char*) _cod_lib); _tab_inl->put("CODTAB", (const char*) app); TRectype rec (_tab_inl->curr()); for (_tab_inl->read(); !_tab_inl->eof(); _tab_inl->next()) { if (_tab_inl->curr() > rec) break; mese = _tab_inl->get_int("I1"); if (((_tipo_stampa == 1) && (mese >= _meseda) && (mese <= _mesea)) || ((_tipo_stampa == 2) && (mese == _mesea))) { TRecfield num_riga (_tab_inl->curr(),"CODTAB",7,12); anno = _tab_inl->get_long("I0"); numini_paglib = _tab_inl->get_long("I2"); numfin_paglib = _tab_inl->get_long("I3"); codditta = _tab_inl->get_long("I4"); cod_reg = _tab_inl->get("S0"); cod_vidimaz = _tab_inl->get("S1"); numini_pagut = _tab_inl->get_long("I5"); numfin_pagut = _tab_inl->get_long("I6"); stamp_bollato = _tab_inl->get_bool("B0"); pagine_ann = _tab_inl->get_bool("B1"); //Se tipo_stampa = 1 (stampa di prova) stampo ugualmente. Se tipo_stampa = 2 // (stampa su bollato), stampo solamente se il flag di stampa su bollato e' // FALSE. if ((_tipo_stampa == 1) || ((_tipo_stampa == 2) && (!stamp_bollato))) { ultimo_mese = mese; stampato = TRUE; sprintf (_lib->mese, "%2d", mese); sprintf (_lib->anno, "%4d", anno); sprintf (_lib->nini_plib, "%5d", numini_paglib); _lib->num_riga = long(num_riga); _lib->nfin_plib = numfin_paglib; _lib->codditta = codditta; sprintf (_lib->cod_reg, "%3s", (const char*) cod_reg); _lib->nini_put = numini_pagut; _lib->nfin_put = numfin_pagut; sprintf (_lib->cod_vid, "%3s", (const char*) cod_vidimaz); _lib->stamp_bol = stamp_bollato; _lib->pag_ann = pagine_ann; _sort->sort ((const char*) _lib); //Se si tratta di una stampa su bollato e il flag "stampa su bollato" indica //che non e' mai stato stampato su bollato (flag = FALSE), allora devo stampare //il record della tabella %INL, e contemporaneamente aggiornare il flag, per //evitare di ristampare successivamente su bollato if (_tipo_stampa == 2) { _tab_inl->put("B0", "X"); _tab_inl->rewrite(); } } } } _sort->endsort(); } // Se si tratta di una stampa su libro bollato, aggiorno sulla tabella %LBU // l' ultimo mese stampato, l' ultima pagina stampata e il flag che indica se // quel record e' stato stampato su bollato if ((_tipo_stampa == 2) && (stampato)) // stampato e' il flag che mi dice { //se almeno un record, nella stampa _tab_lbu->put("I0", ultimo_mese); //su bollato, va in stampa. In caso _tab_lbu->put("I1", numfin_paglib); //contrario non avrebbe senso _tab_lbu->rewrite(); //aggiornare %LBU. ES:tutti i record } //di quel mese sono gia stati stampati } //su bollato (flag = TRUE). bool BA3600_application::set_print(int) { KEY tasto; tasto = _msk->run(); if (tasto == K_ENTER) { _tipo_stampa = _msk->get_int(F_TIPO_STAMPA); if (_tipo_stampa == 1) { _cod_lib = _msk->get(F_LIBRO_UNICO1); _datastampa = (_msk->get(F_DATA_STAMPA)); _meseda = _msk->get_int(F_MESEDA); _mesea = _msk->get_int(F_MESEA); _anno = _msk->get_long(F_ANNOA); } else if (_tipo_stampa == 2) { _cod_lib = _msk->get(F_LIBRO_UNICO2); _mesea = _msk->get_int(F_STAMPA_MESE); _anno = _msk->get_long(F_STAMPA_ANNO); _cod_lib_stampa = _msk->get(F_CODLIB_STAMPA); _pag_fin = _msk->get_long(F_PAGFINALE); } _pag_fuori_sequenza = FALSE; crea_sort(); crea_intestazione(); return TRUE; } return FALSE; } /********* bool BA3600_application::preprocess_page(int file, int counter) { if (_tipo_stampa == 1) { if (preprocess_prova(counter)) return TRUE; else return FALSE; } else if (_tipo_stampa == 2) { if (preprocess_bollato()) return TRUE; else return FALSE; } return TRUE; } ***********/ bool BA3600_application::preprocess_page(int file, int counter) { struct ind_lib* lib = (struct ind_lib*) _buff; long nini_plib; reset_print(); _buff = _sort->retrieve(); if (_buff != NULL) { lib = (struct ind_lib*) _buff; _numini_paglib = atoi(lib->nini_plib); _numfin_paglib = lib->nfin_plib; _codditta = lib->codditta; _rag_soc = ragsoc_ditta(_codditta); _cod_reg = lib->cod_reg; _descrizione = descrizione_codreg(_cod_reg); _cod_vidimaz = lib->cod_vid; _numini_pagut = lib->nini_put; _numfin_pagut = lib->nfin_put; _num_riga = lib->num_riga; _stamp_bollato = lib->stamp_bol; _pag_ann = lib->pag_ann; // _stamp_bollato_str = _stamp_bollato.string(); //Il controllo di pagine fuori sequenza viene sempre effettuato, tranne che per //il primo record. if (counter) { nini_plib = _numini_paglib - 1; if (_nfin_plib_prec != nini_plib) _pag_fuori_sequenza = TRUE; else _pag_fuori_sequenza = FALSE; } _nfin_plib_prec = _numfin_paglib; return TRUE; } else return FALSE; return TRUE; } /******* bool BA3600_application::preprocess_bollato() { } ******/ void BA3600_application::set_page(int file, int counter) { if (_tipo_stampa == 1) setta_righe_prova(); else if (_tipo_stampa == 2) setta_righe_bollato(); } void BA3600_application::setta_righe_prova() { int i; i = 1; if (_pag_fuori_sequenza) set_row (i++,"@10gPAGINE FUORI SEQUENZA"); set_row (i,"@1g#t", &_cod_lib); set_row (i,"@6g#5d", &_numini_paglib); set_row (i,"@13g#5d", &_numfin_paglib); set_row (i,"@21g#5d", &_codditta); set_row (i,"@27g#.41t", &_rag_soc); set_row (i,"@69g#t", &_cod_reg); set_row (i,"@73g#.31t", &_descrizione); set_row (i,"@105g#t", &_cod_vidimaz); set_row (i,"@111g#5d", &_numini_pagut); set_row (i,"@117g#5d", &_numfin_pagut); set_row (i,"@124g#5d", &_num_riga); set_row (i,"@130g#t", &_stamp_bollato_str); } void BA3600_application::setta_righe_bollato() { int i; i = 1; if (_pag_fuori_sequenza) set_row (i++,"@10gPAGINE FUORI SEQUENZA"); set_row (i,"@1g#t", &_cod_lib); set_row (i,"@6g#5d", &_numini_paglib); set_row (i,"@13g#5d", &_numfin_paglib); if ((_pag_ann) && (_codditta == 0)) set_row (i,"@27gPAGINE ANNULLATE"); else { set_row (i,"@21g#5d", &_codditta); set_row (i,"@27g#.41t", &_rag_soc); } if ((_pag_ann) && (_cod_reg == "")) set_row (i,"@73gPAGINE ANNULLATE"); else { set_row (i,"@69g#t", &_cod_reg); set_row (i,"@73g#.31t", &_descrizione); } set_row (i,"@105g#t", &_cod_vidimaz); set_row (i,"@111g#5d", &_numini_pagut); set_row (i,"@117g#5d", &_numfin_pagut); set_row (i,"@124g#5d", &_num_riga); set_row (i,"@130g#t", &_stamp_bollato_str); } print_action BA3600_application::postprocess_page(int file, int counter) { if (_buff == NULL) return NEXT_PAGE; return REPEAT_PAGE; } const char* BA3600_application::ragsoc_ditta(long codditta) { TLocalisamfile nditte(LF_NDITTE); nditte.zero(); nditte.put(NDT_CODDITTA, codditta); nditte.read(); if (nditte.bad()) nditte.zero(); tmp = nditte.get(NDT_RAGSOC); return (__tmp); } const char* BA3600_application::descrizione_codreg(TString& codreg) { TString dep; _tab_reg->zero(); dep = format("%4d", _anno); dep << format("%-3s", (const char*) codreg); _tab_reg->put("CODTAB", dep); _tab_reg->read(); if (_tab_reg->bad()) _tab_reg->zero(); tmp = _tab_reg->get("S0"); return (__tmp); } void BA3600_application::preprocess_header() { } void BA3600_application::crea_intestazione() { TString datastampastr; TString sep(132); reset_header(); set_header (1,"Studio"); sep << "Pag. @#"; sep.right_just(132); set_header (2,(const char*) sep); datastampastr = _datastampa.string(); set_header (2,"@0gPartita iva"); set_header (2,"@30gCodice fiscale"); if (_tipo_stampa == 1) { set_header (2,"@75gLIBRO UNICO DI PROVA"); set_header (2,"@105gData@110g%s",(const char*) datastampastr); } else if (_tipo_stampa == 2) { TString mese = itom(_mesea); set_header (2,"@75gmese di ", (const char*) mese); set_header (2,"@92g%4d", _anno); } set_header (3,"@0gLibro unico :"); sep.fill('-'); //Stampa 132 - (sep(132)) set_header (4, (const char *) sep); set_header (5,"@0gCod.@6gNumero@13gpagine@21gCodice@69gCod.@104gCodice@111gN.pag.@118gutente@126gNum.@131gF"); set_header (6,"@0gLibro@8gda@16ga@21gditta@28gDenominazione@69greg.@74gDescrizione@104gvidim.@112gutilizzate@126greg.@131g8"); set_header (7, (const char *) sep); } void BA3600_application::user_create() { _nditte = new TLocalisamfile (LF_NDITTE); _tab_inl = new TTable (TAB_INL); _tab_lbu = new TTable (TAB_LBU); _tab_reg = new TTable (TAB_REG); _msk = new TMask("ba3600a"); } void BA3600_application::user_destroy() { delete _msk; delete _tab_inl; delete _tab_lbu; delete _tab_reg; delete _nditte; } int ba3600 (int argc, char* argv[]) { BA3600_application a; a.run(argc, argv, "Stampa indici registro libro unico"); return 0; }