Patch level : 12.0 no-patch

Files correlati     : fp
Commento            : Aggiunto parser che legge una sintassi molto semplice per riempire le personalizzazioni di Campo, attualmente sono funzioni statiche, non ho ancora deciso se tenerle così
This commit is contained in:
Mattia Tollari 2019-06-11 11:01:11 +02:00
parent 68b7da3923
commit 2cc174f686
2 changed files with 167 additions and 1 deletions

View File

@ -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();

View File

@ -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)
{