currency.cpp Correzioni sulla gestione valuta
isam.cpp Evita di chiudere files se il prefix e' gia' stato chiuso mask.cpp Riconoscimento campi CURRENCY maskfld.* Aggiunti campi CURRENCY prefix.* Aggiunta funzione prefix_valid() per sapere se il prefix e' stato inizializzato git-svn-id: svn://10.65.10.50/trunk@6653 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
e69efac5d4
commit
d5db644881
@ -40,19 +40,23 @@ public:
|
||||
TObject* TDowJones::rec2obj(const TRectype& rec) const
|
||||
{
|
||||
TExchangeData* data = new TExchangeData;
|
||||
data->_num = rec.get_real("R12");
|
||||
if (data->_num < 1.0)
|
||||
data->_num = 1.0;
|
||||
data->_den = rec.get_real("R13");
|
||||
data->_den = rec.get_real("I11");
|
||||
if (data->_den > ZERO)
|
||||
{
|
||||
data->_num = rec.get_real("R11");
|
||||
if (data->_num < 1.0)
|
||||
data->_num = 1.0;
|
||||
data->_dec = rec.get_int("I0");
|
||||
}
|
||||
else
|
||||
{
|
||||
data->_num = rec.get_real("I10");
|
||||
if (data->_num < 1.0)
|
||||
data->_num = 1.0;
|
||||
data->_den = rec.get_real("R10");
|
||||
data->_num = 1.0;
|
||||
data->_dec = rec.get("CODTAB").empty() ? 0 : 2;
|
||||
const TString& codval = rec.get("CODTAB");
|
||||
data->_dec = codval.empty() || codval == "LIT" ? 0 : 2;
|
||||
}
|
||||
if (data->_den <= ZERO)
|
||||
{
|
||||
@ -135,7 +139,7 @@ void TCurrency::change_value(const char* val)
|
||||
{
|
||||
if (_num != ZERO)
|
||||
_num = DowJones.exchange(_num, _val, val);
|
||||
strncpy(_val, val, 3);
|
||||
strncpy(_val, val, 4);
|
||||
}
|
||||
|
||||
void TCurrency::read(const TRectype& rec, const char* field, const char* val)
|
||||
@ -212,6 +216,6 @@ TCurrency::TCurrency(const TCurrency& cur)
|
||||
TCurrency::TCurrency(const real& num, const char* val)
|
||||
: _num(num)
|
||||
{
|
||||
strncpy(_val, val, 3);
|
||||
strncpy(_val, val, 4);
|
||||
}
|
||||
|
||||
|
@ -1036,8 +1036,12 @@ int TBaseisamfile::_open_ex(
|
||||
|
||||
int TBaseisamfile::_close()
|
||||
{
|
||||
int err = prefix().close_isamfile(_isam_handle);
|
||||
setstatus(err);
|
||||
int err = NOERR;
|
||||
if (prefix_valid())
|
||||
{
|
||||
err = prefix().close_isamfile(_isam_handle);
|
||||
setstatus(err);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -833,6 +833,7 @@ TMask_field* TMask::parse_field(TScanner& scanner)
|
||||
if (k == "GR") return new TGroup_field(this);
|
||||
if (k == "LI") return new TList_field(this);
|
||||
if (k == "RA") return new TRadio_field(this);
|
||||
if (k == "CU") return new TCurrency_field(this);
|
||||
if (k == "ME") return new TMemo_field(this);
|
||||
if (k == "ZO") return new TZoom_field(this);
|
||||
if (k == "GO") return new TGolem_field(this);
|
||||
|
@ -1110,7 +1110,7 @@ void TButton_field::set_native_icon(unsigned icon)
|
||||
|
||||
TEditable_field::TEditable_field(TMask* m)
|
||||
: TLoadable_field(m), _prompt(NULL), _field(NULL), _keys(NULL),
|
||||
_validate(NULL), _warning(NULL)
|
||||
_validate(NULL), _warning(NULL), _drivers(NULL), _userdata(NULL)
|
||||
{ }
|
||||
|
||||
|
||||
@ -1121,6 +1121,8 @@ TEditable_field::~TEditable_field()
|
||||
if (_keys) delete _keys;
|
||||
if (_validate) delete _validate;
|
||||
if (_warning) delete _warning;
|
||||
if (_drivers) delete _drivers;
|
||||
if (_userdata) delete _userdata;
|
||||
}
|
||||
|
||||
|
||||
@ -1167,6 +1169,32 @@ bool TEditable_field::parse_item(TScanner& scanner)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (k == "DR") // DRIVENBY
|
||||
{
|
||||
if (_drivers == NULL)
|
||||
_drivers = new TPointer_array;
|
||||
TToken_string lista(scanner.line(), ' ');
|
||||
FOR_EACH_TOKEN(lista, tok)
|
||||
{
|
||||
const int id = atoi(tok);
|
||||
if (id > 0)
|
||||
{
|
||||
const int pos = mask().id2pos(id);
|
||||
if (pos >= 0)
|
||||
{
|
||||
TEdit_field& driver = mask().efield(id);
|
||||
_drivers->add(&driver);
|
||||
TString16 msg;
|
||||
msg.format("CHECK,%d", dlg());
|
||||
driver.message(0, TRUE)->add(msg);
|
||||
}
|
||||
else
|
||||
NFCHECK("Non esiste ancora il campo driver %d", id);
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (k == "CU") // CUSTOM DATA
|
||||
{
|
||||
if (_userdata == NULL)
|
||||
@ -2328,49 +2356,49 @@ KEY TBrowse::run()
|
||||
TToken_string siblings, vals;
|
||||
create_siblings(siblings);
|
||||
|
||||
{
|
||||
byte buttons = 0;
|
||||
if (_insert.not_empty())
|
||||
{
|
||||
// Mette il bottone di gestione, a meno che ...
|
||||
if (_cursor->items() == 0)
|
||||
buttons = 2; // Non mette il bottone collega se non ci sono elementi
|
||||
else
|
||||
buttons = 3;
|
||||
{
|
||||
byte buttons = 0;
|
||||
if (_insert.not_empty())
|
||||
{
|
||||
// Mette il bottone di gestione, a meno che ...
|
||||
if (_cursor->items() == 0)
|
||||
buttons = 2; // Non mette il bottone collega se non ci sono elementi
|
||||
else
|
||||
buttons = 3;
|
||||
|
||||
if (_insert[0] == 'M' || _insert[0] == 'R')
|
||||
{
|
||||
const TString& maskname = field().mask().source_file();
|
||||
if (maskname.mid(2,2).compare("tb", 2, TRUE) == 0 && field().in_key(0))
|
||||
if (_insert[0] == 'M' || _insert[0] == 'R')
|
||||
{
|
||||
const TString& maskname = field().mask().source_file();
|
||||
if (maskname.mid(2,2).compare("tb", 2, TRUE) == 0 && field().in_key(0))
|
||||
{
|
||||
const char* tabname = _cursor->file().name();
|
||||
if (maskname.mid(4, 3).compare(tabname, 3, TRUE) == 0)
|
||||
buttons = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (const char* i = _inp_id.get(0); i; i = _inp_id.get())
|
||||
{
|
||||
if (*i != '"' && strchr(i, '@') == NULL)
|
||||
{
|
||||
const char* tabname = _cursor->file().name();
|
||||
if (maskname.mid(4, 3).compare(tabname, 3, TRUE) == 0)
|
||||
buttons = 0;
|
||||
const short id = field().atodlg(i);
|
||||
const TEditable_field& f = field(id);
|
||||
if (f.active() && f.is_editable())
|
||||
{
|
||||
vals.add(i);
|
||||
vals.add(f.get());
|
||||
vals.add((int)f.dirty());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (const char* i = _inp_id.get(0); i; i = _inp_id.get())
|
||||
{
|
||||
if (*i != '"' && strchr(i, '@') == NULL)
|
||||
{
|
||||
const short id = field().atodlg(i);
|
||||
const TEditable_field& f = field(id);
|
||||
if (f.active() && f.is_editable())
|
||||
{
|
||||
vals.add(i);
|
||||
vals.add(f.get());
|
||||
vals.add((int)f.dirty());
|
||||
}
|
||||
}
|
||||
}
|
||||
end_wait();
|
||||
|
||||
end_wait();
|
||||
|
||||
TBrowse_sheet s(_cursor, _items, caption, _head, buttons, &field(), siblings);
|
||||
k = s.run();
|
||||
selected = s.selected();
|
||||
}
|
||||
TBrowse_sheet s(_cursor, _items, caption, _head, buttons, &field(), siblings);
|
||||
k = s.run();
|
||||
selected = s.selected();
|
||||
}
|
||||
|
||||
switch (k)
|
||||
{
|
||||
@ -3619,7 +3647,6 @@ const char* TReal_field::win2raw(const char* data) const
|
||||
return str;
|
||||
}
|
||||
|
||||
|
||||
void TReal_field::set_decimals(int d)
|
||||
{
|
||||
_decimals = d;
|
||||
@ -3630,7 +3657,6 @@ void TReal_field::set_decimals(int d)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void TReal_field::exchange(bool show_value, const real& nuo)
|
||||
{
|
||||
const int dec = show_value ? 2 : 0; // Quanti decimali voglio
|
||||
@ -3658,6 +3684,97 @@ void TReal_field::exchange(bool show_value, const real& nuo)
|
||||
set_decimals(dec);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// Currency_field
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
#include <currency.h>
|
||||
|
||||
const char* TCurrency_field::raw2win(const char* data) const
|
||||
{
|
||||
const real num = data;
|
||||
if (num == ZERO)
|
||||
return "";
|
||||
const char* value = NULL;
|
||||
if (driver(0))
|
||||
value = driver(0)->get();
|
||||
|
||||
TCurrency cur(num, value);
|
||||
return cur.string(TRUE);
|
||||
}
|
||||
|
||||
const char* TCurrency_field::win2raw(const char* data) const
|
||||
{
|
||||
TString& str = _ctl_data._park;
|
||||
const real num(real::ita2eng(data));
|
||||
str = num.string();
|
||||
return str;
|
||||
}
|
||||
|
||||
bool TCurrency_field::on_key(KEY key)
|
||||
{
|
||||
if (key == K_TAB && focusdirty())
|
||||
{
|
||||
const TString& raw = get_window_data();
|
||||
set_window_data(raw2win(raw));
|
||||
}
|
||||
return TEdit_field::on_key(key);
|
||||
}
|
||||
|
||||
bool TCurrency_field::autosave(TRelation& r)
|
||||
{
|
||||
if (field())
|
||||
{
|
||||
int file = field()->file();
|
||||
const TString& name = field()->name();
|
||||
const char* value = NULL;
|
||||
if (driver(0))
|
||||
value = driver(0)->get();
|
||||
const real num = get();
|
||||
const TCurrency cur(num, value);
|
||||
cur.write(r.curr(file), name, value);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool TCurrency_field::autoload(const TRelation& r)
|
||||
{
|
||||
if (field())
|
||||
{
|
||||
int file = field()->file();
|
||||
const TString& name = field()->name();
|
||||
const char* value = NULL;
|
||||
if (driver(0))
|
||||
value = driver(0)->get();
|
||||
TCurrency cur;
|
||||
cur.read(r.curr(file), name, value);
|
||||
set(cur.string());
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void TCurrency_field::parse_head(TScanner& scanner)
|
||||
{
|
||||
int size = scanner.integer();
|
||||
if (size <= 0)
|
||||
size = 18;
|
||||
_ctl_data._size = _ctl_data._width = size;
|
||||
}
|
||||
|
||||
void TCurrency_field::create(WINDOW w)
|
||||
{
|
||||
_ctl_data._flags.strip("AMVZ");
|
||||
_ctl_data._flags << 'R';
|
||||
TEdit_field::create(w);
|
||||
}
|
||||
|
||||
TCurrency_field::TCurrency_field(TMask* m)
|
||||
: TEdit_field(m)
|
||||
{
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// List_field
|
||||
///////////////////////////////////////////////////////////
|
||||
|
@ -566,10 +566,13 @@ class TEditable_field : public TLoadable_field
|
||||
|
||||
// @cmember:(INTERNAL) Chiave al quale appartiene il campo
|
||||
TBit_array* _keys;
|
||||
|
||||
|
||||
// @cmember Messaggi da mandare in caso di errore sul campo
|
||||
TString* _warning;
|
||||
|
||||
// @cmember:(INTERNAL) Lista dei campi da cui dipende
|
||||
TPointer_array* _drivers;
|
||||
|
||||
// @cmember:(INTERNAL) Stringa definibile dall'utilizzatore della classe da utilizzare a piacimento
|
||||
TToken_string* _userdata;
|
||||
|
||||
@ -653,6 +656,10 @@ public:
|
||||
|
||||
// @cmember Ritorna TRUE se il campo e' di tipo editable
|
||||
virtual bool is_editable() const { return TRUE; }
|
||||
|
||||
// @cmember Ritorna un eventuale campo driver
|
||||
const TEditable_field* driver(int n) const
|
||||
{ return _drivers ? (const TEditable_field*)_drivers->objptr(n) : NULL; }
|
||||
|
||||
TEditable_field(TMask* m);
|
||||
virtual ~TEditable_field();
|
||||
@ -1111,6 +1118,36 @@ public:
|
||||
{ }
|
||||
};
|
||||
|
||||
// @class TCurrency_field | Classe per la gestione dei campi in valuta
|
||||
//
|
||||
// @base public | TEdit_field
|
||||
class TCurrency_field : public TEdit_field
|
||||
// @author:(INTERNAL) Guido
|
||||
{
|
||||
// @access:(INTERNAL) Private Member
|
||||
|
||||
protected: // TMask_field
|
||||
// @cmember Legge un item del controllo dal file .msk <p scanner>
|
||||
virtual void parse_head(TScanner& scanner);
|
||||
|
||||
virtual void create(WINDOW w);
|
||||
|
||||
protected: // TEditable_field
|
||||
virtual const char* win2raw(const char* data) const;
|
||||
virtual const char* raw2win(const char* data) const;
|
||||
virtual bool on_key(KEY key);
|
||||
|
||||
virtual bool autosave(TRelation& r);
|
||||
virtual bool autoload(const TRelation& r);
|
||||
|
||||
public:
|
||||
// @cmember Costruttore
|
||||
TCurrency_field(TMask* mask);
|
||||
// @cmember Distruttore
|
||||
virtual ~TCurrency_field()
|
||||
{ }
|
||||
};
|
||||
|
||||
// @doc EXTERNAL
|
||||
|
||||
// @class TDate_field | Classe per la gestione dei campi data
|
||||
|
@ -32,6 +32,16 @@ TPrefix& prefix_init()
|
||||
|
||||
// @doc EXTERNAL
|
||||
|
||||
// @func Determina se il prefix e' stato inizializzato
|
||||
//
|
||||
// @rdesc Ritorna TRUE o FALSE
|
||||
bool prefix_valid()
|
||||
{
|
||||
return _prefhndl != NULL;
|
||||
}
|
||||
|
||||
// @doc EXTERNAL
|
||||
|
||||
// @func Legge il file "prefix.txt"
|
||||
//
|
||||
// @rdesc Ritorna l'oggetto <c TPrefix> letto
|
||||
|
@ -168,6 +168,7 @@ public:
|
||||
const char* firm2dir(long codditta);
|
||||
|
||||
TPrefix& prefix_init();
|
||||
bool prefix_valid();
|
||||
TPrefix& prefix();
|
||||
void prefix_destroy();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user