7640483af1
Files correlati : Ricompilazione Demo : [ ] Commento : Migliorata connessione a tabella BNP git-svn-id: svn://10.65.10.50/trunk@20298 c028cbd2-c16b-5b4b-a496-9718f37d4682
295 lines
6.4 KiB
C++
Executable File
295 lines
6.4 KiB
C++
Executable File
#include <applicat.h>
|
|
#include <checks.h>
|
|
|
|
#define __TABUTIL_CPP
|
|
#include <tabutil.h>
|
|
|
|
#include <config.h>
|
|
#include <extcdecl.h>
|
|
#include <scanner.h>
|
|
#include <utility.h>
|
|
|
|
int TTable::name2log(const char* n)
|
|
{
|
|
return *n == '%' ? LF_TABCOM : (*n == '#' ? LF_TABGEN : LF_TAB);
|
|
}
|
|
|
|
|
|
TTable::TTable(const char* tabname)
|
|
: TLocalisamfile(name2log(tabname))
|
|
{
|
|
if ((*tabname == '%') || (*tabname == '#')) tabname++;
|
|
_tabname = tabname;
|
|
_tabname.upper();
|
|
curr().settab(_tabname);
|
|
_des_mod_loaded = FALSE;
|
|
}
|
|
|
|
TTable::~TTable()
|
|
{}
|
|
|
|
int TTable::skip(TRecnotype nrec, word lockop)
|
|
|
|
{
|
|
if (!nrec) return NOERR;
|
|
TBaseisamfile::skip(nrec, lockop);
|
|
if (_tabname != get("COD"))
|
|
{
|
|
if (nrec > 0)
|
|
{
|
|
if (lockop == _lock)
|
|
TBaseisamfile::reread(_unlock);
|
|
last(lockop);
|
|
setstatus(_iseof);
|
|
}
|
|
else
|
|
{
|
|
if (lockop == _lock)
|
|
TBaseisamfile::reread(_unlock);
|
|
first(lockop);
|
|
setstatus(_isbof);
|
|
}
|
|
}
|
|
return status();
|
|
}
|
|
|
|
|
|
int TTable::_read(TRectype& rec, word op, word lockop)
|
|
|
|
{
|
|
if (op == _isfirst)
|
|
{
|
|
zero();
|
|
TBaseisamfile::_read(rec, _isgteq, lockop);
|
|
if (_tabname != rec.get("COD"))
|
|
setstatus(_isemptyfile);
|
|
if (bad())
|
|
zero();
|
|
}
|
|
else
|
|
if (op == _islast)
|
|
{
|
|
zero();
|
|
put("CODTAB", "\xFF");
|
|
TBaseisamfile::_read(rec, _isgteq);
|
|
if (!eof())
|
|
TBaseisamfile::_read(rec, _isprev, lockop);
|
|
else
|
|
setstatus(NOERR);
|
|
if (bof())
|
|
setstatus(NOERR);
|
|
if (_tabname != rec.get("COD"))
|
|
setstatus(_isemptyfile);
|
|
if (bad())
|
|
zero();
|
|
}
|
|
else
|
|
if (op == _isprev)
|
|
{
|
|
const TRecnotype nrec = recno();
|
|
|
|
TBaseisamfile::_read(rec, _isprev, lockop);
|
|
if (_tabname != rec.get("COD"))
|
|
{
|
|
if (lockop == _lock) reread(_unlock);
|
|
readat(rec, nrec, lockop);
|
|
setstatus(_isbof);
|
|
}
|
|
}
|
|
else
|
|
if (op == _isnext)
|
|
{
|
|
const TRecnotype nrec = recno();
|
|
|
|
TBaseisamfile::_read(rec, _isnext, lockop);
|
|
if (_tabname != rec.get("COD"))
|
|
{
|
|
if (lockop == _lock) reread(_unlock);
|
|
readat(rec, nrec, lockop);
|
|
setstatus(_iseof);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
TBaseisamfile::_read(rec, op, lockop);
|
|
if (_tabname != rec.get("COD"))
|
|
{
|
|
if (lockop == _lock) reread(_unlock);
|
|
last(lockop);
|
|
setstatus(_iseof);
|
|
}
|
|
}
|
|
return status();
|
|
}
|
|
|
|
int TTable::_readat(TRectype& rec ,TRecnotype nrec, word lockop)
|
|
{
|
|
TBaseisamfile::_readat(rec, nrec, lockop);
|
|
CHECKS(_tabname == rec.get("COD"), "Invalid position : Table ", (const char *)_tabname);
|
|
return status();
|
|
}
|
|
|
|
bool TTable::empty()
|
|
{
|
|
return read(_isfirst) != NOERR;
|
|
}
|
|
|
|
void TTable::load_module_description()
|
|
{
|
|
// Setta il modulo al quale appartiene la tabella e la relativa descrizione.
|
|
// Cerca prima in RECDESC il relativo file di descrizione: D<TAB_NAME>.DES
|
|
// Se il file esiste, se il paragrafo [TabDescr] esiste e se esiste la
|
|
// variabile Module ne prende il valore.
|
|
// Se non si verificano le suddette condizioni procede come segue:
|
|
// cerca se esiste il file ??<TAB_NAME>.MSK tramite la funzione list_files(),
|
|
// ne estrae il module dai primi 2 caratteri e la descrizione dalla intestazione
|
|
// della prima pagina.
|
|
_des_mod_loaded = TRUE;
|
|
TFilename n;
|
|
n << "recdesc/d" << _tabname;
|
|
n.ext("des");
|
|
n.lower();
|
|
if (n.exist())
|
|
{
|
|
TConfig des(n, "TabDescr");
|
|
_module = des.get("Module");
|
|
}
|
|
n = "??tb";
|
|
n << _tabname;
|
|
n.ext("msk");
|
|
n.lower();
|
|
|
|
TString_array f;
|
|
int nfiles = list_files(n, f);
|
|
|
|
//gestisce il caso in cui le maschere di tabella siano multiple e iniziano con ba o nome modulo
|
|
if (nfiles > 1)
|
|
{
|
|
const TString4 preferred = main_app().name().left(2);
|
|
for (int i = nfiles - 1; i >= 0; i--)
|
|
{
|
|
n = f.row(i);
|
|
if (n.starts_with("ba"))
|
|
f.destroy(i, true);
|
|
else
|
|
{
|
|
if (n.starts_with(preferred))
|
|
{
|
|
f.destroy();
|
|
f.add(n);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
nfiles = f.items();
|
|
}
|
|
if (nfiles == 1)
|
|
{
|
|
n = f.row(0);
|
|
if (!n.exist())
|
|
n.overwrite("ba",0);
|
|
if (n.exist())
|
|
{
|
|
if (_module.empty())
|
|
{
|
|
_module = n.left(2);
|
|
_module.lower();
|
|
}
|
|
TScanner m(n);
|
|
bool ok = TRUE;
|
|
while (ok)
|
|
{
|
|
const TString& l2 = m.line().left(2);
|
|
if (l2.empty())
|
|
ok = FALSE;
|
|
else
|
|
if (l2 == "PA")
|
|
break;
|
|
}
|
|
if (ok)
|
|
{
|
|
const int apicia = m.token().find('"')+1;
|
|
const int apicic = m.token().find('"', apicia);
|
|
_description = m.token().sub(apicia, apicic);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (_module.blank())
|
|
_module = "ba";
|
|
}
|
|
|
|
const char* TTable::module()
|
|
{
|
|
if (!_des_mod_loaded)
|
|
load_module_description();
|
|
return _module;
|
|
}
|
|
|
|
const char* TTable::description()
|
|
{
|
|
if (!_des_mod_loaded)
|
|
load_module_description();
|
|
return _description;
|
|
}
|
|
|
|
struct TCallbackTableinfo
|
|
{
|
|
TString16 _var1, _var2, _var3;
|
|
TString4 _module;
|
|
TFilename _tabapp, _relapp;
|
|
};
|
|
|
|
HIDDEN int find_relapp(TConfig& cfg, void* jolly)
|
|
{
|
|
TCallbackTableinfo& info = *((TCallbackTableinfo*)jolly);
|
|
|
|
if (cfg.exist(info._var1))
|
|
{
|
|
info._tabapp = cfg.get(info._var1);
|
|
if (info._tabapp.not_empty())
|
|
return 1;
|
|
}
|
|
if (cfg.get_paragraph().compare(info._module, 2, TRUE) == 0)
|
|
{
|
|
if (cfg.exist(info._var2))
|
|
{
|
|
info._relapp = cfg.get(info._var2);
|
|
if (info._relapp.not_empty())
|
|
return 2;
|
|
}
|
|
if (cfg.exist(info._var3))
|
|
{
|
|
info._relapp = cfg.get(info._var3);
|
|
if (info._relapp.not_empty())
|
|
return 3;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
bool TTable::get_relapp(TString& app) const
|
|
{
|
|
TConfig ini(CONFIG_GENERAL);
|
|
TCallbackTableinfo fi;
|
|
fi._var1.format("Edit_%s", (const char*)_tabname);
|
|
fi._var2.format("Edit_%d", num());
|
|
fi._var3.format("Edit_%d", num() == LF_TAB ? LF_TABCOM : LF_TAB);
|
|
fi._module = ((TTable*)this)->module();
|
|
ini.for_each_paragraph(find_relapp, &fi);
|
|
|
|
app = fi._tabapp;
|
|
if (app.empty())
|
|
app = fi._relapp;
|
|
if (app.empty() && fi._module.compare("ba", 2, TRUE) != 0)
|
|
app = ini_get_string(CONFIG_STUDIO, fi._module, "TabPrg");
|
|
if (app.empty())
|
|
app = "ba3 -0";
|
|
app << ' ';
|
|
if (num() == LF_TABCOM)
|
|
app << '%';
|
|
app << _tabname;
|
|
return app.not_empty();
|
|
}
|
|
|