campo-sirio/lv/lv2300.cpp
lvietri e195fbf05d Patch level :10.0
Files correlati     :
Ricompilazione Demo : [ ]
Commento            :Stampa Venduto per 12 mesi


git-svn-id: svn://10.65.10.50/trunk@18157 c028cbd2-c16b-5b4b-a496-9718f37d4682
2009-01-30 10:26:09 +00:00

310 lines
6.9 KiB
C++
Executable File
Raw Blame History

#include <applicat.h>
#include <automask.h>
#include <textset.h>
#include <reprint.h>
#include "lv0.h"
#include "lv2300a.h"
class TGiri_recordset: public TCSV_recordset
{
public:
TGiri_recordset(): TCSV_recordset("CSV(\"\t\")") {}
};
//Variabili del singolo giorno contrenenti il codice cliente;
//ordine fermata e eventualmente l'ora
struct TPassaggio: public TObject
{
long _codcf;
int _ordfer;
int _ora;
TString4 _iter;
TPassaggio() :_codcf(0),_ordfer(0),_ora(0) {}
TPassaggio(long codcf, int ordfer, int ora, const TString& iter) :_codcf(codcf),_ordfer(ordfer),_ora(ora),_iter(iter) {}
};
class TPassaggi: public TArray
{
int _count;
public:
void add(TPassaggio* p);
TPassaggio& passaggio(int p);
};
TPassaggio& TPassaggi:: passaggio(int p)
{
TPassaggio* h = (TPassaggio*)objptr(p);
if(h==NULL)
{
h = new TPassaggio();
TArray::add(h,p);
}
return *h;
}
void TPassaggi::add(TPassaggio* p)
{
const int of = p->_ordfer;
if(of>0 && of<1000)
{
int first=0;
int last=_count-1;
int guess=0;
while(first<=last)
{
guess=(first+last)/2;
TPassaggio& h = passaggio(guess);
if(h._ordfer==p->_ordfer)
break;
if(h._ordfer>p->_ordfer)
last=guess-1;
else
first=guess+1;
}
TArray::insert(p,guess);
_count++;
}
else
{
TArray::add(p);
}
}
/*Tutti i passaggi settimanali di un singolo itinerario*/
class TSettimana: public TArray
{
public:
void add(int g,TPassaggio* p);
TPassaggio& passaggio(int g, int p);//giorno, fermata
int passaggi(int g) const;
int passaggi() const;
TSettimana():TArray(7){}//7 gg = settimana
};
//Tutti i records all'interno del giorno
int TSettimana::passaggi(int g) const
{
int n=0;
TArray* p= (TArray* ) objptr(g);
if(p!=NULL) n=p->items();
return n;
}
//Ritorno il numero di elementi con + passaggi
int TSettimana::passaggi() const
{
int n=0;
FOR_EACH_ARRAY_ITEM((*this), i, obj)
{
TArray* p = (TArray*) obj;
const int e = p->items();
if(e>n) n=e;
}
return n;
}
void TSettimana::add(int g,TPassaggio* p)
{
TPassaggi* a= (TPassaggi*) objptr(g);
if(a==NULL)
{
a=new TPassaggi();
TArray::add(a,g);
}
a->add(p);
}
TPassaggio& TSettimana ::passaggio(int g,int p)
{
TPassaggi* a= (TPassaggi*) objptr(g);
if(a==NULL)
{
a=new TPassaggi();
TArray::add(a,g);
}
return a->passaggio(p);
}
class TItinerari: public TArray
{
public:
void add(long i,int g,TPassaggio* p);
void add(long i,int g,long codcf, int ordfer, int ora,TString iter);
TSettimana& settimana(long codIti);
};
void TItinerari::add(long i,int g,TPassaggio* p)
{
settimana(i).add(g,p);
}
void TItinerari::add(long i,int g,long codcf, int ordfer, int ora, TString iter)
{
TPassaggio* p = new TPassaggio(codcf,ordfer,ora,iter);
add(i,g,p);
}
TSettimana& TItinerari::settimana(long codIti)
{
TSettimana* a = (TSettimana*)objptr(codIti);
if(a==NULL)
{
a = new TSettimana;
TArray::add(a,codIti);
}
return *a;
}
class TGiri_mask: public TAutomask
{
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TGiri_mask():TAutomask("lv2300a"){}
};
bool TGiri_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
return true;
}
class TGiri_report : public TReport
{
protected:
virtual bool use_mask() { return false; }
public:
TGiri_report(bool settimanale) { load(settimanale ? "lv2300a" : "lv2200z"); }
};
class TGiri_app: public TSkeleton_application
{
protected:
virtual void main_loop();
void elabora(const TMask& mask) const;
};
void TGiri_app::elabora(const TMask& mask) const
{
TISAM_recordset giri("USE LVRCONSPLAN KEY 2\n"
"SELECT (BETWEEN(CODITI,#FROM_CODITI,#TO_CODITI))"
"&&(BETWEEN(CODCF,#FROM_CODCF,#TO_CODCF))"
"&&(BETWEEN(CODAUT,#FROM_CODAUT,#TO_CODAUT))\n"
"FROM DTCONS=#FROM_DATA\n "
"TO DTCONS=#TO_DATA"
);
//inserire parametri filtri
giri.set_var("#FROM_DATA",mask.get_date(F_DATA_FROM));
giri.set_var("#TO_DATA",mask.get_date(F_DATA_TO));
giri.set_var("#FROM_CODITI", TVariant(mask.get(F_CODITI_FROM)));
giri.set_var("#TO_CODITI",TVariant(mask.get(F_CODITI_TO)));
giri.set_var("#FROM_CODAUT",TVariant(mask.get(F_CODAUT_FROM)));
giri.set_var("#TO_CODAUT",TVariant(mask.get(F_CODAUT_TO)));
giri.set_var("#FROM_CODCF",TVariant(mask.get(F_CODCF_FROM)));
giri.set_var("#TO_CODCF",TVariant(mask.get(F_CODCF_TO)));
TItinerari iti;
for(bool ok = giri.move_first();ok;ok=giri.move_next())
{
TDate giorno = giri.get("DTCONS").as_date();
int wday = giorno.wday();//1=luned<65>
long itinerario=giri.get("CODITI").as_int();
TString iter=giri.get("CODITI").as_string();
long cliente=giri.get("CODCF").as_int();
int ordfer=giri.get("ORDFER").as_int();
int ora = 0;//in attesa che venga inserito
iti.add(itinerario,wday,cliente,ordfer,ora,iter);
}
TGiri_report r(true);
TGiri_recordset* giri_set = new TGiri_recordset();
r.set_recordset(giri_set);
FOR_EACH_ARRAY_ITEM(iti,i,obj)//scandisce itinerario e tiene
//buoni solo quelli valorizzati
{
TSettimana& s = *(TSettimana*) obj;
const int max = s.passaggi();
for(int j=0; j<max;j++)
{
giri_set->new_rec();
TString4 str_iti;
str_iti.format("%03d", i);
giri_set->set(0,TVariant(str_iti));
for(int g=1; g<=7;g++)
{
const TPassaggio& pass = s.passaggio(g,j);
const int column = (g-1)*3+1;
giri_set->set(column,pass._codcf);
giri_set->set(column + 1,TVariant(long (pass._ordfer)));
giri_set->set(column + 2,TVariant(long (pass._ora)));
}
}
}
// riporta tutte le variabili del report.
const TString_array& vars = giri.variables();
FOR_EACH_ARRAY_ROW(vars, v, var)
{
const char* varname = var->get(0);
giri_set->set_var(varname, giri.get_var(varname), true);
}
TReport_book b;
bool ok = b.add(r);// Richiede parametri di stampa in base alla maschera omonima
if (ok)
{
if (b.pages() > 0)
b.print_or_preview(); // Stampa effettivamente
else
warning_box (TR("Nessun record estratto per i parametri inseriti"));
}
}
void TGiri_app::main_loop()
{
TGiri_mask m;
while(m.run()==K_ENTER)
{
if(m.get(F_CHOICE)=="S")
{
elabora(m); //Stampa Giro Settimanale
}
else
{
TGiri_report r(false); //Stampa Giro Giornaliero
r.mask2report(m);
TReport_book b;
bool ok = b.add(r); // Richiede parametri di stampa in base alla maschera omonima
if (ok)
{
if (b.pages() > 0)
b.print_or_preview(); // Stampa effettivamente
else
warning_box (TR("Nessun record estratto per i parametri inseriti"));
}
}
}
}
int lv2300(int argc, char* argv[])
{
TGiri_app app;
app.run(argc, argv, TR("Stampa Giri"));
return 0;
}