diff --git a/src/mg/f166.trr b/src/mg/f166.trr index 56717f0bc..4209d8173 100755 --- a/src/mg/f166.trr +++ b/src/mg/f166.trr @@ -53,7 +53,8 @@ USER5|4|15|5|campo definito dall'utente USERVAL5|4|18|3|valore USER6|4|15|5|campo definito dall'utente USERVAL6|4|18|3|valore -3 +4 ANNOES+TIPOCF+CODCF+INDSPED+CODART+NRIGA| ANNOES+TIPOCF+CODCF+INDSPED+CODART+LIVELLO|X ANNOES+CODART+LIVELLO+TIPOCF+CODCF+INDSPED|X +ANNOES+CODART+TIPOCF+CODCF+INDSPED|X diff --git a/src/mg/mg3300.cpp b/src/mg/mg3300.cpp index d6824a4ed..48c3bc653 100755 --- a/src/mg/mg3300.cpp +++ b/src/mg/mg3300.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include @@ -8,9 +9,13 @@ #include "mg3300.h" #include "../cg/cglib01.h" +#include "clifogiac.h" #define VALUE_NOT_SET "~~" +static bool cau_filter(const TRelation* rel); +static bool calc_saldo(const TRelation & rel, void * pJolly); + inline TCausale_magazzino& get_cau(const char* codcaus) { return cached_causale_magazzino(codcaus); } @@ -20,10 +25,13 @@ class TForm_schedemag : public TForm_stampemg TString4 _anno_prec; bool _magazzino_chiuso; bool _sottocatmer; - bool _sudd_mag; - bool _no_valori; + bool _sudd_mag; + bool _sudd_dep; + bool _no_valori; bool _no_ff; bool _sintetica; + bool _per_articoli; + bool _per_magazzini; TDate _data_inizio, _data_fine; TToken_string _rmov_sortexp; @@ -34,6 +42,9 @@ class TForm_schedemag : public TForm_stampemg TTipo_saldomag _tiposcheda; // tipo scheda int _annoes; TString16 _user1; + TString4 _tipocf; + long _codcf; + int _indsped; bool ragg_exprs(int livart,int livgiac); @@ -45,8 +56,9 @@ public: void set_tiposcheda(const char * tipo); void set_chiusura_mag(const int val); - void set_data_inizio(const TDate& d) { _data_inizio = d; } - bool validate(TForm_item &cf, TToken_string &s); + void set_data_inizio(const TDate& d) { _data_inizio = d; } + void set_clifo(const TString& tipocf, const long codcf, const int indsped) { _tipocf = tipocf; _codcf = codcf; _indsped = indsped; } + bool validate(TForm_item &cf, TToken_string &s); void setdett_perart(bool percatmer, bool sottocatmer,int livart,int livgiac,bool sudd_mag, bool sudd_dep); void setdett_permag(bool sudd_dep, bool showdett,int livart,int livgiac); void set_date_limite(const int anno, const TDate& d, const TDate& e); @@ -56,7 +68,9 @@ public: TTipo_saldomag tiposcheda() const { return _tiposcheda; } TForm_schedemag(const char *name,const char *code) - : TForm_stampemg(name,code), _tolivgiac(0), _tolivart(0) {} + : TForm_stampemg(name,code), _tolivgiac(0), _tolivart(0), + _sudd_mag(false), _sudd_dep(false), _per_articoli(false), + _per_magazzini(false) {} virtual ~TForm_schedemag() {} }; @@ -71,8 +85,11 @@ const char* TForm_schedemag::descr_tiposcheda() const case s_prodc: return TR("In produzione componenti"); case s_prodf: return TR("In produzione finiti"); case s_ordc: return TR("Ordinato clienti"); - case s_ordf: return TR("Ordinato fornitori"); - case s_acq: + case s_ordf: return TR("Ordinato fornitori"); + case s_dotin: return TR("Dotazione iniziale"); + case s_dotod: return TR("Dotazione odierna"); + case s_dottm: return TR("Dotazione temporanea"); + case s_acq: default: break; } return ""; @@ -88,8 +105,11 @@ const char* TForm_schedemag::nomecampo_scheda() const case s_prodc:return (MAG_PRODCOMP); case s_prodf:return (MAG_PRODFIN); case s_ordc: return (MAG_ORDC); - case s_ordf: return (MAG_ORDF); - case s_acq: + case s_ordf: return (MAG_ORDF); + case s_dotin: return (CLIFOGIAC_DOTIN); + case s_dotod: return (CLIFOGIAC_DOTOD); + case s_dottm: return (CLIFOGIAC_DOTTM); + case s_acq: case s_ent: case s_ven: case s_usc: @@ -207,136 +227,218 @@ bool TForm_schedemag::validate(TForm_item &cf, TToken_string &s) const bool stampa_perart = relation()->lfile().num() == LF_ANAMAG; // Se il movimento corrente e' >= la data inizio stampa allora posso sempre stampare il saldo ... - if (datareg < _data_inizio) // ... altrimenti devo fare altri controlli - { - if (stampa_perart) // Stampa per articoli - { - TSortedfile& rmm = (TSortedfile&)relation()->lfile(LF_RMOVMAG); - const TRecnotype oldpos = rmm.recno(); - TToken_string old_art; - old_art = rmm.get(RMOVMAG_CODART); - old_art.add(rmm.get(RMOVMAG_LIVGIAC)); - const int err = rmm.next(); - if (err == NOERR) // Se non sono sull'ultimo record ... - { - const TRectype& next_movmag = rmm.relation().curr(LF_MOVMAG); - const TDate next_datareg = next_movmag.get_date(MOVMAG_DATAREG); - // Se il prossimo record e' dopo la data iniziale devo stampre il saldo - // Lo stesso dicasi se la prossima data e' inferiore alla corrente (sono su un altro articolo!) - printsaldoprec = next_datareg >= _data_inizio || next_datareg < datareg; - if (!printsaldoprec) - { - // Se la prossima data e' >= della corrente verifico se cambio articolo - TToken_string new_art; - new_art = rmm.get(RMOVMAG_CODART); - new_art.add(rmm.get(RMOVMAG_LIVGIAC)); - printsaldoprec = old_art != new_art; - } - } - rmm.readat(oldpos); // ripristino la posizione del file - } - else // Stampa per magazzini - { - TSortedfile& rmm = (TSortedfile&)relation()->lfile(LF_RMOVMAG); - const TRecnotype oldpos = rmm.recno(); - TToken_string old_art; - old_art = rmm.get(RMOVMAG_CODART); - old_art.add(rmm.get(RMOVMAG_LIVGIAC)); - old_art.add(rmm.get(RMOVMAG_CODMAG)); - - const int err = rmm.next(); - if (err == NOERR) // Se non sono sull'ultimo record ... - { - const long next_num_reg = rmm.get_long(RMOVMAG_NUMREG); - const TRectype& next_movmag = cache().get(LF_MOVMAG, next_num_reg); - const TDate next_datareg = next_movmag.get_date(MOVMAG_DATAREG); - // Se il prossimo record e' dopo la data iniziale devo stampre il saldo - // Lo stesso dicasi se la prossima data e' inferiore alla corrente (sono su un altro articolo!) - printsaldoprec = next_datareg >= _data_inizio || next_datareg < datareg; - if (!printsaldoprec) - { - // Se la prossima data e' >= della corrente verifico se cambio articolo - TToken_string new_art; - new_art = rmm.get(RMOVMAG_CODART); - new_art.add(rmm.get(RMOVMAG_LIVGIAC)); - new_art.add(rmm.get(RMOVMAG_CODMAG)); - printsaldoprec = old_art != new_art; - } - } - rmm.readat(oldpos); // ripristino la posizione del file - } - } - if (printsaldoprec) // Memorizzo chiave articolo per utilizzarla al momento di calcolare il SALDOPREC - { + if (datareg < _data_inizio) // ... altrimenti devo fare altri controlli + { + if (stampa_perart) // Stampa per articoli + { + TSortedfile& rmm = (TSortedfile&)relation()->lfile(LF_RMOVMAG); + const TRecnotype oldpos = rmm.recno(); + TToken_string old_art; + + old_art = rmm.get(RMOVMAG_CODART); + old_art.add(rmm.get(RMOVMAG_LIVGIAC)); + + const int err = rmm.next(); + + if (err == NOERR) // Se non sono sull'ultimo record ... + { + const TRectype& next_movmag = rmm.relation().curr(LF_MOVMAG); + const TDate next_datareg = next_movmag.get_date(MOVMAG_DATAREG); + // Se il prossimo record e' dopo la data iniziale devo stampre il saldo + // Lo stesso dicasi se la prossima data e' inferiore alla corrente (sono su un altro articolo!) + + printsaldoprec = next_datareg >= _data_inizio || next_datareg < datareg; + if (!printsaldoprec) + { + // Se la prossima data e' >= della corrente verifico se cambio articolo + TToken_string new_art; + + new_art = rmm.get(RMOVMAG_CODART); + new_art.add(rmm.get(RMOVMAG_LIVGIAC)); + printsaldoprec = old_art != new_art; + } + } + rmm.readat(oldpos); // ripristino la posizione del file + } + else // Stampa per magazzini + { + TSortedfile& rmm = (TSortedfile&)relation()->lfile(LF_RMOVMAG); + const TRecnotype oldpos = rmm.recno(); + TToken_string old_art; + + old_art = rmm.get(RMOVMAG_CODART); + old_art.add(rmm.get(RMOVMAG_LIVGIAC)); + old_art.add(rmm.get(RMOVMAG_CODMAG)); + + const int err = rmm.next(); + if (err == NOERR) // Se non sono sull'ultimo record ... + { + const long next_num_reg = rmm.get_long(RMOVMAG_NUMREG); + const TRectype& next_movmag = cache().get(LF_MOVMAG, next_num_reg); + const TDate next_datareg = next_movmag.get_date(MOVMAG_DATAREG); + // Se il prossimo record e' dopo la data iniziale devo stampre il saldo + // Lo stesso dicasi se la prossima data e' inferiore alla corrente (sono su un altro articolo!) + printsaldoprec = next_datareg >= _data_inizio || next_datareg < datareg || + _tiposcheda == s_dotin || _tiposcheda == s_dotod || + _tiposcheda == s_dottm; + if (!printsaldoprec) + { + // Se la prossima data e' >= della corrente verifico se cambio articolo + TToken_string new_art; + new_art = rmm.get(RMOVMAG_CODART); + new_art.add(rmm.get(RMOVMAG_LIVGIAC)); + new_art.add(rmm.get(RMOVMAG_CODMAG)); + printsaldoprec = old_art != new_art; + } + } + rmm.readat(oldpos); // ripristino la posizione del file + } + } + if (!printsaldoprec) + printsaldoprec = _tiposcheda == s_dotin || _tiposcheda == s_dotod || _tiposcheda == s_dottm; + // if (printsaldoprec) // Memorizzo chiave articolo per utilizzarla al momento di calcolare il SALDOPREC + // { const TRectype& rmm = relation()->curr(LF_RMOVMAG); _saldo_key = rmm.get(RMOVMAG_CODART); _saldo_key.add(rmm.get(RMOVMAG_LIVGIAC)); _saldo_key.add(rmm.get(RMOVMAG_CODMAG)); - } + //} valore = printsaldoprec ? "1" : "0"; } if (subcode=="SALDOPREC") { - valore = ""; - if (!_magazzino_chiuso) // mag precedente non chiuso, mancano i saldi di apertura - { - TString80 codart; _saldo_key.get(0, codart); codart.rtrim(); - TString16 livello; _saldo_key.get(1, livello); livello.rtrim(); - TString8 codmag; _saldo_key.get(2, codmag); codmag.rtrim(); - if (_tolivart > 0 && _tolivart < livelli_articolo().last_level()) - { - codart.cut(livelli_articolo().code_length(_tolivart)); - livello.cut(0); - } - else - { - if (_tolivgiac > 0) - { - if (_tolivgiac < livelli_giacenza().last_level()) - livello.cut(livelli_giacenza().code_length(_tolivgiac)); - } - else - livello.cut(0); - } + TString80 codart; _saldo_key.get(0, codart); codart.rtrim(); + TString16 livello; _saldo_key.get(1, livello); livello.rtrim(); + TString8 codmag; _saldo_key.get(2, codmag); codmag.rtrim(); + const bool dotaz = _tiposcheda == s_dotin || _tiposcheda == s_dotod || _tiposcheda == s_dottm; + const bool clifogiac = dotaz || _codcf != 0L; + TString region; + TString query; + // real currsaldo = cf.get(); + real currsaldo; - TString region; - region << MAG_ANNOES << '=' << _anno_prec; - region << ' ' << MAG_CODART << "=\"" << codart << "\""; + valore.zap(); + if (_tolivart > 0 && _tolivart < livelli_articolo().last_level()) + { + codart.cut(livelli_articolo().code_length(_tolivart)); + livello.cut(0); + } + else + { + if (_tolivgiac > 0) + { + if (_tolivgiac < livelli_giacenza().last_level()) + livello.cut(livelli_giacenza().code_length(_tolivgiac)); + } + else + livello.cut(0); + } + if (clifogiac) + { + region << CLIFOGIAC_ANNOES << '=' << _anno_prec; + region << ' ' << CLIFOGIAC_CODART << "=\"" << codart << "\""; + if (_tolivart <= 0 || _tolivart >= livelli_articolo().last_level()) + region.insert("~", region.len() - 1); + region << ' ' << CLIFOGIAC_TIPOCF << '=' << _tipocf; + region << ' ' << CLIFOGIAC_CODCF << '=' << _codcf; + if (_indsped != 0) + region << ' ' << CLIFOGIAC_INDSPED << '=' << _indsped; + query << "USE " << LF_CLIFOGIAC << " KEY 4"; + query << "\nFROM " << region; + query << "\nTO " << region; - TString query; - query << "USE " << LF_MAG; - query << "\nFROM " << region; - query << "\nTO " << region; - if (_tolivart <= 0 || _tolivart >= livelli_articolo().last_level()) - query.insert("~", query.len()-1); + TISAM_recordset clifogiacprec(query); + + for (bool ok = clifogiacprec.move_first(); ok; ok = clifogiacprec.move_next()) + { + if (_tolivgiac > 0) // Stampa per livello di giacenza + { + const TString& cl = clifogiacprec.get(CLIFOGIAC_LIVELLO).as_string(); + if (_tolivgiac >= livelli_giacenza().last_level()) + { + if (cl != livello) + continue; // Escludi livelli non corrispondenti + } + else + { + if (!cl.starts_with(livello)) + continue; // Escludi sotto livelli non corrispondenti + } + } - TISAM_recordset magprec(query); - real currsaldo = cf.get(); - for (bool ok = magprec.move_first(); ok; ok = magprec.move_next()) - { - if (_sudd_mag && magprec.get(MAG_CODMAG).as_string() != codmag) - continue; // Escludo magazzini indesiderati + const real saldoprec = clifogiacprec.get(nomecampo_scheda()).as_real(); - if (_tolivgiac > 0) // Stampa per livello di giacenza - { - const TString& cl = magprec.get(MAG_LIVELLO).as_string(); - if (_tolivgiac >= livelli_giacenza().last_level()) - { - if (cl != livello) - continue; // Escludi livelli non corrispondenti - } - else - { - if (!cl.starts_with(livello)) - continue; // Escludi sotto livelli non corrispondenti - } - } + currsaldo += saldoprec; // Sommo il saldo precedente al campo corrente + } + valore = currsaldo.string(); + } + else + { + if (!_magazzino_chiuso) // mag precedente non chiuso, mancano i saldi di apertura + { + region << MAG_ANNOES << '=' << _anno_prec; + region << ' ' << MAG_CODART << "=\"" << codart << "\""; + query << "USE " << LF_MAG; + query << "\nFROM " << region; + query << "\nTO " << region; + if (_tolivart <= 0 || _tolivart >= livelli_articolo().last_level()) + query.insert("~", query.len() - 1); - const real saldoprec = magprec.get(nomecampo_scheda()).as_real(); - currsaldo += saldoprec; // Sommo il saldo precedente al campo corrente - } - valore = currsaldo.string(); - } + TISAM_recordset magprec(query); + + for (bool ok = magprec.move_first(); ok; ok = magprec.move_next()) + { + if (_sudd_mag && magprec.get(MAG_CODMAG).as_string() != codmag) + continue; // Escludo magazzini indesiderati + + if (_tolivgiac > 0) // Stampa per livello di giacenza + { + const TString& cl = magprec.get(MAG_LIVELLO).as_string(); + if (_tolivgiac >= livelli_giacenza().last_level()) + { + if (cl != livello) + continue; // Escludi livelli non corrispondenti + } + else + { + if (!cl.starts_with(livello)) + continue; // Escludi sotto livelli non corrispondenti + } + } + + const real saldoprec = magprec.get(nomecampo_scheda()).as_real(); + + currsaldo += saldoprec; // Sommo il saldo precedente al campo corrente + } + } + } + TEsercizio esc = esercizi().esercizio(_annoes); + + if (_data_inizio.ok() && _data_inizio > esc.inizio()) + { + TRelation *rel = new TRelation(LF_RMOVMAG); + TRectype rec(rel->lfile().curr()); + TString cond; + + rel->add(LF_MOVMAG, "NUMREG==NUMREG"); + rec.put(RMOVMAG_CODART, codart); + cond << "ANSI(" << LF_MOVMAG << "->DATAREG)<\"" << _data_inizio.string(ANSI) << '"'; + + if (livello.full()) + cond << "&&(" << LF_RMOVMAG << "->" << RMOVMAG_LIVGIAC << "== \"" << livello << "\")"; + if (_per_magazzini && _sudd_mag) + { + if (_sudd_dep) + cond << "&&(" << LF_RMOVMAG << "->" << RMOVMAG_CODMAG << "==" << '"' << codmag << "\")"; + else + cond << "&&(" << LF_RMOVMAG << "->" << RMOVMAG_CODMAG << "[1,3]==" << '"' << codmag.left(3) << "\")"; + } + TCursor rmovmag(rel, cond, 2, &rec, &rec); + + rmovmag.set_filterfunction(cau_filter); + rmovmag.scan(calc_saldo, &currsaldo); + } + valore = currsaldo.string(); } if (subcode.left(3) == "ADD") { @@ -395,7 +497,10 @@ bool TForm_schedemag::ragg_exprs(int livart, int livgiac) void TForm_schedemag::setdett_permag(bool sudd_dep,bool show_dett,int livart,int livgiac) { - TForm_subsection &h_d=(TForm_subsection &)find_field('B',odd_page,"HEADER_DEP"); + _per_articoli = false; + _per_magazzini = true; + + TForm_subsection &h_d=(TForm_subsection &)find_field('B',odd_page,"HEADER_DEP"); h_d.enable(sudd_dep); TForm_subsection &h_a=(TForm_subsection &)find_field('B',odd_page,"HEADER_ARTICOLO"); h_a.enable(show_dett); @@ -431,6 +536,8 @@ void TForm_schedemag::setdett_permag(bool sudd_dep,bool show_dett,int livart,int void TForm_schedemag::setdett_perart(bool percatmer,bool sottocatmer,int livart,int livgiac,bool sudd_mag,bool sudd_dep) { + _per_articoli= true; + _per_magazzini = false; _rmov_sortexp.cut(0); // raggruppamento MAX fino all'articolo TForm_subsection &h_cm=(TForm_subsection &)find_field('B',odd_page,"HEADER_CATMER"); @@ -478,7 +585,8 @@ void TForm_schedemag::setdett_perart(bool percatmer,bool sottocatmer,int livart, ragg_exprs(livart, livgiac); _sudd_mag = sudd_mag; // E' una stampa suddvisa per magazzini? - if (sudd_mag) + _sudd_dep = sudd_dep; // E' una stampa suddvisa per magazzini? + if (sudd_mag) { _rmov_raggcond << "+CODMAG[1,3]"; _rmov_sortexp.add("CODMAG[1,3]"); @@ -498,30 +606,42 @@ void TForm_schedemag::setdett_perart(bool percatmer,bool sottocatmer,int livart, void TForm_schedemag::set_tiposcheda(const char * tipo) { - if (tipo[0] == 'G') - _tiposcheda = s_giac; + if (tipo[0] == 'G') + _tiposcheda = s_giac; else if (tipo[0] == 'A') _tiposcheda = s_acl; else - if (tipo[0] == 'I') - _tiposcheda = s_incl; - else - if (*tipo=='P') - { - if (tipo[1]=='F') - _tiposcheda = s_prodf; - else - _tiposcheda = s_prodc; - } + if (tipo[0] == 'I') + _tiposcheda = s_incl; else - if (tipo[0] == 'O') + if (*tipo == 'P') { - if (tipo[1]=='F') - _tiposcheda = s_ordf; + if (tipo[1] == 'F') + _tiposcheda = s_prodf; else - _tiposcheda = s_ordc; + _tiposcheda = s_prodc; } + else + if (tipo[0] == 'O') + { + if (tipo[1] == 'F') + _tiposcheda = s_ordf; + else + _tiposcheda = s_ordc; + } + else + if (tipo[0] == 'D') + { + if (tipo[1] == 'I') + _tiposcheda = s_dotin; + else + if (tipo[1] == 'O') + _tiposcheda = s_dotod; + else + if (tipo[1] == 'T') + _tiposcheda = s_dottm; + } } void TForm_schedemag::set_options(bool no_valori, bool no_ff, bool sintetica, bool print_gio) @@ -587,12 +707,12 @@ class TStampa_schede_mag : public TSkeleton_application bool _reload; protected: - TStampemg_mask & mask() { return *_mask;} virtual bool create(); virtual bool destroy(); virtual void main_loop(); static bool negatives_only(const TRelation* rel); - static bool cau_filter(const TRelation* rel); +// static bool clifo_filter(const TRelation* rel); +// static bool cau_filter(const TRelation* rel); void setprint_perarticoli(); void setprint_permagazzini(); @@ -602,6 +722,7 @@ protected: static bool handle_adata(TMask_field& f, KEY k); public: + TStampemg_mask & mask() { return *_mask; } bool & reload() {return _reload;} TTipo_saldomag tiposcheda() const {return _form->tiposcheda();} ; TStampa_schede_mag() : _reload(false) {} @@ -619,13 +740,52 @@ bool TStampa_schede_mag::negatives_only(const TRelation* rel) return giac < ZERO; } -bool TStampa_schede_mag::cau_filter(const TRelation* rel) -{ - const TRectype& rmov = rel->curr(LF_RMOVMAG); - TString16 cau = rmov.get(RMOVMAG_CODCAUS); - if (cau.empty()) - cau = cache().get(LF_MOVMAG, rmov.get(RMOVMAG_NUMREG), MOVMAG_CODCAUS); - return get_cau(cau).sgn(app().tiposcheda()) != 0; +bool clifo_filter(const TRelation* rel) +{ + const long codcf = app().mask().get_long(F_CODCF); + + if (codcf == 0L) + return true; + + const TRectype& rmov = rel->curr(LF_RMOVMAG); + const TRectype& mov = cache().get(LF_MOVMAG, rmov.get(RMOVMAG_NUMREG)); + const TString & tipocf = app().mask().get(F_TIPOCF); + + if (mov.get(MOVMAG_TIPOCF) != tipocf || mov.get_long(MOVMAG_CODCF) != codcf) + return false; + + const int indsped = app().mask().get_long(F_INDSPED); + + if ((indsped == 0) || (indsped == 1 && mov.get(MOVMAG_CODINDSP).blank())) + return true; + return mov.get_int(MOVMAG_CODINDSP) == indsped; +} + +bool cau_filter(const TRelation* rel) +{ + const TRectype& rmov = rel->curr(LF_RMOVMAG); + TString16 cau = rmov.get(RMOVMAG_CODCAUS); + + if (cau.empty()) + cau = cache().get(LF_MOVMAG, rmov.get(RMOVMAG_NUMREG), MOVMAG_CODCAUS); + return get_cau(cau).sgn(app().tiposcheda()) != 0 && clifo_filter(rel); +} + +bool calc_saldo(const TRelation & rel, void * pJolly) +{ + if (pJolly) + { + real * saldo = (real *)pJolly; + TString16 cau = rel.lfile().get(RMOVMAG_CODCAUS); + + if (cau.empty()) + cau = rel.lfile(LF_MOVMAG).get(MOVMAG_CODCAUS); + + const real val = rel.lfile().get_real(RMOVMAG_QUANT) * get_cau(cau).sgn(app().tiposcheda()); + + *saldo += val; + } + return true; } void TStampa_schede_mag::setprint_permagazzini() @@ -662,9 +822,8 @@ void TStampa_schede_mag::setprint_permagazzini() cond << "ANSI(" << LF_MOVMAG << "->DATAREG)>=\"" << d1.string(ANSI) << '"'; ((TForm_subsection &)_form->find_field('B',odd_page,"MOVS_INTERESSATI")).setcondition(cond,_strexpr); ((TForm_subsection &)_form->find_field('B',odd_page,"H_MOVS_INTERESSATI")).setcondition(cond,_strexpr); - cond.cut(0) << "ANSI(" << LF_MOVMAG << "->DATAREG)<\"" << d1.string(ANSI) << '"'; - ((TForm_subsection &)_form->find_field('B',odd_page,"MOVS_PRECEDENTI")).setcondition(cond,_strexpr); - } + cfilter << "(ANSI(110->DATAREG)>=" << '"' << d1.string(ANSI) << "\")&&"; + } // Imposta i livelli di dettaglio della scheda _form->setdett_permag(m.get_bool(F_DETTAGLIOMAG), m.get_bool(F_DETTAGLIODEP), @@ -725,9 +884,8 @@ void TStampa_schede_mag::setprint_perarticoli() cond << "ANSI(" << LF_MOVMAG << "->DATAREG)>=\"" << d1.string(ANSI) << '"'; ((TForm_subsection &)_form->find_field('B',odd_page,"MOVS_INTERESSATI")).setcondition(cond,_strexpr); ((TForm_subsection &)_form->find_field('B',odd_page,"H_MOVS_INTERESSATI")).setcondition(cond,_strexpr); - cond.cut(0) << "ANSI(" << LF_MOVMAG << "->DATAREG)<\"" << d1.string(ANSI) << '"'; - ((TForm_subsection &)_form->find_field('B',odd_page,"MOVS_PRECEDENTI")).setcondition(cond,_strexpr); - } + filter << "(ANSI(110->DATAREG)>=" << '"' << d1.string(ANSI) << "\")&&"; + } if (m.get(F_ADATA).not_empty()) { TDate d1(m.get(F_ADATA)); @@ -806,9 +964,8 @@ void TStampa_schede_mag::setprint_perarticoli() darecr.put(RMOVMAG_CODART,darec.get(ANAMAG_CODART)); arecr.put(RMOVMAG_CODART,arec.get(ANAMAG_CODART)); rmovmag->setregion(darecr,arecr,tilde); - if (tiposcheda() != s_giac) - rmovmag->cursor().set_filterfunction(cau_filter); - +// if (tiposcheda() != s_giac) + rmovmag->cursor().set_filterfunction(cau_filter); #ifdef DBG rmovmag->first(); #endif @@ -861,6 +1018,7 @@ void TStampa_schede_mag::main_loop() _form = new TForm_schedemag(frmname, "") ; _form->set_options(m.get_bool(F_NO_VALORI), m.get_bool(F_NO_FF), sintetica, m.get_bool(F_PRINTREG)); + _form->set_clifo(m.get(F_TIPOCF), m.get_long(F_CODCF), m.get_int(F_INDSPED)); if (per_articoli) setprint_perarticoli(); @@ -944,7 +1102,12 @@ bool TStampa_schede_mag::create() printer().links().add("Articolo |b|w"); // Crea il link blu alle anagrafiche printer().links().add("Movimento |v|w"); // Crea il link viola ai movimenti printer().setlinkhandler(linker); - + + if (has_module(LVAUT)) + { + TList_field & l = _mask->lfield(F_SCHEDA); + + } return TSkeleton_application::create(); } diff --git a/src/mg/mg3300.h b/src/mg/mg3300.h index 13456976c..5965914b2 100755 --- a/src/mg/mg3300.h +++ b/src/mg/mg3300.h @@ -18,6 +18,9 @@ #define F_STAMPAGIAC 117 #define F_DADEP 118 #define F_ADEP 119 +#define F_TIPOCF 120 +#define F_CODCF 121 +#define F_INDSPED 122 #define F_SUDDIV_MAGAZZINI 123 #define F_SUDDIV_DEPOSITI 124 @@ -37,7 +40,8 @@ #define G_DESART 3 #define G_LIVELLI 4 #define G_USER 5 - +#define G_MAG 6 +#define G_CLIFO 7 #define FF_CANPRINTSALDOPREC 299 #define FF_STAMPASALDOPREC 300 diff --git a/src/mg/mg3300.uml b/src/mg/mg3300.uml index 6ba8766c9..11fdb8b73 100755 --- a/src/mg/mg3300.uml +++ b/src/mg/mg3300.uml @@ -10,13 +10,16 @@ PAGE "Stampa Schede di magazzino" 0 0 0 0 LISTBOX F_SCHEDA 30 BEGIN PROMPT 2 1 "Tipo scheda " - ITEM "G|Giacenza" - ITEM "OF|Ordinato fornitori" - ITEM "OC|Ordinato clienti" - ITEM "ACL|A conto lavoro" - ITEM "INCL|In conto lavoro" - ITEM "PC|Componenti in produzione " - ITEM "PF|Finiti in produzione " + ITEM "G|Giacenza" MESSAGE ENABLE,G_MAG@ + ITEM "OF|Ordinato fornitori" MESSAGE ENABLE,G_MAG@ + ITEM "OC|Ordinato clienti" MESSAGE ENABLE,G_MAG@ + ITEM "ACL|A conto lavoro" MESSAGE ENABLE,G_MAG@ + ITEM "INCL|In conto lavoro" MESSAGE ENABLE,G_MAG@ + ITEM "PC|Componenti in produzione " MESSAGE ENABLE,G_MAG@ + ITEM "PF|Finiti in produzione " MESSAGE ENABLE,G_MAG@ + ITEM "DI|Dotazione iniziale" MESSAGE CLEAR,G_MAG@ + ITEM "DO|Dotazione odierna" MESSAGE CLEAR,G_MAG@ + ITEM "DT|Dotazione temporanea" MESSAGE CLEAR,G_MAG@ END LISTBOX F_ORDINE 12 @@ -66,6 +69,7 @@ BEGIN PROMPT 34 3 "Filtro " ITEM "T|Tutti" ITEM "N|Negativi" + GROUP G_MAG END DATE F_DADATA @@ -166,6 +170,7 @@ BEGIN DISPLAY "Codice" CODTAB DISPLAY "Descr@50" S0 OUTPUT F_DAMAG CODTAB + GROUP G_MAG END STRING F_AMAG 3 @@ -178,6 +183,7 @@ BEGIN OUTPUT F_AMAG CODTAB STR_EXPR (#F_AMAG>=#F_DAMAG)||(#F_AMAG=="") WARNING "Il secondo estremo deve essere superiore al primo" + GROUP G_MAG END STRING F_DADEP 3 @@ -191,6 +197,7 @@ BEGIN DISPLAY "Deposito" CODTAB[4,5] DISPLAY "Descr@50" S0 OUTPUT F_DADEP CODTAB[4,5] + GROUP G_MAG END STRING F_ADEP 3 @@ -204,6 +211,7 @@ BEGIN OUTPUT F_ADEP CODTAB[4,5] STR_EXPR (#F_ADEP>=#F_DADEP)||(#F_ADEP=="") WARNING "Il secondo estremo deve essere superiore al primo" + GROUP G_MAG END STRING F_DACATMER 3 @@ -234,12 +242,14 @@ END BOOL F_DETTAGLIOMAG BEGIN PROMPT 2 12 "Suddivido per depositi" + GROUP G_MAG END BOOL F_DETTAGLIODEP BEGIN FLAGS "DH" PROMPT 42 12 "Dettaglio i depositi" + GROUP G_MAG END LIST F_ENABLER 2 30 @@ -281,38 +291,84 @@ BEGIN GROUP G_LIVELLI WARNING "Livello finale non ammissibile" END - - + +LIST F_TIPOCF 1 11 +BEGIN + PROMPT 2 16 "Tipo " + HELP "Indicare se cliente oppure fornitore" + ITEM "C|Clienti" + ITEM "F|Fornitori" +END + +NUMBER F_CODCF 6 +BEGIN + PROMPT 24 16 "Codice " + FLAGS "R" + USE LF_CLIFO + INPUT TIPOCF F_TIPOCF SELECT + INPUT CODCF F_CODCF + DISPLAY "Codice@6R" CODCF + DISPLAY "Ragione sociale@50" RAGSOC + DISPLAY "Codice fiscale@16" COFI + DISPLAY "Partita IVA@11" PAIV + OUTPUT F_TIPOCF TIPOCF + OUTPUT F_CODCF CODCF + CHECKTYPE NORMAL + MESSAGE CLEAR,G_MAG@ + MESSAGE EMPTY ENABLE,G_MAG@ +END + +NUMBER F_INDSPED 3 +BEGIN + PROMPT 40 16 "Indirizzo di spedizione " + USE LF_INDSP + JOIN LF_COMUNI INTO STATO==STATO COM==COM + INPUT TIPOCF F_TIPOCF SELECT + INPUT CODCF F_CODCF SELECT + INPUT CODIND F_INDSPED + DISPLAY "Codice@3R" CODIND + DISPLAY "Ragione sociale@50" RAGSOC + DISPLAY "Indirizzo 1@35" INDIR + DISPLAY "Indirizzo 2@35" INDIR2 + DISPLAY "Civico" CIV + DISPLAY "Localitą@35" LOCALITA + DISPLAY "Comune@50" LF_COMUNI->DENCOM + OUTPUT F_INDSPED CODIND + CHECKTYPE NORMAL +END + BOOL F_SUDDIV_MAGAZZINI BEGIN - PROMPT 2 16 "Suddivido per magazzini" + PROMPT 2 18 "Suddivido per magazzini" MESSAGE TRUE ENABLE,F_SUDDIV_DEPOSITI MESSAGE FALSE CLEAR,F_SUDDIV_DEPOSITI|K_SPACE,F_SUDDIV_DEPOSITI + GROUP G_MAG END BOOL F_SUDDIV_DEPOSITI BEGIN - PROMPT 2 17 "Suddivido per depositi" + PROMPT 2 19 "Suddivido per depositi" + GROUP G_MAG END BOOL F_NO_VALORI BEGIN - PROMPT 2 18 "Non stampare i valori" + PROMPT 2 20 "Non stampare i valori" END BOOL F_NO_FF BEGIN - PROMPT 42 16 "Senza salto pagina" + PROMPT 42 18 "Senza salto pagina" END BOOL F_SINTETICA BEGIN - PROMPT 42 17 "Stampa sintetica" + PROMPT 42 19 "Stampa sintetica" END BOOL F_PRINTREG BEGIN - PROMPT 42 18 "Stampa numero giornale" + PROMPT 42 20 "Stampa numero giornale" END ENDPAGE diff --git a/src/mg/mg3300a.frm b/src/mg/mg3300a.frm index e3676ef94..d1ec2da2b 100755 --- a/src/mg/mg3300a.frm +++ b/src/mg/mg3300a.frm @@ -79,83 +79,83 @@ SECTION HEADER ODD 5 STRINGA 4 45 BEGIN KEY "Intestazione stampa" - PROMPT 45 2 "Stampa schede di magazzino :" - MESSAGE _USER,TIPOSCHEDA - END - - STRINGA 5 95 + PROMPT 45 2 "Stampa schede di magazzino : " + MESSAGE _USER, TIPOSCHEDA +End + +STRINGA 5 95 BEGIN - KEY "Separatore (iniziale)" +KEY "Separatore (iniziale)" PROMPT 1 3 "-----------------------------------------------------------------------------------------------" - END - STRINGA 6 12 + End +STRINGA 6 12 BEGIN - PROMPT 42 4 "UM" - END - NUMERO 7 12 +PROMPT 42 4 "UM" + End +NUMERO 7 12 BEGIN - PROMPT 50 4 "Quantitą" - END - VALUTA 8 12 +PROMPT 50 4 "Quantitą" + End +VALUTA 8 12 BEGIN - PROMPT 66 4 "Prezzo" +PROMPT 66 4 "Prezzo" FLAGS "U" - END - VALUTA 9 12 + End +VALUTA 9 12 BEGIN - PROMPT 81 4 "Valore" - END - STRINGA 5 95 +PROMPT 81 4 "Valore" + End +STRINGA 5 95 BEGIN - KEY "Separatore (iniziale)" +KEY "Separatore (iniziale)" PROMPT 1 5 "-----------------------------------------------------------------------------------------------" - END -END + End +End SECTION BODY ODD 0 NUMERO 100 1 BEGIN - FLAGS "H" - MESSAGE RESET,FF_SALDO_GART|RESET,FF_VALORE_GART - END +FLAGS "H" + MESSAGE RESET, FF_SALDO_GART|RESET,FF_VALORE_GART + End SECTION HEADER_ARTICOLO 1 2 2 NORMAL GROUP FLAGS "N" SECTION HEADER_CATMER 1 2 1 GROUP STRINGA 10 20 1 BEGIN - KEY "CODICE CATMER" +KEY "CODICE CATMER" PROMPT 1 1 "Gruppo merceologico " - MESSAGE _USER,CODCATMER|RESET,FF_STAMPASALDOPREC - END - STRINGA 12 50 1 + MESSAGE _USER, CODCATMER|RESET,FF_STAMPASALDOPREC + End +STRINGA 12 50 1 BEGIN - KEY "DESCR." +KEY "DESCR." PROMPT 30 1 "" - MESSAGE _USER,CATMER - END - END //HEADER catmer + MESSAGE _USER, CATMER +End +End //HEADER catmer STRINGA 10 20 1 BEGIN - KEY "CODICE articolo" +KEY "CODICE articolo" PROMPT 1 1 "Articolo " - MESSAGE _USER,CODGRUPPOART|RESET,FF_STAMPASALDOPREC - END - - STRINGA 11 50 1 + MESSAGE _USER, CODGRUPPOART|RESET,FF_STAMPASALDOPREC + End + +STRINGA 11 50 1 BEGIN - KEY "DESCR.articolo" +KEY "DESCR.articolo" PROMPT 30 1 "" - MESSAGE _USER,GRUPPOART - END - STRINGA 24 50 1 + MESSAGE _USER, GRUPPOART +End +STRINGA 24 50 1 BEGIN - KEY "dep" +KEY "dep" PROMPT 1 2 "-----------------------------------------------------------------------------------------------" - END - END //HEADER articolo + End +End //HEADER articolo SECTION GRUPPI_ARTICOLO 1 0 0 FILE LF_ANAMAG BY CODART SECTION FILE_RMOVMAG 1 1 0 FILE LF_RMOVMAG @@ -163,194 +163,185 @@ SECTION BODY ODD 0 SECTION HEADER_LIVGIACCATMER 1 1 1 GROUP STRINGA 10 20 1 BEGIN - KEY "CODICE CATMER" +KEY "CODICE CATMER" PROMPT 1 1 "Gruppo merceologico " - MESSAGE _USER,CODCATMER|RESET,FF_STAMPASALDOPREC - END - STRINGA 12 50 1 + MESSAGE _USER, CODCATMER|RESET,FF_STAMPASALDOPREC + End +STRINGA 12 50 1 BEGIN - KEY "DESCR." +KEY "DESCR." PROMPT 30 1 "" - MESSAGE _USER,CATMER - END - END //HEADER catmer + MESSAGE _USER, CATMER +End +End //HEADER catmer STRINGA 10 20 1 BEGIN - KEY "CODICE articolo" +KEY "CODICE articolo" PROMPT 1 1 "Gruppo $[b,w]" - MESSAGE _USER,CODGRUPPOART|RESET,FF_STAMPASALDOPREC - END - STRINGA 11 50 1 + MESSAGE _USER, CODGRUPPOART|RESET,FF_STAMPASALDOPREC + End +STRINGA 11 50 1 BEGIN - KEY "DESCR.articolo" +KEY "DESCR.articolo" PROMPT 30 1 "$[n,w]" - MESSAGE _USER,GRUPPOART - END + MESSAGE _USER, GRUPPOART +End SECTION HEADER_LIVGIAC 2 1 1 GROUP STRINGA 20 20 1 BEGIN - KEY "CODICE livello" +KEY "CODICE livello" PROMPT 1 1 "" - MESSAGE _USER,CODGRUPPOGIAC - END - STRINGA 21 50 1 + MESSAGE _USER, CODGRUPPOGIAC +End +STRINGA 21 50 1 BEGIN - KEY "Livello giac" +KEY "Livello giac" PROMPT 23 1 "" - MESSAGE _USER,GRUPPOGIAC - END - END + MESSAGE _USER, GRUPPOGIAC +End +End SECTION HEADER_MAG 2 1 1 GROUP STRINGA 22 13 1 BEGIN - KEY "mag" +KEY "mag" PROMPT 3 1 "Magazzino " FIELD ALIAS_MAG@->CODTAB[1,3] - END - STRINGA 23 50 1 + End +STRINGA 23 50 1 BEGIN - KEY "mag" +KEY "mag" PROMPT 17 1 "" FIELD ALIAS_MAG@->S0 - END + End SECTION HEADER_DEP 2 1 1 STR_EXPR ALIAS_MAG@->B0=="X" STRINGA 24 11 1 BEGIN - KEY "dep" +KEY "dep" PROMPT 5 1 "Deposito " FIELD ALIAS_DEP@->CODTAB[4,5] - END - STRINGA 25 50 1 + End +STRINGA 25 50 1 BEGIN - KEY "dep" +KEY "dep" PROMPT 17 1 "" FIELD ALIAS_DEP@->S0 - END - END // HEADER deposito - END // HEADER magazzino + End +End // HEADER deposito + End // HEADER magazzino STRINGA 26 95 BEGIN - KEY "dep" +KEY "dep" PROMPT 1 2 "-----------------------------------------------------------------------------------------------" - END - END // HEADER raggruppamenti di movimenti + End +End // HEADER raggruppamenti di movimenti STRINGA 10 BEGIN - FLAGS "H" - MESSAGE RESET,FF_SALDO_GRMOV|RESET,FF_VALORE_GRMOV - END +FLAGS "H" + MESSAGE RESET, FF_SALDO_GRMOV|RESET,FF_VALORE_GRMOV + End SECTION GRUPPI_RMOVMAG 1 0 0 FILE LF_RMOVMAG GROUP CODART SECTION H_MOVS_INTERESSATI 1 0 0 STREXPR LF_MOVMAG->DATAREG>"" NUMERO 10 BEGIN - FLAGS "H" +FLAGS "H" FIELD LF_RMOVMAG->NUMREG - MESSAGE COPY,FF_NUM_MOV - END - NUMERO 110 + MESSAGE COPY, FF_NUM_MOV +End +NUMERO 110 BEGIN - FLAGS "H" +FLAGS "H" FIELD LF_MOVMAG->NUMREGST - MESSAGE COPY,FF_NUM_MOV - END - NUMERO 11 + MESSAGE COPY, FF_NUM_MOV +End +NUMERO 11 BEGIN - FLAGS "H" +FLAGS "H" FIELD LF_MOVMAG->DATAREG - MESSAGE COPY,FF_DATA_MOV - END - - STRINGA 12 + MESSAGE COPY, FF_DATA_MOV +End + +STRINGA 12 BEGIN - FLAGS "H" +FLAGS "H" FIELD LF_MOVMAG->DESCR - MESSAGE COPY,FF_DESCR_MOV - END + MESSAGE COPY, FF_DESCR_MOV +End - STRINGA 13 +STRINGA 13 BEGIN - FLAGS "H" +FLAGS "H" FIELD LF_MOVMAG->TIPOCF - MESSAGE COPY,FF_TIPOCF_MOV - END + MESSAGE COPY, FF_TIPOCF_MOV +End - NUMERO 14 +NUMERO 14 BEGIN - FLAGS "H" +FLAGS "H" FIELD LF_MOVMAG->CODCF - MESSAGE COPY,FF_CODCF_MOV - END + MESSAGE COPY, FF_CODCF_MOV +End - STRINGA 15 +STRINGA 15 BEGIN - FLAGS "H" +FLAGS "H" FIELD LF_CLIFO->RAGSOC - MESSAGE COPY,FF_CLIFO_MOV - END + MESSAGE COPY, FF_CLIFO_MOV +End - NUMERO 16 +NUMERO 16 BEGIN - FLAGS "H" - MESSAGE RESET,FF_NUMRIGHE - END - END // header mov +FLAGS "H" + MESSAGE RESET, FF_NUMRIGHE +End +End // header mov SECTION MOVIMENTO 1 0 0 FILE LF_RMOVMAG GROUP NUMREG NUMERO FF_NUMRIGHE +BEGIN +KEY "Contatore del numero di righe raggruppate" + End + +NUMERO 13 BEGIN - KEY "Contatore del numero di righe raggruppate" - END - - NUMERO 13 +FLAGS "H" + MESSAGE _USER, CAUSALERIGA|COPY,FF_CAUSALE_RIGA|RESET,FF_SALDO_MOV|RESET,FF_VALORE_MOV + End +NUMERO 14 BEGIN - FLAGS "H" - MESSAGE _USER,CAUSALERIGA|COPY,FF_CAUSALE_RIGA|RESET,FF_SALDO_MOV|RESET,FF_VALORE_MOV - END - NUMERO 14 - BEGIN - FLAGS "H" - MESSAGE _USER,DESCRCAUSALE|COPY,FF_DESCRCAUSALE - END +FLAGS "H" + MESSAGE _USER, DESCRCAUSALE|COPY,FF_DESCRCAUSALE + End NUMERO FF_QUANTRIGA 12 BEGIN - FLAGS "H" - MESSAGE _NUMEXPR,LF_RMOVMAG->QUANT*349@->FC|_USER,*SEGNOCAUS,Q - END +FLAGS "H" + MESSAGE _NUMEXPR, LF_RMOVMAG->QUANT*349@->FC|_USER,*SEGNOCAUS,Q + End SECTION MOVIMENTO_CAUSALE 1 0 0 FILE LF_RMOVMAG GROUP CAUS NUMERO FF_QUANTRIGA 12 BEGIN - FLAGS "H" - MESSAGE _NUMEXPR,LF_RMOVMAG->QUANT*349@->FC|_USER,*SEGNOCAUS,Q - END +FLAGS "H" + MESSAGE _NUMEXPR, LF_RMOVMAG->QUANT*349@->FC|_USER,*SEGNOCAUS,Q + End NUMERO FF_STAMPASALDOPREC 6 BEGIN - FLAGS "H" - END +FLAGS "H" + End NUMERO FF_CANPRINTSALDOPREC 6 BEGIN - FLAGS "H" - MESSAGE _USER,CANPRINTSALDOPREC - END +FLAGS "H" + MESSAGE _USER, CANPRINTSALDOPREC +End - SECTION MOVS_PRECEDENTI 1 0 0 STREXPR LF_MOVMAG->DATAREG<"" - NUMERO 103 30 - BEGIN - PROMPT 31 1 "Quantita' a saldo prec:" - PICTURE "###.##@,@##" - MESSAGE _NUMEXPR,#FF_QUANTRIGA|ADD,FF_SALDOPREC - END - END - SECTION MOVS_INTERESSATI 1 0 0 STREXPR LF_MOVMAG->DATAREG>="" STRINGA 100 30 diff --git a/src/mg/mg3300as.frm b/src/mg/mg3300as.frm index 867395cc9..b79b486a2 100755 --- a/src/mg/mg3300as.frm +++ b/src/mg/mg3300as.frm @@ -79,7 +79,7 @@ SECTION HEADER ODD 5 STRINGA 4 45 BEGIN KEY "Intestazione stampa" - PROMPT 45 2 "Stampa schede di magazzino :" + PROMPT 45 2 "Stampa schede di magazzino : " MESSAGE _USER,TIPOSCHEDA END @@ -330,16 +330,8 @@ SECTION BODY ODD 0 BEGIN FLAGS "H" MESSAGE _USER,CANPRINTSALDOPREC - END + End - SECTION MOVS_PRECEDENTI 1 0 0 STREXPR LF_MOVMAG->DATAREG<"" - NUMERO 103 30 - BEGIN - PROMPT 31 1 "Quantita' a saldo prec:" - PICTURE "###.##@,@##" - MESSAGE _NUMEXPR,#FF_QUANTRIGA|ADD,FF_SALDOPREC - END - END SECTION MOVS_INTERESSATI 1 0 0 STREXPR LF_MOVMAG->DATAREG>="" diff --git a/src/mg/mg3300b.frm b/src/mg/mg3300b.frm index e937f760c..5b59cf2bd 100755 --- a/src/mg/mg3300b.frm +++ b/src/mg/mg3300b.frm @@ -76,7 +76,7 @@ SECTION HEADER ODD 5 STRINGA 4 45 BEGIN KEY "Intestazione stampa" - PROMPT 45 2 "Stampa schede di magazzino :" + PROMPT 45 2 "Stampa schede di magazzino : " MESSAGE _USER,TIPOSCHEDA END diff --git a/src/mg/mg3300bs.frm b/src/mg/mg3300bs.frm index a52d7034a..5036db1f4 100755 --- a/src/mg/mg3300bs.frm +++ b/src/mg/mg3300bs.frm @@ -76,7 +76,7 @@ SECTION HEADER ODD 5 STRINGA 4 45 BEGIN KEY "Intestazione stampa" - PROMPT 45 2 "Stampa schede di magazzino :" + PROMPT 45 2 "Stampa schede di magazzino : " MESSAGE _USER,TIPOSCHEDA END