// cg5200.cpp - Visualizzazione saldi #include #include #include #include #include #include #include #include #include "cglib.h" #include "cg5200.h" class TRiga_array : public TArray { public: bool add_riga(const TRectype& rec_saldi); }; bool TRiga_array::add_riga(const TRectype& rec_saldi) { bool found = FALSE; int annoes, annoesr; char flag = ' ', flagr = ' '; TDate udata, udatar; long unum, unumr; real pdaresca,paveresca,pdare,pavere,saldoini,pdarepro,paverepro; real pdarescar,paverescar,pdarer,paverer,saldoinir,pdarepror,paverepror; for (int i = 0; i < items(); i++) { TRectype& r = (TRectype&)(*this)[i]; annoes = r.get_int(SLD_ANNOES); annoesr = rec_saldi.get_int(SLD_ANNOES); if ( annoes == annoesr ) { pdaresca = r.get_real(SLD_PDARESCA); paveresca = r.get_real(SLD_PAVERESCA); flag = r.get_char(SLD_FLAGSALINI); pdare = r.get_real(SLD_PDARE); pavere = r.get_real(SLD_PAVERE); saldoini = r.get_real(SLD_SALDO); pdarepro = r.get_real(SLD_PDAREPRO); paverepro = r.get_real(SLD_PAVEREPRO); udata = r.get(SLD_DATAULMOV); unum = r.get_long(SLD_NUMULTMOV); pdarescar = rec_saldi.get_real(SLD_PDARESCA); pdarescar += pdaresca; paverescar = rec_saldi.get_real(SLD_PAVERESCA); paverescar+= paveresca; flagr = rec_saldi.get_char(SLD_FLAGSALINI); pdarer = rec_saldi.get_real(SLD_PDARE); pdarer += pdare; paverer = rec_saldi.get_real(SLD_PAVERE); paverer += pavere; saldoinir = rec_saldi.get_real(SLD_SALDO); udatar = rec_saldi.get(SLD_DATAULMOV); unumr = rec_saldi.get_long(SLD_NUMULTMOV); udatar = fnc_max(udatar,udata); //unumr = (unum > unumr) ? unum : unumr; if (udata > udatar) unumr = unum; if (flagr == flag) saldoinir += saldoini; else saldoinir -= saldoini; if (saldoinir < ZERO) // saldoinir e' piu' piccolo di saldoini => vince il flag di saldoini { flagr = flag; saldoinir = -saldoinir; } pdarepror = rec_saldi.get_real(SLD_PDAREPRO); pdarepror += pdarepro; paverepror = rec_saldi.get_real(SLD_PAVEREPRO); paverepror += paverepro; found = TRUE; r.put(SLD_ANNOES, annoes); r.put(SLD_PDARESCA, pdarescar); r.put(SLD_PAVERESCA,paverescar); r.put(SLD_PDARE, pdarer); r.put(SLD_PAVERE,paverer); r.put(SLD_FLAGSALINI,flagr); r.put(SLD_SALDO, saldoinir); r.put(SLD_PDAREPRO, pdarepror); r.put(SLD_PAVEREPRO,paverepro); r.put(SLD_DATAULMOV, udatar); r.put(SLD_NUMULTMOV, unumr); } } if (!found) { TRectype* r = new TRectype(rec_saldi);//ci copia anche i valori di rec_saldi add(r); } return found; } /////////////////////////////////////////////////////////// // Visualizzazione saldi /////////////////////////////////////////////////////////// class TSaldibrowse_application : public TBrowse_application { TMask* _msk; TLocalisamfile* _clifo; TCursor * _cur; TRelation * _rel,* _rel1; TRiga_array _riga; int _anno, _g, _c; long _s; bool _saldo_conto, _saldo_gruppo, _saldo_sottoc; protected: virtual bool user_create(); virtual bool user_destroy(); virtual TRelation* get_relation() const { return _rel; } virtual TMask* get_mask(int mode) { return _msk; } virtual bool changing_mask(int mode) {return FALSE; } virtual int read(TMask& m); virtual void init_query_mode(TMask&); virtual void init_modify_mode(TMask&); static bool sottoc_handler (TMask_field& f, KEY k); public: void add_r(int,int,real&,real&,real&,char,real&,real&, real&,real&,TDate&,long,real&,real&,real&); void compilasheet(); bool fai_filtro(); TSheet_field& ss() const { return (TSheet_field&)_msk->field(F_SHEET_SALDI);} TSaldibrowse_application() {} }; HIDDEN TSaldibrowse_application& app() { return (TSaldibrowse_application&) main_app(); } void TSaldibrowse_application::init_query_mode(TMask& m) { m.disable(DLG_FINDREC); } void TSaldibrowse_application::init_modify_mode(TMask& m) { m.disable(DLG_FINDREC); } bool TSaldibrowse_application::fai_filtro() { TSaldo sld; int annop = 0; char tipo; _saldo_gruppo = _saldo_conto = _saldo_sottoc = FALSE; TMask& m = curr_mask(); tipo = m.get(F_TIPOCF)[0]; _anno = m.get_int(F_ANNO); _g = m.get_int(F_GRUPPO); _c = m.get_int(F_CONTO); if (tipo == '\0') _s = m.get_long(F_SOTTOCONTO); else if (tipo == 'C') _s = m.get_long(F_SOTTOC_CLIENTE); else _s = m.get_long(F_SOTTOC_FORN); if (_c == 0) _saldo_gruppo = TRUE; else if (_s == 0l) _saldo_conto = TRUE; else _saldo_sottoc = TRUE; TLocalisamfile& saldi = _rel1->lfile(); TRectype from (saldi.curr()); TRectype to (saldi.curr()); from.zero(); to.zero(); if (_anno != 0) annop = sld.EsePre(_anno); if (annop != 0) from.put(SLD_ANNOES,annop); else if (_anno != 0) from.put(SLD_ANNOES,_anno); else from.put(SLD_ANNOES,0); from.put(SLD_GRUPPO,_g); if (_c != 0) from.put(SLD_CONTO, _c); if (_s != 0l) from.put(SLD_SOTTOCONTO, _s); if (_anno != 0) to.put(SLD_ANNOES,_anno); else to.put(SLD_ANNOES, 9999); to.put(SLD_GRUPPO,_g); if (_c != 0) to.put(SLD_CONTO,_c); if (_s != 0l) to.put(SLD_SOTTOCONTO,_s); if ( _saldo_gruppo || _saldo_conto ) _cur->setkey(1); if (_saldo_sottoc) _cur->setkey(2); _cur->setregion(from,to); return TRUE; } bool TSaldibrowse_application::sottoc_handler(TMask_field& f, KEY key) { bool ok = TRUE; if (key == K_TAB) { bool stop = FALSE; TMask& m = f.mask(); int gruppo = m.get_int(F_GRUPPO); int conto = m.get_int(F_CONTO); const long sottoconto = atol(f.get()); const short id = f.dlg(); TLocalisamfile& pconti = app().get_relation()->lfile(); if (sottoconto != 0) { if (id == F_SOTTOCONTO) { if (gruppo != 0 && conto != 0) { pconti.setkey(1); pconti.put(PCN_GRUPPO, gruppo) ; pconti.put(PCN_CONTO, conto); pconti.put(PCN_SOTTOCONTO, sottoconto); ok = stop = pconti.read(_isequal, _nolock) == NOERR; } else ok = FALSE; } else { const char tipo = id == F_SOTTOC_CLIENTE ? 'C' : 'F'; TLocalisamfile clifo (LF_CLIFO); clifo.setkey(1); clifo.put(CLI_TIPOCF,tipo); clifo.put(CLI_CODCF, sottoconto) ; ok = stop = clifo.read(_isequal, _nolock) == NOERR; if (ok && (gruppo == 0 || conto == 0)) { m.set(F_GRUPPO, gruppo = clifo.get_int("GRUPPO")); m.set(F_CONTO, conto = clifo.get_int("CONTO")); ok = stop = gruppo != 0 && conto != 0; } } } else if (gruppo != 0 && conto != 0) { pconti.setkey(1); pconti.zero(); pconti.put(PCN_GRUPPO, gruppo) ; pconti.put(PCN_CONTO, conto); ok = stop= pconti.read(_isequal, _nolock) == NOERR; if (ok) { m.set(id, pconti.get(PCN_DESCR)); m.disable(id); } else m.reset(id); } if (stop) m.stop_run(K_AUTO_ENTER); if (!ok) error_box("Conto errato o incompleto"); } return ok; } bool TSaldibrowse_application::user_create() { _clifo = new TLocalisamfile(LF_CLIFO); _rel = new TRelation(LF_PCON); _rel1 = new TRelation(LF_SALDI); _cur = new TCursor(_rel1, "", 2); _msk = new TMask("cg5200a"); _msk->set_handler(F_SOTTOCONTO, sottoc_handler); _msk->set_handler(F_SOTTOC_CLIENTE, sottoc_handler); _msk->set_handler(F_SOTTOC_FORN, sottoc_handler); ss().disable(); set_search_field(F_GRUPPO); return TRUE; } bool TSaldibrowse_application::user_destroy() { delete _msk; delete _clifo; delete _rel; delete _rel1; delete _cur; return TRUE; } int TSaldibrowse_application::read(TMask& m) { m.autoload(_rel); fai_filtro(); compilasheet(); ss().force_update(); return NOERR; } void TSaldibrowse_application::add_r(int numrig,int a,real& pds,real& pas,real& sc,char f,real& si,real& pd, real& pa,real& s,TDate& d,long n,real& pdp,real& pap,real& sp) { TSheet_field& cs = ss(); char segno = ' '; TToken_string& riga = cs.row(numrig); riga.add(a, 0); riga.add(si.string(),1); if (si != ZERO) riga.add(f,2); riga.add(pd.string(),3); riga.add(pa.string(),4); if (s > ZERO) segno = 'D'; else if (s < ZERO) { s = -s; segno = 'A'; } riga.add(s.string(),5); riga.add(segno,6); segno = ' '; if (sc > ZERO) segno = 'D'; else if (sc < ZERO) { sc = -sc; segno = 'A'; } riga.add(pds.string(),7); riga.add(pas.string(),8); riga.add(sc.string(),9); riga.add(segno,10); /* dep = ""; if (si != ZERO) dep << si.string(REAL_PICTURE) << " " << f; dep = ""; if (s > ZERO) dep << s.string(REAL_PICTURE) << " D"; else if (s < ZERO) { s = -s; dep << s.string(REAL_PICTURE) << " A"; } */ riga.add(d.string(),11); riga.add(n,12); riga.add(pdp.string(),13); riga.add(pap.string(),14); /* dep = ""; if (sp > ZERO) dep << sp.string(REAL_PICTURE) << " D"; else if (sp < ZERO) { sp = -sp; dep << sp.string(REAL_PICTURE) << " A"; } */ segno = ' '; if (sp > ZERO) segno = 'D'; else if (sp < ZERO) { sp = -sp; segno = 'A'; } riga.add(sp.string(),15); riga.add(segno,16); } void TSaldibrowse_application::compilasheet() { char flagsal = ' '; real saldo = ZERO; real saldosca = ZERO; real saldopro = ZERO; real saldo_gc = ZERO; real saldoini_gc = ZERO; real saldosca_gc = ZERO; real saldopro_gc = ZERO; real saldoini = ZERO; real pdare = ZERO; real pavere = ZERO; real pdaresca = ZERO; real paveresca = ZERO; real pdarepro = ZERO; real paverepro = ZERO; int gruppo, conto, anno; long sottoconto; long ultimo_num = 0l; TDate ultima_data = 0; ss().reset(); _riga.destroy(); TRecnotype items = _cur->items(); *_cur = 0l; for (int i = 0; i < items; i++,++(*_cur)) { anno = _cur->curr().get_int(SLD_ANNOES); gruppo = _cur->curr().get_int(SLD_GRUPPO); conto = _cur->curr().get_int(SLD_CONTO); sottoconto = _cur->curr().get_long(SLD_SOTTOCONTO); if (gruppo != _g) continue; if (_saldo_conto && conto != _c) continue; if (_saldo_conto || _saldo_gruppo) _riga.add_riga(_cur->curr()); if (_saldo_sottoc) { flagsal = _cur->curr().get_char(SLD_FLAGSALINI); saldoini = _cur->curr().get_real(SLD_SALDO); pdare = _cur->curr().get_real(SLD_PDARE); pavere = _cur->curr().get_real(SLD_PAVERE); pdaresca = _cur->curr().get_real(SLD_PDARESCA); paveresca = _cur->curr().get_real(SLD_PAVERESCA); pdarepro = _cur->curr().get_real(SLD_PDAREPRO); paverepro = _cur->curr().get_real(SLD_PAVEREPRO); ultima_data = _cur->curr().get(SLD_DATAULMOV); ultimo_num = _cur->curr().get_long(SLD_NUMULTMOV); if (flagsal == 'D') saldo = pdare + saldoini - pavere; else saldo = pdare - saldoini - pavere; saldosca = saldo + pdaresca - paveresca; //in realta' non e' proprio il saldo degli scaricati ma quello complessivo saldopro = pdarepro - paverepro; add_r(i,anno,pdaresca,paveresca,saldosca,flagsal,saldoini,pdare,pavere,saldo,ultima_data,ultimo_num,pdarepro,paverepro,saldopro); } } if (_saldo_gruppo || _saldo_conto) { for (int j = 0; j < _riga.items(); j++) { TRectype& riga = (TRectype&)_riga[j]; anno = riga.get_int(SLD_ANNOES); pdaresca = riga.get_real(SLD_PDARESCA); paveresca = riga.get_real(SLD_PAVERESCA); //saldosca = pdaresca - paveresca; flagsal = riga.get_char(SLD_FLAGSALINI); saldoini = riga.get_real(SLD_SALDO); pdare = riga.get_real(SLD_PDARE); pavere = riga.get_real(SLD_PAVERE); saldo = pdare - pavere + saldoini; saldosca = saldo + pdaresca - paveresca; pdarepro = riga.get_real(SLD_PDAREPRO); paverepro = riga.get_real(SLD_PAVEREPRO); saldopro = pdarepro - paverepro; ultima_data = riga.get(SLD_DATAULMOV); ultimo_num = riga.get_long(SLD_NUMULTMOV); add_r(j,anno,pdaresca,paveresca,saldosca,flagsal,saldoini,pdare,pavere,saldo,ultima_data,ultimo_num,pdarepro,paverepro,saldopro); } _riga.destroy(); } } int cg5200(int argc, char* argv[]) { TSaldibrowse_application a; a.run(argc, argv, "Visualizzazione saldi"); return 0; }