#include #include #include "ve3200.h" #define UMS1 201 #define UMS2 202 // !! Manca la gestione della maschera di selezione del tipo di archivio nel caso non sia // specificato sulla linea di comando // !! Manca la gestione della maschera di filtro (con i relativi handler sui vari tipi di // abilitazioni incrociate) // !! Manca la selezione del file in corso di stampa nella set_page() e la relativa impostazione // della pagina // !! Manca la creazione della struttura della stampa dei dati // !! Manca tutto il resto! class TStampa_condizioni_vendita: public TPrint_application { TRelation *_rel; // relazione principale 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_condizioni_vendita::user_create() { _rel= new TRelation(LF_CONDV); // crea la relazione principale _rel->add(LF_RCONDV, "TIPO==TIPO|CATVEN==CATVEN|TIPOCF==TIPOCF|CODCF==CODCF|COD==COD"); _rel->add("%CVE", "CODTAB==CATVEN"); _rel->add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF"); _rel->add("%VAL", "CODTAB==CODVAL"); _rel->add("%UMS", "CODTAB==UM", 1, LF_RCONDV, UMS1); _rel->add("%UMS", "CODTAB==UMOM", 1, LF_RCONDV, UMS2); add_cursor(new TCursor(_rel)); // costruisce il cursore sulla relazione e lo passa alla stampa add_file(LF_CONDV); // notifica il file della testata alla stampa add_file(LF_RCONDV); // notifica il file delle righe alla stampa enable_print_menu(); // abilita il menù di stampa enable_setprint_menu(); // abilita il menù di settaggio della stampa return TRUE; } bool TStampa_condizioni_vendita::user_destroy() { delete _rel; // distrugge la relazione principale return TRUE; } bool TStampa_condizioni_vendita::set_print(int) { TMask mask("ve3200x"); // 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 /* 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", 'g'); // 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 */ void TStampa_condizioni_vendita::preprocess_header() { /*reset_header(); // l'header viene resettato int i= 1; // contatore delle linee set_header(i, "@125gPag @#"); // la prima linea contiene, sicuramente, il numero di pagina 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 } 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 è abilitata if (_st_codcorr) set_header(i, "Cod. art. altern."); // se è abilitata la stampa dei codici corrispondenti l'header lo indica if (_st_umart) set_header(i, "@50gUM@53gFatt. conv."); // 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, ""); // aggiunge due linee vuote set_header(++i, ""); */ } void TStampa_condizioni_vendita::set_page(int file, int) { /*if (file== LF_ANAGR) { // 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_ANAGR, "CODART"), FLD(LF_ANAGR, "TIPO"), FLD(LF_ANAGR, "DESCR"), FLD(LF_ANAGR, "GRMERC1"), FLD(-GMC1, "S0")); // imposta la prima linea di dati int n_codcorr= 0, n_umart= 0, n_gmc= (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 } int n_max= max3(n_gmc, n_codcorr, n_umart); // viene trovato il maggiore dei tre contatori (gruppi merc., unità 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à di misura gli spazi relativi della riga vengono riempiti TString um(_arr_umart->row(i, FALSE).get("UM")); // legge l'id dell'unità 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 } 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 è 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 è 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); } } set_row(n_max+2, "@5s@7g@50s@58g@15.5n@83g@15.5n@105g@15.5n", FLD(LF_ANAGR, "CODFORN"), FLD(LF_CLIFO, "RAGSOC"), FLD(LF_ANAGR, "COSTSTD"), FLD(LF_ANAGR, "PESO"), FLD(LF_ANAGR, "TARA")); // imposta la penultima linea if (_st_umart) set_row(n_max+2, "@80g@2s", FLD(LF_ANAGR, "UMP")); // se è abilitata la stampa delle unità di misura aggiunge l'u.m. del peso set_row(n_max+3, "@15.5n@23g@15.5n@45g@f@48g@f", FLD(LF_ANAGR, "PPCONF"), FLD(LF_ANAGR, "PPCOLLO"), FLD(LF_ANAGR, "ARTPROD"), FLD(LF_ANAGR, "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_ANAGR, "ARTFIS"), FLD(LF_ANAGR, "RAGGFIS"), FLD(LF_ANAGR, "CLASSEFIS"), FLD(LF_ANAGR, "CATCONA"), FLD(LF_ANAGR, "GRUPPOA"), FLD(LF_ANAGR, "CONTOA"), FLD(LF_ANAGR, "SOTTOCA"), FLD(LF_ANAGR, "CATCONV"), FLD(LF_ANAGR, "GRUPPOV"), FLD(LF_ANAGR, "CONTOV"), FLD(LF_ANAGR, "SOTTOCV"), FLD(LF_ANAGR, "CLASSDOG"), FLD(LF_ANAGR, "CODIVA"), FLD(LF_ANAGR, "CODIVAR")); set_row(n_max+4, ""); // aggiunge due linee vuote set_row(n_max+5, ""); } */ } void TStampa_condizioni_vendita::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 } */ } int ve3200(int argc, char* argv[]) { TStampa_condizioni_vendita a; a.run(argc, argv, "Stampa condizioni vendita"); return 0; }