f*.trr f*.dir Aggiornati tracciati distinta base
db*.* Aggiunto programma per immissione distinta base Patch level : Files correlati : Ricompilazione Demo : [ ] Commento : git-svn-id: svn://10.65.10.50/trunk@6821 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
415acc996b
commit
719ef4a1fb
14
db/db0.cpp
Executable file
14
db/db0.cpp
Executable file
@ -0,0 +1,14 @@
|
||||
#include <xvt.h>
|
||||
|
||||
#include "db0.h"
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
int n = argc > 1 ? atoi(argv[1]+1) : 0;
|
||||
switch(n)
|
||||
{
|
||||
default: db0100(argc, argv); break;
|
||||
}
|
||||
exit(0);
|
||||
return 0;
|
||||
}
|
6
db/db0.h
Executable file
6
db/db0.h
Executable file
@ -0,0 +1,6 @@
|
||||
#ifndef __DB0_H
|
||||
#define __DB0_H
|
||||
|
||||
int db0100(int argc, char* argv[]);
|
||||
|
||||
#endif
|
2
db/db0.url
Executable file
2
db/db0.url
Executable file
@ -0,0 +1,2 @@
|
||||
#include <default.url>
|
||||
|
742
db/db0100.cpp
Executable file
742
db/db0100.cpp
Executable file
@ -0,0 +1,742 @@
|
||||
#include <automask.h>
|
||||
#include <expr.h>
|
||||
#include <recarray.h>
|
||||
#include <relapp.h>
|
||||
#include <tabutil.h>
|
||||
#include <tree.h>
|
||||
#include <urldefid.h>
|
||||
|
||||
#include "../mg/anamag.h"
|
||||
#include "../mg/umart.h"
|
||||
|
||||
#include "db0100a.h"
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// Funzione di richiesta stringa che andra' in libreria
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
bool query_string(const char* prompt, TString& str, int width = 50, const char* flags= "")
|
||||
{
|
||||
int maskwidth = width+2;
|
||||
if (maskwidth < 26) maskwidth = 26;
|
||||
TMask m(prompt, 1, maskwidth, 5);
|
||||
m.add_string(DLG_USER, 0, "", 1, 1, width, flags);
|
||||
m.add_button(DLG_CANCEL, 0, "", -12, -1, 10, 2);
|
||||
m.add_button(DLG_OK, 0, "", -22, -1, 10, 2);
|
||||
m.set(DLG_USER, str);
|
||||
bool ok = m.run() == K_ENTER;
|
||||
if (ok)
|
||||
str = m.get(DLG_USER);
|
||||
return ok;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TDistinta_expr
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TDistinta_expr : public TExpression
|
||||
{
|
||||
protected:
|
||||
virtual bool print_error(const char* msg) const;
|
||||
|
||||
public:
|
||||
TDistinta_expr();
|
||||
virtual ~TDistinta_expr() { }
|
||||
};
|
||||
|
||||
bool TDistinta_expr::print_error(const char* msg) const
|
||||
{
|
||||
return error_box(msg);
|
||||
}
|
||||
|
||||
TDistinta_expr::TDistinta_expr()
|
||||
: TExpression(_numexpr, FALSE)
|
||||
{
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TDistinta_tree
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TDistinta_tree : public TBidirectional_tree
|
||||
{
|
||||
TLocalisamfile* _rdist;
|
||||
TString _root;
|
||||
TToken_string _path;
|
||||
|
||||
protected:
|
||||
|
||||
TLocalisamfile& file() const;
|
||||
void add_child();
|
||||
void kill_child();
|
||||
bool is_cyclic() const;
|
||||
|
||||
virtual void node2id(const TObject* node, TString& id) const;
|
||||
|
||||
public:
|
||||
virtual bool goto_root();
|
||||
virtual bool goto_firstson();
|
||||
virtual bool goto_rbrother();
|
||||
virtual bool goto_node(const TString &id);
|
||||
virtual bool has_son() const;
|
||||
virtual bool has_rbrother() const;
|
||||
virtual bool has_root() const;
|
||||
virtual bool has_father() const;
|
||||
virtual bool has_lbrother() const;
|
||||
virtual bool goto_father();
|
||||
virtual bool goto_lbrother();
|
||||
virtual bool get_description(TString& desc) const;
|
||||
virtual TImage* image(bool selected) const;
|
||||
virtual TObject* curr_node() const;
|
||||
|
||||
bool set_root(const char* str);
|
||||
long find_node(const char* str, word flags = SCAN_PRE_ORDER);
|
||||
|
||||
TDistinta_tree();
|
||||
virtual ~TDistinta_tree();
|
||||
};
|
||||
|
||||
TLocalisamfile& TDistinta_tree::file() const
|
||||
{
|
||||
if (_rdist == NULL)
|
||||
((TDistinta_tree*)this)->_rdist = new TLocalisamfile(LF_RDIST);
|
||||
return *_rdist;
|
||||
}
|
||||
|
||||
bool TDistinta_tree::goto_node(const TString &id)
|
||||
{
|
||||
_path = id;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
struct TFind_node_data
|
||||
{
|
||||
TString _id;
|
||||
long _count;
|
||||
};
|
||||
|
||||
HIDDEN bool find_node_callback(TTree& tree, void* jolly, word flags)
|
||||
{
|
||||
if (flags == SCAN_PRE_ORDER)
|
||||
{
|
||||
TFind_node_data& data = *(TFind_node_data*)jolly;
|
||||
data._count++;
|
||||
TToken_string id; tree.curr_id(id);
|
||||
if (data._id == id.get(-2))
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
long TDistinta_tree::find_node(const char* str, word flags)
|
||||
{
|
||||
if (goto_root())
|
||||
{
|
||||
TFind_node_data fnd;
|
||||
fnd._id = str;
|
||||
fnd._count = 0;
|
||||
if (scan_breadth_first(find_node_callback, &fnd, flags))
|
||||
return fnd._count;
|
||||
}
|
||||
return 0L;
|
||||
}
|
||||
|
||||
void TDistinta_tree::node2id(const TObject* node, TString& id) const
|
||||
{
|
||||
id = *(TToken_string*)node;
|
||||
}
|
||||
|
||||
TObject* TDistinta_tree::curr_node() const
|
||||
{
|
||||
return &((TDistinta_tree*)this)->_path;
|
||||
}
|
||||
|
||||
bool TDistinta_tree::get_description(TString& desc) const
|
||||
{
|
||||
_path.get(-2, desc);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
TImage* TDistinta_tree::image(bool selected) const
|
||||
{
|
||||
TImage* img;
|
||||
if (is_cyclic())
|
||||
img = get_res_image(BMP_STOP);
|
||||
else
|
||||
img = TBidirectional_tree::image(selected);
|
||||
return img;
|
||||
}
|
||||
|
||||
bool TDistinta_tree::set_root(const char* str)
|
||||
{
|
||||
TLocalisamfile dist(LF_DIST);
|
||||
dist.put("CODDIST", str);
|
||||
const bool ok = dist.read() == NOERR;
|
||||
if (ok)
|
||||
{
|
||||
_root = str;
|
||||
shrink_all();
|
||||
goto_root();
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool TDistinta_tree::has_root() const
|
||||
{
|
||||
return _root.not_empty();
|
||||
}
|
||||
|
||||
bool TDistinta_tree::goto_root()
|
||||
{
|
||||
const bool ok = has_root();
|
||||
if (ok)
|
||||
_path = _root;
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool TDistinta_tree::is_cyclic() const
|
||||
{
|
||||
bool cyclic = FALSE;
|
||||
const int last = _path.items()-1;
|
||||
if (last >= 2)
|
||||
{
|
||||
TString80 mycod; _path.get(last, mycod);
|
||||
TString80 cod;
|
||||
for (int i = last-2; i >= 0; i -= 2)
|
||||
{
|
||||
_path.get(i, cod);
|
||||
if (cod == mycod)
|
||||
{
|
||||
cyclic = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return cyclic;
|
||||
}
|
||||
|
||||
bool TDistinta_tree::has_son() const
|
||||
{
|
||||
if (is_cyclic())
|
||||
return FALSE;
|
||||
TString80 cod; _path.get(-2, cod);
|
||||
file().put("CODDIST", cod);
|
||||
file().put("NRIG", 1);
|
||||
return file().read() == NOERR;
|
||||
}
|
||||
|
||||
|
||||
void TDistinta_tree::add_child()
|
||||
{
|
||||
_path.add(file().get("NRIG"));
|
||||
_path.add(file().get("CODCOMP"));
|
||||
}
|
||||
|
||||
void TDistinta_tree::kill_child()
|
||||
{
|
||||
for (int n = 0; n < 2; n++)
|
||||
{
|
||||
const int pipe = _path.rfind('|');
|
||||
_path.cut(pipe);
|
||||
}
|
||||
}
|
||||
|
||||
bool TDistinta_tree::goto_firstson()
|
||||
{
|
||||
const bool ok = has_son();
|
||||
if (ok)
|
||||
add_child();
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool TDistinta_tree::has_rbrother() const
|
||||
{
|
||||
const int items = _path.items();
|
||||
if (items < 3)
|
||||
return FALSE;
|
||||
|
||||
TString80 str;
|
||||
_path.get(items-2, str);
|
||||
const int brother = atoi(str)+1;
|
||||
_path.get(items-3, str);
|
||||
file().put("CODDIST", str);
|
||||
file().put("NRIG", brother);
|
||||
return file().read() == NOERR;
|
||||
}
|
||||
|
||||
bool TDistinta_tree::goto_rbrother()
|
||||
{
|
||||
const bool ok = has_rbrother();
|
||||
if (ok)
|
||||
{
|
||||
kill_child();
|
||||
add_child();
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool TDistinta_tree::has_lbrother() const
|
||||
{
|
||||
const int items = _path.items();
|
||||
if (items < 3)
|
||||
return FALSE;
|
||||
TString80 str;
|
||||
_path.get(items-2, str);
|
||||
const int brother = atoi(str)-1;
|
||||
if (brother <= 0)
|
||||
return FALSE;
|
||||
|
||||
_path.get(items-3, str);
|
||||
file().put("CODDIST", str);
|
||||
file().put("NRIG", brother);
|
||||
return file().read() == NOERR;
|
||||
}
|
||||
|
||||
bool TDistinta_tree::goto_lbrother()
|
||||
{
|
||||
const bool ok = has_lbrother();
|
||||
if (ok)
|
||||
{
|
||||
kill_child();
|
||||
add_child();
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool TDistinta_tree::has_father() const
|
||||
{
|
||||
const int items = _path.items();
|
||||
return items >= 3;
|
||||
}
|
||||
|
||||
bool TDistinta_tree::goto_father()
|
||||
{
|
||||
const bool ok = has_father();
|
||||
if (ok)
|
||||
{
|
||||
kill_child();
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
TDistinta_tree::TDistinta_tree() : _rdist(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
TDistinta_tree::~TDistinta_tree()
|
||||
{
|
||||
if (_rdist)
|
||||
delete _rdist;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TQuery_mask
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TQuery_mask : public TAutomask
|
||||
{
|
||||
TDistinta_tree& _tree;
|
||||
TToken_string _curr;
|
||||
|
||||
protected:
|
||||
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||||
|
||||
public:
|
||||
const TToken_string& curr() const { return _curr; }
|
||||
|
||||
TQuery_mask(TDistinta_tree& tree);
|
||||
virtual ~TQuery_mask() { }
|
||||
};
|
||||
|
||||
bool TQuery_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
{
|
||||
switch (o.dlg())
|
||||
{
|
||||
case F_CODICE:
|
||||
if (e == fe_modify)
|
||||
{
|
||||
TTree_field& tf = (TTree_field&)field(F_TREE);
|
||||
const TString& val = o.get();
|
||||
if (val.not_empty() && _tree.has_root())
|
||||
{
|
||||
long pos = _tree.find_node(val);
|
||||
if (pos <= 0)
|
||||
{
|
||||
if (_tree.set_root(val))
|
||||
pos = 1;
|
||||
}
|
||||
if (pos > 0)
|
||||
{
|
||||
tf.select_current();
|
||||
do { _tree.expand(); } while (_tree.goto_father());
|
||||
pos = _tree.find_node(val, SCAN_PRE_ORDER | SCAN_IGNORING_UNEXPANDED);
|
||||
|
||||
TField_window& win = tf.win();
|
||||
const TPoint& range = win.range();
|
||||
if (pos > range.y)
|
||||
win.set_scroll_max(win.columns(), pos+win.rows());
|
||||
|
||||
win.update_thumb(-1, pos-1);
|
||||
win.force_update();
|
||||
tf.set_focus();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_tree.set_root(val);
|
||||
}
|
||||
tf.win().force_update();
|
||||
}
|
||||
case F_TREE:
|
||||
if (e == fe_modify)
|
||||
{
|
||||
_tree.curr_id(_curr);
|
||||
set(F_CODICE, _curr.get(-2));
|
||||
}
|
||||
break;
|
||||
case DLG_SELECT:
|
||||
if (e == fe_button)
|
||||
{
|
||||
const TString& str = get(F_CODICE);
|
||||
if (str.not_empty())
|
||||
set(F_CODICEQ, str);
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
case F_COPY:
|
||||
if (e == fe_button)
|
||||
{
|
||||
const TString oldcode = get(F_CODICE);
|
||||
TLocalisamfile dist(LF_DIST);
|
||||
dist.put("CODDIST", oldcode);
|
||||
if (dist.read() == NOERR)
|
||||
{
|
||||
TString newcode;
|
||||
if (query_string("Nuovo codice", newcode, 20, "U"))
|
||||
{
|
||||
if (newcode.not_empty() && newcode != oldcode)
|
||||
{
|
||||
dist.put("CODDIST", newcode);
|
||||
const int err = dist.write();
|
||||
if (err == NOERR)
|
||||
{
|
||||
TRecord_array rdist(LF_RDIST, "NRIG");
|
||||
rdist.renum_key("CODDIST", oldcode);
|
||||
if (rdist.read(rdist.key()) == NOERR)
|
||||
{
|
||||
rdist.renum_key("CODDIST", newcode);
|
||||
rdist.write();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (err == _isreinsert)
|
||||
error_box("La distinta '%s' e' gia' stata inserita", (const char*)newcode);
|
||||
else
|
||||
error_box("Errore %d durante la registrazione della distinta '%s'", err, (const char*)newcode);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
error_box("Il codice '%s' non corrisponde ad una distinta valida", (const char*)oldcode);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
TQuery_mask::TQuery_mask(TDistinta_tree& dt)
|
||||
: TAutomask("db0100a"), _tree(dt)
|
||||
{
|
||||
TTree_field& tree = (TTree_field&)field(F_TREE);
|
||||
tree.set_tree(&_tree);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TDistinta_mask
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TDistinta_mask : public TAutomask
|
||||
{
|
||||
TDistinta_tree& _tree;
|
||||
TRecord_cache _mag, _lav;
|
||||
|
||||
protected:
|
||||
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||||
bool test_row(const TToken_string& row);
|
||||
|
||||
public:
|
||||
bool is_lav(const TString& str);
|
||||
bool is_mag(const TString& str);
|
||||
|
||||
TDistinta_mask(TDistinta_tree& dt);
|
||||
virtual ~TDistinta_mask() { }
|
||||
};
|
||||
|
||||
bool TDistinta_mask::is_lav(const TString& str)
|
||||
{
|
||||
if (_lav.items() > 1000)
|
||||
_lav.destroy();
|
||||
const TString& val = _lav.get(str, "S0");
|
||||
return val.not_empty();
|
||||
}
|
||||
|
||||
bool TDistinta_mask::is_mag(const TString& str)
|
||||
{
|
||||
if (_mag.items() > 1000)
|
||||
_mag.destroy();
|
||||
const TString& val = _mag.get(str, "DESCR");
|
||||
return val.not_empty();
|
||||
}
|
||||
|
||||
bool TDistinta_mask::test_row(const TToken_string& row)
|
||||
{
|
||||
const TString& father = get(F_CODICE);
|
||||
|
||||
TString code; row.get(1, code);
|
||||
bool ok = code != father;
|
||||
if (ok && _tree.find_node(father) > 0)
|
||||
{
|
||||
TToken_string path; _tree.curr_id(path);
|
||||
for (const char* c = path.get(0); c != NULL && ok; c = path.get())
|
||||
{
|
||||
ok = code != c;
|
||||
c = path.get();
|
||||
}
|
||||
}
|
||||
if (!ok)
|
||||
error_box("Il codice '%s' non puo' essere utilizzato\n"
|
||||
"in quanto la distinta risulterebbe ciclica.", (const char*)code);
|
||||
|
||||
// Se e' una lavorazione
|
||||
if (get(F_TIPO)[0] == 'L')
|
||||
{
|
||||
ok = row[0] == 'L' && is_lav(code);
|
||||
if (!ok)
|
||||
error_box("Il codice '%s' non e' una lavorazione", (const char*)code);
|
||||
}
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool TDistinta_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
{
|
||||
switch (o.dlg())
|
||||
{
|
||||
case F_CODICE:
|
||||
if (e == fe_init)
|
||||
{
|
||||
bool virtuale = TRUE;
|
||||
const TString& code = o.get();
|
||||
if (virtuale && is_mag(code)) // E' un articolo di magazzino?
|
||||
{
|
||||
set(F_TIPO, "A", TRUE);
|
||||
const TRectype& rec = _mag.get(code);
|
||||
set(F_DESCR, rec.get("DESCR"));
|
||||
|
||||
TLocalisamfile umart(LF_UMART);
|
||||
umart.put(UMART_CODART, code);
|
||||
umart.put(UMART_NRIGA, "1");
|
||||
if (umart.read() == NOERR)
|
||||
set(F_UM, umart.get(UMART_UM));
|
||||
|
||||
virtuale = FALSE;
|
||||
}
|
||||
if (virtuale && is_lav(code)) // E' una lavorazione?
|
||||
{
|
||||
set(F_TIPO, "L", TRUE);
|
||||
const TRectype& rec = _lav.get(code);
|
||||
set(F_DESCR, rec.get("S0"));
|
||||
set(F_UM, rec.get("S6"));
|
||||
set(F_PREZZO, rec.get("R0"));
|
||||
virtuale = FALSE;
|
||||
}
|
||||
if (virtuale)
|
||||
set(F_TIPO, "V", TRUE);
|
||||
}
|
||||
break;
|
||||
case F_SHEET:
|
||||
if (e == se_notify_add || e == se_notify_modify || e == fe_close)
|
||||
{
|
||||
TSheet_field& sheet = (TSheet_field&)o;
|
||||
const int nrig = int(jolly);
|
||||
TToken_string& row = sheet.row(nrig);
|
||||
switch(e)
|
||||
{
|
||||
case se_notify_add:
|
||||
row = "A| | |1"; // Forza il listbox ad articolo
|
||||
break;
|
||||
case se_notify_modify:
|
||||
return test_row(row);
|
||||
case fe_close:
|
||||
{
|
||||
TString code;
|
||||
for (int n = sheet.items()-1; n >= 0; n--)
|
||||
{
|
||||
const TToken_string& row = sheet.row(n);
|
||||
row.get(1, code);
|
||||
if (!code.blank())
|
||||
{
|
||||
if (!test_row(row))
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
sheet.destroy(n);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case F_CODART:
|
||||
case F_CODLAV:
|
||||
case F_CODDIS:
|
||||
if (e == fe_modify || e == fe_init)
|
||||
{
|
||||
TMask& m = o.mask();
|
||||
TEdit_field& ef = (TEdit_field&)o;
|
||||
const TRectype& rec = ef.browse()->cursor()->curr();
|
||||
switch(rec.num())
|
||||
{
|
||||
case LF_ANAMAG:
|
||||
m.set(F_DESCOMP, rec.get(ANAMAG_DESCR));
|
||||
m.enable(F_UMEXPR);
|
||||
if (m.get(F_UMEXPR).empty())
|
||||
{
|
||||
TLocalisamfile umart(LF_UMART);
|
||||
umart.put(UMART_CODART, o.get());
|
||||
umart.put(UMART_NRIGA, "1");
|
||||
if (umart.read() == NOERR)
|
||||
m.set(F_UMEXPR, umart.get(UMART_UM));
|
||||
}
|
||||
break;
|
||||
case LF_DIST :
|
||||
m.set(F_DESCOMP, rec.get("DESCR"));
|
||||
m.set(F_UMEXPR, rec.get("UM"));
|
||||
m.disable(F_UMEXPR);
|
||||
break;
|
||||
default :
|
||||
m.set(F_DESCOMP, rec.get("S0"));
|
||||
m.set(F_UMEXPR, rec.get("S7"));
|
||||
m.disable(F_UMEXPR);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case F_EXPR:
|
||||
if (e == fe_modify)
|
||||
{
|
||||
const TString& str = o.get();
|
||||
if (str.not_empty())
|
||||
{
|
||||
TDistinta_expr expr;
|
||||
if (expr.set(str))
|
||||
{
|
||||
if (expr.numvar() > 0)
|
||||
{
|
||||
TTable var("VAR");
|
||||
for (int v = expr.numvar()-1; v >= 0; v--)
|
||||
{
|
||||
const char* name = expr.varname(v);
|
||||
var.put("CODTAB", name);
|
||||
if (var.read() != NOERR)
|
||||
return error_box("La variabile %s non e' definita in tabella", name);
|
||||
}
|
||||
}
|
||||
else
|
||||
o.set(expr.as_string());
|
||||
}
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
return error_box("L'espressione deve essere specificata");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
TDistinta_mask::TDistinta_mask(TDistinta_tree& dt)
|
||||
: TAutomask("db0100b"), _tree(dt),
|
||||
_mag(LF_ANAMAG), _lav("LAV")
|
||||
{ }
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TDistinta_app
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TDistinta_app : public TRelation_application
|
||||
{
|
||||
TDistinta_tree _tree;
|
||||
TRelation* _therel;
|
||||
TQuery_mask* _querymask;
|
||||
TDistinta_mask* _themask;
|
||||
int _mode;
|
||||
|
||||
protected:
|
||||
virtual bool user_create();
|
||||
virtual bool user_destroy();
|
||||
virtual TRelation* get_relation() const { return _therel; }
|
||||
virtual bool changing_mask(int mode);
|
||||
virtual void init_modify_mode(TMask& m);
|
||||
virtual TMask* get_mask(int mode);
|
||||
|
||||
public:
|
||||
};
|
||||
|
||||
bool TDistinta_app::user_create()
|
||||
{
|
||||
_therel = new TRelation(LF_DIST);
|
||||
_querymask = new TQuery_mask(_tree);
|
||||
_themask = new TDistinta_mask(_tree);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool TDistinta_app::user_destroy()
|
||||
{
|
||||
delete _themask;
|
||||
delete _therel;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool TDistinta_app::changing_mask(int mode)
|
||||
{
|
||||
bool was_query = _mode == MODE_QUERY || _mode == MODE_QUERYINS;
|
||||
bool is_query = mode == MODE_QUERY || mode == MODE_QUERYINS;
|
||||
return was_query != is_query;
|
||||
}
|
||||
|
||||
TMask* TDistinta_app::get_mask(int mode)
|
||||
{
|
||||
_mode = mode;
|
||||
bool is_query = mode == MODE_QUERY || mode == MODE_QUERYINS;
|
||||
return is_query ? (TMask*)_querymask : (TMask*)_themask;
|
||||
}
|
||||
|
||||
void TDistinta_app::init_modify_mode(TMask& m)
|
||||
{
|
||||
TSheet_field& sheet = m.sfield(F_SHEET);
|
||||
FOR_EACH_SHEET_ROW(sheet, nrig, row)
|
||||
sheet.check_row(nrig);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// db0100 gestione distinte
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
int db0100(int argc, char* argv[])
|
||||
{
|
||||
TDistinta_app a;
|
||||
a.run(argc, argv, "Distinta base");
|
||||
return 0;
|
||||
}
|
33
db/db0100a.h
Executable file
33
db/db0100a.h
Executable file
@ -0,0 +1,33 @@
|
||||
#ifndef __DB0100_H
|
||||
#define __DB0100_H
|
||||
|
||||
#define F_TREE 500
|
||||
#define F_CODICE 501
|
||||
#define F_CODICEQ 502
|
||||
#define F_TIPO 503
|
||||
#define F_VIRTUALE 504
|
||||
#define F_COPY 505
|
||||
|
||||
#define F_DESCR 510
|
||||
#define F_PREZZO 511
|
||||
#define F_UM 512
|
||||
#define F_PESO 513
|
||||
#define F_UMP 514
|
||||
|
||||
#define F_SHEET 520
|
||||
|
||||
#define F_TIPOCOMP 101
|
||||
#define F_CODART 102
|
||||
#define F_CODLAV 202
|
||||
#define F_CODDIS 302
|
||||
#define F_CODVAR 402
|
||||
#define F_UMEXPR 103
|
||||
#define F_EXPR 104
|
||||
#define F_DESCOMP 105
|
||||
#define F_SORT1 106
|
||||
#define F_SORT2 107
|
||||
#define F_SORT3 108
|
||||
#define F_SORT4 109
|
||||
#define F_SORT5 110
|
||||
|
||||
#endif
|
97
db/db0100a.uml
Executable file
97
db/db0100a.uml
Executable file
@ -0,0 +1,97 @@
|
||||
#include "db0100a.h"
|
||||
|
||||
TOOLBAR "" 0 20 0 0
|
||||
|
||||
BUTTON DLG_SELECT 10 2
|
||||
BEGIN
|
||||
PROMPT -16 -1 "~Selezione"
|
||||
MESSAGE EXIT,K_ENTER
|
||||
PICTURE BMP_SELECT
|
||||
END
|
||||
|
||||
BUTTON DLG_NEWREC 10 2
|
||||
BEGIN
|
||||
PROMPT -26 -1 "~Nuovo"
|
||||
MESSAGE EXIT,K_INS
|
||||
PICTURE BMP_NEWREC
|
||||
PICTURE BMP_NEWRECDN
|
||||
END
|
||||
|
||||
BUTTON DLG_DELREC 10 2
|
||||
BEGIN
|
||||
PROMPT -36 -1 "~Elimina"
|
||||
MESSAGE EXIT,K_DEL
|
||||
PICTURE BMP_DELREC
|
||||
PICTURE BMP_DELRECDN
|
||||
END
|
||||
|
||||
BUTTON F_COPY 10 2
|
||||
BEGIN
|
||||
PROMPT -46 -1 "~Copia"
|
||||
END
|
||||
|
||||
BUTTON DLG_CANCEL 10 2
|
||||
BEGIN
|
||||
PROMPT -56 -1 "~Annulla"
|
||||
MESSAGE EXIT,K_ESC
|
||||
PICTURE 102
|
||||
END
|
||||
|
||||
BUTTON DLG_QUIT 10 2
|
||||
BEGIN
|
||||
PROMPT -66 -1 "~Fine"
|
||||
MESSAGE EXIT,K_QUIT
|
||||
PICTURE BMP_QUIT
|
||||
PICTURE BMP_QUITDN
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
PAGE "Distinta base" -1 -1 80 20
|
||||
|
||||
GROUPBOX DLG_NULL 78 3
|
||||
BEGIN
|
||||
PROMPT 1 1 "Distinta"
|
||||
END
|
||||
|
||||
STRING F_CODICE 20
|
||||
BEGIN
|
||||
PROMPT 2 2 "Cerca "
|
||||
FLAGS "GU"
|
||||
USE LF_DIST
|
||||
JOIN LF_ANAMAG INTO CODART==CODDIST
|
||||
INPUT CODDIST F_CODICE
|
||||
DISPLAY "Codice@20" CODDIST
|
||||
DISPLAY "Descrizione@50" LF_ANAMAG->DESCR
|
||||
OUTPUT F_CODICE CODDIST
|
||||
ADD RUN ve2 -3
|
||||
CHECKTYPE REQUIRED
|
||||
FIELD CODDIST
|
||||
END
|
||||
|
||||
STRING F_CODICEQ 20
|
||||
BEGIN
|
||||
PROMPT 42 2 "Codice "
|
||||
FIELD CODDIST
|
||||
KEY 1
|
||||
USE LF_ANAMAG
|
||||
JOIN LF_UMART INTO CODART=CODART NRIGA=1
|
||||
INPUT CODART F_CODICEQ
|
||||
DISPLAY "Codice@20" CODART
|
||||
DISPLAY "Descrizione@50" DESCR
|
||||
OUTPUT F_CODICEQ CODART
|
||||
CHECKTYPE REQUIRED
|
||||
MESSAGE COPY,F_CODICE
|
||||
FLAGS "U"
|
||||
END
|
||||
|
||||
TREE F_TREE -3 -1
|
||||
BEGIN
|
||||
PROMPT 0 4 ""
|
||||
END
|
||||
|
||||
|
||||
|
||||
ENDPAGE
|
||||
|
||||
ENDMASK
|
280
db/db0100b.uml
Executable file
280
db/db0100b.uml
Executable file
@ -0,0 +1,280 @@
|
||||
#include "db0100a.h"
|
||||
|
||||
TOOLBAR "" 0 20 0 0
|
||||
#include <toolbar.h>
|
||||
ENDPAGE
|
||||
|
||||
PAGE "Distinta base" -1 -1 80 20
|
||||
|
||||
GROUPBOX DLG_NULL 78 3
|
||||
BEGIN
|
||||
PROMPT 1 1 "Distinta"
|
||||
END
|
||||
|
||||
STRING F_CODICE 20
|
||||
BEGIN
|
||||
PROMPT 2 2 "Codice "
|
||||
FLAGS "GUD"
|
||||
KEY 1
|
||||
FIELD CODDIST
|
||||
END
|
||||
|
||||
LIST F_TIPO 1 12
|
||||
BEGIN
|
||||
PROMPT 42 2 "Tipo "
|
||||
ITEM "A|Articolo"
|
||||
MESSAGE "",F_VIRTUALE
|
||||
ITEM "L|Lavorazione"
|
||||
MESSAGE "",F_VIRTUALE
|
||||
ITEM "V|Virtuale"
|
||||
MESSAGE "X",F_VIRTUALE
|
||||
FLAGS "DG"
|
||||
END
|
||||
|
||||
BOOLEAN F_VIRTUALE
|
||||
BEGIN
|
||||
PROMPT 42 42 "Virtuale"
|
||||
MESSAGE FALSE DISABLE,1@
|
||||
MESSAGE TRUE ENABLE,1@
|
||||
FLAGS "DG"
|
||||
FIELD VIRTUALE
|
||||
END
|
||||
|
||||
GROUPBOX DLG_NULL 78 5
|
||||
BEGIN
|
||||
PROMPT 1 4 "Informazioni"
|
||||
END
|
||||
|
||||
STRING F_DESCR 50
|
||||
BEGIN
|
||||
PROMPT 2 5 "Descrizione "
|
||||
FIELD DESCR
|
||||
GROUP 1
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
NUMBER F_PREZZO 15
|
||||
BEGIN
|
||||
PROMPT 2 6 "Costo "
|
||||
PICTURE "."
|
||||
FIELD PREZZO
|
||||
GROUP 1
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
STRING F_UM 3
|
||||
BEGIN
|
||||
PROMPT 42 6 "Unita' di misura "
|
||||
USE %UMS
|
||||
INPUT CODTAB F_UM
|
||||
DISPLAY "Codice" CODTAB
|
||||
DISPLAY "Descrizione@60" S0
|
||||
OUTPUT F_UM CODTAB
|
||||
FIELD UM
|
||||
GROUP 1
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
NUMBER F_PESO 15 5
|
||||
BEGIN
|
||||
PROMPT 2 7 "Peso "
|
||||
FIELD PESO
|
||||
GROUP 1
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
STRING F_UMP 3
|
||||
BEGIN
|
||||
PROMPT 42 7 "Unita' di misura del peso "
|
||||
COPY USE F_UM
|
||||
INPUT CODTAB F_UMP
|
||||
COPY DISPLAY F_UM
|
||||
OUTPUT F_UMP CODTAB
|
||||
FIELD UMP
|
||||
GROUP 1
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
SPREADSHEET F_SHEET
|
||||
BEGIN
|
||||
PROMPT 0 9 ""
|
||||
ITEM "Tipo@4"
|
||||
ITEM "Codice@20"
|
||||
ITEM "UM@3"
|
||||
ITEM "Espressione@20"
|
||||
ITEM "Descrizione@50"
|
||||
ITEM "Ord1"
|
||||
ITEM "Ord2"
|
||||
ITEM "Ord3"
|
||||
ITEM "Ord4"
|
||||
ITEM "Ord5"
|
||||
USE LF_RDIST KEY NRIG
|
||||
INPUT CODDIST F_CODICE
|
||||
FLAGS "A"
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
ENDMASK
|
||||
|
||||
PAGE "Riga 1" -1 -1 68 12
|
||||
|
||||
GROUPBOX DLG_NULL 66 4
|
||||
BEGIN
|
||||
PROMPT 1 0 "Componente"
|
||||
END
|
||||
|
||||
LIST F_TIPOCOMP 1 12
|
||||
BEGIN
|
||||
PROMPT 2 1 "Tipo "
|
||||
ITEM "A|Articolo"
|
||||
MESSAGE SHOW,F_CODART|HIDE,F_CODLAV|HIDE,F_CODDIS|HIDE,F_CODVAR
|
||||
ITEM "L|Lavorazione"
|
||||
MESSAGE HIDE,F_CODART|SHOW,F_CODLAV|HIDE,F_CODDIS|HIDE,F_CODVAR
|
||||
ITEM "D|Distinta"
|
||||
MESSAGE HIDE,F_CODART|HIDE,F_CODLAV|SHOW,F_CODDIS|HIDE,F_CODVAR
|
||||
ITEM "V|Variabile"
|
||||
MESSAGE HIDE,F_CODART|HIDE,F_CODLAV|HIDE,F_CODDIS|SHOW,F_CODVAR
|
||||
FIELD TIPO
|
||||
END
|
||||
|
||||
STRING F_CODART 20
|
||||
BEGIN
|
||||
PROMPT 37 1 "Codice "
|
||||
USE LF_ANAMAG
|
||||
INPUT CODART F_CODART
|
||||
DISPLAY "Codice@20" CODART
|
||||
DISPLAY "Descrizione@50" DESCR
|
||||
OUTPUT F_CODART CODART
|
||||
CHECKTYPE REQUIRED
|
||||
ADD RUN ve2 -3
|
||||
FIELD CODCOMP
|
||||
FLAGS "U"
|
||||
END
|
||||
|
||||
STRING F_CODLAV 20
|
||||
BEGIN
|
||||
PROMPT 37 1 "Codice "
|
||||
USE LAV
|
||||
INPUT CODTAB F_CODLAV
|
||||
DISPLAY "Codice@8" CODTAB
|
||||
DISPLAY "Descrizione@50" S0
|
||||
OUTPUT F_CODLAV CODTAB
|
||||
CHECKTYPE REQUIRED
|
||||
MESSAGE COPY,F_CODART
|
||||
FLAGS "U"
|
||||
END
|
||||
|
||||
STRING F_CODDIS 20
|
||||
BEGIN
|
||||
PROMPT 37 1 "Codice "
|
||||
USE LF_DIST SELECT VIRTUALE=="X"
|
||||
INPUT CODDIST F_CODDIS
|
||||
DISPLAY "Codice@20" CODDIST
|
||||
DISPLAY "Desrizione@50" DESCR
|
||||
OUTPUT F_CODDIS CODDIST
|
||||
CHECKTYPE REQUIRED
|
||||
MESSAGE COPY,F_CODART
|
||||
FLAGS "U"
|
||||
END
|
||||
|
||||
STRING F_CODVAR 20
|
||||
BEGIN
|
||||
PROMPT 37 1 "Codice "
|
||||
USE VAR
|
||||
INPUT CODTAB F_CODDIS
|
||||
DISPLAY "Codice@20" CODTAB
|
||||
DISPLAY "Descrizione@50" S0
|
||||
OUTPUT F_CODVAR CODTAB
|
||||
CHECKTYPE REQUIRED
|
||||
MESSAGE COPY,F_CODART
|
||||
FLAGS "U"
|
||||
END
|
||||
|
||||
STRING F_DESCOMP 50
|
||||
BEGIN
|
||||
PROMPT 2 2 "Descrizione "
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
GROUPBOX DLG_NULL 66 4
|
||||
BEGIN
|
||||
PROMPT 1 4 "Formula"
|
||||
END
|
||||
|
||||
STRING F_UMEXPR 3
|
||||
BEGIN
|
||||
PROMPT 2 5 "Unita' di misura "
|
||||
USE LF_UMART KEY 2
|
||||
JOIN LF_ANAMAG INTO CODART==CODART
|
||||
INPUT CODART F_CODART SELECT
|
||||
INPUT UM F_UMEXPR
|
||||
DISPLAY "Unita'" UM
|
||||
DISPLAY "Articolo@20" CODART
|
||||
DISPLAY "Descrizione@50" LF_ANAMAG->DESCR
|
||||
OUTPUT F_UMEXPR UM
|
||||
CHECKTYPE NORMAL
|
||||
FIELD UM
|
||||
FLAGS "U"
|
||||
END
|
||||
|
||||
STRING F_EXPR 50 62
|
||||
BEGIN
|
||||
PROMPT 2 6 ""
|
||||
FIELD EXPR
|
||||
FLAGS "U"
|
||||
END
|
||||
|
||||
GROUPBOX DLG_NULL 66 3
|
||||
BEGIN
|
||||
PROMPT 1 8 "Criteri d'ordinamento"
|
||||
END
|
||||
|
||||
NUMBER F_SORT1 4
|
||||
BEGIN
|
||||
PROMPT 2 9 "1 "
|
||||
FIELD SORT1
|
||||
END
|
||||
|
||||
NUMBER F_SORT2 4
|
||||
BEGIN
|
||||
PROMPT 16 9 "2 "
|
||||
FIELD SORT2
|
||||
END
|
||||
|
||||
NUMBER F_SORT3 4
|
||||
BEGIN
|
||||
PROMPT 30 9 "3 "
|
||||
FIELD SORT3
|
||||
END
|
||||
|
||||
NUMBER F_SORT4 4
|
||||
BEGIN
|
||||
PROMPT 44 9 "4 "
|
||||
FIELD SORT4
|
||||
END
|
||||
|
||||
NUMBER F_SORT5 4
|
||||
BEGIN
|
||||
PROMPT 58 9 "5 "
|
||||
FIELD SORT5
|
||||
END
|
||||
|
||||
BUTTON DLG_OK 10 2
|
||||
BEGIN
|
||||
PROMPT -13 -1 ""
|
||||
END
|
||||
|
||||
BUTTON DLG_DELREC 10 2
|
||||
BEGIN
|
||||
PROMPT -23 -1 ""
|
||||
END
|
||||
|
||||
BUTTON DLG_CANCEL 10 2
|
||||
BEGIN
|
||||
PROMPT -33 -1 ""
|
||||
END
|
||||
|
||||
ENDMASK
|
||||
|
||||
|
@ -1,3 +1,3 @@
|
||||
112
|
||||
0
|
||||
$dist|0|0|22|35|Distinte|||
|
||||
$dist|0|0|121|0|Distinte|||
|
||||
|
10
db/f112.trr
10
db/f112.trr
@ -1,6 +1,12 @@
|
||||
112
|
||||
2
|
||||
8
|
||||
CODDIST|1|20|0|Codice distinta
|
||||
VARIABILE|8|1|0|Distinta variabile
|
||||
VIRTUALE|8|1|0|Distinta virtuale (non e' un articolo)
|
||||
DESCR|1|50|0|Descrizione
|
||||
UMP|1|3|0|Unita' di misura del peso
|
||||
PESO|4|15|5|Peso
|
||||
UM|1|3|0|Unita' di misura
|
||||
PREZZO|4|18|2|Costo
|
||||
PARAMETRI|11|10|0|Parametri (var1 = valore1, var2= valore2, ecc.)
|
||||
1
|
||||
CODDIST|
|
||||
|
@ -1,3 +1,3 @@
|
||||
113
|
||||
0
|
||||
$rdist|0|0|117|35|Righe distinta|||
|
||||
$rdist|0|0|119|0|Righe distinta|||
|
||||
|
17
db/f113.trr
17
db/f113.trr
@ -1,13 +1,16 @@
|
||||
113
|
||||
8
|
||||
11
|
||||
CODDIST|1|20|0|Codice distinta
|
||||
NRIG|2|4|0|Numero di riga
|
||||
TIPO|1|1|0|Tipo componente <A>rticolo, <L>avorazione
|
||||
TIPO|1|1|0|Tipo componente <A>rticolo, <L>avorazione, <D>istinta
|
||||
CODCOMP|1|20|0|Codice componente
|
||||
UM|1|2|0|Unita' di misura
|
||||
QUANT|4|15|5|Quantita'
|
||||
EXPR|1|50|0|Espressione aggiuntiva
|
||||
RIF|2|4|0|Riferimento
|
||||
UM|1|3|0|Unita' di misura
|
||||
EXPR|1|50|0|Espressione quantita'
|
||||
SORT1|2|4|0|Ordinamento 1
|
||||
SORT2|2|4|0|Ordinamento 2
|
||||
SORT3|2|4|0|Ordinamento 3
|
||||
SORT4|2|4|0|Ordinamento 4
|
||||
SORT5|2|4|0|Ordinamento 5
|
||||
2
|
||||
CODDIST+NRIG|
|
||||
+CODCOMP+CODDIST|X
|
||||
CODCOMP+CODDIST|X
|
||||
|
Loading…
x
Reference in New Issue
Block a user