Patch level : 2.1 nopatch
Files correlati : Ricompilazione Demo : [ ] Commento : Corretti errori di salvataggio query. Ottimizzato il "pagina su" in query molto grandi Iniziato report generator (importa solo le query) git-svn-id: svn://10.65.10.50/trunk@11814 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
57f31a2df8
commit
ac70ddd888
@ -1,14 +1,14 @@
|
|||||||
#include <xvt.h>
|
#include <xvt.h>
|
||||||
|
|
||||||
#include "ba8.h"
|
#include "ba8.h"
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
const int n = argc > 1 ? atoi(argv[1]+1) : 0;
|
const int n = argc > 1 ? (argv[1][1]-'0') : 0;
|
||||||
switch (n)
|
switch (n)
|
||||||
{
|
{
|
||||||
case 1: ba8200(argc, argv); break;
|
case 1: ba8200(argc, argv); break; // Query Generator
|
||||||
default: ba8100(argc, argv); break;
|
case 2: ba8300(argc, argv); break; // Report Generator
|
||||||
|
default: ba8100(argc, argv); break; // Record Selector
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
1
ba/ba8.h
1
ba/ba8.h
@ -1,4 +1,5 @@
|
|||||||
int ba8100(int argc, char* argv[]);
|
int ba8100(int argc, char* argv[]);
|
||||||
int ba8200(int argc, char* argv[]);
|
int ba8200(int argc, char* argv[]);
|
||||||
|
int ba8300(int argc, char* argv[]);
|
||||||
|
|
||||||
|
|
||||||
|
@ -369,7 +369,6 @@ public:
|
|||||||
bool save_if_needed();
|
bool save_if_needed();
|
||||||
bool delete_query();
|
bool delete_query();
|
||||||
|
|
||||||
void get_sql_path(TFilename& path) const;
|
|
||||||
bool get_qry_path(TFilename& path) const;
|
bool get_qry_path(TFilename& path) const;
|
||||||
|
|
||||||
TRelation_node* curr_node();
|
TRelation_node* curr_node();
|
||||||
@ -750,7 +749,7 @@ void TQuery_mask::export(TQueryExportFormat fmt)
|
|||||||
strcpy(fs.type, ext);
|
strcpy(fs.type, ext);
|
||||||
strcpy(fs.name, get(F_CODICE));
|
strcpy(fs.name, get(F_CODICE));
|
||||||
strcpy(fs.creator, "AGA");
|
strcpy(fs.creator, "AGA");
|
||||||
const bool good = xvt_dm_post_file_save(&fs, TR("Esporta")) == FL_OK;
|
const bool good = xvt_dm_post_file_save(&fs, TR("Esportazione")) == FL_OK;
|
||||||
xvt_fsys_restore_dir();
|
xvt_fsys_restore_dir();
|
||||||
|
|
||||||
if (good)
|
if (good)
|
||||||
@ -764,32 +763,24 @@ void TQuery_mask::export(TQueryExportFormat fmt)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TQuery_mask::get_sql_path(TFilename& path) const
|
|
||||||
{
|
|
||||||
path = firm2dir(-1);
|
|
||||||
path.add("sql");
|
|
||||||
if (!path.exist())
|
|
||||||
make_dir(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TQuery_mask::get_qry_path(TFilename& path) const
|
bool TQuery_mask::get_qry_path(TFilename& path) const
|
||||||
{
|
{
|
||||||
const TString& name = get(F_CODICE);
|
const TString& name = get(F_CODICE);
|
||||||
if (name.not_empty())
|
const bool ok = name.not_empty();
|
||||||
|
if (ok)
|
||||||
{
|
{
|
||||||
get_sql_path(path);
|
get_sql_directory(path);
|
||||||
path.add(name);
|
path.add(name);
|
||||||
path.ext("qry");
|
path.ext("qry");
|
||||||
}
|
}
|
||||||
return name.not_empty();
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TQuery_mask::select_query()
|
bool TQuery_mask::select_query()
|
||||||
{
|
{
|
||||||
TEdit_field& fld = efield(F_CODICE);
|
TEdit_field& fld = efield(F_CODICE);
|
||||||
|
|
||||||
TFilename dirname;
|
TFilename dirname; get_sql_directory(dirname);
|
||||||
get_sql_path(dirname);
|
|
||||||
|
|
||||||
xvt_fsys_save_dir();
|
xvt_fsys_save_dir();
|
||||||
|
|
||||||
@ -813,7 +804,6 @@ bool TQuery_mask::select_query()
|
|||||||
return good;
|
return good;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool xml_save_tree_handler(TTree& tree, void* jolly, word flags)
|
static bool xml_save_tree_handler(TTree& tree, void* jolly, word flags)
|
||||||
{
|
{
|
||||||
TXmlItem* rel = (TXmlItem*)jolly;
|
TXmlItem* rel = (TXmlItem*)jolly;
|
||||||
@ -861,9 +851,9 @@ bool TQuery_mask::save_fields_sheet(TXmlItem& xml)
|
|||||||
TXmlItem& field = fields.AddChild("field");
|
TXmlItem& field = fields.AddChild("field");
|
||||||
field.SetAttr("Table", row->get(0));
|
field.SetAttr("Table", row->get(0));
|
||||||
field.SetAttr("Name", row->get(1));
|
field.SetAttr("Name", row->get(1));
|
||||||
field.SetAttr("Hidden", *row->get(2) > ' ');
|
field.SetAttr("Hidden", tok_get_bool(*row,2));
|
||||||
field.SetAttr("Sort", *row->get(3) > ' ');
|
field.SetAttr("Sort", tok_get_bool(*row,3));
|
||||||
field.SetAttr("Group", *row->get(4) > ' ');
|
field.SetAttr("Group", tok_get_bool(*row,4));
|
||||||
const char* str = row->get(5);
|
const char* str = row->get(5);
|
||||||
if (str && *str > ' ')
|
if (str && *str > ' ')
|
||||||
field.SetAttr("Expr", str);
|
field.SetAttr("Expr", str);
|
||||||
@ -997,9 +987,8 @@ bool TQuery_mask::load_query()
|
|||||||
bool ok = path.exist();
|
bool ok = path.exist();
|
||||||
if (ok)
|
if (ok)
|
||||||
{
|
{
|
||||||
ifstream qry(path);
|
|
||||||
TXmlItem xml;
|
TXmlItem xml;
|
||||||
ok = xml.Read(qry);
|
ok = xml.Load(path);
|
||||||
if (ok)
|
if (ok)
|
||||||
{
|
{
|
||||||
_curr_query = path;
|
_curr_query = path;
|
||||||
@ -1224,40 +1213,25 @@ TQuery_mask::TQuery_mask() : TAutomask("ba8200a"), _curr_num(0), _is_dirty(false
|
|||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
// TSql_app
|
// TSQL_query_app
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
class TSql_app : public TSkeleton_application
|
class TSQL_query_app : public TSkeleton_application
|
||||||
{
|
{
|
||||||
TQuery_mask* _msk;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual bool create();
|
|
||||||
virtual void main_loop();
|
virtual void main_loop();
|
||||||
virtual bool destroy();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void TSql_app::main_loop()
|
void TSQL_query_app::main_loop()
|
||||||
{
|
{
|
||||||
_msk->run();
|
TQuery_mask* msk = new TQuery_mask;
|
||||||
|
msk->run();
|
||||||
|
delete msk;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TSql_app::create()
|
|
||||||
{
|
|
||||||
_msk = new TQuery_mask;
|
|
||||||
return TSkeleton_application::create();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TSql_app::destroy()
|
|
||||||
{
|
|
||||||
delete _msk;
|
|
||||||
return TSkeleton_application::destroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int ba8200(int argc, char* argv[])
|
int ba8200(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
TSql_app app;
|
TSQL_query_app app;
|
||||||
app.run(argc, argv, "Query");
|
app.run(argc, argv, TR("Query Generator"));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,18 @@
|
|||||||
|
|
||||||
#include "ba8201.h"
|
#include "ba8201.h"
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
// Utility
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void get_sql_directory(TFilename& name)
|
||||||
|
{
|
||||||
|
name = firm2dir(-1);
|
||||||
|
name.add("sql");
|
||||||
|
if (!name.exist())
|
||||||
|
make_dir(name);
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
// Private interface
|
// Private interface
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
@ -49,13 +61,8 @@ public:
|
|||||||
|
|
||||||
void TSQLite::build_curr_path(TFilename& name) const
|
void TSQLite::build_curr_path(TFilename& name) const
|
||||||
{
|
{
|
||||||
name = firm2dir(-1);
|
TString16 firm; firm.format("%05ldA.sql", prefix().get_codditta());
|
||||||
name.add("sql");
|
get_sql_directory(name);
|
||||||
if (!name.exist())
|
|
||||||
make_dir(name);
|
|
||||||
|
|
||||||
TString16 firm;
|
|
||||||
firm.format("%05ldA.sql", prefix().get_codditta());
|
|
||||||
name.add(firm);
|
name.add(firm);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -386,7 +393,7 @@ TSQLite::~TSQLite()
|
|||||||
void TSQL_query::reset()
|
void TSQL_query::reset()
|
||||||
{
|
{
|
||||||
_firstrow = _items = 0;
|
_firstrow = _items = 0;
|
||||||
_pagesize = 256;
|
_pagesize = 512;
|
||||||
_page.destroy();
|
_page.destroy();
|
||||||
_column.destroy();
|
_column.destroy();
|
||||||
}
|
}
|
||||||
@ -459,6 +466,9 @@ static int query_get_rows(void* jolly, int argc, char** values, char** columns)
|
|||||||
|
|
||||||
const TString_array* TSQL_query::row(TRecnotype n)
|
const TString_array* TSQL_query::row(TRecnotype n)
|
||||||
{
|
{
|
||||||
|
if (n < 0 || n >= items())
|
||||||
|
return NULL;
|
||||||
|
|
||||||
if (n < _firstrow || n >= _firstrow+_page.items())
|
if (n < _firstrow || n >= _firstrow+_page.items())
|
||||||
{
|
{
|
||||||
TString sql = _sql;
|
TString sql = _sql;
|
||||||
@ -469,7 +479,10 @@ const TString_array* TSQL_query::row(TRecnotype n)
|
|||||||
sql.cut(semicolon);
|
sql.cut(semicolon);
|
||||||
sql.trim();
|
sql.trim();
|
||||||
_page.destroy();
|
_page.destroy();
|
||||||
_firstrow = n;
|
if (n >= _pagesize)
|
||||||
|
_firstrow = n-_pagesize/8; // Prendo qualche riga dalla pagina precedente, per velocizzare il pagina su
|
||||||
|
else
|
||||||
|
_firstrow = n;
|
||||||
sql << "\nLIMIT " << _pagesize << " OFFSET " << _firstrow << ';';
|
sql << "\nLIMIT " << _pagesize << " OFFSET " << _firstrow << ';';
|
||||||
}
|
}
|
||||||
_TheDataBase.exec(sql, query_get_rows, &_page);
|
_TheDataBase.exec(sql, query_get_rows, &_page);
|
||||||
@ -589,7 +602,7 @@ bool TSQL_query::save_as_silk(const TFilename& path)
|
|||||||
if (pi.iscancelled())
|
if (pi.iscancelled())
|
||||||
break;
|
break;
|
||||||
const TString_array* arr = row(n);
|
const TString_array* arr = row(n);
|
||||||
const int last = arr != NULL ? arr->last() : 0;
|
const int last = arr->last();
|
||||||
for (int c = 0; c <= last; c++)
|
for (int c = 0; c <= last; c++)
|
||||||
{
|
{
|
||||||
out << "C;Y" << (n+2) << ";X" << (c+1) << ";K\"";
|
out << "C;Y" << (n+2) << ";X" << (c+1) << ";K\"";
|
||||||
|
@ -67,5 +67,11 @@ public:
|
|||||||
TQuery_sheet(TSQL_query& sql);
|
TQuery_sheet(TSQL_query& sql);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
// Utility
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void get_sql_directory(TFilename& path);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
139
ba/ba8300.cpp
Executable file
139
ba/ba8300.cpp
Executable file
@ -0,0 +1,139 @@
|
|||||||
|
#include <xi.h>
|
||||||
|
|
||||||
|
#include <applicat.h>
|
||||||
|
#include <automask.h>
|
||||||
|
#include <execp.h>
|
||||||
|
#include <prefix.h>
|
||||||
|
#include <xml.h>
|
||||||
|
|
||||||
|
#include "ba8201.h"
|
||||||
|
#include "ba8300.h"
|
||||||
|
|
||||||
|
class TReport_mask : public TAutomask
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
virtual void handler(WINDOW win, EVENT* ep);
|
||||||
|
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool select_query();
|
||||||
|
bool select_report();
|
||||||
|
|
||||||
|
public:
|
||||||
|
TReport_mask() : TAutomask("ba8300a") { }
|
||||||
|
};
|
||||||
|
|
||||||
|
bool TReport_mask::select_report()
|
||||||
|
{
|
||||||
|
TEdit_field& fld = efield(F_CODICE);
|
||||||
|
|
||||||
|
TFilename dirname; get_sql_directory(dirname);
|
||||||
|
|
||||||
|
xvt_fsys_save_dir();
|
||||||
|
|
||||||
|
FILE_SPEC fs;
|
||||||
|
xvt_fsys_convert_str_to_dir(dirname, &fs.dir);
|
||||||
|
|
||||||
|
strcpy(fs.type, "rep");
|
||||||
|
strcpy(fs.name, "*");
|
||||||
|
strcpy(fs.creator, "AGA");
|
||||||
|
|
||||||
|
const bool good = xvt_dm_post_file_open(&fs, (char*)fld.prompt()) == FL_OK;
|
||||||
|
|
||||||
|
xvt_fsys_restore_dir();
|
||||||
|
|
||||||
|
if (good)
|
||||||
|
{
|
||||||
|
char name[_MAX_FNAME];
|
||||||
|
xvt_fsys_parse_pathname (fs.name, NULL, NULL, name, NULL, NULL);
|
||||||
|
fld.set(name);
|
||||||
|
}
|
||||||
|
return good;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TReport_mask::select_query()
|
||||||
|
{
|
||||||
|
TFilename path; get_sql_directory(path);
|
||||||
|
|
||||||
|
xvt_fsys_save_dir();
|
||||||
|
|
||||||
|
FILE_SPEC fs;
|
||||||
|
xvt_fsys_convert_str_to_dir(path, &fs.dir);
|
||||||
|
|
||||||
|
strcpy(fs.type, "qry");
|
||||||
|
strcpy(fs.name, "*");
|
||||||
|
strcpy(fs.creator, "AGA");
|
||||||
|
|
||||||
|
bool good = xvt_dm_post_file_open(&fs, "Selezione query") == FL_OK;
|
||||||
|
|
||||||
|
xvt_fsys_restore_dir();
|
||||||
|
|
||||||
|
if (good)
|
||||||
|
{
|
||||||
|
xvt_fsys_convert_dir_to_str(&fs.dir, path.get_buffer(), path.size());
|
||||||
|
path.add(fs.name);
|
||||||
|
TXmlItem item; item.Load(path);
|
||||||
|
const TXmlItem* sql = item.FindFirst("sql");
|
||||||
|
good = sql != NULL;
|
||||||
|
if (good)
|
||||||
|
{
|
||||||
|
TString str; sql->GetEnclosedText(str);
|
||||||
|
set(F_SQL, str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return good;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TReport_mask::handler(WINDOW win, EVENT* ep)
|
||||||
|
{
|
||||||
|
TAutomask::handler(win, ep);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TReport_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||||
|
{
|
||||||
|
switch (o.dlg())
|
||||||
|
{
|
||||||
|
case F_CODICE:
|
||||||
|
if (e == fe_button)
|
||||||
|
select_report();
|
||||||
|
break;
|
||||||
|
case F_NEW_QRY:
|
||||||
|
if (e == fe_button)
|
||||||
|
{
|
||||||
|
TExternal_app q("ba8 -1");
|
||||||
|
q.run();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case F_IMPORT_QRY:
|
||||||
|
if (e == fe_button)
|
||||||
|
select_query();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
// TReporter_app
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class TReporter_app : public TSkeleton_application
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
virtual void main_loop();
|
||||||
|
};
|
||||||
|
|
||||||
|
void TReporter_app::main_loop()
|
||||||
|
{
|
||||||
|
TReport_mask* msk = new TReport_mask;
|
||||||
|
msk->run();
|
||||||
|
delete msk;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ba8300(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
TReporter_app app;
|
||||||
|
app.run(argc, argv, TR("Report Generator"));
|
||||||
|
return 0;
|
||||||
|
}
|
6
ba/ba8300.h
Executable file
6
ba/ba8300.h
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
#define F_CODICE 101
|
||||||
|
#define F_DESCR 102
|
||||||
|
#define F_SQL 103
|
||||||
|
#define F_IMPORT_QRY 104
|
||||||
|
#define F_NEW_QRY 105
|
||||||
|
|
81
ba/ba8300a.uml
Executable file
81
ba/ba8300a.uml
Executable file
@ -0,0 +1,81 @@
|
|||||||
|
#include "ba8300.h"
|
||||||
|
|
||||||
|
TOOLBAR "" 0 -2 0 2
|
||||||
|
|
||||||
|
BUTTON DLG_SAVEREC 10 2
|
||||||
|
BEGIN
|
||||||
|
PROMPT -15 -11 ""
|
||||||
|
PICTURE BMP_SAVEREC
|
||||||
|
PICTURE BMP_SAVERECDN
|
||||||
|
END
|
||||||
|
|
||||||
|
BUTTON DLG_NEWREC 10 2
|
||||||
|
BEGIN
|
||||||
|
PROMPT -25 -11 "~Nuovo"
|
||||||
|
PICTURE BMP_NEWREC
|
||||||
|
PICTURE BMP_NEWRECDN
|
||||||
|
END
|
||||||
|
|
||||||
|
BUTTON DLG_DELREC 10 2
|
||||||
|
BEGIN
|
||||||
|
PROMPT -35 -11 ""
|
||||||
|
PICTURE BMP_DELREC
|
||||||
|
PICTURE BMP_DELRECDN
|
||||||
|
END
|
||||||
|
|
||||||
|
BUTTON DLG_FINDREC 10 2
|
||||||
|
BEGIN
|
||||||
|
PROMPT -45 -11 "Ri~cerca"
|
||||||
|
PICTURE BMP_FINDREC
|
||||||
|
END
|
||||||
|
|
||||||
|
BUTTON DLG_QUIT 10 2
|
||||||
|
BEGIN
|
||||||
|
PROMPT -55 -11 ""
|
||||||
|
END
|
||||||
|
|
||||||
|
ENDPAGE
|
||||||
|
|
||||||
|
PAGE "Report" -1 -1 78 23
|
||||||
|
|
||||||
|
GROUPBOX DLG_NULL 78 3
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 0 "Report"
|
||||||
|
END
|
||||||
|
|
||||||
|
STRING F_CODICE 16
|
||||||
|
BEGIN
|
||||||
|
PROMPT 2 1 "Codice "
|
||||||
|
FLAGS "B"
|
||||||
|
WARNING "E' necessario specificare il codice"
|
||||||
|
CHECKTYPE REQUIRED
|
||||||
|
END
|
||||||
|
|
||||||
|
STRING F_DESCR 50 46
|
||||||
|
BEGIN
|
||||||
|
PROMPT 30 1 ""
|
||||||
|
END
|
||||||
|
|
||||||
|
GROUPBOX DLG_NULL 78 -1
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 3 "Origine dei dati"
|
||||||
|
END
|
||||||
|
|
||||||
|
BUTTON F_NEW_QRY 20 1
|
||||||
|
BEGIN
|
||||||
|
PROMPT 30 3 "Nuova query"
|
||||||
|
END
|
||||||
|
|
||||||
|
BUTTON F_IMPORT_QRY 20 1
|
||||||
|
BEGIN
|
||||||
|
PROMPT 57 3 "Importa query"
|
||||||
|
END
|
||||||
|
|
||||||
|
MEMO F_SQL 76 -2
|
||||||
|
BEGIN
|
||||||
|
PROMPT 2 3 ""
|
||||||
|
END
|
||||||
|
|
||||||
|
ENDPAGE
|
||||||
|
|
||||||
|
ENDMASK
|
Loading…
x
Reference in New Issue
Block a user