Rambler's Top100

(c)2009-2017 openinfotech.ru

СУБД HyTech

Документация
Функция fn_htSearch

htSearch - Поиск по условию для элемента записи в заданном временном срезе

Назначение:

Функция позволяет выполнить поиск множества записей таблицы, для которых значения выбранного элемента удовлетворяют некоторому условию.

Возвращение адреса БДС позволяет организовывать "цепочки" вложенных друг в друга вызовов. Результат вызова одной функции передается в качестве параметра для другой функции и т.п.

Поиски по шаблону могут отрабатываться только для полей типа "массив" символов (ET_CHAR). В качестве шаблона используются любые допустимые символы и символы замены:

  • '*' - заменяет любое число символов;
  • '?' - заменяет строго один символ.

Пороговое значение при поиске по шаблону (с учетом и без учета регистра) оформляется особым образом. Следует учитывать, что дополнение пробелами может исказить поисковое предписание. Например, сравним два запроса:

  • "АБ*" - поиск всех значений, начинающихся на 'АБ';
  • "АБ* " - поиск всех значений, начинающихся на 'АБ' и обязательно имеющих не менее одного пробела в конце поля.

Пороговое значение при поиске по шаблону обязательно должно быть C-строкой. При поиске по шаблону C-строка пробелами справа не дополняется.

Можно задать сразу несколько шаблонов, разделяемых символом '|'. В конце всех шаблонов должен быть '\0' терминатор. Будут найдены записи, удовлетворяющие ЛЮБОМУ из заданных шаблонов.

Поиск по шаблону без учета регистра выполняется медленнее строгого поиска по шаблону. Это связано с большим объемом сканируемых данных. Рекомендуется хранить данные в одном регистре.

Для получения всех записей таблицы быстрее всего выполнить поиск по физическому номеру.

Прототип:

LPSAB HTAPI htSearch(
	LPSAB	 fpPhoto,	/* БДС "снимка" */
	LPSAB	 fpSave,	/* БДС для сохранения результата */
	THANDLE	 hTable,	/* Обработчик для таблицы */
	int	 nElementNum,	/* Номер элемента таблицы */
	CONDITION nCond,	/* Условие сравнения */
	void far *fpValue1,	/* Первое пороговое значение */
	void far *fpValue2	/* Второе пороговое значение */
);

Параметры

fpPhoto
задает адрес БДС, содержащего "снимок" таблицы для поиска. БДС со снимком - БДС содержащий результаты ранее выполненного поиска в данной таблице. Если выполняется первый поиск, этот параметр следует задать равным NULL. Обратите внимание, что БДС будет использоваться только для определения состояния таблицы на момент поиска (а не как подмножество записей).
fpSave
должен содержать адрес БДС, предназначенного для приема результатов поиска. В этом БДС будет сохранено найденное подмножество записей, удовлетворяющих условию поиска и параметры, характеризующие состояние таблицы на момент поиска (ее "снимок"). Если первый параметр отличен от NULL, "снимок" копируется оттуда
hTable
задает обработчик таблицы, записи которой ищутся. Обработчик возвращается функцией htTableOpen() при открытии таблицы
nElementNum
задает номер элемента записи, значения которого сравниваются с пороговыми. Нумерация элементов в записи сквозная, начинается с 1 и включает не только поля, но также группы и подстроки Номер 0 отводится для выборки записей в физической последовательности. При этом в качестве порогового значения нужно указать длинное целое, содержащее нужный физический номер
nCond
определяет условие поиска и должен содержать одну из констант CONDITION
fpValue1
задает адрес первого порогового значения для элемента. Для символьных элементов пороговое значение должно быть массивом символов заданной длины или C-строкой. Поисковое предписание следует дополнить пробелами справа до достижения длины элемента или вставить '\0' после значимой части. C-строки автоматически дополняются пробелами справа до достижения заданной длины элемента. При поиске по критерию пользователя этот параметр должен содержать адрес call-back функции типа CFUNC.
fpValue2
обязателен лишь для условий, требующих наличия двух пороговых значений (помечены цифрой '2'). Если параметр не нужен, он может принимать значение NULL. Для символьных элементов пороговое значение также должно быть массивом символов или C-строкой. При поиске по критерию пользователя этот параметр может содержать параметр для call-back функции

Результат:

адрес БДС, заданного в качестве второго параметра в случае успешного завершения
NULL в противном случае (поле fpSave->nRetCode будет содержать код ошибки)

Пример 1.

Найти записи, где "зарплата" равна 40000. Поиск первый (или единственный).

typedef struct tagREC { /* Структура записи таблицы */
 	char name[10];
	 char sex;
	 unsigned fee;
} REC;
unsigned fee40 = 40000;
SAB sSearch;
THANDLE hTable;
 . . .
if( !htSearch( NULL, &sSearch, hTable, 3, EQUAL, &fee40, NULL ) )
	printf( "Ошибка поиска: %s\n", htMessage(sSearch.nRetCode) );
else 
	printf( "Найдено %ld записей\n", sSearch.gFoundCnt );
 . . .

Пример 2.

Найти записи, с физическими номерами от 100 до 10000. Поиск ведется для "снимка" от первого примера.

{
long gBeg = 100L;
long gEnd = 10000L;
SAB sSearch2;
if( !htSearch( &sSearch, &sSearch2, hTable, 0, IN_RANGE, &gBeg, &gEnd ) )
	 printf( "Ошибка поиска 2: %s\n", htMessage(sSearch2.nRetCode) );
else 
	printf( "Найдено %ld записей\n", sSearch2.gFoundCnt );
}

Пример 3.

Найти записи, где "фамилия" начинается на "АБ" или на "АВ". Поиск ведется для "снимка" от первого примера.

{
	SAB sSearch3;
	if( !htSearch( &sSearch, &sSearch3, hTable, 1, WILDCARD, "АБ*|АВ*", NULL ) )
		printf( "Ошибка поиска 3: %s\n", htMessage(sSearch3.nRetCode) );
	else 
		printf( "Найдено %ld записей\n", sSearch3.gFoundCnt );
}