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:
parent
cf2a2bb9f8
commit
cf7a81a9bc
@ -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")
|
||||
|
88
db/dblib.cpp
88
db/dblib.cpp
@ -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)
|
||||
|
12
db/dblib.h
12
db/dblib.h
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user