424 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			424 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include <relapp.h>
 | 
						|
#include <mailbox.h>
 | 
						|
#include <execp.h>
 | 
						|
#include <utility.h>
 | 
						|
#include <prefix.h>
 | 
						|
#include <tabutil.h>
 | 
						|
#include <files.h>
 | 
						|
 | 
						|
#if XVT_OS == XVT_OS_SCOUNIX
 | 
						|
#include <sys/stat.h>
 | 
						|
#else
 | 
						|
#include <direct.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#include "ba4.h"
 | 
						|
#include "ba4300.h"
 | 
						|
 | 
						|
#define FLD_UL1_CODDITTA 133
 | 
						|
#define FLD_UL1_CODDITTA_NDITTE_RAGSOC 100
 | 
						|
#define FLD_AT1_CODDITTA 102
 | 
						|
#define FLD_AT1_CODDITTAH 198
 | 
						|
#define FLD_AT1_PROGD_NDITTE_RAGSOC 105
 | 
						|
#define FLD_SC1_CODDITTA 143
 | 
						|
#define FLD_SC1_CODANAGRSOH 147
 | 
						|
#define FLD_SC1_CODDITTA_NDITTE_RAGSOC 144
 | 
						|
#define FLD_UL1_CODULC 125
 | 
						|
 | 
						|
const char* CODDITTA = "CODDITTA";
 | 
						|
const char* CODATTPREV = "CODATTPREV";
 | 
						|
const char* TIPOA = "TIPOA";
 | 
						|
const char* CODANAGR = "CODANAGR";
 | 
						|
 | 
						|
const char* CODATT = "CODATT";
 | 
						|
 | 
						|
const char* COMRF = "COMRF";
 | 
						|
const char* INDRF = "INDRF";
 | 
						|
const char* CIVRF = "CIVRF";
 | 
						|
const char* CAPRF = "CAPRF";
 | 
						|
const char* COMRES = "COMRES";
 | 
						|
const char* INDRES = "INDRES";
 | 
						|
const char* CIVRES = "CIVRES";
 | 
						|
const char* CAPRES = "CAPRES";
 | 
						|
 | 
						|
const char* CODULC = "CODULC";
 | 
						|
const char* COMULC = "COMULC";
 | 
						|
const char* INDULC = "INDULC";
 | 
						|
const char* CIVULC = "CIVULC";
 | 
						|
const char* CAPULC = "CAPULC";
 | 
						|
const char* COMCCIAA = "COMCCIAA";
 | 
						|
const char* COMTRIB = "COMTRIB";
 | 
						|
 | 
						|
#define TABATT "%ais"
 | 
						|
#define CODTAB "CODTAB"
 | 
						|
#define S0               "S0"
 | 
						|
#define DESCR    "DESCR"
 | 
						|
 | 
						|
class BA4300_application : public TRelation_application
 | 
						|
{
 | 
						|
  TMask* _msk;
 | 
						|
  TRelation *_rel;
 | 
						|
  TLocalisamfile* _anag;
 | 
						|
  TLocalisamfile* _unloc;
 | 
						|
  TLocalisamfile* _attiv;
 | 
						|
  TLocalisamfile* _tabcom;
 | 
						|
 | 
						|
protected:
 | 
						|
  bool user_create() ;
 | 
						|
  bool user_destroy() ;
 | 
						|
  virtual TMask* get_mask(int) { return _msk;}
 | 
						|
  virtual bool changing_mask(int) { return FALSE;}
 | 
						|
  virtual void init_query_mode(TMask& m) ;
 | 
						|
  virtual void init_insert_mode(TMask& m) ;
 | 
						|
  virtual void init_modify_mode(TMask& m) ;
 | 
						|
 | 
						|
  bool build_firm_data(long cod, bool flagcom);
 | 
						|
 | 
						|
public:
 | 
						|
  BA4300_application();
 | 
						|
  virtual TRelation* get_relation() const { return _rel;}
 | 
						|
  virtual int write(const TMask& m);
 | 
						|
  virtual ~BA4300_application() {}
 | 
						|
};
 | 
						|
 | 
						|
bool ba4300_handler(TMask& m, KEY k)
 | 
						|
 | 
						|
{
 | 
						|
  if (k != K_F5 && k != K_F6 && k != K_F7 && k != K_F8)
 | 
						|
    return TRUE;
 | 
						|
  if (m.mode() == MODE_MOD || m.mode() == MODE_INS)
 | 
						|
  {
 | 
						|
    BA4300_application&  app = (BA4300_application&)main_app();
 | 
						|
    if (m.mode() == MODE_INS)
 | 
						|
    {
 | 
						|
      if (!m.check_fields()) return FALSE;
 | 
						|
      if (app.write(m) != NOERR) return TRUE;
 | 
						|
      m.stop_run(K_ESC);
 | 
						|
    }
 | 
						|
    TString appname;
 | 
						|
    int fld = 0, fld1 = 0, fldbrowse = 0;
 | 
						|
 | 
						|
    if (k == K_F5)
 | 
						|
    {
 | 
						|
      appname = "ba4 -3";
 | 
						|
      fld = FLD_UL1_CODDITTA;
 | 
						|
      fld1 = FLD_UL1_CODDITTA_NDITTE_RAGSOC;
 | 
						|
      fldbrowse = FLD_UL1_CODULC;
 | 
						|
    }
 | 
						|
    if (k == K_F6) 
 | 
						|
    {
 | 
						|
      appname = "ba4 -4";
 | 
						|
      fld = FLD_AT1_CODDITTA;
 | 
						|
      fld1 = FLD_AT1_PROGD_NDITTE_RAGSOC;
 | 
						|
      fldbrowse = FLD_AT1_CODDITTAH;
 | 
						|
    }
 | 
						|
    if (k == K_F7)
 | 
						|
    {
 | 
						|
      appname = "ba4 -5";
 | 
						|
      fld = FLD_SC1_CODDITTA;
 | 
						|
      fld1 = FLD_SC1_CODDITTA_NDITTE_RAGSOC;
 | 
						|
      fldbrowse = FLD_SC1_CODANAGRSOH;
 | 
						|
    }
 | 
						|
    if (k == K_F8) { appname = "ba3 -0 reg"; fld = 0;fldbrowse = 0;}
 | 
						|
    if (appname.not_empty())
 | 
						|
    {
 | 
						|
      TString body(16);
 | 
						|
      TLocalisamfile& d = app.get_relation()->lfile();
 | 
						|
 | 
						|
#if XVT_OS == XVT_OS_WIN
 | 
						|
      if (k != K_F8) appname.insert("a", 3);
 | 
						|
#endif
 | 
						|
      if (fldbrowse)
 | 
						|
        body << fldbrowse << "|";
 | 
						|
      if (fld)
 | 
						|
        body << fld << "=" << m.get(FLD_GD1_CODDITTA) ;
 | 
						|
      if (fld1)
 | 
						|
        body << "|" << fld1 << "=" ;
 | 
						|
      if (fldbrowse || fld)
 | 
						|
      {
 | 
						|
        TMessage  msg(cmd2name(appname), MSG_FS, (const char*) body);
 | 
						|
 | 
						|
        TMailbox mb;
 | 
						|
        mb.send(msg);
 | 
						|
      }
 | 
						|
      d.setkey(1);
 | 
						|
      d.zero();
 | 
						|
      d.put("CODDITTA",  m.get(FLD_GD1_CODDITTA));
 | 
						|
      d.read(_isequal, _unlock) ;
 | 
						|
      TExternal_app a(appname);
 | 
						|
      const long oldditta = main_app().get_firm();
 | 
						|
      if (k == K_F8) main_app().set_firm(m.get_long(FLD_GD1_CODDITTA));
 | 
						|
      a.run();
 | 
						|
      if (k == K_F8) main_app().set_firm(oldditta);
 | 
						|
      d.read(_iscurr, _lock) ;
 | 
						|
      m.set_focus();
 | 
						|
      return FALSE;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
bool BA4300_application::build_firm_data(long codditta, bool flagcom)
 | 
						|
 | 
						|
{
 | 
						|
  const TString         ndir(firm2dir(codditta));
 | 
						|
  const char*   ntrrec = "trc.gen";
 | 
						|
  const TFilename       s1(format("%s/%s", (const char*) ndir, ntrrec));
 | 
						|
  const char*   nd = "dir.gen";
 | 
						|
  const TFilename       s2(format("%s/%s", (const char*) ndir, nd));
 | 
						|
 | 
						|
  if (fexist(s1) && fexist(s2))
 | 
						|
    return TRUE;
 | 
						|
  if (fexist(ndir))
 | 
						|
  {
 | 
						|
    const bool ok = yesno_box("Direttorio %s esistente, lo ricostruisco", (const char*) ndir);
 | 
						|
    if (!ok) return TRUE;
 | 
						|
  }
 | 
						|
  else
 | 
						|
#if XVT_OS == XVT_OS_SCOUNIX
 | 
						|
    if (mkdir(ndir, 0777) == -1)
 | 
						|
#else
 | 
						|
      if (mkdir(ndir) == -1)
 | 
						|
#endif
 | 
						|
        return error_box("Impossibile creare il direttorio della ditta %ld (%s)",
 | 
						|
                         codditta, (const char*) ndir);
 | 
						|
  if (!fexist(s1))
 | 
						|
    if (!fcopy(ntrrec, s1))
 | 
						|
      return error_box("Impossibile copiare il file %s della ditta %ld",
 | 
						|
                       ntrrec, codditta);
 | 
						|
  if (!fexist(s2))
 | 
						|
    if (!fcopy(nd, s2))
 | 
						|
      return error_box("Impossibile copiare il file %s della ditta %ld",
 | 
						|
                       nd, codditta);
 | 
						|
 | 
						|
  set_cursor(TASK_WIN, CURSOR_WAIT);
 | 
						|
  const long old_firm = get_firm();
 | 
						|
  TDir dir, dir1;
 | 
						|
  TTrec rec;
 | 
						|
 | 
						|
  prefhndl->set("");
 | 
						|
  dir1.get(LF_DIR, _nolock, _nordir, _sysdirop);
 | 
						|
  const long    maxeod0 = dir1.eod();
 | 
						|
 | 
						|
  prefhndl->set_codditta(codditta);
 | 
						|
  dir.get(LF_DIR, _nolock, _nordir, _sysdirop);
 | 
						|
  if (dir.eod() == 0)
 | 
						|
  {
 | 
						|
    dir1.eod() = 1L;
 | 
						|
    dir1.put(LF_DIR, _nordir, _sysdirop);
 | 
						|
    dir.get(LF_DIR, _nolock, _nordir, _sysdirop);
 | 
						|
  }
 | 
						|
  const long    maxeod1 = dir.eod();
 | 
						|
 | 
						|
  if (maxeod0 > maxeod1)
 | 
						|
  {
 | 
						|
    dir.get(LF_DIR, _nolock, _nordir, _sysdirop);
 | 
						|
    dir.eod() = maxeod0;
 | 
						|
    dir.put(LF_DIR, _nordir, _sysdirop);
 | 
						|
    rec.zero();
 | 
						|
  }
 | 
						|
  for (int i = LF_DIR + 1; i <= maxeod0; i++)
 | 
						|
  {
 | 
						|
    dir.get(i, _nolock, _nordir, _sysdirop);
 | 
						|
    if (dir.eod() == 0L && dir.eox() == 0L)
 | 
						|
    {
 | 
						|
      prefhndl->set("");
 | 
						|
      dir.get(i, _nolock, _nordir, _sysdirop);
 | 
						|
      rec.get(i);
 | 
						|
      prefhndl->set_codditta(codditta);
 | 
						|
      const char* name = dir.name();
 | 
						|
      dir.flags() = 0L;
 | 
						|
      const bool valid_file = *name && dir.len() > 0;
 | 
						|
      const bool create_now = flagcom ? *name == '%' : *name != '%';
 | 
						|
      if (valid_file && create_now)
 | 
						|
      {
 | 
						|
        dir.put(i, _nordir, _sysdirop);
 | 
						|
        rec.put(i);
 | 
						|
        TSystemisamfile f(i);
 | 
						|
 | 
						|
        f.build(30); // cambiare
 | 
						|
        BA4300_application& app = (BA4300_application&) main_app();
 | 
						|
        for (int j = 0 ; j < 99 ; j++)
 | 
						|
        {
 | 
						|
          if (app.has_module(j))
 | 
						|
          {
 | 
						|
            const TString s(format("std/f%04d%02d.txt", i, j));
 | 
						|
            if (fexist(s)) f.load(s);
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
      else
 | 
						|
      {
 | 
						|
        if (!flagcom)
 | 
						|
        {
 | 
						|
          dir.len() = 0;
 | 
						|
          rec.zero();
 | 
						|
        }
 | 
						|
        dir.put(i, _nordir, _sysdirop);
 | 
						|
        rec.put(i);
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  set_firm(old_firm);
 | 
						|
  set_cursor(TASK_WIN, CURSOR_ARROW);
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
BA4300_application::BA4300_application()
 | 
						|
{}
 | 
						|
 | 
						|
 | 
						|
bool BA4300_application::user_create() // initvar e arrmask
 | 
						|
{
 | 
						|
  _msk = new TMask("ba4300a") ;
 | 
						|
  _msk->set_handler(ba4300_handler);
 | 
						|
  _rel = new TRelation(LF_NDITTE);
 | 
						|
  _anag = new TLocalisamfile(LF_ANAG);
 | 
						|
  _unloc = new TLocalisamfile(LF_UNLOC);
 | 
						|
  _attiv = new TLocalisamfile(LF_ATTIV);
 | 
						|
  _tabcom = new TLocalisamfile(LF_TABCOM);
 | 
						|
  set_search_field(FLD_GD1_CODDITTA);
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
bool BA4300_application::user_destroy() // releasev e arrmask
 | 
						|
{
 | 
						|
  delete  _msk;
 | 
						|
  delete _rel;
 | 
						|
  delete _anag;
 | 
						|
  delete _unloc;
 | 
						|
  delete _attiv;
 | 
						|
  delete _tabcom;
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int BA4300_application::write(const TMask& m)
 | 
						|
{
 | 
						|
  _rel->zero();
 | 
						|
  m.autosave();
 | 
						|
  _rel->write();
 | 
						|
  if (_rel->bad())
 | 
						|
    return _rel->status();
 | 
						|
 | 
						|
  TRectype& ditte=_rel->curr();
 | 
						|
 | 
						|
  TString codditta(ditte.get(CODDITTA)) ;
 | 
						|
 | 
						|
  _attiv->zero() ;
 | 
						|
  _attiv->put(CODDITTA, (const char*) codditta) ;
 | 
						|
  _attiv->put(CODATT, ditte.get(CODATTPREV)) ;
 | 
						|
 | 
						|
  TTable* tabatt = new TTable(TABATT);
 | 
						|
  tabatt->zero();
 | 
						|
  tabatt->put(CODTAB, ditte.get(CODATTPREV)) ;
 | 
						|
  tabatt->read();
 | 
						|
  if (tabatt->good()) _attiv->put(DESCR, tabatt->curr().get(S0)) ;
 | 
						|
  delete tabatt;
 | 
						|
 | 
						|
  _attiv->write();
 | 
						|
 | 
						|
  _anag->zero() ;
 | 
						|
  _anag->put(TIPOA, ditte.get(TIPOA));
 | 
						|
  _anag->put(CODANAGR, ditte.get(CODANAGR));
 | 
						|
  _anag->read();
 | 
						|
  if (_anag->good())
 | 
						|
  {
 | 
						|
    _unloc->zero() ;
 | 
						|
    _unloc->put(CODDITTA, (const char*) codditta) ;
 | 
						|
    _unloc->put(CODULC, (int) 1) ;
 | 
						|
    TString s(_anag->get(COMRF));
 | 
						|
    if (s.empty())
 | 
						|
    {
 | 
						|
      _unloc->put(COMULC, _anag->get(COMRES));
 | 
						|
      _unloc->put(INDULC, _anag->get(INDRES));
 | 
						|
      _unloc->put(CIVULC, _anag->get(CIVRES));
 | 
						|
      _unloc->put(CAPULC, _anag->get(CAPRES));
 | 
						|
      _unloc->put(COMCCIAA, _anag->get(COMRES));
 | 
						|
      _unloc->put(COMTRIB, _anag->get(COMRES));
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
      _unloc->put(COMULC, (const char*) s);
 | 
						|
      _unloc->put(INDULC, _anag->get(INDRF));
 | 
						|
      _unloc->put(CIVULC, _anag->get(CIVRF));
 | 
						|
      _unloc->put(CAPULC, _anag->get(CAPRF));
 | 
						|
      _unloc->put(COMCCIAA, (const char*) s);
 | 
						|
      _unloc->put(COMTRIB, (const char*) s);
 | 
						|
    }
 | 
						|
    _unloc->write();
 | 
						|
  }
 | 
						|
  build_firm_data(atol(codditta), FALSE);
 | 
						|
  return NOERR;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void BA4300_application::init_query_mode(TMask& m)
 | 
						|
{
 | 
						|
  if (filtered())
 | 
						|
  {
 | 
						|
    m.show(FLD_GD1_CODDITTAH);
 | 
						|
    m.hide(FLD_GD1_CODDITTA);
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    m.show(FLD_GD1_CODDITTA);
 | 
						|
    m.hide(FLD_GD1_CODDITTAH);
 | 
						|
  }
 | 
						|
  init_insert_mode(m);
 | 
						|
}
 | 
						|
 | 
						|
void BA4300_application::init_insert_mode(TMask& m)
 | 
						|
{
 | 
						|
  if (!filtered())
 | 
						|
  {
 | 
						|
    m.enable(FLD_GD1_TIPOA);
 | 
						|
    m.enable(FLD_GD1_CODANAGR);
 | 
						|
    m.enable(FLD_GD1_CODANAGR_ANAGR_RAGSOC);
 | 
						|
    m.show(FLD_GD1_CODDITTA);
 | 
						|
    m.hide(FLD_GD1_CODDITTAH);
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    m.show(FLD_GD1_CODDITTAH);
 | 
						|
    m.hide(FLD_GD1_CODDITTA);
 | 
						|
  }
 | 
						|
  m.disable(DLG_ATT);
 | 
						|
  m.disable(DLG_ULC);
 | 
						|
  m.disable(DLG_SOC);
 | 
						|
  m.disable(DLG_REG);
 | 
						|
}
 | 
						|
 | 
						|
void BA4300_application::init_modify_mode(TMask& m)
 | 
						|
{
 | 
						|
  m.disable(FLD_GD1_TIPOA);
 | 
						|
  m.disable(FLD_GD1_CODANAGR);
 | 
						|
  m.disable(FLD_GD1_CODANAGR_ANAGR_RAGSOC);
 | 
						|
  if (filtered())
 | 
						|
  {
 | 
						|
    m.show(FLD_GD1_CODDITTAH);
 | 
						|
    m.hide(FLD_GD1_CODDITTA);
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    m.show(FLD_GD1_CODDITTA);
 | 
						|
    m.hide(FLD_GD1_CODDITTAH);
 | 
						|
  }
 | 
						|
  m.enable(DLG_ATT);
 | 
						|
  m.enable(DLG_ULC);
 | 
						|
  m.enable(DLG_SOC);
 | 
						|
  m.enable(DLG_REG);
 | 
						|
}
 | 
						|
 | 
						|
int ba4300(int argc, char* argv[])
 | 
						|
{
 | 
						|
  BA4300_application a ;
 | 
						|
  a.run(argc, argv, "Anagrafica Ditte");
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 |