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:
guy 2004-03-08 16:16:28 +00:00
parent 57f31a2df8
commit ac70ddd888
8 changed files with 278 additions and 58 deletions

View File

@ -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;
} }

View File

@ -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[]);

View File

@ -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;
} }

View File

@ -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\"";

View File

@ -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
View 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
View 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
View 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