Patch level :2.0 nopatch
Files correlati :dl0.exe Ricompilazione Demo : [ ] Commento :velocizzata la ricerca articoli (sia in ricerca semplice che avanzata); corretta la gestione del campo etichetta nell'importazione dati da discolatio git-svn-id: svn://10.65.10.50/trunk@11064 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
c92db223cd
commit
cfb6cc5441
172
dl/dl0500.cpp
172
dl/dl0500.cpp
@ -87,28 +87,48 @@ bool TRicerca_mask::on_field_event(TOperable_field& o, TField_event e, long joll
|
|||||||
}
|
}
|
||||||
|
|
||||||
//-------SKELETON APPLICATION------------------------------------------------------------------------------//
|
//-------SKELETON APPLICATION------------------------------------------------------------------------------//
|
||||||
|
|
||||||
|
enum TFilter_type { dl_normal, dl_date, dl_um };
|
||||||
|
enum TFilter_comp { dl_eq, dl_gt, dl_lt, dl_match };
|
||||||
|
|
||||||
|
struct TFilter_exp : public TObject
|
||||||
|
{
|
||||||
|
TFilter_type _type;
|
||||||
|
TString16 _field;
|
||||||
|
TFilter_comp _cmp;
|
||||||
|
TString80 _value;
|
||||||
|
|
||||||
|
TFilter_exp() : _type(dl_normal), _cmp(dl_eq) { }
|
||||||
|
};
|
||||||
|
|
||||||
class TRicerca: public TSkeleton_application
|
class TRicerca: public TSkeleton_application
|
||||||
{
|
{
|
||||||
TRicerca_mask * _mask;
|
TRicerca_mask * _mask;
|
||||||
static TMask * _ordmask;
|
static TMask * _ordmask;
|
||||||
bool _barcode, _giac, _titolo, _artista, _compositore, _prezzo, _genere, _tiposupp;
|
bool _barcode, _giac, _titolo, _artista, _compositore, _prezzo, _genere, _tiposupp;
|
||||||
|
|
||||||
|
static TArray _filtro;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool create(void);
|
virtual bool create(void);
|
||||||
virtual bool destroy(void);
|
virtual bool destroy(void);
|
||||||
virtual void main_loop();
|
virtual void main_loop();
|
||||||
|
|
||||||
static void process_link(int id, const char * lnk);
|
static void process_link(int id, const char * lnk);
|
||||||
static void genera_ordine();
|
static void genera_ordine();
|
||||||
|
static bool fast_filter(const TRelation* rel);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void add_expr_filter(TString& filtro, const char * field, short id, const char * cmp) const;
|
void add_expr_filter(const char * field, short id, TFilter_comp cmp) const;
|
||||||
void add_meta_filter(TString& filtro, const char * field, short id) const;
|
void add_meta_filter(const char * field, short id) const;
|
||||||
void add_range_filter(TString& filtro, const char * field, short fid, short tid = -1) const;
|
void add_range_filter(const char * field, short fid, short tid = -1) const;
|
||||||
|
|
||||||
TRicerca() {}
|
TRicerca() {}
|
||||||
virtual ~TRicerca() {}
|
virtual ~TRicerca() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
TArray TRicerca::_filtro;
|
||||||
|
|
||||||
// restituisce un riferimento all' applicazione
|
// restituisce un riferimento all' applicazione
|
||||||
inline TRicerca& app() { return (TRicerca&) main_app();}
|
inline TRicerca& app() { return (TRicerca&) main_app();}
|
||||||
|
|
||||||
@ -164,45 +184,52 @@ bool TRicerca::destroy()
|
|||||||
return TSkeleton_application::destroy();
|
return TSkeleton_application::destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
//aggiunge effettivamente una espressione ad un filtro
|
//aggiunge effettivamente un'espressione ad un filtro
|
||||||
void TRicerca::add_expr_filter(TString& filtro, const char * field, short id, const char * cmp) const
|
void TRicerca::add_expr_filter(const char * field, short id, TFilter_comp cmp) const
|
||||||
{
|
{
|
||||||
TMask_field& fld = _mask->field(id); //prende il campo dalla maschera
|
TMask_field& fld = _mask->field(id); //prende il campo dalla maschera
|
||||||
if (!fld.empty()) //..se non e' vuoto
|
if (!fld.empty()) //..se non e' vuoto
|
||||||
{
|
{
|
||||||
if (filtro.not_empty()) //distinzione tra filtro vuoto e filtro esistente
|
TFilter_exp* fe = new TFilter_exp;
|
||||||
filtro << "&&";
|
fe->_field = field;
|
||||||
if (fld.class_id() == CLASS_DATE_FIELD) //se e' un campo data deve ANSIzzare il contenuto del campo per aggiungerlo al filtro
|
fe->_cmp = cmp;
|
||||||
|
//se e' un campo data deve ANSIzzare il contenuto del campo per aggiungerlo al filtro
|
||||||
|
if (fld.class_id() == CLASS_DATE_FIELD)
|
||||||
{
|
{
|
||||||
const TDate data = fld.get();
|
fe->_type = dl_date;
|
||||||
TString8 val = data.string(ANSI);
|
const TDate date = fld.get();
|
||||||
filtro << "(ANSI(" << field << ")" << cmp << val << ")";
|
fe->_value = date.string(ANSI);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
filtro << "(" << field << cmp << "\"" << fld.get() << "\")"; //aggiunge il contenuto del campo al filtro
|
{
|
||||||
|
if (stricmp(field, "UM") == 0)
|
||||||
|
fe->_type = dl_um;
|
||||||
|
fe->_value = fld.get(); //aggiunge il contenuto del campo al filtro
|
||||||
|
}
|
||||||
|
_filtro.add(fe);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//aggiunge ad un filtro una espressione con l'*
|
//aggiunge ad un filtro una espressione con l'*
|
||||||
void TRicerca::add_meta_filter(TString& filtro, const char * field, short id) const
|
void TRicerca::add_meta_filter(const char * field, short id) const
|
||||||
{
|
{
|
||||||
const TString& value = _mask->get(id);
|
const TString& value = _mask->get(id);
|
||||||
const char* cmp = "==";
|
TFilter_comp cmp = dl_eq;
|
||||||
if (value.find('*') >= 0 || value.find('?') >= 0)
|
if (value.find('*') >= 0 || value.find('?') >= 0)
|
||||||
cmp = "?=";
|
cmp = dl_match;
|
||||||
add_expr_filter(filtro, field, id, cmp);
|
add_expr_filter(field, id, cmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
//aggiunge ad un filtro un range di valori presi due campi o da uno (se coincidenti)
|
//aggiunge ad un filtro un range di valori presi due campi o da uno (se coincidenti)
|
||||||
void TRicerca::add_range_filter(TString& filtro, const char * field, short fid, short tid) const
|
void TRicerca::add_range_filter(const char * field, short fid, short tid) const
|
||||||
{
|
{
|
||||||
if (tid > fid)
|
if (tid > fid)
|
||||||
{
|
{
|
||||||
add_expr_filter(filtro, field, fid, ">=");
|
add_expr_filter(field, fid, dl_gt);
|
||||||
add_expr_filter(filtro, field, tid, "<=");
|
add_expr_filter(field, tid, dl_lt);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
add_expr_filter(filtro, field, fid, "==");
|
add_expr_filter(field, fid, dl_eq);
|
||||||
}
|
}
|
||||||
|
|
||||||
//metodo ascetico per generare le righe di uno sheet dalla setlinkhandler (vedi la chiamata + sotto)
|
//metodo ascetico per generare le righe di uno sheet dalla setlinkhandler (vedi la chiamata + sotto)
|
||||||
@ -269,19 +296,6 @@ void TRicerca::genera_ordine()
|
|||||||
const TRectype test(doc.curr()); //come record di confronto si prende quello corrente
|
const TRectype test(doc.curr()); //come record di confronto si prende quello corrente
|
||||||
doc.put(DOC_NDOC, "9999999");
|
doc.put(DOC_NDOC, "9999999");
|
||||||
|
|
||||||
/* long ndoc = 1; //metodo per autonumerare il documento (ultimo +1); tolto x' la DL setta a TRUE il flag di..
|
|
||||||
int err = doc.read(_isgreat); //..autonumerazione nelle vendite
|
|
||||||
if (err == NOERR)
|
|
||||||
err = doc.prev();
|
|
||||||
else
|
|
||||||
err = doc.last();
|
|
||||||
if (err == NOERR)
|
|
||||||
{
|
|
||||||
if (doc.curr().compare_key(test,1,1)==0) //confronta la chiave del record appena trovato con quella del
|
|
||||||
ndoc+=doc.get_long(DOC_NDOC); //record campione (test), a meno dell'ultimo campo NDOC
|
|
||||||
}
|
|
||||||
ini.set(DOC_NDOC, ndoc); */ //trovato il primo numero libero documento libero lo scrive nell'ini
|
|
||||||
|
|
||||||
//paragrafi delle righe dell'ordine
|
//paragrafi delle righe dell'ordine
|
||||||
TSheet_field& sheet = _ordmask->sfield(F_RIGHE);
|
TSheet_field& sheet = _ordmask->sfield(F_RIGHE);
|
||||||
TString80 codart;
|
TString80 codart;
|
||||||
@ -309,16 +323,50 @@ void TRicerca::genera_ordine()
|
|||||||
::remove(iniord); //sopprime il file temporaneo
|
::remove(iniord); //sopprime il file temporaneo
|
||||||
}
|
}
|
||||||
|
|
||||||
static TString16 fast_field;
|
bool TRicerca::fast_filter(const TRelation* rel)
|
||||||
static TString80 fast_value;
|
|
||||||
static bool meta_type;
|
|
||||||
|
|
||||||
static bool fast_filter(const TRelation* rel)
|
|
||||||
{
|
{
|
||||||
const TRectype& rec = rel->curr();
|
for (int i = 0; i < _filtro.items(); i++)
|
||||||
if (meta_type)
|
{
|
||||||
return rec.get(fast_field).match(fast_value);
|
const TFilter_exp& fe = (const TFilter_exp&)_filtro[i];
|
||||||
return rec.get(fast_field) == fast_value;
|
TString80 field_value;
|
||||||
|
switch (fe._type)
|
||||||
|
{
|
||||||
|
case dl_date:
|
||||||
|
{
|
||||||
|
const TDate d = rel->curr().get(fe._field);
|
||||||
|
field_value = d.string(ANSI);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case dl_um:
|
||||||
|
{
|
||||||
|
TString80 key = rel->curr().get(ANAMAG_CODART);
|
||||||
|
key << "|1";
|
||||||
|
field_value = cache().get(LF_UMART, key, fe._field);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
field_value = rel->curr().get(fe._field);
|
||||||
|
}
|
||||||
|
switch (fe._cmp)
|
||||||
|
{
|
||||||
|
case dl_lt:
|
||||||
|
if (field_value > fe._value)
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
|
case dl_gt:
|
||||||
|
if (field_value < fe._value)
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
|
case dl_match:
|
||||||
|
if (!field_value.match(fe._value))
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (field_value != fe._value)
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TRicerca::main_loop()
|
void TRicerca::main_loop()
|
||||||
@ -334,6 +382,7 @@ void TRicerca::main_loop()
|
|||||||
_prezzo = _mask->get_bool(F_P_PREZZO);
|
_prezzo = _mask->get_bool(F_P_PREZZO);
|
||||||
_genere = _mask->get_bool(F_P_GENERE);
|
_genere = _mask->get_bool(F_P_GENERE);
|
||||||
_tiposupp = _mask->get_bool(F_P_TIPOSUPPORTO);
|
_tiposupp = _mask->get_bool(F_P_TIPOSUPPORTO);
|
||||||
|
|
||||||
//..e li scrive nel file ini
|
//..e li scrive nel file ini
|
||||||
TConfig config("discolat.ini","ADVRES");
|
TConfig config("discolat.ini","ADVRES");
|
||||||
config.set("BARCODE", _barcode);
|
config.set("BARCODE", _barcode);
|
||||||
@ -345,23 +394,19 @@ void TRicerca::main_loop()
|
|||||||
config.set("GENERE", _genere);
|
config.set("GENERE", _genere);
|
||||||
config.set("TIPOSUPP", _tiposupp);
|
config.set("TIPOSUPP", _tiposupp);
|
||||||
|
|
||||||
TString16 nomecampo;
|
|
||||||
//laboriosissima costruzione del filtro
|
//laboriosissima costruzione del filtro
|
||||||
TString filtro;
|
_filtro.destroy();
|
||||||
|
add_range_filter(ANAMAG_CODART, F_DABARCODE, F_ABARCODE);
|
||||||
|
add_meta_filter(ANAMAG_USER2, F_ARTISTA);
|
||||||
|
add_meta_filter(ANAMAG_DESCR, F_TITOLO);
|
||||||
|
add_meta_filter(ANAMAG_USER3, F_COMPOSITORE);
|
||||||
|
add_meta_filter(ANAMAG_USER4, F_ETICHETTA);
|
||||||
|
|
||||||
add_range_filter(filtro, ANAMAG_CODART, F_DABARCODE, F_ABARCODE);
|
add_range_filter(ANAMAG_GRMERC, F_GENEREMUSICALE);
|
||||||
|
add_range_filter(ANAMAG_USER5, F_DATAE_INI, F_DATAE_FIN);
|
||||||
add_meta_filter(filtro, ANAMAG_DESCR, F_TITOLO);
|
add_range_filter(ANAMAG_USER6, F_DATAV_INI, F_DATAV_FIN);
|
||||||
add_meta_filter(filtro, ANAMAG_USER2, F_ARTISTA);
|
|
||||||
add_meta_filter(filtro, ANAMAG_USER3, F_COMPOSITORE);
|
|
||||||
add_meta_filter(filtro, ANAMAG_USER4, F_ETICHETTA);
|
|
||||||
|
|
||||||
add_range_filter(filtro, ANAMAG_GRMERC, F_GENEREMUSICALE);
|
|
||||||
add_range_filter(filtro, ANAMAG_USER5, F_DATAE_INI, F_DATAE_FIN);
|
|
||||||
add_range_filter(filtro, ANAMAG_USER6, F_DATAV_INI, F_DATAV_FIN);
|
|
||||||
//caso sfigato: c'e' il tipo supporto tra i parametri di filtro!
|
//caso sfigato: c'e' il tipo supporto tra i parametri di filtro!
|
||||||
nomecampo.format("%d->%s", LF_UMART, "UM");
|
add_range_filter("UM", F_TIPOSUPPORTO);
|
||||||
add_range_filter(filtro, nomecampo, F_TIPOSUPPORTO);
|
|
||||||
|
|
||||||
// setta i links presenti nel form (sono gli elementi scritti in blu(b) su bianco(w))
|
// setta i links presenti nel form (sono gli elementi scritti in blu(b) su bianco(w))
|
||||||
// procedimento standard in questi casi
|
// procedimento standard in questi casi
|
||||||
@ -370,24 +415,11 @@ void TRicerca::main_loop()
|
|||||||
arr.add(new TToken_string("Ordina|b|w"));
|
arr.add(new TToken_string("Ordina|b|w"));
|
||||||
printer().setlinkhandler(process_link);
|
printer().setlinkhandler(process_link);
|
||||||
|
|
||||||
|
|
||||||
//dopo il filtrone tocca al cursore x scandire i records
|
//dopo il filtrone tocca al cursore x scandire i records
|
||||||
TRicerca_form form;
|
TRicerca_form form;
|
||||||
//ottimizzazione tempi di ricerca: caso di filtro semplice (senza AND, con ?= o ==)
|
//ottimizzazione tempi di ricerca: caso di filtro semplice (senza AND, con ?= o ==)
|
||||||
|
|
||||||
if (filtro.find("&&") < 0 && filtro.find('=') > 0)
|
form.cursor()->set_filterfunction(fast_filter, FALSE);
|
||||||
{
|
|
||||||
filtro.strip("()");
|
|
||||||
meta_type = filtro.find("?=") > 0;
|
|
||||||
const int pos = filtro.rfind('=');
|
|
||||||
fast_value = filtro.mid(pos+1);
|
|
||||||
fast_value.strip("\"");
|
|
||||||
fast_field = filtro.left(pos-1);
|
|
||||||
|
|
||||||
form.cursor()->set_filterfunction(fast_filter, !_mask->field(F_TIPOSUPPORTO).empty());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
form.cursor()->setfilter(filtro, !_mask->field(F_TIPOSUPPORTO).empty());
|
|
||||||
|
|
||||||
//setta il form columnwise
|
//setta il form columnwise
|
||||||
form.find_field('B', odd_page, FF_B_CODART).show(_barcode);
|
form.find_field('B', odd_page, FF_B_CODART).show(_barcode);
|
||||||
|
157
dl/dl0600.cpp
157
dl/dl0600.cpp
@ -181,11 +181,27 @@ bool TIntmag_mask::on_field_event(TOperable_field& o, TField_event e, long jolly
|
|||||||
}
|
}
|
||||||
|
|
||||||
//-------SKELETON APPLICATION------------------------------------------------------------------------------//
|
//-------SKELETON APPLICATION------------------------------------------------------------------------------//
|
||||||
|
|
||||||
|
enum TFilter_type { dl_normal, dl_date, dl_um };
|
||||||
|
enum TFilter_comp { dl_eq, dl_gt, dl_lt, dl_match };
|
||||||
|
|
||||||
|
struct TFilter_exp : public TObject
|
||||||
|
{
|
||||||
|
TFilter_type _type;
|
||||||
|
TString16 _field;
|
||||||
|
TFilter_comp _cmp;
|
||||||
|
TString80 _value;
|
||||||
|
|
||||||
|
TFilter_exp() : _type(dl_normal), _cmp(dl_eq) { }
|
||||||
|
};
|
||||||
|
|
||||||
class TIntmag: public TSkeleton_application
|
class TIntmag: public TSkeleton_application
|
||||||
{
|
{
|
||||||
TIntmag_mask * _mask;
|
TIntmag_mask * _mask;
|
||||||
TIntmag_form * _form;
|
TIntmag_form * _form;
|
||||||
|
|
||||||
|
static TArray _filtro;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool create(void);
|
virtual bool create(void);
|
||||||
virtual bool destroy(void);
|
virtual bool destroy(void);
|
||||||
@ -195,15 +211,19 @@ protected:
|
|||||||
void print_footer();
|
void print_footer();
|
||||||
void print_line(const TString& r, const long j);
|
void print_line(const TString& r, const long j);
|
||||||
|
|
||||||
|
static bool fast_filter(const TRelation* rel);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void add_expr_filter(TString& filtro, const char * field, short id, const char * cmp) const;
|
void add_expr_filter(const char * field, short id, TFilter_comp cmp) const;
|
||||||
void add_meta_filter(TString& filtro, const char * field, short id) const;
|
void add_meta_filter(const char * field, short id) const;
|
||||||
void add_range_filter(TString& filtro, const char * field, short fid, short tid = -1) const;
|
void add_range_filter(const char * field, short fid, short tid = -1) const;
|
||||||
|
|
||||||
TIntmag() {}
|
TIntmag() {}
|
||||||
virtual ~TIntmag() {}
|
virtual ~TIntmag() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
TArray TIntmag::_filtro;
|
||||||
|
|
||||||
// restituisce un riferimento all' applicazione
|
// restituisce un riferimento all' applicazione
|
||||||
inline TIntmag& app() { return (TIntmag&) main_app();}
|
inline TIntmag& app() { return (TIntmag&) main_app();}
|
||||||
|
|
||||||
@ -226,97 +246,120 @@ bool TIntmag::destroy()
|
|||||||
}
|
}
|
||||||
|
|
||||||
//aggiunge effettivamente una espressione ad un filtro
|
//aggiunge effettivamente una espressione ad un filtro
|
||||||
void TIntmag::add_expr_filter(TString& filtro, const char * field, short id, const char * cmp) const
|
void TIntmag::add_expr_filter(const char * field, short id, TFilter_comp cmp) const
|
||||||
{
|
{
|
||||||
TMask_field& fld = _mask->field(id); //prende il campo dalla maschera
|
TMask_field& fld = _mask->field(id); //prende il campo dalla maschera
|
||||||
if (!fld.empty()) //..se non e' vuoto
|
if (!fld.empty()) //..se non e' vuoto
|
||||||
{
|
{
|
||||||
if (filtro.not_empty()) //distinzione tra filtro vuoto e filtro esistente
|
TFilter_exp* fe = new TFilter_exp;
|
||||||
filtro << "&&";
|
fe->_field = field;
|
||||||
if (fld.class_id() == CLASS_DATE_FIELD) //se e' un campo data deve ANSIzzare il contenuto del campo per aggiungerlo al filtro
|
fe->_cmp = cmp;
|
||||||
|
//se e' un campo data deve ANSIzzare il contenuto del campo per aggiungerlo al filtro
|
||||||
|
if (fld.class_id() == CLASS_DATE_FIELD)
|
||||||
{
|
{
|
||||||
const TDate data = fld.get();
|
fe->_type = dl_date;
|
||||||
TString8 val = data.string(ANSI);
|
const TDate date = fld.get();
|
||||||
filtro << "(ANSI(" << field << ")" << cmp << val << ")";
|
fe->_value = date.string(ANSI);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
filtro << "(" << field << cmp << "\"" << fld.get() << "\")"; //aggiunge il contenuto del campo al filtro
|
{
|
||||||
|
if (stricmp(field, "UM") == 0)
|
||||||
|
fe->_type = dl_um;
|
||||||
|
fe->_value = fld.get(); //aggiunge il contenuto del campo al filtro
|
||||||
|
}
|
||||||
|
_filtro.add(fe);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//aggiunge ad un filtro una espressione con l'*
|
//aggiunge ad un filtro una espressione con l'*
|
||||||
void TIntmag::add_meta_filter(TString& filtro, const char * field, short id) const
|
void TIntmag::add_meta_filter(const char * field, short id) const
|
||||||
{
|
{
|
||||||
const TString& value = _mask->get(id);
|
const TString& value = _mask->get(id);
|
||||||
const char* cmp = "==";
|
TFilter_comp cmp = dl_eq;
|
||||||
if (value.find('*') >= 0 || value.find('?') >= 0)
|
if (value.find('*') >= 0 || value.find('?') >= 0)
|
||||||
cmp = "?=";
|
cmp = dl_match;
|
||||||
add_expr_filter(filtro, field, id, cmp);
|
add_expr_filter(field, id, cmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
//aggiunge ad un filtro un range di valori presi due campi o da uno (se coincidenti)
|
//aggiunge ad un filtro un range di valori presi due campi o da uno (se coincidenti)
|
||||||
void TIntmag::add_range_filter(TString& filtro, const char * field, short fid, short tid) const
|
void TIntmag::add_range_filter(const char * field, short fid, short tid) const
|
||||||
{
|
{
|
||||||
if (tid > fid)
|
if (tid > fid)
|
||||||
{
|
{
|
||||||
add_expr_filter(filtro, field, fid, ">=");
|
add_expr_filter(field, fid, dl_gt);
|
||||||
add_expr_filter(filtro, field, tid, "<=");
|
add_expr_filter(field, tid, dl_lt);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
add_expr_filter(filtro, field, fid, "==");
|
add_expr_filter(field, fid, dl_eq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static TString16 fast_field;
|
bool TIntmag::fast_filter(const TRelation* rel)
|
||||||
static TString80 fast_value;
|
|
||||||
static bool meta_type;
|
|
||||||
|
|
||||||
static bool fast_filter(const TRelation* rel)
|
|
||||||
{
|
{
|
||||||
const TRectype& rec = rel->curr();
|
for (int i = 0; i < _filtro.items(); i++)
|
||||||
if (meta_type)
|
{
|
||||||
return rec.get(fast_field).match(fast_value);
|
const TFilter_exp& fe = (const TFilter_exp&)_filtro[i];
|
||||||
return rec.get(fast_field) == fast_value;
|
TString80 field_value;
|
||||||
|
switch (fe._type)
|
||||||
|
{
|
||||||
|
case dl_date:
|
||||||
|
{
|
||||||
|
const TDate d = rel->curr().get(fe._field);
|
||||||
|
field_value = d.string(ANSI);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case dl_um:
|
||||||
|
{
|
||||||
|
TString80 key = rel->curr().get(ANAMAG_CODART);
|
||||||
|
key << "|1";
|
||||||
|
field_value = cache().get(LF_UMART, key, fe._field);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
field_value = rel->curr().get(fe._field);
|
||||||
|
}
|
||||||
|
switch (fe._cmp)
|
||||||
|
{
|
||||||
|
case dl_lt:
|
||||||
|
if (field_value > fe._value)
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
|
case dl_gt:
|
||||||
|
if (field_value < fe._value)
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
|
case dl_match:
|
||||||
|
if (!field_value.match(fe._value))
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (field_value != fe._value)
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TIntmag::main_loop()
|
void TIntmag::main_loop()
|
||||||
{
|
{
|
||||||
while (_mask->run() == K_ENTER)
|
while (_mask->run() == K_ENTER)
|
||||||
{
|
{
|
||||||
TString16 nomecampo;
|
|
||||||
//laboriosissima costruzione del filtro
|
//laboriosissima costruzione del filtro
|
||||||
TString filtro;
|
_filtro.destroy();
|
||||||
|
add_range_filter(ANAMAG_CODART, F_DABARCODE, F_ABARCODE);
|
||||||
|
add_meta_filter(ANAMAG_USER2, F_ARTISTA);
|
||||||
|
add_meta_filter(ANAMAG_DESCR, F_TITOLO);
|
||||||
|
add_meta_filter(ANAMAG_USER3, F_COMPOSITORE);
|
||||||
|
add_meta_filter(ANAMAG_USER4, F_ETICHETTA);
|
||||||
|
|
||||||
add_range_filter(filtro, ANAMAG_CODART, F_DABARCODE, F_ABARCODE);
|
add_range_filter(ANAMAG_GRMERC, F_GENEREMUSICALE);
|
||||||
|
add_range_filter(ANAMAG_USER5, F_DATAE_INI, F_DATAE_FIN);
|
||||||
add_meta_filter(filtro, ANAMAG_DESCR, F_TITOLO);
|
add_range_filter(ANAMAG_USER6, F_DATAV_INI, F_DATAV_FIN);
|
||||||
add_meta_filter(filtro, ANAMAG_USER2, F_ARTISTA);
|
|
||||||
add_meta_filter(filtro, ANAMAG_USER3, F_COMPOSITORE);
|
|
||||||
add_meta_filter(filtro, ANAMAG_USER4, F_ETICHETTA);
|
|
||||||
|
|
||||||
add_range_filter(filtro, ANAMAG_GRMERC, F_GENEREMUSICALE);
|
|
||||||
add_range_filter(filtro, ANAMAG_USER5, F_DATAE_INI, F_DATAE_FIN);
|
|
||||||
add_range_filter(filtro, ANAMAG_USER6, F_DATAV_INI, F_DATAV_FIN);
|
|
||||||
//caso sfigato: c'e' il tipo supporto tra i parametri di filtro!
|
//caso sfigato: c'e' il tipo supporto tra i parametri di filtro!
|
||||||
nomecampo.format("%d->%s", LF_UMART, "UM");
|
add_range_filter("UM", F_TIPOSUPPORTO);
|
||||||
add_range_filter(filtro, nomecampo, F_TIPOSUPPORTO);
|
|
||||||
|
|
||||||
//dopo il filtrone tocca al cursore x scandire i records
|
//dopo il filtrone tocca al cursore x scandire i records
|
||||||
TIntmag_form form;
|
TIntmag_form form;
|
||||||
//ottimizzazione tempi di ricerca: caso di filtro semplice (senza AND, con ?= o ==)
|
form.cursor()->set_filterfunction(fast_filter, FALSE);
|
||||||
|
|
||||||
if (filtro.find("&&") < 0 && filtro.find('=') > 0 && filtro.find("->") < 0)
|
|
||||||
{
|
|
||||||
filtro.strip("()");
|
|
||||||
meta_type = filtro.find("?=") > 0;
|
|
||||||
const int pos = filtro.rfind('=');
|
|
||||||
fast_value = filtro.mid(pos+1);
|
|
||||||
fast_value.strip("\"");
|
|
||||||
fast_field = filtro.left(pos-1);
|
|
||||||
|
|
||||||
form.cursor()->set_filterfunction(fast_filter, !_mask->field(F_TIPOSUPPORTO).empty());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
form.cursor()->setfilter(filtro, !_mask->field(F_TIPOSUPPORTO).empty());
|
|
||||||
|
|
||||||
//procedimento mistico di costruzione del form columnwise
|
//procedimento mistico di costruzione del form columnwise
|
||||||
const int hh = 5; //altezza header = 5 righe
|
const int hh = 5; //altezza header = 5 righe
|
||||||
|
@ -37,7 +37,7 @@ protected:
|
|||||||
real scorpora(const real& lordo, const TRecord_text& rec);
|
real scorpora(const real& lordo, const TRecord_text& rec);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual int autosave(TRelation& rel, const TRecord_text& rec);
|
// virtual int autosave(TRelation& rel, const TRecord_text& rec);
|
||||||
virtual bool pre_writerel(TRelation& rel,const TRecord_text& rec);
|
virtual bool pre_writerel(TRelation& rel,const TRecord_text& rec);
|
||||||
void write_supporto(const TRecord_text& rec);
|
void write_supporto(const TRecord_text& rec);
|
||||||
void write_listini(const TRecord_text& rec);
|
void write_listini(const TRecord_text& rec);
|
||||||
@ -61,6 +61,7 @@ void TCat2dl_file::set_config(const char * listingr,const char * listven, const
|
|||||||
_codiva = codiva;
|
_codiva = codiva;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
int TCat2dl_file::autosave(TRelation& rel, const TRecord_text& rec)
|
int TCat2dl_file::autosave(TRelation& rel, const TRecord_text& rec)
|
||||||
{
|
{
|
||||||
const TString& type = rec.type(); //prendo il tracciato record del tipo del record_text
|
const TString& type = rec.type(); //prendo il tracciato record del tipo del record_text
|
||||||
@ -82,28 +83,25 @@ int TCat2dl_file::autosave(TRelation& rel, const TRecord_text& rec)
|
|||||||
preformat_field(field,valore,rel,tr.type());
|
preformat_field(field,valore,rel,tr.type());
|
||||||
const TRectype& rel_rec = rel.curr(field.file());
|
const TRectype& rel_rec = rel.curr(field.file());
|
||||||
TFieldtypes tipo_campo = rel_rec.type(field.name());
|
TFieldtypes tipo_campo = rel_rec.type(field.name());
|
||||||
bool vuoto = valore.blank();
|
|
||||||
|
|
||||||
switch(tipo_campo) //in base al tipo di campo formatta i valori seguendo le specifiche del tracciato
|
switch(tipo_campo) //in base al tipo di campo formatta i valori seguendo le specifiche del tracciato
|
||||||
{
|
{
|
||||||
case _datefld: //tipo data...
|
case _datefld: //tipo data...
|
||||||
{
|
{
|
||||||
if (real::is_null(valore))
|
if (real::is_null(valore))
|
||||||
{
|
|
||||||
valore.cut(0);
|
valore.cut(0);
|
||||||
vuoto = TRUE;
|
else
|
||||||
}
|
{
|
||||||
TDate data(valore);
|
TDate data(valore);
|
||||||
format_date(data, fpicture(tc), valore);//formatta la data secondo le specifiche del tracciato
|
format_date(data, fpicture(tc), valore);//formatta la data secondo le specifiche del tracciato
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case _realfld: //tipi numerici
|
case _realfld: //tipi numerici
|
||||||
case _intfld:
|
case _intfld:
|
||||||
case _longfld:
|
case _longfld:
|
||||||
{
|
{
|
||||||
const real numero(valore);
|
const real numero(valore);
|
||||||
vuoto = numero.is_zero();
|
|
||||||
|
|
||||||
valore = numero.string(fpicture(tc));//formatta il numero secondo le specifiche del tracciato
|
valore = numero.string(fpicture(tc));//formatta il numero secondo le specifiche del tracciato
|
||||||
|
|
||||||
int length = flength(tc,rel_rec);
|
int length = flength(tc,rel_rec);
|
||||||
@ -115,15 +113,12 @@ int TCat2dl_file::autosave(TRelation& rel, const TRecord_text& rec)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
valore = format_field(tc, rel.lfile().num(), valore);//formatta il campo secondo le specifiche del record
|
valore = format_field(tc, rel.lfile().num(), valore);//formatta il campo secondo le specifiche del record
|
||||||
|
if (valore.blank() && field.name()=="CODIVA") //se il codice iva e' vuoto...
|
||||||
|
valore = _codiva;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (vuoto && field.name()=="CODIVA") //se il codice iva e' vuoto...
|
|
||||||
{
|
|
||||||
valore = _codiva;
|
|
||||||
vuoto = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!vuoto && rel.exist(field.file()))
|
if (rel.exist(field.file()))
|
||||||
field.write(valore, rel);//faccio una write sulla relazione del fieldref
|
field.write(valore, rel);//faccio una write sulla relazione del fieldref
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -137,9 +132,13 @@ int TCat2dl_file::autosave(TRelation& rel, const TRecord_text& rec)
|
|||||||
}
|
}
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
bool TCat2dl_file::pre_writerel(TRelation& rel,const TRecord_text& rec)
|
bool TCat2dl_file::pre_writerel(TRelation& rel,const TRecord_text& rec)
|
||||||
{
|
{
|
||||||
|
if (rel.curr().get("CODIVA").blank())
|
||||||
|
rel.curr().put("CODIVA", _codiva);
|
||||||
|
|
||||||
// 1) sistema i tipi di supporto e genere
|
// 1) sistema i tipi di supporto e genere
|
||||||
write_supporto(rec);
|
write_supporto(rec);
|
||||||
// 2) legge e scrive i dati dei listini: se il listino non esiste lo crea
|
// 2) legge e scrive i dati dei listini: se il listino non esiste lo crea
|
||||||
@ -578,10 +577,15 @@ void TCat2dl::transfer()
|
|||||||
rt += write_time - read_time;
|
rt += write_time - read_time;
|
||||||
wt += clock() - write_time;
|
wt += clock() - write_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const clock_t t = clock() - start_time;
|
||||||
|
if (t > 0)
|
||||||
|
{
|
||||||
ofstream pippo("dl.log");
|
ofstream pippo("dl.log");
|
||||||
pippo << "records = " << processed_rec << endl;
|
pippo << "records = " << processed_rec << endl;
|
||||||
pippo << "time = " << (clock() - start_time)/1000 << endl;
|
pippo << "time = " << t/1000 << endl;
|
||||||
pippo << "speed = " << (processed_rec*1000/(clock() - start_time)) << endl;
|
pippo << "speed = " << (processed_rec*1000/t) << endl;
|
||||||
|
}
|
||||||
|
|
||||||
_trasfile->close();
|
_trasfile->close();
|
||||||
message_box("Operazione terminata");
|
message_box("Operazione terminata");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user