Patch level : 12.0 no-patch
Files correlati : fp0500 Commento : Corretta lettura da database delle mancate consegna
This commit is contained in:
		
							parent
							
								
									a7dad37467
								
							
						
					
					
						commit
						7b2c11adc3
					
				@ -741,8 +741,8 @@ TRecordset* create_recordset(const TString& sql)
 | 
			
		||||
      rex = new TCSV_recordset(sql); else
 | 
			
		||||
    if (sql.starts_with("AS400", true)) 
 | 
			
		||||
      rex = new TAS400_recordset(sql);
 | 
			
		||||
		if (sql.starts_with("CONNECT", true))
 | 
			
		||||
			rex = new TDB_recordset(sql);
 | 
			
		||||
		//if (sql.starts_with("CONNECT", true))
 | 
			
		||||
			//rex = new TDB_recordset(sql);
 | 
			
		||||
		else
 | 
			
		||||
      rex = new TSQL_recordset(sql);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -38,14 +38,20 @@ TString SSimple_query::sq_get(TString& field, bool rtrim)
 | 
			
		||||
	return  sq_get(static_cast<const char*>(field), rtrim);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TString SSimple_query::sq_get(unsigned int column, bool rtrim)
 | 
			
		||||
{
 | 
			
		||||
	return	_rec.get(column);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned SSimple_query::sq_get_num_fields() const
 | 
			
		||||
{
 | 
			
		||||
	return _rec.get_num_fields();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TDB_recordset::reset()
 | 
			
		||||
{
 | 
			
		||||
	_first_row = 0;
 | 
			
		||||
	_items = 0;
 | 
			
		||||
	_current_row = -1;
 | 
			
		||||
	_pagesize = 512;
 | 
			
		||||
	_page.destroy();
 | 
			
		||||
	_column.destroy();
 | 
			
		||||
	_columns_loaded = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -63,7 +69,7 @@ void TDB_recordset::set(const char* sql)
 | 
			
		||||
	{
 | 
			
		||||
		TString query(sql);
 | 
			
		||||
		int pos_EOCon = query.find(')'); // End Of Conn
 | 
			
		||||
		TString conn_str = query.sub(0, ++pos_EOCon);
 | 
			
		||||
		const TString conn_str = query.sub(0, ++pos_EOCon);
 | 
			
		||||
		set_connection(conn_str);
 | 
			
		||||
 | 
			
		||||
		real_query << query.sub(pos_EOCon);
 | 
			
		||||
@ -79,7 +85,7 @@ void TDB_recordset::set(const char* sql)
 | 
			
		||||
	_rec->sq_set(_sql);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TDB_recordset::set_connection(const char* conn_str)
 | 
			
		||||
void TDB_recordset::set_connection(const char* conn_str) const
 | 
			
		||||
{
 | 
			
		||||
	TString pn(conn_str);
 | 
			
		||||
	TString srv = "", usr = "", pwd = "", drv = "";
 | 
			
		||||
@ -116,7 +122,7 @@ void TDB_recordset::set_connection(const char* conn_str)
 | 
			
		||||
		connect(srv.ltrim(), usr.ltrim(), pwd.ltrim(), str_to_driver(drv.ltrim()));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int TDB_recordset::connect(const char * db, const char * user, const char * pass, const TT_driver tipo_db)
 | 
			
		||||
int TDB_recordset::connect(const char * db, const char * user, const char * pass, const TT_driver tipo_db) const
 | 
			
		||||
{
 | 
			
		||||
	return _rec->sq_connect(db, user, pass, tipo_db);
 | 
			
		||||
}
 | 
			
		||||
@ -173,18 +179,79 @@ TRecnotype TDB_recordset::items() const
 | 
			
		||||
{
 | 
			
		||||
	if(!_rec->sq_is_loaded() && _items == 0)
 | 
			
		||||
		_rec->sq_exec();
 | 
			
		||||
	return _rec->sq_items();
 | 
			
		||||
	auto& i = const_cast<TRecnotype&>(_items);
 | 
			
		||||
	i = _rec->sq_items();
 | 
			
		||||
	return i;
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TDB_recordset::move_to(TRecnotype pos)
 | 
			
		||||
{
 | 
			
		||||
	const TRecnotype tot = items();
 | 
			
		||||
	_current_row = pos;
 | 
			
		||||
 | 
			
		||||
	if (_freezed && _loaded)
 | 
			
		||||
	{
 | 
			
		||||
		if (pos < 0)
 | 
			
		||||
			_current_row = 0;
 | 
			
		||||
		if (pos > tot)
 | 
			
		||||
			_current_row = tot;
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return _rec->sq_go(pos);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const TArray* TDB_recordset::row(TRecnotype n)
 | 
			
		||||
{
 | 
			
		||||
	static TRecnotype last_n = -1;
 | 
			
		||||
 | 
			
		||||
	if(n >= 0 && n < _rec->sq_items())
 | 
			
		||||
	{
 | 
			
		||||
		if (n == last_n && !_row.empty())	// Richiedo sempre la stessa riga
 | 
			
		||||
			return &_row;
 | 
			
		||||
		if (move_to(n))
 | 
			
		||||
		{
 | 
			
		||||
			const unsigned ncol = _rec->sq_get_num_fields();
 | 
			
		||||
			last_n = n;
 | 
			
		||||
 | 
			
		||||
			for (unsigned i = 0; i < ncol; i++)
 | 
			
		||||
				_row.add(_rec->sq_get(i, false));
 | 
			
		||||
			return &_row;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	_row.destroy();
 | 
			
		||||
	return &_row;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TDB_recordset::requery()
 | 
			
		||||
{
 | 
			
		||||
	_items = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned TDB_recordset::columns() const
 | 
			
		||||
{
 | 
			
		||||
	return _rec->sq_get_num_fields();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const TVariant& TDB_recordset::get(unsigned int column) const
 | 
			
		||||
{
 | 
			
		||||
	static TVariant field = NULL_VARIANT;
 | 
			
		||||
	static unsigned int last_get = 0;
 | 
			
		||||
	if(column != last_get || field == NULL_VARIANT)
 | 
			
		||||
	{
 | 
			
		||||
		last_get = column;
 | 
			
		||||
		field = _rec->sq_get(column);
 | 
			
		||||
		return field;
 | 
			
		||||
	}
 | 
			
		||||
	return field;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TDB_recordset::TDB_recordset(const char* sql, const bool freezed) : _freezed(freezed), _loaded(false)
 | 
			
		||||
{
 | 
			
		||||
	set(sql);
 | 
			
		||||
	_current_row = -1;
 | 
			
		||||
	_rec = new SSimple_query();
 | 
			
		||||
	_items = 0;
 | 
			
		||||
	set(sql);
 | 
			
		||||
 | 
			
		||||
@ -85,7 +85,7 @@ public:
 | 
			
		||||
	/**< Imposto il tipo di client che utilizzo */
 | 
			
		||||
	void sq_set_client(int client) { _rec.set_client(static_cast<TT_driver>(client)); }
 | 
			
		||||
	void sq_set_client(const TT_driver client) { _rec.set_client(client); }
 | 
			
		||||
	// Imposto una opzione generica dellla connessione
 | 
			
		||||
	// Imposto una opzione generica della connessione
 | 
			
		||||
	void sq_set_con_option(const char* opt) { _rec.set_con_option(opt); }
 | 
			
		||||
	/**< Abilito/Disabilito l'autocommit, (disabilitato di default) */
 | 
			
		||||
	void sq_set_autocommit(const bool ac) { _rec.set_autocommit(ac); }
 | 
			
		||||
@ -113,7 +113,7 @@ public:
 | 
			
		||||
	/** Ritorno il numero di elementi nella query */
 | 
			
		||||
	const long sq_items() { return _rec.items(); }
 | 
			
		||||
 | 
			
		||||
	// Conguration
 | 
			
		||||
	// Configuration
 | 
			
		||||
	/**< Imposta la query ricevuta come (const char *) nel recordset */
 | 
			
		||||
	const bool sq_set(const char* query) { return _rec.set(query); }
 | 
			
		||||
	/**< Imposta la query ricevuta come (string) nel recordset */
 | 
			
		||||
@ -132,9 +132,9 @@ public:
 | 
			
		||||
	const bool sq_next() { return _rec.next(); }
 | 
			
		||||
	/**< Si sposta indietro di un record, in caso di esito negativo valorizza _stringError e _codeError */
 | 
			
		||||
	const bool sq_prev() { return _rec.prev(); }
 | 
			
		||||
	/**< Si sposta avanti di un record, in caso di esito negativo valorizza _stringError e _codeError */
 | 
			
		||||
	const bool sq_first() { return _rec.first(); }
 | 
			
		||||
	/**< Si sposta al primo record, in caso di esito negativo valorizza _stringError e _codeError */
 | 
			
		||||
	const bool sq_first() { return _rec.first(); }
 | 
			
		||||
	/**< Si sposta all'ultimo record, in caso di esito negativo valorizza _stringError e _codeError */
 | 
			
		||||
	const bool sq_last() { return _rec.last(); }
 | 
			
		||||
	/**< Si sposta alla posizione n, in caso di esito negativo valorizza _stringError e _codeError */
 | 
			
		||||
	const bool sq_go(const int new_pos) { return _rec.go(new_pos); }
 | 
			
		||||
@ -165,8 +165,12 @@ public:
 | 
			
		||||
	TString				sq_get(const string& field, bool rtrim = true);
 | 
			
		||||
	/**< Ritorna il valore nel campo (field) passato come (TString) in formato (const char *)  */
 | 
			
		||||
	TString				sq_get(TString& field, bool rtrim = true);
 | 
			
		||||
	/**< Ritorna il valore della colonna numero (column) passato come (unsigned int)  */ 
 | 
			
		||||
	TString				sq_get(unsigned int column, bool rtrim = true);
 | 
			
		||||
	/**< Ritorna il valore nel campo (field) in formato (char) */
 | 
			
		||||
	const char		sq_get_char(const char* field) { return _rec.get_char(field); }
 | 
			
		||||
	/**< Ritorna il numero di campi dopo l'ultimo comando di esecuzione effettuato; se il risultato esiste */
 | 
			
		||||
	unsigned int	sq_get_num_fields() const;
 | 
			
		||||
	/**< Ritorna la posizione attuale */
 | 
			
		||||
	const long		sq_pos() const { return _rec.pos(); }
 | 
			
		||||
 | 
			
		||||
@ -202,28 +206,29 @@ class TDB_recordset : public TRecordset
 | 
			
		||||
	TString _dsn, _usr, _pwd, _drv;
 | 
			
		||||
 | 
			
		||||
	bool				_freezed, _loaded, _columns_loaded{};
 | 
			
		||||
	TRecnotype _first_row{}, _pagesize{}, _items, _current_row{};
 | 
			
		||||
	TArray _page, _column;
 | 
			
		||||
	TRecnotype	_items, _current_row;
 | 
			
		||||
	TArray			_row, _column;
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
	void	reset();
 | 
			
		||||
	void	set(const char* sql);
 | 
			
		||||
	// Parsa la stringa di connessione contenuta nella query
 | 
			
		||||
	void	set_connection(const char * conn_str);
 | 
			
		||||
	int		connect(const char * db, const char * user, const char * pass, const TT_driver tipo_db);
 | 
			
		||||
	void	set_connection(const char * conn_str) const;
 | 
			
		||||
	int		connect(const char * db, const char * user, const char * pass, const TT_driver tipo_db) const;
 | 
			
		||||
	int		connect(const char * db, const char * user, const char * pass, const char * tipo_db) const;
 | 
			
		||||
	static TT_driver str_to_driver(const char* tipo_db);
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	TRecnotype			items() const override;						// Pure
 | 
			
		||||
	bool						move_to(TRecnotype pos) override; // Pure
 | 
			
		||||
	virtual TRecnotype			current_row() const;							// Pure
 | 
			
		||||
	virtual void						requery();												// Pure
 | 
			
		||||
	virtual const TString&	query_text() const { return _sql; };
 | 
			
		||||
	TRecnotype			current_row() const override { return _current_row; }	// Pure
 | 
			
		||||
	const TArray*		row(TRecnotype n);
 | 
			
		||||
	void						requery() override;								// da impl. Pure
 | 
			
		||||
	const TString&	query_text() const override { return _sql; };
 | 
			
		||||
 | 
			
		||||
	virtual unsigned int columns() const; // Pure
 | 
			
		||||
	virtual const TRecordset_column_info& column_info(unsigned int column) const; // Pure
 | 
			
		||||
	virtual const TVariant& get(unsigned int column) const;		// Pure
 | 
			
		||||
	unsigned int columns() const override; // Pure
 | 
			
		||||
	//virtual const TRecordset_column_info& column_info(unsigned int column) const; // Pure
 | 
			
		||||
	const TVariant& get(unsigned int column) const override;		// Pure
 | 
			
		||||
 | 
			
		||||
	TDB_recordset(const char * sql, bool freezed = false);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -649,6 +649,21 @@ const char* TXvt_recordset::get(const char* field)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char* TXvt_recordset::get(unsigned int field)
 | 
			
		||||
{
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		return _RCS(_recset)->Field(field).asString();
 | 
			
		||||
	}
 | 
			
		||||
	catch(SAException &x)
 | 
			
		||||
	{
 | 
			
		||||
		_code_error = x.ErrNativeCode();
 | 
			
		||||
		_GET_ERROR(x.ErrMessage(), _string_error);
 | 
			
		||||
		_GET_ERROR(x.ErrText(), _string_error_full_text);
 | 
			
		||||
		return '\0';
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char TXvt_recordset::get_char(const char* field) 
 | 
			
		||||
{
 | 
			
		||||
	try
 | 
			
		||||
@ -664,6 +679,11 @@ char TXvt_recordset::get_char(const char* field)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int TXvt_recordset::get_num_fields() const
 | 
			
		||||
{
 | 
			
		||||
	return _RCS(_recset)->FieldCount();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
long TXvt_recordset::get_code_error(bool erase)
 | 
			
		||||
{
 | 
			
		||||
	long app = _code_error; 
 | 
			
		||||
 | 
			
		||||
@ -195,8 +195,12 @@ public:
 | 
			
		||||
	const char*		get_date(const char* field);
 | 
			
		||||
	/**< Ritorna il valore nel campo (field) passato in formato (const char *) */
 | 
			
		||||
	const char*		get(const char* field);
 | 
			
		||||
	/**< Ritorna il valore del campo numero (field) passato, in formato (const char *) */
 | 
			
		||||
	const char*		get(unsigned int field);
 | 
			
		||||
	/**< Ritorna il valore nel campo (field) in formato (char) */
 | 
			
		||||
	char					get_char(const char* field);
 | 
			
		||||
	/**< Ritorna il numero di campi dopo l'ultimo comando di esecuzione effettuato; se il risultato esiste */
 | 
			
		||||
	int						get_num_fields() const;
 | 
			
		||||
	/**< Ritorna la posizione attuale */
 | 
			
		||||
	long					pos() const { return _recno; }
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user