From 4c02d140385ed13af83a78d4b897fbae93d584fa Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 26 Oct 2009 15:51:02 +0000 Subject: [PATCH] Patch level : 10.0 486 Files correlati : ve0.exe Ricompilazione Demo : [ ] Commento Ricerca avanzata sulla sescrizione articoli (cerca anche nella desrcizione estesa) Nell' ini profilo riga documento bisogna impostare : EXTDESCSRC = X git-svn-id: svn://10.65.10.50/trunk@19512 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- include/maskfld.cpp | 16 ++++++-- include/maskfld.h | 8 ++++ include/sheet.cpp | 10 +++-- include/sheet.h | 11 ++++-- ve/velib.h | 2 + ve/velib02.cpp | 1 + ve/velib06.cpp | 43 +++++++++++++++++++- ve/velib06a.cpp | 95 ++++++++++++++++++++++++++------------------- 8 files changed, 135 insertions(+), 51 deletions(-) diff --git a/include/maskfld.cpp b/include/maskfld.cpp index c513056cb..6fb385b82 100755 --- a/include/maskfld.cpp +++ b/include/maskfld.cpp @@ -2014,14 +2014,16 @@ bool TList_sheet::check(CheckTime t) TBrowse::TBrowse(TEdit_field* f, TRelation* r, int key, const char* filter) : TBrowse_button(f), _relation(r), _cursor(new TCursor (r, "", key)), - _filter(filter), _secondary(FALSE) + _filter(filter), _secondary(FALSE), + _custom_filter_handler(NULL) {} // Certified 100% TBrowse::TBrowse(TEdit_field* f, TCursor* c) : TBrowse_button(f), - _relation(NULL), _cursor(c), _secondary(FALSE) + _relation(NULL), _cursor(c), _secondary(FALSE), + _custom_filter_handler(NULL) {} @@ -2703,7 +2705,8 @@ KEY TBrowse::run() end_wait(); - TBrowse_sheet s(_cursor, _items, caption, _head, buttons, field(), siblings); + TBrowse_sheet s(_cursor, _items, caption, _head, buttons, field(), siblings, _custom_filter_handler); + k = s.run(); selected = s.selected(); } @@ -2751,6 +2754,13 @@ KEY TBrowse::run() return k; } +void TBrowse::set_cursor(TCursor * c) +{ + if (_cursor != NULL) + delete _cursor; + _cursor = c ; +} + bool TBrowse::check(CheckTime t) { bool passed = TRUE; diff --git a/include/maskfld.h b/include/maskfld.h index 22ec90065..fae552e83 100755 --- a/include/maskfld.h +++ b/include/maskfld.h @@ -918,6 +918,8 @@ class TBrowse : public TBrowse_button TToken_string _out_id; // @cmember:(INTERNAL) Campi di output sul file TToken_string _out_fn; + // @cmember:(INTERNAL) handler di filtro custom + CONTROL_HANDLER _custom_filter_handler; // @access Protected Member protected: @@ -988,6 +990,12 @@ public: void set_filter(const char * filter) { _filter = filter;} + // @cmember Cambia il cursore della browse + void set_cursor(TCursor * c); + + // @cmember Cambia il filtro della browse + void set_custom_filter_handler(CONTROL_HANDLER custom_filter_handler) { _custom_filter_handler = custom_filter_handler;} + // @cmember Controlla la validita' del campo bool check(CheckTime = RUNNING_CHECK); // @cmember Controlla se il campo puo' essere vuoto diff --git a/include/sheet.cpp b/include/sheet.cpp index 5decf0877..66ea62cd5 100755 --- a/include/sheet.cpp +++ b/include/sheet.cpp @@ -1818,10 +1818,12 @@ void TBrowse_sheet::update_key_selector(int sel) TBrowse_sheet::TBrowse_sheet(TCursor* cursor, const char* fields, const char* title, const char* head, byte buttons, - TEdit_field& f, TToken_string& sibling) + TEdit_field& f, TToken_string& sibling, CONTROL_HANDLER custom_filter_handler) : TCursor_sheet(cursor, fields, title, head, buttons, f.browse() ? f.browse()->input_fields()+1 : 1), - _field(f), _sel(0), _original_filter(cursor->filter()) + _field(f), _sel(0), _original_filter(cursor->filter()), + _custom_filter_handler(custom_filter_handler) + { const bool normal = f.browse() != NULL && sibling.full(); @@ -1909,14 +1911,14 @@ TBrowse_sheet::TBrowse_sheet(TCursor* cursor, const char* fields, const int sz = csize > 50 ? 50 : csize; // Dimensione del campo di ricerca e = &add_string(c.dlg(), 0, p, 1, y++, csize, flags, sz); // Aggiunge campo con le icone di filtraggio - add_checkbutton(c.dlg()+500, 0, "", sz+p.len()+ 2, y-1, 2, 1, "", 10112, 10113).set_handler(filter_handler); + add_checkbutton(c.dlg()+500, 0, "", sz+p.len()+ 2, y-1, 2, 1, "", 10112, 10113).set_handler(_custom_filter_handler != NULL ? _custom_filter_handler : filter_handler); } break; case CLASS_ZOOM_FIELD: { e = &add_string(c.dlg(), 0, p, 1, y++, 32000, flags, 50); // Aggiunge campo con le icone di filtraggio - add_checkbutton(c.dlg()+500, 0, "", 52 + p.len(), y-1, 2, 1, "", 10112, 10113).set_handler(filter_handler); + add_checkbutton(c.dlg()+500, 0, "", 52 + p.len(), y-1, 2, 1, "", 10112, 10113).set_handler(_custom_filter_handler != NULL ? _custom_filter_handler : filter_handler); } break; case CLASS_REAL_FIELD: diff --git a/include/sheet.h b/include/sheet.h index 4e11d41ff..34b6b5498 100755 --- a/include/sheet.h +++ b/include/sheet.h @@ -232,7 +232,9 @@ class TBrowse_sheet : public TCursor_sheet // @cmember:(INTERNAL) Campo di ricerca attuale (Tag button selezionato) int _sel; - + + CONTROL_HANDLER _custom_filter_handler; + // long _select_row; // @access Protected Member @@ -247,7 +249,6 @@ protected: void create_key_selector(TToken_string& ca); void update_key_selector(int sel); - void add_custom_filter(const char* regexp); static bool browse_field_handler(TMask_field& f, KEY k); static bool last_browse_field_handler(TMask_field& f, KEY k); @@ -255,8 +256,12 @@ protected: // @access Public Member public: + void add_custom_filter(const char* regexp); + void set_custom_filter_handler(CONTROL_HANDLER custom_filter_handler) { _custom_filter_handler = custom_filter_handler;} + + // @cmember Costruttore - TBrowse_sheet(TCursor* cursor, const char* fields, const char* title, const char* head, byte buttons, TEdit_field& f, TToken_string& siblings); + TBrowse_sheet(TCursor* cursor, const char* fields, const char* title, const char* head, byte buttons, TEdit_field& f, TToken_string& siblings,CONTROL_HANDLER custom_filter_handler = NULL); // @cmember Distruttore virtual ~TBrowse_sheet() {} diff --git a/ve/velib.h b/ve/velib.h index 0454dd09a..ffc25766b 100755 --- a/ve/velib.h +++ b/ve/velib.h @@ -401,6 +401,7 @@ class TTipo_riga_documento : public TRectype // velib02 int _search_years; int _max_rows_art; bool _no_desc; + bool _extended_desc_search; TToken_string _search_active_docs; TToken_string _fields_to_update; TToken_string _field_list; @@ -439,6 +440,7 @@ public: const TToken_string& search_nums() const { return _search_nums;} const int max_rows_art() const { return _max_rows_art;} bool no_desc() const { return _no_desc;} + bool extended_desc_search() const { return _extended_desc_search;} TToken_string& search_active_docs() { return _search_active_docs;} TToken_string& fields_to_update() { return _fields_to_update;} TToken_string& field_list() { return _field_list;} diff --git a/ve/velib02.cpp b/ve/velib02.cpp index c77a0b7ea..9e47f39d6 100755 --- a/ve/velib02.cpp +++ b/ve/velib02.cpp @@ -75,6 +75,7 @@ void TTipo_riga_documento::read_formule() _select_clifo = profile.get_bool("SELCLIFO", NULL, -1, true); _no_desc = profile.get_bool("NODESC"); _formule = profile.get("CAMPICALC"); + _extended_desc_search = profile.get_bool("EXTDESCSRC"); const TString& calcoli = profile.get("CALCOLI"); if (calcoli == "*") diff --git a/ve/velib06.cpp b/ve/velib06.cpp index b1bcd3e8a..327ae6527 100755 --- a/ve/velib06.cpp +++ b/ve/velib06.cpp @@ -1154,6 +1154,26 @@ bool TDocumento_mask::new_mask(int numriga) const return _maskriga.objptr(name) == NULL; } +static bool descr_filter_handler(TMask_field& f, KEY k) +{ + if (k == K_SPACE) + { + TString expr; + if (!f.get().empty()) // Filtro attivato! + { + const short id = f.dlg()-500; + TString e = f.mask().get(id); // Espressione regolare + e.strip("\"'"); // Tolgo caratteri che potrebbero dare problemi + if (!e.blank()) + expr << "(DESCR+DESCRAGG)" << "?=\"" << e << '"'; + if (expr.empty()) + f.reset(); + } + ((TBrowse_sheet&) f.mask()).add_custom_filter(expr); + } + return true; +} + TVariable_mask* TDocumento_mask::riga_mask(int numriga) { const TRiga_documento& riga = doc()[numriga + 1]; @@ -1177,7 +1197,7 @@ TVariable_mask* TDocumento_mask::riga_mask(int numriga) m->lfield(FR_TIPORIGA).replace_items(codes, values); - const int pos = m->id2pos(FR_CODART); + int pos = m->id2pos(FR_CODART); if (pos >= 0) { const TMask_field & f = m->fld(pos); @@ -1222,6 +1242,27 @@ TVariable_mask* TDocumento_mask::riga_mask(int numriga) } } } + if (tiporiga.extended_desc_search()) + { + pos = m->id2pos(FR_DESCRART); + if (pos >= 0) + { + const TMask_field & f = m->fld(pos); + if (f.is_edit()) + { + TBrowse * browse = ((TEdit_field &) f).browse(); + + if (browse ) + { + TRelation * r = new TRelation(LF_ANAMAG); + TSorted_cursor * c = new TSorted_cursor(r,ANAMAG_DESCR "|" ANAMAG_DESCRAGG, "", 2); + + browse->set_cursor(c); + browse->set_custom_filter_handler(descr_filter_handler); + } + } + } + } m->set_handler(FR_QTAEVASA, qta_evasa_handler); m->set_handler(FR_CAUS, causmag_handler); diff --git a/ve/velib06a.cpp b/ve/velib06a.cpp index 193a281ce..c5878c9d6 100755 --- a/ve/velib06a.cpp +++ b/ve/velib06a.cpp @@ -1663,7 +1663,11 @@ bool codart_handler(TMask_field& f, KEY key ) const TString& descest = anamag.get("DESCRAGG"); if (descest.not_empty()) - desc << "\n" << descest; + { + if (!mask.doc()[current_doc_row].tipo().extended_desc_search()) + desc << "\n"; + desc << descest; + } if (!mask.doc()[current_doc_row].tipo().no_desc()) row_mask.set(FR_DESCR, desc); @@ -2018,15 +2022,29 @@ bool um_handler( TMask_field& f, KEY key ) bool descr_handler( TMask_field& f, KEY key ) { - if (key == K_TAB && f.focusdirty() && f.mask().is_running()) + if (key == K_TAB && f.focusdirty()) { - const TString& s = f.get(); - if (s.find('\n') < 0) + TMask& row_mask = f.mask( ); + TSheet_field& sh = *row_mask.get_sheet(); + TDocumento_mask & mask = (TDocumento_mask &)sh.mask(); + const TTipo_riga_documento & t = mask.doc()[sh.selected() + 1].tipo(); + + if (t.extended_desc_search()) { TLocalisamfile& anamag = ((TEdit_field&)f).browse()->cursor()->file(); - if (s == anamag.get(ANAMAG_DESCR)) - f.mask().set(FR_CODART, anamag.get(ANAMAG_CODART), 3); + f.mask().set(FR_CODART, anamag.get(ANAMAG_CODART), 3); } + else + if (f.mask().is_running()) + { + const TString& s = f.get(); + if (s.find('\n') < 0) + { + TLocalisamfile& anamag = ((TEdit_field&)f).browse()->cursor()->file(); + if (s == anamag.get(ANAMAG_DESCR)) + f.mask().set(FR_CODART, anamag.get(ANAMAG_CODART), 3); + } + } } return true; } @@ -2805,53 +2823,50 @@ bool gen_livelli_handler(TMask_field& f, KEY key ) const TRectype & anamag = cache().get(LF_ANAMAG, codart); const int items = str->items(); - if (anamag.get_bool(ANAMAG_ARTPROD)) + for (int i = 0; i < items; i++) { - for (int i = 0; i < items; i++) + const TString & name = str->get(i); + if (name.starts_with("PROG")) { - const TString & name = str->get(i); - if (name.starts_with("PROG")) - { - TTable mat(format("VE%1d", livello + 1)); - const int chars = atoi(name.after("PROG")); + TTable mat(format("VE%1d", livello + 1)); + const int chars = atoi(name.after("PROG")); + mat.put("CODTAB", code); + if (mat.read(_isequal) != NOERR) + { + mat.zero(); mat.put("CODTAB", code); - if (mat.read(_isequal) != NOERR) - { - mat.zero(); - mat.put("CODTAB", code); - mat.write(); - } - const int prog = mat.get_int("I0") + 1; - mat.put("I0", prog); - mat.rewrite(); - TString s; s << prog; s.lpad(chars, '0'); - code << s; + mat.write(); + } + const int prog = mat.get_int("I0") + 1; + mat.put("I0", prog); + mat.rewrite(); + TString s; s << prog; s.lpad(chars, '0'); + code << s; + } + else + if (name.starts_with("33.")) + { + TFieldref fld(name.after("33."), LF_DOC); + + code << fld.read(d); } else - if (name.starts_with("33.")) + if (name.starts_with("34.")) { - TFieldref fld(name.after("33."), LF_DOC); - - code << fld.read(d); + TFieldref fld(name.after("34."), LF_RIGHEDOC); + + code << fld.read(r); } else - if (name.starts_with("34.")) + if (name.starts_with("47.")) { - TFieldref fld(name.after("34."), LF_RIGHEDOC); + TFieldref fld(name.after("47."), LF_ANAMAG); - code << fld.read(r); + code << fld.read(anamag); } - else - if (name.starts_with("47.")) - { - TFieldref fld(name.after("47."), LF_ANAMAG); - - code << fld.read(anamag); - } - } - row_mask.set(f.dlg(), code, 0x3); } + row_mask.set(f.dlg(), code, 0x3); } } }