361168d5e4
git-svn-id: svn://10.65.10.50/branches/R_10_00@22723 c028cbd2-c16b-5b4b-a496-9718f37d4682
301 lines
7.4 KiB
C++
Executable File
301 lines
7.4 KiB
C++
Executable File
#include <automask.h>
|
||
#include <execp.h>
|
||
#include <relapp.h>
|
||
|
||
#include "lvlib.h"
|
||
|
||
#include "lvpasplan.h"
|
||
#include "lvperisop.h"
|
||
|
||
#include "lv0500a.h"
|
||
|
||
////////////////
|
||
// MASCHERA //
|
||
////////////////
|
||
class TPass_plan_contr_mask : public TAutomask
|
||
{
|
||
private:
|
||
void proponi_orario();
|
||
void sistema_data(TOperable_field& o);
|
||
|
||
protected:
|
||
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||
|
||
public:
|
||
TPass_plan_contr_mask();
|
||
};
|
||
|
||
void TPass_plan_contr_mask::proponi_orario()
|
||
{
|
||
TSheet_field& sheet = sfield(F_PASPLAN);
|
||
TToken_string& rigamodificata = sheet.row(sheet.items()-1);
|
||
rigamodificata.add("00:00",sheet.cid2index(F_S_ORA));
|
||
}
|
||
|
||
//SISTEMA_DATA: metodo che aggiunge un separatore tra giorno e mese quando necessario
|
||
void TPass_plan_contr_mask::sistema_data(TOperable_field& o)
|
||
{
|
||
TString8 data = o.get();
|
||
if (data.len() < 5)
|
||
{
|
||
data.insert("-", 2);
|
||
o.set(data);
|
||
}
|
||
}
|
||
|
||
bool TPass_plan_contr_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||
{
|
||
switch (o.dlg())
|
||
{
|
||
case F_ORDGIRI:
|
||
if (e == fe_init)
|
||
{
|
||
const int ordinaper = ini_get_int(CONFIG_DITTA, "lv", "Ordgir");
|
||
o.set(ordinaper);
|
||
}
|
||
break;
|
||
case F_PASPLAN:
|
||
switch (e)
|
||
{
|
||
case se_notify_add:
|
||
proponi_orario();
|
||
break;
|
||
default: break;
|
||
}
|
||
break;
|
||
case F_S_DASTAG:
|
||
case F_S_ASTAG:
|
||
if (e == fe_modify)
|
||
sistema_data(o);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
TPass_plan_contr_mask::TPass_plan_contr_mask()
|
||
:TAutomask("lv0500a") {}
|
||
|
||
|
||
////////////////////
|
||
// Applicazione //
|
||
////////////////////
|
||
class TPass_plan_contr : public TRelation_application
|
||
{
|
||
TPass_plan_contr_mask* _mask;
|
||
TRelation* _rel;
|
||
long _codcli;
|
||
long _codcont;
|
||
|
||
private:
|
||
void genera_giri(const long codli); //richiama la generazione giri in automatico
|
||
void kill_duplicates(const TMask& m); //uccide i duplicati e le righe vuote sullo sheet
|
||
|
||
protected:
|
||
virtual void init_query_mode(TMask& m);
|
||
virtual bool user_create();
|
||
virtual bool user_destroy();
|
||
virtual int read(TMask& m);
|
||
virtual int write(const TMask& m);
|
||
virtual int rewrite(const TMask& m);
|
||
virtual bool remove();
|
||
virtual TMask* get_mask(int mode) { return _mask; }
|
||
virtual bool changing_mask(int mode) { return false; }
|
||
|
||
public:
|
||
virtual TRelation* get_relation() const {return (TRelation*)_rel;}
|
||
};
|
||
|
||
///////////////////////////////////////////
|
||
//// FUNZIONI PER READ ////
|
||
///////////////////////////////////////////
|
||
|
||
//READ: ridefinizione metodo read() delle TRelation
|
||
int TPass_plan_contr::read(TMask& m)
|
||
{
|
||
//riempio gli sheet
|
||
const int err = TRelation_application::read(m);
|
||
if (err == NOERR)
|
||
{
|
||
TSheet_field& pc = m.sfield(F_PASPLAN);
|
||
|
||
if (pc.empty())
|
||
{
|
||
//questo ciclo crea le sette righe vuote
|
||
const char* const ora = "00:00";
|
||
for (int i = 1; i<=7; ++i)
|
||
{
|
||
TToken_string& row = pc.row(-1); //crea una nuova riga dello sheet
|
||
row.add(i,pc.cid2index(F_S_GGCONS)); //aggiunge al posto giusto il numero del giorno della settimana
|
||
row.add(ora,pc.cid2index(F_S_ORA)); //propone l'ora di arrivo in automatico
|
||
pc.check_row(pc.items()-1); //forza la maschera a fare la decodifica dei codici
|
||
}
|
||
pc.force_update(); //forza l'update dello sheet, in modo da rendere visibili i cambiamenti fatti
|
||
}
|
||
}
|
||
return err;
|
||
}
|
||
|
||
///////////////////////////////////////////
|
||
//// FUNZIONI PER WRITE E REWRITE ////
|
||
///////////////////////////////////////////
|
||
|
||
//GENERA_GIRI: questa funzione richiama la generazione giri in automatico...
|
||
//..se questa possibilit<69> <20> prevista in configurazione
|
||
void TPass_plan_contr::genera_giri(const long codcli)
|
||
{
|
||
//la scrittura automatica dei giri viene fatta solo se <20> settato l'apposito flag...
|
||
//...nella configurazione di modulo
|
||
if (ini_get_bool(CONFIG_DITTA, "lv", "Autgiri"))
|
||
{
|
||
//richiamo il programma lv2100.cpp per generare i giri in autmatico dalla data odierna...
|
||
//...alla data dell'ultimo giro gi<67> generato
|
||
TFilename fname;
|
||
fname.tempdir();
|
||
fname.add("autogiri.ini");
|
||
|
||
TConfig ini(fname,"main");
|
||
ini.set("transaction", "update");
|
||
ini.set_paragraph("167");
|
||
ini.set("CODCF", codcli);
|
||
ini.set_paragraph("main");
|
||
|
||
TString str;
|
||
str << "lv2 -0 -i" << fname;
|
||
|
||
TExternal_app app(str);
|
||
app.run();
|
||
fname.fremove();
|
||
}
|
||
}
|
||
|
||
//KILL_DUPLICATES: questa funzione elimina dallo sheet tutte le righe che non contengono dati di interesse...
|
||
//...e/o le righe duplicate sullo sheet
|
||
void TPass_plan_contr::kill_duplicates(const TMask& m)
|
||
{
|
||
TSheet_field& pc = m.sfield(F_PASPLAN);
|
||
|
||
//ciclo che elimina le righe che non contengono dati di interesse dallo sheet
|
||
FOR_EACH_SHEET_ROW_BACK (pc, r, row)
|
||
if (row->get_int(2) == 0)
|
||
pc.destroy(r, false);
|
||
|
||
//ciclo che elimina tutti i duplicati dallo sheet
|
||
FOR_EACH_SHEET_ROW_BACK (pc, r1, row1)
|
||
if (pc.rows_array().find(*row1) < r1)
|
||
pc.destroy(r1,false);
|
||
}
|
||
|
||
//WRITE: ridefinizione metodo write delle TRelation
|
||
int TPass_plan_contr::write(const TMask& m)
|
||
{
|
||
if (_mask->field(F_CODCF).empty() || _mask->field(F_CODCONT).empty())
|
||
return _isnocurkey;
|
||
|
||
kill_duplicates(m);
|
||
|
||
const int err = TRelation_application::write(m);
|
||
|
||
TSheet_field& pc = m.sfield(F_PASPLAN);
|
||
|
||
if (err == NOERR && pc.items() > 0)
|
||
{
|
||
const long codcli = _mask->get_long(F_CODCF);
|
||
|
||
genera_giri(codcli);
|
||
}
|
||
return err;
|
||
}
|
||
|
||
//ridefinizione metodo rewrite delle TRelation
|
||
int TPass_plan_contr::rewrite(const TMask& m)
|
||
{
|
||
if (_mask->field(F_CODCF).empty() || _mask->field(F_CODCONT).empty())
|
||
return _isnocurkey;
|
||
|
||
kill_duplicates(m);
|
||
|
||
const int err = TRelation_application::rewrite(m);
|
||
|
||
TSheet_field& pc = m.sfield(F_PASPLAN);
|
||
|
||
if (err == NOERR && pc.items() > 0)
|
||
{
|
||
const long codcli = _mask->get_long(F_CODCF);
|
||
|
||
genera_giri(codcli);
|
||
}
|
||
return err;
|
||
}
|
||
|
||
///////////////////////////////////////////
|
||
//// FUNZIONI PER REMOVE ////
|
||
///////////////////////////////////////////
|
||
|
||
//REMOVE: ridefinizione del metodo remove delle TRelation
|
||
bool TPass_plan_contr::remove()
|
||
{
|
||
TSheet_field& ps = _mask->sfield(F_PERSOSP);
|
||
ps.autosave(*_rel);
|
||
ps.record()->remove();
|
||
|
||
TSheet_field& pc = _mask->sfield(F_PASPLAN);
|
||
pc.autosave(*_rel);
|
||
pc.record()->remove();
|
||
|
||
return true;
|
||
}
|
||
|
||
///////////////////////////////////////////
|
||
//// METODI PRIVATI ////
|
||
///////////////////////////////////////////
|
||
|
||
//questa funzione forza i campi F_CODCF e F_CODCONT quando...
|
||
//...vengono passati come parametri al programma
|
||
void TPass_plan_contr::init_query_mode(TMask& m)
|
||
{
|
||
if (_codcli > 0)
|
||
{
|
||
m.set(F_CODCF,_codcli);
|
||
m.set(F_CODCONT,_codcont,0x2);
|
||
if (find(0))
|
||
modify_mode();
|
||
}
|
||
}
|
||
|
||
//costruttore
|
||
bool TPass_plan_contr::user_create()
|
||
{
|
||
_rel = new TRelation(LF_LVCONDV);
|
||
_mask = new TPass_plan_contr_mask;
|
||
|
||
//se gli sono stati passati pi<70> parametri, allora setto le variabili globali _codcli e _codcont...
|
||
//...con i parametri desiderati, se no li setto a zero
|
||
if (argc() > 2)
|
||
{
|
||
_codcli = atol(argv(2));
|
||
_codcont = atol(argv(3));
|
||
}
|
||
else
|
||
{
|
||
_codcli = 0;
|
||
_codcont = 0;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
//distruttore
|
||
bool TPass_plan_contr::user_destroy()
|
||
{
|
||
delete _mask;
|
||
return true;
|
||
}
|
||
|
||
int lv0500(int argc, char* argv[])
|
||
{
|
||
TPass_plan_contr a;
|
||
a.run(argc, argv, TR("Archivi Lavanderie"));
|
||
return 0;
|
||
}
|