1995-09-14 13:59:52 +00:00
# include <relapp.h>
# include <config.h>
# include <tabutil.h>
# include <mailbox.h>
# include <execp.h>
# include <utility.h>
# include "ve2200.h"
# include "ve2300x.h" // include anche il file dei campi della maschera delle righe
# define RCONDVEN_APP "ve2 -2 " // nome dell'applicazione di gestione delle righe
class TCondizioni_vendita : public TRelation_application {
TMask * _msk ; // maschera principale
TRelation * _rel ; // relazione principale
TString16 _condven ; // stringa che indica il tipo di archivio
TBit_array _tohide ; // vettore degli identificatori di campi che devono essere nascosti
bool _catven_on ; // booleano di abilitazione del campo CATVEN
virtual bool user_create ( ) ;
virtual bool user_destroy ( ) ;
virtual TMask * get_mask ( int ) { return _msk ; }
virtual bool changing_mask ( int ) { return FALSE ; }
virtual TRelation * get_relation ( ) const { return _rel ; }
static bool handle_mask ( TMask & , KEY ) ; // handler custom della maschera (per il tasto di aggancio alle righe)
static bool handle_datacam ( TMask_field & , KEY ) ; // handler del campo DATACAM (data cambio)
static bool handle_valfin ( TMask_field & , KEY ) ; // handler del campo VALFIN (data fine validit<69> )
static bool handle_codlissucc ( TMask_field & , KEY ) ; // handler del campo CODLISSUCC (codice listino successivo)
static bool handle_seqric ( TMask_field & , KEY ) ; // handler del campo SEQRIC (sequenza di ricerca)
virtual int write ( const TMask & ) ; // metodo usato per scrivere il record sul file
virtual int rewrite ( const TMask & ) ; // metodo usato per aggiornare il record sul file
virtual void init_query_mode ( TMask & ) ; // handler chiamato quando la maschera passa in modo ricerca
public :
TCondizioni_vendita ( ) { }
virtual ~ TCondizioni_vendita ( ) { }
} ;
TCondizioni_vendita & app ( ) { // funzione che ritorna il riferimento alla classe principale dell'applicazione
return ( TCondizioni_vendita & ) main_app ( ) ;
}
bool TCondizioni_vendita : : user_create ( ) {
bool gotcha = FALSE ; // booleano di avvenuta inizializzazione
_condven = " * " ; // inizializzazione dell'indicatore del tipo di archivio
if ( argc ( ) > 2 ) _condven = argv ( 2 ) ; // se c'<27> , prende il tipo di archivio dalla linea di comando
else {
TMask choose ( " VE2200 " ) ; // istanzia la maschera di scelta del tipo di archivio
if ( choose . run ( ) = = K_ENTER ) _condven = choose . get ( F_TIPOCV ) ; // prende il tipo di archivio dalla maschera
}
_condven . upper ( ) ; // rende la stringa upper-case
_msk = new TMask ( " VE2200X " ) ;
switch ( _condven [ 0 ] ) {
case ' L ' : { // listini
// settaggio dei campi da eliminare
_tohide . set ( F_C_COD ) ;
_tohide . set ( F_O_COD ) ;
_tohide . set ( F_C_TIPOCF ) ;
_tohide . set ( F_C_CODCF ) ;
_tohide . set ( F_C_OBBLIG ) ;
set_search_field ( F_L_COD ) ; // impostazione del campo di ricerca
TConfig prassid ( CONFIG_DITTA , " ve " ) ; // apre il file di configurazione della ditta corrente
_catven_on = ( prassid . get_bool ( " CODLISCV " ) ) ; // setta il booleano di abilitazione di CATVEN
_msk - > set_handler ( F_L_CODLISSUCC , handle_codlissucc ) ; // setta l'handler per il campo di codice successivo
gotcha = TRUE ;
break ;
}
case ' C ' : // contratti
// settaggio dei campi da eliminare
_tohide . set ( F_L_COD ) ;
_tohide . set ( F_O_COD ) ;
_tohide . set ( F_L_CATVEN ) ;
_tohide . set ( F_L_CODLISSUCC ) ;
set_search_field ( F_C_COD ) ; // impostazione del campo di ricerca
gotcha = TRUE ;
break ;
case ' O ' : // offerte
// settaggio dei campi da eliminare
_tohide . set ( F_L_COD ) ;
_tohide . set ( F_C_COD ) ;
_tohide . set ( F_L_CATVEN ) ;
_tohide . set ( F_C_TIPOCF ) ;
_tohide . set ( F_C_CODCF ) ;
_tohide . set ( F_C_OBBLIG ) ;
_tohide . set ( F_L_CODLISSUCC ) ;
set_search_field ( F_O_COD ) ; // impostazione del campo di ricerca
gotcha = TRUE ;
break ;
default : // messaggio di errore se si indica un archivio non valido
error_box ( " Indicare l'archivio sulla linea di comando (L, C o O) oppure selezionarla dalla maschera di partenza " ) ;
break ;
}
if ( gotcha ) { // se <20> stato selezionato correttamente un archivio completa l'inizializzazione
_rel = new TRelation ( LF_CONDV ) ; // apre la relazione (un unico file)
_msk - > set_handler ( handle_mask ) ; // imposta l'handler generale della maschera
_msk - > set_handler ( F_DATACAM , handle_datacam ) ; // imposta l'handler per il campo della data del cambio
_msk - > set_handler ( F_VALFIN , handle_valfin ) ; // imposta l'handler per il campo di fine validit<69>
_msk - > set_handler ( F_SEQRIC , handle_seqric ) ; // imposta l'handler per il campo di sequenza di ricerca
}
return ( gotcha ) ;
}
bool TCondizioni_vendita : : user_destroy ( ) {
delete _rel ;
delete _msk ;
return TRUE ;
}
bool TCondizioni_vendita : : handle_mask ( TMask & m , KEY k ) {
if ( k = = K_F5 ) { // se viene premuto F5 o selezionato il tasto "Righe" viene lanciata l'applicazione di editing
TString & _condven = app ( ) . _condven ; // prende l'indicatore del tipo di archivio
bool & _catven_on = app ( ) . _catven_on ; // prende il booleano di attivazione del campo CATVEN
TString appname ( RCONDVEN_APP ) ; // istanzia e inizializza la stringa con il nome dell'applicazione da lanciare
TString body ; // istanzia la stringa contenente il corpo del messaggio (lista di inizializzazione dei campi della maschera)
switch ( _condven [ 0 ] ) {
case ' L ' : // listini
body < < F_R_L_RICERCA ; // appende l'id del campo di ricerca
body < < " | " ; // appende il separatore
body < < F_R_TIPO < < " = " < < _condven ; // appende il filtro sul tipo
body < < " | " ; // appende il separatore
body < < F_R_L_CATVEN < < " = " ; // appende il filtro sulla categoria di vendita...
if ( _catven_on ) body < < m . get ( F_L_CATVEN ) ; // ...
body < < " | " ; // appende il separatore
body < < F_R_L_COD < < " = " < < m . get ( F_L_COD ) ; // appende il filtro sul campo codice
break ;
case ' C ' : // contratti
body < < F_R_C_RICERCA ; // appende l'id del campo di ricerca
body < < " | " ; // appende il separatore
body < < F_R_TIPO < < " = " < < _condven ; // appende il filtro sul tipo
body < < " | " ; // appende il separatore
body < < F_R_C_TIPOCF < < " = " < < m . get ( F_C_TIPOCF ) ; // appende il filtro sul campo tipo cliente/fornitore
body < < " | " ; // appende il separatore
body < < F_R_C_CODCF < < " = " < < m . get ( F_C_CODCF ) ; // appende il filtro sul campo codice cliente/fornitore
body < < " | " ; // appende il separatore
body < < F_R_C_COD < < " = " < < m . get ( F_C_COD ) ; // appende il filtro sul campo codice
break ;
case ' O ' : // offerte
body < < F_R_O_RICERCA ; // appende l'id del campo di ricerca
body < < " | " ; // appende il separatore
body < < F_R_TIPO < < " = " < < _condven ; // appende il filtro sul tipo
body < < " | " ; // appende il separatore
body < < F_R_O_COD < < " = " < < m . get ( F_O_COD ) ; // appende il filtro sul campo codice
break ;
}
appname < < _condven ; // aggiunge al lancio dell'applicazione la selezione del tipo di archivio
TMessage msg ( cmd2name ( appname ) , MSG_FS , ( const char * ) body ) ; // istanzia il messaggio per l'applicazione
msg . send ( ) ; // invia il messaggio all'applicazione
TExternal_app ve2_2 ( appname ) ; // istanzia l'applicazione esterna...
ve2_2 . run ( ) ; // ...la lancia e rimane in attesa del suo termine
}
return TRUE ;
}
bool TCondizioni_vendita : : handle_datacam ( TMask_field & fld , KEY k ) {
if ( k = = K_TAB ) { // ad ogni perdita di fuoco viene tentato un accoppiamento tra valuta e data per ottenere il cambio preciso
TString datacam ( fld . get ( ) ) ; // legge la data di cambio nel campo corrente
if ( datacam . not_empty ( ) ) {
TMask & m = fld . mask ( ) ; // prende la maschera principale
TString codval ( m . get ( F_CODVAL ) ) ; // prende il codice della valuta
if ( codval . not_empty ( ) ) {
TTable cam ( " CAM " ) ; // apre la tabella cambi
cam . put ( " CODTAB " , codval < < datacam ) ; // riempie la chiave
if ( cam . read ( ) = = NOERR ) m . set ( F_CAMBIO , cam . get ( " R10 " ) ) ; // se la lettura riesce il valore del cambio viene posto nel campo CAMBIO della maschera
}
}
}
return TRUE ;
}
bool TCondizioni_vendita : : handle_valfin ( TMask_field & fld , KEY k ) {
if ( k = = K_TAB ) {
if ( fld . get ( ) . not_empty ( ) ) {
TMask & m = fld . mask ( ) ; // prende la maschera principale
if ( m . get ( F_VALIN ) . not_empty ( ) ) {
TDate valfin ( fld . get ( ) ) ; // prende la data di fine validit<69>
TDate valin ( m . get ( F_VALIN ) ) ; // prende la data di inizio validit<69>
if ( valfin < valin ) {
error_box ( " La data di inizio validit<69> deve essere minore della data di fine " ) ;
return FALSE ;
} else return TRUE ;
} else return TRUE ;
} else return TRUE ;
} else return TRUE ;
}
bool TCondizioni_vendita : : handle_codlissucc ( TMask_field & fld , KEY k ) {
if ( k = = K_TAB ) {
TString codlissucc ( fld . get ( ) ) ; // prende il codice listino successivo dal campo corrente
if ( codlissucc . not_empty ( ) ) {
TMask & m = fld . mask ( ) ; // prende la maschera principale
TString cod ( m . get ( F_L_COD ) ) ; // prende il codice listino corrente dalla maschera
if ( codlissucc = = cod ) {
error_box ( " Il codice del listino successivo deve essere diverso dal codice del listino corrente " ) ;
return FALSE ;
} else return TRUE ;
} else return TRUE ;
} else return TRUE ;
}
bool TCondizioni_vendita : : handle_seqric ( TMask_field & fld , KEY k ) {
if ( k = = K_TAB ) {
TString & seqric = fld . get ( ) ; // prende la stringa contenenta la sequenza di ricerca dal campo corrente
if ( seqric . not_empty ( ) ) {
bool gotcha = TRUE ; // flag di validit<69> della sequenza
for ( int i = 0 ; i < seqric . len ( ) ; i + + ) {
char c = toupper ( seqric [ i ] ) ; // prende la lettera corrente della sequenza
if ( ( c ! = ' A ' ) & & ( c ! = ' G ' ) & & ( c ! = ' R ' ) ) gotcha = FALSE ; // se la lettera non rientra tra quelle possibili abbassa il flag di validit<69>
for ( int j = i + 1 ; j < seqric . len ( ) ; j + + ) if ( c = = toupper ( seqric [ j ] ) ) gotcha = FALSE ; // se la lettera compare anche pi<70> avanti nella sequenza abbassa il flag di validiti<74>
if ( ! gotcha ) break ; // se il flag di validit<69> <20> basso esce anticipatamente
}
if ( ! gotcha ) error_box ( " La sequenza di ricerca deve essere una combinazine di 'A' (Articoli), 'G' (Gruppi merceologici) e 'R' (Raggruppamenti fiscali), in cui ogni lettera compare al massimo una volta " ) ;
return ( gotcha ) ;
} else return TRUE ;
} else return TRUE ;
}
int TCondizioni_vendita : : write ( const TMask & m ) {
m . autosave ( _rel ) ; // scrive il contenuto della maschera nel record della relazione
if ( _condven ! = " C " ) { // se non si sta lavorando sui contratti il campo TIPOCF deve essere svuotato sul file
TLocalisamfile & f = _rel - > lfile ( ) ; // prende il file principale della relazione
TRectype & r = f . curr ( ) ; // prende il record corrente del file principale
f . zero ( " TIPOCF " ) ; // svuota il campo TIPOCF
}
_rel - > write ( ) ; // invoca la scrittura della relazione
return ( _rel - > status ( ) ) ; // ritorna lo stato della relazione
}
int TCondizioni_vendita : : rewrite ( const TMask & m ) {
m . autosave ( _rel ) ; // scrive il contenuto della maschera nel record della relazione
if ( _condven ! = " C " ) { // se non si sta lavorando sui contratti il campo TIPOCF deve essere svuotato sul file
TLocalisamfile & f = _rel - > lfile ( ) ; // prende il file principale della relazione
TRectype & r = f . curr ( ) ; // prende il record corrente del file principale
f . zero ( " TIPOCF " ) ; // svuota il campo TIPOCF
}
_rel - > rewrite ( ) ; // invoca la riscrittura della relazione
return ( _rel - > status ( ) ) ; // ritorna lo stato della relazione
}
void TCondizioni_vendita : : init_query_mode ( TMask & m ) {
for ( short i = ( short ) _tohide . first_one ( ) ; i < = ( short ) _tohide . last_one ( ) ; i + + ) {
if ( _tohide [ i ] ) {
if ( _msk - > field ( i ) . is_edit ( ) ) _msk - > efield ( i ) . check_type ( CHECK_NORMAL ) ; // disabilita il checking sul campo se <20> editabile
_msk - > hide ( i ) ; // rende invisibile il campo
}
}
if ( ! _catven_on ) { // se il booleano di abil. di CATVEN <20> falso...
_msk - > efield ( F_L_CATVEN ) . check_type ( CHECK_NONE ) ; // ...viene rimosso dal checking...
_msk - > disable ( F_L_CATVEN ) ; // ...e disabilitato
}
_msk - > set ( F_TIPO , _condven ) ; // settaggio del campo di tipo archivio
}
int ve2200 ( int argc , char * argv [ ] ) {
TCondizioni_vendita a ;
a . run ( argc , argv , " Condizioni di vendita " ) ;
return 0 ;
}