From 96161ea90b7d08f6d694580808be8ed23d12f0ee Mon Sep 17 00:00:00 2001 From: Simone Palacino Date: Sat, 18 Apr 2020 16:00:37 +0200 Subject: [PATCH] Patch level : 12.0 no-patch Files correlati : f90.exe Commento : - F9 ARCHIVIAZIONE SOSTITUTIVA: - Aggiunti codici societa' alle query - Aggiunte stringhe checksum dei file f9*.sql, si puo' anche aggiungere un controllo del checksum dei file prima di eseguire le query, stesso sistema si puo' aggiungere anche all'FP - Corretta query modifica tabella F9WA --- src/f9/f90100.cpp | 62 +++++++++++++++++++------------- src/f9/f90100.h | 7 ++-- src/f9/f901tab.h | 33 +++++++++++++++++ src/f9/f9lib01.cpp | 88 +++++++++++++++++++++++++++++++++------------- src/f9/f9lib01.h | 4 +-- 5 files changed, 140 insertions(+), 54 deletions(-) diff --git a/src/f9/f90100.cpp b/src/f9/f90100.cpp index 7c2ab2d63..0610e369c 100644 --- a/src/f9/f90100.cpp +++ b/src/f9/f90100.cpp @@ -22,6 +22,12 @@ #define TAB_BASE_VERSION 100 // Versione base delle tabelle #define SQL_VERSION 104 // Utilizzo questo per controllare la versione attuale delle tabelle e nel caso aggiornarle +/* MD5 Check Sums dei file aggiornamento tabelle todo: possibile aggiunta: controllo del cheksum dei file (anche per FP) + * Aggiungo scritta in testa cosi da poter trovare la stringa anche da programma compilato e cambiare a mano il checksum se mi servisse. Attenzione! */ +#define CHECKSUMSQL0100 "SUMFILE0100eed185fa8f122010f426d99a23f26c88" +#define CHECKSUMSQL0102 "SUMFILE010235333a5e3b49ed31980851243f83b94d" +#define CHECKSUMSQL0104 "SUMFILE01040affe32741cd741814ce2cab2d992f6b" + //////////////////////////////////////////////////////// // Utilities @@ -208,6 +214,9 @@ bool TMonitor_mask::save_conf_handler(TMask_field& f, KEY key) { TMask& config_mask = f.mask(); TF9_app& a = f9_app(); + TString old_codsoc = a.get_ambiente(); + if(config_mask.get(CF_CODSOC).empty()) + warning_box("Codice Ambiente vuoto. Impossibile salvare i dati."); a.set_ambiente (config_mask.get(CF_CODSOC)); a.set_addr_doc (config_mask.get(CF_ADDRDOC)); a.set_has_vendext (config_mask.get_bool(CF_VENDEXT)); @@ -220,7 +229,7 @@ bool TMonitor_mask::save_conf_handler(TMask_field& f, KEY key) ini_set_bool(CONFIG_DITTA, PAR_MOD, VENDEXT_F9, a.get_has_vendext()); ini_set_bool(CONFIG_DITTA, PAR_MOD, VIEWMOV_F9, a.get_viewmov()); config_mask.close(); - a.edit_wa(); + a.edit_wa(old_codsoc); return true; } @@ -240,7 +249,7 @@ void TMonitor_mask::controllo_errori() const } if (flag) { - TControllo_mask controllo(id_estr); + TControllo_mask controllo(f9_app().get_ambiente(), id_estr); controllo.run(); } else @@ -540,7 +549,7 @@ void TControllo_mask::associa() // todo: levare gli ultimi residui del vecchio ++it; } it->add(' ', 0); - TF9_dberr::del_err(_id_estr, mov_sel->get_int(cid2index(F_CNUMREG))); + TF9_dberr::del_err(_cod_soc, _id_estr, mov_sel->get_int(cid2index(F_CNUMREG))); } } @@ -590,7 +599,7 @@ vector& TControllo_mask::import_error_list() static vector controllo_mov; controllo_mov.clear(); TF9_dberr dberr; - _tipo_doc_err = TF9_dberr::get_errori(_id_estr, controllo_mov); + _tipo_doc_err = TF9_dberr::get_errori(_cod_soc, _id_estr, controllo_mov); return controllo_mov; } @@ -822,9 +831,10 @@ bool TControllo_mask::on_field_event(TOperable_field& o, TField_event e, long jo return true; } -TControllo_mask::TControllo_mask(const char* id_estr, bool esclusi) +TControllo_mask::TControllo_mask(const char* codsoc, const char* id_estr, bool esclusi) : TAutomask("f90100b"), _ordin('D'), _verso('A'), _selected_mov(0), _sel_esclusi(false) { + _cod_soc = codsoc; _id_estr = id_estr; field(B_ESCL).disable(); field(B_ALLESCL).disable(); @@ -892,7 +902,8 @@ bool TF9_app::select_escl_notify(TSheet_field& s, int row, KEY key) bool TF9_app::controllo_escl_handler(TMask_field& field, KEY key) { - TControllo_mask controllo(f9_app()._estr_escluso->get_id_estr(), true); + TF9_app& app = f9_app(); + TControllo_mask controllo(app.get_ambiente(), app._estr_escluso->get_id_estr(), true); controllo.run(); return true; } @@ -1028,20 +1039,20 @@ void TF9_app::fill_esclusi() movimento_t TF9_app::escl2mov(TToken_string* row) { movimento_t t; - t.err = row->get(0)[0] == 'X', - t.numreg = row->get_int(1), - t.datareg = row->get(2), - t.datadoc = row->get(3), - t.codcaus = row->get(4), - t.meseliq = row->get_int(5), - t.numdoc = row->get(6), - t.tot = row->get(7), - t.codcf = row->get_int(8), - t.ragsoc = row->get_int(9), - t.reg_protiva = row->get(10), - t.descr = row->get(11), - t.state = null_state, - t.descr_err = ""; + t.err = row->get(0)[0] == 'X'; + t.numreg = row->get_int(1); + t.datareg = row->get(2); + t.datadoc = row->get(3); + t.codcaus = row->get(4); + t.meseliq = row->get_int(5); + t.numdoc = row->get(6); + t.tot = row->get(7); + t.codcf = row->get_int(8); + t.ragsoc = row->get_int(9); + t.reg_protiva = row->get(10); + t.descr = row->get(11); + t.state = null_state; + t.descr_err = ""; return t; } @@ -1103,11 +1114,12 @@ bool TF9_app::mov_handler_escl(TMask_field& f, KEY key) return open_mov(mov); } -void TF9_app::edit_wa() const +void TF9_app::edit_wa(TString& old_codsoc) const { TString query; - query << "DELETE FROM F9WA00K WHERE true;" << - "INSERT INTO F9WA00K (F9PCSOC, F9PPCDC0) VALUES (" << _config.ambiente << ", " << _config.addr_doc << ");"; + if (!old_codsoc.empty()) + query << "DELETE FROM " F9_WA " WHERE " WA_CODSOC " = '" << old_codsoc << "';\n"; + query << "INSERT INTO " F9_WA " (" WA_CODSOC ", " WA_ADDR_DOC ") VALUES (" << _config.ambiente << ", " << _config.addr_doc << ");"; } int TF9_app::estrai() @@ -1213,7 +1225,7 @@ bool TF9_app::segna_estratti(const bool escluso, const int numreg) vector& movs_v = escluso ? escl : _movs; TLocalisamfile mov(LF_MOV); - TToken_string elab("", ';'); + TToken_string elab("", ';'); elab.add("X", 0); elab.add(today.date2ansi()); elab.add(" "); // "[flag estratto];[data estrazione];[flag escluso]" for (auto it = movs_v.begin(); it != movs_v.end(); ++it) { @@ -1260,7 +1272,7 @@ bool TF9_app::check_tabelle_f9() const "WHERE TABLE_NAME = '" F9_DRD "'))\n" << "SELECT 1 AS EXIST ELSE SELECT 0 AS EXIST"; fp_db().sq_set_exec(query); - if (fp_db().sq_get("EXIST") != "1") // Se non esiste la tabella la creo + if (fp_db().sq_get("EXIST") != "1") // Se non esiste la tabella la creo ok &= create_tables(); return ok; } diff --git a/src/f9/f90100.h b/src/f9/f90100.h index 3b8fe9d9c..f6189881d 100644 --- a/src/f9/f90100.h +++ b/src/f9/f90100.h @@ -48,7 +48,7 @@ class TF9_app : public TSkeleton_application TString addr_doc; // Indirizzo documenti cartacei bool vendext; bool viewmovpre; - } _config; + } _config; // todo: controllare che siano sqlsafe unique_ptr _estr_msk; unique_ptr _msk; vector _movs; @@ -99,7 +99,7 @@ public: static bool mov_handler(TMask_field&, KEY key); static bool mov_handler_escl(TMask_field&, KEY key); - void edit_wa() const; + void edit_wa(TString& old_codsoc) const; /** Caricamento di tutti i movimenti data un periodo di data registrazione. * \return See TEstrazione::estrai(). */ @@ -165,6 +165,7 @@ class TControllo_mask : public TAutomask int _selected_mov; bool _sel_esclusi; bool _is_escluso; + TString _cod_soc; TString _id_estr; char _tipo_doc_err{}; vector _movs; @@ -186,7 +187,7 @@ class TControllo_mask : public TAutomask bool on_field_event(TOperable_field& o, TField_event e, long jolly) override; public: - explicit TControllo_mask(const char* id_estr, bool esclusi = false); + explicit TControllo_mask(const char* codsoc, const char* id_estr, bool esclusi = false); }; inline bool open_mov(const TRectype& mov) diff --git a/src/f9/f901tab.h b/src/f9/f901tab.h index b41e6ad93..1fc09c09e 100644 --- a/src/f9/f901tab.h +++ b/src/f9/f901tab.h @@ -5,6 +5,20 @@ #define F9_ERR "F9ERROR" #define F9_MOVESTR "F9MOVESTR" +// FILE WA : PARAMETRI SOC E INDIRIZZO DOC CARTACEI + +/* Percorso documenti cartaei viene costruito come : + * Parametro su f9pwa + ambiente + idlancio(ID drd) + categoria_documento(drt) + nome_documento + * + * esempio: + * (/softwaresirio/siaggf9) + '/001' + '/idlancio001' + '/Fatture'/ + nomedoc.pdf + */ + +#define WA_CODSOC "F9PCSOC" // A(10) [K] - Codice societa' +#define WA_ADDR_DOC "F9PPCDC" // A(256) - Percorso documenti cartacei +// Gli altri campi servono solo per l'AS ////////////////////////////////////// + + // FILE DRD : DRIVER ESTRAZIONE GIORNALE IVA #define DRD_CODSOC "F9RCSOC" // A(10) [K] @@ -104,6 +118,25 @@ #define DRT_OPCEE "F9TFCEE" // A(6) - operatore CEE +// F9ERROR: TABELLA MOVIMENTI IN ERRORE per controllo errori + +#define ERR_CODSOC "IDSOC" +#define ERR_IDESTR "IDESTR" +#define ERR_NUMREG "NUMREG" +#define ERR_DATAREG "DATAREG" +#define ERR_DATADOC "DATADOC" +#define ERR_CODCAUS "CODCAUS" +#define ERR_MESELIQ "MESELIQ" +#define ERR_IMPTDOC "IMPTOTDOC" +#define ERR_FORN "FORN" +#define ERR_RAGSOC "RAGSOC" +#define ERR_PROTIVA "PROTIVA" +#define ERR_DESCR "DESCR" +#define ERR_ESCLUDI "ESCLUDI" +#define ERR_ESCLUSO "ESCLUSO" +#define ERR_DESCERR "DESCRERR" + + // F9MOVESTR : TABELLA MOVIMENTI ESTRATTI #define MOV_CODSOC "IDSOC" diff --git a/src/f9/f9lib01.cpp b/src/f9/f9lib01.cpp index 33117a2d1..6080dcc81 100644 --- a/src/f9/f9lib01.cpp +++ b/src/f9/f9lib01.cpp @@ -7,6 +7,7 @@ #include "mov.h" #include "../fp/fplib.h" +// Controlla eventuali apostrofi e li raddoppia const char* check_str(const TString& str); //////////////////////////////////////////////////////// @@ -71,9 +72,10 @@ bool TEstrazione::check_periodo_def() const TString query; // Controllo se ci sono estrazioni (definitive) che si sovrappongono di periodo (con lo stesso tipo) e che non siano in stato di errore // Nel caso di stato di errore e' invece possibile la ri-estrazione - query << "SELECT *\nFROM F9DRD00K\n" << - "WHERE " << DRD_DATAA << " >= '" << _head.dal.date2ansi() << "' AND " DRD_DATADA " <= '" << _head.al.date2ansi() << "' AND " - DRD_FLAG_PD " = 'D' AND\n " DRD_STATO " <> '" D_GEST_ERR "' AND " DRD_STATO " <> '" D_WA_ERR "' AND " DRD_STATO " <> '" D_ERR_SOS "' AND " DRD_TIPODOC " = '" << _head.tipo_doc << "';"; + query << "SELECT *\nFROM " F9_DRD "\n" + "WHERE " DRD_CODSOC " = '" << _head.cod_soc << "' AND " DRD_DATAA " >= '" << _head.dal.date2ansi() << "' AND " DRD_DATADA " <= '" << + _head.al.date2ansi() << "' AND " DRD_FLAG_PD " = 'D' AND\n " DRD_STATO " <> '" D_GEST_ERR "' AND " DRD_STATO " <> '" D_WA_ERR "' AND " + DRD_STATO " <> '" D_ERR_SOS "' AND " DRD_TIPODOC " = '" << _head.tipo_doc << "';"; fp_db().sq_set_exec(query); return fp_db().sq_items() == 0; } @@ -167,6 +169,8 @@ bool TEstrazione::export_error_list() const if (it->numreg == 187680) bool simo = true; #endif + + dberr.add(_head.cod_soc); dberr.add(_head.id_estr); for (int i = 1; i < 15; i++) { @@ -196,7 +200,8 @@ TString TEstrazione::next_estr_today(char tipo) const TString query; query << "SELECT TOP 1 " DRD_ID_EST " AS IDESTR\n" "FROM " F9_DRD "\n" - "WHERE " DRD_ID_EST " LIKE '" << today.date2ansi() << "%'\n" << + "WHERE " DRD_CODSOC " = '" << _head.cod_soc << "' AND\n" + DRD_ID_EST " LIKE '" << today.date2ansi() << "%'\n" << "ORDER BY " DRD_ID_EST " DESC"; fp_db().sq_set_exec(query); @@ -247,9 +252,9 @@ bool TEstrazione::update_drd_stato_estr() const { TString query; query << "UPDATE " F9_DRD "\n" \ - "SET " DRD_STATO " = '" << _head.stato_estr << "'\n" \ - "WHERE " DRD_CODSOC " = '" << _head.cod_soc << "'" \ - " AND " DRD_ID_EST " = '" << _head.id_estr << "'" \ + "SET " DRD_STATO " = '" << _head.stato_estr << "'\n" + "WHERE " DRD_CODSOC " = '" << _head.cod_soc << "'" + " AND " DRD_ID_EST " = '" << _head.id_estr << "'" " AND " DRD_FLAG_PD " = '" << (_head.flag_prov ? "P" : "D") << "'"; ok = fp_db().sq_set_exec(query); ok = ok && fp_db().sq_commit(); @@ -582,9 +587,11 @@ bool TEstrazione::exist_prov() const bool TEstrazione::gap_periodo() const { - TString query; query << "SELECT F9RIDES AS ID, F9RUESA AS DATA_A FROM " F9_DRD "\n" - "WHERE " DRD_ID_EST " LIKE '%N%' AND " DRD_FLAG_PD " = 'D' AND " DRD_TIPODOC " = '" << _head.tipo_doc << "'\n" - "ORDER BY F9RUESA DESC"; + TString query; query << "SELECT " DRD_ID_EST " AS ID, " DRD_DATAA " AS DATA_A\n" + "FROM " F9_DRD "\n" + "WHERE " DRD_CODSOC " = '" << _head.cod_soc << "' AND " DRD_ID_EST " LIKE '%N%' AND " // '%N%' = Pacchetto normale + DRD_FLAG_PD " = 'D' AND " DRD_TIPODOC " = '" << _head.tipo_doc << "'\n" + "ORDER BY " DRD_DATAA " DESC"; const bool ok = fp_db().sq_set_exec(query); return ok && fp_db().sq_items() > 0 && _head.dal - fp_db().sq_get_date("DATA_A") > 1; } @@ -602,20 +609,19 @@ TEstrazione::TEstrazione(const TString& ambiente, const bool flag_prov, const ch const TString& addrcart, const bool escluso, const TDate* const dal, const TDate* const al, const bool has_vendext) : _descr(descr), _has_vendext(has_vendext) { - _head.cod_soc = ambiente; + _head.cod_soc = ambiente; _head.flag_prov = flag_prov; - _head.descr = descr; - _head.tipo_doc = tipodoc; + _head.descr = descr; + _head.tipo_doc = tipodoc; if (!escluso && dal != nullptr && al != nullptr) { _head.dal = *dal; - _head.al = *al; + _head.al = *al; } _head.addr_cart = addrcart; - _escluso = escluso; - - _error_sql = new ofstream; + _escluso = escluso; + _error_sql = new ofstream; _error_sql->open("f9_TEstrazione_error_sql.txt"); } @@ -664,21 +670,40 @@ bool TF9_dberr::send() const bool ok = fp_db().sq_set_exec(_insert) && fp_db().sq_commit(); if(!ok) write_sqlerrlog(_insert); - _insert.cut(0) << "INSERT INTO " F9_ERR " VALUES ()"; + _insert.cut(0) << "INSERT INTO " F9_ERR " (" + ERR_CODSOC ", " + ERR_IDESTR ", " + ERR_NUMREG ", " + ERR_DATAREG ", " + ERR_DATADOC ", " + ERR_CODCAUS ", " + ERR_MESELIQ ", " + ERR_IMPTDOC ", " + ERR_FORN ", " + ERR_RAGSOC ", " + ERR_PROTIVA ", " + ERR_DESCR ", " + ERR_ESCLUDI ", " + ERR_ESCLUSO ", " + ERR_DESCERR ") VALUES ()"; return ok; } -void TF9_dberr::del_err(const TString& id_estr, int numreg) +void TF9_dberr::del_err(const TString& codsoc, const TString& id_estr, int numreg) { TString query; - query << "DELETE FROM " F9_ERR " WHERE IDESTR = '" << id_estr << "' AND NUMREG = '" << numreg << "';"; + query << "DELETE FROM " F9_ERR + "\nWHERE " ERR_CODSOC " = '" << codsoc << "'" + "\nAND " ERR_IDESTR " = '" << id_estr << "' AND " ERR_NUMREG " = '" << numreg << "';"; fp_db().sq_set_exec(query); } -char TF9_dberr::get_errori(const TString& id_estr, vector& controllo_mov) +char TF9_dberr::get_errori(const TString& codsoc, const TString& id_estr, vector& controllo_mov) { TString query; - query << "SELECT * FROM " F9_ERR " WHERE IDESTR = '" << id_estr << "';"; + query << "SELECT * FROM " F9_ERR + "\nWHERE " ERR_CODSOC " = '" << codsoc << "' AND " + ERR_IDESTR " = '" << id_estr << "';"; fp_db().sq_set_exec(query, false); for (bool ok = fp_db().sq_next(); ok; ok = fp_db().sq_next()) { @@ -695,14 +720,29 @@ char TF9_dberr::get_errori(const TString& id_estr, vector& contro controllo_mov.insert(controllo_mov.end(), row); } query.cut(0) << "SELECT " DRD_TIPODOC " FROM " F9_DRD "\n" << - "WHERE " DRD_ID_EST " = '" << id_estr << "'"; + "WHERE " DRD_CODSOC " = '" << codsoc << "' AND " DRD_ID_EST " = '" << id_estr << "'"; fp_db().sq_set_exec(query); return fp_db().sq_get((unsigned)0)[0]; } TF9_dberr::TF9_dberr() { - _insert.cut(0) << "INSERT INTO " F9_ERR " VALUES ()"; + _insert.cut(0) << "INSERT INTO " F9_ERR " (" + ERR_CODSOC ", " + ERR_IDESTR ", " + ERR_NUMREG ", " + ERR_DATAREG ", " + ERR_DATADOC ", " + ERR_CODCAUS ", " + ERR_MESELIQ ", " + ERR_IMPTDOC ", " + ERR_FORN ", " + ERR_RAGSOC ", " + ERR_PROTIVA ", " + ERR_DESCR ", " + ERR_ESCLUDI ", " + ERR_ESCLUSO ", " + ERR_DESCERR ") VALUES ()"; _fout = new ofstream; _fout->open("f9_dberr.txt"); } diff --git a/src/f9/f9lib01.h b/src/f9/f9lib01.h index 25266bee5..bcd52eae4 100644 --- a/src/f9/f9lib01.h +++ b/src/f9/f9lib01.h @@ -274,8 +274,8 @@ public: void add(long num); void add() { add_str("NULL"); } bool send(); - static void del_err(const TString& id_estr, int numreg); - static char get_errori(const TString& id_estr, vector& controllo_mov); + static void del_err(const TString& codsoc, const TString& id_estr, int numreg); + static char get_errori(const TString& codsoc, const TString& id_estr, vector& controllo_mov); TF9_dberr(); };