Patch level : 12.0 nopatch

Files correlati     : ps
Commento:
Modifiche al salvataggio in formato dBase.
This commit is contained in:
Alessandro Bonazzi 2023-01-23 10:38:31 +01:00
parent ef311955ee
commit 0d3ca7deb7
5 changed files with 103 additions and 38 deletions

View File

@ -1699,6 +1699,7 @@ void TReport_select::parse_output(TScanner& scanner)
KEY TReport_select::run() KEY TReport_select::run()
{ {
TFilename path = field().get(); TFilename path = field().get();
if (select_custom_file(path, "rep", _classe)) if (select_custom_file(path, "rep", _classe))
{ {
path = path.name(); path = path.name();
@ -1732,18 +1733,21 @@ bool TReport_select::check(CheckTime ct)
if (repname.blank() && ct == FINAL_CHECK) if (repname.blank() && ct == FINAL_CHECK)
return field().error_box(TR("Il report deve essere specificato")); return field().error_box(TR("Il report deve essere specificato"));
bool found = false; if (_classe.full())
FOR_EACH_ARRAY_ITEM(reps, r, obj)
{ {
TToken_string * row = (TToken_string *)obj; bool found = false;
found = (repname == row->get(0));
if (found)
break;
}
if (!found) FOR_EACH_ARRAY_ITEM(reps, r, obj)
return field().error_box(FR("Il report %s non è compatibile"), (const char *)repname); {
TToken_string * row = (TToken_string *)obj;
found = (repname == row->get(0));
if (found)
break;
}
if (!found)
return field().error_box(FR("Il report %s non è compatibile"), (const char *)repname);
}
} }
} }
if (field().roman()) // Must exist if (field().roman()) // Must exist

View File

@ -18,6 +18,7 @@ class TConfig;
#define DESCDIR "recdesc" #define DESCDIR "recdesc"
// @doc EXTERNAL // @doc EXTERNAL
// @class TDir | Classe per la gestione del file "dir.gen" // @class TDir | Classe per la gestione del file "dir.gen"

View File

@ -1,12 +1,12 @@
BUTTON DLG_PRINT 2 2 BUTTON DLG_PRINT 2 2
BEGIN BEGIN
PROMPT 1 1 "Stampa" PROMPT 1 1 "~Stampa"
PICTURE TOOL_PRINT PICTURE TOOL_PRINT
END END
BUTTON DLG_SETPRINT 2 2 BUTTON DLG_SETPRINT 2 2
BEGIN BEGIN
PROMPT 2 1 "Imposta" PROMPT 2 1 "~Imposta"
PICTURE TOOL_SETPRINT PICTURE TOOL_SETPRINT
END END

View File

@ -335,7 +335,7 @@ bool TProgress_monitor::set_status(long n)
_start = clock(); _start = clock();
// Se è passato un secondo allora crea la progress dialog // Se è passato un secondo allora crea la progress dialog
if (_pd == NULL_WIN && n > 0 && (clock() - _start) >= CLOCKS_PER_SEC) if (_pd == NULL_WIN && n > 0 && (clock() - _start) >= CLOCKS_PER_SEC && !is_batch())
{ {
_pd = xvt_dm_progress_create(_pm_parent, main_app().title(), _total, _cancellable); _pd = xvt_dm_progress_create(_pm_parent, main_app().title(), _total, _cancellable);
if (_txt.full()) if (_txt.full())

View File

@ -391,48 +391,106 @@ bool TRecordset::save_as_dbf(const char* table, int mode)
else else
pisam = new TFast_isamfile(logicnum); pisam = new TFast_isamfile(logicnum);
} }
else
{
const TString & query = query_text();
int pos = query.find("FROM");
TArray records;
if (pos > 0)
{
TToken_string tables(query.mid(pos + 5), ',');
const int len = tables.len();
int stop = 0;
tables.upper();
while (stop < len && ((tables[stop] >= 'A') && (tables[stop] <= 'Z') || tables[stop] == ','))
stop++;
if (stop > 0)
tables.cut(stop);
FOR_EACH_STR_TOKEN(tables, table)
{
int logic = table2logic(table);
if (logic > LF_USER)
records.add(new TTrec(logic));
}
}
TTrec def(LF_EXTERNAL);
TToken_string keydef("", '+');
int keylen = 0;
for (unsigned int j = 0; j < columns(); j++)
{
TRecordset_column_info & c = (TRecordset_column_info &)column_info(j);
const TString& name = c._name;
FOR_EACH_ARRAY_ITEM(records, r, obj)
{
TTrec & rec = (TTrec &)*obj;
const int nfield = rec.field(name);
if (nfield >= 0)
{
TToken_string defstr(rec.fielddef(nfield));
int dec = defstr.get_int(3);
c._type = (TFieldtypes)defstr.get_int(1);
c._width = defstr.get_int(2);
if (c._type == _realfld)
c._width += dec;
def.add_fielddef(c._name, c._type, c._width, dec);
if (keylen + c._width < 80)
{
keydef.add(c._name);
keylen += c._width;
}
}
}
}
def.add_keydef(keydef, true);
pisam = new TExternisamfile(table, def);
}
if (pisam == nullptr) if (pisam == nullptr)
return error_box("Impossibile creare il file %s", table); return error_box("Impossibile creare il file %s", table);
TBaseisamfile& isam = *pisam; TBaseisamfile& isam = *pisam;
TRectype& rec = isam.curr();
TString_array names;
int valid = 0; int valid = 0;
for (unsigned int j = 0; j < columns(); j++)
{
const TVariant& var = get(j);
const TString& name = column_info(j)._name;
if (rec.exist(name))
{
names.add(name);
valid++;
}
else
names.add(EMPTY_STRING);
}
TProgress_monitor pi(items(), TR("Esportazione in corso..."), true); TProgress_monitor pi(items(), TR("Esportazione in corso..."), true);
bool ok = true; bool ok = true;
for (bool go = move_first(); go; go = move_next()) for (bool go = move_first(); go; go = move_next())
{ {
TToken_string recval("", ',');
if (!pi.add_status()) if (!pi.add_status())
break; break;
rec.zero(); isam.zero();
FOR_EACH_ARRAY_ROW(names, j, name) if (name->not_empty()) for (unsigned int j = 0; j < columns(); j++)
rec.put(*name, get(j).as_string()); {
const TString& name = column_info(j)._name;
isam.put(name, get(j).as_string());
recval.add(get(j).as_string());
}
int err = NOERR; int err = NOERR;
bool to_be_written = true; bool to_be_written = true;
// Devo solo aggiornare parte dei campi? // Devo solo aggiornare parte dei campi?
if ((mode & 0x2) && valid < rec.items()) if (mode & 0x2)
{ {
err = isam.read(_isequal, _lock); err = isam.read(_isequal, _lock);
if (err != NOERR) if (err != NOERR)
rec.zero(); isam.zero();
FOR_EACH_ARRAY_ROW(names, j, name) if (name->not_empty()) for (unsigned int j = 0; j < columns(); j++)
rec.put(*name, get(j).as_string()); {
const TString& name = column_info(j)._name;
isam.put(name, get(j).as_string());
}
if (err == NOERR) if (err == NOERR)
to_be_written = isam.rewrite() != NOERR; to_be_written = isam.rewrite() != NOERR;
} }
@ -444,11 +502,10 @@ bool TRecordset::save_as_dbf(const char* table, int mode)
} }
if (err != NOERR) if (err != NOERR)
{ {
ok = error_box(FR("Errore %d durante la scrittura del record %s"), err, rec.build_key()); ok = error_box(FR("Errore %d durante la scrittura del record %s"), err, recval);
break; break;
} }
} }
return ok; return ok;
} }
@ -717,9 +774,11 @@ void TRecordset::parsed_text(TString& sql) const
{ {
TVariant var = get_var(*name); TVariant var = get_var(*name);
int pos = sql.find(*name); int pos = sql.find(*name);
for ( ; pos > 0; pos = sql.find(*name, pos+1)) for ( ; pos > 0; pos = sql.find(*name, pos+1))
{ {
const TString& after = sql.mid(pos+name->len()); const TString& after = sql.mid(pos+name->len());
sql.cut(pos); sql.cut(pos);
if (var.type() == _datefld) if (var.type() == _datefld)
@ -1481,6 +1540,7 @@ TCursor_parser::TCursor_parser(istream& instr, TArray& col)
{ {
TRecordset_column_info* info = (TRecordset_column_info*)obj; TRecordset_column_info* info = (TRecordset_column_info*)obj;
const int arrow = info->_name.find('.'); const int arrow = info->_name.find('.');
if (arrow > 0) if (arrow > 0)
info->_name = info->_name.mid(arrow+1); info->_name = info->_name.mid(arrow+1);
} }