! | Данная информация предназначена только только для IT-специалистов по системной интеграции модулей БИОСОФТ-М. (см. Руководства пользователя к программным продуктам) |
Для JoinLeft() результаты могут содержать нулевые записи которые нельзя получить from::FetchRef().
Поэтому результат внешнего JOIN возвращается в виде rp<> а не ref<>.
C JoinLeft() применимы только объекты tryfrom<> вместо from<>. Они имеют функциюrp<> FetchRp() вместо ref<> FetchRef().
Таким образом вопрос представления SQL NULL значений для отсутствующей записи снимается применением обычного if not_null().
from<CDbUser> fromUser(rQuery); tryfrom<CDbVisit> tryfromVisit(rQuery); // we can have zero visit records for an existing user if (rQuery->Init()) { ... tryfromVisit. JoinLeft( ..., Qx fromUser->GetKey() == tryfromVisit->x_keyByUser); ... } if (rQuery->Next()) { if not_null( ref<CDbVisit> rDbVisit = tryfromVisit. FetchRp()) { ref<CVisitImpl> rVisit; rVisit->x_rDbVisit = rDbVisit; out_rpVisit = rVisit; } else { // the user has never visited us! out_rpVisit = null(); }
Нужно учитывать что хотя на уровне C++ никаких NULL значений пропертей не проявляются тем не менее они возникают в Qx выражениях при ссылке на tryfrom->x_property. Так как это транслируется в SQL выражения, то все нюансы сравнений с NULL и всякой тернарной логики проявляются при появлении отсутствующих записей.
См. так же http://www.biosoft-m.ru/16559 применимом с tryfrom.