#include #include #include #include #include #include "veconf.h" #include "ve3200.h" #define RCONDV_APP "ve2 -2" #define DESTROY(x) { ((TEditable_field &)mask.field(x)).reset_key(1); mask.hide(x); } #define KILL(x) { ((TEditable_field &)mask.field(x)).reset_key(1); mask.disable(x); } #define CVE 201 #define VAL 202 #define UMS1 203 #define UMS2 204 #define GMC1 205 #define GMC2 206 #define RFA 207 #define ART1 208 #define ART2 209 class TStampa_condizioni_vendita: public TPrint_application { TRelation *_rel; // relazione principale TString16 _condven; // stringa che indica il tipo di archivio bool _codlis_catven; // booleano di abilitazione della categoria di vendita nella chiave dei listini bool _codcon_codcf; // booleano di abilitazione del codice cliente/fornitore nella chiave dei contratti bool _listval; // booleano di abilitazione della stampa dei listini in valuta bool _testacomp, _righecomp; // booleani di selezione della stampa completa per testata e righe; bool _testastamp; // booleano di testata completa già stampata bool _gest_val, _gest_um, _gest_sca, _gest_so; // booleani per l'abilitazione di valute, unità di misura, scaglioni e sconti/omaggi //int _rcondv_link_id; // id del link ipertestuale all'anagrafica di magazzino protected: static bool tipo_handler(TMask_field& f, KEY k); 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 preprocess_footer(void); //virtual void process_link(int, const char *); }; inline TStampa_condizioni_vendita& app() {return (TStampa_condizioni_vendita&) main_app();} // Gruppi della maschera: // 1 : Listini // 2 : Contratti // 3 : Offerte // 4 : Articoli(listini)[DA..A] // 5 : Gr.Merc(listini)[DA..A] // 6 : Raggr.Fisc(listini)[DA..A] // 7 : Articoli(contratti)[DA..A] // 8 : Gr.Merc(contratti)[DA..A] // 9 : Raggr.Fisc(contratti)[DA..A] // 10 : Articoli(offerte)[DA..A] // 11 : Gr.Merc(offerte)[DA..A] // 12 : Raggr.Fisc(offerte)[DA..A] bool TStampa_condizioni_vendita::tipo_handler(TMask_field& f, KEY k) { if (k==K_SPACE) { TMask& m = f.mask(); const char s = f.get()[0]; const char arc = app()._condven[0]; int base = 3; int other1,other2; if (arc=='C') base = 6; else if (arc=='O') base = 9; if (s == 'A') { base+=1; other1=base+1; other2=base+2;} // articoli else if (s == 'G') {base+=2; other1=base+1; other2=base-1;} // gr. merc else {base += 3; other1=base-1; other2=base-2;}// raggr. fiscale m.reset(-base); m.show(-base); m.hide(-other1); m.hide(-other2); } return TRUE; } bool TStampa_condizioni_vendita::user_create() { bool gotcha= FALSE; // booleano di avvenuta inizializzazione int indice; // indice delle variabili di configurazione per le abilitazioni _condven= "*"; // inizializzazione dell'indicatore del tipo di archivio if (argc()>2) _condven= argv(2); // se c'è, prende il tipo di archivio dalla linea di comando else { TMask choose("ve3200"); // 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 TConfig prassid(CONFIG_DITTA, "ve"); // apre il file di configurazione della ditta corrente switch (_condven[0]) { case 'L': // listini indice= A_LISTINI; // setta l'indice dell'archivio listini if (!(prassid.get_bool("GES", NULL, indice))) error_box("L'archivio Listini non è abilitato"); // controlla che l'archivio listini sia abilitato else { _codlis_catven= prassid.get_bool("GESLISCV"); // setta il booleano di abilitazione delle categoria di vendita gotcha= TRUE; } break; case 'C': // contratti indice= A_CONTRATTI; // setta l'indice dell'archivio contratti if (!(prassid.get_bool("GES", NULL, indice))) error_box("L'archivio Contratti non è abilitato"); // controlla che l'archivio contratti sia abilitato else { _codcon_codcf= prassid.get_bool("GESCONCC"); // setta il booleano di abilitazione delle categoria di vendita gotcha= TRUE; } break; case 'O': // offerte indice= A_OFFERTE; // setta l'indice dell'archivio offerte if (!(prassid.get_bool("GES", NULL, indice))) error_box("L'archivio Offerte non è abilitato"); // controlla che l'archivio offerte sia abilitato else 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 è stato selezionato correttamente un archivio completa l'inizializzazione _gest_um= prassid.get_bool("GESUM", NULL, indice); // setta il booleano di abilitazione delle unità di misura _gest_sca= prassid.get_bool("GESSCA", NULL, indice); // setta il booleano di abilitazione degli scaglioni _gest_so= prassid.get_bool("GESSO", NULL, indice); // setta il booleano di abilitazione degli sconti/omaggi _gest_val= prassid.get_bool("GESVAL"); // legge il booleano di abilitazione della gestione delle valute _rel= new TRelation(LF_RCONDV); // crea la relazione principale _rel->add(LF_ANAMAG, "CODART==CODRIGA", 1, LF_RCONDV, ART1); _rel->add(LF_ANAMAG, "CODART==CODARTOM", 1, LF_RCONDV, ART2); _rel->add("GMC", "CODTAB[1,3]==CODRIGA", 1, LF_RCONDV, GMC1); _rel->add("GMC", "CODTAB[4,5]==CODRIGA", 1, LF_RCONDV, GMC2); _rel->add("RFA", "CODTAB==CODRIGA", 1, LF_RCONDV, RFA); _rel->add(LF_CONDV, "TIPO==TIPO|CATVEN==CATVEN|TIPOCF==TIPOCF|CODCF==CODCF|COD==COD"); _rel->add("CVE", "CODTAB==CATVEN", 1, LF_CONDV, CVE); _rel->add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF", 1, LF_CONDV); _rel->add("%VAL", "CODTAB==CODVAL", 1, LF_CONDV, VAL); _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_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 (gotcha); } bool TStampa_condizioni_vendita::user_destroy() { delete _rel; // distrugge la relazione principale return TRUE; } bool TStampa_condizioni_vendita::set_print(int) { TMask mask("ve3200x"); mask.set(F_TIPO, _condven); // settaggio del campo di tipo archivio mask.set_handler(F_TIPORIGHE,tipo_handler); switch (_condven[0]) { case 'L': // listini mask.show(-1);// nasconde i campi dei listini mask.hide(-5);// nasconde i campi del gr. merc mask.hide(-6);// nasconde i campi del raggr. fisc. mask.hide(-2);// nasconde i campi dei contratti mask.hide(-3);// nasconde i campi delle offerte DESTROY(F_C_COD); // eliminazione campi di altri archivi DESTROY(F_C_TIPOCF); DESTROY(F_C_CODCF); DESTROY(F_O_COD); if (!_codlis_catven) KILL(F_L_CATVEN); // disabilita condizionalmente le categorie di vendita if (!_gest_val) KILL(F_L_LISTVALUTA); // disabilita condizionalmente la gestione delle valute break; case 'C': // contratti mask.show(-2);// nasconde i campi dei contratti mask.hide(-8);// nasconde i campi del gr. merc mask.hide(-9); // nasconde i campi del raggr. fisc. mask.hide(-1);// nasconde i campi dei listini mask.hide(-3);// nasconde i campi delle offerte DESTROY(F_L_COD); // settaggio dei campi da eliminare DESTROY(F_L_CATVEN); DESTROY(F_L_LISTVALUTA); DESTROY(F_O_COD); if (!_codcon_codcf) { // disabilita condizionalmente i clienti/fornitori KILL(F_C_TIPOCF); KILL(F_C_CODCF); } break; case 'O': // offerte mask.show(-3); // nasconde i campi delle offerte mask.hide(-11);// nasconde i campi del gr. merc mask.hide(-12);// nasconde i campi del raggr. fisc. mask.hide(-1);// nasconde i campi dei listini mask.hide(-2);// nasconde i campi dei contratti DESTROY(F_L_COD); // settaggio dei campi da eliminare DESTROY(F_L_CATVEN); DESTROY(F_L_LISTVALUTA); DESTROY(F_C_TIPOCF); DESTROY(F_C_CODCF); DESTROY(F_C_COD); break; } if (mask.run()== K_ENTER) { // lancia la maschera, se viene confermata vengono trovati gli estremi del cursore _testastamp= FALSE; // azzera il flag di testa già stampata _listval= mask.get_bool(F_L_LISTVALUTA); // legge lo stato del checkbox di abilitazione dei listini in valuta _testacomp= mask.get_bool(F_TESTACOMP); // legge l'abilitazione della stampa completa della testata _righecomp= mask.get_bool(F_RIGHECOMP); // legge l'abilitazione della stampa completa delle righe TLocalisamfile &rcondv= _rel->lfile(); // prende il file principale TRectype da(rcondv.curr()); // prepara il record di inizio regione da.zero(); da.put("TIPO", _condven); switch (_condven[0]) { // impostazione della chiave della testata case 'L': // listini if (_codlis_catven) da.put("CATVEN", mask.get(F_L_CATVEN)); else da.blank("CATVEN"); // riempie il campo di blank se non è gestito da.put("COD", mask.get(F_L_COD)); break; case 'C': // contratti da.blank("CATVEN"); // i campi non gestiti vengono riempiti di blank if (_codcon_codcf) { da.put("TIPOCF", mask.get(F_C_TIPOCF)); da.put("CODCF", mask.get(F_C_CODCF)); } else { da.blank("TIPOCF"); // riempie i campi di blank se non sono gestiti da.blank("CODCF"); } da.put("COD", mask.get(F_C_COD)); break; case 'O': // offerte da.blank("CATVEN"); // i campi non gestiti vengono riempiti di blank da.blank("TIPOCF"); da.blank("CODCF"); da.put("COD", mask.get(F_O_COD)); break; } TRectype a(da); // prepara il record di fine regione da.put("TIPORIGA", mask.get(F_TIPORIGHE)); da.put("CODRIGA", mask.get(F_DARIGA_A)); a.put("TIPORIGA", mask.get(F_TIPORIGHE)); a.put("CODRIGA", mask.get(F_ARIGA_A)); current_cursor()->setregion(da, a); // setta la regione sul cursore force_setpage(); // forza il lancio della set_page() ad ogni record del file da stampare disable_links(); // disabilita tutti i link ipertestuali // _rcondv_link_id= enable_link("Collegamento a righe condizioni di vendita", 'g'); // abilita il collegamento return TRUE; } else return FALSE; } /* 1 1 1 1 1 2 3 4 5 6 7 8 9 0 1 2 3 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012 CF CODCF CV COD DESCR VALIN VALFIN IL UM SC SO ST OB SUC SEQ . ...... .. ... .................................................. ..-..-.. ..-..-.. . . . . . . ... ... CVA CAMBIO DATACAM ... ...............,..... ..-..-.. */ /* 1 1 1 1 1 2 3 4 5 6 7 8 9 0 1 2 3 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012 T CODRIGA UM S QLIM PREZZO SCONTO A CIVA PERCPROV . .................... .. . ...............,..... ..................,.. ......................... . .... .....,.. UO QOM QBASE CODARTOM PROMAGGIO CODLOT E .. ...............,..... ...............,..... .................... ..................,.. ...... . */ void TStampa_condizioni_vendita::preprocess_header() { reset_header(); // l'header viene resettato int i= 1; // contatore delle linee const long firm= get_firm(); // legge l'id della ditta corrente const bool is_listino = _condven=="L"; const bool is_contratto = _condven=="C"; TString rw(132); rw.fill('-'); 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, "@1gDitta %ld %s@100gData @<", firm, (const char *)s); // setta il nome e l'id della ditta della prima linea dell'header } TLocalisamfile &condv= current_cursor()->file(LF_CONDV); i+=2; // stampa breve della testata, occupa almeno due linee set_header(i++,(const char*)rw); // setta l'header del codice, della descrizione, della validità, dei booleani, ecc. set_header(i, "@14gCod @18gDescrizione @69gVal. dal @80gal @91gIL @94gUM @97gSC @100gSO @103gST @116gSeq"); if (is_listino) { // siamo sui listini? if (_codlis_catven) set_header(i, "@11gCV"); // setta l'header della categoria di vendita set_header(i,"@109gSucc."); } if (is_contratto) { // siamo sui contratti? if (_codcon_codcf) // è abilitato il codice cliente/fornitore? set_header(i, "@1gCF @4gCod.CF"); // setta l'header di clienti/fornitori set_header(i, "@106gOB"); // setta l'header di contratto obbligatorio } if (_gest_val) // se c'è la gestione della valuta occupa altre due linee set_header(++i, "@1gVal @5gCambio @27gData cambio"); // setta l'header del codice e della descrizione if (!_righecomp) { // impostazione dell'header delle righe se non c'è la stampa esaustiva set_header(++i, "@1gT @3gCodice riga @27gS @29gQuantita' limite @51gPrezzo @73gSconto @99gA @101gIVA @106gProvvig."); // setta l'header della chiave, della quantità limite e del prezzo if ((_condven=="L") || (_condven=="O")) set_header(i, "@24gUM"); // setta l'header dell'unità di misura set_header(++i, "@1gUMO @5gQuantita' omaggio @27gQuantita' base @49gCod. art. omagg. @70gPrezzo omaggio"); // setta l'header dello sconto/omaggio if ((_condven=="C") || (_condven=="O")) set_header(i, "@92gLotto"); // setta l'header del lotto if (_condven=="O") set_header(i, "@99gEsaur."); // setta l'header dell'articolo in esaurimento } set_header(++i,(const char*)rw); set_header(++i, "@14g%3s", (const char *) condv.get("COD")); set_header(i, "@18g%s", (const char *) condv.get("DESCR")); set_header(i, "@69g%s", (const char *) condv.get("VALIN")); set_header(i, "@80g%s", (const char *) condv.get("VALFIN")); set_header(i, "@91g%s", (const char *) condv.get("IMPLORDI")); set_header(i, "@94g%s", (const char *) condv.get("GESTUM")); set_header(i, "@97g%s", (const char *) condv.get("GESTSCAGL")); set_header(i, "@100g%s", (const char *) condv.get("GESTSCO")); set_header(i, "@103g%s", (const char *) condv.get("SCONST")); set_header(i, "@116g%s",(const char *) condv.get("SEQRIC")); if (is_listino) { if (_codlis_catven) // siamo sui listini? set_header(i, "@11g%s", (const char *)(condv.get("CATVEN"))); // categoria di vendita set_header(i, "@109g%3s", (const char *)(condv.get("CODLISSUCC"))); // codice successivo } if (is_contratto) { // siamo sui contratti? if (_codcon_codcf) { // è abilitato il codice cliente/fornitore? set_header(i, "@1g%s", (const char *)condv.get("TIPOCF")); // cliente/fornitore set_header(i, "@4g%6s", (const char *)condv.get("CODCF")); // cliente/fornitore } set_header(i, "@106g%s", (const char *)(condv.get("OBBLIG"))); // booleano } if (_gest_val) { // c'è la gestione della valuta? set_header(++i, "@1g%3s", (const char *)condv.get("CODVAL")); // cambio e valuta set_header(i, "@5g%21s", (const char *)condv.get("CAMBIO")); // cambio e valuta set_header(i, "@27g%s", (const char *)condv.get("DATACAM")); // cambio e valuta } set_header(++i, ""); // aggiunge due linee vuote set_header(++i, ""); } void TStampa_condizioni_vendita::preprocess_footer() { reset_footer(); int i= 1; // indice di linea set_footer(i, ""); // salta una linea set_footer(++i, "@125gPag @#"); // l'unica linea del footer contiene il numero di pagina } void TStampa_condizioni_vendita::set_page(int file, int) { if (file== LF_RCONDV) { // se il file in stampa non è il file principale non c'è nulla da fare int i= 0; // indice di riga if ((printer().getcurrentpage()==1) && _testacomp && (!_testastamp)) { // stampa della testata in forma completa if ((_condven=="L") && _codlis_catven) set_row(++i, "Cat. di vendita: @2s @50s", FLD(LF_CONDV, "CATVEN"), FLD(-CVE, "S0")); if ((_condven=="C") && _codcon_codcf) set_row(++i, "Cliente/fornitore: @1s @6s @50s", FLD(LF_CONDV, "TIPOCF"), FLD(LF_CONDV, "CODCF"), FLD(LF_CLIFO, "RAGSOC")); set_row(++i, "Codice: @3s @50s", FLD(LF_CONDV, "COD"), FLD(LF_CONDV, "DESCR")); if (_gest_val) { set_row(++i, "Valuta: @3s @50s", FLD(LF_CONDV, "CODVAL"), FLD(-VAL, "S0")); set_row(++i, "Cambio: @15.5n (@d)", FLD(LF_CONDV, "CAMBIO"), FLD(LF_CONDV, "DATACAM")); } set_row(++i, "Validità: dal @d al @d", FLD(LF_CONDV, "VALIN"), FLD(LF_CONDV, "VALFIN")); set_row(++i, "Importi lordi: @f", FLD(LF_CONDV, "IMPLORDI")); set_row(++i, "Gestione unità di misura: @f", FLD(LF_CONDV, "GESTUM")); set_row(++i, "Gestione scaglioni: @f", FLD(LF_CONDV, "GESTSCAGL")); set_row(++i, "Gestione sconti: @f", FLD(LF_CONDV, "GESTSCO")); set_row(++i, "Gestione sconti standard: @f", FLD(LF_CONDV, "SCONST")); if (_condven=="C") set_row(++i, "Contratto obbligatorio: @f", FLD(LF_CONDV, "OBBLIG")); if (_condven=="L") set_row(++i, "Codice listino successivo: @3s", FLD(LF_CONDV, "CODLISSUCC")); set_row(++i, "Sequenza di ricerca: @4s", FLD(LF_CONDV, "SEQRIC")); set_row(++i, ""); set_row(++i, ""); _testastamp= TRUE; } if (_righecomp) { // stampa della riga in forma completa TLocalisamfile &rcondv= current_cursor()->file(); TLocalisamfile &condv= current_cursor()->file(LF_CONDV); TString tiporiga= rcondv.get("TIPORIGA"); switch (tiporiga[0]) { case 'A': set_row(++i, "Riga: @1s @20s", FLD(LF_RCONDV, "TIPORIGA"), FLD(LF_RCONDV, "CODRIGA")); set_row(++i, "Articolo: @50s", FLD(-ART1, "DESCR")); break; case 'G': set_row(++i, "Riga: @1s @3s", FLD(LF_RCONDV, "TIPORIGA"), FLD(LF_RCONDV, "CODRIGA")); set_row(++i, "Gruppo merceologico: @50s", FLD(-GMC1, "S0")); break; case 'S': set_row(++i, "Riga: @1s @2s", FLD(LF_RCONDV, "TIPORIGA"), FLD(LF_RCONDV, "CODRIGA")); set_row(++i, "Sottogruppo merceologico: @50s", FLD(-GMC2, "S0")); break; case 'R': set_row(++i, "Riga: @1s @5s", FLD(LF_RCONDV, "TIPORIGA"), FLD(LF_RCONDV, "CODRIGA")); set_row(++i, "Raggruppamento fiscale: @50s", FLD(-RFA, "S0")); break; } if (condv.get_bool("GESTUM")) set_row(++i, "Unità di misura: @2s @50s", FLD(LF_RCONDV, "UM"), FLD(-UMS1, "S0")); if (condv.get_bool("GESTSCAGL")) { set_row(++i, "Scaglione: @1s", FLD(LF_RCONDV, "NSCAGL")); set_row(++i, "Quantità limite scaglione: @pn", FLD(LF_RCONDV, "QLIM","#########,@@@@@")); } set_row(++i, "Prezzo: @pn", FLD(LF_RCONDV, "PREZZO","###.###.###,@@")); set_row(++i, "Sconto: @25s", FLD(LF_RCONDV, "SCONTO")); set_row(++i, "Addebito IVA: @f", FLD(LF_RCONDV, "ADDIVA")); set_row(++i, "Codice IVA: @4s", FLD(LF_RCONDV, "CODIVA")); set_row(++i, "Percentuale di provvigione: @pn", FLD(LF_RCONDV, "PERCPROVV","###,@@")); if (condv.get_bool("GESTSCO")) { set_row(++i, "Quantità merce omaggio: @pn", FLD(LF_RCONDV, "QOM","##########,@@@@@")); set_row(++i, "Quantità base: @pn", FLD(LF_RCONDV, "QBASE","##########,@@@@@")); set_row(++i, "Articolo omaggio: @20s @50s", FLD(LF_RCONDV, "CODARTOM"), FLD(-ART2, "DESCR")); set_row(++i, "Prezzo omaggio: @pn", FLD(LF_RCONDV, "PROMAGGIO","###.###.###,@@")); if (condv.get_bool("GESTUM")) set_row(++i, "Unità di misura quantità omaggio: @2s @50s", FLD(LF_RCONDV, "UMOM"), FLD(-UMS2, "S0")); } // if ((_condven=="C") || (_condven=="O")) set_row(++i, "Codice lotto: @6s", FLD(LF_RCONDV, "CODLOTTO")); if (_condven=="O") set_row(++i, "Articolo in esaurimento: @f", FLD(LF_RCONDV, "ARTES")); set_row(++i, ""); // salta una riga } else { // stampa della riga in forma abbreviata set_row(++i, "@1g@1s @3g@20s @27g@1s @29g@pn @51g@pn @73g@25s @99g@1s @101g@4s @106g@5.2n", FLD(LF_RCONDV, "TIPORIGA"), FLD(LF_RCONDV, "CODRIGA"), FLD(LF_RCONDV, "NSCAGL"), FLD(LF_RCONDV, "QLIM","##########,@@@@@"), FLD(LF_RCONDV, "PREZZO","###.###.###,@@"), FLD(LF_RCONDV, "SCONTO"), FLD(LF_RCONDV, "ADDIVA"), FLD(LF_RCONDV, "CODIVA"), FLD(LF_RCONDV, "PERCPROVV","###,@@")); // codice, prezzo... if ((_condven=="L") || (_condven=="O")) set_row(i, "@24g@2s", FLD(LF_RCONDV, "UM")); // unità di misura set_row(++i, "@1g@2s @5g@pn @27g@pn @49g@20s @70g@pn", FLD(LF_RCONDV, "UMOM"), FLD(LF_RCONDV, "QOM","##########,@@@@@"), FLD(LF_RCONDV, "QBASE","##########,@@@@@"), FLD(LF_RCONDV, "CODARTOM"), FLD(LF_RCONDV, "PROMAGGIO","###.###.###,@@")); // sconto/omaggio if ((_condven=="C") || (_condven=="O")) set_row(i, "@92g@6s", FLD(LF_RCONDV, "CODLOTTO")); // lotto if (_condven=="O") set_row(i, "@99g@1s", FLD(LF_RCONDV, "ARTES")); set_row(++i, ""); // salta una riga } } } /* void TStampa_condizioni_vendita::process_link(int id, const char *text) { if (id== _rcondv_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(RCONDV_APP, MSG_LN, (const char *)body); // crea il messaggio per l'applicazione msg.send(); // invia il messaggio TExternal_app ve2_2(RCONDV_APP); // crea l'applicazione esterna ve2_2.run(); // lancia l'applicazione esterna } } */ int ve3200(int argc, char **argv) { TStampa_condizioni_vendita a; a.run(argc, argv, "Stampa condizioni vendita"); return 0; }