Patch level : 12.00 1400

Files correlati     : ca3.exe ca3A00.msk ca3A00a.rep ca3A00b.rep ca3A00c.rep ca0500a.msk camenu.men f146.dir d146.trr

Commento                :
Stampa prospetto enti di ricerca
This commit is contained in:
Alessandro Bonazzi 2025-12-23 00:27:39 +01:00
parent debb69fcbc
commit 873ce000dc
4 changed files with 289 additions and 29 deletions

View File

@ -2428,6 +2428,7 @@ void TTabulator::add_field(int column, int width)
if (find_column(column, width, idx, col)) if (find_column(column, width, idx, col))
{ {
TTab_info& ti = (TTab_info&)_tab[idx]; TTab_info& ti = (TTab_info&)_tab[idx];
if (ti.intersection(start, end) < width) if (ti.intersection(start, end) < width)
{ {
split(start, end, ti.start(), ti.end()); split(start, end, ti.start(), ti.end());
@ -2437,6 +2438,9 @@ void TTabulator::add_field(int column, int width)
{ {
if (ti.start() == column && end > ti.end() && end < ti.end()+4) if (ti.start() == column && end > ti.end() && end < ti.end()+4)
ti.set_end(end); ti.set_end(end);
else
if (ti.start() == column && end < ti.end() && end > 0)
ti.set_end(end);
} }
} }
else else

View File

@ -277,7 +277,9 @@ void TReport_expr::evaluate_user_func(int index, int nparms, TEval_stack& stack,
const TVariant& TReport_expr::as_variant(TFieldtypes ft) const TVariant& TReport_expr::as_variant(TFieldtypes ft)
{ {
set_type(ft == _alfafld || ft == _nullfld ? _strexpr : _numexpr); set_type(ft == _alfafld || ft == _nullfld ? _strexpr : _numexpr);
const TString& str = as_string(); const TString& str = as_string();
switch (ft) switch (ft)
{ {
case _boolfld: _var.set(str=="X"||str=="Y"||str=="1"); break; case _boolfld: _var.set(str=="X"||str=="Y"||str=="1"); break;
@ -955,6 +957,7 @@ TString& TReport_script::translate_message(TReport& rep) const
{ {
TString& alx = msg_empty ? empty_alex : alex; TString& alx = msg_empty ? empty_alex : alex;
TString arg; TString arg;
for (int i = args.items()-1; i >= 0; i--) for (int i = args.items()-1; i >= 0; i--)
{ {
arg = args.get(i); arg = args.get(i);
@ -1252,6 +1255,7 @@ void TReport_field::set_postscript(const char* src)
void TReport_field::copy(const TReport_field& rf) void TReport_field::copy(const TReport_field& rf)
{ {
// don't copy _original
_id = rf.id(); _id = rf.id();
_type = rf.type(); _type = rf.type();
_rct = rf._rct; _rct = rf._rct;
@ -1526,6 +1530,7 @@ const TReport_rct& TReport_field::compute_draw_rect(const TBook& book)
if (dynamic_height()) if (dynamic_height())
{ {
const TString& txt = formatted_text(); const TString& txt = formatted_text();
if (txt.full()) if (txt.full())
{ {
TString_array para; TString_array para;
@ -2010,7 +2015,7 @@ int TReport_field::compare(const TSortable& s) const
} }
TReport_field::TReport_field(TReport_section* sec) TReport_field::TReport_field(TReport_section* sec)
: _section(sec), _id(0), _type('T'), _rct(0,0,1000,100), : _section(sec), _original(nullptr), _id(0), _type('T'), _rct(0,0,1000,100),
_txcolor(COLOR_BLACK), _fgcolor(COLOR_BLACK), _bgcolor(COLOR_WHITE), _txcolor(COLOR_BLACK), _fgcolor(COLOR_BLACK), _bgcolor(COLOR_WHITE),
_shcolor(COLOR_GRAY), _pattern(PAT_HOLLOW), _shcolor(COLOR_GRAY), _pattern(PAT_HOLLOW),
_radius(0), _shadow_offset(0), _shade_angle(0), _radius(0), _shadow_offset(0), _shade_angle(0),
@ -2021,7 +2026,7 @@ TReport_field::TReport_field(TReport_section* sec)
{ } { }
TReport_field::TReport_field(const TReport_field& rf) TReport_field::TReport_field(const TReport_field& rf)
: _section(nullptr), _font(nullptr), _print_font(nullptr), _draw_hidden(false), : _section(nullptr), _original(nullptr), _font(nullptr), _print_font(nullptr), _draw_hidden(false),
_draw_deactivated(false) _draw_deactivated(false)
{ {
@ -2031,7 +2036,7 @@ TReport_field::TReport_field(const TReport_field& rf)
TReport_field::~TReport_field() TReport_field::~TReport_field()
{ {
safe_delete(_font); safe_delete(_font);
safe_delete(_original);
safe_delete(_print_font); safe_delete(_print_font);
} }
@ -2187,6 +2192,176 @@ TReport_section& TReport::section(char type, int level)
return *sec; return *sec;
} }
HIDDEN const TString & patch_col(TString & src, const char * pattern, int val)
{
int pos = src.find(pattern);
while (pos >= 0)
{
TString str = src.sleft(pos);
str << val << src.smid(pos + 4);
src = str;
pos = src.find(pattern);
}
return src;
}
HIDDEN const TString & patch_id(TString & src, int val)
{
int pos = src.find("CID");
while (pos >= 0)
{
TString str = src.sleft(pos);
str << val + atoi(src.smid(pos + 1));
pos += 4;
while (src[++pos] && (isdigit(src[pos]) || src[pos] == ')'));
str << src.smid(pos);
src = str;
pos = src.find("CID");
}
return src;
}
int TReport::add_column_group(int col, int x_offset)
{
int col_width = 0;
++_last_column;
FOR_EACH_ASSOC_OBJECT(_sections, os, sec_key0, sec_item0)
{
TReport_section & sect = *(TReport_section *)sec_item0;
const int items = sect.items();
TReport_field * first_field = sect.find_field(_from_column_id);
int startcol = first_field != nullptr ? first_field->x() : 0;
for (int i = 0; i < items; i++)
{
const TReport_field & field = sect.field(i);
int id = field.id();
if (check_column_id(id))
{
int width = field.x() - startcol + field.width();
if (width > col_width)
col_width = width;
}
}
}
FOR_EACH_ASSOC_OBJECT(_sections, os, sec_key, sec_item)
{
TReport_section & sect = *(TReport_section *)sec_item;
const int items = sect.items();
for (int i = 0; i < items; i++)
{
const TReport_field & field = sect.field(i);
int id = field.id();
if (check_column_id(id))
{
TReport_field * new_field = new TReport_field(sect.field(i));
int y = field.x() + _last_column * col_width + x_offset;
new_field->set_pos(field.x(), y);
new_field->set_id(new_field->id() + _last_column * _id_offset);
set_column_field(*new_field, _last_column);
TString src = new_field->field();
sect.add(new_field);
patch_col(src, "#COL", col);
if (src.full())
new_field->set_field(src);
src = new_field->prescript();
if (src.full())
{
patch_col(src, "#COL", col);
patch_id(src, _from_column_id + _last_column * _id_offset);
new_field->set_prescript(src);
}
src = new_field->postscript();
if (src.full())
{
patch_col(src, "#COL", col);
patch_id(src, _from_column_id + _last_column * _id_offset);
new_field->set_postscript(src);
}
}
}
}
return _last_column;
}
void TReport::patch_base_column()
{
FOR_EACH_ASSOC_OBJECT(_sections, os, sec_key, sec_item)
{
TReport_section & sect = *(TReport_section *)sec_item;
const int items = sect.items();
int col_width = 0;
for (int i = 0; i < items; i++)
{
TReport_field & field = (TReport_field &) sect.field(i);
int id = field.id();
if (check_column_id(id))
{
TString src = field.field();
if (src.full())
{
patch_col(src, "#COL", 0);
field.set_field(src);
}
src = field.prescript();
if (src.full())
{
patch_col(src, "#COL", 0);
patch_id(src, _from_column_id);
field.set_prescript(src);
}
src = field.postscript();
if (src.full())
{
patch_col(src, "#COL", 0);
patch_id(src, _from_column_id);
field.set_postscript(src);
}
}
}
}
}
TReport_field* TReport::column_field(const char* code, int column)
{
char type = ' ';
int level = -1, id = 0;
const int k = parse_field(code, type, level, id);
id = field_column_id(id, column);
TReport_field* rf = nullptr;
if (k == 3)
{
if (id > 0)
{
TReport_section* sec = find_section(type, level);
if (sec != nullptr)
rf = sec->find_field(id);
}
else
rf = curr_field();
}
return rf;
}
// Parsa un riferimento a campo, gruppo o sezione // Parsa un riferimento a campo, gruppo o sezione
// #B0 -> 2 B 0 // #B0 -> 2 B 0
// #101 -> 3 B 1 101 // #101 -> 3 B 1 101
@ -2355,6 +2530,7 @@ bool TReport::load(const char* fname)
// Carico la query principale PRIMA delle sezioni che potrebbero collegarvicisi // Carico la query principale PRIMA delle sezioni che potrebbero collegarvicisi
const TXmlItem* sql = xml.FindFirstChild("sql"); const TXmlItem* sql = xml.FindFirstChild("sql");
if (sql != nullptr) if (sql != nullptr)
{ {
TString str; sql->GetEnclosedText(str); TString str; sql->GetEnclosedText(str);
@ -2430,6 +2606,7 @@ bool TReport::save(const char* fname) const
if (ok) if (ok)
{ {
TXmlItem xml; TXmlItem xml;
xml.SetTag("report"); xml.SetTag("report");
xml.SetAttr("name", name); xml.SetAttr("name", name);
xml.SetAttr("class", _class); xml.SetAttr("class", _class);
@ -2798,6 +2975,7 @@ size_t TReport::add_usr_words(TString_array& words, const char* const names[]) c
TReport::get_usr_words(words); TReport::get_usr_words(words);
const int first_msg = words.items(); // Calcola il primo numero disponibile const int first_msg = words.items(); // Calcola il primo numero disponibile
for (size_t i = 0; names[i] != nullptr; i++) for (size_t i = 0; names[i] != nullptr; i++)
words.add(names[i]); words.add(names[i]);
@ -3040,6 +3218,7 @@ void TReport::reset_export_sections()
} }
} }
set_dbase_fixed_fields(false); set_dbase_fixed_fields(false);
restore_dynamic_fields();
} }
@ -3084,6 +3263,18 @@ void TReport::set_export4dbase()
TReport_section * sect = (TReport_section *)sec_item; TReport_section * sect = (TReport_section *)sec_item;
sect->show(sect->shown() && sec_id.starts_with("B")); sect->show(sect->shown() && sec_id.starts_with("B"));
if (sec_id.starts_with("B"))
{
const int items = sect->items();
for (int i = 0; i < items; i++)
{
TReport_field & field = sect->field(i);
if (field.zeroes_hidden())
field.hide_zeroes(false);
}
}
} }
} }
@ -3093,27 +3284,59 @@ void TReport::set_export_sections(export_type type)
{ {
case _export_printer : case _export_printer :
set_export4print(); set_export4print();
restore_dynamic_fields();
break; break;
case _export_visualize : case _export_visualize :
set_export4visualize(); set_export4visualize();
restore_dynamic_fields();
break; break;
case _export_excel : case _export_excel :
set_export4excel(); set_export4excel();
set_dynamic_fields();
break; break;
case _export_dbase: case _export_dbase:
set_export4dbase(); set_export4dbase();
set_dynamic_fields();
break; break;
case _export_pdf : case _export_pdf :
set_export4pdf(); set_export4pdf();
restore_dynamic_fields();
break; break;
case _export_text : case _export_text :
set_export4text(); set_export4text();
restore_dynamic_fields();
break;
default: default:
break; break;
} }
set_dbase_fixed_fields(type == _export_dbase); set_dbase_fixed_fields(type == _export_dbase);
} }
void TReport::set_dynamic_fields(bool on)
{
FOR_EACH_ASSOC_OBJECT(_sections, obj, key, item)
{
TReport_section & sect = (TReport_section &)*item;
FOR_EACH_ARRAY_ITEM(sect, r, objfld)
{
TReport_field & fld = (TReport_field &)*objfld;
if (on)
{
if (fld.dynamic_height())
{
fld.copy_original();
fld.set_height(100);
fld.set_dynamic_height(false);
}
}
else
fld.clear_original();
}
}
}
KEY TReport::run_form(TMask& m) KEY TReport::run_form(TMask& m)
{ {
report2mask(m); report2mask(m);
@ -3128,9 +3351,11 @@ KEY TReport::run_form(const TString& maskname)
{ {
TFilename fname = maskname; fname.ext("msk"); TFilename fname = maskname; fname.ext("msk");
KEY key = K_QUIT; KEY key = K_QUIT;
if (fname.custom_path()) if (fname.custom_path())
{ {
TMask m(maskname); TMask m(maskname);
key = run_form(m); key = run_form(m);
switch (key) switch (key)
{ {
@ -3545,7 +3770,7 @@ bool TReport::execute_usr_word(unsigned int opcode, TVariant_stack& stack)
} }
break; break;
case 9: // HIDE case 9: // HIDE
do_message(stack.pop(), do_show, NULL); do_message(stack.pop(), do_show, nullptr);
break; break;
case 10: // ISAM_READ case 10: // ISAM_READ
msg_isam_read(stack); msg_isam_read(stack);
@ -3732,6 +3957,7 @@ void TReport::include_libraries(bool reload)
libname.trim(); libname.trim();
if (libname.find('.') < 0) if (libname.find('.') < 0)
libname.ext("alx"); libname.ext("alx");
if (libname.exist())
include(libname); include(libname);
} }
} }
@ -3782,7 +4008,8 @@ TReport::TReport()
: _cpi(0), _lpi(6), _include(15, ','), _recordset(nullptr), _curr_field(nullptr), : _cpi(0), _lpi(6), _include(15, ','), _recordset(nullptr), _curr_field(nullptr),
_use_printer_font(false), _save_last_printer(false), _orientation(0), _use_printer_font(false), _save_last_printer(false), _orientation(0),
_page_split(false), _page_merge(false), _rep_copy(1), _rep_copies(1), _page_split(false), _page_merge(false), _rep_copy(1), _rep_copies(1),
_rep_page(0), _book_page(0) _rep_page(0), _book_page(0), _id_offset(200), _from_column_id(0), _to_column_id(0),
_last_column(0)
{ {
_expressions.set_report(this); _expressions.set_report(this);
_prescript.set_description("PRESCRIPT"); _prescript.set_description("PRESCRIPT");

View File

@ -272,8 +272,6 @@ public:
const TReport_pnt& pos() const { return _pos; } const TReport_pnt& pos() const { return _pos; }
void set_pos(const TReport_pnt& p) { _pos = p; } void set_pos(const TReport_pnt& p) { _pos = p; }
void set_fore_color(COLOR c) { _fgcolor = c; } void set_fore_color(COLOR c) { _fgcolor = c; }
COLOR fore_color() const { return _fgcolor; } COLOR fore_color() const { return _fgcolor; }
void set_back_color(COLOR c) { _bgcolor = c; } void set_back_color(COLOR c) { _bgcolor = c; }
@ -353,7 +351,8 @@ struct TReport_array_item;
class TReport_field : public TSortable class TReport_field : public TSortable
{ {
TReport_section* _section; TReport_section * _section;
TReport_field * _original;
int _id; int _id;
char _type; // Text, String, Numeric, Price, Valuta, Date, Boolean, Line, Rectangle, Image char _type; // Text, String, Numeric, Price, Valuta, Date, Boolean, Line, Rectangle, Image
TReport_rct _rct; // In centesimi TReport_rct _rct; // In centesimi
@ -411,6 +410,12 @@ public:
const TString& alternate_field() const { return _alt_field; } const TString& alternate_field() const { return _alt_field; }
void set_alternate_field(const char* str) { _alt_field = str; } void set_alternate_field(const char* str) { _alt_field = str; }
const TString & prescript_source() const { return _prescript.get(); }
void prescript_source(const char * source) { _prescript.set(source); }
const TString & postscript_source() const { return _postscript.get(); }
void postscript_source(const char * source) { _postscript.set(source); }
const TVariant& get() const { return _var; } const TVariant& get() const { return _var; }
void set(const char* str); void set(const char* str);
void set(const TString& str); void set(const TString& str);
@ -445,8 +450,10 @@ public:
void set_width(long dx) { _rct.set_width(dx); } void set_width(long dx) { _rct.set_width(dx); }
void set_height(long dy) { _rct.set_height(dy); } void set_height(long dy) { _rct.set_height(dy); }
const TReport_rct& get_rect() const { return _rct; } const TReport_rct& get_rect() const { return _rct; }
long x() const { return _rct.x; }
long y() const { return _rct.y; }
long width() const { return _rct.width(); } long width() const { return _rct.width(); }
long height() const { _rct.height(); } long height() const { return _rct.height(); }
void set_dynamic_height(bool dh); void set_dynamic_height(bool dh);
bool dynamic_height() const; bool dynamic_height() const;
@ -538,6 +545,9 @@ public:
TReport_field* next() const; TReport_field* next() const;
TReport_field* prev() const; TReport_field* prev() const;
void copy_original() { _original = new TReport_field(*this); }
void clear_original() { safe_delete(_original); }
TReport_field(TReport_section* sec); TReport_field(TReport_section* sec);
TReport_field(const TReport_field& rf); TReport_field(const TReport_field& rf);
virtual ~TReport_field(); virtual ~TReport_field();
@ -590,6 +600,10 @@ class TReport : public TAlex_virtual_machine
TReport_field* _curr_field; TReport_field* _curr_field;
bool _page_split, _page_merge; bool _page_split, _page_merge;
TAssoc_array _default_shown_sections; TAssoc_array _default_shown_sections;
int _id_offset;
int _from_column_id;
int _to_column_id;
int _last_column;
protected: protected:
virtual const char* class_name() const { return "Report"; } virtual const char* class_name() const { return "Report"; }
@ -629,12 +643,15 @@ public:
virtual const char * get_excel_disabled_field() { return ""; } virtual const char * get_excel_disabled_field() { return ""; }
virtual void set_dbase_fixed_fields(bool on = true) {} virtual void set_dbase_fixed_fields(bool on = true) {}
void reset_export_sections(); void reset_export_sections();
void restore_dynamic_fields() { set_dynamic_fields(false); }
void set_export_sections(export_type type); void set_export_sections(export_type type);
virtual void set_export4print() {}; void set_dynamic_fields(bool on = true);
virtual void set_export4visualize() {};
virtual void set_export4print() { };
virtual void set_export4visualize() { };
virtual void set_export4excel(); virtual void set_export4excel();
virtual void set_export4pdf() {}; virtual void set_export4pdf() { };
virtual void set_export4text() {}; virtual void set_export4text() { };
virtual void set_export4dbase(); virtual void set_export4dbase();
virtual bool on_link(const TReport_link& link); virtual bool on_link(const TReport_link& link);
@ -705,6 +722,15 @@ public:
bool load(const char* fname); bool load(const char* fname);
void show_all_sections(); void show_all_sections();
void set_id_offset(int id_offset = 100) { _id_offset = id_offset; }
void set_column_id(int from_column_id, int to_column_id) { _from_column_id = from_column_id; _to_column_id = to_column_id; set_id_offset(_to_column_id - _from_column_id + 1); }
bool check_column_id(int id) const { return (id >= _from_column_id) && (id <= _to_column_id); }
virtual TReport_field * set_column_field(TReport_field & field, int column = 0) { return &field; }
virtual int add_column_group(int col, int x_offest = 0);
void patch_base_column();
int field_column_id(int id, int column = 0) const { return check_column_id(id) ? id + column * _id_offset : id; }
TReport_field* column_field(const char* code, int column = 0);
// Used by TReport_printer // Used by TReport_printer
void set_page(word r, word p) { _rep_page = r; _book_page = p; } void set_page(word r, word p) { _rep_page = r; _book_page = p; }
void set_copy(word c, word s) { _rep_copy = c; _rep_copies = s; } void set_copy(word c, word s) { _rep_copy = c; _rep_copies = s; }
@ -732,7 +758,9 @@ public:
bool export_text(const char * filename, int size = 0, bool signature = false); bool export_text(const char * filename, int size = 0, bool signature = false);
TReport(); TReport();
TReport(const char * name) : _recordset(nullptr), _curr_field(nullptr) { load(name); } TReport(const char * name) : _recordset(nullptr), _curr_field(nullptr), _id_offset(200), _from_column_id(0),
_to_column_id(0), _last_column(0)
{ load(name); }
virtual ~TReport(); virtual ~TReport();
}; };

View File

@ -1289,7 +1289,7 @@ void TBook::print_doc(TWindow& win, const TFilename& name)
if (ext == "bmp" || ext == "gif" || ext == "jpg" || ext == "jpeg" || ext == "png") if (ext == "bmp" || ext == "gif" || ext == "jpg" || ext == "jpeg" || ext == "png")
{ {
const TImage* img = _images.image(name); const TImage* img = _images.image(name);
if (img != NULL) if (img != nullptr)
{ {
const TSize pr = page_res(); const TSize pr = page_res();
rect.deflate(pr.x/2, pr.y/2); rect.deflate(pr.x/2, pr.y/2);
@ -1984,7 +1984,8 @@ bool TBook::export_excel(TFilename& fname, bool signature, bool goto_url, bool a
{ {
// <text owner=B1> // <text owner=B1>
const char* section = str.get(1); const char* section = str.get(1);
if ((section[0] == 'B'||section[0]=='F' || section[0] == 'H') && section[1]>'0')
if ((section[0] == 'B'|| section[0]=='F' && section[1] > '0') || section[0] == 'H')
tab.add_field(col, wid); tab.add_field(col, wid);
// Raggiunge fine del testo // Raggiunge fine del testo
while (str != "</text>" && !ifs.eof()) while (str != "</text>" && !ifs.eof())
@ -2036,12 +2037,13 @@ bool TBook::export_excel(TFilename& fname, bool signature, bool goto_url, bool a
if (do_export && str.full()) if (do_export && str.full())
{ {
int idx, pos; int idx, pos;
if (tab.find_column(col, wid, idx, pos, true)) if (tab.find_column(col, wid, idx, pos, true))
{ {
TToken_string* line = (TToken_string*)page.objptr(row); TToken_string* line = (TToken_string*)page.objptr(row);
TString field; TString field;
if (line == NULL) if (line == nullptr)
{ {
line = new TToken_string(256,sep); line = new TToken_string(256,sep);
page.add(line, row); page.add(line, row);
@ -2798,7 +2800,6 @@ long TReport_book::print_section(TReport_section& rs)
if (rs.condition().full()) if (rs.condition().full())
{ {
TVariant var; TVariant var;
_report->evaluate(rs.condition(), var, _alfafld); _report->evaluate(rs.condition(), var, _alfafld);
if (!var.as_bool()) if (!var.as_bool())
return -2; return -2;