Эмуляция поиска по всем таблицам
Разбирая завалы, нашел старый экспортный файл с реализацией поиска по всем таблицам в строковых полях. Понятно, что он уже не актуален, при наличие средств глобального поиска, но когда-то был нужен :)
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;
}
}