Aggiunta documentazione in linea
git-svn-id: svn://10.65.10.50/trunk@2368 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
2fc3b68c9d
commit
1206be479c
@ -13,7 +13,7 @@
|
||||
// Classe TApplication
|
||||
// @END
|
||||
|
||||
#define MSG_AI "AI" // message auto_insert (relapp)
|
||||
#define MSG_AI "AI" // message auto_insert (relapp)
|
||||
#define MSG_FS "FS" // message filtered start (relapp)
|
||||
#define MSG_LN "LN" // message (printapp -> relapp)
|
||||
#define CHK_ALL -1 // all authorization checks
|
||||
|
@ -30,7 +30,7 @@ typedef bool (*CONDITION_FUNCTION) ( const TObject& );
|
||||
typedef void (*OPERATION_FUNCTION) ( const TObject& );
|
||||
|
||||
|
||||
// @class TContainer | Generico contenitore ad accesso casuale( con indice )
|
||||
// @class TContainer | Generico contenitore ad accesso casuale (con indice)
|
||||
// @base public | TObject
|
||||
|
||||
class TContainer : public TObject
|
||||
@ -38,7 +38,7 @@ class TContainer : public TObject
|
||||
|
||||
// @access Private Member
|
||||
private:
|
||||
|
||||
|
||||
CONDITION_FUNCTION _last_condition;
|
||||
|
||||
// @access Public Member
|
||||
|
@ -5,16 +5,29 @@
|
||||
#include <relapp.h>
|
||||
#endif
|
||||
|
||||
// @doc EXTERNAL
|
||||
|
||||
// @class TBrowse_application | Classe per applicazioni di visualizzazione archivi
|
||||
//
|
||||
// @base public | TRelation_application
|
||||
class TBrowse_application : public TRelation_application
|
||||
|
||||
// @author(:INTERNAL) Nicola
|
||||
|
||||
{
|
||||
// @access Protected Member
|
||||
protected:
|
||||
virtual bool main_loop(); // Ciclo principale
|
||||
// @cmember Ciclo principale
|
||||
virtual bool main_loop();
|
||||
|
||||
// @access Public Member
|
||||
public:
|
||||
TBrowse_application() {}
|
||||
virtual ~TBrowse_application() {}
|
||||
// @cmember Costruttore
|
||||
TBrowse_application()
|
||||
{}
|
||||
// @cmember Distruttore
|
||||
virtual ~TBrowse_application()
|
||||
{}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -6,6 +6,8 @@
|
||||
|
||||
#define comunque
|
||||
|
||||
// @doc EXTERNAL
|
||||
|
||||
bool TConfig_application::create()
|
||||
{
|
||||
TApplication::create();
|
||||
@ -143,10 +145,22 @@ bool TConfig_application::postprocess_config (TMask& mask, TConfig& config)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool TConfig_application::postprocess_config_changed(const char* par,
|
||||
const char* var,
|
||||
const char* oldv,
|
||||
const char* newv)
|
||||
// @mfunc Simile alla <mf TApplication::change_config>, ma viene usata
|
||||
// dalla maschera principale.
|
||||
//
|
||||
// @rdesc Ritorna i seguenti valori:
|
||||
//
|
||||
// @flag TRUE | Se la modifica viene acettatta (dafault)
|
||||
// @flag FALSE | Se la modifica non viene accettata
|
||||
bool TConfig_application::postprocess_config_changed(
|
||||
const char* par, // @parm Paragrafo in corso di editing
|
||||
const char* var, // @parm vedi TApplication!!!
|
||||
const char* oldv, // @parm vedi TApplication!!!
|
||||
const char* newv) // @parm vedi TApplication!!!
|
||||
|
||||
// @comm Rispetto alla <mf TApplication::change_config> le viene passato in piu' il paragrafo
|
||||
// in corso di editing. E' chiamata per ogni parametro modificato
|
||||
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -13,69 +13,80 @@
|
||||
#include <mask.h>
|
||||
#endif
|
||||
|
||||
// le applicazioni di questo tipo servono a leggere - scrivere - modificare
|
||||
// files di configurazione. La linea di comando e'
|
||||
//
|
||||
// <app> [-f <filename>] [-d] [<paragraph>, ...]
|
||||
//
|
||||
// dopo -f si dara' il nome file che si vuole editare, default e' CONFIG_FILE
|
||||
// definito in config.h. Se si da' -d viene considerato quello relativo alla
|
||||
// ditta corrente, che viene creato copiando il principale se non c'e'.
|
||||
// Quindi si da' la lista dei paragrafi che si vuole editare; se non ne vengono
|
||||
// dati sara' il modulo corrente preso dal nome dell'applicazione. Se si
|
||||
// indicano piu' paragrafi questi vengono assegnati nell'ordine alle voci
|
||||
// di menu (da mettere nell'URL) da 1 in poi. La maschera usata e' la
|
||||
// EditMask specificata nel paragrafo; se non c'e', nothing happens
|
||||
|
||||
// Ogni modifica puo' essere controllata e porcessata con la postprocess_
|
||||
// config (vedi sotto) che agisce come la change_config di application.
|
||||
// La voce Scelta parametri di Application rimane come prima.
|
||||
// @doc EXTERNAL
|
||||
|
||||
// @class TConfig_application | le applicazioni di questo tipo servono a leggere -
|
||||
// scrivere - modificare files di configurazione.
|
||||
//
|
||||
// @base public | TApplication
|
||||
class TConfig_application : public TApplication
|
||||
{
|
||||
|
||||
TArray _paragraphs;
|
||||
int _which_config;
|
||||
// @author:(INTERNAL) Villa
|
||||
//
|
||||
// @comm La linea di comando e'
|
||||
//
|
||||
// <nl><nl><lt>app<gt> [-f <lt>filename<gt>] [-d] [<lt>paragraph<gt>, ...]
|
||||
//
|
||||
// <nl><nl>dopo <p -f> si dara' il nome file che si vuole editare, default e' CONFIG_FILE
|
||||
// definito in config.h.
|
||||
// <nl>Se si da' <p -d> viene considerato quello relativo alla
|
||||
// ditta corrente, che viene creato copiando il principale se non c'e'.
|
||||
// <nl>Quindi si da' la lista dei paragrafi che si vuole editare; se non ne vengono
|
||||
// dati sara' il modulo corrente preso dal nome dell'applicazione. Se si
|
||||
// indicano piu' paragrafi questi vengono assegnati nell'ordine alle voci
|
||||
// di menu (da mettere nell'URL) da 1 in poi. La maschera usata e' la
|
||||
// EditMask specificata nel paragrafo; se non c'e', non accade nulla
|
||||
// <nl>Ogni modifica puo' essere controllata e porcessata con la
|
||||
// <mf TConfig_application::postprocess_config> che agisce come la <mf TApplication::change_config>.
|
||||
// <nl>La voce Scelta parametri di <c TApplication> rimane come prima.
|
||||
|
||||
// @access Private Member
|
||||
{
|
||||
// @cmember Array di paragrafi da editare
|
||||
TArray _paragraphs;
|
||||
// @cmember Numero del file di configurazione da modificare
|
||||
int _which_config;
|
||||
// @cmember Ultima voce di menu' selezionata
|
||||
MENU_TAG _last_choice;
|
||||
|
||||
// @cmember Crea la finestra principale (vedi <c TApplication>)
|
||||
virtual bool create();
|
||||
// @cmember Rimuove l'applicazione (vedi <c TApplication>)
|
||||
virtual bool destroy();
|
||||
// @cmember Controlla il menu' (vedi <c TApplication>)
|
||||
virtual bool menu(MENU_TAG);
|
||||
|
||||
void do_config(int m);
|
||||
|
||||
// @cmember Permette di modificare la configurazione del paragrafo <p m>
|
||||
void do_config(int m);
|
||||
|
||||
// @access Protected Member
|
||||
protected:
|
||||
|
||||
virtual bool user_create() { return TRUE; }
|
||||
virtual bool user_destroy() { return TRUE; }
|
||||
// @cmember Ritorna TRUE
|
||||
virtual bool user_create()
|
||||
{ return TRUE; }
|
||||
// @cmember Ritorna TRUE
|
||||
virtual bool user_destroy()
|
||||
{ return TRUE; }
|
||||
|
||||
// questa viene chiamata prima della run() e ferma tutto se ritorna
|
||||
// FALSE
|
||||
// @cmember Viene chiamata prima della <mf TApplication::run> e ferma tutto se ritorna FALSE
|
||||
virtual bool preprocess_config (TMask& mask, TConfig& config);
|
||||
// questa viene chiamata dopo e blocca tutto se FALSE
|
||||
// @cmember Viene chiamata dopo la <mf TApplication::run> e blocca tutto se ritorna FALSE
|
||||
virtual bool postprocess_config (TMask& mask, TConfig& config);
|
||||
|
||||
// questa e' come la change_config di application ma viene usata
|
||||
// dalla maschera principale; le viene passato in piu' il paragrafo
|
||||
// in corso di editing. E' chiamata per ogni parametro modificato
|
||||
// Se ritorna FALSE la modifica non viene accettata; default ritorna
|
||||
// TRUE e non rompe i bal
|
||||
virtual bool postprocess_config_changed (const char* par, const char* var,
|
||||
const char* oldv, const char* newv);
|
||||
// @cmember Simile alla <mf TApplication::change_config>, ma viene usata
|
||||
// dalla maschera principale.
|
||||
virtual bool postprocess_config_changed (const char* par, const char* var, const char* oldv, const char* newv);
|
||||
|
||||
|
||||
// @access Public Member
|
||||
public:
|
||||
|
||||
TConfig_application(int which_config = CONFIG_GENERAL)
|
||||
: _which_config(which_config)
|
||||
{}
|
||||
// @cmember Costruttore
|
||||
TConfig_application(int which_config = CONFIG_GENERAL) : _which_config(which_config)
|
||||
{}
|
||||
// @cmember Distruttore
|
||||
virtual ~TConfig_application()
|
||||
{}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -120,9 +120,9 @@ public:
|
||||
// @cmember Riempie pl con la lista dei paragrafi
|
||||
int list_paragraphs(TString_array& pl);
|
||||
|
||||
// @cmember Riempie vl con la lista dei nomi delle variabili
|
||||
// @cmember Riempie <p vl> con la lista dei nomi delle variabili
|
||||
// nella sezione corrente o in quella indicata; se
|
||||
// add_value e' TRUE ci mette "variabile|valore"
|
||||
// add_value e' TRUE ci mette "variabile<pipe>valore"
|
||||
// ACHTUNG: l'array e' in ordine HASH (CAZZ)
|
||||
int list_variables(TString_array& vl, bool add_value = FALSE, const char* section = NULL);
|
||||
|
||||
|
@ -1187,7 +1187,7 @@ void TBaseisamfile::indexoff()
|
||||
// @mfunc Apre il file isam di base con lock
|
||||
//
|
||||
// @rdesc Ritorna NOERR se e' riuscita ad aprire il file, altrimenti ritorna il numero di errore
|
||||
// generato (vedi <e TIsamerr>).
|
||||
// generato (vedi <t TIsamerr>).
|
||||
int TBaseisamfile::_open(
|
||||
unsigned int mode) // @parm Indica il modo di apertura del file (default _manulock)
|
||||
|
||||
@ -1423,10 +1423,10 @@ TIsamfile::~TIsamfile()
|
||||
}
|
||||
|
||||
|
||||
// @cmember Aggiorna i flags associati al file
|
||||
// @mfunc Aggiorna i flags associati al file
|
||||
//
|
||||
// @rdesc Ritorna NOERR se e' riuscita ad eseguiore l'operazione, altrimenti ritorna il numero
|
||||
// di errore generato (vedi <e TIsamerr>).
|
||||
// di errore generato (vedi <t TIsamerr>).
|
||||
int TIsamfile::flags(
|
||||
bool updateeod) // @parm Indica se aggiornare anche l'EOD del file
|
||||
|
||||
@ -1518,7 +1518,7 @@ TIsamtempfile::~TIsamtempfile()
|
||||
// @mfunc Apre il file
|
||||
//
|
||||
// @rdesc Ritorna NOERR se e' riuscita ad aprire il file, altrimenti ritorna il numero di errore
|
||||
// generato (vedi <e TIsamerr>).
|
||||
// generato (vedi <t TIsamerr>).
|
||||
int TIsamtempfile::open(
|
||||
const char* radix, // @parm Radice del path del file
|
||||
bool create, // @parm Indica se va creatoun nuovo file (se FALSE il file esiste gia')
|
||||
@ -1709,7 +1709,7 @@ long TSystemisamfile::size(TRecnotype eox)
|
||||
// @flag FALSE | Se è stato rilevato un errore durante la conversione (viene emesso un <f error_box>)
|
||||
bool TSystemisamfile::exec_convapp(
|
||||
long flev, // @parm Livello a cui aggiornare l'archivio
|
||||
const bool before) // @parm SANDRO???
|
||||
const bool before) // @parm Indica se viene chiamata prima o dopo la conversione
|
||||
|
||||
{
|
||||
const char * const v = before ? "BCNV" : "ACNV";
|
||||
@ -1744,7 +1744,14 @@ bool TSystemisamfile::exec_convapp(
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool TSystemisamfile::getlcf(long flev)
|
||||
// @mfunc Recupera le conversioni logiche da effettuare sul file
|
||||
//
|
||||
// @rdesc Ritorna TRUE se occorre effettuare la conversione sul file
|
||||
bool TSystemisamfile::getlcf(
|
||||
long flev) // @parm livello archivi di partenza della convesione
|
||||
|
||||
// @comm Recupera le conversioni logiche da effettuare sul file per per passare dal
|
||||
// livello archivi <p flev> a quello attuale degli archivi standard.
|
||||
|
||||
{
|
||||
_flds.destroy();
|
||||
@ -1795,7 +1802,7 @@ void TSystemisamfile::makelc(TRectype& rec)
|
||||
// @mfunc Esegue la conversione del tracciato record del file
|
||||
//
|
||||
// @rdesc Ritorna il risulato della conversione, altrimenti il codice di errore generato
|
||||
// (vedi <e TIsamerr>)
|
||||
// (vedi <t TIsamerr>)
|
||||
int TSystemisamfile::update(
|
||||
TTrec& newrec, // @parm Nuovo tracciato record con cui aggiornare il file
|
||||
bool vis) // @parm Indica se visualizzare lo stato dell'operazione
|
||||
@ -1947,7 +1954,7 @@ int TSystemisamfile::update(
|
||||
// @mfunc Rimuove fisicamente i record cancellati
|
||||
//
|
||||
// @rdesc Ritorna NOERR se l'operazione di compattamento e' riuscita, altrimenti il codice di
|
||||
// di errore generato (vedi <e TIsamerr>).
|
||||
// di errore generato (vedi <t TIsamerr>).
|
||||
int TSystemisamfile::packfile(
|
||||
bool vis) // @parm Indica se visualizzare lo stato dell'operazione
|
||||
|
||||
@ -1972,7 +1979,7 @@ int TSystemisamfile::packfile(
|
||||
// @mfunc Rimuove fisicamente gli indici cancellati
|
||||
//
|
||||
// @rdesc Ritorna NOERR se l'operazione di compattamento e' riuscita, altrimenti il codice di
|
||||
// di errore generato (vedi <e TIsamerr>).
|
||||
// di errore generato (vedi <t TIsamerr>).
|
||||
int TSystemisamfile::packindex(
|
||||
bool vis) // @parm Indica se visualizzare lo stato dell'operazione
|
||||
|
||||
@ -2016,14 +2023,17 @@ int TSystemisamfile::pack(bool vis)
|
||||
// @mfunc Importa un file ascii
|
||||
//
|
||||
// @rdesc Ritorna NOERR se l'operazione di lettura e' riuscita, altrimenti il codice di
|
||||
// di errore generato (vedi <e TIsamerr>).
|
||||
// di errore generato (vedi <t TIsamerr>).
|
||||
int TSystemisamfile::load(
|
||||
const char* from, // @parm Nome del file da importare
|
||||
char fs, // @parm Carattere separatore di campo (default <pipe>)
|
||||
char fd, // @parm Carattere delimitatore di campi (default '\\0')
|
||||
char rs, // @parm Carattere separatore di record (default '\\n')
|
||||
bool vis, // @parm Indica se visualizzare lo stato dell'operazione (default TRUE)
|
||||
bool extended) // @parm SANDRO???(default FALSE)
|
||||
bool extended) // @parm Indica se interpretare alcune stringhe come macro (default FALSE)
|
||||
|
||||
// @comm Se <p extended> e' TRUE e trova alcune stringhe col formato %stringa% (es. %frm%)
|
||||
// ne sostituisce i valori (es. ditta corrente).
|
||||
|
||||
// @xref <mf TSystemisamfile::dump>
|
||||
|
||||
@ -2205,7 +2215,7 @@ int TSystemisamfile::load(
|
||||
// @mfunc Esporta VERSO un file ascii.
|
||||
//
|
||||
// @rdesc Ritorna NOERR se l'operazione di esportazione e' riuscita, altrimenti il codice di
|
||||
// di errore generato (vedi <e TIsamerr>).
|
||||
// di errore generato (vedi <t TIsamerr>).
|
||||
int TSystemisamfile::dump(
|
||||
const char* to, // @parm Nome del file verso quale esportare
|
||||
int nkey, // @parm Numero della chiave di ordinamento con cui scaricare i dati (defualt 1)
|
||||
|
@ -60,7 +60,7 @@ class TRectype;
|
||||
//
|
||||
// @base public | TObject
|
||||
class TMemo_info : public TObject
|
||||
// @author(:INTERNAL) Sandro
|
||||
// @author:(INTERNAL) Sandro
|
||||
{
|
||||
// @access Private Member
|
||||
|
||||
@ -115,7 +115,7 @@ public:
|
||||
// @base public | TSortable
|
||||
class TRectype : public TSortable
|
||||
|
||||
// @author(:INTERNAL) Sandro
|
||||
// @author:(INTERNAL) Sandro
|
||||
|
||||
{
|
||||
// @cfriend TExtrectype
|
||||
@ -329,14 +329,14 @@ public:
|
||||
};
|
||||
|
||||
|
||||
// @class TRectype | Classe per la definizione del file isam di base
|
||||
// @class TBaseisamfile | Classe per la definizione del file isam di base
|
||||
//
|
||||
// @base public | TObject
|
||||
class TBaseisamfile : public TObject
|
||||
|
||||
// @author(:INTERNAL) Sandro
|
||||
// @author:(INTERNAL) Sandro
|
||||
|
||||
// @access Provate Member
|
||||
// @access Private Member
|
||||
{
|
||||
// @cmember Descrittore del file isam
|
||||
isdef* _isamfile;
|
||||
@ -417,31 +417,31 @@ public:
|
||||
// @cmember Setta la variabiel <p _leaterr>
|
||||
void setstatus(int status)
|
||||
{ _lasterr = status; }
|
||||
// @cmember Si posiziona sul primo record del file (vedi <e TReclock>)
|
||||
// @cmember Si posiziona sul primo record del file (vedi <t TReclock>)
|
||||
virtual int first(word lockop = _nolock);
|
||||
// @cmember Si posiziona sull'ultimo record del file (vedi <e TReclock>)
|
||||
// @cmember Si posiziona sull'ultimo record del file (vedi <t TReclock>)
|
||||
virtual int last(word lockop = _nolock);
|
||||
// @cmember Si posiziona sul successivo record del file (vedi <e TReclock>)
|
||||
// @cmember Si posiziona sul successivo record del file (vedi <t TReclock>)
|
||||
virtual int next(word lockop = _nolock);
|
||||
// @cmember Si posiziona sul successivo record del file (UNUSED)
|
||||
virtual int next(TDate& atdate);
|
||||
// @cmember Si posiziona sul precedente record del file (vedi <e TReclock>)
|
||||
// @cmember Si posiziona sul precedente record del file (vedi <t TReclock>)
|
||||
virtual int prev(word lockop = _nolock);
|
||||
// @cmember Si posiziona sul precedente record del file (UNUSED)
|
||||
virtual int prev(TDate& atdate);
|
||||
// @cmember Rilegge l'ultimo record letto (vedi <e TReclock>)
|
||||
// @cmember Rilegge l'ultimo record letto (vedi <t TReclock>)
|
||||
virtual int reread(word lockop = _nolock, TDate& atdate = (TDate&)botime);
|
||||
// @cmember Rilegge l'ultimo record letto e lo copia in <p rec> (vedi <e TReclock>)
|
||||
// @cmember Rilegge l'ultimo record letto e lo copia in <p rec> (vedi <t TReclock>)
|
||||
virtual int reread(TRectype& rec, word lockop = _nolock, TDate& atdate = (TDate&)botime);
|
||||
// @cmember Salta <p nrec> record dalla posizione corrente (vedi <e TReclock>)
|
||||
// @cmember Salta <p nrec> record dalla posizione corrente (vedi <t TReclock>)
|
||||
virtual int skip(TRecnotype nrec, word lockop = _nolock);
|
||||
// @cmember Legge il record (vedi <e TReclock> e <e TIsamop>)
|
||||
// @cmember Legge il record (vedi <t TReclock> e <t TIsamop>)
|
||||
virtual int read(word op = _isequal, word lockop = _nolock, TDate& atdate = (TDate&)botime);
|
||||
// @cmember Legge il record e lo copia in <p rec> (vedi <e TReclock> e <e TIsamop>)
|
||||
// @cmember Legge il record e lo copia in <p rec> (vedi <t TReclock> e <t TIsamop>)
|
||||
virtual int read(TRectype& rec, word op = _isequal, word lockop = _nolock, TDate& atdate = (TDate&)botime);
|
||||
// @cmember Legge il record alla posizione <p nrec> (vedi <e TReclock>)
|
||||
// @cmember Legge il record alla posizione <p nrec> (vedi <t TReclock>)
|
||||
virtual int readat(TRecnotype nrec, word lockop = _nolock);
|
||||
// @cmember Legge il record alla posizione <p nrec> e lo copia in <p rec> (vedi <e TReclock>)
|
||||
// @cmember Legge il record alla posizione <p nrec> e lo copia in <p rec> (vedi <t TReclock>)
|
||||
virtual int readat(TRectype& rec, TRecnotype nrec, word lockop = _nolock);
|
||||
// @cmember Aggiunge un record
|
||||
virtual int write(TDate& atdate = (TDate&)botime);
|
||||
@ -608,7 +608,7 @@ public:
|
||||
// @base public | TBaseisamfile
|
||||
class TIsamfile : public TBaseisamfile
|
||||
|
||||
// @author(:INTERNAL) Sandro
|
||||
// @author:(INTERNAL) Sandro
|
||||
{
|
||||
|
||||
// @access Public Member
|
||||
@ -633,7 +633,7 @@ public:
|
||||
// @base public | TIsamfile
|
||||
class TSystemisamfile : public TIsamfile
|
||||
|
||||
// @author(:INTERNAL) Sandro
|
||||
// @author:(INTERNAL) Sandro
|
||||
|
||||
{
|
||||
// @access Private Memebr
|
||||
@ -643,11 +643,12 @@ class TSystemisamfile : public TIsamfile
|
||||
// @cmember Array di espressione
|
||||
TArray _exps;
|
||||
|
||||
// @cmember Ritorna TRUE se la versione dell'archivio e' <lt>= di <p flev>
|
||||
// @cmember Recupera le conversioni logiche da effettuare sul file
|
||||
bool getlcf(long flev);
|
||||
// @cmember Esegue la conversione del file
|
||||
bool exec_convapp(long flev, const bool before);
|
||||
// @cmember SANDRO???
|
||||
// @cmember Esegue la conversione sui record del file (utilizzando le espressione definite
|
||||
// in fconv.ini)
|
||||
void makelc(TRectype& rec);
|
||||
|
||||
// @access Public Member
|
||||
@ -687,7 +688,7 @@ public:
|
||||
// @base public | TBaseisamfile
|
||||
class TLocalisamfile : public TBaseisamfile
|
||||
|
||||
// @author(:INTERNAL) Sandro
|
||||
// @author:(INTERNAL) Sandro
|
||||
{
|
||||
// @access Private Member
|
||||
|
||||
@ -730,7 +731,7 @@ public:
|
||||
// @base public | TLocalisamfile
|
||||
class TIsamtempfile : public TLocalisamfile
|
||||
|
||||
// @author(:INTERNAL) Sandro
|
||||
// @author:(INTERNAL) Sandro
|
||||
{
|
||||
|
||||
// @access Private Member
|
||||
@ -762,7 +763,7 @@ public:
|
||||
// @base public | TArray
|
||||
class TRec_array : public TArray
|
||||
|
||||
// @author(:INTERNAL) Sandro
|
||||
// @author:(INTERNAL) Sandro
|
||||
{
|
||||
// @access Public Member
|
||||
public:
|
||||
@ -812,12 +813,12 @@ public:
|
||||
operator int() const ;
|
||||
// @cmember Operatore di estrazione per tipo long
|
||||
operator long() const ;
|
||||
// @cmember Operatore di estrazione per tipo carattere
|
||||
// @cmember const char * | operator const char* | | Operatore di estrazione per tipo carattere
|
||||
operator const char*() const ;
|
||||
// @cmember Operatore di estrazione per data
|
||||
operator TDate() const ;
|
||||
#ifndef FOXPRO
|
||||
// @cmember Operatore di estrazione per real
|
||||
// @cmember const real | operator const real | | Operatore di estrazione per real
|
||||
operator const real() const ;
|
||||
#endif
|
||||
|
||||
|
@ -14,7 +14,7 @@ const short FIRST_FIELD = 101;
|
||||
// TSpreadsheet
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
// @doc EXTERNAL
|
||||
// @doc INTERNAL
|
||||
|
||||
// @class TSpreadsheet | Classe per la creazione di uno spreadsheet all'interno
|
||||
// di una maschera
|
||||
@ -241,6 +241,8 @@ public:
|
||||
virtual ~TSpreadsheet();
|
||||
};
|
||||
|
||||
// @doc EXTERNAL
|
||||
|
||||
// Certified 100%
|
||||
void TSpreadsheet::init()
|
||||
{
|
||||
|
@ -49,7 +49,7 @@ enum TGraphic_shape
|
||||
// @base public | TObject
|
||||
class TPrintrow : public TObject
|
||||
|
||||
// @author(:INETRNAL)Villa
|
||||
// @author:(INTERNAL) Villa
|
||||
|
||||
// @access Private Member
|
||||
{
|
||||
@ -125,7 +125,7 @@ public:
|
||||
// @base public | TObject
|
||||
class PrinterDef : public TObject
|
||||
|
||||
// @author(:INTERNAL)Villa
|
||||
// @author:(INTERNAL) Villa
|
||||
|
||||
// @access Private Member
|
||||
{
|
||||
@ -173,7 +173,7 @@ public:
|
||||
// @base public | TObject
|
||||
class BkDef : public TObject
|
||||
|
||||
// @author(:INTERNAL)Villa
|
||||
// @author:(INTERNAL) Villa
|
||||
|
||||
// @comm Questo oggetto e' in grado di costrutire l'intero menu' gerarchico dei bookmark
|
||||
{
|
||||
@ -215,7 +215,7 @@ class TViswin;
|
||||
//
|
||||
// @base public | TObject
|
||||
class TPrinter : public TObject
|
||||
// @author(:INTERNAL) Villa
|
||||
// @author:(INTERNAL) Villa
|
||||
|
||||
// @access Private Member
|
||||
{
|
||||
@ -622,7 +622,7 @@ public:
|
||||
//
|
||||
// @base public | TPrinter
|
||||
class TFile_printer : public TPrinter
|
||||
// @author(:INTERNAL) Nicola
|
||||
// @author:(INTERNAL) Nicola
|
||||
|
||||
// @access Private Member
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
// $Id: relation.cpp,v 1.73 1995-12-07 11:13:59 guy Exp $
|
||||
// $Id: relation.cpp,v 1.74 1995-12-29 12:09:00 andrea Exp $
|
||||
// relation.cpp
|
||||
// fv 12/8/93
|
||||
// relation class for isam files
|
||||
@ -26,9 +26,10 @@
|
||||
// *** maximum number of elements in a cursor working page
|
||||
#define CMAXELPAGE 8000
|
||||
|
||||
|
||||
#define print_name(out, f) out << (f.num() == LF_TABCOM ? "%" : "") << f.name()
|
||||
|
||||
// @doc EXTERNAL
|
||||
|
||||
extern int get_error(int);
|
||||
|
||||
HIDDEN const char* field_type_str(TFieldtypes f)
|
||||
@ -61,7 +62,6 @@ HIDDEN const char* field_type_str(TFieldtypes f)
|
||||
|
||||
class TRelationdef : public TObject
|
||||
{
|
||||
// @DPRIV
|
||||
friend class TRelation;
|
||||
|
||||
const TRelation* _rel; // Relazione padre
|
||||
@ -74,7 +74,7 @@ class TRelationdef : public TObject
|
||||
TArray _altexprs; // Condizioni di uguaglianza alternative
|
||||
TBit_array _forced;
|
||||
bool _first_match : 1; // primo match (ed esiste)
|
||||
bool _allow_lock : 1; // ?????
|
||||
bool _allow_lock : 1; // ??
|
||||
bool _write_enable : 1;
|
||||
|
||||
public: // TObject
|
||||
@ -331,7 +331,15 @@ void TRelation::save_status()
|
||||
}
|
||||
}
|
||||
|
||||
int TRelation::log2ind(int log) const
|
||||
// @mfunc Ritorna l'indice di <p _files> del numero logico passato!!!
|
||||
//
|
||||
// @rdesc Ritorna l'indice oppure NOTFOUND nel caso non sia presente
|
||||
int TRelation::log2ind(
|
||||
int log) const // @parm Numero logico del file di cui conoscere l'indice
|
||||
|
||||
// @comm Nel caso <p log> sia minore di 0 chiama la <mf TRelation::alias2ind>
|
||||
//
|
||||
// @xref <mf TRelation::alias2ind> <mf TRelation::name2ind>
|
||||
{
|
||||
// returns _files index of logical number or NOTFOUND if not present
|
||||
|
||||
@ -346,7 +354,14 @@ int TRelation::log2ind(int log) const
|
||||
return NOTFOUND;
|
||||
}
|
||||
|
||||
int TRelation::alias2ind(int alias) const
|
||||
// @mfunc Ritorna l'indice di <p _files> del alias del file passato
|
||||
//
|
||||
// @rdesc Ritorna l'indice oppure NOTFOUND nel caso non sia presente
|
||||
int TRelation::alias2ind(
|
||||
int alias) const // @parm Alias del file di cui conoscere l'indice
|
||||
|
||||
|
||||
// @xref <mf TRelation::log2ind> <mf TRelation::name2ind>
|
||||
{
|
||||
if (alias <= 0) return 0;
|
||||
|
||||
@ -359,14 +374,32 @@ int TRelation::alias2ind(int alias) const
|
||||
return NOTFOUND;
|
||||
}
|
||||
|
||||
int TRelation::name2ind(const char* name) const
|
||||
// @mfunc Ritorna l'indice di <p _files> del nome del file passato!!!
|
||||
//
|
||||
// @rdesc Ritorna l'indice oppure NOTFOUND nel caso non sia presente
|
||||
int TRelation::name2ind(
|
||||
const char* name) const // @parm Nome del file di cui conoscere l'indice
|
||||
|
||||
// @xref <mf TRelation::alias2ind> <mf TRelation::alias2ind>
|
||||
{
|
||||
const int num = name2log(name);
|
||||
const int ind = log2ind(num);
|
||||
return ind;
|
||||
}
|
||||
|
||||
TLocalisamfile& TRelation::lfile(int logicnum) const
|
||||
// @mfunc Ritorna il descrittore del file
|
||||
//
|
||||
// @rdesc Ritorna il reference ad un <c TLocalisamfile> che indica il descrittore del
|
||||
// file della relazione
|
||||
TLocalisamfile& TRelation::lfile(
|
||||
int logicnum) const // @parm Numero logico del file da ritornare (default 0)
|
||||
// @parm const char* | name | Nome del file da ritornare
|
||||
// @syntax TLocalisamfile& lfile(int logicnum)
|
||||
// @syntax TLocalisamfile& lfile(const char* name)
|
||||
//
|
||||
// @comm E' comodo utilizzare anche l'operatore [] che richiama questa funzione con
|
||||
// la prima sintassi.
|
||||
|
||||
{
|
||||
const int idx = log2ind(logicnum);
|
||||
CHECKD(idx != NOTFOUND, "File not found n. ", logicnum);
|
||||
@ -380,7 +413,21 @@ TLocalisamfile& TRelation::lfile(const char* name) const
|
||||
return (TLocalisamfile&)_files[idx];
|
||||
}
|
||||
|
||||
void TRelation::write_enable(int logicnum, const bool on)
|
||||
// @mfunc Abilita/disabilita la scrittura sul file
|
||||
void TRelation::write_enable(
|
||||
int logicnum, // @parm Numero logico del file da abilitare/disabilitare (default 0)
|
||||
// @parm cont char* | name | Nome del file da abilitare/disabilitare
|
||||
const bool on) // @parm Indica l'operazione da effettuare sul file:
|
||||
//
|
||||
// @flag TRUE | Abilita la scrittura sul file (default)
|
||||
// @flag FALSE | Disabilita la scrittura sul file
|
||||
|
||||
// @syntax void write_enable(int logicnum, const bool on)
|
||||
// @syntax void write_enable(const char* name, const bool on)
|
||||
//
|
||||
// @comm Nel caso venga passato un numero logico uguale a 0 vengono abilitati/disabilitati tutti
|
||||
// i file dell relazione
|
||||
|
||||
|
||||
{
|
||||
if (logicnum == 0)
|
||||
@ -405,8 +452,30 @@ void TRelation::write_enable(const char* name, const bool on)
|
||||
}
|
||||
|
||||
|
||||
bool TRelation::add(TLocalisamfile* f, const char* relexprs, int key,
|
||||
int linkto, int alias, bool allow_lock)
|
||||
// @mfunc Aggiunge una nuovo file nella relazione
|
||||
//
|
||||
// @rdesc Ritorna se e' riuscito ad aggiungere il file alla relazione
|
||||
bool TRelation::add(
|
||||
TLocalisamfile* f, // @parm Descrittore del file da aggiungere
|
||||
const char* relexprs, // @parm Espressione della relazione
|
||||
int key, // @parm Chiave del file principale
|
||||
int linkto, // @parm Posizione a cui aggiungere il file
|
||||
int alias, // @parm Alias da dare al file da aggiungere
|
||||
bool allow_lock) // @parm Indica se fare il lock sul file oppure ignorarli
|
||||
// @parm int | logicnum | Numero logico del file da aggiungere
|
||||
// @parm const char* | tabname | Nome della tabella da aggiungere
|
||||
|
||||
// @syntax bool add(TLocalisamfile* f, const char* relexprs, int key, int linkto, int alias, bool allow_lock);
|
||||
// @syntax bool add(int logicnum, const char* relexprs, int key, int linkto, int alias, bool allow_lock);
|
||||
// @syntax bool add(const char* tabname, const char* relexprs, int key, int linkto, int alias, bool allow_lock);
|
||||
|
||||
// @comm Il parametro <p linkto> puo' assumere i valori:
|
||||
//
|
||||
// @flag 0 | Per il file principale
|
||||
// @flag <gt>0 | Indica il numero logico del file
|
||||
// @flag <lt>0 | Indica l'alias del file
|
||||
|
||||
|
||||
{
|
||||
const int idxto = log2ind(linkto);
|
||||
if (idxto == NOTFOUND)
|
||||
@ -438,7 +507,10 @@ bool TRelation::add(const char* tabname, const char* relexprs, int key,
|
||||
return add(t, relexprs, key, linkto, alias, allow_lock);
|
||||
}
|
||||
|
||||
void TRelation::replace(TLocalisamfile* f, int index)
|
||||
// @mfunc Sostituisce nella relazione un file!!!
|
||||
void TRelation::replace(
|
||||
TLocalisamfile* f, // @parm Descrittore del file sostituto
|
||||
int index) // @parm Posizione nel quale sostituire il file (default 0)
|
||||
{
|
||||
const TLocalisamfile* p = (const TLocalisamfile*)_files.objptr(index);
|
||||
CHECK(p && p->num() == f->num(), "Can't replace a file with different logic number");
|
||||
@ -465,8 +537,22 @@ void TRelation::zero()
|
||||
file(i).zero();
|
||||
}
|
||||
|
||||
int TRelation::position_rels(TIsamop op, TReclock lockop,
|
||||
TDate& atdate, int first)
|
||||
// @mfunc Permette di posizionare l'albero di relazioni tra i file
|
||||
//
|
||||
// @rdesc Ritorna il numero di errore avvenuto nell'opeerazione, NOERR nel caso
|
||||
// venga eseguito tutto correttamente
|
||||
int TRelation::position_rels(
|
||||
TIsamop op, // @parm Operatore che esegue la relazione (default _isequal)
|
||||
TReclock lockop, // @parm Tipo di lock sul file (default _nolock)
|
||||
TDate& atdate, // @parm UNUSED
|
||||
int first) // @parm Numero del file da cui construtire al relazione (default
|
||||
// 0, cioe' dal file principale)
|
||||
|
||||
// @comm Viene eseguito tutto il lavoro di creazione delle relazione: se non
|
||||
// trova un record adatto su un file, svuota il record corrente e non
|
||||
// ritorna errore.
|
||||
// <nl>Le altre funzioni sul record procedono normalmente
|
||||
|
||||
{
|
||||
_errors = NOERR;
|
||||
|
||||
@ -529,7 +615,22 @@ int TRelation::position_rels(TIsamop op, TReclock lockop,
|
||||
return _errors;
|
||||
}
|
||||
|
||||
bool TRelation::next_match(int logicnum, const char* fieldlist, int nkey)
|
||||
|
||||
// @mfunc Posiziona il numero logico sul record successivo
|
||||
//
|
||||
// @rdesc Ritorna se ha trovato la corrispondenza:
|
||||
//
|
||||
// @flag TRUE | Corrispondenza trovata
|
||||
// @flag FALSE | Corrispondenza non trovata
|
||||
bool TRelation::next_match(
|
||||
int logicnum, // @parm Numero logico del file da fare avanzare
|
||||
const char* fieldlist, // @parm Lista dei campi che devono rimanere costanti (default NULL)
|
||||
int nkey) // @parm Numero della chiave (default 0)
|
||||
|
||||
// @comm Il posizionamento del numero logico non deve essere riferita al file
|
||||
// principale; in ogni caso viene considerata consistente ad eccezione dei
|
||||
// casi di inconsistenza nella prima posizione.
|
||||
|
||||
{
|
||||
if (logicnum == file().num())
|
||||
{
|
||||
@ -612,9 +713,13 @@ bool TRelation::next_match(int logicnum, const char* fieldlist, int nkey)
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool TRelation::is_first_match(int logicnum)
|
||||
// TRUE se c'e' un record ed e' il primo match (non si e' mai fatta
|
||||
// position_rels)
|
||||
|
||||
// @mfunc Controlla se c'e' un record ed e' il primo match (non si e' mai fatta
|
||||
// <mf TRelation::position_rels>)
|
||||
//
|
||||
// @rdesc Ritorna TRUE se c'e' un record ed e' il primo match
|
||||
bool TRelation::is_first_match(
|
||||
int logicnum) // @parm Numero logico del file da controllare
|
||||
{
|
||||
const int i = log2ind(logicnum);
|
||||
CHECKD(i != NOTFOUND,"Nonexistent file referenced in relation ",logicnum);
|
||||
@ -628,7 +733,25 @@ bool TRelation::is_first_match(int logicnum)
|
||||
|
||||
#ifdef DBG
|
||||
|
||||
bool TRelation::isconsistent(bool reset)
|
||||
// @mfunc Controlla se la relazione e' corretta
|
||||
//
|
||||
// @rdesc Ritorna i seguent valori
|
||||
//
|
||||
// @flag TRUE | La relazione soddisfa i criteri di correttezza
|
||||
// @flag FALSE | La relazione manca di almeno uno di criteri di correttezza
|
||||
bool TRelation::isconsistent(
|
||||
bool reset) // @parm Indica se cercare di riportare la relazione ad uno stato
|
||||
// consistente (default FALSE)
|
||||
|
||||
// @comm Per essere corretta una relazione necessita che tutti i file siano
|
||||
// corretti, che il record corrente non sia vuoto e che la relazione sia
|
||||
// consistente
|
||||
// <nl>Se <p reset> e' TRUE si cerca di riportare la relazione in uno stato
|
||||
// consistente (basato sul record principale). Non viene fatto nessun altro
|
||||
// controllo
|
||||
// <nl>Questa funzione e' chiamata internamente da <mf TRelation::update>
|
||||
// e <mf TRelation::remove>.
|
||||
|
||||
{
|
||||
const int MAXREL = 24;
|
||||
int bad = 0;
|
||||
@ -748,7 +871,11 @@ HIDDEN bool __evalcondition(const TRelation* r,TExpression* cond)
|
||||
return (bool) *cond;
|
||||
}
|
||||
|
||||
FILE* TCursor::open_index(bool create)
|
||||
// @mfunc Apre il file di indice
|
||||
//
|
||||
// @rdesc Ritorna l'handle del file aperto
|
||||
FILE* TCursor::open_index(
|
||||
bool create) // @parm Indica se creare l'indice nel caso manchi (default FALSE)
|
||||
{
|
||||
#if XVT_OS == XVT_OS_SCOUNIX
|
||||
const char* const r = "r";
|
||||
@ -926,8 +1053,13 @@ TRecnotype TCursor::update()
|
||||
}
|
||||
|
||||
|
||||
void TCursor::filter(const char* fil, const TRectype *from,
|
||||
const TRectype* to)
|
||||
// @mfunc Setta il filtro sul cursore
|
||||
void TCursor::filter(
|
||||
const char* fil, // @parm Espressione del filtro
|
||||
const TRectype *from, // @parm Primo record del pacchetto da esaminare
|
||||
const TRectype* to) // @parm Ultimo record del pacchetto da esaminare
|
||||
|
||||
// @comm ATTENZIONE: non e' possibile filtrare un cursore congelato
|
||||
|
||||
{
|
||||
CHECK(!_frozen, "Impossibile filtrare un cursore congelato");
|
||||
@ -1100,7 +1232,12 @@ TRecnotype TCursor::readrec()
|
||||
return nrec;
|
||||
}
|
||||
|
||||
int TCursor::lock(TReclock l)
|
||||
// @mfunc Mette un lock sul record
|
||||
//
|
||||
// @rdesc Ritorna il numero di errore che si verifica nel porre il lock (NOERR) se
|
||||
// non si verificano errori
|
||||
int TCursor::lock(
|
||||
TReclock l) // @parm Tipo di locke da porre sul record (vedi <t TReclock>)
|
||||
{
|
||||
int rt=NOERR;
|
||||
switch(l)
|
||||
@ -1327,7 +1464,7 @@ TRecnotype TSorted_cursor::buildcursor(TRecnotype rp)
|
||||
return ap;
|
||||
}
|
||||
|
||||
int TSorted_cursor::filtercursor(int pagecnt, TRecnotype* page)
|
||||
int TSorted_cursor::filtercursor(int pagecnt, TRecnotype* page)
|
||||
{
|
||||
|
||||
int np=0, handle=file().filehnd()->fhnd;
|
||||
@ -1380,7 +1517,7 @@ int TSorted_cursor::filtercursor(int pagecnt, TRecnotype* page)
|
||||
return np;
|
||||
}
|
||||
|
||||
bool TSorted_cursor::changed()
|
||||
bool TSorted_cursor::changed()
|
||||
{
|
||||
bool rt;
|
||||
|
||||
@ -1398,7 +1535,7 @@ bool TSorted_cursor::changed()
|
||||
}
|
||||
|
||||
|
||||
void TSorted_cursor::change_order(const char* order_expr)
|
||||
void TSorted_cursor::change_order(const char* order_expr)
|
||||
{
|
||||
if (order_expr && *order_expr && order_expr != _order_expr)
|
||||
{
|
||||
@ -1427,7 +1564,11 @@ TSorted_cursor::~TSorted_cursor()
|
||||
// TFieldRef
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
int name2log(const char* name)
|
||||
// @func Converte una stringa in numero logico o numero tabella
|
||||
//
|
||||
// @rdesc Ritorna il numero logico del file o il numero della tabella
|
||||
int name2log(
|
||||
const char* name) // @parm Stringa da convertire
|
||||
{
|
||||
int log = 0;
|
||||
|
||||
@ -1465,9 +1606,15 @@ TFieldref::TFieldref(const TString& s, short defid)
|
||||
}
|
||||
|
||||
|
||||
// A Fieldref should have the following format (only NAME is mandatory):
|
||||
// FILE->NAME[FROM,TO]
|
||||
TFieldref& TFieldref::operator =(const TString& s)
|
||||
// @mfunc Operatore di assegnamento
|
||||
//
|
||||
// @rdesc Ritorna l'oggetto assegnato
|
||||
TFieldref& TFieldref::operator =(
|
||||
const TString& s) // @parm Stringa da assegnare all'oggetto
|
||||
|
||||
// @comm Un Fildref deve avere il seguente formato (solamente NAME e il mandante):
|
||||
// <nl>FILE->NAME[FROM,TO]
|
||||
|
||||
{
|
||||
int pos = s.find("->");
|
||||
if (pos > 0)
|
||||
@ -1644,8 +1791,19 @@ bool TRecord_array::exist(int n) const
|
||||
return r != NULL;
|
||||
}
|
||||
|
||||
// @mfunc Ritorna la riga <p r>
|
||||
//
|
||||
// @rdesc Ritorna un TRectype alla riga cercata o eventualemete il reference della nuova creata,
|
||||
// NULL nes caso non esista e non venga creata.
|
||||
TRectype& TRecord_array::row(
|
||||
int n, // @parm Numero della riga da creare
|
||||
bool create) // @parm Indica se creare una nuova riga se non esiste:
|
||||
//
|
||||
// @flag TRUE | Se la riga <p n> non esiste viene creata
|
||||
// @flag FALSE | Se la riga <p n> non esiste non viene creata
|
||||
|
||||
TRectype& TRecord_array::row(int n, bool create)
|
||||
// @comm Nel caso <p create> si TRUE e venga richiesta una riga non esistente si crea un nuovo
|
||||
// record copiando la chiave.
|
||||
{
|
||||
const int i = n >= 0 ? n - _offset : -1;
|
||||
TRectype* r = (TRectype*)objptr(i);
|
||||
@ -1659,8 +1817,17 @@ TRectype& TRecord_array::row(int n, bool create)
|
||||
CHECKD(r && n > 0, "Bad record number ", n);
|
||||
return *r;
|
||||
}
|
||||
// @mfunc Rinumera il campo chiave in seguito a reinsert
|
||||
//
|
||||
// @rdesc Ritorna se e' stato rinumerato il campo chiave
|
||||
bool TRecord_array::renum_key(
|
||||
const char* field, // @parm Campo della chiave a cui assegnare un nuovo valore
|
||||
const TString& num) // @parm Nuovo valore da assegnare al campo
|
||||
// @parm long | num | Nuovo valore da assegnare al campo
|
||||
|
||||
// @syntax bool renum_key(const char* field, const TString& num);
|
||||
// @syntax bool renum_key(const char* field, long num);
|
||||
|
||||
bool TRecord_array::renum_key(const char* field, const TString& num)
|
||||
{
|
||||
const TString& curr = key().get(field);
|
||||
if (curr == num)
|
||||
@ -1708,7 +1875,17 @@ int TRecord_array::add_row(TRectype* r)
|
||||
return nr;
|
||||
}
|
||||
|
||||
bool TRecord_array::destroy_row(int r, bool pack)
|
||||
// @mfunc Cancella una riga
|
||||
//
|
||||
// @rdesc Ritorna se e' riuscito ad eliminare la riga
|
||||
bool TRecord_array::destroy_row(
|
||||
int r, // @parm Numero della riga da eliminare
|
||||
bool pack) // @parm Indica se compattare gli elementi dell'array (default FALSE)
|
||||
// @parm const TRectype& | r | Record da eliminare
|
||||
|
||||
// @syntax bool destroy_row(int n, bool pack);
|
||||
// @syntax bool destroy_row(const TRectype& r, bool pack);
|
||||
|
||||
{
|
||||
CHECKD(r > _offset, "Can't destroy row ", r);
|
||||
const int index = r - _offset;
|
||||
@ -1735,8 +1912,14 @@ void TRecord_array::destroy_rows()
|
||||
destroy(i);
|
||||
}
|
||||
|
||||
// Confronta i campi della chiave 1 scartando l'ultimo
|
||||
bool TRecord_array::good(const TRectype& rec) const
|
||||
// @mfunc Confronta i campi della chiave 1 scartando l'ultimo
|
||||
//
|
||||
// @rdesc Ritorna il risulato del confronto:
|
||||
//
|
||||
// @flag TRUE | Se i campi sono uguali
|
||||
// @flag FALSE | Se i campi sono diversi
|
||||
bool TRecord_array::good(
|
||||
const TRectype& rec) const // @parm Record di cui confrontare i campi
|
||||
{
|
||||
const bool yes = key().same_key(rec, 1, 1);
|
||||
return yes;
|
||||
@ -1956,7 +2139,10 @@ void TRelation_description::read_rel()
|
||||
}
|
||||
}
|
||||
|
||||
void TRelation_description::change_relation(TRelation& r, TString_array& a)
|
||||
// @mfunc Cambia la relazione descritta
|
||||
void TRelation_description::change_relation(
|
||||
TRelation& r, // @parm Nuova relazione da assegnare
|
||||
TString_array& a) // @parm Array di descrittore dei file
|
||||
{
|
||||
_rel = &r;
|
||||
read_rel();
|
||||
@ -1979,8 +2165,18 @@ void TRelation_description::print_on(ostream& out) const
|
||||
}
|
||||
}
|
||||
|
||||
// @mfunc Seleziona un file
|
||||
//
|
||||
// @rdesc Ritorna il risultato dell'operazione:
|
||||
//
|
||||
// @flag TRUE | E' stato selzionato il file
|
||||
// @flag FALSE | Non e' riuscito a selezionare il file
|
||||
bool TRelation_description::choose_file(
|
||||
int file) // @parm Numero logico del file da selezionare (default 0)
|
||||
|
||||
// @comm Dopo aver scelto un file (occorre che ritorni TRUE) i metodi della classe
|
||||
// permettono di conoscere tutti i dati riguardanti i parametri del file selezionato
|
||||
|
||||
bool TRelation_description::choose_file(int file)
|
||||
{
|
||||
TArray_sheet sht(-1,-1,0,0,"Selezione archivio", "Codice|Descrizione archivio@70");
|
||||
TToken_string tt(80);
|
||||
@ -2022,7 +2218,17 @@ bool TRelation_description::choose_file(int file)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool TRelation_description::choose_field(const char* fld)
|
||||
// @mfunc Seleziona un campo <p fld> del file selezionato
|
||||
//
|
||||
// @rdesc Ritorna il risultato dell'operazione:
|
||||
//
|
||||
// @flag TRUE | E' stato selzionato il campo
|
||||
// @flag FALSE | Non e' riuscito a selezionare il campo
|
||||
bool TRelation_description::choose_field(
|
||||
const char* fld) // @parm Nome del campo da selezionare (defualt "")
|
||||
|
||||
// @comm Occorre sche sia selezioanto un file, diversamente viene considerato
|
||||
// selezionato il promo file
|
||||
{
|
||||
TArray_sheet sht(-1,-1,0,0,"Selezione campo",
|
||||
"Campo@10|Descrizione@50|Tipo@10|Dim.");
|
||||
@ -2052,7 +2258,16 @@ bool TRelation_description::choose_field(const char* fld)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool TRelation_description::build_menu(const char* title)
|
||||
// @func Costruisce un menu'
|
||||
//
|
||||
// @rdesc Ritorna solamente FALSE
|
||||
bool TRelation_description::build_menu(
|
||||
const char* title) // @parm Titolo del menu'
|
||||
|
||||
// @comm Costruisce un albero di menu' e setta il campo corrente quando viene
|
||||
// selezionato (deve essere popup)
|
||||
//
|
||||
// @devnote Funzione non implementata.
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
@ -2113,7 +2328,12 @@ TFieldtypes TRelation_description::field_type()
|
||||
return (TFieldtypes)_cfield.get_int(1);
|
||||
}
|
||||
|
||||
bool TRelation_description::set_field_description(const char* field, const char* des)
|
||||
// @mfunc Setta la descrizione del campo
|
||||
//
|
||||
// @rdesc Ritorna se ha trovato il campo da settare
|
||||
bool TRelation_description::set_field_description(
|
||||
const char* field, // @parm Campo a cui assegnare la descrizione
|
||||
const char* des) // @parm Descrizione da assgnare al campo
|
||||
{
|
||||
TString_array& fld = (TString_array&)_fields[_cur_file];
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Id: relation.h,v 1.31 1995-11-27 08:39:10 guy Exp $ */
|
||||
/* $Id: relation.h,v 1.32 1995-12-29 12:09:12 andrea Exp $ */
|
||||
// join.h
|
||||
// fv 12/8/93
|
||||
// join class for isam files
|
||||
@ -14,115 +14,199 @@
|
||||
class TSort;
|
||||
#endif
|
||||
|
||||
// @doc EXTERNAL
|
||||
|
||||
// @class TRelation | Classe per la definizione delle relazioni esistenti tra i file
|
||||
//
|
||||
// @base public | TObject
|
||||
class TRelation : public TObject
|
||||
// @author(:INTERNAL) Sandro
|
||||
{
|
||||
// @cfriend TRelationdef
|
||||
friend class TRelationdef;
|
||||
// @cfriend TRelation_description
|
||||
friend class TRelation_description;
|
||||
// @cfriend TCursor
|
||||
friend class TCursor;
|
||||
|
||||
TToken_string _status; // stato della relazione
|
||||
TArray _files; // file descriptors
|
||||
TArray _reldefs; // TRelationdef array
|
||||
// @access Provate Member
|
||||
|
||||
// @cmember Stato della relazione
|
||||
TToken_string _status;
|
||||
// @cmember Array dei descrittori dei file
|
||||
TArray _files;
|
||||
// @cmember Array di <c TRelationdef>
|
||||
TArray _reldefs;
|
||||
// @cmember Codice dell'ultimo errore occorso
|
||||
int _errors;
|
||||
|
||||
// @access Protected Member
|
||||
protected:
|
||||
// @cmember Ritorna l'indice di <p _files> del numero logico passato
|
||||
int log2ind(int logicnum) const;
|
||||
// @cmember Ritorna l'indice di <p _files> del alias del file passato
|
||||
int alias2ind(int alias) const;
|
||||
// @cmember Ritorna l'indice di <p _files> del nome del file passato
|
||||
int name2ind(const char* name) const;
|
||||
|
||||
TRelationdef& reldef(int i) const { return (TRelationdef&)_reldefs[i]; }
|
||||
TLocalisamfile& file(int i = 0) const { return (TLocalisamfile&)_files[i]; }
|
||||
// @cmember Ritorna la <c TRelationdef> <p i>-esima
|
||||
TRelationdef& reldef(int i) const
|
||||
{ return (TRelationdef&)_reldefs[i]; }
|
||||
// @cmember Ritorna il descrittore del file <p i>-esimo
|
||||
TLocalisamfile& file(int i = 0) const
|
||||
{ return (TLocalisamfile&)_files[i]; }
|
||||
|
||||
// position_rels fa tutto il lavoro: se non trova un record
|
||||
// adatto su un file, svuota il record corrente e non ritorna errore.
|
||||
// write etc. poi procedono normalmente
|
||||
// @cmember Permette di posizionare l'albero di relazioni tra i file
|
||||
int position_rels(TIsamop op = _isequal, TReclock lockop = _nolock, TDate& atdate = (TDate&)botime, int first = 0);
|
||||
|
||||
// @access Public Member
|
||||
public: // TObject
|
||||
virtual bool ok() const { return good(); }
|
||||
// @cmember Controlla se si tratta di un oggetto valido
|
||||
virtual bool ok() const
|
||||
{ return good(); }
|
||||
// @cmember Permette di stampare l'oggetto su <p out>
|
||||
virtual void print_on(ostream& out) const;
|
||||
|
||||
public:
|
||||
int update() { return position_rels(_isequal, _nolock);}
|
||||
// @cmember Aggiorna l'albero delle relazioni
|
||||
int update()
|
||||
{ return position_rels(_isequal, _nolock);}
|
||||
// @cmember Azzera l'abero delle relazioni
|
||||
void zero();
|
||||
virtual int next(TReclock lockop = _nolock) { return file().next(lockop) == NOERR ? position_rels(_isequal, lockop) : file().status(); }
|
||||
virtual int prev(TReclock lockop = _nolock) { return file().prev(lockop) == NOERR ? position_rels(_isequal, lockop) : file().status(); }
|
||||
virtual int next(TDate& atdate) { return file().next(atdate) == NOERR ? position_rels(_isequal, _nolock, atdate) : file().status(); }
|
||||
virtual int prev(TDate& atdate) { return file().prev(atdate) == NOERR ? position_rels(_isequal, _nolock, atdate) : file().status(); }
|
||||
virtual int first(TReclock lockop = _nolock) { return file().first(lockop) == NOERR ? position_rels(_isequal, lockop) : file().status(); }
|
||||
virtual int last(TReclock lockop = _nolock) { return file().last(lockop) == NOERR ? position_rels(_isequal, lockop) : file().status(); }
|
||||
virtual int skip(TRecnotype nrec, TReclock lockop = _nolock) { return file().skip(nrec, lockop) == NOERR ? position_rels(_isequal, lockop) : file().status(); }
|
||||
virtual int read(TIsamop op = _isgteq, TReclock lockop = _nolock, TDate& atdate = (TDate&)botime) { return file().read(op, lockop, atdate) == NOERR ? position_rels(_isequal, lockop, atdate) : file().status();}
|
||||
|
||||
//@cmember Sposta la relazione sul record successivo del file principale (chiama <mf TRelation::position_rels>)
|
||||
virtual int next(TReclock lockop = _nolock)
|
||||
{ return file().next(lockop) == NOERR ? position_rels(_isequal, lockop) : file().status(); }
|
||||
//@cmember Sposta la relazione sul record precedente del file principale (chiama <mf TRelation::position_rels>)
|
||||
virtual int prev(TReclock lockop = _nolock)
|
||||
{ return file().prev(lockop) == NOERR ? position_rels(_isequal, lockop) : file().status(); }
|
||||
//@cmember Sposta la relazione sul record successivo del file principale (chiama <mf TRelation::position_rels>)
|
||||
virtual int next(TDate& atdate)
|
||||
{ return file().next(atdate) == NOERR ? position_rels(_isequal, _nolock, atdate) : file().status(); }
|
||||
//@cmember Sposta la relazione sul record precedente del file principale (chiama <mf TRelation::position_rels>)
|
||||
virtual int prev(TDate& atdate)
|
||||
{ return file().prev(atdate) == NOERR ? position_rels(_isequal, _nolock, atdate) : file().status(); }
|
||||
//@cmember Sposta la relazione sul primo record del file principale (chiama <mf TRelation::position_rels>)
|
||||
virtual int first(TReclock lockop = _nolock)
|
||||
{ return file().first(lockop) == NOERR ? position_rels(_isequal, lockop) : file().status(); }
|
||||
//@cmember Sposta la relazione sull'ultimo record del file principale (chiama <mf TRelation::position_rels>)
|
||||
virtual int last(TReclock lockop = _nolock)
|
||||
{ return file().last(lockop) == NOERR ? position_rels(_isequal, lockop) : file().status(); }
|
||||
//@cmember Salta <p nrec> posizione dalla corrente sul file principale (chiama <mf TRelation::position_rels>)
|
||||
virtual int skip(TRecnotype nrec, TReclock lockop = _nolock)
|
||||
{ return file().skip(nrec, lockop) == NOERR ? position_rels(_isequal, lockop) : file().status(); }
|
||||
//@cmember Legge il record (chiama <mf TRelation::position_rels>)
|
||||
virtual int read(TIsamop op = _isgteq, TReclock lockop = _nolock, TDate& atdate = (TDate&)botime)
|
||||
{ return file().read(op, lockop, atdate) == NOERR ? position_rels(_isequal, lockop, atdate) : file().status();}
|
||||
|
||||
// @cmember Ritorna il descrittore del file
|
||||
TLocalisamfile& lfile(int logicnum = 0) const;
|
||||
// @cmember Ritorna il descrittore del file
|
||||
TLocalisamfile& lfile(const char* name) const;
|
||||
TLocalisamfile& operator[] (int logicnum) const { return lfile(logicnum); }
|
||||
// @cmember Ritorna il descrittore del file (chiama <mf TRelation::lfile>)
|
||||
TLocalisamfile& operator[] (int logicnum) const
|
||||
{ return lfile(logicnum); }
|
||||
|
||||
// @cmember Abilita/disabilita la scrittura dei record collegati sul file
|
||||
void write_enable(int logicnum = 0, const bool on = TRUE) ;
|
||||
// @cmember Abilita/disabilita la scrittura sul file
|
||||
void write_enable(const char* name, const bool on = TRUE) ;
|
||||
void write_disable(int logicnum = 0) { write_enable(logicnum, FALSE); }
|
||||
void write_disable(const char* name) { write_enable(name, FALSE); }
|
||||
// @cmember Disabilita la scrittura sul file (chiama <mf TRelation::write_enable>)
|
||||
void write_disable(int logicnum = 0)
|
||||
{ write_enable(logicnum, FALSE); }
|
||||
// @cmember Disabilita la scrittura sul file (chiama <mf TRelation::write_enable>)
|
||||
void write_disable(const char* name)
|
||||
{ write_enable(name, FALSE); }
|
||||
|
||||
TRectype& curr(int logicnum = 0) const { return lfile(logicnum).curr(); }
|
||||
// next_match for 0ne-to-many relations; positions logicnum (!= main)
|
||||
// on next matching record; returns TRUE or FALSE if no more matches; in
|
||||
// any case relation is kept consistent except when inconsistent in
|
||||
// first place
|
||||
// @cmember Ritorna il record corrente del file <p logicnum>
|
||||
// (chiama <mf TRelation::lfile>)
|
||||
TRectype& curr(int logicnum = 0) const
|
||||
{ return lfile(logicnum).curr(); }
|
||||
// @cmember Posiziona il numero logico sul record successivo
|
||||
bool next_match(int logicnum, const char* fieldlist = NULL, int nkey = 0);
|
||||
|
||||
bool add(TLocalisamfile* f, const char* relexprs, int key,
|
||||
int linkto, int alias, bool allow_lock);
|
||||
bool add(int logicnum, const char* relexprs, int key = 1,
|
||||
int linkto = 0, int alias = 0, bool allow_lock = FALSE);
|
||||
bool add(const char* tabname, const char* relexprs, int key = 1,
|
||||
int linkto = 0, int alias = 0, bool allow_lock = FALSE);
|
||||
// @cmember Aggiunge una nuovo file alla relazione partendo dal descrittore del file
|
||||
bool add(TLocalisamfile* f, const char* relexprs, int key, int linkto, int alias, bool allow_lock);
|
||||
// @cmember Aggiunge una nuovo file alla relazione partendo dal numero logico del file
|
||||
bool add(int logicnum, const char* relexprs, int key = 1, int linkto = 0, int alias = 0, bool allow_lock = FALSE);
|
||||
// @cmember Aggiunge una nuovo file alla relazione partendo dal nome della tabella
|
||||
bool add(const char* tabname, const char* relexprs, int key = 1, int linkto = 0, int alias = 0, bool allow_lock = FALSE);
|
||||
// @cmember Sostituisce nella relazione un file
|
||||
void replace(TLocalisamfile* f, int index = 0);
|
||||
|
||||
// write methods
|
||||
virtual int write (bool force = TRUE, TDate& atdate = (TDate&)botime);
|
||||
virtual int rewrite(bool force = TRUE, TDate& atdate = (TDate&)botime);
|
||||
// @cmember Aggiunge il record corrente
|
||||
virtual int write (bool force = TRUE, TDate& atdate = (TDate&)botime);
|
||||
// @cmember Riscrive il record corrente
|
||||
virtual int rewrite (bool force = TRUE, TDate& atdate = (TDate&)botime);
|
||||
// @cmember Elimina il record corrente
|
||||
virtual int remove (TDate& atdate = (TDate&)botime);
|
||||
|
||||
// status methods
|
||||
// return the status of the relation when called
|
||||
// with no args, or the status of the file when called with
|
||||
// a logical number
|
||||
// @cmember Controlla se e' stata raggiunta la fine del file
|
||||
// (se <p logicnum> = 0 dell'intera relazione, altrimenti del file indicato )
|
||||
bool eof( int logicnum = 0) const
|
||||
{ return lfile(logicnum).eof(); }
|
||||
// @cmember Controlla se e' stata raggiunta l'inizio del file
|
||||
// (se <p logicnum> = 0 dell'intera relazione, altrimenti del file indicato )
|
||||
bool bof( int logicnum = 0) const
|
||||
{ return lfile(logicnum).bof(); }
|
||||
// @cmember Ritorna lo stao del file indicato (se <p logicnum> = 0 dell'intera relazione,
|
||||
// altrimenti del file indicato )
|
||||
bool status(int logicnum = 0) const
|
||||
{ return lfile(logicnum).status(); }
|
||||
// @cmember Controlla se l'ultima operazione sul file e' stat effettuata correttamente
|
||||
// (se <p logicnum> = 0 dell'intera relazione, altrimenti del file indicato )
|
||||
bool good( int logicnum = 0) const
|
||||
{ return lfile(logicnum).good(); }
|
||||
// @cmember Controlla se l'ultima operazione sul file ha generato un errore
|
||||
// (se <p logicnum> = 0 dell'intera relazione, altrimenti del file indicato )
|
||||
bool bad( int logicnum = 0) const
|
||||
{ return lfile(logicnum).bad(); }
|
||||
// @cmember Controlla se e' il file e' vuoto
|
||||
// (se <p logicnum> = 0 dell'intera relazione, altrimenti del file indicato )
|
||||
bool empty( int logicnum = 0) const
|
||||
{ return lfile(logicnum).empty(); }
|
||||
|
||||
bool eof( int logicnum = 0) const { return lfile(logicnum).eof(); }
|
||||
bool bof( int logicnum = 0) const { return lfile(logicnum).bof(); }
|
||||
bool status(int logicnum = 0) const { return lfile(logicnum).status(); }
|
||||
bool good( int logicnum = 0) const { return lfile(logicnum).good(); }
|
||||
bool bad( int logicnum = 0) const { return lfile(logicnum).bad(); }
|
||||
bool empty( int logicnum = 0) const { return lfile(logicnum).empty(); }
|
||||
// @cmember Controlla se la relazione e' corretta
|
||||
bool isconsistent (bool reset = FALSE);
|
||||
|
||||
// isconsistent() returns TRUE if every file in the relation is
|
||||
// OK, current record is non-empty, and relation is consistent.
|
||||
// If it's not and reset is TRUE, it tries to reset the relation
|
||||
// to a consistent state (based on main record) -- no further check
|
||||
// is done.
|
||||
// Also called internally by update and remove.
|
||||
bool isconsistent(bool reset = FALSE);
|
||||
|
||||
// TRUE se c'e' un record ed e' il primo match (non si e' mai fatta
|
||||
// position_rels)
|
||||
// @cmember Controlla se c'e' un record ed e' il primo match (non si e' mai fatta
|
||||
// <mf TRelation::position_rels>)
|
||||
bool is_first_match(int logicnum);
|
||||
|
||||
// items() ritorna il numero di files collegati
|
||||
int items() { return _reldefs.items(); }
|
||||
// @cmember Ritorna il numero di files collegati
|
||||
int items()
|
||||
{ return _reldefs.items(); }
|
||||
|
||||
void save_status () ;
|
||||
void restore_status () ;
|
||||
// @cmember Salva la posizione attuale di tutti i file della relazione
|
||||
void save_status () ;
|
||||
// @cmember Ripristina la posizione attuale di tutti i file della relazione
|
||||
void restore_status () ;
|
||||
|
||||
// positioning operators. return status
|
||||
TRecnotype operator +=(const TRecnotype npos) { return skip(npos); }
|
||||
TRecnotype operator -=(const TRecnotype npos) { return skip(-npos); }
|
||||
TRecnotype operator ++() { return next(); }
|
||||
TRecnotype operator --() { return prev(); }
|
||||
// @cmember Sposta il puntatore corrente di <p npos> posizioni in avanti
|
||||
// (ritorna lo stato)
|
||||
TRecnotype operator +=(const TRecnotype npos)
|
||||
{ return skip(npos); }
|
||||
// @cmember Sposta il puntatore corrente di <p npos> posizioni in dietro
|
||||
// (ritorna lo stato)
|
||||
TRecnotype operator -=(const TRecnotype npos)
|
||||
{ return skip(-npos); }
|
||||
// @cmember Sposta il puntatore corrente di una posizione in avanti
|
||||
// (ritorna lo stato)
|
||||
TRecnotype operator ++()
|
||||
{ return next(); }
|
||||
// @cmember Sposta il puntatore corrente di una posizione in dietro
|
||||
// (ritorna lo stato)
|
||||
TRecnotype operator --()
|
||||
{ return prev(); }
|
||||
|
||||
// @cmember Costruttore dal numero logico del file
|
||||
TRelation(int logicnum);
|
||||
// @cmember Costruttore dal nome della tabella
|
||||
TRelation(const char* tabname);
|
||||
// @cmember Costruttore dal nome del file
|
||||
TRelation(TLocalisamfile* f);
|
||||
|
||||
// @cmember Distruttore
|
||||
virtual ~TRelation();
|
||||
};
|
||||
|
||||
@ -131,284 +215,528 @@ public:
|
||||
// TRecord_Array
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
// @class TRecord_array | Classe per la gestione di un array di record
|
||||
//
|
||||
// @base public | TArray
|
||||
class TRecord_array : private TArray
|
||||
{
|
||||
int _file; // Numero logico del file principale
|
||||
int _offset; // Offset iniziale del record array
|
||||
TString16 _num; // Nome del campo col numero di riga
|
||||
|
||||
// @author(:ITERNAL) Guido
|
||||
|
||||
// @access Private Member
|
||||
{
|
||||
// @cmember Numero logico del file principale
|
||||
int _file;
|
||||
// @cmember Offset iniziale del record array
|
||||
int _offset;
|
||||
// @cmember Nome del campo col numero di riga
|
||||
TString16 _num;
|
||||
|
||||
// @access Protected Member
|
||||
protected:
|
||||
int rec2row(const TRectype& r) const; // Estrae il numero riga di un record
|
||||
const TString& num_field() const { return _num; }
|
||||
// @cmember Ritorna il numero riga del record <p r>
|
||||
int rec2row(const TRectype& r) const;
|
||||
// @cmember Ritorna il nome del campo con numero di riga
|
||||
const TString& num_field() const
|
||||
{ return _num; }
|
||||
// @cmember Elimina il record di posizione <p i> (ritorna il risultato dell'operazione)
|
||||
int remove_from(int i) const;
|
||||
// @cmember Confronta i campi della chiave 1 scartando l'ultimo
|
||||
bool good(const TRectype& rec) const;
|
||||
|
||||
public:
|
||||
// @access Public Member
|
||||
public:
|
||||
// @cmember Ritorna il record che fa da chiave per tutti gli altri
|
||||
const TRectype& key() const;
|
||||
int rows() const { return items()-1; } // Numero di righe presenti
|
||||
// @cmember Ritorna il numero di righe presenti
|
||||
int rows() const
|
||||
{ return items()-1; }
|
||||
|
||||
int succ_row(int r) const { return succ(r - _offset) + _offset; }
|
||||
int pred_row(int r) const { return pred(r - _offset) + _offset; };
|
||||
int last_row() const { return last() + _offset; } // Ultima riga
|
||||
int first_row() const { return succ_row(0); } // Prima riga
|
||||
// @cmember Ritorna la riga successiva non vuota a prtire da <p r>
|
||||
int succ_row(int r) const
|
||||
{ return succ(r - _offset) + _offset; }
|
||||
// @cmember Ritorna la riga precedente non vuota a prtire da <p r>
|
||||
int pred_row(int r) const
|
||||
{ return pred(r - _offset) + _offset; };
|
||||
// @cmember Ritorna l'ultma riga non vuota
|
||||
int last_row() const
|
||||
{ return last() + _offset; }
|
||||
// @cmember Ritorna la prima riga non vuota
|
||||
int first_row() const
|
||||
{ return succ_row(0); }
|
||||
|
||||
const TRectype& row(int r) const // Riga r costante
|
||||
// @cmember Ritorna il record <p r>-esimo
|
||||
const TRectype& row(int r) const
|
||||
{ CHECKD(r > _offset, "Bad record number ", r); return (const TRectype&)operator[](r - _offset); }
|
||||
|
||||
bool exist(int r) const; // Controlla se esiste la riga r
|
||||
TRectype& row(int r, bool create); // Riga r con possibilita' di crearla
|
||||
|
||||
virtual int add_row(TRectype* r); // Aggiungi/cambia una riga
|
||||
int add_row(const TRectype& r) { return add_row((TRectype*)r.dup()); }
|
||||
virtual bool destroy_row(int n, bool pack = FALSE); // Cancella una riga
|
||||
virtual bool destroy_row(const TRectype& r, bool pack = FALSE) { return destroy_row(rec2row(r), pack); }
|
||||
void destroy_rows(); // Cancella tutte le righe
|
||||
|
||||
int logic_num() const { return _file; }
|
||||
void set_key(TRectype* r); // Cambia l'intera chiave (solo se vuoto!)
|
||||
bool renum_key(const char* field, const TString& num);
|
||||
bool renum_key(const char* field, long num); // Rinumera campo chiave in seguito a reinsert
|
||||
// @cmember Controlla se esiste la riga <p r> (TRUE se esiste)
|
||||
bool exist(int r) const;
|
||||
// @cmember Ritorna la riga <p r>
|
||||
TRectype& row(int r, bool create);
|
||||
|
||||
virtual int read(const TRectype& r); // Leggi tutto l'array da file
|
||||
virtual int read(TRectype* r); // Leggi tutto l'array da file
|
||||
virtual int write(bool re = FALSE) const; // Aggiorna il file
|
||||
virtual int rewrite() const { return write(TRUE); }
|
||||
virtual int remove() const; // Cancella tutti i record dal file
|
||||
// @cmember Aggiunge/sostituisce una riga
|
||||
virtual int add_row(TRectype* r);
|
||||
// @cmember Aggiunge un nuovo record all'array
|
||||
int add_row(const TRectype& r)
|
||||
{ return add_row((TRectype*)r.dup()); }
|
||||
// @cmember Cancella una riga identificata da <p n>
|
||||
virtual bool destroy_row(int n, bool pack = FALSE);
|
||||
// @cmember Cancella una riga identificata da <p r>
|
||||
virtual bool destroy_row(const TRectype& r, bool pack = FALSE)
|
||||
{ return destroy_row(rec2row(r), pack); }
|
||||
// @cmember Cancella tutte le righe
|
||||
void destroy_rows();
|
||||
|
||||
// @cmember Ritorna il numero logico del file principale
|
||||
int logic_num() const
|
||||
{ return _file; }
|
||||
// @cmember Cambia l'intera chiave (solo se vuoto)
|
||||
void set_key(TRectype* r);
|
||||
// @cmember Rinumera il campo chiave in seguito a reinsert
|
||||
bool renum_key(const char* field, const TString& num);
|
||||
// @cmember Rinumera il campo chiave in seguito a reinsert
|
||||
bool renum_key(const char* field, long num);
|
||||
|
||||
// @cmember Legge tutto l'array dal file
|
||||
virtual int read(const TRectype& r);
|
||||
// @cmember Legge tutto l'array dal file
|
||||
virtual int read(TRectype* r);
|
||||
// @cmember Aggiorna il file (se <p re> == TRUE allora viene aggiornato il record se esisteva)
|
||||
virtual int write(bool re = FALSE) const;
|
||||
// @cmember Aggiorna il record sul file
|
||||
virtual int rewrite() const
|
||||
{ return write(TRUE); }
|
||||
// @cmember Cancella tutti i record dal file
|
||||
virtual int remove() const;
|
||||
|
||||
// @cmember Costruttore
|
||||
TRecord_array(const TRectype& r, const char* numfield, int first = 1);
|
||||
// @cmember Costruttore
|
||||
TRecord_array(int logicnum, const char* numfield, int first = 1);
|
||||
// @cmember Costruttore
|
||||
TRecord_array(const TRecord_array& a);
|
||||
};
|
||||
|
||||
|
||||
// Classe TCursor : public TObject
|
||||
|
||||
class TExpression;
|
||||
|
||||
// @type FILTERFUNCTION | Controlla se il record debba essere incluso nel cursore
|
||||
typedef bool (*FILTERFUNCTION)(const TRelation* r);
|
||||
|
||||
// @class TCursor | Classe per la definizione di un cursore su di una relazione
|
||||
//
|
||||
// @base public | TContainer
|
||||
class TCursor : public TContainer
|
||||
{
|
||||
TRelation* _if;
|
||||
int _nkey;
|
||||
TRecnotype _pos; // Posizione corrente
|
||||
TRecnotype _totrec;
|
||||
TRecnotype _lastrec;
|
||||
TRecnotype _lastkrec;
|
||||
TFilename _filename;
|
||||
TString _filter; // Filtro
|
||||
TString _keyfrom; // chiave iniziale
|
||||
TString _keyto; // chiave finale
|
||||
TExpression* _fexpr; // Espressione relativo filtro
|
||||
bool _frozen;
|
||||
bool _filter_update; // Flag che permette l'update della relazione per l'espressione-filtro
|
||||
bool _filterfunction_update;// Flag che permette l'update della relazione per la funzione-filtro
|
||||
FILTERFUNCTION _filterfunction;
|
||||
TFilename _indexname;
|
||||
|
||||
// @author(:INTERNAL) Villa
|
||||
|
||||
// @access Private Member
|
||||
{
|
||||
// @cmember Relazione su cui costruire il cursore
|
||||
TRelation* _if;
|
||||
// @cmember Chiave del file principale
|
||||
int _nkey;
|
||||
// @cmember Posizione corrente
|
||||
TRecnotype _pos;
|
||||
// @cmember Numero totale di record che verificano il filtro
|
||||
TRecnotype _totrec;
|
||||
// @cmember Numero dell'ultimo record
|
||||
TRecnotype _lastrec;
|
||||
// @cmember Chiave dell'ultimo record
|
||||
TRecnotype _lastkrec;
|
||||
// @cmember Nome assoluto del file principale
|
||||
TFilename _filename;
|
||||
// @cmember Filtro definito con la <mf TCursor::set_filter>
|
||||
TString _filter;
|
||||
// @cmember Nome della chive iniziale
|
||||
TString _keyfrom;
|
||||
// @cmember Nome della chiave finale
|
||||
TString _keyto;
|
||||
// @cmember Espressione del filtro relativo
|
||||
TExpression* _fexpr;
|
||||
// @cmember Indica se e' stata messa in attesa (non puo' essere modificato)
|
||||
bool _frozen;
|
||||
// @cmember Flag che permette l'update della relazione per l'espressione-filtro
|
||||
bool _filter_update;
|
||||
// @cmember Flag che permette l'update della relazione per la funzione-filtro
|
||||
bool _filterfunction_update;
|
||||
// @cmember Funzione filtro
|
||||
FILTERFUNCTION _filterfunction;
|
||||
// @cmember Nome del file indice
|
||||
TFilename _indexname;
|
||||
|
||||
// @cmember Crea (o aggiorna) effettivamente l'indice del cursore
|
||||
TRecnotype update();
|
||||
|
||||
|
||||
// @access Protected Member
|
||||
protected:
|
||||
// @cmember Apre il file di indice
|
||||
FILE* open_index(bool create = FALSE);
|
||||
// @cmember Ritorna se e' stato modificato il cursore (cioe' quando occorre fare l'update)
|
||||
virtual bool changed();
|
||||
// @cmember Costruisce il cursore a partire dal record
|
||||
virtual TRecnotype buildcursor(TRecnotype rp);
|
||||
// @cmember Permette di creare una pagina di cursori
|
||||
virtual int filtercursor(int pagecnt, TRecnotype* page);
|
||||
// @cmember Posiziona il cursore in modo che il record corrente corriponda alla
|
||||
// posizione dell'indice temporaneo
|
||||
TRecnotype readrec();
|
||||
void filter(const char* filter, const TRectype* from = NULL,
|
||||
const TRectype* to = NULL);
|
||||
bool update_relation() {return (_filter_update || _filterfunction_update);}
|
||||
// @cmember Setta il filtro sul cursore
|
||||
void filter(const char* filter, const TRectype* from = NULL, const TRectype* to = NULL);
|
||||
// @cmember Indica se e' possibile fare l'update sulla relazione (se e' possibile
|
||||
// sia sull'espressione-filtro che sulla funzione-filtro)
|
||||
bool update_relation()
|
||||
{return (_filter_update || _filterfunction_update);}
|
||||
|
||||
// @access Public Member
|
||||
public:
|
||||
// @FPUB
|
||||
TRecnotype operator =(const TRecnotype nr); // Va alla posizione nr
|
||||
// @cmember Si sposta alla posizione <p nr>
|
||||
TRecnotype operator =(const TRecnotype nr);
|
||||
// @cmember Si sposta di <p nr> posizioni dalla corrente in avanti
|
||||
TRecnotype operator +=(const TRecnotype nr);
|
||||
TRecnotype operator -=(const TRecnotype npos) { return operator +=(-npos); }
|
||||
TObject* first_item( ){ operator =( 0 ); return &curr( ); }
|
||||
TObject* succ_item( ){ operator +=( 1 ); return &curr( ); }
|
||||
TObject* pred_item( ){ operator -=( 1 ); return &curr( );}
|
||||
TObject* last_item( ){ operator =( items( ) -1 ); return &curr( ); }
|
||||
long objects( ) { return items( ); }
|
||||
// @cmember Si sposta di <p nr> posizioni dalla corrente in dietro
|
||||
TRecnotype operator -=(const TRecnotype npos)
|
||||
{ return operator +=(-npos); }
|
||||
// @cmember Ritorna il primo oggetto del cursor
|
||||
TObject* first_item( )
|
||||
{ operator =( 0 ); return &curr( ); }
|
||||
// @cmember Ritorna l'oggetto del cursor successivo al corrente
|
||||
TObject* succ_item( )
|
||||
{ operator +=( 1 ); return &curr( ); }
|
||||
// @cmember Ritorna l'oggetto del cursor precedente al corrente
|
||||
TObject* pred_item( )
|
||||
{ operator -=( 1 ); return &curr( );}
|
||||
// @cmember Ritorna l'ultimo oggetto del cursor
|
||||
TObject* last_item( )
|
||||
{ operator =( items( ) -1 ); return &curr( ); }
|
||||
// @cmember Ritorna il n8umero di oggetti del cursor
|
||||
long objects( )
|
||||
{ return items( ); }
|
||||
|
||||
TRecnotype& pos() { return _pos; }
|
||||
// @cmember Ritorna la posizione corrente
|
||||
TRecnotype& pos()
|
||||
{ return _pos; }
|
||||
// @cmember Ritorna il numero totale di record
|
||||
TRecnotype items();
|
||||
TRecnotype size() const { return file().eod(); }
|
||||
// @cmember Ritorna la dimensione del file principale
|
||||
TRecnotype size() const
|
||||
{ return file().eod(); }
|
||||
|
||||
const TString& from() const { return _keyfrom; }
|
||||
const TString& to() const { return _keyto; }
|
||||
// @cmember Ritorna il nome della chiave iniziale
|
||||
const TString& from() const
|
||||
{ return _keyfrom; }
|
||||
// @cmember Ritorna il nome della chiave finale
|
||||
const TString& to() const
|
||||
{ return _keyto; }
|
||||
|
||||
TRectype& curr(int log = 0) const { return _if->curr(log); }
|
||||
TRectype& curr(const char * tab) const { return _if->lfile(tab).curr(); }
|
||||
// @cmember Ritorna il descrittore del file principale
|
||||
TRectype& curr(int log = 0) const
|
||||
{ return _if->curr(log); }
|
||||
// @cmember Ritorna il descrittore della tabella
|
||||
TRectype& curr(const char * tab) const
|
||||
{ return _if->lfile(tab).curr(); }
|
||||
// @cmember Legge il record
|
||||
TRecnotype read(TIsamop op = _isgteq, TReclock lockop = _nolock, TDate& atdate = (TDate&)botime);
|
||||
// @cmember Mette un lock sul record
|
||||
int lock(TReclock = _lock);
|
||||
int unlock() { return lock(_unlock); }
|
||||
// @cmember Toglie un lock sul record (chiama <mf TCursor::lock>)
|
||||
int unlock()
|
||||
{ return lock(_unlock); }
|
||||
|
||||
// @cmember Controlla che si tratti di un oggetto valido
|
||||
virtual bool ok() const;
|
||||
|
||||
const char* filter() const { return _filter; }
|
||||
void freeze(bool on = TRUE) { _frozen = on; }
|
||||
bool frozen() const { return _frozen; }
|
||||
void setfilter(const char* filter_expr, bool update=FALSE) { filter(filter_expr); _filter_update = update; }
|
||||
// @cmember Ritorna il filtro
|
||||
const char* filter() const
|
||||
{ return _filter; }
|
||||
// @cmember Permette di mettere in attesa il cursore
|
||||
void freeze(bool on = TRUE)
|
||||
{ _frozen = on; }
|
||||
// @cmember Controlla se il cursore e' congelato
|
||||
bool frozen() const
|
||||
{ return _frozen; }
|
||||
// @cmember Permette di modificare l'espressione-filtro
|
||||
void setfilter(const char* filter_expr, bool update=FALSE)
|
||||
{ filter(filter_expr); _filter_update = update; }
|
||||
// @cmember Setta la regione-filtro dal record <p from> al record <p to>
|
||||
void setregion(const TRectype& from, const TRectype& to)
|
||||
{ filter(NULL,&from, &to); }
|
||||
|
||||
TRelation* relation() const { return _if; }
|
||||
TLocalisamfile& file(int lnum = 0) const { return _if->lfile(lnum); }
|
||||
TLocalisamfile& file(const char* name) const { return _if->lfile(name); }
|
||||
int repos() { return _if->position_rels(); }
|
||||
// @cmember Ritorna la relazione del cursore
|
||||
TRelation* relation() const
|
||||
{ return _if; }
|
||||
// @cmember Ritorna il file della relazione con numero logico <p lnum>
|
||||
TLocalisamfile& file(int lnum = 0) const
|
||||
{ return _if->lfile(lnum); }
|
||||
// @cmember Ritorna il file della relazione con nome <p name>
|
||||
TLocalisamfile& file(const char* name) const
|
||||
{ return _if->lfile(name); }
|
||||
// @cmember Riposiziona l'albero delle relazione (chiama <mf TRelation::position_rels>)
|
||||
int repos()
|
||||
{ return _if->position_rels(); }
|
||||
|
||||
TExpression* expression() const { return _fexpr; }
|
||||
FILTERFUNCTION filterfunction() const { return _filterfunction; }
|
||||
// @cmember Ritorna l'espressione-filtro
|
||||
TExpression* expression() const
|
||||
{ return _fexpr; }
|
||||
// @cmember Ritorna la funzione-filtro
|
||||
FILTERFUNCTION filterfunction() const
|
||||
{ return _filterfunction; }
|
||||
|
||||
void setkey() { file().setkey(_nkey); }
|
||||
// @cmember Setta la chiave del file principale alla chiave del cursore
|
||||
void setkey()
|
||||
{ file().setkey(_nkey); }
|
||||
// @cmember Setta la chiave del file principale alla chiave del cursore
|
||||
void setkey(int nkey);
|
||||
int key() const { return _nkey; }
|
||||
// @cmember Ritorna la chiave del cursor
|
||||
int key() const
|
||||
{ return _nkey; }
|
||||
|
||||
// @cmember Posizione il numero logico sul record successivo (chiama <mf TRelation::next_match>)
|
||||
bool next_match(int lognum, const char* fl = NULL, int nk = 0);
|
||||
// @cmember Controlla se c'e' un record ed e' il primo match (chiama <mf TRelation::is_first_match>)
|
||||
bool is_first_match(int ln);
|
||||
|
||||
void set_filterfunction(FILTERFUNCTION ff, bool update=FALSE) { _filterfunction = ff; _lastrec = 0L; _filterfunction_update = update;}
|
||||
bool has_filter() const { return _filter.not_empty() || _filterfunction; }
|
||||
// @cmember Setta la fuzione-filtro
|
||||
void set_filterfunction(FILTERFUNCTION ff, bool update=FALSE)
|
||||
{ _filterfunction = ff; _lastrec = 0L; _filterfunction_update = update;}
|
||||
// @cmember Controllla se esiste un fuiltro sul cursor
|
||||
bool has_filter() const
|
||||
{ return _filter.not_empty() || _filterfunction; }
|
||||
|
||||
void save_status () { _if->save_status(); }
|
||||
void restore_status () { _if->restore_status(); }
|
||||
// @cmember Salva la posizione attuale di tutti i file del cursore
|
||||
void save_status ()
|
||||
{ _if->save_status(); }
|
||||
// @cmember Ripristina la posizione attuale di tutti i file del cursore
|
||||
void restore_status ()
|
||||
{ _if->restore_status(); }
|
||||
|
||||
// @cmember Costruttore
|
||||
TCursor(TRelation* f, const char* filter = "", int key = 1, const TRectype* from = NULL, const TRectype* to = NULL);
|
||||
// @cmember Distruttore
|
||||
virtual ~TCursor();
|
||||
};
|
||||
|
||||
|
||||
|
||||
// Classe TSorted_cursor. Costruisce e gestisce un cursore ordinato per chiavi diverse da quelle specificate nel file.
|
||||
// Il formato dell'espressione deve essere: [LF->]FIELDNAME[[from,to]][+|-]... Inoltre tutta l'espressione puo' essere racchiusa
|
||||
// dall'operatore UPPER(), per controlli non case-sensitive.
|
||||
// FIELDNAME e' il nome del campo per quale si vuole effettuare il sort, LF indica il numero logico del file(appartenente alla relazione!).
|
||||
// from e to sono parametri opzionali usati per specificare un sottocampo. Per default prende l'intera lunghezza.
|
||||
// + e - sono parametri opzionali usati per specificare il tipo di ordinamento: + significa crescente, - significa
|
||||
// decrescente. Per default l'ordinamento e' +(crescente). E' cosi' possibile creare chiavi con campi non appartententi al
|
||||
// file principale della relazione.
|
||||
// Es. "CODCF-|TIPOCF|SOTTOCONTO+|UPPER(20->RAGSOC[1,40]-)"
|
||||
|
||||
// @class TSorted_cursor | Costruisce e gestisce un cursore ordinato per chiavi diverse da quelle specificate nel file.
|
||||
class TSorted_cursor : public TCursor
|
||||
{
|
||||
TToken_string _order_expr;
|
||||
TSort *_sort;
|
||||
bool _is_changed_expr;
|
||||
bool _is_valid_expr;
|
||||
|
||||
// @author(:INTERNAL) Angelo
|
||||
|
||||
// @comm Il formato dell'espressione deve essere: [LF->]FIELDNAME[[from,to]][+<pipe>-]... Inoltre tutta l'espressione puo' essere racchiusa
|
||||
// dall'operatore UPPER(), per controlli non case-sensitive.
|
||||
// <nl><p FIELDNAME> e' il nome del campo per quale si vuole effettuare il sort, LF indica il numero logico del file (appartenente alla relazione!).
|
||||
// <nl><p from> e <p to> sono parametri opzionali usati per specificare un sottocampo. Per default prende l'intera lunghezza.
|
||||
// <nl><p +> e <p -> sono parametri opzionali usati per specificare il tipo di ordinamento: <p +> significa crescente, <p -> significa
|
||||
// decrescente. Per default l'ordinamento e' crescente. E' cosi' possibile creare chiavi con campi non appartententi al
|
||||
// file principale della relazione.
|
||||
// <nl>Es. "CODCF-<pipe>TIPOCF<pipe>SOTTOCONTO+<pipe>UPPER(20->RAGSOC[1,40]-)"
|
||||
|
||||
// @access Private Member
|
||||
{
|
||||
// @cmember Espressione per l'ordinamento
|
||||
TToken_string _order_expr;
|
||||
// @cmember Puntatore all'oggetto per ordinare il cursore (vedi <c TSort>)
|
||||
TSort* _sort;
|
||||
// @cmember Indica se l'espressione e' cambiata
|
||||
bool _is_changed_expr;
|
||||
// @cmember Indica se l'espressione e' valida
|
||||
bool _is_valid_expr;
|
||||
|
||||
// @access Protected Member
|
||||
protected:
|
||||
bool check_expr(TString& s); // Controlla il formato della singola espressione di un campo di sort
|
||||
bool is_upper(TString& s); // Controlla se la singola espressione contiene l'operatore UPPER(), ritornandone l'argomento
|
||||
virtual TRecnotype buildcursor(TRecnotype rp); // Vedi i TCursor
|
||||
virtual int filtercursor(int pagecnt, TRecnotype* page); // Vedi i TCursor
|
||||
virtual bool changed(); // Vedi i TCursor
|
||||
// @cmember Controlla il formato della singola espressione di un campo di sort
|
||||
bool check_expr(TString& s);
|
||||
// @cmember Controlla se la singola espressione contiene l'operatore UPPER(), ritornandone l'argomento
|
||||
bool is_upper(TString& s);
|
||||
// @cmember Costruisce il cursore a partire dal record (vedi <c TCursor>)
|
||||
virtual TRecnotype buildcursor(TRecnotype rp);
|
||||
// @cmember Permette di creare una pagina di cursori (vedi <c TCursor>)
|
||||
virtual int filtercursor(int pagecnt, TRecnotype* page);
|
||||
// @cmember Ritorna se e' stato modificato il cursore (cioe' quando occorre fare l'update) (vedi <c TCursor>)
|
||||
virtual bool changed();
|
||||
|
||||
// @access Public Member
|
||||
public:
|
||||
TRecnotype operator =(const TRecnotype nr) {return TCursor::operator =(nr); }
|
||||
void change_order(const char * order_expr); // Permette di cambiare l'ordinamento del cursore.
|
||||
// @cmember Si sposta alla posizione <p nr>
|
||||
TRecnotype operator =(const TRecnotype nr)
|
||||
{return TCursor::operator =(nr); }
|
||||
// @cmember Permette di cambiare l'ordinamento del cursore.
|
||||
void change_order(const char* order_expr);
|
||||
// @cmember Costruttore
|
||||
TSorted_cursor(TRelation *f,const char * order_expr, const char * filter = "", int key = 1, const TRectype* from = NULL, const TRectype* to = NULL);
|
||||
// @cmember Distruttore
|
||||
virtual ~TSorted_cursor();
|
||||
};
|
||||
|
||||
|
||||
// Classe TFieldref : public TObject
|
||||
|
||||
// @class TFieldref | Classe per la definizione di riferimenti ad un campo di una relazione
|
||||
//
|
||||
// @base public | TObject
|
||||
class TFieldref : public TObject
|
||||
{
|
||||
short _fileid; // Numero del file
|
||||
TString _id; // Nome tabella o stringa col numero del file
|
||||
TString _name; // Nome del campo
|
||||
int _from, _to; // Substring
|
||||
|
||||
// @author(:INTERNAL) Guido
|
||||
|
||||
// @access Private Member
|
||||
{
|
||||
// @cmember Numero del file
|
||||
short _fileid;
|
||||
// @cmember Nome tabella o stringa col numero del file
|
||||
TString _id;
|
||||
// @cmember Nome del campo
|
||||
TString _name;
|
||||
// @cmember Sottostringa di partenza
|
||||
int _from;
|
||||
// @cmember Sottostringa di arrivo
|
||||
int _to;
|
||||
|
||||
// @access Protected Member
|
||||
protected:
|
||||
// @cmember Stampa l'oggetto
|
||||
virtual void print_on(ostream& out) const;
|
||||
|
||||
// @access Public Memeber
|
||||
public:
|
||||
// @cmember Costruttore
|
||||
TFieldref();
|
||||
// @cmember Costruttore
|
||||
TFieldref(const TString&, short defid);
|
||||
|
||||
TFieldref& operator =(const TString& s); // Operatore di assegnazione
|
||||
// @cmember Operatore di assegnamento
|
||||
TFieldref& operator =(const TString& s);
|
||||
|
||||
// @cmember Controlla la validita' dell'oggetto (TRUE se il numero del file e' valido)
|
||||
virtual bool ok() const
|
||||
{ return _name.not_empty(); }
|
||||
|
||||
virtual bool ok() const { return _name.not_empty(); } // Vero se il numero del file e' valido
|
||||
|
||||
int file() const { return _fileid; } // ritorna il file
|
||||
// @cmember Ritorna il numero del file
|
||||
int file() const
|
||||
{ return _fileid; }
|
||||
// @cmember Setta il numerodel file
|
||||
void set_file(int f);
|
||||
|
||||
const TString& name() const { return _name; } // ritorna il nome del campo
|
||||
void set_name(const char* n) { _name = n; }
|
||||
void set_from(int f) { if (f > 0) f--; else f = 0; _from = f; }
|
||||
void set_to(int t) { _to = t; }
|
||||
// @cmember Ritorna il nome del campo
|
||||
const TString& name() const
|
||||
{ return _name; }
|
||||
// @cmember Setta il nome del campo
|
||||
void set_name(const char* n)
|
||||
{ _name = n; }
|
||||
// @cmember Setta <p from>
|
||||
void set_from(int f)
|
||||
{ if (f > 0) f--; else f = 0; _from = f; }
|
||||
// @cmember Setta <p to>
|
||||
void set_to(int t)
|
||||
{ _to = t; }
|
||||
|
||||
int from() const { return _from; }
|
||||
int to() const { return _to; }
|
||||
// @cmember Ritorna <p from>
|
||||
int from() const
|
||||
{ return _from; }
|
||||
// @cmember Ritorna <p to>
|
||||
int to() const
|
||||
{ return _to; }
|
||||
// @cmember Ritorna la lunghezza del campo di <p TRectype>
|
||||
int len(TRectype &rec) const;
|
||||
// @cmember Cerca nella relazione il campo e ne ritorna il contenuto
|
||||
const char* read(const TRelation*) const;
|
||||
// @cmember Cerca nel record il campo e ne ritorna il contenuto
|
||||
const char* read(const TRectype&) const;
|
||||
// @cmember Cerca nella relazione il campo e vi scrive <p val>
|
||||
void write(const char* val, TRelation*) const;
|
||||
// @cmember Cerca nel record il campo e vi scrive <p val>
|
||||
void write(const char* val, TRectype& rec) const;
|
||||
};
|
||||
|
||||
// Converte una stringa in numero logico o numero tabella
|
||||
int name2log(const char* name);
|
||||
|
||||
// @class TRelation_description | Gestisce l'uso interattivo di una relazione (scelta campi, descrizione)
|
||||
//
|
||||
// @base public | TObject
|
||||
class TRelation_description : public TObject
|
||||
|
||||
// @author(:INTERNAL) Guido
|
||||
|
||||
// @access Private Member
|
||||
{
|
||||
// gestisce l'uso interattivo di una relazione (scelta campi, descrizione)
|
||||
// domani o doman l'altro gestira' l'editing interattivo e grafico
|
||||
// @cmember Relazione descritta
|
||||
TRelation* _rel;
|
||||
// @cmember Nome dei files della relazione
|
||||
TString_array _files;
|
||||
// @cmember Array di campi
|
||||
TArray _fields;
|
||||
// @cmember Numero logico del file corrente
|
||||
int _cur_file;
|
||||
// @cmember Numero del campo corrente
|
||||
int _cur_field;
|
||||
// @cmember UNUSED
|
||||
bool _menu;
|
||||
// @cmember File corrente
|
||||
TToken_string _cfile;
|
||||
// @cmember Campo corrente
|
||||
TToken_string _cfield;
|
||||
|
||||
TRelation* _rel; // relation described
|
||||
TString_array _files;
|
||||
TArray _fields;
|
||||
int _cur_file;
|
||||
int _cur_field;
|
||||
bool _menu;
|
||||
TToken_string _cfile, _cfield;
|
||||
|
||||
protected:
|
||||
// @access Protected Member
|
||||
protected:
|
||||
// @cmember Inizializza l'array di stringhe con i nomi dei files
|
||||
void init_files_array();
|
||||
// @cmember Legge la relazione
|
||||
void read_rel();
|
||||
|
||||
public: // TObject
|
||||
virtual bool ok() const { return _files.items() > 0; }
|
||||
// @access Public Member
|
||||
public:
|
||||
// @cmember Controlla se si tratta di un oggetto valido (se il numero dei files e' <gt> di 0)
|
||||
virtual bool ok() const
|
||||
{ return _files.items() > 0; }
|
||||
|
||||
public:
|
||||
|
||||
// "choose" interface: after choosing a field (must return TRUE)
|
||||
// methods allow to know all data concerning the field
|
||||
// parameters set the one initially selected
|
||||
bool choose_file (int id = 0);
|
||||
// @cmember Seleziona il file <p id>
|
||||
bool choose_file (int id = 0);
|
||||
// @cmember Setta come file corrente quello con numero logico <p id>
|
||||
bool set_cur_file(int id = 0);
|
||||
|
||||
// file must have been chosen: first file in list if called
|
||||
// before choose_file
|
||||
// @cmember Seleziona il campo <p fld> del file selezionato
|
||||
bool choose_field(const char* fld = "");
|
||||
|
||||
// if wanted, build a menu tree and set current field upon
|
||||
// selecting it (should be popup)
|
||||
// @cmember Costruisce un menu'
|
||||
bool build_menu(const char* title = "Database");
|
||||
// @cmember Rimuove il menu' costruito con <mf TRelation_description::build_menu>
|
||||
bool remove_menu();
|
||||
|
||||
// if choose_file == TRUE or menu has been used these return valid data
|
||||
int file_num();
|
||||
// @cmember Ritorna il numero logico del file selezionato (vedi <mf TRelation_description::choose_file>)
|
||||
int file_num();
|
||||
// @cmember Ritorna la descrizione del file selezionato (vedi <mf TRelation_description::choose_file>)
|
||||
const char* file_desc();
|
||||
void file_desc(const char* desc);
|
||||
bool set_field_description(const char* field, const char* des);
|
||||
// @cmember Setta la descrizione del file selezionato
|
||||
void file_desc(const char* desc);
|
||||
// @cmember Setta la descrizione del campo
|
||||
bool set_field_description(const char* field, const char* des);
|
||||
// @cmember Ritorna la descrizione del campo
|
||||
const char* get_field_description(const char* field);
|
||||
|
||||
// if choose_field == TRUE or menu has been used these return valid data
|
||||
// @cmember Ritorna la descrizione del campo selezionato (vedi <mf TRelation_description::choose_file>)
|
||||
const char* field_desc();
|
||||
void field_desc(const char* desc);
|
||||
// @cmember Setta la descrizione del campo selezionato
|
||||
void field_desc(const char* desc);
|
||||
// @cmember Riorna il nome del campo selezionato (vedi <mf TRelation_description::choose_field>)
|
||||
const char* field_name();
|
||||
int field_len();
|
||||
// @cmember Riorna la lunghezza del campo selezionato (vedi <mf TRelation_description::choose_field>)
|
||||
int field_len();
|
||||
// @cmember Riorna il tipo del campo selezionato (vedi <mf TRelation_description::choose_field>)
|
||||
TFieldtypes field_type();
|
||||
|
||||
const TString_array& get_all_desc() const { return _files; }
|
||||
// @cmember Ritorna l'array di tutti nomi dei files
|
||||
const TString_array& get_all_desc() const
|
||||
{ return _files; }
|
||||
// @cmember Cambia la relazione descritta
|
||||
void change_relation(TRelation& rel, TString_array& arr);
|
||||
|
||||
// @cmember Stampa l'oggetto
|
||||
virtual void print_on(ostream& out) const;
|
||||
|
||||
// @cmember Costruttore
|
||||
TRelation_description(TRelation& r);
|
||||
// @cmember Distruttore
|
||||
virtual ~TRelation_description();
|
||||
|
||||
// @devnote Domani o doman l'altro gestira' l'editing interattivo e grafico
|
||||
};
|
||||
|
||||
|
||||
|
@ -25,7 +25,7 @@ class TEdit_field;
|
||||
// @base public | TScroll_window
|
||||
class TSheet : public TScroll_window
|
||||
|
||||
// @author(:INTERNAL) Guido
|
||||
// @author:(INTERNAL) Guido
|
||||
|
||||
// @access Privete Member
|
||||
{
|
||||
@ -196,7 +196,7 @@ public:
|
||||
//
|
||||
// @base public | TSheet
|
||||
class TArray_sheet : public TSheet
|
||||
// @author(:INTERNAL) Guido
|
||||
// @author:(INTERNAL) Guido
|
||||
|
||||
// @access Private Member
|
||||
{
|
||||
@ -240,7 +240,7 @@ public:
|
||||
//
|
||||
// @base public | TSheet
|
||||
class TCursor_sheet : public TSheet
|
||||
// @author(:INTERNAL) Guido
|
||||
// @author:(INTERNAL) Guido
|
||||
|
||||
// @access Private Member
|
||||
{
|
||||
@ -285,7 +285,7 @@ public:
|
||||
//
|
||||
// @base public | TCursor_sheet
|
||||
class TBrowse_sheet : public TCursor_sheet
|
||||
// @author(:INTERNAL) Guido
|
||||
// @author:(INTERNAL) Guido
|
||||
|
||||
// @access Private Member
|
||||
{
|
||||
|
@ -116,13 +116,17 @@ public:
|
||||
const TString& right(int count) const;
|
||||
|
||||
// @cmember Ritorna un oggetto TString temporaneo composto dai count caratteri da sinistra
|
||||
TString sleft(int count) const { return ((TString)left(count)); }
|
||||
TString sleft(int count) const
|
||||
{ return ((TString)left(count)); }
|
||||
// @cmember Ritorna un oggetto TString temporaneo composto dai count caratteri a partire da from
|
||||
TString smid(int from, int count = -1) const { return ((TString)mid(from, count)); }
|
||||
TString smid(int from, int count = -1) const
|
||||
{ return ((TString)mid(from, count)); }
|
||||
// @cmember Ritorna un oggetto TString temporaneo composto dai caratteri da from a to (escluso)
|
||||
TString ssub(int from, int to = -1) const { return ((TString)sub(from, to)); }
|
||||
TString ssub(int from, int to = -1) const
|
||||
{ return ((TString)sub(from, to)); }
|
||||
// @cmember Ritorna un oggetto TString temporaneo composto dai count caratteri da destra
|
||||
TString sright(int count) const { return ((TString)right(count)); }
|
||||
TString sright(int count) const
|
||||
{ return ((TString)right(count)); }
|
||||
|
||||
// @cmember Riempe la stringa con n caratteri c
|
||||
TString& fill(char c, int n = -1);
|
||||
@ -253,8 +257,11 @@ public:
|
||||
// @cmember Distruttore
|
||||
virtual ~TFixed_string();
|
||||
|
||||
// @cmember Manda un output formattato alla stringa oggetto
|
||||
TString& format(const char* fmt, ...);
|
||||
#ifndef __WATCOMC__
|
||||
virtual
|
||||
#endif
|
||||
// @cmember Manda un output formattato alla stringa oggetto
|
||||
TString& format(const char* fmt, ...);
|
||||
|
||||
// @cmember Assegna la stringa passata con indirizzo
|
||||
const TString& operator =(const TString& s)
|
||||
@ -409,17 +416,18 @@ public:
|
||||
TToken_string(const TToken_string& s);
|
||||
|
||||
// @cmember Setta il carattere separatore a s
|
||||
void separator(char s);
|
||||
void separator(char s)
|
||||
{ _separator = s; }
|
||||
|
||||
// @cmember Rimette all'inizio il puntatore
|
||||
void restart()
|
||||
{ _last = empty() ? -1 : 0; }
|
||||
// @cmember Assegna una stringa
|
||||
const TString& operator =(const char* s)
|
||||
{ set(s); restart(); return *this; }
|
||||
{ set(s);restart();return *this; }
|
||||
// @cmember Assegna una stringa
|
||||
const TString& operator =(const TString& s)
|
||||
{ set(s); restart(); return *this; }
|
||||
{ set(s);restart();return *this; }
|
||||
|
||||
// @cmember Aggiunge una stringa
|
||||
void add(const char* s, int n = -1);
|
||||
|
@ -5,43 +5,55 @@
|
||||
#include <isam.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
@(SH) Header
|
||||
|
||||
@(C#) PUBBLICHE
|
||||
|
||||
@(C$) PRIVATE
|
||||
@(VG#) PUBBLICHE
|
||||
@(VG$) PRIVATE
|
||||
*/
|
||||
|
||||
// @C
|
||||
// Classe TTable : public TLocalisamfile
|
||||
// @END
|
||||
// @doc EXTERNAL
|
||||
|
||||
// @class TTable | Classe per la descrizione delle tabelle
|
||||
//
|
||||
// @base public | TLocalisamfile
|
||||
class TTable : public TLocalisamfile
|
||||
|
||||
// @author(:INTERNAL) Sandro
|
||||
|
||||
// @access Private Member
|
||||
{
|
||||
// @DPRIV
|
||||
// @cmember Nome della tabella
|
||||
TString16 _tabname;
|
||||
// @cmember Codice della tabella
|
||||
TRecfield _cod;
|
||||
|
||||
// @access Public Member
|
||||
public:
|
||||
// @FPUB
|
||||
// @cmember Si posiziona sul primo record della tabella
|
||||
virtual int first(word lockop = _nolock);
|
||||
// @cmember Si posiziona sull'ultimo record della tabella
|
||||
virtual int last(word lockop = _nolock);
|
||||
// @cmember Si posiziona sul successivo record della tabella
|
||||
virtual int next(word lockop = _nolock);
|
||||
// @cmember Si posiziona sul precedente record della tabella
|
||||
virtual int prev(word lockop = _nolock);
|
||||
// @cmember Salta <p nrec> record dalla posizione corrente
|
||||
virtual int skip(TRecnotype nrec, word lockop = _nolock);
|
||||
// @cmember Legge il record (vedi <t TReclock> e <t TIsamop>)
|
||||
virtual int read(word op = _isequal, word lockop = _nolock, TDate& = (TDate&)botime);
|
||||
// @cmember Legge il record e lo copia in <p rec> (vedi <t TReclock> e <t TIsamop>)
|
||||
virtual int read(TRectype& rec, word op = _isequal, word lockop = _nolock, TDate& = (TDate&)botime);
|
||||
// @cmember Legge il record alla posizione <p nrec> (vedi <t TReclock>)
|
||||
virtual int readat(TRecnotype nrec, word lockop = _nolock);
|
||||
// @cmember Legge il record alla posizione <p nrec> e lo copia in <p rec> (vedi <t TReclock>)
|
||||
virtual int readat(TRectype& rec, TRecnotype nrec, word lockop = _nolock);
|
||||
virtual bool tab() const { return TRUE; }
|
||||
virtual const char* name() const { return _tabname;}
|
||||
// @cmember Controlla se si tratta di una tabella (ritorna sempre TRUE)
|
||||
virtual bool tab() const
|
||||
{ return TRUE; }
|
||||
// @cmember Ritorna il nome della tabella
|
||||
virtual const char* name() const
|
||||
{ return _tabname;}
|
||||
|
||||
// @cmember Costruttore
|
||||
TTable(const char* tabname, bool linkrecinst = FALSE);
|
||||
// @cmember Distruttore
|
||||
virtual ~TTable();
|
||||
|
||||
// @cmember Ritorna il numero logico della tabella <p tabname>
|
||||
static int name2log(const char* tabname);
|
||||
};
|
||||
|
||||
|
@ -38,7 +38,7 @@ enum style {
|
||||
//
|
||||
// @base public | TObject
|
||||
class TTextfile: public TObject
|
||||
// @author(:INTERNAL) Villa
|
||||
// @author:(INTERNAL) Villa
|
||||
|
||||
// @access Private Member
|
||||
{
|
||||
|
@ -22,7 +22,7 @@ class TBrowsefile_field;
|
||||
// @base public | TScroll_window
|
||||
class TViswin : public TScroll_window
|
||||
|
||||
// @author(:INTERNAL) Villa
|
||||
// @author:(INTERNAL) Villa
|
||||
|
||||
// @access Private Member
|
||||
{
|
||||
|
@ -74,7 +74,9 @@ HIDDEN void set_menu_item(MENU_ITEM& m, TToken_string& tt)
|
||||
///////////////////////////////////////////////////////////
|
||||
// TWindow_manager
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
// @doc INTERNAL
|
||||
|
||||
// @class TWindow_manager | Classe per la gestione di un array di finestre modali
|
||||
class TWindow_manager
|
||||
{
|
||||
@ -123,6 +125,8 @@ public:
|
||||
bool can_close() const;
|
||||
} WinManager;
|
||||
|
||||
// @doc EXTERNAL
|
||||
|
||||
|
||||
TWindow_manager::TWindow_manager() : _current(-1), _lowhandle(NULL)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user