campo-sirio/lv/lv0500.cpp
guy 361168d5e4 Corretta stampa giri
git-svn-id: svn://10.65.10.50/branches/R_10_00@22723 c028cbd2-c16b-5b4b-a496-9718f37d4682
2012-09-07 14:54:09 +00:00

301 lines
7.4 KiB
C++
Executable File
Raw Blame History

#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;
}