From 2cc174f6869139eac2b0bbbfa0159873de787de9 Mon Sep 17 00:00:00 2001 From: Mattia Tollari Date: Tue, 11 Jun 2019 11:01:11 +0200 Subject: [PATCH] =?UTF-8?q?Patch=20level=20=20=20=20=20=20=20=20=20:=2012.?= =?UTF-8?q?0=20no-patch=20Files=20correlati=20=20=20=20=20:=20fp=20Comment?= =?UTF-8?q?o=20=20=20=20=20=20=20=20=20=20=20=20:=20Aggiunto=20parser=20ch?= =?UTF-8?q?e=20legge=20una=20sintassi=20molto=20semplice=20per=20riempire?= =?UTF-8?q?=20le=20personalizzazioni=20di=20Campo,=20attualmente=20sono=20?= =?UTF-8?q?funzioni=20statiche,=20non=20ho=20ancora=20deciso=20se=20tenerl?= =?UTF-8?q?e=20cos=C3=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/fp/fplib.h | 11 +++- src/fp/fplib01.cpp | 157 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 167 insertions(+), 1 deletion(-) diff --git a/src/fp/fplib.h b/src/fp/fplib.h index cc5d1e26a..14ed27a6b 100644 --- a/src/fp/fplib.h +++ b/src/fp/fplib.h @@ -269,6 +269,8 @@ protected: bool export_paf0100f(); bool export_paf3200f(); + + // Record clifo //void set_rec_clifo(char tipocf, long codcf); @@ -284,7 +286,14 @@ public: int commit(); int force_commit(); void set_cache_insert(const bool v) { _cache_insert = v; } - + + // Test + static const TString& parse_expression(const TString& expr, TRiga_documento& rdoc); + static TString& parse_read(const TString& str, TRiga_documento& rdoc); + static TString& do_read(const TString& tabella, const TString& campo, TRiga_documento& rdoc); + static TString& parse_search(const TString& str, TRiga_documento& rdoc); + + TDoc_fp(); ~TDoc_fp(); diff --git a/src/fp/fplib01.cpp b/src/fp/fplib01.cpp index fb2e33cb3..25a38633c 100644 --- a/src/fp/fplib01.cpp +++ b/src/fp/fplib01.cpp @@ -1408,6 +1408,163 @@ bool TDoc_fp::export_paf3200f() return true; } +/* + * Sintassi: + * READ(TABELLA, CAMPO) -> legge dalle tabelle predefinite + * SEARCH(TABELLA, CAMPO, RICERCA) -> legge da una tabella qualsiasi + * SEARCH e READ sono diverse sotto richiesta di Ilaria per avere una sintassi pił chiara + * resto: TExpr_documento() + */ +const TString& TDoc_fp::parse_expression(const TString& expr, TRiga_documento& rdoc) +{ + const TToken_string exprs(expr, '+'); + TString& result = get_tmp_string().cut(0); + TExpr_documento expr_documento(_mixexpr, &rdoc.doc(), &rdoc); + + FOR_EACH_STR_TOKEN(exprs, str) + { + // Come prima cosa trimmo la vita + str.trim(); + if(str.starts_with("READ(", true)) + { + result << parse_read(str, rdoc); + } else if(str.starts_with("SEARCH(", true)) + { + result << parse_search(str, rdoc); + } else + { + // Controllo non sia una ricerca a DB con il punto + if(expr.contains("->")) + { + // Se contiene una freccia non posso fare un TToken_string easy + // Non esistono campi con -> vero? + str.replace("->", "."); + } + + // Questo diventa true se sono passato sopra o effettivamente ha un punto dall'inizio + if(expr.contains('.')) + { + TToken_string simple_field(expr, '.'); + result << do_read(simple_field.get(0), simple_field.get(), rdoc); + } + // Se inizia come una stringa o non contiene parentesi -> no expr + else if (str.starts_with("\"") || !(str.contains("(") && str.contains(")"))) + { + str.replace("\"", ""); + result << str; + } + else + { + expr_documento.set(str, _mixexpr); + result << expr_documento.as_string(); + } + } + } + + return result; +} + +void extract_info(const TString& expr, TString& tabella, TString& campo, TToken_string* search) +{ + // Prendo la stringa pulita della parte sinistra + TString clean_expr = expr.mid(expr.find('(') + 1); + // Tolgo eventuali spazi ai lati + clean_expr.trim(); + // Tolgo la virgola finale + clean_expr.rtrim(1); + TToken_string info(clean_expr, ','); + + // Trimmare sempre come se non sapessi fare altro nella vita + tabella.cut(0) << info.remove(0); tabella.trim(); + campo.cut(0) << info.remove(0); campo.trim(); + if(search != nullptr) + { + // Prendo il resto + search->cut(0) << info; + search->trim(); + search->restart(); + } +} + +bool calc_table(const TString& tabella, int& file) +{ + file = atoi(tabella); + if (file == 0) + file = table2logic(tabella); + return is_multi_table(file); +} + +TString& TDoc_fp::parse_read(const TString& str, TRiga_documento& rdoc) +{ + TString tabella, campo; + + extract_info(str, tabella, campo, nullptr); + + return do_read(tabella, campo, rdoc); +} + +TString& TDoc_fp::do_read(const TString& tabella, const TString& campo, TRiga_documento& rdoc) +{ + TString& result = get_tmp_string().cut(0); + int file; + + bool multi_table = calc_table(tabella, file); + + switch (file) + { + case LF_DOC: + result = rdoc.doc().get(campo); + break; + case LF_RIGHEDOC: + result = rdoc.get(campo); + break; + case LF_CLIFO: + result = rdoc.doc().clifor().get(campo); + break; + case LF_CFVEN: + result = rdoc.doc().clifor().vendite().get(campo); + break; + case LF_LETINT: + result = rdoc.doc().clifor().lettera().get(campo); + break; + case LF_ANAMAG: + result = rdoc.articolo().get(campo); + break; + default: + // Skip + break; + } + + return result; +} + +TString& TDoc_fp::parse_search(const TString& str, TRiga_documento& rdoc) +{ + TString& result = get_tmp_string(); + + TString tabella, campo; + TToken_string input_search, search; + int file; + + extract_info(str, tabella, campo, &input_search); + const bool multi_table = calc_table(tabella, file); + + // Parso ogni singolo token della ricerca + FOR_EACH_TOKEN(input_search, tok) + { + search.add(parse_expression(tok, rdoc)); + } + + if(multi_table) + { + result.cut(0) << cache().get(tabella, search, campo); + } else + { + result.cut(0) << cache().get(file, search, campo); + } + return result; +} + bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) {