Показать сообщение отдельно
Старый 16.05.2008, 17:50   #16  
somebody is offline
somebody
Участник
 
128 / 30 (2) +++
Регистрация: 30.04.2003
Адрес: Москва
Lightbulb
2 sukhanchik
Как было сказано, собственно поля, созданные согласно рекомендациям, мной уже найдены алгоритмом, описанным в первом сообщении. Поэтому UpgradeColumnList ничего нового не даст.
Вопрос в том, чтобы найти поля, созданные вопреки рекомендациям: с типами, не унаследованными от RefRecId (или уж хотя бы напрямую от recId), и в то же время содержащие значения RecId.

2 glibs
Спасибо за скрипт, это очень хорошая идея, перебрать все подозрительные integer-поля таким образом, пропуская некоторые типы. Я добавил ещё некоторые типы, к-рые стоит игнорировать (IMHO):
TimeUnits PositiveDays PositiveMonths createdTime modifiedTime Periods IntvMth IntvQr IntvWk enumId CCColor OLE_Color MaximumLength MinimumLength CACPriority Priority BatchPeriodic HWND LabelIdNum extendedTypeId ColumnWidth NegativeAdjustment NoOfDecimals OprNum AssetInterval AssetLifeTime AssetLifeTimeRest indexId CovStatus SysCodeProfilerAOS* SysCodeProfilerSQL* OLAPCube* OLAPDatabase* OLAPView*.

В итоге получается довольно обозримый список полей, просмотрев к-рый, получим большую уверенность, что мы ничего не упустили.
Скрипт с добавленными типами и с выводом чуть понагляднее, к-рый теперь запускаю:
X++:
// Находим integer-поля, в которых МОГУТ находиться значения RecId, с типом, не унаследованным от recId
static void findProbablyBadRefRecId(Args _args)
{
    UtilElements utilElements;
    DictTable dictTable;
    DictField dictField;
    DictType dictType;
    TableName prevTable;
    Counter i,
                result,
                fieldsFound,
                tablesFound;

    Boolean skipField(extendedTypeId _typeId)
    {
        DictType localDictType = new DictType(_typeId);
        ;

        if (! localDictType)
        {
            return false;
        }
        switch (localDictType.id())
        {
            case typeId2ExtendedTypeId(typeid(recId)) :
            case typeId2ExtendedTypeId(typeid(tableId)) :
            case typeId2ExtendedTypeId(typeid(ParametersKey)) :
            case typeId2ExtendedTypeId(typeid(classId)) :
            case typeId2ExtendedTypeId(typeid(FieldNum)) :
            case typeId2ExtendedTypeId(typeid(fieldId)) :
            case typeId2ExtendedTypeId(typeid(FontSize)) :
            case typeId2ExtendedTypeId(typeid(SessionId)) :
            case typeId2ExtendedTypeId(typeid(timeOfDay)) :
            case typeId2ExtendedTypeId(typeid(Days)) :
            case typeId2ExtendedTypeId(typeid(WeekDay)) :
            case typeId2ExtendedTypeId(typeid(InventDimFixed)) :
            case typeId2ExtendedTypeId(typeid(PrintCopies)) :
            case typeId2ExtendedTypeId(typeid(TaxReportField)) :
            case typeId2ExtendedTypeId(typeid(JmgSeconds)) :
            case typeId2ExtendedTypeId(typeid(Minutes)) :
            case typeId2ExtendedTypeId(typeid(Seconds)) :
            case typeId2ExtendedTypeId(typeid(Column)) :
            case typeId2ExtendedTypeId(typeid(Columns)) :
            case typeId2ExtendedTypeId(typeid(Yr)) :
            case typeId2ExtendedTypeId(typeid(Months)) :
            case typeId2ExtendedTypeId(typeid(NumberSequenceRange)) :
            case typeId2ExtendedTypeId(typeid(TimeUnits)) :
            case typeId2ExtendedTypeId(typeid(PositiveDays)) :
            case typeId2ExtendedTypeId(typeid(PositiveMonths)) :
            case typeId2ExtendedTypeId(typeid(createdTime)) :
            case typeId2ExtendedTypeId(typeid(modifiedTime)) :
            case typeId2ExtendedTypeId(typeid(Periods)) :
            case typeId2ExtendedTypeId(typeid(IntvMth)) :
            case typeId2ExtendedTypeId(typeid(IntvQr)) :
            case typeId2ExtendedTypeId(typeid(IntvWk)) :
            case typeId2ExtendedTypeId(typeid(enumId)) :
            case typeId2ExtendedTypeId(typeid(CCColor)) :
            case typeId2ExtendedTypeId(typeid(OLE_Color)) :
            case typeId2ExtendedTypeId(typeid(MaximumLength)) :
            case typeId2ExtendedTypeId(typeid(MinimumLength)) :
            case typeId2ExtendedTypeId(typeid(CACPriority)) :
            case typeId2ExtendedTypeId(typeid(Priority)) :
            case typeId2ExtendedTypeId(typeid(BatchPeriodic)) :
            case typeId2ExtendedTypeId(typeid(HWND)) :
            case typeId2ExtendedTypeId(typeid(LabelIdNum)) :
            case typeId2ExtendedTypeId(typeid(extendedTypeId)) :
            case typeId2ExtendedTypeId(typeid(ColumnWidth)) :
            case typeId2ExtendedTypeId(typeid(NegativeAdjustment)) :
            case typeId2ExtendedTypeId(typeid(NoOfDecimals)) :
            case typeId2ExtendedTypeId(typeid(OprNum)) :
            case typeId2ExtendedTypeId(typeid(AssetInterval)) :
            case typeId2ExtendedTypeId(typeid(AssetLifeTime)) :
            case typeId2ExtendedTypeId(typeid(AssetLifeTimeRest)) :
            case typeId2ExtendedTypeId(typeid(indexId)) :
            case typeId2ExtendedTypeId(typeid(CovStatus)) :
                return true;
            default :
        }
        if (localDictType.name() like "SysCodeProfilerAOS*" ||
            localDictType.name() like "SysCodeProfilerSQL*" ||
            localDictType.name() like "OLAPCube*" ||
            localDictType.name() like "OLAPDatabase*" ||
            localDictType.name() like "OLAPView*")
        {
            return true;
        }
        if (localDictType.extend())
        {
            return skipField(localDictType.extend());
        }

        return false;
    }

    str typesChain(extendedTypeId _typeId)
    {
        DictType chainDictType = new DictType(_typeId);
        str ret;
        ;

        if (chainDictType)
        {
            ret = ret + strfmt(" --> %1", chainDictType.name());
        }
        if (chainDictType.extend())
        {
            ret = ret + strfmt("%1", typesChain(chainDictType.extend()));
        }
        return ret;
    }
    ;

    while select utilElements
        order by name
        where utilElements.recordType == UtilElementType::Table
    {
        if (prevTable != utilElements.name)
        {
            dictTable = new DictTable(tablename2id(utilElements.name));
            if (! dictTable.isMap() && ! dictTable.isView() && ! dictTable.isTmp())
            {
                info (strfmt("%1", dictTable.name()));
                tablesFound++;
                result = 0;
                for (i = 1; i <= dictTable.fieldCnt(); i++)
                {
                    dictField = new DictField(dictTable.id(), dictTable.fieldCnt2Id(i));
                    if (dictField.baseType() == Types::Integer &&
                        ! dictField.isSystem() &&
                        ! skipField(dictField.typeId()))
                    {
                        dictType = new DictType(dictField.typeId());
                        info (strfmt("    %1 : %2",
                                    dictField.name(),
                                    dictType ? typesChain(dictField.typeId()) : int2str(dictField.typeId())));
                        fieldsFound++;
                        result++;
                    }
                }
                if (! result)
                {
                    infolog.cut(infolog.line());
                    tablesFound--;
                }
            }
        }
        prevTable = utilElements.name;
    }
    info (strfmt("Total number of tables found: %1", tablesFound));
    info (strfmt("Total number of fields found: %1", fieldsFound));
}