From 47e8eaaa435b6357490bdc50b47a254284bca495 Mon Sep 17 00:00:00 2001 From: Alessandro Bonazzi Date: Thu, 21 Jan 2021 23:20:57 +0100 Subject: [PATCH] Patch level : 12.0 1028 Files correlati : tf0.exe Commento : Modificato l'aggiornamento del database del trasferimento fatture. Non modificava i campi esistenti ma creava solo i campi nuovi. --- src/tf/tf0100.cpp | 62 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 15 deletions(-) diff --git a/src/tf/tf0100.cpp b/src/tf/tf0100.cpp index 72e138dce..ef5099c28 100644 --- a/src/tf/tf0100.cpp +++ b/src/tf/tf0100.cpp @@ -590,37 +590,60 @@ int TTrFa_app::parse_line(const TString& line, TString& var, TString& val) const bool TTrFa_app::create_table(TScanner& tff, const TString& table) { TString query, var, val; - if (xvt_sql_table_exists(_db, table)) + bool modified = false; + TToken_string field_list("", ','); + const bool new_table = !xvt_sql_table_exists(_db, table); + streampos cur_pos = tff.pos(); + + if (!new_table) { SLIST fields = xvt_sql_list_fields(_db, table); - while (!tff.eof()) + + while (!modified && !tff.eof()) { const TString& line = tff.line(); const int n = parse_line(line, var, val); + if (n <= 0) break; if (var.starts_with("INDEX_")) break; if (xvt_slist_find_str(fields, var) == NULL) { - query.cut(0) << "ALTER TABLE " << table << " ADD COLUMN " << var << ' ' << val << " NOT NULL"; - if (val.find("INT") >= 0 || val.find("NUM") >= 0) - query << " DEFAULT 0"; - else - query << " DEFAULT ''"; - query << ";"; - xvt_sql_execute(_db, query, NULL, NULL); // Create table + + modified = true; } + else + modified = (val != xvt_sql_field_type(_db, table, var)); + } + if (modified) + { + const int nfields = xvt_slist_count(fields); + + for (SLIST_ELT field = xvt_slist_get_first(fields); field != nullptr; field = xvt_slist_get_next(fields, field)) + field_list.add(field->str); } xvt_slist_destroy(fields); + if (modified) + { + query = "ALTER TABLE "; + query << table << " RENAME TO " << table << "_OLD;"; + xvt_sql_execute(_db, query, NULL, NULL); // rename table table + query = "DROP INDEX "; + query << table << "_1;"; + xvt_sql_execute(_db, query, NULL, NULL); // rename table table + tff.setpos(cur_pos); + } } - else + if (new_table || modified) { - query << "CREATE TABLE " << table << " ("; + + query = "CREATE TABLE "; query << table << " ("; while (!tff.eof()) { const TString& line = tff.line(); const int n = parse_line(line, var, val); + if (n <= 0) break; if (n == 1) @@ -633,9 +656,8 @@ bool TTrFa_app::create_table(TScanner& tff, const TString& table) query.rtrim(1); // toglie ultima , query << ");"; xvt_sql_execute(_db, query, NULL, NULL); // Create table - query.cut(0); - query << "CREATE UNIQUE INDEX " - << table << "_1 ON " << table + query = "CREATE UNIQUE INDEX "; + query << table << "_1 ON " << table << " (" << val << ");"; xvt_sql_execute(_db, query, NULL, NULL); // Create index break; @@ -650,8 +672,18 @@ bool TTrFa_app::create_table(TScanner& tff, const TString& table) query << ","; } } + if (modified) + { + query = "INSERT INTO "; + query << table << "(" << field_list + << ") SELECT " << field_list << " FROM " + << table << "_OLD;"; + xvt_sql_execute(_db, query, NULL, NULL); // rename table table + query = "DROP TABLE "; + query << table << "_OLD;"; + xvt_sql_execute(_db, query, NULL, NULL); // rename table table + } } - return true; }