Rambler's Top100

(c)2009-2017 openinfotech.ru

СУБД HyTech

Документация
Функция htTablesLink - Объединение/слияние нескольких связанных таблиц

htTablesLink - Объединение/слияние нескольких связанных таблиц

Назначение:

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

Характер связи исходных групп таблиц (произведение или сумма) определяется порядком разбиения группы таблиц на пары (для операции htTablesJoin) и направленностью каждой пары таблиц. Порядок расположения таблиц в результирующей группе может отличаться от порядка параметров при вызове функции и должен быть определен при помощи функции htTellJoinOrder.

Тип связи групп таблиц определяется следующим образом:

  • просматриваеся список таблиц, входящих в группу fpGroup (например, 2-3-4);
  • первый член пары (например, 2 в паре 2-5) ищется в группе (2-3-4);

Таблицы суммируются, если:

  • первый член пары найден НЕ в последнем элементе группы И
  • второй член пары в группе не найден вовсе.

Во всех остальных случаях, кроме ошибки связи (например, группа 2-3-4 и пара 5-6), получим произведение. Можно также принудительно заказать получение произведения, установив флаг LINK_MULT в пятом параметре функции.

Прототип:

 LPSAB HTAPI htTablesLink(
	LPSAB fpRes, /* Для приема результата */
	LPSAB fpGroup, /* Группа связанных таблиц */
	LPSAB fpPair, /* Пара связанных таблиц */
	int nSkipLink,/* !=0 опустить таблицу-связку */
	int nMode /* Режим отбора неполных групп и слияния */
 );

Параметры

fpRes
задает адрес БДС, предназначенного для приема результата слияния
fpGroup
задает адрес БДС, содержащего результаты связи некоторого числа таблиц (результаты htTablesJoin или htTablesLink).
fpPair
задает адрес БДС, содержащего результаты связи ДВУХ таблиц (результаты htTablesJoin).
nSkipLink
определяет необходимость вывода в результирующее соответствие номеров записей таблицы, являющейся связующей для двух групп. Если значение параметра отлично от нуля, таблица-связка опускается. Например, при связи двух пар таблиц без вывода таблицы связки, выходная группа будет содержать две, а не три таблицы.
nMode
задает режим работы. Он может принимать значения LINK_???? и DRAFT_???? Константы LINK_???? и DRAFT_???? могут комбинироваться при помощи операции | (ИЛИ).

Результат:

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

Пример.

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

 typedef struct tagREPUBLIC { /* Структура записи таблицы республик */
     char code; /* Поле-связка с таблицей CLIENT */
     char name[30];
 } REPUBLIC;
 typedef struct tagROOM { /* Структура записи таблицы кабинетов */
     int room; /* Поле-связка с таблицей CLIENT */
     int floor;
 } ROOM;
 typedef struct tagCLIENT { /* Структура записи таблицы больных */
     char name[15];
     char address[50];
     char sex;
     char code; /* Поле-связка с таблицей REPUBLIC */
 int room; /* Поле-связка с таблицей ROOM */
 } CLIENT;
 SAB sCode;
 SAB sMen;
 SAB sRoom;
 SAB sTmp1;
 SAB sTmp2;
 SAB sRes;
 THANDLE hClient;
 THANDLE hRepub;
 THANDLE hRoom;
 . . .
 /* Код республики по названию */
 htSearch( NULL, &sCode, hRepub, 2, EQUAL, "КАЗАХСТАН", NULL );
 . . .
 /* Мужчины-больные */
 htSearch( NULL, &sMen, hClient, 3, EQUAL, "M", NULL );
 . . .
 /* Кабинеты второго этажа */
 htSearch( NULL, &sRoom, hRoom, 2, EQUAL, "\2", NULL );
 . . .
 /* Больные мужчины из Казахстана */
 htTablesJoin( &sTmp1, &sCode, 1, EQUAL, &sMen, 4, NULL, 0 );
 . . .
 /* Больные мужчины, посещающие кабинеты второго этажа */
 htTablesJoin( &sTmp2, &sMen, 5, EQUAL, &sRoom, 1, NULL, 0 );
 . . .
 /* Искомая связь таблиц */
 htTablesLink( &sRes, &sTmp1, &sTmp2, 0 );
 . . .
 /* Найдено sRes.gFoundCnt больных */