Эмуляция поиска по всем таблицам


Разбирая завалы, нашел старый экспортный файл с реализацией поиска по всем таблицам в строковых полях. Понятно, что он уже не актуален, при наличие средств глобального поиска, но когда-то был нужен 🙂

 

static void findStrInAllTables(Args _args)
{
    Dictionary  dictionary;
    DictTable   dictTable;
    DictField   dictField;

    Dialog      dlg;
    DialogGroup dlgg;
    DialogField dlgf;

    Common      common;

    int         i, cnt, ret, res;
    str         fieldValue, findStr;
    ;

    dlg    = new Dialog("Поиск по всем полям");
    dlgg   = dlg.addGroup("Критерий");
    dlgf   = dlg.addField(typeid(Name), "Строка поиска");

    dlgg.columns(2);

    if (! dlg.run())
        return;

    findStr = dlgf.value(); // Нашли что искать будем

    dictionary = new Dictionary();

    setPrefix("Поиск соответствия");

    for (i=1; i<=dictionary.tableCnt(); i++)
    {
        dictTable = new DictTable(dictionary.tableCnt2Id(i));
        common    = dictTable.makeRecord();
        res       = 0;

        // Для каждой записи
        while select common
        {
            // Перебор полей для таблицы
            for (cnt=1; cnt<=dictTable.fieldCnt(); cnt++)
            {
                // Получение идентификатора поля
                dictField = new DictField(dictTable.id(),
                                fieldId2Ext(dictTable.fieldCnt2Id(cnt),1));

                if (dictField.baseType() == Types::String)
                {
                    fieldValue = common.(dictField.id());
                    ret        = strscan(fieldValue, findStr, 1, strlen(fieldValue));

                    if (ret)
                    {
                        // Вывод названия поля и его значения
                        info(strfmt("%1 : %2 : %3", dictTable.name(),
                                                    dictField.name(),
                                                    fieldValue));
                        res++;
                    }
                }
            }
        }

        print "Обработана таблица " + dictTable.name() +
                (res ? ("               Соответствий " + int2str(res)) : "");

        //Для тестирования только 100 таблиц
        //if (i > 100)
        //    break;
    }
}

Comments (0)

Skip to main content