Patch level : 2.1 nopatch

Files correlati     : ba1.exe ba8.exe
Ricompilazione Demo : [ ]
Commento            :

ba1*  Allineati a destra i campi numerici dello sheet principale
ba8*  Nuovi miglioramenti alla generazione query (Hidden, Group by e Order by)


git-svn-id: svn://10.65.10.50/trunk@11808 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2004-03-05 08:59:03 +00:00
parent e78b03e4da
commit c633e5ca52
10 changed files with 241 additions and 88 deletions

View File

@ -37,7 +37,7 @@ public:
void add();
void rebuild() { _items = _dir->items();}
TDir_sheet(const char* title,byte buttons=0x8,const char* col = "N.@5|Nome@20|EOD@7|EOX@7|Lung. |Descrizione@43|Formula@33|Flags@7");
TDir_sheet(const char* title,byte buttons=0x8,const char* col = "N.@3R|Nome@20|EOD@R7|EOX@R7|Lung.@R7|Descrizione@43|Formula@33|Flags@R7");
virtual ~TDir_sheet();
};

View File

@ -60,7 +60,7 @@ void TDir_sheet::get_row(long n, TToken_string& l)
{
n++;
_dir->get ((int)n,_nolock,_nordir,_sysdirop);
l.format("%3d", n); // Numero progressivo del file
l.format("%d", n); // Numero progressivo del file
l.add(_dir->name());
l.add(_dir->eod());
l.add(_dir->eox());

View File

@ -164,9 +164,6 @@ void TTest_application::test4()
message_box(msg);
}
void TTest_application::main_loop()
{
test1();

View File

@ -18,14 +18,10 @@
#include "ba1500b.h"
#include "ba1600.h"
#define USERADR 26952
#define AGAADR 26953
#define PRASSIADR 26954
#define K1 0x4500
#define LBYTEMASK 0x00FF
#define UBYTEMASK 0xFF00
///////////////////////////////////////////////////////////
TInformazione_moduli::TInformazione_moduli()

View File

@ -122,8 +122,8 @@ protected:
bool do_process(TToken_string& commands) const;
bool pre_process(TInstall_ini& ini, const char* module) const;
bool post_process(TInstall_ini& ini, const char* module) const;
bool get_internet_path(TFilename& ininame);
void parse_internet_path(TString& http_server, TFilename& http_path);
bool get_internet_path(TFilename& ininame) const;
void parse_internet_path(TString& http_server, TFilename& http_path) const;
public:
bool installed() { return _installed;}
@ -201,10 +201,10 @@ bool TInstaller_mask::has_module(int modnumber) const
if (modnumber == SRAUT)
{
char s[16];
if (CGetCampoStpValue("Servers", s, sizeof(s)))
if (xvt_fsys_get_campo_stp_value("Servers", s, sizeof(s)))
return atoi(s) > 0;
}
return main_app().has_module(modnumber,CHK_DONGLE);
return main_app().has_module(modnumber, CHK_DONGLE);
}
int TInstaller_mask::precheck_modules(bool only_newer)
@ -221,12 +221,11 @@ int TInstaller_mask::precheck_modules(bool only_newer)
currrelease = rigar.get(C_CURRRELEASE);
currpatch = rigar.get_int(C_CURRPATCH);
modnumber=get_module_number(rigar.get(C_CODE));
if (modnumber >= 0 &&
!release.blank() &&
if (modnumber >= 0 && has_module(modnumber) &&
!release.blank() &&
((release > currrelease) ||
(release == currrelease
&& (only_newer ? patchlevel>currpatch: patchlevel>=currpatch) ))
&& has_module(modnumber) )
(release == currrelease && (only_newer ? patchlevel>currpatch: patchlevel>=currpatch) ))
)
{
// checca il modulo o la patch se ho installata la stessa versione
const bool chk = rigar.get_char(C_ISPATCH) != 'X' || release == currrelease;
@ -987,7 +986,7 @@ bool TInstaller_mask::install(const TString& module, int patchlevel)
}
bool TInstaller_mask::get_internet_path(TFilename &ininame )
bool TInstaller_mask::get_internet_path(TFilename &ininame) const
{
ininame = get(F_PATH);
if (is_internet_path(ininame))
@ -999,7 +998,7 @@ bool TInstaller_mask::get_internet_path(TFilename &ininame )
return FALSE;
}
void TInstaller_mask::parse_internet_path(TString & http_server, TFilename &http_path )
void TInstaller_mask::parse_internet_path(TString & http_server, TFilename &http_path) const
{
http_server = get(F_PATH);
if (http_server.compare("http://", 7, TRUE) == 0)
@ -1017,9 +1016,6 @@ void TInstaller_mask::parse_internet_path(TString & http_server, TFilename &http
http_path = http_default_path;
}
bool TInstaller_mask::install_patches(const TString& module, const TString& lastrelease, int lastpatch, bool only_newer)
{
bool ok = TRUE;

View File

@ -348,8 +348,9 @@ protected:
void fill_fields();
void enable_sql_button();
void enable_field_buttons();
void move_curr_field(int dir);
void tree2sql(TString& str);
void tree2sql(TString& from, TString& where);
void sheet2sql();
void edit_query();
@ -360,7 +361,7 @@ protected:
bool save_tables_tree(TXmlItem& xml);
bool save_fields_sheet(TXmlItem& xml);
void export(const char* ext);
void export(TQueryExportFormat fmt);
public:
bool load_query();
@ -597,72 +598,111 @@ void TQuery_mask::enable_field_buttons()
enable(F_ASTERISK, ok);
}
void TQuery_mask::move_curr_field(int dir)
{
TSheet_field& s = sfield(F_SHEET);
const int sel = s.selected();
if (sel >= 0 && sel < s.items())
{
const int des = sel+dir;
if (des >= 0 && des < s.items())
{
s.rows_array().swap(sel, des);
s.select(des);
s.force_update();
}
}
}
static bool sql_tree_handler(TTree& tree, void* jolly, word flags)
{
TRelation_node* rn = (TRelation_node*)tree.curr_node();
TString& sql = *(TString*)jolly;
TPointer_array& arr = *(TPointer_array*)jolly;
TString& from = *(TString*)arr.objptr(0);
TString& where = *(TString*)arr.objptr(1);
TString_array& join = rn->join();
TString str;
FOR_EACH_ARRAY_ROW(join, i, row)
if (from.find(rn->id()) < 0)
{
if (sql.find(*row) < 0)
if (from.not_empty())
from << ',';
from << rn->id();
FOR_EACH_ARRAY_ROW(join, i, row)
{
if (sql.empty())
sql << "WHERE ";
else
sql << "AND";
sql << '(' << rn->id() << '.' << row->get(0) << '=';
str = row->get();
if (isalpha(str[0]))
sql << rn->father()->id() << '.';
sql << str << ')';
if (where.find(*row) < 0)
{
if (where.not_empty())
where << "AND";
where << '(' << rn->id() << '.' << row->get(0) << '=';
str = row->get();
if (isalpha(str[0]))
where << rn->father()->id() << '.';
where << str << ')';
}
}
}
return false; // Don't stop search
}
// Riempie una stringa SQL con la relazione tra le tabelle
void TQuery_mask::tree2sql(TString& str)
void TQuery_mask::tree2sql(TString& from, TString& where)
{
if (_tree.goto_root())
_tree.scan_depth_first(sql_tree_handler, &str);
{
TPointer_array a;
a.add(&from);
a.add(&where);
_tree.scan_depth_first(sql_tree_handler, &a);
}
}
// Genera una query SQL a partire dallo spreadsheet F_SHEET
void TQuery_mask::sheet2sql()
{
const TSheet_field& sheet = sfield(F_SHEET);
TAssoc_array tables;
TToken_string select(50, ','), from(50, ',');
TToken_string select(50, ',');
_tree.goto_root();
const bool multiple = _tree.has_son();
TToken_string from(50, ','), groupby(50, ','), orderby(50, ',');
TString where;
TString field;
FOR_EACH_SHEET_ROW(sheet, i, row)
{
const TString8 table = row->get(0);
const TString16 field = row->get();
if (!table.blank() && !field.blank())
field = row->get(1);
const bool hidden = *row->get(2) > ' ';
if (!field.blank() && !hidden)
{
if (!tables.is_key(table))
if (multiple)
{
tables.add(table);
from.add(table);
field.insert(".");
field.insert(row->get(0)); // Table name
}
select.add(table);
select << '.' << field;
select.add(field); // Column name only
if (*row->get(3) > ' ')
orderby.add(field);
if (*row->get(4) > ' ')
groupby.add(field);
}
}
if (tables.items() == 1)
{
select.cut(0);
FOR_EACH_SHEET_ROW(sheet, i, row)
select.add(row->get(1));
}
tree2sql(from, where);
TString sql;
sql << "SELECT " << select << '\n';
sql << "FROM " << from << '\n';
TString where; tree2sql(where);
sql << where << ";";
sql << "WHERE " << where << '\n';
if (groupby.not_empty())
sql << "GROUP BY " << groupby << '\n';
if (orderby.not_empty())
sql << "ORDER BY " << orderby << '\n';
sql << ";";
set(F_SQL, sql);
}
@ -680,15 +720,28 @@ static int select_callback(void* jolly, int argc, char** value, char** field)
void TQuery_mask::edit_query()
{
TSQL_query qry(get(F_SQL));
TQuery_sheet sht(qry);
sht.run();
if (qry.columns() > 0)
{
TQuery_sheet sht(qry);
sht.run();
}
else
warning_box(TR("Nessuna riga risultato"));
}
void TQuery_mask::export(const char* ext)
void TQuery_mask::export(TQueryExportFormat fmt)
{
xvt_fsys_save_dir();
TFilename path; path.tempdir();
const char* ext = "txt";
switch (fmt)
{
case fmt_html: ext = "html"; break;
case fmt_slk : ext = "xls"; break;
default: break;
}
FILE_SPEC fs;
xvt_fsys_convert_str_to_dir(path, &fs.dir);
strcpy(fs.type, ext);
@ -703,7 +756,7 @@ void TQuery_mask::export(const char* ext)
path.add(fs.name);
TSQL_query qry(get(F_SQL));
if (qry.save_as(path))
if (qry.save_as(path, fmt))
xvt_sys_goto_url(path, "open");
}
}
@ -804,8 +857,11 @@ bool TQuery_mask::save_fields_sheet(TXmlItem& xml)
{
TXmlItem& field = fields.AddChild("field");
field.SetAttr("Table", row->get(0));
field.SetAttr("Name", row->get());
const char* str = row->get();
field.SetAttr("Name", row->get(1));
field.SetAttr("Hidden", *row->get(2) > ' ');
field.SetAttr("Sort", *row->get(3) > ' ');
field.SetAttr("Group", *row->get(4) > ' ');
const char* str = row->get(5);
if (str && *str > ' ')
field.SetAttr("Expr", str);
}
@ -907,9 +963,12 @@ bool TQuery_mask::load_fields_sheet(TXmlItem& xml)
{
const TXmlItem& field = *fields->GetChild(i);
TToken_string& row = sheet.row(-1);
row.add(field.GetAttr("Table"));
row.add(field.GetAttr("Name"));
row.add(field.GetAttr("Expr"));
row.add(field.GetAttr("Table"),0);
row.add(field.GetAttr("Name"),1);
row.add(field.GetBoolAttr("Hidden") ? "X" : "",2);
row.add(field.GetBoolAttr("Sort") ? "X" : "",3);
row.add(field.GetBoolAttr("Group") ? "X" : "",4);
row.add(field.GetAttr("Expr"),5);
}
sheet.force_update();
}
@ -1037,21 +1096,37 @@ bool TQuery_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
if (e == fe_button)
edit_query();
break;
case F_SQL:
if (e == fe_modify)
_is_dirty = true;
break;
case F_EXPORT_HTML:
if (e == fe_button)
export("html");
export(fmt_html);
break;
case F_EXPORT_EXCEL:
if (e == fe_button)
export("xls");
export(fmt_slk);
break;
case F_EXPORT_TXT:
if (e == fe_button)
export("txt");
export(fmt_txt);
break;
case F_EXPORT_CAMPO:
if (e == fe_button)
export(fmt_campo);
break;
case F_SHEET:
enable_sql_button();
break;
case F_MOVEUP:
if (e == fe_button)
move_curr_field(-1);
break;
case F_MOVEDN:
if (e == fe_button)
move_curr_field(+1);
break;
case DLG_NEWREC:
if (e == fe_button)
{
@ -1073,6 +1148,9 @@ bool TQuery_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
return false; // Do not exit!
}
break;
case DLG_QUIT:
save_if_needed();
break;
default:
break;
}

View File

@ -3,7 +3,6 @@
#define F_SQL 152
#define F_TABLES 200
#define F_FIELDS 300
#define F_SHEET 400
#define F_ADDFILE 301
#define F_EDITFILE 302
#define F_ASTERISK 303
@ -12,6 +11,10 @@
#define F_EXPORT_HTML 306
#define F_EXPORT_EXCEL 307
#define F_EXPORT_TXT 308
#define F_EXPORT_CAMPO 309
#define F_SHEET 400
#define F_MOVEUP 401
#define F_MOVEDN 402
#define F_FATHER 201
#define F_FATHER_ALIAS 202

View File

@ -56,7 +56,7 @@ BEGIN
PROMPT 1 1 ""
END
SPREADSHEET F_FIELDS 30 10
SPREADSHEET F_FIELDS 40 10
BEGIN
PROMPT 34 1 ""
ITEM "Nome@12F"
@ -68,38 +68,53 @@ END
BUTTON F_ADDFILE 10 2
BEGIN
PROMPT -16 11 "~Tabella"
PROMPT -15 11 "~Tabella"
END
BUTTON F_EDITFILE 10 2
BEGIN
PROMPT -26 11 "~Edit"
PROMPT -25 11 "~Edit"
PICTURE BMP_EDIT
END
BUTTON DLG_USER 10 2
BEGIN
PROMPT -46 11 "~Campo"
PROMPT -35 11 "~Campo"
END
BUTTON F_ASTERISK 10 2
BEGIN
PROMPT -56 11 "Campo ~*"
PROMPT -45 11 "Campo ~*"
END
BUTTON F_GENSQL 10 2
BEGIN
PROMPT -66 11 "~SQL"
PROMPT -55 11 "~SQL"
END
SPREADSHEET F_SHEET
SPREADSHEET F_SHEET -5
BEGIN
PROMPT 0 13 ""
ITEM "Tabella@12F"
ITEM "Colonna@32F"
ITEM "Nas.@3"
ITEM "Ord.@3"
ITEM "Grp.@3"
ITEM "Condizione@50"
END
BUTTON F_MOVEUP 2 2
BEGIN
PROMPT -1 15 "Up"
PICTURE 1662
END
BUTTON F_MOVEDN 2 2
BEGIN
PROMPT -1 18 "Dn"
PICTURE 1663
END
ENDPAGE
PAGE "Sql" -1 -1 78 23
@ -130,6 +145,12 @@ BEGIN
PROMPT -45 -1 "~Testo+Tab"
END
BUTTON F_EXPORT_CAMPO 10 2
BEGIN
PROMPT -55 -1 "~Scarica"
END
ENDPAGE
ENDMASK
@ -180,19 +201,34 @@ PAGE "CampiQuery" -1 -1 60 13
STRING 101 12
BEGIN
PROMPT 1 1 "Tabella "
PROMPT 1 0 "Tabella "
CHECKTYPE REQUIRED
END
STRING 102 32
STRING 102 50
BEGIN
PROMPT 31 1 "Colonna "
PROMPT 1 1 "Colonna "
CHECKTYPE REQUIRED
END
MEMO 103 54 8
BOOELAN 103
BEGIN
PROMPT 1 2 "Condizione "
PROMPT 1 2 "Nascosto"
END
BOOELAN 104
BEGIN
PROMPT 18 2 "Ordina"
END
BOOELAN 105
BEGIN
PROMPT 35 2 "Raggruppa"
END
MEMO 106 58 8
BEGIN
PROMPT 1 3 "Condizione "
END
BUTTON DLG_CANCEL 10 2

View File

@ -619,13 +619,58 @@ bool TSQL_query::save_as_text(const TFilename& path)
const int last = arr != NULL ? arr->last() : 0;
for (int c = 0; c <= last; c++)
{
if (c > 0)
out << '\t';
TString* val = (TString*)arr->objptr(c);
if (val && !val->blank())
{
val->rtrim();
out << *val;
}
}
out << endl;
pi.addstatus(1);
if (pi.iscancelled())
break;
}
return !pi.iscancelled();
}
bool TSQL_query::save_as_campo(const TFilename& path)
{
TProgind pi(items(), TR("Esportazione in corso..."), true, true);
ofstream out(path);
out << "[Head]" << endl;
out << "Version=0";
for (unsigned int c = 0; c < columns(); c++)
{
const TSQL_column_info& ci = column_info(c);
if ((c % 8) == 0)
out << endl << "Fields=";
else
out << '|';
out << ci._name;
}
out << endl << endl << "[Data]" << endl;
for (TRecnotype n = 0; n < items(); n++)
{
const TString_array* arr = row(n);
const int last = arr != NULL ? arr->last() : 0;
for (int c = 0; c <= last; c++)
{
if (c > 0)
out << '|';
TString* val = (TString*)arr->objptr(c);
if (val && !val->blank())
{
val->rtrim();
out << *val;
}
out << '\t';
}
out << endl;
pi.addstatus(1);
@ -652,9 +697,10 @@ bool TSQL_query::save_as(const char* fn, TQueryExportFormat fmt)
bool ok = fmt != fmt_unknown;
switch (fmt)
{
case fmt_html: ok = save_as_html(path); break;
case fmt_slk: ok = save_as_silk(path); break;
case fmt_txt: ok = save_as_text(path); break;
case fmt_html : ok = save_as_html(path); break;
case fmt_slk : ok = save_as_silk(path); break;
case fmt_txt : ok = save_as_text(path); break;
case fmt_campo: ok = save_as_campo(path); break;
default: break;
}
return ok;

View File

@ -16,7 +16,7 @@ struct TSQL_column_info : public TObject
bool _numeric;
};
enum TQueryExportFormat { fmt_unknown, fmt_html, fmt_txt, fmt_slk };
enum TQueryExportFormat { fmt_unknown, fmt_html, fmt_txt, fmt_slk, fmt_campo };
class TSQL_query : public TObject
{
@ -31,6 +31,7 @@ protected:
bool save_as_html(const TFilename& path);
bool save_as_silk(const TFilename& path);
bool save_as_text(const TFilename& path);
bool save_as_campo(const TFilename& path);
public:
void set(const char* sql);