Prima versione syncronizzazione Bee Store
git-svn-id: svn://10.65.10.50/branches/R_10_00@23013 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
		
							parent
							
								
									7918129e41
								
							
						
					
					
						commit
						e2489c47e4
					
				
							
								
								
									
										13
									
								
								bs/bs0.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								bs/bs0.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
			
		||||
#include <xvt.h>
 | 
			
		||||
#include "bs0.h"
 | 
			
		||||
 | 
			
		||||
int main(int argc, char** argv)
 | 
			
		||||
{
 | 
			
		||||
  const int p = argc > 1 ? argv[1][1]-'0' : 0;
 | 
			
		||||
  switch(p)
 | 
			
		||||
  {
 | 
			
		||||
  case  1: bs0200(argc, argv); break;
 | 
			
		||||
  default: bs0100(argc, argv); break;
 | 
			
		||||
  }
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								bs/bs0.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								bs/bs0.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
int bs0200(int argc, char* argv[]);
 | 
			
		||||
int bs0100(int argc, char* argv[]);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										20
									
								
								bs/bs0100.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								bs/bs0100.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,20 @@
 | 
			
		||||
#include <applicat.h>
 | 
			
		||||
#include "bs0.h"
 | 
			
		||||
 | 
			
		||||
#include <confapp.h>
 | 
			
		||||
 | 
			
		||||
class TParametri_ditta : public TConfig_application
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
  virtual bool check_autorization() const   { return false; }
 | 
			
		||||
  virtual const char* get_mask_name() const { return "bs0100a"; }
 | 
			
		||||
 | 
			
		||||
  TParametri_ditta() : TConfig_application(CONFIG_DITTA) {}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int bs0100(int argc, char* argv[])
 | 
			
		||||
{
 | 
			
		||||
  TParametri_ditta appc;
 | 
			
		||||
  appc.run(argc, argv, TR("Parametri Bee Store"));
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								bs/bs0100a.uml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								bs/bs0100a.uml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
			
		||||
TOOLBAR "topbar" 0 0 0 2
 | 
			
		||||
#include <stdbar.h>
 | 
			
		||||
ENDPAGE
 | 
			
		||||
 | 
			
		||||
PAGE "Parametri Bee Store" 0 2 0 0
 | 
			
		||||
 | 
			
		||||
GROUPBOX DLG_NULL 78 3
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 1 1 "@bODBC"
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
STRING 101 50
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 2 2 "Data Source Name (DSN) "
 | 
			
		||||
  CHECKTYPE REQUIRED
 | 
			
		||||
  FIELD DSN
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ENDPAGE
 | 
			
		||||
 | 
			
		||||
ENDMASK
 | 
			
		||||
							
								
								
									
										509
									
								
								bs/bs0200.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										509
									
								
								bs/bs0200.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,509 @@
 | 
			
		||||
#include <applicat.h>
 | 
			
		||||
#include <automask.h>
 | 
			
		||||
#include <ODBCrset.h>
 | 
			
		||||
#include <progind.h>
 | 
			
		||||
#include <reputils.h>
 | 
			
		||||
 | 
			
		||||
#include <../ve/velib.h>
 | 
			
		||||
 | 
			
		||||
#include "bs0.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
// TBeeStore_mask
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
class TBeeStore_mask : public TAutomask
 | 
			
		||||
{
 | 
			
		||||
protected:
 | 
			
		||||
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  void autoload();
 | 
			
		||||
  void autosave() const;
 | 
			
		||||
 | 
			
		||||
  bool  get_bool(const char* fld) { TMask_field* f = find_by_fieldname(fld); return f ? f->get().full() : false; }
 | 
			
		||||
  TDate get_date(const char* fld) { TMask_field* f = find_by_fieldname(fld); return TDate(f ? f->get() : EMPTY_STRING); }
 | 
			
		||||
 | 
			
		||||
  TBeeStore_mask() : TAutomask("bs0200a") { autoload(); }
 | 
			
		||||
  ~TBeeStore_mask() { autosave(); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
bool TBeeStore_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | 
			
		||||
{
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TBeeStore_mask::autoload()
 | 
			
		||||
{
 | 
			
		||||
  FOR_EACH_MASK_FIELD(*this, i, f)
 | 
			
		||||
  {
 | 
			
		||||
    const TFieldref* fr = f->field();
 | 
			
		||||
    if (fr != NULL)
 | 
			
		||||
      f->set(ini_get_string(CONFIG_DITTA, "bs", fr->name()));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TBeeStore_mask::autosave() const
 | 
			
		||||
{
 | 
			
		||||
    FOR_EACH_MASK_FIELD(*this, i, f)
 | 
			
		||||
    {
 | 
			
		||||
      const TFieldref* fr = f->field();
 | 
			
		||||
      if (fr != NULL)
 | 
			
		||||
        ini_set_string(CONFIG_DITTA, "bs", fr->name(), f->get());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
// TBeeStore_sync 
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
class TBeeStore_sync : public TSkeleton_application
 | 
			
		||||
{
 | 
			
		||||
  TString16 _dsn;
 | 
			
		||||
  TLog_report* _log;
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
  bool save_doc(TDocumento* doc) const;
 | 
			
		||||
  
 | 
			
		||||
  void load_origine_1(TISAM_recordset& out_set, const char* in_table, const TString_array& pairs);
 | 
			
		||||
  void save_origine_2(TISAM_recordset& in_set, const char* out_table, const TString_array& pairs);
 | 
			
		||||
 | 
			
		||||
  void sync_table(TISAM_recordset& in_set, const char* out_table, const TString_array& pairs);
 | 
			
		||||
  void sync_table(const char* in_table, const char* out_table, const TString_array& fields, const TDate& dal);
 | 
			
		||||
  void sync_table(const int logicnum,   const char* out_table, const TString_array& fields, const TDate& dal);
 | 
			
		||||
 | 
			
		||||
  void sync_iva(const TDate& dal);
 | 
			
		||||
  void sync_ums(const TDate& dal);
 | 
			
		||||
  void sync_lines(const TDate& dal);
 | 
			
		||||
  void sync_catmer(const TDate& dal);
 | 
			
		||||
  void sync_anamag(const TDate& dal);
 | 
			
		||||
  void sync_scontrini(const TDate& dal);
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  virtual void main_loop();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const TString& date2sql(const TDate& d)
 | 
			
		||||
{
 | 
			
		||||
  TString& tmp = get_tmp_string();
 | 
			
		||||
  tmp.format("DATEFROMPARTS(%d,%d,%d)", d.year(), d.month(), d.day());
 | 
			
		||||
  return tmp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const TString& var2sql(const TVariant& var)
 | 
			
		||||
{
 | 
			
		||||
  TString& tmp = get_tmp_string();
 | 
			
		||||
  switch (var.type())
 | 
			
		||||
  {
 | 
			
		||||
  case _boolfld:
 | 
			
		||||
    tmp = var.as_bool() ? "1" : "0";
 | 
			
		||||
    break;
 | 
			
		||||
  case _datefld:
 | 
			
		||||
    tmp = date2sql(var.as_date());
 | 
			
		||||
    break;
 | 
			
		||||
  default:
 | 
			
		||||
    {
 | 
			
		||||
      var.as_string(tmp);
 | 
			
		||||
      const int pos = tmp.find('\'');
 | 
			
		||||
      if (pos >= 0)
 | 
			
		||||
      {
 | 
			
		||||
        for (int i = tmp.len()-1; i >= pos; i--)
 | 
			
		||||
          if (tmp[i] == '\'') tmp.insert("'", i);
 | 
			
		||||
      }
 | 
			
		||||
      tmp.insert("'");
 | 
			
		||||
      tmp << "'";
 | 
			
		||||
    }
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  return tmp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Carica da Bee Store i record con Origine=1, cioè generati da lui ed eventualmente aggiorna i corrispondenti in Campo
 | 
			
		||||
void TBeeStore_sync::load_origine_1(TISAM_recordset& out_set, const char* in_table, const TString_array& pairs)
 | 
			
		||||
{
 | 
			
		||||
  TString str(255); 
 | 
			
		||||
  str << "ODBC(" << _dsn << ")\n"
 | 
			
		||||
      << "SELECT * FROM " << in_table << " WHERE Origine=1;";
 | 
			
		||||
  TODBC_recordset odbc(str);
 | 
			
		||||
  const TRecnotype n = odbc.items();
 | 
			
		||||
  if (n > 0)
 | 
			
		||||
  {
 | 
			
		||||
    TLocalisamfile& file = out_set.cursor()->file();
 | 
			
		||||
    const RecDes& rd = file.curr().rec_des();
 | 
			
		||||
    TToken_string key_fields;
 | 
			
		||||
    for (int i = 0; i < rd.Ky->NkFields; i++)
 | 
			
		||||
    {
 | 
			
		||||
      const int nf = rd.Ky[0].FieldSeq[i] % MaxFields;
 | 
			
		||||
      key_fields.add(rd.Fd[nf].Name);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    str.format(TR("Importazione %ld record dalla tabella %s"), n, in_table);
 | 
			
		||||
    _log->log(0, "");
 | 
			
		||||
    _log->log(0, str);
 | 
			
		||||
    
 | 
			
		||||
    TProgress_monitor pi(n, str);
 | 
			
		||||
    for (bool ok = odbc.move_first(); ok; ok = odbc.move_next())
 | 
			
		||||
    {
 | 
			
		||||
      file.zero();
 | 
			
		||||
      TString80 cfld, bfld;  // Campo field e BeeStore field
 | 
			
		||||
      FOR_EACH_ARRAY_ROW(pairs, p, row)
 | 
			
		||||
      {
 | 
			
		||||
        bfld = row->get(0);  
 | 
			
		||||
        cfld = row->get();  
 | 
			
		||||
        const int pos = key_fields.get_pos(cfld);
 | 
			
		||||
        if (pos >= 0)
 | 
			
		||||
        {
 | 
			
		||||
          const TVariant& var = odbc.get(bfld);
 | 
			
		||||
          if (!var.is_null())
 | 
			
		||||
            file.put(cfld, var.as_string());
 | 
			
		||||
          if (pos == key_fields.items()-1)
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      
 | 
			
		||||
      int err = file.read(_isequal, _lock);
 | 
			
		||||
      if (err == NOERR)
 | 
			
		||||
      {
 | 
			
		||||
        bool dirty = false;
 | 
			
		||||
        const TDate dataagg  = file.get("DATAAGG");
 | 
			
		||||
        TDate dtultagg = odbc.get("DtUltAgg").as_date();
 | 
			
		||||
        if (!dtultagg.ok()) dtultagg = TODAY;
 | 
			
		||||
 | 
			
		||||
        str.format("record");
 | 
			
		||||
        FOR_EACH_TOKEN(key_fields, f)
 | 
			
		||||
          str << ' ' << file.get(f);
 | 
			
		||||
 | 
			
		||||
        if (dtultagg >= dataagg)
 | 
			
		||||
        {
 | 
			
		||||
          FOR_EACH_ARRAY_ROW(pairs, r,row)
 | 
			
		||||
          {
 | 
			
		||||
            bfld = row->get(0);  
 | 
			
		||||
            cfld = row->get();  
 | 
			
		||||
            if (cfld[0] >= 'A' && cfld.find("->") < 0 && key_fields.get_pos(cfld) < 0) // Aggiorno solo i campi NON chiave
 | 
			
		||||
            {
 | 
			
		||||
              const TString& vec = file.get(cfld);
 | 
			
		||||
              const TString& nov = odbc.get(bfld).as_string();
 | 
			
		||||
              if (nov != vec)
 | 
			
		||||
              {
 | 
			
		||||
                if (!dirty)
 | 
			
		||||
                  str << ' ' << bfld << "='" << nov << '\'';
 | 
			
		||||
                file.put(cfld, nov);
 | 
			
		||||
                dirty = true;
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          if (dirty)
 | 
			
		||||
          {
 | 
			
		||||
            file.put("UTENTE", "BEESTORE");
 | 
			
		||||
            file.put("DATAAGG", dtultagg);
 | 
			
		||||
          }
 | 
			
		||||
          else
 | 
			
		||||
            str << " Nessuna variazione pertinente";
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
          str << " Data di ultimo aggiornamento obsoleta";
 | 
			
		||||
        if (dirty)
 | 
			
		||||
        {
 | 
			
		||||
          if (file.rewrite() == 0)
 | 
			
		||||
            _log->log(1, str);
 | 
			
		||||
          else
 | 
			
		||||
          {
 | 
			
		||||
            TString80 err; err << TR("ERRORE ") << err << TR(" aggiornando il ");
 | 
			
		||||
            str.insert(err);
 | 
			
		||||
            _log->log(2, str);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
          _log->log(0, str);
 | 
			
		||||
          file.reread(_unlock);
 | 
			
		||||
        }
 | 
			
		||||
      } else
 | 
			
		||||
      if (err == _iskeynotfound)
 | 
			
		||||
      {
 | 
			
		||||
        file.zero();
 | 
			
		||||
        FOR_EACH_ARRAY_ROW(pairs, r,row)
 | 
			
		||||
        {
 | 
			
		||||
          bfld = row->get(0);  
 | 
			
		||||
          cfld = row->get();  
 | 
			
		||||
          if (cfld[0] >= 'A' && cfld.find("->"))
 | 
			
		||||
          {
 | 
			
		||||
            const TString& nov = odbc.get(bfld).as_string();
 | 
			
		||||
            file.put(cfld, nov);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        if (file.write() == 0)
 | 
			
		||||
          _log->log(1, str);
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
          TString80 msg; msg << TR("ERRORE ") << err << TR(" inserendo il ");
 | 
			
		||||
          str.insert(msg);
 | 
			
		||||
          _log->log(2, str);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    str.cut(0) << "DELETE FROM " << in_table << " WHERE Origine=1;";
 | 
			
		||||
    odbc.exec(str);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TBeeStore_sync::save_origine_2(TISAM_recordset& in_set, const char* out_table, const TString_array& fields)
 | 
			
		||||
{
 | 
			
		||||
  const TRecnotype n = in_set.items();
 | 
			
		||||
  TString str(255); 
 | 
			
		||||
  str << "ODBC(" << _dsn << ")\n";
 | 
			
		||||
  TODBC_recordset odbc(str);
 | 
			
		||||
 | 
			
		||||
  str.cut(0) << "DELETE FROM " << out_table << " WHERE Origine=2;";
 | 
			
		||||
  odbc.exec(str);
 | 
			
		||||
  
 | 
			
		||||
  str.format(TR("Esportazione %ld record nella tabella %s"), n, out_table);
 | 
			
		||||
  _log->log(0, "");
 | 
			
		||||
  _log->log(0, str);
 | 
			
		||||
 | 
			
		||||
  TProgress_monitor pi(n, str);
 | 
			
		||||
  for (bool ok = in_set.move_first(); ok; ok = in_set.move_next())
 | 
			
		||||
  {
 | 
			
		||||
    str.cut(0) << "INSERT INTO " << out_table << " (";
 | 
			
		||||
    FOR_EACH_ARRAY_ROW(fields, sr, srow)
 | 
			
		||||
      str << (sr ? ", " : "") << srow->get(0);
 | 
			
		||||
    str << ", Origine, Errore, DTUltAgg";
 | 
			
		||||
    str << ")\nVALUES (";
 | 
			
		||||
 | 
			
		||||
    FOR_EACH_ARRAY_ROW(fields, ir, irow)
 | 
			
		||||
    {
 | 
			
		||||
      if (ir) 
 | 
			
		||||
      {
 | 
			
		||||
        str << ", ";
 | 
			
		||||
        if (str.len() - str.rfind('\n') > 80) 
 | 
			
		||||
          str << '\n';
 | 
			
		||||
      }
 | 
			
		||||
      const TFixed_string cfld = irow->get(1);
 | 
			
		||||
      if (cfld[0] >= 'A' && cfld[0] <= 'Z')
 | 
			
		||||
      {
 | 
			
		||||
        const TVariant& var = in_set.get(cfld);
 | 
			
		||||
        str << var2sql(var);
 | 
			
		||||
      } else
 | 
			
		||||
      if (cfld.find("->") > 0)
 | 
			
		||||
      {
 | 
			
		||||
        const TVariant& var = in_set.get(cfld);
 | 
			
		||||
        str << var2sql(var);
 | 
			
		||||
      }
 | 
			
		||||
      else
 | 
			
		||||
        str << cfld;
 | 
			
		||||
    }
 | 
			
		||||
    str << ", 2, 0, GETDATE()";
 | 
			
		||||
    str << ");";
 | 
			
		||||
 | 
			
		||||
    if (odbc.exec(str) <= 0)
 | 
			
		||||
      _log->log(1, str);
 | 
			
		||||
 | 
			
		||||
    if (!pi.add_status())
 | 
			
		||||
      break;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  odbc.exec("COMMIT;");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TBeeStore_sync::sync_table(TISAM_recordset& in_set, const char* out_table, const TString_array& fields)
 | 
			
		||||
{
 | 
			
		||||
  load_origine_1(in_set, out_table, fields);
 | 
			
		||||
  save_origine_2(in_set, out_table, fields);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TBeeStore_sync::sync_table(const char* table, const char* out_table, const TString_array& fields, const TDate& dal)
 | 
			
		||||
{
 | 
			
		||||
  TString q;
 | 
			
		||||
  q << "USE " << table << " SELECT BETWEEN(DATAAGG,"<< dal.date2ansi() << ",0)";
 | 
			
		||||
  TISAM_recordset set(q);
 | 
			
		||||
  sync_table(set, out_table, fields);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TBeeStore_sync::sync_table(const int logicnum, const char* out_table, const TString_array& fields, const TDate& dal)
 | 
			
		||||
{
 | 
			
		||||
  TString4 q; q << logicnum;
 | 
			
		||||
  sync_table(q, out_table, fields, dal);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TBeeStore_sync::sync_ums(const TDate& dal)
 | 
			
		||||
{
 | 
			
		||||
  TString_array fields;
 | 
			
		||||
  fields.add("CodUntMis|CODTAB");
 | 
			
		||||
  fields.add("DSUntMis|S0");
 | 
			
		||||
  sync_table("%UMS", "tieUntMisura", fields, dal);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TBeeStore_sync::sync_iva(const TDate& dal)
 | 
			
		||||
{
 | 
			
		||||
  TString_array fields;
 | 
			
		||||
  fields.add("CodIva|CODTAB");
 | 
			
		||||
  fields.add("CodIvaSt|CODTAB");
 | 
			
		||||
  fields.add("DSIva|S0");
 | 
			
		||||
  fields.add("Aliquota|R0");
 | 
			
		||||
 | 
			
		||||
  sync_table("%IVA", "tieIva", fields, dal);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TBeeStore_sync::sync_lines(const TDate& dal)
 | 
			
		||||
{
 | 
			
		||||
  TString_array fields;
 | 
			
		||||
  fields.add("CodLinea|CODTAB");
 | 
			
		||||
  fields.add("DSLinea|S0");
 | 
			
		||||
 | 
			
		||||
  TString query;
 | 
			
		||||
  query << "USE GMC SELECT (CODTAB?='???')";
 | 
			
		||||
  if (dal.ok())
 | 
			
		||||
    query << "&&(BETWEEN(DATAAGG,"<< dal.date2ansi() << ",0))";
 | 
			
		||||
  
 | 
			
		||||
  TISAM_recordset lin(query);
 | 
			
		||||
  sync_table(lin, "tieLineeArt", fields);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TBeeStore_sync::sync_catmer(const TDate& dal)
 | 
			
		||||
{
 | 
			
		||||
  TString_array fields;
 | 
			
		||||
  fields.add("CodCategoriaMerceologica|CODTAB");
 | 
			
		||||
  fields.add("DSCategoriaMerceologica|S0");
 | 
			
		||||
  fields.add("CodTipoEtichetta|''");
 | 
			
		||||
 | 
			
		||||
  sync_table("GMC", "tieCategorieMerceologiche", fields, dal);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TBeeStore_sync::sync_anamag(const TDate& dal)
 | 
			
		||||
{
 | 
			
		||||
  TString_array fields;
 | 
			
		||||
  fields.add("CodPadre|"ANAMAG_CODART);
 | 
			
		||||
  fields.add("DSArticolo|"ANAMAG_DESCR);
 | 
			
		||||
  fields.add("DSArticoloAgg|"ANAMAG_DESCRAGG"[1,70]");
 | 
			
		||||
  fields.add("CodUntMagazzino|49->UM");
 | 
			
		||||
  fields.add("CodIva|"ANAMAG_CODIVA);
 | 
			
		||||
  fields.add("CodLinea|"ANAMAG_GRMERC"[1,3]");
 | 
			
		||||
  fields.add("CodCategMerceologica|"ANAMAG_GRMERC);
 | 
			
		||||
  fields.add("Bloccato|"ANAMAG_SOSPESO);
 | 
			
		||||
 | 
			
		||||
  TString query;
 | 
			
		||||
  query << "USE 47\nJOIN 49 INTO CODART==CODART";
 | 
			
		||||
  if (dal.ok())
 | 
			
		||||
    query << "\nSELECT BETWEEN(DATAAGG,"<< dal.date2ansi() << ",0)";
 | 
			
		||||
  TISAM_recordset art(query);
 | 
			
		||||
  sync_table(art, "tieArticoli", fields);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TBeeStore_sync::save_doc(TDocumento* doc) const
 | 
			
		||||
{
 | 
			
		||||
  if (doc != NULL && doc->rows() > 0)
 | 
			
		||||
  {
 | 
			
		||||
    const int err = doc->write();
 | 
			
		||||
    if (err != NOERR)
 | 
			
		||||
    {
 | 
			
		||||
      TString msg;
 | 
			
		||||
      msg.format(FR("Errore %d in registrazione scontrino %s/%d del %s"), err,
 | 
			
		||||
                 (const char*)doc->get(DOC_CODNUM), doc->get_long(DOC_NDOC), 
 | 
			
		||||
                 (const char*)doc->get(DOC_DATADOC));
 | 
			
		||||
      _log->log(2, msg);
 | 
			
		||||
      msg << TR("\nSi desidera proseguire ugualmente?");
 | 
			
		||||
      if (!noyes_box(msg))
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TBeeStore_sync::sync_scontrini(const TDate& dal)
 | 
			
		||||
{
 | 
			
		||||
  const TString4 codnum  = ini_get_string(CONFIG_DITTA, "bs", DOC_CODNUM);
 | 
			
		||||
  const TString4 tipodoc = ini_get_string(CONFIG_DITTA, "bs", DOC_TIPODOC);
 | 
			
		||||
  if (codnum.blank() || tipodoc.blank())
 | 
			
		||||
  {
 | 
			
		||||
    _log->log(2, "Configurare numerazione e tipo documento per movimenti Bee Store");
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  TString str(255); 
 | 
			
		||||
  str << "ODBC(" << _dsn << ")\n";
 | 
			
		||||
  str << "SELECT * FROM tieDMovMag WHERE Origine=1";
 | 
			
		||||
  if (dal.ok()) 
 | 
			
		||||
    str << " AND DataMov>=" << date2sql(dal);
 | 
			
		||||
  str << "\nORDER BY NumMov,NumRiga";
 | 
			
		||||
 | 
			
		||||
  TODBC_recordset mov(str);
 | 
			
		||||
  TProgress_monitor pi(mov.items(), str);
 | 
			
		||||
 | 
			
		||||
  TString num_mov;
 | 
			
		||||
  TDocumento* doc = NULL;
 | 
			
		||||
 | 
			
		||||
  for (bool ok = mov.move_first(); ok; ok = mov.move_next())
 | 
			
		||||
  {
 | 
			
		||||
    const TString80 nm = mov.get("NumMov").as_string();
 | 
			
		||||
    if (nm != num_mov)
 | 
			
		||||
    {
 | 
			
		||||
      if (!save_doc(doc))
 | 
			
		||||
        break;
 | 
			
		||||
      delete doc;
 | 
			
		||||
 | 
			
		||||
      num_mov = nm;
 | 
			
		||||
      const TDate datadoc = mov.get("DataMov").as_date();
 | 
			
		||||
      doc = new TDocumento('D', datadoc.year(), codnum, 0L);
 | 
			
		||||
      doc->put(DOC_TIPODOC, tipodoc);
 | 
			
		||||
      doc->put(DOC_DATADOC, datadoc);
 | 
			
		||||
      
 | 
			
		||||
      const TString& codval = mov.get("CodValuta").as_string();
 | 
			
		||||
      if (is_true_value(codval))
 | 
			
		||||
      {
 | 
			
		||||
        doc->put(DOC_CODVAL,  codval);
 | 
			
		||||
        doc->put(DOC_CAMBIO,  mov.get("CambioValuta").as_string());
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    TRiga_documento& rdoc = doc->new_row("01");
 | 
			
		||||
    rdoc.put(RDOC_CODART,    mov.get("CodArticolo").as_string());
 | 
			
		||||
    rdoc.put(RDOC_CODARTMAG, mov.get("CodArticolo").as_string());
 | 
			
		||||
    rdoc.put(RDOC_CHECKED,   true);
 | 
			
		||||
    rdoc.put(RDOC_UMQTA,     mov.get("CodUntMis").as_string());
 | 
			
		||||
    rdoc.put(RDOC_PREZZO,    mov.get("PrzCassaValuta").as_real());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  save_doc(doc);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TBeeStore_sync::main_loop()
 | 
			
		||||
{
 | 
			
		||||
  TBeeStore_mask mask;
 | 
			
		||||
 | 
			
		||||
  _dsn = ini_get_string(CONFIG_DITTA, "bs", "DSN", "BEESTORE");
 | 
			
		||||
 | 
			
		||||
  while (mask.run() == K_ENTER)
 | 
			
		||||
  {
 | 
			
		||||
    mask.autosave(); // Rende definitivi tutti i paramentri in [bs]
 | 
			
		||||
    _log = new TLog_report;
 | 
			
		||||
 | 
			
		||||
    const TDate dal = mask.get_date("SyncDate");
 | 
			
		||||
 | 
			
		||||
    if (mask.get_bool("SyncUMS"))
 | 
			
		||||
      sync_ums(dal);
 | 
			
		||||
    if (mask.get_bool("SyncIVA"))
 | 
			
		||||
      sync_iva(dal);
 | 
			
		||||
    if (mask.get_bool("SyncLinee"))
 | 
			
		||||
      sync_lines(dal);
 | 
			
		||||
    if (mask.get_bool("SyncCatMer"))
 | 
			
		||||
      sync_catmer(dal);
 | 
			
		||||
    if (mask.get_bool("SyncAnamag"))
 | 
			
		||||
      sync_anamag(dal);
 | 
			
		||||
    if (mask.get_bool("SyncSontr"))
 | 
			
		||||
      sync_scontrini(dal);
 | 
			
		||||
 | 
			
		||||
    _log->preview();
 | 
			
		||||
    delete _log;
 | 
			
		||||
    _log = NULL;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int bs0200(int argc, char* argv[])
 | 
			
		||||
{
 | 
			
		||||
  TBeeStore_sync bss;
 | 
			
		||||
  bss.run(argc, argv, TR("Bee Store"));
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										107
									
								
								bs/bs0200a.uml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								bs/bs0200a.uml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,107 @@
 | 
			
		||||
TOOLBAR "topbar" 0 0 0 2
 | 
			
		||||
#include <stdbar.h>
 | 
			
		||||
ENDPAGE
 | 
			
		||||
 | 
			
		||||
PAGE "Sincronizzazione Bee Store" 0 2 0 0
 | 
			
		||||
 | 
			
		||||
GROUPBOX DLG_NULL 78 8
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 1 1 "@bArchivi"
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
BOOLEAN 103
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 2 2 "Unità di misura    "
 | 
			
		||||
  FIELD SyncUMS
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
BOOLEAN 104
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 2 3 "Codici IVA         "
 | 
			
		||||
  FIELD SyncIVA
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
BOOLEAN 105
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 2 4 "Linee Articolo    "
 | 
			
		||||
  FIELD SyncLinee
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
BOOLEAN 106
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 2 5 "Categorie Merceol."
 | 
			
		||||
  FIELD SyncCatMer
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
BOOLEAN 147
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 2 6 "Articoli          "
 | 
			
		||||
  FIELD SyncAnamag
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
BOOLEAN 148
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 2 7 "Scontrini         "
 | 
			
		||||
  FIELD SyncScontr
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
GROUPBOX DLG_NULL 78 8
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 1 10 "@bFiltri"
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
DATE 100 
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 2 11 "Dalla data di modifica "
 | 
			
		||||
  FIELD SyncDate
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
ENDPAGE
 | 
			
		||||
 | 
			
		||||
PAGE "Parametri" 0 2 0 0
 | 
			
		||||
 | 
			
		||||
GROUPBOX DLG_NULL 78 6
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 1 1 "@bScontrini"
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
STRING 201 4
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 2 2 "Codice numerazione "
 | 
			
		||||
  USE %NUM
 | 
			
		||||
  INPUT CODTAB 201
 | 
			
		||||
  DISPLAY "Codice" CODTAB
 | 
			
		||||
  DISPLAY "Descrizione@50" S0
 | 
			
		||||
  OUTPUT 201 CODTAB
 | 
			
		||||
  OUTPUT 202 S0
 | 
			
		||||
  CHECKTYPE REQUIRED
 | 
			
		||||
  FIELD CODNUM
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
STRING 202 50 46
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 30 2 ""
 | 
			
		||||
  FLAGS "D"
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
STRING 203 4
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 2 3 "Tipo documento     "
 | 
			
		||||
  USE %TIP
 | 
			
		||||
  INPUT CODTAB 203
 | 
			
		||||
  COPY DISPLAY 201
 | 
			
		||||
  OUTPUT 203 CODTAB
 | 
			
		||||
  OUTPUT 204 S0
 | 
			
		||||
  CHECKTYPE REQUIRED
 | 
			
		||||
  FIELD TIPODOC
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
STRING 204 50 46
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 30 3 ""
 | 
			
		||||
  FLAGS "D"
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
ENDPAGE
 | 
			
		||||
 | 
			
		||||
ENDMASK
 | 
			
		||||
							
								
								
									
										7
									
								
								bs/bsmenu.men
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								bs/bsmenu.men
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
			
		||||
[BSMENU_001]
 | 
			
		||||
Caption = "Bee Store"
 | 
			
		||||
Picture = <ve01>
 | 
			
		||||
Module  = bs
 | 
			
		||||
Flags   = "F"
 | 
			
		||||
Item_01 = "Configurazione",   "bs0 -0", "F", 9015
 | 
			
		||||
Item_02 = "Sincronizzazione", "bs0 -1", "F", 9015
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user