Patch level : 10.0
Files correlati : lv0, tracciati record Ricompilazione Demo : [ ] Commento : 0001075: Loop dopo aver inserito itinerario stagionale in giro contratto Descrizione Inserito medesimo itinerario per lo stesso giorno con una frequenza consegne diversa ... doveva chiedere la data validità (che è l'unica cosa che li deve differenziare) ma non viene chiesto nulla e dato che adesso si prevede la generazione automatica dei giri il programma parte e va in loop... si è costretti ad uscire buttando giù l'applicazione e terminando i processi a mano. Un volta che si riesce a rientrare l'itinerario che doveva essere stagionale l'ultimo itierario inserito si sovrappone al primo. git-svn-id: svn://10.65.10.50/trunk@17953 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
09770608aa
commit
d326b1f6e4
@ -1,3 +1,3 @@
|
|||||||
164
|
164
|
||||||
0
|
0
|
||||||
$lvpasplan|0|0|113|0|Tabella passaggi planning per contratto|||
|
$lvpasplan|0|0|116|0|Tabella passaggi planning per contratto|||
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
164
|
164
|
||||||
18
|
19
|
||||||
CODCF|3|6|0|Codice identificativo di un cliente
|
CODCF|3|6|0|Codice identificativo di un cliente
|
||||||
CODCONT|3|6|0|Codice identificativo di un contratto
|
CODCONT|3|6|0|Codice identificativo di un contratto
|
||||||
|
NRIGA|2|3|0|Indice di riga
|
||||||
CODITI|9|3|0|Codice dell'itinerario
|
CODITI|9|3|0|Codice dell'itinerario
|
||||||
GGCONS|2|1|0|Giorno di consegna
|
GGCONS|2|1|0|Giorno di consegna
|
||||||
ORDFERM|2|3|0|Indica l'ordine di fermata dell'autista
|
ORDFERM|2|3|0|Indica l'ordine di fermata dell'autista
|
||||||
@ -19,4 +20,4 @@ DTULAGG|5|8|0|Data dell'ultimo aggiornamento
|
|||||||
ORULAGG|1|5|0|Ora utimo aggiornamento
|
ORULAGG|1|5|0|Ora utimo aggiornamento
|
||||||
NOTE|11|10|0|Note
|
NOTE|11|10|0|Note
|
||||||
1
|
1
|
||||||
CODCF+CODCONT+GGCONS+CODITI|
|
CODCF+CODCONT+NRIGA|
|
||||||
|
258
lv/lv0500.cpp
258
lv/lv0500.cpp
@ -68,10 +68,7 @@ class TPass_plan_contr : public TRelation_application
|
|||||||
long _codcont;
|
long _codcont;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void fill_pasplan(const long codcli, const long codcont); //riempie i passaggi planning per contratto
|
void genera_giri(const int err, const long codli); //richiama la generazione giri in automatico
|
||||||
int find_pass(TSheet_field& s,const int ggcons, const int coditi) const; //controlla se esiste una passaggio
|
|
||||||
int write_pasplan(TSheet_field& pasplan, const long codcli, const long codcont); //scrive i passaggi planning per contratto
|
|
||||||
int remove_pasplan(const long codcli, const long codcont); //cancella i passaggi planning per contratto
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void init_query_mode(TMask& m);
|
virtual void init_query_mode(TMask& m);
|
||||||
@ -92,169 +89,40 @@ public:
|
|||||||
//// FUNZIONI PER READ ////
|
//// FUNZIONI PER READ ////
|
||||||
///////////////////////////////////////////
|
///////////////////////////////////////////
|
||||||
|
|
||||||
//FILL_PASPLAN: questa funzione riempie lo sheet dei passaggi contratto per planning, se ne sono stati già inseriti...
|
|
||||||
//...per la coppia cliente - contratto selezionata, se no propone un insieme di righe vuote,...
|
|
||||||
//...una per ogni giorno della settimana
|
|
||||||
void TPass_plan_contr::fill_pasplan(const long codcli,const long codcont)
|
|
||||||
{
|
|
||||||
//preparo il recordset su LVPASPLAN
|
|
||||||
TISAM_recordset pplan("USE LVPASPLAN\n FROM CODCF=#CODCF CODCONT=#CODCONT\nTO CODCF=#CODCF CODCONT=#CODCONT");
|
|
||||||
pplan.set_var("#CODCF",codcli);
|
|
||||||
pplan.set_var("#CODCONT",codcont);
|
|
||||||
|
|
||||||
TProgind pi(pplan.items(), TR("Elaborazione dati passaggi per contratto in corso..."), true, true);
|
|
||||||
|
|
||||||
TSheet_field& sheet = _mask->sfield(F_PASPLAN);
|
|
||||||
TMask& sheetmask = sheet.sheet_mask();
|
|
||||||
TRelation& rel = *pplan.cursor()->relation(); //accesso al file delle righe
|
|
||||||
|
|
||||||
sheet.destroy();
|
|
||||||
|
|
||||||
if (pplan.items()>0)
|
|
||||||
{
|
|
||||||
for (bool ok = pplan.move_first(); ok; ok = pplan.move_next())
|
|
||||||
{
|
|
||||||
if (!pi.addstatus(1))
|
|
||||||
break;
|
|
||||||
|
|
||||||
TToken_string& row = sheet.row(-1); //crea una nuova riga dello sheet
|
|
||||||
|
|
||||||
//scandisco nella maschera tutti i campi che hanno un field
|
|
||||||
FOR_EACH_MASK_FIELD(sheetmask,i,f)
|
|
||||||
{
|
|
||||||
const TFieldref* fr = f->field(); //leggo il valore dalla relation
|
|
||||||
if (fr != NULL)
|
|
||||||
row.add(fr->read(rel),sheet.cid2index(f->dlg())); //metto il valore letto nella posizione corretta nella TToken_string
|
|
||||||
}
|
|
||||||
sheet.check_row(sheet.items()-1); //fa fare alla maschera la decodifica dei codici e aggiorna la TToken_string
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//questo ciclo crea le sette righe vuote
|
|
||||||
TString ora = "00:00";
|
|
||||||
for (int i = 1; i<=7; ++i)
|
|
||||||
{
|
|
||||||
TToken_string& row = sheet.row(-1); //crea una nuova riga dello sheet
|
|
||||||
row.add(i,sheet.cid2index(F_S_GGCONS)); //aggiunge al posto giusto il numero del giorno della settimana
|
|
||||||
row.add(ora,sheet.cid2index(F_S_ORA)); //propone l'ora di arrivo in automatico
|
|
||||||
sheet.check_row(sheet.items()-1); //forza la maschera a fare la decodifica dei codici
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sheet.force_update(); //forza l'update dello sheet, in modo da rendere visibili i cambiamneti fatti
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//READ: ridefinizione metodo read() delle TRelation
|
//READ: ridefinizione metodo read() delle TRelation
|
||||||
int TPass_plan_contr::read(TMask& m)
|
int TPass_plan_contr::read(TMask& m)
|
||||||
{
|
{
|
||||||
//i due campi di testata DEVONO essere pieni tutte e due
|
//riempio gli sheet
|
||||||
/*if (m.field(F_CODCF).empty() || m.field(F_CODCONT).empty())
|
const int err = TRelation_application::read(m);
|
||||||
return !NOERR;*/
|
if (err == NOERR)
|
||||||
|
{
|
||||||
//recupero i dati della testata
|
TSheet_field& pc = m.sfield(F_PASPLAN);
|
||||||
const long codcli = _rel->curr().get_long("CODCF");
|
|
||||||
const long codcont = _rel->curr().get_long("CODCONT");
|
if (pc.items() == 0)
|
||||||
fill_pasplan(codcli,codcont);
|
{
|
||||||
|
//questo ciclo crea le sette righe vuote
|
||||||
TSheet_field& ps = m.sfield(F_PERSOSP);
|
TString ora = "00:00";
|
||||||
ps.record()->read(*ps.putkey(*_rel));
|
for (int i = 1; i<=7; ++i)
|
||||||
ps.autoload(*_rel);
|
{
|
||||||
|
TToken_string& row = pc.row(-1); //crea una nuova riga dello sheet
|
||||||
return NOERR;
|
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 ////
|
//// FUNZIONI PER WRITE E REWRITE ////
|
||||||
///////////////////////////////////////////
|
///////////////////////////////////////////
|
||||||
|
|
||||||
//FIND_PASS: questa funziona controlla se una coppia giorno di consegna - itinerario che esiste sul file,
|
//GENERA_GIRI: questa funzione richiama la generazione giri in automatico...
|
||||||
//esiste ancora sullo sheet (se non esiste è stato cancellato)
|
//..se questa possibilità è prevista in configurazione
|
||||||
int TPass_plan_contr::find_pass(TSheet_field& s,const int ggcons, const int coditi) const
|
void TPass_plan_contr::genera_giri(const int err, const long codcli)
|
||||||
{
|
{
|
||||||
int r=-1;
|
|
||||||
|
|
||||||
//per ogni riga dello sheet, leggi giorno di consegna e itinerario,
|
|
||||||
//e se esiste interrompi restituendo un valore positivo,
|
|
||||||
//se no arriva fino in fondo e resituisci -1
|
|
||||||
for (r=s.items()-1;r>=0;r--)
|
|
||||||
{
|
|
||||||
const int gc = s.row(r).get_int(s.cid2index(F_S_GGCONS));
|
|
||||||
const int ci = s.row(r).get_int(s.cid2index(F_S_ITI));
|
|
||||||
|
|
||||||
if (ggcons == gc && coditi == ci)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//WRITE_PASPLAN: questa funzione scrive i dati sul file 164 (LVPASPLAN)
|
|
||||||
int TPass_plan_contr::write_pasplan(TSheet_field& pasplan, const long codcli, const long codcont)
|
|
||||||
{
|
|
||||||
//instanzio un TISAM_recordset
|
|
||||||
TISAM_recordset pplan("USE LVPASPLAN\n FROM CODCF=#CODCF CODCONT=#CODCONT\nTO CODCF=#CODCF CODCONT=#CODCONT");
|
|
||||||
pplan.set_var("#CODCF",codcli);
|
|
||||||
pplan.set_var("#CODCONT",codcont);
|
|
||||||
|
|
||||||
int err = NOERR;
|
|
||||||
|
|
||||||
//instanzio un TLocalisamfile
|
|
||||||
TLocalisamfile& file = pplan.cursor()->file();
|
|
||||||
|
|
||||||
//per ogni riga del recordset
|
|
||||||
for (bool ok=pplan.move_first(); ok; ok=pplan.move_next())
|
|
||||||
{
|
|
||||||
//leggo il giorno di consegna e il codice itinerario
|
|
||||||
const int ggcons = pplan.get(LVPASPLAN_GGCONS).as_int();
|
|
||||||
const int coditi = pplan.get(LVPASPLAN_CODITI).as_int();
|
|
||||||
|
|
||||||
//tutte le righe del TISAM_recordset che NON SONO nel TRecord_array vanno eliminate dal file
|
|
||||||
if (find_pass(pasplan,ggcons,coditi) < 0)
|
|
||||||
file.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
//Maschera di sheet
|
|
||||||
TMask& msk = pasplan.sheet_mask();
|
|
||||||
|
|
||||||
//per ogni riga dello sheet
|
|
||||||
FOR_EACH_SHEET_ROW(pasplan,r,row)
|
|
||||||
{
|
|
||||||
if (row->get_int(pasplan.cid2index(F_S_ITI)) == 0)
|
|
||||||
continue;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
file.zero();
|
|
||||||
//putto nel file codcli e codcont (sempre gli stessi)
|
|
||||||
file.put(LVPASPLAN_CODCF,codcli);
|
|
||||||
file.put(LVPASPLAN_CODCONT,codcont);
|
|
||||||
|
|
||||||
//per ogno campo della maschera di sheet
|
|
||||||
FOR_EACH_MASK_FIELD(msk,i,f)
|
|
||||||
{
|
|
||||||
//prendo il FIELD a cui si riferiscono
|
|
||||||
const TFieldref*fr = f->field();
|
|
||||||
|
|
||||||
//se efftivamente il campo ha un field di riferimento
|
|
||||||
if (fr!= NULL)
|
|
||||||
{
|
|
||||||
const int pos=pasplan.cid2index(f->dlg()); //salvo la sua posizione all'inetrno dello sheet
|
|
||||||
fr->write(row->get(pos),file.curr()); //scrivo il valore che sto leggendo nel record corrente del file
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//setto le informazioni di creazione e/o aggiornamento del record
|
|
||||||
if (_mask->edit_mode())
|
|
||||||
lv_set_update_info(file.curr());
|
|
||||||
else
|
|
||||||
lv_set_creation_info(file.curr());
|
|
||||||
|
|
||||||
err = file.rewrite_write(); //o faccio la rewrite, o faccio la write
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//se la scrittura è andata a buon fine, genero i passaggi planning per contratto...
|
|
||||||
//...dalla data odierna alla data dell'ultimo passaggio previsto già generato
|
|
||||||
if (err == NOERR)
|
if (err == NOERR)
|
||||||
{
|
{
|
||||||
//la scrittura automatica dei giri viene fatta solo se è settato l'apposito flag...
|
//la scrittura automatica dei giri viene fatta solo se è settato l'apposito flag...
|
||||||
@ -282,7 +150,7 @@ int TPass_plan_contr::write_pasplan(TSheet_field& pasplan, const long codcli, co
|
|||||||
fname.fremove();
|
fname.fremove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return err;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//WRITE: ridefinizione metodo write delle TRelation
|
//WRITE: ridefinizione metodo write delle TRelation
|
||||||
@ -292,20 +160,16 @@ int TPass_plan_contr::write(const TMask& m)
|
|||||||
return _isnocurkey;
|
return _isnocurkey;
|
||||||
|
|
||||||
const long codcli = _mask->get_long(F_CODCF);
|
const long codcli = _mask->get_long(F_CODCF);
|
||||||
const long codcont = _mask->get_long(F_CODCONT);
|
|
||||||
|
|
||||||
int err_1 = NOERR;
|
const int err = TRelation_application::write(m);
|
||||||
|
if (err == NOERR)
|
||||||
//variabili per lavorare sugli sheet
|
{
|
||||||
TSheet_field& pasplan = _mask->sfield(F_PASPLAN);
|
TSheet_field& pc = m.sfield(F_PASPLAN);
|
||||||
if (pasplan.items() > 0)
|
|
||||||
err_1 = write_pasplan(pasplan,codcli,codcont);
|
if (pc.items() > 0)
|
||||||
|
genera_giri(err, codcli);
|
||||||
TSheet_field& ps = m.sfield(F_PERSOSP);
|
}
|
||||||
ps.autosave(*get_relation());
|
return err;
|
||||||
ps.record()->write(false);
|
|
||||||
|
|
||||||
return err_1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//ridefinizione metodo rewrite delle TRelation
|
//ridefinizione metodo rewrite delle TRelation
|
||||||
@ -315,46 +179,23 @@ int TPass_plan_contr::rewrite(const TMask& m)
|
|||||||
return _isnocurkey;
|
return _isnocurkey;
|
||||||
|
|
||||||
const long codcli = _mask->get_long(F_CODCF);
|
const long codcli = _mask->get_long(F_CODCF);
|
||||||
const long codcont = _mask->get_long(F_CODCONT);
|
|
||||||
|
|
||||||
int err_1 = NOERR;
|
const int err = TRelation_application::rewrite(m);
|
||||||
|
if (err == NOERR)
|
||||||
|
{
|
||||||
|
TSheet_field& pc = m.sfield(F_PASPLAN);
|
||||||
|
|
||||||
|
if (pc.items() > 0)
|
||||||
|
genera_giri(err, codcli);
|
||||||
|
}
|
||||||
|
|
||||||
//variabili per lavorare sugli sheet
|
return err;
|
||||||
TSheet_field& pasplan = _mask->sfield(F_PASPLAN);
|
|
||||||
if (pasplan.items() >= 0)
|
|
||||||
err_1 = write_pasplan(pasplan,codcli,codcont);
|
|
||||||
|
|
||||||
TSheet_field& ps = m.sfield(F_PERSOSP);
|
|
||||||
ps.autosave(*_rel);
|
|
||||||
ps.record()->write(true);
|
|
||||||
|
|
||||||
return err_1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////
|
///////////////////////////////////////////
|
||||||
//// FUNZIONI PER REMOVE ////
|
//// FUNZIONI PER REMOVE ////
|
||||||
///////////////////////////////////////////
|
///////////////////////////////////////////
|
||||||
|
|
||||||
//REMOVE_PASPLAN: elimina tutte le righe dei passaggi per la coppia cliente - contratto selezionata
|
|
||||||
int TPass_plan_contr::remove_pasplan(const long codcli, const long codcont)
|
|
||||||
{
|
|
||||||
//instanzio un TISAM_recordset
|
|
||||||
TISAM_recordset pplan("USE LVPASPLAN\n FROM CODCF=#CODCF CODCONT=#CODCONT\nTO CODCF=#CODCF CODCONT=#CODCONT");
|
|
||||||
pplan.set_var("#CODCF", codcli);
|
|
||||||
pplan.set_var("#CODCONT", codcont);
|
|
||||||
|
|
||||||
int tmp = pplan.items();
|
|
||||||
|
|
||||||
int err = NOERR;
|
|
||||||
|
|
||||||
//instanzio un TLocalisamfile
|
|
||||||
TLocalisamfile& file = pplan.cursor()->file();
|
|
||||||
//per ogni riga del recordset
|
|
||||||
for (bool ok=pplan.move_first(); ok && err == NOERR; ok=pplan.move_next())
|
|
||||||
err = file.remove();
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
//REMOVE: ridefinizione del metodo remove delle TRelation
|
//REMOVE: ridefinizione del metodo remove delle TRelation
|
||||||
bool TPass_plan_contr::remove()
|
bool TPass_plan_contr::remove()
|
||||||
{
|
{
|
||||||
@ -362,10 +203,11 @@ bool TPass_plan_contr::remove()
|
|||||||
ps.autosave(*_rel);
|
ps.autosave(*_rel);
|
||||||
ps.record()->remove();
|
ps.record()->remove();
|
||||||
|
|
||||||
//valori recuperati dalla testata
|
TSheet_field& pc = _mask->sfield(F_PASPLAN);
|
||||||
const long codcli = _rel->curr().get_long(LVPASPLAN_CODCF);
|
pc.autosave(*_rel);
|
||||||
const long codcont = _rel->curr().get_long(LVPASPLAN_CODCONT);
|
pc.record()->remove();
|
||||||
return remove_pasplan(codcli,codcont) == NOERR;
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////
|
///////////////////////////////////////////
|
||||||
|
@ -89,7 +89,11 @@ BEGIN
|
|||||||
ITEM "Passaggio\nstagionale@10"
|
ITEM "Passaggio\nstagionale@10"
|
||||||
ITEM "Valido dal@11"
|
ITEM "Valido dal@11"
|
||||||
ITEM "al@11"
|
ITEM "al@11"
|
||||||
ITEM "Note@50"
|
ITEM "Note@50"
|
||||||
|
USE LF_LVPASPLAN KEY NRIGA
|
||||||
|
INPUT CODCF F_CODCF
|
||||||
|
INPUT CODCONT F_CODCONT
|
||||||
|
FLAGS "A"
|
||||||
END
|
END
|
||||||
|
|
||||||
SPREADSHEET F_PERSOSP 0 7
|
SPREADSHEET F_PERSOSP 0 7
|
||||||
|
Loading…
x
Reference in New Issue
Block a user