Rambler's Top100

(c)2009-2017 openinfotech.ru

СУБД HyTech

Документация
Функция htTablesJoin - Слияние двух таблиц через общий элемент

htTablesJoin - Слияние двух таблиц через общий элемент

Назначение:

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

Функция может быть использована для связи таблицы с самой собой. В этом случае лучше дублировать обработчик таблицы (функция htDupTableHandle).

Полученная в результате выполнения функции связка двух таблиц будет направленной. То есть, связка A-B отличается от связки B-A (это важно при вызове функции htTablesLink). Эта направленность определяется заданием параметров и сохраняется в БДС. В то же время, расположение связываемых таблиц в результирующей записи определяется соображениями эффективности выполнения операции и может отличаться от порядка задания таблиц и направленности связки. Для определения порядка расположения таблиц в результирующей записи следует использовать функцию htTellJoinOrder.

Прототип:

 LPSAB HTAPI htTablesJoin(
	LPSAB fpDst,	 /* Для приема результата */
	LPSAB fpFRST,	 /* Условие для первой таблицы */
	int nFiElNo,     /* Номер элемента-связки в первой таблице */
	CONDITION nCond, /* Тип слияния (пока только EQUAL) */
	LPSAB fpSCND,	 /* Условие для второй таблицы */
	int nScElNo,     /* Номер элемента-связки во второй таблице */
	LPSAB fpCOND,	 /* Для отбора записей одной из таблиц */
	int nFirst,      /* !=0 отбор записей из первой таблицы */
	int	nMode    /* Режим отбора неполных пар */
 );

Параметры

fpDst
задает адрес БДС, предназначенного для приема результата слияния
fpFRST
задает адрес БДС, содержащего некоторое множество записей первой таблицы
nFiElNo
задает номер элемента (поля, группы или подстроки) в первой таблице, используемого при слиянии таблиц
nCond
задает соответствие значений элемента-связки в таблицах. В данной версии поддерживается лишь связь "по-равно". То есть составляются пары запись-запись, для которых значения элемента-связки равно в обеих записях.
fpSCND
задает адрес БДС, содержащего некоторое множество записей второй таблицы
nScElNo
задает номер элемента во второй таблице, используемого при слиянии таблиц
fpCOND
может задавать адрес БДС, предназначенного для хранения списка записей, попавших в слияние. После выполнения операции этот БДС будет содержать подмножество записей, попавших в результирующее слияние. Так как в процессе установления соответствия выполняется проверка соотношения значений элемента-связки, то размерность подмножеств записей каждой из таблиц, попавших в результат, может отличаться от исходных подмножеств. Задействованные записи могут собираться для любой из исходных таблиц. Если сбор записей не нужен, параметр должен быть равен NULL
nFirst
имеет смысл при отличном от NULL параметре fpCOND и задает таблицу, записи который будут собираться. Если параметр отличен от 0 будут собираться записи первой таблицы, иначе - второй
nMode
задает режим отбора неполных пар. Он может принимать значения DRAFT_MODE

Результат:

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

Пример.

Построить "обобщенную" таблицу для больных мужчин из Казахстана. Сбор записей, попавших в слияние, не нужен.

 typedef struct tagREPUBLIC { /* Структура записи таблицы республик */
     char code; /* Поле-связка */
     char name[30];
 } REPUBLIC;
 typedef struct tagCLIENT { /* Структура записи таблицы больных */
     char name[15];
     char address[50];
     char sex;
     char code; /* Поле-связка */
 } CLIENT;
 SAB sCode;
 SAB sMen;
 SAB sTmp;
 THANDLE hClient;
 THANDLE hRepub;
 . . .
 /* Код республики по названию */
 if( !htSearch( NULL, &sCode, hRepub, 2, EQUAL, "КАЗАХСТАН", NULL ) )
 /* Обработка ошибок */
 . . .
 /* Мужчины-больные */
 if( !htSearch( NULL, &sMen, hClient, 3, EQUAL, "M", NULL ) )
 /* Обработка ошибок */
 . . .
 /* Больные мужчины из Казахстана */
 if( !htTablesJoin( &sTmp, &sCode, 1, EQUAL, &sMen, 4, NULL, 0 ) )
 /* Обработка ошибок */
 else
 /* Найдено sTmp.gFoundCnt больных */

Больных мужчин из Казахстана можно было бы найти, используя функции htValuesOfKey, htTransferToTable, htRecordsByKey и htAndResults. Но для формирования обобщенной таблицы, например, при выводе на экран, пришлось бы (в общем случае) выполнять поиск названия республики по ее коду для каждой записи, описывающей больного, что потребовало бы значительных временных затрат.