Condividi tramite


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

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

 

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;
}
}