From 53a4d0abbf562f9151060b97857e14f635b8bda1 Mon Sep 17 00:00:00 2001
From: guy <guy@c028cbd2-c16b-5b4b-a496-9718f37d4682>
Date: Wed, 21 Sep 1994 11:18:23 +0000
Subject: [PATCH] Modificato MainApp in main_app e aggiornati i vari
 TRelation::lfile()

git-svn-id: svn://10.65.10.50/trunk@273 c028cbd2-c16b-5b4b-a496-9718f37d4682
---
 ba/ba1102.cpp   |  392 +++++-----
 ba/ba3100.cpp   |  304 ++++----
 ba/ba3200.cpp   |  671 +++++++++--------
 ba/ba3300.cpp   |  578 +++++++--------
 ba/ba3500.cpp   |  113 +--
 ba/ba3700.cpp   | 1880 +++++++++++++++++++++++------------------------
 ba/ba4200.cpp   | 1006 ++++++++++++-------------
 ba/ba4300.cpp   |  847 +++++++++++----------
 ba/ba6100.cpp   | 1131 ++++++++++++++--------------
 ba/ba6101.cpp   | 1700 +++++++++++++++++++++---------------------
 ba/ba6200.cpp   |  571 +++++++-------
 ba/bast%ivd.uml |  243 +++---
 ba/prassi.mnu   |  262 +++----
 13 files changed, 4852 insertions(+), 4846 deletions(-)

diff --git a/ba/ba1102.cpp b/ba/ba1102.cpp
index cf12eb466..c09f126fb 100755
--- a/ba/ba1102.cpp
+++ b/ba/ba1102.cpp
@@ -1,196 +1,196 @@
-#include <relation.h>
-#include <mask.h>
-#include <sheet.h>
-#include <progind.h>
-#include <defmask.h>
-
-#include "ba1100.h"
-
-
-
-bool TEdit_file::browse(int logicnum, const char* name)
-{
-  TRelation relation(logicnum);
-  TCursor cursor(&relation);
-  TRectype& curr = cursor.curr();
-  TRectype svrec(cursor.curr());
-  
-  TToken_string head(256);
-  TToken_string trac(256);
-  
-  const char* n;
-  trac.add("");
-  head.add("@1");
-
-  for(int i = 0; (n = curr.fieldname(i)) != NULL; i++)
-  {
-    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);
-
-  while ((ch = sheet.run()) != K_ESC)
-  {
-    if (ch == K_DEL && sheet.one_checked())
-    {
-      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; 
-
-          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
-    TString16 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, "", -12, -1, 9, 2);
-      m.add_button(DLG_CANCEL, curpage, "", -22, -1, 9, 2);
-      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;
-}
-
-
-
+#include <relation.h>
+#include <mask.h>
+#include <sheet.h>
+#include <progind.h>
+#include <defmask.h>
+
+#include "ba1100.h"
+
+
+
+bool TEdit_file::browse(int logicnum, const char* name)
+{
+  TRelation relation(logicnum);
+  TCursor cursor(&relation);
+  TRectype& curr = cursor.curr();
+  TRectype svrec(cursor.curr());
+  
+  TToken_string head(256);
+  TToken_string trac(256);
+  
+  const char* n;
+  trac.add("");
+  head.add("@1");
+
+  for(int i = 0; (n = curr.fieldname(i)) != NULL; i++)
+  {
+    trac.add(n);
+    head.add(n);
+    
+    int len = curr.length(n);
+    if (curr.type(n) == _datefld) len = 10;
+    if (len > (int)strlen(n)) head << '@' << len;
+  }
+  
+  KEY ch;
+  TCursor_sheet sheet(&cursor, trac, name, head, 6);
+
+  while ((ch = sheet.run()) != K_ESC)
+  {
+    if (ch == K_DEL && sheet.one_checked())
+    {
+      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; 
+
+          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
+    TString16 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, "", -12, -1, 9, 2);
+      m.add_button(DLG_CANCEL, curpage, "", -22, -1, 9, 2);
+      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;
+}
+
+
+
diff --git a/ba/ba3100.cpp b/ba/ba3100.cpp
index 916a1fc96..c0632a5d1 100755
--- a/ba/ba3100.cpp
+++ b/ba/ba3100.cpp
@@ -1,152 +1,152 @@
-#include <relapp.h>
-#include <stdtypes.h>
-#include <lffiles.h>
-#include <tabutil.h>
-#include <execp.h>
-#include <utility.h>
-#include "ba3.h"
-#include "ba3100.h"
-#include "batbreg.h"
-
-#define FPC "FPC"
-#define REG_JOURNAL 5
-
-class BA3100_application : public TRelation_application
-{
-  TMask* _msk;
-  TRelation* _rel;
-  TString _tabname;
-  long _oldditta;
-  int  _oldanno;
-  bool _exist_journal;
-
-  bool user_create() ;                         
-  bool user_destroy() ;                        
-  virtual bool protected_record(TRectype& rec);
-  virtual TMask* get_mask( int mode) { return _msk;}
-  virtual bool changing_mask( int mode) { return FALSE;}
-  virtual TRelation* get_relation() const { return _rel;}
-  virtual void  init_query_mode(TMask& m);
-  virtual void  init_insert_mode(TMask& m);
-  virtual void  init_modify_mode(TMask& m);
-
-public:
-  BA3100_application(const char* tabname) : _tabname(tabname) , _oldditta(-1), _oldanno(-1), _exist_journal(FALSE) {}
-  virtual ~BA3100_application() {}
-  bool exist_journal() {return _exist_journal;}
-  void print();
-};
-
-void BA3100_application::print()
-{
-#if XVT_OS == XVT_OS_WIN
-  TExternal_app stampa(format("ba3a -1 %s", (const char *) _tabname));
-#else
-  TExternal_app stampa(format("ba3 -1 %s", (const char *) _tabname));
-#endif
-  stampa.run();
-}
-
-void BA3100_application::init_query_mode(TMask& m) 
-
-{
-  m.send_key(K_SHIFT + K_CTRL + 'e', -GR_MODIFY_PROTECTED);
-  m.send_key(K_SHIFT + K_CTRL + 'e', -GR_RECORD_PROTECTED);
-}
-
-void BA3100_application::init_insert_mode(TMask& m) 
-
-{
-  if (_tabname != "REG") return;
-
-  long ditta = get_firm();
-  int anno = atoi(m.get(F_ANNO));
-
-  if (ditta != _oldditta || anno != _oldanno)
-  {
-    _oldditta = ditta;
-    _oldanno = anno;
-
-    TTable reg(_tabname);
-    
-    reg.zero();
-    reg.put("CODTAB", m.get(F_ANNO));
-
-    TRectype to(reg.curr());
-    _exist_journal = FALSE;
-
-    for (reg.read(_isgteq); !_exist_journal && reg.good() && reg.curr() <= to; reg.next())
-      _exist_journal = (reg.get_long("I0") == REG_JOURNAL);
-  }
-}
-
-void BA3100_application::init_modify_mode(TMask& m) 
-
-{
-  m.send_key(K_SHIFT + K_CTRL + 'd', -GR_MODIFY_PROTECTED);
-  const bool enable = !(_rel->curr().get_bool(FPC));
-
-  m.send_key(K_SHIFT + K_CTRL + 'd' + enable, -GR_RECORD_PROTECTED);
-}
-
-bool BA3100_application::protected_record(TRectype& rec) 
-{ 
-  bool prot = rec.get_bool(FPC);
-  if (!prot)
-  {
-    if (_tabname == "%IVD")      // Impedisce la cancellazione di una classe se ha sottoclassi
-    {                                
-      const TRecnotype pos = _rel->lfile()->recno();
-      const TString cod(rec.get("CODTAB"));
-      const int err = _rel->lfile()->next();
-      if (err == NOERR)
-      {
-        TString next(_rel->lfile()->get("CODTAB")); next.cut(cod.len());
-        prot = cod == next;
-      }  
-      _rel->lfile()->readat(pos);
-    }
-  }
-  return prot;
-}
-
-
-HIDDEN bool tiporeg_handler(TMask_field& f, KEY k)
-
-{
-  if ((k == K_TAB || k == K_ENTER) &&
-      ((BA3100_application*) MainApp())->exist_journal() &&
-      atoi(f.get()) == REG_JOURNAL)
-    return error_box("Non e' possibile avere due registri giornale nello stesso anno");
-  return TRUE;
-}
-bool BA3100_application::user_create()
-{
-  _tabname.upper();
-  TString m(16); m << "BATB" << _tabname;
-  _msk = new TMask(m) ;
-  for (int i = 0; i < _msk->fields(); i++)
-    if (_msk->fld(i).in_group(GR_SEARCH))
-    {
-      set_search_field(_msk->fld(i).dlg());
-      break;
-    }
-  _rel = new TRelation(_tabname);
-  set_title(_msk->get_caption());
-  if (_tabname == "REG") _msk->set_handler(F_TIPO, tiporeg_handler);
-  return TRUE;
-}
-
-bool BA3100_application::user_destroy() 
-{
-  delete  _msk;
-  delete  _rel;
-  return TRUE;
-}
-
-int ba3100(int argc, char* argv[])
-{
-  BA3100_application a(argv[2]) ;
-  a.run(argc, argv, "Tabella");
-  return 0;
-}
+#include <relapp.h>
+#include <stdtypes.h>
+#include <tabutil.h>
+#include <execp.h>
+#include <utility.h>
+
+#include "ba3.h"
+#include "ba3100.h"
+#include "batbreg.h"
+
+#define FPC "FPC"
+#define REG_JOURNAL 5
+
+class BA3100_application : public TRelation_application
+{
+  TMask* _msk;
+  TRelation* _rel;
+  TString _tabname;
+  long _oldditta;
+  int  _oldanno;
+  bool _exist_journal;
+
+  bool user_create() ;                         
+  bool user_destroy() ;                        
+  virtual bool protected_record(const TRectype& rec);
+  virtual TMask* get_mask( int mode) { return _msk;}
+  virtual bool changing_mask( int mode) { return FALSE;}
+  virtual TRelation* get_relation() const { return _rel;}
+  virtual void  init_query_mode(TMask& m);
+  virtual void  init_insert_mode(TMask& m);
+  virtual void  init_modify_mode(TMask& m);
+
+public:
+  BA3100_application(const char* tabname) : _tabname(tabname) , _oldditta(-1), _oldanno(-1), _exist_journal(FALSE) {}
+  virtual ~BA3100_application() {}
+  bool exist_journal() {return _exist_journal;}
+  void print();
+};
+
+void BA3100_application::print()
+{
+#if XVT_OS == XVT_OS_WIN
+  TExternal_app stampa(format("ba3a -1 %s", (const char *) _tabname));
+#else
+  TExternal_app stampa(format("ba3 -1 %s", (const char *) _tabname));
+#endif
+  stampa.run();
+}
+
+void BA3100_application::init_query_mode(TMask& m) 
+
+{
+  m.send_key(K_SHIFT + K_CTRL + 'e', -GR_MODIFY_PROTECTED);
+  m.send_key(K_SHIFT + K_CTRL + 'e', -GR_RECORD_PROTECTED);
+}
+
+void BA3100_application::init_insert_mode(TMask& m) 
+
+{
+  if (_tabname != "REG") return;
+
+  long ditta = get_firm();
+  int anno = atoi(m.get(F_ANNO));
+
+  if (ditta != _oldditta || anno != _oldanno)
+  {
+    _oldditta = ditta;
+    _oldanno = anno;
+
+    TTable reg(_tabname);
+    
+    reg.zero();
+    reg.put("CODTAB", m.get(F_ANNO));
+
+    TRectype to(reg.curr());
+    _exist_journal = FALSE;
+
+    for (reg.read(_isgteq); !_exist_journal && reg.good() && reg.curr() <= to; reg.next())
+      _exist_journal = (reg.get_long("I0") == REG_JOURNAL);
+  }
+}
+
+void BA3100_application::init_modify_mode(TMask& m) 
+
+{
+  m.send_key(K_SHIFT + K_CTRL + 'd', -GR_MODIFY_PROTECTED);
+  const bool enable = !(_rel->curr().get_bool(FPC));
+
+  m.send_key(K_SHIFT + K_CTRL + 'd' + enable, -GR_RECORD_PROTECTED);
+}
+
+bool BA3100_application::protected_record(const TRectype& rec) 
+{ 
+  bool prot = rec.get_bool(FPC);
+  if (!prot)
+  {
+    if (_tabname == "%IVD")      // Impedisce la cancellazione di una classe se ha sottoclassi
+    {                                
+      const TRecnotype pos = _rel->lfile().recno();
+      const TString cod(rec.get("CODTAB"));
+      const int err = _rel->lfile().next();
+      if (err == NOERR)
+      {
+        TString next(_rel->lfile().get("CODTAB")); next.cut(cod.len());
+        prot = cod == next;
+      }  
+      _rel->lfile().readat(pos);
+    }
+  }
+  return prot;
+}
+
+
+HIDDEN bool tiporeg_handler(TMask_field& f, KEY k)
+
+{
+  if ((k == K_TAB || k == K_ENTER) &&
+      ((BA3100_application*) MainApp())->exist_journal() &&
+      atoi(f.get()) == REG_JOURNAL)
+    return error_box("Non e' possibile avere due registri giornale nello stesso anno");
+  return TRUE;
+}
+bool BA3100_application::user_create()
+{
+  _tabname.upper();
+  TString m(16); m << "BATB" << _tabname;
+  _msk = new TMask(m) ;
+  for (int i = 0; i < _msk->fields(); i++)
+    if (_msk->fld(i).in_group(GR_SEARCH))
+    {
+      set_search_field(_msk->fld(i).dlg());
+      break;
+    }
+  _rel = new TRelation(_tabname);
+  set_title(_msk->get_caption());
+  if (_tabname == "REG") _msk->set_handler(F_TIPO, tiporeg_handler);
+  return TRUE;
+}
+
+bool BA3100_application::user_destroy() 
+{
+  delete  _msk;
+  delete  _rel;
+  return TRUE;
+}
+
+int ba3100(int argc, char* argv[])
+{
+  BA3100_application a(argv[2]) ;
+  a.run(argc, argv, "Tabella");
+  return 0;
+}
diff --git a/ba/ba3200.cpp b/ba/ba3200.cpp
index e744332cc..eb2597cc2 100755
--- a/ba/ba3200.cpp
+++ b/ba/ba3200.cpp
@@ -1,337 +1,334 @@
-// ba3200       Stampa tabelle
-//
-// legge un file con estensione .rpt che descrive la stampa.
-// Vedi file leggimi.txt per il formato del file
-//
-
-#include <mask.h>
-#include <printapp.h>
-#include <relation.h>
-#include <tabutil.h>
-#include <utility.h>
-
-#include "ba3.h"
-#include "ba3200.h"
-
-#define FOOTER_LEN 4  // se non ridefinito nel .rpt
-
-class BA3200_application : public TPrintapp
-{
-  TString       _tabname;
-  TFilename     _rptname;
-  TRelation*    _rel;
-  TCursor      *_cur;
-  TMask*        _msk;
-  TString       _maskname;
-  int           _logicnum;
-  TArray        _string_roman; 
-  TArray        _field_roman; 
-
-public:
-
-  virtual void user_create() ;
-  virtual void user_destroy() ;
-  virtual bool set_print(int) ;
-
-  virtual void set_page(int, int);
-  virtual bool preprocess_page (int, int);
-
-  void leggi_rpt();
-  void set_headers();
-  void set_rows();
-  void set_footers();
-  void set_translations();
-  void set_relations();
-  BA3200_application(const char * tabname) : _tabname(tabname) {}
-  virtual ~BA3200_application() {}
-};
-
-
-bool BA3200_application::set_print(int)
-{
-  TRectype from(_rel->lfile()->curr()); from.zero();
-  TRectype to  (from);
-  
-  if (_msk->run() == K_ENTER)
-  {
-    const int campi_maschera = _msk->fields(); 
-    for (int i = 0; i < campi_maschera; i++)
-    {
-      const TMask_field& campo_maschera = _msk->fld(i);
-      const char* val = campo_maschera.get();
-      if (*val)
-      {
-        const TFieldref* campo_ref = campo_maschera.field();  
-
-        if (campo_ref != NULL && campo_ref->ok())
-        {
-          if (campo_maschera.in_group(1)) campo_ref->write(val, from);
-          else
-            if (campo_maschera.in_group(2)) campo_ref->write(val, to);
-        }  
-      }
-    }
-
-    _cur->setregion (from, to);
-    return TRUE;
-  }
-  return FALSE;  
-}
-
-void BA3200_application::set_page (int , int )
-{
-  _string_roman.destroy();
-  _field_roman.destroy();
-  leggi_rpt();
-}
-
-bool BA3200_application::preprocess_page(int , int)
-{
-  const int items = _field_roman.items();
-
-  if (items > 0)
-  {
-    for (int i = 0; i < items; i++)
-    {
-      TString& fn  = (TString &) _field_roman[i];
-      TFieldref fld(fn, 0);
-      TString& s = (TString &) _string_roman[i];
-      
-      const int n = atoi(fld.read(_rel));
-      s = itor(n);
-    }
-  }
-  return TRUE;
-}
-
-void BA3200_application::set_headers()
-{
-  TString        NomeTabella, sep, formato_intesta, testo_intesta;
-  int            LungRiga, riga_intesta=0, last_riga=1;
-  TToken_string  line;
-
-  reset_header ();
-
-  TScanner rpt(_rptname);
-  rpt.paragraph("Headers");
-
-  // Leggo la lunghezza della riga (usata per centrare l'intestazione)
-  line = rpt.line();
-  LungRiga    = line.get_int();
-
-  // Leggo il nome della tabella
-  line = rpt.line();
-  NomeTabella = line.get();
-
-  // Centro il nome della tabella e aggiungo il numero di pagina
-  NomeTabella.center_just (LungRiga);
-  NomeTabella.overwrite ("Pag. @#", NomeTabella.len()-8);
-  set_header (last_riga, "%s", (const char *)NomeTabella);
-  last_riga++;
-
-  // Aggiungo una riga vuota per separare prima intestazione
-  sep.fill ('-', LungRiga);
-  set_header (last_riga, "%s", (const char *)sep);
-
-  line = rpt.line();
-  while ( (line != "") && (line[0] != '[') )
-  {
-    riga_intesta    = atoi (line.get());        
-    formato_intesta = line.get();
-    testo_intesta   = (const char *) line.get();
-    if (riga_intesta)
-      set_header (last_riga+riga_intesta, (const char *)formato_intesta, 
-                  (const char *)testo_intesta);
-    line = rpt.line();
-  }
-
-  if (riga_intesta) last_riga += riga_intesta;
-  last_riga++;
-  set_header (last_riga, (const char *)sep);
-  last_riga++;
-  sep.fill(' ');
-  set_header (last_riga, (const char *)sep); 
-}
-
-void BA3200_application::set_rows()
-{
-  TToken_string  line;
-  TFieldref     campo;
-  int           from, to, riga_record;
-  TString       formato_campo, picture;
-  const char *          name;
-
-  TScanner rpt(_rptname);
-  rpt.paragraph("Rows");
-
-  line = rpt.line();
-  while ( (line != "") && (line[0] != '[') )
-  {
-    riga_record = line.get_int();
-
-    TString s(line.get());
-
-    campo = s;
-    from = campo.from();
-    to = campo.to();
-    name = campo.name();
-    int logicnum = campo.file() == 0 ? _logicnum : campo.file();
-
-    formato_campo = line.get();
-    formato_campo.trim();
-    formato_campo.lower();
-    const int p = formato_campo.find("@m");
-    
-    if (p != -1)
-    {
-      formato_campo.cut(p);
-      formato_campo << "#t";
-      _string_roman.add(new TString);
-      _field_roman.add(s);
-      const int last = _string_roman.items() - 1;
-
-      set_row (riga_record, formato_campo, _string_roman.objptr(last));
-    }
-    else
-    {
-      if (formato_campo.find("@pn"))
-        picture = line.get();
-      else
-        picture = "";
-      
-      if (to == -1)
-        if (picture != "")
-          set_row (riga_record, formato_campo, FLD(logicnum,name,picture) );
-        else
-          set_row (riga_record, formato_campo, FLD(logicnum,name) );
-      else
-        set_row (riga_record, formato_campo, FLD(logicnum,name,from,to) );
-    }
-
-    line = (const char *) rpt.line();
-  }
-}
-
-void BA3200_application::set_footers()
-{
-  TToken_string line;
-  int     footer_len, riga;
-  TString formato, testo;
-
-  reset_footer();
-
-  TScanner rpt(_rptname);
-  rpt.paragraph("Footers");
-
-  line = rpt.line();
-  footer_len = line.get_int(); 
-  if (footer_len) printer().footerlen (footer_len);
-
-  line = rpt.line();
-  while ( (line != "") && (line[0] != '[') )
-  {
-    riga = line.get_int();
-    formato = line.get();
-    testo   = line.get();
-    set_footer (riga, (const char *)formato, (const char*)testo);
-    line = rpt.line();
-  }
-}
-
-void BA3200_application::set_translations()
-{
-  TString campo, from, to;
-  TToken_string line;
-  int   logicnum;
-
-  TScanner rpt(_rptname);
-  rpt.paragraph("Translations");
-
-  line = rpt.line();
-  while ( (line != "") && (line[0] != '[') )
-  {
-    logicnum = line.get_int();
-    campo    = line.get();
-    from     = line.get();
-    to       = line.get();
-    set_translation (logicnum, (char*)(const char *)campo, (char*)(const char *)from, (char*)(const char *)to);
-    line = rpt.line();
-  }
-}
-
-void BA3200_application::set_relations()
-{
-  TToken_string line("", ',');
-  TString tab(16), expr(40);
-  int key, linkto, alias, logicnum;
-
-  TScanner rpt(_rptname);
-  rpt.paragraph("Relations");
-
-  line = rpt.line();
-  while ( (line != "") && (line[0] != '[') )
-  {
-    tab = line.get();
-    logicnum = atoi(tab);
-    expr = line.get();
-    key = line.get_int();
-    if (key == 0) key = 1;
-    linkto = line.get_int();
-    alias = line.get_int();
-    if (logicnum > 0)
-      _rel->add(logicnum, expr, key, linkto, alias);
-    else
-      _rel->add(tab, expr, key, linkto, alias);
-    
-    line = rpt.line();
-  }
-}
-void BA3200_application::leggi_rpt()
-{
-  set_rows();
-}
-
-void BA3200_application::user_create()
-{
-  _rptname  << "batb" << _tabname << ".rpt" ;
-  if (!fexist(_rptname)) 
-    fatal_box("Impossibile aprire il file '%s'", (const char*)_rptname);
-
-
-  //  _tab = new TTable (_tabname);
-  _rel = new TRelation (_tabname);
-  _cur = new TCursor (_rel);
-
-  _maskname << "bast" << _tabname;
-  _msk = new TMask (_maskname) ;
-
-  add_cursor (_cur);
-  add_file (_tabname);
-
-  _logicnum = _cur->file()->num();
-
-  reset_print ();
-
-  printer().footerlen (FOOTER_LEN);
-  for (int i=1; i <= FOOTER_LEN; i++) set_footer(i, "%s", "  ");
-
-  set_headers();
-  set_footers();
-  set_translations();
-  set_relations();
-}
-
-void BA3200_application::user_destroy() 
-{
-  delete _msk;
-  delete _cur;
-  delete _rel;
-  //  delete _tab;
-}
-
-int ba3200(int argc, char* argv[])
-{
-  BA3200_application a(argv[2]) ;
-  a.run(argc, argv, "Stampa tabella");
-  return 0;
-}
+// ba3200       Stampa tabelle
+//
+// legge un file con estensione .rpt che descrive la stampa.
+// Vedi file leggimi.txt per il formato del file
+//
+
+#include <mask.h>
+#include <printapp.h>
+#include <relation.h>
+#include <tabutil.h>
+#include <utility.h>
+
+#include "ba3.h"
+#include "ba3200.h"
+
+#define FOOTER_LEN 4  // se non ridefinito nel .rpt
+
+class BA3200_application : public TPrintapp
+{
+  TString       _tabname;
+  TFilename     _rptname;
+  TRelation*    _rel;
+  TCursor      *_cur;
+  TMask*        _msk;
+  TString       _maskname;
+  int           _logicnum;
+  TArray        _string_roman; 
+  TArray        _field_roman; 
+
+public:
+
+  virtual void user_create() ;
+  virtual void user_destroy() ;
+  virtual bool set_print(int) ;
+
+  virtual void set_page(int, int);
+  virtual bool preprocess_page (int, int);
+
+  void leggi_rpt();
+  void set_headers();
+  void set_rows();
+  void set_footers();
+  void set_translations();
+  void set_relations();
+  BA3200_application(const char * tabname) : _tabname(tabname) {}
+  virtual ~BA3200_application() {}
+};
+
+
+bool BA3200_application::set_print(int)
+{
+  TRectype from(_rel->lfile().curr()); from.zero();
+  TRectype to  (from);
+  
+  if (_msk->run() == K_ENTER)
+  {
+    const int campi_maschera = _msk->fields(); 
+    for (int i = 0; i < campi_maschera; i++)
+    {
+      const TMask_field& campo_maschera = _msk->fld(i);
+      const char* val = campo_maschera.get();
+      if (*val)
+      {
+        const TFieldref* campo_ref = campo_maschera.field();  
+
+        if (campo_ref != NULL && campo_ref->ok())
+        {
+          if (campo_maschera.in_group(1)) campo_ref->write(val, from);
+          else
+            if (campo_maschera.in_group(2)) campo_ref->write(val, to);
+        }  
+      }
+    }
+
+    _cur->setregion (from, to);
+    return TRUE;
+  }
+  return FALSE;  
+}
+
+void BA3200_application::set_page (int , int )
+{
+  _string_roman.destroy();
+  _field_roman.destroy();
+  leggi_rpt();
+}
+
+bool BA3200_application::preprocess_page(int , int)
+{
+  const int items = _field_roman.items();
+
+  if (items > 0)
+  {
+    for (int i = 0; i < items; i++)
+    {
+      TString& fn  = (TString &) _field_roman[i];
+      TFieldref fld(fn, 0);
+      TString& s = (TString &) _string_roman[i];
+      
+      const int n = atoi(fld.read(_rel));
+      s = itor(n);
+    }
+  }
+  return TRUE;
+}
+
+void BA3200_application::set_headers()
+{
+  TString        NomeTabella, sep, formato_intesta, testo_intesta;
+  int            LungRiga, riga_intesta=0, last_riga=1;
+  TToken_string  line;
+
+  reset_header ();
+
+  TScanner rpt(_rptname);
+  rpt.paragraph("Headers");
+
+  // Leggo la lunghezza della riga (usata per centrare l'intestazione)
+  line = rpt.line();
+  LungRiga    = line.get_int();
+
+  // Leggo il nome della tabella
+  line = rpt.line();
+  NomeTabella = line.get();
+
+  // Centro il nome della tabella e aggiungo il numero di pagina
+  NomeTabella.center_just (LungRiga);
+  NomeTabella.overwrite ("Pag. @#", NomeTabella.len()-8);
+  set_header (last_riga, "%s", (const char *)NomeTabella);
+  last_riga++;
+
+  // Aggiungo una riga vuota per separare prima intestazione
+  sep.fill ('-', LungRiga);
+  set_header (last_riga, "%s", (const char *)sep);
+
+  line = rpt.line();
+  while ( (line != "") && (line[0] != '[') )
+  {
+    riga_intesta    = atoi (line.get());        
+    formato_intesta = line.get();
+    testo_intesta   = (const char *) line.get();
+    if (riga_intesta)
+      set_header (last_riga+riga_intesta, (const char *)formato_intesta, 
+                  (const char *)testo_intesta);
+    line = rpt.line();
+  }
+
+  if (riga_intesta) last_riga += riga_intesta;
+  last_riga++;
+  set_header (last_riga, (const char *)sep);
+  last_riga++;
+  sep.fill(' ');
+  set_header (last_riga, (const char *)sep); 
+}
+
+void BA3200_application::set_rows()
+{
+  TToken_string  line;
+  TFieldref     campo;
+  int           from, to, riga_record;
+  TString       formato_campo, picture;
+  const char *          name;
+
+  TScanner rpt(_rptname);
+  rpt.paragraph("Rows");
+
+  line = rpt.line();
+  while ( (line != "") && (line[0] != '[') )
+  {
+    riga_record = line.get_int();
+
+    TString s(line.get());
+
+    campo = s;
+    from = campo.from();
+    to = campo.to();
+    name = campo.name();
+    int logicnum = campo.file() == 0 ? _logicnum : campo.file();
+
+    formato_campo = line.get();
+    formato_campo.trim();
+    formato_campo.lower();
+    const int p = formato_campo.find("@m");
+    
+    if (p != -1)
+    {
+      formato_campo.cut(p);
+      formato_campo << "#t";
+      _string_roman.add(new TString);
+      _field_roman.add(s);
+      const int last = _string_roman.items() - 1;
+
+      set_row (riga_record, formato_campo, _string_roman.objptr(last));
+    }
+    else
+    {
+      if (formato_campo.find("@pn"))
+        picture = line.get();
+      else
+        picture = "";
+      
+      if (to == -1)
+        if (picture != "")
+          set_row (riga_record, formato_campo, FLD(logicnum,name,picture) );
+        else
+          set_row (riga_record, formato_campo, FLD(logicnum,name) );
+      else
+        set_row (riga_record, formato_campo, FLD(logicnum,name,from,to) );
+    }
+
+    line = (const char *) rpt.line();
+  }
+}
+
+void BA3200_application::set_footers()
+{
+  TToken_string line;
+  int     footer_len, riga;
+  TString formato, testo;
+
+  reset_footer();
+
+  TScanner rpt(_rptname);
+  rpt.paragraph("Footers");
+
+  line = rpt.line();
+  footer_len = line.get_int(); 
+  if (footer_len) printer().footerlen (footer_len);
+
+  line = rpt.line();
+  while ( (line != "") && (line[0] != '[') )
+  {
+    riga = line.get_int();
+    formato = line.get();
+    testo   = line.get();
+    set_footer (riga, (const char *)formato, (const char*)testo);
+    line = rpt.line();
+  }
+}
+
+void BA3200_application::set_translations()
+{
+  TString campo, from, to;
+  TToken_string line;
+  int   logicnum;
+
+  TScanner rpt(_rptname);
+  rpt.paragraph("Translations");
+
+  line = rpt.line();
+  while ( (line != "") && (line[0] != '[') )
+  {
+    logicnum = line.get_int();
+    campo    = line.get();
+    from     = line.get();
+    to       = line.get();
+    set_translation (logicnum, (char*)(const char *)campo, (char*)(const char *)from, (char*)(const char *)to);
+    line = rpt.line();
+  }
+}
+
+void BA3200_application::set_relations()
+{
+  TToken_string line("", ',');
+  TString tab(16), expr(40);
+  int key, linkto, alias, logicnum;
+
+  TScanner rpt(_rptname);
+  rpt.paragraph("Relations");
+
+  line = rpt.line();
+  while ( (line != "") && (line[0] != '[') )
+  {
+    tab = line.get();
+    logicnum = atoi(tab);
+    expr = line.get();
+    key = line.get_int();
+    if (key == 0) key = 1;
+    linkto = line.get_int();
+    alias = line.get_int();
+    if (logicnum > 0)
+      _rel->add(logicnum, expr, key, linkto, alias);
+    else
+      _rel->add(tab, expr, key, linkto, alias);
+    
+    line = rpt.line();
+  }
+}
+void BA3200_application::leggi_rpt()
+{
+  set_rows();
+}
+
+void BA3200_application::user_create()
+{
+  _rptname  << "batb" << _tabname << ".rpt" ;
+  if (!fexist(_rptname)) 
+    fatal_box("Impossibile aprire il file '%s'", (const char*)_rptname);
+
+  _rel = new TRelation (_tabname);
+  _cur = new TCursor (_rel);
+
+  _maskname << "bast" << _tabname;
+  _msk = new TMask (_maskname) ;
+
+  add_cursor (_cur);
+  add_file (_tabname);
+
+  _logicnum = _cur->file().num();
+
+  reset_print ();
+
+  printer().footerlen (FOOTER_LEN);
+  for (int i=1; i <= FOOTER_LEN; i++) set_footer(i, "%s", "  ");
+
+  set_headers();
+  set_footers();
+  set_translations();
+  set_relations();
+}
+
+void BA3200_application::user_destroy() 
+{
+  delete _msk;
+  delete _cur;
+  delete _rel;
+}
+
+int ba3200(int argc, char* argv[])
+{
+  BA3200_application a(argv[2]) ;
+  a.run(argc, argv, "Stampa tabella");
+  return 0;
+}
diff --git a/ba/ba3300.cpp b/ba/ba3300.cpp
index e660c7ff3..02cb08d3c 100755
--- a/ba/ba3300.cpp
+++ b/ba/ba3300.cpp
@@ -1,289 +1,289 @@
-#include <mask.h>
-#include <printapp.h>
-#include <relation.h>
-#include <tabutil.h>
-#include <utility.h>
-
-#include "ba3.h"
-#include "ba3300.h"
-
-class BA3300_application : public TPrintapp
-{
-  friend bool codice_handler(TMask_field& field, KEY key);  
-  
-  TMask*  _msk;
-  TTable* _tab;        // Tabella dei registri
-  TString _cod_reg, _comulc, _ragsoc, _indulc, _civulc, _capulc, _com, _prov, _cofi, _paiv, _tipoa;
-  long _codice_ditta, _agg, _codanagr;
-  long _num_pag, _pag_ini, _pag_fin; 
-  int _cod_anno;
-  bool _inizia_dopo;
-  TLocalisamfile*   _nditte;
-  TLocalisamfile*   _anag;
-  TLocalisamfile*   _unloc;
-  TLocalisamfile*   _comuni;  
-
-public:
-  
-  bool menu (MENU_TAG m) { return TPrintapp::menu(m) ; }
-  virtual void user_destroy();
-  virtual void user_create() ;
-  bool set_print(int);
-
-  const char* decodifica_reg ();
-
-  virtual void set_page (int, int);
-  virtual print_action postprocess_page (int, int);
-  
-  BA3300_application();
-};
-
-print_action BA3300_application::postprocess_page(int, int counter)
-{
-  if (counter == _num_pag - 1)
-  {  
-    TString16 dep; dep.format("%04d%-3s", _cod_anno, (const char*)_cod_reg);
-    _tab->curr().put("CODTAB", (const char*)dep);
-    _tab->read();
-    if (_tab->bad()) _tab->curr().zero();
-    _agg = _tab->curr().get_long("I2");
-    _agg = _agg + _num_pag;
-    _tab->curr().put("I2", _agg);
-    _tab->rewrite();
-    return NEXT_PAGE;
-  }    
-
-  return REPEAT_PAGE;
-}
-
-void BA3300_application::set_page(int , int counter)
-{
-  reset_print();
-
-  const TString80 descr(decodifica_reg());
-  long contatore = _pag_ini + counter;
-
-  if (counter == 0)
-  {
-    if (!_inizia_dopo)
-    {
-      reset_row(8);
-      set_row(8, "@65gPag.@70g%ld", contatore);
-    }
-
-    reset_row(1);
-    reset_row(2);
-    reset_row(3);
-    reset_row(4);
-    reset_row(5);
-    reset_row(6);
-    reset_row(7);
-
-    set_row (1, "@50g%-50s", (const char*) descr);
-    set_row (2, "@50g%-50s", (const char*)_ragsoc);
-    set_row (3, "@50g%-35s", (const char*)_indulc);
-    set_row (3, "@90g%-10s", (const char*)_civulc);
-    set_row (4, "@50g%5s",   (const char*)_capulc);
-    set_row (4, "@60g%-50s", (const char*)_com);
-    set_row (4, "@115g%5s",  (const char*)_prov);
-    set_row (5, "@50g%16s",  (const char*)_cofi);
-    set_row (6, "@50g%11s",  (const char*)_paiv);
-    
-  }
-  else if (counter==_num_pag-1)       
-  {
-    reset_row(1);
-    reset_row(2);
-    reset_row(3);
-    reset_row(4);
-    reset_row(5);
-    reset_row(6);
-    reset_row(7);
-    reset_row(8);
-    set_row (1, "@1gSocieta'@10g%-50s", (const char*) _ragsoc);
-    set_row (1, "@62g%-29s", (const char*) _indulc);
-    set_row (1, "@93g%-9s", (const char*) _civulc);
-    set_row (1, "@103g%-5s", (const char*) _capulc);
-    set_row (1, "@110g%-18s", (const char*) _com);
-    set_row (1, "@130g%-3s", (const char*) _prov);
-    set_row (2, "@1g%-50s", (const char*) descr);
-    set_row (2, "@52g%16s", (const char*) _cofi);
-    set_row (2, "@70g%11s", (const char*) _paiv);         
-    set_row (4, "@50gN. ........ DI REPERTORIO");
-    set_row (5, "@50gIL PRESENTE LIBRO DELLA@75g%50s", (const char*) _ragsoc);
-    set_row (6, "@50g%-35s", (const char*) _indulc);
-    set_row (6, "@88g%10s", (const char*) _civulc);
-    set_row (7, "@50g%5s", (const char*) _capulc);
-    set_row (7, "@58g%50s", (const char*) _com);
-    set_row (7, "@111g%5s", (const char*) _prov);
-    set_row (8, "@120gPag.@125g%ld", contatore);
-  }
-  else
-  { 
-    reset_row(1);
-    reset_row(2);
-    reset_row(3);
-    reset_row(4);
-    reset_row(5);
-    reset_row(6);
-    reset_row(7);
-    reset_row(8);
-    set_row (1, "@1gSocieta'@10g%-50s", (const char*) _ragsoc);
-    set_row (1, "@62g%-29s", (const char*) _indulc);
-    // set_row (1, "@93g%-9s", (const char*) _civulc);
-    // set_row (1, "@103g%-5s", (const char*) _capulc);
-    set_row (1, "@110g%-18s", (const char*) _com);
-    set_row (1, "@130g%-3s", (const char*) _prov);
-    set_row (2, "@1g%-50s", (const char*) descr);
-    set_row (2, "@52g%16s", (const char*) _cofi);
-    set_row (2, "@70g%11s", (const char*) _paiv);
-    set_row (3, "@85gPag.@90g%ld", contatore);         
-  }
-}
-
-BA3300_application::BA3300_application()  
-{
-}
-
-bool BA3300_application::set_print(int)
-{
-  KEY   tasto;
-  TString16 app;
-
-  _nditte->setkey(1);
-  _codice_ditta = get_firm();
-  _nditte->curr().zero();
-  _nditte->curr().put(N_CODDITTA,_codice_ditta);
-  _nditte->read();
-  app=_nditte->curr().get(N_CODDITTA);
-  _msk->set(F_CODDITTA,app);
-  _ragsoc=_nditte->curr().get(N_RAGSOC);
-  _tipoa =_nditte->curr().get(N_TIPOA);
-  _codanagr =atol(_nditte->curr().get(N_CODANAGR));
-  _msk->set(F_RAGSOC,_ragsoc);
-  
-  _unloc->setkey(1);
-  _unloc->curr().zero();
-  _unloc->curr().put(N_CODDITTA,app);
-  _unloc->curr().put(N_CODULC,"1");
-  _unloc->read();
-  _indulc=_unloc->curr().get(N_INDULC);
-  _msk->set(F_INDIRIZZO,_indulc);
-  _civulc=_unloc->curr().get(N_CIVULC);
-  _msk->set(F_CIV,_civulc);
-  _capulc=_unloc->curr().get(N_CAPULC);
-  _msk->set(F_CAP,_capulc);
-  _comulc=_unloc->curr().get(N_COMULC);
-  _msk->set(F_CODCOM,_comulc);
-  
-  _comuni->setkey(1);
-  _comuni->curr().zero();
-  _comuni->curr().put(N_CODCOM,_comulc);
-  _comuni->read();
-  _com=_comuni->curr().get(N_COM);
-  _msk->set(F_COM,_com);
-  _prov=_comuni->curr().get(N_PROV);
-  _msk->set(F_PROV,_prov);
-  
-  _anag->setkey(1);  
-  _anag->curr().zero();
-  _anag->curr().put(N_TIPOA,_tipoa);
-  _anag->curr().put(N_CODANAGR,_codanagr);
-  _anag->read();
-  _cofi=_anag->curr().get(N_COFI);
-  _msk->set(F_COFI,_cofi);
-  _paiv=_anag->curr().get(N_PAIV);
-  _msk->set(F_PAIV,_paiv);
-
-  _msk->set(F_LUNG,66);
-  
-  tasto = _msk->run();
-
-  if (tasto == K_ENTER) 
-  {
-    _cod_reg = _msk->get(F_CODICE);
-    _cod_anno = _msk->get_int(F_ANNO);
-    _pag_ini = _msk->get_long(F_NPAGINI);
-    _pag_fin = _msk->get_long(F_NPAGFI);
-    _inizia_dopo = _msk->get_bool(F_PRIMO);   
-    _num_pag = (_pag_fin - _pag_ini) + 1; 
-    enable_print_menu();
-    return TRUE;
-  }
-
-  return FALSE;
-}
-
-static bool codice_handler (TMask_field& field, KEY key)
-{ 
-  if (key == K_TAB)  
-  { 
-    const TEdit_field& e = (const TEdit_field&)field;
-    const TLocalisamfile* t = e.browse()->cursor()->file();
-    const long num = t->get_long("I2");
-    field.mask().set(F_NPAGINI, num+1);
-    field.mask().set(F_NPAGFI, 0L);
-  }
-  return TRUE;
-}
-
-const char* BA3300_application::decodifica_reg ()
-{
-  TString16 dep; dep.format("%04d%-3s", _cod_anno, (const char*)_cod_reg);
-
-  _tab->curr().put("CODTAB", (const char*)dep);
-  _tab->read();
-  if (_tab->bad()) _tab->curr().zero();
-  return _tab->curr().get ("S0");
-}
-
-void BA3300_application::user_create()
-{
-  enable_print_menu();
-
-  _nditte = new TLocalisamfile (LF_NDITTE);
-  _unloc = new TLocalisamfile (LF_UNLOC);
-  _comuni = new TLocalisamfile (LF_COMUNI);
-  _anag = new TLocalisamfile (LF_ANAG);
-  _tab = new TTable(TAB_REG);
-
-  _msk = new TMask ("ba3300a") ;
-  _msk->set_handler(F_CODICE, codice_handler);
-  
-  add_cursor (NULL);
-  set_auto_ff (TRUE);
-}
-
-void BA3300_application::user_destroy() // releasev e arrmask
-{
-  delete  _msk;
-  delete  _nditte;
-  delete  _unloc;
-  delete  _comuni;
-  delete  _anag;
-  delete  _tab;
-}
-
-int ba3300(int argc, char* argv[])
-{
-  BA3300_application a;
-  a.run(argc, argv, "Stampa fogli libro bollato");
-  return 0;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+#include <mask.h>
+#include <printapp.h>
+#include <relation.h>
+#include <tabutil.h>
+#include <utility.h>
+
+#include "ba3.h"
+#include "ba3300.h"
+
+class BA3300_application : public TPrintapp
+{
+  friend bool codice_handler(TMask_field& field, KEY key);  
+  
+  TMask*  _msk;
+  TTable* _tab;        // Tabella dei registri
+  TString _cod_reg, _comulc, _ragsoc, _indulc, _civulc, _capulc, _com, _prov, _cofi, _paiv, _tipoa;
+  long _codice_ditta, _agg, _codanagr;
+  long _num_pag, _pag_ini, _pag_fin; 
+  int _cod_anno;
+  bool _inizia_dopo;
+  TLocalisamfile*   _nditte;
+  TLocalisamfile*   _anag;
+  TLocalisamfile*   _unloc;
+  TLocalisamfile*   _comuni;  
+
+public:
+  
+  bool menu (MENU_TAG m) { return TPrintapp::menu(m) ; }
+  virtual void user_destroy();
+  virtual void user_create() ;
+  bool set_print(int);
+
+  const char* decodifica_reg ();
+
+  virtual void set_page (int, int);
+  virtual print_action postprocess_page (int, int);
+  
+  BA3300_application();
+};
+
+print_action BA3300_application::postprocess_page(int, int counter)
+{
+  if (counter == _num_pag - 1)
+  {  
+    TString16 dep; dep.format("%04d%-3s", _cod_anno, (const char*)_cod_reg);
+    _tab->curr().put("CODTAB", (const char*)dep);
+    _tab->read();
+    if (_tab->bad()) _tab->curr().zero();
+    _agg = _tab->curr().get_long("I2");
+    _agg = _agg + _num_pag;
+    _tab->curr().put("I2", _agg);
+    _tab->rewrite();
+    return NEXT_PAGE;
+  }    
+
+  return REPEAT_PAGE;
+}
+
+void BA3300_application::set_page(int , int counter)
+{
+  reset_print();
+
+  const TString80 descr(decodifica_reg());
+  long contatore = _pag_ini + counter;
+
+  if (counter == 0)
+  {
+    if (!_inizia_dopo)
+    {
+      reset_row(8);
+      set_row(8, "@65gPag.@70g%ld", contatore);
+    }
+
+    reset_row(1);
+    reset_row(2);
+    reset_row(3);
+    reset_row(4);
+    reset_row(5);
+    reset_row(6);
+    reset_row(7);
+
+    set_row (1, "@50g%-50s", (const char*) descr);
+    set_row (2, "@50g%-50s", (const char*)_ragsoc);
+    set_row (3, "@50g%-35s", (const char*)_indulc);
+    set_row (3, "@90g%-10s", (const char*)_civulc);
+    set_row (4, "@50g%5s",   (const char*)_capulc);
+    set_row (4, "@60g%-50s", (const char*)_com);
+    set_row (4, "@115g%5s",  (const char*)_prov);
+    set_row (5, "@50g%16s",  (const char*)_cofi);
+    set_row (6, "@50g%11s",  (const char*)_paiv);
+    
+  }
+  else if (counter==_num_pag-1)       
+  {
+    reset_row(1);
+    reset_row(2);
+    reset_row(3);
+    reset_row(4);
+    reset_row(5);
+    reset_row(6);
+    reset_row(7);
+    reset_row(8);
+    set_row (1, "@1gSocieta'@10g%-50s", (const char*) _ragsoc);
+    set_row (1, "@62g%-29s", (const char*) _indulc);
+    set_row (1, "@93g%-9s", (const char*) _civulc);
+    set_row (1, "@103g%-5s", (const char*) _capulc);
+    set_row (1, "@110g%-18s", (const char*) _com);
+    set_row (1, "@130g%-3s", (const char*) _prov);
+    set_row (2, "@1g%-50s", (const char*) descr);
+    set_row (2, "@52g%16s", (const char*) _cofi);
+    set_row (2, "@70g%11s", (const char*) _paiv);         
+    set_row (4, "@50gN. ........ DI REPERTORIO");
+    set_row (5, "@50gIL PRESENTE LIBRO DELLA@75g%50s", (const char*) _ragsoc);
+    set_row (6, "@50g%-35s", (const char*) _indulc);
+    set_row (6, "@88g%10s", (const char*) _civulc);
+    set_row (7, "@50g%5s", (const char*) _capulc);
+    set_row (7, "@58g%50s", (const char*) _com);
+    set_row (7, "@111g%5s", (const char*) _prov);
+    set_row (8, "@120gPag.@125g%ld", contatore);
+  }
+  else
+  { 
+    reset_row(1);
+    reset_row(2);
+    reset_row(3);
+    reset_row(4);
+    reset_row(5);
+    reset_row(6);
+    reset_row(7);
+    reset_row(8);
+    set_row (1, "@1gSocieta'@10g%-50s", (const char*) _ragsoc);
+    set_row (1, "@62g%-29s", (const char*) _indulc);
+    // set_row (1, "@93g%-9s", (const char*) _civulc);
+    // set_row (1, "@103g%-5s", (const char*) _capulc);
+    set_row (1, "@110g%-18s", (const char*) _com);
+    set_row (1, "@130g%-3s", (const char*) _prov);
+    set_row (2, "@1g%-50s", (const char*) descr);
+    set_row (2, "@52g%16s", (const char*) _cofi);
+    set_row (2, "@70g%11s", (const char*) _paiv);
+    set_row (3, "@85gPag.@90g%ld", contatore);         
+  }
+}
+
+BA3300_application::BA3300_application()  
+{
+}
+
+bool BA3300_application::set_print(int)
+{
+  KEY   tasto;
+  TString16 app;
+
+  _nditte->setkey(1);
+  _codice_ditta = get_firm();
+  _nditte->curr().zero();
+  _nditte->curr().put(N_CODDITTA,_codice_ditta);
+  _nditte->read();
+  app=_nditte->curr().get(N_CODDITTA);
+  _msk->set(F_CODDITTA,app);
+  _ragsoc=_nditte->curr().get(N_RAGSOC);
+  _tipoa =_nditte->curr().get(N_TIPOA);
+  _codanagr =atol(_nditte->curr().get(N_CODANAGR));
+  _msk->set(F_RAGSOC,_ragsoc);
+  
+  _unloc->setkey(1);
+  _unloc->curr().zero();
+  _unloc->curr().put(N_CODDITTA,app);
+  _unloc->curr().put(N_CODULC,"1");
+  _unloc->read();
+  _indulc=_unloc->curr().get(N_INDULC);
+  _msk->set(F_INDIRIZZO,_indulc);
+  _civulc=_unloc->curr().get(N_CIVULC);
+  _msk->set(F_CIV,_civulc);
+  _capulc=_unloc->curr().get(N_CAPULC);
+  _msk->set(F_CAP,_capulc);
+  _comulc=_unloc->curr().get(N_COMULC);
+  _msk->set(F_CODCOM,_comulc);
+  
+  _comuni->setkey(1);
+  _comuni->curr().zero();
+  _comuni->curr().put(N_CODCOM,_comulc);
+  _comuni->read();
+  _com=_comuni->curr().get(N_COM);
+  _msk->set(F_COM,_com);
+  _prov=_comuni->curr().get(N_PROV);
+  _msk->set(F_PROV,_prov);
+  
+  _anag->setkey(1);  
+  _anag->curr().zero();
+  _anag->curr().put(N_TIPOA,_tipoa);
+  _anag->curr().put(N_CODANAGR,_codanagr);
+  _anag->read();
+  _cofi=_anag->curr().get(N_COFI);
+  _msk->set(F_COFI,_cofi);
+  _paiv=_anag->curr().get(N_PAIV);
+  _msk->set(F_PAIV,_paiv);
+
+  _msk->set(F_LUNG,66);
+  
+  tasto = _msk->run();
+
+  if (tasto == K_ENTER) 
+  {
+    _cod_reg = _msk->get(F_CODICE);
+    _cod_anno = _msk->get_int(F_ANNO);
+    _pag_ini = _msk->get_long(F_NPAGINI);
+    _pag_fin = _msk->get_long(F_NPAGFI);
+    _inizia_dopo = _msk->get_bool(F_PRIMO);   
+    _num_pag = (_pag_fin - _pag_ini) + 1; 
+    enable_print_menu();
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+static bool codice_handler (TMask_field& field, KEY key)
+{ 
+  if (key == K_TAB)  
+  { 
+    const TEdit_field& e = (const TEdit_field&)field;
+    const TLocalisamfile& t = e.browse()->cursor()->file();
+    const long num = t.get_long("I2");
+    field.mask().set(F_NPAGINI, num+1);
+    field.mask().set(F_NPAGFI, 0L);
+  }
+  return TRUE;
+}
+
+const char* BA3300_application::decodifica_reg ()
+{
+  TString16 dep; dep.format("%04d%-3s", _cod_anno, (const char*)_cod_reg);
+
+  _tab->curr().put("CODTAB", (const char*)dep);
+  _tab->read();
+  if (_tab->bad()) _tab->curr().zero();
+  return _tab->curr().get ("S0");
+}
+
+void BA3300_application::user_create()
+{
+  enable_print_menu();
+
+  _nditte = new TLocalisamfile (LF_NDITTE);
+  _unloc = new TLocalisamfile (LF_UNLOC);
+  _comuni = new TLocalisamfile (LF_COMUNI);
+  _anag = new TLocalisamfile (LF_ANAG);
+  _tab = new TTable(TAB_REG);
+
+  _msk = new TMask ("ba3300a") ;
+  _msk->set_handler(F_CODICE, codice_handler);
+  
+  add_cursor (NULL);
+  set_auto_ff (TRUE);
+}
+
+void BA3300_application::user_destroy() // releasev e arrmask
+{
+  delete  _msk;
+  delete  _nditte;
+  delete  _unloc;
+  delete  _comuni;
+  delete  _anag;
+  delete  _tab;
+}
+
+int ba3300(int argc, char* argv[])
+{
+  BA3300_application a;
+  a.run(argc, argv, "Stampa fogli libro bollato");
+  return 0;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ba/ba3500.cpp b/ba/ba3500.cpp
index e3c0b9388..29e7e37cf 100755
--- a/ba/ba3500.cpp
+++ b/ba/ba3500.cpp
@@ -113,23 +113,24 @@ TMask*  BA3500_application::get_mask(int mode)
 
 void BA3500_application::read_tabinl(TMask& m)
 {
-  long    paginilib,pagfinlib,codditta,paginiut,pagfinut,annoreg;
-  int     mesereg;
+  long    paginilib,pagfinlib,codditta,paginiut,pagfinut;
+  int     mesereg,annoreg;
   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;
+  TTable& tab_inl = (TTable&)_rel->lfile(-ALIAS);
+  long    numrig;
+  int     anno;
   TString codlib;
 
-  anno   = atol(m.get(F_ANNO));
+  anno   = m.get_int(F_ANNO);
   codlib = m.get(F_CODLIB);
 
   _rel->update();
 
-  _righe_gia_presenti = new TRighe_gia_presenti(tab_inl->items());
+  _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
@@ -138,19 +139,19 @@ void BA3500_application::read_tabinl(TMask& m)
 
   while (ok)
   {
-    TRecfield num (tab_inl->curr(),"CODTAB",7,12);
+    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");    
+    annoreg    = tab_inl.get_int("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);
@@ -224,7 +225,7 @@ int BA3500_application::rewrite(const TMask& m)
 {
   long items;
 //  TTable *tab_inl = (TTable*)_rel->lfile(TAB_INL);
-  TTable *tab_inl = (TTable*)_rel->lfile(-ALIAS);
+  TTable& tab_inl = (TTable&)_rel->lfile(-ALIAS);
 
   int anno = m.get_int(F_ANNO);
   TString cod_lib = m.get(F_CODLIB);
@@ -242,25 +243,25 @@ int BA3500_application::rewrite(const TMask& m)
     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.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();
+       tab_inl.rewrite();
        _righe_gia_presenti->togli(i);
       }
       else
-	tab_inl->write();
+	tab_inl.write();
     }
   }
   return _rel->rewrite();
@@ -270,7 +271,7 @@ int BA3500_application::write(const TMask& m)
 {
   long items;
 //  TTable *tab_inl = (TTable*)_rel->lfile(TAB_INL);
-  TTable *tab_inl = (TTable*)_rel->lfile(-ALIAS);
+  TTable& tab_inl = (TTable&)_rel->lfile(-ALIAS);
 
   int anno = m.get_int(F_ANNO);
   TString cod_lib = m.get(F_CODLIB);
@@ -281,7 +282,7 @@ int BA3500_application::write(const TMask& m)
 
   items = cs.items();
 
-  tab_inl->zero();
+  tab_inl.zero();
 
   for (int i = 0; i < items; i++)
   {
@@ -290,19 +291,19 @@ int BA3500_application::write(const TMask& m)
     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();
+      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();
@@ -322,9 +323,9 @@ bool BA3500_application::remove()
 
 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);
+  TTable& tab_inl = (TTable&)_rel->lfile(-ALIAS);
+  TRecfield an(tab_inl.curr(),"CODTAB",0,3);
+  TRecfield cl(tab_inl.curr(),"CODTAB",4,6);
   long      anno;
   TString   codlib, dep;
   
@@ -332,15 +333,15 @@ int BA3500_application::cancella(long items)
   codlib = (const char*)cl; 
   for (long i = 0; i < items; i++)
   {
-    tab_inl->zero();
+    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();
+    tab_inl.put("CODTAB", dep);
+    if (tab_inl.read(_isequal, _lock) == NOERR)
+	  tab_inl.remove();
   }
-  return tab_inl->status();
+  return tab_inl.status();
 }
 
 /*********
diff --git a/ba/ba3700.cpp b/ba/ba3700.cpp
index e415679c6..035fac6cf 100755
--- a/ba/ba3700.cpp
+++ b/ba/ba3700.cpp
@@ -1,940 +1,940 @@
-// ba3700.cpp  - Tabella condizioni di pagamento
-
-#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 "ba3700.h"
-#include "nditte.h"
-
-#define ALIAS 1
-
-class Riga_tabrpg : public TToken_string
-{
-public:
-  const TString& operator = (const TString& s) 
-				{return TToken_string::operator=(s);}
-  Riga_tabrpg (long,const char*,const char*,const char*);
-};
-
-Riga_tabrpg::Riga_tabrpg(long num_giorni,const char* perc,const char* tipo_pag,                         const char* ulter_class)
-: TToken_string(80)
-{
-  add(num_giorni);  add(perc);  add(tipo_pag);  add(ulter_class);
-}
-
-class TRighe_tabrpg : public TArray
-{
-public:
-  void add_riga(long=0l,const char* percent="",const char* tipo_pagam="",                      
-  				const char* ult_class="");
-  
-  TRighe_tabrpg() {}
-};
-
-void TRighe_tabrpg::add_riga(long num_giorni,const char* perc,                                              const char* tipo_pag,const char* ulter_class)
-{
-  add(new Riga_tabrpg(num_giorni,perc,tipo_pag,ulter_class)); 
-}
-
-
-class BA3700_application : public TRelation_application
-{
-  static bool intervallo_rate         (TMask_field& f, KEY k);
-  static bool rate_differenziate      (TMask_field& f, KEY k);
-  static bool tipo_prima_rata         (TMask_field& f, KEY k);
-  static bool numero_rate             (TMask_field& f, KEY k);
-  static bool mese_commerciale        (TMask_field& f, KEY k);
-  static bool riga_sheet(int r, KEY k);
-   
-  TRelation           * _rel;
-  TMask               * _msk;
-  TBit_array          _righe_gia_presenti;
-  
-  int                 _mode;              // Modo maschera corrente
-  TRighe_tabrpg       _righe_tabrpg;
-  long                _interv_rate, _numero_rate;
-  int                 _riga;
-
-  void   read_tabrpg             (TMask&);
-  bool   fill_sheet              (TMask&);
-  void   togli_dal_file          (const TString&);
-  void   calcola_percentuale     (TMask& m);
-  bool   ricalcola_numero_giorni (TMask_field& f, KEY k);
-  bool   ricalcolo_percentuale   (TMask_field& f, KEY k);
-  void   tipo_pagamento          (TMask_field& f, KEY k);
-  void   ulteriore_riclass       (TMask_field& f, KEY k);
-
-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();
-  
-  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:
-
-  TMask * main_mask() { return _msk; }
-  BA3700_application() : TRelation_application() {} 
-  virtual ~BA3700_application() {}
-};
-                                                 
-                                                 
-HIDDEN BA3700_application * app() { return (BA3700_application*) MainApp(); }
-
-TMask*  BA3700_application::get_mask(int mode)
-{
-  return _msk;
-}
-
-void BA3700_application::togli_dal_file(const TString& cod_pag)
-{
-  long i;
-  TTable* tab_rpg = (TTable*)_rel->lfile(-ALIAS);
-  long last  = _righe_gia_presenti.last_one();
-  long start = _righe_gia_presenti.first_one();
-  TString dep;
-
-  for (i=start; i<=last; i++)
-  {
-    if (_righe_gia_presenti[i])
-    {
-      tab_rpg->zero();
-      dep.format ("%-4s%3d", (const char*) cod_pag, i);
-      tab_rpg->put("CODTAB", dep);
-      tab_rpg->remove();
-    }
-  }
-}
-
-void BA3700_application::read_tabrpg(TMask& m)
-{
-  long    numero_giorni, num_giorni_prima_rata;
-  TString    tipo_pagamento;
-  TString percentuale, cod_pag, ult_class;
-  bool    ok = FALSE;
-  TTable* tab_rpg = (TTable*)_rel->lfile(-ALIAS);
-  long    numrig;
-  int i = 0;
-  
-  _numero_rate = 0;
-  
-  cod_pag = m.get(F_CODICE);
-
-  _rel->update();
-
-  _righe_gia_presenti.reset();
-
-  ok = _rel->is_first_match(-ALIAS);
-
-  while (ok)
-  {
-    TRecfield num (tab_rpg->curr(),"CODTAB",4,6);
-    numrig           = long(num);
-    numero_giorni    = tab_rpg->get_long("I0");
-    percentuale      = tab_rpg->get     ("R0");
-    tipo_pagamento   = tab_rpg->get     ("S0");
-    ult_class        = tab_rpg->get     ("S1");
-    
-    if (i == 0)    //Sono sulla prima rata
-      num_giorni_prima_rata = numero_giorni;
-    
-    if (i == 1)    //Sono sulla seconda rata 
-      _interv_rate = numero_giorni - num_giorni_prima_rata;
-       
-    _righe_tabrpg.add_riga(numero_giorni,percentuale,tipo_pagamento,ult_class);
-    _righe_gia_presenti.set(numrig);
-    ok = _rel->next_match(-ALIAS);
-    i++;
-  } 
-  _numero_rate = i;
-}
-
-bool BA3700_application::fill_sheet(TMask& m)
-{
-  long items;
-
-  _righe_tabrpg.destroy();
-
-  TSheet_field& cs = (TSheet_field&)m.field(F_SHEET_RPG);
-  cs.reset();
-
-  read_tabrpg(m);
-
-  items = _righe_tabrpg.items();
-
-  for (int i = 0; i < items; i++)
-  {
-    TToken_string &riga = cs.row(i);
-
-    riga.cut(0);
-    riga = (Riga_tabrpg&)_righe_tabrpg[i];
-  }
-
-  bool rate_diff = m.get_bool(F_RATE_DIFF);
-
-  if (!rate_diff)
-    calcola_percentuale(m);
-
-  cs.force_update();
-
-  _righe_tabrpg.destroy();
-
-  return TRUE;
-}
-
-void BA3700_application::init_insert_mode(TMask& m)
-{
-  _interv_rate = 0;
-}
-
-void BA3700_application::init_modify_mode(TMask& m)
-{
-  bool rate_differenziate = FALSE;
-
-  rate_differenziate = m.get_bool(F_RATE_DIFF);
-
-  if (rate_differenziate)
-  _interv_rate = 0;
-}
-
-bool BA3700_application::rate_differenziate(TMask_field& f, KEY k)
-{
-  long items;
-
-  TSheet_field& cs = (TSheet_field&)f.mask().field(F_SHEET_RPG);
-  items = cs.items();
-
-  bool rate_diff = f.mask().get_bool(F_RATE_DIFF);
-  
-  if (k == K_SPACE)
-  {
-    if (rate_diff)
-    {
-      f.mask().disable(F_NUM_RATE);
-      f.mask().disable(F_INT_RATE);
-
-      for (int i = 1; i < items; i++)
-      {
-        if (i == 1)
-          cs.enable_cell(i,1);
-
-        if (i >= 2)
-          cs.enable_cell(i,-1);
-      }
-    }
-    else
-    {
-      f.mask().enable(F_NUM_RATE);
-      f.mask().enable(F_INT_RATE);
-
-      f.mask().set(F_NUM_RATE, items);
-      f.mask().set(F_INT_RATE, app()->_interv_rate);
-
-      for (int i = 0; i < items; i++)
-      {
-
-        if (i == 1)
-	  cs.disable_cell(i,1);
-       
-        if (i >= 2)
-	  cs.disable_cell(i,-1);
-      }
-    }
-    cs.force_update();
-  }
-  return TRUE;
-}
-
-bool BA3700_application::intervallo_rate(TMask_field& f, KEY k)
-{
-  bool mese_comm = FALSE;
-  long numero_giorni, num_giorni, items, interv_rate;
-
-  if (f.to_check(k))
-  {
-    mese_comm = f.mask().get_bool(F_MESECOMM);
-    interv_rate = f.mask().get_long(F_INT_RATE);
-
-    if (mese_comm)
-    {
-      if ((interv_rate % 30) != 0)
-      {
-        f.error_box("L' intervallo tra rate successive deve essere un multiplo di 30, perche' e' stato selezionato il mese commerciale");
-	return FALSE;
-      }
-    }
-
-    TSheet_field& cs = (TSheet_field&)f.mask().field(F_SHEET_RPG);
-    items = cs.items();
-
-    for (int i = 0; i < items; i++)
-    {
-      TToken_string& riga = cs.row(i);
-
-      if (i >= 1)
-      {
-        numero_giorni = num_giorni + interv_rate;
-	TString ng (format("%4d", numero_giorni));
-	riga.add(ng, 0);
-      }
-
-      num_giorni = atol(riga.get(0));
-    }
-    cs.force_update();
-  }
-  return TRUE;
-}
-
-bool BA3700_application::tipo_prima_rata(TMask_field& f, KEY k)
-{
-  char tipo_rata;
-  long items;
-
-  TSheet_field& cs = (TSheet_field&)f.mask().field(F_SHEET_RPG);
-  items = cs.items();
-
-  bool rate_diff = f.mask().get_bool(F_RATE_DIFF);
-
-  if (f.to_check(k, TRUE))
-  {
-    tipo_rata = f.mask().get(F_TIPO_PRIMA_RATA)[0];
-
-    for (int i = 0; i < items; i++)
-    {
-      TToken_string& riga = cs.row(i);
-
-      if ((tipo_rata == '1') || (tipo_rata == '2') || (tipo_rata == '3'))
-      {
-
-	if (i == 0)
-        {
-          riga.add("0.00", 1);
-	  cs.disable_cell(i,1);
-	}
-	else
-        {
-          if (rate_diff)
-	    cs.enable_cell(i,1);
-	  else
-	    if (i == 0)
-              cs.enable_cell(i,1);
-        }
-      }
-      else
-        if ((tipo_rata == '4') || (tipo_rata == '5') || (tipo_rata == '6'))
-        {
-
-          if (i == 0)
-            riga.add("100.00", 1);
-
-	  if (i >= 1)
-	    riga.add("0.00", 1);
-
-	  cs.disable_cell(i,1);
-	}
-	else
-        {
-	  if (tipo_rata == 0)
-            if (rate_diff)
-	      cs.enable_cell(i,1);
-	    else
-	      if (i == 0)
-                cs.enable_cell(i,1);
-        }
-    }
-    if (rate_diff)
-    {
-      TString perc_str;
-      real percentuale;
-
-      long items = cs.items();
-
-      for (int i = 0; i < items; i++)
-      {
-	TToken_string& riga = cs.row(i);
-
-	perc_str = riga.get(1);
-        real perc(perc_str);
-        percentuale += perc;
-      }
-
-      if (percentuale != 100)
-      {
-        f.error_box("La somma delle percentuali di tutte le rate deve essere 100");
-	return FALSE;
-      }
-    }
-    else
-      app()->calcola_percentuale(f.mask());
-    cs.force_update();
-  }
-  return TRUE;
-}
-
-bool BA3700_application::numero_rate(TMask_field& f, KEY k)
-{
-  long    items, num_giorni, numero_giorni;
-  TString perc_str;
-  real    perc,percentuale,perc_rimasta;
-
-  TSheet_field& cs = (TSheet_field&)f.mask().field(F_SHEET_RPG);
-  items = cs.items();
-
-  if (f.to_check(k))
-  {
-    long numero_rate = f.mask().get_long(F_NUM_RATE);
-    char tipo_rata   = f.mask().get     (F_TIPO_PRIMA_RATA)[0];
-    long interv_rate = f.mask().get_long(F_INT_RATE);
-
-    if (numero_rate == 0)
-    {
-      f.error_box("Valore non consentito ! Deve esistere almeno la prima rata.");
-      return FALSE;
-    }
-    else
-    {
-      if (items < numero_rate)
-      {
-	TToken_string& riga_app = cs.row((int)items - 1); //Mi posiziono sull'ultima rata
-
-	num_giorni = atol(riga_app.get(0));
-
-	for (long i = items; i < numero_rate; i++)
-	{
-	  TToken_string& riga = cs.row((int)i);
-
-	  riga.cut(0);
-	  riga = riga_app;
-	  numero_giorni = num_giorni + interv_rate;
-	  TString ng (format("%4d", numero_giorni));
-	  riga.add(ng, 0);
-	  num_giorni = atol(riga.get(0));
-
-	  if (i == 1l)
-        cs.disable_cell((int)i,1);
-       
-      else if (i >= 2l)
-	    cs.disable_cell((int)i,-1);
-
-	//  cs.disable_cell(i,-1);
-	}
-      }
-      else
-     	if (items > numero_rate)
-	{
-	  TToken_string& riga_appI  = cs.row(0); //Mi posiziono sulla prima rata
-          TToken_string& riga_appII = cs.row(1); //Mi posiziono sulla seconda rata  ***
-
-          num_giorni = atol(riga_appI.get(0));
-
-	  cs.reset();
-
-	  for (int i = 0; i < numero_rate; i++)
-	  {
-	    TToken_string& riga = cs.row(i);
-
-	    if (i == 0)         // ***
-            {                   //Ricopio i dati della prima rata nella prima rata
-	      riga.cut(0);      // ***
-	      riga = riga_appI; // ***
-	    }
-
-	    if (i > 0)
-	    {
-	      riga.cut(0);
-	      riga = riga_appII; //Ricopio i dati della seconda rata in tutte le altre
-	      numero_giorni = num_giorni + interv_rate;
-	      TString ng (format("%4d", numero_giorni));
-	      riga.add(ng, 0);
-	    }
-	    num_giorni = atol(riga.get(0));
-
-	    
-            if (i == 1)
-	      cs.disable_cell(i,1);
-	    if (i >=2)
-              cs.disable_cell(i,-1);
-	  }
-	}
-    }
-
-    items = numero_rate;
-
-    for (int i = 0; i<items; i++)
-    {
-      TToken_string& riga = cs.row(i);
-      
-      if (i == 0)
-      {
-        perc_str = riga.get(1);
-     	real perc(perc_str);
-	if ((((tipo_rata!='1')||(tipo_rata!='2')||(tipo_rata!='3'))&&(perc>0))
-	||(((tipo_rata=='1')||(tipo_rata=='2')||(tipo_rata=='3'))&&(perc==0)))
-        {  
-	  perc_rimasta = 100 - perc;
-	  percentuale = perc_rimasta / (numero_rate - 1);
-        }
-      }
-
-      if (i >= 1)
-      {
-        TString perc = percentuale.string();
-	riga.add(perc, 1);
-      }
-    }
-    cs.force_update();
-  }
-  return TRUE;
-}
-
-bool BA3700_application::mese_commerciale(TMask_field& f, KEY k)
-{
-  long interv_rate;
-
-  if (k == K_SPACE)
-  {
-    bool mese_comm = f.mask().get_bool(F_MESECOMM);
-    bool rate_diff = f.mask().get_bool(F_RATE_DIFF);
-
-    if (!rate_diff)
-    {
-      if (mese_comm)
-      {
-        interv_rate = f.mask().get_long(F_INT_RATE);
-        if ((interv_rate % 30) != 0)
-        {
-	  f.error_box("L' intervallo tra rate successive deve essere un multiplo di 30, perche' e' stato selezionato il mese commerciale");
-	  return FALSE;
-	}
-      }
-    }
-  }
-  return TRUE;
-}
-
-void BA3700_application::calcola_percentuale(TMask& m)
-{
-  TString perc_str;
-  real    perc_rimasta, percentuale;
-  long items;
-
-//  TSheet_field& cs = (TSheet_field&)m.field(F_SHEET_RPG);
-  TSheet_field& cs = (TSheet_field&)app()->main_mask()->field(F_SHEET_RPG);
-  items = cs.items();
-
-  for (int i = 0; i<items; i++)
-  {
-    TToken_string& riga = cs.row(i);
-
-    if (i == 0)
-    {
-      perc_str = riga.get(1);
-      real perc(perc_str);
-      perc_rimasta = 100 - perc;
-      percentuale = perc_rimasta / (_numero_rate - 1);
-    }
-
-    if (i >= 1)
-    {
-      TString perc = percentuale.string();
-      riga.add(perc, 1);
-    }
-  }
-}
-
-bool BA3700_application::ricalcolo_percentuale(TMask_field& f, KEY k)
-{
-//  TSheet_field& cs = (TSheet_field&)f.mask().field(F_SHEET_RPG);
-  TSheet_field& cs = (TSheet_field&)app()->main_mask()->field(F_SHEET_RPG);
-  long items = cs.items();
-
-  if (f.mask().mode() == MODE_QUERY)
-    return TRUE;
-
-  if (k == K_ENTER)
-  {
-    bool rate_diff = app()->main_mask()->get_bool(F_RATE_DIFF);
-    if (rate_diff)
-    {
-      TString perc_str;
-      real percentuale;
-
-      long items = cs.items();
-
-      for (int i = 0; i < items; i++)
-      {
-	TToken_string& riga = cs.row(i);
-
-	perc_str = riga.get(1);
-        real perc(perc_str);
-        percentuale += perc;
-      }
-
-      if (percentuale != 100)
-      {
-        f.error_box("La somma delle percentuali di tutte le rate deve essere 100");
-	return FALSE;
-      }
-    }
-    else
-    {
-      if (_riga == 0)
-      {
-        app()->_numero_rate = items;
-	app()->calcola_percentuale(f.mask());
-      }
-    }
-  
-    cs.force_update();
-  }
-  return TRUE;
-}
-
-bool BA3700_application::ricalcola_numero_giorni(TMask_field& f, KEY k)
-{
-  long items, ng, giorni;
-
-//  TSheet_field& cs = (TSheet_field&)f.mask().field(F_SHEET_RPG);
-  TSheet_field& cs = (TSheet_field&)app()->main_mask()->field(F_SHEET_RPG);
-  items = cs.items();
-
-  if (f.mask().mode() == MODE_QUERY)
-    return TRUE;
-
-  if (k == K_ENTER)
-  {
-    bool mese_comm   = app()->main_mask()->get_bool(F_MESECOMM);
-    bool rate_diff   = app()->main_mask()->get_bool(F_RATE_DIFF);
-    
-    if (!rate_diff)
-    {
-      if (app()->_riga == 0)
-      {
-	TToken_string& riga_app = cs.row(0);
-	giorni = atol(riga_app.get(0));
-
-	long interv_rate = app()->main_mask()->get_long(F_INT_RATE);
-
-	if (mese_comm)
-        {
-          if ((giorni % 30) != 0)
-          {  
-            f.error_box("Il numero di giorni deve essere un multiplo di 30, perche' e' stato selezionato il mese commerciale");
-            return FALSE;
-          }
-        }
-
-        for (int i = 1; i < items; i++)
-        {
-          TToken_string& riga = cs.row(i);
-
-          ng = giorni + interv_rate;
-          TString ngiorni (format("%4d", ng));
-          riga.add(ngiorni, 0);
-
-          giorni = atol(riga.get(0));
-        }
-      }
-
-      if (app()->_riga == 1)
-      {
-	long gg_I_rata, interv_rate;
-
-	for (int i = 0; i < items; i++)
-	{
-	  TToken_string& riga = cs.row(i);
-
-	  if (i == 0)
-	    gg_I_rata = atol(riga.get(0));
-
-	  if (i == 1)
-          {
-	    giorni = atol(riga.get(0));
-
-	    if (mese_comm)
-            {
-              if ((giorni % 30) != 0)
-              {  
-                f.error_box("Il numero di giorni deve essere un multiplo di 30, perche' e' stato selezionato il mese commerciale");
-                return FALSE;
-              }
-            }
-
-	    interv_rate = giorni - gg_I_rata;
-          }
-
-	  if (i >= 2)
-          {
-	    ng = giorni + interv_rate;
-            TString ngiorni (format("%4d", ng));
-	    riga.add(ngiorni, 0);
-	    giorni = atol(riga.get(0));
-          }
-        }
-      }
-      cs.force_update();
-    }
-  }
-  return TRUE;
-}
-
-void BA3700_application::tipo_pagamento(TMask_field& f, KEY k)
-{
-  long items;
-
-  TSheet_field& cs = (TSheet_field&)app()->main_mask()->field(F_SHEET_RPG);
-  items = cs.items();
-
-  if (k == K_ENTER)
-  {
-    bool rate_diff   = app()->main_mask()->get_bool(F_RATE_DIFF);
-
-    if (!rate_diff)
-    {
-      if (app()->_riga == 1)
-      {
-	TToken_string& riga_app = cs.row(1);
-        TString tp_pag = riga_app.get(2);
-
-	for (int i = 2; i < items; i++)
-        {
-          TToken_string& riga = cs.row(i);
-
-	  riga.add(tp_pag, 2);
-        }
-      }
-    }
-  }
-}
-
-void BA3700_application::ulteriore_riclass(TMask_field& f, KEY k)
-{
-  long items;
-
-  TSheet_field& cs = (TSheet_field&)app()->main_mask()->field(F_SHEET_RPG);
-  items = cs.items();
-
-  if (k == K_ENTER)
-  {
-    bool rate_diff   = app()->main_mask()->get_bool(F_RATE_DIFF);
-
-    if (!rate_diff)
-    {
-      if (app()->_riga == 1)
-      {
-	TToken_string& riga_app = cs.row(1);
-        TString ult_riclass = riga_app.get(3);
-
-	for (int i = 2; i < items; i++)
-        {
-          TToken_string& riga = cs.row(i);
-
-	  riga.add(ult_riclass, 3);
-        }
-      }
-    }
-  }
-}
-
-bool BA3700_application::riga_sheet(int r, KEY k)
-{
-  if (k == K_SPACE)
-    app()->_riga = r;
-
-  TSheet_field& cs = (TSheet_field&)app()->main_mask()->field(F_SHEET_RPG);
-  TMask_field& fld = cs.sheet_mask().field(101);
-
-  TMask_field& ftp = cs.sheet_mask().field(103);
-  app()->tipo_pagamento(ftp,k);
-
-  TMask_field& fuc = cs.sheet_mask().field(104);
-  app()->ulteriore_riclass(fuc,k);
-
-  TMask_field& f = cs.sheet_mask().field(102);
-
-  if ((app()->ricalcola_numero_giorni(fld,k))&&(app()->ricalcolo_percentuale(f,k)))
-    return TRUE;
-  else
-    return FALSE;
-}
-
-int BA3700_application::rewrite(const TMask& m)
-{
-  long items;
-  TTable *tab_rpg = (TTable*)_rel->lfile(-ALIAS);
-  TString dep;
-  
-  TString cod_pag = m.get(F_CODICE);
-
-  m.autosave(_rel);
-
-  TSheet_field& cs = (TSheet_field&)m.field(F_SHEET_RPG);
-
-  items = cs.items();
-
-  for (int i = 0; i < items; i++)
-  {
-    TToken_string &riga = cs.row(i);
-    TString codtab (format("%-4s%3d",(const char*)cod_pag,i));
-    long numero_giorni  = atol(riga.get(0));
-    if (numero_giorni != 0)
-    {
-      tab_rpg->put ("CODTAB", codtab);
-      tab_rpg->put ("I0", numero_giorni);
-      tab_rpg->put ("R0", riga.get());
-       dep = riga.get();
-      if (dep != "")
-	tab_rpg->put ("S0", dep);
-      dep = riga.get();
-      if (dep != "")
-	tab_rpg->put ("S1", dep);
-
-      if (_righe_gia_presenti[i])
-      {
-       tab_rpg->rewrite();
-       _righe_gia_presenti.reset(i);
-      }
-      else
-	tab_rpg->write();
-    }
-  }
-  togli_dal_file(cod_pag);
-  return _rel->rewrite();
-}
-
-int BA3700_application::write(const TMask& m)
-{
-  long items;
-  TTable *tab_rpg = (TTable*)_rel->lfile(-ALIAS);
-  TString dep;
-
-  TString cod_pag = m.get(F_CODICE);
-
-  m.autosave(_rel);
-
-  TSheet_field& cs = (TSheet_field&)m.field(F_SHEET_RPG);
-
-  items = cs.items();
-
-  tab_rpg->zero();
-
-  for (int i = 0; i < items; i++)
-  {
-    TToken_string &riga = cs.row(i);
-    TString codtab (format("%-4s%3d",(const char*)cod_pag,i));
-    long numero_giorni  = atol(riga.get(0));
-    if (numero_giorni != 0)
-    {
-      tab_rpg->put ("CODTAB", codtab);
-      tab_rpg->put ("I0", numero_giorni);
-      tab_rpg->put ("R0", riga.get());
-      dep = riga.get();
-      if (dep != "")
-	tab_rpg->put ("S0", dep);
-      dep = riga.get();
-      if (dep != "")
-        tab_rpg->put ("S1", dep);
-      tab_rpg->write();
-    }
-  }
-  return _rel->write();
-}
-
-bool BA3700_application::remove()
-{
-  TSheet_field& cs = (TSheet_field&)_msk->field(F_SHEET_RPG);
-  cancella(cs.items());
-  TRelation_application::remove();
-  return TRUE;
-}
-
-int BA3700_application::cancella(long items)
-{
-  TTable*   tab_rpg = (TTable*)_rel->lfile(-ALIAS);
-  TRecfield an (tab_rpg->curr(),"CODTAB",0,3);
-  TString   cod_pag,dep;
-  
-  cod_pag   = (const char*)(an);
-  
-  for (long i = 0; i < items; i++)
-  {
-    tab_rpg->zero();
-    dep =  format ("%-4s", (const char*) cod_pag);
-    dep << format ("%3d" , i);
-    tab_rpg->put("CODTAB", dep);
-    if (tab_rpg->read(_isequal, _lock) == NOERR)
-      tab_rpg->remove();
-  }
-  return tab_rpg->status();
-}
-
-int BA3700_application::read(TMask& m)
-{
-  m.autoload(_rel);
-  fill_sheet(m);
-
-  return NOERR;
-}
-
-bool BA3700_application::user_create()
-{
-  _rel = new TRelation (TAB_CPG);
-
-//E' stato usato un solo = perche' altrimenti per come sono fatte le lib. vi
-//sono problemi di allineamento all' interno di relation.cpp.
-
-  _rel->add(TAB_RPG, "CODTAB[1,4]=CODTAB" ,1, 0, ALIAS); //-4 = alias,perche'le
-				    //due tabelle sono entrambe in TABCOM.dta
-
-  _interv_rate = 0;
-
-  _msk = new TMask("ba3700a");
-
-  _msk->set_handler (F_INT_RATE        , intervallo_rate);
-  _msk->set_handler (F_RATE_DIFF       , rate_differenziate);
-  _msk->set_handler (F_TIPO_PRIMA_RATA , tipo_prima_rata);
-  _msk->set_handler (F_NUM_RATE        , numero_rate);
-  _msk->set_handler (F_MESECOMM        , mese_commerciale);
-
-  TSheet_field& cs = (TSheet_field&)_msk->field(F_SHEET_RPG);
-//  cs.sheet_mask().set_handler (102               , ricalcolo_percentuale);
-//  cs.sheet_mask().set_handler (101               , ricalcola_numero_giorni);
-  cs.set_notify               (riga_sheet);
-
-  return TRUE;
-}
-
-bool BA3700_application::user_destroy()
-{
-  delete _msk;
-  delete _rel;
-  return TRUE;
-}
-
-int ba3700(int argc, char* argv[])
-{
-  BA3700_application a;
-  a.run(argc, argv, "Tabella condizioni di pagamento");
-  return 0;
-}
-
-
-
+// ba3700.cpp  - Tabella condizioni di pagamento
+
+#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 "ba3700.h"
+#include "nditte.h"
+
+#define ALIAS 1
+
+class Riga_tabrpg : public TToken_string
+{
+public:
+  const TString& operator = (const TString& s) 
+				{return TToken_string::operator=(s);}
+  Riga_tabrpg (long,const char*,const char*,const char*);
+};
+
+Riga_tabrpg::Riga_tabrpg(long num_giorni,const char* perc,const char* tipo_pag,                         const char* ulter_class)
+: TToken_string(80)
+{
+  add(num_giorni);  add(perc);  add(tipo_pag);  add(ulter_class);
+}
+
+class TRighe_tabrpg : public TArray
+{
+public:
+  void add_riga(long=0l,const char* percent="",const char* tipo_pagam="",                      
+  				const char* ult_class="");
+  
+  TRighe_tabrpg() {}
+};
+
+void TRighe_tabrpg::add_riga(long num_giorni,const char* perc,                                              const char* tipo_pag,const char* ulter_class)
+{
+  add(new Riga_tabrpg(num_giorni,perc,tipo_pag,ulter_class)); 
+}
+
+
+class BA3700_application : public TRelation_application
+{
+  static bool intervallo_rate         (TMask_field& f, KEY k);
+  static bool rate_differenziate      (TMask_field& f, KEY k);
+  static bool tipo_prima_rata         (TMask_field& f, KEY k);
+  static bool numero_rate             (TMask_field& f, KEY k);
+  static bool mese_commerciale        (TMask_field& f, KEY k);
+  static bool riga_sheet(int r, KEY k);
+   
+  TRelation           * _rel;
+  TMask               * _msk;
+  TBit_array          _righe_gia_presenti;
+  
+  int                 _mode;              // Modo maschera corrente
+  TRighe_tabrpg       _righe_tabrpg;
+  long                _interv_rate, _numero_rate;
+  int                 _riga;
+
+  void   read_tabrpg             (TMask&);
+  bool   fill_sheet              (TMask&);
+  void   togli_dal_file          (const TString&);
+  void   calcola_percentuale     (TMask& m);
+  bool   ricalcola_numero_giorni (TMask_field& f, KEY k);
+  bool   ricalcolo_percentuale   (TMask_field& f, KEY k);
+  void   tipo_pagamento          (TMask_field& f, KEY k);
+  void   ulteriore_riclass       (TMask_field& f, KEY k);
+
+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();
+  
+  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:
+
+  TMask * main_mask() { return _msk; }
+  BA3700_application() : TRelation_application() {} 
+  virtual ~BA3700_application() {}
+};
+                                                 
+                                                 
+HIDDEN BA3700_application * app() { return (BA3700_application*) MainApp(); }
+
+TMask*  BA3700_application::get_mask(int mode)
+{
+  return _msk;
+}
+
+void BA3700_application::togli_dal_file(const TString& cod_pag)
+{
+  long i;
+  TTable& tab_rpg = (TTable&)_rel->lfile(-ALIAS);
+  long last  = _righe_gia_presenti.last_one();
+  long start = _righe_gia_presenti.first_one();
+  TString16 dep;
+
+  for (i=start; i<=last; i++)
+  {
+    if (_righe_gia_presenti[i])
+    {
+      tab_rpg.zero();
+      dep.format ("%-4s%3d", (const char*) cod_pag, i);
+      tab_rpg.put("CODTAB", dep);
+      tab_rpg.remove();
+    }
+  }
+}
+
+void BA3700_application::read_tabrpg(TMask& m)
+{
+  long    numero_giorni, num_giorni_prima_rata;
+  TString    tipo_pagamento;
+  TString percentuale, cod_pag, ult_class;
+  bool    ok = FALSE;
+  TTable& tab_rpg = (TTable&)_rel->lfile(-ALIAS);
+  long    numrig;
+  int i = 0;
+  
+  _numero_rate = 0;
+  
+  cod_pag = m.get(F_CODICE);
+
+  _rel->update();
+
+  _righe_gia_presenti.reset();
+
+  ok = _rel->is_first_match(-ALIAS);
+
+  while (ok)
+  {
+    TRecfield num (tab_rpg.curr(),"CODTAB",4,6);
+    numrig           = long(num);
+    numero_giorni    = tab_rpg.get_long("I0");
+    percentuale      = tab_rpg.get     ("R0");
+    tipo_pagamento   = tab_rpg.get     ("S0");
+    ult_class        = tab_rpg.get     ("S1");
+    
+    if (i == 0)    //Sono sulla prima rata
+      num_giorni_prima_rata = numero_giorni;
+    
+    if (i == 1)    //Sono sulla seconda rata 
+      _interv_rate = numero_giorni - num_giorni_prima_rata;
+       
+    _righe_tabrpg.add_riga(numero_giorni,percentuale,tipo_pagamento,ult_class);
+    _righe_gia_presenti.set(numrig);
+    ok = _rel->next_match(-ALIAS);
+    i++;
+  } 
+  _numero_rate = i;
+}
+
+bool BA3700_application::fill_sheet(TMask& m)
+{
+  long items;
+
+  _righe_tabrpg.destroy();
+
+  TSheet_field& cs = (TSheet_field&)m.field(F_SHEET_RPG);
+  cs.reset();
+
+  read_tabrpg(m);
+
+  items = _righe_tabrpg.items();
+
+  for (int i = 0; i < items; i++)
+  {
+    TToken_string &riga = cs.row(i);
+
+    riga.cut(0);
+    riga = (Riga_tabrpg&)_righe_tabrpg[i];
+  }
+
+  bool rate_diff = m.get_bool(F_RATE_DIFF);
+
+  if (!rate_diff)
+    calcola_percentuale(m);
+
+  cs.force_update();
+
+  _righe_tabrpg.destroy();
+
+  return TRUE;
+}
+
+void BA3700_application::init_insert_mode(TMask& m)
+{
+  _interv_rate = 0;
+}
+
+void BA3700_application::init_modify_mode(TMask& m)
+{
+  bool rate_differenziate = FALSE;
+
+  rate_differenziate = m.get_bool(F_RATE_DIFF);
+
+  if (rate_differenziate)
+  _interv_rate = 0;
+}
+
+bool BA3700_application::rate_differenziate(TMask_field& f, KEY k)
+{
+  long items;
+
+  TSheet_field& cs = (TSheet_field&)f.mask().field(F_SHEET_RPG);
+  items = cs.items();
+
+  bool rate_diff = f.mask().get_bool(F_RATE_DIFF);
+  
+  if (k == K_SPACE)
+  {
+    if (rate_diff)
+    {
+      f.mask().disable(F_NUM_RATE);
+      f.mask().disable(F_INT_RATE);
+
+      for (int i = 1; i < items; i++)
+      {
+        if (i == 1)
+          cs.enable_cell(i,1);
+
+        if (i >= 2)
+          cs.enable_cell(i,-1);
+      }
+    }
+    else
+    {
+      f.mask().enable(F_NUM_RATE);
+      f.mask().enable(F_INT_RATE);
+
+      f.mask().set(F_NUM_RATE, items);
+      f.mask().set(F_INT_RATE, app()->_interv_rate);
+
+      for (int i = 0; i < items; i++)
+      {
+
+        if (i == 1)
+	  cs.disable_cell(i,1);
+       
+        if (i >= 2)
+	  cs.disable_cell(i,-1);
+      }
+    }
+    cs.force_update();
+  }
+  return TRUE;
+}
+
+bool BA3700_application::intervallo_rate(TMask_field& f, KEY k)
+{
+  bool mese_comm = FALSE;
+  long numero_giorni, num_giorni, items, interv_rate;
+
+  if (f.to_check(k))
+  {
+    mese_comm = f.mask().get_bool(F_MESECOMM);
+    interv_rate = f.mask().get_long(F_INT_RATE);
+
+    if (mese_comm)
+    {
+      if ((interv_rate % 30) != 0)
+      {
+        f.error_box("L' intervallo tra rate successive deve essere un multiplo di 30, perche' e' stato selezionato il mese commerciale");
+	return FALSE;
+      }
+    }
+
+    TSheet_field& cs = (TSheet_field&)f.mask().field(F_SHEET_RPG);
+    items = cs.items();
+
+    for (int i = 0; i < items; i++)
+    {
+      TToken_string& riga = cs.row(i);
+
+      if (i >= 1)
+      {
+        numero_giorni = num_giorni + interv_rate;
+	TString ng (format("%4d", numero_giorni));
+	riga.add(ng, 0);
+      }
+
+      num_giorni = atol(riga.get(0));
+    }
+    cs.force_update();
+  }
+  return TRUE;
+}
+
+bool BA3700_application::tipo_prima_rata(TMask_field& f, KEY k)
+{
+  char tipo_rata;
+  long items;
+
+  TSheet_field& cs = (TSheet_field&)f.mask().field(F_SHEET_RPG);
+  items = cs.items();
+
+  bool rate_diff = f.mask().get_bool(F_RATE_DIFF);
+
+  if (f.to_check(k, TRUE))
+  {
+    tipo_rata = f.mask().get(F_TIPO_PRIMA_RATA)[0];
+
+    for (int i = 0; i < items; i++)
+    {
+      TToken_string& riga = cs.row(i);
+
+      if ((tipo_rata == '1') || (tipo_rata == '2') || (tipo_rata == '3'))
+      {
+
+	if (i == 0)
+        {
+          riga.add("0.00", 1);
+	  cs.disable_cell(i,1);
+	}
+	else
+        {
+          if (rate_diff)
+	    cs.enable_cell(i,1);
+	  else
+	    if (i == 0)
+              cs.enable_cell(i,1);
+        }
+      }
+      else
+        if ((tipo_rata == '4') || (tipo_rata == '5') || (tipo_rata == '6'))
+        {
+
+          if (i == 0)
+            riga.add("100.00", 1);
+
+	  if (i >= 1)
+	    riga.add("0.00", 1);
+
+	  cs.disable_cell(i,1);
+	}
+	else
+        {
+	  if (tipo_rata == 0)
+            if (rate_diff)
+	      cs.enable_cell(i,1);
+	    else
+	      if (i == 0)
+                cs.enable_cell(i,1);
+        }
+    }
+    if (rate_diff)
+    {
+      TString perc_str;
+      real percentuale;
+
+      long items = cs.items();
+
+      for (int i = 0; i < items; i++)
+      {
+	TToken_string& riga = cs.row(i);
+
+	perc_str = riga.get(1);
+        real perc(perc_str);
+        percentuale += perc;
+      }
+
+      if (percentuale != 100)
+      {
+        f.error_box("La somma delle percentuali di tutte le rate deve essere 100");
+	return FALSE;
+      }
+    }
+    else
+      app()->calcola_percentuale(f.mask());
+    cs.force_update();
+  }
+  return TRUE;
+}
+
+bool BA3700_application::numero_rate(TMask_field& f, KEY k)
+{
+  long    items, num_giorni, numero_giorni;
+  TString perc_str;
+  real    perc,percentuale,perc_rimasta;
+
+  TSheet_field& cs = (TSheet_field&)f.mask().field(F_SHEET_RPG);
+  items = cs.items();
+
+  if (f.to_check(k))
+  {
+    long numero_rate = f.mask().get_long(F_NUM_RATE);
+    char tipo_rata   = f.mask().get     (F_TIPO_PRIMA_RATA)[0];
+    long interv_rate = f.mask().get_long(F_INT_RATE);
+
+    if (numero_rate == 0)
+    {
+      f.error_box("Valore non consentito ! Deve esistere almeno la prima rata.");
+      return FALSE;
+    }
+    else
+    {
+      if (items < numero_rate)
+      {
+	TToken_string& riga_app = cs.row((int)items - 1); //Mi posiziono sull'ultima rata
+
+	num_giorni = atol(riga_app.get(0));
+
+	for (long i = items; i < numero_rate; i++)
+	{
+	  TToken_string& riga = cs.row((int)i);
+
+	  riga.cut(0);
+	  riga = riga_app;
+	  numero_giorni = num_giorni + interv_rate;
+	  TString ng (format("%4d", numero_giorni));
+	  riga.add(ng, 0);
+	  num_giorni = atol(riga.get(0));
+
+	  if (i == 1l)
+        cs.disable_cell((int)i,1);
+       
+      else if (i >= 2l)
+	    cs.disable_cell((int)i,-1);
+
+	//  cs.disable_cell(i,-1);
+	}
+      }
+      else
+     	if (items > numero_rate)
+	{
+	  TToken_string& riga_appI  = cs.row(0); //Mi posiziono sulla prima rata
+          TToken_string& riga_appII = cs.row(1); //Mi posiziono sulla seconda rata  ***
+
+          num_giorni = atol(riga_appI.get(0));
+
+	  cs.reset();
+
+	  for (int i = 0; i < numero_rate; i++)
+	  {
+	    TToken_string& riga = cs.row(i);
+
+	    if (i == 0)         // ***
+            {                   //Ricopio i dati della prima rata nella prima rata
+	      riga.cut(0);      // ***
+	      riga = riga_appI; // ***
+	    }
+
+	    if (i > 0)
+	    {
+	      riga.cut(0);
+	      riga = riga_appII; //Ricopio i dati della seconda rata in tutte le altre
+	      numero_giorni = num_giorni + interv_rate;
+	      TString ng (format("%4d", numero_giorni));
+	      riga.add(ng, 0);
+	    }
+	    num_giorni = atol(riga.get(0));
+
+	    
+            if (i == 1)
+	      cs.disable_cell(i,1);
+	    if (i >=2)
+              cs.disable_cell(i,-1);
+	  }
+	}
+    }
+
+    items = numero_rate;
+
+    for (int i = 0; i<items; i++)
+    {
+      TToken_string& riga = cs.row(i);
+      
+      if (i == 0)
+      {
+        perc_str = riga.get(1);
+     	real perc(perc_str);
+	if ((((tipo_rata!='1')||(tipo_rata!='2')||(tipo_rata!='3'))&&(perc>0))
+	||(((tipo_rata=='1')||(tipo_rata=='2')||(tipo_rata=='3'))&&(perc==0)))
+        {  
+	  perc_rimasta = 100 - perc;
+	  percentuale = perc_rimasta / (numero_rate - 1);
+        }
+      }
+
+      if (i >= 1)
+      {
+        TString perc = percentuale.string();
+	riga.add(perc, 1);
+      }
+    }
+    cs.force_update();
+  }
+  return TRUE;
+}
+
+bool BA3700_application::mese_commerciale(TMask_field& f, KEY k)
+{
+  long interv_rate;
+
+  if (k == K_SPACE)
+  {
+    bool mese_comm = f.mask().get_bool(F_MESECOMM);
+    bool rate_diff = f.mask().get_bool(F_RATE_DIFF);
+
+    if (!rate_diff)
+    {
+      if (mese_comm)
+      {
+        interv_rate = f.mask().get_long(F_INT_RATE);
+        if ((interv_rate % 30) != 0)
+        {
+	  f.error_box("L' intervallo tra rate successive deve essere un multiplo di 30, perche' e' stato selezionato il mese commerciale");
+	  return FALSE;
+	}
+      }
+    }
+  }
+  return TRUE;
+}
+
+void BA3700_application::calcola_percentuale(TMask& m)
+{
+  TString perc_str;
+  real    perc_rimasta, percentuale;
+  long items;
+
+//  TSheet_field& cs = (TSheet_field&)m.field(F_SHEET_RPG);
+  TSheet_field& cs = (TSheet_field&)app()->main_mask()->field(F_SHEET_RPG);
+  items = cs.items();
+
+  for (int i = 0; i<items; i++)
+  {
+    TToken_string& riga = cs.row(i);
+
+    if (i == 0)
+    {
+      perc_str = riga.get(1);
+      real perc(perc_str);
+      perc_rimasta = 100 - perc;
+      percentuale = perc_rimasta / (_numero_rate - 1);
+    }
+
+    if (i >= 1)
+    {
+      TString perc = percentuale.string();
+      riga.add(perc, 1);
+    }
+  }
+}
+
+bool BA3700_application::ricalcolo_percentuale(TMask_field& f, KEY k)
+{
+//  TSheet_field& cs = (TSheet_field&)f.mask().field(F_SHEET_RPG);
+  TSheet_field& cs = (TSheet_field&)app()->main_mask()->field(F_SHEET_RPG);
+  long items = cs.items();
+
+  if (f.mask().mode() == MODE_QUERY)
+    return TRUE;
+
+  if (k == K_ENTER)
+  {
+    bool rate_diff = app()->main_mask()->get_bool(F_RATE_DIFF);
+    if (rate_diff)
+    {
+      TString perc_str;
+      real percentuale;
+
+      long items = cs.items();
+
+      for (int i = 0; i < items; i++)
+      {
+	TToken_string& riga = cs.row(i);
+
+	perc_str = riga.get(1);
+        real perc(perc_str);
+        percentuale += perc;
+      }
+
+      if (percentuale != 100)
+      {
+        f.error_box("La somma delle percentuali di tutte le rate deve essere 100");
+	return FALSE;
+      }
+    }
+    else
+    {
+      if (_riga == 0)
+      {
+        app()->_numero_rate = items;
+	app()->calcola_percentuale(f.mask());
+      }
+    }
+  
+    cs.force_update();
+  }
+  return TRUE;
+}
+
+bool BA3700_application::ricalcola_numero_giorni(TMask_field& f, KEY k)
+{
+  long items, ng, giorni;
+
+//  TSheet_field& cs = (TSheet_field&)f.mask().field(F_SHEET_RPG);
+  TSheet_field& cs = (TSheet_field&)app()->main_mask()->field(F_SHEET_RPG);
+  items = cs.items();
+
+  if (f.mask().mode() == MODE_QUERY)
+    return TRUE;
+
+  if (k == K_ENTER)
+  {
+    bool mese_comm   = app()->main_mask()->get_bool(F_MESECOMM);
+    bool rate_diff   = app()->main_mask()->get_bool(F_RATE_DIFF);
+    
+    if (!rate_diff)
+    {
+      if (app()->_riga == 0)
+      {
+	TToken_string& riga_app = cs.row(0);
+	giorni = atol(riga_app.get(0));
+
+	long interv_rate = app()->main_mask()->get_long(F_INT_RATE);
+
+	if (mese_comm)
+        {
+          if ((giorni % 30) != 0)
+          {  
+            f.error_box("Il numero di giorni deve essere un multiplo di 30, perche' e' stato selezionato il mese commerciale");
+            return FALSE;
+          }
+        }
+
+        for (int i = 1; i < items; i++)
+        {
+          TToken_string& riga = cs.row(i);
+
+          ng = giorni + interv_rate;
+          TString ngiorni (format("%4d", ng));
+          riga.add(ngiorni, 0);
+
+          giorni = atol(riga.get(0));
+        }
+      }
+
+      if (app()->_riga == 1)
+      {
+	long gg_I_rata, interv_rate;
+
+	for (int i = 0; i < items; i++)
+	{
+	  TToken_string& riga = cs.row(i);
+
+	  if (i == 0)
+	    gg_I_rata = atol(riga.get(0));
+
+	  if (i == 1)
+          {
+	    giorni = atol(riga.get(0));
+
+	    if (mese_comm)
+            {
+              if ((giorni % 30) != 0)
+              {  
+                f.error_box("Il numero di giorni deve essere un multiplo di 30, perche' e' stato selezionato il mese commerciale");
+                return FALSE;
+              }
+            }
+
+	    interv_rate = giorni - gg_I_rata;
+          }
+
+	  if (i >= 2)
+          {
+	    ng = giorni + interv_rate;
+            TString ngiorni (format("%4d", ng));
+	    riga.add(ngiorni, 0);
+	    giorni = atol(riga.get(0));
+          }
+        }
+      }
+      cs.force_update();
+    }
+  }
+  return TRUE;
+}
+
+void BA3700_application::tipo_pagamento(TMask_field& f, KEY k)
+{
+  long items;
+
+  TSheet_field& cs = (TSheet_field&)app()->main_mask()->field(F_SHEET_RPG);
+  items = cs.items();
+
+  if (k == K_ENTER)
+  {
+    bool rate_diff   = app()->main_mask()->get_bool(F_RATE_DIFF);
+
+    if (!rate_diff)
+    {
+      if (app()->_riga == 1)
+      {
+	TToken_string& riga_app = cs.row(1);
+        TString tp_pag = riga_app.get(2);
+
+	for (int i = 2; i < items; i++)
+        {
+          TToken_string& riga = cs.row(i);
+
+	  riga.add(tp_pag, 2);
+        }
+      }
+    }
+  }
+}
+
+void BA3700_application::ulteriore_riclass(TMask_field& f, KEY k)
+{
+  long items;
+
+  TSheet_field& cs = (TSheet_field&)app()->main_mask()->field(F_SHEET_RPG);
+  items = cs.items();
+
+  if (k == K_ENTER)
+  {
+    bool rate_diff   = app()->main_mask()->get_bool(F_RATE_DIFF);
+
+    if (!rate_diff)
+    {
+      if (app()->_riga == 1)
+      {
+	TToken_string& riga_app = cs.row(1);
+        TString ult_riclass = riga_app.get(3);
+
+	for (int i = 2; i < items; i++)
+        {
+          TToken_string& riga = cs.row(i);
+
+	  riga.add(ult_riclass, 3);
+        }
+      }
+    }
+  }
+}
+
+bool BA3700_application::riga_sheet(int r, KEY k)
+{
+  if (k == K_SPACE)
+    app()->_riga = r;
+
+  TSheet_field& cs = (TSheet_field&)app()->main_mask()->field(F_SHEET_RPG);
+  TMask_field& fld = cs.sheet_mask().field(101);
+
+  TMask_field& ftp = cs.sheet_mask().field(103);
+  app()->tipo_pagamento(ftp,k);
+
+  TMask_field& fuc = cs.sheet_mask().field(104);
+  app()->ulteriore_riclass(fuc,k);
+
+  TMask_field& f = cs.sheet_mask().field(102);
+
+  if ((app()->ricalcola_numero_giorni(fld,k))&&(app()->ricalcolo_percentuale(f,k)))
+    return TRUE;
+  else
+    return FALSE;
+}
+
+int BA3700_application::rewrite(const TMask& m)
+{
+  long items;
+  TTable& tab_rpg = (TTable&)_rel->lfile(-ALIAS);
+  TString dep;
+  
+  TString cod_pag = m.get(F_CODICE);
+
+  m.autosave(_rel);
+
+  TSheet_field& cs = (TSheet_field&)m.field(F_SHEET_RPG);
+
+  items = cs.items();
+
+  for (int i = 0; i < items; i++)
+  {
+    TToken_string &riga = cs.row(i);
+    TString codtab (format("%-4s%3d",(const char*)cod_pag,i));
+    long numero_giorni  = atol(riga.get(0));
+    if (numero_giorni != 0)
+    {
+      tab_rpg.put ("CODTAB", codtab);
+      tab_rpg.put ("I0", numero_giorni);
+      tab_rpg.put ("R0", riga.get());
+       dep = riga.get();
+      if (dep != "")
+	tab_rpg.put ("S0", dep);
+      dep = riga.get();
+      if (dep != "")
+	tab_rpg.put ("S1", dep);
+
+      if (_righe_gia_presenti[i])
+      {
+       tab_rpg.rewrite();
+       _righe_gia_presenti.reset(i);
+      }
+      else
+	tab_rpg.write();
+    }
+  }
+  togli_dal_file(cod_pag);
+  return _rel->rewrite();
+}
+
+int BA3700_application::write(const TMask& m)
+{
+  long items;
+  TTable& tab_rpg = (TTable&)_rel->lfile(-ALIAS);
+  TString dep;
+
+  TString cod_pag = m.get(F_CODICE);
+
+  m.autosave(_rel);
+
+  TSheet_field& cs = (TSheet_field&)m.field(F_SHEET_RPG);
+
+  items = cs.items();
+
+  tab_rpg.zero();
+
+  for (int i = 0; i < items; i++)
+  {
+    TToken_string &riga = cs.row(i);
+    TString codtab (format("%-4s%3d",(const char*)cod_pag,i));
+    long numero_giorni  = atol(riga.get(0));
+    if (numero_giorni != 0)
+    {
+      tab_rpg.put ("CODTAB", codtab);
+      tab_rpg.put ("I0", numero_giorni);
+      tab_rpg.put ("R0", riga.get());
+      dep = riga.get();
+      if (dep != "")
+	tab_rpg.put ("S0", dep);
+      dep = riga.get();
+      if (dep != "")
+        tab_rpg.put ("S1", dep);
+      tab_rpg.write();
+    }
+  }
+  return _rel->write();
+}
+
+bool BA3700_application::remove()
+{
+  TSheet_field& cs = (TSheet_field&)_msk->field(F_SHEET_RPG);
+  cancella(cs.items());
+  TRelation_application::remove();
+  return TRUE;
+}
+
+int BA3700_application::cancella(long items)
+{
+  TTable& tab_rpg = (TTable&)_rel->lfile(-ALIAS);
+  TRecfield an (tab_rpg.curr(),"CODTAB",0,3);
+  TString   cod_pag,dep;
+  
+  cod_pag   = (const char*)(an);
+  
+  for (long i = 0; i < items; i++)
+  {
+    tab_rpg.zero();
+    dep =  format ("%-4s", (const char*) cod_pag);
+    dep << format ("%3d" , i);
+    tab_rpg.put("CODTAB", dep);
+    if (tab_rpg.read(_isequal, _lock) == NOERR)
+      tab_rpg.remove();
+  }
+  return tab_rpg.status();
+}
+
+int BA3700_application::read(TMask& m)
+{
+  m.autoload(_rel);
+  fill_sheet(m);
+
+  return NOERR;
+}
+
+bool BA3700_application::user_create()
+{
+  _rel = new TRelation (TAB_CPG);
+
+//E' stato usato un solo = perche' altrimenti per come sono fatte le lib. vi
+//sono problemi di allineamento all' interno di relation.cpp.
+
+  _rel->add(TAB_RPG, "CODTAB[1,4]=CODTAB" ,1, 0, ALIAS); //-4 = alias,perche'le
+				    //due tabelle sono entrambe in TABCOM.dta
+
+  _interv_rate = 0;
+
+  _msk = new TMask("ba3700a");
+
+  _msk->set_handler (F_INT_RATE        , intervallo_rate);
+  _msk->set_handler (F_RATE_DIFF       , rate_differenziate);
+  _msk->set_handler (F_TIPO_PRIMA_RATA , tipo_prima_rata);
+  _msk->set_handler (F_NUM_RATE        , numero_rate);
+  _msk->set_handler (F_MESECOMM        , mese_commerciale);
+
+  TSheet_field& cs = (TSheet_field&)_msk->field(F_SHEET_RPG);
+//  cs.sheet_mask().set_handler (102               , ricalcolo_percentuale);
+//  cs.sheet_mask().set_handler (101               , ricalcola_numero_giorni);
+  cs.set_notify               (riga_sheet);
+
+  return TRUE;
+}
+
+bool BA3700_application::user_destroy()
+{
+  delete _msk;
+  delete _rel;
+  return TRUE;
+}
+
+int ba3700(int argc, char* argv[])
+{
+  BA3700_application a;
+  a.run(argc, argv, "Tabella condizioni di pagamento");
+  return 0;
+}
+
+
+
diff --git a/ba/ba4200.cpp b/ba/ba4200.cpp
index db3c5b1f5..260078575 100755
--- a/ba/ba4200.cpp
+++ b/ba/ba4200.cpp
@@ -1,501 +1,505 @@
-#include <execp.h>
-#include <mask.h>
-#include <mailbox.h>
-#include <relapp.h>
-#include <tabutil.h>
-#include <utility.h>
-#include <validate.h>
-
-#include "ba4.h"
-#include "ba4200.h"
-
-#define FLD_GD1_TIPOA     126
-#define FLD_GD1_CODANAGR  127
-#define FLD_GD1_CODDITTAH 627
-
-
-class BA4200_application : public TRelation_application
-{
-  char _tip_ana ;
-  TString       _cod_ana ;
-  TMask*        _msk[2] ;
-  TRelation*    _rel[2];
-  TLocalisamfile* _comuni;
-  TLocalisamfile* _tabcom;
-
-protected:
-  virtual bool user_create() ;
-  virtual bool user_destroy() ;
-  virtual int read(TMask& m);
-  virtual int rewrite(const TMask& m);
-  virtual void  init_query_mode(TMask& m);
-  virtual void  init_insert_mode(TMask& m);
-  virtual void  init_modify_mode(TMask& m);
-  virtual bool changing_mask(int mode) {return _msk[tip_msk()] == NULL;}
-  virtual const char* get_next_key();
-  virtual TMask* get_mask(int mode) ;
-  virtual void write_enable(const bool on = TRUE);
-  
-  static bool ba4200_handler(TMask& m, KEY k);
-  
-public:
-  virtual int write(const TMask& m);
-  virtual TRelation* get_relation() const { return _rel[tip_msk()];}
-  void manual_save(const TMask& m);
-  int tip_msk() const { return _tip_ana == TFIS ? MSKF : MSKG;}
-  bool ana_fis() const { return _tip_ana == TFIS;}
-  bool ana_giu() const { return _tip_ana == TGIU;}
-  void set_tip_ana(char tip) { _tip_ana = toupper(tip);}
-  void set_cod_ana(const char* cod) { _cod_ana = cod;}
-  const char* cod_ana() { return _cod_ana;}
-  char tip_ana() { return _tip_ana;}
-  virtual bool force_cursor_usage() const { return TRUE;}
-
-  BA4200_application(char ta) { set_tip_ana(ta); }
-  virtual ~BA4200_application() {}
-};
-
-bool BA4200_application::ba4200_handler(TMask& m, KEY k)
-{
-  BA4200_application& app = (BA4200_application&)main_app();
-
-  if (k == K_F10)
-  {
-    if (app.ana_fis()) app.set_tip_ana(TGIU);
-    else app.set_tip_ana(TFIS);
-    m.stop_run(K_ESC);
-    return FALSE;
-  }
-  if (k != K_F5 || m.mode() != MODE_MOD) return TRUE;
-  TToken_string body(16);
-
-  body.add(format("%d", FLD_GD1_CODDITTAH));
-  if ( app.tip_ana() == TFIS )
-  {
-    body.add(format("%d=F", FLD_GD1_TIPOA));
-    body.add(format("%d=%s", FLD_GD1_CODANAGR, (const char*) app.cod_ana()));
-  }
-  else
-  {
-    body.add(format("%d=G", FLD_GD1_TIPOA));
-    body.add(format("%d=%s", FLD_GD1_CODANAGR, (const char*) app.cod_ana()));
-  }
-#if XVT_OS == XVT_OS_WIN
-  TString16 cmd("ba4b -2");
-#else
-  TString16 cmd("ba4 -2");
-#endif
-  TMessage  msg(cmd2name(cmd), MSG_FS, (const char*) body);
-  TMailbox mb;
-  mb.send(msg);
-  TLocalisamfile* d = app.get_relation()->lfile();
-
-  d->setkey(1);
-  d->zero();
-  d->put(N_TIPOA, app.ana_fis() ? "F" : "G");
-  d->put(N_CODANAGR,  m.get(FLD_CODANAGR));
-  d->read(_isequal, _unlock) ;
-  TExternal_app a(cmd);
-  a.run();
-  d->read(_iscurr, _lock) ;
-  m.set_focus();
-  return FALSE;
-}
-
-void  BA4200_application::init_query_mode(TMask& m)
-
-{
-  m.disable(DLG_DITTE);
-  m.enable(DLG_CHGTIP);
-}
-
-const char* BA4200_application::get_next_key()
-
-{
-  TLocalisamfile&       anag = *get_relation()->lfile() ;
-  long cod_anagr = 1;
-
-  if (!anag.empty() )
-  {
-    anag.zero() ;
-    anag.setkey(1) ;
-    if (ana_fis())
-    {
-      anag.put(N_TIPOA, TGIU);
-      anag.read(_isgteq) ;
-      if (anag.good()) anag.prev();
-      const char t_ret = anag.get_char(N_TIPOA);
-      if ( t_ret == TFIS ) 
-        cod_anagr = anag.get_long(N_CODANAGR)+1;
-    }
-    else
-    {
-      anag.last( ) ;
-      if (anag.good())
-      {
-        const char t_ret = anag.get_char(N_TIPOA);
-        if ( t_ret == TGIU ) 
-          cod_anagr = anag.get_long(N_CODANAGR)+1;
-      }
-    }
-  }
-  _cod_ana.format("%ld", cod_anagr);
-  return format("%d|%ld", FLD_CODANAGR, cod_anagr);
-}
-
-
-void  BA4200_application::init_insert_mode(TMask& m)
-{
-  m.disable(DLG_DITTE);
-  m.disable(DLG_CHGTIP);
-}
-
-
-void  BA4200_application::init_modify_mode(TMask& m)
-{
-  m.enable(DLG_DITTE);
-  m.disable(DLG_CHGTIP);
-}
-
-
-bool gest_nazionalita(TMask_field& f, KEY key)
-{
-  if (f.mask().query_mode() || key == K_SPACE) return TRUE;
-  TMask&                                msk = f.mask() ;
-  TString                               nazionalita = (const char*)msk.get(FLD_AF1_STATONASC_TABSTE_S0) ;   
-
-  if (f.to_check(key) || nazionalita.empty())
-  {
-    TString                             cod_stato = (const char* ) f.get() ;
-
-    if ( cod_stato.empty() )
-      msk.set(FLD_AF1_STATONASC_TABSTE_S0,"italiana") ;
-    else
-    {
-      TTable                                    t_stati("%STA");
-      TRectype&                         rectab = t_stati.curr() ;
-      rectab.zero() ;
-      rectab.put(N_CODTAB, cod_stato);
-      t_stati.read() ;
-      if ( t_stati.good() )
-        msk.set( FLD_AF1_STATONASC_TABSTE_S0 ,  rectab.get(N_NAZIONALITA) ) ;
-    }
-  }
-  return TRUE ;
-}
-
-// Handler dell'ufficio imposte dirette                   
-bool gest_uff_imp_nr(TMask_field& f, KEY key)
-{                     
-  /*
-     if (!f.to_check(key)) return TRUE;
-
-     const TString cod_uff(f.get());
-     if (cod_uff.empty()) return TRUE;
-     
-     TMask& msk = f.mask() ;
-     TTable uff_imp("%UID");
-
-     uff_imp.zero() ;
-     uff_imp.put(N_CODTAB, cod_uff);
-     uff_imp.read() ;
-     if ( uff_imp.good() )
-     {               
-     const bool giuridica = ((BA4200_application*)MainApp())->ana_giu();
-     const TFixed_string codcom(uff_imp.get(N_COMUNE));
-     const char* com = msk.get(giuridica ? FLD_AG1_COMRF : FLD_AF2_COMRF);
-     if (*com)
-     {
-     if(codcom != com) 
-     return f.error_box("L'ufficio deve appartenere al comune di residenza fiscale: %s", com);
-     }
-     else
-     {
-     com = msk.get(giuridica ? FLD_AG2_COMRES : FLD_AF1_COMRES);
-     if(codcom != com) 
-     return f.error_box("L'ufficio deve appartenere al comune di residenza: %s", com);
-     }  
-     }  
-     */         
-  return TRUE; 
-} 
-
-
-// Handler del comunde di residenza e residenza fiscale                                            
-bool gest_uff_imp(TMask_field& f, KEY key)
-{
-  if (f.mask().query_mode() || !f.to_check(key, TRUE)) 
-    return TRUE;
-
-  TString       cod_sta, cod_com;
-  TMask& msk = f.mask() ;
-  const short   dlg = f.dlg();
-  const bool giuridica = ((BA4200_application*)MainApp())->ana_giu();
-
-  if ( giuridica )
-  {
-    cod_com = msk.get(FLD_AG1_COMRF);
-    if ((dlg == FLD_AG2_COMRES) || (dlg == FLD_AG2_STATORES))
-      if (cod_com.not_empty()) return TRUE;
-    cod_sta = msk.get(FLD_AG1_STATORF);
-  }
-  else
-  {
-    cod_com = msk.get(FLD_AF2_COMRF);
-    if ((dlg == FLD_AF1_COMRES) || (dlg == FLD_AF1_STATORES))
-      if (cod_com.not_empty()) return TRUE;
-    cod_sta = msk.get(FLD_AF2_STATORF);
-  }
-  
-  if (cod_com.empty())
-  {
-    cod_com = msk.get(giuridica ? FLD_AG2_COMRES : FLD_AF1_COMRES) ;
-    cod_sta = msk.get(giuridica ? FLD_AG2_STATORES : FLD_AF1_STATORES) ;
-  }     
-  
-  if (cod_com.empty())
-    return TRUE;
-  
-  TLocalisamfile        comuni(LF_COMUNI) ;
-  comuni.setkey(1) ;
-  comuni.zero() ;
-  comuni.put(N_STATO, cod_sta);
-  comuni.put(N_COM, cod_com );
-  if (comuni.read() == NOERR)
-  {
-    msk.set(F_IMP_DENCOM, comuni.get("DENCOM"));
-    msk.set(F_IMP_PROVCOM, comuni.get("PROVCOM"));
-
-    TString s(comuni.get(N_IMPDIR1)) ; 
-    if (s.empty()) s = comuni.get(N_IMPDIR2) ; 
-    if (s.empty()) s = comuni.get(N_IMPDIR3) ; 
-    msk.set(F_UFFIIDD, s) ; msk.field(F_UFFIIDD).on_key(K_TAB);
-    msk.set(F_UFFREG, comuni.get("UFFREG")); msk.field(F_UFFREG).on_key(K_TAB);
-    msk.set(F_UFFCONC, comuni.get("UFFCONC")); msk.field(F_UFFCONC).on_key(K_TAB);
-    msk.set(F_UFFSERV, comuni.get("UFFCSERV")); msk.field(F_UFFSERV).on_key(K_TAB);
-
-    msk.set(F_CODCONTR_EP, comuni.get("UFFESPROV").mid(1, 2));
-    msk.set(F_CODCONTR_EC, comuni.get("UFFESCOM"));
-  }     
-  
-  return TRUE;
-}
-
-bool no_dup_fis(TMask_field& f, KEY key)
-{
-  if (f.mask().query_mode() || !f.to_check(key)) return TRUE;
-  BA4200_application*  app = (BA4200_application*) MainApp();
-  TLocalisamfile&       anag = *app->get_relation()->lfile(LF_ANAG) ;
-  
-  const TString16 cofi(f.get());                     
-  if ( cofi.not_empty() )
-  {              
-    anag.zero() ;
-    anag.put(N_TIPOA, app->tip_ana());
-    anag.put(N_COFI, cofi ) ;
-    anag.setkey(3) ;
-    anag.read() ;
-    anag.setkey(1) ;
-    const char t = anag.get_char(N_TIPOA), t1 = app->tip_ana();
-    const TString16     s = anag.get(N_CODANAGR), s1 = app->cod_ana();
-
-    if (anag.good() && (t1 != t || s1 != s))
-    {
-      f.error_box("Codice fiscale gia' utilizzato per il codice %c/%s",
-                  t, (const char*)s);
-      return FALSE;
-    }
-  }
-  return TRUE ;
-}
-
-bool gest_iva(TMask_field& f, KEY key , short   fd_sta ,short fd_iva )
-{
-  if (f.mask().query_mode() || !f.to_check(key)) return TRUE;
-  
-  BA4200_application*  app = (BA4200_application*) MainApp();
-  TLocalisamfile&       anag = *app->get_relation()->lfile(LF_ANAG) ;
-  TMask& msk = f.mask() ;
-
-  if ( f.get().not_empty() && !anag.empty() )
-  {
-    anag.zero() ;        
-    anag.put(N_TIPOA, app->tip_ana());
-    anag.put(N_STATOPAIV, msk.get(fd_sta) ) ;
-    anag.put(N_PAIV, msk.get(fd_iva) ) ;
-    anag.setkey(4) ;
-    anag.read() ;
-    anag.setkey(1) ;
-    const char t  = anag.get_char(N_TIPOA), t1 = app->tip_ana();
-    const TFixed_string s(anag.get(N_CODANAGR)),        s1(app->cod_ana());
-    if (anag.good() && (t1 != t || s1 != s))
-    {
-      f.error_box("Partita iva gia' definita per il codice : %c/%s",
-                  t, (const char*) s);
-      return FALSE ;
-    }
-  }
-  return TRUE ;
-}
-
-bool no_dup_iva_f(TMask_field& f, KEY key)
-
-{
-  if (f.mask().query_mode() || !f.to_check(key)) return TRUE;
-  return ( gest_iva(f , key , FLD_AF1_STATOPAIV ,FLD_AF1_PAIV ) ) ;
-}
-
-bool no_dup_iva_g(TMask_field& f, KEY key)
-{ 
-  if (key == K_ENTER && !f.mask().query_mode() && f.get().empty())
-  {                                    
-    bool ok = FALSE;   
-    if (!f.mask().get_bool(CHK_AG1_ENTENCOMM))
-    {
-      const TString cofi(f.mask().get(FLD_AG1_COFI));
-      if (pi_check("IT", cofi)) 
-      {
-        f.set(cofi);
-        ok = TRUE;
-      }  
-    }
-    if (!ok) return error_box("Partita IVA obbligatoria!");
-  }
-
-  return gest_iva(f , key , FLD_AG1_STATOPAIV ,FLD_AG1_PAIV ) ;
-}
-
-TMask* BA4200_application::get_mask(int mode)
-{ 
-  if (!changing_mask(mode)) return _msk[tip_msk()];
-  if (ana_fis())
-  {
-    if (_msk[MSKG] != NULL) delete _msk[MSKG];
-    _msk[MSKG] = NULL;
-    _msk[MSKF] = new TMask("ba4200b") ;
-    _msk[MSKF]->set_handler(FLD_AF1_PAIV, no_dup_iva_f);
-    _msk[MSKF]->set_handler(FLD_AF1_COFI, no_dup_fis);
-    _msk[MSKF]->set_handler(FLD_AF1_COMRES, gest_uff_imp);
-    _msk[MSKF]->set_handler(FLD_AF2_COMRF, gest_uff_imp);
-    _msk[MSKF]->set_handler(F_UFFIIDD, gest_uff_imp_nr);
-    _msk[MSKF]->set_handler(FLD_AF1_STATORES, gest_nazionalita);
-    _msk[MSKF]->set_handler(FLD_AF1_PAIV, no_dup_iva_f);
-    _msk[MSKF]->set_handler(FLD_AF1_COFI, no_dup_fis);
-    _msk[MSKF]->set_handler(ba4200_handler);
-  }
-  else
-  {
-    if (_msk[MSKF] != NULL) delete _msk[MSKF];
-    _msk[MSKF] = NULL;
-    _msk[MSKG] = new TMask("ba4200c") ;
-    _msk[MSKG]->set_handler(FLD_AG2_COMRES, gest_uff_imp);
-    _msk[MSKG]->set_handler(FLD_AG1_COMRF, gest_uff_imp);
-    _msk[MSKG]->set_handler(F_UFFIIDD, gest_uff_imp_nr);
-    _msk[MSKG]->set_handler(FLD_AG1_COFI, no_dup_fis);
-    _msk[MSKG]->set_handler(FLD_AG1_PAIV, no_dup_iva_g);
-    _msk[MSKG]->set_handler(ba4200_handler);
-  }
-  return _msk[tip_msk()];
-}
-
-bool BA4200_application::user_create() 
-
-{
-  _msk[MSKF] = NULL;
-  _rel[MSKF] = new TRelation(LF_ANAG);
-  //    _rel[MSKF]->add(LF_ANAGFIS, "CODANAGR=CODANAGR", 1, 0, 0, TRUE); verificare
-  _rel[MSKF]->add(LF_ANAGFIS, "CODANAGR=CODANAGR", 1, 0, 0);
-
-  _msk[MSKG] = NULL;
-  _rel[MSKG] = new TRelation(LF_ANAG);
-  //    _rel[MSKG]->add(LF_ANAGGIU, "CODANAGR=CODANAGR", 1, 0, 0, TRUE); verificare
-  _rel[MSKG]->add(LF_ANAGGIU, "CODANAGR=CODANAGR", 1, 0, 0);
-  
-  _comuni = new TLocalisamfile(LF_COMUNI) ;
-  _tabcom = new TLocalisamfile(LF_TABCOM) ;
-
-  return TRUE;
-}
-
-void BA4200_application::write_enable(const bool on)
-
-{
-  _rel[MSKF]->write_enable(-1, on);
-  _rel[MSKG]->write_enable(-1, on);
-}
-
-bool BA4200_application::user_destroy() 
-{
-  for ( int j = 0 ; j < 2 ; j++ )
-  {
-    if (_msk[j]) delete _msk[j] ;
-    if (_rel[j]) delete _rel[j] ;
-  }
-  delete _comuni;
-  delete _tabcom;
-
-  return TRUE;
-}
-
-void BA4200_application::manual_save(const TMask& m)
-
-{
-  TRelation *r = get_relation();
-  TLocalisamfile& anag = *r->lfile(LF_ANAG) ;
-
-  if (ana_fis())
-  {
-    TLocalisamfile&     anafis = *r->lfile(LF_ANAGFIS) ;
-
-    anafis.put(N_CODANAGR, _cod_ana);
-  }
-  else
-  {
-    TLocalisamfile&     anagiu = *r->lfile(LF_ANAGGIU) ;
-    anagiu.put(N_CODANAGR, _cod_ana);
-  }
-
-  const TDate   oggi(TODAY) ;
-  anag.put(N_DATAAGG, oggi.string());
-}
-
-int BA4200_application::read(TMask& m) 
-
-{
-  const TRelation *r = get_relation();
-  m.autoload(r);
-  _cod_ana = r->lfile()->get(N_CODANAGR);
-  return NOERR;
-}
-
-int BA4200_application::write(const TMask& m) 
-
-{
-  TRelation *r = get_relation();
-  r->zero();
-  m.autosave(r);
-  set_cod_ana(r->lfile()->get(N_CODANAGR));
-  manual_save(m);
-  return r->write();
-}
-
-int BA4200_application::rewrite(const TMask& m) 
-
-{
-  TRelation *r = get_relation();
-
-  r->zero();
-  m.autosave(r);
-  manual_save(m);
-  return r->rewrite();
-}
-
-int ba4200(int argc, char* argv[])
-{                         
-  char ta = 'F';
-  if (argc > 2 && toupper(*argv[2]) == 'G') ta = 'G';
-  
-  BA4200_application a(ta);
-  a.run(argc, argv, "Anagrafica persone fisiche e giuridiche");
-  return 0;
-}
+#include <execp.h>
+#include <mask.h>
+#include <mailbox.h>
+#include <relapp.h>
+#include <tabutil.h>
+#include <utility.h>
+#include <validate.h>
+
+#include "ba4.h"
+#include "ba4200.h"
+
+#define FLD_GD1_TIPOA     126
+#define FLD_GD1_CODANAGR  127
+#define FLD_GD1_CODDITTAH 627
+
+
+class BA4200_application : public TRelation_application
+{
+  char _tip_ana ;
+  TString       _cod_ana ;
+  TMask*        _msk[2] ;
+  TRelation*    _rel[2];
+  TLocalisamfile* _comuni;
+  TLocalisamfile* _tabcom;
+
+protected:
+  virtual bool user_create() ;
+  virtual bool user_destroy() ;
+  virtual int read(TMask& m);
+  virtual int rewrite(const TMask& m);
+  virtual void  init_query_mode(TMask& m);
+  virtual void  init_insert_mode(TMask& m);
+  virtual void  init_modify_mode(TMask& m);
+  virtual bool changing_mask(int mode) {return _msk[tip_msk()] == NULL;}
+  virtual const char* get_next_key();
+  virtual TMask* get_mask(int mode) ;
+  virtual void write_enable(const bool on = TRUE);
+  
+  static bool ba4200_handler(TMask& m, KEY k);
+  
+public:
+  virtual int write(const TMask& m);
+  virtual TRelation* get_relation() const { return _rel[tip_msk()];}
+  void manual_save(const TMask& m);
+  int tip_msk() const { return _tip_ana == TFIS ? MSKF : MSKG;}
+  bool ana_fis() const { return _tip_ana == TFIS;}
+  bool ana_giu() const { return _tip_ana == TGIU;}
+  void set_tip_ana(char tip) { _tip_ana = toupper(tip);}
+  void set_cod_ana(const char* cod) { _cod_ana = cod;}
+  const char* cod_ana() { return _cod_ana;}
+  char tip_ana() { return _tip_ana;}
+  virtual bool force_cursor_usage() const { return TRUE;}
+
+  BA4200_application(char ta) { set_tip_ana(ta); }
+  virtual ~BA4200_application() {}
+};
+
+bool BA4200_application::ba4200_handler(TMask& m, KEY k)
+{
+  BA4200_application& app = (BA4200_application&)main_app();
+
+  if (k == K_F10)
+  {
+    if (app.ana_fis()) app.set_tip_ana(TGIU);
+    else app.set_tip_ana(TFIS);
+    m.stop_run(K_ESC);
+    return FALSE;
+  }
+  if (k != K_F5 || m.mode() != MODE_MOD) return TRUE;
+  TToken_string body(16);
+
+  body.add(format("%d", FLD_GD1_CODDITTAH));
+  if ( app.tip_ana() == TFIS )
+  {
+    body.add(format("%d=F", FLD_GD1_TIPOA));
+    body.add(format("%d=%s", FLD_GD1_CODANAGR, (const char*) app.cod_ana()));
+  }
+  else
+  {
+    body.add(format("%d=G", FLD_GD1_TIPOA));
+    body.add(format("%d=%s", FLD_GD1_CODANAGR, (const char*) app.cod_ana()));
+  }
+#if XVT_OS == XVT_OS_WIN
+  TString16 cmd("ba4b -2");
+#else
+  TString16 cmd("ba4 -2");
+#endif
+  TMessage  msg(cmd2name(cmd), MSG_FS, (const char*) body);
+  TMailbox mb;
+  mb.send(msg);
+  TLocalisamfile& d = app.get_relation()->lfile();
+
+  d.setkey(1);
+  d.zero();
+  d.put(N_TIPOA, app.ana_fis() ? "F" : "G");
+  d.put(N_CODANAGR,  m.get(FLD_CODANAGR));
+  d.read(_isequal, _unlock) ;
+  TExternal_app a(cmd);
+  a.run();
+  d.read(_iscurr, _lock) ;
+  m.set_focus();
+  return FALSE;
+}
+
+void  BA4200_application::init_query_mode(TMask& m)
+
+{
+  m.disable(DLG_DITTE);
+  m.enable(DLG_CHGTIP);
+}
+
+const char* BA4200_application::get_next_key()
+
+{
+  TLocalisamfile&       anag = get_relation()->lfile() ;
+  long cod_anagr = 1;
+
+  if (!anag.empty() )
+  {
+    anag.zero() ;
+    anag.setkey(1) ;
+    if (ana_fis())
+    {
+      anag.put(N_TIPOA, TGIU);
+      anag.read(_isgteq) ;
+      if (anag.good()) anag.prev();
+      const char t_ret = anag.get_char(N_TIPOA);
+      if ( t_ret == TFIS ) 
+        cod_anagr = anag.get_long(N_CODANAGR)+1;
+    }
+    else
+    {
+      anag.last( ) ;
+      if (anag.good())
+      {
+        const char t_ret = anag.get_char(N_TIPOA);
+        if ( t_ret == TGIU ) 
+          cod_anagr = anag.get_long(N_CODANAGR)+1;
+      }
+    }
+  }
+  _cod_ana.format("%ld", cod_anagr);
+  return format("%d|%ld", FLD_CODANAGR, cod_anagr);
+}
+
+
+void  BA4200_application::init_insert_mode(TMask& m)
+{
+  m.disable(DLG_DITTE);
+  m.disable(DLG_CHGTIP);
+}
+
+
+void  BA4200_application::init_modify_mode(TMask& m)
+{
+  m.enable(DLG_DITTE);
+  m.disable(DLG_CHGTIP);
+}
+
+
+bool gest_nazionalita(TMask_field& f, KEY key)
+{
+  if (f.mask().query_mode() || key == K_SPACE) return TRUE;
+  TMask&                                msk = f.mask() ;
+  TString                               nazionalita = (const char*)msk.get(FLD_AF1_STATONASC_TABSTE_S0) ;   
+
+  if (f.to_check(key) || nazionalita.empty())
+  {
+    TString                             cod_stato = (const char* ) f.get() ;
+
+    if ( cod_stato.empty() )
+      msk.set(FLD_AF1_STATONASC_TABSTE_S0,"italiana") ;
+    else
+    {
+      TTable                                    t_stati("%STA");
+      TRectype&                         rectab = t_stati.curr() ;
+      rectab.zero() ;
+      rectab.put(N_CODTAB, cod_stato);
+      t_stati.read() ;
+      if ( t_stati.good() )
+        msk.set( FLD_AF1_STATONASC_TABSTE_S0 ,  rectab.get(N_NAZIONALITA) ) ;
+    }
+  }
+  return TRUE ;
+}
+
+// Handler dell'ufficio imposte dirette                   
+bool gest_uff_imp_nr(TMask_field& f, KEY key)
+{                     
+  /*
+     if (!f.to_check(key)) return TRUE;
+
+     const TString cod_uff(f.get());
+     if (cod_uff.empty()) return TRUE;
+     
+     TMask& msk = f.mask() ;
+     TTable uff_imp("%UID");
+
+     uff_imp.zero() ;
+     uff_imp.put(N_CODTAB, cod_uff);
+     uff_imp.read() ;
+     if ( uff_imp.good() )
+     {               
+     const bool giuridica = ((BA4200_application*)main_app())->ana_giu();
+     const TFixed_string codcom(uff_imp.get(N_COMUNE));
+     const char* com = msk.get(giuridica ? FLD_AG1_COMRF : FLD_AF2_COMRF);
+     if (*com)
+     {
+     if(codcom != com) 
+     return f.error_box("L'ufficio deve appartenere al comune di residenza fiscale: %s", com);
+     }
+     else
+     {
+     com = msk.get(giuridica ? FLD_AG2_COMRES : FLD_AF1_COMRES);
+     if(codcom != com) 
+     return f.error_box("L'ufficio deve appartenere al comune di residenza: %s", com);
+     }  
+     }  
+     */         
+  return TRUE; 
+} 
+
+
+// Handler del comunde di residenza e residenza fiscale                                            
+bool gest_uff_imp(TMask_field& f, KEY key)
+{
+  if (f.mask().query_mode() || !f.to_check(key, TRUE)) 
+    return TRUE;
+
+  TString       cod_sta, cod_com;
+  TMask& msk = f.mask() ;
+  const short   dlg = f.dlg();
+  const bool giuridica = ((BA4200_application&)main_app()).ana_giu();
+
+  if ( giuridica )
+  {
+    cod_com = msk.get(FLD_AG1_COMRF);
+    if ((dlg == FLD_AG2_COMRES) || (dlg == FLD_AG2_STATORES))
+      if (cod_com.not_empty()) return TRUE;
+    cod_sta = msk.get(FLD_AG1_STATORF);
+  }
+  else
+  {
+    cod_com = msk.get(FLD_AF2_COMRF);
+    if ((dlg == FLD_AF1_COMRES) || (dlg == FLD_AF1_STATORES))
+      if (cod_com.not_empty()) return TRUE;
+    cod_sta = msk.get(FLD_AF2_STATORF);
+  }
+  
+  if (cod_com.empty())
+  {
+    cod_com = msk.get(giuridica ? FLD_AG2_COMRES : FLD_AF1_COMRES) ;
+    cod_sta = msk.get(giuridica ? FLD_AG2_STATORES : FLD_AF1_STATORES) ;
+  }     
+  
+  if (cod_com.empty())
+    return TRUE;
+  
+  TLocalisamfile        comuni(LF_COMUNI) ;
+  comuni.setkey(1) ;
+  comuni.zero() ;
+  comuni.put(N_STATO, cod_sta);
+  comuni.put(N_COM, cod_com );
+  if (comuni.read() == NOERR)
+  {
+    msk.set(F_IMP_DENCOM, comuni.get("DENCOM"));
+    msk.set(F_IMP_PROVCOM, comuni.get("PROVCOM"));
+
+    TString s(comuni.get(N_IMPDIR1)) ; 
+    if (s.empty()) s = comuni.get(N_IMPDIR2) ; 
+    if (s.empty()) s = comuni.get(N_IMPDIR3) ; 
+    msk.set(F_UFFIIDD, s) ; msk.field(F_UFFIIDD).on_key(K_TAB);
+    msk.set(F_UFFREG, comuni.get("UFFREG")); msk.field(F_UFFREG).on_key(K_TAB);
+    msk.set(F_UFFCONC, comuni.get("UFFCONC")); msk.field(F_UFFCONC).on_key(K_TAB);
+    msk.set(F_UFFSERV, comuni.get("UFFCSERV")); msk.field(F_UFFSERV).on_key(K_TAB);
+
+    msk.set(F_CODCONTR_EP, comuni.get("UFFESPROV").mid(1, 2));
+    msk.set(F_CODCONTR_EC, comuni.get("UFFESCOM"));
+  }     
+  
+  return TRUE;
+}
+
+bool no_dup_fis(TMask_field& f, KEY key)
+{
+  if (f.mask().query_mode() || !f.to_check(key)) return TRUE;
+  BA4200_application& app = (BA4200_application&)main_app();
+  TLocalisamfile&       anag = app.get_relation()->lfile(LF_ANAG) ;
+  
+  const TString16 cofi(f.get());                     
+  if ( cofi.not_empty() )
+  {              
+    anag.zero() ;
+    anag.put(N_TIPOA, app.tip_ana());
+    anag.put(N_COFI, cofi ) ;
+    anag.setkey(3) ;
+    anag.read() ;
+    anag.setkey(1) ;
+    const char t = anag.get_char(N_TIPOA), t1 = app.tip_ana();
+    const TString16     s = anag.get(N_CODANAGR), s1 = app.cod_ana();
+
+    if (anag.good() && (t1 != t || s1 != s))
+    {
+      f.error_box("Codice fiscale gia' utilizzato per il codice %c/%s",
+                  t, (const char*)s);
+      return FALSE;
+    }
+  }
+  return TRUE ;
+}
+
+bool gest_iva(TMask_field& f, KEY key , short   fd_sta ,short fd_iva )
+{
+  if (f.mask().query_mode() || !f.to_check(key)) return TRUE;
+  
+  BA4200_application& app = (BA4200_application&)main_app();
+  TLocalisamfile&       anag = app.get_relation()->lfile(LF_ANAG) ;
+  TMask& msk = f.mask() ;
+
+  if ( f.get().not_empty() && !anag.empty() )
+  {
+    anag.zero() ;        
+    anag.put(N_TIPOA, app.tip_ana());
+    anag.put(N_STATOPAIV, msk.get(fd_sta) ) ;
+    anag.put(N_PAIV, msk.get(fd_iva) ) ;
+    anag.setkey(4) ;
+    anag.read() ;
+    anag.setkey(1) ;
+    const char t  = anag.get_char(N_TIPOA), t1 = app.tip_ana();
+    const TFixed_string s(anag.get(N_CODANAGR)),        s1(app.cod_ana());
+    if (anag.good() && (t1 != t || s1 != s))
+    {
+      f.error_box("Partita iva gia' definita per il codice : %c/%s",
+                  t, (const char*) s);
+      return FALSE ;
+    }
+  }
+  return TRUE ;
+}
+
+bool no_dup_iva_f(TMask_field& f, KEY key)
+
+{
+  if (f.mask().query_mode() || !f.to_check(key)) return TRUE;
+  return ( gest_iva(f , key , FLD_AF1_STATOPAIV ,FLD_AF1_PAIV ) ) ;
+}
+
+bool no_dup_iva_g(TMask_field& f, KEY key)
+{ 
+  if (key == K_ENTER && !f.mask().query_mode() && f.get().empty())
+  {                                    
+    bool ok = FALSE;   
+    if (!f.mask().get_bool(CHK_AG1_ENTENCOMM))
+    {
+      const TString cofi(f.mask().get(FLD_AG1_COFI));
+      if (pi_check("IT", cofi)) 
+      {
+        f.set(cofi);
+        ok = TRUE;
+      }  
+    }
+    if (!ok) return error_box("Partita IVA obbligatoria!");
+  }
+
+  return gest_iva(f , key , FLD_AG1_STATOPAIV ,FLD_AG1_PAIV ) ;
+}
+
+TMask* BA4200_application::get_mask(int mode)
+{ 
+  if (!changing_mask(mode)) return _msk[tip_msk()];
+  if (ana_fis())
+  {
+    if (_msk[MSKG] != NULL) delete _msk[MSKG];
+    _msk[MSKG] = NULL;
+    _msk[MSKF] = new TMask("ba4200b") ;
+    _msk[MSKF]->set_handler(FLD_AF1_PAIV, no_dup_iva_f);
+    _msk[MSKF]->set_handler(FLD_AF1_COFI, no_dup_fis);
+    _msk[MSKF]->set_handler(FLD_AF1_COMRES, gest_uff_imp);
+    _msk[MSKF]->set_handler(FLD_AF2_COMRF, gest_uff_imp);
+    _msk[MSKF]->set_handler(F_UFFIIDD, gest_uff_imp_nr);
+    _msk[MSKF]->set_handler(FLD_AF1_STATORES, gest_nazionalita);
+    _msk[MSKF]->set_handler(FLD_AF1_PAIV, no_dup_iva_f);
+    _msk[MSKF]->set_handler(FLD_AF1_COFI, no_dup_fis);
+    _msk[MSKF]->set_handler(ba4200_handler);
+  }
+  else
+  {
+    if (_msk[MSKF] != NULL) delete _msk[MSKF];
+    _msk[MSKF] = NULL;
+    _msk[MSKG] = new TMask("ba4200c") ;
+    _msk[MSKG]->set_handler(FLD_AG2_COMRES, gest_uff_imp);
+    _msk[MSKG]->set_handler(FLD_AG1_COMRF, gest_uff_imp);
+    _msk[MSKG]->set_handler(F_UFFIIDD, gest_uff_imp_nr);
+    _msk[MSKG]->set_handler(FLD_AG1_COFI, no_dup_fis);
+    _msk[MSKG]->set_handler(FLD_AG1_PAIV, no_dup_iva_g);
+    _msk[MSKG]->set_handler(ba4200_handler);
+  }
+  return _msk[tip_msk()];
+}
+
+bool BA4200_application::user_create() 
+
+{
+  _msk[MSKF] = NULL;
+  _rel[MSKF] = new TRelation(LF_ANAG);
+  //    _rel[MSKF]->add(LF_ANAGFIS, "CODANAGR=CODANAGR", 1, 0, 0, TRUE); verificare
+  _rel[MSKF]->add(LF_ANAGFIS, "CODANAGR=CODANAGR", 1, 0, 0);
+
+  _msk[MSKG] = NULL;
+  _rel[MSKG] = new TRelation(LF_ANAG);
+  //    _rel[MSKG]->add(LF_ANAGGIU, "CODANAGR=CODANAGR", 1, 0, 0, TRUE); verificare
+  _rel[MSKG]->add(LF_ANAGGIU, "CODANAGR=CODANAGR", 1, 0, 0);
+  
+  _comuni = new TLocalisamfile(LF_COMUNI) ;
+  _tabcom = new TLocalisamfile(LF_TABCOM) ;
+
+  return TRUE;
+}
+
+void BA4200_application::write_enable(const bool on)
+
+{
+  _rel[MSKF]->write_enable(-1, on);
+  _rel[MSKG]->write_enable(-1, on);
+}
+
+bool BA4200_application::user_destroy() 
+{
+  for ( int j = 0 ; j < 2 ; j++ )
+  {
+    if (_msk[j]) delete _msk[j] ;
+    if (_rel[j]) delete _rel[j] ;
+  }
+  delete _comuni;
+  delete _tabcom;
+
+  return TRUE;
+}
+
+void BA4200_application::manual_save(const TMask& m)
+
+{
+  TRelation *r = get_relation();
+  TLocalisamfile& anag = r->lfile(LF_ANAG) ;
+
+  if (ana_fis())
+  {
+    TLocalisamfile&     anafis = r->lfile(LF_ANAGFIS) ;
+
+    anafis.put(N_CODANAGR, _cod_ana);
+  }
+  else
+  {
+    TLocalisamfile&     anagiu = r->lfile(LF_ANAGGIU) ;
+    anagiu.put(N_CODANAGR, _cod_ana);
+  }
+
+  const TDate   oggi(TODAY) ;
+  anag.put(N_DATAAGG, oggi.string());
+}
+
+int BA4200_application::read(TMask& m) 
+
+{
+  const TRelation *r = get_relation();
+  m.autoload(r);
+  _cod_ana = r->lfile().get(N_CODANAGR);
+  return NOERR;
+}
+
+int BA4200_application::write(const TMask& m) 
+
+{
+  TRelation *r = get_relation();
+  r->zero();
+  m.autosave(r);
+  set_cod_ana(r->lfile().get(N_CODANAGR));
+  manual_save(m);
+  return r->write();
+}
+
+int BA4200_application::rewrite(const TMask& m) 
+
+{
+  TRelation *r = get_relation();
+
+  r->zero();
+  m.autosave(r);
+  manual_save(m);
+  return r->rewrite();
+}
+
+int ba4200(int argc, char* argv[])
+{                         
+  char ta = 'F';
+  if (argc > 2 && toupper(*argv[2]) == 'G') ta = 'G';
+  
+  BA4200_application a(ta);
+
+  TString80 titolo("Anagrafica Persone ");
+  titolo << (ta == 'F' ? "Fisiche" : "Giuridiche");
+  
+  a.run(argc, argv, titolo);
+  return 0;
+}
diff --git a/ba/ba4300.cpp b/ba/ba4300.cpp
index fb8fb7476..502575627 100755
--- a/ba/ba4300.cpp
+++ b/ba/ba4300.cpp
@@ -1,424 +1,423 @@
-#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*) MainApp();
-    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);
-      long oldditta = prefhndl->get_codditta();
-      if (k == K_F8) prefhndl->set_codditta(atol(m.get(FLD_GD1_CODDITTA)), TRUE);
-      a.run();
-      if (k == K_F8) prefhndl->set_codditta(oldditta, TRUE);
-      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("non posso creare il direttorio della ditta %ld (%s)",
-                         codditta, (const char*) ndir);
-  if (!fexist(s1))
-    if (!fcopy(ntrrec, s1))
-      return error_box("non posso copiare il file %s della ditta %ld",
-                       ntrrec, codditta);
-  if (!fexist(s2))
-    if (!fcopy(nd, s2))
-      return error_box("non posso 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*) MainApp();
-        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 Ditta");
-  return 0;
-}
-
+#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;
+}
+
diff --git a/ba/ba6100.cpp b/ba/ba6100.cpp
index 6cfaca70f..837aea2f8 100755
--- a/ba/ba6100.cpp
+++ b/ba/ba6100.cpp
@@ -1,566 +1,565 @@
-// **********************************************************************
-// Stampa anagrafiche
-// Control code
-// ***********************************************************************
-
-#include "ba6100.h"
-#include <progind.h>
-#include <mailbox.h>                    
-#include <execp.h>
-
-// ------- utils --------------------------------------------
-
-
-TRectype& BA6100_App::look_com(const char* cod)
-{
-  _comuni->curr().zero();
-  if (*cod)
-  {
-    _comuni->curr().put("COM",cod);
-    _comuni->read();
-    if (_comuni->bad()) 
-      _comuni->curr().zero();
-  }
-  return _comuni->curr();
-}
-
-const char* BA6100_App::look_tab(const char* tabname, const char* cod, 
-                                 const char* fld)
-{
-  if (*cod == 0) return "";
-  TTable tab(tabname);
-  tab.curr().zero();
-  tab.curr().put("CODTAB",cod);
-  tab.read();
-  if (tab.bad()) tab.curr().zero();
-  return tab.curr().get(fld);
-}
-
-// link 
-
-void BA6100_App::process_link(int id, const char* txt)
-{                                         
-  if (id == _ana_link)
-  {
-    TString80 ss = "1|"; ss << txt;
-    TMessage fs(cmd2name("ba4","-1"), MSG_LN, ss);
-    TMailbox m;
-    m.send(fs);              
-    TExternal_app ba4(_pr_what == anafis ? "ba4 -1 F" : "ba4 -1 G");
-    if (ba4.run()) beep();
-  }                          
-  else if (id == _dit_link)
-  {
-    TString80 ss = "1|"; ss << txt << "|" << txt;
-    TMessage fs(cmd2name("ba4","-2"), MSG_LN, ss);
-    fs.send();           
-    TExternal_app ba4("ba4 -2");
-    if (ba4.run()) beep();
-  }
-}                                                        
-
-// ---- here we go -------------------------------------------------
-
-void BA6100_App::set_page(int file, int cnt)
-{
-  switch(file)
-  {
-  case LF_ANAG:
-  case LF_NDITTE:
-    if (_pr_type == elenco)
-    {
-      if (_pr_what != nditte && file == LF_NDITTE)
-      {
-        set_row(1,"@50g$[r]@pN$[n]@66g@S", FLD(LF_NDITTE,"CODDITTA","@@@@@"),
-                FLD(LF_NDITTE,"RAGSOC"));
-        set_row(2,"");
-      }
-      else 
-        set_elenco();   
-    } 
-    else  if (_pr_type == rubriche)  set_rubriche();
-    else  if (_pr_type == schede)    
-    {
-      if (_pr_what != nditte && file == LF_NDITTE) 
-        set_scheda_ditta();
-      else 
-        set_schede();     
-    }
-    else  if (_pr_type == etichette) set_etichette();
-    break;
-  case LF_ATTIV:
-    set_scheda_attiv();
-    break;
-  case LF_UNLOC:
-    set_scheda_unloc();
-    break;
-  case LF_SOCI:
-    set_scheda_socio();
-    break;
-  }
-}
-
-
-bool BA6100_App::preprocess_page(int file, int counter)
-{
-  // non stampa la prima ditta se sta facendo l'elenco visto
-  // che la stampa a fianco dell'anagrafica
-  if (file == LF_NDITTE && _pr_type == elenco && _inclditte 
-      && _pr_what != nditte)
-    if (current_cursor()->is_first_match(LF_NDITTE))
-      return FALSE;
-
-  if (_pr_type == rubriche)
-  {
-    // vale per ditte, anagiu, anafis
-    _com = current_cursor()->curr(LF_ANAG).get("COMRES");
-    if (_com.empty())
-      _com = current_cursor()->curr(LF_ANAG).get("COMRF");     
-    _phone = current_cursor()->curr(LF_ANAG).get("PTELRF");
-    _phone.trim();
-    if (!_phone.empty()) _phone << '/';
-    _phone << current_cursor()->curr(LF_ANAG).get("TELRF");    
-    
-    TRectype& cc = look_com(_com);
-    _com  = cc.get("DENCOM");
-    _cap  = cc.get("CAPCOM");
-    _prov = cc.get("PROVCOM");
-  }
-  else if (_pr_type == etichette)
-    preprocess_etichette();
-  return TRUE;
-}
-
-
-bool mask_reset_fields(TMask_field& mf, KEY k)
-{
-  if (k == K_SPACE)
-  {
-    BA6100_App* a =  (BA6100_App*)MainApp();
-    mf.mask().field(FLD_BA6B_INDROW).set(format("%d",a->_ind_row));
-    mf.mask().field(FLD_BA6B_INDCOL).set(format("%d",a->_ind_col));
-    mf.mask().field(FLD_BA6B_PIVROW).set(format("%d",a->_piv_row));
-    mf.mask().field(FLD_BA6B_PIVCOL).set(format("%d",a->_piv_col));
-    mf.mask().field(FLD_BA6B_CODROW).set(format("%d",a->_cod_row));
-    mf.mask().field(FLD_BA6B_CODCOL).set(format("%d",a->_cod_col));
-    mf.mask().field(FLD_BA6B_TOTROW).set(format("%d",a->_rows_et));
-    mf.mask().field(FLD_BA6B_TOTCOL).set(format("%d",a->_cols_et));
-    mf.mask().field(CHK_BA6B_PIVA).set(a->_is_piv ? "X" : " ");
-    mf.mask().field(CHK_BA6B_CODICE).set(a->_is_cod ?"X": " ");
-  }
-  return TRUE;
-}
-
-
-void BA6100_App::preprocess_etichette()
-{
-  // everything goes into strings
-  _name = get_field(LF_ANAG,"RAGSOC");
-  _cod  = get_field(LF_ANAG,"CODANAGR");
-  _cofi = get_field(LF_ANAG,"COFI");
-  TRectype& cc = look_com(get_field(LF_ANAG,"COMCORR"));
-  if (_cofi.empty())
-    _cofi = get_field(LF_ANAG,"PAIV");
-
-  if (_pr_what == anafis)
-  { 
-    _surname = _name.mid(30); _surname.trim();
-    _name    = _name.cut(30); _name.trim();
-    _sex     = get_field(LF_ANAGFIS,"SESSO")[0] == 'M' ? "Sig." : "Sig.ra";
-  }
-  switch (_ind_what)
-  {
-  case corrispondenza:
-    _address = get_field(LF_ANAG,"INDCORR");
-    _civ     = get_field(LF_ANAG,"CIVCORR");
-    _stato   = look_tab("%STA",get_field(LF_ANAG,"STATOCORR"));
-    _cap     = get_field(LF_ANAG,"CAPCORR");
-    _com     = cc.get("DENCOM");
-    _prov    = cc.get("PROVCOM");
-    if (_cap.empty())
-      _cap = cc.get("CAPCOM");
-    if (!_address.empty())
-      break;
-    // else fall down
-  case domfisc:
-    _address = get_field(LF_ANAG,"INDRF");
-    _civ     = get_field(LF_ANAG,"CIVRF");
-    _stato   = look_tab("%STA",get_field(LF_ANAG,"STATORF"));
-    _cap     = get_field(LF_ANAG,"CAPRF");
-    cc      = look_com(get_field(LF_ANAG,"COMRF"));
-    _com     = cc.get("DENCOM");
-    _prov    = cc.get("PROVCOM");
-    if (_cap.empty())
-      _cap = cc.get("CAPCOM");
-    if (!_address.empty())
-      break;      
-    // else fall down
-  case residenza:
-    _address = get_field(LF_ANAG,"INDRES");
-    _civ     = get_field(LF_ANAG,"CIVRES");
-    _stato   = look_tab("%STA",get_field(LF_ANAG,"STATORES"));
-    _cap     = get_field(LF_ANAG,"CAPRES");
-    cc      = look_com(get_field(LF_ANAG,"COMRES"));
-    _com     = cc.get("DENCOM");
-    _prov    = cc.get("PROVCOM");
-    if (_cap.empty())
-      _cap = cc.get("CAPCOM");
-    break;
-  }
-}
-
-
-void BA6100_App::init_print()
-{
-  reset_print();
-  reset_files();
-
-  // select cursor and main file
-  switch(_pr_what)
-  {
-  case anafis: 
-    select_cursor(cfis()); 
-    add_file(LF_ANAG);
-    break;
-  case anagiu:
-    select_cursor(cgiu()); 
-    add_file(LF_ANAG);
-    break;
-  case nditte: 
-    select_cursor(cdit());
-    add_file(LF_NDITTE);
-    break;
-  }
-  
-  force_setpage(_pr_type == schede);
-
-  // setup secondary links
-  if (_inclditte)
-  {
-    switch(_pr_type)
-    {
-    case elenco: 
-      if (_pr_what != nditte)
-        add_file(LF_NDITTE);
-      break;
-    case schede:
-      if (_pr_what != nditte)
-        add_file(LF_NDITTE);
-      add_file(LF_ATTIV,LF_NDITTE);
-      add_file(LF_UNLOC,LF_NDITTE);
-      add_file(LF_SOCI, LF_NDITTE);
-      break;
-    default:
-      break;
-    }
-  }
-  set_headers();
-}
-
-bool BA6100_App::set_print(int)
-{
-  TMask mask("ba6100a.msk");
-  // set print type
-  switch (mask.run())
-  {
-  case K_ESC:
-  case K_QUIT:
-    return FALSE;
-  case BUT_BA6_ELENCO:
-    _pr_type = elenco;                                
-    // cio' che e' blu collega al modulo anagrafiche
-    _ana_link = enable_link("Collegamento archivio anagrafiche: ", 'b');
-    _dit_link = enable_link("Collegamento archivio ditte: ", 'r');
-    break;
-  case BUT_BA6_SCHEDE:                               
-    disable_links();
-    _pr_type = schede;
-    break;
-  case BUT_BA6_ETICHETTE:
-    disable_links();
-    if (_pr_what != nditte)
-    {
-      _pr_type = etichette;
-      // set additionals
-      TMask mask2("ba6100b.msk");
-
-      mask2.set_workfile("ba6100.set");
-      mask2.set_handler(BUT_BA6B_RESET,  mask_reset_fields);
-
-      if (fexist("ba6100b.set"))
-      {
-        mask2.load();
-
-        _ind_what = (in)atoi(mask2.get(RDB_BA6B_INDIR));
-        _ind_row  = atoi(mask2.get(FLD_BA6B_INDROW));
-        _piv_row  = atoi(mask2.get(FLD_BA6B_PIVROW));
-        _cod_row  = atoi(mask2.get(FLD_BA6B_CODROW));
-        _rows_et  = atoi(mask2.get(FLD_BA6B_TOTROW));
-        _ind_col  = atoi(mask2.get(FLD_BA6B_INDCOL));
-        _piv_col  = atoi(mask2.get(FLD_BA6B_PIVCOL));
-        _cod_col  = atoi(mask2.get(FLD_BA6B_CODCOL));
-        _cols_et  = atoi(mask2.get(FLD_BA6B_TOTCOL));
-        
-        _is_piv   = mask2.get(CHK_BA6B_PIVA)   == "X";
-        _is_cod   = mask2.get(CHK_BA6B_CODICE) == "X";
-      }
-      else
-      {
-        mask2.field(FLD_BA6B_INDROW).set(format("%d",_ind_row));
-        mask2.field(FLD_BA6B_INDCOL).set(format("%d",_ind_col));
-        mask2.field(FLD_BA6B_PIVROW).set(format("%d",_piv_row));
-        mask2.field(FLD_BA6B_PIVCOL).set(format("%d",_piv_col));
-        mask2.field(FLD_BA6B_CODROW).set(format("%d",_cod_row));
-        mask2.field(FLD_BA6B_CODCOL).set(format("%d",_cod_col));
-        mask2.field(FLD_BA6B_TOTROW).set(format("%d",_rows_et));
-        mask2.field(FLD_BA6B_TOTCOL).set(format("%d",_cols_et));
-        mask2.field(CHK_BA6B_PIVA).set(_is_piv ? "X" : " ");
-        mask2.field(CHK_BA6B_CODICE).set(_is_cod ?"X": " ");
-      }
-
-      mask2.run();
-      
-      _ind_what = (in)atoi(mask2.get(RDB_BA6B_INDIR));
-      _ind_row  = atoi(mask2.get(FLD_BA6B_INDROW));
-      _piv_row  = atoi(mask2.get(FLD_BA6B_PIVROW));
-      _cod_row  = atoi(mask2.get(FLD_BA6B_CODROW));
-      _rows_et  = atoi(mask2.get(FLD_BA6B_TOTROW));
-      _ind_col  = atoi(mask2.get(FLD_BA6B_INDCOL));
-      _piv_col  = atoi(mask2.get(FLD_BA6B_PIVCOL));
-      _cod_col  = atoi(mask2.get(FLD_BA6B_CODCOL));
-      _cols_et  = atoi(mask2.get(FLD_BA6B_TOTCOL));
-      
-      _is_piv   = mask2.get(CHK_BA6B_PIVA)   == "X";
-      _is_cod   = mask2.get(CHK_BA6B_CODICE) == "X";
-      
-      if (_frpos) delete _frpos;
-      _frpos = new bool[_rows_et];
-      memset(_frpos,FALSE,sizeof(_frpos));
-      _frpos[_ind_row-1] = TRUE;
-      _frpos[_ind_row]   = TRUE;
-      if (_is_piv) _frpos[_piv_row-1] = TRUE;
-      if (_is_cod) _frpos[_cod_row-1] = TRUE;
-      
-      for (int jk = 0; jk < _rows_et; jk++)
-        if (!_frpos[jk]) set_row(jk+1,"");
-      
-      // save settings
-      if (mask2.get(CHK_BA6B_SAVE) == "X")
-        mask2.save();
-    }
-    break;
-  case BUT_BA6_RUBRICHE:    
-    _ana_link = enable_link("Collegamento archivio anagrafiche: ", 'b');
-    _dit_link = enable_link("Collegamento archivio ditte: ", 'r');
-    _pr_type = rubriche;
-    break;
-  }
-  _pr_what   = (pw)atoi(mask.get(RDB_BA6_TYPE));
-  _sort      = atoi(mask.get(RDB_BA6_SORT));
-  _inclditte = (bool)(mask.get(CHK_BA6_INCLDI) == "X");
-  
-  TString cod_from(5), cod_to(5);
-  TLocalisamfile* fl;
-
-  switch(_pr_what)
-  {
-  case anafis:
-  case anagiu:
-    select_cursor(_pr_what == anafis ? cfis() : cgiu());
-    if (_sort == 1)
-    {
-      cod_from = mask.get(_pr_what == anafis ? FLD_ANF_CODFR 
-                          : FLD_ANG_CODFR);
-      cod_to   = mask.get(_pr_what == anafis ? FLD_ANF_CODTO 
-                          : FLD_ANG_CODTO);
-    }
-    else
-    {
-      cod_from = mask.get(_pr_what == anafis ? FLD_ANF_RAGSOCFR
-                          : FLD_ANG_RAGSOCFR);
-      cod_to   = mask.get(_pr_what == anafis ? FLD_ANF_RAGSOCTO 
-                          : FLD_ANG_RAGSOCTO);
-    }
-  {
-    fl = current_cursor()->file(LF_ANAG);
-    TRectype tr1(fl->curr());
-    TRectype tr2(fl->curr());
-    tr1.zero(); tr2.zero();
-    tr1.put("TIPOA", _pr_what == anafis ? "F" : "G");
-    tr2.put("TIPOA", _pr_what == anafis ? "F" : "G");
-    if (!cod_from.empty() || !cod_to.empty())
-    {
-      if (_sort == 1)
-      {
-        if (cod_from.not_empty())
-        {
-          tr1.put("CODANAGR",cod_from);
-          tr2.put("CODANAGR",cod_to);
-        }
-      }
-      else
-      {
-        if (cod_from.not_empty())
-        {
-          tr1.put("RAGSOC",cod_from);
-          tr2.put("RAGSOC",cod_to);
-        }
-      }
-    }
-    current_cursor()->setregion(tr1, tr2);
-  }
-    break;
-  case nditte:
-    select_cursor(cdit());
-    if (_sort == 1)
-    {
-      cod_from = mask.get(FLD_DITTE_CODFR);
-      cod_to   = mask.get(FLD_DITTE_CODTO);
-    }
-    else 
-    {
-      cod_from = mask.get(FLD_DITTE_RAGSOCFR);
-      cod_to   = mask.get(FLD_DITTE_RAGSOCTO);
-    }
-    if (!cod_from.empty() || !cod_to.empty())
-    {
-      fl = current_cursor()->file(LF_NDITTE);
-      TRectype tr1(fl->curr());
-      TRectype tr2(fl->curr());
-      tr1.zero(); tr2.zero();
-      if (_sort == 1)
-      {
-        tr1.put("CODDITTA",cod_from);
-        tr2.put("CODDITTA",cod_to);
-      }
-      else
-      {
-        tr1.put("RAGSOC",cod_from);
-        tr2.put("RAGSOC",cod_to);
-      }
-      current_cursor()->setregion(tr1, tr2);
-    }
-    break;
-  }  
-  // setup links and set headers
-  init_print();
-
-  //  enable_print_menu();
-
-  return TRUE;
-}
-
-void BA6100_App::user_create()
-{
-  TToken_string rxp(40);
-
-  TProgind p(5, "Preparazione archivi\nPrego attendere", FALSE, TRUE, 30); 
-  
-  // setup relation
-  _rel_fis = new TRelation(LF_ANAG);   
-  _rel_giu = new TRelation(LF_ANAG);
-  _rel_dit = new TRelation(LF_NDITTE);
-
-  p.addstatus(1);
-  
-  rxp.add("CODANAGR=CODANAGR");
-  
-  _rel_fis->add(LF_ANAGFIS,rxp);
-  _rel_giu->add(LF_ANAGGIU,rxp);
-  
-  rxp.add("TIPOA=TIPOA");
-  
-  _rel_fis->add(LF_NDITTE, rxp, 4);
-  _rel_giu->add(LF_NDITTE, rxp, 4);
-  _rel_dit->add(LF_ANAG,   rxp);
-  
-  p.addstatus(1);
-  
-  // add unloc & attiv
-  rxp = "CODDITTA=CODDITTA";
-  
-  _rel_fis->add(LF_ATTIV, rxp, 1, LF_NDITTE);
-  _rel_fis->add(LF_UNLOC, rxp, 1, LF_NDITTE);
-  _rel_giu->add(LF_ATTIV, rxp, 1, LF_NDITTE);
-  _rel_giu->add(LF_UNLOC, rxp, 1, LF_NDITTE);
-  _rel_dit->add(LF_ATTIV, rxp, 1);
-  _rel_dit->add(LF_UNLOC, rxp, 1);
-  _rel_fis->add(LF_SOCI,  rxp, 1, LF_NDITTE);
-  _rel_giu->add(LF_SOCI,  rxp, 1, LF_NDITTE);
-  _rel_dit->add(LF_SOCI,  rxp, 1);
-  
-  p.addstatus(1);
-  
-  _cfis1 = add_cursor(new TCursor(_rel_fis, "" , 1));
-  _cgiu1 = add_cursor(new TCursor(_rel_giu, "" , 1));
-  _cdit1 = add_cursor(new TCursor(_rel_dit, "", 1));
-  _cfis2 = add_cursor(new TCursor(_rel_fis, "" , 2));
-  _cgiu2 = add_cursor(new TCursor(_rel_giu, "" , 2));
-  _cdit2 = add_cursor(new TCursor(_rel_dit, "", 2));
-  
-  p.addstatus(1);
-  
-  _comuni = new TLocalisamfile(LF_COMUNI);
-  
-  // set translated field values
-  set_translation(LF_ANAGFIS,"STATCIV","1","Celibe/Nubile");
-  set_translation(LF_ANAGFIS,"STATCIV","2","Coniugato/a");
-  set_translation(LF_ANAGFIS,"STATCIV","3","Vedovo/a");
-  set_translation(LF_ANAGFIS,"STATCIV","4","Separato/a");
-  set_translation(LF_ANAGFIS,"STATCIV","5","Divorziato/a");
-  set_translation(LF_ANAGFIS,"STATCIV","6","Deceduto/a");
-  set_translation(LF_ANAGFIS,"STATCIV","7","Tutelato/a");
-  set_translation(LF_ANAGFIS,"STATCIV","8","Figlio/a minore");
-  set_translation(LF_ANAGFIS,"TITSTU", "1" ,"Nessuno");
-  set_translation(LF_ANAGFIS,"TITSTU", "2" ,"Lic. Elem.");
-  set_translation(LF_ANAGFIS,"TITSTU", "3" ,"Lic. Media");
-  set_translation(LF_ANAGFIS,"TITSTU", "4" ,"Diploma");
-  set_translation(LF_ANAGFIS,"TITSTU", "5" ,"Laurea");
-  set_translation(LF_ANAGFIS,"SESSO", "M", "Maschio");
-  set_translation(LF_ANAGFIS,"SESSO", "F", "Femmina");
-  set_translation(LF_NDITTE,"FREQVIVA","M","Mensile");
-  set_translation(LF_NDITTE,"FREQVIVA","T","Trimestrale");
-  set_translation(LF_NDITTE,"DATLAV","1","Si");
-  set_translation(LF_NDITTE,"DATLAV","2","No");
-  set_translation(LF_NDITTE,"DATLAV","3","Lavoro Agricolo");
-  set_translation(LF_NDITTE,"STATOSOC","1","Normale attivita'");
-  set_translation(LF_NDITTE,"STATOSOC","2","Liquidazione cessata attivita'");
-  set_translation(LF_NDITTE,"STATOSOC","3",
-                  "Fallimento o Liquidazione coatta amm.");
-  set_translation(LF_NDITTE,"STATOSOC","4","Estinto");
-  set_translation(LF_ANAGGIU,"STATOSOC","1","Normale attivita'");
-  set_translation(LF_ANAGGIU,"STATOSOC","2","Liquidazione cessata attivita'");
-  set_translation(LF_ANAGGIU,"STATOSOC","3",
-                  "Fallimento o Liquidazione coatta amm.");
-  set_translation(LF_ANAGGIU,"STATOSOC","4","Estinto");
-  set_translation(LF_ANAGGIU,"SITSOC","1","Inizio");
-  set_translation(LF_ANAGGIU,"SITSOC","2","Liquidazione");
-  set_translation(LF_ANAGGIU,"SITSOC","3","Termine liquidazione");
-  set_translation(LF_ANAGGIU,"SITSOC","4","Estinzione");
-  set_translation(LF_ANAGGIU,"SITSOC","5","Trasf. IRPEG");
-  set_translation(LF_ANAGGIU,"SITSOC","6","Normale");
-  
-  set_fillchar('_');
-  set_wait_threshold(0);                       
-
-  p.addstatus(1);
-
-}
-
-void BA6100_App::user_destroy()
-{
-  if (_rel_fis) delete _rel_fis;
-  if (_rel_giu) delete _rel_giu;
-  if (_rel_dit) delete _rel_dit;
-  if (_frpos)   delete _frpos;
-
-  delete _comuni;
-}
-
-
-int ba6100(int argc, char* argv[])
-{
-  BA6100_App app;
-  app.run(argc, argv, "Stampa Anagrafiche");   
-  return 0;
-}
+// **********************************************************************
+// Stampa anagrafiche
+// Control code
+// ***********************************************************************
+#include <progind.h>
+#include <mailbox.h>                    
+#include <execp.h>
+
+#include "ba6100.h"
+
+// ------- utils --------------------------------------------
+
+
+TRectype& BA6100_App::look_com(const char* cod)
+{
+  _comuni->curr().zero();
+  if (*cod)
+  {
+    _comuni->curr().put("COM",cod);
+    _comuni->read();
+    if (_comuni->bad()) 
+      _comuni->curr().zero();
+  }
+  return _comuni->curr();
+}
+
+const char* BA6100_App::look_tab(const char* tabname, const char* cod, 
+                                 const char* fld)
+{
+  if (*cod == 0) return "";
+  TTable tab(tabname);
+  tab.curr().zero();
+  tab.curr().put("CODTAB",cod);
+  tab.read();
+  if (tab.bad()) tab.curr().zero();
+  return tab.curr().get(fld);
+}
+
+// link 
+
+void BA6100_App::process_link(int id, const char* txt)
+{                                         
+  if (id == _ana_link)
+  {
+    TString80 ss = "1|"; ss << txt;
+    TMessage fs(cmd2name("ba4","-1"), MSG_LN, ss);
+    TMailbox m;
+    m.send(fs);              
+    TExternal_app ba4(_pr_what == anafis ? "ba4 -1 F" : "ba4 -1 G");
+    if (ba4.run()) beep();
+  }                          
+  else if (id == _dit_link)
+  {
+    TString80 ss = "1|"; ss << txt << "|" << txt;
+    TMessage fs(cmd2name("ba4","-2"), MSG_LN, ss);
+    fs.send();           
+    TExternal_app ba4("ba4 -2");
+    if (ba4.run()) beep();
+  }
+}                                                        
+
+// ---- here we go -------------------------------------------------
+
+void BA6100_App::set_page(int file, int cnt)
+{
+  switch(file)
+  {
+  case LF_ANAG:
+  case LF_NDITTE:
+    if (_pr_type == elenco)
+    {
+      if (_pr_what != nditte && file == LF_NDITTE)
+      {
+        set_row(1,"@50g$[r]@pN$[n]@66g@S", FLD(LF_NDITTE,"CODDITTA","@@@@@"),
+                FLD(LF_NDITTE,"RAGSOC"));
+        set_row(2,"");
+      }
+      else 
+        set_elenco();   
+    } 
+    else  if (_pr_type == rubriche)  set_rubriche();
+    else  if (_pr_type == schede)    
+    {
+      if (_pr_what != nditte && file == LF_NDITTE) 
+        set_scheda_ditta();
+      else 
+        set_schede();     
+    }
+    else  if (_pr_type == etichette) set_etichette();
+    break;
+  case LF_ATTIV:
+    set_scheda_attiv();
+    break;
+  case LF_UNLOC:
+    set_scheda_unloc();
+    break;
+  case LF_SOCI:
+    set_scheda_socio();
+    break;
+  }
+}
+
+
+bool BA6100_App::preprocess_page(int file, int counter)
+{
+  // non stampa la prima ditta se sta facendo l'elenco visto
+  // che la stampa a fianco dell'anagrafica
+  if (file == LF_NDITTE && _pr_type == elenco && _inclditte 
+      && _pr_what != nditte)
+    if (current_cursor()->is_first_match(LF_NDITTE))
+      return FALSE;
+
+  if (_pr_type == rubriche)
+  {
+    // vale per ditte, anagiu, anafis
+    _com = current_cursor()->curr(LF_ANAG).get("COMRES");
+    if (_com.empty())
+      _com = current_cursor()->curr(LF_ANAG).get("COMRF");     
+    _phone = current_cursor()->curr(LF_ANAG).get("PTELRF");
+    _phone.trim();
+    if (!_phone.empty()) _phone << '/';
+    _phone << current_cursor()->curr(LF_ANAG).get("TELRF");    
+    
+    TRectype& cc = look_com(_com);
+    _com  = cc.get("DENCOM");
+    _cap  = cc.get("CAPCOM");
+    _prov = cc.get("PROVCOM");
+  }
+  else if (_pr_type == etichette)
+    preprocess_etichette();
+  return TRUE;
+}
+
+
+bool mask_reset_fields(TMask_field& mf, KEY k)
+{
+  if (k == K_SPACE)
+  {
+    BA6100_App* a =  (BA6100_App*)MainApp();
+    mf.mask().field(FLD_BA6B_INDROW).set(format("%d",a->_ind_row));
+    mf.mask().field(FLD_BA6B_INDCOL).set(format("%d",a->_ind_col));
+    mf.mask().field(FLD_BA6B_PIVROW).set(format("%d",a->_piv_row));
+    mf.mask().field(FLD_BA6B_PIVCOL).set(format("%d",a->_piv_col));
+    mf.mask().field(FLD_BA6B_CODROW).set(format("%d",a->_cod_row));
+    mf.mask().field(FLD_BA6B_CODCOL).set(format("%d",a->_cod_col));
+    mf.mask().field(FLD_BA6B_TOTROW).set(format("%d",a->_rows_et));
+    mf.mask().field(FLD_BA6B_TOTCOL).set(format("%d",a->_cols_et));
+    mf.mask().field(CHK_BA6B_PIVA).set(a->_is_piv ? "X" : " ");
+    mf.mask().field(CHK_BA6B_CODICE).set(a->_is_cod ?"X": " ");
+  }
+  return TRUE;
+}
+
+
+void BA6100_App::preprocess_etichette()
+{
+  // everything goes into strings
+  _name = get_field(LF_ANAG,"RAGSOC");
+  _cod  = get_field(LF_ANAG,"CODANAGR");
+  _cofi = get_field(LF_ANAG,"COFI");
+  TRectype& cc = look_com(get_field(LF_ANAG,"COMCORR"));
+  if (_cofi.empty())
+    _cofi = get_field(LF_ANAG,"PAIV");
+
+  if (_pr_what == anafis)
+  { 
+    _surname = _name.mid(30); _surname.trim();
+    _name    = _name.cut(30); _name.trim();
+    _sex     = get_field(LF_ANAGFIS,"SESSO")[0] == 'M' ? "Sig." : "Sig.ra";
+  }
+  switch (_ind_what)
+  {
+  case corrispondenza:
+    _address = get_field(LF_ANAG,"INDCORR");
+    _civ     = get_field(LF_ANAG,"CIVCORR");
+    _stato   = look_tab("%STA",get_field(LF_ANAG,"STATOCORR"));
+    _cap     = get_field(LF_ANAG,"CAPCORR");
+    _com     = cc.get("DENCOM");
+    _prov    = cc.get("PROVCOM");
+    if (_cap.empty())
+      _cap = cc.get("CAPCOM");
+    if (!_address.empty())
+      break;
+    // else fall down
+  case domfisc:
+    _address = get_field(LF_ANAG,"INDRF");
+    _civ     = get_field(LF_ANAG,"CIVRF");
+    _stato   = look_tab("%STA",get_field(LF_ANAG,"STATORF"));
+    _cap     = get_field(LF_ANAG,"CAPRF");
+    cc      = look_com(get_field(LF_ANAG,"COMRF"));
+    _com     = cc.get("DENCOM");
+    _prov    = cc.get("PROVCOM");
+    if (_cap.empty())
+      _cap = cc.get("CAPCOM");
+    if (!_address.empty())
+      break;      
+    // else fall down
+  case residenza:
+    _address = get_field(LF_ANAG,"INDRES");
+    _civ     = get_field(LF_ANAG,"CIVRES");
+    _stato   = look_tab("%STA",get_field(LF_ANAG,"STATORES"));
+    _cap     = get_field(LF_ANAG,"CAPRES");
+    cc      = look_com(get_field(LF_ANAG,"COMRES"));
+    _com     = cc.get("DENCOM");
+    _prov    = cc.get("PROVCOM");
+    if (_cap.empty())
+      _cap = cc.get("CAPCOM");
+    break;
+  }
+}
+
+
+void BA6100_App::init_print()
+{
+  reset_print();
+  reset_files();
+
+  // select cursor and main file
+  switch(_pr_what)
+  {
+  case anafis: 
+    select_cursor(cfis()); 
+    add_file(LF_ANAG);
+    break;
+  case anagiu:
+    select_cursor(cgiu()); 
+    add_file(LF_ANAG);
+    break;
+  case nditte: 
+    select_cursor(cdit());
+    add_file(LF_NDITTE);
+    break;
+  }
+  
+  force_setpage(_pr_type == schede);
+
+  // setup secondary links
+  if (_inclditte)
+  {
+    switch(_pr_type)
+    {
+    case elenco: 
+      if (_pr_what != nditte)
+        add_file(LF_NDITTE);
+      break;
+    case schede:
+      if (_pr_what != nditte)
+        add_file(LF_NDITTE);
+      add_file(LF_ATTIV,LF_NDITTE);
+      add_file(LF_UNLOC,LF_NDITTE);
+      add_file(LF_SOCI, LF_NDITTE);
+      break;
+    default:
+      break;
+    }
+  }
+  set_headers();
+}
+
+bool BA6100_App::set_print(int)
+{
+  TMask mask("ba6100a.msk");
+  // set print type
+  switch (mask.run())
+  {
+  case K_ESC:
+  case K_QUIT:
+    return FALSE;
+  case BUT_BA6_ELENCO:
+    _pr_type = elenco;                                
+    // cio' che e' blu collega al modulo anagrafiche
+    _ana_link = enable_link("Collegamento archivio anagrafiche: ", 'b');
+    _dit_link = enable_link("Collegamento archivio ditte: ", 'r');
+    break;
+  case BUT_BA6_SCHEDE:                               
+    disable_links();
+    _pr_type = schede;
+    break;
+  case BUT_BA6_ETICHETTE:
+    disable_links();
+    if (_pr_what != nditte)
+    {
+      _pr_type = etichette;
+      // set additionals
+      TMask mask2("ba6100b.msk");
+
+      mask2.set_workfile("ba6100.set");
+      mask2.set_handler(BUT_BA6B_RESET,  mask_reset_fields);
+
+      if (fexist("ba6100b.set"))
+      {
+        mask2.load();
+
+        _ind_what = (in)atoi(mask2.get(RDB_BA6B_INDIR));
+        _ind_row  = atoi(mask2.get(FLD_BA6B_INDROW));
+        _piv_row  = atoi(mask2.get(FLD_BA6B_PIVROW));
+        _cod_row  = atoi(mask2.get(FLD_BA6B_CODROW));
+        _rows_et  = atoi(mask2.get(FLD_BA6B_TOTROW));
+        _ind_col  = atoi(mask2.get(FLD_BA6B_INDCOL));
+        _piv_col  = atoi(mask2.get(FLD_BA6B_PIVCOL));
+        _cod_col  = atoi(mask2.get(FLD_BA6B_CODCOL));
+        _cols_et  = atoi(mask2.get(FLD_BA6B_TOTCOL));
+        
+        _is_piv   = mask2.get(CHK_BA6B_PIVA)   == "X";
+        _is_cod   = mask2.get(CHK_BA6B_CODICE) == "X";
+      }
+      else
+      {
+        mask2.field(FLD_BA6B_INDROW).set(format("%d",_ind_row));
+        mask2.field(FLD_BA6B_INDCOL).set(format("%d",_ind_col));
+        mask2.field(FLD_BA6B_PIVROW).set(format("%d",_piv_row));
+        mask2.field(FLD_BA6B_PIVCOL).set(format("%d",_piv_col));
+        mask2.field(FLD_BA6B_CODROW).set(format("%d",_cod_row));
+        mask2.field(FLD_BA6B_CODCOL).set(format("%d",_cod_col));
+        mask2.field(FLD_BA6B_TOTROW).set(format("%d",_rows_et));
+        mask2.field(FLD_BA6B_TOTCOL).set(format("%d",_cols_et));
+        mask2.field(CHK_BA6B_PIVA).set(_is_piv ? "X" : " ");
+        mask2.field(CHK_BA6B_CODICE).set(_is_cod ?"X": " ");
+      }
+
+      mask2.run();
+      
+      _ind_what = (in)atoi(mask2.get(RDB_BA6B_INDIR));
+      _ind_row  = atoi(mask2.get(FLD_BA6B_INDROW));
+      _piv_row  = atoi(mask2.get(FLD_BA6B_PIVROW));
+      _cod_row  = atoi(mask2.get(FLD_BA6B_CODROW));
+      _rows_et  = atoi(mask2.get(FLD_BA6B_TOTROW));
+      _ind_col  = atoi(mask2.get(FLD_BA6B_INDCOL));
+      _piv_col  = atoi(mask2.get(FLD_BA6B_PIVCOL));
+      _cod_col  = atoi(mask2.get(FLD_BA6B_CODCOL));
+      _cols_et  = atoi(mask2.get(FLD_BA6B_TOTCOL));
+      
+      _is_piv   = mask2.get(CHK_BA6B_PIVA)   == "X";
+      _is_cod   = mask2.get(CHK_BA6B_CODICE) == "X";
+      
+      if (_frpos) delete _frpos;
+      _frpos = new bool[_rows_et];
+      memset(_frpos,FALSE,sizeof(_frpos));
+      _frpos[_ind_row-1] = TRUE;
+      _frpos[_ind_row]   = TRUE;
+      if (_is_piv) _frpos[_piv_row-1] = TRUE;
+      if (_is_cod) _frpos[_cod_row-1] = TRUE;
+      
+      for (int jk = 0; jk < _rows_et; jk++)
+        if (!_frpos[jk]) set_row(jk+1,"");
+      
+      // save settings
+      if (mask2.get(CHK_BA6B_SAVE) == "X")
+        mask2.save();
+    }
+    break;
+  case BUT_BA6_RUBRICHE:    
+    _ana_link = enable_link("Collegamento archivio anagrafiche: ", 'b');
+    _dit_link = enable_link("Collegamento archivio ditte: ", 'r');
+    _pr_type = rubriche;
+    break;
+  }
+  _pr_what   = (pw)atoi(mask.get(RDB_BA6_TYPE));
+  _sort      = atoi(mask.get(RDB_BA6_SORT));
+  _inclditte = (bool)(mask.get(CHK_BA6_INCLDI) == "X");
+  
+  TString cod_from(5), cod_to(5);
+
+  switch(_pr_what)
+  {
+  case anafis:
+  case anagiu:
+    select_cursor(_pr_what == anafis ? cfis() : cgiu());
+    if (_sort == 1)
+    {
+      cod_from = mask.get(_pr_what == anafis ? FLD_ANF_CODFR 
+                          : FLD_ANG_CODFR);
+      cod_to   = mask.get(_pr_what == anafis ? FLD_ANF_CODTO 
+                          : FLD_ANG_CODTO);
+    }
+    else
+    {
+      cod_from = mask.get(_pr_what == anafis ? FLD_ANF_RAGSOCFR
+                          : FLD_ANG_RAGSOCFR);
+      cod_to   = mask.get(_pr_what == anafis ? FLD_ANF_RAGSOCTO 
+                          : FLD_ANG_RAGSOCTO);
+    }
+  {
+    TLocalisamfile& fl = current_cursor()->file(LF_ANAG);
+    TRectype tr1(fl.curr());
+    TRectype tr2(fl.curr());
+    tr1.zero(); tr2.zero();
+    tr1.put("TIPOA", _pr_what == anafis ? "F" : "G");
+    tr2.put("TIPOA", _pr_what == anafis ? "F" : "G");
+    if (!cod_from.empty() || !cod_to.empty())
+    {
+      if (_sort == 1)
+      {
+        if (cod_from.not_empty())
+        {
+          tr1.put("CODANAGR",cod_from);
+          tr2.put("CODANAGR",cod_to);
+        }
+      }
+      else
+      {
+        if (cod_from.not_empty())
+        {
+          tr1.put("RAGSOC",cod_from);
+          tr2.put("RAGSOC",cod_to);
+        }
+      }
+    }
+    current_cursor()->setregion(tr1, tr2);
+  }
+    break;
+  case nditte:
+    select_cursor(cdit());
+    if (_sort == 1)
+    {
+      cod_from = mask.get(FLD_DITTE_CODFR);
+      cod_to   = mask.get(FLD_DITTE_CODTO);
+    }
+    else 
+    {
+      cod_from = mask.get(FLD_DITTE_RAGSOCFR);
+      cod_to   = mask.get(FLD_DITTE_RAGSOCTO);
+    }
+    if (!cod_from.empty() || !cod_to.empty())
+    {
+      TLocalisamfile& fl = current_cursor()->file(LF_NDITTE);
+      TRectype tr1(fl.curr());
+      TRectype tr2(fl.curr());
+      tr1.zero(); tr2.zero();
+      if (_sort == 1)
+      {
+        tr1.put("CODDITTA",cod_from);
+        tr2.put("CODDITTA",cod_to);
+      }
+      else
+      {
+        tr1.put("RAGSOC",cod_from);
+        tr2.put("RAGSOC",cod_to);
+      }
+      current_cursor()->setregion(tr1, tr2);
+    }
+    break;
+  }  
+  // setup links and set headers
+  init_print();
+
+  //  enable_print_menu();
+
+  return TRUE;
+}
+
+void BA6100_App::user_create()
+{
+  TToken_string rxp(40);
+
+  TProgind p(5, "Preparazione archivi\nPrego attendere", FALSE, TRUE, 30); 
+  
+  // setup relation
+  _rel_fis = new TRelation(LF_ANAG);   
+  _rel_giu = new TRelation(LF_ANAG);
+  _rel_dit = new TRelation(LF_NDITTE);
+
+  p.addstatus(1);
+  
+  rxp.add("CODANAGR=CODANAGR");
+  
+  _rel_fis->add(LF_ANAGFIS,rxp);
+  _rel_giu->add(LF_ANAGGIU,rxp);
+  
+  rxp.add("TIPOA=TIPOA");
+  
+  _rel_fis->add(LF_NDITTE, rxp, 4);
+  _rel_giu->add(LF_NDITTE, rxp, 4);
+  _rel_dit->add(LF_ANAG,   rxp);
+  
+  p.addstatus(1);
+  
+  // add unloc & attiv
+  rxp = "CODDITTA=CODDITTA";
+  
+  _rel_fis->add(LF_ATTIV, rxp, 1, LF_NDITTE);
+  _rel_fis->add(LF_UNLOC, rxp, 1, LF_NDITTE);
+  _rel_giu->add(LF_ATTIV, rxp, 1, LF_NDITTE);
+  _rel_giu->add(LF_UNLOC, rxp, 1, LF_NDITTE);
+  _rel_dit->add(LF_ATTIV, rxp, 1);
+  _rel_dit->add(LF_UNLOC, rxp, 1);
+  _rel_fis->add(LF_SOCI,  rxp, 1, LF_NDITTE);
+  _rel_giu->add(LF_SOCI,  rxp, 1, LF_NDITTE);
+  _rel_dit->add(LF_SOCI,  rxp, 1);
+  
+  p.addstatus(1);
+  
+  _cfis1 = add_cursor(new TCursor(_rel_fis, "" , 1));
+  _cgiu1 = add_cursor(new TCursor(_rel_giu, "" , 1));
+  _cdit1 = add_cursor(new TCursor(_rel_dit, "", 1));
+  _cfis2 = add_cursor(new TCursor(_rel_fis, "" , 2));
+  _cgiu2 = add_cursor(new TCursor(_rel_giu, "" , 2));
+  _cdit2 = add_cursor(new TCursor(_rel_dit, "", 2));
+  
+  p.addstatus(1);
+  
+  _comuni = new TLocalisamfile(LF_COMUNI);
+  
+  // set translated field values
+  set_translation(LF_ANAGFIS,"STATCIV","1","Celibe/Nubile");
+  set_translation(LF_ANAGFIS,"STATCIV","2","Coniugato/a");
+  set_translation(LF_ANAGFIS,"STATCIV","3","Vedovo/a");
+  set_translation(LF_ANAGFIS,"STATCIV","4","Separato/a");
+  set_translation(LF_ANAGFIS,"STATCIV","5","Divorziato/a");
+  set_translation(LF_ANAGFIS,"STATCIV","6","Deceduto/a");
+  set_translation(LF_ANAGFIS,"STATCIV","7","Tutelato/a");
+  set_translation(LF_ANAGFIS,"STATCIV","8","Figlio/a minore");
+  set_translation(LF_ANAGFIS,"TITSTU", "1" ,"Nessuno");
+  set_translation(LF_ANAGFIS,"TITSTU", "2" ,"Lic. Elem.");
+  set_translation(LF_ANAGFIS,"TITSTU", "3" ,"Lic. Media");
+  set_translation(LF_ANAGFIS,"TITSTU", "4" ,"Diploma");
+  set_translation(LF_ANAGFIS,"TITSTU", "5" ,"Laurea");
+  set_translation(LF_ANAGFIS,"SESSO", "M", "Maschio");
+  set_translation(LF_ANAGFIS,"SESSO", "F", "Femmina");
+  set_translation(LF_NDITTE,"FREQVIVA","M","Mensile");
+  set_translation(LF_NDITTE,"FREQVIVA","T","Trimestrale");
+  set_translation(LF_NDITTE,"DATLAV","1","Si");
+  set_translation(LF_NDITTE,"DATLAV","2","No");
+  set_translation(LF_NDITTE,"DATLAV","3","Lavoro Agricolo");
+  set_translation(LF_NDITTE,"STATOSOC","1","Normale attivita'");
+  set_translation(LF_NDITTE,"STATOSOC","2","Liquidazione cessata attivita'");
+  set_translation(LF_NDITTE,"STATOSOC","3",
+                  "Fallimento o Liquidazione coatta amm.");
+  set_translation(LF_NDITTE,"STATOSOC","4","Estinto");
+  set_translation(LF_ANAGGIU,"STATOSOC","1","Normale attivita'");
+  set_translation(LF_ANAGGIU,"STATOSOC","2","Liquidazione cessata attivita'");
+  set_translation(LF_ANAGGIU,"STATOSOC","3",
+                  "Fallimento o Liquidazione coatta amm.");
+  set_translation(LF_ANAGGIU,"STATOSOC","4","Estinto");
+  set_translation(LF_ANAGGIU,"SITSOC","1","Inizio");
+  set_translation(LF_ANAGGIU,"SITSOC","2","Liquidazione");
+  set_translation(LF_ANAGGIU,"SITSOC","3","Termine liquidazione");
+  set_translation(LF_ANAGGIU,"SITSOC","4","Estinzione");
+  set_translation(LF_ANAGGIU,"SITSOC","5","Trasf. IRPEG");
+  set_translation(LF_ANAGGIU,"SITSOC","6","Normale");
+  
+  set_fillchar('_');
+  set_wait_threshold(0);                       
+
+  p.addstatus(1);
+
+}
+
+void BA6100_App::user_destroy()
+{
+  if (_rel_fis) delete _rel_fis;
+  if (_rel_giu) delete _rel_giu;
+  if (_rel_dit) delete _rel_dit;
+  if (_frpos)   delete _frpos;
+
+  delete _comuni;
+}
+
+
+int ba6100(int argc, char* argv[])
+{
+  BA6100_App app;
+  app.run(argc, argv, "Stampa Anagrafiche");   
+  return 0;
+}
diff --git a/ba/ba6101.cpp b/ba/ba6101.cpp
index 4387a32be..e8eb0921f 100755
--- a/ba/ba6101.cpp
+++ b/ba/ba6101.cpp
@@ -1,850 +1,850 @@
-// ************************************************************************
-// Stampa anagrafiche (ba6 -0)
-// Settaggio stampe
-// ************************************************************************
-
-#include "ba6100.h"
-static const char sep[] = 
-"-----------------------------------------------------------------" 
-"-----------------------------------------------------------------" ;
-
-void BA6100_App::set_scheda_anagiu()
-{
-  set_row(1,"SCHEDA SOCIETA'");
-  set_row(2,"");
-  set_row(3,"@bCodice@r@15g@u@pn@25g@r@bRag.Sociale @r@u@50s",
-          FLD(LF_ANAG,"CODANAGR","@@@@@"),
-          FLD(LF_ANAG,"RAGSOC"));
-  set_row(4,"@25g@bEvent. sigla@r@40g@u@20s",
-          FLD(LF_ANAGGIU,"SIGLA"));
-  set_row(5,"Oggetto soc.@15g@60s",
-          FLD(LF_ANAGGIU,"OGGSOC"));
-  set_row(6,"Codice Fiscale@20g@16s@46gPartita IVA @12s", 
-          FLD(LF_ANAG,"COFI"),
-          FLD(LF_ANAG,"PAIV"));
-  set_row(7,"Riferimento@15g@20s", FLD(LF_ANAGGIU,"PERRIF"));
-  set_row(8,"");
-
-  set_row(9,"Sede legale@20gIndirizzo @35s",
-          FLD(LF_ANAG,"INDRES"));
-  TString com = current_cursor()->curr(LF_ANAG).get("COMRES");
-  TRectype& cc = look_com(com);
-
-  TString a = cc.get("DENCOM");
-  TString b = cc.get("CAPCOM");
-  TString c = cc.get("PROVCOM");
-  set_row(10,"@20gComune    %-24s@53gProvincia %2s@68gCAP %5s",
-          (const char*)a,
-          (const char*)c,
-          (const char*)b);
-  
-  set_row(11,"@20gTelefono  @u@10s@r/@u@30s@r",
-          FLD(LF_ANAG,"PTELRF"),
-          FLD(LF_ANAG,"TELRF"));
-  set_row(12,"");
-
-  set_row(13,"Domicilio fiscale@20gIndirizzo @35s",
-          FLD(LF_ANAG,"INDRF"));  
-  com = current_cursor()->curr(LF_ANAG).get("COMRF");
-  cc = look_com(com);
-  a = cc.get("DENCOM");
-  b = cc.get("CAPCOM");
-  c = cc.get("PROVCOM");
-  set_row(14,"@20gComune    %-24s@53gProvincia %2s@68gCAP %5s",
-          (const char*)a,
-          (const char*)c,
-          (const char*)b);
-  
-  set_row(15,"");
-  set_row(16,"Corrispondenza@20gIndirizzo @35s",
-          FLD(LF_ANAG,"INDCORR"));
-  
-  com = current_cursor()->curr(LF_ANAG).get("COMCORR");
-  cc = look_com(com);
-  a = cc.get("DENCOM");
-  b = cc.get("CAPCOM");
-  c = cc.get("PROVCOM");
-  
-  set_row(17,"@20gComune    %-24s@53gProvincia %2s@68gCAP %5s",
-          (const char*)a,
-          (const char*)c,
-          (const char*)b);
-  
-  com = current_cursor()->curr(LF_ANAG).get("STATOCORR");
-  if (com.empty()) 
-    a = "Italia";
-  else { a = look_tab("%STA",com,"S0"); }
-
-  set_row(18,"@20gStato     %s",(const char*)a);
-  set_row(19,"");
-  set_row(20,"Telex@20g@u@10s@r/@u@30s@r",
-          FLD(LF_ANAG,"PTLEXRF"),
-          FLD(LF_ANAG,"TLEXRFX"));
-  set_row(21,"Telefax@20g@u@10s@r/@u@30s@r",
-          FLD(LF_ANAG,"PFAXRF"),
-          FLD(LF_ANAG,"FAXRF"));
-  set_row(22,"");
-  set_row(23,"Ufficio imposte@20gNumero   @pn",
-          FLD(LF_ANAG,"UFFIIDD","@@@"));
-
-  com = current_cursor()->curr(LF_ANAG).get("UFFIIDD");
-  a = look_tab("%UID",com,"S6");
-  c = look_tab("%UID",com,"S4");
-  cc = look_com(a);
-  a = cc.get("DENCOM");
-  b = cc.get("PROVCOM");
-
-  set_row(24,"@20gComune   %-24s@53gProvincia %2s",
-          (const char*)a,
-          (const char*)b);
-  set_row(25,"");
-  set_row(26,"Esattoria@20gC/C n.   %-20s",(const char*)c);
-  set_row(27,"@20gComune   %-24s@53gProvincia %2s",
-          (const char*)a,
-          (const char*)b);
-  set_row(28,"@20gCodice contribuente  @10s",
-          FLD(LF_ANAG,"CODCONTR"));
-  set_row(29,""); set_row(30,"");
-  
-  // dati atto costitutivo etc
-  set_row(31,"Dati atto costitutivo e statuto"); set_row(32,"");
-  set_row(33,"Estremi@20g@60s", FLD(LF_ANAGGIU,"ESTROMOL"));
-  set_row(34,"Omologa@25g@ld@41gData iscrizione@70g@ld",
-          FLD(LF_ANAGGIU,"DATAOMOL"),
-          FLD(LF_ANAGGIU,"DATAISCRIZ"));
-  set_row(35,"Data costituzione@25g@ld@41gDurata sino@70g@ld",
-          FLD(LF_ANAGGIU,"DATACOST"),
-          FLD(LF_ANAGGIU,"DATASCAD"));
-  set_row(36,"Termine appr. bilancio@25g@d@41gApprovazione bilancio@70g@d",
-          FLD(LF_ANAGGIU,"DATATAPPBI"),
-          FLD(LF_ANAGGIU,"DATAAPPBIL"));
-  set_row(37,"Scad.org.amministrativo@25g@d@41gScadenza collegio "
-          "sindacale@70g@d",
-          FLD(LF_ANAGGIU,"DATASORAMM"),
-          FLD(LF_ANAGGIU,"DATASCSIND"));
-  //  set_row(38,"Fine esercizio@25g@d", FLD(LF_ANAGGIU,"???"));
-  set_row(39,"");
-  set_row(40,"@5gCapit.sociale@24gCapit.versato@47g"
-          "Fatturato@65gN.azioni@74gValore");
-  set_row(41,"@pn @pn @pn @61g@n @pn",
-          FLD(LF_ANAGGIU,"CAPSOC","###.###.###.###.###"),
-          FLD(LF_ANAGGIU,"CAPVER","###.###.###.###.###"),
-          FLD(LF_ANAGGIU,"FATT","###.###.###.###.###"),
-          FLD(LF_ANAGGIU,"NAZIONI"),
-          FLD(LF_ANAGGIU,"VALNOM","###.###.###.###"));
-  set_row(42,"");
-
-  set_row(43,"Dati Statistici@20gNon residente@61g@f",
-          FLD(LF_ANAG,"SOGGNRES"));
-  set_row(44,"@20gEventi naturali eccezionali@61g@s",
-          FLD(LF_ANAG,"EVECC"));
-  set_row(45,"@20gResidente in zone terremotate@61g@f",
-          FLD(LF_ANAG,"RESZTERR"));
-  // *TBI* traduzione natura giuridica
-  set_row(46,"@20gNatura giuridica@61g@s",
-          FLD(LF_ANAGGIU,"NATGIU"));
-  set_row(47,"@20gStato societa'@51g@20,rt",
-          FLD(LF_ANAGGIU,"STATOSOC"));
-  set_row(48,"@20gSituazione societa'@51g@20,rt",
-          FLD(LF_ANAGGIU,"SITSOC"));
-  
-  set_row(49,"");
-  a = look_tab("%SST",current_cursor()->curr(LF_ANAG).get("CODSTAT1"),"S0");
-  set_row(50,"@20gSigla stat.1 @pn %-50s",
-          FLD(LF_ANAG,"CODSTAT1","@@@@@@@"), (const char*)a); 
-  a = look_tab("%SST",current_cursor()->curr(LF_ANAG).get("CODSTAT2"),"S0");
-  set_row(51,"@20gSigla stat.2 @pn %-50s",
-          FLD(LF_ANAG,"CODSTAT2","@@@@@@@"), (const char*)a); 
-  a = look_tab("%SST",current_cursor()->curr(LF_ANAG).get("CODSTAT3"),"S0");
-  set_row(52,"@20gSigla stat.3 @pn %-50s",
-          FLD(LF_ANAG,"CODSTAT3","@@@@@@@"), (const char*)a); 
-
-  // NOTE
-  set_row(53,"");
-  set_row(54,"Note attivato storico");
-  set_row(55,"@6g@70s",FLD(LF_ANAGGIU,"NOTE1"));
-  set_row(56,"@6g@70s",FLD(LF_ANAGGIU,"NOTE2"));
-  set_row(57,"@6g@70s",FLD(LF_ANAGGIU,"NOTE3"));
-  set_row(58,"@6g@70s",FLD(LF_ANAGGIU,"NOTE4"));
-  set_row(59,"@6g@70s",FLD(LF_ANAGGIU,"NOTE5"));
-  
-  for (int i = 60; i <= printer().formlen(); i++)
-    set_row(i, "");
-}
-
-void BA6100_App::set_scheda_anafis()
-{
-  set_row(1,"SCHEDA PERSONA FISICA");
-  set_row(2,"");
-  set_row(3,"@bCodice  @r@u@pn@20g@r@bCognome @r@u@S",
-          FLD(LF_ANAG,"CODANAGR","@@@@@"),
-          FLD(LF_ANAG,"RAGSOC",0,29));
-  set_row(4,"@20g@bNome    @r@u@s",
-          FLD(LF_ANAG,"RAGSOC",30,50));
-  set_row(5,"");
-  set_row(6,"Codice Fiscale@20g@s@46gPartita IVA @s", 
-          FLD(LF_ANAG,"COFI"),
-          FLD(LF_ANAG,"PAIV"));
-  set_row(7,"Data di nascita@20g@ld@32g@t@46gNazionalita' @s",
-          FLD(LF_ANAGFIS,"DATANASC"),
-          FLD(LF_ANAGFIS,"SESSO"),
-          FLD(LF_ANAGFIS,"NAZION"));
-  set_row(8,"");
-  set_row(9,"Residenza@20gIndirizzo @s",
-          FLD(LF_ANAG,"INDRES"));
-
-  TString com = current_cursor()->curr(LF_ANAG).get("COMRES");
-  TRectype& cc = look_com(com);
-  TString a = cc.get("DENCOM");
-  TString b = cc.get("CAPCOM");
-  TString c = cc.get("PROVCOM");
-
-  set_row(10,"@20gComune    %s@53gProvincia %s@68gCAP %s",
-          (const char*)a,
-          (const char*)c,
-          (const char*)b
-          );
-  
-  set_row(11,"@20gTelefono  @u@s@r/@u@s@r",
-          FLD(LF_ANAG,"PTELRF"),
-          FLD(LF_ANAG,"TELRF"));
-  set_row(12,"");
-  set_row(13,"Domicilio fiscale@20gIndirizzo @s",
-          FLD(LF_ANAG,"INDRF"));
-  
-  com = current_cursor()->curr(LF_ANAG).get("COMRF");
-  cc = look_com(com);
-  a = cc.get("DENCOM");
-  b = cc.get("CAPCOM");
-  c = cc.get("PROVCOM");
-  
-  set_row(14,"@20gComune    %s@53gProvincia %s@68gCAP %s",
-          (const char*)a,
-          (const char*)c,
-          (const char*)b
-          );
-  
-  set_row(15,"");
-  set_row(16,"Corrispondenza@20gIndirizzo @s",
-          FLD(LF_ANAG,"INDCORR"));
-  
-  com = current_cursor()->curr(LF_ANAG).get("COMCORR");
-  cc = look_com(com);
-  a = cc.get("DENCOM");
-  b = cc.get("CAPCOM");
-  c = cc.get("PROVCOM");
-  
-  set_row(17,"@20gComune    %s@53gProvincia %s@68gCAP %s",
-          (const char*)a,
-          (const char*)c,
-          (const char*)b
-          );
-  
-  com = current_cursor()->curr(LF_ANAG).get("STATOCORR");
-  if (com.empty()) 
-    a = "Italia";
-  else { a = look_tab("%STA",com,"S0"); }
-
-  set_row(18,"@20gStato     %s",(const char*)a);
-  set_row(19,"");
-  set_row(20,"Telex@20g@u@s@r/@u@s@r",
-          FLD(LF_ANAG,"PTLEXRF"),
-          FLD(LF_ANAG,"TLEXRFX"));
-  set_row(21,"Telefax@20g@u@s@r/@u@s@r",
-          FLD(LF_ANAG,"PFAXRF"),
-          FLD(LF_ANAG,"FAXRF"));
-  set_row(22,"");
-  set_row(23,"Ufficio imposte@20gNumero   @pn",
-          FLD(LF_ANAG,"UFFIIDD","@@@"));
-
-  com = current_cursor()->curr(LF_ANAG).get("UFFIIDD");
-  a = look_tab("%UID",com,"S6");
-  c = look_tab("%UID",com,"S4");
-  cc = look_com(a);
-  a = cc.get("DENCOM");
-  b = cc.get("PROVCOM");
-
-  set_row(24,"@20gComune   %s@53gProvincia %s",
-          (const char*)a,
-          (const char*)b);
-  set_row(25,"");
-  set_row(26,"Esattoria@20gC/C n.   %s",(const char*)c);
-  set_row(27,"@20gComune   %s@53gProvincia %s",
-          (const char*)a,
-          (const char*)b);
-  set_row(28,"@20gCodice contribuente  @s",
-          FLD(LF_ANAG,"CODCONTR"));
-  set_row(29,"");
-  
-  // cerca coniuge
-  com = current_cursor()->curr(LF_ANAGFIS).get("CODCONIUGE");
-  TLocalisamfile* af = current_cursor()->file(LF_ANAG);
-  TRecnotype last = af->recno();
-  int k = af->getkey();
-
-  if (!com.empty())
-  {
-    af->curr().zero();
-    af->setkey(1);
-    af->put("CODANAGR",com);
-    af->put("TIPOA","F");
-    af->read();
-  }
-  a = af->get("RAGSOC");
-  if (!com.empty())
-  {
-    af->setkey(k);
-    af->readat(last);
-    b = a.sub(30); a = a.left(20);
-  }
-  else { a = ""; b = ""; }
-  
-  set_row(30,"Coniuge   @pn@20gCognome  %s",
-          FLD(LF_ANAGFIS,"CODCONIUGE","@@@@@"),
-          (const char*)a);
-  set_row(31,"@20gNome     %s", (const char*)b);
-
-
-  set_row(32,"Dati Statistici@20gNon residente@53g@f",
-          FLD(LF_ANAG,"SOGGNRES"));
-  set_row(33,"@20gEventi naturali eccezionali@53g@s",
-          FLD(LF_ANAG,"EVECC"));
-  set_row(34,"@20gResidente in zone terremotate@53g@f",
-          FLD(LF_ANAG,"RESZTERR"));
-  set_row(35,"@20gStato civile@53g@t",
-          FLD(LF_ANAGFIS,"STATCIV"));
-  set_row(36,"@20gData variazione stato civile@53g@D",
-          FLD(LF_ANAGFIS,"DVARSCIV"));
-  set_row(37,"@20gTitolo di studio@53g@t",
-          FLD(LF_ANAGFIS,"TITSTU"));
-  //  set_row(37,"@20gProvincia lavoro dipendente@61g@s");  
-  set_row(38,""); set_row(39,""); set_row(40,""); set_row(41,"");
-  
-  a = look_tab("%SST",
-               current_cursor()->curr(LF_ANAG).get("CODSTAT1"),"S0");
-  set_row(42,"@20gSigla stat.1 @pn %s",
-          FLD(LF_ANAG,"CODSTAT1","@@@@@@@"), (const char*)a); 
-  a = look_tab("%SST",current_cursor()->curr(LF_ANAG).get("CODSTAT2"),"S0");
-  set_row(43,"@20gSigla stat.2 @pn ",
-          FLD(LF_ANAG,"CODSTAT2","@@@@@@@"), (const char*)a); 
-  a = look_tab("%SST",current_cursor()->curr(LF_ANAG).get("CODSTAT3"),"S0");
-  set_row(44,"@20gSigla stat.3 @pn ",
-          FLD(LF_ANAG,"CODSTAT3","@@@@@@@"), (const char*)a); 
-  
-  for (int i = 45; i <= printer().formlen(); i++)
-    set_row(i, "");
-}
-
-void BA6100_App::set_scheda_ditta()
-{
-  set_row(1,"@bSCHEDA DITTA  @r@u@pn@r@20g@bDenominaz. sociale  @r@u@s",
-          FLD(LF_NDITTE,"CODDITTA","@@@@@"),
-          FLD(LF_NDITTE,"RAGSOC"));
-  set_row(2,"Albo artigiani@20gIscrizione all'albo  @f@55gnum. @s",
-          FLD(LF_NDITTE,"ARTIG"),
-          FLD(LF_NDITTE,"NISCRAA"));
-  TString a = 
-    look_com(current_cursor()->curr(LF_NDITTE).get("COMAA")).get("DENCOM");
-  set_row(3,"@20gLocalita'  %s@55gData @D", 
-          (const char*)a,
-          FLD(LF_NDITTE,"DATAISCRAA"));
-  set_row(4,"Attivita'");
-
-  a = look_tab("%AIS",current_cursor()->
-               curr(LF_NDITTE).get("CODATTPREV")); // TBC
-  
-  set_row(5,"prevalente@20gCod. @pn    Desc. %s",
-          FLD(LF_NDITTE,"CODATTPREV","@@@@@"), 
-          (const char*)a);
-  //  set_row(6,"@20gGestione piu' attivita'");
-  set_row(6,"@20gFrequenza versamenti@54g@t",
-          FLD(LF_NDITTE,"FREQVIVA"));
-  set_row(7,"@20gTenuta contabilita' ordinaria@54g@f",
-          FLD(LF_NDITTE,"CONTORD"));
-  set_row(8,"@20gDatore di lavoro@54g@t",
-          FLD(LF_NDITTE,"DATLAV"));
-  set_row(9,"@20gData inizio attivita'@54g@D",
-          FLD(LF_NDITTE,"DINIZIOATT"));
-  set_row(10,"Altri dati@20gRiferimento @u@s@r  @54gTel. @u@4S@r/@u@S@r",
-          FLD(LF_NDITTE,"PERRIF"),
-          FLD(LF_NDITTE,"PTEL"),
-          FLD(LF_NDITTE,"TEL"));
-  set_row(11,"@20gGestione magazzino   @f",
-          FLD(LF_NDITTE,"REGMAG"));
-  set_row(12,"@20gNumero unita' locali @n@54gNum.enasarco @s",
-          FLD(LF_NDITTE,"NULC"),
-          FLD(LF_NDITTE,"NENASARCO"));
-  set_row(13,"");
-  /* TBI: banca di appoggio */
-  set_row(14,"Stato@20g@t",FLD(LF_NDITTE,"STATOSOC"));
-  set_row(15,""); set_row(16,"");
-}
-
-void BA6100_App::set_scheda_attiv()
-{
-  TString dio = look_tab("%AIS",current_cursor()->
-                         curr(LF_ATTIV).get("CODATT"),"S0");
-  
-  set_row(1,"@bATTIVITA'@r   @pn@20g@bDescrizione:@r     %s",
-          FLD(LF_ATTIV,"CODATT","@@@@@"), (const char*)dio);
-  
-  set_row(2,"@20gRegime agricolo@67g@f",
-          FLD(LF_ATTIV,"REGAGR"));
-  set_row(3,"@20gRegime speciale agenzie di viaggio (art.74ter)@67g@f",
-          FLD(LF_ATTIV,"REG74TER"));
-  set_row(4,"@20gAttivita' stagionale@67g@f",
-          FLD(LF_ATTIV,"ATTSTAG"));
-  set_row(5,"@20gAttivita' esercitata in piu' luoghi@67g@f",
-          FLD(LF_ATTIV,"ESLUOGHID"));
-  set_row(6,"@20gData inizio attivita'@60g@D",
-          FLD(LF_NDITTE,"DINIZIOATT"));
-  set_row(7,"@20gData variazione attivita'@60g@D",
-          FLD(LF_ATTIV,"DATAVARIVA"));
-  set_row(8,"@20gData cessazione attivita'@60g@D",
-          FLD(LF_ATTIV,"DCESSATT"));
-  set_row(9,"@20g@bCONSERVAZIONE SCRITTURE CONTABILI@r");
-
-  // cerca depositario
-  TString com = get_field(LF_ATTIV,"CODANGRDS");
-  TString a   = get_field(LF_ATTIV,"TIPOADS");
-  TLocalisamfile* af = current_cursor()->file(LF_ANAG);
-  TRecnotype last = af->recno();
-  af->curr().zero();
-  int k = af->getkey();
-  af->setkey(1);
-  af->curr().put("CODANAGR",com);
-  af->curr().put("TIPOA",a);
-
-  TString b = af->curr().get("RAGSOC");
-  com = af->curr().get("INDRF");
-  if (com.empty()) com = af->curr().get("INDRES");
-  TString c = af->curr().get("COMRF");
-  if (c.empty) c = af->curr().get("COMRES");
-  TRectype& cm = look_com(a);
-  af->readat(last);
-  af->setkey(k);
-
-  set_row(10,"Depositario@20gCodice @pn (%s): %s",
-          FLD(LF_ATTIV,"CODANGRDS"),
-          c == 'F' ? "p.f." : "p.g.",
-          (const char*)b);
-  set_row(11,"@20gIndirizzo %s", (const char*)c);
-  a = cm.get("DENCOM"); b = cm.get("PROVCOM"); c = cm.get("CAPCOM");
-  set_row(12,"@20gComune    %s@53gProvincia %s@68gC.a.p. %s",
-          (const char*)a, (const char*)b, (const char*)c);
-  set_row(13,"@20gTenuta scritture parziali@68g@f",
-          FLD(LF_ATTIV,"TSCRPARZ"));
-  set_row(14,"Luogo@20gIndirizzo @s @s",
-          FLD(LF_ATTIV,"INDCS"),
-          FLD(LF_ATTIV,"CAPCS"));
-  cm = look_com(get_field(LF_ATTIV,"COMCS"));
-  a = cm.get("DENCOM"); b = cm.get("PROVCOM"); c = cm.get("CAPCOM");
-  set_row(15,"@20gComune    %s@53gProvincia %s@68gC.a.p. %s",
-          (const char*)a, (const char*)b, (const char*)c);
-  set_row(16,"@20gTelefono  ");
-  set_row(17,""); set_row(18,"");
-}
-
-void BA6100_App::set_scheda_registro()
-{
-  /* TBI */
-}
-
-void BA6100_App::set_scheda_unloc()
-{
-  set_row(1,"@bUNITA' LOCALE@20gCodice    @r@u@pn@r",
-          FLD(LF_UNLOC,"CODULC","@@@"));
-  set_row(2,"@20g@bIndirizzo@r@u @s@r@68g@bNumero @r@u@s",
-          FLD(LF_UNLOC,"INDULC"),
-          FLD(LF_UNLOC,"CIVULC"));
-  TRectype& cc = look_com(get_field(LF_UNLOC,"COMULC"));
-  TString a = cc.get("DENCOM");
-  TString b = cc.get("PROVCOM");
-  TString c = cc.get("CAPCOM");
-  set_row(3,"@20g@bComune@r@4j@u%s@r@53g@bProvincia@r @u%s@r@68g@b"
-          "C.a.p.@r @u%s",
-          (const char*)a, (const char*)b, (const char*)c);
-  set_row(4,""); 
-  set_row(5,"C.C.I.A.A.@20gNumero@30g@pn",
-          FLD(LF_UNLOC,"NUMCCIAA","@@@@@@@"));
-  cc = look_com(get_field(LF_UNLOC,"COMCCIAA"));
-  a  = cc.get("DENCOM");
-  set_row(6,"@20gComune@30g%s@53gN. Meccanografico @n",
-          (const char*)a,
-          FLD(LF_UNLOC,"NUMMECC"));
-  set_row(7,"@20gData iscrizione  @D@48gData ultima variazione  @D",
-          FLD(LF_UNLOC,"DATAICCIAA"),
-          FLD(LF_UNLOC,"DATAVCCIAA"));
-  set_row(8,"");
-  set_row(9,"Autorizzazioni@20gN. R.E.C. @30g@pn@41gComunale n. @pn "
-          "PS n. @pn Altre @s",
-          FLD(LF_UNLOC,"NUMREC","@@@@@@@"),
-          FLD(LF_UNLOC,"AUTCOM","@@@@@"),
-          FLD(LF_UNLOC,"AUTPS","@@@@@@@"),
-          FLD(LF_UNLOC,"ALTAUT"));
-  set_row(10,"");
-  set_row(11,"Posizioni@20gINPS n.@30g@s INAIL n. @s",
-          FLD(LF_UNLOC,"POSINPS"),
-          FLD(LF_UNLOC,"POSINAIL"));
-  set_row(12,"");
-  set_row(13,"Tribunale@20gRegistro@30g@pn@44gVolume@52g@pn@64gFascicolo @pn",
-          FLD(LF_UNLOC,"REGTRIB","@@@@@@@@@"),
-          FLD(LF_UNLOC,"VOLTRIB","@@@@@@@"),
-          FLD(LF_UNLOC,"FASCTRIB","@@@@@"));
-  set_row(14,"");
-  set_row(15,"Locali destinati");
-  set_row(16,"all'attivita'@20gMq.Locali @pn  Di cui a magazzino  @pn",
-          FLD(LF_UNLOC,"MQULC","@@@@@"),
-          FLD(LF_UNLOC,"MQULCMAG","@@@@@"));
-  set_row(17,""); set_row(18,"");
-}
-
-void BA6100_App::set_scheda_socio()
-{
-  int rw;
-  TString b1, b2, b3;
-
-  TLocalisamfile* ana = current_cursor()->file(LF_ANAG);
-  TLocalisamfile* soc = current_cursor()->file(LF_SOCI);
-  TRecnotype      rno = ana->recno();
-  int k               = ana->getkey();
-
-  ana->zero();
-  ana->put("TIPOA",soc->get("TIPOASOC"));
-  ana->put("CODANAGR",soc->get("CODANAGRSO"));
-  ana->read();
-
-  TString codconiuge = "";
-  
-  if (soc->get("TIPOASOC") == "F")
-  {
-    TLocalisamfile* anaf;
-    TRecnotype rn = 0; int kk = 1;
-
-    if (_pr_what == anafis)
-    {
-      anaf = current_cursor()->file(LF_ANAGFIS);
-      rn  = anaf->recno();
-      kk  = anaf->getkey();
-    }
-    else
-    { 
-      anaf = new TLocalisamfile(LF_ANAGFIS);
-      anaf->read();
-    }
-
-    anaf->zero();
-    anaf->put("CODANAGR",soc->get("CODANAGRSO"));
-    anaf->read();
-    TRectype& com = look_com(anaf->get("COMNASC"));
-
-    set_row(1,"@bSOCIO@r  @s / @pn@20g@bCognome@r @s",
-            FLD(LF_SOCI,"TIPOASOC"),
-            FLD(LF_SOCI,"CODANAGRSO","@@@@@"),
-            FLD(LF_ANAG,"RAGSOC",0,29));
-    set_row(2,"@20g@bNome@r    @s@53g@bCod.fisc.@r @s",
-            FLD(LF_ANAG,"RAGSOC",30,50),
-            FLD(LF_ANAG,"COFI"));
-    set_row(3,"");
-
-    b1 = anaf->get_date("DATANASC").string(4);
-    b2 = anaf->get("SESSO");
-    b3 = anaf->get("STATONASC").empty() ? 
-      "Italiana" : anaf->get("STATONASC");
-
-    set_row(4,"Nascita@20gData@30g%S@42gSesso %S@53gCittadinanza %S",
-            (const char*)b1,
-            (const char*)b2,
-            (const char*)b3);
-
-    b1 = com.get("DENCOM");
-    b2 = com.get("PROVCOM");
-    
-    set_row(5,"@20gComune@30g%S@53gProvincia %S",
-            (const char*)b1,
-            (const char*)b2);
-    rw = 6;
-
-    codconiuge = "Cod.coniuge ";
-    codconiuge << anaf->get("CODCONIUGE");
-    
-    if (_pr_what == anafis)
-    { anaf->setkey(kk); anaf->readat(rn); }
-    else delete anaf;
-  }
-  else 
-  {
-    set_row(1,"@bSOCIO@r  @S / @pN@20gR.soc. @s");
-    set_row(2,"@20gCod.fisc. @s @P.IVA @s");
-    rw = 3;
-  }
-  set_row(rw,"");
-  
-  TRectype& com = look_com(ana->get("COMRES"));
-
-  b1 = com.get("DENCOM");
-  b2 = com.get("PROVCOM");
-  b3 = com.get("CAPCOM");
-
-  set_row(rw+1,"Residenza@20gIndirizzo @S", FLD(LF_ANAG,"INDRES"));
-  set_row(rw+2,"@20gComune    %S@53gProvincia %S@68gC.a.p. %S",
-          (const char*)b1,
-          (const char*)b2,
-          (const char*)b3);
-
-  set_row(rw+3,"");
-  
-  TString car = look_tab("%CRS",soc->get("CODCAR"));
-
-  set_row(rw+4,"Carica@20gCod. @pN@30g%s@62gScadenza @lD",
-          FLD(LF_SOCI,"CODCAR","@@"),
-          (const char*)car,
-          FLD(LF_SOCI,"SCADCAR"));
-
-  set_row(rw+5,"Azioni@20gN.quote @N = @7.3N%% Redd. @7.3N%% Perd. @7.3N%%",
-          FLD(LF_SOCI,"NQUOTEAZ"),
-          FLD(LF_SOCI,"PERCQUAZ"),
-          FLD(LF_SOCI,"PERCAZREDD"),
-          FLD(LF_SOCI,"PERCAZPERD"));
-  set_row(rw+6,"@20gTitolo proprieta' @S Emolumento @pN",
-          FLD(LF_SOCI,"TITPROP"),
-          FLD(LF_SOCI,"EMOLUMENTO","###.###.###.###"));
-  set_row(rw+7,"%% rit.su dividendi @7.3n%%  Tipo azione  @s  "
-          "Partecipaz. assemblea @f",
-          FLD(LF_SOCI,"PERCRITDIV"),
-          FLD(LF_SOCI,"TIPOAZ"),
-          FLD(LF_SOCI,"PARTASS"));
-  set_row(rw+8,"Modello 740 @s @57g%s",
-          FLD(LF_SOCI,"Q740"),
-          (const char*)codconiuge);
-  set_row(rw+9,"Attiv. prevalente  @f@37gQuadro 750 @s @53g"
-          "Mesi lavorati art.120 c1 @2n",
-          FLD(LF_SOCI,"ATTPREV"),
-          FLD(LF_SOCI,"QUATTPREV"),
-          FLD(LF_SOCI,"MLAV120C1"));
-
-  set_row(rw+10,"@20gRichiesta qualifica @s@53gMesi lavorati art.120 c2 @2n",
-          FLD(LF_SOCI,"RICQUAL"),
-          FLD(LF_SOCI,"MLAV120C2"));
-  set_row(rw+11,"Note@20g@s", FLD(LF_SOCI,"NOTE"));
-  set_row(rw+12,"Data ultimo agg. @20gAnagrafica @d @53gSocio @d",
-          FLD(LF_ANAG,"DATAAGG"),
-          FLD(LF_SOCI,"DATAAGG"));
-  set_row(rw+13,""); set_row(rw+14,"");
-
-  ana->setkey(k);
-  ana->readat(rno);
-}
-
-
-void BA6100_App::set_rubriche()
-{
-  // preprocess_page will fill the vars
-  set_row(2,"@32g@35S", FLD(LF_ANAG,"INDRES"));
-  set_row(3,"@32g#-24T CAP #5T  PR #2T", &_com, &_cap, &_prov);
-  set_row(4,"@32gTel. #-36T", &_phone);
-  set_row(5,"");
-
-  if (_pr_what == nditte)
-  {
-    set_row(1,"@b$[r]@pN@r$[n]@3j@50S", 
-            FLD(LF_NDITTE,"CODDITTA","@@@@@"),
-            FLD(LF_NDITTE,"RAGSOC"));
-  }
-  else if (_pr_what == anafis) 
-  {
-    set_row(1,"@b$[b]@pN$[n]@r@3j@S @S",  FLD(LF_ANAG,"CODANAGR","@@@@@"),
-            FLD(LF_ANAG,"RAGSOC",0,29), FLD(LF_ANAG,"RAGSOC",30,50));
-  }
-  else
-  {
-    set_row(1,"@b$[b]@pN$[n]@r@3j@50S", FLD(LF_ANAG,"CODANAGR","@@@@@"),
-            FLD(LF_ANAG,"RAGSOC"));
-    set_row(4,"@56g Rif @12S", FLD(LF_ANAGGIU,"PERRIF"));
-  }
-}
-
-
-
-void BA6100_App::set_elenco()
-{
-  switch(_pr_what)
-  {
-  case anafis:
-  case anagiu:
-    if (_pr_what == anafis)
-    {
-      if (_inclditte)
-        set_row(1,"$[b]@pN$[n]@4j@S @S@50g$[r]@pN$[n]@66g@S", 
-                FLD(LF_ANAG,"CODANAGR","@@@@@"), 
-                FLD(LF_ANAG,"RAGSOC",0,29),
-                FLD(LF_ANAG,"RAGSOC",30,50),
-                FLD(LF_NDITTE,"CODDITTA","@@@@@"),
-                FLD(LF_NDITTE,"RAGSOC"));
-      else
-        set_row(1,"$[b]@pN$[n]@4j@S @S", 
-                FLD(LF_ANAG,"CODANAGR","@@@@@"), 
-                FLD(LF_ANAG,"RAGSOC",0,29),
-                FLD(LF_ANAG,"RAGSOC",30,50));
-    }
-    else 
-    {
-      if (_inclditte)
-        set_row(1,"$[b]@pN$[n]@4j@50S@50g$[r]@pN$[n]@66g@S", 
-                FLD(LF_ANAG,"CODANAGR","@@@@@"), 
-                FLD(LF_ANAG,"RAGSOC"),
-                FLD(LF_NDITTE,"CODDITTA","@@@@@"),
-                FLD(LF_NDITTE,"RAGSOC"));
-      
-      else
-        set_row(1,"$[b]@pN$[n]@4j@50S", 
-                FLD(LF_ANAG,"CODANAGR","@@@@@"), 
-                FLD(LF_ANAG,"RAGSOC"));
-    }
-    break;
-  case nditte:
-    set_row(1,"$[r]@pN$[n]@10g@S@50g@S @pN@3j@S",
-            FLD(LF_NDITTE,"CODDITTA","@@@@"),
-            FLD(LF_NDITTE,"RAGSOC"),
-            FLD(LF_NDITTE,"TIPOA"),
-            FLD(LF_ANAG,  "CODANAGR", "@@@@@"),
-            FLD(LF_ANAG,  "RAGSOC"));
-    break;
-  }
-  set_row(2,"");
-}
-
-void BA6100_App::set_schede()
-{
-  switch(_pr_what)
-  {
-  case anafis: set_scheda_anafis(); break;
-             case anagiu: set_scheda_anagiu(); break;
-             case nditte: set_scheda_ditta(); break;
-             }
-}
-
-
-void BA6100_App::set_headers()
-{
-  reset_header();
-  set_background();
-  if (_pr_type == elenco)
-  {
-    switch(_pr_what)
-    {
-    case anafis:
-    case anagiu: 
-#if XVT_OS != XVT_OS_SCOUNIX                     
-      set_background("W1l{1 2 132 2}W4l{1 5 132 5}");
-#else
-      set_header(2,(const char*)sep);
-      set_header(5,(const char*)sep);
-#endif
-      set_header(1,"@bELENCO PERSONE %s@82gStudio@96gData"
-                 "@101g @< @110g Pag. @#", _pr_what == anafis ? "FISICHE" :
-                 "GIURIDICHE");
-      set_header(3,"@iCodice@55gCodice");
-      set_header(4,"@iAnagr.   Ragione sociale/cognome e nome@55gDitta"
-                 "@66gDenominazione sociale");
-      set_header(6,"");
-      break;
-    case nditte:
-#if XVT_OS != XVT_OS_SCOUNIX                     
-      set_background("W1l{1 2 132 2}W4l{1 5 132 5}");
-#else
-      set_header(2,(const char*)sep);
-      set_header(5,(const char*)sep);
-#endif
-      set_header(1,"@bELENCO DITTE@82gStudio@96gData"
-                 "@101g @< @110 @#");
-      set_header(3,"@iCodice@50gT");
-      set_header(4,"@iAnagr.   Denominazione sociale@50gP Codice"
-                 "@61gRagione sociale/Cognome e nome");
-      set_header(6,"");
-    }
-  }
-  else if (_pr_type == rubriche)
-  {
-    switch (_pr_what)
-    {
-    case anafis:
-    case anagiu:
-#if XVT_OS != XVT_OS_SCOUNIX                     
-      set_background("W1l{1 2 132 2}W4l{1 4 132 4}");
-#else
-      set_header(2,(const char*)sep);
-      set_header(4,(const char*)sep);
-#endif
-      set_header(1,"@bRUBRICA PERSONE %s@40gStudio@53gData @<   pag. @#", 
-                 _pr_what == anagiu ? "GIURIDICHE" : "FISICHE");
-      set_header(3,"@iCodice  Cognome e nome");
-      set_header(5,"");
-      break;
-    case nditte:
-#if XVT_OS != XVT_OS_SCOUNIX                     
-      set_background("W1l{1 2 132 2}W4l{1 4 132 4}");
-#else
-      set_header(2,(const char*)sep);
-      set_header(4,(const char*)sep);
-#endif
-      set_header(1,"@bRUBRICA DITTE@40gStudio@53gData @<   pag. @#");
-      set_header(3,"@iCodice  Cognome e nome");
-      set_header(5,"");
-      break;
-    }  
-  }
-  else if (_pr_type == schede)
-  {
-    set_header(1,"");
-  }
-}
-
-
-void BA6100_App::set_etichette()
-{
-  int namerow = 0;
-
-  for (int i = 2; i <= _rows_et; i++)
-    set_row(i, "");
-
-  if (_is_piv)
-  { 
-    set_row(_piv_row, TString(format("@%dg#t", _piv_col)), &_cofi);
-    _frpos[_piv_row - 1] = TRUE;
-  }
-  if (_is_cod)
-  {
-    set_row(_cod_row, TString(format("@%dg#t", _cod_col)), &_cod);
-    _frpos[_cod_row - 1] = TRUE;
-  }
-  
-  // name goes in first free row
-  for (i = 0; i < _rows_et; i++) 
-  {
-    if (!_frpos[i]) 
-    { if (namerow == 0) namerow = i; }
-  }
-  
-  namerow++; reset_row(namerow);
-  
-  if (_pr_what == anagiu)
-    set_row(namerow,TString(format("@%dg#t",_ind_col)), &_name);
-  else
-  {                                    
-    set_row(namerow,TString(format("@%dg#t #t #t",_ind_col)), &_sex, &_name, &_surname);
-  }
-
-  set_row(_ind_row,TString(format("@%dg#t #t", _ind_col)), &_address, &_civ);
-  set_row(_ind_row+1, TString(format("@%dg#t #t #t", _ind_col)), 
-          &_cap, &_com, &_prov);
-  
-  if (!_stato.empty())
-  {
-    // print state on first free row
-    for (i = _ind_row+1; i < _rows_et; i++)
-      if (!_frpos[i] && i != (namerow - 1))
-        set_row(i+1, TString(format("@%dg#t", _ind_col)), &_stato);   
-  }  
-
-}
+// ************************************************************************
+// Stampa anagrafiche (ba6 -0)
+// Settaggio stampe
+// ************************************************************************
+
+#include "ba6100.h"
+static const char sep[] = 
+"-----------------------------------------------------------------" 
+"-----------------------------------------------------------------" ;
+
+void BA6100_App::set_scheda_anagiu()
+{
+  set_row(1,"SCHEDA SOCIETA'");
+  set_row(2,"");
+  set_row(3,"@bCodice@r@15g@u@pn@25g@r@bRag.Sociale @r@u@50s",
+          FLD(LF_ANAG,"CODANAGR","@@@@@"),
+          FLD(LF_ANAG,"RAGSOC"));
+  set_row(4,"@25g@bEvent. sigla@r@40g@u@20s",
+          FLD(LF_ANAGGIU,"SIGLA"));
+  set_row(5,"Oggetto soc.@15g@60s",
+          FLD(LF_ANAGGIU,"OGGSOC"));
+  set_row(6,"Codice Fiscale@20g@16s@46gPartita IVA @12s", 
+          FLD(LF_ANAG,"COFI"),
+          FLD(LF_ANAG,"PAIV"));
+  set_row(7,"Riferimento@15g@20s", FLD(LF_ANAGGIU,"PERRIF"));
+  set_row(8,"");
+
+  set_row(9,"Sede legale@20gIndirizzo @35s",
+          FLD(LF_ANAG,"INDRES"));
+  TString com = current_cursor()->curr(LF_ANAG).get("COMRES");
+  TRectype& cc = look_com(com);
+
+  TString a = cc.get("DENCOM");
+  TString b = cc.get("CAPCOM");
+  TString c = cc.get("PROVCOM");
+  set_row(10,"@20gComune    %-24s@53gProvincia %2s@68gCAP %5s",
+          (const char*)a,
+          (const char*)c,
+          (const char*)b);
+  
+  set_row(11,"@20gTelefono  @u@10s@r/@u@30s@r",
+          FLD(LF_ANAG,"PTELRF"),
+          FLD(LF_ANAG,"TELRF"));
+  set_row(12,"");
+
+  set_row(13,"Domicilio fiscale@20gIndirizzo @35s",
+          FLD(LF_ANAG,"INDRF"));  
+  com = current_cursor()->curr(LF_ANAG).get("COMRF");
+  cc = look_com(com);
+  a = cc.get("DENCOM");
+  b = cc.get("CAPCOM");
+  c = cc.get("PROVCOM");
+  set_row(14,"@20gComune    %-24s@53gProvincia %2s@68gCAP %5s",
+          (const char*)a,
+          (const char*)c,
+          (const char*)b);
+  
+  set_row(15,"");
+  set_row(16,"Corrispondenza@20gIndirizzo @35s",
+          FLD(LF_ANAG,"INDCORR"));
+  
+  com = current_cursor()->curr(LF_ANAG).get("COMCORR");
+  cc = look_com(com);
+  a = cc.get("DENCOM");
+  b = cc.get("CAPCOM");
+  c = cc.get("PROVCOM");
+  
+  set_row(17,"@20gComune    %-24s@53gProvincia %2s@68gCAP %5s",
+          (const char*)a,
+          (const char*)c,
+          (const char*)b);
+  
+  com = current_cursor()->curr(LF_ANAG).get("STATOCORR");
+  if (com.empty()) 
+    a = "Italia";
+  else { a = look_tab("%STA",com,"S0"); }
+
+  set_row(18,"@20gStato     %s",(const char*)a);
+  set_row(19,"");
+  set_row(20,"Telex@20g@u@10s@r/@u@30s@r",
+          FLD(LF_ANAG,"PTLEXRF"),
+          FLD(LF_ANAG,"TLEXRFX"));
+  set_row(21,"Telefax@20g@u@10s@r/@u@30s@r",
+          FLD(LF_ANAG,"PFAXRF"),
+          FLD(LF_ANAG,"FAXRF"));
+  set_row(22,"");
+  set_row(23,"Ufficio imposte@20gNumero   @pn",
+          FLD(LF_ANAG,"UFFIIDD","@@@"));
+
+  com = current_cursor()->curr(LF_ANAG).get("UFFIIDD");
+  a = look_tab("%UID",com,"S6");
+  c = look_tab("%UID",com,"S4");
+  cc = look_com(a);
+  a = cc.get("DENCOM");
+  b = cc.get("PROVCOM");
+
+  set_row(24,"@20gComune   %-24s@53gProvincia %2s",
+          (const char*)a,
+          (const char*)b);
+  set_row(25,"");
+  set_row(26,"Esattoria@20gC/C n.   %-20s",(const char*)c);
+  set_row(27,"@20gComune   %-24s@53gProvincia %2s",
+          (const char*)a,
+          (const char*)b);
+  set_row(28,"@20gCodice contribuente  @10s",
+          FLD(LF_ANAG,"CODCONTR"));
+  set_row(29,""); set_row(30,"");
+  
+  // dati atto costitutivo etc
+  set_row(31,"Dati atto costitutivo e statuto"); set_row(32,"");
+  set_row(33,"Estremi@20g@60s", FLD(LF_ANAGGIU,"ESTROMOL"));
+  set_row(34,"Omologa@25g@ld@41gData iscrizione@70g@ld",
+          FLD(LF_ANAGGIU,"DATAOMOL"),
+          FLD(LF_ANAGGIU,"DATAISCRIZ"));
+  set_row(35,"Data costituzione@25g@ld@41gDurata sino@70g@ld",
+          FLD(LF_ANAGGIU,"DATACOST"),
+          FLD(LF_ANAGGIU,"DATASCAD"));
+  set_row(36,"Termine appr. bilancio@25g@d@41gApprovazione bilancio@70g@d",
+          FLD(LF_ANAGGIU,"DATATAPPBI"),
+          FLD(LF_ANAGGIU,"DATAAPPBIL"));
+  set_row(37,"Scad.org.amministrativo@25g@d@41gScadenza collegio "
+          "sindacale@70g@d",
+          FLD(LF_ANAGGIU,"DATASORAMM"),
+          FLD(LF_ANAGGIU,"DATASCSIND"));
+  //  set_row(38,"Fine esercizio@25g@d", FLD(LF_ANAGGIU,"???"));
+  set_row(39,"");
+  set_row(40,"@5gCapit.sociale@24gCapit.versato@47g"
+          "Fatturato@65gN.azioni@74gValore");
+  set_row(41,"@pn @pn @pn @61g@n @pn",
+          FLD(LF_ANAGGIU,"CAPSOC","###.###.###.###.###"),
+          FLD(LF_ANAGGIU,"CAPVER","###.###.###.###.###"),
+          FLD(LF_ANAGGIU,"FATT","###.###.###.###.###"),
+          FLD(LF_ANAGGIU,"NAZIONI"),
+          FLD(LF_ANAGGIU,"VALNOM","###.###.###.###"));
+  set_row(42,"");
+
+  set_row(43,"Dati Statistici@20gNon residente@61g@f",
+          FLD(LF_ANAG,"SOGGNRES"));
+  set_row(44,"@20gEventi naturali eccezionali@61g@s",
+          FLD(LF_ANAG,"EVECC"));
+  set_row(45,"@20gResidente in zone terremotate@61g@f",
+          FLD(LF_ANAG,"RESZTERR"));
+  // *TBI* traduzione natura giuridica
+  set_row(46,"@20gNatura giuridica@61g@s",
+          FLD(LF_ANAGGIU,"NATGIU"));
+  set_row(47,"@20gStato societa'@51g@20,rt",
+          FLD(LF_ANAGGIU,"STATOSOC"));
+  set_row(48,"@20gSituazione societa'@51g@20,rt",
+          FLD(LF_ANAGGIU,"SITSOC"));
+  
+  set_row(49,"");
+  a = look_tab("%SST",current_cursor()->curr(LF_ANAG).get("CODSTAT1"),"S0");
+  set_row(50,"@20gSigla stat.1 @pn %-50s",
+          FLD(LF_ANAG,"CODSTAT1","@@@@@@@"), (const char*)a); 
+  a = look_tab("%SST",current_cursor()->curr(LF_ANAG).get("CODSTAT2"),"S0");
+  set_row(51,"@20gSigla stat.2 @pn %-50s",
+          FLD(LF_ANAG,"CODSTAT2","@@@@@@@"), (const char*)a); 
+  a = look_tab("%SST",current_cursor()->curr(LF_ANAG).get("CODSTAT3"),"S0");
+  set_row(52,"@20gSigla stat.3 @pn %-50s",
+          FLD(LF_ANAG,"CODSTAT3","@@@@@@@"), (const char*)a); 
+
+  // NOTE
+  set_row(53,"");
+  set_row(54,"Note attivato storico");
+  set_row(55,"@6g@70s",FLD(LF_ANAGGIU,"NOTE1"));
+  set_row(56,"@6g@70s",FLD(LF_ANAGGIU,"NOTE2"));
+  set_row(57,"@6g@70s",FLD(LF_ANAGGIU,"NOTE3"));
+  set_row(58,"@6g@70s",FLD(LF_ANAGGIU,"NOTE4"));
+  set_row(59,"@6g@70s",FLD(LF_ANAGGIU,"NOTE5"));
+  
+  for (int i = 60; i <= printer().formlen(); i++)
+    set_row(i, "");
+}
+
+void BA6100_App::set_scheda_anafis()
+{
+  set_row(1,"SCHEDA PERSONA FISICA");
+  set_row(2,"");
+  set_row(3,"@bCodice  @r@u@pn@20g@r@bCognome @r@u@S",
+          FLD(LF_ANAG,"CODANAGR","@@@@@"),
+          FLD(LF_ANAG,"RAGSOC",0,29));
+  set_row(4,"@20g@bNome    @r@u@s",
+          FLD(LF_ANAG,"RAGSOC",30,50));
+  set_row(5,"");
+  set_row(6,"Codice Fiscale@20g@s@46gPartita IVA @s", 
+          FLD(LF_ANAG,"COFI"),
+          FLD(LF_ANAG,"PAIV"));
+  set_row(7,"Data di nascita@20g@ld@32g@t@46gNazionalita' @s",
+          FLD(LF_ANAGFIS,"DATANASC"),
+          FLD(LF_ANAGFIS,"SESSO"),
+          FLD(LF_ANAGFIS,"NAZION"));
+  set_row(8,"");
+  set_row(9,"Residenza@20gIndirizzo @s",
+          FLD(LF_ANAG,"INDRES"));
+
+  TString com = current_cursor()->curr(LF_ANAG).get("COMRES");
+  TRectype& cc = look_com(com);
+  TString a = cc.get("DENCOM");
+  TString b = cc.get("CAPCOM");
+  TString c = cc.get("PROVCOM");
+
+  set_row(10,"@20gComune    %s@53gProvincia %s@68gCAP %s",
+          (const char*)a,
+          (const char*)c,
+          (const char*)b
+          );
+  
+  set_row(11,"@20gTelefono  @u@s@r/@u@s@r",
+          FLD(LF_ANAG,"PTELRF"),
+          FLD(LF_ANAG,"TELRF"));
+  set_row(12,"");
+  set_row(13,"Domicilio fiscale@20gIndirizzo @s",
+          FLD(LF_ANAG,"INDRF"));
+  
+  com = current_cursor()->curr(LF_ANAG).get("COMRF");
+  cc = look_com(com);
+  a = cc.get("DENCOM");
+  b = cc.get("CAPCOM");
+  c = cc.get("PROVCOM");
+  
+  set_row(14,"@20gComune    %s@53gProvincia %s@68gCAP %s",
+          (const char*)a,
+          (const char*)c,
+          (const char*)b
+          );
+  
+  set_row(15,"");
+  set_row(16,"Corrispondenza@20gIndirizzo @s",
+          FLD(LF_ANAG,"INDCORR"));
+  
+  com = current_cursor()->curr(LF_ANAG).get("COMCORR");
+  cc = look_com(com);
+  a = cc.get("DENCOM");
+  b = cc.get("CAPCOM");
+  c = cc.get("PROVCOM");
+  
+  set_row(17,"@20gComune    %s@53gProvincia %s@68gCAP %s",
+          (const char*)a,
+          (const char*)c,
+          (const char*)b
+          );
+  
+  com = current_cursor()->curr(LF_ANAG).get("STATOCORR");
+  if (com.empty()) 
+    a = "Italia";
+  else { a = look_tab("%STA",com,"S0"); }
+
+  set_row(18,"@20gStato     %s",(const char*)a);
+  set_row(19,"");
+  set_row(20,"Telex@20g@u@s@r/@u@s@r",
+          FLD(LF_ANAG,"PTLEXRF"),
+          FLD(LF_ANAG,"TLEXRFX"));
+  set_row(21,"Telefax@20g@u@s@r/@u@s@r",
+          FLD(LF_ANAG,"PFAXRF"),
+          FLD(LF_ANAG,"FAXRF"));
+  set_row(22,"");
+  set_row(23,"Ufficio imposte@20gNumero   @pn",
+          FLD(LF_ANAG,"UFFIIDD","@@@"));
+
+  com = current_cursor()->curr(LF_ANAG).get("UFFIIDD");
+  a = look_tab("%UID",com,"S6");
+  c = look_tab("%UID",com,"S4");
+  cc = look_com(a);
+  a = cc.get("DENCOM");
+  b = cc.get("PROVCOM");
+
+  set_row(24,"@20gComune   %s@53gProvincia %s",
+          (const char*)a,
+          (const char*)b);
+  set_row(25,"");
+  set_row(26,"Esattoria@20gC/C n.   %s",(const char*)c);
+  set_row(27,"@20gComune   %s@53gProvincia %s",
+          (const char*)a,
+          (const char*)b);
+  set_row(28,"@20gCodice contribuente  @s",
+          FLD(LF_ANAG,"CODCONTR"));
+  set_row(29,"");
+  
+  // cerca coniuge
+  com = current_cursor()->curr(LF_ANAGFIS).get("CODCONIUGE");
+  TLocalisamfile& af = current_cursor()->file(LF_ANAG);
+  TRecnotype last = af.recno();
+  int k = af.getkey();
+
+  if (!com.empty())
+  {
+    af.curr().zero();
+    af.setkey(1);
+    af.put("CODANAGR",com);
+    af.put("TIPOA","F");
+    af.read();
+  }
+  a = af.get("RAGSOC");
+  if (!com.empty())
+  {
+    af.setkey(k);
+    af.readat(last);
+    b = a.sub(30); a = a.left(20);
+  }
+  else { a = ""; b = ""; }
+  
+  set_row(30,"Coniuge   @pn@20gCognome  %s",
+          FLD(LF_ANAGFIS,"CODCONIUGE","@@@@@"),
+          (const char*)a);
+  set_row(31,"@20gNome     %s", (const char*)b);
+
+
+  set_row(32,"Dati Statistici@20gNon residente@53g@f",
+          FLD(LF_ANAG,"SOGGNRES"));
+  set_row(33,"@20gEventi naturali eccezionali@53g@s",
+          FLD(LF_ANAG,"EVECC"));
+  set_row(34,"@20gResidente in zone terremotate@53g@f",
+          FLD(LF_ANAG,"RESZTERR"));
+  set_row(35,"@20gStato civile@53g@t",
+          FLD(LF_ANAGFIS,"STATCIV"));
+  set_row(36,"@20gData variazione stato civile@53g@D",
+          FLD(LF_ANAGFIS,"DVARSCIV"));
+  set_row(37,"@20gTitolo di studio@53g@t",
+          FLD(LF_ANAGFIS,"TITSTU"));
+  //  set_row(37,"@20gProvincia lavoro dipendente@61g@s");  
+  set_row(38,""); set_row(39,""); set_row(40,""); set_row(41,"");
+  
+  a = look_tab("%SST",
+               current_cursor()->curr(LF_ANAG).get("CODSTAT1"),"S0");
+  set_row(42,"@20gSigla stat.1 @pn %s",
+          FLD(LF_ANAG,"CODSTAT1","@@@@@@@"), (const char*)a); 
+  a = look_tab("%SST",current_cursor()->curr(LF_ANAG).get("CODSTAT2"),"S0");
+  set_row(43,"@20gSigla stat.2 @pn ",
+          FLD(LF_ANAG,"CODSTAT2","@@@@@@@"), (const char*)a); 
+  a = look_tab("%SST",current_cursor()->curr(LF_ANAG).get("CODSTAT3"),"S0");
+  set_row(44,"@20gSigla stat.3 @pn ",
+          FLD(LF_ANAG,"CODSTAT3","@@@@@@@"), (const char*)a); 
+  
+  for (int i = 45; i <= printer().formlen(); i++)
+    set_row(i, "");
+}
+
+void BA6100_App::set_scheda_ditta()
+{
+  set_row(1,"@bSCHEDA DITTA  @r@u@pn@r@20g@bDenominaz. sociale  @r@u@s",
+          FLD(LF_NDITTE,"CODDITTA","@@@@@"),
+          FLD(LF_NDITTE,"RAGSOC"));
+  set_row(2,"Albo artigiani@20gIscrizione all'albo  @f@55gnum. @s",
+          FLD(LF_NDITTE,"ARTIG"),
+          FLD(LF_NDITTE,"NISCRAA"));
+  TString a = 
+    look_com(current_cursor()->curr(LF_NDITTE).get("COMAA")).get("DENCOM");
+  set_row(3,"@20gLocalita'  %s@55gData @D", 
+          (const char*)a,
+          FLD(LF_NDITTE,"DATAISCRAA"));
+  set_row(4,"Attivita'");
+
+  a = look_tab("%AIS",current_cursor()->
+               curr(LF_NDITTE).get("CODATTPREV")); // TBC
+  
+  set_row(5,"prevalente@20gCod. @pn    Desc. %s",
+          FLD(LF_NDITTE,"CODATTPREV","@@@@@"), 
+          (const char*)a);
+  //  set_row(6,"@20gGestione piu' attivita'");
+  set_row(6,"@20gFrequenza versamenti@54g@t",
+          FLD(LF_NDITTE,"FREQVIVA"));
+  set_row(7,"@20gTenuta contabilita' ordinaria@54g@f",
+          FLD(LF_NDITTE,"CONTORD"));
+  set_row(8,"@20gDatore di lavoro@54g@t",
+          FLD(LF_NDITTE,"DATLAV"));
+  set_row(9,"@20gData inizio attivita'@54g@D",
+          FLD(LF_NDITTE,"DINIZIOATT"));
+  set_row(10,"Altri dati@20gRiferimento @u@s@r  @54gTel. @u@4S@r/@u@S@r",
+          FLD(LF_NDITTE,"PERRIF"),
+          FLD(LF_NDITTE,"PTEL"),
+          FLD(LF_NDITTE,"TEL"));
+  set_row(11,"@20gGestione magazzino   @f",
+          FLD(LF_NDITTE,"REGMAG"));
+  set_row(12,"@20gNumero unita' locali @n@54gNum.enasarco @s",
+          FLD(LF_NDITTE,"NULC"),
+          FLD(LF_NDITTE,"NENASARCO"));
+  set_row(13,"");
+  /* TBI: banca di appoggio */
+  set_row(14,"Stato@20g@t",FLD(LF_NDITTE,"STATOSOC"));
+  set_row(15,""); set_row(16,"");
+}
+
+void BA6100_App::set_scheda_attiv()
+{
+  TString dio = look_tab("%AIS",current_cursor()->
+                         curr(LF_ATTIV).get("CODATT"),"S0");
+  
+  set_row(1,"@bATTIVITA'@r   @pn@20g@bDescrizione:@r     %s",
+          FLD(LF_ATTIV,"CODATT","@@@@@"), (const char*)dio);
+  
+  set_row(2,"@20gRegime agricolo@67g@f",
+          FLD(LF_ATTIV,"REGAGR"));
+  set_row(3,"@20gRegime speciale agenzie di viaggio (art.74ter)@67g@f",
+          FLD(LF_ATTIV,"REG74TER"));
+  set_row(4,"@20gAttivita' stagionale@67g@f",
+          FLD(LF_ATTIV,"ATTSTAG"));
+  set_row(5,"@20gAttivita' esercitata in piu' luoghi@67g@f",
+          FLD(LF_ATTIV,"ESLUOGHID"));
+  set_row(6,"@20gData inizio attivita'@60g@D",
+          FLD(LF_NDITTE,"DINIZIOATT"));
+  set_row(7,"@20gData variazione attivita'@60g@D",
+          FLD(LF_ATTIV,"DATAVARIVA"));
+  set_row(8,"@20gData cessazione attivita'@60g@D",
+          FLD(LF_ATTIV,"DCESSATT"));
+  set_row(9,"@20g@bCONSERVAZIONE SCRITTURE CONTABILI@r");
+
+  // cerca depositario
+  TString com = get_field(LF_ATTIV,"CODANGRDS");
+  TString a   = get_field(LF_ATTIV,"TIPOADS");
+  TLocalisamfile& af = current_cursor()->file(LF_ANAG);
+  TRecnotype last = af.recno();
+  af.curr().zero();
+  int k = af.getkey();
+  af.setkey(1);
+  af.curr().put("CODANAGR",com);
+  af.curr().put("TIPOA",a);
+
+  TString b = af.curr().get("RAGSOC");
+  com = af.curr().get("INDRF");
+  if (com.empty()) com = af.curr().get("INDRES");
+  TString c = af.curr().get("COMRF");
+  if (c.empty) c = af.curr().get("COMRES");
+  TRectype& cm = look_com(a);
+  af.readat(last);
+  af.setkey(k);
+
+  set_row(10,"Depositario@20gCodice @pn (%s): %s",
+          FLD(LF_ATTIV,"CODANGRDS"),
+          c == 'F' ? "p.f." : "p.g.",
+          (const char*)b);
+  set_row(11,"@20gIndirizzo %s", (const char*)c);
+  a = cm.get("DENCOM"); b = cm.get("PROVCOM"); c = cm.get("CAPCOM");
+  set_row(12,"@20gComune    %s@53gProvincia %s@68gC.a.p. %s",
+          (const char*)a, (const char*)b, (const char*)c);
+  set_row(13,"@20gTenuta scritture parziali@68g@f",
+          FLD(LF_ATTIV,"TSCRPARZ"));
+  set_row(14,"Luogo@20gIndirizzo @s @s",
+          FLD(LF_ATTIV,"INDCS"),
+          FLD(LF_ATTIV,"CAPCS"));
+  cm = look_com(get_field(LF_ATTIV,"COMCS"));
+  a = cm.get("DENCOM"); b = cm.get("PROVCOM"); c = cm.get("CAPCOM");
+  set_row(15,"@20gComune    %s@53gProvincia %s@68gC.a.p. %s",
+          (const char*)a, (const char*)b, (const char*)c);
+  set_row(16,"@20gTelefono  ");
+  set_row(17,""); set_row(18,"");
+}
+
+void BA6100_App::set_scheda_registro()
+{
+  /* TBI */
+}
+
+void BA6100_App::set_scheda_unloc()
+{
+  set_row(1,"@bUNITA' LOCALE@20gCodice    @r@u@pn@r",
+          FLD(LF_UNLOC,"CODULC","@@@"));
+  set_row(2,"@20g@bIndirizzo@r@u @s@r@68g@bNumero @r@u@s",
+          FLD(LF_UNLOC,"INDULC"),
+          FLD(LF_UNLOC,"CIVULC"));
+  TRectype& cc = look_com(get_field(LF_UNLOC,"COMULC"));
+  TString a = cc.get("DENCOM");
+  TString b = cc.get("PROVCOM");
+  TString c = cc.get("CAPCOM");
+  set_row(3,"@20g@bComune@r@4j@u%s@r@53g@bProvincia@r @u%s@r@68g@b"
+          "C.a.p.@r @u%s",
+          (const char*)a, (const char*)b, (const char*)c);
+  set_row(4,""); 
+  set_row(5,"C.C.I.A.A.@20gNumero@30g@pn",
+          FLD(LF_UNLOC,"NUMCCIAA","@@@@@@@"));
+  cc = look_com(get_field(LF_UNLOC,"COMCCIAA"));
+  a  = cc.get("DENCOM");
+  set_row(6,"@20gComune@30g%s@53gN. Meccanografico @n",
+          (const char*)a,
+          FLD(LF_UNLOC,"NUMMECC"));
+  set_row(7,"@20gData iscrizione  @D@48gData ultima variazione  @D",
+          FLD(LF_UNLOC,"DATAICCIAA"),
+          FLD(LF_UNLOC,"DATAVCCIAA"));
+  set_row(8,"");
+  set_row(9,"Autorizzazioni@20gN. R.E.C. @30g@pn@41gComunale n. @pn "
+          "PS n. @pn Altre @s",
+          FLD(LF_UNLOC,"NUMREC","@@@@@@@"),
+          FLD(LF_UNLOC,"AUTCOM","@@@@@"),
+          FLD(LF_UNLOC,"AUTPS","@@@@@@@"),
+          FLD(LF_UNLOC,"ALTAUT"));
+  set_row(10,"");
+  set_row(11,"Posizioni@20gINPS n.@30g@s INAIL n. @s",
+          FLD(LF_UNLOC,"POSINPS"),
+          FLD(LF_UNLOC,"POSINAIL"));
+  set_row(12,"");
+  set_row(13,"Tribunale@20gRegistro@30g@pn@44gVolume@52g@pn@64gFascicolo @pn",
+          FLD(LF_UNLOC,"REGTRIB","@@@@@@@@@"),
+          FLD(LF_UNLOC,"VOLTRIB","@@@@@@@"),
+          FLD(LF_UNLOC,"FASCTRIB","@@@@@"));
+  set_row(14,"");
+  set_row(15,"Locali destinati");
+  set_row(16,"all'attivita'@20gMq.Locali @pn  Di cui a magazzino  @pn",
+          FLD(LF_UNLOC,"MQULC","@@@@@"),
+          FLD(LF_UNLOC,"MQULCMAG","@@@@@"));
+  set_row(17,""); set_row(18,"");
+}
+
+void BA6100_App::set_scheda_socio()
+{
+  int rw;
+  TString b1, b2, b3;
+
+  TLocalisamfile& ana = current_cursor()->file(LF_ANAG);
+  TLocalisamfile& soc = current_cursor()->file(LF_SOCI);
+  TRecnotype      rno = ana.recno();
+  int k               = ana.getkey();
+
+  ana.zero();
+  ana.put("TIPOA",soc.get("TIPOASOC"));
+  ana.put("CODANAGR",soc.get("CODANAGRSO"));
+  ana.read();
+
+  TString codconiuge = "";
+  TLocalisamfile* anaf;    
+
+  if (soc.get("TIPOASOC") == "F")
+  {
+    TRecnotype rn = 0; int kk = 1;
+
+    if (_pr_what == anafis)
+    {
+      anaf = &current_cursor()->file(LF_ANAGFIS);
+      rn  = anaf->recno();
+      kk  = anaf->getkey();
+    }
+    else
+    { 
+      anaf = new TLocalisamfile(LF_ANAGFIS);
+      anaf->read();
+    }
+
+    anaf->zero();
+    anaf->put("CODANAGR",soc.get("CODANAGRSO"));
+    anaf->read();
+    TRectype& com = look_com(anaf->get("COMNASC"));
+
+    set_row(1,"@bSOCIO@r  @s / @pn@20g@bCognome@r @s",
+            FLD(LF_SOCI,"TIPOASOC"),
+            FLD(LF_SOCI,"CODANAGRSO","@@@@@"),
+            FLD(LF_ANAG,"RAGSOC",0,29));
+    set_row(2,"@20g@bNome@r    @s@53g@bCod.fisc.@r @s",
+            FLD(LF_ANAG,"RAGSOC",30,50),
+            FLD(LF_ANAG,"COFI"));
+    set_row(3,"");
+
+    b1 = anaf->get_date("DATANASC").string(4);
+    b2 = anaf->get("SESSO");
+    b3 = anaf->get("STATONASC").empty() ? 
+      "Italiana" : anaf->get("STATONASC");
+
+    set_row(4,"Nascita@20gData@30g%S@42gSesso %S@53gCittadinanza %S",
+            (const char*)b1,
+            (const char*)b2,
+            (const char*)b3);
+
+    b1 = com.get("DENCOM");
+    b2 = com.get("PROVCOM");
+    
+    set_row(5,"@20gComune@30g%S@53gProvincia %S",
+            (const char*)b1,
+            (const char*)b2);
+    rw = 6;
+
+    codconiuge = "Cod.coniuge ";
+    codconiuge << anaf->get("CODCONIUGE");
+    
+    if (_pr_what == anafis)
+    { anaf->setkey(kk); anaf->readat(rn); }
+    else delete anaf;
+  }
+  else 
+  {
+    set_row(1,"@bSOCIO@r  @S / @pN@20gR.soc. @s");
+    set_row(2,"@20gCod.fisc. @s @P.IVA @s");
+    rw = 3;
+  }
+  set_row(rw,"");
+  
+  TRectype& com = look_com(ana.get("COMRES"));
+
+  b1 = com.get("DENCOM");
+  b2 = com.get("PROVCOM");
+  b3 = com.get("CAPCOM");
+
+  set_row(rw+1,"Residenza@20gIndirizzo @S", FLD(LF_ANAG,"INDRES"));
+  set_row(rw+2,"@20gComune    %S@53gProvincia %S@68gC.a.p. %S",
+          (const char*)b1,
+          (const char*)b2,
+          (const char*)b3);
+
+  set_row(rw+3,"");
+  
+  TString car = look_tab("%CRS",soc.get("CODCAR"));
+
+  set_row(rw+4,"Carica@20gCod. @pN@30g%s@62gScadenza @lD",
+          FLD(LF_SOCI,"CODCAR","@@"),
+          (const char*)car,
+          FLD(LF_SOCI,"SCADCAR"));
+
+  set_row(rw+5,"Azioni@20gN.quote @N = @7.3N%% Redd. @7.3N%% Perd. @7.3N%%",
+          FLD(LF_SOCI,"NQUOTEAZ"),
+          FLD(LF_SOCI,"PERCQUAZ"),
+          FLD(LF_SOCI,"PERCAZREDD"),
+          FLD(LF_SOCI,"PERCAZPERD"));
+  set_row(rw+6,"@20gTitolo proprieta' @S Emolumento @pN",
+          FLD(LF_SOCI,"TITPROP"),
+          FLD(LF_SOCI,"EMOLUMENTO","###.###.###.###"));
+  set_row(rw+7,"%% rit.su dividendi @7.3n%%  Tipo azione  @s  "
+          "Partecipaz. assemblea @f",
+          FLD(LF_SOCI,"PERCRITDIV"),
+          FLD(LF_SOCI,"TIPOAZ"),
+          FLD(LF_SOCI,"PARTASS"));
+  set_row(rw+8,"Modello 740 @s @57g%s",
+          FLD(LF_SOCI,"Q740"),
+          (const char*)codconiuge);
+  set_row(rw+9,"Attiv. prevalente  @f@37gQuadro 750 @s @53g"
+          "Mesi lavorati art.120 c1 @2n",
+          FLD(LF_SOCI,"ATTPREV"),
+          FLD(LF_SOCI,"QUATTPREV"),
+          FLD(LF_SOCI,"MLAV120C1"));
+
+  set_row(rw+10,"@20gRichiesta qualifica @s@53gMesi lavorati art.120 c2 @2n",
+          FLD(LF_SOCI,"RICQUAL"),
+          FLD(LF_SOCI,"MLAV120C2"));
+  set_row(rw+11,"Note@20g@s", FLD(LF_SOCI,"NOTE"));
+  set_row(rw+12,"Data ultimo agg. @20gAnagrafica @d @53gSocio @d",
+          FLD(LF_ANAG,"DATAAGG"),
+          FLD(LF_SOCI,"DATAAGG"));
+  set_row(rw+13,""); set_row(rw+14,"");
+
+  ana.setkey(k);
+  ana.readat(rno);
+}
+
+
+void BA6100_App::set_rubriche()
+{
+  // preprocess_page will fill the vars
+  set_row(2,"@32g@35S", FLD(LF_ANAG,"INDRES"));
+  set_row(3,"@32g#-24T CAP #5T  PR #2T", &_com, &_cap, &_prov);
+  set_row(4,"@32gTel. #-36T", &_phone);
+  set_row(5,"");
+
+  if (_pr_what == nditte)
+  {
+    set_row(1,"@b$[r]@pN@r$[n]@3j@50S", 
+            FLD(LF_NDITTE,"CODDITTA","@@@@@"),
+            FLD(LF_NDITTE,"RAGSOC"));
+  }
+  else if (_pr_what == anafis) 
+  {
+    set_row(1,"@b$[b]@pN$[n]@r@3j@S @S",  FLD(LF_ANAG,"CODANAGR","@@@@@"),
+            FLD(LF_ANAG,"RAGSOC",0,29), FLD(LF_ANAG,"RAGSOC",30,50));
+  }
+  else
+  {
+    set_row(1,"@b$[b]@pN$[n]@r@3j@50S", FLD(LF_ANAG,"CODANAGR","@@@@@"),
+            FLD(LF_ANAG,"RAGSOC"));
+    set_row(4,"@56g Rif @12S", FLD(LF_ANAGGIU,"PERRIF"));
+  }
+}
+
+
+
+void BA6100_App::set_elenco()
+{
+  switch(_pr_what)
+  {
+  case anafis:
+  case anagiu:
+    if (_pr_what == anafis)
+    {
+      if (_inclditte)
+        set_row(1,"$[b]@pN$[n]@4j@S @S@50g$[r]@pN$[n]@66g@S", 
+                FLD(LF_ANAG,"CODANAGR","@@@@@"), 
+                FLD(LF_ANAG,"RAGSOC",0,29),
+                FLD(LF_ANAG,"RAGSOC",30,50),
+                FLD(LF_NDITTE,"CODDITTA","@@@@@"),
+                FLD(LF_NDITTE,"RAGSOC"));
+      else
+        set_row(1,"$[b]@pN$[n]@4j@S @S", 
+                FLD(LF_ANAG,"CODANAGR","@@@@@"), 
+                FLD(LF_ANAG,"RAGSOC",0,29),
+                FLD(LF_ANAG,"RAGSOC",30,50));
+    }
+    else 
+    {
+      if (_inclditte)
+        set_row(1,"$[b]@pN$[n]@4j@50S@50g$[r]@pN$[n]@66g@S", 
+                FLD(LF_ANAG,"CODANAGR","@@@@@"), 
+                FLD(LF_ANAG,"RAGSOC"),
+                FLD(LF_NDITTE,"CODDITTA","@@@@@"),
+                FLD(LF_NDITTE,"RAGSOC"));
+      
+      else
+        set_row(1,"$[b]@pN$[n]@4j@50S", 
+                FLD(LF_ANAG,"CODANAGR","@@@@@"), 
+                FLD(LF_ANAG,"RAGSOC"));
+    }
+    break;
+  case nditte:
+    set_row(1,"$[r]@pN$[n]@10g@S@50g@S @pN@3j@S",
+            FLD(LF_NDITTE,"CODDITTA","@@@@"),
+            FLD(LF_NDITTE,"RAGSOC"),
+            FLD(LF_NDITTE,"TIPOA"),
+            FLD(LF_ANAG,  "CODANAGR", "@@@@@"),
+            FLD(LF_ANAG,  "RAGSOC"));
+    break;
+  }
+  set_row(2,"");
+}
+
+void BA6100_App::set_schede()
+{
+  switch(_pr_what)
+  {
+  case anafis: set_scheda_anafis(); break;
+             case anagiu: set_scheda_anagiu(); break;
+             case nditte: set_scheda_ditta(); break;
+             }
+}
+
+
+void BA6100_App::set_headers()
+{
+  reset_header();
+  set_background();
+  if (_pr_type == elenco)
+  {
+    switch(_pr_what)
+    {
+    case anafis:
+    case anagiu: 
+#if XVT_OS != XVT_OS_SCOUNIX                     
+      set_background("W1l{1 2 132 2}W4l{1 5 132 5}");
+#else
+      set_header(2,(const char*)sep);
+      set_header(5,(const char*)sep);
+#endif
+      set_header(1,"@bELENCO PERSONE %s@82gStudio@96gData"
+                 "@101g @< @110g Pag. @#", _pr_what == anafis ? "FISICHE" :
+                 "GIURIDICHE");
+      set_header(3,"@iCodice@55gCodice");
+      set_header(4,"@iAnagr.   Ragione sociale/cognome e nome@55gDitta"
+                 "@66gDenominazione sociale");
+      set_header(6,"");
+      break;
+    case nditte:
+#if XVT_OS != XVT_OS_SCOUNIX                     
+      set_background("W1l{1 2 132 2}W4l{1 5 132 5}");
+#else
+      set_header(2,(const char*)sep);
+      set_header(5,(const char*)sep);
+#endif
+      set_header(1,"@bELENCO DITTE@82gStudio@96gData"
+                 "@101g @< @110 @#");
+      set_header(3,"@iCodice@50gT");
+      set_header(4,"@iAnagr.   Denominazione sociale@50gP Codice"
+                 "@61gRagione sociale/Cognome e nome");
+      set_header(6,"");
+    }
+  }
+  else if (_pr_type == rubriche)
+  {
+    switch (_pr_what)
+    {
+    case anafis:
+    case anagiu:
+#if XVT_OS != XVT_OS_SCOUNIX                     
+      set_background("W1l{1 2 132 2}W4l{1 4 132 4}");
+#else
+      set_header(2,(const char*)sep);
+      set_header(4,(const char*)sep);
+#endif
+      set_header(1,"@bRUBRICA PERSONE %s@40gStudio@53gData @<   pag. @#", 
+                 _pr_what == anagiu ? "GIURIDICHE" : "FISICHE");
+      set_header(3,"@iCodice  Cognome e nome");
+      set_header(5,"");
+      break;
+    case nditte:
+#if XVT_OS != XVT_OS_SCOUNIX                     
+      set_background("W1l{1 2 132 2}W4l{1 4 132 4}");
+#else
+      set_header(2,(const char*)sep);
+      set_header(4,(const char*)sep);
+#endif
+      set_header(1,"@bRUBRICA DITTE@40gStudio@53gData @<   pag. @#");
+      set_header(3,"@iCodice  Cognome e nome");
+      set_header(5,"");
+      break;
+    }  
+  }
+  else if (_pr_type == schede)
+  {
+    set_header(1,"");
+  }
+}
+
+
+void BA6100_App::set_etichette()
+{
+  int namerow = 0;
+
+  for (int i = 2; i <= _rows_et; i++)
+    set_row(i, "");
+
+  if (_is_piv)
+  { 
+    set_row(_piv_row, TString(format("@%dg#t", _piv_col)), &_cofi);
+    _frpos[_piv_row - 1] = TRUE;
+  }
+  if (_is_cod)
+  {
+    set_row(_cod_row, TString(format("@%dg#t", _cod_col)), &_cod);
+    _frpos[_cod_row - 1] = TRUE;
+  }
+  
+  // name goes in first free row
+  for (i = 0; i < _rows_et; i++) 
+  {
+    if (!_frpos[i]) 
+    { if (namerow == 0) namerow = i; }
+  }
+  
+  namerow++; reset_row(namerow);
+  
+  if (_pr_what == anagiu)
+    set_row(namerow,TString(format("@%dg#t",_ind_col)), &_name);
+  else
+  {                                    
+    set_row(namerow,TString(format("@%dg#t #t #t",_ind_col)), &_sex, &_name, &_surname);
+  }
+
+  set_row(_ind_row,TString(format("@%dg#t #t", _ind_col)), &_address, &_civ);
+  set_row(_ind_row+1, TString(format("@%dg#t #t #t", _ind_col)), 
+          &_cap, &_com, &_prov);
+  
+  if (!_stato.empty())
+  {
+    // print state on first free row
+    for (i = _ind_row+1; i < _rows_et; i++)
+      if (!_frpos[i] && i != (namerow - 1))
+        set_row(i+1, TString(format("@%dg#t", _ind_col)), &_stato);   
+  }  
+
+}
diff --git a/ba/ba6200.cpp b/ba/ba6200.cpp
index 91189ab67..be356cb84 100755
--- a/ba/ba6200.cpp
+++ b/ba/ba6200.cpp
@@ -1,286 +1,285 @@
-#include <mask.h>
-#include <printapp.h>
-#include <relation.h>
-#include <tabutil.h>
-#include <utility.h>
-#include <sort.h>
-
-#include <lffiles.h>
-#include <comuni.h>
-
-#include "ba6.h"
-#include "ba6200.h"
-
-const  MAXSTR = 128;
-static char __tmp [MAXSTR];
-static TFixed_string tmp (__tmp, MAXSTR);
-
-class BA6200_application : public TPrintapp
-{
-  TRelation* 	    _rel;
-  TMask*	    _msk;
-  TLocalisamfile*   _comuni;
-  TParagraph_string * _descr_comune;
-
-  int     _cur1, _cur2;
-  TString _provcom_msk, _com, _dencom, _provcom, _capcom;
-  TString _codistat;
-  int     _uffiidd1, _uffiidd2, _uffiidd3, _uffiva1, _uffiva2, _uffiva3;
-  int     _uffreg, _uffconc, _uffcserv, _uffesprov, _uffescom, _terrmon;
-  real    _alqici;
-  TDate   _data_stampa;
-  
-protected:
-  virtual void user_create() ;
-  virtual void user_destroy();
-  virtual bool set_print(int m);
-  
-  virtual bool preprocess_page (int,int);
-
-public:
-  void crea_intestazione();
-  void setta_righe_descr(TParagraph_string*);
-  
-  BA6200_application();
-};
-
-bool BA6200_application::preprocess_page(int file, int counter)
-{
-
-  reset_print();
-
-  if (counter)
-    return TRUE;
-
-  if (file == LF_COMUNI)
-  {
-    _provcom = current_cursor()->curr(LF_COMUNI).get(COM_PROVCOM);
- 
-    if ((_provcom == _provcom_msk) || (_provcom_msk == ""))
-    {  
-      _com       = current_cursor()->curr(LF_COMUNI).get(COM_COM);          
-      _dencom    = current_cursor()->curr(LF_COMUNI).get(COM_DENCOM);
-      *_descr_comune = (const char*) _dencom;
-      _capcom    = current_cursor()->curr(LF_COMUNI).get(COM_CAPCOM);
-      _codistat  = current_cursor()->curr(LF_COMUNI).get(COM_CODISTAT);
-      _uffiidd1  = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFIIDD1);
-      _uffiidd2  = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFIIDD2);
-      _uffiidd3  = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFIIDD3);
-      _uffiva1   = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFIVA1);
-      _uffiva2   = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFIVA2);
-      _uffiva3   = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFIVA3);
-      _uffreg    = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFREG);
-      _uffconc   = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFCONC);
-      _uffcserv  = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFCSERV);
-      _uffesprov = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFESPROV);
-      _uffescom  = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFESCOM);
-      _alqici    = current_cursor()->curr(LF_COMUNI).get_real(COM_ALIQICI);
-      _terrmon   = current_cursor()->curr(LF_COMUNI).get_int(COM_TERRMON);
-    
-      setta_righe_descr(_descr_comune);
-  
-      set_row (1,"@0g%4s",  (const char*) _com);
-      set_row (1,"@33g%5s", (const char*) _provcom);
-      set_row (1,"@39g%5s", (const char*) _capcom);
-      set_row (1,"@46g%6s", (const char*) _codistat);
-      set_row (1,"@54g%r",   &_alqici);
-      
-      if (_terrmon != 0)
-	set_row (1,"@63g%d",   _terrmon);
-
-      if (_uffiidd1 != 0)
-	set_row (1,"@72g%03d",  _uffiidd1);
-
-      if (_uffiidd2 != 0)
-	set_row (1,"@76g%03d",  _uffiidd2);
-
-      if (_uffiidd3 != 0)
-	set_row (1,"@80g%03d",  _uffiidd3);
-
-      if (_uffiva1 != 0)
-	set_row (1,"@85g%03d",  _uffiva1);
-
-      if (_uffiva2 != 0)
-	set_row (1,"@89g%03d",  _uffiva2);
-
-      if (_uffiva3 != 0)
-	set_row (1,"@93g%03d",  _uffiva3);
-
-      if (_uffreg != 0)
-	set_row (1,"@98g%03d",  _uffreg);
-
-      if (_uffconc != 0)
-	set_row (1,"@104g%03d", _uffconc);
-
-      if (_uffcserv != 0)
-	set_row (1,"@110g%03d", _uffcserv);
-
-      if (_uffesprov != 0)
-	set_row (1,"@115g%03d", _uffesprov);
-      
-      if (_uffescom != 0)
-	set_row (1,"@119g%03d", _uffescom);
-      
-      return TRUE;
-    }
-    else
-      return FALSE;          
-  }
-  return TRUE;
-}
-
-void BA6200_application::setta_righe_descr(TParagraph_string* str)
-{
-  const char* r;
-  int i = 1;
-
-  while ((r = str->get()) != NULL)
-  {
-    set_row (i,"@7g%s", r);
-    i++;
-  }
-}
-
-BA6200_application::BA6200_application()
-{
-}
-
-bool BA6200_application::set_print(int)
-{
-  KEY tasto;
-  TLocalisamfile* fl;
-  TString statoini,statofine,codiceini,codicefine,denomini,denomfine;
-
-  tasto = _msk->run();
-
-  if (tasto == K_ENTER)
-  {
-    _data_stampa = _msk->get     (F_DATA);
-    int scelta   = _msk->get_int (F_SCELTA);
-    _provcom_msk = _msk->get     (F_PROVCOM);
- 
-    if (scelta == 1)
-    {
-      statoini   = _msk->get(F_STATOINI);
-      codiceini  = _msk->get(F_CODICEINI);
-      statofine  = _msk->get(F_STATOFINE);
-      codicefine = _msk->get(F_CODICEFINE);
-
-      reset_files();         //resetta l'albero di stampa
-      add_file(LF_COMUNI);
-       
-      select_cursor(_cur1); 
-      fl = current_cursor()->file(LF_COMUNI);
-      TRectype da (fl->curr());
-      TRectype a  (fl->curr());   
-
-      da.zero();
-      a.zero();
-      
-      da.put(COM_STATO,statoini);         
-      da.put(COM_COM  ,codiceini);
-     
-      a.put(COM_STATO,statofine);         
-      a.put(COM_COM  ,codicefine);
-
-      current_cursor()->setregion(da, a);
-    }
-    else
-      if (scelta == 2)
-      {
-        denomini  = _msk->get(F_NOMEINI);
-        denomfine = _msk->get(F_NOMEFINE);
-     
-	select_cursor(_cur2);
-
-        reset_files(); 
-        add_file(LF_COMUNI);
-
-        fl = current_cursor()->file(LF_COMUNI);
-        TRectype da (fl->curr());
-        TRectype a  (fl->curr());   
-      
-        da.zero();
-        a.zero();
-      
-        da.put(COM_DENCOM, denomini);
-            
-        a.put (COM_DENCOM, denomfine);
-	
-	current_cursor()->setregion(da, a);
-      }
-
-    //set_print_zero();
-    crea_intestazione();
-
-    return TRUE;
-  }
-  else
-    return FALSE;
-}
-
-void BA6200_application::crea_intestazione()
-{
-  TString sep(132);
-  TString data_stampa;
-  
-  reset_header();
-  
-  sep.fill('-');
-  set_header (1, (const char *) sep);
-  sep = "";
-  sep << "Pag. @#";
-  sep.right_just(132); 
-  set_header (2,(const char*) sep);  
- 
-  set_header (2,"@0gARCHIVIO COMUNI@91gSTUDIO@104gDATA");
-  data_stampa = _data_stampa.string();
-  set_header (2,"@109g%10s", (const char*) data_stampa);
-  
-  sep = "";
-  sep.fill('-');
-  set_header (3, (const char *) sep);
-    
-  set_header(5,"@0gCodice@7gDenominazione@33gProv.@40gCap@45gCd.Istat@54gAl.ICI@61gMont.@67gUff.@74gII.DD.@87gI.V.A.@97gRegi.@103gConc.@109gServ.@115gEsatt.");
-  set_header (6,"@0g------@7g-------------------------@33g-----@39g-----");
-  set_header (6,"@45g--------@54g------@61g-----@72g-----------");
-  set_header (6,"@85g------------@97g-----@103g-----@109g-----@115g-------");  
-}
-
-void BA6200_application::user_create()
-{
-  _rel    = new TRelation (LF_COMUNI);
-
-  _cur1   = add_cursor(new TCursor(_rel,"",1));
-  
-  _cur2   = add_cursor(new TCursor(_rel,"",2));
-
-  _comuni = new TLocalisamfile (LF_COMUNI);
-
-  _descr_comune   = new TParagraph_string ("",25);
-  
-  _msk = new TMask("ba6200a");
-}
-
-void BA6200_application::user_destroy()
-{
-  delete _msk;
-  delete _rel;
-  delete _comuni;
-  delete _descr_comune;
-}
-
-int ba6200(int argc, char* argv[])
-{
-
-  BA6200_application a;
-
-  a.run(argc, argv, "Stampa Comuni");
-
-  return 0;
-}
-
-
-
-
-
+#include <mask.h>
+#include <printapp.h>
+#include <relation.h>
+#include <tabutil.h>
+#include <utility.h>
+#include <sort.h>
+
+#include <lffiles.h>
+#include <comuni.h>
+
+#include "ba6.h"
+#include "ba6200.h"
+
+const  MAXSTR = 128;
+static char __tmp [MAXSTR];
+static TFixed_string tmp (__tmp, MAXSTR);
+
+class BA6200_application : public TPrintapp
+{
+  TRelation* 	    _rel;
+  TMask*	    _msk;
+  TLocalisamfile*   _comuni;
+  TParagraph_string * _descr_comune;
+
+  int     _cur1, _cur2;
+  TString _provcom_msk, _com, _dencom, _provcom, _capcom;
+  TString _codistat;
+  int     _uffiidd1, _uffiidd2, _uffiidd3, _uffiva1, _uffiva2, _uffiva3;
+  int     _uffreg, _uffconc, _uffcserv, _uffesprov, _uffescom, _terrmon;
+  real    _alqici;
+  TDate   _data_stampa;
+  
+protected:
+  virtual void user_create() ;
+  virtual void user_destroy();
+  virtual bool set_print(int m);
+  
+  virtual bool preprocess_page (int,int);
+
+public:
+  void crea_intestazione();
+  void setta_righe_descr(TParagraph_string*);
+  
+  BA6200_application();
+};
+
+bool BA6200_application::preprocess_page(int file, int counter)
+{
+
+  reset_print();
+
+  if (counter)
+    return TRUE;
+
+  if (file == LF_COMUNI)
+  {
+    _provcom = current_cursor()->curr(LF_COMUNI).get(COM_PROVCOM);
+ 
+    if ((_provcom == _provcom_msk) || (_provcom_msk == ""))
+    {  
+      _com       = current_cursor()->curr(LF_COMUNI).get(COM_COM);          
+      _dencom    = current_cursor()->curr(LF_COMUNI).get(COM_DENCOM);
+      *_descr_comune = (const char*) _dencom;
+      _capcom    = current_cursor()->curr(LF_COMUNI).get(COM_CAPCOM);
+      _codistat  = current_cursor()->curr(LF_COMUNI).get(COM_CODISTAT);
+      _uffiidd1  = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFIIDD1);
+      _uffiidd2  = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFIIDD2);
+      _uffiidd3  = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFIIDD3);
+      _uffiva1   = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFIVA1);
+      _uffiva2   = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFIVA2);
+      _uffiva3   = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFIVA3);
+      _uffreg    = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFREG);
+      _uffconc   = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFCONC);
+      _uffcserv  = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFCSERV);
+      _uffesprov = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFESPROV);
+      _uffescom  = current_cursor()->curr(LF_COMUNI).get_int(COM_UFFESCOM);
+      _alqici    = current_cursor()->curr(LF_COMUNI).get_real(COM_ALIQICI);
+      _terrmon   = current_cursor()->curr(LF_COMUNI).get_int(COM_TERRMON);
+    
+      setta_righe_descr(_descr_comune);
+  
+      set_row (1,"@0g%4s",  (const char*) _com);
+      set_row (1,"@33g%5s", (const char*) _provcom);
+      set_row (1,"@39g%5s", (const char*) _capcom);
+      set_row (1,"@46g%6s", (const char*) _codistat);
+      set_row (1,"@54g%r",   &_alqici);
+      
+      if (_terrmon != 0)
+	set_row (1,"@63g%d",   _terrmon);
+
+      if (_uffiidd1 != 0)
+	set_row (1,"@72g%03d",  _uffiidd1);
+
+      if (_uffiidd2 != 0)
+	set_row (1,"@76g%03d",  _uffiidd2);
+
+      if (_uffiidd3 != 0)
+	set_row (1,"@80g%03d",  _uffiidd3);
+
+      if (_uffiva1 != 0)
+	set_row (1,"@85g%03d",  _uffiva1);
+
+      if (_uffiva2 != 0)
+	set_row (1,"@89g%03d",  _uffiva2);
+
+      if (_uffiva3 != 0)
+	set_row (1,"@93g%03d",  _uffiva3);
+
+      if (_uffreg != 0)
+	set_row (1,"@98g%03d",  _uffreg);
+
+      if (_uffconc != 0)
+	set_row (1,"@104g%03d", _uffconc);
+
+      if (_uffcserv != 0)
+	set_row (1,"@110g%03d", _uffcserv);
+
+      if (_uffesprov != 0)
+	set_row (1,"@115g%03d", _uffesprov);
+      
+      if (_uffescom != 0)
+	set_row (1,"@119g%03d", _uffescom);
+      
+      return TRUE;
+    }
+    else
+      return FALSE;          
+  }
+  return TRUE;
+}
+
+void BA6200_application::setta_righe_descr(TParagraph_string* str)
+{
+  const char* r;
+  int i = 1;
+
+  while ((r = str->get()) != NULL)
+  {
+    set_row (i,"@7g%s", r);
+    i++;
+  }
+}
+
+BA6200_application::BA6200_application()
+{
+}
+
+bool BA6200_application::set_print(int)
+{
+  KEY tasto;
+  TString statoini,statofine,codiceini,codicefine,denomini,denomfine;
+
+  tasto = _msk->run();
+
+  if (tasto == K_ENTER)
+  {
+    _data_stampa = _msk->get     (F_DATA);
+    int scelta   = _msk->get_int (F_SCELTA);
+    _provcom_msk = _msk->get     (F_PROVCOM);
+ 
+    if (scelta == 1)
+    {
+      statoini   = _msk->get(F_STATOINI);
+      codiceini  = _msk->get(F_CODICEINI);
+      statofine  = _msk->get(F_STATOFINE);
+      codicefine = _msk->get(F_CODICEFINE);
+
+      reset_files();         //resetta l'albero di stampa
+      add_file(LF_COMUNI);
+       
+      select_cursor(_cur1); 
+      TLocalisamfile& fl = current_cursor()->file(LF_COMUNI);
+      TRectype da (fl.curr());
+      TRectype a  (fl.curr());   
+
+      da.zero();
+      a.zero();
+      
+      da.put(COM_STATO,statoini);         
+      da.put(COM_COM  ,codiceini);
+     
+      a.put(COM_STATO,statofine);         
+      a.put(COM_COM  ,codicefine);
+
+      current_cursor()->setregion(da, a);
+    }
+    else
+      if (scelta == 2)
+      {
+        denomini  = _msk->get(F_NOMEINI);
+        denomfine = _msk->get(F_NOMEFINE);
+     
+	select_cursor(_cur2);
+
+        reset_files(); 
+        add_file(LF_COMUNI);
+
+        TLocalisamfile& fl = current_cursor()->file(LF_COMUNI);
+        TRectype da (fl.curr());
+        TRectype a  (fl.curr());   
+      
+        da.zero();
+        a.zero();
+      
+        da.put(COM_DENCOM, denomini);
+            
+        a.put (COM_DENCOM, denomfine);
+	
+	current_cursor()->setregion(da, a);
+      }
+
+    //set_print_zero();
+    crea_intestazione();
+
+    return TRUE;
+  }
+  else
+    return FALSE;
+}
+
+void BA6200_application::crea_intestazione()
+{
+  TString sep(132);
+  TString data_stampa;
+  
+  reset_header();
+  
+  sep.fill('-');
+  set_header (1, (const char *) sep);
+  sep = "";
+  sep << "Pag. @#";
+  sep.right_just(132); 
+  set_header (2,(const char*) sep);  
+ 
+  set_header (2,"@0gARCHIVIO COMUNI@91gSTUDIO@104gDATA");
+  data_stampa = _data_stampa.string();
+  set_header (2,"@109g%10s", (const char*) data_stampa);
+  
+  sep = "";
+  sep.fill('-');
+  set_header (3, (const char *) sep);
+    
+  set_header(5,"@0gCodice@7gDenominazione@33gProv.@40gCap@45gCd.Istat@54gAl.ICI@61gMont.@67gUff.@74gII.DD.@87gI.V.A.@97gRegi.@103gConc.@109gServ.@115gEsatt.");
+  set_header (6,"@0g------@7g-------------------------@33g-----@39g-----");
+  set_header (6,"@45g--------@54g------@61g-----@72g-----------");
+  set_header (6,"@85g------------@97g-----@103g-----@109g-----@115g-------");  
+}
+
+void BA6200_application::user_create()
+{
+  _rel    = new TRelation (LF_COMUNI);
+
+  _cur1   = add_cursor(new TCursor(_rel,"",1));
+  
+  _cur2   = add_cursor(new TCursor(_rel,"",2));
+
+  _comuni = new TLocalisamfile (LF_COMUNI);
+
+  _descr_comune   = new TParagraph_string ("",25);
+  
+  _msk = new TMask("ba6200a");
+}
+
+void BA6200_application::user_destroy()
+{
+  delete _msk;
+  delete _rel;
+  delete _comuni;
+  delete _descr_comune;
+}
+
+int ba6200(int argc, char* argv[])
+{
+
+  BA6200_application a;
+
+  a.run(argc, argv, "Stampa Comuni");
+
+  return 0;
+}
+
+
+
+
+
diff --git a/ba/bast%ivd.uml b/ba/bast%ivd.uml
index 29a7b435b..62181d676 100755
--- a/ba/bast%ivd.uml
+++ b/ba/bast%ivd.uml
@@ -1,119 +1,124 @@
-#include "ba3200.h"
-
-PAGE "Stampa Tabella IV direttiva CEE" -1 -1 69 8
-
-STRING F_INIZIO1 1
-BEGIN
-  PROMPT 2 1 "Da sezione "
-  FLAGS "U"
-  HELP "Inserire il codice d'inizio "
-  FIELD CODTAB[1,1]
-  USE %IVD 
-  INPUT CODTAB[1,1] F_INIZIO1
-  INPUT CODTAB[2,2] F_INIZIO2
-  INPUT CODTAB[3,6] F_INIZIO3
-  INPUT CODTAB[7,8] F_INIZIO4
-  DISPLAY "Sezione" CODTAB[1,1]
-  DISPLAY "Lettera" CODTAB[2,2]
-  DISPLAY "Classe  " CODTAB[3,6]
-  DISPLAY "Numero" CODTAB[7,8]
-  DISPLAY "Descrizione@50" S0
-  OUTPUT F_INIZIO1 CODTAB[1,1]
-  OUTPUT F_INIZIO2 CODTAB[2,2]
-  OUTPUT F_INIZIO3 CODTAB[3,6]
-  OUTPUT F_INIZIO4 CODTAB[7,8]
-  GROUP 1
-END
-
-STRING F_INIZIO2 1
-BEGIN
-  PROMPT 17 1 "Da lettera "
-  FLAGS "U"
-  HELP "Inserire il codice d'inizio "
-  FIELD CODTAB[2,2]
-  COPY ALL F_INIZIO1
-  GROUP 1
-END
-
-NUMBER F_INIZIO3 8 4
-BEGIN
-  PROMPT 32 1 "Da classe "
-  FLAGS "UM"
-  HELP "Inserire il codice d'inizio "
-  FIELD CODTAB[3,6]
-  COPY ALL F_INIZIO1
-  GROUP 1
-END
-
-NUMBER F_INIZIO4 2
-BEGIN
-  PROMPT 53 1 "Da numero "
-  FLAGS "RZ"
-  HELP "Inserire il codice d'inizio "
-  FIELD CODTAB[7,8]
-  COPY ALL F_INIZIO1
-  GROUP 1
-END
-
-STRING F_FINE1 1
-BEGIN
-  PROMPT 2 3 "A sezione  "
-  HELP "Inserire il codice di fine  "
-  FIELD CODTAB[1,1]
-  FLAGS "U"
-  COPY USE F_INIZIO1
-  INPUT CODTAB[1,1] F_FINE1
-  INPUT CODTAB[2,2] F_FINE2
-  INPUT CODTAB[3,6] F_FINE3
-  INPUT CODTAB[7,8] F_FINE4
-  COPY DISPLAY F_INIZIO1
-  OUTPUT F_FINE1 CODTAB[1,1]
-  OUTPUT F_FINE2 CODTAB[2,2]
-  OUTPUT F_FINE3 CODTAB[3,6]
-  OUTPUT F_FINE4 CODTAB[7,8]
-  GROUP 2
-END
-
-STRING F_FINE2 1
-BEGIN
-  PROMPT 17 3 "A lettera  "
-  FLAGS "U"
-  COPY ALL F_FINE1
-  HELP "Inserire il codice di fine  "
-  FIELD CODTAB[2,2]
-  GROUP 2
-END
-
-NUMBER F_FINE3 8 4
-BEGIN
-  PROMPT 32 3 "A classe  "
-  FLAGS "UM"
-  HELP "Inserire il codice di fine  "
-  FIELD CODTAB[3,6]
-  COPY ALL F_FINE1
-  GROUP 2
-END
-
-NUMBER F_FINE4 2
-BEGIN
-  PROMPT 53 3 "A numero  "
-  FLAGS "RZ"
-  HELP "Inserire il codice di fine  "
-  FIELD CODTAB[7,8]
-  COPY ALL F_FINE1
-  GROUP 2
-END
-
-BUTTON DLG_OK 8 2
-BEGIN
-  PROMPT -12 -1 ""
-END
-
-BUTTON DLG_QUIT 8 2
-BEGIN
-  PROMPT -22 -1 ""
-END
-
-ENDPAGE
-ENDMASK
-
+#include "ba3200.h"
+
+PAGE "Stampa Tabella IV direttiva CEE" -1 -1 68 9
+          
+GROUPBOX DLG_NULL 66 3
+BEGIN
+  PROMPT 1 1 "@bDa codice"
+END          
+          
+STRING F_INIZIO1 1
+BEGIN
+  PROMPT 2 2 "Sezione  "
+  FLAGS "U"
+  HELP "Codice da cui iniziare la stampa"
+  FIELD CODTAB[1,1]
+  USE %IVD 
+  INPUT CODTAB[1,1] F_INIZIO1
+  INPUT CODTAB[2,2] F_INIZIO2
+  INPUT CODTAB[3,6] F_INIZIO3
+  INPUT CODTAB[7,8] F_INIZIO4
+  DISPLAY "Sezione" CODTAB[1,1]
+  DISPLAY "Lettera" CODTAB[2,2]
+  DISPLAY "Classe  " CODTAB[3,6]
+  DISPLAY "Numero" CODTAB[7,8]
+  DISPLAY "Descrizione@50" S0
+  OUTPUT F_INIZIO1 CODTAB[1,1]
+  OUTPUT F_INIZIO2 CODTAB[2,2]
+  OUTPUT F_INIZIO3 CODTAB[3,6]
+  OUTPUT F_INIZIO4 CODTAB[7,8]
+  GROUP 1
+END
+
+STRING F_INIZIO2 1
+BEGIN
+  PROMPT 17 2 "Lettera "
+  FLAGS "U"
+  FIELD CODTAB[2,2]
+  COPY ALL F_INIZIO1
+  GROUP 1
+END
+
+NUMBER F_INIZIO3 8 4
+BEGIN
+  PROMPT 31 2 "Classe  "
+  FLAGS "UM"
+  FIELD CODTAB[3,6]
+  COPY ALL F_INIZIO1
+  GROUP 1
+END
+
+NUMBER F_INIZIO4 2
+BEGIN
+  PROMPT 52 2 "Numero  "
+  FLAGS "RZ"
+  FIELD CODTAB[7,8]
+  COPY ALL F_INIZIO1
+  GROUP 1
+END
+
+GROUPBOX DLG_NULL 66 3
+BEGIN
+  PROMPT 1 4 "@bA Codice"
+END          
+          
+STRING F_FINE1 1
+BEGIN
+  PROMPT 2 5 "Sezione  "
+  HELP "Codice finale da stampare"
+  FIELD CODTAB[1,1]
+  FLAGS "U"
+  COPY USE F_INIZIO1
+  INPUT CODTAB[1,1] F_FINE1
+  INPUT CODTAB[2,2] F_FINE2
+  INPUT CODTAB[3,6] F_FINE3
+  INPUT CODTAB[7,8] F_FINE4
+  COPY DISPLAY F_INIZIO1
+  OUTPUT F_FINE1 CODTAB[1,1]
+  OUTPUT F_FINE2 CODTAB[2,2]
+  OUTPUT F_FINE3 CODTAB[3,6]
+  OUTPUT F_FINE4 CODTAB[7,8]
+  GROUP 2
+END
+
+STRING F_FINE2 1
+BEGIN
+  PROMPT 17 5 "Lettera "
+  FLAGS "U"
+  COPY ALL F_FINE1
+  FIELD CODTAB[2,2]
+  GROUP 2
+END
+
+NUMBER F_FINE3 8 4
+BEGIN
+  PROMPT 31 5 "Classe  "
+  FLAGS "UM"
+  FIELD CODTAB[3,6]
+  COPY ALL F_FINE1
+  GROUP 2
+END
+
+NUMBER F_FINE4 2
+BEGIN
+  PROMPT 52 5 "Numero  "
+  FLAGS "RZ"
+  FIELD CODTAB[7,8]
+  COPY ALL F_FINE1
+  GROUP 2
+END
+
+BUTTON DLG_PRINT 10 2
+BEGIN
+  PROMPT -12 -1 "~Stampa"
+  MESSAGE EXIT,K_ENTER
+END
+
+BUTTON DLG_QUIT 10 2
+BEGIN
+  PROMPT -22 -1 ""
+END
+
+ENDPAGE
+ENDMASK
+
diff --git a/ba/prassi.mnu b/ba/prassi.mnu
index 07b74e20a..15351fa14 100755
--- a/ba/prassi.mnu
+++ b/ba/prassi.mnu
@@ -1,130 +1,132 @@
-0|Menu Principale|
-0|Anagrafiche|1
-0|Contabilita'|4
-0|Manutenzione|ba1
-1|Gestione Anagrafiche|1
-1|Persone fisiche|ba4 -1 F
-1|Persone giuridiche|ba4 -1 G
-1|Ditte|ba4 -2
-1|Unita' Locali|ba4 -3
-1|Attivita'|ba4 -4
-1|Soci|ba4 -5
-1|Ricerca Soci|ba5
-1|Tabelle ministeriali|11
-1|Tabelle|2
-1|Stampa anagrafiche|ba6 -0
-1|Stampa tabelle|3
-1|Stampa tabelle ministeriali|12
-1|Stampa numerazione registri|ba3 -2
-2|Tabelle|1
-2|Codici IVA|ba3 -0 %iva
-2|Codici Attivita'|ba3 -0 %ais
-2|Cond. di pagamento|ba3 -0 %cpg
-2|Libri sociali|ba3 -0 %itl
-2|Banche|ba3 -0 %ban
-2|Codici statistici|ba3 -0 %stt
-2|Cariche sociali|ba3 -0 %crs
-2|Vecchi cod.Attivita'|ba3 -0 %ois
-2|Stati esteri|ba3 -0 %sta
-2|Valute|ba3 -0 %val
-2|Lingue|ba3 -0 %lng
-3|Stampa tabelle|3
-3|Codici IVA|ba3 -1 %iva
-3|Codici Attivita'|ba3 -1 %ais
-3|Cond. di pagamento|ba3 -1 %cpg
-3|Libri sociali|ba3 -1 %itl
-3|Banche|ba3 -1 %ban
-3|Codici statistici|ba3 -1 %stt
-3|Cariche sociali|ba3 -1 %crs
-3|Vecchi cod.Attivita'|ba3 -1 %ois
-3|Stati esteri|ba3 -1 %sta
-3|Valute|ba3 -1 %val
-3|Lingue|ba3 -1 %lng
-4|Contabilita'|2
-4|Persone fisiche|ba4 -1 F
-4|Persone giuridiche|ba4 -1 G
-4|Ditte|ba4 -2
-4|Tabelle studio|5
-4|Stampa tabelle studio|6
-4|Scelta contabilita'|13|F
-4|IVA|10
-4|Parametri di studio|cg5 -0
-4|Gestione Libro Unico|14
-5|Tabelle studio|
-5|Tipi documento|ba3 -0 %tpd
-5|Cond. di pagamento|ba3 -0 %cpg
-5|Descrizioni aggiuntive|ba3 -0 %dpn
-5|Codici IVA|ba3 -0 %iva
-5|Codici Attivita'|ba3 -0 %ais
-5|Uffici IVA|ba3 -0 %uiv
-5|Libri sociali|ba3 -0 %itl
-5|Banche|ba3 -0 %ban
-5|IV direttiva CEE|ba3 -0 %ivd
-5|Valute|ba3 -0 %val
-5|Lingue|ba3 -0 %lng
-6|Stampa tabelle studio|
-6|Cond. di pagamento|ba3 -1 %cpg
-6|Descrizioni aggiuntive|ba3 -1 %dpn
-6|Codici IVA|ba3 -1 %iva
-6|Codici Attivita'|ba3 -1 %ais
-6|Uffici IVA|ba3 -1 %uiv
-6|Libri sociali|ba3 -1 %itl
-6|Banche|ba3 -1 %ban
-6|IV direttiva CEE|ba3 -1 %ivd
-6|Valute|ba3 -1 %val
-6|Lingue|ba3 -1 %lng
-7|Tabelle ditta|
-7|Parametri ditta|cg5 -1
-7|Registri|ba3 -0 reg
-7|Piano dei conti|cg0 -0
-7|Causali|cg0 -4
-7|Clienti/Fornitori|cg0 -1
-7|Banche|ba3 -0 %ban
-7|Esercizi|ba3 -0 esc
-8|Stampa tabelle ditta|3
-8|Registri|ba3 -1 reg
-8|Piano dei conti|cg1 -0
-8|Causali|cg1 -6
-8|Clienti/Fornitori|cg1 -1
-8|Banche|ba3 -1 %ban
-9|Prima nota|2
-9|Prima nota|cg2 -0
-9|Ricalcolo saldi|cg4 -0
-9|IVA|10
-9|Lista movimenti|cg3 -0
-9|Mastrini|cg3 -1
-9|Riepiloghi|cg3 -4
-9|Bilancio|cg1 -4
-9|Bilancio IV direttiva CEE|cg1 -5
-9|Giornale|cg3 -3
-10|IVA|2
-10|Liquidazione|cg4 -2
-10|Deleghe|ba3 -0 %del
-10|Stampa deleghe|cg1 -3
-10|Riepilogo progressivi|cg0 -3
-10|Stampa registri|cg4 -3
-10|Progressivi allegati|cg0 -2
-10|Stampa allegati|cg3 -2
-11|Tabelle ministeriali|
-11|Comuni|ba4 -0
-11|Uffici concessioni|ba3 -0 %ucc
-11|Uffici imposte dirette|ba3 -0 %uid
-11|Uffici IVA|ba3 -0 %uiv
-11|Uffici registro|ba3 -0 %ure
-11|Centri servizio|ba3 -0 %ucs
-12|Stampa tabelle ministeriali|
-12|Comuni|ba6 -1
-12|Uffici concessioni|ba3 -1 %ucc
-12|Uffici imposte dirette|ba3 -1 %uid
-12|Uffici IVA|ba3 -1 %uiv
-12|Uffici registro|ba3 -1 %ure
-12|Centri servizio|ba3 -1 %ucs
-13|Scelta Contabilita'|
-13|Tabelle ditta|7
-13|Stampa tabelle ditta|8
-13|Prima nota|9
-14|Gestione Libro Unico
-14|Tabella Libro Unico|ba3 -4
-14|Tabella Vidimazioni|ba3 -0 %vid
-14|Stampa Indici Libro Unico|ba3 -5
-
+0|Menu Principale|
+0|Anagrafiche|1
+0|Contabilita'|4
+0|Terreni e fabbricati|tefa -t
+0|Modello 740|.\740 -t
+0|Manutenzione|ba1
+1|Gestione Anagrafiche|1
+1|Persone fisiche|ba4 -1 F
+1|Persone giuridiche|ba4 -1 G
+1|Ditte|ba4 -2
+1|Unita' Locali|ba4 -3
+1|Attivita'|ba4 -4
+1|Soci|ba4 -5
+1|Ricerca Soci|ba5
+1|Tabelle ministeriali|11
+1|Tabelle|2
+1|Stampa anagrafiche|ba6 -0
+1|Stampa tabelle|3
+1|Stampa tabelle ministeriali|12
+1|Stampa numerazione registri|ba3 -2
+2|Tabelle|1
+2|Codici IVA|ba3 -0 %iva
+2|Codici Attivita'|ba3 -0 %ais
+2|Cond. di pagamento|ba3 -0 %cpg
+2|Libri sociali|ba3 -0 %itl
+2|Banche|ba3 -0 %ban
+2|Codici statistici|ba3 -0 %stt
+2|Cariche sociali|ba3 -0 %crs
+2|Vecchi cod.Attivita'|ba3 -0 %ois
+2|Stati esteri|ba3 -0 %sta
+2|Valute|ba3 -0 %val
+2|Lingue|ba3 -0 %lng
+3|Stampa tabelle|3
+3|Codici IVA|ba3 -1 %iva
+3|Codici Attivita'|ba3 -1 %ais
+3|Cond. di pagamento|ba3 -1 %cpg
+3|Libri sociali|ba3 -1 %itl
+3|Banche|ba3 -1 %ban
+3|Codici statistici|ba3 -1 %stt
+3|Cariche sociali|ba3 -1 %crs
+3|Vecchi cod.Attivita'|ba3 -1 %ois
+3|Stati esteri|ba3 -1 %sta
+3|Valute|ba3 -1 %val
+3|Lingue|ba3 -1 %lng
+4|Contabilita'|2
+4|Persone fisiche|ba4 -1 F
+4|Persone giuridiche|ba4 -1 G
+4|Ditte|ba4 -2
+4|Tabelle studio|5
+4|Stampa tabelle studio|6
+4|Scelta contabilita'|13|F
+4|IVA|10
+4|Parametri di studio|cg5 -0
+4|Gestione Libro Unico|14
+5|Tabelle studio|1
+5|Tipi documento|ba3 -0 %tpd
+5|Cond. di pagamento|ba3 -0 %cpg
+5|Descrizioni aggiuntive|ba3 -0 %dpn
+5|Codici IVA|ba3 -0 %iva
+5|Codici Attivita'|ba3 -0 %ais
+5|Uffici IVA|ba3 -0 %uiv
+5|Libri sociali|ba3 -0 %itl
+5|Banche|ba3 -0 %ban
+5|IV direttiva CEE|ba3 -0 %ivd
+5|Valute|ba3 -0 %val
+5|Lingue|ba3 -0 %lng
+6|Stampa tabelle studio|3
+6|Cond. di pagamento|ba3 -1 %cpg
+6|Descrizioni aggiuntive|ba3 -1 %dpn
+6|Codici IVA|ba3 -1 %iva
+6|Codici Attivita'|ba3 -1 %ais
+6|Uffici IVA|ba3 -1 %uiv
+6|Libri sociali|ba3 -1 %itl
+6|Banche|ba3 -1 %ban
+6|IV direttiva CEE|ba3 -1 %ivd
+6|Valute|ba3 -1 %val
+6|Lingue|ba3 -1 %lng
+7|Tabelle ditta|2
+7|Parametri ditta|cg5 -1
+7|Registri|ba3 -0 reg
+7|Piano dei conti|cg0 -0
+7|Causali|cg0 -4
+7|Clienti/Fornitori|cg0 -1
+7|Banche|ba3 -0 %ban
+7|Esercizi|ba3 -0 esc
+8|Stampa tabelle ditta|3
+8|Registri|ba3 -1 reg
+8|Piano dei conti|cg1 -0
+8|Causali|cg1 -6
+8|Clienti/Fornitori|cg1 -1
+8|Banche|ba3 -1 %ban
+9|Prima nota|2
+9|Prima nota|cg2 -0
+9|Ricalcolo saldi|cg4 -0
+9|IVA|10
+9|Lista movimenti|cg3 -0
+9|Mastrini|cg3 -1
+9|Riepiloghi|cg3 -4
+9|Bilancio|cg1 -4
+9|Bilancio IV direttiva CEE|cg1 -5
+9|Giornale|cg3 -3
+10|IVA|2
+10|Liquidazione|cg4 -2
+10|Deleghe|ba3 -0 %del
+10|Stampa deleghe|cg1 -3
+10|Riepilogo progressivi|cg0 -3
+10|Stampa registri|cg4 -3
+10|Progressivi allegati|cg0 -2
+10|Stampa allegati|cg3 -2
+11|Tabelle ministeriali|1
+11|Comuni|ba4 -0
+11|Uffici concessioni|ba3 -0 %ucc
+11|Uffici imposte dirette|ba3 -0 %uid
+11|Uffici IVA|ba3 -0 %uiv
+11|Uffici registro|ba3 -0 %ure
+11|Centri servizio|ba3 -0 %ucs
+12|Stampa tabelle ministeriali|3
+12|Comuni|ba6 -1
+12|Uffici concessioni|ba3 -1 %ucc
+12|Uffici imposte dirette|ba3 -1 %uid
+12|Uffici IVA|ba3 -1 %uiv
+12|Uffici registro|ba3 -1 %ure
+12|Centri servizio|ba3 -1 %ucs
+13|Scelta Contabilita'|
+13|Tabelle ditta|7
+13|Stampa tabelle ditta|8
+13|Prima nota|9
+14|Gestione Libro Unico|1
+14|Tabella Libro Unico|ba3 -4
+14|Tabella Vidimazioni|ba3 -0 %vid
+14|Stampa Indici Libro Unico|ba3 -5
+