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
This commit is contained in:
Simone Palacino 2020-04-18 16:00:37 +02:00
parent 086d1b538d
commit 96161ea90b
5 changed files with 140 additions and 54 deletions

View File

@ -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<TToken_string>& TControllo_mask::import_error_list()
static vector<TToken_string> 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<movimento_t>& 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;
}

View File

@ -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<TEstrai_mask> _estr_msk;
unique_ptr<TMonitor_mask> _msk;
vector<movimento_t> _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<TToken_string> _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)

View File

@ -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"

View File

@ -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<TToken_string>& controllo_mov)
char TF9_dberr::get_errori(const TString& codsoc, const TString& id_estr, vector<TToken_string>& 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<TToken_string>& 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");
}

View File

@ -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<TToken_string>& 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<TToken_string>& controllo_mov);
TF9_dberr();
};