// Stampa base #include "77stba.h" const int _RIGHE_N = 6; const int _RIGHE_R = 2; const int _RIGHE_P = 4; const int _RIGHE_Q = 4; const int _RIGHE_S = 4; const int _RIGHE_T = 4; const int _RIGHE_NA = 8; const int _RIGHE_RA = 4; const int _RIGHE_PA = 10; const int _RIGHE_QA = 4; const int _RIGHE_SA = 6; const int _RIGHE_TA = 4; int TBase1::dic_form_len() const { if (curr_page()==PRIMA && _PaginaPosizionamento) return BASE_FORMLEN-HEADER_PRIMA_NOPOS; else return BASE_FORMLEN; } int TBase1::prima_riga(PaginaQuadro p) const { if (p==PRIMA && _PaginaPosizionamento) return 11; else return 11+HEADER_PRIMA_NOPOS; } TBase1::TBase1(const char* sNomeForm, const char* quadro) : TDicForm(sNomeForm, quadro) { r = new TRelation(LF_SOCI); r->add(LF_ANAG, "TIPOA=TIPOASOC|CODANAGR=CODANAGRSO"); r->add(LF_ANAGFIS, "CODANAGR=CODANAGR",1, LF_ANAG); r->add(LF_COMUNI, "COM=COMNASC",1,LF_ANAGFIS); c = new TCursor(r); _bAllegSoci=FALSE; _base_formlen = BASE_FORMLEN; } TBase1::~TBase1() { delete r; delete c; } void TBase1::compatta_depositario() { TPrint_section& totali = section('B', first_page); TForm_item& signature = totali.find_field(78); const int y = signature.y(); TString spazi(50); spazi.fill(' '); TString cognome = signature.get(); // Se codanagrds = codanagr dichiarante non stampare ragsoc. TCursor* cur = cursor(); const long codanagr=cur->file(LF_NDITTE).get_long("CODANAGR"); const long codanagrds=cur->file(10).get_long("CODANGRDS"); bool noRagsoc=codanagr==codanagrds; if (cognome.len() > 30 && cognome[29] == ' ') { TString nome = cognome.mid(30, -1); cognome.cut(30); cognome.trim(); cognome << " " << nome; signature.set(cognome); } if (noRagsoc) cognome=""; totali.row(y-1).put(spazi, signature.x()-1); totali.row(y-1).put(cognome, signature.x()-1); } void TBase1::stampa_corpo(TPrinter& pr) { TPrint_section& body = section('B', first_page); body.reset(); body.update(); compatta_depositario(); const int body_righe = body.height(); for (int i = 0; i < body_righe; i++) { pr.print(body.row(i)); _RigaCorr++; } if (usa_progind()) progind()->addstatus(1); } // accetta solo quelli con qualifica=A,B o C, ATTUALI E FISICI bool bFiltraSoci(const TRelation* rel) { TString sQual(3); TString sTipo; sTipo = rel->lfile().get("TIPOASOC"); sQual = rel->lfile().get("RICQUAL"); TString dep; dep = rel->lfile().get("ATTPREC"); const bool bAttuale = dep == "A"; return sTipo=="F" && bAttuale && (sQual=="A" || sQual=="B" || sQual=="C"); } long TBase1::iContaSoci() { TString filtro(20); filtro.format("CODDITTA=%d",_codditta); c->setfilter(filtro); c->set_filterfunction(bFiltraSoci); (*c)=0L; return c->items(); } void TBase1::stampa_soci(TPrinter& pr) { TPrint_section& fut = section('F', first_page); fut.reset(); const int _initium_sociorum = _PaginaPosizionamento ? 53 : 53+HEADER_PRIMA_NOPOS; if (_RigaCorr < _initium_sociorum) jump_to_line(pr,_initium_sociorum); const long iSoci = iContaSoci(); if (iSoci > 11) { _bAllegSoci=TRUE; TPrintrow& rg=fut.row(0); rg.put("VEDERE ALLEGATO", 25); pr.print(rg); _RigaCorr++; if (usa_progind()) progind()->addstatus(1); } else { int i=0; TString sRagsoc,sSesso,sComuneNa,sProvNa,sDataNa,sCodFis,sCodQua; for ((*c)=0L; c->pos() < c->items(); ++(*c)) { TString sNome,sCognome; TPrintrow& rg=fut.row(i++); sCodQua=c->file().get("RICQUAL"); sRagsoc=c->file(LF_ANAG).get("RAGSOC"); sCodFis=c->file(LF_ANAG).get("COFI"); sDataNa=c->file(LF_ANAGFIS).get("DATANASC"); sSesso=c->file(LF_ANAGFIS).get("SESSO"); sComuneNa=c->file(LF_COMUNI).get("DENCOM"); sComuneNa.cut(23); sProvNa=c->file(LF_COMUNI).get("PROVCOM"); if (sRagsoc.len() > 30 && sRagsoc[30] != ' ') { sCognome=sRagsoc.left(30); sCognome.trim(); sNome=sRagsoc.right(20); sNome.trim(); sRagsoc = sCognome; sRagsoc << " " << sNome; } sRagsoc.cut(28); rg.put(sRagsoc,fut.field(0).x()-1); fut.field(1).set(sSesso); rg.put(sSesso,fut.field(1).x()-1); fut.field(2).set(sComuneNa); rg.put(sComuneNa,fut.field(2).x()-1); fut.field(3).set(sProvNa); rg.put(sProvNa,fut.field(3).x()-1); fut.field(4).set(sDataNa); rg.put(sDataNa,fut.field(4).x()-1); fut.field(5).set(sCodFis); rg.put(sCodFis,fut.field(5).x()-1); fut.field(6).set(sCodQua); rg.put(sCodQua,fut.field(6).x()-1); pr.print(rg); _RigaCorr++; if (usa_progind()) progind()->addstatus(1); } } } bool TBase1::print(const long codditta, const long NumFis, const long NumNoFis) { TCursor* cur = cursor(); TPrinter& pr = printer(); _codditta=codditta; if (!InitPrint(codditta)) return FALSE; pr.formlen(_base_formlen); _PaginaPosizionamento = _base_formlen != BASE_FORMLEN; (*cur)=0L; if (_modulaser) { ClearFlagModulaser(); TPrintrow r; if (!_GiaMessoStartDoc) put_modulaser(r, STARTDOC); put_modulaser(r, STARTDITTA); put_modulaser(r, STARTPAGE, 1); pr.print(r); _RigaCorr++; } jump_to_line(pr, prima_riga(PRIMA)); stampa_corpo(pr); stampa_soci(pr); next_page(pr); close_print(); return TRUE; } void TBase2::stampa_corpo(TPrinter& pr) { TPrint_section& body = section('B', even_page); body.reset(); body.update(); const int body_righe = body.height(); for (int i = 0; i < body_righe; i++) { pr.print(body.row(i)); _RigaCorr++; } if (usa_progind()) progind()->addstatus(1); } bool TBase2::print(const long codditta, const long NumFis, const long NumNoFis) { TCursor* cur = cursor(); TPrinter& pr = printer(); _codditta=codditta; filtra(codditta); _RigaCorr=0; (*cur)=0L; jump_to_line(pr, prima_riga(PRIMA)); stampa_corpo(pr); next_page(pr); close_print(); return TRUE; } long TBase3::filtra(const long codditta) { TString filtr(24); _codditta=codditta; filtr.format("(CODDITTA==%ld)&&(QLAP==%d)", codditta, anno_770()); cursor()->setfilter(filtr, TRUE); const long items = cursor()->items(); return items; } void TBase3::stampa_testata(TPrinter& pr) { TPrint_section& hh = section('H', first_page); hh.reset(); hh.update(); const int hhr = hh.height(); for (int i = 0; i < hhr; i++) { pr.print(hh.row(i)); _RigaCorr++; } if (usa_progind()) progind()->addstatus(1); } int TBase3::stampa_L(TPrinter& pr) { long codit=0L; TPrint_section& body = section('B', odd_page); body.reset(); TCursor& cur = *cursor(); /* if (iChiaveL==2) cur.setkey(1); else cur.setkey(2); filtra(_codditta); */ bool finito=FALSE; int righe=0; while (!finito) { body.update(); const int body_righe = body.height(); for (int i = 0; i < body_righe; i++) { TPrintrow& rr=body.row(i); pr.print(rr); rr.reset(); _RigaCorr++; } if (usa_progind()) progind()->addstatus(1); righe++; ++cur; codit=cur.file().get_long("CODDITTA"); bool buono=codit==_codditta; // Guarda se e' necessario stampare l'aggiuntivo _bAggiuntivoL = buono && righe>14; finito=righe>14 || codit!=_codditta; } return righe; } void TBase3::reset_totali_L() { TPrint_section& hh = section('F', last_page); TForm_item& t1 = hh.find_field(1); TForm_item& t2 = hh.find_field(2); t1.set(""); t2.set(""); } void TBase3::stampa_totali_L(TPrinter& pr) { // La sezione f last contiene solo due totali aggiornati con add nel form TPrint_section& hh = section('F', last_page); // hh.reset(); hh.update(); const int hhr = hh.height(); for (int i = 0; i < hhr; i++) { pr.print(hh.row(i)); _RigaCorr++; } if (usa_progind()) progind()->addstatus(1); } bool TBase3::print(const long codditta, const long NumFis, const long NumNoFis) { _bAggiuntivoL=TRUE; TCursor* cur = cursor(); TPrinter& pr = printer(); _codditta=codditta; // filtra(codditta); reset_totali_L(); _RigaCorr=0; jump_to_line(pr, prima_riga(PRIMA)); // Stampa i codici concessione e tesoreria stampa_testata(pr); // Legge dai par.studio l'ordinamento da usare per L TConfig conf(CONFIG_STUDIO); const int iChiaveL = (int)conf.get_long("FlStQl", "77"); // Le chiavi nel file e nel .ini sono saggiamente scambiate if (iChiaveL==2) cur->setkey(1); else cur->setkey(2); filtra(_codditta); (*cur)=0L; const int righe_stampate=stampa_L(pr); // Se la stampa prosegue i totali vanno sull'aggiuntivo NON qui if (!_bAggiuntivoL) { jump_to_line(pr,_RIGA_TOTALI_L); stampa_totali_L(pr); } next_page(pr); close_print(); return TRUE; } const char* TRigaN::sMeseRif() const { __dep16=""; __dep16 << _MeseRif; return __dep16; } const char* TRigaN::sAnnoRif() const { __dep16=""; __dep16 << _AnnoRif; return __dep16; } // Ordina le righe N per periodo di riferimento int TRigaN::compare(const TSortable& s) const { const TRigaN& rec = (const TRigaN&)s; const int da = _AnnoRif - rec._AnnoRif; const int dm = _MeseRif - rec._MeseRif; if (da==0) return dm; else return da; } TRigaN::TRigaN(const TLocalisamfile& qn) { _pos = qn.recno(); const TRectype& rec = qn.curr(); _MeseRif = rec.get_int("MESERIF"); _AnnoRif = rec.get_int("ANNORIF"); // Nel quadro R si chiama diversamente @!#@!!! if (qn.num() == LF_QUAN) _ImpRimb = rec.get_real("IMPOSTA"); else _ImpRimb = rec.get_real("IMPRIMB"); _CompAss = rec.get_real("COMPENSI"); } int TRigheNR::fill(const long codditta,TLocalisamfile& qnr) { long ditta=0L; _data.destroy(); // Si posiziona sul primo della ditta corrente qnr.zero(); qnr.put("CODDITTA",codditta); qnr.read()==NOERR; ditta=qnr.get_long("CODDITTA"); if (ditta!=codditta) return 0; // Legge tutti quelli della ditta corrente for (; !qnr.eof(); qnr.next()) { ditta=qnr.get_long("CODDITTA"); if (ditta!=codditta) break; TRigaN* n = new TRigaN(qnr); if (n->pos() >= 0) _data.add(n); else delete n; } _data.sort(); const int i = _data.items(); return i; } const char* TRigaQT::sMesePag() const { __dep16=""; __dep16 << _MesePag; return __dep16; } const char* TRigaQT::sAnnoPag() const { __dep16=""; __dep16 << _AnnoPag; return __dep16; } // Ordina le righe N per periodo di riferimento int TRigaQT::compare(const TSortable& s) const { const TRigaQT& rec = (const TRigaQT&)s; const int da = _AnnoPag - rec._AnnoPag; const int dm = _MesePag - rec._MesePag; if (da==0) return dm; else return da; } TRigaQT::TRigaQT(const TLocalisamfile& qt) { const TRectype& rec = qt.curr(); _MesePag = rec.get_int("MESEPAG"); _AnnoPag = rec.get_int("ANNOPAG"); _ContVers = rec.get_real("CONTVERS"); _ContRimb = rec.get_real("CONTRIMB"); _Interessi=rec.get_real("INTERESSI"); _sCodReg=rec.get("CODREG"); } int TRigheQT::fill(const long codditta,TLocalisamfile& qt) { long ditta=0L; // Si posiziona sul primo della ditta corrente _data.destroy(); qt.zero(); qt.put("CODDITTA",codditta); qt.read()==NOERR; ditta=qt.get_long("CODDITTA"); if (ditta!=codditta) return 0; // Legge tutti quelli della ditta corrente for (; !qt.eof(); qt.next()) { ditta=qt.get_long("CODDITTA"); if (ditta!=codditta) break; TRigaQT* n = new TRigaQT(qt); if (n->pos() >= 0) _data.add(n); else delete n; } _data.sort(); const int i = _data.items(); return i; } // Ordina le righe N per periodo di riferimento int TRigaPS::compare(const TSortable& s) const { const TRigaPS& rec = (const TRigaPS&)s; const long diff = _dDv-rec.dDataVers(); return (int)diff; } TRigaPS::TRigaPS(const TLocalisamfile& qt) { const TRectype& rec = qt.curr(); _dDv = rec.get_date("DATAVERS"); _rImp = rec.get_real("IMPOSTA"); _rIntDip = rec.get_real("INTERDIP"); _rIntDat = rec.get_real("INTERDAT"); _sTipoV = rec.get("TIPOVERS"); _sCodTrib= rec.get("CODTRIB"); _sSerie = rec.get("SERIE"); _sNumero = rec.get("NUMERO"); } int TRighePS::fill(const long codditta,TLocalisamfile& ps) { long ditta=0L; // Si posiziona sul primo della ditta corrente _data.destroy(); ps.zero(); ps.put("CODDITTA",codditta); ps.read()==NOERR; ditta=ps.get_long("CODDITTA"); if (ditta!=codditta) return 0; // Legge tutti quelli della ditta corrente for (; !ps.eof(); ps.next()) { ditta=ps.get_long("CODDITTA"); if (ditta!=codditta) break; TRigaPS* n = new TRigaPS(ps); if (n->pos() >= 0) _data.add(n); else delete n; } _data.sort(); const int i = _data.items(); return i; } int TBase4::calcola_firma() { TPrint_section& totali = section('F', first_page); TForm_item& signature = totali.find_field(_IdFirma); const int y = signature.y(); TString spazi(50); spazi.fill(' '); TString cognome = signature.get(); if (cognome.len() > 30 && cognome[29] == ' ') { TString nome = cognome.mid(30, -1); cognome.cut(30); cognome.trim(); cognome << ' ' << nome; signature.set(cognome); } totali.row(y-1).put(spazi, signature.x()-1); totali.row(y-1).put(cognome, signature.x()-1); return y; } void TBase4::stampa_testata(TPrinter& pr) { TPrint_section& hh = section('H', first_page); hh.reset(); hh.update(); const int hhr = hh.height(); for (int i = 0; i < hhr; i++) { pr.print(hh.row(i)); _RigaCorr++; } if (usa_progind()) progind()->addstatus(1); } void TBase4::fill_riga_QT(TPrint_section& sec,const int num,const char quadro) { TString sVal; int start=1,end=6; const int items = quadro=='Q' ? _righeQ.items() : _righeT.items(); for (int i = start; i <= end; i++) { TForm_item& fi = sec.find_field(i); // if (num < _righeQT.items()) if (num < items) { const TRigaQT& rN = quadro=='Q' ? _righeQ[num] : _righeT[num]; if (i==start) sVal=rN.sMesePag(); else if (i==start+1) sVal=rN.sAnnoPag(); else if (i==start+2) sVal=rN.ContVers(fi.picture()); else if (i==start+3) sVal=rN.ContRimb(fi.picture()); else if (i==start+4) sVal=rN.Interessi(fi.picture()); else if (i==start+5) sVal=rN.CodReg(); } else sVal=""; fi.set(sVal); TPrintrow& row=sec.row(0); row.put(sVal,fi.x()-1); } } void TBase4::stampa_Q(TPrinter& pr) { TPrint_section& body = section('F', even_page); body.reset(); TLocalisamfile qp(LF_QUAQ); _righeQ.fill(_codditta,qp); if (_righeQ.items()==0) return; _bAggQ = _righeQ.items() > _RIGHE_Q; int riga=0; bool FinitaSezione=FALSE; while (!FinitaSezione) { // Stampa la parte sinistra (primi 4 campi) fill_riga_QT(body,riga,'Q'); TPrintrow& rr=body.row(0); pr.print(rr); rr.reset(); riga++; _RigaCorr++; if (usa_progind()) progind()->addstatus(1); FinitaSezione=riga>_RIGHE_Q-1; } } void TBase4::stampa_T(TPrinter& pr) { TPrint_section& body = section('F', odd_page); body.reset(); TLocalisamfile qp(LF_QUAT); _righeT.fill(_codditta,qp); if (_righeT.items()==0) return; _bAggT = _righeT.items() > _RIGHE_T; int riga=0; bool FinitaSezione=FALSE; while (!FinitaSezione) { // Stampa la parte sinistra (primi 4 campi) fill_riga_QT(body,riga,'T'); TPrintrow& rr=body.row(0); pr.print(rr); rr.reset(); riga++; _RigaCorr++; if (usa_progind()) progind()->addstatus(1); FinitaSezione=riga>_RIGHE_T-1; } } void TBase4::fill_riga_PS(TPrint_section& sec,const int num,const char quadro) { TString sVal,sDep; int start=1,end=8; const int items = quadro=='P' ? _righeP.items() : _righeS.items(); for (int i = start; i <= end; i++) { TForm_item& fi = sec.find_field(i); if (num < items) { const TRigaPS& rN = quadro=='P' ? _righeP[num] : _righeS[num]; if (i==start) sVal=rN.sImposta(fi.picture()); else if (i==start+1) sVal=rN.sIntDip(fi.picture()); else if (i==start+2) sVal=rN.sIntDat(fi.picture()); else if (i==start+3) sVal=rN.sTipoVers(); else if (i==start+4) sVal=rN.sCodTrib(); else if (i==start+5) { sDep=rN.sDataVers(); sVal.picture(fi.picture(),sDep); } else if (i==start+6) sVal=rN.sSerie(); else if (i==start+7) sVal=rN.sNumero(); } else sVal=""; fi.set(sVal); TPrintrow& row=sec.row(0); row.put(sVal,fi.x()-1); } } void TBase4::stampa_P(TPrinter& pr) { TPrint_section& body = section('H', even_page); body.reset(); TLocalisamfile qp(LF_QUAP); _righeP.fill(_codditta,qp); if (_righeP.items()==0) return; const int items=_righeP.items(); _bAggP = items > _RIGHE_P; int riga=0; bool FinitaSezione=FALSE; while (!FinitaSezione) { // Stampa la parte sinistra (primi 4 campi) fill_riga_PS(body,riga,'P'); TPrintrow& rr=body.row(0); pr.print(rr); rr.reset(); riga++; _RigaCorr++; if (usa_progind()) progind()->addstatus(1); FinitaSezione=riga>_RIGHE_P-1; } } void TBase4::stampa_S(TPrinter& pr) { TPrint_section& body = section('H', even_page); body.reset(); TLocalisamfile qp(LF_QUAS); _righeS.fill(_codditta,qp); if (_righeS.items()==0) return; _bAggS = _righeS.items() > _RIGHE_S; int riga=0; bool FinitaSezione=FALSE; while (!FinitaSezione) { // Stampa la parte sinistra (primi 4 campi) fill_riga_PS(body,riga,'S'); TPrintrow& rr=body.row(0); pr.print(rr); rr.reset(); riga++; _RigaCorr++; if (usa_progind()) progind()->addstatus(1); FinitaSezione=riga>_RIGHE_S-1; } // Salta due righe alla fine stampa_righe_vuote(pr,2); } void TBase4::stampa_R(TPrinter& pr) { TPrint_section& body = section('B', even_page); body.reset(); TLocalisamfile qr(LF_QUAR); _righeR.fill(_codditta,qr); if (_righeR.items()==0) return; const int items=_righeR.items(); // se iRigheNR > 2 => bisogna stampare anche l'allegato _bAggR = items > _RIGHE_R; fill_riga_NR(body,0,0,'R'); fill_riga_NR(body,1,1,'R'); TPrintrow& rr=body.row(0); pr.print(rr); rr.reset(); _RigaCorr++; if (usa_progind()) progind()->addstatus(1); } void TBase4::fill_riga_NR(TPrint_section& sec,const int num, const int side,const char quadro) { TString sVal; int start,end; if (side==0) { start=1; end=5; } else { start=5; end=9; } const int items = quadro=='N' ? _righeN.items() : _righeR.items(); for (int i = start; i < end; i++) { TForm_item& fi = sec.find_field(i); if (num < items) { const TRigaN& rN = quadro=='N' ? _righeN[num] : _righeR[num]; if (i==start) sVal=rN.sMeseRif(); else if (i==start+1) sVal=rN.sAnnoRif(); else if (i==start+2) sVal=rN.ImpRimb(fi.picture()); else if (i==start+3) sVal=rN.CompAss(fi.picture()); } else sVal=""; fi.set(sVal); TPrintrow& row=sec.row(0); row.put(sVal,fi.x()-1); } } void TBase4::stampa_righe_vuote(TPrinter& pr,const int righe) { TPrintrow rr; for (int i=0; iaddstatus(1); } } void TBase4::stampa_N(TPrinter& pr) { TPrint_section& body = section('B', odd_page); body.reset(); TLocalisamfile qn(LF_QUAN); _righeN.fill(_codditta,qn); if (_righeN.items()==0) return; // se iRigheN > 6 => bisogna stampare anche l'allegato _bAggN = _righeN.items() > _RIGHE_N; int num=0; int riga=0; bool FinitaSezione=FALSE; while (!FinitaSezione) { // Stampa la parte sinistra (primi 4 campi) fill_riga_NR(body,num,0,'N'); num+=3; fill_riga_NR(body,num,1,'N'); TPrintrow& rr=body.row(0); pr.print(rr); rr.reset(); riga++; _RigaCorr++; if (usa_progind()) progind()->addstatus(1); num-=2; FinitaSezione=riga>2; } } void TBase4::stampa_fine(TPrinter& pr) { TPrint_section& sec = section('F', first_page); const int hhr = sec.height(); sec.reset(); sec.update(); const int lasty = calcola_firma(); for (int i = 0; i < hhr; i++) { pr.print(sec.row(i)); _RigaCorr++; } if (usa_progind()) progind()->addstatus(1); } bool TBase4::print(const long codditta, const long NumFis, const long NumNoFis) { _bAggN=_bAggP=_bAggR=_bAggQ=_bAggS=_bAggT=FALSE; TCursor* cur = cursor(); TPrinter& pr = printer(); _codditta=codditta; filtra(codditta); _RigaCorr=0; (*cur)=0L; jump_to_line(pr, prima_riga(PRIMA)); // Stampa da M1 a M6 stampa_testata(pr); stampa_N(pr); jump_to_line(pr,16); stampa_P(pr); jump_to_line(pr,22); stampa_Q(pr); jump_to_line(pr,28); stampa_R(pr); jump_to_line(pr,31); stampa_S(pr); jump_to_line(pr,37); stampa_T(pr); jump_to_line(pr,41); stampa_fine(pr); next_page(pr); close_print(); return TRUE; } bool TStampaBase::user_create() { _fBase1 = new TBase1("77base1", "Base"); _fBase2 = new TBase2("77base2", "Base"); _fBase3 = new TBase3("77base3", "Base"); _fBase4 = new TBase4("77base4", "Base"); // Adesso bisogna chiamare set_cursor per impostare il cursore dentro // al form. Sarebbe meglio fare in modo che il form usi sempre il cursore // letto dal .frm, senza bisogno di passarglielo dall'applicazione _fBase1->set_cursor(_fBase1->TForm::cursor()); _fBase2->set_cursor(_fBase2->TForm::cursor()); _fBase3->set_cursor(_fBase3->TForm::cursor()); _fBase4->set_cursor(_fBase4->TForm::cursor()); return TRUE; } bool TStampaBase::user_destroy() { delete _fBase1; delete _fBase2; delete _fBase3; delete _fBase4; return TRUE; } bool TStampaBase::print_quadro(const int OffsetDitta, const bool modulaser) { int start=0, last=0; // Flag per distinguere la prima pagina con posizionamento da quelle successive senza bool GiaPosizionato=FALSE; // Setta formlen prima di printer.open per avere la lunghezza giusta nel caso di // stampa a video printer().formlen(BASE_FORMLEN); bool ok = printer().open(); _fBase1->set_modulaser(modulaser); _fBase2->set_modulaser(modulaser); _fBase3->set_modulaser(modulaser); _fBase4->set_modulaser(modulaser); // Dice se deve eseguire il posizionamento del foglio. // Se stampa piu' ditte va eseguito solo sulla prima // Occhio a non spostarlo nel ciclo. _fBase1->set_posiziona(TRUE); if (OffsetDitta >= 0) { start = OffsetDitta; last = OffsetDitta; } else last = ditte().items() - 1; for (int i = start; i <= last; i++) { TString CoFiDic(20); TToken_string riga(ditte()[i]); const long codditta = atol(riga.get(0)); const TipoDitta tipo = (TipoDitta)riga.get_int(1); const long fis = riga.get_long(2); const long nofis = riga.get_long(3); const bool LastFis = (bool)riga.get_int(4); const bool LastNoFis = (bool)riga.get_int(5); // I gruppi dich-estinti hanno totali comuni // Si presume che nell'array vengano messi nell'ordine dich-estinti if (tipo == normale || tipo == dichiarante) _fBase1->azzera_totali(); if (tipo == estinto) CoFiDic = riga.get(6); // Dice al form che tipo di ditta si stampa _fBase1->set_tipo_ditta(tipo); // Numera i fogli a partire da 1 per ogni ditta normale e da 1 e di seguito negli estinti // per i sogg. dichiaranti if (tipo == normale || tipo == dichiarante) _fBase1->set_num_foglio(1); // Se la ditta e' estinta dice al form il cod.fis. del dichiarante if (tipo == estinto) _fBase1->set_cofi_dic(CoFiDic); // Dice al form che e' l'ultima ditta if (i == last) _fBase1->set_last_ditta(TRUE); if (GiaPosizionato) _fBase1->set_formlen(BASE_FORMLEN); else _fBase1->set_formlen(BASE_FORMLEN-HEADER_PRIMA_NOPOS); _fBase1->print(codditta, fis, nofis); GiaPosizionato=TRUE; _fBase2->print(codditta, fis, nofis); _fBase3->print(codditta, fis, nofis); _fBase4->print(codditta, fis, nofis); } printer().close(); return ok; } int TQuadroL::prima_riga(PaginaQuadro p) const { if (p==PRIMA) { if (_PaginaPosizionamento) return 4; else return 4+HEADER_PRIMA_NOPOS; } else return 4; } long TQuadroL::filtra(const long codditta) { TString filtr(24); _codditta=codditta; filtr.format("(CODDITTA==%ld)&&(QLAP==%d)", _codditta,anno_770()); cursor()->setfilter(filtr, TRUE); const long items = cursor()->items(); return items; } void TQuadroL::stampa_testata(TPrinter& pr) { TPrint_section& hh = section('H', first_page); hh.reset(); TForm_item& nf=hh.find_field(18); _num_foglio++; TString fstr(10); fstr << _num_foglio; nf.set(fstr); hh.update(); const int hhr = hh.height(); for (int i = 0; i < hhr; i++) { pr.print(hh.row(i)); _RigaCorr++; } if (usa_progind()) progind()->addstatus(1); } bool TQuadroL::stampa_L(TPrinter& pr,const long lStartRec,const int iRecL) { long codit=0L; bool eof=FALSE; TPrint_section& body = section('B', odd_page); body.reset(); TCursor& cur = *cursor(); if (lStartRec > cur.items()) return TRUE; else cur=lStartRec; bool bFinitaPagina=FALSE; int righe=0; const long items = cur.items(); // while (!finito && !eof) while ( (cur.pos() < items) && !bFinitaPagina ) { body.update(); const int body_righe = body.height(); for (int i = 0; i < body_righe; i++) { TPrintrow& rr=body.row(i); pr.print(rr); rr.reset(); _RigaCorr++; } if (usa_progind()) progind()->addstatus(1); righe++; ++cur; // eof=cur.pos()==cur.items(); bFinitaPagina = (righe==iRecL); } eof=cur.pos() >= items-1; return eof; } int TQuadroL::calcola_firma() { TPrint_section& totali = section('F', last_page); TForm_item& signature = totali.find_field(4); const int y = signature.y(); TString spazi(50); spazi.fill(' '); TString cognome = signature.get(); if (cognome.len() > 30 && cognome[29] == ' ') { TString nome = cognome.mid(30, -1); cognome.cut(30); cognome.trim(); cognome << ' ' << nome; signature.set(cognome); } totali.row(y-1).put(spazi, signature.x()-1); totali.row(y-1).put(cognome, signature.x()-1); return y; } void TQuadroL::stampa_totali_L(TPrinter& pr) { // La sezione f last contiene solo due totali aggiornati con add nel form TPrint_section& hh = section('F', last_page); // hh.reset(); hh.update(); TForm_item& totEff = hh.find_field(1); TForm_item& totVer = hh.find_field(2); real rTotEff(totEff.get()); real rTotVer(totVer.get()); rTotEff += _rTotEff; rTotVer += _rTotVer; totEff.set(rTotEff.string()); totVer.set(rTotVer.string()); totEff.update(); totVer.update(); const int lasty = calcola_firma(); const int hhr = hh.height(); for (int i = 0; i < hhr; i++) { pr.print(hh.row(i)); _RigaCorr++; } if (usa_progind()) progind()->addstatus(1); } const int _START_AGG_L=16; const int _REC_PRIMA_AGG_L=12; const int _REC_SECONDA_AGG_L=14; const int _RIGA_TOTALI_AGG_L=60; void TQuadroL::calcola_totali_precedenti() { TCursor* cur = cursor(); _rTotEff = _rTotVer = ZERO; for ((*cur)=0L; cur->pos() < _START_AGG_L; ++(*cur) ) { _rTotEff += cur->curr().get_real("QLRITEFF"); _rTotVer += cur->curr().get_real("QLRITVER"); } } void TQuadroL::reset_totali_L() { TPrint_section& hh = section('F', last_page); hh.reset(); } bool TQuadroL::print(const long codditta, const long NumFis, const long NumNoFis) { TCursor* cur = cursor(); TPrinter& pr = printer(); _num_foglio=0; if (!InitPrint(codditta)) return FALSE; // Non stampare se non ci sono record if (cur->items() < _START_AGG_L) return FALSE; // Legge dai par.studio l'ordinamento da usare per L TConfig conf(CONFIG_STUDIO); const int iChiaveL = (int)conf.get_long("FlStQl", "77"); if (iChiaveL==2) cur->setkey(1); else cur->setkey(2); calcola_totali_precedenti(); pr.formlen(dic_form_len()); int lOffsetL=_START_AGG_L-1; // int lOffsetL=15; (*cur)=lOffsetL; bool finito=FALSE; while (!finito) { jump_to_line(pr, prima_riga(PRIMA)); stampa_testata(pr); finito=stampa_L(pr,lOffsetL,_REC_PRIMA_AGG_L); next_page(pr); _PaginaPosizionamento=FALSE; pr.formlen(dic_form_len()); if (!finito) { lOffsetL+=_REC_PRIMA_AGG_L; jump_to_line(pr, prima_riga(SECONDA)); finito=stampa_L(pr,lOffsetL,_REC_SECONDA_AGG_L); } if (finito) { jump_to_line(pr,_RIGA_TOTALI_AGG_L); stampa_totali_L(pr); } next_page(pr); } close_print(); return TRUE; } bool TStampaQuadroAggL::user_create() { _form = new TQuadroL("77QL", quadro()); _form->set_cursor(_form->TForm::cursor()); // init anche di _cur nell'applicazione _cur = _form->cursor(); return TRUE; } bool TStampaQuadroAggL::user_destroy() { delete _form; return TRUE; } void TQuadroN::stampa_fine(TPrinter& pr) { TPrint_section& sec = section('F', first_page); const int hhr = sec.height(); sec.reset(); sec.update(); const int lasty = calcola_firma(); for (int i = 0; i < hhr; i++) { pr.print(sec.row(i)); _RigaCorr++; } if (usa_progind()) progind()->addstatus(1); } void TQuadroN::stampa_testata(TPrinter& pr) { TPrint_section& hh = section('H', first_page); hh.reset(); TForm_item& nf=hh.find_field(12); _num_foglio++; TString fstr(10); fstr << _num_foglio; nf.set(fstr); hh.update(); const int hhr = hh.height(); for (int i = 0; i < hhr; i++) { pr.print(hh.row(i)); _RigaCorr++; } if (usa_progind()) progind()->addstatus(1); } int TQuadroN::prima_riga(PaginaQuadro p) const { if (_PaginaPosizionamento) return 4; else return 4+HEADER_PRIMA_NOPOS; } /*void TBase4::fill_riga_QT(TPrint_section& sec,const int num) { TString sVal; int start=1,end=6; for (int i = start; i <= end; i++) { TForm_item& fi = sec.find_field(i); if (num < _righeQT.items()) { const TRigaQT& rN = _righeQT[num]; if (i==start) sVal=rN.sMesePag(); else if (i==start+1) sVal=rN.sAnnoPag(); else if (i==start+2) sVal=rN.ContVers(fi.picture()); else if (i==start+3) sVal=rN.ContRimb(fi.picture()); else if (i==start+4) sVal=rN.Interessi(fi.picture()); else if (i==start+5) sVal=rN.CodReg(); } else sVal=""; fi.set(sVal); TPrintrow& row=sec.row(0); row.put(sVal,fi.x()-1); } } */ /* void TBase4::fill_riga_PS(TPrint_section& sec,const int num) { TString sVal; int start=1,end=8; for (int i = start; i <= end; i++) { TForm_item& fi = sec.find_field(i); if (num < _righePS.items()) { const TRigaPS& rN = _righePS[num]; if (i==start) sVal=rN.sImposta(fi.picture()); else if (i==start+1) sVal=rN.sIntDip(fi.picture()); else if (i==start+2) sVal=rN.sIntDat(fi.picture()); else if (i==start+3) sVal=rN.sTipoVers(); else if (i==start+4) sVal=rN.sCodTrib(); else if (i==start+5) sVal=rN.sDataVers(); else if (i==start+6) sVal=rN.sSerie(); else if (i==start+7) sVal=rN.sNumero(); } else sVal=""; fi.set(sVal); TPrintrow& row=sec.row(0); row.put(sVal,fi.x()-1); } } */ int TQuadroN::stampa_N(TPrinter& pr,const int ptrN) { TPrint_section& body = section('B', odd_page); body.reset(); // Nell'aggiuntivo parto dal record n.7 // int num=6; int num=ptrN; int riga=0; int LastUsed=0; bool FinitaSezione=FALSE; while (!FinitaSezione) { // Stampa la parte sinistra (primi 4 campi) fill_riga_NR(body,num,0,'N'); num+=3; LastUsed=num; fill_riga_NR(body,num,1,'N'); TPrintrow& rr=body.row(0); pr.print(rr); rr.reset(); riga++; _RigaCorr++; if (usa_progind()) progind()->addstatus(1); num-=2; FinitaSezione=riga>3; } return LastUsed; } int TQuadroN::stampa_P(TPrinter& pr,const int ptrP) { TPrint_section& body = section('H', even_page); body.reset(); const int items=_righeP.items(); // Parte da rec.n.5 // int riga=4; int riga=ptrP; bool FinitaSezione=FALSE; while (!FinitaSezione) { // Stampa la parte sinistra (primi 4 campi) fill_riga_PS(body,riga,'P'); TPrintrow& rr=body.row(0); pr.print(rr); rr.reset(); riga++; _RigaCorr++; if (usa_progind()) progind()->addstatus(1); FinitaSezione=riga-ptrP>9; } return riga; } int TQuadroN::stampa_Q(TPrinter& pr,const int ptrQ) { TPrint_section& body = section('F', even_page); body.reset(); // parte da rec.n.5 // int riga=4; int riga=ptrQ; bool FinitaSezione=FALSE; while (!FinitaSezione) { // Stampa la parte sinistra (primi 4 campi) fill_riga_QT(body,riga,'Q'); TPrintrow& rr=body.row(0); pr.print(rr); rr.reset(); riga++; _RigaCorr++; if (usa_progind()) progind()->addstatus(1); FinitaSezione=riga-ptrQ>3; } return riga; } int TQuadroN::stampa_R(TPrinter& pr,const int ptrR) { TPrint_section& body = section('B', even_page); body.reset(); const int items=_righeR.items(); // int RecNum=2; int RecNum=ptrR; int RigheStampate=0; int LastUsed=0; bool FinitaSezione=FALSE; while (!FinitaSezione) { fill_riga_NR(body,RecNum,0,'R'); RecNum+=3; LastUsed=RecNum; fill_riga_NR(body,RecNum,1,'R'); TPrintrow& rr=body.row(0); pr.print(rr); rr.reset(); RigheStampate++; _RigaCorr++; if (usa_progind()) progind()->addstatus(1); RecNum-=2; FinitaSezione=RigheStampate>1; } return LastUsed; } int TQuadroN::stampa_S(TPrinter& pr,const int ptrS) { TPrint_section& body = section('H', even_page); body.reset(); // int riga=4; int riga=ptrS; bool FinitaSezione=FALSE; while (!FinitaSezione) { // Stampa la parte sinistra (primi 4 campi) fill_riga_PS(body,riga,'S'); TPrintrow& rr=body.row(0); pr.print(rr); rr.reset(); riga++; _RigaCorr++; if (usa_progind()) progind()->addstatus(1); FinitaSezione=riga-ptrS>5; } return riga; } int TQuadroN::stampa_T(TPrinter& pr,const int ptrT) { TPrint_section& body = section('F', odd_page); body.reset(); // int riga=4; int riga=ptrT; bool FinitaSezione=FALSE; while (!FinitaSezione) { // Stampa la parte sinistra (primi 4 campi) fill_riga_QT(body,riga,'T'); TPrintrow& rr=body.row(0); pr.print(rr); rr.reset(); riga++; _RigaCorr++; if (usa_progind()) progind()->addstatus(1); FinitaSezione=riga-ptrT>3; } return riga; } /* void TBase4::fill_riga_NR(TPrint_section& sec,const int num, const int side) { TString sVal; int start,end; if (side==0) { start=0; end=4; } else { start=4; end=8; } for (int i = start; i < end; i++) { TForm_item& fi = sec.field(i); if (num < _righeNR.items()) { const TRigaN& rN = _righeNR[num]; if (i==start) sVal=rN.sMeseRif(); else if (i==start+1) sVal=rN.sAnnoRif(); else if (i==start+2) sVal=rN.ImpRimb(fi.picture()); else if (i==start+3) sVal=rN.CompAss(fi.picture()); } else sVal=""; fi.set(sVal); TPrintrow& row=sec.row(0); row.put(sVal,fi.x()-1); } } */ bool TQuadroN::print(const long codditta, const long NumFis, const long NumNoFis) { TCursor* cur = cursor(); TPrinter& pr = printer(); _num_foglio=0; _codditta=codditta; if (!InitPrint(codditta)) return FALSE; TLocalisamfile qn(LF_QUAN); _righeN.fill(_codditta,qn); bool stampoN=_righeN.items() > 6; TLocalisamfile qp(LF_QUAP); _righeP.fill(_codditta,qp); bool stampoP=_righeP.items() > 4; TLocalisamfile qq(LF_QUAQ); _righeQ.fill(_codditta,qq); bool stampoQ=_righeQ.items() > 4; TLocalisamfile qr(LF_QUAR); _righeR.fill(_codditta,qr); bool stampoR=_righeR.items() > 2; TLocalisamfile qs(LF_QUAS); _righeS.fill(_codditta,qs); bool stampoS=_righeS.items() > 4; TLocalisamfile qt(LF_QUAT); _righeT.fill(_codditta,qt); bool stampoT=_righeT.items() > 4; int ptrN=6,ptrP=4,ptrQ=4,ptrR=2,ptrS=4,ptrT=4; // Se non c'e' niente da stampare esce if (!stampoN && !stampoP && !stampoQ && !stampoR && !stampoS && !stampoT) return FALSE; pr.formlen(TDicForm::dic_form_len()); _RigaCorr=0; (*cur)=0L; bool done=FALSE; while (!done) { jump_to_line(pr, prima_riga(PRIMA)); int skip=HEADER_PRIMA_NOPOS; stampa_testata(pr); jump_to_line(pr, _PaginaPosizionamento ? 20-skip : 20); ptrN=stampa_N(pr,ptrN); jump_to_line(pr, _PaginaPosizionamento ? 26-skip : 26); ptrP=stampa_P(pr,ptrP); jump_to_line(pr, _PaginaPosizionamento ? 38-skip : 38); ptrQ=stampa_Q(pr,ptrQ); jump_to_line(pr, _PaginaPosizionamento ? 44-skip : 44); ptrR=stampa_R(pr,ptrR); jump_to_line(pr, _PaginaPosizionamento ? 48-skip : 48); ptrS=stampa_S(pr,ptrS); jump_to_line(pr, _PaginaPosizionamento ? 56-skip : 56); ptrT=stampa_T(pr,ptrT); jump_to_line(pr, _PaginaPosizionamento ? 63-skip : 63); stampa_fine(pr); _PaginaPosizionamento=FALSE; next_page(pr); pr.formlen(TDicForm::dic_form_len()); bool FinitoN = ptrN >= _righeN.items(); bool FinitoP = ptrP >= _righeP.items(); bool FinitoQ = ptrQ >= _righeQ.items(); bool FinitoR = ptrR >= _righeR.items(); bool FinitoS = ptrS >= _righeS.items(); bool FinitoT = ptrT >= _righeT.items(); done = FinitoN && FinitoP && FinitoQ && FinitoR && FinitoS && FinitoT; } close_print(); return TRUE; } bool TStampaQuadroAggN::user_create() { _form = new TQuadroN("77QN", quadro()); _form->set_cursor(_form->TForm::cursor()); _cur = _form->cursor(); return TRUE; } bool TStampaQuadroAggN::user_destroy() { delete _form; return TRUE; }