О связывании таблиц в Foxpro

Связать таблицы в Foxpro очень просто, но такая возможность должна быть заранее предусмотрена. Делается это так:

В первой таблице создается служебное поле, в которое заносится некое абстрактное значение, чаще всего номер. Главное требование к нему - он должен быть абсолютно уникален. Поэтому Фокс не имеет таких средств - не хотят разработчики брать на себя столь высокую ответственность. Разработать алгоритм, гарантирующий уникальность кода - дело программиста. В простейшем случае это обычный счетчик - ищем максимальный номер, увеличиваем его на единицу, и радуемся. Если с программой работают две девушки, печатающие одним пальцем. А если в системе триста тысяч абонентов, система сбойнет через минуту. И миллионов сто-двести уйдут не на тот счет. Что тогда сделают с умненьким программистом?

Со второй таблицей проще. Там есть аналогичное поле, которое содержит тот же код (в простейшем случае - номер), взятый из первой таблицы. Там уникальности никакой нет - если человек предъявил три документа, будет три записи с этим кодом. Главное, что требуется - четко связать одну запись из первой таблицы с этими самыми тремя - из второй. Такая связь называется один-ко-многим.

Для такой цели нужен именно абстрактный номер, или код. Фамилия+Имя+Отчество не годится - во-первых длинно, а во-вторых девушки любят менять фамилию. Номер паспорта тоже не годится - его меняют еще чаще. ИНН неплох, но его можно узнать далеко не всегда. Прикиньте - вы пришли в библиотеку, а с вас ИНН спрашивают! Так не бывает.

А просто номер могут "захотеть" увеличить на единицу сразу несколько человек, работающих в сети. И "случайное" число тут не годится - числа могут так же "случайно" и совпасть. Очень даже могут, если пользователей много, поскольку для их генерации используется таймер компьютера, а время у всех одно и то же.

Однако, радуйтесь!

Все это - тонкости высшего порядка, о которых нужно знать, но на которые можно и наплевать. С нашей программой миллиард китайцев работать не будет, это точно. И все, что от нас требуется - обеспечить два одинаковых поля в двух таблицах. Что мы и делаем, введя в обе поле "kod" одинаковой длинны. Символьный, поскольку будем немного изощряться.

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

Сугубо факультативно (на данный момент)

Для связывания таблиц в Foxpro служит команда set rela, или конструктор среды данных. Сначала устанавливается связь одна-к-одной, а следующей командой - "одна-ко-многим". Есть несколько вариантов установления связей, но все они тормозят компьютер жутко. На вашей тестовой базе это может быть незаметно, а на реальной базе клиент вас проклянет. Если кому интересно, загляните на статмед.ру, там я сравниваю две программы "Поликлиника" фирм "Грит" и "АММ". Обе, оракловские, и делают одно и то же. Но работают по разному, очень по разному. "Грит" по функционалу в данный момент на полкорпуса впереди, но выборку их программа делает - состаришься, пока ждешь. Так и не решил, кто же лучше.

Теперь проиндексируем таблицы

 
К оглавлениюк следующей статье