Patch level : 10.0
Files correlati : lv2 Ricompilazione Demo : [ ] Commento : Prima versione della generazione planning git-svn-id: svn://10.65.10.50/trunk@17052 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
0f7a4cf816
commit
25a44b0595
@ -16,8 +16,5 @@ UTULAGG|1|16|0|Utente che ha fatto l'ultimo aggiornamento
|
|||||||
DTULAGG|5|8|0|Data dell'ultimo aggiornamento
|
DTULAGG|5|8|0|Data dell'ultimo aggiornamento
|
||||||
ORULAGG|10|6|Ora dell'ultimo aggiornamento
|
ORULAGG|10|6|Ora dell'ultimo aggiornamento
|
||||||
NOTE|11|10|0|Note
|
NOTE|11|10|0|Note
|
||||||
3
|
1
|
||||||
CODCF+CODCONT+CODITI+GGCONS|
|
CODCF+CODCONT+GGCONS+CODITI|
|
||||||
GGCONS+CODITI+CODCF+CONCONT|
|
|
||||||
GGCONS+CODCF+CONDCON+CODITI|X
|
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
165
|
165
|
||||||
16
|
16
|
||||||
CODCF|3|6|0|Codice Cliente
|
CODCF|3|6|0|Codice Cliente
|
||||||
CODCONT|6|8|0|Codice Contratto
|
CODCONT|3|6|0|Codice Contratto
|
||||||
CODPER|3|6|0|Codice periodo di sospensione
|
CODPER|3|6|0|Codice periodo di sospensione
|
||||||
DATAINI|5|8|0|Data inizio periodo di sospensione
|
DATAINI|5|8|0|Data inizio periodo di sospensione
|
||||||
DATAFIN|5|8|0|Data fine periodo di sospensione
|
DATAFIN|5|8|0|Data fine periodo di sospensione
|
||||||
|
29
lv/f167.trr
29
lv/f167.trr
@ -1,20 +1,29 @@
|
|||||||
167
|
167
|
||||||
16
|
23
|
||||||
CODPLAN|3|6|0|Codice planning
|
CODPLAN|3|8|0|Codice planning
|
||||||
CODRIGA|2|5|0|Codice ria
|
CODRIGA|2|5|0|Codice riga
|
||||||
MODPASS|1|1|0|Modalità di passaggio <C>onsegna <R>itiro <E>ntrambi
|
|
||||||
DTCONS|5|8|0|Data di consegna
|
DTCONS|5|8|0|Data di consegna
|
||||||
CODCONT|3|6|0|Codice contratto
|
CODITI|2|3|0|Codice itinerario
|
||||||
|
ORDFER|2|2|0|Ordine di fermata
|
||||||
CODCF|3|6|0|Codice del cliente
|
CODCF|3|6|0|Codice del cliente
|
||||||
|
CODCONT|3|6|0|Codice contratto
|
||||||
|
GGCONS|2|1|0|Giorno consegna
|
||||||
|
MODPASS|1|1|0|Modalità di passaggio <C>onsegna <R>itiro <E>ntrambi
|
||||||
|
CODAUT|1|2|0|Autista
|
||||||
|
CODMEZ|1|2|0|Mezzo
|
||||||
PROVV|1|1|0|<P>rovvisorio o <D>efinitivo
|
PROVV|1|1|0|<P>rovvisorio o <D>efinitivo
|
||||||
ANNO|2|4|0|Anno documento
|
ANNO|2|4|0|Anno documento
|
||||||
CODNUM|1|4|0|Numerazione documento
|
CODNUM|1|4|0|Numerazione documento
|
||||||
NDOC|3|7|0|Numero documento
|
NDOC|3|7|0|Numero documento
|
||||||
CODPLANOR|1|10|0|
|
CODPLANOR|1|10|0|
|
||||||
ORDFER|2|2|0|Ordine di fermata
|
|
||||||
FREQ|1|2|0|Frequenaza di consegna
|
FREQ|1|2|0|Frequenaza di consegna
|
||||||
CONSSTD|8|1|0|Flag che indica se una consegna è standard <T> o speciale <F>
|
CONSSTD|8|1|0|Flag che indica se una consegna è standard <T> o speciale <F>
|
||||||
CODPERSOSP|2|2|0|Periodo di sospensione
|
PERSOSP|2|2|0|Periodo di sospensione
|
||||||
CODPERSOSPVAR|2|2|0|Periodo di sospensionevariato
|
PERSOSPVAR|2|2|0|Periodo di sospensionevariato
|
||||||
1
|
UTULAGG|1|16|0|Utente che aggiornato per ultimo il planning
|
||||||
IDPLAN+IDRIGA|
|
DTULAGG|5|8|0|Data ultimo aggionamento del planning
|
||||||
|
ORULAGG|10|6|0|Ora ultimo aggiornamento del planning
|
||||||
|
3
|
||||||
|
CODPLAN+CODRIGA|
|
||||||
|
DTCONS+CODITI+ORDFER+CODRIGA|
|
||||||
|
CODCF+CODITI+DTCONS|
|
||||||
|
@ -7,8 +7,7 @@ int main(int argc, char** argv)
|
|||||||
const int r = (argc > 1) ? argv[1][1] - '0' : 0;
|
const int r = (argc > 1) ? argv[1][1] - '0' : 0;
|
||||||
switch (r)
|
switch (r)
|
||||||
{
|
{
|
||||||
case 0: lv2100(argc, argv); break; //generazione automatica del planning
|
default: lv2100(argc, argv); break; //generazione automatica del planning
|
||||||
default: lv2100(argc, argv); break;
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
372
lv/lv2100.cpp
372
lv/lv2100.cpp
@ -1,10 +1,14 @@
|
|||||||
#include <applicat.h>
|
#include <applicat.h>
|
||||||
#include <automask.h>
|
#include <automask.h>
|
||||||
#include <relation.h>
|
#include <progind.h>
|
||||||
|
#include <recarray.h>
|
||||||
|
#include <recset.h>
|
||||||
|
|
||||||
#include "../lv/lvconsplan.h"
|
#include "lvlib.h"
|
||||||
#include "../lv/lvrconsplan.h"
|
|
||||||
#include "../lv/lvpasplan.h"
|
#include "lvcondv.h"
|
||||||
|
#include "lvrconsplan.h"
|
||||||
|
#include "lvpasplan.h"
|
||||||
|
|
||||||
#include "lv2.h"
|
#include "lv2.h"
|
||||||
#include "lv2100a.h"
|
#include "lv2100a.h"
|
||||||
@ -22,7 +26,25 @@ public:
|
|||||||
|
|
||||||
bool TGenera_planning_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
bool TGenera_planning_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||||
{
|
{
|
||||||
return true;
|
switch (o.dlg())
|
||||||
|
{
|
||||||
|
case F_CODCF:
|
||||||
|
if (e == fe_close)
|
||||||
|
{
|
||||||
|
if (!field(F_CODCF).empty() && !field(F_CODITI).empty())
|
||||||
|
return error_box(TR("Non è possibile specificare sia itinerario che cliente"));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case F_CODITI:
|
||||||
|
if (e == fe_close)
|
||||||
|
{
|
||||||
|
if (!field(F_CODCF).empty() && !field(F_CODITI).empty())
|
||||||
|
return error_box(TR("Non è possibile specificare sia itinerario che cliente"));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
/////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////
|
||||||
@ -49,13 +71,21 @@ TGenera_planning_recordset::TEsporta_ps0713_recordset()
|
|||||||
class TGenera_planning_app : public TSkeleton_application
|
class TGenera_planning_app : public TSkeleton_application
|
||||||
{
|
{
|
||||||
|
|
||||||
TGenera_planning_mask* _msk;
|
TGenera_planning_mask* _msk;
|
||||||
|
TAssoc_array _codriga;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool create();
|
virtual bool create();
|
||||||
virtual bool destroy();
|
virtual bool destroy();
|
||||||
bool elimina_planning(const TDate& dadata, const TDate& adata) const;
|
bool elimina_planning(const TDate& dadata, const TDate& adata) const;
|
||||||
bool genera_codplan(long& key) const;
|
bool elimina_planning_itinerario(const TDate& dadata, const TDate& adata, const long& coditi) const;
|
||||||
|
bool elimina_planning_cliente(const TDate& dadata, const TDate& adata, const long& codcf) const;
|
||||||
|
bool kill_planning (TISAM_recordset& selrighe) const;
|
||||||
|
int prossimo_codriga(const TDate& data);
|
||||||
|
TDate cerca_ultima_consegna(long codcf, long coditi, const TDate& data) const;
|
||||||
|
int conta_consegne_mese(long codcf, long coditi, const TDate& adata) const;
|
||||||
|
void arrotonda_al_giorno(TDate& data, const int ggcons) const;
|
||||||
|
void elabora_passaggio(const TDate& dadata, const TDate& adata, const TISAM_recordset& pplan);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool transfer();
|
bool transfer();
|
||||||
@ -75,68 +105,310 @@ bool TGenera_planning_app::destroy()
|
|||||||
return TApplication::destroy();
|
return TApplication::destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
//funzione che controlla se il planning per una certa data esiste già
|
//funzione estrae dalla tabella dei planning tutte le righe comprese tra le due date indicate
|
||||||
/*bool TGenera_planning_app::elimina_planning(const TDate& dadata, const TDate& adata) const
|
bool TGenera_planning_app::elimina_planning(const TDate& dadata, const TDate& adata) const
|
||||||
{
|
{
|
||||||
long codplan = 0;
|
//creo il recordset
|
||||||
|
TISAM_recordset selrighe("USE LVRCONSPLAN KEY 2\nFROM DTCONS=#DADATA\nTO DTCONS=#ADATA");
|
||||||
|
//setto le variabili
|
||||||
|
selrighe.set_var("#DADATA",dadata);
|
||||||
|
selrighe.set_var("#ADATA",adata);
|
||||||
|
|
||||||
TRelation tplan(LF_LVCONSPLAN); //instanzio una relazione sul file LF_LVCONSPLAN
|
//richiamo la funzione che effettivamente fa la cancellazione delle righe interessate
|
||||||
TRelation rplan(LF_LVRCONSPLAN); //instanzio una relazione sul file LF_LVRCONSPLAN
|
kill_planning(selrighe);
|
||||||
|
|
||||||
for (TDate tmp = dadata; tmp <= adata; ++tmp)
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//funzione estrae dalla tabella dei planning tutte le righe comprese tra le due date indicate...
|
||||||
|
//...relative ad un itinerario specifico
|
||||||
|
bool TGenera_planning_app::elimina_planning_itinerario(const TDate& dadata, const TDate& adata, const long& coditi) const
|
||||||
|
{
|
||||||
|
//creo il recordset
|
||||||
|
TISAM_recordset selrighe("USE LVRCONSPLAN KEY 2\nSELECT (CODITI=#CODITI)\nFROM DTCONS=#DADATA\nTO DTCONS=#ADATA");
|
||||||
|
//setto le variabili
|
||||||
|
selrighe.set_var("#CODITI",coditi);
|
||||||
|
selrighe.set_var("#DADATA",dadata);
|
||||||
|
selrighe.set_var("#ADATA",adata);
|
||||||
|
|
||||||
|
//richiamo la funzione che effettivamente fa la cancellazione delle righe interessate
|
||||||
|
kill_planning(selrighe);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//funzione estrae dalla tabella dei planning tutte le righe comprese tra le due date indicate...
|
||||||
|
//...relative ad un cliente specifico
|
||||||
|
bool TGenera_planning_app::elimina_planning_cliente(const TDate& dadata, const TDate& adata, const long& codcf) const
|
||||||
|
{
|
||||||
|
//creo il recordset
|
||||||
|
TISAM_recordset selrighe("USE LVRCONSPLAN KEY 2\nSELECT (CODCF=#CODCF)\nFROM DTCONS=#DADATA\nTO DTCONS=#ADATA");
|
||||||
|
//setto le variabili
|
||||||
|
selrighe.set_var("#CODCF",codcf);
|
||||||
|
selrighe.set_var("#DADATA",dadata);
|
||||||
|
selrighe.set_var("#ADATA",adata);
|
||||||
|
|
||||||
|
//richiamo la funzione che effettivamente fa la cancellazione delle righe interessate
|
||||||
|
kill_planning(selrighe);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//funzione che elimina un recordset generato precedentemente
|
||||||
|
bool TGenera_planning_app::kill_planning (TISAM_recordset& selrighe) const
|
||||||
|
{
|
||||||
|
TSystemisamfile rplan(LF_LVRCONSPLAN); //instanzio una relazione sul file LF_LVRCONSPLAN
|
||||||
|
if (rplan.open(_excllock) == NOERR)
|
||||||
{
|
{
|
||||||
TRectype& rec = tplan.curr(); //cerco se esiste la testata del planning
|
TRectype& rec = rplan.curr();
|
||||||
rec.zero();
|
|
||||||
rec.put(LVCONSPLAN_DTCONS,data);
|
|
||||||
|
|
||||||
TCursor cur(&tplan,"",2,&rec,&rec);
|
TProgind pi(selrighe.items(), TR("Eliminazione planning precedenti in corso..."), true, true);
|
||||||
const TRecnotype items = cur.items();
|
|
||||||
if (items > 0)
|
for (bool ok = selrighe.move_last(); ok; ok = selrighe.move_prev())
|
||||||
|
{
|
||||||
|
if (!pi.addstatus(1))
|
||||||
|
break;
|
||||||
|
|
||||||
|
rec.zero();
|
||||||
|
rec.put(LVRCONSPLAN_CODPLAN,selrighe.get(LVRCONSPLAN_CODPLAN).as_int());
|
||||||
|
rec.put(LVRCONSPLAN_CODRIGA,selrighe.get(LVRCONSPLAN_CODRIGA).as_int());
|
||||||
|
rplan.remove();
|
||||||
|
}
|
||||||
|
rplan.close();
|
||||||
|
rplan.pack();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return error_box(TR("Impossibile eliminare i planning richiesti"));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//funzione che restituisce il prossimo codriga per il planning della data interessata
|
||||||
|
int TGenera_planning_app::prossimo_codriga(const TDate& data)
|
||||||
|
{
|
||||||
|
TString8 strcodplan;
|
||||||
|
strcodplan << data.date2ansi();
|
||||||
|
real* ptriga = (real*)_codriga.objptr(strcodplan);
|
||||||
|
if (ptriga == NULL)
|
||||||
|
{
|
||||||
|
//per ora memorizzo zero
|
||||||
|
ptriga = new real;
|
||||||
|
_codriga.add(strcodplan,ptriga);
|
||||||
|
|
||||||
|
//se esiste almeno una riga, memorizzo il codriga dell'ultima
|
||||||
|
TISAM_recordset rplan("USE LVRCONSPLAN KEY 1\nFROM CODPLAN=#CODPLAN\nTO CODPLAN=#CODPLAN");
|
||||||
|
rplan.set_var("#CODPLAN",TVariant(strcodplan));
|
||||||
|
if (rplan.move_last())
|
||||||
|
*ptriga = rplan.get(LVRCONSPLAN_CODRIGA).as_real();
|
||||||
|
}
|
||||||
|
*ptriga++; //incremento il codriga interessato
|
||||||
|
|
||||||
|
return ptriga->integer();
|
||||||
|
}
|
||||||
|
|
||||||
|
TDate TGenera_planning_app::cerca_ultima_consegna(long codcf, long coditi, const TDate& data) const
|
||||||
|
{
|
||||||
|
//instanzia un recordset di LVRCONSPLAN prendendo tutte le consegne fatte per un cliente su un certo...
|
||||||
|
//...itinerario prima di una certa data
|
||||||
|
TISAM_recordset rplan("USE LVRCONSPLAN KEY 3\nFROM CODCF=#CODCF CODITI=#CODITI\nTO CODCF=#CODCF CODITI=#CODITI DTCONS=#DATA");
|
||||||
|
rplan.set_var("#CODCF",codcf);
|
||||||
|
rplan.set_var("#CODITI",coditi);
|
||||||
|
rplan.set_var("#DATA",data);
|
||||||
|
if (rplan.move_last())
|
||||||
|
return rplan.get(LVRCONSPLAN_DTCONS).as_date(); // data dell'ultima consegna fatta
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
int TGenera_planning_app::conta_consegne_mese(long codcf, long coditi, const TDate& adata) const
|
||||||
|
{
|
||||||
|
TDate dadata = adata;
|
||||||
|
dadata.set_day(1);
|
||||||
|
//instanzia un recordset di LVRCONSPLAN prendendo tutte le consegne fatte per un cliente su un certo...
|
||||||
|
//...itinerario prima di una certa data
|
||||||
|
TISAM_recordset rplan("USE LVRCONSPLAN KEY 3\nFROM CODCF=#CODCF CODITI=#CODITI DTCONS=#DADATA\nTO CODCF=#CODCF CODITI=#CODITI DTCONS=#ADATA");
|
||||||
|
rplan.set_var("#CODCF",codcf);
|
||||||
|
rplan.set_var("#CODITI",coditi);
|
||||||
|
rplan.set_var("#DADATA",dadata);
|
||||||
|
rplan.set_var("#ADATA",adata);
|
||||||
|
|
||||||
|
return rplan.items();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Arrotonda per eccesso la data al giorno della settimana desiderato
|
||||||
|
// ggcons appartiene a [1..7]
|
||||||
|
void TGenera_planning_app::arrotonda_al_giorno(TDate& data, const int ggcons) const
|
||||||
|
{
|
||||||
|
int delta = ggcons - data.wday();
|
||||||
|
if (delta != 0)
|
||||||
|
{
|
||||||
|
if (delta < 0)
|
||||||
|
delta += 7;
|
||||||
|
data += delta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TGenera_planning_app::elabora_passaggio(const TDate& dadata, const TDate& adata, const TISAM_recordset& pplan)
|
||||||
|
{
|
||||||
|
//dati recuperati dalla tabella dei passaggi per contratto:
|
||||||
|
const long codcf = pplan.get(LVPASPLAN_CODCF).as_int(); //codice cliente
|
||||||
|
const long coditi = pplan.get(LVPASPLAN_CODITI).as_int(); //codice itinerario
|
||||||
|
const long codcont = pplan.get(LVPASPLAN_CODCONT).as_int(); //codice contratto
|
||||||
|
const bool flstag = pplan.get(LVPASPLAN_FLSTAG).as_bool(); //flag stagionalità
|
||||||
|
const int ggcons = pplan.get(LVPASPLAN_GGCONS).as_int(); //giorno di consegna (1 = lunedì -> 7 = domenica)
|
||||||
|
const int ordfer = pplan.get(LVPASPLAN_ORDFERM).as_int(); //ordine di fermata
|
||||||
|
const TString4 freq = pplan.get(LVPASPLAN_FREQ).as_string(); //codice della tabella di frequenze di consegna
|
||||||
|
char modpass = pplan.get(LVPASPLAN_MODPASS).as_string()[0]; //modalità di passaggio
|
||||||
|
|
||||||
|
//cache sulle testate dei contratti, selezionati per CODCF e CODCONT
|
||||||
|
TToken_string keycont;
|
||||||
|
keycont.add(codcf);
|
||||||
|
keycont.add(codcont);
|
||||||
|
const TRectype& contratto = cache().get(LF_LVCONDV,keycont);
|
||||||
|
//dati recuperati dalle testate dei contratti:
|
||||||
|
const TDate dadatacont = contratto.get_date(LVCONDV_DATAIN); //data di inizio validità del contratto
|
||||||
|
const TDate adatacont = contratto.get_date(LVCONDV_DATASC); //data di fine validità del contratto
|
||||||
|
const TDate dastag = contratto.get_date(LVCONDV_DTSTAGIN); //data di inizio del periodo di stagionalità
|
||||||
|
const TDate astag = contratto.get_date(LVCONDV_DTSTAGSC); //data di fine del periodo di stagionalità
|
||||||
|
|
||||||
|
// Controllo se il contratto e' valido nel periodo interessato
|
||||||
|
if (dadatacont > adata || (adatacont.ok() && adatacont < dadata))
|
||||||
|
return; // Inutile proseguire
|
||||||
|
|
||||||
|
//cache sulla tabella frequenze consegne
|
||||||
|
TString8 keycoditi;
|
||||||
|
keycoditi << coditi;
|
||||||
|
const TRectype& iti = cache().get("&ITI",keycoditi);
|
||||||
|
//dati recuperati dalla tabella frequenze consegne:
|
||||||
|
const TString8 codaut = iti.get("S1"); //codice autista
|
||||||
|
const TString8 codmez = iti.get("S2"); //codice mezzo
|
||||||
|
|
||||||
|
//recordset sulla tabella dei periodi di sospensione, limitati per CODCF e CODCONT
|
||||||
|
TISAM_recordset persosp("USE LVPERISOSP\nFROM CODCF=#CODCF CODCONT=#CODCONT\nTO CODCF=#CODCF CODCONT=#CODCONT");
|
||||||
|
persosp.set_var("#CODCF",codcf);
|
||||||
|
persosp.set_var("#CODCONT",codcont);
|
||||||
|
|
||||||
|
//cache sulla tabella frequenze consegne
|
||||||
|
const TRectype& frq = cache().get("&FRQ",freq);
|
||||||
|
//dati recuperati dalla tabella frequenze consegne:
|
||||||
|
const int maxcons = frq.get_int("I2"); //numero massimo di consegne per mese
|
||||||
|
|
||||||
|
TDate primogiorno = dadata; //primogiorno: primo giorno del periodo selezionato
|
||||||
|
if (frq.get_bool("B0")) //se devo usare "USA ULTIMA CONSEGNA", primogiorno diventa la data dell'ultima consegna
|
||||||
|
primogiorno = cerca_ultima_consegna(codcf,coditi,dadata);
|
||||||
|
|
||||||
|
const int ritardo = frq.get_int("I0"); //ritardo di consegna rispetto alla data di inizio calcolo
|
||||||
|
if (ritardo > 0) //evita anticipi senza senso
|
||||||
|
primogiorno += ritardo;
|
||||||
|
|
||||||
|
long frequenza = frq.get_long("I1"); //frequenza di consegna
|
||||||
|
if (frequenza <= 0 || frequenza > 28) //forza una frequenza valida
|
||||||
|
frequenza = 7;
|
||||||
|
|
||||||
|
TLocalisamfile file_rplan(LF_LVRCONSPLAN);
|
||||||
|
TRectype& rplan = file_rplan.curr();
|
||||||
|
|
||||||
|
for (TDate d = primogiorno; d <= adata; d += frequenza)
|
||||||
|
{
|
||||||
|
arrotonda_al_giorno(d, ggcons);
|
||||||
|
if (d < dadata) // Puo' succedere se si utilizza la data di ultima consegna
|
||||||
|
continue;
|
||||||
|
if (d > adata) // Inutile generare date fuori range
|
||||||
|
break;
|
||||||
|
|
||||||
|
//controlla che d sia o meno in un periodo di validità contratto...
|
||||||
|
if (d < dadatacont)
|
||||||
|
continue; // Questa data non e' ancora in contratto: provo la prossima
|
||||||
|
if (adatacont.ok() && d > adatacont)
|
||||||
|
break; // Questa data e' oltre il contratto: inutile proseguire
|
||||||
|
|
||||||
|
//...e/o in un periodo di stagionalità (se necessario)...
|
||||||
|
////la riga va elaborata se il flag di stagionalità è TRUE
|
||||||
|
////e se se la data del periodo di stagionalità è coerente
|
||||||
|
////e la data in considerazione è compresa tra le date della stagionalità
|
||||||
|
if (flstag && (!astag.ok() || d < dastag || d > astag))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
//...e/o in un periodo di sospensione...
|
||||||
|
//...per cui c'è da verificare se è da saltare completamente o...
|
||||||
|
//...se c'è da elaborare ugualmente, ma con una modalità di passaggio differente
|
||||||
|
TString4 codpersosp;
|
||||||
|
for (bool ok = persosp.move_first(); ok; ok = persosp.move_next())
|
||||||
{
|
{
|
||||||
cur.freeze();
|
const TDate inisosp = persosp.get("DATAINI").as_date();
|
||||||
codplan = rec.get_long(LVCONSPLAN_CODPLAN);
|
const TDate finsosp = persosp.get("DATAFIN").as_date();
|
||||||
|
if (d >= inisosp && d <= finsosp)
|
||||||
|
{
|
||||||
|
codpersosp = persosp.get("CODPER").as_string();
|
||||||
|
const TString& tpsosp = persosp.get("TPSOSP").as_string();
|
||||||
|
const TRectype& sosp = cache().get("&TSP",tpsosp);
|
||||||
|
modpass = sosp.get_char("S1");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return found; //restituisco il codice del planning se esite già, altrimento rstituisco zero
|
//se la modalità di passaggio risulta vuota la riga non va elaborata
|
||||||
}*/
|
if (modpass <= ' ')
|
||||||
|
continue;
|
||||||
|
|
||||||
//funzione che genera il codplan (prende l'ultimo esistente e lo incrementa di uno)
|
//se ho già raggiunto il numero massimo di consegne per mese...
|
||||||
bool TGenera_planning_app::genera_codplan(long& key) const
|
//...la riga, anche se supera tutti i controlli, non va elaborata
|
||||||
{
|
if (maxcons > 0 && conta_consegne_mese(codcf,coditi,d) >= maxcons)
|
||||||
long num = 1;
|
continue;
|
||||||
TLocalisamfile tplan(LF_LVCONSPLAN);
|
|
||||||
if (tplan.last() == NOERR)
|
//scrivi la chiave
|
||||||
num += tplan.get_long(LVCONSPLAN_CODPLAN);
|
const long codplan = d.date2ansi(); //setta il codplan
|
||||||
key = num;
|
rplan.zero();
|
||||||
return true;
|
rplan.put(LVRCONSPLAN_CODPLAN, codplan);
|
||||||
|
rplan.put(LVRCONSPLAN_CODRIGA, prossimo_codriga(d));
|
||||||
|
|
||||||
|
rplan.put(LVRCONSPLAN_DTCONS,d); //setta la data di consegna
|
||||||
|
rplan.put(LVRCONSPLAN_CODITI,coditi); //setta il codice itinerario
|
||||||
|
rplan.put(LVRCONSPLAN_ORDFER,ordfer); //setta l'ordine di fermata
|
||||||
|
rplan.put(LVRCONSPLAN_CODCF,codcf); //setta il codice cliente
|
||||||
|
rplan.put(LVRCONSPLAN_CODCONT,codcont); //setta il codice contratto
|
||||||
|
rplan.put(LVRCONSPLAN_GGCONS,ggcons); //setta il giorno di consegna
|
||||||
|
rplan.put(LVRCONSPLAN_MODPASS,modpass); //setta la modalità di passaggio
|
||||||
|
rplan.put(LVRCONSPLAN_CODAUT,codaut); //setta il codice autista
|
||||||
|
rplan.put(LVRCONSPLAN_CODMEZ,codmez); //setta il codice mezzo
|
||||||
|
rplan.put(LVRCONSPLAN_FREQ,freq); //setta la frequenza di consegna
|
||||||
|
rplan.put(LVRCONSPLAN_CONSSTD,true); //setta il flag di "consegna standard"
|
||||||
|
rplan.put(LVRCONSPLAN_PERSOSP,codpersosp); //setta il periodo di sospensione
|
||||||
|
lv_set_update_info(rplan); //setta utente, data e ora dell'ultimo aggiornamento
|
||||||
|
|
||||||
|
file_rplan.write();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TGenera_planning_app::transfer()
|
bool TGenera_planning_app::transfer()
|
||||||
{
|
{
|
||||||
const TDate dadata = _msk->get(F_DADATA);
|
const TDate dadata = _msk->get(F_DADATA);
|
||||||
const TDate adata = _msk->get(F_ADATA);
|
const TDate adata = _msk->get(F_ADATA);
|
||||||
const TString8 codcf = _msk->get(F_CODCF);
|
|
||||||
const TString8 coditi = _msk->get(F_CODITI);
|
|
||||||
|
|
||||||
TLocalisamfile tplan(LF_LVCONSPLAN);
|
TString query = "USE LVPASPLAN";
|
||||||
TLocalisamfile rplan(LF_LVRCONSPLAN);
|
if (_msk->get(F_CODCF).full())
|
||||||
TLocalisamfile pplan(LF_LVPASPLAN);
|
|
||||||
|
|
||||||
for (TDate tmp = dadata; tmp <= adata; ++tmp)
|
|
||||||
{
|
{
|
||||||
//long codplan = cerca_planning(dadata,adata); //controllo se un planning per una certa data esiste già
|
const long codcf = _msk->get_long(F_CODCF);
|
||||||
|
elimina_planning_cliente(dadata,adata,_msk->get_long(F_CODCF));
|
||||||
|
query << " SELECT CODCF=" << codcf;
|
||||||
|
}
|
||||||
|
else if (_msk->get(F_CODITI).full())
|
||||||
|
{
|
||||||
|
const long coditi = _msk->get_long(F_CODITI);
|
||||||
|
elimina_planning_itinerario(dadata,adata,coditi);
|
||||||
|
query << " SELECT CODITI=" << coditi;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
elimina_planning(dadata,adata);
|
||||||
|
|
||||||
/*if (!codplan)
|
_codriga.destroy(); //azzera il numero delle righe del planning già generati
|
||||||
{*/
|
|
||||||
long key;
|
|
||||||
int giorno = tmp.wday();
|
|
||||||
genera_codplan(key);
|
|
||||||
long key1 = key;
|
|
||||||
|
|
||||||
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
TISAM_recordset pplan(query);
|
||||||
|
|
||||||
|
TProgind pi(pplan.items(), TR("Generazione planning in corso..."), true, true);
|
||||||
|
for (bool ok = pplan.move_first(); ok; ok = pplan.move_next())
|
||||||
|
{
|
||||||
|
if (!pi.addstatus(1))
|
||||||
|
break;
|
||||||
|
elabora_passaggio(dadata, adata, pplan);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -150,6 +422,6 @@ void TGenera_planning_app::main_loop()
|
|||||||
int lv2100(int argc, char* argv[])
|
int lv2100(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
TGenera_planning_app app;
|
TGenera_planning_app app;
|
||||||
app.run(argc, argv, TR("Generazione automatica planning"));
|
app.run(argc, argv, TR("Generazione planning"));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
46
lv/lvcondv.h
Executable file
46
lv/lvcondv.h
Executable file
@ -0,0 +1,46 @@
|
|||||||
|
#ifndef __LVCONDV_H
|
||||||
|
#define __LVCONDV_H
|
||||||
|
|
||||||
|
#define LVCONDV_CODCONT "CODCONT"
|
||||||
|
#define LVCONDV_STATUS "STATUS"
|
||||||
|
#define LVCONDV_CODCF "CODCF"
|
||||||
|
#define LVCONDV_DATAIN "DATAIN"
|
||||||
|
#define LVCONDV_DATASC "DATASC"
|
||||||
|
#define LVCONDV_DTSTAGIN "DTSTAGIN"
|
||||||
|
#define LVCONDV_DTSTAGSC "DTSTAGSC"
|
||||||
|
#define LVCONDV_FATTSOSP "FATTSOSP"
|
||||||
|
#define LVCONDV_STRCONS "STRCONS"
|
||||||
|
#define LVCONDV_TIPOLIS "TIPOLIS"
|
||||||
|
#define LVCONDV_STPRZBOL "STPRZBOL"
|
||||||
|
#define LVCONDV_CONTSPOR "CONTSPOR"
|
||||||
|
#define LVCONDV_TIPODOC "TIPODOC"
|
||||||
|
#define LVCONDV_PERFATT "PERFATT"
|
||||||
|
#define LVCONDV_INPRPER "INPRPER"
|
||||||
|
#define LVCONDV_FATTPARZ "FATTPARZ"
|
||||||
|
#define LVCONDV_DOTTMPPRZD "DOTTMPPRZD"
|
||||||
|
#define LVCONDV_FORFNOCONS "FORFNOCONS"
|
||||||
|
#define LVCONDV_ADDCAPROT "ADDCAPROT"
|
||||||
|
#define LVCONDV_FORFGLOB "FORFGLOB"
|
||||||
|
#define LVCONDV_TIPOCAN "TIPOCAN"
|
||||||
|
#define LVCONDV_TIPOIMB "TIPOIMB"
|
||||||
|
#define LVCONDV_SSCONS "SSCONS"
|
||||||
|
#define LVCONDV_TIPOSTPRZ "TIPOSTPRZ"
|
||||||
|
#define LVCONDV_DTLASTFATT "DTLASTFATT"
|
||||||
|
#define LVCONDV_ATTFATTNODT "ATTFATTNODT"
|
||||||
|
#define LVCONDV_RIFBOLLEFATT "RIFBOLLEFATT"
|
||||||
|
#define LVCONDV_STDICITURA "STDICITURA"
|
||||||
|
#define LVCONDV_PROFORME "PROFORME"
|
||||||
|
#define LVCONDV_CICLAGGIO "CICLAGGIO"
|
||||||
|
#define LVCONDV_STETIMATI "STETIMATI"
|
||||||
|
#define LVCONDV_STETITC "STETITC"
|
||||||
|
#define LVCONDV_STDDTPTC "STDDTPTC"
|
||||||
|
#define LVCONDV_IMPMINFATT "IMPMINFATT"
|
||||||
|
#define LVCONDV_PERCNOCONT "PERCNOCONT"
|
||||||
|
#define LVCONDV_PERCTOLLPES "PERCTOLLPES"
|
||||||
|
#define LVCONDV_NUMUT "NUMUT"
|
||||||
|
#define LVCONDV_NUMETI "MUNETI"
|
||||||
|
#define LVCONDV_RITAUTDTTMP "RITAUTDTTMP"
|
||||||
|
#define LVCONDV_DTFIXDDT "DTFIXDDT"
|
||||||
|
#define LVCONDV_COMMENTI "COMMENTI"
|
||||||
|
|
||||||
|
#endif
|
@ -16,5 +16,6 @@
|
|||||||
#define LVPASPLAN_UTULAGG "UTULAGG"
|
#define LVPASPLAN_UTULAGG "UTULAGG"
|
||||||
#define LVPASPLAN_DTULAGG "DTULAGG"
|
#define LVPASPLAN_DTULAGG "DTULAGG"
|
||||||
#define LVPASPLAN_ORULAGG "ORULAGG"
|
#define LVPASPLAN_ORULAGG "ORULAGG"
|
||||||
|
#define LVPASPLAN_NOTE "NOTE"
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -3,19 +3,26 @@
|
|||||||
|
|
||||||
#define LVRCONSPLAN_CODPLAN "CODPLAN"
|
#define LVRCONSPLAN_CODPLAN "CODPLAN"
|
||||||
#define LVRCONSPLAN_CODRIGA "CODRIGA"
|
#define LVRCONSPLAN_CODRIGA "CODRIGA"
|
||||||
#define LVRCONSPLAN_MODPASS "MODPASS"
|
|
||||||
#define LVRCONSPLAN_DTCONS "DTCONS"
|
#define LVRCONSPLAN_DTCONS "DTCONS"
|
||||||
#define LVRCONSPLAN_IDCONT "IDCONT"
|
#define LVRCONSPLAN_CODITI "CODITI"
|
||||||
#define LVRCONSPLAN_CODCF "CODCF"
|
#define LVRCONSPLAN_ORDFER "ORDFER"
|
||||||
|
#define LVRCONSPLAN_CODCF "CODCF"
|
||||||
|
#define LVRCONSPLAN_CODCONT "CODCONT"
|
||||||
|
#define LVRCONSPLAN_GGCONS "GGCONS"
|
||||||
|
#define LVRCONSPLAN_MODPASS "MODPASS"
|
||||||
|
#define LVRCONSPLAN_CODAUT "CODAUT"
|
||||||
|
#define LVRCONSPLAN_CODMEZ "CODMEZ"
|
||||||
#define LVRCONSPLAN_PROVV "PROVV"
|
#define LVRCONSPLAN_PROVV "PROVV"
|
||||||
#define LVRCONSPLAN_ANNO "ANNO"
|
#define LVRCONSPLAN_ANNO "ANNO"
|
||||||
#define LVRCONSPLAN_CODNUM "CODNUM"
|
#define LVRCONSPLAN_CODNUM "CODNUM"
|
||||||
#define LVRCONSPLAN_NDOC "NDOC"
|
#define LVRCONSPLAN_NDOC "NDOC"
|
||||||
#define LVRCONSPLAN_CODPLANOR "CODPLANOR"
|
#define LVRCONSPLAN_CODPLANOR "CODPLANOR"
|
||||||
#define LVRCONSPLAN_ORDFER "ORDFER"
|
|
||||||
#define LVRCONSPLAN_FREQ "FREQ"
|
#define LVRCONSPLAN_FREQ "FREQ"
|
||||||
#define LVRCONSPLAN_CONSSTD "CONSSTD"
|
#define LVRCONSPLAN_CONSSTD "CONSSTD"
|
||||||
#define LVRCONSPLAN_CODPERSOSP "CODPERSOSP"
|
#define LVRCONSPLAN_PERSOSP "CODPERSOSP"
|
||||||
#define LVRCONSPLAN_CODPERSOSPVAR "CODPERSOSPVAR"
|
#define LVRCONSPLAN_PERSOSPVAR "CODPERSOSPVAR"
|
||||||
|
#define LVRCONSPLAN_UTULAGG "UTULAGG"
|
||||||
|
#define LVRCONSPLAN_DTULAGG "DTULAGG"
|
||||||
|
#define LVRCONSPLAN_ORULAGG "ORULAGG"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user