#include #include #include #include #include #include <../mg/anamag.h> #include #include class TStorico_consumi : public TSkeleton_application { protected: TRecnotype kill_records(int anno, TAssoc_array& clifo_grmerc) const; TRecnotype build_records(int anno, TAssoc_array& clifo_grmerc) const; void elabora(int anno) const; public: virtual void main_loop(); }; TRecnotype TStorico_consumi::kill_records(int anno, TAssoc_array& clifo_grmerc) const { TISAM_recordset stc("&STC"); TProgind pi(stc.items(), TR("Analisi storico consumi")); for (bool ok = stc.move_first(); ok; ok = stc.move_next()) { if (!pi.addstatus(1)) break; const TString& key = stc.get("CODTAB").as_string(); if (atoi(key.right(4)) == anno || key.find('@') > 0) clifo_grmerc.add(key); } return clifo_grmerc.items(); } TRecnotype TStorico_consumi::build_records(int anno, TAssoc_array& clifo_grmerc) const { TString query, limit; limit << "PROVV=D ANNO=" << anno; query << "USE RDOC KEY 3" << "\nFROM " << limit << "\nTO " << limit; TISAM_recordset rdoc(query); TProgind pi(rdoc.items(), TR("Scansione documenti")); TToken_string key; for (bool ok = rdoc.move_first(); ok; ok = rdoc.move_next()) { if (!pi.addstatus(1)) break; const TString4 tiporiga = rdoc.get(RDOC_TIPORIGA).as_string(); if (tiporiga != "01" && tiporiga != "09") continue; key = rdoc.get(RDOC_PROVV).as_string(); key.add(rdoc.get(RDOC_ANNO).as_string()); key.add(rdoc.get(RDOC_CODNUM).as_string()); key.add(rdoc.get(RDOC_NDOC).as_string()); const TRectype& doc = cache().get(LF_DOC, key); const long codcf = doc.get_long(DOC_CODCF); const TDate datadoc = doc.get(DOC_DATADOC); const TString4 tipo = doc.get(DOC_TIPODOC); const TString& b2 = cache().get("%TIP", tipo, "B2"); if (b2.blank()) continue; const TRectype& anamag = cache().get(LF_ANAMAG, rdoc.get(RDOC_CODARTMAG).as_string()); TString4 grmerc = anamag.get(ANAMAG_GRMERC).left(3); grmerc.left_just(3); key.format("%06ld%s%4d", codcf, (const char*)grmerc, anno); TRectype* rec = (TRectype*)clifo_grmerc.objptr(key); if (rec == NULL) { rec = new TRectype(LF_TABMOD); rec->put("MOD", "HA"); rec->put("COD", "STC"); rec->put("CODTAB", key); TString16 s0; s0.format("%s%06ld%4d", (const char*)grmerc, codcf, anno); rec->put("S0", s0); clifo_grmerc.add(key, rec); } real qta = rdoc.get(RDOC_QTA).as_real(); qta *= CENTO; qta.round(); // Salvo la quantitą moltiplicata per 100 ed arrotondata const real valore = rdoc.get("RG1:IMPNS").as_real(); TString8 qta_field, val_field; if (tiporiga == "01") { qta_field.format("I%d", datadoc.month()); val_field.format("R%d", datadoc.month()); } else { qta_field = "I0"; val_field = "R0"; } rec->add(qta_field, qta); rec->add(val_field, valore); } return clifo_grmerc.items(); } void TStorico_consumi::elabora(int anno) const { TAssoc_array old_recs, new_recs; TRecnotype old_tot = kill_records(anno, old_recs); const TRecnotype new_tot = build_records(anno, new_recs); TFast_isamfile stc(LF_TABMOD); if (new_tot) { TProgind pi(new_tot, TR("Salvataggio storico")); FOR_EACH_ASSOC_OBJECT(new_recs, obj, key, rec) { if (!pi.addstatus(1)) break; const TRectype& r = *(TRectype*)rec; int err = r.rewrite_write(stc); if (err == NOERR) { const TString& key = r.get("CODTAB"); old_recs.remove(key); // Tolgo il record dalla lista di quelli da cancellare } else { error_box(FR("Errore %d di scrittura sulla tabella STC"), err); break; } } } old_tot = old_recs.items(); if (old_tot) // Cancello i record dell'anno che non esistono pił { TProgind pi(old_tot, TR("Allineamento storico")); TRectype& rec = stc.curr(); FOR_EACH_ASSOC_OBJECT(old_recs, obj, key, itm) { if (!pi.addstatus(1)) break; rec.put("MOD", "HA"); rec.put("COD", "STC"); rec.put("CODTAB", key); const int err = rec.remove(stc); if (err != NOERR) { error_box(FR("Errore %d di cancellazione sulla tabella STC"), err); break; } } } } void TStorico_consumi::main_loop() { TMask m(main_app().title(), 1, 24, 5); m.add_number(101, 0, "Anno ", 1, 1, 4, "U").check_type(CHECK_REQUIRED); m.add_button(DLG_OK, 0, "", -12, -1, 8, 2); m.add_button(DLG_CANCEL, 0, "", -22, -1, 8, 2); while (m.run() == K_ENTER) elabora(m.get_int(101)); } int ha1400(int argc, char* argv[]) { TStorico_consumi a; a.run(argc, argv, TR("Storico Consumi")); return 0; }