b76a71a5c9
Files correlati : lv2 Ricompilazione Demo : [ ] Commento : Correzione Riepilogo Bolle di Lavanderie git-svn-id: svn://10.65.10.50/branches/R_10_00@22240 c028cbd2-c16b-5b4b-a496-9718f37d4682
388 lines
11 KiB
C++
Executable File
388 lines
11 KiB
C++
Executable File
#include <applicat.h>
|
||
#include <automask.h>
|
||
#include <config.h>
|
||
#include <progind.h>
|
||
#include <reprint.h>
|
||
#include <textset.h>
|
||
|
||
#include "lvlib.h"
|
||
|
||
#include "lv2700a.h"
|
||
|
||
class TRiepBolle_recordset: public TCSV_recordset
|
||
{
|
||
public:
|
||
TRiepBolle_recordset(): TCSV_recordset("CSV(\"\t\")") {}
|
||
};
|
||
|
||
struct TStruttura: public TObject
|
||
{
|
||
long _cliente;
|
||
TString _articolo;
|
||
TString _descr;
|
||
TDate _dataDoc;
|
||
long _numeroDoc;
|
||
long _qta;
|
||
TStruttura():_cliente(0),_numeroDoc(0),_qta(0) {}
|
||
TStruttura(long cliente, const TString& articolo, const TString& descr,
|
||
TDate dataDoc, int numeroDoc, long qta):_cliente(cliente),_articolo(articolo),
|
||
_descr(descr),_dataDoc(dataDoc),_numeroDoc(numeroDoc),_qta(qta) {}
|
||
};
|
||
|
||
struct TStrutturaData: public TObject
|
||
{
|
||
TDate _dataDoc;
|
||
long _numeroDoc;
|
||
long _cliente;
|
||
int _posizione;
|
||
TStrutturaData():_cliente(0),_numeroDoc(0),_posizione(0) {}
|
||
TStrutturaData(int posizione, int cliente,
|
||
TDate dataDoc, int numeroDoc):_posizione(posizione), _dataDoc(dataDoc),_numeroDoc(numeroDoc) {}
|
||
};
|
||
|
||
|
||
class TRiepBolle_mask: public TAutomask
|
||
{
|
||
protected:
|
||
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||
public:
|
||
TRiepBolle_mask():TAutomask("lv2700a"){}
|
||
};
|
||
|
||
bool TRiepBolle_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||
{
|
||
switch (o.dlg())
|
||
{
|
||
case F_DATA_DA:
|
||
if (e == fe_init && o.empty())
|
||
{
|
||
TDate oggi(TODAY);
|
||
oggi.set_day(1);
|
||
o.set(oggi.string());
|
||
}
|
||
break;
|
||
default: break;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
class TRiepBolle_report : public TReport
|
||
{
|
||
protected:
|
||
virtual bool use_mask() { return false; }
|
||
};
|
||
|
||
class TRiepBolle_app: public TSkeleton_application
|
||
{
|
||
protected:
|
||
virtual void main_loop();
|
||
void elabora(const TMask& mask) const;
|
||
TString get_query(bool isArticolo,const TMask& mask) const;
|
||
};
|
||
|
||
TString TRiepBolle_app::get_query(bool isArticolo,const TMask& mask) const
|
||
{
|
||
/*
|
||
RICHIESTA QUERY:
|
||
estrazione di tutte le bolle in base ai range della parametrica:
|
||
- cliente
|
||
- data
|
||
- zona
|
||
Inoltre estrarre in base alla causale di lavanderia tutte quelle
|
||
righe che non sono di reso (2000@.B2!='X').
|
||
Dalla causale di lavanderia agganciare la causale di magazzino
|
||
consegnata e verificare che abbiano il segno '+' nel campo
|
||
consegnato mese (3000@.S2[37,38] ='+1').
|
||
le bolle sono determinate dal file di configurazione Ditta.ini
|
||
*/
|
||
|
||
//Stringhe x composizione query
|
||
TString query, select, between, orderBy, join;
|
||
|
||
//Richiamo parametri della ditta di configurazione file Ditta.ini
|
||
//const TString4 codnum = ini_get_string(CONFIG_DITTA, "lv", "NUM_GEN");
|
||
const TString4 tipodoc = ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_GEN");
|
||
|
||
select << "USE RDOC KEY 1\n";
|
||
select << "SELECT ((DOC.TIPODOC='" << tipodoc << "')&&";
|
||
|
||
if(!mask.get_bool(F_CHECK_NO_RESI)){
|
||
select << "(2000@.B2!='X')&&";
|
||
}
|
||
if(mask.get_bool(F_CHECK_FATT)){
|
||
select << "(3000@.S2[37,38] ='+1')&&";
|
||
}
|
||
|
||
between << "(BETWEEN(DOC.ZONA,#F_ZONA_FROM,#F_ZONA_FROM))&&(BETWEEN(DOC.DATADOC,#F_DATA_FROM,#F_DATA_TO))&&(STR(BETWEEN(DOC.CODCF,#F_CODCF_FROM,#F_CODCF_TO))))\n";
|
||
|
||
if(isArticolo)
|
||
orderBy << "BY DOC.CODCF CODART DOC.DATADOC NDOC\n";
|
||
else
|
||
orderBy << "BY DOC.CODCF DOC.DATADOC NDOC\n";
|
||
|
||
join << "JOIN DOC TO RDOC ALIAS 1000 INTO CODNUM==CODNUM ANNO==ANNO PROVV==PROVV NDOC==NDOC\n";
|
||
|
||
if (!mask.get_bool(F_CHECK_NO_RESI))
|
||
join << "JOIN &LVCAU TO RDOC ALIAS 2000 INTO CODTAB==CODAGG1\n";
|
||
if (mask.get_bool(F_CHECK_FATT))
|
||
join << "JOIN %CAU TO &LVCAU ALIAS 3000 INTO CODTAB==S2\n";
|
||
|
||
//from_ << "FROM CODNUM='" << codnum << "'\n";
|
||
//to_ << "TO CODNUM='" << codnum << "'";
|
||
|
||
query << select << between << orderBy << join;
|
||
|
||
return query;
|
||
}
|
||
|
||
class TRiepilogo: public TArray
|
||
{
|
||
public:
|
||
void add(int count,long cliente, const TString& articolo, const TString& descr,
|
||
const TDate& dataDoc, long numeroDoc, long qta);
|
||
};
|
||
|
||
class TRiepilogoData: public TArray
|
||
{
|
||
public:
|
||
void add(int posizione, long cliente, const TDate& dataDoc, long numeroDoc);
|
||
};
|
||
|
||
void TRiepilogo::add(int count,long cliente, const TString& articolo, const TString& descr,
|
||
const TDate& dataDoc, long numeroDoc, long qta)
|
||
{
|
||
TStruttura* struttura = new TStruttura(cliente,articolo, descr,dataDoc,numeroDoc,qta);
|
||
TArray::add(struttura,count);
|
||
}
|
||
|
||
void TRiepilogoData::add(int posizione, long cliente, const TDate& dataDoc, long numeroDoc)
|
||
{
|
||
TStrutturaData* strutturaData = new TStrutturaData(posizione,cliente, dataDoc,numeroDoc);
|
||
TArray::add(strutturaData,posizione);
|
||
}
|
||
|
||
void TRiepBolle_app:: elabora(const TMask& mask)const
|
||
{
|
||
TRiepilogo riepilogo;
|
||
TDate overflow_date;
|
||
long overflow_clifo;
|
||
{
|
||
TISAM_recordset riep(get_query(true,mask));
|
||
|
||
//inserire parametri filtri
|
||
riep.set_var("#F_DATA_FROM",mask.get_date(F_DATA_DA));
|
||
riep.set_var("#F_DATA_TO",mask.get_date(F_DATA_A));
|
||
riep.set_var("#F_CODCF_FROM",mask.get_long(F_CODCF_DA));
|
||
riep.set_var("#F_CODCF_TO",mask.get_long(F_CODCF_A));
|
||
riep.set_var("#F_ZONA_FROM",TVariant(mask.get(F_ZONA)));
|
||
|
||
TProgind pi(riep.items(), TR("Estrazione articoli"), true, true);
|
||
int count = 1;
|
||
|
||
for(bool ok = riep.move_first(); ok && pi.addstatus(1); ok = riep.move_next())
|
||
{
|
||
const TDate dataDoc = riep.get("DOC.DATADOC").as_date();
|
||
const long cliente = riep.get("DOC.CODCF").as_int();
|
||
const TString articolo = riep.get("CODART").as_string();
|
||
const TString descr = riep.get("DESCR").as_string();
|
||
const long numeroDoc = riep.get("NDOC").as_int();
|
||
const TString4 causale = riep.get("CODAGG1").as_string();
|
||
TCausale_lavanderie cau(causale);
|
||
//se la causale <20> di reso devo leggere il ritirato e non il consegnato
|
||
long qta = 0L;
|
||
|
||
if(cau.is_reso() && mask.get_bool(F_CHECK_NO_RESI))
|
||
qta = riep.get("QTAGG1").as_int();
|
||
else
|
||
qta = riep.get("QTA").as_int();
|
||
|
||
riepilogo.add(count,cliente,articolo,descr,dataDoc,numeroDoc,qta);
|
||
count++;
|
||
}
|
||
}
|
||
|
||
TRiepBolle_report rep;
|
||
bool stampa = rep.load("lv2700a");
|
||
TRiepBolle_recordset* riep_set = new TRiepBolle_recordset();
|
||
rep.set_recordset(riep_set);
|
||
|
||
long clienteOld = 0;
|
||
TString articoloOld;
|
||
int contatore = 0;
|
||
|
||
TRiepilogoData riepilogoData, riepilogoData2;
|
||
|
||
TProgind pi(riepilogo.items(), TR("Estrazione documenti"), true, true);
|
||
FOR_EACH_ARRAY_ITEM(riepilogo, c, obj)//scandisce clienti e tiene buoni solo quelli valorizzati
|
||
{
|
||
if (!pi.addstatus(1))
|
||
break;
|
||
|
||
const TStruttura& s = *(TStruttura*)obj;
|
||
if (clienteOld!=s._cliente || articoloOld!=s._articolo)
|
||
{
|
||
riep_set->new_rec();
|
||
|
||
riep_set->set(0, TVariant(s._cliente)); //CAMPO DI ROTTURA
|
||
riep_set->set(1, TVariant(s._cliente));
|
||
riep_set->set(2, TVariant(s._articolo));
|
||
riep_set->set(3, TVariant(s._descr));
|
||
|
||
contatore = 4;
|
||
if (clienteOld != s._cliente)
|
||
{
|
||
riepilogoData.destroy();
|
||
riepilogoData2.destroy();
|
||
|
||
//Per ogni cliente creo una struttura di date. <20> necessario per il report.
|
||
TISAM_recordset dateDocAll(get_query(false, mask));
|
||
|
||
//inserire parametri filtri
|
||
dateDocAll.set_var("#F_DATA_FROM", mask.get_date(F_DATA_DA));
|
||
dateDocAll.set_var("#F_DATA_TO", mask.get_date(F_DATA_A));
|
||
dateDocAll.set_var("#F_CODCF_FROM", s._cliente);
|
||
dateDocAll.set_var("#F_CODCF_TO", s._cliente);
|
||
dateDocAll.set_var("#F_ZONA_FROM", TVariant(mask.get(F_ZONA)));
|
||
|
||
TDate dateOld;
|
||
long numeroOld = 0;
|
||
long cliente = 0;
|
||
int posizione = 4;
|
||
|
||
for (bool ok = dateDocAll.move_first(); ok; ok=dateDocAll.move_next())
|
||
{
|
||
TDate dataDocTot = dateDocAll.get("DOC.DATADOC").as_date();
|
||
long numeroDocTot = dateDocAll.get("NDOC").as_int();
|
||
long clientDocTot = dateDocAll.get("DOC.CODCF").as_int();
|
||
if (dateOld != dataDocTot || numeroOld != numeroDocTot || cliente != clientDocTot)
|
||
{
|
||
dateOld=dataDocTot;
|
||
numeroOld=numeroDocTot;
|
||
cliente=clientDocTot;
|
||
riepilogoData.add(posizione,clientDocTot,dataDocTot,numeroDocTot);
|
||
riepilogoData2.add(posizione,clientDocTot,dataDocTot,numeroDocTot);
|
||
posizione=posizione+3;
|
||
}
|
||
}
|
||
}
|
||
|
||
clienteOld=s._cliente;
|
||
articoloOld=s._articolo;
|
||
}
|
||
|
||
FOR_EACH_ARRAY_ITEM(riepilogoData,f,obj)
|
||
{
|
||
TStrutturaData& sD = *(TStrutturaData*) obj;
|
||
|
||
//ogni primo record riporto come titolo tutte le date-numero
|
||
if(contatore==4)
|
||
{
|
||
// Imposta data e numero documento, mentre azzera la qta
|
||
FOR_EACH_ARRAY_ITEM(riepilogoData2,f,obj)
|
||
{
|
||
TStrutturaData& sD2 = *(TStrutturaData*) obj;
|
||
int contatore2 = sD2._posizione;
|
||
|
||
TString8 ggmm; ggmm.format("%02d-%02d", sD2._dataDoc.day(), sD2._dataDoc.month());
|
||
|
||
riep_set->set(contatore2, ggmm); // data doc.
|
||
contatore2++;
|
||
riep_set->set(contatore2, sD2._numeroDoc); // num. doc.
|
||
contatore2++;
|
||
riep_set->set(contatore2, NULL_VARIANT); // qta
|
||
contatore2++;
|
||
}
|
||
}
|
||
|
||
//posizionamento qta in base alla data-numero
|
||
if(s._dataDoc==sD._dataDoc && s._numeroDoc==sD._numeroDoc)
|
||
{
|
||
contatore = sD._posizione;
|
||
|
||
if(72 >= contatore)
|
||
{
|
||
TString8 tt2;
|
||
tt2.format("%02d-%02d", s._dataDoc.day(), s._dataDoc.month());
|
||
riep_set->set(contatore, tt2);
|
||
contatore++;
|
||
riep_set->set(contatore,s._numeroDoc);
|
||
contatore++;
|
||
const long qta = riep_set->get(contatore).as_int() + s._qta;
|
||
riep_set->set(contatore,qta);
|
||
contatore++;
|
||
|
||
TArray* p = (TArray*) obj;
|
||
int e = p->size();
|
||
e=e+1;
|
||
while(72>contatore)
|
||
{
|
||
contatore++;
|
||
contatore++;
|
||
riep_set->set(contatore,TVariant(long (0)));
|
||
contatore++;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(!overflow_date.ok())
|
||
{
|
||
overflow_date = s._dataDoc;
|
||
overflow_clifo = s._cliente;
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
contatore++;
|
||
contatore++;
|
||
riep_set->set(contatore,TVariant(long (0)));
|
||
contatore++;
|
||
}
|
||
}
|
||
}
|
||
|
||
#ifdef DBG
|
||
//Crea file che contiene il recordset per debug
|
||
riep_set->save_as("c:/temp/riepilogoBolla.txt");
|
||
#endif
|
||
|
||
if(overflow_date.ok())
|
||
{
|
||
TString str;
|
||
str << "Non <20> stato possibile stampare i documenti a partire dalla data " << overflow_date.string() << " per il cliente " << overflow_clifo;
|
||
warning_box(str);
|
||
}
|
||
|
||
if(stampa)
|
||
{
|
||
//carica tutte le variabili del report.
|
||
rep.mask2report(mask);
|
||
|
||
TReport_book b;
|
||
bool ok = b.add(rep);// 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 TRiepBolle_app::main_loop()
|
||
{
|
||
TRiepBolle_mask m;
|
||
while(m.run()==K_ENTER)
|
||
{
|
||
elabora(m);
|
||
}
|
||
}
|
||
|
||
int lv2700(int argc, char* argv[])
|
||
{
|
||
TRiepBolle_app app;
|
||
app.run(argc, argv, TR("Riepilogo Bolle di Lavanderia"));
|
||
return 0;
|
||
} |