Ananas Library 0.9.5
Класс aExtSQL

Предоставляет возможность использования SQL запросов в отчетах. Подробнее...

#include <aextsql.h>

Граф наследования:aExtSQL:
AExtension

Открытые слоты

QSqlSelectCursor * Cursor () const
 Функция фозвращает внутренний курсор, содержащий результаты выполнения последнего вызова функции ExecQuery или ExecScalar.
 
QVariant Value (int col) const
 
int Size () const
 Функция получения количества записей в результате. .
 
int Count () const
 Функция получения количества столбцов в результате. .
 
bool ExecQuery (const QString &query)
 Функция для выполнения sql запроса.
 
QVariant ExecScalar (const QString &query)
 Эта функция похожа на описанную выше ExecQuery(),.
 
bool First ()
 Делает первую запись результата активной.
 
bool Next ()
 Делает следующую запись результата активной.
 
bool Last ()
 Делает последнюю запись результата активной.
 
bool Prev ()
 Делает предыдущую запись результата активной.
 
QString SqlFieldName (aObject *obj, const QString &userFieldName, const QString &tableType="") const
 Возвращает sql имя поля по его пользовательскому имени.
 
QString SqlTableName (aObject *obj, const QString &tableType="") const
 Возвращает SQL имя основной или вспомогательной таблицы объекта.
 
QString SqlTableName (const QString &objName) const
 Еще не реализовано. .
 
QString SqlFieldName (const QString &fieldName) const
 Еще не реализовано. .
 
QString LastError () const
 Возвращает текстовое представление последней ошибки или пустую строку, если ошибок не было.
 

Открытые члены

 aExtSQL ()
 Конструктор класса .
 
virtual int init (aDatabase *database)
 Функция иницализации, переопределяет функцию базового класса, создает внутренние объекты и переменные. .
 
 ~aExtSQL ()
 Деструктор класса .
 
- Открытые члены унаследованные от AExtension
 AExtension (const char *name=0)
 

Дополнительные унаследованные члены

- Сигналы унаследованные от AExtension
void event (const QString &data)
 
- Открытые атрибуты унаследованные от AExtension
aDatabasedb
 

Подробное описание

Предоставляет возможность использования SQL запросов в отчетах.

Пример использования. Код взят из модуля экранной формы отчета "Остатки товаров".

// Oбрабатывает пользовательские нажатия на кнопки экранной формы
function on_button(name)
{
if(name == "report_button")
{
generate_report();
}
if(name == "run_button")
{
run_report();
}
}
// Формирует текст SQL запроса и в демонстрационных целях помещает его в поле report_text
// пользовательского диалога для показа пользователю.
function generate_report()
{
var cat = new Catalogue("Каталог товаров");
var reg = new ARegister("Главная книга");
var sql = new SQL();
var innerQuery = "SELECT "+
sql.SqlFieldName(cat, "Наименование") + ", " +
sql.SqlFieldName(cat, "Артикул") + ", " +
sql.SqlFieldName(reg, "Количество") + " as Amount, " +
"idg " +
"FROM " + sql.SqlTableName(cat) + " as CAT " +
"LEFT JOIN " + sql.SqlTableName(reg, "Товар" ) + " as SALDO " +
"on CAT.id = SALDO." + sql.SqlFieldName(reg, "Товар") + " " +
"GROUP BY " + sql.SqlFieldName(cat, "Наименование") + " " +
"HAVING max(SALDO.date) ";
var groupQuery = "SELECT sum( Amount ) as summ, "+
"t.idg, " +
sql.SqlFieldName(cat, "Название группы", "group") + " as gname " +
"FROM (" + innerQuery + ") as t " +
"LEFT JOIN " + sql.SqlTableName(cat, "group") + " as GR " +
"on GR.id = t.idg GROUP BY t.idg";
var outerQuery = "SELECT G.gname, G.summ, E.* from ( " + innerQuery + " ) as E " +
"LEFT JOIN ( " + groupQuery + " ) as G " +
"on E.idg = G.idg";
Widget("report_text").text = outerQuery;
}
// Запускает на исполнение SQL запрос, сформированный функцией generate_report()
// и строит отчет в OpenOffice.org Calc c использованием полученных данных.
function run_report()
{
var sql = new SQL();
if( !sql.ExecQuery(Widget("report_text").text) )
{
sys.Message(1,"you have error in your sql query:" + sql.LastError());
return;
}
var p = new Report("templ_ostatki.ods",2);
p.setTable("templ_ostatki.ods");
if(sql.First())
{
do{
p.setValue("f0",sql.Value(2));
p.setValue("f1",sql.Value(4));
p.setValue("f2",sql.Value(0));
p.setValue("f3",sql.Value(1));
p.exec("строка");
} while(sql.Next());
}
p.setValue("param", ConvertDateFromIso(Date()));
p.exec("Текущая дата");
p.show();
p.close();
}

Конструктор(ы)

◆ aExtSQL()

aExtSQL::aExtSQL ( )

Конструктор класса .

◆ ~aExtSQL()

aExtSQL::~aExtSQL ( )

Деструктор класса .

Методы

◆ Count

int aExtSQL::Count ( ) const
slot

Функция получения количества столбцов в результате. .

◆ Cursor

QSqlSelectCursor * aExtSQL::Cursor ( ) const
slot

Функция фозвращает внутренний курсор, содержащий результаты выполнения последнего вызова функции ExecQuery или ExecScalar.

    для использования в качестве источника данных для таблиц (QDataTable и т.д). Не удаляйте этот курсор после использования!
    \return Внутренний курсор.
См. также
aExtSQL::ExecQuery()
aExtSQL::ExecScalar()

◆ ExecQuery

bool aExtSQL::ExecQuery ( const QString & query)
slot

Функция для выполнения sql запроса.

    Поддерживается только выражение select. Если случилась ошибка, возвращается false. Для перемещения по результатам используйте функции First(), Next(), Prev(), Last(). Для получения сведений об ошибке - функцией LastError(). 
    \param query (in) - Sql запрос для выполнения.
Возвращает
true, если запрос выполнился без ошибок.
var sql = new SQL();
if( !sql.ExecQuery("select * from a_journ") )
{
sys.Message(1,"Ошибка в вашем sql запросе:" + sql.LastError());
return;
}
if(sql.First())
{
do{
sys.Message(0, sql.Value(0));
} while(sql.Next());
}
См. также
aExtSQL::ExecScalar()
aExtSQL::Value()
aExtSQL::LastError()

◆ ExecScalar

QVariant aExtSQL::ExecScalar ( const QString & query)
slot

Эта функция похожа на описанную выше ExecQuery(),.

    но возвращает не true или false, а значение первой ячейки первой строки результата или QVariant::Invalid, 
    если не вернулось ни одной записи или случилась ошибка. Но если вы знаете, что в результате больше чем одна запись, 
    вы можете перемещаться по ним используя функции First(), Next() и т.д.
    \param query (in) - Sql запрос для выполнения. 
    \return Результат запроса или QVariant::Invalid
var sql = new SQL();
var res = sql.ExecScalar("select count(*) from a_journ") )
sys.Message(0, res + "records in system journal");
См. также
aExtSQL::ExecQuery()

◆ First

bool aExtSQL::First ( )
slot

Делает первую запись результата активной.

    Вы должны сначала вызвать ExecQuery, чтобы вызов этой функции имел смысл.
    \return true в случае успеха
См. также
aExtSQL::ExecuteQuery()

◆ init()

int aExtSQL::init ( aDatabase * database)
virtual

Функция иницализации, переопределяет функцию базового класса, создает внутренние объекты и переменные. .

Переопределяет метод предка AExtension.

Перекрестные ссылки aDatabase::db().

◆ Last

bool aExtSQL::Last ( )
slot

Делает последнюю запись результата активной.

    \return true в случае успеха
См. также
aExtSQL::ExecuteQuery()

◆ LastError

QString aExtSQL::LastError ( ) const
slot

Возвращает текстовое представление последней ошибки или пустую строку, если ошибок не было.

    Возвращается текст драйвера базы данных.

◆ Next

bool aExtSQL::Next ( )
slot

Делает следующую запись результата активной.

    \return true в случае успеха 
См. также
aExtSQL::ExecuteQuery()

◆ Prev

bool aExtSQL::Prev ( )
slot

Делает предыдущую запись результата активной.

    \return true в случае успеха 
См. также
aExtSQL::ExecuteQuery()

◆ Size

int aExtSQL::Size ( ) const
slot

Функция получения количества записей в результате. .

◆ SqlFieldName [1/2]

QString aExtSQL::SqlFieldName ( aObject * obj,
const QString & userFieldName,
const QString & tableType = "" ) const
slot

Возвращает sql имя поля по его пользовательскому имени.

К каждому объекту Ананаса пользователь может добавлять свои собственные пользовательские поля. К несчастью, когда вы генерируете SQL запрос, вы должны использовать sql-ные имена полей вместо пользовательских. Данная функция помогает делать это очень просто. Все что вам нужно - создать новый объект, который будет использоваться для получения имени, определить пользовательское имя поля и таблицу (основную или одну из запасных :). См SqlTableName() для детального описания имен и структуры таблиц. Кроме того, каждая таблица содержит системные поля для связи между объектами. Эти поля также могут быть использованы в запросе. См. документацию по каждому объекту Ананаса для детального описания.

Аргументы
obj(in) - Объект Ананасаю Используется в качестве контекста поиска.
userFieldName(in) - Пользовательское имя поля
tableType(optional) - Тип таблицы. Для каталога таблица групп имеет синоним "group", для накопительного регистра каждая из таблиц остатков по измерению имеет сининим, совпадающий с пользовательским именем этого измерения.
Возвращает
sql имя поля
var sql = new SQL();
var cat = new Catalogue("Goods");
sys.Message(0, sql.SqlFieldName(cat, "Full name"); // uf203
sys.Message(0, sql.SqlFieldName(cat, "Group name", "group") //uf304
var doc = new Document("Order");
sys.Message(0, sql.SqlFieldName(doc, "Organization"); //uf449
var reg = new ARegister("Grossbuch");
sys.Message(0, sql.SqlFieldName(reg, "Good"); // uf333
См. также
aExtSQL::SqlTableName()

Перекрестные ссылки aObject::table().

◆ SqlFieldName [2/2]

QString aExtSQL::SqlFieldName ( const QString & fieldName) const
slot

Еще не реализовано. .

Перекрестные ссылки aCfg::find(), aCfg::id() и aCfg::objClass().

◆ SqlTableName [1/2]

QString aExtSQL::SqlTableName ( aObject * obj,
const QString & tableType = "" ) const
slot

Возвращает SQL имя основной или вспомогательной таблицы объекта.

\if english
   \brief Gets SQL name of primary or one of secondary object tables.

           All Ananas objects except Report store theyr values in sql tables. For Catalogue this is group table and element table (pri), for Document - data header table, for Journal - always system journal table, for IRegister - one table for all data, for ARegister - main table for store operations (pri) and X table for store saldo, where X - dimensions count. So if you want get name of primary table, leave parameter \atableType or set in to empty string. If you want get name of secondary table, set parameter \atableType to "group" for catalogue group table or dimension user name for accumulation register saldo table for that dimension.
   \param obj (in) -  Object for getting table name. 
   \param tableType (optional) - Table type 
   \return sql table name 

Все объекты Ананаса, за исключением Отчетов, хранят данные в sql таблицах. Для Каталога это таблица групп и таблица элементов (осн.), для документа - таблица шапки, для журнала - всегда системная таблица системного журнала, для ИРегистра - одна таблица для хранения всех данных, для АРегистра - одна основная таблица для хранения записей об операциях (осн.) и X вспомогательных для хранения остатков по разрезам, где X - количество измерений накопительного регистра. Так что если вы хотите получить имя основной таблицы объекта, не используйте параметр \atableType или установите его значение в "". Если вы хотите получить имя вспомогательной таблицы, установите параметру \atableType значение "group" для группы каталога или значение пользовательского имени измерения накопительного регистра для таблицы остатков по данному измерению.

Аргументы
obj(in) - Объект для получения имени таблицы
tableType(optional) - Тип таблицы
Возвращает
sql имя таблицы
var sql = new SQL();
var cat = new Catalogue("Goods");
sys.Message(0, sql.SqlTableName(cat)); //ce101
sys.Message(0, sql.SqlTableName(cat, "")); //ce101
sys.Message(0, sql.SqlTableName(cat, "group")); //cg105
var doc = new Document("Order");
sys.Message(0, sql.SqlTableName(doc)); //dh130
var journ = new Journal("main journal");
sys.Message(0, sql.SqlTableName(journ)); // a_journ
var ireg = new IRegister("Info register"));
sys.Message(0, sql.SqlTableName(ireg)); // ra303
var areg = new ARegister("Acc Register");
sys.Message(0, sql.SqlTableName(areg)); // ra330
sys.Message(0, sql.SqlTableName(areg),"Goods") //ra330_d445
См. также
aExtSQL::SqlFieldName()

Перекрестные ссылки aObject::table().

◆ SqlTableName [2/2]

QString aExtSQL::SqlTableName ( const QString & objName) const
slot

Еще не реализовано. .

Перекрестные ссылки aCfg::find(), aCfg::objClass() и aDatabase::tableDbName().

◆ Value

QVariant aExtSQL::Value ( int col) const
slot

Функция получения значения столбца \acol текущей записи или QVariant::Invalid если случилачь ошибка или значение \acol меньше 0 или больше, чем количество столбцов в результате.

Аргументы
col(in) -

Объявления и описания членов классов находятся в файлах: