Возврат нулевых записей внешних джоинов

  !   Данная информация предназначена только только для IT-специалистов по системной интеграции модулей БИОСОФТ-М. (см. Руководства пользователя к программным продуктам)

Для JoinLeft() результаты могут содержать нулевые записи которые нельзя получить from::FetchRef().

Поэтому результат внешнего JOIN возвращается в виде rp<> а не ref<>.

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.