campo-sirio/ve/ve2401.cpp
alex 16132c4467 Patch level : 10.0 752
Files correlati     : ve2.exe
Ricompilazione Demo : [ ]
Commento

Bug 	0001648: Anagrafica Articoli-Gestione Tabella Gruppi cod. art. avanzati

Se tolgo la spunta nel campo "in descrizione" non solo non mi mette la descrizione in quella dell'articolo corrispondente ma anche il codice del gruppo nella costruzioine dell'articolo con la funzionalità "codice guidato"

Se sono su un livello secondario e premo il bottone nuovo non mi propone i default di dove sono come fa se vado in modifica.


git-svn-id: svn://10.65.10.50/trunk@20531 c028cbd2-c16b-5b4b-a496-9718f37d4682
2010-06-01 13:46:32 +00:00

347 lines
8.0 KiB
C++
Executable File

#include "ve2400.h"
#include "ve2401.h"
#include "../db/dblib.h"
#include <automask.h>
#include <diction.h>
#include <recset.h>
#include <utility.h>
///////////////////////////////////////////////////////////
// Utility per gestione struttura codice avanzato
///////////////////////////////////////////////////////////
const TString& root_code()
{
static TString8 _root_code; // Solitamente lungo 3, ma stiamo larghi
if (_root_code.empty())
{
const TString query = "USE FSA SELECT B0=\"X\"";
TISAM_recordset set(query);
if (set.move_first())
_root_code = set.get("CODTAB").as_string();
else
_root_code = " "; // Evito riletture inutili
}
return _root_code;
}
static const TRectype& get_sublevel_info(const TString& code)
{
return cache().get("FSA", code.full() ? code : root_code());
}
///////////////////////////////////////////////////////////
// Maschera dinamica per inserimento codici
///////////////////////////////////////////////////////////
class TCodart_mask : public TAutomask
{
static TCodice_articolo _restart;
TString80 _children;
TString80 _separators;
TString80 _prompts;
bool _add_descr;
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
void start_run();
void create_level(int level, const TString& subcode);
bool build_children();
public:
bool restart() const { return _restart.full(); }
static void restart_with(const TString& cod) { _restart = cod; }
const TString & get_descr_separator(const int level);
int get_descr_order(const int level);
const bool add_descr() { return _add_descr; }
TCodart_mask();
};
TCodice_articolo TCodart_mask::_restart;
bool TCodart_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
{
case 101:
if (e == fe_modify && !o.empty()) // Se cambio il contenuto del primo livello ...
{
_restart = o.get();
stop_run(K_FORCE_CLOSE);
}
break;
default:
break;
}
return true;
}
void TCodart_mask::start_run()
{
first_focus(101);
if (_restart.full())
{
const TString r(_restart);
bool spegni101 = false;
int from = 0;
for (short id = 101; id2pos(id) >= 0; id++)
{
const int len = efield(id).size();
const TString16 part = r.mid(from, len);
if (part.not_empty())
{
set(id, part);
from += len;
if (id == 101)
{
if (build_children())
first_focus(102);
}
else
spegni101 = true;
}
else
break;
}
_restart.cut(0);
enable(101, !spegni101);
}
TAutomask::start_run();
}
int TCodart_mask::get_descr_order(const int level)
{
int order = 0;
const int pos = 48 + (level - 1);
if (level > 0 && _separators.len() >= pos)
{
char ord = _separators[pos];
if (ord > ' ')
order = ord - '0';
}
return order;
}
const TString & TCodart_mask::get_descr_separator(const int level)
{
TString & sep = get_tmp_string(8);
if (level > 0)
{
sep = _separators.mid((level - 1)*6, 6);
sep.trim();
sep = esc(sep);
}
return (const TString & )sep;
}
void TCodart_mask::create_level(int level, const TString& subcode)
{
const TRectype& fsa = get_sublevel_info(subcode);
if (!fsa.empty())
{
const TString4 code = fsa.get("CODTAB"); // Puo' essere diverso da subcode!
TString80 prompt = fsa.get("S0");
if (level > 1)
{
TString16 gprompt = _prompts.mid((level - 2) * 10, 10);
gprompt.trim();
if (gprompt.blank() || !prompt.starts_with(gprompt))
prompt = gprompt;
}
prompt.left_just(30);
const TString& picture = fsa.get("S1");
const int length = picture.len();
TEdit_field& kfld = add_string(100+level, 0, prompt, 1, level, length, "BU");
TEdit_field& dfld = add_string(200+level, 0, "", 40, level, 50, "B", 36);
TFilename tmp; tmp.temp();
ofstream out(tmp);
out << "USE GSA" << endl; //usa la tabella dei sottolivelli articolo
out << "IN CODTAB[1,3] \"" << code << "\" SELECT" << endl;
out << "IN CODTAB[4,0] " << kfld.dlg() << endl;
out << "DI \"" << prompt;
if (length > prompt.len())
out << '@' << length;
out << "\" CODTAB[4,0]" << endl;
out << "DI \"" << HR("Descrizione") << "@50\" S0" << endl;
out << "OU " << kfld.dlg() << " CODTAB[4,0]" << endl;
out << "OU " << dfld.dlg() << " S0" << endl;
out << "CH RE" << endl;
out << "ADD RU mg0 -0 GSA " << code << endl;
out << "EN" << endl;
out.close();
TScanner scan(tmp);
while (scan.pop() != "EN")
kfld.parse_item(scan);
xvt_fsys_remove_file(tmp);
ofstream outd(tmp);
outd << "USE GSA KEY 2 SELECT CODTAB[1,3]==\"" << code << "\"" << endl; //usa la tabella dei sottolivelli articolo
outd << "IN S0 " << dfld.dlg() << endl;
outd << "DI \"" << HR("Descrizione") << "@50\" S0" << endl;
outd << "DI \"" << prompt;
if (length > prompt.len())
outd << '@' << length;
outd << "\" CODTAB[4,0]" << endl;
outd << "CO OU " << kfld.dlg() << endl;
outd << "CH SE" << endl;
outd << "ADD RU mg0 -0 GSA " << code << endl;
outd << "EN" << endl;
outd.close();
TScanner scand(tmp);
while (scand.pop() != "EN")
dfld.parse_item(scand);
xvt_fsys_remove_file(tmp);
set_handlers();
}
}
bool TCodart_mask::build_children()
{
TString8 code = root_code();
code << get(101);
// Non usare qui un TString& children, altrimenti cambia sul piu' bello!
_children = cache().get("GSA", code, "S1");
_separators = cache().get("GSA", code, "S2");
_prompts = cache().get("GSA", code, "S4");
_prompts.left(10);
_prompts.rpad(10);
_prompts << cache().get("GSA", code, "S3");
_add_descr = cache().get("GSA", code, "B0").full();
// Affetto la stringona S1 in sottocodici da 3 caratteri l'uno
for (int i = 0; i < 9; i++)
{
const TString4 subcode = _children.mid(i*3, 3);
if (subcode.full())
create_level(i+2, subcode);
else
break;
}
force_update();
return id2pos(102) > 0;
}
TCodart_mask::TCodart_mask() : TAutomask(TR("Articolo guidato"), 1, 78, 21)
{
add_button(DLG_OK, 0, "", -12, -1, 10, 2);
add_button(DLG_CANCEL, 0, "", -22, -1, 10, 2);
create_level(1, EMPTY_STRING);
}
bool advanced_codart_ask(TString& code, TString& desc)
{
bool ok = false;
bool running = true;
if (code.full())
TCodart_mask::restart_with(code);
code.cut(0);
desc.cut(0);
while (running)
{
TCodart_mask m;
ok = m.run() == K_ENTER;
if (ok)
{
int order[20];
int elements = 0;
int id;
const bool add_des = m.add_descr();
order[0] = 0;
for (id = 101; m.id2pos(id) >= 0; id++, elements++)
{
const int el = id - 101;
if (add_des || id > 101)
order[el] = m.get_descr_order(el);
code << m.get(id);
}
if (!add_des)
elements--;
const int start_id = add_des ? 101 : 102;
while (elements-- > 0)
{
int ord = 1000;
int el = -1;
for (id = start_id; m.id2pos(id) >= 0; id++)
{
if (order[id - 101] < ord)
{
el = id - 101;
ord = order[el];
}
}
if (el >= 0)
{
const int dlg = el + 101;
order[el] = 1001;
const TString descpiece(esc(m.get(dlg + 100)));
if (descpiece.full())
{
if (desc.full())
desc << m.get_descr_separator(el);
desc << descpiece;
}
}
}
running = false;
}
else
running = m.restart();
}
return ok;
}
///////////////////////////////////////////////////////////
// Essenzialissima interfaccia pubblica
///////////////////////////////////////////////////////////
bool advanced_codart_enabled()
{
return root_code().full();
}
bool advanced_codart_handler(TMask_field& fld, KEY key)
{
if (key == K_SPACE)
{
TString code, desc;
if (advanced_codart_ask(code, desc))
{
TMask& msk = fld.mask();
TString desc1 = desc.mid(50);
desc = desc.left(50);
msk.set(F_DESCR, desc);
msk.set(F_DESCRAGG, desc1);
msk.set(F_CODART, code, true);
msk.field(F_CODART).set_focus();
}
}
return true;
}