Files correlati : ha3 Ricompilazione Demo : [ ] Commento : Modifiche funzione di ordinamento dello sheet secondo indicazioni di Robby git-svn-id: svn://10.65.10.50/branches/R_10_00@21839 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			382 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			382 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include <applicat.h>
 | 
						||
#include <automask.h>
 | 
						||
#include <defmask.h>
 | 
						||
#include <recset.h>
 | 
						||
#include <tabmod.h>
 | 
						||
 | 
						||
#include "../pr/agenti.h"
 | 
						||
 | 
						||
#include "ha3.h"
 | 
						||
#include "ha3100a.h"
 | 
						||
 | 
						||
const char* const APPNAME = TR("Gestione giri");
 | 
						||
 | 
						||
                                          /////////////////////////
 | 
						||
                                          ////    TGIRI_KEY    ////
 | 
						||
                                          /////////////////////////
 | 
						||
class TGiri_key : public TObject
 | 
						||
{
 | 
						||
  TString8 _agente;
 | 
						||
  int      _giorno;
 | 
						||
  long     _cliente;
 | 
						||
 | 
						||
public:
 | 
						||
  TGiri_key& operator =(const TGiri_key& gkey) {return *this;}
 | 
						||
  
 | 
						||
  const TString8  agente()  const;
 | 
						||
  const int       giorno()  const;
 | 
						||
  const long      cliente() const;
 | 
						||
  
 | 
						||
  void set_agente  (const char* codag);
 | 
						||
  void set_giorno  (const int   giorno);
 | 
						||
  void set_cliente (const long  codcli);
 | 
						||
  
 | 
						||
  const char* key() const;
 | 
						||
 | 
						||
  TGiri_key(const char* codag, const int giorno, const long codcli);
 | 
						||
  TGiri_key(const TString& key);
 | 
						||
};
 | 
						||
 | 
						||
const TString8 TGiri_key::agente() const
 | 
						||
{
 | 
						||
  return _agente;
 | 
						||
}
 | 
						||
 | 
						||
const int TGiri_key::giorno() const
 | 
						||
{
 | 
						||
  return _giorno;
 | 
						||
}
 | 
						||
 | 
						||
const long TGiri_key::cliente() const
 | 
						||
{
 | 
						||
  return _cliente;
 | 
						||
}
 | 
						||
 | 
						||
void TGiri_key::set_agente(const char* codag)
 | 
						||
{  
 | 
						||
  _agente = codag;
 | 
						||
}
 | 
						||
 | 
						||
void TGiri_key::set_giorno(const int giorno)
 | 
						||
{
 | 
						||
  _giorno = giorno;
 | 
						||
}
 | 
						||
 | 
						||
void TGiri_key::set_cliente(const long codcli)
 | 
						||
{
 | 
						||
  _cliente = codcli;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
const char* TGiri_key::key() const
 | 
						||
{
 | 
						||
  TString& str = get_tmp_string();
 | 
						||
  str = _agente;
 | 
						||
  
 | 
						||
  TString8 tmp;
 | 
						||
  tmp.format("%01d", _giorno);
 | 
						||
  str << tmp;
 | 
						||
 | 
						||
  tmp.cut(0);
 | 
						||
  tmp.format("%06d", _cliente);
 | 
						||
  str << tmp;
 | 
						||
  
 | 
						||
  return str;
 | 
						||
}
 | 
						||
 | 
						||
TGiri_key::TGiri_key(const char* codag, const int giorno, const long codcli/*, const int coditi*/)
 | 
						||
{
 | 
						||
  set_agente(codag);
 | 
						||
  set_giorno(giorno);
 | 
						||
  set_cliente(codcli);
 | 
						||
}
 | 
						||
 | 
						||
TGiri_key::TGiri_key(const TString& key)
 | 
						||
{
 | 
						||
  set_agente(key.left(5));
 | 
						||
  set_giorno(atoi(key.mid(5,1)));
 | 
						||
  set_cliente(atol(key.mid(6,6)));
 | 
						||
}
 | 
						||
 | 
						||
                                          ///////////////////////////////////////
 | 
						||
                                          ////    FUNZIONE DI ORDINAMENTO    ////
 | 
						||
                                          ///////////////////////////////////////
 | 
						||
 | 
						||
static int sort_by_stop(TSheet_field& sheet, int r1, int r2)
 | 
						||
{
 | 
						||
  TToken_string& row1 = sheet.row(r1);
 | 
						||
  TToken_string& row2 = sheet.row(r2);
 | 
						||
 | 
						||
  const int i1 = row1.get_int(sheet.cid2index(S_AGENTE));
 | 
						||
  const int i2 = row2.get_int(sheet.cid2index(S_AGENTE));
 | 
						||
 | 
						||
  int dif = i1 - i2;
 | 
						||
  if (dif == 0)
 | 
						||
  {
 | 
						||
    dif = row1.get_int(sheet.cid2index(S_GIORNO)) - row2.get_int(sheet.cid2index(S_GIORNO));
 | 
						||
 | 
						||
    if (dif == 0)
 | 
						||
      dif = row1.get_int(sheet.cid2index(S_ORDPASS)) - row2.get_int(sheet.cid2index(S_ORDPASS));    
 | 
						||
  }
 | 
						||
 | 
						||
  return dif;
 | 
						||
}
 | 
						||
 | 
						||
                                          //////////////////////////////////
 | 
						||
                                          ////    TGESTIONE_GIRI_MSK    ////
 | 
						||
                                          //////////////////////////////////
 | 
						||
 | 
						||
class TGestione_giri_msk : public TAutomask
 | 
						||
{
 | 
						||
protected:
 | 
						||
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | 
						||
 | 
						||
  void riempi_sheet();
 | 
						||
  void aggiungi_riga();
 | 
						||
  void registra();
 | 
						||
 | 
						||
public:
 | 
						||
  TGestione_giri_msk();
 | 
						||
	virtual ~TGestione_giri_msk() {};
 | 
						||
};
 | 
						||
 | 
						||
//RIEMPI_SHEET: riempie lo sheet tenendo conto dei filtri impostati
 | 
						||
void TGestione_giri_msk::riempi_sheet()
 | 
						||
{
 | 
						||
  TSheet_field& sheet = sfield(F_SHEET);
 | 
						||
  sheet.destroy();
 | 
						||
  
 | 
						||
  //leggi dalla maschera i filtri
 | 
						||
  TString8 agente; agente.format("%05d", get_long(F_AGENTE));
 | 
						||
  const long giorno   = get_int(F_GIORNO);
 | 
						||
  const long cliente = get_long(F_CLIENTE);
 | 
						||
 | 
						||
  //prepara la query;
 | 
						||
  //ATTENZIONE: le query su tabmod non funzionano con il semplice USE &TAB, ma vogliono SEMPRE FROM e TO
 | 
						||
  TString query;
 | 
						||
  query << "USE &HGI\n"
 | 
						||
        << "SELECT (BETWEEN(CODTAB[6,6];" << giorno << ';' << giorno << "))&&(BETWEEN(CODTAB[7,12];" << cliente << ';' << cliente << "))";
 | 
						||
 | 
						||
  if(!field(F_AGENTE).empty())
 | 
						||
  {
 | 
						||
    query << "\nFROM CODTAB=\"" << agente << "\""
 | 
						||
          << "\nTO CODTAB=\""   << agente  << "\"";    
 | 
						||
  }
 | 
						||
  else
 | 
						||
  {
 | 
						||
    TISAM_recordset agenti(TR("USE AGENTI"));
 | 
						||
 | 
						||
    agenti.move_first();
 | 
						||
    query << "\nFROM CODTAB=\"" << agenti.get(AGE_CODAGE).as_string() << "\"";
 | 
						||
 | 
						||
    agenti.move_last();
 | 
						||
    query << "\nTO CODTAB=\""   << agenti.get(AGE_CODAGE).as_string()  << "\"";
 | 
						||
  }
 | 
						||
 | 
						||
  TISAM_recordset giri(query);
 | 
						||
  
 | 
						||
  //se non ho trovato niente con i filtri impostati, lo segnalo
 | 
						||
  if(giri.items() == 0)
 | 
						||
  {
 | 
						||
    warning_box(TR("Non <20> stato possibile trovare giri con i filtri selezionati."));
 | 
						||
    return;
 | 
						||
  }
 | 
						||
 | 
						||
  //riempio lo sheet con i dati trovati sulla tabella di modulo
 | 
						||
  for(bool ok = giri.move_first(); ok; ok = giri.move_next())
 | 
						||
  {   
 | 
						||
    TToken_string& riga = sheet.row(-1);
 | 
						||
 | 
						||
    TGiri_key gkey(giri.get("CODTAB").as_string());
 | 
						||
 | 
						||
    riga.add(gkey.agente(),              sheet.cid2index(S_AGENTE));
 | 
						||
    riga.add(gkey.giorno(),              sheet.cid2index(S_GIORNO));
 | 
						||
    riga.add(gkey.cliente(),             sheet.cid2index(S_CLIENTE));
 | 
						||
    riga.add(giri.get("I0").as_int(),    sheet.cid2index(S_ORDPASS));
 | 
						||
    riga.add(giri.get("S0").as_string(), sheet.cid2index(S_ORAPASS));
 | 
						||
  }
 | 
						||
 | 
						||
  //faccio fare gli output ai campi della riga e disabilito le celle dei campi chiave
 | 
						||
  FOR_EACH_SHEET_ROW(sheet, r, row)
 | 
						||
  {
 | 
						||
    sheet.check_row(r);  
 | 
						||
    sheet.disable_cell(r, sheet.cid2index(S_AGENTE));
 | 
						||
    sheet.disable_cell(r, sheet.cid2index(S_RAGSOC));
 | 
						||
    sheet.disable_cell(r, sheet.cid2index(S_GIORNO));
 | 
						||
    sheet.disable_cell(r, sheet.cid2index(S_CLIENTE));
 | 
						||
    sheet.disable_cell(r, sheet.cid2index(S_CLIRAGSOC));
 | 
						||
  }
 | 
						||
  sheet.sort(sort_by_stop);
 | 
						||
  sheet.force_update();
 | 
						||
}
 | 
						||
 | 
						||
//AGGIUNGI_RIGA: aggiunge una riga allo sheet tetendo conto dei filtri impostati in testata
 | 
						||
//(compila i campi gi<67> compilati e li disabilita)
 | 
						||
void TGestione_giri_msk::aggiungi_riga()
 | 
						||
{
 | 
						||
  const long agente  = get_long(F_AGENTE);
 | 
						||
  const long giorno  = get_int(F_GIORNO);
 | 
						||
  const long cliente = get_long(F_CLIENTE);
 | 
						||
  TString8 codage; codage.format("%05d", agente);
 | 
						||
 | 
						||
  TSheet_field& sheet = sfield(F_SHEET);
 | 
						||
 | 
						||
  const short pos_codage = sheet.cid2index(S_AGENTE);
 | 
						||
  const short pos_giorno = sheet.cid2index(S_GIORNO);
 | 
						||
  const short pos_codcli = sheet.cid2index(S_CLIENTE);
 | 
						||
  
 | 
						||
  TToken_string& riga = sheet.row(-1);
 | 
						||
  const int r = sheet.items() - 1;
 | 
						||
 | 
						||
  if(agente > 0L)
 | 
						||
    riga.add(codage, pos_codage);
 | 
						||
 | 
						||
  if(giorno > 0L)
 | 
						||
    riga.add(giorno, pos_giorno);
 | 
						||
  else
 | 
						||
    riga.add(1L, pos_giorno);
 | 
						||
 | 
						||
  if(agente > 0L)
 | 
						||
    riga.add(cliente, pos_codcli);
 | 
						||
  
 | 
						||
  riga.add("00:00", sheet.cid2index(S_ORAPASS));
 | 
						||
 | 
						||
  sheet.force_update();
 | 
						||
  sheet.check_row(sheet.items() - 1);
 | 
						||
 | 
						||
  if(agente > 0L)
 | 
						||
  {
 | 
						||
    sheet.disable_cell(r, pos_codage);
 | 
						||
    sheet.disable_cell(r, sheet.cid2index(S_RAGSOC));
 | 
						||
  }
 | 
						||
 | 
						||
  if(giorno > 0L)
 | 
						||
    sheet.disable_cell(r, pos_giorno);
 | 
						||
 | 
						||
  if(cliente > 0L)
 | 
						||
  {
 | 
						||
    sheet.disable_cell(r, pos_codcli);
 | 
						||
    sheet.disable_cell(r, sheet.cid2index(S_CLIRAGSOC));
 | 
						||
  }
 | 
						||
  sheet.sort(sort_by_stop);
 | 
						||
  sheet.force_update();
 | 
						||
}
 | 
						||
 | 
						||
//REGISTRA: registra le variazioni ai record esistenti, aggiunge quelli nuovi e cancella quelli contrasegnati
 | 
						||
void TGestione_giri_msk::registra()
 | 
						||
{
 | 
						||
  TModule_table giri("&HGI");
 | 
						||
  TSheet_field& sheet = sfield(F_SHEET);
 | 
						||
 | 
						||
  TAssoc_array chiavi;
 | 
						||
 | 
						||
  FOR_EACH_SHEET_ROW(sheet, r, riga)
 | 
						||
  {
 | 
						||
    giri.zero();
 | 
						||
    TToken_string& row = *(TToken_string*)riga;
 | 
						||
 | 
						||
    const bool      cancella = row.get_char(sheet.cid2index(S_CANC)) == 'X' ? true : false;
 | 
						||
    const TString8  agente   = row.get(sheet.cid2index(S_AGENTE));
 | 
						||
    const int       giorno   = row.get_int(sheet.cid2index(S_GIORNO));
 | 
						||
    const long      cliente  = row.get_long(sheet.cid2index(S_CLIENTE));
 | 
						||
		const long      ordpass  = row.get_long(sheet.cid2index(S_ORDPASS));
 | 
						||
		const TString8  orapass  = row.get(sheet.cid2index(S_ORAPASS));
 | 
						||
 | 
						||
    const TGiri_key gkey(agente, giorno, cliente);
 | 
						||
    const TString80 codtab = gkey.key();
 | 
						||
 | 
						||
    //se esiste un'altra riga sullo sheet con la stessa chiave, lo segnala e chiede se sovrascrivere quella gi<67> registrata
 | 
						||
    if(chiavi.is_key(codtab))
 | 
						||
    {
 | 
						||
      TString msg;
 | 
						||
      msg << "Attenzione: il passaggio dell'agente " << agente << " presso il cliente " << cliente << " previsto per il giorno " << itow(giorno)
 | 
						||
          << " risulta duplicato. Si desidera sovrascrivere?";
 | 
						||
      if(!yesno_box(msg))
 | 
						||
        continue;
 | 
						||
    }
 | 
						||
 | 
						||
    chiavi.add(codtab, codtab);
 | 
						||
 | 
						||
    //cancella le righe contrassegnate e aggiorna le altre
 | 
						||
    giri.put("CODTAB", codtab);
 | 
						||
		if (!cancella)
 | 
						||
		{
 | 
						||
			giri.put("I0", ordpass);
 | 
						||
			giri.put("S0", orapass);      
 | 
						||
			giri.rewrite_write();
 | 
						||
		}
 | 
						||
		else
 | 
						||
			giri.remove();
 | 
						||
  }
 | 
						||
  riempi_sheet();
 | 
						||
}
 | 
						||
 | 
						||
//ON_FIELD_EVENT: gestisce i comportamenti modificati dei bottoni e dello sheet
 | 
						||
bool TGestione_giri_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | 
						||
{ 
 | 
						||
	switch (o.dlg())
 | 
						||
	{
 | 
						||
  case DLG_FINDREC:
 | 
						||
    if(e == fe_button)
 | 
						||
    {
 | 
						||
      riempi_sheet();
 | 
						||
      return false;
 | 
						||
    }
 | 
						||
    break;
 | 
						||
  case DLG_SAVEREC:
 | 
						||
    if(e == fe_button)
 | 
						||
    {
 | 
						||
      registra();
 | 
						||
      return false;
 | 
						||
    }
 | 
						||
    break;
 | 
						||
  case F_SHEET:
 | 
						||
    if(e == se_notify_add)
 | 
						||
      aggiungi_riga();
 | 
						||
    break;
 | 
						||
  default: break;
 | 
						||
  }
 | 
						||
  return true;
 | 
						||
}
 | 
						||
 | 
						||
TGestione_giri_msk::TGestione_giri_msk() 
 | 
						||
                   : TAutomask ("ha3100a")
 | 
						||
{}
 | 
						||
 | 
						||
///////////////////////////////////////
 | 
						||
// TSkeleton_application
 | 
						||
///////////////////////////////////////
 | 
						||
class TGestione_giri_app : public TSkeleton_application
 | 
						||
{
 | 
						||
protected:
 | 
						||
  virtual const char * extra_modules() const {return "ba";}
 | 
						||
  void elabora(const TMask& msk);
 | 
						||
 | 
						||
public:
 | 
						||
  virtual void main_loop();
 | 
						||
  virtual bool create();
 | 
						||
};
 | 
						||
 | 
						||
 | 
						||
 | 
						||
void TGestione_giri_app::elabora(const TMask& msk)
 | 
						||
{}
 | 
						||
 | 
						||
void TGestione_giri_app::main_loop()
 | 
						||
{
 | 
						||
  TGestione_giri_msk msk;
 | 
						||
  while (msk.run() == K_ENTER)
 | 
						||
    elabora(msk);
 | 
						||
}
 | 
						||
 | 
						||
bool TGestione_giri_app::create()
 | 
						||
{
 | 
						||
	return TSkeleton_application::create();
 | 
						||
}
 | 
						||
 | 
						||
int ha3100 (int argc, char* argv[])
 | 
						||
{
 | 
						||
  TGestione_giri_app elabapp;
 | 
						||
	elabapp.run(argc, argv, APPNAME);
 | 
						||
  return 0;
 | 
						||
} |