1994-12-05 14:23:30 +00:00
|
|
|
|
#ifndef __RELAPP_H
|
|
|
|
|
#define __RELAPP_H
|
|
|
|
|
|
|
|
|
|
#ifndef __APPLICAT_H
|
|
|
|
|
#include <applicat.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
1997-05-21 09:39:15 +00:00
|
|
|
|
#ifndef __CONFIG_H
|
|
|
|
|
#include <config.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
1994-12-05 14:23:30 +00:00
|
|
|
|
#ifndef __RELATION_H
|
|
|
|
|
#include <relation.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef __MASK_H
|
|
|
|
|
#include <mask.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
2003-06-06 08:57:05 +00:00
|
|
|
|
#define TRANSACTION_RUN "RUN" // Run application (eventually sets firm)
|
|
|
|
|
#define TRANSACTION_INSERT "INSERT" // Create a new record and fill it
|
|
|
|
|
#define TRANSACTION_MODIFY "MODIFY" // Load and modify an existing record
|
|
|
|
|
#define TRANSACTION_DELETE "DELETE" // Delete an existing record
|
|
|
|
|
#define TRANSACTION_LINK "LINK" // Load an existing record and interactively edit it
|
1998-04-30 15:31:34 +00:00
|
|
|
|
#define TM_INTERACTIVE 'I'
|
|
|
|
|
#define TM_AUTOMATIC 'A'
|
2005-05-08 11:47:35 +00:00
|
|
|
|
#define TM_REMAIN 'R'
|
1996-02-05 19:00:53 +00:00
|
|
|
|
// @doc EXTERNAL
|
|
|
|
|
|
1996-09-06 10:37:42 +00:00
|
|
|
|
// @class TRelation_application | Classe per la gestione di una applicazione di manutenzione di uno
|
1996-01-31 17:19:02 +00:00
|
|
|
|
// o piu' archivi utilizzando una relazione
|
|
|
|
|
//
|
|
|
|
|
// @base public | TApplication
|
1998-02-24 10:37:28 +00:00
|
|
|
|
class TRelation_application : public TSkeleton_application
|
1996-01-31 17:19:02 +00:00
|
|
|
|
|
|
|
|
|
// @author:(INTERNAL) Guido
|
|
|
|
|
|
1996-02-05 19:00:53 +00:00
|
|
|
|
// @access:(INTERNAL) Private Member
|
1994-12-05 14:23:30 +00:00
|
|
|
|
{
|
1996-02-05 19:00:53 +00:00
|
|
|
|
// @cmember:(INTERNAL) Maschera corrente dell'applicazione
|
1996-01-31 17:19:02 +00:00
|
|
|
|
TMask* _mask;
|
1996-02-05 19:00:53 +00:00
|
|
|
|
// @cmember:(INTERNAL) Primo record
|
1996-01-31 17:19:02 +00:00
|
|
|
|
TRecnotype _first;
|
1996-02-05 19:00:53 +00:00
|
|
|
|
// @cmember:(INTERNAL) Ultimo record
|
1996-01-31 17:19:02 +00:00
|
|
|
|
TRecnotype _last;
|
1996-02-05 19:00:53 +00:00
|
|
|
|
// @cmember:(INTERNAL) Campo da utilizzare col bottone Ricerca
|
1996-01-31 17:19:02 +00:00
|
|
|
|
int _search_id;
|
1994-12-05 14:23:30 +00:00
|
|
|
|
|
1996-02-05 19:00:53 +00:00
|
|
|
|
// @cmember:(INTERNAL) Nome del programma chiamante
|
1996-05-08 11:09:13 +00:00
|
|
|
|
TString _autoins_caller;
|
1996-02-05 19:00:53 +00:00
|
|
|
|
// @cmember:(INTERNAL) Numero del record nuovo/editato
|
1994-12-05 14:23:30 +00:00
|
|
|
|
long _recins;
|
|
|
|
|
|
1996-02-05 19:00:53 +00:00
|
|
|
|
// @cmember:(INTERNAL) Indica se e' stato chiamato col messaggio di link
|
1998-03-05 13:54:51 +00:00
|
|
|
|
byte _lnflag;
|
1996-02-05 19:00:53 +00:00
|
|
|
|
// @cmember:(INTERNAL) Contiene il codice del campo e il valore fisso
|
1995-05-10 08:57:51 +00:00
|
|
|
|
TToken_string _fixed;
|
1996-09-09 10:53:42 +00:00
|
|
|
|
// @cmember:(INTERNAL) Messaggio da passare all'utente per indicare che e' stata fatta la rinumerazione
|
1995-05-10 08:57:51 +00:00
|
|
|
|
TString _renum_message;
|
1994-12-05 14:23:30 +00:00
|
|
|
|
|
1998-04-30 15:31:34 +00:00
|
|
|
|
// @cmember:(INTERNAL) Nomi dei file .ini con la transazione da eseguire
|
|
|
|
|
TString_array _trans_ini;
|
|
|
|
|
// @cmember:(INTERNAL) Numero di file .ini di transazioni
|
|
|
|
|
int _ntransactions;
|
|
|
|
|
// @cmember:(INTERNAL) Indice del file .ini di _ini con la transazione da eseguire
|
|
|
|
|
int _trans_counter;
|
1997-03-28 12:07:58 +00:00
|
|
|
|
// @cmember:(INTERNAL) Azione della transazione corrente
|
1998-04-30 15:31:34 +00:00
|
|
|
|
TString _curr_transaction;
|
|
|
|
|
// @cmember:(INTERNAL) Modalit<69> di esecuzione della transazione corrente (Automatica o interattiva)
|
|
|
|
|
char _curr_trans_mode;
|
2001-04-30 15:04:10 +00:00
|
|
|
|
// @cmember:(INTERNAL) Transazione ricevuta da .....
|
|
|
|
|
TString _curr_trans_from;
|
1997-05-06 10:26:19 +00:00
|
|
|
|
// @cmember:(INTERNAL) Flag di cancellazione automatica veloce
|
1999-07-21 09:18:16 +00:00
|
|
|
|
int _autodelete;
|
2003-08-08 12:54:27 +00:00
|
|
|
|
// @cmember:(INTERNAL) Flag di navigazione tramite toolbar
|
|
|
|
|
bool _navigating;
|
1998-04-30 15:31:34 +00:00
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
// @cmember:(INTERNAL) Carica la transazione corrente (protocollo via .ini)
|
|
|
|
|
bool load_transaction() ;
|
1997-03-28 12:07:58 +00:00
|
|
|
|
|
1996-02-05 19:00:53 +00:00
|
|
|
|
// @cmember:(INTERNAL) Setta i campi fissati da <md TRelation_application::_fixed>
|
1994-12-05 14:23:30 +00:00
|
|
|
|
bool filter();
|
1996-02-05 19:00:53 +00:00
|
|
|
|
// @cmember:(INTERNAL) Controlla se una chiave e' completa ed esiste su file
|
1998-03-05 13:54:51 +00:00
|
|
|
|
bool test_key(word k, bool err);
|
1996-02-05 19:00:53 +00:00
|
|
|
|
// @cmember:(INTERNAL) Abilita la ricerca sulla maschera
|
1994-12-05 14:23:30 +00:00
|
|
|
|
void enable_query();
|
2003-09-24 14:54:49 +00:00
|
|
|
|
// @cmember:(INTERNAL) Setta i limiti
|
|
|
|
|
void set_limits(byte what = 0x3);
|
2003-05-22 15:08:27 +00:00
|
|
|
|
// @cmember:(INTERNAL) Abilita i vari bottoni di ricerca della toolbar
|
|
|
|
|
void set_toolbar();
|
1994-12-05 14:23:30 +00:00
|
|
|
|
|
1998-12-10 16:25:48 +00:00
|
|
|
|
// @Setta i filtri di lettura
|
|
|
|
|
void set_key_filter();
|
1996-09-06 10:37:42 +00:00
|
|
|
|
// @cmember:(INTERNAL) Posiziona l'applicazione in modo richiesta/inserimento (chiama <mf TRelation_application::query_mode>)
|
1996-01-31 17:19:02 +00:00
|
|
|
|
void query_insert_mode()
|
|
|
|
|
{ query_mode(TRUE); }
|
1996-02-05 19:00:53 +00:00
|
|
|
|
// @cmember:(INTERNAL) Entra in modo inserimento
|
1996-01-31 17:19:02 +00:00
|
|
|
|
void insert_mode();
|
1996-02-05 19:00:53 +00:00
|
|
|
|
// @cmember:(INTERNAL) Cancella il record corrente
|
1996-01-31 17:19:02 +00:00
|
|
|
|
bool relation_remove();
|
1996-02-05 19:00:53 +00:00
|
|
|
|
// @cmember:(INTERNAL) Ritorna il campo di ricerca della maschera
|
1996-05-08 11:09:13 +00:00
|
|
|
|
TEdit_field& get_search_field() const;
|
1996-01-31 17:19:02 +00:00
|
|
|
|
|
1996-02-05 19:00:53 +00:00
|
|
|
|
// @cmember:(INTERNAL) Permette di autonumerare un record
|
1994-12-05 14:23:30 +00:00
|
|
|
|
bool autonum(TMask* m, bool rec);
|
1996-02-05 19:00:53 +00:00
|
|
|
|
// @cmember:(INTERNAL) Controlla se il <c TCursor> ha un filtro
|
2003-05-22 15:08:27 +00:00
|
|
|
|
virtual bool has_filtered_cursor() const
|
|
|
|
|
{ return filtered(); }
|
2003-09-23 14:47:55 +00:00
|
|
|
|
virtual TCursor& get_filtered_cursor() const;
|
1994-12-05 14:23:30 +00:00
|
|
|
|
|
2002-03-01 13:31:49 +00:00
|
|
|
|
// @cmember:(INTERNAL) Sistema il bottone ricerca se necessario
|
|
|
|
|
void set_find_button();
|
|
|
|
|
|
1996-01-31 17:19:02 +00:00
|
|
|
|
// @access Protected Member
|
1997-02-03 15:30:36 +00:00
|
|
|
|
protected: // TApplication
|
1996-01-31 17:19:02 +00:00
|
|
|
|
// @cmember Effettua i controlli all'inizio dell'applicazione
|
1995-07-19 09:57:25 +00:00
|
|
|
|
virtual bool create();
|
1996-01-31 17:19:02 +00:00
|
|
|
|
// @cmember Effettua i controlli alla fine dell'applicazione
|
1995-07-19 09:57:25 +00:00
|
|
|
|
virtual bool destroy();
|
1996-01-31 17:19:02 +00:00
|
|
|
|
// @cmember Controlla se e' possibile modificare la ditta corrente durante l'esecuzione dell'applicazione
|
1995-07-19 09:57:25 +00:00
|
|
|
|
virtual bool firm_change_enabled() const;
|
2004-11-30 22:02:59 +00:00
|
|
|
|
// @cmember Aggiorna i limiti di ricerca sul cambio ditta
|
|
|
|
|
virtual void on_firm_change();
|
1995-07-19 09:57:25 +00:00
|
|
|
|
|
1997-02-03 15:30:36 +00:00
|
|
|
|
// @access Protected Member
|
1994-12-05 14:23:30 +00:00
|
|
|
|
protected:
|
1996-01-31 17:19:02 +00:00
|
|
|
|
// @cmember Ritorna il descrittore del file principale della relazione
|
|
|
|
|
TLocalisamfile& file() const
|
|
|
|
|
{ return get_relation()->lfile(); }
|
1996-02-05 19:00:53 +00:00
|
|
|
|
// @cmember Ritorna il primo record
|
1996-01-31 17:19:02 +00:00
|
|
|
|
TRecnotype first() const
|
|
|
|
|
{ return _first;}
|
1996-02-05 19:00:53 +00:00
|
|
|
|
// @cmember Ritorna l'ultimo record
|
1996-01-31 17:19:02 +00:00
|
|
|
|
TRecnotype last() const
|
1996-02-05 19:00:53 +00:00
|
|
|
|
{ return _last;}
|
|
|
|
|
// @cmember Ritorna il nome del programma chiamante
|
1996-01-31 17:19:02 +00:00
|
|
|
|
const TString& autoins_caller() const
|
|
|
|
|
{ return _autoins_caller;}
|
2001-09-19 14:52:11 +00:00
|
|
|
|
// @cmember:(INTERNAL) Seleziona il nuovo modo e ritorna il vecchio
|
|
|
|
|
int set_mode(int mode);
|
1996-01-31 17:19:02 +00:00
|
|
|
|
|
|
|
|
|
// @cmember Ciclo principale
|
1998-02-24 10:37:28 +00:00
|
|
|
|
virtual void main_loop();
|
1994-12-05 14:23:30 +00:00
|
|
|
|
|
1996-01-31 17:19:02 +00:00
|
|
|
|
// @cmember Inizializzazione dei dati dell'utente
|
|
|
|
|
virtual bool user_create() pure;
|
|
|
|
|
// @cmember Distruzione dei dati dell'utente
|
|
|
|
|
virtual bool user_destroy() pure;
|
1994-12-05 14:23:30 +00:00
|
|
|
|
|
1996-01-31 17:19:02 +00:00
|
|
|
|
// @cmember Fissa i campi non modificabili
|
|
|
|
|
void set_fixed();
|
|
|
|
|
// @cmember Attiva la maschera di ricerca
|
|
|
|
|
bool search_mode();
|
1997-05-21 09:39:15 +00:00
|
|
|
|
// @cmember Attiva la maschera di eliminazione
|
|
|
|
|
int delete_mode();
|
1996-01-31 17:19:02 +00:00
|
|
|
|
// @cmember Entra in modo di ricerca
|
|
|
|
|
void query_mode(bool pre_ins = FALSE);
|
|
|
|
|
// @cmember Entra in modo modifica
|
|
|
|
|
bool modify_mode();
|
|
|
|
|
// @cmember Legge i campi chiave della maschera e setta il cursore relativo
|
|
|
|
|
void setkey();
|
|
|
|
|
// @cmember Indica se la futura <mf TRelation_application::get_mask> ritornera' una maschera diversa
|
1996-05-08 11:09:13 +00:00
|
|
|
|
// dalla corrente.
|
|
|
|
|
// <nl>La richiesta della maschera da utilizzare per ogni fase di lavoro
|
|
|
|
|
// (ricerca, inserimento, modifica) avviene sempre in due tempi: <mf TRelation_application::changing_mask> e
|
|
|
|
|
// <mf TRelation_application::get_mask>. Cio' serve per gestire correttamente le applicazioni
|
1996-09-09 10:53:42 +00:00
|
|
|
|
// con maschere multiple.
|
2005-01-18 11:15:37 +00:00
|
|
|
|
virtual bool changing_mask(int mode) { return false; }
|
1996-01-31 17:19:02 +00:00
|
|
|
|
// @cmember Richiede la maschera da usare
|
|
|
|
|
virtual TMask* get_mask(int mode) pure;
|
|
|
|
|
|
2009-01-07 15:50:52 +00:00
|
|
|
|
// @cmember:(INTERNAL) Annulla la modifica di un record: toglie il lock
|
|
|
|
|
void edit_cancel();
|
1997-02-03 15:30:36 +00:00
|
|
|
|
// @cmember:(INTERNAL) Salva i contenuti della maschera su file
|
2006-12-13 16:22:33 +00:00
|
|
|
|
virtual bool save(bool check_dirty);
|
1996-01-31 17:19:02 +00:00
|
|
|
|
// @cmember Legge dalla relazione i valori nella maschera <p m>
|
|
|
|
|
virtual int read(TMask& m);
|
|
|
|
|
// @cmember Scrive sulla relazione i valori dalla maschera <p m>
|
|
|
|
|
virtual int write(const TMask& m);
|
|
|
|
|
// @cmember Riscrive sulla relazione i valori dalla maschera <p m>
|
|
|
|
|
virtual int rewrite(const TMask& m);
|
|
|
|
|
// @cmember Cancella il record corrente
|
|
|
|
|
virtual bool remove();
|
1994-12-05 14:23:30 +00:00
|
|
|
|
|
2005-02-17 18:13:12 +00:00
|
|
|
|
// @cmember Deve ritornare una stringa nella forma CAMPO1<pipe>VALORE1<pipe>CAMPO2<pipe>VALORE2<pipe>...
|
1996-05-08 11:09:13 +00:00
|
|
|
|
// <pipe>CAMPOn<pipe>VALOREn contenente le coppie NUMERO_CAMPO_MASCHERA - VALORE_DA_ASSEGNARE
|
1996-01-31 17:19:02 +00:00
|
|
|
|
// che descrivono il prossimo codice libero da utilizzare per la autonumerazione.
|
1996-05-08 11:09:13 +00:00
|
|
|
|
// <nl>Nel caso di banale numerazione progressiva potrebbe essere implementata come
|
|
|
|
|
// return format("%d<pipe>%s", F_NUM, get_relation()-<gt>items());
|
1996-01-31 17:19:02 +00:00
|
|
|
|
virtual const char* get_next_key()
|
|
|
|
|
{ return ""; }
|
1998-05-04 07:57:56 +00:00
|
|
|
|
virtual bool get_next_key(TToken_string& key)
|
2009-01-07 15:50:52 +00:00
|
|
|
|
{ return false; }
|
1994-12-05 14:23:30 +00:00
|
|
|
|
|
1996-01-31 17:19:02 +00:00
|
|
|
|
// @cmember Richiede se il record corrente e' protetto (non cancellabile)
|
1999-10-22 10:00:18 +00:00
|
|
|
|
virtual bool protected_record(TRectype&)
|
1996-01-31 17:19:02 +00:00
|
|
|
|
{ return FALSE; }
|
1999-10-22 10:00:18 +00:00
|
|
|
|
|
|
|
|
|
// @cmember Richiede se il record corrente e' protetto (non cancellabile)
|
|
|
|
|
virtual bool protected_record(TRelation &);
|
1994-12-05 14:23:30 +00:00
|
|
|
|
|
1996-01-31 17:19:02 +00:00
|
|
|
|
// @cmember Inizializza la maschera per il modo ricerca
|
|
|
|
|
virtual void init_query_mode(TMask&)
|
|
|
|
|
{ }
|
|
|
|
|
// @cmember Inizializza la maschera per il modo ricerca ed inserimento (chiama <mf TRelation_application::init_query_mode>)
|
|
|
|
|
virtual void init_query_insert_mode(TMask& m)
|
|
|
|
|
{ init_query_mode(m); }
|
|
|
|
|
// @cmember Inizializza la maschera per il modo inserimento
|
|
|
|
|
virtual void init_insert_mode(TMask&)
|
|
|
|
|
{ }
|
|
|
|
|
// @cmember Inizializza la maschera per il modo modifica
|
|
|
|
|
virtual void init_modify_mode(TMask&)
|
|
|
|
|
{ }
|
1994-12-05 14:23:30 +00:00
|
|
|
|
|
1996-01-31 17:19:02 +00:00
|
|
|
|
// @cmember Indica se abilitare/disabilitare la scrittura sul file
|
1996-05-08 11:09:13 +00:00
|
|
|
|
// principale (vedi <mf TRealtion::write_enable>)
|
1996-01-31 17:19:02 +00:00
|
|
|
|
virtual void write_enable(bool on = TRUE)
|
|
|
|
|
{ get_relation()->write_enable(0, on); }
|
|
|
|
|
// @cmember Indica se disabilitare la scrittura sul file principale (vedi <mf TRealtion::write_enable>)
|
|
|
|
|
void write_disable()
|
|
|
|
|
{ write_enable(FALSE); }
|
|
|
|
|
|
|
|
|
|
// @cmember Salva il record corrente e si predispone per un nuovo inserimento
|
1994-12-05 14:23:30 +00:00
|
|
|
|
virtual bool save_and_new() const;
|
|
|
|
|
|
1996-01-31 17:19:02 +00:00
|
|
|
|
// @cmember Impone il campo da utilizzare col bottone Ricerca
|
|
|
|
|
void set_search_field(short id)
|
|
|
|
|
{ _search_id = id;}
|
1998-03-05 13:54:51 +00:00
|
|
|
|
byte autodeleting() const { return _autodelete; }
|
2003-08-08 12:54:27 +00:00
|
|
|
|
bool navigating() const { return _navigating; }
|
1997-03-28 12:07:58 +00:00
|
|
|
|
bool parse_command_line();
|
|
|
|
|
void ini2query_mask();
|
|
|
|
|
void ini2insert_mask();
|
|
|
|
|
void edit_mask2ini();
|
1999-10-22 10:00:18 +00:00
|
|
|
|
virtual void ini2sheet(TConfig& ini, TSheet_field &sheet);
|
|
|
|
|
virtual void sheet2ini(TSheet_field &sheet,TConfig& ini);
|
1997-03-28 12:07:58 +00:00
|
|
|
|
virtual void ini2mask(TConfig& ini, TMask& m, bool query);
|
1998-12-10 16:25:48 +00:00
|
|
|
|
virtual bool mask2mail(const TMask& m);
|
1995-08-01 10:23:21 +00:00
|
|
|
|
|
1996-01-31 17:19:02 +00:00
|
|
|
|
// @access Public Member
|
|
|
|
|
public:
|
2007-03-06 16:37:44 +00:00
|
|
|
|
virtual void mask2ini(const TMask& m, TConfig& ini);
|
2006-12-13 16:22:33 +00:00
|
|
|
|
// @cmember Ritorna la relazione da modificare
|
|
|
|
|
virtual TRelation* get_relation() const pure;
|
|
|
|
|
|
2003-09-24 14:54:49 +00:00
|
|
|
|
// @cmember Ricalcola l'attivazione dei bottoni di navigazione
|
|
|
|
|
void update_navigation_bar();
|
|
|
|
|
|
1996-01-31 17:19:02 +00:00
|
|
|
|
// @cmember Ritorna la maschera corrente
|
|
|
|
|
TMask& curr_mask() const
|
|
|
|
|
{ return *_mask; }
|
|
|
|
|
|
|
|
|
|
// @cmember Ritorna se sono stati posti dei filtri sul file corrente
|
2009-03-25 14:27:10 +00:00
|
|
|
|
virtual bool filtered() const
|
1996-01-31 17:19:02 +00:00
|
|
|
|
{ return _fixed.not_empty(); }
|
1996-09-10 10:43:17 +00:00
|
|
|
|
// @cmember Cerca un record corrispondente alla chiave <p key> (0 prima chiave completa)
|
2007-03-06 16:37:44 +00:00
|
|
|
|
virtual bool find(word key = 0);
|
1996-01-31 17:19:02 +00:00
|
|
|
|
// @cmember Costruisce il membro <md TRelation_application::_fixed>
|
1994-12-05 14:23:30 +00:00
|
|
|
|
void set_link(TMask & m, const char * keyexpr);
|
2001-04-30 15:04:10 +00:00
|
|
|
|
// @cmember Ritorna TRUE se e' stato chiamato col messaggio di link
|
|
|
|
|
bool lnflag() const
|
2001-05-04 10:59:04 +00:00
|
|
|
|
{ return _lnflag != 0;} // qui
|
2002-02-26 16:20:19 +00:00
|
|
|
|
|
|
|
|
|
virtual word class_id() const { return CLASS_RELATION_APPLICATION; }
|
|
|
|
|
|
2000-10-03 13:45:12 +00:00
|
|
|
|
// @cmember Ritorna TRUE se e' una transazione
|
|
|
|
|
bool is_transaction() const { return _curr_transaction.not_empty(); }
|
1995-08-21 07:47:18 +00:00
|
|
|
|
|
1996-01-31 17:19:02 +00:00
|
|
|
|
// @cmember Costruttore
|
1995-08-21 07:47:18 +00:00
|
|
|
|
TRelation_application();
|
1996-01-31 17:19:02 +00:00
|
|
|
|
// @cmember Distruttore
|
1995-08-21 07:47:18 +00:00
|
|
|
|
virtual ~TRelation_application();
|
1994-12-05 14:23:30 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|