campo-sirio/m770/770400.cpp

126 lines
2.8 KiB
C++

#include <tabapp.h>
#include <recset.h>
#include <msksheet.h>
#include <nditte.h>
class TTabelle_770 : public TTable_application
{
protected:
virtual int read(TMask& m);
virtual int write(const TMask& m);
virtual int rewrite(const TMask& m);
virtual bool remove();
public:
bool is_ENT() const { return get_tabname() == "%ENT"; }
TSheet_field* sheet_ENT() const;
void write_rewrite_ENT() const;
};
TSheet_field* TTabelle_770::sheet_ENT() const
{
if (is_ENT())
{
TMask& m = curr_mask();
for (int i = m.fields()-1; i > 0; i--)
{
TMask_field& f = m.fld(i);
if (f.is_sheet())
return (TSheet_field*)&f;
}
}
return NULL;
}
int TTabelle_770::read(TMask& m)
{
const int err = TTable_application::read(m);
TSheet_field* se = sheet_ENT();
if (err == NOERR && se != NULL)
{
const TString& ent = m.get_key_field(1, true)->get();
se->destroy();
TLocalisamfile mr(LF_MULTIREL);
TISAM_recordset nditte("USE NDITTE");
for (bool go = nditte.move_first(); go; go = nditte.move_next())
{
TToken_string& r = se->row(-1);
const long n = nditte.get(NDT_CODDITTA).as_int();
TString8 cod; cod.format("%05ld", n);
r = cod;
r.add(nditte.get(NDT_RAGSOC).as_string());
mr.put("COD", "77ENT");
mr.put("FIRST", ent);
mr.put("SECOND", cod);
if (mr.read() == NOERR)
r.add(mr.get("DATA"));
}
se->force_update();
}
return err;
}
void TTabelle_770::write_rewrite_ENT() const
{
TSheet_field& s = *sheet_ENT();
const TString& ent = s.mask().get_key_field(1, true)->get();
TLocalisamfile mr(LF_MULTIREL);
TString8 cod;
FOR_EACH_SHEET_ROW(s, r, row)
{
mr.zero();
mr.put("COD", "77ENT");
mr.put("FIRST", ent);
cod.format("%05ld", row->get_long(0));
mr.put("SECOND", cod);
const TFixed_string data = row->get(2);
if (data.full())
{
mr.put("DATA", data);
mr.rewrite_write();
}
else
mr.remove();
}
}
int TTabelle_770::write(const TMask& m)
{
const int err = TTable_application::write(m);
if (err == NOERR && is_ENT())
write_rewrite_ENT();
return err;
}
int TTabelle_770::rewrite(const TMask& m)
{
const int err = TTable_application::rewrite(m);
if (err == NOERR && is_ENT())
write_rewrite_ENT();
return err;
}
bool TTabelle_770::remove()
{
const bool done = TTable_application::remove();
if (done && is_ENT())
{
TSheet_field& s = *sheet_ENT();
FOR_EACH_SHEET_ROW(s, r, row)
row->add(" ", 2);
write_rewrite_ENT();
}
return done;
}
int TableManager(int argc, char* argv[])
{
TTabelle_770 a;
a.run(argc, argv, TR("Tabella 770"));
return 0;
}