#include #include #include #include #include #include "ve3100.h" #define KILL(x) { mask->field(x).reset_key(1); mask->disable(x); } #define REVIVE(x) { mask->field(x).set_key(1); mask->enable(x); } #define SCON1 135 #define CVE1 201 #define ZON1 202 #define CPG1 203 #define UMS1 204 class TStampa_sconti: public TPrint_application { TRelation *_rel; // relazione principale TString16 _sconti; // tipo di archivio TString16 _gessco; // configurazione della gestione sconti bool _descriz; // abilitazione della stampa delle descrizioni bool _compat; // abilita le descrizioni compatte (vengono ristampate solo al cambio dei valori) bool _catven; // abilitazione della categoria di vendita (gesliscv) bool _scokey_catven; // abilitazione della categoria di vendita bool _scokey_scclienti; // abilitazione degli sconti clienti bool _scokey_zone; // abilitazione delle zone bool _scokey_condpag; // abilitazione delle condizioni di pagamento TString _last_catven, _last_codart, _last_um, _last_sccliente, _last_zona, _last_condpag; // inseguitori dei campi da descrivere //int _rcondv_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 preprocess_footer(void); //virtual void process_link(int, const char *); }; bool TStampa_sconti::user_create() { bool gotcha= FALSE; // booleano di avvenuta inizializzazione _sconti= "*"; // inizializzazione dell'indicatore del tipo di tabella if (argc()>2) _sconti= argv(2); // se c'è, prende il tipo di tabella dalla linea di comando else { TMask choose("VE3100"); // istanzia la maschera di scelta del tipo di tabella if (choose.run() == K_ENTER) _sconti= choose.get(F_TIPOSC); // prende il tipo di tabella dalla maschera } TConfig prassid(CONFIG_DITTA, "ve"); // apre il file di configurazione di ditta switch (_sconti[0]) { case 'D': // sconti documento _rel= new TRelation(LF_SCONTI); // crea la relazione principale gotcha= TRUE; break; case 'R': // sconti di riga _rel= new TRelation(LF_SCONTI); // crea la relazione principale _rel->add(LF_ANAMAG, "CODART==CODART"); _rel->add("%UMS", "CODTAB==UM", 1, LF_SCONTI, UMS1); _rel->add("%CVE", "CODTAB==CODCAT", 1, LF_SCONTI, CVE1); gotcha= TRUE; break; case 'I': // sconti incondizionati _gessco= prassid.get("GESSCO"); // legge lo stato del parametro di abilitazione degli sconti if (_gessco=="A") { _rel= new TRelation(LF_SCONTI); // crea la relazione principale _rel->add("%CVE", "CODTAB==CODCAT", 1, LF_SCONTI, CVE1); _rel->add(LF_SCONTI, "TIPO==\"D\"|CODCAT==CODART[1,2]", 1, LF_SCONTI, SCON1); _rel->add("%ZON", "CODTAB==CODART[3,4]", 1, LF_SCONTI, ZON1); _rel->add("%CPG", "CODTAB==CODART[5,8]", 1, LF_SCONTI, CPG1); gotcha= TRUE; } else error_box("Gli sconti incondizionati non sono abilitati nella configurazione"); break; default: // messaggio di errore se si indica una tabella non valida error_box("Indicare la tabella sulla linea di comando (D, R o I) oppure selezionarla dalla maschera di partenza"); break; } if (gotcha) { add_cursor(new TCursor(_rel)); // costruisce il cursore sulla relazione e lo passa alla stampa add_file(LF_SCONTI); // notifica il file delle principale alla stampa enable_print_menu(); // abilita il menù di stampa enable_setprint_menu(); // abilita il menù di settaggio della stampa } return (gotcha); } bool TStampa_sconti::user_destroy() { delete _rel; return TRUE; } bool TStampa_sconti::set_print(int) { bool gotcha= FALSE; TConfig prassid(CONFIG_DITTA, "ve"); TMask *mask; switch (_sconti[0]) { case 'D': // sconti documento mask= new TMask("ve3100d"); gotcha= TRUE; break; case 'R': // sconti di riga mask= new TMask("ve3100r"); if (!_catven) { KILL(F_R_CODCAT_DA); KILL(F_R_CODCAT_A); } else { REVIVE(F_R_CODCAT_DA); REVIVE(F_R_CODCAT_A); } gotcha= TRUE; break; case 'I': // sconti incondizionati mask= new TMask("ve3100i"); short k_id[2][4]= { F_I_CATVEN_DA, F_I_CATVEN_A, F_I_SCCLIENTI_DA, F_I_SCCLIENTI_A, F_I_ZONE_DA, F_I_ZONE_A, F_I_CONDPAG_DA, F_I_CONDPAG_A }; // vettore dei campi da controllare for (int i=0; i<4; i++) { bool enab= prassid.get_bool("SCOKEY", NULL, i+1); switch (i) { case 0: _scokey_catven= enab; break; case 1: _scokey_scclienti= enab; break; case 2: _scokey_zone= enab; break; case 3: _scokey_condpag= enab; break; } if (enab) { // se nel file di config. il campo è abilitato... REVIVE(k_id[0][i]); // ...i campi vengono abilitati anche sulla maschera REVIVE(k_id[1][i]); gotcha= TRUE; } else { KILL(k_id[0][i]); // se nel file di config. i campi non sono abilitati vengono disabilitati anche sulla maschera KILL(k_id[1][i]); } } if (!_catven) { KILL(k_id[0][1]); // se nel file di config. la categoria vendite è disabilitata viene ucciso il campo KILL(k_id[1][1]); } if (!gotcha) error_box("Non ci sono campi chiave abilitati nella configurazione della ditta"); break; } if (gotcha && (mask->run()== K_ENTER)) { // lancia la maschera, se viene confermata vengono trovati gli estremi del cursore if (_sconti=="R") { _descriz= mask->get_bool(F_R_DESCRIZ); _compat= mask->get_bool(F_R_COMPAT); } else if (_sconti=="I") { _descriz= mask->get_bool(F_I_DESCRIZ); _compat= mask->get_bool(F_I_COMPAT); } TLocalisamfile &sconti= _rel->lfile(); TRectype da(sconti.curr()); // prepara il record di inizio regione da.zero(); da.put("TIPO", _sconti); TRectype a(da); // prepara il record di fine regione TString codart; // stringa per la composizione del campo CODART negli sconti incondizionati switch (_sconti[0]) { // impostazione della chiave della testata case 'D': // sconti documento da.put("CODCAT", mask->get(F_D_CODCAT_DA)); a.put("CODCAT", mask->get(F_D_CODCAT_A)); break; case 'R': // sconti di riga if (_catven) { da.put("CODCAT", mask->get(F_R_CODCAT_DA)); a.put("CODCAT", mask->get(F_R_CODCAT_A)); } else { da.blank("CODCAT"); // i campi non gestiti vengono riempiti di blank a.blank("CODCAT"); } da.put("CODART", mask->get(F_R_CODART_DA)); a.put("CODART", mask->get(F_R_CODART_A)); break; case 'I': // sconti incondizionati if (_catven && _scokey_catven) { da.put("CODCAT", mask->get(F_I_CATVEN_DA)); a.put("CODCAT", mask->get(F_I_CATVEN_A)); } else { da.blank("CODCAT"); // i campi non gestiti vengono riempiti di blank a.blank("CODCAT"); } if (_scokey_scclienti || _scokey_zone || _scokey_condpag) { codart.format("%2s%2s%4s", (_scokey_scclienti)?(mask->get(F_I_SCCLIENTI_DA)):(""), (_scokey_zone)?(mask->get(F_I_ZONE_DA)):(""), (_scokey_condpag)?(mask->get(F_I_CONDPAG_DA)):("")); da.put("CODART", codart); codart.format("%2s%2s%4s", (_scokey_scclienti)?(mask->get(F_I_SCCLIENTI_A)):(""), (_scokey_zone)?(mask->get(F_I_ZONE_A)):(""), (_scokey_condpag)?(mask->get(F_I_CONDPAG_A)):("")); a.put("CODART", codart); } break; } 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 archivio sconti", '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 D: CC DESCR SCONTO .. .................................................. ......................... R: CC CODART UM SCONTO .. .................... .. ......................... Categoria vendite: .................................................. Articolo: .................................................. Unità di misura: .................................................. I: CC SC ZN CPG SCONTO .. .. .. .... ......................... Categoria vendite: .................................................. Sconto cliente: .................................................. Zona: .................................................. Condizione di pagamento: .................................................. */ void TStampa_sconti::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 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", firm, (const char *)s); // setta il nome e l'id della ditta della prima linea dell'header } set_header(++i,"@1gCC"); // codice di categoria switch (_sconti[0]) { case 'D': // sconti documento set_header(i, "@4gDescrizione @55gSconto"); // descrizione e sconto break; case 'R': // sconti di riga set_header(i, "@4gCod. articolo @25gUM @28gSconto"); // codice articolo, unità di misura e sconto break; case 'I': // sconti incondizionati set_header(i, "@4gSC @7gZn @10gCPg @15gSconto"); // sconto cliente, zona, condizione di pagamento e sconto break; } set_header(++i, ""); // aggiunge due linee vuote set_header(++i, ""); } void TStampa_sconti::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_sconti::set_page(int file, int) { if (file== LF_SCONTI) { // se il file in stampa non è il file principale non c'è nulla da fare TLocalisamfile &sconti= _rel->lfile(); int i= 0; // indice di riga switch (_sconti[0]) { case 'D': // sconti documento set_row(++i, "@1g@2s @4g@50s @55g@25s", FLD(LF_SCONTI, "CODCAT"), FLD(LF_SCONTI, "DESCR"), FLD(LF_SCONTI, "SCONTO")); break; case 'R': // sconti di riga if (_descriz) { const TString &catven= sconti.get("CODCAT"); // categoria di vendita if (_catven && ((!_compat) || (catven != _last_catven))) { set_row(++i, "@1gCategoria vendite: @20g@50s", FLD(-CVE1, "S0")); _last_catven= catven; } const TString &codart= sconti.get("CODART"); // codice articolo if ((!_compat) || (codart != _last_codart)) { set_row(++i, "@1gArticolo: @20g@50s", FLD(LF_ANAMAG, "DESCR")); _last_codart= codart; } const TString &um= sconti.get("UM"); // unità di misura if ((!_compat) || (codart != _last_codart)) { set_row(++i, "@1gUnità di misura: @20g@50s", FLD(-UMS1, "S0")); _last_um= um; } } set_row(++i, "@1g@2s @4g@20s @25g@2s @28g@25s", FLD(LF_SCONTI, "CODCAT"), FLD(LF_SCONTI, "CODART"), FLD(LF_SCONTI, "UM"), FLD(LF_SCONTI, "SCONTO")); break; case 'I': // sconti incondizionati if (_descriz) { const TString &catven= sconti.get("CODCAT"); // categoria di vendita if (_catven && _scokey_catven && ((!_compat) || (catven != _last_catven))) { set_row(++i, "@1gCategoria vendite: @26g@50s", FLD(-CVE1, "S0")); _last_catven= catven; } const TString &sccliente= sconti.get("CODART").sub(0,1); // sconto cliente if (_scokey_scclienti && ((!_compat) || (sccliente != _last_sccliente))) { set_row(++i, "@1gSconto cliente: @26g@50s", FLD(-SCON1, "DESCR")); _last_sccliente= sccliente; } const TString &zona= sconti.get("CODART").sub(2,3); // zona if (_scokey_zone && ((!_compat) || (zona != _last_zona))) { set_row(++i, "@1gZona: @26g@50s", FLD(-ZON1, "S0")); _last_zona= zona; } const TString &condpag= sconti.get("CODART").sub(4,7); // condizione di pagamento if (_scokey_condpag && ((!_compat) || (zona != _last_zona))) { set_row(++i, "@1gCondizioni pagamento: @26g@50s", FLD(-CPG1, "S0")); _last_condpag= condpag; } } set_row(++i, "@1g@2s @4g@2s @7g@2s @10g@4s @15g@25s", FLD(LF_SCONTI, "CODCAT"), FLD(LF_SCONTI, "CODART", 1, 2), FLD(LF_SCONTI, "CODART", 3, 4), FLD(LF_SCONTI, "CODART", 5, 8), FLD(LF_SCONTI, "SCONTO")); break; } set_row(++i, ""); // salta una linea } } int ve3100(int argc, char **argv) { TStampa_sconti a; a.run(argc, argv, "Stampa sconti"); return 0; }