1995-09-12 09:08:09 +00:00
# include <printapp.h>
# include <mailbox.h>
# include <mask.h>
# include <execp.h>
# include "ve3400.h"
1996-11-30 12:16:55 +00:00
# define GMC 101
//#define GMC1 101
//#define GMC2 102
//#define GMC3 103
1995-09-12 09:08:09 +00:00
# define ANAMAG_APP "ve2 -3"
int max3 ( int a , int b , int c ) { // funzione che ritorna il massimo di tre valori
if ( a > b ) {
if ( a > c ) return a ; // a>b & a>c -> abc | acb
else return c ; // a>b & c>a -> cab
} else {
if ( b > c ) return b ; // b>a & b>c -> bca | bac
else return c ; // b>a & c>b -> cba
}
}
class TStampa_anagrafica_magazzino : public TPrint_application {
TRelation * _rel ; // relazione principale
TLocalisamfile * _umart , * _codcorr ; // file per l'accesso a unit<69> di misura articoli e codici corrispondenti
TRecord_array * _arr_umart , * _arr_codcorr ; // record array per la lettura di u. m. articoli e codici corrisp.
bool _st_umart , _st_codcorr , _st_fisc ; // booleano per la stampa condizionale di u. m. artic., cod. corrisp. e dati fisc.
int _anagr_link_id ; // id del link ipertestuale all'anagrafica di magazzino
protected :
virtual bool user_create ( void ) ;
virtual bool user_destroy ( void ) ;
virtual bool set_print ( int ) ;
virtual void set_page ( int , int ) ;
virtual void preprocess_header ( void ) ;
virtual void process_link ( int , const char * ) ;
} ;
bool TStampa_anagrafica_magazzino : : user_create ( ) {
1996-06-27 09:43:00 +00:00
_rel = new TRelation ( LF_ANAMAG ) ; // crea la relazione principale
1996-11-30 12:16:55 +00:00
_rel - > add ( " GMC " , " CODTAB==GRMERC " , 1 , 0 , GMC ) ; // aggancia la tabella Gruppi Merceologici al primo campo GRMERC1
//_rel->add("GMC", "CODTAB==GRMERC1", 1, 0, GMC1); // aggancia la tabella Gruppi Merceologici al primo campo GRMERC1
//_rel->add("GMC", "CODTAB==GRMERC2", 1, 0, GMC2); // aggancia la tabella Gruppi Merceologici al secondo campo GRMERC2
//_rel->add("GMC", "CODTAB==GRMERC3", 1, 0, GMC3); // aggancia la tabella Gruppi Merceologici al terzo campo GRMERC3
1995-09-12 09:08:09 +00:00
_rel - > add ( LF_UMART , " CODART==CODART " ) ; // aggancia il file con le unit<69> di misura dell'articolo
_rel - > add ( LF_CODCORR , " CODART==CODART " ) ; // aggancia il file con i codici corrispondenti
_rel - > add ( LF_CLIFO , " TIPOCF== \" F \" |CODCF==CODFORN " ) ; // aggancia il file clienti/fornitori
_arr_umart = _arr_codcorr = NULL ; // annulla file e record array su unit<69> di misura articoli e codici corrispondenti
_umart = _codcorr = NULL ;
add_cursor ( new TCursor ( _rel ) ) ; // costruisce il cursore sulla relazione e lo passa alla stampa
1996-06-27 09:43:00 +00:00
add_file ( LF_ANAMAG ) ; // notifica il file principale alla stampa
1995-09-12 09:08:09 +00:00
enable_print_menu ( ) ; // abilita il men<65> di stampa
enable_setprint_menu ( ) ; // abilita il men<65> di settaggio della stampa
return TRUE ;
}
bool TStampa_anagrafica_magazzino : : user_destroy ( ) {
if ( _st_codcorr ) { // se <20> abilitata la stampa dei codici corrispondenti vengono chiusi i file relativi
delete _arr_codcorr ; // distrugge il record array sui codici corrispondenti
delete _codcorr ; // distrugge il file dei codici corrispondenti
}
if ( _st_umart ) { // se <20> abilitata la stampa delle unit<69> di misura vengono chiusi i file relativi
delete _umart ; // distrugge il file delle unit<69> di misura degli articoli
delete _arr_umart ; // distrugge il record array sulle unit<69> di misura degli articoli
}
delete _rel ; // distrugge la relazione principale
return TRUE ;
}
bool TStampa_anagrafica_magazzino : : set_print ( int ) {
TMask mask ( " ve3400 " ) ; // istanzia la maschera di selezione del filtro di stampa
if ( mask . run ( ) = = K_ENTER ) { // lancia la maschera, se viene confermata vengono trovati gli estremi del cursore
_st_umart = mask . get_bool ( F_ST_UMART ) ; // legge il booleano di stampa delle unit<69> di misura
_st_codcorr = mask . get_bool ( F_ST_CODCORR ) ; // legge il booleano di stampa dei codici corrispondenti
_st_fisc = mask . get_bool ( F_ST_FISC ) ; // legge il booleano di stampa dei dati fiscali
TLocalisamfile & anagr = _rel - > lfile ( ) ; // prende il file principale
TRectype da ( anagr . curr ( ) ) , a ( anagr . curr ( ) ) ; // prende due copie del record del file principale
da . zero ( ) ; // azzera il record di inizio
a . zero ( ) ; // azzera il record di fine
if ( mask . get ( F_CODART_1 ) . not_empty ( ) ) { // se il campo "dall'articolo..." non <20> vuoto viene trovato il record di inizio
anagr . zero ( ) ; // svuota il record corrente
anagr . put ( " CODART " , mask . get ( F_CODART_1 ) ) ; // compone la chiave
if ( anagr . read ( ) = = NOERR ) da = anagr . curr ( ) ; // si posiziona, se il record esiste il record iniziale viene riempito
}
if ( mask . get ( F_CODART_2 ) . not_empty ( ) ) { // se il campo "all'articolo..." non <20> vuoto viene trovato il record di fine
anagr . zero ( ) ; // svuota il record corrente
anagr . put ( " CODART " , mask . get ( F_CODART_2 ) ) ; // compone la chiave
if ( anagr . read ( ) = = NOERR ) a = anagr . curr ( ) ; // si posiziona, se il record esiste il record finale viene riempito
}
current_cursor ( ) - > setregion ( da , a ) ; // viene settata la regione del cursore
if ( _st_umart ) { // se la stampa delle unit<69> di misura <20> abilitata vengono aperti i file relativi
_umart = new TLocalisamfile ( LF_UMART ) ; // crea il file sulle unit<69> di misura dell'articolo
_arr_umart = new TRecord_array ( LF_UMART , " NRIGA " ) ; // crea il record array sulle unit<69> di misura degli articoli
}
if ( _st_codcorr ) { // se la stampa dei codici corrispondenti <20> abilitata vengono aperti i file relativi
_codcorr = new TLocalisamfile ( LF_CODCORR ) ; // crea il file con i codici corrispondenti dell'articolo
_arr_codcorr = new TRecord_array ( LF_CODCORR , " NRIGA " ) ; // crea il record array sui codici corrispondenti
}
force_setpage ( ) ; // forza il lancio della set_page() ad ogni record del file da stampare
disable_links ( ) ; // disabilita tutti i link ipertestuali
1996-11-30 12:16:55 +00:00
_anagr_link_id = enable_link ( " Collegamento a anagrafica di magazzino " , ' b ' ) ; // abilita il collegamento all'anagrafica di magazzino
1995-09-12 09:08:09 +00:00
return TRUE ;
} else return FALSE ;
}
/* 1 1 1 1
1996-11-30 12:16:55 +00:00
1 2 3 4 5 6 7 8 9 0 1 2 3
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
1995-09-12 09:08:09 +00:00
1996-11-30 12:16:55 +00:00
Prima riga
CODART T DESCR GRMER GRMERC - DESCR
12345678901234567890 1 12345678901234567890123456789012345678901234567890 12345 12345678901234567890123456789012345678901234567890
1995-09-12 09:08:09 +00:00
1996-11-30 12:16:55 +00:00
Righe successive
CODARTALT T nota " Codice alternativo " UM UM - FC GRMER GRMERC - DESCR
12345678901234567890 1 123456789012345678 12 1234567890 , 12345 12345 12345678901234567890123456789012345678901234567890
1995-09-12 09:08:09 +00:00
1996-11-30 12:16:55 +00:00
Penultima riga
CODCF CODCF - RAGSOC COSTOST UP PESO TARA
12345 12345678901234567890123456789012345678901234567890 123456789012345 , 67890 12 123456789012345 , 67890 123456789012345 , 67890
1995-09-12 09:08:09 +00:00
1996-11-30 12:16:55 +00:00
Ultima riga
PPCONF PPCOLLO AP RD AF RAGFI C CCA GRP CON SOTTOC CCV GRP CON SOTTOC CLASSDOG IVA IVAR
123456789012345 , 67890 123456789012345 , 67890 12 12 12 12345 1 123 123 123 123456 123 123 123 123456 1234567890 1234 1234
1995-09-12 09:08:09 +00:00
1996-11-30 12:16:55 +00:00
*/
1995-09-12 09:08:09 +00:00
void TStampa_anagrafica_magazzino : : preprocess_header ( )
{
1996-11-30 12:16:55 +00:00
TString separator ( 132 ) ;
separator . fill ( ' - ' ) ;
1995-09-12 09:08:09 +00:00
reset_header ( ) ; // l'header viene resettato
int i = 1 ; // contatore delle linee
const long firm = get_firm ( ) ; // legge l'id della ditta corrente
TLocalisamfile ditte ( LF_NDITTE ) ; // apre il file ditte
ditte . zero ( ) ; // vuota il record
ditte . put ( " CODDITTA " , firm ) ; // riempie la chiave
if ( ditte . read ( ) = = NOERR ) { // se il record della ditta viene trovato viene settato l'header
const TString & s = ditte . get ( " RAGSOC " ) ; // legge la ragione sociale della ditta
set_header ( i , " Ditta %ld %s " , firm , ( const char * ) s ) ; // setta il nome e l'id della ditta della prima linea dell'header
}
1996-11-30 12:16:55 +00:00
set_header ( i , " @125gPag @# " ) ; // la prima linea contiene, sicuramente, il numero di pagina
set_header ( + + i , separator ) ;
1995-09-12 09:08:09 +00:00
set_header ( + + i , " Codice articolo@22gT@24gDescrizione@75gGrMer@81gDescrizione gruppo merceologico " ) ; // setta la linea successiva dell'header
if ( _st_umart | | _st_codcorr ) set_header ( + + i , " " ) ; // crea una linea vuota se almeno una stampa condizionale <20> abilitata
if ( _st_codcorr ) set_header ( i , " Cod. art. altern. " ) ; // se <20> abilitata la stampa dei codici corrispondenti l'header lo indica
if ( _st_umart ) set_header ( i , " @50gUM@53gFatt. conv. " ) ; // se <20> abilitata la stampa delle unit<69> di misura l'header lo indica
set_header ( + + i , " Forn.@7gRagione sociale@58gCosto standard@83gPeso@105gTara " ) ; // la linea successiva contiene il fornitore e altri dati
if ( _st_umart ) set_header ( i , " @80gUP " ) ; // su questa linea viene indicata anche l'unit<69> di misura del peso (se abilitata)
set_header ( + + i , " Pezzi x conf.@23gPezzi x collo@45gAR@48gRD " ) ; // l'ultima linea d'header contiene i pezzi per confezione e altri dati
if ( _st_fisc ) set_header ( i , " @51gAF@54gRagFs@60gC@62gCCA@66gGrA@70gCnA@74gSottCA@81gCCV@85gGrV@89gCnV@93gSottCV@100gClasseDog@111gIva@116gIvaR " ) ; // aggiunge i dati fiscali sull'ultima linea
1996-11-30 12:16:55 +00:00
set_header ( + + i , separator ) ;
1995-09-12 09:08:09 +00:00
set_header ( + + i , " " ) ;
}
void TStampa_anagrafica_magazzino : : set_page ( int file , int ) {
1996-06-27 09:43:00 +00:00
if ( file = = LF_ANAMAG ) { // se il file in stampa non <20> il file principale non c'<27> nulla da fare
1995-09-12 09:08:09 +00:00
TLocalisamfile & anagr = _rel - > lfile ( ) ; // prende il riferimento al file principale
1996-11-30 12:16:55 +00:00
//set_row(1, "$[g]@20s$[n]@22g@1s@24g@50s@75g@5s@81g@50s", FLD(LF_ANAMAG, "CODART"), FLD(LF_ANAMAG, "TIPO"), FLD(LF_ANAMAG, "DESCR"), FLD(LF_ANAMAG, "GRMERC1"), FLD(-GMC1, "S0")); // imposta la prima linea di dati
set_row ( 1 , " $[b]@20s$[n]@22g@1s@24g@50s@75g@5s@81g@50s " ,
FLD ( LF_ANAMAG , " CODART " ) , FLD ( LF_ANAMAG , " TIPO " ) , FLD ( LF_ANAMAG , " DESCR " ) ,
FLD ( LF_ANAMAG , " GRMERC " ) , FLD ( - GMC , " S0 " ) ) ; // imposta la prima linea di dati
int n_codcorr = 0 , n_umart = 0 , n_gmc = 1 ; // (anagr.get("GRMERC2").not_empty())?(1):(0)+(anagr.get("GRMERC3").not_empty())?(1):(0); // legge il numero di gruppi merc.
1995-09-12 09:08:09 +00:00
if ( _st_codcorr ) { // se <20> abilitata la stampa dei codici corrispondenti viene letto il numero di codici presenti, altrimenti viene lasciato a 0
_codcorr - > zero ( ) ; // il record corrente del file dei codici corrispondenti viene vuotato
_codcorr - > put ( " CODART " , anagr . get ( " CODART " ) ) ; // viene composta la chiave
_arr_codcorr - > read ( _codcorr - > curr ( ) ) ; // il record array dei codici viene caricato
n_codcorr = _arr_codcorr - > rows ( ) ; // viene settato il numero di codici trovato
}
if ( _st_umart ) { // se <20> abilitata la stampa delle unit<69> di misura viene letto il numero di unit<69> di mis. da stampare, altrimenti viene lasciato a 0
_umart - > zero ( ) ; // il record corrente del file delle unit<69> di misura viene vuotato
_umart - > put ( " CODART " , anagr . get ( " CODART " ) ) ; // viene composta la chiave
_arr_umart - > read ( _umart - > curr ( ) ) ; // il record array delle unit<69> di misura viene caricato
n_umart = _arr_umart - > rows ( ) ; // viene settato il numero di unit<69> di misura trovate
}
int n_max = max3 ( n_gmc , n_codcorr , n_umart ) ; // viene trovato il maggiore dei tre contatori (gruppi merc., unit<69> di mis. e codici corrisp.)
for ( int i = 1 ; i < = n_max ; i + + ) { // ciclo sul maggiore dei contatori
set_row ( i + 1 , " " ) ; // vuota la linea di stampa corrente
if ( i < = n_codcorr ) { // se ci sono ancora codici corrispondenti gli spazi relativi della riga vengono riempiti
TString codartalt ( _arr_codcorr - > row ( i , FALSE ) . get ( " CODARTALT " ) ) ; // legge il codice corrispondente dell'articolo
TString tipo ( _arr_codcorr - > row ( i , FALSE ) . get ( " TIPO " ) ) ; // legge il tipo
set_row ( i + 1 , " @1g%-20s@22g%1s@24gCodice alternativo " , ( const char * ) codartalt , ( const char * ) tipo ) ; // setta gli spazi della riga con i valori letti
}
if ( i < = n_umart ) { // se ci sono ancora unit<69> di misura gli spazi relativi della riga vengono riempiti
TString um ( _arr_umart - > row ( i , FALSE ) . get ( " UM " ) ) ; // legge l'id dell'unit<69> di misura
real fc ( _arr_umart - > row ( i , FALSE ) . get_real ( " FC " ) ) ; // legge il suo fattore di conversione
set_row ( i + 1 , " @50g%-2s@53g%-s " , ( const char * ) um , fc . string ( 10 , 5 ) ) ; // setta gli spazi della riga con i valori letti
}
1996-11-30 12:16:55 +00:00
//if (i<=n_gmc) { // se ci sono ancora gruppi merceologici gli spazi relativi della riga vengono riempiti
// TString grmerc, descr; // istanzia le due variabili per codice del gruppo e descrizione
// if (i==1) { // se <20> il primo deve essere letto dal secondo campo GRMERC del file dell'anagrafica
// grmerc= anagr.get("GRMERC2"); // legge il codice del gruppo
// descr= _rel->lfile(-GMC2).get("S0"); // legge la sua descrizione dalla tabella
// } else { // se <20> il secondo deve essere letto dal terzo campo GRMERC del file dell'anagrafica
// grmerc= anagr.get("GRMERC3"); // legge il codice del gruppo
// descr= _rel->lfile(-GMC3).get("S0"); // legge la sua descriziona dalla tabella
// }
// set_row(i+1, "@75g%-5s@81g%-50s", (const char *)grmerc, (const char *)descr);
//}
1995-09-12 09:08:09 +00:00
}
1996-11-30 12:16:55 +00:00
set_row ( n_max + 2 , " @5s@7g@50s@58g@pn@83g@pn@105g@pn " ,
FLD ( LF_ANAMAG , " CODFORN " ) , FLD ( LF_CLIFO , " RAGSOC " ) ,
FLD ( LF_ANAMAG , " COSTSTD " , " ###.###.###,@@ " ) , FLD ( LF_ANAMAG , " PESO " , " #########,@@@@@ " ) ,
FLD ( LF_ANAMAG , " TARA " ) , " #########,@@@@@ " ) ; // imposta la penultima linea
1996-06-27 09:43:00 +00:00
if ( _st_umart ) set_row ( n_max + 2 , " @80g@2s " , FLD ( LF_ANAMAG , " UMP " ) ) ; // se <20> abilitata la stampa delle unit<69> di misura aggiunge l'u.m. del peso
1996-11-30 12:16:55 +00:00
set_row ( n_max + 3 , " @pn@23g@pn@45g@f@48g@f " ,
FLD ( LF_ANAMAG , " PPCONF " , " #########,@@@@@ " ) , FLD ( LF_ANAMAG , " PPCOLLO " , " #########,@@@@@ " ) ,
FLD ( LF_ANAMAG , " ARTPROD " ) , FLD ( LF_ANAMAG , " RIORDINO " ) ) ; // imposta l'ultima linea
1995-09-12 09:08:09 +00:00
if ( _st_fisc ) set_row ( n_max + 3 , " @51g@f@54g@5s@60g@1s@62g@3s@66g@3n@70g@3n@74g@6n@81g@3s@85g@3n@89g@3n@93g@6n@100g@10s@111g@4s@116g@4s " , // imposta i dati fiscali sull'ultima linea
1996-06-27 09:43:00 +00:00
FLD ( LF_ANAMAG , " ARTFIS " ) , FLD ( LF_ANAMAG , " RAGGFIS " ) , FLD ( LF_ANAMAG , " CLASSEFIS " ) ,
FLD ( LF_ANAMAG , " CATCONA " ) , FLD ( LF_ANAMAG , " GRUPPOA " ) , FLD ( LF_ANAMAG , " CONTOA " ) , FLD ( LF_ANAMAG , " SOTTOCA " ) ,
FLD ( LF_ANAMAG , " CATCONV " ) , FLD ( LF_ANAMAG , " GRUPPOV " ) , FLD ( LF_ANAMAG , " CONTOV " ) , FLD ( LF_ANAMAG , " SOTTOCV " ) ,
FLD ( LF_ANAMAG , " CLASSDOG " ) , FLD ( LF_ANAMAG , " CODIVA " ) , FLD ( LF_ANAMAG , " CODIVAR " ) ) ;
1995-09-12 09:08:09 +00:00
set_row ( n_max + 4 , " " ) ; // aggiunge due linee vuote
set_row ( n_max + 5 , " " ) ;
}
}
void TStampa_anagrafica_magazzino : : process_link ( int id , const char * text ) {
if ( id = = _anagr_link_id ) {
TString body = " 1| " ; // istanzia la stringa per il corpo del messaggio e gli aggiunge il numero della chiave e il separatore
body < < text ; // aggiunge al corpo del messaggio il codice dell'articolo per riempire la chiave
TMessage msg ( ANAMAG_APP , MSG_LN , ( const char * ) body ) ; // crea il messaggio per l'applicazione di anagrafica di magazzino
msg . send ( ) ; // invia il messaggio
TExternal_app ve2_3 ( ANAMAG_APP ) ; // crea l'applicazione esterna dell'anagrafica di magazzino
ve2_3 . run ( ) ; // lancia l'applicazione esterna
}
}
1995-10-17 16:49:47 +00:00
int ve3400 ( int argc , char * * argv ) {
1995-09-12 09:08:09 +00:00
TStampa_anagrafica_magazzino a ;
a . run ( argc , argv , " Stampa anagrafica magazzino " ) ;
return 0 ;
}