Patch level : 12.00 1286
Files correlati : sc0.exe Commento : Programma di esportazione partite
This commit is contained in:
parent
05bb21f443
commit
9bf716335f
@ -611,7 +611,7 @@ const char * TString_array::crow(int n)
|
|||||||
|
|
||||||
int TString_array::add(const char* s, int n)
|
int TString_array::add(const char* s, int n)
|
||||||
{
|
{
|
||||||
if (objptr(n) == NULL)
|
if (objptr(n) == nullptr)
|
||||||
n = TArray::add(new TToken_string(s), n);
|
n = TArray::add(new TToken_string(s), n);
|
||||||
else
|
else
|
||||||
row(n) = s;
|
row(n) = s;
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include <xml.h>
|
#include <xml.h>
|
||||||
|
|
||||||
#include <user.h>
|
#include <user.h>
|
||||||
|
#include <rdoc.h>
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
// TRecipient
|
// TRecipient
|
||||||
@ -296,26 +297,36 @@ static int write_xml(TConfig& cfg, void* jolly)
|
|||||||
|
|
||||||
typedef enum { db_add, db_update, db_remove } db_op;
|
typedef enum { db_add, db_update, db_remove } db_op;
|
||||||
|
|
||||||
const TString & table_name(int logicnum)
|
const TString & table_name(int logicnum, bool mssql)
|
||||||
{
|
{
|
||||||
TString & name = get_tmp_string();
|
TString & name = get_tmp_string();
|
||||||
const int firm = prefix().get_codditta();
|
const int firm = prefix().get_codditta();
|
||||||
TDir d(logicnum);
|
TDir d(logicnum);
|
||||||
|
|
||||||
|
if (mssql)
|
||||||
|
name << '[';
|
||||||
if (d.is_firm())
|
if (d.is_firm())
|
||||||
name << format("%05lda", firm) << '.';
|
name << format("%05lda", firm);
|
||||||
else
|
else
|
||||||
name << "COM.";
|
name << "COM";
|
||||||
|
|
||||||
|
if (mssql)
|
||||||
|
name << '.';
|
||||||
|
else
|
||||||
|
name << '_';
|
||||||
name << logic2table(logicnum);
|
name << logic2table(logicnum);
|
||||||
|
if (mssql)
|
||||||
|
name << ']';
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
HIDDEN bool create_table(TODBC_recordset & recset, int logicnum, const char * table_name, TTrec & recdef)
|
HIDDEN bool create_table(TODBC_recordset & recset, int logicnum, const char * table_name, TTrec & recdef)
|
||||||
{
|
{
|
||||||
TString sql = "CREATE TABLE [";
|
TString sql = "CREATE TABLE ";
|
||||||
int nfields = recdef.fields();
|
int nfields = recdef.fields();
|
||||||
|
const bool mssql = recset.driver() == ODBC_mssql;
|
||||||
sql << table_name << "](\n";
|
|
||||||
|
sql << table_name << " (\n";
|
||||||
for (int i = 0; i < nfields; i++)
|
for (int i = 0; i < nfields; i++)
|
||||||
{
|
{
|
||||||
TToken_string def = recdef.fielddef(i);
|
TToken_string def = recdef.fielddef(i);
|
||||||
@ -324,7 +335,8 @@ HIDDEN bool create_table(TODBC_recordset & recset, int logicnum, const char * ta
|
|||||||
|
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
sql << ", ";
|
sql << ", ";
|
||||||
sql << "[" << field << "] ";
|
sql << field;
|
||||||
|
sql << ' ';
|
||||||
switch (t)
|
switch (t)
|
||||||
{
|
{
|
||||||
case _charfld:
|
case _charfld:
|
||||||
@ -332,7 +344,11 @@ HIDDEN bool create_table(TODBC_recordset & recset, int logicnum, const char * ta
|
|||||||
sql << "VARCHAR(" << def.get_int(2) << ")";
|
sql << "VARCHAR(" << def.get_int(2) << ")";
|
||||||
break;
|
break;
|
||||||
case _memofld:
|
case _memofld:
|
||||||
sql << "VARCHAR(MAX)"; break;
|
if (mssql)
|
||||||
|
sql << "VARCHAR(MAX)";
|
||||||
|
else
|
||||||
|
sql << "TEXT(65535)";
|
||||||
|
break;
|
||||||
case _datefld:
|
case _datefld:
|
||||||
sql << "DATE"; break;
|
sql << "DATE"; break;
|
||||||
case _boolfld:
|
case _boolfld:
|
||||||
@ -345,7 +361,6 @@ HIDDEN bool create_table(TODBC_recordset & recset, int logicnum, const char * ta
|
|||||||
case _longzerofld:
|
case _longzerofld:
|
||||||
default: sql << "NUMERIC(" << def.get_int(2) << "," << def.get_int(3) << ")"; break;
|
default: sql << "NUMERIC(" << def.get_int(2) << "," << def.get_int(3) << ")"; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
sql << ");\n";
|
sql << ");\n";
|
||||||
int err = recset.exec(sql);
|
int err = recset.exec(sql);
|
||||||
@ -365,49 +380,84 @@ HIDDEN bool create_table(TODBC_recordset & recset, int logicnum, const char * ta
|
|||||||
key = key.left(pos);
|
key = key.left(pos);
|
||||||
}
|
}
|
||||||
sql = "CREATE ";
|
sql = "CREATE ";
|
||||||
sql << (dupkeys ? "INDEX KEY" : "UNIQUE INDEX KEY") << k + 1 << " ON [" << table_name << "] (";
|
sql << (dupkeys ? "INDEX KEY" : "UNIQUE INDEX KEY") << k + 1 << " ON " << table_name << " (";
|
||||||
|
if (mssql)
|
||||||
FOR_EACH_STR_TOKEN(key, field)
|
|
||||||
{
|
{
|
||||||
if (el++ > 0)
|
FOR_EACH_STR_TOKEN(key, field)
|
||||||
sql << ',';
|
|
||||||
if (field.starts_with("UPPER"))
|
|
||||||
{
|
{
|
||||||
field = field.mid(6, field.len() - 7);
|
if (el++ > 0)
|
||||||
sql << field << "_UPPER";
|
sql << ',';
|
||||||
TString alter = "ALTER TABLE [";
|
if (field.starts_with("UPPER"))
|
||||||
|
|
||||||
alter << table_name << "] ADD " << field << "_UPPER AS UPPER(" << field << ");";
|
|
||||||
err = recset.exec(alter);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int pos = field.find("[");
|
|
||||||
|
|
||||||
if (pos > 0)
|
|
||||||
{
|
{
|
||||||
TString fld = field.left(pos);
|
field = field.mid(6, field.len() - 7);
|
||||||
|
sql << field << "_UPPER";
|
||||||
|
|
||||||
sql << fld << "_MID";
|
TString alter = "ALTER TABLE ";
|
||||||
|
|
||||||
const int start = atoi(field.mid(pos + 1));
|
alter << table_name << " ADD " << field << "_UPPER AS UPPER(" << field << ");";
|
||||||
|
|
||||||
pos = field.find(",", pos + 1);
|
|
||||||
const int end = pos > 0 ? atoi(field.mid(pos + 1)) : 0;
|
|
||||||
|
|
||||||
TString alter = "ALTER TABLE [";
|
|
||||||
|
|
||||||
alter << table_name << "] ADD " << fld << "_MID AS " << (recset.driver() == ODBC_mssql ? "SUBSTRING(" : "MID(") << fld << ',' << start;
|
|
||||||
|
|
||||||
if (end > 0)
|
|
||||||
alter << ',' << end - start + 1;
|
|
||||||
alter << ");";
|
|
||||||
err = recset.exec(alter);
|
err = recset.exec(alter);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
sql << field;
|
{
|
||||||
|
int pos = field.find("[");
|
||||||
|
|
||||||
|
if (pos > 0)
|
||||||
|
{
|
||||||
|
TString fld = field.left(pos);
|
||||||
|
|
||||||
|
sql << fld << "_MID";
|
||||||
|
|
||||||
|
const int start = atoi(field.mid(pos + 1));
|
||||||
|
|
||||||
|
pos = field.find(",", pos + 1);
|
||||||
|
const int end = pos > 0 ? atoi(field.mid(pos + 1)) : 0;
|
||||||
|
|
||||||
|
TString alter = "ALTER TABLE ";
|
||||||
|
|
||||||
|
alter << table_name << " ADD " << fld << "_MID AS " << (mssql ? "SUBSTRING(" : "MID(") << fld << ',' << start;
|
||||||
|
if (end > 0)
|
||||||
|
alter << ',' << end - start + 1;
|
||||||
|
alter << ");";
|
||||||
|
err = recset.exec(alter);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
sql << field;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FOR_EACH_STR_TOKEN(key, field)
|
||||||
|
{
|
||||||
|
if (el++ > 0)
|
||||||
|
sql << ',';
|
||||||
|
|
||||||
|
if (field.find("UPPER") >= 0)
|
||||||
|
sql << "( " << field << " )";
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int pos = field.find("[");
|
||||||
|
|
||||||
|
if (pos > 0)
|
||||||
|
{
|
||||||
|
TString fld = field.left(pos);
|
||||||
|
const int start = atoi(field.mid(pos + 1));
|
||||||
|
|
||||||
|
pos = field.find(",", pos + 1);
|
||||||
|
|
||||||
|
const int end = pos > 0 ? atoi(field.mid(pos + 1)) : 0;
|
||||||
|
|
||||||
|
sql << "( SUBSTRING(" << fld << ',' << start;
|
||||||
|
if (end > 0)
|
||||||
|
sql << ',' << end - start + 1;
|
||||||
|
sql << " )";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
sql << field;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
sql << ");\n";
|
sql << ");\n";
|
||||||
int err = recset.exec(sql);
|
int err = recset.exec(sql);
|
||||||
|
|
||||||
@ -417,13 +467,14 @@ HIDDEN bool create_table(TODBC_recordset & recset, int logicnum, const char * ta
|
|||||||
return err >= 0;
|
return err >= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
HIDDEN const TString & build_statement(const db_op op, int logicnum, const char * table_name, const TString_array & keys, const TString_array & values)
|
HIDDEN const TString & build_statement(TODBC_recordset & recset, const db_op op, int logicnum, const char * table_name, const TString_array & keys, const TString_array & values)
|
||||||
{
|
{
|
||||||
TString & statement = get_tmp_string();
|
TString & statement = get_tmp_string();
|
||||||
|
const bool mssql = recset.driver() == ODBC_mssql;
|
||||||
|
|
||||||
if (op == db_add)
|
if (op == db_add)
|
||||||
{
|
{
|
||||||
statement << "INSERT INTO [" << table_name << "] (";
|
statement << "INSERT INTO " << table_name << " (";
|
||||||
FOR_EACH_ARRAY_ROW(values, r, row)
|
FOR_EACH_ARRAY_ROW(values, r, row)
|
||||||
{
|
{
|
||||||
if (r > 0)
|
if (r > 0)
|
||||||
@ -433,6 +484,8 @@ HIDDEN const TString & build_statement(const db_op op, int logicnum, const char
|
|||||||
statement << ") VALUES (";
|
statement << ") VALUES (";
|
||||||
FOR_EACH_ARRAY_ROW(values, rk, rowk)
|
FOR_EACH_ARRAY_ROW(values, rk, rowk)
|
||||||
{
|
{
|
||||||
|
const TString f = rowk->get(0);
|
||||||
|
|
||||||
if (rk > 0)
|
if (rk > 0)
|
||||||
statement << ", ";
|
statement << ", ";
|
||||||
statement << rowk->get(1);
|
statement << rowk->get(1);
|
||||||
@ -442,65 +495,101 @@ HIDDEN const TString & build_statement(const db_op op, int logicnum, const char
|
|||||||
else
|
else
|
||||||
if (op == db_update)
|
if (op == db_update)
|
||||||
{
|
{
|
||||||
statement << "UPDATE [" << table_name << "] SET ";
|
statement << "UPDATE " << table_name << " SET ";
|
||||||
FOR_EACH_ARRAY_ROW(values, r, row)
|
FOR_EACH_ARRAY_ROW(values, r, row)
|
||||||
{
|
{
|
||||||
if (r > 0)
|
if (r > 0)
|
||||||
statement << ", ";
|
statement << ", ";
|
||||||
statement << *row;
|
statement << row->get(0) << '=' << row->get(1);
|
||||||
}
|
}
|
||||||
statement << " WHERE";
|
statement << " WHERE";
|
||||||
FOR_EACH_ARRAY_ROW(keys, rk, rowk)
|
FOR_EACH_ARRAY_ROW(keys, rk, rowk)
|
||||||
{
|
{
|
||||||
if (rk > 0)
|
if (rk > 0)
|
||||||
statement << " AND";
|
statement << " AND";
|
||||||
statement << ' ' << *rowk;
|
statement << ' ' << rowk->get(0) << '=' << rowk->get(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (op == db_remove)
|
if (op == db_remove)
|
||||||
{
|
{
|
||||||
statement << "DELETE FROM [" << table_name << "] WHERE ";
|
statement << "DELETE FROM " << table_name << " WHERE ";
|
||||||
FOR_EACH_ARRAY_ROW(keys, rk, rowk)
|
FOR_EACH_ARRAY_ROW(keys, rk, rowk)
|
||||||
{
|
{
|
||||||
if (rk > 0)
|
if (rk > 0)
|
||||||
statement << " AND";
|
statement << " AND";
|
||||||
statement << ' ' << *rowk;
|
statement << ' ' << rowk->get(0) << '=' << rowk->get(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
statement << ';';
|
statement << ';';
|
||||||
return statement;
|
return statement;
|
||||||
}
|
}
|
||||||
|
|
||||||
HIDDEN const char * make_val(const char * fld, TFieldtypes t, TString &src)
|
HIDDEN const char * make_val(const char * fld, TFieldtypes t, TODBC_driver driver, TString &src)
|
||||||
{
|
{
|
||||||
TString & val = get_tmp_string();
|
TString & val = get_tmp_string();
|
||||||
int pos = src.find("'");
|
int pos = src.find("'");
|
||||||
|
const bool mssql = driver == ODBC_mssql;
|
||||||
|
|
||||||
val << fld << '=';
|
val << fld << '~';
|
||||||
while (pos > 0)
|
while (pos >= 0)
|
||||||
{
|
{
|
||||||
src.insert("'", pos);
|
src.insert("\\", pos);
|
||||||
pos = src.find("'", pos + 2);
|
pos = src.find("'", pos + 2);
|
||||||
}
|
}
|
||||||
switch (t)
|
switch (t)
|
||||||
{
|
{
|
||||||
case _alfafld:
|
case _alfafld:
|
||||||
case _charfld:
|
case _charfld:
|
||||||
case _datefld:
|
|
||||||
case _memofld:
|
case _memofld:
|
||||||
val << '\'' << src << '\'';
|
{
|
||||||
|
TString outval(src);
|
||||||
|
|
||||||
|
outval = unesc(outval);
|
||||||
|
outval.rtrim();
|
||||||
|
int p = 0;
|
||||||
|
int len = outval.len();
|
||||||
|
|
||||||
|
while ((p = outval.find("\\'", p)) >= 0)
|
||||||
|
outval[p] = '\'';
|
||||||
|
if (len == 1 && outval[0] == '\\')
|
||||||
|
outval << '\\';
|
||||||
|
else
|
||||||
|
if (len > 1 && outval[len - 1] == '\\' && outval[len - 2] != '\\')
|
||||||
|
outval << '\\';
|
||||||
|
val << '\'' << outval << '\'';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case _datefld:
|
||||||
|
if (mssql)
|
||||||
|
val << '\'' << src << '\'';
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TDate d(src);
|
||||||
|
|
||||||
|
if (d.ok())
|
||||||
|
val << '\'' << d.string(full, '-', full, full, amg_date) << '\'';
|
||||||
|
else
|
||||||
|
val << "NULL";
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case _intfld:
|
case _intfld:
|
||||||
case _longfld:
|
|
||||||
case _realfld:
|
|
||||||
case _wordfld:
|
case _wordfld:
|
||||||
case _intzerofld:
|
case _intzerofld:
|
||||||
|
val << atoi(src);
|
||||||
|
break;
|
||||||
|
case _longfld:
|
||||||
case _longzerofld:
|
case _longzerofld:
|
||||||
|
val << atol(src);
|
||||||
|
break;
|
||||||
|
case _realfld:
|
||||||
val << (src.blank() ? "0" : src);
|
val << (src.blank() ? "0" : src);
|
||||||
break;
|
break;
|
||||||
case _boolfld:
|
case _boolfld:
|
||||||
val << (src.blank() ? "'FALSE'" : "'TRUE'");
|
if (mssql)
|
||||||
|
val << (src.blank() ? "'FALSE'" : "'TRUE'");
|
||||||
|
else
|
||||||
|
val << (src.blank() ? 0 : 1);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
val << src;
|
val << src;
|
||||||
@ -508,6 +597,10 @@ HIDDEN const char * make_val(const char * fld, TFieldtypes t, TString &src)
|
|||||||
}
|
}
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define STOP_FLD (s, cf, fld, val, cv) if (s && cf == fld)\
|
||||||
|
s = (val == cv);
|
||||||
|
|
||||||
HIDDEN bool popolate_table(TODBC_recordset & recset, int logicnum, const char * table_name, TTrec & recdef)
|
HIDDEN bool popolate_table(TODBC_recordset & recset, int logicnum, const char * table_name, TTrec & recdef)
|
||||||
{
|
{
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
@ -527,13 +620,14 @@ HIDDEN bool popolate_table(TODBC_recordset & recset, int logicnum, const char *
|
|||||||
TString field(def.get(0));
|
TString field(def.get(0));
|
||||||
TFieldtypes t = (TFieldtypes)def.get_int(1);
|
TFieldtypes t = (TFieldtypes)def.get_int(1);
|
||||||
TString str = c.curr().get(field);
|
TString str = c.curr().get(field);
|
||||||
TToken_string row(make_val(field, t, str), '=');
|
TToken_string row(make_val(field, t, recset.driver(), str), '~');
|
||||||
|
|
||||||
values.add(row);
|
values.add(row);
|
||||||
}
|
}
|
||||||
|
|
||||||
TToken_string key(recdef.keydef(), '+');
|
TToken_string key(recdef.keydef(), '+');
|
||||||
int pos = key.find("|");
|
int pos = key.find("|");
|
||||||
|
bool stop = true;
|
||||||
|
|
||||||
if (pos > 0)
|
if (pos > 0)
|
||||||
key = key.left(pos);
|
key = key.left(pos);
|
||||||
@ -557,19 +651,22 @@ HIDDEN bool popolate_table(TODBC_recordset & recset, int logicnum, const char *
|
|||||||
str = str.smid(start, pos > 0 ? pos : 0);
|
str = str.smid(start, pos > 0 ? pos : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
TToken_string row(make_val(field, t, str), '=');
|
TToken_string row(make_val(field, t, recset.driver(), str), '~');
|
||||||
|
|
||||||
keys.add(row);
|
keys.add(row);
|
||||||
|
#ifdef DBG
|
||||||
|
// STOP_FLD(stop, fld, "CODNUM", str , "RIM")
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
const TString & statement = build_statement(db_add, logicnum, table_name, keys, values);
|
const TString & statement = build_statement(recset, db_add, logicnum, table_name, keys, values);
|
||||||
int err = recset.exec(statement);
|
int err = recset.exec(statement);
|
||||||
|
|
||||||
if (err <= 0)
|
if (err <= 0)
|
||||||
{
|
{
|
||||||
const TString & statement = build_statement( db_update, logicnum, table_name, keys, values);
|
const TString & update_statement = build_statement(recset, db_update, logicnum, table_name, keys, values);
|
||||||
|
|
||||||
err = recset.exec(statement);
|
err = recset.exec(update_statement);
|
||||||
}
|
}
|
||||||
if (err <= 0)
|
if (err <= 0)
|
||||||
error_box(FR("Errore n. %d invio file %d"), -err, logicnum);
|
error_box(FR("Errore n. %d invio file %d"), -err, logicnum);
|
||||||
@ -605,6 +702,9 @@ HIDDEN void odbc_send(const TString & dsn, int num, TAuto_token_string & elab_fi
|
|||||||
error_box(FR("Non posso connettermi a (%s)"), (const char *)odbc_str);
|
error_box(FR("Non posso connettermi a (%s)"), (const char *)odbc_str);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const bool mssql = recset.driver() == ODBC_mssql;
|
||||||
|
|
||||||
ini.list_paragraphs(files);
|
ini.list_paragraphs(files);
|
||||||
FOR_EACH_ARRAY_ROW(files, i, row)
|
FOR_EACH_ARRAY_ROW(files, i, row)
|
||||||
{
|
{
|
||||||
@ -628,30 +728,73 @@ HIDDEN void odbc_send(const TString & dsn, int num, TAuto_token_string & elab_fi
|
|||||||
ini.set_paragraph(*row);
|
ini.set_paragraph(*row);
|
||||||
TTrec wrk(curr_file_num);
|
TTrec wrk(curr_file_num);
|
||||||
int nfields = wrk.fields();
|
int nfields = wrk.fields();
|
||||||
const TString name = table_name(curr_file_num);
|
const TString name = table_name(curr_file_num, mssql);
|
||||||
TToken_string key(wrk.keydef(), '+');
|
TToken_string key(wrk.keydef(), '+');
|
||||||
TString check_statement = "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = '";
|
TString check_statement = "SHOW TABLE STATUS WHERE Name = '";
|
||||||
|
|
||||||
|
if (mssql)
|
||||||
|
{
|
||||||
|
TString sqlname = name.mid(1, name.len() - 2);
|
||||||
|
|
||||||
check_statement << name << "';";
|
check_statement = "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = '";
|
||||||
|
check_statement << sqlname << "';";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
check_statement << name << "';";
|
||||||
int err = recset.exec(check_statement);
|
int err = recset.exec(check_statement);
|
||||||
if (err <= 0)
|
if (err <= 0)
|
||||||
{
|
{
|
||||||
create_table(recset, curr_file_num, name, wrk);
|
create_table(recset, curr_file_num, name, wrk);
|
||||||
popolate_table(recset, curr_file_num, name, wrk);
|
popolate_table(recset, curr_file_num, name, wrk);
|
||||||
recset.exec("COMMIT;");
|
recset.commit();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
bool descr = false;
|
||||||
|
|
||||||
for (int i = 0; i < nfields; i++)
|
for (int i = 0; i < nfields; i++)
|
||||||
{
|
{
|
||||||
TToken_string def = wrk.fielddef(i);
|
TToken_string def = wrk.fielddef(i);
|
||||||
TString field(def.get(0));
|
TString field(def.get(0));
|
||||||
TFieldtypes t = (TFieldtypes)def.get_int(1);
|
TFieldtypes t = (TFieldtypes)def.get_int(1);
|
||||||
TString str = ini.get(field);
|
TString str = ini.get(field);
|
||||||
|
|
||||||
|
if (key.find(field) >= 0 && str.blank())
|
||||||
|
{
|
||||||
|
ini.set_paragraph(main_file);
|
||||||
|
str = ini.get(field);
|
||||||
|
if (str.blank())
|
||||||
|
str << rowkey.get();
|
||||||
|
ini.set_paragraph(*row);
|
||||||
|
}
|
||||||
str = str.strip("\"");
|
str = str.strip("\"");
|
||||||
if (key.find(field) >= 0 && str.blank())
|
if (key.find(field) >= 0 && str.blank())
|
||||||
str << rowkey;
|
str << rowkey; // qui max
|
||||||
TToken_string row(make_val(field, t, str), '=');
|
|
||||||
|
if (curr_file_num == LF_RIGHEDOC)
|
||||||
|
{
|
||||||
|
if (field == RDOC_DESCR && str.len() > 50)
|
||||||
|
{
|
||||||
|
TString v;
|
||||||
|
TString add_fld;
|
||||||
|
TToken_string row("", '~');
|
||||||
|
|
||||||
|
add_fld = RDOC_DESCLUNGA;
|
||||||
|
v = "X";
|
||||||
|
row = make_val(add_fld, _boolfld, recset.driver(), v);
|
||||||
|
values.add(row);
|
||||||
|
add_fld = RDOC_DESCEST;
|
||||||
|
row = make_val(add_fld, _alfafld, recset.driver(), str.smid(50));
|
||||||
|
values.add(row);
|
||||||
|
str = str.sleft(50).trim();
|
||||||
|
descr = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (descr && (field == RDOC_DESCLUNGA || field == RDOC_DESCEST))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
TToken_string row(make_val(field, t, recset.driver(), str), '~');
|
||||||
|
|
||||||
values.add(row);
|
values.add(row);
|
||||||
}
|
}
|
||||||
@ -661,6 +804,7 @@ HIDDEN void odbc_send(const TString & dsn, int num, TAuto_token_string & elab_fi
|
|||||||
if (pos > 0)
|
if (pos > 0)
|
||||||
key = key.left(pos);
|
key = key.left(pos);
|
||||||
pos = 0;
|
pos = 0;
|
||||||
|
rowkey.restart();
|
||||||
FOR_EACH_STR_TOKEN(key, field)
|
FOR_EACH_STR_TOKEN(key, field)
|
||||||
{
|
{
|
||||||
TString fld = field;
|
TString fld = field;
|
||||||
@ -679,14 +823,14 @@ HIDDEN void odbc_send(const TString & dsn, int num, TAuto_token_string & elab_fi
|
|||||||
fld = fld.left(pos);
|
fld = fld.left(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
TString str = ini.get(field);
|
TString str = ini.get(fld);
|
||||||
|
|
||||||
if (str.blank())
|
if (str.blank())
|
||||||
{
|
{
|
||||||
ini.set_paragraph(main_file);
|
ini.set_paragraph(main_file);
|
||||||
str = ini.get(fld);
|
str = ini.get(fld);
|
||||||
if (str.blank())
|
if (str.blank())
|
||||||
str << rowkey;
|
str << rowkey.get();
|
||||||
ini.set_paragraph(*row);
|
ini.set_paragraph(*row);
|
||||||
}
|
}
|
||||||
str = str.strip("\"");
|
str = str.strip("\"");
|
||||||
@ -703,7 +847,8 @@ HIDDEN void odbc_send(const TString & dsn, int num, TAuto_token_string & elab_fi
|
|||||||
fld << "_MID";
|
fld << "_MID";
|
||||||
}
|
}
|
||||||
|
|
||||||
TToken_string row(make_val(fld, t, str), '=');
|
TToken_string row(make_val(fld, t, recset.driver(), str), '~');
|
||||||
|
|
||||||
keys.add(row);
|
keys.add(row);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -711,29 +856,31 @@ HIDDEN void odbc_send(const TString & dsn, int num, TAuto_token_string & elab_fi
|
|||||||
|
|
||||||
if (op < db_remove)
|
if (op < db_remove)
|
||||||
{
|
{
|
||||||
statement << "SELECT * FROM [" << name << "] WHERE ";
|
statement << "SELECT * FROM " << name << " WHERE ";
|
||||||
FOR_EACH_ARRAY_ROW(keys, rk, rowk)
|
FOR_EACH_ARRAY_ROW(keys, rk, rowk)
|
||||||
{
|
{
|
||||||
if (rk > 0)
|
if (rk > 0)
|
||||||
statement << " AND";
|
statement << " AND";
|
||||||
statement << ' ' << *rowk;
|
statement << ' ' << rowk->get(0) << "=" << rowk->get(1);
|
||||||
}
|
}
|
||||||
statement << ";";
|
statement << ";";
|
||||||
|
|
||||||
int err = recset.exec(statement);
|
int err = recset.exec(statement);
|
||||||
|
|
||||||
if (err == 0 && op == db_update)
|
if (err == 0 && op == db_update)
|
||||||
op = db_add;
|
op = db_add;
|
||||||
else
|
else
|
||||||
if (err > 0 && op == db_add)
|
if (err > 0 && op == db_add)
|
||||||
op = db_update;
|
op = db_update;
|
||||||
}
|
}
|
||||||
statement = build_statement(op, curr_file_num, name, keys, values);
|
statement = build_statement(recset, op, curr_file_num, name, keys, values);
|
||||||
|
|
||||||
int err = recset.exec(statement);
|
int err = recset.exec(statement);
|
||||||
|
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
error_box(FR("Errore n. %d invio file %d"), -err, curr_file_num);
|
error_box(FR("Errore n. %d invio file %d"), -err, curr_file_num);
|
||||||
else
|
else
|
||||||
recset.exec("COMMIT;");
|
recset.commit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -903,7 +1050,7 @@ bool TPostman::dispatch_transaction(const TRectype& rec,
|
|||||||
odbc_files.restart();
|
odbc_files.restart();
|
||||||
FOR_EACH_TOKEN(odbc_dest, r)
|
FOR_EACH_TOKEN(odbc_dest, r)
|
||||||
{
|
{
|
||||||
const TString & dsn = r;
|
const TString dsn = r;
|
||||||
|
|
||||||
TAuto_token_string files = odbc_files.get();
|
TAuto_token_string files = odbc_files.get();
|
||||||
|
|
||||||
|
@ -107,13 +107,13 @@ int TString::make_room(
|
|||||||
return lun;
|
return lun;
|
||||||
}
|
}
|
||||||
|
|
||||||
TString::TString(const char* s) : _str(NULL), _size(0)
|
TString::TString(const char* s) : _str(nullptr), _size(0)
|
||||||
{ set(s); }
|
{ set(s); }
|
||||||
|
|
||||||
TString::TString(const TString& s) : _str(NULL), _size(0)
|
TString::TString(const TString& s) : _str(nullptr), _size(0)
|
||||||
{ set(s); }
|
{ set(s); }
|
||||||
|
|
||||||
TString::TString(int size, char c) : _str(NULL), _size(0)
|
TString::TString(int size, char c) : _str(nullptr), _size(0)
|
||||||
{
|
{
|
||||||
if (size > 0)
|
if (size > 0)
|
||||||
fill(c, size); // Guy: Much simpler and faster (uses memset)
|
fill(c, size); // Guy: Much simpler and faster (uses memset)
|
||||||
|
@ -80,8 +80,10 @@ public:
|
|||||||
virtual TRecnotype new_rec(const char* buf = NULL);
|
virtual TRecnotype new_rec(const char* buf = NULL);
|
||||||
virtual bool set(unsigned int fld, const TVariant& var);
|
virtual bool set(unsigned int fld, const TVariant& var);
|
||||||
virtual bool set(const char* fld, const TVariant& var) { return TText_recordset::set(fld, var); }
|
virtual bool set(const char* fld, const TVariant& var) { return TText_recordset::set(fld, var); }
|
||||||
virtual bool set(const char* fld, const char * s) { const TVariant var(s); return TText_recordset::set(fld, var); }
|
virtual bool set(const char* fld, const char * s) { const TVariant var(s); return TText_recordset::set(fld, var); }
|
||||||
virtual bool set(const char* fld, const TString & s) { const TVariant var(s); return TText_recordset::set(fld, var); }
|
virtual bool set(const char* fld, int i) { const TVariant var((long)i); return TText_recordset::set(fld, var); }
|
||||||
|
virtual bool set(const char* fld, long l) { const TVariant var(l); return TText_recordset::set(fld, var); }
|
||||||
|
virtual bool set(const char* fld, const TString & s) { const TVariant var(s); return TText_recordset::set(fld, var); }
|
||||||
virtual void destroy_column(const int ncol = -1, bool pack = true) { _trc.destroy(ncol, pack); }
|
virtual void destroy_column(const int ncol = -1, bool pack = true) { _trc.destroy(ncol, pack); }
|
||||||
virtual void create_column(const char * name, TFieldtypes type = _alfafld);
|
virtual void create_column(const char * name, TFieldtypes type = _alfafld);
|
||||||
virtual bool load_file(const TFilename& n);
|
virtual bool load_file(const TFilename& n);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user