Continua il tremendo sviluppo del ricalcolo di magazzino.

CV: ----------------------------------------------------------------------


git-svn-id: svn://10.65.10.50/trunk@3430 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1996-08-23 13:01:51 +00:00
parent 60fa7010c1
commit a1c00c753f
3 changed files with 478 additions and 80 deletions

View File

@ -1,7 +1,10 @@
#include <applicat.h>
#include <expr.h>
#include <msksheet.h>
#include <progind.h>
#include <relation.h>
#include <stack.h>
#include <tabutil.h>
#include <urldefid.h>
#include <viswin.h>
@ -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;
}

View File

@ -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

View File

@ -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