Patch level : 2.0 nopatch

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
Utilizzati i fraction per le conversioni


git-svn-id: svn://10.65.10.50/trunk@11041 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2003-04-22 14:00:08 +00:00
parent cf2a2bb9f8
commit cf7a81a9bc
3 changed files with 50 additions and 56 deletions

View File

@ -812,7 +812,7 @@ bool TExplode_distinta_form::validate(TForm_item &f, TToken_string &t)
{
case 'A':
{
valore = _art_cache.get(re.articolo()).get(code);
valore = cache().get(LF_ANAMAG, re.articolo(), code);
break;
}
case 'L':
@ -864,7 +864,7 @@ bool TExplode_distinta_form::validate(TForm_item &f, TToken_string &t)
{
case 'A':
{
valore = _art_cache.get(re.articolo()).get(ANAMAG_DESCR);
valore = cache().get(LF_ANAMAG, re.articolo(), ANAMAG_DESCR);
break;
}
case 'L':
@ -952,7 +952,7 @@ bool TExplode_distinta_form::validate(TForm_item &f, TToken_string &t)
else
if (code == "_CODFORN")
{
valore = _art_cache.get(re.articolo()).get(ANAMAG_CODFORN);
valore = cache().get(LF_ANAMAG, re.articolo(), ANAMAG_CODFORN);
}
else
if (code == "_CODCORR")

View File

@ -17,33 +17,31 @@
// TQuantita'
///////////////////////////////////////////////////////////
real TQuantita::get_factor(const TCodice_um& um) const
const fraction& TQuantita::get_factor(const TCodice_um& um) const
{
real fc = 1.0;
if (_articolo.blank())
static TAssoc_array factors;
TString80 code;
code << _articolo << '|' << (um.empty() ? _um : um);
fraction* conv = (fraction*)factors.objptr(code);
if (conv == NULL)
{
NFCHECK("Unita' di misura generica non supportata");
TLocalisamfile umart(LF_UMART);
umart.setkey(2);
umart.put(UMART_CODART, _articolo);
umart.put(UMART_UM, um.empty() ? _um : um);
if (umart.read() == NOERR)
conv = new fraction(umart.get_real(UMART_FC), UNO);
else
conv = new fraction(1,1);
factors.add(code, conv);
}
else
{
static TDecoder* umart2 = NULL;
if (umart2 == NULL)
{
umart2 = new TDecoder(LF_UMART, UMART_FC, 2);
umart2->test_file_changes();
umart2->set_items_limit(512);
}
TString80 code;
code << _articolo << '|' << (um.empty() ? _um : um);
const TString& val = umart2->decode(code);
if (val.not_empty())
fc = real(val);
}
return fc;
return *conv;
}
real TQuantita::find_umbase(TCodice_um& um)
void TQuantita::find_umbase(TCodice_um& um) const
{
TString80 code;
code << _articolo << "|1";
@ -52,13 +50,13 @@ real TQuantita::find_umbase(TCodice_um& um)
um = cache().get("LAV", _articolo, "S6");
else
um = new_um;
return 1.0;
}
real TQuantita::find_umdist(TCodice_um& um)
void TQuantita::find_umdist(TCodice_um& um) const
{
um = cache().get(LF_DIST, _articolo, UMART_UM);
return um.blank() ? find_umbase(um) : get_factor(um);
if (um.blank())
find_umbase(um);
}
void TQuantita::set_articolo(const TString& art, const TString& um)
@ -66,41 +64,34 @@ void TQuantita::set_articolo(const TString& art, const TString& um)
_articolo = art;
if (isalnum(um[0]))
{
_um = um;
_conv = get_factor(_um);
}
else
{
if (um.blank())
_conv = find_umbase(_um);
find_umbase(_um);
else
_conv = find_umdist(_um);
find_umdist(_um);
}
if (!art.blank() && _um.blank())
NFCHECK("Unita' di misura nulla per %s", (const char*)art);
CHECK(_conv > ZERO, "Invalid conversion factor");
}
void TQuantita::copy(const TQuantita& q)
{
_articolo = q._articolo;
_um = q._um;
_conv = q._conv;
_val = q._val;
}
void TQuantita::convert(real& val, const TCodice_um& from_um,
const TCodice_um& to_um) const
void TQuantita::convert(real& val, const TCodice_um& from_um, const TCodice_um& to_um) const
{
CHECK(!from_um.blank() && !to_um.blank(), "Unita' di misura nulla");
if (from_um != to_um && !val.is_zero())
{
const real mul = get_factor(from_um);
const real div = get_factor(to_um);
val *= mul;
val /= div;
const fraction& mul = get_factor(from_um);
const fraction& div = get_factor(to_um);
val = fraction(val, UNO) * mul / div;
TArticolo::round_um(val, to_um);
}
}
@ -108,7 +99,7 @@ void TQuantita::convert(real& val, const TCodice_um& from_um,
void TQuantita::convert2umdist()
{
TCodice_um dummy;
_conv = find_umdist(dummy);
find_umdist(dummy);
if (dummy != _um)
{
convert(_val, _um, dummy);
@ -122,20 +113,22 @@ void TQuantita::convert2umbase()
find_umbase(dummy);
if (dummy != _um)
{
CHECK(_conv > ZERO, "Invalid conversion factor");
_val *= _conv;
convert(_val, _um, dummy);
_um = dummy;
_conv = 1.0;
TArticolo::round_um(_val, _um);
}
}
real TQuantita::base_val() const
{
CHECK(_conv > ZERO, "Invalid conversion factor");
real v = _conv * _val;
TArticolo::round_um(v, _um);
return v;
TCodice_um dummy;
find_umbase(dummy);
if (dummy != _um) // Se non sono gia' la base...
{
real v = _val;
convert(v, _um, dummy);
return v;
}
return _val;
}
int TQuantita::compare(const TSortable& s) const
@ -206,7 +199,6 @@ const TQuantita& TQuantita::operator /=(const real& q)
}
TQuantita::TQuantita()
: _conv(1.0)
{ }
TQuantita::TQuantita(const TString& art, const TString& um, const real& val)

View File

@ -5,6 +5,10 @@
#include <expr.h>
#endif
#ifndef __FRACTION_H
#include <fraction.h>
#endif
#ifndef __RECARRAY_H
#include <recarray.h>
#endif
@ -147,7 +151,6 @@ class TQuantita : public TSortable
{
TCodice_articolo _articolo; // Articolo di riferimento
TCodice_um _um; // Unita' di misura
real _conv; // Fattore di conversione alla base
real _val; // Valore attuale
protected:
@ -155,11 +158,11 @@ protected:
virtual TObject* dup() const { return new TQuantita(*this); }
void copy(const TQuantita& q);
real get_factor(const TCodice_um& um) const;
const fraction& get_factor(const TCodice_um& um) const;
void convert(real& val, const TCodice_um& from_um, const TCodice_um& to_um) const;
real find_umbase(TCodice_um& um);
real find_umdist(TCodice_um& um);
void find_umbase(TCodice_um& um) const;
void find_umdist(TCodice_um& um) const;
public:
virtual bool ok() const { return !_um.blank(); }
@ -177,7 +180,6 @@ public:
const TCodice_articolo& articolo() const { return _articolo; }
const TCodice_um& um() const { return _um; }
const real& conv() const { return _conv; }
const real& val() const { return _val; }
real base_val() const;