campo-sirio/ve/ve2401.cpp
guy d5de78355a Patch level : 4.0
Files correlati     : ve2
Ricompilazione Demo : [ ]
Commento            :
Migliorata gestione codici articoli avanzati


git-svn-id: svn://10.65.10.50/trunk@15448 c028cbd2-c16b-5b4b-a496-9718f37d4682
2007-06-25 15:43:58 +00:00

174 lines
4.1 KiB
C++
Executable File

#include "ve2400.h"
#include "ve2401.h"
#include <automask.h>
#include <diction.h>
#include <recarray.h>
#include <recset.h>
///////////////////////////////////////////////////////////
// Utility per gestione struttura codice avanzato
///////////////////////////////////////////////////////////
const TString& root_code()
{
static TString4 _root_code;
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 dianamica per inserimento codici
///////////////////////////////////////////////////////////
class TCodart_mask : public TAutomask
{
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
void create_level(int level, const TString& subcode);
void rebuild();
public:
TCodart_mask();
};
bool TCodart_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
{
case 101:
if (e == fe_modify) // Se cambio il contenuto del primo livello ...
rebuild(); // Ricostruisco la maschera
break;
default:
break;
}
return true;
}
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"); prompt.left_just(21);
const TString& picture = fsa.get("S1");
const int length = picture.len();
TEdit_field& kfld = add_string(100+level, 0, prompt, 1, level, length, "B");
TEdit_field& dfld = add_string(200+level, 0, "", 40, level, 36, "D");
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 << "EN" << endl;
out.close();
TScanner scan(tmp);
while (scan.pop() != "EN")
kfld.parse_item(scan);
xvt_fsys_removefile(tmp);
set_handlers();
}
}
void TCodart_mask::rebuild()
{
TArray& a = fields_array();
int i = 0;
for (i = a.last(); i > 3; i--)
a.destroy(i);
TString8 code = root_code();
code << get(101);
const TString& children = cache().get("GSA", code, "S1");
for (i = 0; i < 8; i++)
{
const TString& subcode = children.mid(i*3, 3);
if (subcode.full())
create_level(i+2, subcode);
else
break;
}
force_update();
}
TCodart_mask::TCodart_mask() : TAutomask(TR("Articolo guidato"), 1, 78, 13)
{
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_get_codart(TString& code, TString& desc)
{
TCodart_mask m;
const bool ok = m.run() == K_ENTER;
if (ok)
{
code.cut(0);
desc.cut(0);
for (short id = 101; m.id2pos(id) >= 0; id++)
{
code << m.get(id);
if (id == 102)
desc << ' ';
desc << m.get(di+100);
}
}
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_get_codart(code, desc))
{
TMask& msk = fld.mask();
msk.set(F_DESCR, desc);
msk.set(F_CODART, code, true);
}
}
return true;
}