Patch level : 10.0 patch 208
Files correlati : lv2 - lv0 - lvlib - tracciati record Ricompilazione Demo : [ ] Commento : 0001104: Le date di stagionalità nei passaggi per contratto non devono contenere l'anno Descrizione Spiegazione: La stagionalità si intende già all'interno dell'anno ed è un dato che normalmente si protrae di anno in anno Se lasciato l'anno in queste date, la stagionalità non si potrà riporporre pergli anni successivi. è questo non è corretto. git-svn-id: svn://10.65.10.50/trunk@18003 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
180d418b70
commit
fa2a06601c
@ -1,3 +1,3 @@
|
||||
164
|
||||
0
|
||||
$lvpasplan|0|0|116|0|Tabella passaggi planning per contratto|||
|
||||
$lvpasplan|0|0|120|0|Tabella passaggi planning per contratto|||
|
||||
|
@ -9,8 +9,8 @@ ORDFERM|2|3|0|Indica l'ordine di fermata dell'autista
|
||||
FREQ|1|2|0|Codice per il calcolo delle consegne
|
||||
MODPASS|1|1|0|Indica la modalità di passaggio
|
||||
FLSTAG|8|1|0|Flag che indica se un passaggio è stagionale o meno
|
||||
DTSTAGIN|5|8|0|Inizio stagionalita'
|
||||
DTSTAGSC|5|8|0|Fine stagionalita'
|
||||
DTSTAGIN|1|10|0|Inizio stagionalita'
|
||||
DTSTAGSC|1|10|0|Fine stagionalita'
|
||||
ORARPRV|1|5|0|Ora di arrivo prevista
|
||||
UTCREAZ|1|16|0|Utente d'inserimento
|
||||
DTCREAZ|5|8|0|Data d'inserimento
|
||||
|
@ -189,14 +189,14 @@ BEGIN
|
||||
MESSAGE TRUE ENABLE,F_S_DASTAG|ENABLE,F_S_ASTAG
|
||||
END
|
||||
|
||||
DATE F_S_DASTAG
|
||||
STRING F_S_DASTAG 10
|
||||
BEGIN
|
||||
PROMPT 15 4 "Valido dal "
|
||||
FIELD DTSTAGIN
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
DATE F_S_ASTAG
|
||||
STRING F_S_ASTAG 10
|
||||
BEGIN
|
||||
PROMPT 40 4 " al "
|
||||
FIELD DTSTAGSC
|
||||
|
@ -64,15 +64,16 @@ class TGenera_planning_app : public TSkeleton_application
|
||||
protected:
|
||||
virtual bool create();
|
||||
virtual bool destroy();
|
||||
bool elimina_planning(const TDate& dadata, const TDate& adata) 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 elimina_planning(const TDate& dadata, const TDate& adata, const bool elimina) const;
|
||||
bool elimina_planning_itinerario(const TDate& dadata, const TDate& adata, const long& coditi, const bool elimina) const;
|
||||
bool elimina_planning_cliente(const TDate& dadata, const TDate& adata, const long& codcf, const bool elimina) const;
|
||||
bool kill_planning (TISAM_recordset& selrighe) const;
|
||||
int prossimo_codriga(const TDate& data);
|
||||
TDate cerca_ultima_consegna(long codcf, long codcont, const TDate& data) const;
|
||||
int conta_consegne_mese(long codcf, long codcont, 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);
|
||||
const TDate str2date(const TString& data, int year) const;
|
||||
|
||||
public:
|
||||
bool transfer();
|
||||
@ -97,14 +98,16 @@ bool TGenera_planning_app::destroy()
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
//ELIMINA_PLANNING: funzione che 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 bool elimina_manuali) const
|
||||
{
|
||||
//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);
|
||||
|
||||
TString query;
|
||||
if (elimina_manuali)
|
||||
query << "USE LVRCONSPLAN KEY 2\nFROM DTCONS=" << dadata << "\nTO DTCONS=" << adata;
|
||||
else
|
||||
query << "USE LVRCONSPLAN KEY 2 SELECT CONSSTD!=\"\"\nFROM DTCONS=" << dadata << "\nTO DTCONS=" << adata;
|
||||
TISAM_recordset selrighe(query);
|
||||
|
||||
//richiamo la funzione che effettivamente fa la cancellazione delle righe interessate
|
||||
kill_planning(selrighe);
|
||||
|
||||
@ -113,7 +116,7 @@ bool TGenera_planning_app::elimina_planning(const TDate& dadata, const TDate& ad
|
||||
|
||||
//ELIMINA_PLANNING_ITINERARIO: funzione che 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
|
||||
bool TGenera_planning_app::elimina_planning_itinerario(const TDate& dadata, const TDate& adata, const long& coditi, const bool elimina_manuali) const
|
||||
{
|
||||
TString4 itinerario;
|
||||
itinerario.format("%03d",coditi);
|
||||
@ -132,7 +135,7 @@ bool TGenera_planning_app::elimina_planning_itinerario(const TDate& dadata, cons
|
||||
|
||||
//ELIMINA_PLANNING_CLIENTE: funzione che 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
|
||||
bool TGenera_planning_app::elimina_planning_cliente(const TDate& dadata, const TDate& adata, const long& codcf, const bool elimina_manuali) const
|
||||
{
|
||||
//creo il recordset
|
||||
TISAM_recordset selrighe("USE LVRCONSPLAN KEY 2\nSELECT CODCF=#CODCF\nFROM DTCONS=#DADATA\nTO DTCONS=#ADATA");
|
||||
@ -237,6 +240,21 @@ void TGenera_planning_app::arrotonda_al_giorno(TDate& data, const int ggcons) co
|
||||
}
|
||||
}
|
||||
|
||||
//STR2DATE: converte una stringa in una data o non inizilizzata o sicuramente valida
|
||||
const TDate TGenera_planning_app::str2date(const TString& data, int year) const
|
||||
{
|
||||
TDate date;
|
||||
|
||||
const int g = atoi(data.left(2));
|
||||
const int m = atoi(data.mid(3,2));
|
||||
const int a = data.len() < 10 ? year : atoi(data.right(4));
|
||||
|
||||
if (m >= 1 && m <= 12 && a > 2000 && g >= 1 && g <= date.last_day(m,a))
|
||||
date = TDate(g,m,a);
|
||||
|
||||
return date;
|
||||
}
|
||||
|
||||
//ELABORA_PASSAGGIO: questa funzione effettivamente genera il passaggio e lo salva nella tabella
|
||||
void TGenera_planning_app::elabora_passaggio(const TDate& dadata, const TDate& adata, const TISAM_recordset& pplan)
|
||||
{
|
||||
@ -249,8 +267,10 @@ void TGenera_planning_app::elabora_passaggio(const TDate& dadata, const TDate& a
|
||||
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
|
||||
const TDate dastag = pplan.get(LVPASPLAN_DTSTAGIN).as_date(); //data di inizio del periodo di stagionalità
|
||||
const TDate astag = pplan.get(LVPASPLAN_DTSTAGSC).as_date(); //data di fine del periodo di stagionalità
|
||||
|
||||
//recupero la data di inizio e fine stagionalità
|
||||
const TString16 strdastag = pplan.get(LVPASPLAN_DTSTAGIN).as_string();
|
||||
const TString16 strastag = pplan.get(LVPASPLAN_DTSTAGSC).as_string();
|
||||
|
||||
//cache sulle testate dei contratti, selezionati per CODCF e CODCONT
|
||||
TToken_string keycont;
|
||||
@ -317,12 +337,18 @@ void TGenera_planning_app::elabora_passaggio(const TDate& dadata, const TDate& a
|
||||
if(lv_is_holiday(d))
|
||||
continue;
|
||||
|
||||
//...e/o in un periodo di stagionalità (se necessario)...
|
||||
//...e/o in un periodo distagionalità (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;
|
||||
if (flstag && strdastag.full() && strastag.full())
|
||||
{
|
||||
const TDate dastag = str2date(strdastag,d.year());
|
||||
const TDate astag = str2date(strastag,d.year());
|
||||
|
||||
if (!astag.ok() || d < dastag || d > astag)
|
||||
continue;
|
||||
}
|
||||
|
||||
//...e/o in un periodo di sospensione...
|
||||
//...per cui c'è da verificare se è da saltare completamente o...
|
||||
@ -382,13 +408,16 @@ void TGenera_planning_app::elabora_passaggio(const TDate& dadata, const TDate& a
|
||||
bool TGenera_planning_app::transfer()
|
||||
{
|
||||
const TDate dadata = _msk->get(F_DADATA);
|
||||
const TDate adata = _msk->get(F_ADATA);
|
||||
const TDate adata = _msk->get(F_ADATA);
|
||||
|
||||
TString query = "USE LVPASPLAN";
|
||||
if (_msk->get(F_CODCF).full())
|
||||
{
|
||||
const long codcf = _msk->get_long(F_CODCF);
|
||||
elimina_planning_cliente(dadata,adata,_msk->get_long(F_CODCF));
|
||||
if (yesno_box(TR("Si desidera cancellare i giri modificati manualmente?")))
|
||||
elimina_planning_cliente(dadata,adata,codcf,true);
|
||||
else
|
||||
elimina_planning_cliente(dadata,adata,codcf,false);
|
||||
query << " SELECT CODCF=" << codcf;
|
||||
}
|
||||
else if (_msk->get(F_CODITI).full())
|
||||
@ -396,12 +425,17 @@ bool TGenera_planning_app::transfer()
|
||||
const long coditi = _msk->get_long(F_CODITI);
|
||||
TString4 itinerario;
|
||||
itinerario.format("%03d",coditi);
|
||||
elimina_planning_itinerario(dadata,adata,coditi);
|
||||
if (yesno_box(TR("Si desidera cancellare i giri modificati manualmente?")))
|
||||
elimina_planning_itinerario(dadata,adata,coditi,true);
|
||||
else
|
||||
elimina_planning_itinerario(dadata,adata,coditi,false);
|
||||
query << " SELECT CODITI=" << itinerario;
|
||||
}
|
||||
else
|
||||
elimina_planning(dadata,adata);
|
||||
|
||||
if (yesno_box(TR("Si desidera cancellare i giri modificati manualmente?")))
|
||||
elimina_planning(dadata,adata,true);
|
||||
else
|
||||
elimina_planning(dadata,adata,false);
|
||||
_codriga.destroy(); //azzera il numero delle righe del planning già generati
|
||||
|
||||
TISAM_recordset pplan(query);
|
||||
|
@ -41,13 +41,13 @@ bool lv_is_holiday(const TDate& data)
|
||||
cal = new TString(366);
|
||||
calendari.add(key,cal);
|
||||
*cal = ini.get("CAL", "lv", anno);
|
||||
cal->left_just(366);
|
||||
cal->left_just(366,'-');
|
||||
}
|
||||
|
||||
const TDate primo(1,1,anno);
|
||||
const long index = data - primo;
|
||||
|
||||
return (*cal)[index] != 'X';
|
||||
return (*cal)[index] == 'X';
|
||||
}
|
||||
|
||||
//funzione che restituisce un codice contratto valido dato cliente, indirizzo di spedizione e data
|
||||
|
Loading…
x
Reference in New Issue
Block a user