Files correlati : ve0.exe Ricompilazione Demo : [ ] Commento Bugs 0001356 : Elaborazione differita per fatturazione di prova Ho inserito una nuova numerazione documenti F09 "fatturazione di prova" con il check di "numerazione provvisoria" un tipo documento "fatturazione di prova" F09 ho inserito una elaborazione differita che lascia le bolle B01 allo stato 2 ma crea un F09 quando vado a vedere le fatture F09 sono definitive e non provvisorie. Allego la parte tabellare git-svn-id: svn://10.65.10.50/trunk@19316 c028cbd2-c16b-5b4b-a496-9718f37d4682
295 lines
6.5 KiB
C++
Executable File
295 lines
6.5 KiB
C++
Executable File
#include <applicat.h>
|
|
#include <scanner.h>
|
|
#include <tabmod.h>
|
|
|
|
TModule_table::TModule_table(const char* tabname)
|
|
: TLocalisamfile(LF_TABMOD), _customer(0)
|
|
{
|
|
TString8 name(tabname);
|
|
if (!isalnum(name[0])) // Toglie eventuali prefissi inutili d'ora in poi
|
|
name.ltrim(1);
|
|
name.upper();
|
|
|
|
if (name.len() >= 5)
|
|
{
|
|
_module = name.left(2);
|
|
name.ltrim(2);
|
|
if (name.len() > 3)
|
|
{
|
|
_customer = atol(name);
|
|
_tabname = name.right(3);
|
|
}
|
|
else
|
|
_tabname = name;
|
|
}
|
|
else _tabname = name;
|
|
|
|
if (_module.blank() || _customer <= 0L)
|
|
{
|
|
TFilename app = main_app().argv(0); app.ext("");
|
|
const TFixed_string appname(app.name());
|
|
|
|
if (_module.blank())
|
|
_module = appname.left(2);
|
|
|
|
if (_customer <= 0L && real::is_natural(appname.mid(3)))
|
|
_customer = atol(app.mid(2));
|
|
}
|
|
_module.upper();
|
|
}
|
|
|
|
void TModule_table::zero_rec(TRectype& rec, char c)
|
|
{
|
|
rec.zero(c);
|
|
rec.put("MOD", _module);
|
|
rec.put("CUST", _customer);
|
|
rec.put("COD", _tabname);
|
|
}
|
|
|
|
// @cmember Vuota tutto il record
|
|
void TModule_table::zero()
|
|
{
|
|
zero_rec(curr(), '\0');
|
|
}
|
|
|
|
// @cmember Vuota tutto il record usando il carattere <p c>
|
|
void TModule_table::zero(char c)
|
|
{
|
|
zero_rec(curr(), c);
|
|
}
|
|
|
|
bool TModule_table::in_table() const
|
|
{
|
|
const TRectype& rec = curr();
|
|
return _tabname == rec.get("COD") && _module == rec.get("MOD") && _customer == rec.get_long("CUST");
|
|
}
|
|
|
|
int TModule_table::skip(TRecnotype nrec, word lockop)
|
|
{
|
|
if (nrec == 0)
|
|
return NOERR;
|
|
int err = TBaseisamfile::skip(nrec, lockop);
|
|
if (err == NOERR && not_in_table())
|
|
{
|
|
if (lockop == _lock || lockop == _testandlock)
|
|
TBaseisamfile::reread(_unlock);
|
|
if (nrec > 0)
|
|
{
|
|
last(lockop);
|
|
setstatus(err = _iseof);
|
|
}
|
|
else
|
|
{
|
|
first(lockop);
|
|
setstatus(err = _isbof);
|
|
}
|
|
}
|
|
return err;
|
|
}
|
|
|
|
int TModule_table::_read(TRectype& rec, word op, word lockop)
|
|
{
|
|
switch (op)
|
|
{
|
|
case _isfirst:
|
|
{
|
|
zero_rec(rec, '\0');
|
|
TBaseisamfile::_read(rec, _isgteq, lockop);
|
|
|
|
if (not_in_table())
|
|
setstatus(_isemptyfile);
|
|
if (bad())
|
|
zero_rec(rec, '\0');
|
|
}
|
|
break;
|
|
case _islast:
|
|
{
|
|
zero_rec(rec, '\0');
|
|
put("CODTAB", "\xFF");
|
|
TBaseisamfile::_read(rec, _isgteq);
|
|
if (!eof())
|
|
TBaseisamfile::_read(rec, _isprev, lockop);
|
|
else
|
|
setstatus(NOERR);
|
|
if (bof())
|
|
setstatus(NOERR);
|
|
if (not_in_table())
|
|
setstatus(_isemptyfile);
|
|
if (bad())
|
|
zero_rec(rec, '\0');
|
|
}
|
|
break;
|
|
case _isprev:
|
|
{
|
|
const TRecnotype nrec = recno();
|
|
TBaseisamfile::_read(rec, _isprev, lockop);
|
|
if (not_in_table())
|
|
{
|
|
if (lockop == _lock || lockop == _testandlock)
|
|
reread(_unlock);
|
|
readat(rec, nrec, lockop);
|
|
setstatus(_isbof);
|
|
}
|
|
}
|
|
break;
|
|
case _isnext:
|
|
{
|
|
const TRecnotype nrec = recno();
|
|
TBaseisamfile::_read(rec, _isnext, lockop);
|
|
if (not_in_table())
|
|
{
|
|
if (lockop == _lock || lockop == _testandlock)
|
|
reread(_unlock);
|
|
readat(rec, nrec, lockop);
|
|
setstatus(_iseof);
|
|
}
|
|
}
|
|
break;
|
|
default: // read normale
|
|
{
|
|
rec.put("COD", _tabname);
|
|
rec.put("MOD", _module);
|
|
rec.put("CUST", _customer);
|
|
TBaseisamfile::_read(rec, op, lockop);
|
|
if (not_in_table())
|
|
{
|
|
if (lockop == _lock || lockop == _testandlock)
|
|
reread(_unlock);
|
|
last(lockop);
|
|
setstatus(_iseof);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
return status();
|
|
}
|
|
|
|
int TModule_table::_readat(TRectype& rec ,TRecnotype nrec, word lockop)
|
|
{
|
|
TBaseisamfile::_readat(rec, nrec, lockop);
|
|
CHECKS(in_table(), "Invalid module table position in ", (const char *)_tabname);
|
|
return status();
|
|
}
|
|
|
|
int TModule_table::_write(const TRectype& rec)
|
|
{
|
|
((TRectype &)rec).put("COD", _tabname);
|
|
((TRectype &)rec).put("MOD", _module);
|
|
((TRectype &)rec).put("CUST", _customer);
|
|
|
|
return TLocalisamfile::_write(rec);
|
|
}
|
|
|
|
int TModule_table::_rewrite(const TRectype& rec)
|
|
{
|
|
((TRectype &)rec).put("COD", _tabname);
|
|
((TRectype &)rec).put("MOD", _module);
|
|
((TRectype &)rec).put("CUST", _customer);
|
|
|
|
return TLocalisamfile::_rewrite(rec);
|
|
}
|
|
|
|
bool TModule_table::empty()
|
|
{
|
|
return read(_isfirst) != NOERR;
|
|
}
|
|
|
|
void TModule_table::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.
|
|
TFilename n;
|
|
n = _module;
|
|
if (_customer > 0)
|
|
{
|
|
TString8 c;
|
|
c.format("%06ld", _customer);
|
|
n << c;
|
|
}
|
|
n << "tb" << _tabname;
|
|
n.ext("msk");
|
|
|
|
if (n.custom_path())
|
|
{
|
|
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 (_description.blank())
|
|
{
|
|
_description = TR("Tabella");
|
|
_description << ' ' << _tabname << ' ' << TR("Modulo") << ' ' << _module;
|
|
if (_customer > 0)
|
|
_description << _customer;
|
|
}
|
|
}
|
|
|
|
const char* TModule_table::module() const
|
|
{ return _module; }
|
|
|
|
long TModule_table::customer() const
|
|
{ return _customer; }
|
|
|
|
const char* TModule_table::description()
|
|
{
|
|
if (_description.empty())
|
|
load_module_description();
|
|
return _description;
|
|
}
|
|
static bool find_relapp(TString& app, const char * para, const char * tabname)
|
|
{
|
|
TString8 var;
|
|
var << "Edit_" << tabname;
|
|
|
|
app = ini_get_string(CONFIG_GENERAL, para, var);
|
|
if (app.empty())
|
|
{
|
|
var.cut(0) << "Edit_" << LF_TABMOD;
|
|
app = ini_get_string(CONFIG_GENERAL, para, var);
|
|
}
|
|
return app.full();
|
|
}
|
|
|
|
bool TModule_table::get_relapp(TString& app) const
|
|
{
|
|
TString8 para = _module;
|
|
|
|
if (_customer > 0L)
|
|
para.format("%s%06ld", (const char*)_module, _customer);
|
|
para.lower();
|
|
|
|
bool ok = ::find_relapp(app, para, _tabname);
|
|
|
|
for (int i = 0; !ok && i <= 9; i++)
|
|
{
|
|
para = _module;
|
|
para << i;
|
|
ok = ::find_relapp(app, para, _tabname);
|
|
}
|
|
if (!ok)
|
|
app << _module << "0 -0";
|
|
app << " &" << _tabname;
|
|
return true;
|
|
}
|
|
|