2003-04-22 09:13:51 +00:00
|
|
|
#include <applicat.h>
|
|
|
|
#include <automask.h>
|
|
|
|
#include <form.h>
|
|
|
|
#include <relation.h>
|
|
|
|
#include <printer.h>
|
|
|
|
#include <progind.h>
|
|
|
|
#include <recarray.h>
|
|
|
|
#include <utility.h>
|
|
|
|
#include <utility.h>
|
|
|
|
|
|
|
|
#include "..\mg\umart.h"
|
|
|
|
#include "..\mg\anamag.h"
|
|
|
|
#include "..\mg\mglib.h"
|
|
|
|
#include "..\ve\condv.h"
|
|
|
|
#include "..\ve\rcondv.h"
|
|
|
|
#include "dl0.h"
|
|
|
|
#include "dl0600.h"
|
|
|
|
#include "dl0600a.h"
|
|
|
|
|
|
|
|
//-----FORM--------------------------------------------------------------------------------------//
|
|
|
|
|
|
|
|
class TIntmag_form : public TForm
|
|
|
|
{
|
|
|
|
TArray _lista_offerte;
|
|
|
|
TString4 _codoff, _codlis;
|
|
|
|
TArticolo_giacenza _artgiac;
|
|
|
|
TDate _oggi;
|
|
|
|
|
|
|
|
public:
|
|
|
|
virtual bool validate(TForm_item& cf, TToken_string& s);
|
|
|
|
TIntmag_form();
|
|
|
|
virtual ~TIntmag_form();
|
|
|
|
};
|
|
|
|
|
|
|
|
bool TIntmag_form::validate(TForm_item &cf, TToken_string &s)
|
|
|
|
{
|
|
|
|
const TString16 code(s.get(0));
|
|
|
|
|
|
|
|
if (code == "_GIACENZA")
|
|
|
|
{
|
|
|
|
TRectype& recanamag = cf.form().cursor()->curr(); //prende il record corrente
|
|
|
|
_artgiac.read(recanamag);
|
|
|
|
real giac_anno = _artgiac.giacenza_anno("","",TDate(TODAY).year());
|
|
|
|
cf.set(giac_anno.string());
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
if (code == "_ORDF")
|
|
|
|
{
|
|
|
|
TString8 anno;
|
|
|
|
anno.format("%d",_oggi.year());
|
|
|
|
int nriga = _artgiac.find_mag(anno);
|
|
|
|
if (nriga > 0)
|
|
|
|
{
|
|
|
|
const TRectype& magrec = _artgiac.mag(anno)[nriga];
|
|
|
|
cf.set(magrec.get(MAG_ORDF));
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
if (code == "_ACQ")
|
|
|
|
{
|
|
|
|
TString8 anno;
|
|
|
|
anno.format("%d",_oggi.year());
|
|
|
|
int nriga = _artgiac.find_mag(anno);
|
|
|
|
if (nriga > 0)
|
|
|
|
{
|
|
|
|
const TRectype& magrec = _artgiac.mag(anno)[nriga];
|
|
|
|
cf.set(magrec.get(MAG_ACQ));
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
if (code == "_VEN")
|
|
|
|
{
|
|
|
|
TString8 anno;
|
|
|
|
anno.format("%d",_oggi.year());
|
|
|
|
int nriga = _artgiac.find_mag(anno);
|
|
|
|
if (nriga > 0)
|
|
|
|
{
|
|
|
|
const TRectype& magrec = _artgiac.mag(anno)[nriga];
|
|
|
|
cf.set(magrec.get(MAG_VEN));
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
if (code == "_PREZZO")
|
|
|
|
{ //crea la lista delle offerte valide (campagne di vendita in corso)
|
|
|
|
if (_lista_offerte.items() == 0)
|
|
|
|
{
|
|
|
|
TLocalisamfile condv(LF_CONDV);
|
|
|
|
for (int err = condv.first(); err == NOERR; err = condv.next())
|
|
|
|
{
|
|
|
|
if (condv.get_char(CONDV_TIPO) == 'O' && condv.get_char(CONDV_COD) == _codoff[0] &&
|
|
|
|
_oggi >= condv.get_date(CONDV_VALIN) && _oggi <= condv.get_date(CONDV_VALFIN))
|
|
|
|
_lista_offerte.add(condv.curr());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
TString prezzo;
|
|
|
|
TString4 lo;
|
|
|
|
for (int i = _lista_offerte.last(); i>=0 && prezzo.empty(); i--)
|
|
|
|
{
|
|
|
|
const TRectype& condv = (const TRectype&) _lista_offerte[i];
|
|
|
|
|
|
|
|
TToken_string chiave;
|
|
|
|
chiave.add('O'); //TIPO = offerta
|
|
|
|
chiave.add(" "); //CATVEN = " "
|
|
|
|
chiave.add(" "); //TIPOCF = " "
|
|
|
|
chiave.add(" "); //CODCF = " "
|
|
|
|
lo = condv.get(CONDV_COD);
|
|
|
|
chiave.add(lo); //COD = cod offerta
|
|
|
|
chiave.add("A"); //TIPORIGA = A
|
|
|
|
chiave.add(_artgiac.codice()); //CODRIGA
|
|
|
|
chiave.add(_artgiac.um().row(1).get(UMART_UM)); //UM = supporto
|
|
|
|
chiave.add(" "); //NSCAGL = " "
|
|
|
|
prezzo = cache().get(LF_RCONDV, chiave, "PREZZO");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (prezzo.empty())
|
|
|
|
{
|
|
|
|
TToken_string chiave;
|
|
|
|
chiave.add('L'); //TIPO = offerta
|
|
|
|
chiave.add(" "); //CATVEN = " "
|
|
|
|
chiave.add(" "); //TIPOCF = " "
|
|
|
|
chiave.add(" "); //CODCF = " "
|
|
|
|
lo = _codlis;
|
|
|
|
chiave.add(_codlis); //COD = cod listino
|
|
|
|
chiave.add("A"); //TIPORIGA = A
|
|
|
|
chiave.add(_artgiac.codice()); //CODRIGA
|
|
|
|
chiave.add(_artgiac.um().row(1).get(UMART_UM)); //UM = supporto
|
|
|
|
chiave.add(" "); //NSCAGL = " "
|
|
|
|
prezzo = cache().get(LF_RCONDV, chiave, "PREZZO");
|
|
|
|
}
|
|
|
|
cf.set(prezzo); //lo passa al form x la stampa
|
|
|
|
|
|
|
|
TForm_item& condv = cf.section().find_field(s.get_int(1));
|
|
|
|
condv.set(lo);
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
return TForm::validate(cf, s);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TIntmag_form::TIntmag_form() :TForm ("dl0600a"),_oggi(TODAY)
|
|
|
|
{
|
|
|
|
TConfig config("cat2dl.ini","PARAMS"); //gli serve il prefisso delle campagne di offerta (vendita)
|
|
|
|
_codoff = config.get("OFFEVEND");
|
|
|
|
_codlis = config.get("LISTVEND");
|
|
|
|
}
|
|
|
|
|
|
|
|
TIntmag_form::~TIntmag_form()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----AUTOMASK---------------------------------------------------------------------------------//
|
|
|
|
|
|
|
|
class TIntmag_mask : public TAutomask
|
|
|
|
{
|
|
|
|
TRelation * _rel;
|
|
|
|
TCursor * _cur;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
|
|
|
public:
|
|
|
|
|
|
|
|
TIntmag_mask();
|
|
|
|
|
|
|
|
virtual ~TIntmag_mask(){};
|
|
|
|
};
|
|
|
|
|
|
|
|
TIntmag_mask::TIntmag_mask() :TAutomask ("dl0600a")
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TIntmag_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
|
|
|
{
|
|
|
|
/* switch (o.dlg())
|
|
|
|
{
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
} */
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------SKELETON APPLICATION------------------------------------------------------------------------------//
|
2003-04-28 10:59:05 +00:00
|
|
|
|
|
|
|
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) { }
|
|
|
|
};
|
|
|
|
|
2003-04-22 09:13:51 +00:00
|
|
|
class TIntmag: public TSkeleton_application
|
|
|
|
{
|
|
|
|
TIntmag_mask * _mask;
|
|
|
|
TIntmag_form * _form;
|
2003-04-28 10:59:05 +00:00
|
|
|
|
|
|
|
static TArray _filtro;
|
2003-04-22 09:13:51 +00:00
|
|
|
|
|
|
|
protected:
|
|
|
|
virtual bool create(void);
|
|
|
|
virtual bool destroy(void);
|
|
|
|
virtual void main_loop();
|
|
|
|
|
|
|
|
void print_header();
|
|
|
|
void print_footer();
|
|
|
|
void print_line(const TString& r, const long j);
|
2003-04-28 10:59:05 +00:00
|
|
|
|
|
|
|
static bool fast_filter(const TRelation* rel);
|
2003-04-22 09:13:51 +00:00
|
|
|
|
|
|
|
public:
|
2003-04-28 10:59:05 +00:00
|
|
|
void add_expr_filter(const char * field, short id, TFilter_comp cmp) const;
|
|
|
|
void add_meta_filter(const char * field, short id) const;
|
|
|
|
void add_range_filter(const char * field, short fid, short tid = -1) const;
|
2003-04-22 09:13:51 +00:00
|
|
|
|
|
|
|
TIntmag() {}
|
|
|
|
virtual ~TIntmag() {}
|
|
|
|
};
|
|
|
|
|
2003-04-28 10:59:05 +00:00
|
|
|
TArray TIntmag::_filtro;
|
|
|
|
|
2003-04-22 09:13:51 +00:00
|
|
|
// restituisce un riferimento all' applicazione
|
|
|
|
inline TIntmag& app() { return (TIntmag&) main_app();}
|
|
|
|
|
|
|
|
// creazione dell'applicazione
|
|
|
|
bool TIntmag::create()
|
|
|
|
{
|
|
|
|
open_files(LF_ANAMAG, LF_RMOVMAG, LF_UMART, LF_MAG, LF_CONDV, LF_RCONDV, 0);
|
|
|
|
_mask = new TIntmag_mask;
|
|
|
|
_form = new TIntmag_form();
|
|
|
|
|
|
|
|
return TSkeleton_application::create();
|
|
|
|
}
|
|
|
|
|
|
|
|
// distruzione dell'applicazione
|
|
|
|
bool TIntmag::destroy()
|
|
|
|
{
|
|
|
|
delete _mask;
|
|
|
|
delete _form;
|
|
|
|
return TSkeleton_application::destroy();
|
|
|
|
}
|
|
|
|
|
|
|
|
//aggiunge effettivamente una espressione ad un filtro
|
2003-04-28 10:59:05 +00:00
|
|
|
void TIntmag::add_expr_filter(const char * field, short id, TFilter_comp cmp) const
|
2003-04-22 09:13:51 +00:00
|
|
|
{
|
|
|
|
TMask_field& fld = _mask->field(id); //prende il campo dalla maschera
|
|
|
|
if (!fld.empty()) //..se non e' vuoto
|
|
|
|
{
|
2003-04-28 10:59:05 +00:00
|
|
|
TFilter_exp* fe = new TFilter_exp;
|
|
|
|
fe->_field = field;
|
|
|
|
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)
|
2003-04-22 09:13:51 +00:00
|
|
|
{
|
2003-04-28 10:59:05 +00:00
|
|
|
fe->_type = dl_date;
|
|
|
|
const TDate date = fld.get();
|
|
|
|
fe->_value = date.string(ANSI);
|
2003-04-22 09:13:51 +00:00
|
|
|
}
|
2003-04-28 10:59:05 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if (stricmp(field, "UM") == 0)
|
|
|
|
fe->_type = dl_um;
|
|
|
|
fe->_value = fld.get(); //aggiunge il contenuto del campo al filtro
|
|
|
|
}
|
|
|
|
_filtro.add(fe);
|
|
|
|
}
|
2003-04-22 09:13:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//aggiunge ad un filtro una espressione con l'*
|
2003-04-28 10:59:05 +00:00
|
|
|
void TIntmag::add_meta_filter(const char * field, short id) const
|
|
|
|
{
|
2003-04-22 09:13:51 +00:00
|
|
|
const TString& value = _mask->get(id);
|
2003-04-28 10:59:05 +00:00
|
|
|
TFilter_comp cmp = dl_eq;
|
2003-04-22 09:13:51 +00:00
|
|
|
if (value.find('*') >= 0 || value.find('?') >= 0)
|
2003-04-28 10:59:05 +00:00
|
|
|
cmp = dl_match;
|
|
|
|
add_expr_filter(field, id, cmp);
|
2003-04-22 09:13:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//aggiunge ad un filtro un range di valori presi due campi o da uno (se coincidenti)
|
2003-04-28 10:59:05 +00:00
|
|
|
void TIntmag::add_range_filter(const char * field, short fid, short tid) const
|
2003-04-22 09:13:51 +00:00
|
|
|
{
|
|
|
|
if (tid > fid)
|
|
|
|
{
|
2003-04-28 10:59:05 +00:00
|
|
|
add_expr_filter(field, fid, dl_gt);
|
|
|
|
add_expr_filter(field, tid, dl_lt);
|
2003-04-22 09:13:51 +00:00
|
|
|
}
|
|
|
|
else
|
2003-04-28 10:59:05 +00:00
|
|
|
add_expr_filter(field, fid, dl_eq);
|
2003-04-22 09:13:51 +00:00
|
|
|
}
|
|
|
|
|
2003-04-28 10:59:05 +00:00
|
|
|
bool TIntmag::fast_filter(const TRelation* rel)
|
2003-04-22 09:13:51 +00:00
|
|
|
{
|
2003-04-28 10:59:05 +00:00
|
|
|
for (int i = 0; i < _filtro.items(); i++)
|
|
|
|
{
|
|
|
|
const TFilter_exp& fe = (const TFilter_exp&)_filtro[i];
|
|
|
|
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;
|
2003-04-22 09:13:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void TIntmag::main_loop()
|
|
|
|
{
|
|
|
|
while (_mask->run() == K_ENTER)
|
|
|
|
{
|
2003-04-28 10:59:05 +00:00
|
|
|
//laboriosissima costruzione del 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);
|
2003-04-22 09:13:51 +00:00
|
|
|
|
2003-04-28 10:59:05 +00:00
|
|
|
add_range_filter(ANAMAG_GRMERC, F_GENEREMUSICALE);
|
|
|
|
add_range_filter(ANAMAG_USER5, F_DATAE_INI, F_DATAE_FIN);
|
|
|
|
add_range_filter(ANAMAG_USER6, F_DATAV_INI, F_DATAV_FIN);
|
2003-04-22 09:13:51 +00:00
|
|
|
//caso sfigato: c'e' il tipo supporto tra i parametri di filtro!
|
2003-04-28 10:59:05 +00:00
|
|
|
add_range_filter("UM", F_TIPOSUPPORTO);
|
2003-04-22 09:13:51 +00:00
|
|
|
|
|
|
|
//dopo il filtrone tocca al cursore x scandire i records
|
|
|
|
TIntmag_form form;
|
2003-04-28 10:59:05 +00:00
|
|
|
form.cursor()->set_filterfunction(fast_filter, FALSE);
|
2003-04-22 09:13:51 +00:00
|
|
|
|
|
|
|
//procedimento mistico di costruzione del form columnwise
|
|
|
|
const int hh = 5; //altezza header = 5 righe
|
|
|
|
int rows[4];
|
|
|
|
rows[0] = hh - 2;
|
|
|
|
rows[1] = hh;
|
|
|
|
rows[2] = printer().formlen();
|
|
|
|
rows[3] = 0;
|
|
|
|
|
|
|
|
form.genera_intestazioni(odd_page, hh - 1);
|
|
|
|
form.genera_fincatura(odd_page, hh - 2, rows[2], rows);
|
|
|
|
|
|
|
|
form.print();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int dl0600(int argc, char* argv[])
|
|
|
|
{
|
|
|
|
TIntmag a ;
|
|
|
|
a.run(argc, argv, "Interrogazione magazzino");
|
|
|
|
return 0;
|
|
|
|
}
|