Patch level :

Files correlati     :
Ricompilazione Demo : [ ]
Commento            : Riportata la versione 98.01.02pl000 sul main trunk


git-svn-id: svn://10.65.10.50/trunk@6223 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 1998-02-18 13:46:52 +00:00
parent c2eaad0601
commit df19c2fc5a
12 changed files with 470 additions and 331 deletions

View File

@ -1419,8 +1419,10 @@ bool TMenu_application::create()
}
#endif
#ifndef _DEMO_
if (!check_user())
return FALSE;
#endif
set_perms();
test_temp();

View File

@ -1294,6 +1294,14 @@ bool TFascicolator_mask::zip_module(const TString& main_module, bool agg, int pa
ok = move_file(src, path);
aborted = !ok || pi.iscancelled();
}
// scrive il sommario completo
if (!agg && size==0)
{
archivio = path;
archivio.add("install.ini");
fcopy("install.ini",(const char *)archivio);
}
return TRUE;
}

View File

@ -13,7 +13,16 @@
#include "ba1500.h"
#include "ba1600.h"
#include "ba1700a.h"
// definizioni delle colonne dello sheet
#define C_MODULE 1
#define C_CODE 2
#define C_RELEASE 3
#define C_PATCH 4
#define C_DATAREL 5
#define C_CURRRELEASE 6
#define C_CURRPATCH 7
#define C_CURRDATAREL 8
#define C_ISPATCH 9
HIDDEN int noyes_box(const char* msg)
{
@ -68,7 +77,7 @@ protected:
static bool sheet_notify(TSheet_field& s, int r, KEY k);
static bool install_handler(TMask_field& fld, KEY key);
bool add_module(TConfig& ini, const TString& module, bool patch);
bool add_module(TConfig& ini, const TString& module, bool patch, int pos=-1);
bool add_header(TConfig& ini, const TString& module, bool patch);
int sort_modules();
void update_version();
@ -95,7 +104,7 @@ public:
TInstaller_mask* TInstaller_mask::_curr_mask = NULL;
// Copia nello sheet i dati di un modulo prendendoli da un .ini
bool TInstaller_mask::add_module(TConfig& ini, const TString& module, bool patch)
bool TInstaller_mask::add_module(TConfig& ini, const TString& module, bool patch, int pos)
{
ini.write_protect();
bool ok = ini.set_paragraph(module);
@ -109,7 +118,10 @@ bool TInstaller_mask::add_module(TConfig& ini, const TString& module, bool patch
row.add(ini.get("Patch"));
row.add(ini.get("Data"));
row.add(patch ? "X" : " ", 9);
add(row);
if (pos==-1)
add(row);
else
insert(row,pos);
}
return ok;
}
@ -147,23 +159,32 @@ static int compare_modules(const TObject** o1, const TObject** o2)
int TInstaller_mask::sort_modules()
{
//rows_array().TArray::sort(compare_modules);
TString16 dis;
// sort
const int tot = int(items());
return tot;
// vecchio codice per bubblare
for (int r = 0; r < tot; r++)
{
const bool patch = row(r).get_char(9) > ' ';
const char* mod = row(r).get(2);
if (*mod != ' ') // is not an header...
{
if (patch)
{
if (dis == mod)
disable_row(r);
const bool patch = row(r).get_char(C_ISPATCH) > ' ';
const char* mod = row(r).get(C_CODE);
if (patch)
{
TString16 dis=mod;
const int patchlevel = row(r).get_int(C_PATCH);
// pop the patch line up to the module one
int br=r-1;
while (br && !(dis==row(br).get(C_CODE) && row(br).get_int(C_PATCH)<patchlevel))
{
// Swap rows
rows_array().TArray::swap(br,br+1);
const bool enab=row_enabled(br);
const bool enab1=row_enabled(br+1);
enable_row(br+1,enab);
enable_row(br, enab1);
br--;
}
else
dis = mod;
}
}
return tot;
@ -176,16 +197,16 @@ void TInstaller_mask::update_version()
TString_array& array = rows_array();
FOR_EACH_ARRAY_ROW_BACK(array, m, row)
{
if (*row->get(2) != ' ')
if (*row->get(C_CODE) != ' ')
{
const TString16 module = row->get(2);
const TString16 module = row->get(C_CODE);
ini.set_paragraph(module);
const TString16 newver = row->get(3);
const TString16 newver = row->get(C_RELEASE);
const TString16 oldver = ini.get("Versione");
row->add(oldver, 6);
row->add(ini.get("Patch"), 7);
row->add(ini.get("Data"), 8);
row->add(oldver, C_CURRRELEASE);
row->add(ini.get("Patch"), C_CURRPATCH);
row->add(ini.get("Data"), C_CURRDATAREL);
}
}
force_update();
@ -195,6 +216,7 @@ void TInstaller_mask::update_version()
// utilizzabili per un'installazione e li inserisce nello spreadsheet
bool TInstaller_mask::autoload()
{
TString_array& mask_rows = rows_array();
const TString& path = get(F_PATH);
if (!fexist(path))
return error_box("Specificare un percorso valido");
@ -242,20 +264,33 @@ bool TInstaller_mask::autoload()
add_module(ini, module, FALSE);
}
ininame = path;
ininame.add("??0???a.ini");
modules.destroy();
list_files(ininame, modules);
FOR_EACH_ARRAY_ROW(modules, am, arow)
{
TString& ininame = *arow;
ininame.lower();
const int pos = ininame.find("a.ini");
CHECKS(pos >= 6, "Invalid installation configuration: ", (const char*)ininame);
const TString16 module = ininame.mid(pos-6, 2);
TConfig ini(ininame, module);
}
// add patches
ininame = path;
ininame.add("??0???a.ini");
modules.destroy();
list_files(ininame, modules);
modules.sort(); // sort to have patches in patchlevel order
FOR_EACH_ARRAY_ROW(modules, am, arow)
{
TString& ininame = *arow;
ininame.lower();
const int pos = ininame.find("a.ini");
CHECKS(pos >= 6, "Invalid installation configuration: ", (const char*)ininame);
const TString16 module = ininame.mid(pos-6, 2);
TConfig ini(ininame, module);
const int patchlevel = ini.get_int("Patch");
const int maxrows=int(items());
bool found=FALSE;
for (int r = maxrows-1; r >=0 && !found; r--)
found=(module == row(r).get(C_CODE) );
if (found)
{
const char * patchversion = ini.get("Versione");
if (mask_rows.row(r+1).get(C_RELEASE) == patchversion)
mask_rows.row(r+1).add(patchlevel, C_PATCH);
} else
add_module(ini, module, TRUE);
}
}
const bool ok = sort_modules() > 0;
@ -351,10 +386,27 @@ bool TInstaller_mask::can_install(const char* module, TInstall_ini& ini)
}
// sposta il file dal direttorio temporaneo a quello passato come destinazione
bool TInstaller_mask::move_file(const TFilename& from, const TFilename& file, const char* dir) const
// from: direttorio di partenza
// file: nome del file con path completo da spostare (può includere sottodirettori)
// todir: direttorio destinazione (si assume che esista già)
bool TInstaller_mask::move_file(const TFilename& from, const TFilename& file, const char* todir) const
{
TFilename dest(dir);
dest.add(file.mid(from.len()));
TFilename dest(todir);
dest.add(file.mid(from.len()+1));
if (!fexist(dest.path()))
{
// file contains non existent subdir specification
TToken_string dirs((const char * )(dest.path()),'\\');
TFilename subdir;
for (int c=0; c < dirs.items()-1; c++)
{
subdir.add(dirs.get(c));
if (!fexist(subdir) )
// build destination directory
make_dir(subdir);
}
}
const long filesize = fsize(file);
@ -460,7 +512,7 @@ bool TInstaller_mask::install(const TString& module, int patchlevel)
ok = dischi > 0;
if (!ok)
{
return error_box("Impossibile determinare il numero dei dischetti");
return error_box("Impossibile determinare il numero dei dischetti in %s",ininame.name());
}
else
{
@ -468,8 +520,10 @@ bool TInstaller_mask::install(const TString& module, int patchlevel)
if (!ok) return FALSE;
}
TString msg;
msg << "Decompressione del modulo '" << module << "' in corso...";
TString msg("Decompressione");
if (patchlevel > 0 )
msg << " della patch " << patchlevel ;
msg << " del modulo '" << module << "' in corso...";
TProgind pi(dischi, msg, FALSE, TRUE);
TFilename tempdir; tempdir.tempdir();
@ -639,7 +693,8 @@ void TInstaller_mask::install_selection()
TString_array& arr = rows_array();
FOR_EACH_ARRAY_ROW(arr, r, row) if (checked(r))
{
const TString newver = row->get(3);
const TString newver = row->get(C_RELEASE);
if (newver.blank())
{
@ -647,10 +702,10 @@ void TInstaller_mask::install_selection()
continue;
}
const TString modulo = row->get(2);
const int newpatch = row->get_int(4);
const TString oldver = row->get(6);
const int oldpatch = row->get_int(7);
const TString modulo = row->get(C_CODE);
const int newpatch = row->get_int(C_PATCH);
const TString oldver = row->get(C_CURRRELEASE);
const int oldpatch = row->get_int(C_CURRPATCH);
if (version2year(newver) < 1997)
{
@ -670,31 +725,49 @@ void TInstaller_mask::install_selection()
"funzionamento di tutti i programmi!", (const char*)newver, newpatch, (const char*)modulo);
ok = noyes_box(msg);
}
const bool is_patch = row->get_char(C_ISPATCH) > ' ';
if (is_patch)
{
// installo le patch solo se esiste già un modulo installato della stessa versione
if (!oldver.blank() )
if (oldver != newver)
ok =error_box("Impossibile installare le patch della versione %s \nperché il modulo '%s' installato ha versione %s ",(const char *)newver,(const char *)modulo,(const char *)oldver);
}
if (ok)
{
const bool is_patch = row->get_char(9) > ' ';
ok = install(modulo, is_patch ? newpatch : 0);
if (ok)
_installed = TRUE; // Setta il flag di almeno un modulo installato
if (!is_patch) // Se installo un modulo pricipale ...
{
// ... allora installo tutte le patches
for (int p = r+1; ok; p++)
{
if (row_disabled(p))
TString_array modules;
TFilename ininame = get(F_PATH);
ininame.add("??0???a.ini");
modules.destroy();
list_files(ininame, modules);
modules.sort(); // sort by patch number
FOR_EACH_ARRAY_ROW(modules, am, arow)
{
TString& ininame = *arow;
ininame.lower();
const int pos = ininame.find("a.ini");
CHECKS(pos >= 6, "Invalid installation configuration: ", (const char*)ininame);
const TString16 patchmodule = ininame.mid(pos-6, 2);
if (patchmodule == modulo)
{
const int patchlevel = arr.row(p).get_int(4);
ok = install(modulo, patchlevel);
}
else
break;
TConfig ini(ininame, patchmodule);
const int patchlevel = ini.get_int("Patch");
const char * patchversion = ini.get("Versione");
if (patchversion == newver) // installa solo le patch della stessa ver
ok = install(modulo, patchlevel);
}
}
}
if (ok)
check(r, FALSE);
}
if (ok)
check(r,FALSE); // uncheck
check(r,FALSE); // uncheck
}
}
@ -726,10 +799,10 @@ bool TInstaller_mask::tutti_handler(TMask_field& f, KEY k)
for (long i = s.items()-1; i >=0; i--)
{
TToken_string r = s.row(i);
const TString16 newver = r.get(3);
const int newpatch = r.get_int(4);
const TString16 curver = r.get(6);
const int curpatch = r.get_int(7);
const TString16 newver = r.get(C_RELEASE);
const int newpatch = r.get_int(C_PATCH);
const TString16 curver = r.get(C_CURRRELEASE);
const int curpatch = r.get_int(C_CURRPATCH);
s.check(i, compare_version(newver, newpatch, curver, curpatch) > 0);
}
}
@ -749,10 +822,10 @@ bool TInstaller_mask::on_key(KEY key)
for (long i = items()-1; i >=0; i--)
{
TToken_string r = row(i);
const TString16 newver = r.get(3);
const int newpatch = r.get_int(4);
const TString16 curver = r.get(6);
const int curpatch = r.get_int(7);
const TString16 newver = r.get(C_RELEASE);
const int newpatch = r.get_int(C_PATCH);
const TString16 curver = r.get(C_CURRRELEASE);
const int curpatch = r.get_int(C_CURRPATCH);
check(i, compare_version(newver, newpatch, curver, curpatch > 0));
}
@ -764,7 +837,7 @@ bool TInstaller_mask::on_key(KEY key)
TInstaller_mask::TInstaller_mask()
: TArray_sheet(0, 0, 0, 0, "Installazione",
"@1|Modulo@30|Cod.|Versione\nda installare@13|Livello\nPatch|Data\nRilascio@10|Versione\nInstallata@10|Livello\nPatch|Data\nInstallazione@13|Aggiornamento",
"@1|Modulo@30|Cod.|Versione da\ninstallare@11|Livello\nPatch@8|Data\nRilascio@10|Versione\nInstallata@10|Livello\nPatch@8|Data\nInstallazione@13|Aggiornamento",
0x18, 3)
{
_curr_mask = this;

View File

@ -7,12 +7,16 @@
#include <io.h>
#include <stdlib.h>
#include <direct.h>
#define WINAPI _far _pascal
#define LPSTR char*
#define LPCSTR const LPSTR
int WINAPI GetPrivateProfileString(LPCSTR, LPCSTR, LPCSTR, LPSTR, int, LPCSTR);
int WINAPI WritePrivateProfileString(LPCSTR, LPCSTR, LPCSTR, LPCSTR);
#define DRIVE_REMOVABLE 2
#define DRIVE_FIXED 3
#define DRIVE_REMOTE 4
UINT WINAPI GetDriveType(int);
#endif // DOS
@ -424,7 +428,10 @@ const char* CGetPrawinName(void)
fclose(pw);
}
prawin = malloc(_MAX_PATH);
_searchenv(tmp, NULL, prawin);
if (*path)
strcpy(prawin,tmp);
else
_searchenv(tmp, NULL, prawin);
}
return prawin;
}
@ -463,13 +470,12 @@ BOOLEAN CPutPrawin(const char* pref)
const char* prawin = CGetPrawinName();
BOOLEAN good = WritePrivateProfileString("Main", "Firm", pref, prawin);
int disk = toupper(*prawin) - 'A';
if (GetDriveType(disk) == 3) // Aggiorna lo studio solo sui dischi locali
WritePrivateProfileString("Main", "Study", __ptprf, prawin);
if (GetDriveType(_getdrive() -1 ) == DRIVE_FIXED)
{
// Aggiorna anche il vecchio pathpref.ini, ma solo sui dischi locali:
// nei dischi remoti lo studio va cambiato modificando direttamente il file
FILE* pppi; // PathPrefPuntoIni
WritePrivateProfileString("Main", "Study", __ptprf, prawin);
// Aggiorna anche il vecchio pathpref.ini
pppi = fopen("pathpref.ini", "w");
fprintf(pppi, "%s\n", __ptprf);
fclose(pppi);

View File

@ -1229,13 +1229,13 @@ long TArray_sheet::add(TToken_string* s)
long TArray_sheet::insert(const TToken_string& s, long n)
{
_data.insert(s, (int)n);
const int maxrows=int(items());
for (int r = maxrows-1; r >n ; r--)
{
const bool enab= row_enabled(r);
enable_row(r,row_enabled(r+1));
enable_row(r+1,enab);
}
const int maxrows=int(items());
for (int r = maxrows-1; r >n ; r--)
{
const bool enab= row_enabled(r);
enable_row(r,row_enabled(r+1));
enable_row(r+1,enab);
}
return n;
}

View File

@ -286,7 +286,7 @@ SECTION BODY ODD 1
KEY "prezzo"
PROMPT 99 1 ""
FIELD LF_RMOVMAG->PREZZO
PICTURE "###.####.##@"
PICTURE "###.###.##@"
END
NUMERO 108
@ -294,7 +294,7 @@ SECTION BODY ODD 1
KEY "valore"
PROMPT 112 1 ""
MESSAGE _NUMEXPR,LF_RMOVMAG->PREZZO*LF_RMOVMAG->QUANT*349@->FC|ADD,10
PICTURE "##.###.####.##@"
PICTURE "##.###.###.##@"
END
END // RIGHE MOVIMENTO
@ -303,7 +303,7 @@ SECTION BODY ODD 1
BEGIN
KEY "totale mov"
PROMPT 83 3 "Totale valore movimentato: £ "
PICTURE "##.###.####.##@"
PICTURE "##.###.###.##@"
END

View File

@ -11,7 +11,8 @@
// *******************************
#define MAXSIMBOLS 256
#define MAXSTATES 25
class TStateset {
class TStateset
{
unsigned char _container[MAXSTATES];
int _current;
public:
@ -27,7 +28,8 @@ public:
~TStateset() {};
};
struct TAutoma_state {
struct TAutoma_state
{
short _transaction[MAXSIMBOLS];
TString16 * _label;
bool _final;
@ -43,7 +45,8 @@ struct TAutoma_state {
// *******************************
// *******************************
// automa per il riconoscimento di metacaratteri
class TR_automa {
class TR_automa
{
TAutoma_state st[MAXSTATES];
short _maxstate;
protected:
@ -86,19 +89,22 @@ TStateset::TStateset()
}
TStateset & TStateset::empty()
{ _current=0;
{
_current=0;
for (int i= 0; i< MAXSTATES; _container[i++]=0);
return *this;
}
TStateset & TStateset::enclose(int el)
{ if (el< MAXSTATES && el>=0)
{
if (el< MAXSTATES && el>=0)
_container[el]=1;
return *this;
}
TStateset & TStateset::singleton(int el)
{ empty();
{
empty();
_container[el]=1;
return *this;
}
@ -112,9 +118,9 @@ TStateset & TStateset::cap(TStateset & s)
bool TStateset::is_empty() const
{
for (int i= 0; i< MAXSTATES; i++) {
if (_container[i]) return FALSE;
}
for (int i= 0; i< MAXSTATES; i++)
if (_container[i])
return FALSE;
return TRUE;
}
@ -131,10 +137,9 @@ int TStateset::get_first()
int TStateset::get_next()
{
while (_current+1 < MAXSTATES) {
while (_current+1 < MAXSTATES)
if (_container[++_current])
return _current;
}
return (-1);
}
@ -147,10 +152,9 @@ bool TR_automa::is_state(int statenum)
// restituisce il numero dello stato con quella etichetta
int TR_automa::label2state(const char *label)
{
for (int s=0; s<_maxstate;s++) {
for (int s=0; s<_maxstate;s++)
if (*(st[s]._label)==label)
return(s+1);
}
return(0);
}
@ -159,24 +163,25 @@ int TR_automa::label2state(const char *label)
TR_automa & TR_automa::reset_state(int statenum)
{
int _from,_to;
if (statenum>0 && statenum<=_maxstate) {
if (statenum>0 && statenum<=_maxstate)
{
_from=statenum;
_to=statenum;
} else {
}
else
{
_maxstate=0;
_isdeterministic=TRUE;
_from=1;
_to=MAXSTATES;
}
for (int i=_from; i<=_to;i++)
{
for (int i=_from; i<=_to;i++) {
set_label(i,"");
set_final(i,FALSE);
for (int j=0; j<MAXSIMBOLS;j++) {
del_trans(i,j);
}
}
}
set_label(i,"");
set_final(i,FALSE);
for (int j=0; j<MAXSIMBOLS;j++)
del_trans(i,j);
}
return *this;
}
@ -209,7 +214,8 @@ bool TR_automa::is_final(TStateset ss ) const
{
bool retv=FALSE;
int statenum=ss.get_first();
do {
do
{
retv=retv || is_final(statenum);
} while ((statenum=ss.get_next())>0);
@ -251,43 +257,47 @@ TR_automa::TR_automa(TR_automa * aa,bool makedet)
TString16 tmplabel;
int curr_new_state;
for (int i=0; i<MAXSTATES;i++) {
for (int i=0; i<MAXSTATES;i++)
st[i]._label = new TString16;
}
if (aa==NULL) {
if (aa==NULL)
{
reset_state();
return;
}
if (makedet) {
if (makedet)
{
reset_state();
// crea il primo stato nell'automa deterministico
set2label(aa->union_of_closures(newstateset.singleton(FIRST_STATE)),tmplabel);
add_state(tmplabel);
curr_new_state=FIRST_STATE;
while (is_state(curr_new_state)) {
while (is_state(curr_new_state))
{
// determina l'insieme degli stati dell'automa non deterministico
// che corrispondono a questo stato dell'automa deterministico
label2set(label(curr_new_state),newstateset);
// lo stato è finale se include stati finali dell'automa non det.
set_final(curr_new_state,aa->is_final(newstateset));
// determina tutte le transazioni
for (short symbol=FIRST_NEMPTY_SYMBOL; symbol<MAXSIMBOLS; symbol++) {
for (short symbol=FIRST_NEMPTY_SYMBOL; symbol<MAXSIMBOLS; symbol++)
{
// determina lo stato di arrivo nell'automa det.:
// esso è pari all'insieme degli stati raggiunti col questo simbolo
// dal sottoinsieme degli stati dell'automa non det. che etichetta il nuovo stato nell'automa det.
arrival.empty();
int new_next,old_next;
int old_state=newstateset.get_first() ;
do {
do
{
if (old_next=aa->trans_to(old_state,(unsigned char)symbol))
arrival.enclose(old_next);
} while ((old_state=newstateset.get_next())>0);
if (!arrival.is_empty()) {
if (!arrival.is_empty())
{
// crea il nuovo arco nell'automa deterministico
set2label(aa->union_of_closures(arrival),tmplabel);
if (!(new_next=label2state(tmplabel))) {
new_next=add_state(tmplabel);
}
if (!(new_next=label2state(tmplabel)))
new_next=add_state(tmplabel);
add_tran(curr_new_state,(unsigned char)symbol,new_next);
}
} // loop symbol
@ -298,18 +308,16 @@ TR_automa::TR_automa(TR_automa * aa,bool makedet)
else
{
*this=*aa;
for (int i=0; i<MAXSTATES;i++) {
for (int i=0; i<MAXSTATES;i++)
st[i]._label= aa->st[i]._label;
}
}
}
TR_automa::~TR_automa()
{
for (int i=0; i<MAXSTATES;i++) {
for (int i=0; i<MAXSTATES;i++)
delete (st[i]._label);
}
}
@ -317,10 +325,9 @@ void TR_automa::set2label(const TStateset ss,TString16 & label)
{
char coded[MAXSTATES];
char c=0;
for (int i= 0; i< MAXSTATES; i++) {
for (int i= 0; i< MAXSTATES; i++)
if (ss.is_member(i))
coded[c++]=(char)(i+'0');
}
coded[c]='\0';
label=coded;
}
@ -343,12 +350,15 @@ TStateset TR_automa::union_of_closures(TStateset &start_set)
u_of_clo.empty();
_state=start_set.get_first() ;
do {
do
{
// la chiusura è composta dallo stato e tutte le sue transazioni epsilon
clo.singleton(_state);
do {
do
{
int _state2=clo.get_first();
do {
do
{
toadd=((_next=trans_to(_state2,EPSILON)) && (!clo.is_member(_next)));
if (toadd)
clo.enclose(_next);
@ -362,20 +372,18 @@ TStateset TR_automa::union_of_closures(TStateset &start_set)
// tenta di riconoscere la stringa passata
bool TR_automa::recognized(const char * t_str)
{
if (_isdeterministic) {
if (_isdeterministic)
{
// ricoNosce la stringa di token
int curr_state=FIRST_STATE;
for (int i=0; t_str[i]; i++) {
for (int i=0; t_str[i]; i++)
if (!(curr_state=trans_to(curr_state,t_str[i])))
// fine per mancanza di trasizioni
return FALSE;
}
return FALSE; // fine per mancanza di trasizioni
// fine per mancanza di caratteri di input della stringa
return (is_final(curr_state));
} else {
//
return FALSE;
}
else
return FALSE; // ??
}
// *******************************
@ -400,32 +408,33 @@ bool TMetachar::recognized(const char * s)
void TMetachar::add_tran(int s,unsigned char metasymbol, int nextstate)
{
unsigned char c;
switch (metasymbol) {
case EPSILON:// blank
_au->add_tran(s,EPSILON,nextstate);
break;
case S_BLANK:// blank
_au->add_tran(s,' ',nextstate);
break;
case S_DIGIT:// cifra
for (c='0';c<='9';c++)
_au->add_tran(s,c,nextstate);
break;
case S_LETTER: // lettera
for (c='a';c<='z';c++)
_au->add_tran(s,c,nextstate);
for (c='A';c<='Z';c++)
_au->add_tran(s,c,nextstate);
break;
case S_ANY: // qualsiasi carattere
for (c=MAXSIMBOLS-1;c>=FIRST_NEMPTY_SYMBOL;c--)
_au->add_tran(s,c,nextstate);
break;
default:
_au->add_tran(s,metasymbol,nextstate);
break;
}
unsigned char c;
switch (metasymbol)
{
case EPSILON:// blank
_au->add_tran(s,EPSILON,nextstate);
break;
case S_BLANK:// blank
_au->add_tran(s,' ',nextstate);
break;
case S_DIGIT:// cifra
for (c='0';c<='9';c++)
_au->add_tran(s,c,nextstate);
break;
case S_LETTER: // lettera
for (c='a';c<='z';c++)
_au->add_tran(s,c,nextstate);
for (c='A';c<='Z';c++)
_au->add_tran(s,c,nextstate);
break;
case S_ANY: // qualsiasi carattere
for (c=MAXSIMBOLS-1;c>=FIRST_NEMPTY_SYMBOL;c--)
_au->add_tran(s,c,nextstate);
break;
default:
_au->add_tran(s,metasymbol,nextstate);
break;
}
}
@ -449,15 +458,18 @@ void TMetachar::set_language(const char * language)
_language=language;
// crea l'automa
_au->reset_state();
for (int i=0; language[i]; i++) {
for (int i=0; language[i]; i++)
{
label[0]='a'+i;
nextlabel[0]='a'+i+1;
if (language[i]!=C_ESCAPEMETA) {
if (language[i]!=C_ESCAPEMETA)
{
if (!escaped_char)
{
// meta-caratteri e literal fuori set
s=_au->add_state(label);
switch (language[i]) {
switch (language[i])
{
case '#':// cifra o blank opzionale
add_tran(s,S_BLANK,s+1);
add_tran(s,'-',s+1);
@ -487,7 +499,9 @@ void TMetachar::set_language(const char * language)
_au->add_tran(s,language[i],s+1);
break;
}
} else {
}
else
{
// escaped char
s=_au->add_state(label);
_au->add_tran(s,language[i],s+1);
@ -507,7 +521,8 @@ bool TMetachar::has_opzchars(const char * pattern)
int i=0;
bool next_literal=FALSE;
while (pattern[i]) {
while (pattern[i])
{
if (!next_literal && strchr(_metach_opz,pattern[i]))
return(TRUE);
next_literal=(!next_literal && pattern[i]==C_ESCAPEMETA);
@ -522,7 +537,8 @@ bool TMetachar::has_mandchars(const char * pattern)
int i=0;
bool next_literal=FALSE;
while (pattern[i]) {
while (pattern[i])
{
if (next_literal || strchr(_metach_mand,pattern[i]))
return(TRUE);
next_literal=(!next_literal && pattern[i]==C_ESCAPEMETA);
@ -537,7 +553,8 @@ int TMetachar::maxstrlen(const char * pattern)
int i=0,l=0;
bool next_literal=FALSE;
while (pattern[i]) {
while (pattern[i])
{
if (!next_literal)
l++;
next_literal=(!next_literal && pattern[i]==C_ESCAPEMETA);
@ -560,7 +577,8 @@ TMetachar::TMetachar (const char * metastr)
// set_language(&auxau,metastr);
_au=new TR_automa;
set_language(metastr);
if (!_au->is_deterministic()) {
if (!_au->is_deterministic())
{
TR_automa * auxau = new TR_automa(_au,TRUE);
delete _au;
_au=auxau;
@ -624,7 +642,8 @@ void TCodice_livelli::load(bool enabled, const char *tabname,const char *tabgrp)
const char *TCodice_livelli::code_format(int levnum) const
{
CHECK(enabled(), "iu chent get de code format if levels ar disebold");
if (levnum<0) {
if (levnum<0)
{
levnum=max(last_level(),1);
}
((TCodice_livelli *)this)->add_metachar(levnum);
@ -635,9 +654,8 @@ const char *TCodice_livelli::code_format(int levnum) const
bool TCodice_livelli::fit_to_format(const char *codepart,int levnum) const
{
CHECK(enabled(), "iu chent cec ueter de format fits if levels ar disebold");
if (levnum<0) {
if (levnum<0)
levnum=max(last_level(),1);
}
((TCodice_livelli *)this)->add_metachar(levnum);
return ((TMetachar*)_metachars.objptr(levnum-1))->recognized(codepart);
}
@ -819,4 +837,3 @@ TMagazzini::TMagazzini() :
}
}

View File

@ -28,7 +28,8 @@
// libreria per i movimenti
char * Nome_valorizz[]= {
char * Nome_valorizz[]=
{
"Ultimo costo", "Media ultimi costi", "Prezzo di listino",
"Costo standard", "Costo medio" ,
"FIFO annuale", "LIFO annuale",
@ -708,13 +709,13 @@ real TArticolo_giacenza::FIFO(const char * annoes, const char * codmag, const ch
real TArticolo_giacenza::FIFO_ragionieristico(const char * annoes, const char * codmag, const char * livello,
bool giacenza_effettiva, bool valorizza_componenti) const
{
return ZERO;
return ZERO; // da implementare
}
real TArticolo_giacenza::LIFO_ragionieristico(const char * annoes, const char * codmag, const char * livello,
bool giacenza_effettiva, bool valorizza_componenti) const
{
return ZERO;
return ZERO; // da implementare
}
real TArticolo_giacenza::giacenza_corretta(const TRectype & rec ,bool giacenza_effettiva,bool valorizza_componenti) const
@ -758,8 +759,6 @@ TArticolo_giacenza::TArticolo_giacenza(const TRectype& rec)
const real CENTO=real(100.0);
bool TCondizione_vendita:: ricerca(const char * codice, const real & qta)
{
int tiporic;
@ -931,49 +930,50 @@ int TCausale_magazzino::sgn(TTipo_saldomag tiposaldo)
{
static TString80 segni;
segni=get("S2");
switch (tiposaldo) {
case s_giac:
return atoi(segni.mid(0,2));
case s_acq:
return atoi(segni.mid(2,2));
case s_ent:
return atoi(segni.mid(4,2));
case s_ven:
return atoi(segni.mid(6,2));
case s_usc:
return atoi(segni.mid(8,2));
case s_ordc:
return atoi(segni.mid(10,2));
case s_ordf:
return atoi(segni.mid(12,2));
case s_incl:
return atoi(segni.mid(14,2));
case s_acl:
return atoi(segni.mid(16,2));
case s_prodc:
return atoi(segni.mid(18,2));
case s_prodf:
return atoi(segni.mid(20,2));
case s_rim:
return atoi(segni.mid(22,2));
case s_scart:
return atoi(segni.mid(24,2));
case s_label:
return atoi(segni.mid(26,2));
case s_user1:
return atoi(segni.mid(28,2));
case s_user2:
return atoi(segni.mid(30,2));
case s_user3:
return atoi(segni.mid(32,2));
case s_user4:
return atoi(segni.mid(34,2));
case s_user5:
return atoi(segni.mid(36,2));
case s_user6:
return atoi(segni.mid(38,2));
default:
return 0;
switch (tiposaldo)
{
case s_giac:
return atoi(segni.mid(0,2));
case s_acq:
return atoi(segni.mid(2,2));
case s_ent:
return atoi(segni.mid(4,2));
case s_ven:
return atoi(segni.mid(6,2));
case s_usc:
return atoi(segni.mid(8,2));
case s_ordc:
return atoi(segni.mid(10,2));
case s_ordf:
return atoi(segni.mid(12,2));
case s_incl:
return atoi(segni.mid(14,2));
case s_acl:
return atoi(segni.mid(16,2));
case s_prodc:
return atoi(segni.mid(18,2));
case s_prodf:
return atoi(segni.mid(20,2));
case s_rim:
return atoi(segni.mid(22,2));
case s_scart:
return atoi(segni.mid(24,2));
case s_label:
return atoi(segni.mid(26,2));
case s_user1:
return atoi(segni.mid(28,2));
case s_user2:
return atoi(segni.mid(30,2));
case s_user3:
return atoi(segni.mid(32,2));
case s_user4:
return atoi(segni.mid(34,2));
case s_user5:
return atoi(segni.mid(36,2));
case s_user6:
return atoi(segni.mid(38,2));
default:
return 0;
}
}
@ -1044,7 +1044,6 @@ int TLine_movmag::operator==(TLine_movmag &l)
TRecord_cache TMov_mag::cache_causali("%CAU");
TMov_mag::TMov_mag() :
TMultiple_rectype(LF_MOVMAG),
lines_to_add(), lines_to_subtract()
@ -1204,51 +1203,50 @@ int TMov_mag::force_update_bal()
// restituisce il valore dei dati
TLine_movmag & TMov_mag::line2data(int nrig) const
{
static TLine_movmag line;
TRecord_array & b = body();
static TLine_movmag line;
TRecord_array & b = body();
line.set(
b.row(nrig).get(RMOVMAG_CODCAUS).blank() ? get(MOVMAG_CODCAUS)
: b.row(nrig).get(RMOVMAG_CODCAUS) ,
b.row(nrig).get(RMOVMAG_UM),
b.row(nrig).get_real(RMOVMAG_QUANT),
b.row(nrig).get_real(RMOVMAG_PREZZO));
return line;
line.set(b.row(nrig).get(RMOVMAG_CODCAUS).blank() ? get(MOVMAG_CODCAUS) : b.row(nrig).get(RMOVMAG_CODCAUS) ,
b.row(nrig).get(RMOVMAG_UM),
b.row(nrig).get_real(RMOVMAG_QUANT),
b.row(nrig).get_real(RMOVMAG_PREZZO));
return line;
}
TToken_string & TMov_mag::line2key(int numriga) const
{
static TToken_string _key;
TRecord_array & b = body();
TString16 nr;
static TToken_string _key;
TRecord_array & b = body();
TString16 nr;
nr << numriga;
_key.cut(0);
_key.add(b.row(numriga).get(RMOVMAG_CODART));
_key.add(b.row(numriga).get(RMOVMAG_CODMAG));
_key.add(b.row(numriga).get(RMOVMAG_LIVGIAC));
_key.add(nr);
return _key;
nr << numriga;
_key.cut(0);
_key.add(b.row(numriga).get(RMOVMAG_CODART));
_key.add(b.row(numriga).get(RMOVMAG_CODMAG));
_key.add(b.row(numriga).get(RMOVMAG_LIVGIAC));
_key.add(nr);
return _key;
}
TString TMov_mag::key2field(TToken_string &key,const char *fieldname)
{
if (strcmp(fieldname,"CODART")==0)
return key.get(0);
if (strcmp(fieldname,"CODMAG")==0)
return key.get(1);
if (strcmp(fieldname,"LIVGIAC")==0)
return key.get(2);
CHECKS(FALSE, "Nome di campo non appartenente al file righe mov ", fieldname);
if (strcmp(fieldname,"CODART")==0)
return key.get(0);
if (strcmp(fieldname,"CODMAG")==0)
return key.get(1);
if (strcmp(fieldname,"LIVGIAC")==0)
return key.get(2);
CHECKS(FALSE, "Nome di campo non appartenente al file righe mov ", fieldname);
return "";
}
int TMov_mag::line_inserted(TToken_string &k,TLine_movmag &r)
{
if (_annoes != get("ANNOES")) {
if (_annoes != get("ANNOES"))
lines_to_add.add(k,r);
} else {
else
{
if (lines_to_subtract.is_key(k)&& (TLine_movmag &)lines_to_subtract[k]==r)
// modifica annullata
lines_to_subtract.remove(k);
@ -1261,9 +1259,10 @@ int TMov_mag::line_inserted(TToken_string &k,TLine_movmag &r)
int TMov_mag::line_deleted(TToken_string &k,TLine_movmag &r)
{
if (_annoes != get("ANNOES")) {
if (_annoes != get("ANNOES"))
lines_to_subtract.add(k,r);
} else {
else
{
if (lines_to_add.is_key(k)&& r==(TLine_movmag &)lines_to_add[k] )
// modifica annullata
lines_to_add.remove(k);
@ -1277,6 +1276,7 @@ int TMov_mag::line_deleted(TToken_string &k,TLine_movmag &r)
bool TMov_mag::unlock_anamag(const char *codart)
{
TLocalisamfile anamag(LF_ANAMAG);
anamag.put("CODART",codart);
return (anamag.read(_isequal,_unlock)==NOERR);
}
@ -1284,12 +1284,18 @@ bool TMov_mag::unlock_anamag(const char *codart)
bool TMov_mag::lock_anamag(const char *codart)
{
TLocalisamfile anamag(LF_ANAMAG);
anamag.put("CODART",codart);
bool insert_new=TRUE;
TString mess;
mess << "Il record di anagrafica dell'articolo ''"<< codart << "'' risulta essere già in uso.\n Interrompo ?";
TTimed_breakbox bbox((const char *)mess,10);
do {
do
{
if (anamag.read(_isequal,_testandlock)==NOERR)
return TRUE;
} while (bbox.run()!=K_ESC);
@ -1314,20 +1320,24 @@ int TMov_mag::update_balances()
{
bool updated_bal=TRUE;
TLocalisamfile mag(LF_MAG);
mag.setkey(2);
TString_array keys_to_add,keys_to_remove;
((TMov_mag *)this)->lines_to_add.get_keys(keys_to_add);
((TMov_mag *)this)->lines_to_subtract.get_keys(keys_to_remove);
// aggiunge i saldi nuovi
keys_to_add.sort();
TToken_string * curr_key=(TToken_string *)keys_to_add.first_item();
while (curr_key) {
while (curr_key)
{
curr_art.read((const char *)key2field(*curr_key,"CODART"));
if (curr_art.lock_and_prompt()) {
if (curr_art.lock_and_prompt())
{
// lock gained
TLine_movmag & line_mov=(TLine_movmag &)lines_to_add[*curr_key];
TCausale_magazzino & causmag=(TCausale_magazzino &)cache_causali.get(line_mov.codcaus());
@ -1338,7 +1348,8 @@ int TMov_mag::update_balances()
curr_art.rewrite();
}
giac_putkey(mag,get("ANNOES"),*curr_key);
if (mag.read()!=NOERR) {
if (mag.read()!=NOERR)
{
// non trovato: aggiungo
giac_putkey(mag,get("ANNOES"),*curr_key);
mag.put("NRIGA",1+curr_art.mag(get("ANNOES")).rows());
@ -1357,10 +1368,12 @@ int TMov_mag::update_balances()
mag.rewrite();
// conclude la TRANSAZIONE prima di sbloccare il record dell'articolo
TToken_string *rem_key=(TToken_string *)keys_to_remove.first_item();
while ( rem_key) {
while ( rem_key)
{
if (key2field(*rem_key,"CODART")==key2field(*curr_key,"CODART")) {
giac_putkey(mag,_annoes,*rem_key);
if (mag.read()==NOERR) {
if (mag.read()==NOERR)
{
update_balances(mag.curr(),(TLine_movmag &)lines_to_subtract[*rem_key],-1);
mag.rewrite();
}
@ -1369,30 +1382,34 @@ int TMov_mag::update_balances()
rem_key=(TToken_string *)keys_to_remove.succ_item();
}
curr_art.unlock();
} else {
updated_bal=FALSE;
}
else
updated_bal=FALSE;
curr_key=(TToken_string *)keys_to_add.succ_item();
}
// togli i saldi vecchi
curr_key=(TToken_string *)keys_to_remove.first_item();
while (curr_key) {
while (curr_key)
{
curr_art.read((const char *)key2field(*curr_key,"CODART"));
if (curr_art.lock_and_prompt()) {
if (curr_art.lock_and_prompt())
{
giac_putkey(mag,_annoes,*curr_key);
// modifica questo record (e lo sblocca)
if (mag.read()==NOERR) {
if (mag.read()==NOERR)
{
update_balances(mag.curr(),(TLine_movmag &)lines_to_subtract[*curr_key],-1);
mag.rewrite();
}
curr_art.unlock();
} else {
updated_bal=FALSE;
}
else
updated_bal=FALSE;
curr_key=(TToken_string *)keys_to_remove.succ_item();
}
if (!updated_bal) {
if (!updated_bal)
{
// saldi non aggiornati
warning_box("I saldi di magazzino non sono stati del tutto aggiornati. \nProcedere ad una operazione di ''Ricostruzione saldi''");
}
@ -1406,51 +1423,54 @@ int TMov_mag::update_balances(TRectype & magrec, const TLine_movmag &l,int rett_
TCausale_magazzino & caus=(TCausale_magazzino &)cache_causali.get(l.codcaus());
TLocalisamfile umart(LF_UMART);
real diff,diff_val;
umart.setkey(2);
umart.put(UMART_CODART,magrec.get(MAG_CODART));
umart.put(UMART_UM , l.um());
umart.read();
real fc=umart.get_real("FC");
diff=fc*rett_sign*l.quant();
diff_val=rett_sign*l.quant()*l.prezzo();
if (caus.update_qta()) {
update_balance(magrec,"GIAC",diff*caus.sgn(s_giac)); // update ..
update_balance(magrec,"ACQ",diff*caus.sgn(s_acq)); // update ..
update_balance(magrec,"ENT",diff*caus.sgn(s_ent));
update_balance(magrec,"VEN",diff*caus.sgn(s_ven));
update_balance(magrec,"USC",diff*caus.sgn(s_usc));
update_balance(magrec,"ORDC",diff*caus.sgn(s_ordc));
update_balance(magrec,"ORDF",diff*caus.sgn(s_ordf));
update_balance(magrec,"RIM",diff*caus.sgn(s_rim));
update_balance(magrec,"SCARTI",diff*caus.sgn(s_scart));
update_balance(magrec,"INCL",diff*caus.sgn(s_incl));
update_balance(magrec,"ACL",diff*caus.sgn(s_acl));
update_balance(magrec,"PRODCOMP",diff*caus.sgn(s_prodc));
update_balance(magrec,"PRODFIN",diff*caus.sgn(s_prodf));
update_balance(magrec,"NLABEL",diff*caus.sgn(s_label));
update_balance(magrec,"USER1",diff*caus.sgn(s_user1));
update_balance(magrec,"USER2",diff*caus.sgn(s_user2));
update_balance(magrec,"USER3",diff*caus.sgn(s_user3));
update_balance(magrec,"USER4",diff*caus.sgn(s_user4));
update_balance(magrec,"USER5",diff*caus.sgn(s_user5));
update_balance(magrec,"USER6",diff*caus.sgn(s_user6));
diff=((real)rett_sign) * l.quant() * fc;
diff_val= ((real)rett_sign) * l.quant() * l.prezzo();
if (caus.update_qta())
{
update_balance(magrec,"GIAC",diff* (real)caus.sgn(s_giac)); // update ..
update_balance(magrec,"ACQ",diff* (real)caus.sgn(s_acq)); // update ..
update_balance(magrec,"ENT",diff* (real)caus.sgn(s_ent));
update_balance(magrec,"VEN",diff* (real)caus.sgn(s_ven));
update_balance(magrec,"USC",diff* (real)caus.sgn(s_usc));
update_balance(magrec,"ORDC",diff* (real)caus.sgn(s_ordc));
update_balance(magrec,"ORDF",diff* (real)caus.sgn(s_ordf));
update_balance(magrec,"RIM",diff* (real)caus.sgn(s_rim));
update_balance(magrec,"SCARTI",diff* (real)caus.sgn(s_scart));
update_balance(magrec,"INCL",diff* (real)caus.sgn(s_incl));
update_balance(magrec,"ACL",diff* (real)caus.sgn(s_acl));
update_balance(magrec,"PRODCOMP",diff* (real)caus.sgn(s_prodc));
update_balance(magrec,"PRODFIN",diff* (real)caus.sgn(s_prodf));
update_balance(magrec,"NLABEL",diff* (real)caus.sgn(s_label));
update_balance(magrec,"USER1",diff* (real)caus.sgn(s_user1));
update_balance(magrec,"USER2",diff* (real)caus.sgn(s_user2));
update_balance(magrec,"USER3",diff* (real)caus.sgn(s_user3));
update_balance(magrec,"USER4",diff* (real)caus.sgn(s_user4));
update_balance(magrec,"USER5",diff* (real)caus.sgn(s_user5));
update_balance(magrec,"USER6",diff* (real)caus.sgn(s_user6));
}
if (caus.update_val()) {
update_balance(magrec,"VALACQ",diff_val*caus.sgn(s_acq)); // update ..
update_balance(magrec,"VALENT",diff_val*caus.sgn(s_ent));
update_balance(magrec,"VALVEN",diff_val*caus.sgn(s_ven));
update_balance(magrec,"VALUSC",diff_val*caus.sgn(s_usc));
update_balance(magrec,"VALORDC",diff_val*caus.sgn(s_ordc));
update_balance(magrec,"VALORDF",diff_val*caus.sgn(s_ordf));
update_balance(magrec,"VALRIM",diff_val*caus.sgn(s_rim));
update_balance(magrec,"VALSCARTI",diff_val*caus.sgn(s_scart));
update_balance(magrec,"USERVAL1",diff*caus.sgn(s_user1));
update_balance(magrec,"USERVAL2",diff*caus.sgn(s_user2));
update_balance(magrec,"USERVAL3",diff*caus.sgn(s_user3));
update_balance(magrec,"USERVAL4",diff*caus.sgn(s_user4));
update_balance(magrec,"USERVAL5",diff*caus.sgn(s_user5));
update_balance(magrec,"USERVAL6",diff*caus.sgn(s_user6));
if (caus.update_val())
{
update_balance(magrec,"VALACQ",diff_val* (real)caus.sgn(s_acq)); // update ..
update_balance(magrec,"VALENT",diff_val* (real)caus.sgn(s_ent));
update_balance(magrec,"VALVEN",diff_val* (real)caus.sgn(s_ven));
update_balance(magrec,"VALUSC",diff_val* (real)caus.sgn(s_usc));
update_balance(magrec,"VALORDC",diff_val* (real)caus.sgn(s_ordc));
update_balance(magrec,"VALORDF",diff_val* (real)caus.sgn(s_ordf));
update_balance(magrec,"VALRIM",diff_val* (real)caus.sgn(s_rim));
update_balance(magrec,"VALSCARTI",diff_val* (real)caus.sgn(s_scart));
update_balance(magrec,"USERVAL1",diff* (real)caus.sgn(s_user1));
update_balance(magrec,"USERVAL2",diff* (real)caus.sgn(s_user2));
update_balance(magrec,"USERVAL3",diff* (real)caus.sgn(s_user3));
update_balance(magrec,"USERVAL4",diff* (real)caus.sgn(s_user4));
update_balance(magrec,"USERVAL5",diff* (real)caus.sgn(s_user5));
update_balance(magrec,"USERVAL6",diff* (real)caus.sgn(s_user6));
}
return 0;
}
@ -1472,23 +1492,30 @@ int TMov_mag::codice_esercizio(TDate &d)
bool rebuild_balances(const TString16 annoes/*, bool reset_giac*/)
{
TArray used_files;
used_files.add(new TLocalisamfile(LF_RMOVMAG),LF_RMOVMAG);
used_files.add(new TLocalisamfile(LF_MOVMAG),LF_MOVMAG);
used_files.add(new TTable("%CAU"),5);
TMov_mag * m_m= new TMov_mag; // record del movimento di magazzino
TMov_mag * m_m= new TMov_mag; // record del movimento di magazzino
// relazione con un solo file (LF_MOVMAG) ma col record Head_Body
TRelation rel(LF_MOVMAG);
rel.lfile().set_curr(m_m);
int ok=TRUE;
TLocalisamfile mag(LF_MAG);
// Il flag di reset delle giacenze viene impostato in base alla chiusura dell'esercizio
// precedente
// Aggiorna il cazzillo per caricare eventuali date di chiusura e altre amenita' simili
_esercizi.update();
const int pred_es = _esercizi.pred(atoi(annoes));
const bool reset_giac = pred_es != 0 ? _esercizi.esercizio(pred_es).chiusura_mag() != TDate(NULLDATE) : TRUE;
if (reset_giac) {
if (reset_giac)
{
// azzera tutte giacenze (ciclo sulle giacenze)
mag.put("ANNOES",annoes);
mag.read(_isgteq);
@ -1525,7 +1552,9 @@ bool rebuild_balances(const TString16 annoes/*, bool reset_giac*/)
mag.next();
}
articolo.unlock();
} else {
}
else
{
ok=FALSE;
mag.next();
}

View File

@ -51,14 +51,14 @@ STRING FLD_TABRFA_S7 2
DISPLAY "U.M. " CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT FLD_TABRFA_S7 CODTAB
CHECKTYPE NORMAL
CHECKTYPE NORMAL
WARNING "Unita' di misura errata"
END
STRING FLD_TABRFA_S8 2
BEGIN
PROMPT 2 9 "Classe fiscale "
FLAGS "U"
FLAGS "U"
FIELD S8
USE ASF
INPUT CODTAB FLD_TABRFA_S8
@ -76,7 +76,7 @@ STRING FLD_DESCFA 50
INPUT S0 FLD_DESCFA
DISPLAY "Descrizione@50" S0
DISPLAY "Cl. Fisc." CODTAB
COPY OUTPUT FLD_TABRFA_S8
COPY OUTPUT FLD_TABRFA_S8
CHECKTYPE NORMAL
END
@ -148,7 +148,7 @@ NUMBER F_CONTOV 3
BEGIN
PROMPT 25 14 ""
FIELD I4
USE LF_PCON SELECT INDBIL=="4"
USE LF_PCON SELECT (CONTO!="") && (SOTTOCONTO=="")
INPUT GRUPPO F_GRUPPOV
INPUT CONTO F_CONTOV
DISPLAY "Gruppo" GRUPPO
@ -165,7 +165,7 @@ NUMBER F_SOTTOCV 6
BEGIN
PROMPT 33 14 ""
FIELD I5
USE LF_PCON SELECT (SOTTOCONTO!="") && (500@->INDBIL=="4")
USE LF_PCON SELECT SOTTOCONTO!=""
JOIN LF_PCON ALIAS 500 INTO GRUPPO==GRUPPO CONTO==CONTO
INPUT GRUPPO F_GRUPPOV
INPUT CONTO F_CONTOV
@ -187,7 +187,7 @@ STRING F_DESCRV 50
BEGIN
PROMPT 19 15 ""
FLAG "U"
USE LF_PCON KEY 2 SELECT (SOTTOCONTO!="") && (500@->INDBIL=="4")
USE LF_PCON KEY 2 SELECT SOTTOCONTO!=""
JOIN LF_PCON ALIAS 500 INTO GRUPPO==GRUPPO CONTO==CONTO
INPUT DESCR F_DESCRV
DISPLAY "Descrizione@50" DESCR
@ -210,7 +210,7 @@ NUMBER F_CONTOA 3
BEGIN
PROMPT 25 16 ""
FIELD I1
USE LF_PCON SELECT INDBIL=="3"
USE LF_PCON SELECT (CONTO!="") && (SOTTOCONTO=="")
INPUT GRUPPO F_GRUPPOA
INPUT CONTO F_CONTOA
DISPLAY "Gruppo" GRUPPO
@ -227,7 +227,7 @@ NUMBER F_SOTTOCA 6
BEGIN
PROMPT 33 16 ""
FIELD I2
USE LF_PCON SELECT (SOTTOCONTO!="") && (500@->INDBIL=="3")
USE LF_PCON SELECT SOTTOCONTO!=""
JOIN LF_PCON ALIAS 500 INTO GRUPPO==GRUPPO CONTO==CONTO
INPUT GRUPPO F_GRUPPOA SELECT
INPUT CONTO F_CONTOA SELECT
@ -249,7 +249,7 @@ STRING F_DESCRA 50
BEGIN
PROMPT 19 17 ""
FLAG "U"
USE LF_PCON KEY 2 SELECT (SOTTOCONTO!="") && (500@->INDBIL=="3")
USE LF_PCON KEY 2 SELECT SOTTOCONTO!=""
JOIN LF_PCON ALIAS 500 INTO GRUPPO==GRUPPO CONTO==CONTO
INPUT DESCR F_DESCRA
DISPLAY "Descrizione@50" DESCR

View File

@ -180,7 +180,7 @@ NUMBER F_CONTOV 3
BEGIN
PROMPT 22 15 ""
FIELD I1
USE LF_PCON SELECT (CONTO!="") && (SOTTOCONTO=="") && ((INDBIL=="4") || (INDBIL=="1") || (INDBIL=="2"))
USE LF_PCON SELECT (CONTO!="") && (SOTTOCONTO=="")
INPUT GRUPPO F_GRUPPOV
INPUT CONTO F_CONTOV
DISPLAY "Gruppo" GRUPPO
@ -197,7 +197,7 @@ NUMBER F_SOTTOV 6
BEGIN
PROMPT 30 15 ""
FIELD I2
USE LF_PCON SELECT (SOTTOCONTO!="") && ((500@->INDBIL=="4") || (500@->INDBIL=="1") || (500@->INDBIL=="2"))
USE LF_PCON SELECT SOTTOCONTO!=""
JOIN LF_PCON ALIAS 500 INTO GRUPPO==GRUPPO CONTO==CONTO
INPUT GRUPPO F_GRUPPOV
INPUT CONTO F_CONTOV
@ -219,7 +219,7 @@ STRING F_DESCRCONTOV 50
BEGIN
PROMPT 17 16 ""
FLAG "U"
USE LF_PCON KEY 2 SELECT (SOTTOCONTO!="") && ((500@->INDBIL=="4") || (500@->INDBIL=="1") || (500@->INDBIL=="2"))
USE LF_PCON KEY 2 SELECT SOTTOCONTO!=""
JOIN LF_PCON ALIAS 500 INTO GRUPPO==GRUPPO CONTO==CONTO
INPUT DESCR F_DESCRCONTOV
DISPLAY "Descrizione@50" DESCR
@ -243,7 +243,7 @@ NUMBER F_CONTOA 3
BEGIN
PROMPT 22 17 ""
FIELD I4
USE LF_PCON SELECT (CONTO!="") && (SOTTOCONTO=="") && ((INDBIL=="3") || (INDBIL=="1") || (INDBIL=="2"))
USE LF_PCON SELECT (CONTO!="") && (SOTTOCONTO=="")
INPUT GRUPPO F_GRUPPOA
INPUT CONTO F_CONTOA
DISPLAY "Gruppo" GRUPPO
@ -260,7 +260,7 @@ NUMBER F_SOTTOA 6
BEGIN
PROMPT 30 17 ""
FIELD I5
USE LF_PCON SELECT (SOTTOCONTO!="") && ((500@->INDBIL=="3") || (500@->INDBIL=="1") || (500@->INDBIL=="2"))
USE LF_PCON SELECT SOTTOCONTO!=""
JOIN LF_PCON ALIAS 500 INTO GRUPPO==GRUPPO CONTO==CONTO
INPUT GRUPPO F_GRUPPOA
INPUT CONTO F_CONTOA
@ -282,7 +282,7 @@ STRING F_DESCRCONTOA 50
BEGIN
PROMPT 17 18 ""
FLAG "U"
USE LF_PCON KEY 2 SELECT (SOTTOCONTO!="") && ((500@->INDBIL=="3") || (500@->INDBIL=="1") || (500@->INDBIL=="2"))
USE LF_PCON KEY 2 SELECT SOTTOCONTO!=""
JOIN LF_PCON ALIAS 500 INTO GRUPPO==GRUPPO CONTO==CONTO
INPUT DESCR F_DESCRCONTOA
DISPLAY "Descrizione@50" DESCR

View File

@ -1093,7 +1093,7 @@ FIELDNAME=CODVETT1
MSKID=F_CODVETT1
TYPE=T_STRINGA
PROMPT="Vettore 1' "
SIZE=5
SIZE=6
FLAG=ZU
USE=%VET
INPUT=CODTAB F_CODVETT1
@ -1125,7 +1125,7 @@ FIELDNAME=CODVETT2
MSKID=F_CODVETT2
TYPE=T_STRINGA
PROMPT="Vettore 2' "
SIZE=5
SIZE=6
FLAG=ZU
USE=%VET
INPUT=CODTAB F_CODVETT2
@ -1157,7 +1157,7 @@ FIELDNAME=CODVETT3
MSKID=F_CODVETT3
TYPE=T_STRINGA
PROMPT="Vettore 3' "
SIZE=5
SIZE=6
FLAG=ZU
USE=%VET
INPUT=CODTAB F_CODVETT3

View File

@ -627,12 +627,16 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc)
}
// reperisce l'ultimo numero di registrazione disponibile
mov.last();
const long numreg = mov.get_int(MOV_NUMREG) + 1;
if (mov.status() != NOERR || numreg < 1)
long numreg = 1L;
if (!mov.empty())
{
_error = nr_reg_error;
return _error;
mov.last();
numreg = mov.get_long(MOV_NUMREG) + 1L;
if (mov.status() != NOERR || numreg < 1)
{
_error = nr_reg_error;
return _error;
}
}
TCodice_numerazione cod_num(doc.numerazione());