Rambler's Top100

(c)2009-2017 openinfotech.ru

СУБД HyTech

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

htDivision - Выполнить деление списков значений

Назначение:

Функция реализует реляционную операцию деления (импликацию). Позволяет получить список значений одного элемента записи (частного) через список значений другого (делителя).

Физический смысл деления удобно представить на примере. Пусть имеется таблица <поставщики:детали> и задан некоторый список деталей. Нужно найти список поставщиков, поставляющих ВСЕ детали из данного списка.

Делимое - отношение <поставщики:детали>, делитель - список деталей, а частное - искомый список поставщиков.

Прототип:

 LPSAB HTAPI htDivision(
	LPSAB 	fpDst,  	/* Для приема результата */
	LPSAB 	fpSET,  	/* Множество записей делимого */
	int   	nKeyNo, 	/* Номер поля частного */
	LPSAB 	fpList  	/* Список значений делителя */
 );

Параметры

fpDst
должен содержать адрес БДС, предназначенного для хранения списка значений частного.
fpSET
задает подмножество записей таблицы (адрес БДС), задающее просматриваемое отношение (делимое)
nKeyNo
задает номер элемента, значения которого будут получены в качестве частного от деления. Нумерация элементов в записи начинается с единицы
fpList
задает адрес БДС, содержащего список значений делителя

Результат:

адрес БДС, заданного в качестве первого параметра при успешном завершении
NULL в случае ошибки. Код ошибки будет содержаться в поле fpDst->nRetCod

Пример.

Найти поставщиков, поставляющих те же детали, что и заданный поставщик (Dana). Проверка кодов завершения опущена для простоты.

typedef struct tagREC { /* Структура записи таблицы */
	char firm[10];
	char part[10];
} REC;
int rc;
SAB sAll;
SAB sDana;
SAB sFirm;
SAB sPart;
THANDLE hTable;
 . . .
/* Детали, поставляемые заданным поставщиком Dana */
htSearch( NULL, &sDana, hTable, 1, EQUAL, "Dana", NULL );
htValuesOfKey( &sPart, 2, &sDana );
 . . .
/* Нужны все записи таблицы */
htSearch( &sDana, &sAll, hTable, 0, GREAT, "\0\0\0", NULL );
 . . .
/* Список искомых поставщиков (включая заданного) */
htDivision( &sFirm, &sAll, 1, &sPart );