#include <aextsql.h>
Открытые слоты | |
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 () | |
Деструктор класса. |
Пример использования. Код взят из модуля экранной формы отчета "Остатки товаров".
// 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(); }
QSqlSelectCursor * aExtSQL::Cursor | ( | ) | const [slot] |
Функция фозвращает внутренний курсор, содержащий результаты выполнения последнего вызова функции ExecQuery или ExecScalar.
для использования в качестве источника данных для таблиц (QDataTable и т.д). Не удаляйте этот курсор после использования!
QVariant aExtSQL::Value | ( | int | col | ) | const [slot] |
Функция получения значения столбца текущей записи или QVariant::Invalid если случилачь ошибка или значение меньше 0 или больше, чем количество столбцов в результате.
col | (in) - |
bool aExtSQL::ExecQuery | ( | const QString & | query | ) | [slot] |
Функция для выполнения sql запроса.
Поддерживается только выражение select. Если случилась ошибка, возвращается false. Для перемещения по результатам используйте функции First(), Next(), Prev(), Last(). Для получения сведений об ошибке - функцией LastError().
query | (in) - Sql запрос для выполнения. |
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()); }
QVariant aExtSQL::ExecScalar | ( | const QString & | query | ) | [slot] |
Эта функция похожа на описанную выше ExecQuery(),.
но возвращает не true или false, а значение первой ячейки первой строки результата или QVariant::Invalid, если не вернулось ни одной записи или случилась ошибка. Но если вы знаете, что в результате больше чем одна запись, вы можете перемещаться по ним используя функции First(), Next() и т.д.
query | (in) - Sql запрос для выполнения. |
var sql = new SQL(); var res = sql.ExecScalar("select count(*) from a_journ") ) sys.Message(0, res + "records in system journal");
bool aExtSQL::First | ( | ) | [slot] |
Делает первую запись результата активной.
Вы должны сначала вызвать ExecQuery, чтобы вызов этой функции имел смысл.
bool aExtSQL::Next | ( | ) | [slot] |
Делает следующую запись результата активной.
bool aExtSQL::Last | ( | ) | [slot] |
Делает последнюю запись результата активной.
bool aExtSQL::Prev | ( | ) | [slot] |
Делает предыдущую запись результата активной.
QString aExtSQL::SqlFieldName | ( | aObject * | obj, | |
const QString & | userFieldName, | |||
const QString & | tableType = "" | |||
) | const [slot] |
Возвращает sql имя поля по его пользовательскому имени.
К каждому объекту Ананаса пользователь может добавлять свои собственные пользовательские поля. К несчастью, когда вы генерируете SQL запрос, вы должны использовать sql-ные имена полей вместо пользовательских. Данная функция помогает делать это очень просто. Все что вам нужно - создать новый объект, который будет использоваться для получения имени, определить пользовательское имя поля и таблицу (основную или одну из запасных :). См SqlTableName() для детального описания имен и структуры таблиц. Кроме того, каждая таблица содержит системные поля для связи между объектами. Эти поля также могут быть использованы в запросе. См. документацию по каждому объекту Ананаса для детального описания.
obj | (in) - Объект Ананасаю Используется в качестве контекста поиска. | |
userFieldName | (in) - Пользовательское имя поля | |
tableType | (optional) - Тип таблицы. Для каталога таблица групп имеет синоним "group", для накопительного регистра каждая из таблиц остатков по измерению имеет сининим, совпадающий с пользовательским именем этого измерения. |
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
Перекрестные ссылки aDataTable::sqlFieldName() и aObject::table().
QString aExtSQL::SqlTableName | ( | aObject * | obj, | |
const QString & | tableType = "" | |||
) | const [slot] |
Возвращает SQL имя основной или вспомогательной таблицы объекта.
Все объекты Ананаса, за исключением Отчетов, хранят данные в sql таблицах. Для Каталога это таблица групп и таблица элементов (осн.), для документа - таблица шапки, для журнала - всегда системная таблица системного журнала, для ИРегистра - одна таблица для хранения всех данных, для АРегистра - одна основная таблица для хранения записей об операциях (осн.) и X вспомогательных для хранения остатков по разрезам, где X - количество измерений накопительного регистра. Так что если вы хотите получить имя основной таблицы объекта, не используйте параметр или установите его значение в "". Если вы хотите получить имя вспомогательной таблицы, установите параметру значение "group" для группы каталога или значение пользовательского имени измерения накопительного регистра для таблицы остатков по данному измерению.
obj | (in) - Объект для получения имени таблицы | |
tableType | (optional) - Тип таблицы |
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
Перекрестные ссылки aObject::table() и aDataTable::tableName.
QString aExtSQL::LastError | ( | ) | const [slot] |
Возвращает текстовое представление последней ошибки или пустую строку, если ошибок не было.
Возвращается текст драйвера базы данных.