Open QApplication opened 7 years ago
Имя таблицы и возвращаемый тип данных жестко связаны. Поэтому имя таблицы берется из параметра темплейта. Посмотрите, как сделано примере l2q_spread_bot
Исправил error getItem('firms'): Luacpp entity get: typecheck failed (Lua type at stack index -1 is nil; content as string: <Oops, got null from Lua when tried to get actual content as string> Взял Ваш пример для classes try {
auto n = api_Lua->getNumberOf<::qlua::table::classes>();
if (n < 1) api_Lua->message("No classes found");
message((std::string("row number fnc 'classes' ") + std::to_string(n)).c_str()); и получил ошибку
в продолжении предыдущего вопроса try {
auto n = api_Lua->getNumberOf<::qlua::table::trade_accounts>();
if (n < 1) api_Lua->message("No trade_accounts found");
message((std::string("row number fnc 'trade_accounts' ") + std::to_string(n)).c_str()); и получил ошибку
В первом случае навскидку не скажу, но ошибка должна быть в определении какого-то из поля, которое не используется в примере l2q_spread_bot, иначе бы я на нее наткнулся. И скорей всего дело в неправильном наименовании поля.
Во втором случае скорей всего ошибка в определении типа поля, то есть одно из полей, которое обозначено в хелпе от Квика как NUMBER на самом деле является STRING.
Точнее можно найти, если делать try на каждое поле отдельно:
std::string s;
try {
s = s + f().class_codes();
} catch (std::runtime_error e) {
message("Error in field class_codes()")
}
.... // для каждого поля то же самое
message(s.c_str()); завтра на свежую голову попробую для каждого поля через try catch getItem("classes")
проблема в getItem("trade_accounts")
проблема в Второе исправил, первое - похоже на проблему в Quik, написал им на форум. Также добавил пример type_consistency, который запрашивает все поля всех имеющихся записей всех таблиц по getItem, и если проблема, пишет об этом на консоль. все оставльне таблицы в getItem я проверил - работают нормально, остается не определенным только getItem("classes") с полем class_code(). Нужно иметь в виду, что, чтобы их проверить, в них должны быть данные. Например, если таблица заявок пуста, то там будет 0 записей, и поэтому не вызовется ни один аксесор к полю.
В classes у меня кроме class_codes проблемы с двумя другими полями, которые бывают nil. Уточняю, проверил все кроме таблиц (ниже), они у меня пустые.getItem
for table money_limits
Компилятор выдал следующую ошибку: contrib\qluacpp\src\qlua\api\table_data.hpp:13:
error: incomplete type 'qlua::table::detail::name_for_type::value(), Index);
getItem('firms')
try {
auto n = q.getNumberOf<::qlua::table::firms>();
if (n < 1) q.message("No firms found");
for (size_t i = 0; i < n; ++i) {
using entity = const lua::entity<lua::type_policy<qlua::table::firms>>&;
q.getItem<::qlua::table::firms>(i, [&q, i] (entity f) {
std::string s = "Firm [" + std::to_string(i) + "] " +
f().firmid() + " " +
f().firm_name() + " " +
std::to_string(f().status()) + " " +
f().exchange() + "\n";
q.message(s.c_str());
});
}
} catch (std::exception e) {
q.message(("Error " + std::string(e.what())).c_str());
}
`getItem("classes")`
for (size_t i = 0; i < n; ++i) {
using entity = const lua::entity<lua::type_policy<qlua::table::classes>>&;
api_Lua->getItem<::qlua::table::classes>(i, [this, i] (entity f)
{
std::string s = "Firm [" + std::to_string(i) + "]: " +
"firmid: " + f().firmid() + "; " +
"name: " + f().name() + "; " +
"code: " + f().class_code() + "; " +
"npars: " + std::to_string(f().npars()) + "; " +
"nsecs: " + std::to_string(f().nsecs()) + "\r\n" ;
message(s.c_str());
});
}
} catch (std::runtime_error e) {
message(("Error " + std::string(e.what())).c_str());
}
error table: classes: Luacpp entity get: typecheck failed (Lua type at stack index -1 is nil; content as string: <Oops, got null from Lua when tried to get actual content as string>)
`getItem("trade_accounts")`
for (size_t i = 0; i < n; ++i) {
using entity = const lua::entity<lua::type_policy<qlua::table::trade_accounts>>&;
api_Lua->getItem<::qlua::table::trade_accounts>(i, [this, i] (entity f)
{
std::string s = "Trade_accounts [" + std::to_string(i) + "]: " +
"class_codes: " + f().class_codes() + "; " +
"firmid: " + f().firmid() + "; " +
"trdaccid: " + f().trdaccid() + "; " +
"description: " + f().description() + "; " +
"fullcoveredsell: " + std::to_string(f().fullcoveredsell()) + "; " +
"main_trdaccid: " + std::to_string(f().main_trdaccid()) + "; " +
"bankid_t0: " + f().bankid_t0() + "; " +
"bankid_tplus: " + f().bankid_tplus() + "; " +
"trdacc_type: " + std::to_string(f().trdacc_type()) + "; " +
"depunitid: " + f().depunitid() + "; " +
"status: " + std::to_string(f().status()) + "; " +
"firmuse: " + std::to_string(f().firmuse()) + "; " +
"depaccid: " + f().depaccid() + "; " +
"bank_acc_id: " + f().bank_acc_id() + "; ";
message(s.c_str());
});
}
} catch (std::runtime_error e) {
message(("Error " + std::string(e.what())).c_str());
}
error table: trade_accounts: Luacpp entity get: typecheck failed (Lua type at stack index -1 is string; content as string: )
Мое предположение ошибки в переменной trdaccid
.
"code: " + f().class_code() + "; "
причина не понятна, возможно должно быть так "code: " + f().code() + "; "
"main_trdaccid: " + std::to_string(f().main_trdaccid()) + "; " +
поле должно быть string
_testing_ccp_holdings
_testing_account_balance
_testing_account_positions
_testing_firm_holding
_testing_futures_client_holding
_testing_neg_deal_reports
_testing_neg_deals
_testing_neg_trades
_testing_orders
_testing_rm_holdings
_testing_stop_orders
_testing_trades
функция
TABLE getItem (STRING TableName, DOUBLE Index)
Такое ощущение, что не хватает входной величиныTableName
или я не правильно вызываю функцию getItem?api_Lua->getItem('TableName', Index, [this] (const ::qlua::table::firms& firms )