Patch level :10.0 lavanderina

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :


git-svn-id: svn://10.65.10.50/trunk@17161 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2008-09-04 15:13:32 +00:00
parent ac31c1f337
commit 6901596ed5
13 changed files with 984 additions and 356 deletions

View File

@ -1,3 +1,3 @@
164
0
$lvpasplan|||99|0|Tabella passaggi planning per contratto|||
$lvpasplan|4|4|99|0|Tabella passaggi planning per contratto|||

View File

@ -1,20 +1,20 @@
164
16
CODCF|3|6|0|Codice identificativo di un cliente
CODCONT|2|6|0|Codice identificativo di un contratto
CODCONT|3|6|0|Codice identificativo di un contratto
CODITI|1|3|0|Codice dell'itinerario
GGCONS|2|1|0|Giorno di consegna
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 di stagionalità
ORARPRV|10|6|0|Ora di arrivo prevista
ORARPRV|1|5|0|Ora di arrivo prevista
UTCREAZ|1|16|0|Utente d'inserimento
DTCREAZ|5|8|0|Data d'inserimento
ORCREAZ|10|6|Ora d'inserimento
ORCREAZ|10|6|0|
UTULAGG|1|16|0|Utente che ha fatto l'ultimo aggiornamento
DTULAGG|5|8|0|Data dell'ultimo aggiornamento
ORULAGG|10|6|Ora dell'ultimo aggiornamento
ORULAGG|10|6|0|
NOTE|11|10|0|Note
1
CODCF+CODCONT+GGCONS+CODITI|
CODCF+CODCONT+GGCONS+CODITI|

View File

@ -1,3 +1,3 @@
165
0
$lvperisosp|0|0|133|0|Tabella periodi di sospensione|||
$lvperisosp|2|2|132|0|Tabella periodi di sospensione|||

View File

@ -5,7 +5,7 @@ CODCONT|3|6|0|Codice Contratto
CODPER|3|6|0|Codice periodo di sospensione
DATAINI|5|8|0|Data inizio periodo di sospensione
DATAFIN|5|8|0|Data fine periodo di sospensione
TPSOSP|1|2|0|Tipo sospensione
TPSOSP|1|3|0|Tipo sospensione
FLFATT|8|1|0|Flag che indica se fatturare ugualmente le consegne sospese
IMPFATT|4|18|3|Importo da fatturare
PERCFATT|4|5|2|Percentuale da fatturare

View File

@ -1,3 +1,3 @@
167
0
$lvrconsplan|0|0|67|0|Righe planning consegne|||
$lvrconsplan|5|5|114|0|Righe planning consegne|||

View File

@ -1,29 +1,29 @@
167
23
CODPLAN|3|8|0|Codice planning
CODRIGA|2|5|0|Codice riga
CODRIGA|2|5|0|Codice riga del planning
DTCONS|5|8|0|Data di consegna
CODITI|2|3|0|Codice itinerario
ORDFER|2|2|0|Ordine di fermata
CODCF|3|6|0|Codice del cliente
CODCONT|3|6|0|Codice contratto
GGCONS|2|1|0|Giorno consegna
CODCONT|3|6|0|Codice del contratto
GGCONS|2|1|0|Giorno di consegna
MODPASS|1|1|0|Modalità di passaggio <C>onsegna <R>itiro <E>ntrambi
CODAUT|1|2|0|Autista
CODMEZ|1|2|0|Mezzo
CODAUT|1|2|0|Codice aurista
CODMEZ|1|8|0|Codice mezzo
PROVV|1|1|0|<P>rovvisorio o <D>efinitivo
ANNO|2|4|0|Anno documento
CODNUM|1|4|0|Numerazione documento
NDOC|3|7|0|Numero documento
CODPLANOR|1|10|0|
CODPLANOR|1|10|0|Codice planning originale
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)
PERSOSP|2|2|0|Periodo di sospensione
PERSOSPVAR|2|2|0|Periodo di sospensionevariato
UTULAGG|1|16|0|Utente che aggiornato per ultimo il planning
DTULAGG|5|8|0|Data ultimo aggionamento del planning
ORULAGG|10|6|0|Ora ultimo aggiornamento del planning
PERSOSPVAR|2|2|0|Periodo di sospensione variato
UTULAGG|1|16|0|Utente che ha fatto l'ultimo aggiornamento
DTULAGG|5|8|0|Data dell'ultimo aggiornamento
ORULAGG|10|6|0|Ora dell'ultimo aggiornamento
3
CODPLAN+CODRIGA|
DTCONS+CODITI+ORDFER+CODRIGA|
CODCF+CODITI+DTCONS|
CODCF+CODITI+DTCONS|

View File

@ -1,145 +1,141 @@
#include <automask.h>
#include <defmask.h>
#include <relapp.h>
#include <tabutil.h>
#include <modaut.h>
#include <nditte.h>
#include <progind.h>
#include <recarray.h>
#include <reprint.h>
#include <reputils.h>
#include "lvlib.h"
#include "lv0.h"
#include "lv0500a.h"
#include "lvpasplan.h"
#include "lvperisop.h"
//-------------------------------------------------------------------
// MASCHERA
//-------------------------------------------------------------------
////////////////
// MASCHERA //
////////////////
class TPass_plan_contr_mask : public TAutomask
{
private:
bool is_check(TField_event e);
private:
void proponi_orario();
void nuovo_persosp();
protected:
virtual bool on_field_event(TOperable_field& campo, TField_event e, long jolly);
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TPass_plan_contr_mask();
};
bool TPass_plan_contr_mask::on_field_event(TOperable_field& campo, TField_event e, long jolly)
void TPass_plan_contr_mask::proponi_orario()
{
int _giorno = get_int(F_GGCONS);
switch(campo.dlg())
{
case F_GGCONS:
/*
* Controllo dell'esattezza del giorno.
* Se inserisco un numero maggiore di 7 oppure
* uguale a 0 allora pop-up di errore
*/
if(is_check(e))
{
if( _giorno>7 || _giorno==0)
{
return error_box(TR("Errore:Giorno Inesistente!"));
}
}
case F_ORAARR:
/*
* Controllo formattazione del campo ORA. Il
* Nel caso inserisco un numero inferiore delle 6 cifre
* interpreto le cifre mancanti come degli 0 posti dinnanzi
* alla cifra.
* Successivamente controllo la formattazione delle ore,
* minuti, secondi.
*/
if(is_check(e))
{
TString8 _ora_str = get(F_ORAARR);
if( _ora_str.not_empty())
{
for(int a=_ora_str.len(); a<6 ;a++)
{
_ora_str.insert("0",0);
}
if(_ora_str.sub(0,2)>"23")
{
return error_box(TR("Ora errata"));
}
else if(_ora_str.sub(2,4)>"59")
{
return error_box(TR("Minuti errati"));
}
else if(_ora_str.sub(4,6)>"59")
{
return error_box(TR("Secondi errati"));
}
}
}
}
/*
* Settaggio a false di tutti i flags
*/
long l = 0;
for(short i = F_LUN; i< F_LUN+7; i++)
{
set(i,l,0);
}
/*
* Settaggio a true del flag corrispondente
* al giorno imputato a video
*/
switch(_giorno)
{
case 1:
set(F_LUN,true);
break;
case 2:
set(F_MAR,true);
break;
case 3:
set(F_MER,true);
break;
case 4:
set(F_GIO,true);
break;
case 5:
set(F_VEN,true);
break;
case 6:
set(F_SAB,true);
break;
case 7:
set(F_DOM,true);
}
return true;
TSheet_field& sheet = sfield(F_PASPLAN);
TToken_string& rigamodificata = sheet.row(sheet.items()-1);
rigamodificata.add("00:00",sheet.cid2index(F_S_ORA));
//sheet.force_update();
return;
}
bool TPass_plan_contr_mask::is_check(TField_event e)
//questa funzione viene richiamata ogni volta che si aggiunge una riga allo sheet dei periodi di sospensione...
//...e propone il codice del periodo in automatico
void TPass_plan_contr_mask::nuovo_persosp()
{
return (e==fe_modify || e==fe_close);
//recupero il codcf e il codcont dalla maschera
const long codcli = get_long(F_CODCF);
const long codcont = get_long(F_CODCONT);
int codper; //codice periodo di sospensione
//variabili per lavorare sullo sheet
TSheet_field& sheet = sfield(F_PERSOSP);
TToken_string& rigamodificata = sheet.row(sheet.items()-1);
//se è la prima riga che inserisco, cerco l'ultimo CODPER per la coppia...
//...cliente - contratto sulla tabella, e lo incremento di 1
if (sheet.items()==1)
{
TISAM_recordset psosp("USE LVPERISOSP\n FROM CODCF=#CODCF CODCONT=#CODCONT\nTO CODCF=#CODCF CODCONT=#CODCONT");
psosp.set_var("#CODCF",codcli);
psosp.set_var("#CODCONT",codcont);
psosp.move_last();
codper = psosp.get("LVPERISOSP_CODPER").as_int()+1;
}
else //se esistono già altre righe, prendo il codice dalla riga precedente, e lo incremento di 1
{
TToken_string& rigaprecedente = sheet.row(sheet.items()-2);
codper = rigaprecedente.get_int(sheet.cid2index(F_S_CODPER))+1;
}
rigamodificata.add(codper,sheet.cid2index(F_S_CODPER)); //metto in codper nella posizione giusta sulla TToken_string
return;
}
TPass_plan_contr_mask::TPass_plan_contr_mask() : TAutomask("lv0500a") {}
bool TPass_plan_contr_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
{
case F_PASPLAN:
switch (e)
{
case se_notify_add:
proponi_orario();
default: break;
}
case F_PERSOSP:
switch (e)
{
case se_notify_add: //se si aggiunge una riga nuova allo sheet
nuovo_persosp();
break;
default:
break;
}
default:
break;
}
return true;
}
TPass_plan_contr_mask::TPass_plan_contr_mask()
:TAutomask("lv0500a") {}
//--------------------------------------------------------------
// APPLICAZIONE
//--------------------------------------------------------------
////////////////////
// Applicazione //
////////////////////
class TPass_plan_contr : public TRelation_application
{
TPass_plan_contr_mask* _mask;
TRelation* _rel;
TRelation* _rel;
long _codcli;
long _codcont;
private:
void fill_pasplan(const long codcli, const long codcont); //riempie i passaggi planning per contratto
void fill_persosp(const long codcli, const long codcont); //riempie i periodi di sospensione
int find_pass(TSheet_field& s,const int ggcons, const int coditi) const; //controlla se esiste una passaggio
int find_sosp(TSheet_field& s,const int codper) const; //controlla se esiste un periodo di sospensione
int write_pasplan(TSheet_field& pasplan, const long codcli, const long codcont); //scrive i passaggi planning per contratto
int write_persosp(TSheet_field& persosp, const long codcli, const long codcont); //scrive i periodi di sospensione
int remove_pasplan(TSheet_field& pasplan, const long codcli, const long codcont); //cancella i passaggi planning per contratto
int remove_persosp(TSheet_field& persosp, const long codcli, const long codcont); //cancella i periodi di sospensionE
protected:
virtual void init_query_mode(TMask& m);
virtual bool user_create();
virtual bool user_destroy();
virtual int read(TMask& m);
virtual int write(const TMask& m);
virtual int rewrite(const TMask& m);
virtual bool remove();
virtual TMask* get_mask(int mode) { return _mask; }
virtual bool changing_mask(int mode) { return false; }
@ -147,14 +143,447 @@ public:
virtual TRelation* get_relation() const {return (TRelation*)_rel;}
};
///////////////////////////////////////////
//// 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 planning 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;
}
//FILL_PERSOSP: questa funzione riempie lo sheet dei periodi di sospensione, recuperando eventualmente i dati già inseriti...
//...nella tabella dei periodi di sospensione (LVPERISOSP) per la coppia cliente - contratto selezionata
void TPass_plan_contr::fill_persosp(const long codcli,const long codcont)
{
//preparo il recordset su LVPERISOSP
TISAM_recordset psosp("USE LVPERISOSP\n FROM CODCF=#CODCF CODCONT=#CODCONT\nTO CODCF=#CODCF CODCONT=#CODCONT");
psosp.set_var("#CODCF",codcli);
psosp.set_var("#CODCONT",codcont);
TProgind pi(psosp.items(), TR("Elaborazione dati periodi di sospensione in corso..."), true, true);
TSheet_field& sheet = _mask->sfield(F_PERSOSP);
TMask& sheetmask = sheet.sheet_mask();
TRelation& rel = *psosp.cursor()->relation(); //accesso al file delle righe
sheet.destroy();
for (bool ok = psosp.move_first(); ok; ok = psosp.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
}
sheet.force_update(); //forza l'update dello sheet, in modo da rendere visibili i cambiamneti fatti
return;
}
//READ: ridefinizione metodo read() delle TRelation
int TPass_plan_contr::read(TMask& m)
{
//i due campi di testata DEVONO essere pieni tutte e due
if (_mask->field(F_CODCF).empty() || _mask->field(F_CODCONT).empty())
return !NOERR;
//recupero i dati della testata
const long codcli = _mask->get_long(F_CODCF);
const long codcont = _mask->get_long(F_CODCONT);
fill_pasplan(codcli,codcont);
fill_persosp(codcli,codcont);
return NOERR;
}
///////////////////////////////////////////
//// FUNZIONI PER WRITE E REWRITE ////
///////////////////////////////////////////
//FIND_PASS: questa funziona controlla se una coppia giorno di consegna - itinerario che esiste sul file,
//esiste ancora sullo sheet (se non esiste è stato cancellato)
int TPass_plan_contr::find_pass(TSheet_field& s,const int ggcons, const int coditi) const
{
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;
}
//FIND_SOSP: questa funziona controlla se un periodo di sospensione che esiste sul file,
//esiste ancora sullo sheet (se non esiste è stato cancellato)
int TPass_plan_contr::find_sosp(TSheet_field& s,const int codper) const
{
int r=-1;
//per ogni riga dello sheet, leggi codice del periodo di sospensione,
//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 cp = s.row(r).get_int(s.cid2index(F_S_CODPER));
if (codper == cp)
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)
{
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 (file.curr().get(LVPERISOSP_UTCREAZ).empty())
lv_set_creation_info(file.curr());
else
lv_set_update_info(file.curr());*/
err = file.rewrite_write(); //o faccio la rewrite, o faccio la write
}
return err;
}
//WRITE_PERSOSP: questa funzione scrive i dati sul file 165 (LVPERISOSP)
int TPass_plan_contr::write_persosp(TSheet_field& persosp, const long codcli, const long codcont)
{
if (_mask->field(F_CODCF).empty() || _mask->field(F_CODCONT).empty())
return !NOERR;
//instanzio un TISAM_recordset
TISAM_recordset psosp("USE LVPERISOSP\n FROM CODCF=#CODCF CODCONT=#CODCONT\nTO CODCF=#CODCF CODCONT=#CODCONT");
psosp.set_var("#CODCF",codcli);
psosp.set_var("#CODCONT",codcont);
int err = NOERR;
//instanzio un TLocalisamfile
TLocalisamfile& file = psosp.cursor()->file();
//per ogni riga del recordset
for (bool ok=psosp.move_first(); ok; ok=psosp.move_next())
{
//leggo il codice del periodo di sospensione
const int sosp = psosp.get(LVPERISOSP_CODPER).as_int();
//tutte le righe del TISAM_recordset che NON SONO nel TRecord_array vanno eliminate dal file
if (find_sosp(persosp,sosp) < 0)
file.remove();
}
//creo un TRectype
TRectype& rec = file.curr();
//Maschera di sheet
TMask& msk = persosp.sheet_mask();
//per ogni riga dello sheet
FOR_EACH_SHEET_ROW(persosp,r,row)
{
//azzero il record
rec.zero();
//putto nel record codcli e codcont (sempre gli stessi)
rec.put(LVPERISOSP_CODCF,codcli);
rec.put(LVPERISOSP_CODCONT,codcont);
//per ogni campo della mashera 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 char* field = fr->name(); //salvo il nome del campo
const int pos = persosp.cid2index(f->dlg()); //salvo la sua posizione all'inetrno dello sheet
rec.put(field,row->get(pos)); //putto il suo valore nel record che sto costruendo
}
}
/*//setto le informazioni di creazione e/o aggiornamento del record
if (rec.get(LVPERISOSP_UTCREAZ).empty())
lv_set_creation_info(rec);
else
lv_set_update_info(rec);*/
err = file.rewrite_write(); //o faccio la rewrite, o faccio la write
}
return err;
}
//WRITE: ridefinizione metodo write delle TRelation
int TPass_plan_contr::write(const TMask& m)
{
if (_mask->field(F_CODCF).empty() || _mask->field(F_CODCONT).empty())
return !NOERR;
const long codcli = _mask->get_long(F_CODCF);
const long codcont = _mask->get_long(F_CODCONT);
int err_1;
int err_2;
//variabili per lavorare sugli sheet
TSheet_field& pasplan = _mask->sfield(F_PASPLAN);
TSheet_field& persosp = _mask->sfield(F_PERSOSP);
if (pasplan.items() > 0)
err_1 = write_pasplan(pasplan,codcli,codcont);
if (persosp.items() > 0)
err_2 = write_persosp(persosp,codcli,codcont);
return err_1 && err_2;
}
//ridefinizione metodo rewrite delle TRelation
int TPass_plan_contr::rewrite(const TMask& m)
{
if (_mask->field(F_CODCF).empty() || _mask->field(F_CODCONT).empty())
return !NOERR;
const long codcli = _mask->get_long(F_CODCF);
const long codcont = _mask->get_long(F_CODCONT);
int err_1;
int err_2;
//variabili per lavorare sugli sheet
TSheet_field& pasplan = _mask->sfield(F_PASPLAN);
TSheet_field& persosp = _mask->sfield(F_PERSOSP);
if (pasplan.items() > 0)
err_1 = write_pasplan(pasplan,codcli,codcont);
if (persosp.items() > 0)
err_2 = write_persosp(persosp,codcli,codcont);
return err_1 && err_2;
}
///////////////////////////////////////////
//// FUNZIONI PER REMOVE ////
///////////////////////////////////////////
//REMOVE_PASPLAN: elimina tutte le righe dei passaggi per la coppia cliente - contratto selezionata
int TPass_plan_contr::remove_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 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; ok=pplan.move_next())
{
err = file.remove();
}
return err;
}
//REMOVE_PERSOSP: elimina tutte le righe dei periodi di sospensione per la coppia cliente - contratto selezionata
int TPass_plan_contr::remove_persosp(TSheet_field& persosp, const long codcli, const long codcont)
{
//instanzio un TISAM_recordset
TISAM_recordset psosp("USE LVPERISOSP\n FROM CODCF=#CODCF CODCONT=#CODCONT\nTO CODCF=#CODCF CODCONT=#CODCONT");
psosp.set_var("#CODCF",codcli);
psosp.set_var("#CODCONT",codcont);
int err = NOERR;
//instanzio un TLocalisamfile
TLocalisamfile& file = psosp.cursor()->file();
//per ogni riga del recordset
for (bool ok=psosp.move_first(); ok; ok=psosp.move_next())
{
err = file.remove();
}
return err;
}
//REMOVE: ridefinizione del metodo remove delle TRelation
bool TPass_plan_contr::remove()
{
if (_mask->field(F_CODCF).empty() || _mask->field(F_CODCONT).empty())
return !NOERR;
//valori recuperati dalla testata
const long codcli = _mask->get_long(F_CODCF);
const long codcont = _mask->get_long(F_CODCONT);
//variabili per lavorare sugli sheet
TSheet_field& pasplan = _mask->sfield(F_PASPLAN);
TSheet_field& persosp = _mask->sfield(F_PERSOSP);
int err_1 = remove_pasplan(pasplan,codcli,codcont);
int err_2 = remove_persosp(persosp,codcli,codcont);
return err_1 && err_2;
}
///////////////////////////////////////////
//// METODI PRIVATI ////
///////////////////////////////////////////
//questa funzione forza i campi F_CODCF e F_CODCONT quando...
//...vengono passati come parametri al programma
void TPass_plan_contr::init_query_mode(TMask& m)
{
if (_codcli > 0)
{
m.set(F_CODCF,_codcli);
m.set(F_CODCONT,_codcont,0x2);
if (find(0))
modify_mode();
}
}
//costruttore
bool TPass_plan_contr::user_create()
{
_rel = new TRelation(LF_LVPASPLAN);
_rel = new TRelation(LF_LVCONDV);
_mask = new TPass_plan_contr_mask;
//se gli sono stati passati più parametri, allora setto le variabili globali _codcli e _codcont...
//...con i parametri desiderati, se no li setto a zero
if (argc() > 2)
{
_codcli = atol(argv(2));
_codcont = atol(argv(3));
}
else
{
_codcli = 0;
_codcont = 0;
}
return true;
}
//distruttore
bool TPass_plan_contr::user_destroy()
{
delete _mask;

View File

@ -1,30 +1,42 @@
#define F_CODDITTA 101
#define F_RAGSOCDITTA 102
#define F_CODCF 103
#define F_RAGSOC_CLI 104
#define F_CODCONT 105
#define F_DES_CODCONT 106
#define F_CODITI 107
#define F_DES_ITI 108
#define F_GGCONS 109
#define F_CODFRQCONS 110
#define F_DES_FRQCONS 111
#define F_MODPASS 112
#define F_DES_MODPASS 113
#define F_ORDFERM 114
#define F_FLAGSTAG 115
#define F_ORAARR 116
#define F_DATAINS 117
#define F_ORAINS 118
#define F_USERINS 119
#define F_DATAAGG 120
#define F_ORAAGG 121
#define F_USERAGG 122
#define F_NOTE 123
#define F_LUN 124
#define F_MAR 125
#define F_MER 126
#define F_GIO 127
#define F_VEN 128
#define F_SAB 129
#define F_DOM 130
//Definizione campi per maschera lv1500a - Inserimento passaggi planning per contratto e periodi di sospensione
//Testata
#define F_CODCF 203
#define F_RAGSOCCLI 204
#define F_CODCONT 205
#define F_VALIDA 206
#define F_VALIA 207
#define F_PASPLAN 208
#define F_PERSOSP 209
//Campi sheet dei passaggi planning per contratto
#define F_S_GGCONS 101
#define F_S_STRGGCONS 102
#define F_S_ITI 103
#define F_S_DESITI 992
#define F_S_ORDFER 104
#define F_S_ORA 105
#define F_S_MODPAS 106
#define F_S_FREQ 107
#define F_S_FLSTAG 108
#define F_S_NOTEPC 109
#define F_S_UTENTEC 993
#define F_S_DATAC 994
#define F_S_ORAC 995
#define F_S_UTENTEUA 996
#define F_S_DATAUA 997
#define F_S_ORAUA 998
//campi sheet dei periodi di sospensione
#define F_S_CODPER 101
#define F_S_TPSOSP 102
#define F_S_DTPSOSP 999
#define F_S_DADATA 103
#define F_S_ADATA 104
#define F_S_FLFAT 105
#define F_S_IMPFAT 106
#define F_S_PERFAT 107
#define F_S_NOTEPS 108
#define F_S_UTENTEC 993
#define F_S_DATAC 994
#define F_S_ORAC 995
#define F_S_UTENTEUA 996
#define F_S_DATAUA 997
#define F_S_ORAUA 998

View File

@ -4,274 +4,442 @@ TOOLBAR "" 0 0 0 2
#include "relapbar.h"
ENDPAGE
PAGE "Passaggi Planning per Contratto" 0 2 0 0
PAGE "Passaggi Planning per Contratto" -1 -1 78 10
GROUPBOX DLG_NULL 80 3
GROUPBOX DLG_NULL 76 4
BEGIN
PROMPT 0 1 "@bDitta"
PROMPT 1 1 "@b Planning per Contratto"
END
NUMBER F_CODDITTA 5
BEGIN
PROMPT 2 2 "Codice"
FLAGS "FD"
USE LF_NDITTE
CHECKTYPE NORMAL
INPUT CODDITTA F_CODDITTA
OUTPUT F_RAGSOCDITTA RAGSOC
END
STRING F_RAGSOCDITTA 50
BEGIN
PROMPT 17 2 "Ragione"
FLAGS "D"
END
GROUPBOX DLG_NULL 80 6
BEGIN
PROMPT 0 4 "@b Planning per Contratto"
END
NUMBER F_CODCF 6
BEGIN
PROMPT 2 5 "Codice "
PROMPT 2 2 "Cliente "
FLAGS "UG"
FIELD CODCF
FLAGS "BU"
KEY 1
USE LF_CLIFO SELECT TIPOCF = "C"
INPUT CODCF F_CODCF
DISPLAY "Codice" CODCF
DISPLAY "Ragione Sociale@50" RAGSOC
USE LF_LVCONDV
JOIN LF_CLIFO INTO TIPOCF="C" CODCF=CODCF
INPUT CODCF F_CODCF
INPUT CODCONT F_CODCONT
DISPLAY "Codice Cliente" CODCF
DISPLAY "Contratto@8" CODCONT
DISPLAY "Inizio@10" DATAIN
DISPLAY "Fine@10" DATASC
DISPLAY "Cliente@50" LF_CLIFO->RAGSOC
OUTPUT F_CODCONT CODCONT
OUTPUT F_CODCF CODCF
OUTPUT F_RAGSOC_CLI RAGSOC
CHECKTYPE REQUIRED
OUTPUT F_RAGSOCCLI LF_CLIFO->RAGSOC
OUTPUT F_VALIDA DATAIN
OUTPUT F_VALIA DATASC
CHECKTYPE FORCED
KEY 1
END
STRING F_RAGSOC_CLI 50
STRING F_RAGSOCCLI 50
BEGIN
PROMPT 20 5 ""
PROMPT 22 2 ""
FLAGS "D"
END
NUMBER F_CODCONT 6
BEGIN
PROMPT 2 6 "Contratto N."
FLAGS "BU"
PROMPT 2 3 "Contratto "
FLAGS "U"
FIELD CODCONT
COPY ALL F_CODCF
CHECKTYPE FORCED
KEY 1
CHECKTYPE REQUIRED
END
STRING F_DES_CODCONT 50
DATE F_VALIDA
BEGIN
PROMPT 20 6 ""
PROMPT 22 3 "Valido dal "
FLAGS "D"
FIELD DATAIN
END
STRING F_CODITI 3
DATE F_VALIA
BEGIN
PROMPT 2 7 "Itinerario "
FIELD CODITI
FLAGS "U"
KEY 1
USE &ITI
INPUT CODTAB F_CODITI
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODITI CODTAB
OUTPUT F_DES_ITI S0
CHECKTYPE REQUIRED
END
STRING F_DES_ITI 50
BEGIN
PROMPT 20 7 ""
PROMPT 45 3 "al "
FLAGS "D"
FIELD DATAFIN
END
NUMBER F_GGCONS 1
SPREADSHEET F_PASPLAN 0 7
BEGIN
PROMPT 2 8 "Giorno Consegna"
PROMPT 0 5 "Passaggi planning per contratto"
ITEM "Num."
ITEM "Giorno"
ITEM "Itinerario"
ITEM "Ordine\nfermata"
ITEM "Ora\nprevista"
ITEM "Mod. pass."
ITEM "Frequenza\nconsegne"
ITEM "Giro\nstagionale"
ITEM "Note@50"
END
SPREADSHEET F_PERSOSP 0 7
BEGIN
PROMPT 0 13 "Periodi di sospensione"
ITEM "Codice"
ITEM "Tipo\nsospensione"
ITEM "Data\ninizio"
ITEM "Data\nfine"
ITEM "Fattura"
ITEM "Importo da\nfatturare"
ITEM "Percentuale da\nfatturare"
ITEM "Note@50"
END
ENDPAGE
ENDMASK
PAGE "Passaggi planning per contratto" -1 -1 78 20
GROUPBOX DLG_NULL 76 5
BEGIN
PROMPT 1 0 "@bDati Itinerario"
END
NUMBER F_S_GGCONS 1
BEGIN
PROMPT 2 1 "Giorno "
SHEET "Codice|Giorno@10"
INPUT F_S_GGCONS
ITEM "1|Lunedì"
ITEM "2|Martedì"
ITEM "3|Mercoledì"
ITEM "4|Giovedì"
ITEM "5|Venerdì"
ITEM "6|Sabato"
ITEM "7|Domenica"
OUTPUT F_S_GGCONS
OUTPUT F_S_STRGGCONS
FIELD GGCONS
KEY 1
USE LF_LVPASPLAN KEY 1
INPUT CODCF F_CODCF
INPUT CODCONT F_CODCONT
INPUT CODITI F_CODITI
INPUT GGCONS F_GGCONS
DISPLAY "Cliente" CODCF
DISPLAY "Contratto" CODCONT
DISPLAY "Itinerario" CODITI
DISPLAY "Giorno" GGCONS
DISPLAY "Ord.Fermata" ORDFERM
DISPLAY "Frequenza" FREQ
DISPLAY "Mod.Pass." MODPASS
DISPLAY "Stagionalità" FLSTAG
DISPLAY "Ora Arrivo" ORARPRV
OUTPUT F_CODCF CODCF
OUTPUT F_CODCONT CODCONT
OUTPUT F_CODITI CODITI
OUTPUT F_GGCONS GGCONS
CHECKTYPE REQUIRED
END
BOOLEAN F_LUN
STRING F_S_STRGGCONS 10
BEGIN
PROMPT 25 8 "Lun."
PROMPT 20 1 ""
FLAGS "D"
END
BOOLEAN F_MAR
NUMBER F_S_ITI 3
BEGIN
PROMPT 33 8 "Mar."
FLAGS "D"
END
BOOLEAN F_MER
BEGIN
PROMPT 41 8 "Mer."
FLAGS "D"
END
BOOLEAN F_GIO
BEGIN
PROMPT 49 8 "Gio."
FLAGS "D"
END
BOOLEAN F_VEN
BEGIN
PROMPT 57 8 "Ven."
FLAGS "D"
END
BOOLEAN F_SAB
BEGIN
PROMPT 65 8 "Sab."
FLAGS "D"
END
BOOLEAN F_DOM
BEGIN
PROMPT 73 8 "Dom."
FLAGS "D"
END
GROUPBOX DLG_NULL 80 5
BEGIN
PROMPT 0 11 "@b Dettaglio"
END
STRING F_CODFRQCONS 2
BEGIN
PROMPT 2 12 "Frequenza Consegne"
FIELD FREQ
FLAGS "U"
USE &FRQ
INPUT CODTAB F_CODFRQCONS
DISPLAY "Codice" CODTAB
PROMPT 2 2 "Itinerario "
FLAGS "Z"
FIELD CODITI
USE &ITI
INPUT CODTAB F_S_ITI
DISPLAY "Codice " CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODFRQCONS CODTAB
OUTPUT F_DES_FRQCONS S0
OUTPUT F_S_ITI CODTAB
OUTPUT F_S_DESITI S0
CHECKTYPE REQUIRED
END
STRING F_DES_FRQCONS 50
STRING F_S_DESITI 50
BEGIN
PROMPT 26 12 ""
PROMPT 20 2 ""
FLAGS "D"
END
STRING F_MODPASS 1
NUMBER F_S_ORDFER 3
BEGIN
PROMPT 2 13 "Modalità Passaggio"
FLAGS "U"
FIELD MODPASS
USE &MPS
INPUT CODTAB F_MODPASS
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione @50" S0
OUTPUT F_MODPASS CODTAB
OUTPUT F_DES_MODPASS S0
END
STRING F_DES_MODPASS 50
BEGIN
PROMPT 26 13 ""
FLAGS "D"
END
NUMBER F_ORDFERM 3
BEGIN
PROMPT 2 14 "Ordine Fermata "
PROMPT 2 3 "N. Fermata "
FIELD ORDFERM
CHECKTYPE NORMAL
END
BOOLEAN F_FLAGSTAG
STRING F_S_ORA 5
BEGIN
PROMPT 30 14 "Stagionalità"
FIELD FLSTAG
END
NUMBER F_ORAARR 6
BEGIN
PROMPT 47 14 "Ora di arrivo"
PROMPT 20 3 "Ora arrivo "
PICTURE "@@:@@"
FIELD ORARPRV
END
GROUPBOX DLG_NULL 80 5
BOOLEAN F_S_FLSTAG
BEGIN
PROMPT 0 16 "@b Gestione Dati Ins.\Agg."
PROMPT 40 3 "Flag Stagionalità"
FIELD FLSTAG
END
DATE F_DATAINS
GROUPBOX DLG_NULL 76 3
BEGIN
PROMPT 2 18 "Data Ins."
PROMPT 1 5 "@bDettagli consegna"
END
LIST F_S_MODPAS 10
BEGIN
PROMPT 2 6 "Modalità di passaggio "
ITEM "E|Entrambi"
ITEM "C|Consegna"
ITEM "R|Ritiro"
FIELD MODPASS
END
NUMBER F_S_FREQ 3
BEGIN
PROMPT 40 6 "Frequenza di consegna "
FIELD FREQ
END
GROUPBOX DLG_NULL 76 5
BEGIN
PROMPT 1 8 "@bNote"
END
MEMO F_S_NOTEPC 74 4
BEGIN
PROMPT 2 8 ""
FIELD NOTE
END
GROUPBOX DLG_NULL 76 3
BEGIN
PROMPT 1 13 "@bDettagli creazione passaggio"
END
STRING F_S_UTENTEC 16
BEGIN
PROMPT 2 14 "Utente "
FIELD UTCREAZ
FLAGS "D"
FIELD DTCREAZ
END
NUMBER F_ORAINS 6
DATE F_S_DATAC
BEGIN
PROMPT 25 18 "Ora Ins."
PROMPT 27 14 "Data "
FIELD DTCREAZ
FLAGS "D"
END
STRING F_S_ORAC 5
BEGIN
PROMPT 45 14 "Ora "
PICTURE "@@:@@"
FIELD ORCREAZ
FLAGS "D"
END
STRING F_USERINS 16
GROUPBOX DLG_NULL 76 3
BEGIN
PROMPT 44 18 "Utente Ins."
FLAGS "D"
FIELD UTCREAZ
PROMPT 1 16 "@bDettagli ultimo aggiornamento"
END
DATE F_DATAAGG
STRING F_S_UTENTEUA 16
BEGIN
PROMPT 2 19 "Data Agg."
FLAGS "D"
FIELD DTULAGG
END
NUMBER F_ORAAGG 6
BEGIN
PROMPT 25 19 "Ora Agg."
FIELD ORULAGG
PROMPT 2 17 "Utente "
FIELD UTCREAZ
FLAGS "D"
END
STRING F_USERAGG 16
DATE F_S_DATAUA
BEGIN
PROMPT 44 19 "Utente Agg."
FLAGS "D"
FIELD UTULAGG
PROMPT 27 17 "Data "
FIELD DTCREAZ
FLAGS "D"
END
STRING F_S_ORAUA 5
BEGIN
PROMPT 45 17 "Ora "
PICTURE "@@:@@"
FIELD ORCREAZ
FLAGS "D"
END
ENDPAGE
TOOLBAR "" 0 0 0 2
BUTTON DLG_OK 2 2
BEGIN
PROMPT 1 1 ""
END
BUTTON DLG_DELREC 2 2
BEGIN
PROMPT 2 1 "Elimina"
MESSAGE EXIT,K_DEL
PICTURE BMP_DELREC
END
BUTTON DLG_CANCEL 2 2
BEGIN
PROMPT 4 1 ""
END
ENDPAGE
ENDMASK
PAGE "Periodi di sospensione" -1 -1 78 20
GROUPBOX DLG_NULL 76 5
BEGIN
PROMPT 1 0 "@bDati periodo di sospensione"
END
NUMBER F_S_CODPER 6
BEGIN
PROMPT 2 1 "Codice "
FLAGS "ZDR"
FIELD CODPER
END
STRING F_S_TPSOSP 3
BEGIN
PROMPT 2 2 "Tipo "
FIELD TPSOSP
USE &TSP
INPUT CODTAB F_S_TPSOSP
INPUT S0 F_S_DTPSOSP
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_S_TPSOSP CODTAB
OUTPUT F_S_DTPSOSP S0
CHECKTYPE REQUIRED
END
STRING F_S_DTPSOSP 50
BEGIN
PROMPT 16 2 ""
USE &TSP
INPUT S0 F_S_DTPSOSP
INPUT CODTAB F_S_TPSOSP
DISPLAY "Descrizione@50" S0
DISPLAY "Codice" CODTAB
COPY OUTPUT F_S_TPSOSP
CHECKTYPE REQUIRED
END
DATE F_S_DADATA
BEGIN
PROMPT 2 3 "Consegne sospese dal "
FIELD DATAINI
CHECKTYPE REQUIRED
END
DATE F_S_ADATA
BEGIN
PROMPT 40 3 "al "
FIELD DATAFIN
CHECKTYPE REQUIRED
END
GROUPBOX DLG_NULL 76 4
BEGIN
PROMPT 1 5 "@bDati fatturazione"
END
BOOLEAN F_S_FLFAT
BEGIN
PROMPT 2 6 "Flag Fatturazione"
FIELD FLFATT
MESSAGE FALSE CLEAR,F_S_IMPFAT|CLEAR,F_S_PERFAT
MESSAGE TRUE ENABLE,F_S_IMPFAT|ENABLE,F_S_PERFAT
END
CURRENCY F_S_IMPFAT
BEGIN
PROMPT 2 7 "Importo da fatturare "
FLAGS "U"
FIELD IMPFATT
END
NUMBER F_S_PERFAT 6 2
BEGIN
PROMPT 43 7 "Percentuale da fatturare "
FLAGS "U"
FIELD PERCFATT
END
GROUPBOX DLG_NULL 76 4
BEGIN
PROMPT 1 9 "@bNote"
END
MEMO F_S_NOTEPS 74 3
BEGIN
PROMPT 2 9 ""
FIELD NOTE
END
GROUPBOX DLG_NULL 76 3
BEGIN
PROMPT 1 13 "@bDettagli creazione periodo di sospensione"
END
STRING F_S_UTENTEC 16
BEGIN
PROMPT 2 14 "Utente "
FIELD UTCREAZ
FLAGS "D"
END
DATE F_S_DATAC
BEGIN
PROMPT 27 14 "Data "
FIELD DTCREAZ
FLAGS "D"
END
STRING F_S_ORAC 5
BEGIN
PROMPT 45 14 "Ora "
PICTURE "@@:@@"
FIELD ORCREAZ
FLAGS "D"
END
GROUPBOX DLG_NULL 76 3
BEGIN
PROMPT 1 16 "@bDettagli ultimo aggiornamento"
END
STRING F_S_UTENTEUA 16
BEGIN
PROMPT 2 17 "Utente "
FIELD UTCREAZ
FLAGS "D"
END
DATE F_S_DATAUA
BEGIN
PROMPT 27 17 "Data "
FIELD DTCREAZ
FLAGS "D"
END
STRING F_S_ORAUA 5
BEGIN
PROMPT 45 17 "Ora "
PICTURE "@@:@@"
FIELD ORCREAZ
FLAGS "D"
END
ENDPAGE
TOOLBAR "" 0 0 0 2
BUTTON DLG_OK 2 2
BEGIN
PROMPT 1 1 ""
END
BUTTON DLG_DELREC 2 2
BEGIN
PROMPT 2 1 "Elimina"
MESSAGE EXIT,K_DEL
PICTURE BMP_DELREC
END
BUTTON DLG_CANCEL 2 2
BEGIN
PROMPT 4 1 ""
END
ENDPAGE

View File

@ -158,7 +158,7 @@ bool TGenera_planning_app::kill_planning (TISAM_recordset& selrighe) const
rplan.remove();
}
rplan.close();
rplan.pack();
//rplan.pack();
}
else
return error_box(TR("Impossibile eliminare i planning richiesti"));

View File

@ -298,7 +298,7 @@ bool TGestione_planning_mask::on_field_event(TOperable_field& o, TField_event e,
{
switch (o.dlg())
{
//se quiesti campi vengono riempiti, allora riempi lo sheet opportunamante
//se questi campi vengono riempiti, allora riempi lo sheet opportunamante
case F_DADATA:
case F_ADATA:
case F_CODITI:

View File

@ -344,7 +344,5 @@ BEGIN
PROMPT 4 1 ""
END
ENDPAGE
ENDMASK

21
lv/lvperisop.h Executable file
View File

@ -0,0 +1,21 @@
#ifndef __LVPERISOSP_H
#define __LVPERISOSP_H
#define LVPERISOSP_CODCF "CODCF"
#define LVPERISOSP_CODCONT "CODCONT"
#define LVPERISOSP_CODPER "CODPER"
#define LVPERISOSP_DATAINI "DATAINI"
#define LVPERISOSP_DATAFIN "DATAFIN"
#define LVPERISOSP_TPSOSP "TPSOSP"
#define LVPERISOSP_FLFATT "FLFATT"
#define LVPERISOSP_IMPFATT "IMPFATT"
#define LVPERISOSP_PERCFATT "PERCFATT"
#define LVPERISOSP_UTCREAZ "UTCREAZ"
#define LVPERISOSP_DTCREAZ "DTCREAZ"
#define LVPERISOSP_ORCREAZ "ORCREAZ"
#define LVPERISOSP_UTULAGG "UTULAGG"
#define LVPERISOSP_DTULAGG "DTULAGG"
#define LVPERISOSP_ORULAGG "ORULAGG"
#define LVPERISOSP_NOTE "NOTE"
#endif