campo-sirio/include/relapp.h

265 lines
9.6 KiB
C
Raw Normal View History

#ifndef __RELAPP_H
#define __RELAPP_H
#ifndef __APPLICAT_H
#include <applicat.h>
#endif
#ifndef __CONFIG_H
#include <config.h>
#endif
#ifndef __RELATION_H
#include <relation.h>
#endif
#ifndef __MASK_H
#include <mask.h>
#endif
#define TRANSACTION_RUN "RUN"
#define TRANSACTION_INSERT "INSERT"
#define TRANSACTION_MODIFY "MODIFY"
#define TRANSACTION_DELETE "DELETE"
#define TM_INTERACTIVE 'I'
#define TM_AUTOMATIC 'A'
// @doc EXTERNAL
// @class TRelation_application | Classe per la gestione di una applicazione di manutenzione di uno
// o piu' archivi utilizzando una relazione
//
// @base public | TApplication
class TRelation_application : public TSkeleton_application
// @author:(INTERNAL) Guido
// @access:(INTERNAL) Private Member
{
// @cmember:(INTERNAL) Maschera corrente dell'applicazione
TMask* _mask;
// @cmember:(INTERNAL) Primo record
TRecnotype _first;
// @cmember:(INTERNAL) Ultimo record
TRecnotype _last;
// @cmember:(INTERNAL) Campo da utilizzare col bottone Ricerca
int _search_id;
// @cmember:(INTERNAL) Nome del programma chiamante
TString _autoins_caller;
// @cmember:(INTERNAL) Numero del record nuovo/editato
long _recins;
// @cmember:(INTERNAL) Indica se e' stato chiamato col messaggio di link
byte _lnflag;
// @cmember:(INTERNAL) Contiene il codice del campo e il valore fisso
TToken_string _fixed;
// @cmember:(INTERNAL) Messaggio da passare all'utente per indicare che e' stata fatta la rinumerazione
TString _renum_message;
// @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;
// @cmember:(INTERNAL) Azione della transazione corrente
TString _curr_transaction;
// @cmember:(INTERNAL) Modalit<69> di esecuzione della transazione corrente (Automatica o interattiva)
char _curr_trans_mode;
// @cmember:(INTERNAL) Transazione ricevuta da .....
TString _curr_trans_from;
// @cmember:(INTERNAL) Flag di cancellazione automatica veloce
int _autodelete;
private:
// @cmember:(INTERNAL) Carica la transazione corrente (protocollo via .ini)
bool load_transaction() ;
// @cmember:(INTERNAL) Setta i campi fissati da <md TRelation_application::_fixed>
bool filter();
// @cmember:(INTERNAL) Controlla se una chiave e' completa ed esiste su file
bool test_key(word k, bool err);
// @cmember:(INTERNAL) Abilita la ricerca sulla maschera
void enable_query();
// @cmember:(INTERNAL) Abilita i vari bottoni di ricerca della toolbar
void set_toolbar();
// @Setta i filtri di lettura
void set_key_filter();
// @cmember:(INTERNAL) Posiziona l'applicazione in modo richiesta/inserimento (chiama <mf TRelation_application::query_mode>)
void query_insert_mode()
{ query_mode(TRUE); }
// @cmember:(INTERNAL) Entra in modo inserimento
void insert_mode();
// @cmember:(INTERNAL) Cancella il record corrente
bool relation_remove();
// @cmember:(INTERNAL) Ritorna il campo di ricerca della maschera
TEdit_field& get_search_field() const;
// @cmember:(INTERNAL) Permette di autonumerare un record
bool autonum(TMask* m, bool rec);
// @cmember:(INTERNAL) Controlla se il <c TCursor> ha un filtro
virtual bool has_filtered_cursor() const
{ return filtered(); }
// @cmember:(INTERNAL) Sistema il bottone ricerca se necessario
void set_find_button();
// @access Protected Member
protected: // TApplication
// @cmember Effettua i controlli all'inizio dell'applicazione
virtual bool create();
// @cmember Effettua i controlli alla fine dell'applicazione
virtual bool destroy();
// @cmember Controlla se e' possibile modificare la ditta corrente durante l'esecuzione dell'applicazione
virtual bool firm_change_enabled() const;
// @access Protected Member
protected:
// @cmember Ritorna il descrittore del file principale della relazione
TLocalisamfile& file() const
{ return get_relation()->lfile(); }
// @cmember Ritorna il primo record
TRecnotype first() const
{ return _first;}
// @cmember Ritorna l'ultimo record
TRecnotype last() const
{ return _last;}
// @cmember Ritorna il nome del programma chiamante
const TString& autoins_caller() const
{ return _autoins_caller;}
// @cmember:(INTERNAL) Seleziona il nuovo modo e ritorna il vecchio
int set_mode(int mode);
// @cmember Ciclo principale
virtual void main_loop();
// @cmember Inizializzazione dei dati dell'utente
virtual bool user_create() pure;
// @cmember Distruzione dei dati dell'utente
virtual bool user_destroy() pure;
// @cmember Fissa i campi non modificabili
void set_fixed();
// @cmember Attiva la maschera di ricerca
bool search_mode();
// @cmember Attiva la maschera di eliminazione
int delete_mode();
// @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
// 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
// con maschere multiple.
virtual bool changing_mask(int mode) pure;
// @cmember Richiede la maschera da usare
virtual TMask* get_mask(int mode) pure;
// @cmember:(INTERNAL) Salva i contenuti della maschera su file
bool save(bool check_dirty);
// @cmember Ritorna la relazione da modificare
virtual TRelation* get_relation() const pure;
// @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();
// @cmember Richiede una stringa nella forma CAMPO1<pipe>VALORE1<pipe>CAMPO2<pipe>VALORE2<pipe>...
// <pipe>CAMPOn<pipe>VALOREn contenente le coppie NUMERO_CAMPO_MASCHERA - VALORE_DA_ASSEGNARE
// che descrivono il prossimo codice libero da utilizzare per la autonumerazione.
// <nl>Nel caso di banale numerazione progressiva potrebbe essere implementata come
// return format("%d<pipe>%s", F_NUM, get_relation()-<gt>items());
virtual const char* get_next_key()
{ return ""; }
virtual bool get_next_key(TToken_string& key)
{ return FALSE; }
// @cmember Richiede se il record corrente e' protetto (non cancellabile)
virtual bool protected_record(TRectype&)
{ return FALSE; }
// @cmember Richiede se il record corrente e' protetto (non cancellabile)
virtual bool protected_record(TRelation &);
// @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&)
{ }
// @cmember Indica se abilitare/disabilitare la scrittura sul file
// principale (vedi <mf TRealtion::write_enable>)
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
virtual bool save_and_new() const;
// @cmember Impone il campo da utilizzare col bottone Ricerca
void set_search_field(short id)
{ _search_id = id;}
byte autodeleting() const { return _autodelete; }
bool parse_command_line();
void ini2query_mask();
void ini2insert_mask();
void edit_mask2ini();
virtual void ini2sheet(TConfig& ini, TSheet_field &sheet);
virtual void sheet2ini(TSheet_field &sheet,TConfig& ini);
virtual void ini2mask(TConfig& ini, TMask& m, bool query);
virtual void mask2ini(const TMask& m, TConfig& ini);
virtual bool mask2mail(const TMask& m);
// @access Public Member
public:
Patch level : 2.0 464 Files correlati : cb6.dll ba3 piu tutti gli altri Ricompilazione Demo : [ ] Commento : Corretto errore AO20007 In qualsiasi videata richiamata dal tasto Elimina, se non ho nessun record da scegliere e premo sul tasto Tutti, mi viene restituito un errore di Ba3.exe Corretto errore AO20017 Inserendo una nuova categoria se consulto i codici del Piano dei Conti, passo nella pagina descrizione e inserisco una stringa da ricercare dopo aver scritto la prima lettera si blocca tutto il programma senza che venga restituito nessun errore (tra l'altro succede solo su alcune lettere iniziali e non su tutte, il mio esempio inizia con la 'R'); inoltre se non scrivo nessuna stringa da cercare e ritorno sui codici del sottoconto, mi passa all'elenco dei codici del conto. Corretto errore AO20018 Inserendo una nuova categoria se consulto i codici del Piano dei Conti, passo nella pagina descrizione e inserisco una stringa da ricercare dopo aver scritto la prima lettera si blocca tutto il programma senza che venga restituito nessun errore (tra l'altro succede solo su alcune lettere iniziali e non su tutte, il mio esempio inizia con la 'R'); inoltre se non scrivo nessuna stringa da cercare e ritorno sui codici del sottoconto, mi passa all'elenco dei codici del conto. Corretto errore AO20019 CON LA TASTIERA Se premo sui tasti di salto all'ultimo o primo record e non ho nessun dato mi restituisce un errore del modulo Base: Impossibile leggere i dati - errore 201. git-svn-id: svn://10.65.10.50/trunk@11077 c028cbd2-c16b-5b4b-a496-9718f37d4682
2003-04-30 17:04:20 +00:00
// @cmember:(INTERNAL) Setta i limiti
void set_limits(byte what = 0x3);
// @cmember Ritorna la maschera corrente
TMask& curr_mask() const
{ return *_mask; }
// @cmember Ritorna se sono stati posti dei filtri sul file corrente
bool filtered() const
{ return _fixed.not_empty(); }
// @cmember Cerca un record corrispondente alla chiave <p key> (0 prima chiave completa)
bool find(word key = 0);
// @cmember Costruisce il membro <md TRelation_application::_fixed>
void set_link(TMask & m, const char * keyexpr);
// @cmember Ritorna TRUE se e' stato chiamato col messaggio di link
bool lnflag() const
{ return _lnflag != 0;} // qui
virtual word class_id() const { return CLASS_RELATION_APPLICATION; }
// @cmember Ritorna TRUE se e' una transazione
bool is_transaction() const { return _curr_transaction.not_empty(); }
// @cmember Costruttore
TRelation_application();
// @cmember Distruttore
virtual ~TRelation_application();
};
#endif