Correzione alla conversione delle date e dei booleani (effettuata in un unico passo)

git-svn-id: svn://10.65.10.50/trunk@1552 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 1995-07-04 15:00:38 +00:00
parent d96d30d323
commit 4e71de7064

View File

@ -1,375 +1,319 @@
#include <applicat.h> #include <applicat.h>
#include <isam.h> #include <isam.h>
#include <date.h> #include <date.h>
#include <prefix.h> #include <prefix.h>
#include <progind.h> #include <progind.h>
#include <urldefid.h> #include <urldefid.h>
#include <utility.h> #include <utility.h>
#define DAYBIAS 36525L #define DAYBIAS 36525L
#define DAYYEAR 365 #define DAYYEAR 365
extern "C" { extern "C" {
int CGetFieldBuff(char *, RecDes *, char *, char *); int CGetFieldBuff(char *, RecDes *, char *, char *);
int findfld(RecDes *, const char *); int findfld(RecDes *, const char *);
}; };
byte m1[12] = {31,28,31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; byte m1[12] = {31,28,31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int m2[12] = {31,59,90,120,151,181,212,243,273,304,334,365}; int m2[12] = {31,59,90,120,151,181,212,243,273,304,334,365};
enum what {_date,_isam}; HIDDEN int CGetField(const char *fieldname,RecDes* recd,RecType recin,long* d)
HIDDEN int CGetField(const char *fieldname,RecDes* recd,RecType recin,long* d) {
int p, i;
{ unsigned int off;
int p, i; byte len;
unsigned int off; char *s1, s[10];
byte len;
char *s1, s[10]; if ((p = findfld(recd, fieldname)) != -1)
{
if ((p = findfld(recd, fieldname)) != -1) off = recd->Fd[p].RecOff;
{ len = recd->Fd[p].Len;
off = recd->Fd[p].RecOff; if (recd->Fd[p].TypeF != _datefld)
len = recd->Fd[p].Len; {
if (recd->Fd[p].TypeF != _datefld) while ((recin[off] == ' ') && (len))
{ {
while ((recin[off] == ' ') && (len)) off++;
{ len--;
off++; }
len--; }
} if (len)
} {
if (len) s1 = recin + off;
{ for (i = 0; i < len; i++) s[i] = s1[i];
s1 = recin + off; s[len] = '\0';
for (i = 0; i < len; i++) s[i] = s1[i]; while ((len) && (s[len - 1] == ' ')) s[--len] = '\0';
s[len] = '\0'; }
while ((len) && (s[len - 1] == ' ')) s[--len] = '\0'; else strcpy(s, "");
} if (recd->Fd[p].TypeF == _datefld)
else strcpy(s, ""); {
if (recd->Fd[p].TypeF == _datefld) if (strlen(s))
{ *d=atol(s);
if (strlen(s)) *d=atol(s); else *d=0;
else *d=0; }
} return (0);
return (0); }
} else
else {
{ fatal_box("Non esiste il campo %s", fieldname);
fatal_box("Non esiste il campo %s", fieldname); return(-1);
return(-1); }
} }
}
class TIsam_date_converter : public TApplication
class TIsam_date_converter : public TApplication {
{
protected:
protected: virtual bool create () ;
virtual bool create () ; virtual bool destroy();
virtual bool destroy(); void update();
void update(); void update_dir();
void Iupdate_dir(); void convert_dir();
void convert_dir(const what conversion); int convert_file(int logicnum);
int Iconvert_file(int logicnum);
void Dconvert_file(int logicnum); public:
TIsam_date_converter() {}
public: ~TIsam_date_converter() {}
TIsam_date_converter() {}
~TIsam_date_converter() {} };
}; bool TIsam_date_converter::create() // initvar e arrmask
bool TIsam_date_converter::create() // initvar e arrmask {
TApplication::create();
{
TApplication::create(); update();
return FALSE;
update(); }
return FALSE;
} bool TIsam_date_converter::destroy() // releasev e arrmask
bool TIsam_date_converter::destroy() // releasev e arrmask {
return TApplication::destroy() ;
{ }
return TApplication::destroy() ;
} void TIsam_date_converter::update()
void TIsam_date_converter::update() {
long firm = get_firm();
{ TString pref;
long firm = get_firm(); if (firm == 0) pref = prefix().name();
TString pref;
if (firm == 0) pref = prefix().name(); do_events();
begin_wait();
do_events(); // Converte i files in formato DBIII, FOXPRO...
begin_wait(); prefix().set("");
// Converte i files in formato DBIII, FOXPRO... update_dir();
prefix().set(""); set_autoload_new_files(FALSE);
Iupdate_dir(); prefix().set("com");
prefix().set("com"); update_dir();
Iupdate_dir(); convert_dir();
convert_dir(_isam);
TLocalisamfile ditte(LF_NDITTE);
TLocalisamfile ditte(LF_NDITTE);
for (ditte.first(); !ditte.eof(); ditte.next())
set_autoload_new_files(FALSE); {
for (ditte.first(); !ditte.eof(); ditte.next()) const long codditta = ditte.get_long("CODDITTA");
{ const TRecnotype rec = ditte.recno();
const long codditta = ditte.get_long("CODDITTA");
const TRecnotype rec = ditte.recno(); if (prefix().exist(codditta))
{
if (prefix().exist(codditta)) set_firm(codditta);
{ update_dir();
set_firm(codditta); convert_dir();
Iupdate_dir(); }
convert_dir(_isam); }
}
} if (firm > 0) set_firm(firm);
else prefix().set(pref);
// Converte le date in ANSI. set_autoload_new_files(TRUE);
prefix().set("com"); end_wait();
convert_dir(_date); }
for (ditte.first(); !ditte.eof(); ditte.next())
{ void TIsam_date_converter::update_dir()
const long codditta = ditte.get_long("CODDITTA");
const TRecnotype rec = ditte.recno(); {
TDir d;
if (prefix().exist(codditta))
{ d.get(LF_DIR);
set_firm(codditta); const int items = (int)d.eod();
convert_dir(_date); TString80 s("Aggiornamento direttorio ");
} TString pref(prefix().name());
}
if (pref.empty()) s << "standard";
if (firm > 0) set_firm(firm); else
else prefix().set(pref); if (pref == "com") s << "comune";
set_autoload_new_files(TRUE); else s << " della ditta " << atol (pref);
end_wait();
} TProgind p((long)(items ? items : 1), s, TRUE, TRUE, 70);
void TIsam_date_converter::Iupdate_dir() p.setstatus(1L);
for (int i = 2; i <= items; i++)
{ {
TDir d; p.addstatus(1L);
d.get(i, _nolock, _nordir, _sysdirop);
d.get(LF_DIR);
const int items = (int)d.eod(); TFilename s(d.name());
TString80 s("Aggiornamento direttorio ");
TString pref(prefix().name()); s.ext("");
strcpy((char *) d.name(), s);
if (pref.empty()) s << "standard"; d.put(i, _nordir, _sysdirop);
else }
if (pref == "com") s << "comune"; }
else s << " della ditta " << atol (pref);
void TIsam_date_converter::convert_dir()
TProgind p((long)(items ? items : 1), s, TRUE, TRUE, 70);
{
p.setstatus(1L); const TString pref(prefix().name());
for (int i = 2; i <= items; i++) const bool is_com = prefix().is_com();
{ TDir d;
p.addstatus(1L);
d.get(i, _nolock, _nordir, _sysdirop); d.get(LF_DIR);
const int items = (int)d.eod();
TFilename s(d.name()); TString80 s("Aggiornamento archivi ");
s.ext(""); if (pref == "com") s << "comuni";
strcpy((char *) d.name(), s); else s << " della ditta " << atol (pref);
d.put(i, _nordir, _sysdirop);
} TProgind p((long)(items ? items : 1), s, TRUE, TRUE, 70);
}
p.setstatus(1L);
void TIsam_date_converter::convert_dir(const what conversion)
for (int i = 2; i <= items; i++)
{ {
const TString pref(prefix().name()); p.setstatus((long)(i+1));
const bool is_com = prefix().is_com(); d.get(i, _nolock, _nordir, _sysdirop);
TDir d;
const bool to_convert = (is_com ? d.is_com() : d.is_firm());
d.get(LF_DIR);
const int items = (int)d.eod(); if (to_convert)
TString80 s("Aggiornamento archivi "); convert_file(i);
}
if (pref == "com") s << "comuni"; }
else s << " della ditta " << atol (pref);
int TIsam_date_converter::convert_file(int logicnum)
TProgind p((long)(items ? items : 1), s, TRUE, TRUE, 70);
{
p.setstatus(1L); TDir dir;
TTrec r;
for (int i = 2; i <= items; i++) int err = NOERR;
{
p.setstatus((long)(i+1)); r.get(logicnum);
d.get(i, _nolock, _nordir, _sysdirop); RecDes *rd=r.rec();
const int nflds = r.fields();
const bool to_convert = (is_com ? d.is_com() : d.is_firm()); const int nkeys = r.keys();
if (to_convert) dir.get(logicnum);
{ if (dir.len() == 0 || nflds < 1 || nkeys < 1) return 0;
if (conversion == _isam) const char * fp = dir.name();
Iconvert_file(i); TFilename old(fp);
else const TRecnotype nitems = dir.eod();
Dconvert_file(i); TFile f(dir.len());
}
} old.ext("dta");
} if (fexist(old))
{
int TIsam_date_converter::Iconvert_file(int logicnum) f.open(old);
{
{ TSystemisamfile newfile(logicnum);
TDir dir;
TTrec r; if (newfile.build(10) != NOERR)
int err = NOERR; fatal_box("Non riesco a creare il file %s : errore n. %d", fp, newfile.status());
}
r.get(logicnum);
RecDes *rd=r.rec(); TString s(80);
const int nflds = r.fields();
const int nkeys = r.keys(); s.format("Aggiornamento archivio %s", fp);
TProgind p((long)(nitems ? nitems : 1), s, TRUE, TRUE, 70);
dir.get(logicnum); TLocalisamfile newfile(logicnum);
if (dir.len() == 0 || nflds < 1 || nkeys < 1) return 0; TToken_string ts(128); // Build token_string with the names of date fields and logical fields
const char * fp = dir.name(); TToken_string tslog(128);
TFilename old(fp); TRecnotype i;
const TRecnotype nitems = dir.eod();
TFile f(dir.len()); for (int j=0; j<r.fields(); j++)
if (rd->Fd[j].TypeF == _datefld)
old.ext("dta"); ts.add(rd->Fd[j].Name);
if (fexist(old)) else
{ if (rd->Fd[j].TypeF == _boolfld)
f.open(old); tslog.add(rd->Fd[j].Name);
{ const int tslog_items = tslog.items();
TSystemisamfile newfile(logicnum); const int ts_items = ts.items();
if (newfile.build(10) != NOERR) for (i = 1; newfile.good() && i <= dir.eod(); i++)
fatal_box("Non riesco a creare il file %s : errore n. %d", fp, newfile.status()); {
} f.read(newfile.curr().string(),i);
if (newfile.curr().string()[0] == '\0')
TString s(80); {
s.format("Aggiornamento archivio %s", fp); newfile.curr().recall();
if (tslog_items > 0)
TProgind p((long)(nitems ? nitems : 1), s, FALSE, TRUE, 70); for (const char * field_name = tslog.get(0); field_name != NULL; field_name = tslog.get())
TLocalisamfile newfile(logicnum); {
TRecnotype i; const TString16 value(newfile.curr().get_str(field_name));
for (i = 1; newfile.good() && i <= dir.eod(); i++)
{ newfile.put(field_name,value == "X");
f.read(newfile.curr().string(),i); }
if (ts_items > 0)
if (newfile.curr().string()[0] == '\0') for (const char *field_name = ts.get(0); field_name != NULL; field_name = ts.get())
newfile.curr().recall(); {
else long wd;
newfile.curr().discard(); CGetField(field_name,rd,newfile.curr().string(),&wd);
if ((i % 50) == 0) p.setstatus((long)(i + 1)); TDate d(wd);
if (!newfile.curr().isdeleted()) newfile.put(field_name,d);
newfile.write(); }
} }
p.setstatus((long)nitems); else
f.close(); newfile.curr().discard();
if (newfile.good()) if ((i % 50) == 0) p.setstatus((long)(i + 1));
{ if (!newfile.curr().isdeleted())
old.ext("dta"); newfile.write();
::remove(old); }
old.ext("ndx"); p.setstatus((long)nitems);
::remove(old); f.close();
} if (newfile.good())
else {
error_box("Errore nella conversione dell' archivio %s : n.ro %d", old.ext("dta");
fp, newfile.status()); ::remove(old);
} old.ext("ndx");
else ::remove(old);
{ }
// Crea il file se non esiste il relativo .DTA. else
const TString pref(prefix().name()); error_box("Errore nella conversione dell' archivio %s record %ld : n.ro %d",
const bool is_com = prefix().is_com(); fp, i, newfile.status());
}
prefix().set(""); else
dir.get(logicnum); {
const int module = abs((int)dir.flags()); // Crea il file se non esiste il relativo .DTA.
prefix().set(pref); const TString pref(prefix().name());
dir.get(logicnum, _nolock, _nordir, _sysdirop); const bool is_com = prefix().is_com();
bool to_create = (is_com ? dir.is_com() : dir.is_firm());
if (to_create && has_module(module, CHK_DONGLE)) prefix().set("");
{ dir.get(logicnum);
dir.get(logicnum); const int module = abs((int)dir.flags());
TFilename s(dir.name()); prefix().set(pref);
s.ext("dbf"); dir.get(logicnum, _nolock, _nordir, _sysdirop);
if (!fexist(s)) // Crea il file solo se non esiste il .DBF bool to_create = (is_com ? dir.is_com() : dir.is_firm());
{ if (to_create && has_module(module, CHK_DONGLE))
TSystemisamfile f(logicnum); {
f.build(10L); dir.get(logicnum);
} TFilename s(dir.name());
} s.ext("dbf");
} if (!fexist(s)) // Crea il file solo se non esiste il .DBF
return err; {
} TSystemisamfile f(logicnum);
f.build(10L);
void TIsam_date_converter::Dconvert_file(int logicnum) }
}
{ }
TDir dir; return err;
TTrec r; }
int err = NOERR;
r.get(logicnum); int main(int argc, char** argv)
RecDes *rd=r.rec(); {
const int nflds = r.fields(); TIsam_date_converter a;
const int nkeys = r.keys();
a.run(argc, argv, "Conversione a CodeBase");
dir.get(logicnum); return 0;
if (dir.len() == 0 || nflds < 1 || nkeys < 1) return; }
const TRecnotype nitems = dir.eod();
const char* file_name = dir.name();
TToken_string ts(128); // Build token_string with the names of date fields and logical fields
TToken_string tslog(128);
for (int j=0; j<r.fields(); j++)
if (rd->Fd[j].TypeF == _datefld)
ts.add(rd->Fd[j].Name);
else
if (rd->Fd[j].TypeF == _boolfld)
tslog.add(rd->Fd[j].Name);
if (ts.items() > 0 || tslog.items() > 0)
{
TString s(80);
s.format("Aggiornamento archivio %s", file_name);
TProgind p((long)(nitems ? nitems : 1), s, TRUE, TRUE, 70);
TLocalisamfile ifile(logicnum);
ifile.readat(1);
for (TRecnotype i = 1; ifile.good() && i <= ifile.items(); i++)
{
ts.restart();
tslog.restart();
for (int j=1; j <= ts.items(); j++)
{
const char* field_name=ts.get();
long wd;
CGetField(field_name,rd,ifile.curr().string(),&wd);
TDate d(wd);
ifile.curr().put(field_name,d);
}
for (j=1; j<= tslog.items(); j++)
{
const char* field_name=tslog.get();
TString value;
value=ifile.curr().get_str(field_name);
ifile.curr().put(field_name,value == "X");
}
ifile.rewriteat(i);
if (i < ifile.items())
{
ifile.readat(i+1);
if ((i %50) == 0) p.setstatus(i+1);
}
}
p.setstatus(nitems);
}
}
int main(int argc, char** argv)
{
TIsam_date_converter a;
a.run(argc, argv, "Conversione a CodeBase");
return 0;
}