campo-sirio/sv/sv0100.cpp
augusto c07e5aabac sv0.cpp :aggiunti commenti
sv0100.cpp : parametro in uppercase


git-svn-id: svn://10.65.10.50/trunk@5231 c028cbd2-c16b-5b4b-a496-9718f37d4682
1997-09-19 09:57:34 +00:00

344 lines
8.1 KiB
C++
Executable File

#include <config.h>
#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 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("Giornaliera|Settimanale|Quindicinale|Mensile|"
"Bimestrale|Trimestrale|Quadrimestrale|Semestrale|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;
for (int l = 0; l <= cal.last_level(); l++)
{
if (l && !cal.enabled(l))
continue;
row = "A";
if (l) row << l;
row.add("Codice articolo");
if (l) row << '[' << l << ']';
list.add(row);
}
TCodgiac_livelli cgl;
for (l = 0; l <= cgl.last_level(); l++)
{
if (l && !cgl.enabled(l))
continue;
row = "L";
if (l) row << l;
row.add("Livello giacenza");
if (l) row << '[' << l << ']';
list.add(row);
}
list.add("D|Tipo documento");
list.add("V|Categoria vendita");
list.add("C|Codice cliente");
list.add("Z|Codice zona");
list.add("G|Codice agente");
list.add("M|Codice magazzino");
}
bool TPSV_tabapp::user_create()
{
const bool ok = TSV_tabapp::user_create();
TMask& m = *get_mask(MODE_QUERY);
m.set_handler(FPSV_MULTIPLO, multiplo_handler);
m.set_handler(FPSV_CHIAVE, chiave_handler);
m.sfield(FPSV_CHIAVE).set_notify(chiave_notify);
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");
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);
sheet.check_row(r);
}
return TSV_tabapp::read(m);
}
void TPSV_tabapp::mask2rec(const TMask& m)
{
TString16 cod;
TToken_string s1, s2;
TSheet_field& sheet = m.sfield(FPSV_CHIAVE);
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);
}
}
TRectype& rec = get_relation()->curr();
rec.put("S1", s1);
rec.put("S2", s2);
}
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("Le statistiche sono raggruppate per cliente");
break;
case 'G':
if (!PSV_app()._stats.grp_agente())
ok = error_box("Le statistiche sono raggruppate per agente");
break;
case 'L':
if (!PSV_app()._stats.grp_giacenza())
ok = error_box("Le statistiche sono raggruppate per livello di giacenza");
break;
case 'M':
if (!PSV_app()._stats.grp_magazzino())
ok = error_box("Le statistiche sono raggruppate per magazzino");
break;
case 'Z':
if (!PSV_app()._stats.grp_zona())
ok = error_box("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 (found)
{
ok = error_box("Il codice %s inserito alla riga %d e' gia'\n"
"utilizzato in una riga precedente.",
(const char*)campo, r+1);
}
else
used.add(campo);
}
}
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, "Tabella");
delete app; // Guy's humour
}
else
error_box("Manca il nome della tabella");
return 0;
}