22089a13b3
Files correlati : sv0.exe sv1.exe Ricompilazione Demo : [ ] Commento : Bug 0001881; Aggiungere ordinamento per ragione sociale nelle statistiche per clien Aggiungere ordinamento per ragione sociale nelle statistiche per cliente git-svn-id: svn://10.65.10.50/branches/R_10_00@22289 c028cbd2-c16b-5b4b-a496-9718f37d4682
455 lines
11 KiB
C++
Executable File
455 lines
11 KiB
C++
Executable File
#include <tabapp.h>
|
|
|
|
#include "../mg/mglib.h"
|
|
|
|
#include "sv0.h"
|
|
#include "svlib01.h"
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// Applicazione generica per la gestione di tabelle di sv
|
|
///////////////////////////////////////////////////////////
|
|
|
|
class TSV_tabapp : public Tab_application
|
|
{
|
|
protected:
|
|
virtual TString& get_mask_name(TString& name) const;
|
|
};
|
|
|
|
TString& TSV_tabapp::get_mask_name(TString& name) const
|
|
{
|
|
name = get_tabname();
|
|
if (name[0] == '%')
|
|
name.ltrim(1);
|
|
name.insert("svtb", 0);
|
|
return name;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// Gestione tabella PSV
|
|
///////////////////////////////////////////////////////////
|
|
|
|
#include "svtbpsv.h"
|
|
|
|
class TPSV_tabapp : public TSV_tabapp
|
|
{
|
|
enum { MAX_ROWS = 8 };
|
|
|
|
TStats_agg _stats;
|
|
|
|
protected:
|
|
virtual void on_config_change();
|
|
virtual bool user_create();
|
|
virtual void init_insert_mode(TMask& m);
|
|
virtual int read(TMask& m);
|
|
virtual int write(const TMask& m);
|
|
virtual int rewrite(const TMask& m);
|
|
void mask2rec(const TMask& m); // usata da re/write
|
|
|
|
public:
|
|
static bool multiplo_handler(TMask_field& f, KEY k);
|
|
static bool chiave_handler(TMask_field& f, KEY k);
|
|
static bool campo_handler(TMask_field& f, KEY k);
|
|
static bool artfld_handler(TMask_field& f, KEY k);
|
|
static bool chiave_notify(TSheet_field& s, int r, KEY k);
|
|
|
|
void set_frequency();
|
|
void fill_field_list(TMask& m);
|
|
};
|
|
|
|
inline TPSV_tabapp& PSV_app() { return (TPSV_tabapp&)main_app(); }
|
|
|
|
void TPSV_tabapp::on_config_change()
|
|
{
|
|
_stats.init();
|
|
set_frequency();
|
|
}
|
|
|
|
void TPSV_tabapp::init_insert_mode(TMask& m)
|
|
{
|
|
m.set(FPSV_MULTIPLO, m.get(FPSV_FREQUENZA));
|
|
}
|
|
|
|
void TPSV_tabapp::set_frequency()
|
|
{
|
|
TMask& m = curr_mask();
|
|
|
|
char freq[2] = { frequency2char(_stats.frequency()), '\0' };
|
|
m.set(FPSV_FREQUENZA, freq);
|
|
|
|
TList_field& multiplo = (TList_field&)m.field(FPSV_MULTIPLO);
|
|
|
|
TToken_string std_codes("G|S|Q|1|2|3|4|6|A");
|
|
TToken_string std_descr;
|
|
|
|
std_descr.add(TR("Giornaliera"));
|
|
std_descr.add(TR("Settimanale"));
|
|
std_descr.add(TR("Quindicinale"));
|
|
std_descr.add(TR("Mensile"));
|
|
std_descr.add(TR("Bimestrale"));
|
|
std_descr.add(TR("Trimestrale"));
|
|
std_descr.add(TR("Quadrimestrale"));
|
|
std_descr.add(TR("Semestrale"));
|
|
std_descr.add(TR("Annuale"));
|
|
|
|
TToken_string codes(8), descr(80);
|
|
switch(_stats.frequency())
|
|
{
|
|
case fs_giornaliera :codes = std_codes; break;
|
|
case fs_settimanale :codes = "S|3|6|A"; break;
|
|
case fs_quindicinale :codes = std_codes.mid(4); break;
|
|
case fs_mensile :codes = std_codes.mid(6); break;
|
|
case fs_bimestrale :codes = "2|4|6|A"; break;
|
|
case fs_trimestrale :codes = "3|6|A"; break;
|
|
case fs_quadrimestrale:codes = "4|A"; break;
|
|
case fs_semestrale :codes = "6|A"; break;
|
|
case fs_annuale :codes = "A"; break;
|
|
default :break;
|
|
}
|
|
|
|
for (const char* cod = codes.get(0); cod; cod = codes.get())
|
|
{
|
|
TString16 tmp = cod;
|
|
const int pos = std_codes.get_pos(tmp);
|
|
CHECK(pos >= 0, "Invalid frequency char");
|
|
tmp = std_descr.get(pos);
|
|
descr.add(tmp);
|
|
}
|
|
|
|
multiplo.replace_items(codes, descr);
|
|
}
|
|
|
|
void TPSV_tabapp::fill_field_list(TMask& m)
|
|
{
|
|
TSheet_field& s = m.sfield(FPSV_CHIAVE);
|
|
TMask& sm = s.sheet_mask();
|
|
|
|
TString_array& list = sm.efield(SPSV_CAMPO).sheet()->rows_array();
|
|
list.destroy();
|
|
|
|
TToken_string row(80);
|
|
|
|
TCodart_livelli cal;
|
|
int l;
|
|
for (l = 0; l <= cal.last_level(); l++)
|
|
{
|
|
if (l && !cal.enabled(l))
|
|
continue;
|
|
|
|
row = "A";
|
|
if (l) row << l;
|
|
|
|
row.add(TR("Codice articolo"));
|
|
if (l) row << '[' << l << ']';
|
|
|
|
list.add(row);
|
|
}
|
|
|
|
TCodgiac_livelli cgl;
|
|
bool is_articolo = FALSE;
|
|
|
|
for (l = 0; l <= cgl.last_level(); l++)
|
|
{
|
|
if (l && !cgl.enabled(l))
|
|
continue;
|
|
|
|
is_articolo = TRUE;
|
|
row = "L";
|
|
if (l) row << l;
|
|
|
|
row.add(TR("Livello giacenza"));
|
|
if (l) row << '[' << l << ']';
|
|
list.add(row);
|
|
}
|
|
if (is_articolo)
|
|
{
|
|
row = "B";
|
|
row.add(TR("Campo dell'anagrafica articoli"));
|
|
list.add(row);
|
|
}
|
|
|
|
row = "D";
|
|
row.add(TR("Tipo documento"));
|
|
list.add(row);
|
|
row = "V";
|
|
row.add(TR("Categoria vendita"));
|
|
list.add(row);
|
|
row = "C";
|
|
row.add(TR("Codice cliente/fornitore"));
|
|
list.add(row);
|
|
row = "H";
|
|
row.add(TR("Campo dell'anagrafica clienti/fornitori"));
|
|
list.add(row);
|
|
row = "Z";
|
|
row.add(TR("Codice zona"));
|
|
list.add(row);
|
|
row = "G";
|
|
row.add(TR("Codice agente"));
|
|
list.add(row);
|
|
row = "M";
|
|
row.add(TR("Codice magazzino"));
|
|
list.add(row);
|
|
}
|
|
|
|
bool TPSV_tabapp::user_create()
|
|
{
|
|
const bool ok = TSV_tabapp::user_create();
|
|
|
|
TMask& m = *get_mask(MODE_QUERY);
|
|
TMask& sm = m.sfield(FPSV_CHIAVE).sheet_mask();
|
|
|
|
m.set_handler(FPSV_MULTIPLO, multiplo_handler);
|
|
m.set_handler(FPSV_CHIAVE, chiave_handler);
|
|
m.sfield(FPSV_CHIAVE).set_notify(chiave_notify);
|
|
|
|
|
|
sm.set_handler(SPSV_CAMPO, campo_handler);
|
|
sm.set_handler(SPSV_ARTFLD, artfld_handler);
|
|
|
|
fill_field_list(m);
|
|
|
|
return ok;
|
|
}
|
|
|
|
int TPSV_tabapp::read(TMask& m)
|
|
{
|
|
const TRectype& rec = get_relation()->curr();
|
|
|
|
TSheet_field& sheet = m.sfield(FPSV_CHIAVE);
|
|
sheet.destroy();
|
|
|
|
TToken_string s1 = rec.get("S1");
|
|
TToken_string s2 = rec.get("S2");
|
|
TToken_string s4 = rec.get("S4");
|
|
TString s5 = rec.get("S5");
|
|
|
|
if (s4.not_empty())
|
|
if (s4[s4.len() - 1] == '|' && s5[0] == '|') s4 << " ";
|
|
s4 <<s5;
|
|
|
|
|
|
int r = 0;
|
|
for (const char* cod = s1.get(0); cod; cod = s1.get(), r++)
|
|
{
|
|
TToken_string& row = sheet.row(r);
|
|
row = cod;
|
|
cod = s2.get(r);
|
|
row.add(cod);
|
|
row.add("");
|
|
cod = s4.get(r);
|
|
row.add(cod);
|
|
sheet.check_row(r);
|
|
}
|
|
|
|
return TSV_tabapp::read(m);
|
|
}
|
|
|
|
void TPSV_tabapp::mask2rec(const TMask& m)
|
|
{
|
|
TString16 cod;
|
|
TToken_string s1, s2, s4;
|
|
TSheet_field& sheet = m.sfield(FPSV_CHIAVE);
|
|
bool excedeed = FALSE;
|
|
|
|
for (int r = 0; r < sheet.items() && r < MAX_ROWS; r++)
|
|
{
|
|
TToken_string& row = sheet.row(r);
|
|
cod = row.get(0);
|
|
if (!cod.blank())
|
|
{
|
|
s1.add(cod);
|
|
cod = row.get();
|
|
s2.add(cod);
|
|
cod = row.get(3);
|
|
cod.trim();
|
|
const int l = cod.len()+1;
|
|
excedeed = s4.len() + l > 40;
|
|
if (!excedeed)
|
|
s4.add(cod);
|
|
}
|
|
}
|
|
|
|
TRectype& rec = get_relation()->curr();
|
|
rec.put("S1", s1);
|
|
rec.put("S2", s2);
|
|
rec.put("S4", s4.left(20));
|
|
rec.put("S5", s4.mid(20));
|
|
if (excedeed)
|
|
warning_box(TR("Attenzione !! Sono stati definiti\ntroppi campi di anagrafica articoli.\nVerranno memorizzati solo i primi"));
|
|
}
|
|
|
|
int TPSV_tabapp::write(const TMask& m)
|
|
{
|
|
mask2rec(m);
|
|
return TSV_tabapp::write(m);
|
|
}
|
|
|
|
int TPSV_tabapp::rewrite(const TMask& m)
|
|
{
|
|
mask2rec(m);
|
|
return TSV_tabapp::rewrite(m);
|
|
}
|
|
|
|
bool TPSV_tabapp::multiplo_handler(TMask_field& f, KEY k)
|
|
{
|
|
if (k == K_SPACE)
|
|
{
|
|
TMask& m = f.mask();
|
|
TFrequenza_statistiche base = char2frequency(m.get(FPSV_FREQUENZA)[0]);
|
|
TFrequenza_statistiche freq = char2frequency(f.get()[0]);
|
|
if (base == freq)
|
|
{
|
|
m.enable(FPSV_NUMERO);
|
|
if (m.is_running())
|
|
m.set(FPSV_NUMERO, 1);
|
|
}
|
|
else
|
|
{
|
|
int n = divide(freq, base);
|
|
m.set(FPSV_NUMERO, n);
|
|
m.disable(FPSV_NUMERO);
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
bool TPSV_tabapp::chiave_notify(TSheet_field& s, int r, KEY k)
|
|
{
|
|
bool ok = TRUE;
|
|
if (k == K_INS)
|
|
ok = s.items() < MAX_ROWS;
|
|
return ok;
|
|
}
|
|
|
|
bool TPSV_tabapp::chiave_handler(TMask_field& f, KEY k)
|
|
{
|
|
bool ok = TRUE;
|
|
if (k == K_ENTER)
|
|
{
|
|
TSheet_field& sheet = (TSheet_field&)f;
|
|
TToken_string used;
|
|
TString16 campo;
|
|
for (int r = 0; r < sheet.items(); r++)
|
|
{
|
|
TToken_string& row = sheet.row(r);
|
|
campo = row.get(0);
|
|
|
|
if (campo.blank())
|
|
continue;
|
|
|
|
switch(campo[0])
|
|
{
|
|
case 'C':
|
|
if (!PSV_app()._stats.grp_cliente())
|
|
ok = error_box(TR("Le statistiche sono raggruppate per cliente"));
|
|
break;
|
|
case 'G':
|
|
if (!PSV_app()._stats.grp_agente())
|
|
ok = error_box(TR("Le statistiche sono raggruppate per agente"));
|
|
break;
|
|
case 'L':
|
|
if (!PSV_app()._stats.grp_giacenza())
|
|
ok = error_box(TR("Le statistiche sono raggruppate per livello di giacenza"));
|
|
break;
|
|
case 'M':
|
|
if (!PSV_app()._stats.grp_magazzino())
|
|
ok = error_box(TR("Le statistiche sono raggruppate per magazzino"));
|
|
break;
|
|
case 'Z':
|
|
if (!PSV_app()._stats.grp_zona())
|
|
ok = error_box(TR("Le statistiche sono raggruppate per zona"));
|
|
break;
|
|
default : break;
|
|
}
|
|
|
|
bool found = used.get_pos(campo) >= 0;
|
|
if (!found && (campo[0] == 'A' || campo[0] == 'L'))
|
|
{
|
|
char str[2]; str[0] = campo[0]; str[1] = '\0';
|
|
found = used.get_pos(str) >= 0;
|
|
}
|
|
|
|
if (campo[0] != 'B' && found )
|
|
{
|
|
ok = error_box(FR("Il codice %s inserito alla riga %d e' gia'\nutilizzato in una riga precedente."),
|
|
(const char*)campo, r+1);
|
|
}
|
|
else
|
|
used.add(campo);
|
|
}
|
|
}
|
|
return ok;
|
|
}
|
|
|
|
bool TPSV_tabapp::campo_handler(TMask_field& f, KEY k)
|
|
{
|
|
if (f.to_check(k,TRUE))
|
|
{
|
|
const bool is_fld = f.get()== "B" || f.get()== "H";
|
|
|
|
if (!is_fld)
|
|
f.mask().reset(SPSV_ARTFLD);
|
|
f.mask().field(SPSV_ARTFLD).check_type(is_fld ? CHECK_REQUIRED : CHECK_NONE);
|
|
f.mask().enable(SPSV_ARTFLD, is_fld);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
bool TPSV_tabapp::artfld_handler(TMask_field& f, KEY k)
|
|
{
|
|
bool ok = TRUE;
|
|
switch (k)
|
|
{
|
|
case K_TAB:
|
|
case K_ENTER:
|
|
if (!f.empty() && f.to_check(k))
|
|
{
|
|
const bool is_anamag = f.mask().get(SPSV_CAMPO) == "B";
|
|
const TRectype rec(is_anamag ? LF_ANAMAG : LF_CLIFO);
|
|
TString16 field = f.get();
|
|
int pos = field.find('[');
|
|
if (pos > 0)
|
|
field.cut(pos);
|
|
if (!rec.exist(field))
|
|
ok = f.error_box(FR("Il campo '%s' non esiste."), (const char*)field);
|
|
}
|
|
break;
|
|
case K_F9:
|
|
{
|
|
const bool is_anamag = f.mask().get(SPSV_CAMPO) == "B";
|
|
TRelation rel(is_anamag ? LF_ANAMAG : LF_CLIFO);
|
|
TRelation_description rd(rel);
|
|
if (rd.choose_field(f.get()))
|
|
f.set(rd.field_name());
|
|
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return ok;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// Pseudo main
|
|
///////////////////////////////////////////////////////////
|
|
|
|
int sv0100(int argc, char* argv[])
|
|
{
|
|
TApplication::check_parameters(argc, argv);
|
|
if (argc > 2)
|
|
{
|
|
TFixed_string tab(argv[2]);
|
|
|
|
TSV_tabapp* app;
|
|
if (tab.upper() == "PSV")
|
|
app = new TPSV_tabapp;
|
|
else
|
|
app = new TSV_tabapp;
|
|
app->run(argc, argv, TR("Tabella"));
|
|
delete app; // Guy's humour
|
|
}
|
|
else
|
|
error_box(TR("Manca il nome della tabella"));
|
|
return 0;
|
|
}
|