Показать сообщение отдельно
Старый 28.10.2009, 10:19   #7  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от ice Посмотреть сообщение
2 sukhanchik: а можно привести исходный код медода queryAddDynaCursorAsRangeAndValue(), а то у меня его нет
X++:
// This method will traverse dynalinks on QueryBuildDataSource represented by _queryDynaBdsNo
// and convert current dyna-record into ranges and values on that QueryBuildDataSource
static client server void queryAddDynaCursorAsRangeAndValue(
    Query   _query,             // new query
    Query   _queryDyna,         // query having external links (=dyna links)
    Integer _queryDynaBdsNO     // queryBuildDataSource on _queryDyna having external links
    )
{
    QueryBuildRange     toQbr;
    QueryBuildDynalink  qbDyna;
    Counter             dynaLinkNo = 1;
    Counter             toI;
    DictField           dictField;
    Integer             dictIndex;
    Integer             originalId;
    Integer             queryDsNO = _queryDynaBdsNO;
    fieldId             id;
    ;
    if (!_queryDynaBdsNO)
        return;

    if (!_query || !_queryDyna)
        throw error(strfmt("@SYS23669",funcname()));

    if (!_queryDyna.dataSourceNo(_queryDynaBdsNO))
        throw error(strfmt("@SYS23667",funcname()));

    if (_query.dataSourceCount() < _queryDynaBdsNO || _query.dataSourceNo(_queryDynaBdsNO).file() != _queryDyna.dataSourceNo(_queryDynaBdsNO).file())
    {
        _query.addDataSource(_queryDyna.dataSourceNo(_queryDynaBdsNO).file());
        queryDsNO = _query.dataSourceCount();
    }
    while (dynaLinkNo <= _queryDyna.dataSourceNo(_queryDynaBdsNO).dynalinkCount())
    {
        qbDyna      = _queryDyna.dataSourceNo(_queryDynaBdsNO).dynalink(dynaLinkNo);
        id          = fieldExt2Id(qbDyna.field());
        originalId  = id;
        toQbr       = null;

        if (_query.dataSourceNo(queryDsNO).findRange(id))
        {
            toI = 1;
            while (true)
            {
                toQbr  = _query.dataSourceNo(queryDsNO).findRange(id,toI);
                if (!toQbr || !toQbr.value() || toQbr.value() == queryValue(qbDyna.cursor().(qbDyna.dynamicField())))
                    break;
                toI++;
            }
        }
        if (!toQbr || (toQbr && toQbr.value() && queryValue(qbDyna.cursor().(qbDyna.dynamicField())) && toQbr.value() != queryValue(qbDyna.cursor().(qbDyna.dynamicField()))))
        {
            // is this a Dimension field?
            dictField = new DictField(_query.dataSourceNo(queryDsNO).table(),id);

            if (dictField.arraySize() > 1)
            {
                // yes, working with Array field
                dictIndex = originalId >> 16;
                toQbr  = _query.dataSourceNo(queryDsNO).addRange(fieldId2Ext(id, dictIndex));
            }
            else
            {
                toQbr  = _query.dataSourceNo(queryDsNO).addRange(id);
            }
        }
        if (toQbr)
            toQbr.value(queryValue(qbDyna.cursor().(qbDyna.dynamicField())));

        dynaLinkNo++;
    }
}
За это сообщение автора поблагодарили: lev (2).