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:
parent
2bf6f6adf5
commit
da54026c24
@ -1,3 +1,4 @@
|
||||
#include <stdlib.h>
|
||||
#include <applicat.h>
|
||||
#include <xvtility.h>
|
||||
#include <utility.h>
|
||||
@ -18,6 +19,7 @@ class BA1100_application : public TApplication
|
||||
TDir_sheet * _browse;
|
||||
TMask * _mask;
|
||||
long _firm;
|
||||
TRec_sheet* _rec;
|
||||
|
||||
protected:
|
||||
virtual bool menu (MENU_TAG);
|
||||
@ -30,18 +32,78 @@ virtual bool extended_firm() const { return TRUE; }
|
||||
void update();
|
||||
void update_dir();
|
||||
void convert_dir();
|
||||
virtual void print();
|
||||
|
||||
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
|
||||
|
||||
{
|
||||
_firm = get_firm();
|
||||
_mask = new TMask ("ba1100a");
|
||||
set_firm();
|
||||
set_printer(new TPrinter());
|
||||
_browse = new TDir_sheet ("Manutenzione file di sistema") ;
|
||||
_browse->add_button(DLG_INSFILE, "Inserisce", K_F4);
|
||||
_browse->add_button(DLG_CONVERT, "Converte", K_F7);
|
||||
@ -53,6 +115,9 @@ bool BA1100_application::create() // initvar e arrmask
|
||||
bool BA1100_application::destroy() // releasev e arrmask
|
||||
|
||||
{
|
||||
TPrinter* p = &printer();
|
||||
|
||||
delete p;
|
||||
if (_firm) set_firm(_firm);
|
||||
if (_browse != NULL) delete _browse;
|
||||
delete _mask;
|
||||
@ -176,9 +241,12 @@ switch (tasto)
|
||||
else
|
||||
if (tasto == K_F6)
|
||||
{
|
||||
TRec_sheet r(logicnum);
|
||||
|
||||
r.edit();
|
||||
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)
|
||||
|
11
ba/ba1100.h
11
ba/ba1100.h
@ -40,22 +40,17 @@ class TRec_sheet : public TObject
|
||||
static TMask *_mask;
|
||||
|
||||
protected:
|
||||
void update_keys(int from, int shift);
|
||||
const char* build_key_expr(int key);
|
||||
bool check_key_expr(int key, const char* key_expr);
|
||||
void update_key_expr(int key, TToken_string& s);
|
||||
const char* build_field(int nfld);
|
||||
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; }
|
||||
virtual long items() const { return _rec->fields(); }
|
||||
|
||||
public:
|
||||
TRec_sheet(int logicnum);
|
||||
~TRec_sheet();
|
||||
TDir* dir() const { return _dir; }
|
||||
TTrec* rec() const { return _rec; }
|
||||
void edit();
|
||||
|
||||
};
|
||||
|
@ -11,19 +11,19 @@ END
|
||||
BUTTON DLG_PRINT 8 2
|
||||
BEGIN
|
||||
PROMPT -26 -1 "Stampa"
|
||||
MESSAGE K_F5
|
||||
MESSAGE EXIT,K_F5
|
||||
END
|
||||
|
||||
BUTTON DLG_EXPORT 8 2
|
||||
BEGIN
|
||||
PROMPT -36 -1 "Esporta"
|
||||
MESSAGE K_F6
|
||||
MESSAGE EXIT,K_F6
|
||||
END
|
||||
|
||||
BUTTON DLG_IMPORT 8 2
|
||||
BEGIN
|
||||
PROMPT -46 -1 "Importa"
|
||||
MESSAGE K_F7
|
||||
MESSAGE EXIT,K_F7
|
||||
END
|
||||
|
||||
BUTTON DLG_CANCEL 8 2
|
||||
@ -47,9 +47,9 @@ BEGIN
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
SPREADSHEET F_FIELDS 0 7
|
||||
SPREADSHEET F_FIELDS 34 7
|
||||
BEGIN
|
||||
PROMPT 16 4 ""
|
||||
PROMPT 15 4 ""
|
||||
ITEM "Nome@10"
|
||||
ITEM "Tipo"
|
||||
ITEM "Lunghezza"
|
||||
|
25
ba/ba1100f.uml
Executable file
25
ba/ba1100f.uml
Executable 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
|
215
ba/ba1101.cpp
215
ba/ba1101.cpp
@ -1,7 +1,9 @@
|
||||
// Includo stdio senno' dice che ridefinisco FILE
|
||||
#include <stdio.h>
|
||||
#include <fstream.h>
|
||||
|
||||
|
||||
#include <applicat.h>
|
||||
#include <files.h>
|
||||
#include <utility.h>
|
||||
#include <expr.h>
|
||||
@ -13,7 +15,6 @@
|
||||
#include <validate.h>
|
||||
|
||||
#include "ba1100.h"
|
||||
#define INVFLD 255
|
||||
|
||||
TMask* TRec_sheet::_mask = NULL;
|
||||
HIDDEN TToken_string s(256);
|
||||
@ -96,57 +97,6 @@ TRec_sheet::~TRec_sheet()
|
||||
_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)
|
||||
|
||||
{
|
||||
@ -154,81 +104,6 @@ bool TRec_sheet::check_key_expr(int key, const char * key_expr)
|
||||
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)
|
||||
|
||||
{
|
||||
@ -240,7 +115,7 @@ HIDDEN bool len_handler(TMask_field& f, KEY key)
|
||||
|
||||
switch (typef)
|
||||
{
|
||||
case _alfafld: return len <= INVFLD;
|
||||
case _alfafld: return len <= 254;
|
||||
case _intfld: return len <= 5;
|
||||
case _longfld: return len <= 10;
|
||||
case _realfld: return len <= 18;
|
||||
@ -300,30 +175,94 @@ void TRec_sheet::edit()
|
||||
{
|
||||
TSheet_field& f1 = (TSheet_field&) _mask->field(F_FIELDS);
|
||||
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);
|
||||
for (int i = 0; i < rdes->NFields; i++) f1.row(i) = build_field(i);
|
||||
int nfields = _rec->fields();
|
||||
for (int i = 0; i < nfields; i++) f1.row(i) = _rec->fielddef(i);
|
||||
f2.set_notify(key_notify);
|
||||
for (i = 0; i < rdes->NKeys; i++) f2.row(i) = build_key_expr(i);
|
||||
if (_mask->run() == K_SAVE)
|
||||
int nkeys = _rec->keys();
|
||||
for (i = 0; i < nkeys; i++) f2.row(i) = _rec->keydef(i);
|
||||
while (TRUE)
|
||||
{
|
||||
rdes->NFields = f1.items();
|
||||
for (i = 0; i < rdes->NFields; i++)
|
||||
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);
|
||||
update_field(i, s);
|
||||
_rec->update_fielddef(i, s);
|
||||
}
|
||||
_rec->rehash();
|
||||
rdes->NKeys = f2.items();
|
||||
for (i = 0; i < rdes->NKeys; i++)
|
||||
nkeys = f2.items();
|
||||
_rec->set_keys(nkeys);
|
||||
for (i = 0; i < nkeys; i++)
|
||||
{
|
||||
TToken_string& s = f2.row(i);
|
||||
update_key_expr(i, s);
|
||||
_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());
|
||||
|
||||
nout.strip("$%");
|
||||
nout.ext("trr");
|
||||
m.set(F_NOMEF, nout);
|
||||
if (m.run() == K_ENTER)
|
||||
{
|
||||
TString80 nf(m.get(F_NOMEF));
|
||||
|
||||
if (nf.not_empty())
|
||||
{
|
||||
ofstream out((const char*) nf);
|
||||
|
||||
out << *_rec;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case K_F7:
|
||||
{
|
||||
TMask m("ba1100f");
|
||||
TFilename nout(_dir->name());
|
||||
|
||||
nout.strip("$%");
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
234
ba/ba1102.cpp
234
ba/ba1102.cpp
@ -1,72 +1,200 @@
|
||||
// Includo stdio senno' dice che ridefinisco FILE
|
||||
#include <stdio.h>
|
||||
|
||||
#ifndef __FILES_H
|
||||
#include <files.h>
|
||||
#endif
|
||||
|
||||
#ifndef __MASK_H
|
||||
#include <relation.h>
|
||||
#include <mask.h>
|
||||
#endif
|
||||
|
||||
#ifndef __SHEET_H
|
||||
#include <sheet.h>
|
||||
#endif
|
||||
#include <progind.h>
|
||||
#include <defmask.h>
|
||||
|
||||
#ifndef __URLDEFID_H
|
||||
#include <urldefid.h>
|
||||
#endif
|
||||
|
||||
#ifndef __VALIDAT_H
|
||||
#include <validate.h>
|
||||
#endif
|
||||
|
||||
#ifndef __BA1201_H
|
||||
#include "ba1201.h"
|
||||
#endif
|
||||
#include "ba1100.h"
|
||||
|
||||
|
||||
TRec_sheet::TRec_sheet(int logicnum)
|
||||
: TSheet(-1,-1, 0, 0, "","N.|Nome|Lung.|Dec.|Offset", 0x6)
|
||||
|
||||
bool TEdit_file::browse(int logicnum, const char* name)
|
||||
{
|
||||
_dir = new TDir;
|
||||
_rec = new TTrec;
|
||||
TRelation relation(logicnum);
|
||||
TCursor cursor(&relation);
|
||||
TRectype& curr = cursor.curr();
|
||||
TRectype svrec(cursor.curr());
|
||||
|
||||
_dir->get(logicnum, _nordir, _lock, _nordir);
|
||||
_rec->get(logicnum, _comfile ? _condir : _nordir);
|
||||
TToken_string head(256);
|
||||
TToken_string trac(256);
|
||||
|
||||
TRec_sheet::~TRec_sheet()
|
||||
const char* n;
|
||||
trac.add("");
|
||||
head.add("@1");
|
||||
|
||||
for(int i = 0; (n = curr.fieldname(i)) != NULL; i++)
|
||||
{
|
||||
delete _dir;
|
||||
delete _rec;
|
||||
trac.add(n);
|
||||
head.add(n);
|
||||
|
||||
int len = curr.length(n);
|
||||
if (curr.type(n) == _datefld) len = 10;
|
||||
if (len > strlen(n)) head << '@' << len;
|
||||
}
|
||||
|
||||
KEY ch;
|
||||
TCursor_sheet sheet(&cursor, trac, name, head, 6);
|
||||
|
||||
void TRec_sheet::page_build(long first, byte rows)
|
||||
while ((ch = sheet.run()) != K_ESC)
|
||||
{
|
||||
TToken_string l;
|
||||
TString dep(256);
|
||||
RecDes *rdes;
|
||||
|
||||
_rec->get(1, _nordir);
|
||||
|
||||
|
||||
for (byte i = 0; i < rows; i++)
|
||||
if (ch == K_DEL && sheet.one_checked())
|
||||
{
|
||||
dep << (int)i+1+first; // Numero progressivo del file
|
||||
l = dep.right_just(3);
|
||||
dep = "";
|
||||
rdes = _rec->rec();
|
||||
l.add((const char*)rdes->Fd[i].Name);
|
||||
l.add((const char*)rdes->Fd[i].TypeF);
|
||||
dep << rdes->Fd[i].Name;
|
||||
l.add ( (const char*) dep);
|
||||
dep = "";
|
||||
dep << rdes->Fd[i].Dec;
|
||||
l.add( (const char*) dep);
|
||||
TProgind* pind = NULL;
|
||||
cursor.freeze(TRUE);
|
||||
bool go = FALSE;
|
||||
bool first = FALSE;
|
||||
int j;
|
||||
for (j = 0, cursor = 0; j < sheet.items(); ++cursor, j++)
|
||||
{
|
||||
if (sheet.checked(j))
|
||||
{
|
||||
if (!go && !first)
|
||||
go = yesno_box("Confermi la cancellazione dei %d "
|
||||
"record indicati?", sheet.checked());
|
||||
first = TRUE;
|
||||
|
||||
set_row(l, i);
|
||||
if (!pind)
|
||||
{
|
||||
pind = new TProgind(sheet.checked(),"Attendere...",
|
||||
TRUE, TRUE, 32);
|
||||
pind->addstatus(1);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pind->iscancelled()) break;
|
||||
pind->addstatus(1);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -1,14 +1,20 @@
|
||||
#include <stdio.h>
|
||||
#include <memory.h>
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
|
||||
#include <files.h>
|
||||
#include <expr.h>
|
||||
#ifndef __EXTCDECL_H
|
||||
#include <extcdecl.h>
|
||||
#endif
|
||||
#include <utility.h>
|
||||
|
||||
|
||||
#define BLOCKLEN 512
|
||||
#define INVFLD 255
|
||||
|
||||
HIDDEN char _files_tmp_string[128];
|
||||
|
||||
TFile::TFile(int lenrec, int base)
|
||||
|
||||
@ -317,3 +323,152 @@ 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();
|
||||
}
|
||||
|
||||
|
||||
|
@ -108,9 +108,18 @@ public:
|
||||
int field(const char* fieldname) const;
|
||||
RecDes* rec() const { return _rec;}
|
||||
TTrec& operator =(const TTrec& b);
|
||||
int items() const { return _rec->NFields; }
|
||||
int len() const { return _rec->Fd[items() - 1].RecOff +
|
||||
_rec->Fd[items() - 1].Len; }
|
||||
int fields() const { return _rec->NFields; }
|
||||
int keys() const { return _rec->NKeys; }
|
||||
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
|
||||
const char* keydef(int key) const;
|
||||
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 +
|
||||
_rec->Fd[fields() - 1].Len; }
|
||||
virtual void print_on(ostream& out) const;
|
||||
virtual void read_from(istream& in);
|
||||
|
||||
|
||||
TTrec();
|
||||
|
Loading…
x
Reference in New Issue
Block a user