Aggiunte a ba1 le seguenti funzioni :

- Stampa
- Esportazione
- Importazione
- Editing dei file (incorporando ba1300 in ba1100) (ba1300 -> ba1102)


git-svn-id: svn://10.65.10.50/trunk@14 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 1994-08-16 16:35:22 +00:00
parent 2bf6f6adf5
commit da54026c24
8 changed files with 1425 additions and 1106 deletions

View File

@ -1,3 +1,4 @@
#include <stdlib.h>
#include <applicat.h> #include <applicat.h>
#include <xvtility.h> #include <xvtility.h>
#include <utility.h> #include <utility.h>
@ -15,9 +16,10 @@
class BA1100_application : public TApplication class BA1100_application : public TApplication
{ {
TDir_sheet * _browse; TDir_sheet * _browse;
TMask * _mask; TMask * _mask;
long _firm; long _firm;
TRec_sheet* _rec;
protected: protected:
virtual bool menu (MENU_TAG); virtual bool menu (MENU_TAG);
@ -30,33 +32,96 @@ virtual bool extended_firm() const { return TRUE; }
void update(); void update();
void update_dir(); void update_dir();
void convert_dir(); void convert_dir();
virtual void print();
public: public:
BA1100_application() : _browse(NULL) {} BA1100_application() : _browse(NULL), _rec(NULL) {}
}; };
void BA1100_application::print()
{
if (_rec == NULL) return;
const char* table[] = {"", "Alfanumerico", "Intero", "Intero Lungo",
"Reale", "Data", "Intero", "Carattere",
"Booleano", "Intero Zerofilled",
"Intero Lungo Zerofilled"};
TPrinter& p = printer();
TPrintrow row;
TToken_string s;
p.open();
p.headerlen(6);
p.footerlen(4);
row.reset();
row.put(format("Lista tracciato %s (%s)", _rec->dir()->des(),
_rec->dir()->name()), 2);
row.put("Pag. @#", 66);
p.setheaderline(2, row);
row.reset();
row.put("Nome", 7);
row.put("Tipo", 18);
row.put("Lunghezza", 45);
row.put(" Decimali", 55);
row.put("Posizione", 65);
p.setheaderline(4, row);
p.setbackground("l[1,6,75,6]");
for (int i = 0; i < _rec->rec()->fields(); i ++)
{
row.reset();
s = _rec->rec()->fielddef(i);
row.put(format("%3d", i + 1), 2);
row.put(s.get(), 7);
row.put(table[s.get_int()], 18);
row.put(format(" %4d", s.get_int()), 45);
row.put(format(" %4d", s.get_int()), 55);
row.put(format(" %4d", _rec->rec()->rec()->Fd[i].RecOff), 65);
p.print(row);
}
p.formfeed();
row.reset();
row.put("Espressione chiave", 7);
row.put("Duplicabile", 68);
p.setheaderline(4, row);
for (i = 0; i < _rec->rec()->keys(); i ++)
{
row.reset();
s = _rec->rec()->keydef(i);
row.put(format("%3d", i + 1), 2);
row.put(s.get(), 7);
row.put(*s.get() == 'X' ? "Si" : "No", 68);
p.print(row);
}
p.formfeed();
p.close();
}
bool BA1100_application::create() // initvar e arrmask bool BA1100_application::create() // initvar e arrmask
{ {
_firm = get_firm(); _firm = get_firm();
_mask = new TMask ("ba1100a"); _mask = new TMask ("ba1100a");
set_firm(); set_firm();
_browse = new TDir_sheet ("Manutenzione file di sistema") ; set_printer(new TPrinter());
_browse->add_button(DLG_INSFILE, "Inserisce", K_F4); _browse = new TDir_sheet ("Manutenzione file di sistema") ;
_browse->add_button(DLG_CONVERT, "Converte", K_F7); _browse->add_button(DLG_INSFILE, "Inserisce", K_F4);
_browse->add_button(DLG_ADDFILE, "Aggiunge", K_F8); _browse->add_button(DLG_CONVERT, "Converte", K_F7);
dispatch_e_menu(BAR_ITEM(1)); _browse->add_button(DLG_ADDFILE, "Aggiunge", K_F8);
return TRUE ; dispatch_e_menu(BAR_ITEM(1));
return TRUE ;
} }
bool BA1100_application::destroy() // releasev e arrmask bool BA1100_application::destroy() // releasev e arrmask
{ {
if (_firm) set_firm(_firm); TPrinter* p = &printer();
if (_browse != NULL) delete _browse;
delete _mask; delete p;
return TRUE ; if (_firm) set_firm(_firm);
if (_browse != NULL) delete _browse;
delete _mask;
return TRUE ;
} }
@ -84,8 +149,8 @@ void BA1100_application::insert_riga (long riga_sel, TToken_string& riga)
_browse->rec()->put (i + 1); _browse->rec()->put (i + 1);
} }
_browse->dir()->set(_mask->get(FLD_NOME), _mask->get_long(FLD_EOD), _browse->dir()->set(_mask->get(FLD_NOME), _mask->get_long(FLD_EOD),
_mask->get_long(FLD_FLAG), _mask->get (FLD_DESC), _mask->get_long(FLD_FLAG), _mask->get (FLD_DESC),
_mask->get (FLD_FORMULA)); _mask->get (FLD_FORMULA));
_browse->dir()->put(logicnum, _nordir, _sysdirop); _browse->dir()->put(logicnum, _nordir, _sysdirop);
_browse->rec()->zero(); _browse->rec()->zero();
_browse->rec()->put(logicnum); _browse->rec()->put(logicnum);
@ -99,8 +164,8 @@ void BA1100_application::insert_riga (long riga_sel, TToken_string& riga)
void BA1100_application::edit_riga (long riga_sel, TToken_string& riga) void BA1100_application::edit_riga (long riga_sel, TToken_string& riga)
{ {
KEY tasto; KEY tasto;
FileDes dep; FileDes dep;
TDir d; TDir d;
const int logicnum = int(riga_sel) + 1; const int logicnum = int(riga_sel) + 1;
@ -129,116 +194,119 @@ tasto = _mask->run();
switch (tasto) switch (tasto)
{ {
case K_F4: case K_F4:
{ {
const TFilename filename(_mask->get(FLD_NOME)); const TFilename filename(_mask->get(FLD_NOME));
if (logicnum > 1) if (logicnum > 1)
{ {
TEdit_file ef; TEdit_file ef;
ef.browse(logicnum, filename); ef.browse(logicnum, filename);
} }
} }
break; break;
case K_F5: case K_F5:
case K_F6: case K_F6:
case K_F7: case K_F7:
case K_F8: case K_F8:
case K_ENTER: case K_ENTER:
{ {
strcpy (dep.SysName,_mask->get (FLD_NOME)); strcpy (dep.SysName,_mask->get (FLD_NOME));
dep.EOD = atol(_mask->get (FLD_EOD)); dep.EOD = atol(_mask->get (FLD_EOD));
dep.Flags = atol(_mask->get (FLD_FLAG)); dep.Flags = atol(_mask->get (FLD_FLAG));
strcpy (dep.Des,_mask->get (FLD_DESC)); strcpy (dep.Des,_mask->get (FLD_DESC));
strcpy (dep.FCalc,_mask->get (FLD_FORMULA)); strcpy (dep.FCalc,_mask->get (FLD_FORMULA));
const TRecnotype eox = atol(_mask->get(FLD_EOX)); const TRecnotype eox = atol(_mask->get(FLD_EOX));
_browse->dir()->get(logicnum, _lock, _nordir, _sysdirop); _browse->dir()->get(logicnum, _lock, _nordir, _sysdirop);
_browse->dir()->set(dep.SysName, dep.EOD, dep.Flags, _browse->dir()->set(dep.SysName, dep.EOD, dep.Flags,
dep.Des, dep.FCalc); dep.Des, dep.FCalc);
_browse->dir()->put(logicnum, _nordir, _sysdirop); _browse->dir()->put(logicnum, _nordir, _sysdirop);
{ {
TSystemisamfile f(logicnum); TSystemisamfile f(logicnum);
if (eox != oldeox) if (eox != oldeox)
{ {
d.get(logicnum); d.get(logicnum);
if (!fexist(d.name())) f.build(eox); if (!fexist(d.name())) f.build(eox);
else f.extend(eox); else f.extend(eox);
_browse->dir()->get(logicnum, _nolock, _nordir, _sysdirop); _browse->dir()->get(logicnum, _nolock, _nordir, _sysdirop);
} }
if (tasto == K_F5) if (tasto == K_F5)
{ {
f.packfile(); f.packfile();
f.packindex(); f.packindex();
} }
else else
if (tasto == K_F6) if (tasto == K_F6)
{ {
TRec_sheet r(logicnum); enable_menu_item(M_FILE_PRINT);
_rec = new TRec_sheet(logicnum);
_rec->edit();
delete _rec;
_rec = NULL;
disable_menu_item(M_FILE_PRINT);
}
else
if (tasto == K_F7)
{
TMask m("ba1100b");
TFilename nout(dep.SysName);
r.edit(); nout.strip("$%");
} nout.ext("txt");
else m.set(FLD_OUTFILE, nout);
if (tasto == K_F7) if (m.run() == K_ENTER)
{ {
TMask m("ba1100b"); const char fs = *esc(m.get(FLD_FS));
TFilename nout(dep.SysName); const char fd = *esc(m.get(FLD_FD));
const char rs = *esc(m.get(FLD_RS));
const bool withdel = m.get(FLD_WITHDEL).not_empty();
nout.strip("$%"); f.dump(m.get(FLD_OUTFILE), atoi(m.get(FLD_KEYNO)), fs, fd, rs, withdel);
nout.ext("txt"); }
m.set(FLD_OUTFILE, nout); }
if (m.run() == K_ENTER) else
{ if (tasto == K_F8)
const char fs = *esc(m.get(FLD_FS)); {
const char fd = *esc(m.get(FLD_FD)); TMask m("ba1100c");
const char rs = *esc(m.get(FLD_RS)); TFilename ninp(dep.SysName);
const bool withdel = m.get(FLD_WITHDEL).not_empty();
f.dump(m.get(FLD_OUTFILE), atoi(m.get(FLD_KEYNO)), fs, fd, rs, withdel); ninp.strip("$%");
} ninp.ext("txt");
} m.set(FLD_INFILE, ninp);
else if (m.run() == K_ENTER)
if (tasto == K_F8) {
{ char fs = *esc(m.get(FLD_FS));
TMask m("ba1100c"); char fd = *esc(m.get(FLD_FD));
TFilename ninp(dep.SysName); char rs = *esc(m.get(FLD_RS));
ninp.strip("$%"); f.load(m.get(FLD_INFILE), fs, fd, rs);
ninp.ext("txt"); }
m.set(FLD_INFILE, ninp); }
if (m.run() == K_ENTER) }
{ }
char fs = *esc(m.get(FLD_FS)); break;
char fd = *esc(m.get(FLD_FD)); default:
char rs = *esc(m.get(FLD_RS)); break;
}
f.load(m.get(FLD_INFILE), fs, fd, rs);
}
}
}
}
break;
default:
break;
}
} }
void BA1100_application::delete_riga () void BA1100_application::delete_riga ()
{ {
_browse->dir()->get(LF_DIR); _browse->dir()->get(LF_DIR);
if (_browse->dir()->eod() == 0) return; if (_browse->dir()->eod() == 0) return;
int logicnum = (int)_browse->items(); int logicnum = (int)_browse->items();
_browse->dir()->get(logicnum); _browse->dir()->get(logicnum);
if (yesnocancel_box("Vuoi davvero eliminare l' archivio %s", _browse->dir()->name()) != K_YES) return; if (yesnocancel_box("Vuoi davvero eliminare l' archivio %s", _browse->dir()->name()) != K_YES) return;
_browse->dir()->get(LF_DIR); _browse->dir()->get(LF_DIR);
_browse->dir()->eod()--; _browse->dir()->eod()--;
_browse->set_items(_browse->dir()->eod()); _browse->set_items(_browse->dir()->eod());
_browse->dir()->put(LF_DIR); _browse->dir()->put(LF_DIR);
} }
@ -261,22 +329,22 @@ void BA1100_application::update_dir()
for (int i = 2; i <= items; i++) for (int i = 2; i <= items; i++)
{ {
prefhndl->set(""); prefhndl->set("");
d.get(i, _nolock, _nordir, _sysdirop); d.get(i, _nolock, _nordir, _sysdirop);
if (d.flags() == -1) if (d.flags() == -1)
{ {
TString s(d.name()); TString s(d.name());
word len = d.len(); word len = d.len();
prefhndl->set(pref); prefhndl->set(pref);
d.get(i, _nolock, _nordir, _sysdirop); d.get(i, _nolock, _nordir, _sysdirop);
if (len != d.len() && s != d.name()) if (len != d.len() && s != d.name())
{ {
d.set(s, d.eox(), 0L, d.des(), d.expr()); d.set(s, d.eox(), 0L, d.des(), d.expr());
d.put(i, _nordir, _sysdirop); d.put(i, _nordir, _sysdirop);
} }
} }
} }
prefhndl->set(pref); prefhndl->set(pref);
if (items >= orig_items) return; if (items >= orig_items) return;
@ -319,7 +387,7 @@ void BA1100_application::convert_dir()
void BA1100_application::update() void BA1100_application::update()
{ {
long firm = get_firm(); long firm = get_firm();
TString pref; TString pref;
if (firm == 0) pref = prefhndl->name(); if (firm == 0) pref = prefhndl->name();
@ -337,13 +405,13 @@ void BA1100_application::update()
for (ditte.first(); !ditte.eof(); ditte.next()) for (ditte.first(); !ditte.eof(); ditte.next())
{ {
set_firm(ditte.get_long("CODDITTA")); set_firm(ditte.get_long("CODDITTA"));
const TRecnotype rec = ditte.recno(); const TRecnotype rec = ditte.recno();
ditte.close(); ditte.close();
update_dir(); update_dir();
convert_dir(); convert_dir();
ditte.open(); ditte.open();
ditte.readat(rec); ditte.readat(rec);
} }
if (firm > 0) set_firm(firm); if (firm > 0) set_firm(firm);
else prefhndl->set(pref); else prefhndl->set(pref);
@ -352,57 +420,57 @@ void BA1100_application::update()
bool BA1100_application::menu(MENU_TAG m) bool BA1100_application::menu(MENU_TAG m)
{ {
TToken_string riga; TToken_string riga;
long riga_selezionata; long riga_selezionata;
bool done = FALSE; bool done = FALSE;
_browse->rebuild(); _browse->rebuild();
while (!done) while (!done)
{ {
disable_menu_item(M_FILE_NEW); disable_menu_item(M_FILE_NEW);
switch (_browse->run()) switch (_browse->run())
{ {
case K_INS: case K_INS:
riga_selezionata = _browse->selected(); riga_selezionata = _browse->selected();
riga = _browse->row(); riga = _browse->row();
insert_riga (riga_selezionata, riga); insert_riga (riga_selezionata, riga);
break; break;
case K_ENTER: case K_ENTER:
riga_selezionata = _browse->selected(); riga_selezionata = _browse->selected();
riga = _browse->row(); riga = _browse->row();
edit_riga (riga_selezionata, riga); edit_riga (riga_selezionata, riga);
break; break;
case K_DEL: delete_riga(); break; case K_DEL: delete_riga(); break;
case K_ESC: done = TRUE; break; case K_ESC: done = TRUE; break;
case K_F7: update(); break; case K_F7: update(); break;
case K_F8: case K_F8:
_browse->add(); _browse->add();
riga_selezionata = _browse->items() - 1; riga_selezionata = _browse->items() - 1;
riga = _browse->row(riga_selezionata); riga = _browse->row(riga_selezionata);
edit_riga (riga_selezionata, riga); edit_riga (riga_selezionata, riga);
break; break;
default: break; default: break;
} }
enable_menu_item(M_FILE_NEW); enable_menu_item(M_FILE_NEW);
} }
return TRUE; return TRUE;
} }
int ba1100(int argc, char* argv[], bool insmode) int ba1100(int argc, char* argv[], bool insmode)
{ {
BA1100_application a; BA1100_application a;
a.run(argc, argv, "Gestione files"); a.run(argc, argv, "Gestione files");
return 0; return 0;
} }

View File

@ -10,12 +10,12 @@
class TDir_sheet : public TSheet class TDir_sheet : public TSheet
{ {
TTrec *_rec; TTrec *_rec;
TDir *_dir; TDir *_dir;
FileDes _s_dir; FileDes _s_dir;
long _items; long _items;
protected: set_firm(); protected: set_firm();
void page_build(long first, byte rows); void page_build(long first, byte rows);
@ -33,29 +33,24 @@ public:
class TRec_sheet : public TObject class TRec_sheet : public TObject
{ {
TTrec *_rec; TTrec *_rec;
TTrec *_rec_old; TTrec *_rec_old;
TDir *_dir; TDir *_dir;
bool _comfile; bool _comfile;
static TMask *_mask; static TMask *_mask;
protected: protected:
void update_keys(int from, int shift); bool check_key_expr(int key, const char* key_expr);
const char* build_key_expr(int key); static bool fld_notify(int r, KEY k);
bool check_key_expr(int key, const char* key_expr); static bool key_notify(int r, KEY k);
void update_key_expr(int key, TToken_string& s); void save();
const char* build_field(int nfld); virtual long items() const { return _rec->fields(); }
void update_field(int nfld, TToken_string& s);
static bool fld_notify(int r, KEY k);
static bool key_notify(int r, KEY k);
void save();
virtual long items() const { return _rec->items(); }
TDir* dir() const { return _dir; }
TTrec* rec() const { return _rec; }
public: public:
TRec_sheet(int logicnum); TRec_sheet(int logicnum);
~TRec_sheet(); ~TRec_sheet();
TDir* dir() const { return _dir; }
TTrec* rec() const { return _rec; }
void edit(); void edit();
}; };

View File

@ -1,179 +1,179 @@
#include <defmask.h> #include <defmask.h>
#include "ba1100a.h" #include "ba1100a.h"
TOOLBAR "" 0 20 0 2 TOOLBAR "" 0 20 0 2
BUTTON DLG_SAVEREC 8 2 BUTTON DLG_SAVEREC 8 2
BEGIN BEGIN
PROMPT -16 -1 "" PROMPT -16 -1 ""
END END
BUTTON DLG_PRINT 8 2 BUTTON DLG_PRINT 8 2
BEGIN BEGIN
PROMPT -26 -1 "Stampa" PROMPT -26 -1 "Stampa"
MESSAGE K_F5 MESSAGE EXIT,K_F5
END END
BUTTON DLG_EXPORT 8 2 BUTTON DLG_EXPORT 8 2
BEGIN BEGIN
PROMPT -36 -1 "Esporta" PROMPT -36 -1 "Esporta"
MESSAGE K_F6 MESSAGE EXIT,K_F6
END END
BUTTON DLG_IMPORT 8 2 BUTTON DLG_IMPORT 8 2
BEGIN BEGIN
PROMPT -46 -1 "Importa" PROMPT -46 -1 "Importa"
MESSAGE K_F7 MESSAGE EXIT,K_F7
END END
BUTTON DLG_CANCEL 8 2 BUTTON DLG_CANCEL 8 2
BEGIN BEGIN
PROMPT -56 -1 "" PROMPT -56 -1 ""
END END
ENDPAGE ENDPAGE
PAGE "Modifica Tracciato Record - Campi" -1 -1 77 20 PAGE "Modifica Tracciato Record - Campi" -1 -1 77 20
NUMBER F_NUM 4 NUMBER F_NUM 4
BEGIN BEGIN
PROMPT 1 1 "Archivio n. " PROMPT 1 1 "Archivio n. "
FLAGS "D" FLAGS "D"
END END
STRING F_DES 50 STRING F_DES 50
BEGIN BEGIN
PROMPT 20 1 "" PROMPT 20 1 ""
FLAGS "D" FLAGS "D"
END END
SPREADSHEET F_FIELDS 0 7 SPREADSHEET F_FIELDS 34 7
BEGIN BEGIN
PROMPT 16 4 "" PROMPT 15 4 ""
ITEM "Nome@10" ITEM "Nome@10"
ITEM "Tipo" ITEM "Tipo"
ITEM "Lunghezza" ITEM "Lunghezza"
ITEM "Decimali" ITEM "Decimali"
END END
SPREADSHEET F_KEYS SPREADSHEET F_KEYS
BEGIN BEGIN
PROMPT 1 13 "" PROMPT 1 13 ""
ITEM "Espressione@60" ITEM "Espressione@60"
ITEM "Chiavi duplicate" ITEM "Chiavi duplicate"
END END
ENDPAGE ENDPAGE
ENDMASK ENDMASK
PAGE "Campo" -1 -1 60 9 PAGE "Campo" -1 -1 60 9
STRING F_NUMF 3 3 STRING F_NUMF 3 3
BEGIN BEGIN
PROMPT 2 1 "Numero " PROMPT 2 1 "Numero "
FLAGS "DR" FLAGS "DR"
END END
STRING F_NOMEF 10 STRING F_NOMEF 10
BEGIN BEGIN
PROMPT 2 2 "Nome " PROMPT 2 2 "Nome "
FLAGS "U" FLAGS "U"
HELP "Inserire il nome" HELP "Inserire il nome"
END END
LIST FLD_TIPO 20 LIST FLD_TIPO 20
BEGIN BEGIN
PROMPT 2 3 "Tipo " PROMPT 2 3 "Tipo "
HELP "Inserire il tipo" HELP "Inserire il tipo"
ITEM "1|Alfanumerico" ITEM "1|Alfanumerico"
MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC
ITEM "2|Intero" ITEM "2|Intero"
MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC
ITEM "3|Intero Lungo" ITEM "3|Intero Lungo"
MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC
ITEM "4|Reale" ITEM "4|Reale"
MESSAGE ENABLE,FLD_LEN|ENABLE,FLD_DEC MESSAGE ENABLE,FLD_LEN|ENABLE,FLD_DEC
ITEM "5|Data" ITEM "5|Data"
MESSAGE DISABLE,FLD_LEN|"6",FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC MESSAGE DISABLE,FLD_LEN|"6",FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC
ITEM "6|Intero" ITEM "6|Intero"
MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC
ITEM "7|Carattere" ITEM "7|Carattere"
MESSAGE DISABLE,FLD_LEN|"1",FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC MESSAGE DISABLE,FLD_LEN|"1",FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC
ITEM "8|Booleano" ITEM "8|Booleano"
MESSAGE DISABLE,FLD_LEN|"1",FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC MESSAGE DISABLE,FLD_LEN|"1",FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC
ITEM "9|Intero Zerofilled" ITEM "9|Intero Zerofilled"
MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC
ITEM "10|Intero Lungo Zerofilled" ITEM "10|Intero Lungo Zerofilled"
MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC
END END
NUMBER FLD_LEN 3 NUMBER FLD_LEN 3
BEGIN BEGIN
PROMPT 2 4 "Lunghezza " PROMPT 2 4 "Lunghezza "
FLAGS "R" FLAGS "R"
HELP "Inserire la lunghezza" HELP "Inserire la lunghezza"
WARNING "Numero lunghezza campo errata" WARNING "Numero lunghezza campo errata"
END END
NUMBER FLD_DEC 2 NUMBER FLD_DEC 2
BEGIN BEGIN
PROMPT 2 5 "Decimali " PROMPT 2 5 "Decimali "
FLAGS "R" FLAGS "R"
HELP "Inserire i decimali" HELP "Inserire i decimali"
NUM_EXPR {(#THIS_FIELD>=0) && (#THIS_FIELD+2<=#FLD_LEN)} NUM_EXPR {(#THIS_FIELD>=0) && (#THIS_FIELD+2<=#FLD_LEN)}
WARNING "Numero di decimali errato" WARNING "Numero di decimali errato"
END END
BUTTON DLG_OK 8 2 BUTTON DLG_OK 8 2
BEGIN BEGIN
PROMPT -13 -1 "" PROMPT -13 -1 ""
END END
BUTTON DLG_CANCEL 8 2 BUTTON DLG_CANCEL 8 2
BEGIN BEGIN
PROMPT -23 -1 "" PROMPT -23 -1 ""
END END
BUTTON DLG_DELREC 8 2 BUTTON DLG_DELREC 8 2
BEGIN BEGIN
PROMPT -33 -1 "Elimina" PROMPT -33 -1 "Elimina"
END END
ENDPAGE ENDPAGE
ENDMASK ENDMASK
PAGE "Chiave" -1 -1 77 9 PAGE "Chiave" -1 -1 77 9
STRING F_KEXPR 60 STRING F_KEXPR 60
BEGIN BEGIN
PROMPT 1 2 "Espressione " PROMPT 1 2 "Espressione "
FLAGS "U" FLAGS "U"
END END
BOOLEAN F_KDUP BOOLEAN F_KDUP
BEGIN BEGIN
PROMPT 1 4 "Chiavi duplicate" PROMPT 1 4 "Chiavi duplicate"
FLAGS "D" FLAGS "D"
END END
BUTTON DLG_OK 8 2 BUTTON DLG_OK 8 2
BEGIN BEGIN
PROMPT -13 -1 "" PROMPT -13 -1 ""
END END
BUTTON DLG_CANCEL 8 2 BUTTON DLG_CANCEL 8 2
BEGIN BEGIN
PROMPT -23 -1 "" PROMPT -23 -1 ""
END END
BUTTON DLG_DELREC 8 2 BUTTON DLG_DELREC 8 2
BEGIN BEGIN
PROMPT -33 -1 "Elimina" PROMPT -33 -1 "Elimina"
END END
ENDPAGE ENDPAGE
ENDMASK ENDMASK

25
ba/ba1100f.uml Executable file
View File

@ -0,0 +1,25 @@
#include <defmask.h>
#include "ba1100a.h"
PAGE "Esportazione/Importazione tracciati" -1 -1 75 5
STRING F_NOMEF 50
BEGIN
PROMPT 2 1 "File "
FLAGS ""
HELP "Inserire il nome del file di esportazione/importazione"
CHECKTYPE REQUIRED
END
BUTTON DLG_OK 9 2
BEGIN
PROMPT -12 -1 ""
END
BUTTON DLG_CANCEL 9 2
BEGIN
PROMPT -22 -1 ""
END
ENDPAGE
ENDMASK

View File

@ -1,7 +1,9 @@
// Includo stdio senno' dice che ridefinisco FILE // Includo stdio senno' dice che ridefinisco FILE
#include <stdio.h> #include <stdio.h>
#include <fstream.h>
#include <applicat.h>
#include <files.h> #include <files.h>
#include <utility.h> #include <utility.h>
#include <expr.h> #include <expr.h>
@ -13,10 +15,9 @@
#include <validate.h> #include <validate.h>
#include "ba1100.h" #include "ba1100.h"
#define INVFLD 255
TMask* TRec_sheet::_mask = NULL; TMask* TRec_sheet::_mask = NULL;
HIDDEN TToken_string s(256); HIDDEN TToken_string s(256);
void TDir_sheet::add () void TDir_sheet::add ()
@ -35,7 +36,7 @@ void TDir_sheet::add ()
} }
TDir_sheet::TDir_sheet(const char* title) TDir_sheet::TDir_sheet(const char* title)
: TSheet(-1,-1, 0, 0, title,"N.@5|Nome@20|EOD@7|EOX@7|Lung. |Descrizione@43|Formula@33|Flags@7", 0xC) : TSheet(-1,-1, 0, 0, title,"N.@5|Nome@20|EOD@7|EOX@7|Lung. |Descrizione@43|Formula@33|Flags@7", 0xC)
{ {
_dir = new TDir; _dir = new TDir;
_rec = new TTrec; _rec = new TTrec;
@ -51,279 +52,217 @@ TDir_sheet::~TDir_sheet()
void TDir_sheet::page_build(long first, byte rows) void TDir_sheet::page_build(long first, byte rows)
{ {
TToken_string l(128); TToken_string l(128);
for (byte i = 0; i < rows; i++) for (byte i = 0; i < rows; i++)
{ {
const int n = int(i+first+1); const int n = int(i+first+1);
_dir->get (n,_nolock,_nordir,_sysdirop); _dir->get (n,_nolock,_nordir,_sysdirop);
l = format("%3d", n); // Numero progressivo del file l = format("%3d", n); // Numero progressivo del file
l.add(_dir->name()); l.add(_dir->name());
const TRecnotype eod = _dir->eod(); const TRecnotype eod = _dir->eod();
l.add(format("%ld", eod)); l.add(format("%ld", eod));
const TRecnotype eox = _dir->eox(); const TRecnotype eox = _dir->eox();
l.add(format("%ld", eox)); l.add(format("%ld", eox));
const word len = _dir->len(); const word len = _dir->len();
l.add(format("%u", len)); l.add(format("%u", len));
l.add(_dir->des()); l.add(_dir->des());
l.add(_dir->expr()); l.add(_dir->expr());
l.add(format("%ld", _dir->flags())); l.add(format("%ld", _dir->flags()));
set_row(l, i); set_row(l, i);
} }
} }
TRec_sheet::TRec_sheet(int logicnum) TRec_sheet::TRec_sheet(int logicnum)
{ {
_dir = new TDir; _dir = new TDir;
_rec = new TTrec; _rec = new TTrec;
_rec_old = new TTrec; _rec_old = new TTrec;
_mask = new TMask("ba1100d"); _mask = new TMask("ba1100d");
_dir->get(logicnum, _lock, _nordir, _sysdirop); _dir->get(logicnum, _lock, _nordir, _sysdirop);
_rec->get(logicnum); _rec->get(logicnum);
*_rec_old = *_rec; *_rec_old = *_rec;
} }
TRec_sheet::~TRec_sheet() TRec_sheet::~TRec_sheet()
{ {
delete _dir; delete _dir;
delete _rec; delete _rec;
delete _rec_old; delete _rec_old;
delete _mask; delete _mask;
_mask = NULL; _mask = NULL;
}
void TRec_sheet::update_keys(int from, int shift)
{
RecDes *rdes = _rec->rec();
for (int i = 0 ; i < rdes->NKeys; i++)
for (int j = 0 ; j < rdes->Ky[i].NkFields; j++)
{
const int nfld = rdes->Ky[i].FieldSeq[j] - (rdes->Ky[i].FieldSeq[j] > MaxFields ? MaxFields : 0);
if (nfld > from) rdes->Ky[i].FieldSeq[j] += shift;
else
if (nfld == from)
{
if (shift < 0)
{
rdes->Ky[i].NkFields--;
for (int k = rdes->Ky[i].NkFields; k > j; k--)
rdes->Ky[i].FieldSeq[j] = rdes->Ky[i].FieldSeq[j + 1];
}
else
if (nfld >= from) rdes->Ky[i].FieldSeq[j] += shift;
}
}
}
const char* TRec_sheet::build_key_expr(int key)
{
RecDes *rdes = _rec->rec();
s = "";
for (int j = 0 ; j < rdes->Ky[key].NkFields; j++)
{
const bool upper = rdes->Ky[key].FieldSeq[j] > MaxFields;
const int nfld = rdes->Ky[key].FieldSeq[j] - (upper ? MaxFields : 0);
if (j) s << "+";
if (upper) s << "UPPER(";
s << rdes->Fd[nfld].Name;
if (rdes->Ky[key].FromCh[j] < INVFLD)
s << format("[%d,%d]", rdes->Ky[key].FromCh[j] + 1,
rdes->Ky[key].ToCh[j] + 1);
else
if (upper) s << ")";
}
s.add(rdes->Ky[key].DupKeys ? "X" : " ");
return (const char*) s;
} }
bool TRec_sheet::check_key_expr(int key, const char * key_expr) bool TRec_sheet::check_key_expr(int key, const char * key_expr)
{ {
TExpression expr("", _strexpr); TExpression expr("", _strexpr);
return expr.set(key_expr, _strexpr); return expr.set(key_expr, _strexpr);
}
void TRec_sheet::update_key_expr(int key, TToken_string& s)
{
RecDes *rdes = _rec->rec();
TExpression expr("", _strexpr);
TString ke(s.get());
if (expr.set((const char*) ke, _strexpr))
{
rdes->Ky[key].DupKeys = (*s.get() != ' ');
TCodearray& c = expr.code();
c.begin();
int n = 0;
while (!c.end())
{
TCode& inst = c.step();
TCodesym sym = inst.getsym();
if (sym == _variable)
{
const char* s = inst.string();
for (int i = 0; i <rdes->NFields; i++)
if (strcmp(rdes->Fd[i].Name, s) == 0) break;
rdes->Ky[key].FieldSeq[n] = i;
rdes->Ky[key].FromCh[n] = INVFLD;
rdes->Ky[key].FromCh[n] = INVFLD;
inst = c.step();
sym = inst.getsym();
if (sym == _upper)
rdes->Ky[key].FieldSeq[n] += MaxFields;
else
if (sym == _number)
{
rdes->Ky[key].FromCh[n] = inst.number().integer() - 1;
inst = c.step();
rdes->Ky[key].ToCh[n] = inst.number().integer() - 1;
inst = c.step();
}
else c.backtrace();
n++;
}
}
rdes->Ky[key].NkFields = n;
}
}
const char* TRec_sheet::build_field(int nfld)
{
RecDes *rdes = _rec->rec();
// s.format("%d", nfld+1);
s = "";
s.add((const char*)rdes->Fd[nfld].Name);
s.add(format("%d", rdes->Fd[nfld].TypeF));
s.add(format("%d", rdes->Fd[nfld].Len));
s.add(format("%d", rdes->Fd[nfld].Dec));
return (const char*) s;
}
void TRec_sheet::update_field(int nfld, TToken_string& s)
{
RecDes *rdes = _rec->rec();
// s.get();
strcpy(rdes->Fd[nfld].Name, s.get());
rdes->Fd[nfld].TypeF = atoi(s.get());
rdes->Fd[nfld].Len = atoi(s.get());
rdes->Fd[nfld].Dec = atoi(s.get());
} }
HIDDEN bool len_handler(TMask_field& f, KEY key) HIDDEN bool len_handler(TMask_field& f, KEY key)
{ {
const int len = atoi(f.get()); const int len = atoi(f.get());
if (len < 0) return FALSE; if (len < 0) return FALSE;
const int typef = atoi(f.mask().get(FLD_TIPO)); const int typef = atoi(f.mask().get(FLD_TIPO));
switch (typef) switch (typef)
{ {
case _alfafld: return len <= INVFLD; case _alfafld: return len <= 254;
case _intfld: return len <= 5; case _intfld: return len <= 5;
case _longfld: return len <= 10; case _longfld: return len <= 10;
case _realfld: return len <= 18; case _realfld: return len <= 18;
case _wordfld: return len <= 5; case _wordfld: return len <= 5;
case _intzerofld: return len <= 5; case _intzerofld: return len <= 5;
case _longzerofld: return len <= 10; case _longzerofld: return len <= 10;
default: return TRUE; default: return TRUE;
} }
return TRUE; return TRUE;
} }
bool TRec_sheet::fld_notify(int r, KEY k) bool TRec_sheet::fld_notify(int r, KEY k)
{ {
const TSheet_field& f = (const TSheet_field&) _mask->field(F_FIELDS); const TSheet_field& f = (const TSheet_field&) _mask->field(F_FIELDS);
if (k == K_SPACE) if (k == K_SPACE)
{ {
TMask& m = f.sheet_mask(); TMask& m = f.sheet_mask();
m.set(F_NUMF, r + 1); m.set(F_NUMF, r + 1);
} }
return TRUE; return TRUE;
} }
bool TRec_sheet::key_notify(int r, KEY k) bool TRec_sheet::key_notify(int r, KEY k)
{ {
const TSheet_field& f = (const TSheet_field&) _mask->field(F_KEYS); const TSheet_field& f = (const TSheet_field&) _mask->field(F_KEYS);
if (k == K_SPACE) if (k == K_SPACE)
{ {
TMask& m = f.sheet_mask(); TMask& m = f.sheet_mask();
m.enable(F_KDUP, r > 0); m.enable(F_KDUP, r > 0);
if (r == 0) m.reset(F_KDUP); if (r == 0) m.reset(F_KDUP);
} }
else else
if (k == K_INS && f.items() >= 8) return FALSE; if (k == K_INS && f.items() >= 8) return FALSE;
return TRUE; return TRUE;
} }
void TRec_sheet::save() void TRec_sheet::save()
{ {
if (*_rec == *_rec_old || if (*_rec == *_rec_old ||
!yesnocancel_box("Devo salvare le modifiche")) return; !yesnocancel_box("Devo salvare le modifiche")) return;
TSystemisamfile f(_rec->num()); TSystemisamfile f(_rec->num());
f.update(*_rec); f.update(*_rec);
*_rec_old = *_rec; *_rec_old = *_rec;
} }
void TRec_sheet::edit() void TRec_sheet::edit()
{ {
TSheet_field& f1 = (TSheet_field&) _mask->field(F_FIELDS); TSheet_field& f1 = (TSheet_field&) _mask->field(F_FIELDS);
TSheet_field& f2 = (TSheet_field&) _mask->field(F_KEYS); TSheet_field& f2 = (TSheet_field&) _mask->field(F_KEYS);
RecDes *rdes = _rec->rec();
_mask->set (F_NUM, _dir->num());
_mask->set (F_DES, _dir->des());
f1.set_notify(fld_notify);
f1.sheet_mask().field(FLD_LEN).set_handler(len_handler);
int nfields = _rec->fields();
for (int i = 0; i < nfields; i++) f1.row(i) = _rec->fielddef(i);
f2.set_notify(key_notify);
int nkeys = _rec->keys();
for (i = 0; i < nkeys; i++) f2.row(i) = _rec->keydef(i);
while (TRUE)
{
switch (_mask->run())
{
case K_SAVE:
{
nfields = f1.items();
_rec->set_fields(nfields);
for (i = 0; i < nfields; i++)
{
TToken_string& s = f1.row(i);
_rec->update_fielddef(i, s);
}
_rec->rehash();
nkeys = f2.items();
_rec->set_keys(nkeys);
for (i = 0; i < nkeys; i++)
{
TToken_string& s = f2.row(i);
_rec->update_keydef(i, s);
}
save();
}
case K_ESC:
return;
case K_F5:
MainApp()->dispatch_e_menu(M_FILE_PRINT);
break;
case K_F6:
{
TMask m("ba1100f");
TFilename nout(_dir->name());
_mask->set (F_NUM, _dir->num()); nout.strip("$%");
_mask->set (F_DES, _dir->des()); nout.ext("trr");
f1.set_notify(fld_notify); m.set(F_NOMEF, nout);
f1.sheet_mask().field(FLD_LEN).set_handler(len_handler); if (m.run() == K_ENTER)
for (int i = 0; i < rdes->NFields; i++) f1.row(i) = build_field(i); {
f2.set_notify(key_notify); TString80 nf(m.get(F_NOMEF));
for (i = 0; i < rdes->NKeys; i++) f2.row(i) = build_key_expr(i);
if (_mask->run() == K_SAVE) if (nf.not_empty())
{ {
rdes->NFields = f1.items(); ofstream out((const char*) nf);
for (i = 0; i < rdes->NFields; i++)
{ out << *_rec;
TToken_string& s = f1.row(i); }
update_field(i, s); }
} }
_rec->rehash(); break;
rdes->NKeys = f2.items(); case K_F7:
for (i = 0; i < rdes->NKeys; i++) {
{ TMask m("ba1100f");
TToken_string& s = f2.row(i); TFilename nout(_dir->name());
update_key_expr(i, s);
} nout.strip("$%");
save(); nout.ext("trr");
} m.set(F_NOMEF, nout);
if (m.run() == K_ENTER)
{
TString80 nf(m.get(F_NOMEF));
if (nf.not_empty())
{
ifstream in((const char*) nf);
in >> *_rec;
nfields = _rec->fields();
f1.reset();
for (i = 0; i < nfields; i++) f1.row(i) = _rec->fielddef(i);
nkeys = _rec->keys();
f2.reset();
for (i = 0; i < nkeys; i++) f2.row(i) = _rec->keydef(i);
}
}
}
break;
default: break;
}
}
} }

View File

@ -1,72 +1,200 @@
// Includo stdio senno' dice che ridefinisco FILE #include <relation.h>
#include <stdio.h> #include <mask.h>
#include <sheet.h>
#ifndef __FILES_H #include <progind.h>
#include <files.h> #include <defmask.h>
#endif
#include "ba1100.h"
#ifndef __MASK_H
#include <mask.h>
#endif
bool TEdit_file::browse(int logicnum, const char* name)
#ifndef __SHEET_H {
#include <sheet.h> TRelation relation(logicnum);
#endif TCursor cursor(&relation);
TRectype& curr = cursor.curr();
#ifndef __URLDEFID_H TRectype svrec(cursor.curr());
#include <urldefid.h>
#endif TToken_string head(256);
TToken_string trac(256);
#ifndef __VALIDAT_H
#include <validate.h> const char* n;
#endif trac.add("");
head.add("@1");
#ifndef __BA1201_H
#include "ba1201.h" for(int i = 0; (n = curr.fieldname(i)) != NULL; i++)
#endif {
trac.add(n);
head.add(n);
TRec_sheet::TRec_sheet(int logicnum)
: TSheet(-1,-1, 0, 0, "","N.|Nome|Lung.|Dec.|Offset", 0x6) int len = curr.length(n);
{ if (curr.type(n) == _datefld) len = 10;
_dir = new TDir; if (len > strlen(n)) head << '@' << len;
_rec = new TTrec; }
_dir->get(logicnum, _nordir, _lock, _nordir); KEY ch;
_rec->get(logicnum, _comfile ? _condir : _nordir); TCursor_sheet sheet(&cursor, trac, name, head, 6);
TRec_sheet::~TRec_sheet() while ((ch = sheet.run()) != K_ESC)
{ {
delete _dir; if (ch == K_DEL && sheet.one_checked())
delete _rec; {
} TProgind* pind = NULL;
cursor.freeze(TRUE);
bool go = FALSE;
void TRec_sheet::page_build(long first, byte rows) bool first = FALSE;
{ int j;
TToken_string l; for (j = 0, cursor = 0; j < sheet.items(); ++cursor, j++)
TString dep(256); {
RecDes *rdes; if (sheet.checked(j))
{
_rec->get(1, _nordir); if (!go && !first)
go = yesno_box("Confermi la cancellazione dei %d "
"record indicati?", sheet.checked());
for (byte i = 0; i < rows; i++) first = TRUE;
{
dep << (int)i+1+first; // Numero progressivo del file if (!pind)
l = dep.right_just(3); {
dep = ""; pind = new TProgind(sheet.checked(),"Attendere...",
rdes = _rec->rec(); TRUE, TRUE, 32);
l.add((const char*)rdes->Fd[i].Name); pind->addstatus(1);
l.add((const char*)rdes->Fd[i].TypeF); }
dep << rdes->Fd[i].Name; else
l.add ( (const char*) dep); {
dep = ""; if (pind->iscancelled()) break;
dep << rdes->Fd[i].Dec; pind->addstatus(1);
l.add( (const char*) dep); }
set_row(l, i); if (go) cursor.file()->remove();
} sheet.uncheck(j);
} }
}
if (pind) delete pind;
cursor.freeze(FALSE);
if (first) {sheet.select(1); continue;}
}
if (ch == K_ENTER || ch == K_DEL)
cursor = sheet.selected();
switch(ch)
{
case K_ENTER: // edit fields
svrec = curr;
if (edit_record(curr, FALSE) == K_ENTER)
{
TString s(svrec.key(1));
if (s != curr.key(1))
{
cursor.file()->write();
if (cursor.file()->good())
{
curr = svrec;
cursor.file()->remove();
}
}
else
cursor.file()->rewrite();
}
break;
case K_DEL: // delete record
if (yesno_box("Confermare la cancellazione del record"))
cursor.file()->remove();
break;
case K_INS: // insert new record
curr.zero();
if (edit_record(curr,FALSE) == K_ENTER)
cursor.file()->write();
break;
}
sheet.force_update();
}
return K_ESC;
}
KEY TEdit_file::edit_record(TRectype& rec, bool readonly)
{
for(int recs = 0; rec.fieldname(recs) != NULL; recs++);
int rows = recs > 15 ? 20 : recs+4;
int pages = recs/15 + (recs % 15 ? 1 : 0);
TMask m("Modifica record", pages, 78, rows);
int curpage = 0, currow = 1, nid = 100;
const char* cp;
for(int i = 0; (cp = rec.fieldname(i)) != NULL; i++)
{
// add fields ONE by ONE
TString s(cp); s.left_just(16);
int len = rec.length(cp);
switch (rec.type(cp))
{
case _alfafld:
m.add_string(nid++,curpage, s, 3, currow, len, "",
len > 50 ? 50 : len);
break;
case _intfld:
case _longfld:
case _wordfld:
case _realfld:
m.add_number(nid++, curpage, s, 3, currow, len, "",
rec.ndec(cp));
break;
case _datefld:
m.add_date(nid++, curpage, s, 3, currow);
break;
case _charfld:
case _boolfld:
m.add_string(nid++,curpage, s, 3, currow, 1);
break;
case _intzerofld:
case _longzerofld:
m.add_number(nid++, curpage, s, 3, currow, len, "Z",
rec.ndec(cp));
break;
default:
break;
}
m.field(nid-1).set(rec.get(cp));
if (((i+1) % 15) == 0 || i == recs-1)
{
m.add_button(DLG_OK, curpage, "", -14, -1, 9, 3);
m.add_button(DLG_CANCEL, curpage, "", -24, -1, 9, 3);
if (curpage > 0)
m.add_button(DLG_PGUP, curpage, "", -34, -1, 9, 3);
if (pages > 1 && curpage < pages-1)
m.add_button(DLG_PGDN, curpage, "", -44, -1, 9, 3);
curpage++; currow = 1;
}
else currow++;
}
if (readonly)
{
const int max = m.fields();
for (int i = 0; i < max; i++)
{
TMask_field& f = m.fld(i);
if (f.class_id() != CLASS_BUTTON_FIELD)
f.disable();
}
}
const KEY k = m.run();
if (k == K_ENTER && !readonly)
{
nid = 100;
for(i = 0; (cp = rec.fieldname(i)) != NULL; i++)
rec.put(cp, m.get(nid++));
}
return k;
}

View File

@ -1,319 +1,474 @@
#include <stdio.h> #include <stdio.h>
#include <memory.h> #include <memory.h>
#include <string.h> #include <string.h>
#include <strings.h>
#include <files.h>
#ifndef __EXTCDECL_H #include <files.h>
#include <extcdecl.h> #include <expr.h>
#endif #ifndef __EXTCDECL_H
#include <extcdecl.h>
#endif
#define BLOCKLEN 512 #include <utility.h>
TFile::TFile(int lenrec, int base)
#define BLOCKLEN 512
{ #define INVFLD 255
_file = new SecDef;
if (_file == NULL) fatal_box("Can't allocate record file "); HIDDEN char _files_tmp_string[128];
_file->IOR = NOERR;
_len = lenrec; TFile::TFile(int lenrec, int base)
_base = base;
_file->LockMode = _manulock; {
_file->lpos = -1; _file = new SecDef;
_file->name[0] = '\0'; if (_file == NULL) fatal_box("Can't allocate record file ");
} _file->IOR = NOERR;
_len = lenrec;
_base = base;
TFile::~TFile() _file->LockMode = _manulock;
_file->lpos = -1;
{ _file->name[0] = '\0';
delete _file; }
}
TFile::~TFile()
void TFile::open(const char* name, TFilelock lockmode)
{
{ delete _file;
COpen(_file, (char*) name, _len, _base, lockmode); }
}
void TFile::open(const char* name, TFilelock lockmode)
bool TFile::verify(const char* name)
{
{ COpen(_file, (char*) name, _len, _base, lockmode);
CVerify(_file, (char*) name); }
return _file->IOR == NOERR;
}
bool TFile::verify(const char* name)
void TFile::create(const char* name, TRecnotype nrecord) {
CVerify(_file, (char*) name);
{ return _file->IOR == NOERR;
CCreate(_file, (char*) name, _len, _base, (nrecord * _len) /BLOCKLEN + 1); }
}
void TFile::create(const char* name, TRecnotype nrecord)
void TFile::chsize(const char* name, TRecnotype nrecord)
{
{ CCreate(_file, (char*) name, _len, _base, (nrecord * _len) /BLOCKLEN + 1);
CChsize(_file, (char*) name, _len, _base, (nrecord * _len) /BLOCKLEN + 1); }
}
void TFile::chsize(const char* name, TRecnotype nrecord)
void TFile::close()
{
{ CChsize(_file, (char*) name, _len, _base, (nrecord * _len) /BLOCKLEN + 1);
CClose(_file); }
}
void TFile::close()
void TFile::unlink(const char* name)
{
{ CClose(_file);
CDelete(_file, (char*) name); }
}
void TFile::unlink(const char* name)
void TFile::read(char* record, TRecnotype recnum, TReclock lock)
{
{ CDelete(_file, (char*) name);
_file->LenRec = _len; }
_file->BaseFil = _base;
CRead(_file, record, recnum, lock);
} void TFile::read(char* record, TRecnotype recnum, TReclock lock)
{
void TFile::write(char* record, TRecnotype recnum, TReclock lock) _file->LenRec = _len;
_file->BaseFil = _base;
{ CRead(_file, record, recnum, lock);
_file->LenRec = _len; }
_file->BaseFil = _base;
CWrite(_file, record, recnum, lock);
} void TFile::write(char* record, TRecnotype recnum, TReclock lock)
{
int TFile::status() const _file->LenRec = _len;
_file->BaseFil = _base;
{ CWrite(_file, record, recnum, lock);
return _file->IOR; }
}
int TFile::status() const
TDir::TDir()
{
{ return _file->IOR;
_dir = new FileDes; }
if (_dir == NULL)
fatal_box("Can't allocate dir");
zero(); TDir::TDir()
_num = - 1;
} {
_dir = new FileDes;
if (_dir == NULL)
TDir::~TDir() fatal_box("Can't allocate dir");
zero();
{ _num = - 1;
delete _dir; }
}
TDir::~TDir()
const char* TDir::name() const
{
{ delete _dir;
return _dir->SysName; }
}
const char* TDir::name() const
const char* TDir::des() const
{
{ return _dir->SysName;
return _dir->Des; }
}
const char* TDir::des() const
const char* TDir::expr() const
{
{ return _dir->Des;
return _dir->FCalc; }
}
const char* TDir::expr() const
TRecnotype& TDir::eod() const
{
{ return _dir->FCalc;
return _dir->EOD; }
}
TRecnotype& TDir::eod() const
TRecnotype& TDir::eox() const
{
{ return _dir->EOD;
return _dir->EOX; }
}
TRecnotype& TDir::eox() const
TRecnotype& TDir::flags() const
{
{ return _dir->EOX;
return _dir->Flags; }
}
TRecnotype& TDir::flags() const
word& TDir::len()
{
{ return _dir->Flags;
return (word&) _dir->LenR; }
}
word& TDir::len()
int TDir::status(TDirtype dirop) const
{
{ return (word&) _dir->LenR;
return fdir[dirop].IOR; }
}
int TDir::status(TDirtype dirop) const
void TDir::set_len(const UINT16 len)
{ {
_dir->LenR = len; return fdir[dirop].IOR;
} }
void TDir::set_eox(const RecNoType eox)
{ void TDir::set_len(const UINT16 len)
_dir->EOX = eox; {
} _dir->LenR = len;
}
void TDir::set(const char * name, const RecNoType eod, const RecNoType flag, const char * des, const char * calc)
{ void TDir::set_eox(const RecNoType eox)
strncpy (_dir->SysName, name, sizeof(_dir->SysName)); {
_dir->EOD = eod; _dir->EOX = eox;
_dir->Flags = flag; }
strncpy (_dir->Des, des, sizeof(_dir->Des));
strncpy (_dir->FCalc, calc, sizeof(_dir->FCalc)); void TDir::set(const char * name, const RecNoType eod, const RecNoType flag, const char * des, const char * calc)
} {
strncpy (_dir->SysName, name, sizeof(_dir->SysName));
void TDir::get(int nfile, TReclock lock, TDirtype dirtype, TDirop op) _dir->EOD = eod;
_dir->Flags = flag;
{ strncpy (_dir->Des, des, sizeof(_dir->Des));
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR); strncpy (_dir->FCalc, calc, sizeof(_dir->FCalc));
}
if (op == _nordirop)
COpenFile(nfile, _dir, int(lock), _whichdir); void TDir::get(int nfile, TReclock lock, TDirtype dirtype, TDirop op)
else
CGetFile(nfile, _dir, int(lock), _whichdir); {
_num = nfile; int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
}
if (op == _nordirop)
COpenFile(nfile, _dir, int(lock), _whichdir);
void TDir::put(int nfile, TDirtype dirtype, TDirop op) else
CGetFile(nfile, _dir, int(lock), _whichdir);
{ _num = nfile;
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR); }
if (nfile <= 0)
fatal_box("Bad file number %d", nfile); void TDir::put(int nfile, TDirtype dirtype, TDirop op)
if (op == _nordirop)
CCloseFile(nfile, _dir, _whichdir); {
else int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
CPutFile(nfile, _dir, _whichdir);
} if (nfile <= 0)
fatal_box("Bad file number %d", nfile);
if (op == _nordirop)
void TDir::zero() CCloseFile(nfile, _dir, _whichdir);
else
{ CPutFile(nfile, _dir, _whichdir);
zerofdes(_dir); }
}
void TDir::zero()
int TDir::items(TDirtype dirtype) const
{
{ zerofdes(_dir);
FileDes f; }
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
CGetFile(1, &f, _nolock, _whichdir); int TDir::items(TDirtype dirtype) const
return (int)f.EOD;
} {
FileDes f;
TTrec::TTrec() int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
{ CGetFile(1, &f, _nolock, _whichdir);
_rec = new RecDes; return (int)f.EOD;
if (_rec == NULL) }
fatal_box("Can't allocate record description");
zero(); TTrec::TTrec()
_num = - 1;
} {
_rec = new RecDes;
if (_rec == NULL)
TTrec::~TTrec() fatal_box("Can't allocate record description");
zero();
{ _num = - 1;
delete _rec; }
}
TTrec::~TTrec()
int TTrec::compare(const TSortable& a) const
{
{ delete _rec;
const TTrec& r = (const TTrec&)a; }
const int res = memcmp((const void*)_rec, (const void*)r._rec, sizeof(*_rec));
return res;
} int TTrec::compare(const TSortable& a) const
void TTrec::rehash() {
const TTrec& r = (const TTrec&)a;
{ const int res = memcmp((const void*)_rec, (const void*)r._rec, sizeof(*_rec));
setrdes(_rec); return res;
} }
TTrec& TTrec::operator =(const TTrec& b) void TTrec::rehash()
{ {
_num = b._num; setrdes(_rec);
memcpy(_rec, b._rec, sizeof(*_rec)); }
return *this;
} TTrec& TTrec::operator =(const TTrec& b)
void TTrec::get(int nfile, TDirtype dirtype) {
_num = b._num;
{ memcpy(_rec, b._rec, sizeof(*_rec));
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR); return *this;
}
CGetRec(nfile, _rec, _whichdir);
_num = nfile; void TTrec::get(int nfile, TDirtype dirtype)
}
{
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
void TTrec::put(int nfile, TDirtype dirtype)
CGetRec(nfile, _rec, _whichdir);
{ _num = nfile;
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR); }
if (nfile <= 0)
fatal_box("Bad file number %d", nfile); void TTrec::put(int nfile, TDirtype dirtype)
CPutRec(nfile, _rec, _whichdir);
} {
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
void TTrec::zero() if (nfile <= 0)
fatal_box("Bad file number %d", nfile);
{ CPutRec(nfile, _rec, _whichdir);
zerordes(_rec); }
}
void TTrec::zero()
int TTrec::status(TDirtype dirop) const
{
{ zerordes(_rec);
return rdir[dirop].IOR; }
}
int TTrec::status(TDirtype dirop) const
int TTrec::field(const char* name) const
{
{ return rdir[dirop].IOR;
return findfld(_rec, (char*) name); }
}
int TTrec::field(const char* name) const
{
return findfld(_rec, (char*) name);
}
const char* TTrec::fielddef(int fld) const
{
sprintf(_files_tmp_string, "%s|%d|%d|%d", _rec->Fd[fld].Name,
(int) _rec->Fd[fld].TypeF, (int) _rec->Fd[fld].Len,
(int) _rec->Fd[fld].Dec);
return _files_tmp_string;
}
const char* TTrec::keydef(int key) const
{
TFixed_string s(_files_tmp_string, 128);
s = "";
for (int j = 0 ; j < _rec->Ky[key].NkFields; j++)
{
const bool upper = _rec->Ky[key].FieldSeq[j] > MaxFields;
const int nfld = _rec->Ky[key].FieldSeq[j] - (upper ? MaxFields : 0);
if (j) s << "+";
if (upper) s << "UPPER(";
s << _rec->Fd[nfld].Name;
if (_rec->Ky[key].FromCh[j] < INVFLD)
s << format("[%d,%d]", _rec->Ky[key].FromCh[j] + 1,
_rec->Ky[key].ToCh[j] + 1);
if (upper) s << ")";
}
s << (_rec->Ky[key].DupKeys ? "|X" : "| ");
return (const char*) s;
}
void TTrec::update_fielddef(int nfld, const char* desc)
{
TToken_string s(desc);
strcpy(_rec->Fd[nfld].Name, s.get());
_rec->Fd[nfld].TypeF = s.get_int();
_rec->Fd[nfld].Len = s.get_int();
_rec->Fd[nfld].Dec = s.get_int();
}
void TTrec::update_keydef(int key, const char* desc)
{
TExpression expr("", _strexpr);
TToken_string s(desc);
TString ke(s.get());
if (expr.set((const char*) ke, _strexpr))
{
_rec->Ky[key].DupKeys = (*s.get() != ' ');
TCodearray& c = expr.code();
c.begin();
int n = 0;
while (!c.end())
{
TCode& inst = c.step();
TCodesym sym = inst.getsym();
if (sym == _variable)
{
const char* s = inst.string();
for (int i = 0; i <_rec->NFields; i++)
if (strcmp(_rec->Fd[i].Name, s) == 0) break;
_rec->Ky[key].FieldSeq[n] = i;
_rec->Ky[key].FromCh[n] = INVFLD;
_rec->Ky[key].FromCh[n] = INVFLD;
inst = c.step();
sym = inst.getsym();
if (sym == _upper)
_rec->Ky[key].FieldSeq[n] += MaxFields;
else
if (sym == _number)
{
_rec->Ky[key].FromCh[n] = inst.number().integer() - 1;
inst = c.step();
_rec->Ky[key].ToCh[n] = _rec->Ky[key].FromCh[n] + inst.number().integer() - 1;
inst = c.step();
}
else c.backtrace();
n++;
}
}
_rec->Ky[key].NkFields = n;
}
}
void TTrec::print_on(ostream& out) const
{
out << num() << '\n';
const int nfields = fields();
TToken_string s(80);
out << nfields << '\n';
for (int i = 0; i < nfields; i++)
{
s = fielddef(i);
out << s << '\n';
}
const int nkeys = keys();
out << nkeys << '\n';
for (i = 0; i < nkeys; i++)
{
s = keydef(i);
out << s << '\n';
}
}
void TTrec::read_from(istream& in)
{
int ln;
in.getline(_files_tmp_string, sizeof(_files_tmp_string), '\n');
ln = atoi(_files_tmp_string);
if (ln != num() && !yesno_box("Descrizione relativa al file n.ro %d.\n Continuo ?", ln))
return;
int nfields;
in.getline(_files_tmp_string, sizeof(_files_tmp_string), '\n');
nfields = atoi(_files_tmp_string);
set_fields(nfields);
for (int i = 0; i < nfields; i++)
{
in.getline(_files_tmp_string, sizeof(_files_tmp_string), '\n');
update_fielddef(i, _files_tmp_string);
}
int nkeys;
in.getline(_files_tmp_string, sizeof(_files_tmp_string), '\n');
nkeys = atoi(_files_tmp_string);
set_keys(nkeys);
for (i = 0; i < nkeys; i++)
{
in.getline(_files_tmp_string, sizeof(_files_tmp_string), '\n');
update_keydef(i, _files_tmp_string);
}
rehash();
}

View File

@ -1,121 +1,130 @@
#ifndef __FILES_H #ifndef __FILES_H
#define __FILES_H #define __FILES_H
#ifndef __OBJECT_H #ifndef __OBJECT_H
#include <object.h> #include <object.h>
#endif #endif
#ifndef __EXTCTYPE_H #ifndef __EXTCTYPE_H
#include <extctype.h> #include <extctype.h>
#endif #endif
#ifndef __RECTYPES_H #ifndef __RECTYPES_H
#include <rectypes.h> #include <rectypes.h>
#endif #endif
// @C // @C
// Classe TFile : public TObject // Classe TFile : public TObject
// //
// Il file. I suoi metodi comprendono tutte le procedure per l'accesso // Il file. I suoi metodi comprendono tutte le procedure per l'accesso
// fisico di basso livello ai file. // fisico di basso livello ai file.
// //
// @END // @END
class TFile : public TObject class TFile : public TObject
{ {
// @DPRIV // @DPRIV
SecDef* _file; SecDef* _file;
int _len; int _len;
int _base; int _base;
public: public:
// @FPUB // @FPUB
void open(const char* name, TFilelock lockmode = _manulock); void open(const char* name, TFilelock lockmode = _manulock);
bool verify(const char* name); bool verify(const char* name);
void create(const char* name, TRecnotype nrecord = 10); void create(const char* name, TRecnotype nrecord = 10);
void chsize(const char* name, TRecnotype nrecord); void chsize(const char* name, TRecnotype nrecord);
void close(); void close();
void unlink(const char* name); void unlink(const char* name);
void read(char* record, TRecnotype recnum, TReclock lock = _nolock); void read(char* record, TRecnotype recnum, TReclock lock = _nolock);
void write(char* record, TRecnotype recnum, TReclock lock = _nolock); void write(char* record, TRecnotype recnum, TReclock lock = _nolock);
int status() const ; int status() const ;
int& base() { return _base; } int& base() { return _base; }
int& len() { return _len; } int& len() { return _len; }
bool ok() const { return status() == NOERR; } bool ok() const { return status() == NOERR; }
bool error() const { return status() != NOERR; } bool error() const { return status() != NOERR; }
TFile(int lenrec = 0, int base = 0); TFile(int lenrec = 0, int base = 0);
virtual ~TFile(); virtual ~TFile();
}; };
// @C // @C
// Classe TDir : public TObject // Classe TDir : public TObject
// //
// @END // @END
class TDir : public TObject class TDir : public TObject
{ {
// @DPRIV // @DPRIV
FileDes* _dir; FileDes* _dir;
int _num; int _num;
public: public:
// @FPUB // @FPUB
void get(int nfile, TReclock lock = _nolock, TDirtype dirtype = _nordir, TDirop op = _nordirop); void get(int nfile, TReclock lock = _nolock, TDirtype dirtype = _nordir, TDirop op = _nordirop);
void put(int nfile, TDirtype dirtype = _nordir, TDirop op = _nordirop); void put(int nfile, TDirtype dirtype = _nordir, TDirop op = _nordirop);
void zero(); void zero();
void set_eox(const RecNoType eox); void set_eox(const RecNoType eox);
void set_len(const UINT16 len); void set_len(const UINT16 len);
void set (const char * name, const RecNoType eod, const RecNoType flag, const char * des, const char * calc); void set (const char * name, const RecNoType eod, const RecNoType flag, const char * des, const char * calc);
const char* name() const; const char* name() const;
const char* des() const; const char* des() const;
const char* expr() const; const char* expr() const;
TRecnotype& eod() const; TRecnotype& eod() const;
TRecnotype& eox() const; TRecnotype& eox() const;
TRecnotype& flags() const; TRecnotype& flags() const;
word& len(); word& len();
int status(TDirtype dirtype = _nordir) const ; int status(TDirtype dirtype = _nordir) const ;
int num() const { return _num;} int num() const { return _num;}
int items(TDirtype dirtype = _nordir) const; int items(TDirtype dirtype = _nordir) const;
FileDes* filedesc() const { return _dir; } FileDes* filedesc() const { return _dir; }
TDir(); TDir();
virtual ~TDir(); virtual ~TDir();
}; };
// @C // @C
// Classe TTrec : public TObject // Classe TTrec : public TObject
// //
// @END // @END
class TTrec : public TSortable class TTrec : public TSortable
{ {
// @DPRIV // @DPRIV
RecDes* _rec; RecDes* _rec;
int _num; int _num;
protected: protected:
int compare(const TSortable& a) const; int compare(const TSortable& a) const;
public: public:
// @FPUB // @FPUB
void get(int nfile, TDirtype dirtype = _nordir); void get(int nfile, TDirtype dirtype = _nordir);
void put(int nfile, TDirtype dirtype = _nordir); void put(int nfile, TDirtype dirtype = _nordir);
void zero(); void zero();
void rehash(); void rehash();
int status(TDirtype dirtype = _nordir) const ; int status(TDirtype dirtype = _nordir) const ;
int num() const { return _num;} int num() const { return _num;}
int field(const char* fieldname) const; int field(const char* fieldname) const;
RecDes* rec() const { return _rec;} RecDes* rec() const { return _rec;}
TTrec& operator =(const TTrec& b); TTrec& operator =(const TTrec& b);
int items() const { return _rec->NFields; } int fields() const { return _rec->NFields; }
int len() const { return _rec->Fd[items() - 1].RecOff + int keys() const { return _rec->NKeys; }
_rec->Fd[items() - 1].Len; } void set_fields(int nfields) { _rec->NFields = nfields;}
void set_keys(int nkeys) { _rec->NKeys = nkeys;}
const char* fielddef(int fld) const; // ritorna una token string
TTrec(); const char* keydef(int key) const;
virtual ~TTrec(); void update_keydef(int key, const char* desc); //desc e' una token string
}; void update_fielddef(int nfld, const char* desc); //desc e' una token string
int len() const { return _rec->Fd[fields() - 1].RecOff +
#endif // __FILES_H _rec->Fd[fields() - 1].Len; }
virtual void print_on(ostream& out) const;
virtual void read_from(istream& in);
TTrec();
virtual ~TTrec();
};
#endif // __FILES_H