97cf100315
Files correlati : ba1.exe Ricompilazione Demo : [ ] Commento : 0001036: installazione cd patch 180 Installando ex novo ed indicando una società esistente di dati su una cartella diversa viene segnalato l'errore ba1.exe in fase di conversione archivi, richiamando da manutenzione archivi la conversione vengono generati gli errori allegati. Nell'area ftp di Aga, cartella Ilaria allego l'area dati SIDA per il test. git-svn-id: svn://10.65.10.50/trunk@17973 c028cbd2-c16b-5b4b-a496-9718f37d4682
427 lines
9.5 KiB
C++
Executable File
427 lines
9.5 KiB
C++
Executable File
#include <applicat.h>
|
||
#include <execp.h>
|
||
#include <relation.h>
|
||
#include <sheet.h>
|
||
#include <tabutil.h>
|
||
#include <urldefid.h>
|
||
|
||
///////////////////////////////////////////////////////////
|
||
// TSelector_sheet
|
||
///////////////////////////////////////////////////////////
|
||
|
||
class TSelector_sheet : public TCursor_sheet
|
||
{
|
||
TString _field;
|
||
|
||
private:
|
||
static TSelector_sheet* _sheet;
|
||
static bool selector_handler(TMask_field& fld, KEY k);
|
||
|
||
public:
|
||
TSelector_sheet(TCursor& cur, const char* fields, const char* caption,
|
||
const char* head, const TEdit_field& fld);
|
||
};
|
||
|
||
TSelector_sheet* TSelector_sheet::_sheet = NULL;
|
||
|
||
bool TSelector_sheet::selector_handler(TMask_field& fld, KEY k)
|
||
{
|
||
long sel = -1;
|
||
|
||
if (k == K_F2)
|
||
sel = 0;
|
||
|
||
if (k == K_TAB)
|
||
{
|
||
TCursor& cur = *_sheet->cursor();
|
||
((TEdit_field&)fld).autosave(*cur.relation());
|
||
sel = cur.read();
|
||
}
|
||
|
||
if (sel >= 0 && sel != _sheet->selected())
|
||
_sheet->post_select(sel);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
TSelector_sheet::TSelector_sheet(TCursor& cur, const char* fields, const char* caption,
|
||
const char* head, const TEdit_field& c)
|
||
: TCursor_sheet(&cur, fields, caption, head, 0x3, 1, SCREEN_WIN)
|
||
{
|
||
TToken_string cap = c.prompt();
|
||
if (cap.empty())
|
||
cap = caption;
|
||
set_tab_buttons(cap);
|
||
|
||
TString16 flags;
|
||
if (c.roman()) flags << 'M';
|
||
if (c.right_justified()) flags << 'R';
|
||
if (c.uppercase()) flags << 'U';
|
||
if (c.zerofilled()) flags << 'Z';
|
||
const int csize = c.size();
|
||
|
||
TEdit_field* e = NULL;
|
||
switch (c.class_id())
|
||
{
|
||
case CLASS_EDIT_FIELD:
|
||
e = &add_string(c.dlg(), 0, "", 1, 0, csize, flags, csize > 50 ? 50 : csize);
|
||
break;
|
||
case CLASS_REAL_FIELD:
|
||
e = &add_number(c.dlg(), 0, "", 1, 0, csize, flags);
|
||
break;
|
||
case CLASS_DATE_FIELD:
|
||
e = &add_date (c.dlg(), 0, "", 1, 0, flags);
|
||
break;
|
||
default:
|
||
e = NULL;
|
||
break;
|
||
}
|
||
|
||
if (e != NULL)
|
||
{
|
||
e->set_field(c.field()->name());
|
||
_sheet = this;
|
||
e->set_handler(selector_handler);
|
||
}
|
||
}
|
||
|
||
///////////////////////////////////////////////////////////
|
||
// TQuery_string
|
||
///////////////////////////////////////////////////////////
|
||
|
||
class TQuery_string : public TMask
|
||
{
|
||
public:
|
||
TQuery_string(const char* prm, WINDOW parent);
|
||
};
|
||
|
||
TQuery_string::TQuery_string(const char* prm, WINDOW parent)
|
||
: TMask("Richiesta", 1, 52, 6, -1, -1, parent)
|
||
{
|
||
TParagraph_string str(prm, 50);
|
||
for (int y = 0; ; y++)
|
||
{
|
||
const char* s = str.get();
|
||
if (s == NULL)
|
||
break;
|
||
add_static(DLG_NULL, 0, s, 1, y);
|
||
}
|
||
add_string(DLG_USER, 0, "", 1, 4, 50);
|
||
add_button(DLG_CANCEL, 0, "", -12, -1, 10, 2);
|
||
add_button(DLG_OK, 0, "", -22, -1, 10, 2);
|
||
}
|
||
|
||
///////////////////////////////////////////////////////////
|
||
// TSelector_app
|
||
///////////////////////////////////////////////////////////
|
||
|
||
class TSelector_app : public TSkeleton_application
|
||
{
|
||
TFilename _fileini;
|
||
TString _filetable;
|
||
int _filekey;
|
||
TAuto_token_string _fileinput;
|
||
|
||
protected:
|
||
virtual void main_loop();
|
||
|
||
bool find_relapp(TString& app) const;
|
||
bool find_mask_name(TFilename& name) const;
|
||
|
||
public:
|
||
void parse_command_line();
|
||
bool get_mask_name(TFilename& name) const;
|
||
void save_cursor(TCursor& cur, TConfig& ini);
|
||
void save_cursor_key(TCursor& cur, TConfig& ini);
|
||
void run_transaction(const char* trans);
|
||
};
|
||
|
||
bool TSelector_app::find_relapp(TString& app) const
|
||
{
|
||
bool ok = FALSE;
|
||
const int logicnum = atoi(_filetable);
|
||
if (logicnum >= LF_USER)
|
||
{
|
||
TLocalisamfile file(logicnum);
|
||
ok = file.get_relapp(app);
|
||
}
|
||
else
|
||
{
|
||
TTable t(_filetable);
|
||
ok = t.get_relapp(app);
|
||
}
|
||
|
||
if (!ok)
|
||
{
|
||
TString str;
|
||
str << "Non <20> possibile determinare l'applicazione associata al file " << _filetable << ". "
|
||
<< "E' possibile inserire qui il nome del programma (ad esempio 'ba4 -0'). "
|
||
<< "In caso di dubbio premere Annulla.";
|
||
TQuery_string m(str, SCREEN_WIN);
|
||
if (m.run())
|
||
{
|
||
TToken_string s(m.get(DLG_USER), ' ');
|
||
TFilename a = s.get(); a.ext("exe");
|
||
ok = a.exist();
|
||
if (ok)
|
||
{
|
||
app = s;
|
||
s = app.left(2); s << '0'; // default module paragraph
|
||
TConfig ini("install.ini", s);
|
||
str.format("Edit_%d", logicnum);
|
||
ini.set(str, app);
|
||
}
|
||
}
|
||
}
|
||
|
||
return ok;
|
||
}
|
||
|
||
bool TSelector_app::find_mask_name(TFilename& name) const
|
||
{
|
||
TFilename app;
|
||
bool ok = find_relapp(app);
|
||
if (ok)
|
||
{
|
||
if (isdigit(_filetable[0]))
|
||
{
|
||
name = app.left(3);
|
||
name << char(app[5]+1) << "00a.msk";
|
||
if (!name.exist())
|
||
{
|
||
name.rtrim(5);
|
||
name << ".msk";
|
||
}
|
||
}
|
||
else
|
||
{
|
||
name = app.left(2);
|
||
name << "tb";
|
||
const char* t = _filetable;
|
||
if (*t == '%') t++;
|
||
name << t << ".msk";
|
||
}
|
||
}
|
||
ok = name.exist();
|
||
name.ext("");
|
||
return ok;
|
||
}
|
||
|
||
bool TSelector_app::get_mask_name(TFilename& name) const
|
||
{
|
||
const char* t = _filetable;
|
||
if (*t == '%') t++;
|
||
TString16 key; key << "Mask_" << t;
|
||
TConfig ini(CONFIG_DITTA, "ba8");
|
||
name = ini.get(key);
|
||
|
||
bool ok = name.not_empty();
|
||
if (!ok)
|
||
{
|
||
ok = find_mask_name(name);
|
||
if (ok)
|
||
ini.set(key, name);
|
||
}
|
||
|
||
return ok;
|
||
}
|
||
|
||
void TSelector_app::parse_command_line()
|
||
{
|
||
_filetable = "20";
|
||
_filekey = 1;
|
||
_fileinput = "";
|
||
_fileini = "select.ini";
|
||
|
||
if (argc() > 2)
|
||
{
|
||
const TString str = argv(2);
|
||
if (str[0] == '/' || str[0] == '-')
|
||
{
|
||
_fileini = str.mid(2);
|
||
TConfig trans(_fileini, "Transaction");
|
||
TToken_string sel(trans.get("Action"), ' ');
|
||
_filetable = sel.get(1);
|
||
_filekey = sel.get_int();
|
||
_fileinput = sel.get();
|
||
}
|
||
else
|
||
{
|
||
_filetable = str;
|
||
_filekey = argc() > 3 ? atoi(argv(3)) : 1;
|
||
_fileinput = argc() > 4 ? argv(4) : "";
|
||
}
|
||
}
|
||
}
|
||
|
||
void TSelector_app::save_cursor(TCursor& cur, TConfig& ini)
|
||
{
|
||
const TRectype& curr = cur.curr();
|
||
|
||
TString16 para; para << curr.num();
|
||
ini.set_paragraph(para);
|
||
TString str;
|
||
|
||
const int fields = curr.items();
|
||
for (int i = 0; i < fields; i++)
|
||
{
|
||
const char* fieldname = curr.fieldname(i);
|
||
const TString& value = curr.get(fieldname);
|
||
if (!value.blank())
|
||
{
|
||
if (value[0] == ' ' || value.right(1) == " ")
|
||
{
|
||
str.cut(0) << '"' << value << '"';
|
||
ini.set(fieldname, str);
|
||
}
|
||
else
|
||
ini.set(fieldname, value);
|
||
}
|
||
}
|
||
ini.set_paragraph("Transaction");
|
||
}
|
||
|
||
void TSelector_app::save_cursor_key(TCursor& cur, TConfig& ini)
|
||
{
|
||
const TRectype& curr = cur.curr();
|
||
TString16 para; para << curr.num();
|
||
ini.set_paragraph(para);
|
||
|
||
const RecDes& rd = curr.rec_des();
|
||
const KeyDes& kd = rd.Ky[0];
|
||
for (int i = 0; i < kd.NkFields; i++)
|
||
{
|
||
const int nf = kd.FieldSeq[i] % MaxFields;
|
||
const RecFieldDes& rf = rd.Fd[nf];
|
||
ini.set(rf.Name, curr.get(rf.Name));
|
||
}
|
||
ini.set_paragraph("Transaction");
|
||
}
|
||
|
||
void TSelector_app::run_transaction(const char* trans)
|
||
{
|
||
TString cmd;
|
||
bool ok = find_relapp(cmd);
|
||
if (ok)
|
||
{
|
||
TConfig ini(_fileini, "Transaction");
|
||
ini.set("Action", trans);
|
||
}
|
||
if (ok)
|
||
{
|
||
cmd << " /i" << _fileini;
|
||
TExternal_app app(cmd);
|
||
app.run();
|
||
}
|
||
}
|
||
|
||
void TSelector_app::main_loop()
|
||
{
|
||
parse_command_line();
|
||
|
||
TFilename mask_name;
|
||
if (!get_mask_name(mask_name))
|
||
{
|
||
error_box("Impossibile determinare la maschera associata al file %s", (const char*)_filetable);
|
||
return;
|
||
}
|
||
|
||
TMask m(mask_name);
|
||
|
||
TTemp_window tw(TASK_WIN);
|
||
tw.minimize();
|
||
int f;
|
||
|
||
for (f = m.fields()-1; f >= 0; f--)
|
||
{
|
||
TMask_field& field = m.fld(f);
|
||
if (field.in_key(_filekey) && field.is_edit())
|
||
{
|
||
TEdit_field& e = (TEdit_field&)field;
|
||
if (e.browse() != NULL)
|
||
break;
|
||
}
|
||
}
|
||
if (f < 0)
|
||
{
|
||
error_box("Impossibile trovare un campo di browse sulla chiave %d nel file",
|
||
_filekey, (const char*)mask_name);
|
||
return;
|
||
}
|
||
|
||
TEdit_field& efield = (TEdit_field&)m.fld(f);
|
||
TBrowse& b = *efield.browse();
|
||
TCursor& cur = *b.cursor();
|
||
const char* caption = cur.file().description();
|
||
long sel = 0;
|
||
|
||
if (!_fileinput.empty_items())
|
||
{
|
||
TRectype& curr = cur.curr();
|
||
TToken_string ifn = b.get_input_field_names();
|
||
TString val;
|
||
const int maxin = ifn.items() - 1;
|
||
for (int i = 0; i < maxin; i++)
|
||
{
|
||
val = _fileinput.get(i);
|
||
if (val.empty())
|
||
break;
|
||
TFieldref field(ifn.get(i), 0);
|
||
field.write(val, curr);
|
||
}
|
||
cur.setregion(curr, curr);
|
||
|
||
val = _fileinput.get(maxin);
|
||
if (val.not_empty())
|
||
{
|
||
TFieldref field(ifn.get(maxin), 0);
|
||
field.write(val, curr);
|
||
}
|
||
sel = cur.read();
|
||
}
|
||
TSelector_sheet s(cur, b.items(), caption, b.head(), efield);
|
||
s.select(sel);
|
||
|
||
const KEY k = s.run();
|
||
|
||
TConfig ini(_fileini, "Transaction");
|
||
|
||
TString_array list;
|
||
ini.list_paragraphs(list);
|
||
FOR_EACH_ARRAY_ROW(list, r, row) if (*row != "Transaction")
|
||
{
|
||
ini.set_paragraph(*row);
|
||
ini.remove_all();
|
||
}
|
||
ini.set_paragraph("Transaction");
|
||
switch (k)
|
||
{
|
||
case K_ENTER:
|
||
ini.set("Record", s.selected());
|
||
ini.set("Result", "OK");
|
||
ini.set("Error", "0");
|
||
save_cursor(cur, ini);
|
||
break;
|
||
case K_ESC:
|
||
case K_QUIT:
|
||
ini.set("Result", "Cancel");
|
||
ini.set("Error", -1);
|
||
break;
|
||
case K_INS:
|
||
run_transaction("Run");
|
||
break;
|
||
default:
|
||
save_cursor_key(cur, ini);
|
||
run_transaction("Link");
|
||
break;
|
||
}
|
||
}
|
||
|
||
int ba8100(int argc, char* argv[])
|
||
{
|
||
TSelector_app app;
|
||
app.run(argc, argv, "Selector");
|
||
|
||
return 0;
|
||
}
|