campo-sirio/ba/ba3500.cpp

407 lines
9.9 KiB
C++
Executable File

// ba3500.cpp - Tabella libro unico
#include <applicat.h>
#include <mask.h>
#include <msksheet.h>
#include <relapp.h>
#include <relation.h>
#include <tabutil.h>
#include <urldefid.h>
#include <config.h>
#include <utility.h>
#include "ba3500.h"
#include "nditte.h"
#define ALIAS 1
class Riga_tabinl : public TToken_string
{
public:
const TString& operator = (const TString& s)
{return TToken_string::operator=(s);}
Riga_tabinl (long,int,long,long,long,const char*,long,long,const char*,bool,bool);
};
Riga_tabinl::Riga_tabinl(long annorg,int meserg,long pilib,long pflib,long coddta,const char* codrg,long piut,long pfut,const char* codvid,bool stamp_bol,bool pag_ann)
: TToken_string(80)
{
add((long)annorg); add((long)meserg); add((long)pilib); add((long)pflib); add((long)coddta);
add(codrg); add((long)piut); add((long)pfut); add(codvid); add((char)stamp_bol);
add((char)pag_ann);
}
class TRighe_tabinl : public TArray
{
public:
void add_riga(long=0l,int=0,long=0l,long=0l,long=0L,const char*p=NULL,long=0L,long=0L,const char*d=NULL,bool=FALSE,bool=FALSE);
TRighe_tabinl() {}
};
void TRighe_tabinl::add_riga(long annorg,int meserg,long pilib,long pflib,long coddta,const char* codrg,long piut,long pfut,const char* codvid,bool stamp_bol,bool pag_ann)
{
Riga_tabinl* r=new Riga_tabinl(annorg,meserg,pilib,pflib,coddta,codrg,piut,pfut,codvid,stamp_bol,pag_ann);
add(r);
}
class TRighe_gia_presenti : public TBit_array
{
public:
bool IS_IN (long) const;
void togli (long);
TRighe_gia_presenti (long size) : TBit_array(size) {}
};
void TRighe_gia_presenti::togli(long numrig)
{
reset(numrig);
}
bool TRighe_gia_presenti::IS_IN (long numrig) const
{
if ((*this)[numrig])
return TRUE;
else
return FALSE;
}
class BA3500_application : public TRelation_application
{
TRelation * _rel;
TMask * _msk;
TTable * _tab_lbu;
TTable * _tab_inl;
TTable * _tab_reg;
TLocalisamfile * _nditte;
TRighe_gia_presenti *_righe_gia_presenti;
int _mode; // Modo maschera corrente
TRighe_tabinl _righe_tabinl;
int compila_righe_rcaus (TString&, TString&, TString&, TString&);
void read_tabinl(TMask&);
bool fill_sheet(TMask&);
protected:
virtual bool user_create();
virtual bool user_destroy();
virtual TRelation* get_relation() const { return _rel; }
virtual TMask* get_mask(int mode);
virtual bool changing_mask(int mode) {return FALSE; }
virtual bool remove();
// void init_mask(TMask&);
virtual void init_query_mode(TMask&);
// virtual void init_modify_mode(TMask&);
// virtual void init_insert_mode(TMask&);
virtual int rewrite(const TMask& m);
virtual int write(const TMask& m);
virtual int read(TMask& m);
int cancella(long items);
public:
BA3500_application() {}
};
TMask* BA3500_application::get_mask(int mode)
{
return _msk;
}
void BA3500_application::read_tabinl(TMask& m)
{
long paginilib,pagfinlib,codditta,paginiut,pagfinut,annoreg;
int mesereg;
TString codvidim,codreg;
bool stampa_bol = FALSE;
bool pagine_ann = FALSE;
bool ok = FALSE;
// TTable* tab_inl = (TTable*)_rel->lfile(TAB_INL);
TTable* tab_inl = (TTable*)_rel->lfile(-ALIAS);
long numrig, anno;
TString codlib;
anno = atol(m.get(F_ANNO));
codlib = m.get(F_CODLIB);
_rel->update();
_righe_gia_presenti = new TRighe_gia_presenti(tab_inl->items());
_righe_gia_presenti->reset();
// int lognum = name2log(TAB_INL); //trasformo il nome della tab in un logicnum
ok = _rel->is_first_match(-ALIAS);
while (ok)
{
TRecfield num (tab_inl->curr(),"CODTAB",7,12);
numrig = long(num);
annoreg = tab_inl->get_long("I0");
mesereg = tab_inl->get_int ("I1");
paginilib = tab_inl->get_long("I2");
pagfinlib = tab_inl->get_long("I3");
codditta = tab_inl->get_long("I4");
codreg = tab_inl->get("S0");
paginiut = tab_inl->get_long("I5");
pagfinut = tab_inl->get_long("I6");
codvidim = tab_inl->get("S1");
stampa_bol = tab_inl->get_bool("B0");
pagine_ann = tab_inl->get_bool("B1");
_righe_tabinl.add_riga(annoreg,mesereg,paginilib,pagfinlib,codditta,codreg,paginiut,pagfinut,codvidim,stampa_bol,pagine_ann);
_righe_gia_presenti->set(numrig);
ok = _rel->next_match(-ALIAS);
}
}
bool BA3500_application::fill_sheet(TMask& m)
{
long items;
_righe_tabinl.destroy();
TSheet_field& cs = (TSheet_field&)m.field(F_SHEET_LBU);
cs.reset();
for (int j = cs.items(); j < 16 ; j++)
TToken_string &riga = cs.row(j);
read_tabinl(m);
items = _righe_tabinl.items();
for (int i = 0; i < items; i++)
{
TToken_string &riga = cs.row(i);
riga.cut(0);
riga = (Riga_tabinl&)_righe_tabinl[i];
}
cs.force_update();
_righe_tabinl.destroy();
return TRUE;
}
/********
void BA3500_application::init_insert_mode(TMask& m)
{
_righe_tabinl.destroy();
TSheet_field& cs = (TSheet_field&)m.field(F_SHEET_LBU);
cs.reset();
for (int j = 0; j < 16 ; j++)
TToken_string &riga = cs.row(j);
cs.force_update();
}
**********/
void BA3500_application::init_query_mode(TMask& m)
{
_righe_tabinl.destroy();
TSheet_field& cs = (TSheet_field&)m.field(F_SHEET_LBU);
cs.reset();
for (int j = cs.items(); j < 16 ; j++)
TToken_string &riga = cs.row(j);
cs.force_update();
}
int BA3500_application::rewrite(const TMask& m)
{
long items;
// TTable *tab_inl = (TTable*)_rel->lfile(TAB_INL);
TTable *tab_inl = (TTable*)_rel->lfile(-ALIAS);
int anno = m.get_int(F_ANNO);
TString cod_lib = m.get(F_CODLIB);
m.autosave(_rel);
TSheet_field& cs = (TSheet_field&)m.field(F_SHEET_LBU);
items = cs.items();
for (int i = 0; i < items; i++)
{
TToken_string &riga = cs.row(i);
TString codtab (format("%4d%-3s%6d",anno,(const char *)cod_lib,i));
long year = atol(riga.get(0));
if (year != 0)
{
tab_inl->put ("CODTAB", codtab);
tab_inl->put ("I0", year);
tab_inl->put ("I1", riga.get());
tab_inl->put ("I2", riga.get());
tab_inl->put ("I3", riga.get());
tab_inl->put ("I4", riga.get());
tab_inl->put ("S0", riga.get());
tab_inl->put ("I5", riga.get());
tab_inl->put ("I6", riga.get());
tab_inl->put ("S1", riga.get());
tab_inl->put ("B0", riga.get());
tab_inl->put ("B1", riga.get());
if (_righe_gia_presenti->IS_IN(i))
{
tab_inl->rewrite();
_righe_gia_presenti->togli(i);
}
else
tab_inl->write();
}
}
return _rel->rewrite();
}
int BA3500_application::write(const TMask& m)
{
long items;
// TTable *tab_inl = (TTable*)_rel->lfile(TAB_INL);
TTable *tab_inl = (TTable*)_rel->lfile(-ALIAS);
int anno = m.get_int(F_ANNO);
TString cod_lib = m.get(F_CODLIB);
m.autosave(_rel);
TSheet_field& cs = (TSheet_field&)m.field(F_SHEET_LBU);
items = cs.items();
tab_inl->zero();
for (int i = 0; i < items; i++)
{
TToken_string &riga = cs.row(i);
TString codtab (format("%4d%-3s%6d",anno,(const char *)cod_lib,i));
long year = atol(riga.get(0));
if (year != 0)
{
tab_inl->put ("CODTAB", codtab);
tab_inl->put ("I0", year);
tab_inl->put ("I1", riga.get());
tab_inl->put ("I2", riga.get());
tab_inl->put ("I3", riga.get());
tab_inl->put ("I4", riga.get());
tab_inl->put ("S0", riga.get());
tab_inl->put ("I5", riga.get());
tab_inl->put ("I6", riga.get());
tab_inl->put ("S1", riga.get());
tab_inl->put ("B0", riga.get());
tab_inl->put ("B1", riga.get());
tab_inl->write();
}
}
return _rel->write();
}
bool BA3500_application::remove()
{
TSheet_field& cs = (TSheet_field&)_msk->field(F_SHEET_LBU);
const bool ok = TRelation_application::remove();
if (ok)
cancella(cs.items());
return TRUE;
}
int BA3500_application::cancella(long items)
{
TTable *tab_inl = (TTable*)_rel->lfile(-ALIAS);
TRecfield an (_rel->lfile(-ALIAS)->curr(),"CODTAB",0,3);
TRecfield cl (_rel->lfile(-ALIAS)->curr(),"CODTAB",4,6);
long anno;
TString codlib, dep;
anno = long(an);
codlib = (const char*)cl;
for (long i = 0; i < items; i++)
{
tab_inl->zero();
dep = format ("%04d", anno);
dep << format ("%-3s" , (const char*) codlib);
dep << format ("%6d" , i);
tab_inl->put("CODTAB", dep);
if (tab_inl->read(_isequal, _lock) == NOERR)
tab_inl->remove();
}
return tab_inl->status();
}
/*********
void BA3500_application::init_modify_mode(TMask& m)
{
init_mask(m);
}
void BA3500_application::init_mask(TMask& m)
{
TString tpd(m.get(F_TIPO_DOC));
TString tpm(m.get(F_TIPO_MOV));
if (tpd.trim().empty())
m.set(F_TIPO_MOV_2, tpm);
else
m.set(F_TIPO_MOV_1, tpm);
}
***********/
int BA3500_application::read(TMask& m)
{
m.autoload(_rel);
fill_sheet(m);
return NOERR;
}
bool BA3500_application::user_create()
{
_rel = new TRelation (TAB_LBU);
_rel->add(TAB_INL, "CODTAB[1,7]==CODTAB" ,1, 0, ALIAS, TRUE); //-4 = alias, perche' le due tabelle sono entrambe in TABCOM.dta
_tab_lbu = new TTable (TAB_LBU);
_tab_inl = new TTable (TAB_INL);
_tab_reg = new TTable (TAB_REG);
_nditte = new TLocalisamfile (LF_NDITTE);
_msk = new TMask("ba3500a");
return TRUE;
}
bool BA3500_application::user_destroy()
{
delete _msk;
delete _tab_lbu;
delete _tab_inl;
delete _tab_reg;
delete _nditte;
delete _rel;
return TRUE;
}
int ba3500(int argc, char* argv[])
{
BA3500_application a;
a.run(argc, argv, "Tabella libro unico");
return 0;
}