360 lines
9.3 KiB
C++
Executable File
360 lines
9.3 KiB
C++
Executable File
#include <automask.h>
|
|
#include <defmask.h>
|
|
#include <msksheet.h>
|
|
#include <mask.h>
|
|
#include <recarray.h>
|
|
#include <recset.h>
|
|
#include <tabapp.h>
|
|
|
|
#include <multirel.h>
|
|
#include "../mg/anamag.h"
|
|
#include "ps0430100a.h"
|
|
|
|
#define FILE_KEY "ACM"
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// TArt_mask maschera
|
|
///////////////////////////////////////////////////////////
|
|
|
|
class TArt_mask : public TAutomask
|
|
{
|
|
TString _query;
|
|
TISAM_recordset _recset;
|
|
bool _filter_changed;
|
|
|
|
virtual void next_page(int p);
|
|
|
|
public:
|
|
void update_sheet();
|
|
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
|
TArt_mask();
|
|
};
|
|
|
|
TArt_mask::TArt_mask() : TAutomask("ps0430100a"), _recset("USE ANAMAG")
|
|
{
|
|
TConfig c(CONFIG_DITTA);
|
|
TSheet_field & sh = sfield(F_ARTICLES);
|
|
TMask & sh_mask = sh.sheet_mask();
|
|
TString80 prompt;
|
|
|
|
for (int i = 1; i <= 10; i++)
|
|
{
|
|
const int col = sh.cid2index(F_USER1 + i -1);
|
|
TEditable_field & f = sh_mask.efield(F_USER1 + i - 1);
|
|
|
|
if (c.get_bool("CHK_USER", "ve", i) && c.get_bool("USERDEF", "or", i))
|
|
{
|
|
prompt = c.get("PROMPT_USER", "ve", i);
|
|
prompt.rpad(20);
|
|
f.set_prompt(prompt);
|
|
sh.set_column_header(col, prompt);
|
|
}
|
|
else
|
|
{
|
|
f.hide();
|
|
sh.delete_column(col);
|
|
}
|
|
}
|
|
}
|
|
|
|
void TArt_mask::update_sheet()
|
|
{
|
|
const bool active_only = get_bool(F_ACTIVEONLY);
|
|
TSheet_field& sf = sfield(F_ARTICLES);
|
|
|
|
TString query("USE ANAMAG KEY ");
|
|
|
|
TString select;
|
|
TLocalisamfile multirel(LF_MULTIREL);
|
|
const TString user(get(F_USER));
|
|
|
|
const TString & codart = get(F_SCODART);
|
|
|
|
if (codart.full())
|
|
select << "(UPPER(" << ANAMAG_CODART << ")?=UPPER(\"" << codart << "\"))";
|
|
|
|
const TString & desart = get(F_SDESART);
|
|
|
|
if (desart.full())
|
|
{
|
|
if (select.full())
|
|
select << "&&";
|
|
select << "(UPPER(" << ANAMAG_DESCR << ")?=UPPER(\"" << desart << "\"))";
|
|
}
|
|
|
|
const TString & desagg = get(F_SDESAGG);
|
|
|
|
if (desagg.full())
|
|
{
|
|
if (select.full())
|
|
select << "&&";
|
|
select << "(UPPER(" << ANAMAG_DESCRAGG << ")?=UPPER(\"" << desagg << "\"))";
|
|
}
|
|
|
|
const TString & codforn = get(F_SCODFOR);
|
|
|
|
if (codforn.full())
|
|
{
|
|
if (select.full())
|
|
select << "&&";
|
|
select << "(" << ANAMAG_CODFORN << "==\"" << codforn << "\")";
|
|
}
|
|
|
|
const TString & ragsoc = get(F_SRAGSOC);
|
|
|
|
if (ragsoc.full())
|
|
{
|
|
if (select.full())
|
|
select << "&&";
|
|
select << "(UPPER(CLIFO.RAGSOC)?=UPPER(\"" << ragsoc << "\"))";
|
|
}
|
|
|
|
TString16 grmerc(get(F_GRMERC));
|
|
if (grmerc.full())
|
|
query << '3';
|
|
else
|
|
query << '1';
|
|
|
|
if (select.full())
|
|
query << "\nSELECT " << select;
|
|
|
|
grmerc.left_just(3);
|
|
grmerc << get(F_SGRMERC);
|
|
grmerc.trim();
|
|
|
|
if (grmerc.full())
|
|
query << "\nJOIN CLIFO INTO TIPOCF==\"F\" CODCF==CODFORN\nFROM GRMERC=#GRMERC\nTO GRMERC=#GRMERC";
|
|
else
|
|
query << "\nJOIN CLIFO INTO TIPOCF==\"F\" CODCF==CODFORN\n";
|
|
|
|
_recset.set(query);
|
|
|
|
TVariant var ;
|
|
|
|
var = grmerc;
|
|
_recset.set_var("#GRMERC", var);
|
|
|
|
int i = 0;
|
|
|
|
sf.destroy();
|
|
|
|
for (bool ok = _recset.move_first(); ok; ok = _recset.move_next())
|
|
{
|
|
const TString& codart = _recset.get(ANAMAG_CODART).as_string();
|
|
|
|
multirel.put(MULTI_COD, FILE_KEY);
|
|
multirel.put(MULTI_FIRST, user);
|
|
multirel.put(MULTI_SECOND, codart);
|
|
const bool act = multirel.read(_isequal) == NOERR;
|
|
|
|
if (active_only && !act)
|
|
continue;
|
|
|
|
TToken_string & row = sf.row(i++);
|
|
row.add(codart, sf.cid2index(F_CODART));
|
|
row.add(_recset.get(ANAMAG_DESCR).as_string(), sf.cid2index(F_DESCR));
|
|
row.add(act ? "X" : " ", sf.cid2index(F_ATTIVO));
|
|
row.add(_recset.get(ANAMAG_CODFORN).as_string(), sf.cid2index(F_CODFORN));
|
|
row.add(_recset.get("CLIFO.RAGSOC").as_string(), sf.cid2index(F_RAGSOC));
|
|
row.add(_recset.get(ANAMAG_GIORNIRIOR).as_string(), sf.cid2index(F_LEADTIME));
|
|
row.add(_recset.get(ANAMAG_LOTTORIOR).as_string(), sf.cid2index(F_LOTTOMIN));
|
|
row.add(_recset.get(ANAMAG_DESCRAGG).as_string().left(50), sf.cid2index(F_DESCRAGG));
|
|
row.add(_recset.get(ANAMAG_PPCONF).as_string(), sf.cid2index(F_PPCONF));
|
|
row.add(_recset.get(ANAMAG_VALSTATUN).as_string(), sf.cid2index(F_VALSTATUN));
|
|
row.add(_recset.get(ANAMAG_ULTCOS1).as_string(), sf.cid2index(F_ULTCOS1));
|
|
row.add(_recset.get(ANAMAG_USER1).as_string(), sf.cid2index(F_USER1));
|
|
row.add(_recset.get(ANAMAG_USER2).as_string(), sf.cid2index(F_USER2));
|
|
row.add(_recset.get(ANAMAG_USER3).as_string(), sf.cid2index(F_USER3));
|
|
row.add(_recset.get(ANAMAG_USER4).as_string(), sf.cid2index(F_USER4));
|
|
row.add(_recset.get(ANAMAG_USER5).as_string(), sf.cid2index(F_USER5));
|
|
row.add(_recset.get(ANAMAG_USER6).as_string(), sf.cid2index(F_USER6));
|
|
row.add(_recset.get(ANAMAG_USER7).as_string(), sf.cid2index(F_USER7));
|
|
row.add(_recset.get(ANAMAG_USER8).as_string(), sf.cid2index(F_USER8));
|
|
row.add(_recset.get(ANAMAG_USER9).as_string(), sf.cid2index(F_USER9));
|
|
row.add(_recset.get(ANAMAG_USER10).as_string(), sf.cid2index(F_USER10));
|
|
}
|
|
}
|
|
|
|
void TArt_mask::next_page(int p)
|
|
{
|
|
TAutomask::next_page(p);
|
|
if (_filter_changed)
|
|
{
|
|
TSheet_field & sf = sfield(F_ARTICLES);
|
|
if (curr_win() == sf.parent())
|
|
{
|
|
update_sheet();
|
|
sf.force_update();
|
|
_filter_changed = false;
|
|
}
|
|
}
|
|
|
|
}
|
|
bool TArt_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
|
{
|
|
switch (o.dlg())
|
|
{
|
|
case F_GRMERC:
|
|
case F_SGRMERC:
|
|
case F_SCODART:
|
|
case F_SDESART:
|
|
case F_SDESAGG:
|
|
case F_SCODFOR:
|
|
case F_SRAGSOC:
|
|
if (e == fe_modify)
|
|
_filter_changed = true;
|
|
break;
|
|
case F_SET:
|
|
if (e == fe_button)
|
|
{
|
|
TSheet_field& sf = sfield(F_ARTICLES);
|
|
const int items = sf.items();
|
|
bool select = true;
|
|
const int cid = sf.cid2index(F_ATTIVO);
|
|
int i ;
|
|
|
|
for (i = 0; select && i < items; i++)
|
|
select = *sf.row (i).get(cid) <= ' ';
|
|
|
|
const TString4 val(select ? "X" : " ");
|
|
|
|
for (i = 0; i < items; i++)
|
|
sf.row(i).add(val, cid);
|
|
sf.force_update();
|
|
}
|
|
break;
|
|
case F_ACTIVEONLY:
|
|
if (e == fe_modify)
|
|
{
|
|
if (!field(F_USER).empty())
|
|
{
|
|
update_sheet();
|
|
sfield(F_ARTICLES).force_update();
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
class TRelArticoli_multirel_app : public TMultirel_application
|
|
{
|
|
TArt_mask * _mask;
|
|
|
|
protected:
|
|
virtual void get_mask_name(TString& tabname) const;
|
|
//magico metodo per impedire la navigazione su tabelle diverse da quella corrente del cursore
|
|
virtual bool has_filtered_cursor() const { return true; }
|
|
virtual bool user_create();
|
|
virtual bool user_destroy() ;
|
|
virtual int read(TMask& m);
|
|
virtual int rewrite(const TMask& m);
|
|
virtual int write(const TMask& m) { return rewrite(m);}
|
|
virtual bool remove();
|
|
virtual void init_insert_mode(TMask& m) { read(m); }
|
|
virtual bool find(word key = 0);
|
|
virtual TMask* get_mask(int mode = MODE_QUERY) { return (TMask *) _mask;}
|
|
virtual const char* extra_modules() const { return "ba"; }
|
|
};
|
|
|
|
void TRelArticoli_multirel_app::get_mask_name(TString& tabname) const
|
|
{
|
|
tabname = "ps0430100a";
|
|
}
|
|
|
|
bool TRelArticoli_multirel_app::user_create()
|
|
{
|
|
bool ok = TMultirel_application::user_create();
|
|
_mask = new TArt_mask;
|
|
return ok;
|
|
}
|
|
|
|
bool TRelArticoli_multirel_app::user_destroy()
|
|
{
|
|
delete _mask;
|
|
return true;
|
|
}
|
|
|
|
int TRelArticoli_multirel_app::read(TMask& m)
|
|
{
|
|
const TRectype& curr = get_relation()->lfile().curr();
|
|
TArt_mask& mask = (TArt_mask&)m;
|
|
mask.update_sheet();
|
|
return NOERR;
|
|
}
|
|
|
|
int TRelArticoli_multirel_app::rewrite(const TMask& m)
|
|
{
|
|
int err = NOERR;
|
|
TSheet_field & sf = m.sfield(F_ARTICLES);
|
|
TLocalisamfile multirel(LF_MULTIREL);
|
|
const TString user(m.get(F_USER));
|
|
|
|
for (int i = 0; i < sf.items(); i++)
|
|
{
|
|
TToken_string & row = sf.row(i);
|
|
bool selected = *row.get(sf.cid2index(F_ATTIVO)) > ' ';
|
|
|
|
multirel.zero();
|
|
multirel.put(MULTI_COD, FILE_KEY);
|
|
multirel.put(MULTI_FIRST, user);
|
|
multirel.put(MULTI_SECOND, row.get(sf.cid2index(F_CODART)));
|
|
bool exist = multirel.read(_isequal) == NOERR;
|
|
|
|
if (exist && !selected)
|
|
err = multirel.remove();
|
|
else
|
|
if (!exist && selected)
|
|
{
|
|
multirel.zero();
|
|
multirel.put(MULTI_COD, FILE_KEY);
|
|
multirel.put(MULTI_FIRST, user);
|
|
multirel.put(MULTI_SECOND, row.get(sf.cid2index(F_CODART)));
|
|
err = multirel.write();
|
|
}
|
|
}
|
|
get_relation()->read(_isgteq);
|
|
return err;
|
|
}
|
|
|
|
bool TRelArticoli_multirel_app::remove()
|
|
{
|
|
int err;
|
|
TLocalisamfile multirel(LF_MULTIREL);
|
|
const TString user(get_mask(MODE_MOD)->get(F_USER));
|
|
|
|
multirel.put(MULTI_COD, FILE_KEY);
|
|
multirel.put(MULTI_FIRST, user);
|
|
|
|
for (err = multirel.read(_isgteq); err == NOERR && user == multirel.get(MULTI_FIRST); multirel.next())
|
|
err = multirel.remove();
|
|
return err == NOERR || err == _iseof;
|
|
}
|
|
|
|
bool TRelArticoli_multirel_app::find(word key)
|
|
{
|
|
bool ok = false;
|
|
const TString& user = get_mask(MODE_QUERY)->get(F_USER);
|
|
|
|
if (user.full())
|
|
{
|
|
TLocalisamfile multirel(LF_MULTIREL);
|
|
|
|
multirel.put(MULTI_COD, FILE_KEY);
|
|
multirel.put(MULTI_FIRST, user);
|
|
ok = (multirel.read(_isgteq) == NOERR) && (user == multirel.get(MULTI_FIRST));
|
|
}
|
|
if (ok)
|
|
get_relation()->read(_isgteq);
|
|
return ok;
|
|
}
|
|
|
|
int ps0430100(int argc, char* argv[])
|
|
{
|
|
TRelArticoli_multirel_app a;
|
|
a.run(argc, argv, TR("Tabella"));
|
|
return 0;
|
|
}
|