From 2ab4a131ad07920aa564237bd1f589359f3d0582 Mon Sep 17 00:00:00 2001 From: guy Date: Tue, 6 Oct 2009 13:01:32 +0000 Subject: [PATCH] Patch level : 10.0 Files correlati : tp0.exe Ricompilazione Demo : [ ] Commento : Corretta gestione degli articoli il cui imballo sia costituito da materiali diversi come categoria CONAI git-svn-id: svn://10.65.10.50/trunk@19378 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- tp/tp0100.h | 1 + tp/tp0102.cpp | 161 ++++++++++++++++++++++++++++++------------- tp/tp_nomi_campi.txt | 36 ++++------ 3 files changed, 129 insertions(+), 69 deletions(-) diff --git a/tp/tp0100.h b/tp/tp0100.h index 4f149721b..35a2d5c06 100755 --- a/tp/tp0100.h +++ b/tp/tp0100.h @@ -108,6 +108,7 @@ class TCache_tp : public TCache protected: void log(const char* msg, int sev) const { _pt->log(msg, sev); } bool test_write(TLocalisamfile& file) const { return _pt->test_write(file); } + bool test_rewrite(TLocalisamfile& file) const { return _pt->test_rewrite(file); } const TRecordset& recordset() const { return _pt->recordset(); } TConfig& config() const { return _pt->config(); } const TString& query_header() const { return _pt->query_header(); } diff --git a/tp/tp0102.cpp b/tp/tp0102.cpp index 2154e9b32..d8e2a4fa2 100755 --- a/tp/tp0102.cpp +++ b/tp/tp0102.cpp @@ -23,31 +23,40 @@ public: const TString& conai_subclass(TCONAI_class cc) const { CHECK_CONAI(cc); return _conai_scat[cc]; } const real& conai_weight(TCONAI_class cc) const { CHECK_CONAI(cc); return _conai_peso[cc]; } + bool set_conai(TCONAI_class cc, const TString& scat, const real& weight); TArticolo_pack(const TRectype& anamag); TArticolo_pack(); }; -TArticolo_pack::TArticolo_pack(const TRectype& anamag) : TRectype(anamag) -{} +// Assegna sottocategoria e peso di una classe CONAI solo se non vuoti +bool TArticolo_pack::set_conai(TCONAI_class cc, const TString& scat, const real& weight) +{ + const bool ok = conai_configured_class(cc) && scat.full() && !weight.is_zero(); + if (ok) + { + _conai_scat[cc] = scat; + _conai_peso[cc] = weight; + } + return ok; +} -TArticolo_pack::TArticolo_pack() : TRectype(LF_ANAMAG) +TArticolo_pack::TArticolo_pack(const TRectype& anamag) : TRectype(anamag) { FOR_EACH_CONFIGURED_CONAI_CLASS(cc) { const TFieldref anamag_sotcat(conai_sottocat_name(cc, LF_ANAMAG), LF_ANAMAG); const TFieldref anamag_weight(conai_peso_name(cc, LF_ANAMAG), LF_ANAMAG); - const TString4 sotcat = anamag_sotcat.read(*this); - const real peso = anamag_weight.read(*this); - if (sotcat.full() && !peso.is_zero()) - { - _conai_scat[cc] = sotcat; - _conai_peso[cc] = peso; - } + const TString4 sotcat = anamag_sotcat.read(anamag); // Usually CA40 + const real peso = anamag_weight.read(anamag); // Should be > 0 + set_conai(cc, sotcat, peso); // Validates all parameters } } +TArticolo_pack::TArticolo_pack() : TRectype(LF_ANAMAG) +{ } + class TCache_art : public TCache_tp { TLocalisamfile _anamag; @@ -55,28 +64,30 @@ class TCache_art : public TCache_tp protected: virtual TObject* key2obj(const char* key); virtual const TString& decode(const TToken_string& tok); - bool get_extra_info(const char* key, TArticolo_pack& art) const; + int get_extra_info(const char* key, TArticolo_pack& art); public: const TArticolo_pack& articolo(); TCache_art(TPack_ddt* ddt) : TCache_tp(ddt), _anamag(LF_ANAMAG) {} }; -bool TCache_art::get_extra_info(const char* key, TArticolo_pack& art) const +int TCache_art::get_extra_info(const char* key, TArticolo_pack& art) { - TString qry(512); + TString qry(512), article_code; qry = query_header(); - qry << "SELECT Paper_Composition_Group.CompDesc, Mag_Existing_Article.ArticleCustCode\n" + qry << "SELECT Paper_Composition_Group.CompDesc, Mag_Existing_Article.ArticleCustCode, Mag_Existing_Article.ArticleCode\n" << "FROM Mag_Existing_Article, Articles_Composition, Paper_Composition_Group\n" << "WHERE (Mag_Existing_Article.ArtCode='" << key << "') AND " << "(Mag_Existing_Article.ArticleCode=Articles_composition.ArticleCode) AND " << "(Articles_Composition.CompCode=Paper_Composition_Group.CompCode);"; TODBC_recordset paperset(qry); - const bool ok = paperset.move_first(); - if (ok) + int info = paperset.move_first() ? 1 : 0; + if (info) { const TString pc = paperset.get(0u).as_string(); // Paper composition const TString cc = paperset.get(1).as_string(); // Customer code + article_code = paperset.get(2).as_string(); // ArticleCode for Articles_environmentTax + article_code.trim(); art.set_customer_code(cc); art.set_paper_composition(pc); if (cc.full()) @@ -103,19 +114,47 @@ bool TCache_art::get_extra_info(const char* key, TArticolo_pack& art) const } } - qry = query_header(); - qry << "SELECT ClassCode,Weight\n" - << "FROM Mag_Existing_Article, Articles_environmentTax\n" - << "WHERE (Mag_Existing_Article.ArtCode='" << key << "') AND " - << "(Mag_Existing_Article.ArticleCode=Articles_environmentTax.ArticleCode)"; - TODBC_recordset envtax(qry); - for (bool et = envtax.move_first(); et; et = envtax.move_next()) + if (article_code.full()) // Ho trovato un articolo di magazzino, carico CONAI info { - const TString& cc = envtax.get(0u).as_string(); - const real wkg = envtax.get(1).as_real(); - } + qry = query_header(); + qry << "SELECT SubclassCode,Weight\n" + << "FROM Articles_environmentTax\n" + << "WHERE Articles_environmentTax.ArticleCode=" << article_code << ';'; + TODBC_recordset envtax(qry); + for (bool et = envtax.move_first(); et; et = envtax.move_next()) + { + const TString& sc = envtax.get(0u).as_string(); + const real wkg = envtax.get(1).as_real(); + const TCONAI_class cc = conai_str2class(sc); + if (art.set_conai(cc, sc, wkg)) + info = 2; + } - return ok; + if (info == 2) // Ho trovato dati sul CONAI + { + bool update = false; + FOR_EACH_CONFIGURED_CONAI_CLASS(cc) + { + const TFieldref anamag_sotcat(conai_sottocat_name(cc, LF_ANAMAG), LF_ANAMAG); + const TFieldref anamag_weight(conai_peso_name(cc, LF_ANAMAG), LF_ANAMAG); + const TString4 sotcat = anamag_sotcat.read(art); + const TString8 peso = anamag_weight.read(art); // Faccio i confronti su stringa per evitare decimali impazziti + if (sotcat != art.conai_subclass(cc) || peso != art.conai_weight(cc).string()) + { + anamag_sotcat.write(art.conai_subclass(cc), art); + anamag_weight.write(art.conai_weight(cc).string(), art); + update = true; + } + } + if (update) // Aggiorno anagrafica se necessario + { + _anamag.curr() = art; + test_rewrite(_anamag); + } + } + } + + return info; } TObject* TCache_art::key2obj(const char* key) @@ -125,6 +164,7 @@ TObject* TCache_art::key2obj(const char* key) return new TArticolo_pack; // Articolo nullo _anamag.put(ANAMAG_CODART, key); + if (_anamag.read() != NOERR) { _anamag.zero(); @@ -132,12 +172,23 @@ TObject* TCache_art::key2obj(const char* key) const TString& desc = get_str("ArtDesc"); _anamag.put(ANAMAG_DESCR, desc); - const TString& conai_class = get_str("ClassCode"); - if (conai_class.full()) + TString4 conai_class = get_str("SubclassCode"); + if (conai_class.blank()) { - const TString& conai_field = config().get(conai_class, "CONAI"); - if (conai_field.full()) - _anamag.put(conai_field, get_real_str("WeightETUnit")); + conai_class = get_str("ClassCode"); + if (conai_class.full()) + conai_class << 99; + } + + // Basic CONAI info + const TCONAI_class cc = conai_str2class(conai_class); + if (conai_configured_class(cc)) + { + const TFieldref fld_sc(conai_sottocat_name(cc, LF_ANAMAG), LF_ANAMAG); + fld_sc.write(conai_class, _anamag.curr()); + + const TFieldref fld_wt(conai_peso_name(cc, LF_ANAMAG), LF_ANAMAG); + fld_wt.write(get_real_str("WeightETUnit"), _anamag.curr()); } const long gruconto = get_long("AccountCode"); @@ -149,7 +200,7 @@ TObject* TCache_art::key2obj(const char* key) } TArticolo_pack* art = new TArticolo_pack(_anamag.curr()); - get_extra_info(key, *art); // CustomerCode e PaperComposition + get_extra_info(key, *art); // CustomerCode, PaperComposition, CONAI infos return art; } @@ -706,7 +757,7 @@ bool TPack_ddt::trasferisci() // Copia tutte le sottocategorie CONAI dall'anagrafica alla riga documento real peso_imballo_anamag; int pesi_anamag = 0; - FOR_EACH_CONAI_CLASS(cc) + FOR_EACH_CONFIGURED_CONAI_CLASS(cc) { const TString& cs = art.conai_subclass(cc); // Codice sottocategoria su ANAMAG if (cs.full()) // la presenza della sottoclasse implica anche un peso positivo @@ -722,27 +773,41 @@ bool TPack_ddt::trasferisci() } // La sottocategoria della bolla prevale su quella anagrafica impostata sopra - const TString& conai_class = get_str("ClassCode"); - const TCONAI_class ct = conai_str2class(conai_class); - const TString& conai_subclass = get_str("SubclassCode"); - rdoc.put(conai_sottocat_name(ct, LF_RIGHEDOC), conai_subclass); + const TString4 conai_subclass = get_str("SubclassCode"); + const TCONAI_class ct = conai_str2class(conai_subclass); + if (ct == CONAI_CARTA && conai_subclass.len() == 4) + rdoc.put(conai_sottocat_name(ct, LF_RIGHEDOC), conai_subclass); - const real peso_imballo_ddt = get_real_str("WeightETUnit"); - // Con imballi composti da vari materiali devo riproporzionare - if (pesi_anamag > 1 && peso_imballo_ddt != peso_imballo_anamag && !peso_imballo_ddt.is_zero()) + real peso_imballo_ddt = get_real_str("WeightETUnit"); + if (peso_imballo_ddt.is_zero()) + peso_imballo_ddt = peso_imballo_anamag; + + if (pesi_anamag > 1) // Con imballi composti da vari materiali devo riportare o riproporzionare { - TGeneric_distrib d(peso_imballo_ddt, 3); - FOR_EACH_CONFIGURED_CONAI_CLASS(cc) - d.add(art.conai_weight(cc)); - FOR_EACH_CONFIGURED_CONAI_CLASS(cc) - rdoc.put(conai_peso_name(cc), d.get()); + // Arrotondo la eventuale differenza di pesi al grammo + real diff = peso_imballo_ddt - peso_imballo_anamag; diff.round(3); + // Il peso in bolla e' diverso da quello in anagrafica: devo riproporzionarli + if (!diff.is_zero() && !peso_imballo_ddt.is_zero()) + { + TGeneric_distrib d(peso_imballo_ddt, 3); + FOR_EACH_CONFIGURED_CONAI_CLASS(cc) + d.add(art.conai_weight(cc)); + FOR_EACH_CONFIGURED_CONAI_CLASS(cc) + rdoc.put(conai_peso_name(cc), d.get()); + } + else + { + // Il peso in bolla coincide con quello in anagrafica: devo riportarli + FOR_EACH_CONFIGURED_CONAI_CLASS(cc) + rdoc.put(conai_peso_name(cc), art.conai_weight(cc)); + } } else { // Caso semplice della sola carta - rdoc.put(conai_peso_name(ct), peso_imballo_ddt); + rdoc.put(conai_peso_name(CONAI_CARTA), peso_imballo_ddt); } - + rdoc.put("FAMILY", get_str("FamilyCode")); // Uso campo virtuale RG1:FAMILY } diff --git a/tp/tp_nomi_campi.txt b/tp/tp_nomi_campi.txt index 635c527e8..8a20529b8 100755 --- a/tp/tp_nomi_campi.txt +++ b/tp/tp_nomi_campi.txt @@ -1,7 +1,7 @@ Nomi dei campi per il CONAI --------------------------- -Nomi campi in configurazione (conai_conf_names) +Nomi campi in configurazione: bool conai_configured_class(TCONAI_class cc) ----------------------------------------------- Si trovano nel ditta.ini, paragrafo [ve] @@ -13,7 +13,7 @@ CONFLEG CONFVET -Nomi campi sottocategorie CONAI in righe documento (conai_scat_rdoc) +Nomi campi sottocategorie CONAI: const char* conai_sottocat_name(TCONAI_class cc, int logic_num); -------------------------------------------------------------------- Si trovano nei campi virtuali del file 34 RDOC @@ -24,22 +24,7 @@ CONSCPLA CONSCLEG CONSCVET - -Nomi campi pesi unitari CONAI in righe documento (conai_peso_rdoc) --------------------------------------------------------------------- -Si trovano nei campi virtuali del file 34 RDOC - -CONPUACC -CONPUALL -CONPUCAR -CONPUPLA -CONPULEG -CONPUVET - - -Nomi campi sottocategorie CONAI in anagrafica articoli (conai_scat_anamag) --------------------------------------------------------------------------- -E' un campo solo diviso a stringhe di 4: si trova nel file 47 ANAMAG +Si trovano anche come sottoscringhe del campo CONAISC del file 47 ANAMAG CONAISC[1,4] acciaio CONAISC[5,8] alluminio @@ -49,9 +34,9 @@ CONAISC[17,20] legno CONAISC[21,24] vetro -Nomi campi pesi unitari CONAI in anagrafica articoli (conai_peso_anamag) ------------------------------------------------------------------------- -Si trovano nei campi del file 47 ANAMAG +Nomi campi pesi unitari CONAI: const char* conai_peso_name(TCONAI_class cc, int logic_num); +-------------------------------------------------------------------- +Si trovano nei campi fisici file 47 ANAMAG CONACC CONALL @@ -60,4 +45,13 @@ CONPLA CONLEG CONVET +Si trovano anche nei campi virtuali del file 34 RDOC + +CONPUACC +CONPUALL +CONPUCAR +CONPUPLA +CONPULEG +CONPUVET +