Files correlati : Ricompilazione Demo : [ ] Commento : iniziate stampe listini moderne git-svn-id: svn://10.65.10.50/trunk@19482 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			266 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			266 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include <printapp.h>
 | |
| #include <mask.h>
 | |
| #include <recarray.h>
 | |
| 
 | |
| #include "ve3.h"
 | |
| #include "ve3400.h"
 | |
| 
 | |
| #define GMC 101
 | |
| //#define GMC1 101
 | |
| //#define GMC2 102
 | |
| //#define GMC3 103
 | |
| 
 | |
| #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à 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 bool process_link(int, const char *);
 | |
|   virtual print_action postprocess_print(int, int);
 | |
| public:
 | |
|   // @cmember Disabilita la verifica del modulo : essendo una anagrafica, va sempre abilitata
 | |
|   virtual bool check_autorization() const 
 | |
|   {return FALSE;}
 | |
| };
 | |
| 
 | |
| 
 | |
| bool TStampa_anagrafica_magazzino::user_create() {
 | |
|   _rel= new TRelation(LF_ANAMAG); // crea la relazione principale
 | |
|   _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
 | |
|   _rel->add(LF_UMART, "CODART==CODART"); // aggancia il file con le unità 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à di misura articoli e codici corrispondenti
 | |
|   _umart= _codcorr= NULL;
 | |
|   add_cursor(new TCursor(_rel)); // costruisce il cursore sulla relazione e lo passa alla stampa
 | |
|   add_file(LF_ANAMAG); // notifica il file principale alla stampa
 | |
|   enable_print_menu(); // abilita il menù di stampa
 | |
|   enable_setprint_menu(); // abilita il menù di settaggio della stampa
 | |
|   set_magic_currency(TRUE);
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| bool TStampa_anagrafica_magazzino::user_destroy() {
 | |
|   if (_st_codcorr) { // se è 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 è abilitata la stampa delle unità di misura vengono chiusi i file relativi
 | |
|     delete _umart; // distrugge il file delle unità di misura degli articoli
 | |
|     delete _arr_umart; // distrugge il record array sulle unità 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à 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 è 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 è 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à di misura è abilitata vengono aperti i file relativi
 | |
|       _umart= new TLocalisamfile(LF_UMART); // crea il file sulle unità di misura dell'articolo
 | |
|       _arr_umart= new TRecord_array(LF_UMART, "NRIGA"); // crea il record array sulle unità di misura degli articoli
 | |
|     }
 | |
|     if (_st_codcorr) { // se la stampa dei codici corrispondenti è 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
 | |
|     _anagr_link_id= enable_link("Collegamento a anagrafica di magazzino", 'b'); // abilita il collegamento all'anagrafica di magazzino
 | |
|     return TRUE;
 | |
|   } else return FALSE;
 | |
| }
 | |
| 
 | |
| /*                                                                                                 1         1         1         1
 | |
|  1         2         3         4         5         6         7         8         9         0         1         2         3
 | |
|  123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
 | |
| 
 | |
|  Prima riga
 | |
|  CODART               T DESCR                                              GRMER GRMERC-DESCR
 | |
|  12345678901234567890 1 12345678901234567890123456789012345678901234567890 12345 12345678901234567890123456789012345678901234567890
 | |
| 
 | |
|  Righe successive
 | |
|  CODARTALT            T nota "Codice alternativo" UM UM-FC                 GRMER GRMERC-DESCR
 | |
|  12345678901234567890 1 123456789012345678        12 1234567890,12345      12345 12345678901234567890123456789012345678901234567890
 | |
| 
 | |
|  Penultima riga
 | |
|  CODCF CODCF-RAGSOC                                       COSTOST               UP PESO                  TARA
 | |
|  12345 12345678901234567890123456789012345678901234567890 123456789012345,67890 12 123456789012345,67890 123456789012345,67890
 | |
| 
 | |
|  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
 | |
| 
 | |
| */
 | |
| 
 | |
| void TStampa_anagrafica_magazzino::preprocess_header()
 | |
| {
 | |
|   TString separator(132);
 | |
|   separator.fill('-');
 | |
|   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
 | |
|   set_header(i++, ""); // riga vuota (errore PG015/4)
 | |
|   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
 | |
|   }
 | |
|   set_header(i, "@125gPag @#"); // la prima linea contiene, sicuramente, il numero di pagina
 | |
|   set_header(++i, "@44gStampa Anagrafica Articoli di Magazzino");
 | |
|   set_header(++i, separator);
 | |
|   set_header(++i, "Codice articolo@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 è abilitata
 | |
|   if (_st_codcorr) set_header(i, "Cod. art. altern.@20gTipo"); // se è abilitata la stampa dei codici corrispondenti l'header lo indica
 | |
|   if (_st_umart) set_header(i, "@50gUM@53gFatt. conv.@80gPrezzo"); // se è abilitata la stampa delle unità 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à 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
 | |
|   set_header(++i, separator);
 | |
|   set_header(++i, "");
 | |
| }
 | |
| 
 | |
| void TStampa_anagrafica_magazzino::set_page(int file, int) {
 | |
|   if (file== LF_ANAMAG) // se il file in stampa non è il file principale non c'è nulla da fare
 | |
|   { 
 | |
|     
 | |
|     TLocalisamfile &anagr= _rel->lfile(); // prende il riferimento al file principale
 | |
|     //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
 | |
|     word 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.
 | |
|     if (_st_codcorr) { // se è 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 è abilitata la stampa delle unità di misura viene letto il numero di unità di mis. da stampare, altrimenti viene lasciato a 0
 | |
|       _umart->zero(); // il record corrente del file delle unità di misura viene vuotato
 | |
|       _umart->put("CODART", anagr.get("CODART")); // viene composta la chiave
 | |
|       _arr_umart->read(_umart->curr()); // il record array delle unità di misura viene caricato
 | |
|       n_umart= _arr_umart->rows(); // viene settato il numero di unità di misura trovate
 | |
|     }
 | |
|     word n_max= max3(n_gmc, n_codcorr, n_umart); // viene trovato il maggiore dei tre contatori (gruppi merc., unità di mis. e codici corrisp.)
 | |
|     if (printer().rows_left() < n_max+5)
 | |
|       printer().formfeed();
 | |
|     set_row(1, "$[b]@20s$[n]@24g@50s@75g@5s@81g@50s",
 | |
|             FLD(LF_ANAMAG, "CODART"),FLD(LF_ANAMAG, "DESCR"), 
 | |
|             FLD(LF_ANAMAG, "GRMERC"), FLD(-GMC, "S0")); // imposta la prima linea di dati
 | |
|     
 | |
|     
 | |
|     word i = _st_codcorr ? _arr_codcorr->first_row() : 0;
 | |
|     word j = _st_umart ? _arr_umart->first_row() : 0;
 | |
|       
 | |
|     for (word k=1; k<=n_max; k++)
 | |
|     {
 | |
|       set_row(k+1, ""); // vuota la linea di stampa corrente
 | |
|       if (_st_codcorr && _arr_codcorr->exist(i))
 | |
|       {
 | |
|         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(k+1, "@1g%-20s@22g%1s@24gCodice alternativo", (const char *)codartalt, (const char *)tipo); // setta gli spazi della riga con i valori letti
 | |
|         i = _arr_codcorr->succ_row(i);
 | |
|       }
 | |
|       if (_st_umart && _arr_umart->exist(j))
 | |
|       {
 | |
|         TString um(_arr_umart->row(j, FALSE).get("UM")); // legge l'id dell'unità di misura
 | |
|         real fc(_arr_umart->row(j, FALSE).get_real("FC")); // legge il suo fattore di conversione
 | |
|         real prezzo(_arr_umart->row(j,FALSE).get_real("PREZZO"));  // prezzo relativo
 | |
|         set_row(k+1, "@50g%-2s@53g%-s", (const char *)um, fc.string("##.###,@@@@@")); // setta gli spazi della riga con i valori letti
 | |
|         set_row(k+1, "@70g%s", prezzo.string("###.###.###,@@@"));
 | |
|         j = _arr_umart->succ_row(j);
 | |
|       }
 | |
|     }
 | |
|     
 | |
|     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
 | |
|     if (_st_umart) 
 | |
|       set_row(n_max+2, "@80g@2s", FLD(LF_ANAMAG, "UMP")); // se è abilitata la stampa delle unità di misura aggiunge l'u.m. del peso
 | |
|     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
 | |
|     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
 | |
|                           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"));
 | |
|     set_row(n_max+4, ""); // aggiunge due linee vuote
 | |
|     set_row(n_max+5, "");
 | |
|   }
 | |
| }
 | |
| 
 | |
| print_action TStampa_anagrafica_magazzino::postprocess_print(int file, int counter)
 | |
| { 
 | |
|   if (file== LF_ANAMAG) // se il file in stampa non è il file principale non c'è nulla da fare
 | |
|     printer().formfeed(); 
 | |
|   return NEXT_PAGE; 
 | |
| }
 | |
| 
 | |
| bool TStampa_anagrafica_magazzino::process_link(int id, const char *text) 
 | |
| {
 | |
|   if (id == _anagr_link_id) 
 | |
|   {
 | |
|     TRectype anamag(LF_ANAMAG);
 | |
|     anamag.put("CODART", text);
 | |
|     return anamag.edit(LF_ANAMAG, NULL, ANAMAG_APP);
 | |
|   }
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| int ve3400(int argc, char **argv) 
 | |
| {
 | |
|   TStampa_anagrafica_magazzino a;
 | |
|   
 | |
|   a.run(argc, argv, "Stampa anagrafica magazzino");
 | |
|   return 0;
 | |
| }
 |