diff --git a/ve/ve4100.cpp b/ve/ve4100.cpp index 33b88ef65..b897e4880 100755 --- a/ve/ve4100.cpp +++ b/ve/ve4100.cpp @@ -1,7 +1,10 @@ #include #include #include +#include #include +#include +#include #include #include @@ -9,21 +12,67 @@ #include "ve4100.h" /////////////////////////////////////////////////////////// -// Ciclo principale di elaborazione +// TTable_expression /////////////////////////////////////////////////////////// - -bool elabora(TCursor& cur, TString_array& var) -{ - TViswin vw("ve4100.txt", "Ricalcolo valori", - FALSE, TRUE, FALSE, 3, 3, -3, -3, FALSE); - - for (cur = 0; cur.ok(); ++cur) - { +class TTable_expression : public TExpression +{ + static TAssoc_array _expr; + void load_expr(); + +protected: + virtual void evaluate_user_func(const char* name, int nparms, TStack& stack) const; + +public: + TTable_expression(TTypeexp t) : TExpression(t) { } + TTable_expression(const char* expr, TTypeexp t) : TExpression(expr, t) { } + virtual ~TTable_expression() { } +}; + +TAssoc_array TTable_expression::_expr; + +void TTable_expression::load_expr() +{ + if (_expr.items() == 0) + { + TString n(15), e(127); + TTable expr("%FRM"); + for (expr.first(); !expr.eof(); expr.next()) + { + n = expr.get("CODTAB"); + e = expr.get("S1"); + e << expr.get("S2"); + const TTypeexp t = expr.get_bool("B0") ? _numexpr : _strexpr; + _expr.add(n, new TTable_expression(e, t)); + } } - - return TRUE; -} +} + +void TTable_expression::evaluate_user_func(const char* name, int nparms, TStack& stack) const +{ + TTable_expression* expr = (TTable_expression*)_expr.objptr(name); + if (expr == NULL) + { + TExpression::evaluate_user_func(name, nparms, stack); + return; + } + + TString var; + for (int v = expr->numvar()-1; v >= 0; v--) + { + var = expr->varname(v); var.upper(); + if (var[0] == '_') // Parametro della funzione + { + const int n = atoi(var.mid(2,0)); + CHECKS(var[1] == 'P' && n > 0 && n <= nparms, "Parametro errato ", (const char*)var); + expr->setvar(var, (TString&)stack.peek(nparms-n)); + } + } + + // Vuota lo stack + for (v = nparms; v > 0; v--) + stack.pop(); +} /////////////////////////////////////////////////////////// // Maschera ricalcolo di magazzino @@ -35,28 +84,36 @@ class TRicalcolo_mask : public TMask int _cur_file; TToken_string _key_expr; + TRelation* _relation; + TCursor* _cursor; + protected: static bool file_handler (TMask_field& f, KEY k); static bool key_handler (TMask_field& f, KEY k); static bool filter_handler(TMask_field& f, KEY k); static bool field_handler (TMask_field& f, KEY k); static bool fromto_handler(TMask_field& f, KEY k); - -public: + + bool gestione_um(char tipo) const; TRelation& get_rel() const; const TRectype& get_rec() const; const RecDes* get_rec_des() const; - TToken_string& get_key_expr(int k); + TToken_string& get_key_expr(int k); + + TRelation& create_relation(); + TCursor& create_cursor(); +public: + bool elabora(); + TRicalcolo_mask(); virtual ~TRicalcolo_mask() { } }; TRicalcolo_mask::TRicalcolo_mask() - : TMask("ve4100"), _cur_file(0) + : TMask("ve4100"), _cur_file(0), _relation(NULL), _cursor(NULL) { - const int lf[] = { LF_ANAMAG, LF_CODCORR, LF_UMART, - LF_DESLIN, LF_CONDV, LF_RCONDV, 0 }; + const int lf[] = { LF_ANAMAG, LF_UMART, LF_DESLIN, LF_CONDV, LF_RCONDV, 0 }; for (int i = 0; lf[i]; i++) { TRelation* rel = new TRelation(lf[i]); @@ -113,6 +170,206 @@ TToken_string& TRicalcolo_mask::get_key_expr(int key) return _key_expr; } +bool TRicalcolo_mask::gestione_um(char tipo) const +{ + const char* const lco = "LCO"; + for (int i = 0; i < 3 && toupper(tipo) != lco[i]; i++); + TConfig ve(CONFIG_DITTA, "ve"); + return ve.get_bool("GESUM", NULL, i+1); +} + +TRelation& TRicalcolo_mask::create_relation() +{ + const int logicnum = get_rec().num(); // Numero logico del file principale + + if (_relation) + delete _relation; + _relation = new TRelation(logicnum); + + const TString& unita_misura = get(F_UNITA_MISURA); + const TString& lingua = get(F_LINGUA); + + const TString& tipo_lco = get(F_TIPO_LCO); // Listini, contratti, offerte + const TString& cat_ven = get(F_CAT_VEN); + const TString& tipo_cf = get(F_TIPO_CF); + const TString& codice_cf = get(F_CODICE_CF); + const TString& codice_lco = get(F_CODICE_LCO); + + TString condv_expr; + if (cat_ven.not_empty() && codice_cf.not_empty() && codice_lco.not_empty()) + { + condv_expr << "TIPO=\"" << tipo_lco << '"'; + condv_expr << "|CATVEN=\"" << cat_ven << '"'; + condv_expr << "|TIPOCF=\"" << tipo_cf << '"'; + condv_expr << "|CODCF=\"" << codice_cf << '"'; + condv_expr << "|COD=\"" << codice_lco << '"'; + } + + TString expr(48); + + switch (logicnum) + { + case LF_ANAMAG: + { + expr = "CODART=CODART"; + if (unita_misura.not_empty()) + { + expr << "|UM=\"" << unita_misura << '"'; + _relation->add(LF_UMART, expr, 2); + } + else + _relation->add(LF_UMART, expr, 1); + + if (lingua.not_empty()) + { + expr = "CODART=CODART"; + expr << "|CODLIN=\"" << lingua << '"'; + _relation->add(LF_DESLIN, expr, 2); + } + + if (condv_expr.not_empty()) + { + _relation->add(LF_CONDV, condv_expr, 1); + + if (unita_misura.not_empty()) + { + expr = condv_expr; + expr << "|TIPORIGA=\"A\""; + expr << "|CODRIGA=CODART"; + expr << "|UM=\"" << unita_misura << '"'; + _relation->add(LF_RCONDV, expr, 1); + } + } + } + break; + case LF_UMART: + { + _relation->add(LF_ANAMAG, "CODART=CODART", 1); + + if (lingua.not_empty()) + { + expr = "CODART=CODART"; + expr << "|CODLIN=\"" << lingua << '"'; + _relation->add(LF_DESLIN, expr, 2); + } + + if (condv_expr.not_empty()) + { + _relation->add(LF_CONDV, condv_expr, 1); + expr = condv_expr; + expr << "|TIPORIGA=\"A\""; + expr << "|CODRIGA=CODART"; + expr << "|UM=UM"; + _relation->add(LF_RCONDV, expr, 1); + } + } + break; + case LF_DESLIN: + { + _relation->add(LF_ANAMAG, "CODART=CODART", 1); + + expr = "CODART=CODART"; + if (unita_misura.not_empty()) + { + expr << "|UM=\"" << unita_misura << '"'; + _relation->add(LF_UMART, expr, 2); + } + else + _relation->add(LF_UMART, expr, 1); + + if (condv_expr.not_empty()) + { + _relation->add(LF_CONDV, condv_expr, 1); + + if (unita_misura.not_empty()) + { + expr = condv_expr; + expr << "|TIPORIGA=\"A\""; + expr << "|CODRIGA=CODART"; + expr << "|UM=\"" << unita_misura << '"'; + } + } + } + break; + case LF_RCONDV: + { + _relation->add(LF_ANAMAG, "CODRIGA=CODART", 1); + + if (gestione_um(tipo_lco[0])) + _relation->add(LF_UMART, "CODRIGA=CODART|UM=UM", 2); + + if (lingua.not_empty()) + { + expr = "CODRIGA=CODART"; + expr << "|CODLIN=\"" << lingua << '"'; + _relation->add(LF_DESLIN, expr, 2); + } + + _relation->add(LF_RCONDV, "TIPO=TIPO|CATVEN=CATVEN|TIPOCF=TIPOCF|CODCF=CODCF|COD=COD", 1); + } + break; + default: + break; + } + return *_relation; +} + +TCursor& TRicalcolo_mask::create_cursor() +{ + TString filter = get(F_FILTER); filter.strip("\n"); + + int key = get_int(F_KEY); + + TRectype start(get_rec()), stop(get_rec()); + start.zero(); stop.zero(); + + TToken_string& key_des = get_key_expr(key); + + TSheet_field& fs = (TSheet_field&)field(F_FIELDS); + TString field, val; + bool key_seq = key > 0; // I primi campi corrispondono alla chiave selezionata? + + for (int r = 0; r < fs.items(); r++) + { + TToken_string& row = fs.row(r); + field = row.get(0); + if (field.not_empty()) + { + if (key_seq && key_des.get_pos(field) == r) + { + val = row.get(); + if (val.not_empty()) start.put(field, val); + val = row.get(); + if (val.not_empty()) stop.put(field, val); + } + else + { + key_seq = FALSE; + val = row.get(); + if (val.not_empty()) + { + if (filter.not_empty()) filter << "&&"; + filter << '(' << field << ">=" << val << ')'; + } + val = row.get(); + if (val.not_empty()) + { + if (filter.not_empty()) filter << "&&"; + filter << '(' << field << "<=" << val << ')'; + } + } + } + } + + if (key <= 0) + key = 1; + + if (_cursor) + delete _cursor; + _cursor = new TCursor(&create_relation(), filter, key, &start, &stop); + return *_cursor; +} + bool TRicalcolo_mask::file_handler(TMask_field& f, KEY k) { TRicalcolo_mask& m = (TRicalcolo_mask&)f.mask(); @@ -153,6 +410,7 @@ bool TRicalcolo_mask::key_handler(TMask_field& f, KEY k) const int cur_key = atoi(f.get()); TToken_string& key_expr = m.get_key_expr(cur_key); const bool empty = key_expr.empty_items(); + bool enable_first_row = TRUE; TSheet_field& sheet = (TSheet_field&)m.field(F_FIELDS); TString_array& sa = sheet.rows_array(); @@ -170,7 +428,10 @@ bool TRicalcolo_mask::key_handler(TMask_field& f, KEY k) const int r = sa.add(field); sa.row(r).add(des.get_field_description(field), F_DESCR-F_FIELD); } - } + if (des.file_num() == LF_CONDV || des.file_num() == LF_RCONDV) + enable_first_row = FALSE; + } + sheet.enable_cell(0, -1, enable_first_row); sheet.force_update(); } return TRUE; @@ -254,9 +515,9 @@ bool TRicalcolo_mask::fromto_handler(TMask_field& f, KEY k) const int max = rec.length(field); if (f.get().len() > max) { - TString msg(32); msg = "Inserire al massimo "; + TString msg(32); msg = "Inserire "; if (max > 1) msg << max; else msg << "un"; - msg << " caratter" << (max > 1 ? 'i' : 'e') << '.'; + msg << " caratter" << (max > 1 ? 'i' : 'e') << " al massimo."; ok = f.error_box(msg); } } @@ -264,12 +525,36 @@ bool TRicalcolo_mask::fromto_handler(TMask_field& f, KEY k) return ok; } +/////////////////////////////////////////////////////////// +// Ciclo principale di elaborazione +/////////////////////////////////////////////////////////// + +bool TRicalcolo_mask::elabora() +{ + TIndwin iw(48, "Inizializzazione ...", TRUE, FALSE, 48); + begin_wait(); + + TCursor& cur = create_cursor(); + + TViswin vw("ve4100.txt", "Ricalcolo valori", + FALSE, TRUE, FALSE, 3, 3, -3, -3, FALSE); + + for (cur = 0; cur.ok(); ++cur) + { + } + + end_wait(); + return TRUE; +} + + /////////////////////////////////////////////////////////// // Ricalcolo di magazzino /////////////////////////////////////////////////////////// class TRicalcola_application : public TApplication -{ +{ +protected: virtual bool menu(MENU_TAG); virtual bool create(); @@ -288,57 +573,8 @@ bool TRicalcola_application::menu(MENU_TAG) { TRicalcolo_mask m; while (m.run() == K_ENTER) - { - TString filter = m.get(F_FILTER); filter.strip("\n"); - - int key = m.get_int(F_KEY); - - TRectype start(m.get_rec()), stop(m.get_rec()); - start.zero(); stop.zero(); - - TToken_string& key_des = m.get_key_expr(key); - - TSheet_field& fs = (TSheet_field&)m.field(F_FIELDS); - TString field, val; - for (int r = 0; r < fs.items(); r++) - { - TToken_string& row = fs.row(r); - field = row.get(0); - if (field.not_empty()) - { - if (key > 0 && key_des.get_pos(field) >= 0) - { - val = row.get(); - if (val.not_empty()) start.put(field, val); - val = row.get(); - if (val.not_empty()) stop.put(field, val); - } - else - { - val = row.get(); - if (val.not_empty()) - { - if (filter.not_empty()) filter << "&&"; - filter << '(' << field << ">=" << val << ')'; - } - val = row.get(); - if (val.not_empty()) - { - if (filter.not_empty()) filter << "&&"; - filter << '(' << field << "<=" << val << ')'; - } - } - } - } - - if (key <= 0) - key = 1; - - TSheet_field& osf = (TSheet_field&)m.field(F_OUTPUTS); - TCursor cur(&m.get_rel(), filter, key, - start.empty() ? NULL : &start, stop.empty() ? NULL : &stop); - elabora(cur, osf.rows_array()); - } + m.elabora(); + return FALSE; } diff --git a/ve/ve4100.h b/ve/ve4100.h index 3e83d2774..13bdf9eed 100755 --- a/ve/ve4100.h +++ b/ve/ve4100.h @@ -5,6 +5,19 @@ #define F_FILTER 104 #define F_OUTPUTS 105 #define F_SAVE 106 + +#define F_UNITA_MISURA 201 +#define F_DESC_UNITA_MISURA 202 +#define F_LINGUA 203 +#define F_DESC_LINGUA 204 +#define F_TIPO_LCO 205 +#define F_CAT_VEN 206 +#define F_DESC_CAT_VEN 207 +#define F_TIPO_CF 208 +#define F_CODICE_CF 209 +#define F_RAGSOC 210 +#define F_CODICE_LCO 211 +#define F_DESC_CODICE_LCO 212 // Primo sheet #define F_FIELD 101 diff --git a/ve/ve4100.uml b/ve/ve4100.uml index 01e615173..ccfaabf18 100755 --- a/ve/ve4100.uml +++ b/ve/ve4100.uml @@ -14,7 +14,7 @@ END ENDPAGE -PAGE "Ricalcolo valori magazzino" -1 -1 78 16 +PAGE "Parametri di calcolo" -1 -1 78 16 GROUPBOX DLG_NULL 76 12 BEGIN @@ -23,13 +23,12 @@ END LIST F_FILE 32 BEGIN - PROMPT 2 2 "File " + PROMPT 2 2 "File " ITEM "0|Anagrafica magazzino" - ITEM "1|Codici corrispondenti" - ITEM "2|Unita' di misura" - ITEM "3|Descrizioni in lingua" - ITEM "4|Condizioni di vendita" - ITEM "5|Righe condizioni di vendita" + ITEM "1|Unita' di misura" + ITEM "2|Descrizioni in lingua" + ITEM "3|Condizioni di vendita" + ITEM "4|Righe condizioni di vendita" END LIST F_KEY 10 @@ -77,6 +76,156 @@ END ENDPAGE +PAGE "Parametri di collegamento" -1 -1 78 16 + +GROUPBOX DLG_NULL 78 4 +BEGIN + PROMPT 1 1 "Generali" +END + +STRING F_UNITA_MISURA 2 +BEGIN + PROMPT 2 2 "Unita' di misura " + FLAGS "U" + USE %UMS + JOIN %LIN INTO CODTAB==CODTAB + INPUT CODTAB F_UNITA_MISURA + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_UNITA_MISURA CODTAB + OUTPUT F_DESC_UNITA_MISURA S0 + CHECKTYPE NORMAL +END + +STRING F_DESC_UNITA_MISURA 50 +BEGIN + PROMPT 25 2 "" + USE %UMS KEY 2 + INPUT S0 F_DESC_UNITA_MISURA + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_UNITA_MISURA + CHECKTYPE NORMAL +END + +STRING F_LINGUA 1 +BEGIN + PROMPT 2 3 "Lingua " + FLAGS "U" + USE %LIN + INPUT CODTAB F_LINGUA + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_LINGUA CODTAB + OUTPUT F_DESC_LINGUA S0 + CHECKTYPE NORMAL +END + +STRING F_DESC_LINGUA 50 +BEGIN + PROMPT 25 3 "" + USE %LIN KEY 2 + INPUT S0 F_DESC_LINGUA + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_LINGUA + CHECKTYPE NORMAL +END + +GROUPBOX DLG_NULL 78 10 +BEGIN + PROMPT 1 5 "Condizioni di vendita" +END + +LIST F_TIPO_LCO 1 10 +BEGIN + PROMPT 2 6 "Condizioni per " + ITEM "L|Listini" + ITEM "C|Contratti" + ITEM "O|Offerte" +END + +STRING F_CAT_VEN 4 +BEGIN + PROMPT 2 7 "Categoria " + FLAGS "U" + USE CVE + INPUT CODTAB F_CAT_VEN + DISPLAY "Codice" + DISPLAY "Descrizione@50" + OUTPUT F_CAT_VEN CODTAB + OUTPUT F_DESC_CAT_VEN S0 + CHECKTYPE NORMAL +END + +STRING F_DESC_CAT_VEN 50 +BEGIN + PROMPT 25 7 "" + USE CVE KEY 2 + INPUT S0 F_DESC_CAT_VEN + DISPLAY "Descrizione@50" + DISPLAY "Codice" + COPY OUTPUT F_CAT_VEN + CHECKTYPE NORMAL +END + +RADIOBUTTON F_TIPO_CF 1 16 +BEGIN + PROMPT 2 7 "" + ITEM "C|Cliente" + ITEM "F|Fornitore" +END + +NUMBER F_CODICE_CF 6 +BEGIN + PROMPT 18 8 "Codice " + USE LF_CLIFO + INPUT TIPOCF F_TIPO_CF SELECT + INPUT CODCF F_CODICE_CF + DISPLAY "Codice" CODCF + DISPLAY "Descrizione@50" RAGSOC + OUTPUT F_CODICE_CF CODCF + OUTPUT F_RAGSOC RAGSOC + CHECKTYPE NORMAL +END + +NUMBER F_RAGSOC 50 +BEGIN + PROMPT 25 9 "" + USE LF_CLIFO KEY 2 + INPUT TIPOCF F_TIPO_CF SELECT + INPUT RAGSOC F_RAGSOC + DISPLAY "Ragione sociale@50" RAGSOC + DISPLAY "Codice" CODCF + COPY OUTPUT F_CODICE_CF + CHECKTYPE NORMAL +END + +STRING F_CODICE_LCO 3 +BEGIN + PROMPT 2 10 "Lis/Con/Off " + FLAGS "U" + USE LF_CONDV + INPUT TIPO F_TIPO_LCO SELECT + INPUT CATVEN F_CAT_VEN SELECT + INPUT TIPOCF F_TIPO_CF SELECT + INPUT CODCF F_CODICE_CF SELECT + INPUT COD F_CODICE_LCO + DISPLAY "Codice" COD + DISPLAY "Descrizione@50" DESCR + OUTPUT F_CODICE_LCO COD + OUTPUT F_DESC_CODICE_LCO DESCR + CHECKTYPE NORMAL +END + +STRING F_DESC_CODICE_LCO 50 +BEGIN + PROMPT 25 10 "" + FLAGS "D" +END + +ENDPAGE + ENDMASK PAGE "Fields" -1 -1 60 6