join.prg* Постоянное соединение таблиц clear CLOSE TABLES all USE poski If file ("posk_nov.dbf") Delete file("posk_nov.dbf") endif COPY fields nomp, nomd, nomr, kolw, data TO posk_nov USE detl If file ("det_nov.dbf") DELETE file ("det_nov.dbf") endif COPY fields nomd, naim, cwet, vesd, cena TO det_nov SELECT 1 &&Выбор РОП1 USE det_nov&& Помещаем detl_nov в РОП1 BROWSE SELECT 2 &&Выбор РОП2 USE posk_nov && Помещаем posk_nov в РОП2 BROWSE IF FILE("soed.dbf") && Если файл существует то удалить его delete FILE("soed.dbf") endif join with a to soed for a.nomd=b.nomd; &&соединить с РОП1 файл posk_nov по равенству a.nomd=b.nomd fields a.nomd,a.naim,nomr,kolw,data &&В выходной файл soed включить поля из РОП1 a.nomd,a.naim, &&из РОП2 включить поля nomr,kolw,data. Номер своего РОПа по умолчанию не указывается USE soed &&активизируем ТБД soed BROWSE &&Просмотр ТБД soed WAIT SELECT 2 &&Выбор РОП2 USE soed &&soed помещается в РОП2 browse IF FILE("soed312.dbf") && Если файл существует то удалить его delete FILE("soed312.dbf") endif join with a to soed312 for a.nomd=b.nomd; fields nomd,naim,nomr,kolw,data,a.cena &&соединение ТБД РОП1 с ТБД РОП2 USE soed312 BROWSE WAIT IF FILE("soed312_i.idx") && Если файл существует, то удалить его delete FILE("soed312_i.idx") endif INDEX on nomd+DTOC(data) TO soed312_i compact &&индексация ТБД soed1 по составному выражению && nomd + DTOC(data)для получения выходного файла soed312_i USE soed312 INDEX soed312_i.idx && активизируем индексный файл soed312_i
browse clear return
6.2 Создание временных связей между таблицами Можно создать временное соединение таблиц, используя РОПы. На экран выводится результат индексации сначала по номеру поставщика, затем по номеру детали. Далее на дисплей выводится таблица, в которой поля проиндексированы по номеру поставщика, затем по номеру детали и добавлено еще одно вычисляемое поле proizv, которое рассчитывается как произведение поля kolw из таблицы poski и поля cena из таблицы detl. Необходимо отметить, что такое вычисление возможно благодаря временному соединению таблиц. Далее на экран выводится сумма произведения цены на количество, количество записей и средняя величина. Затем происходит закрытие временного соединения таблиц и разрушение связи между ними.
*Файл связь. Временное соединение таблиц в ОП. ? "Временное соединение таблиц в ОП" CLEAR CLOSE TABLES ALL SET TALK OFF &&Выключить разговоры системы по перезаписи USE poski EXCLUSIVE INDEX ON nomp+nomd TO pd_i COMPACT &&Индексация по составному ключу SELECT b &&Выбор РОП2 USE poshk EXCLUSIVE INDEX ON nomp TO poshk_i COMPACT &&Индексация по nomp SELECT c &&Выбор РОП3 USE detl EXCLUSIVE INDEX ON nomd TO detl_i COMPACT &&Индексация по nomd SELECT a &&Выбор РОП1 USE poski INDEX pd_i &&Вызов файла poski с его индексом pd_i SELECT b &&Выбор РОП2 USE poshk INDEX poshk_i &&Вызов файла poshk с его индексом poshk_i SELECT c &&Выбор РОП3 USE detl INDEX detl_i &&Вызов файла detl с его индексом detl_i SELECT a &&Выбор РОП1 SET RELATION TO nomp into b &&Соединение РОП1 с РОП2 по полю nomp с сохранением результата в РОП1 BROWSE FIELDS; &&Просмотр полей сцепленных РОПов poshk.nomp,; poshk.famp SET RELATION TO nomd INTO c ADDITIVE &&Соединение промежуточного файла с РОП3 по полю nomd с сохранением результата в РОП1 BROWSE FIELDS; detl.nomd,; detl.cena SET SKIP TO b,c &&Сделать просмотр записей в РОП3 SELECT a &&Выбор РОП1 BROWSE FIELDS; &&Просмотр полей сцепленных РОПов poshk.nomp,; poshk.famp,; detl.nomd,; detl.cena,; poski.kolw,; poski.data,; poski.proizv=poski.kolw*detl.cena; &&Построчное умножение значения поля kolw файла poski на значение поля cena файла detl TITLE "Поставщики" &&Установка заголовка таблицы SUM (poski.kolw*detl.cena) TO itog &&Суммирование произведений значений поля kolw файла poski &&на поле cena файла detl с сохранением результата в переменной памяти itog ? "Итог=",itog &&Вывод на экран itog COUNT TO lnb &&Подсчёт числа записей в переменной памяти b ? "Число записей ", lnb &&Вывод числа записей ? "Средняя величина ", itog/lnb &&Вывод результата расчёта значения среднего произведения SET RELATION TO &&Закрытие всех созданных связей WAIT CLEAR RETURN Мы видим, что в программе можно создавать вычисляемые поля непосредственно через программный код, а не создавать поля вручную, через структуру таблицы.
Контрольный вопрос: в чем состоит преимущество использования временных связей между таблицами по сравнению с использованием постоянных связей между ними?
|