|
|
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
Предыстория вопроса упирается в буфферизацию записей. Я поискал на форуме сообщения по этой теме. Кое-что понял, кое-чего нет. Поработал со справкой. Однако неясности реализации сохранились. Хотелось бы понять общий приницип работы и четко понимать что и как должно быть сделано для реализации собственной задачи. Задача. Предположим, что есть форма Итоги сессии , где в качестве источника данных используется соответствующая таблица - exams с полями FIO, Predmet и Ozenka. На форме Итоги сессии размещен grid с соответствующими полями FIO, Predmet и Ozenka. Для добавления новых записей и редактирования имеющихся решено использовать дополнительную форму Экзамен , которой размещены три поля FIO, Predmet и Ozenka (пока не усложняю задачу фио, предмет и оценка вводятся ручками, но лучше если бы фио и предмет были полями типа combobox, где в качестве источника служат таблицы Студенты и Предметы). На форме Итоги сессии размещены две кнопки Добавить и Редактировать. В форме Итоги сессии выбираем какую-либо запись и нажимаем кнопку Редактировать. При нажатии кнопки Редактировать открывается форма Экзамен с параметром Е. При открытии формы Экзамен проверяется значение переданного параметра и форма Экзамен открывается с данными текущей записи формы Итоги сессии . В случае, если нажата кнопка Добавить выполняется после открытия формы Экзамен добавляется новая запись. После внесения изменений в форму Экзамен нажимаем кнопку Сохранить и в форме Итоги сессии должна появится введенная запись или изменения, сделанные при редактировании текущей. При этом если никаких изменений сделано не было, либо при создании новой записи в нее не внесены какие-либо данные изменения не производятся. В настоящий момент я делаю так. В форме Итоги сессии событие Activate: ThisForm.Grid1.Refresh событие Load: CURSORSETPROP ("Buffering", 3,"exams") В форме Экзамен событие Init Код: plaintext 1. 2. 3. 4. 5. 6. событие Load Код: plaintext 1. 2. кнопка выхода Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. кнопка сохранить Код: plaintext кнопка удалить Код: plaintext 1. 2. 3. В файле запуска установлен параметр SET MULTILOCKS ON Все в общем работает. Хотя созадаются пустые записи и т.п. Сделано все по некотрому примеру. Но понять почему что-то из этого используется данном случае так как используется невсегда понимаю. Прошу объяснить реализацию данной задачи, указать скажем так некий стандартный путь. Просьба учесть возможность использования на форме Экзамен 2-х полей combobox, использующие данные о студентах и предметах из двух других таблиц. Заренее всем благодарен за ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2006, 16:23 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
Логика работы и написания кода зависит от принятой идеологии построения приложения. Приведенный пример основан на одной из многих идеологий работы. В данном случае - процедурной идеологии. Процедурный подход подкупает своей простотой. Это "линейный" алгоритм. В данном случае подчиненная форма обязательно должна быть модальной (WindowType = 1 - Modal) и работать в той же DataSession, что и главная (DataSession = 1 - Default Data Session). По сути, происходит работа как бы с одной формой, "фрагмент" которой оформляется как другая форма. Что такое буферизация смотри во вложенном файле. Общая логика данного примера такова: в главной форме накладывается буферизация на таблицу-источник, а в подчиненной форме происходит модификация этого буфера с последующим его сбросом (по команде TableUpdate()). В подчиненной форме можешь использовать сколько угодно ComboBox. Единственное ограничение - при строковой буферизации (CURSORSETPROP ("Buffering", 3,"exams")) нельзя перемещать указатель записи в таблице exams до завершении редактирования, поскольку это приведет к автоматическому сбросу буфера. В принципе, в данном примере кое чего не хватает, а кое-что лишнее. Но вообще-то, прежде чем что-то писать дальше хотелось бы уточнить в какой идеологии предполагается работать. Идеология процедурного программирования - подчиненная форма модальная. Пока не закончишь в ней работать и не закроешь ее не можешь ни вернуться к исходной форме, ни вызвать другие формы (не связанные с редактированием) Идеология объектного программирования - форма для редактирования - самодостаточна. Факт изменения в ней данных напрямую не зависит от факта открытия/закрытия других форм. Допустимо переключаться в любую другую форму в любой момент времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2006, 22:52 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
ВладимирМ В принципе, в данном примере кое чего не хватает, а кое-что лишнее. Но вообще-то, прежде чем что-то писать дальше хотелось бы уточнить в какой идеологии предполагается работать. Идеология процедурного программирования - подчиненная форма модальная. Пока не закончишь в ней работать и не закроешь ее не можешь ни вернуться к исходной форме, ни вызвать другие формы (не связанные с редактированием) Идеология объектного программирования - форма для редактирования - самодостаточна. Факт изменения в ней данных напрямую не зависит от факта открытия/закрытия других форм. Допустимо переключаться в любую другую форму в любой момент времени. Спасибо за ответ и вложенный файл. Понятие буфферизации или, как ты образно именуешь ее -"калька", вполне понятно. тут складывается смешная ситуация - когда все компоненты задачи сами по себе понятны, но при сложении возникают либо ошибки, либо просто непонимание того, что сделано. Сразу оговорюсь, я большой новичок в FoxPro, но не новичок в ООП и БД вообще. Есть опыт создания приложений в Access, Delphi, php Необходимость изучения FoxPro продиктована профессиональной деятельностью. Когда я работал в Access я скорее выполнял идеологию объектную. Во-первых я работаю с рекордсетами, а не таблицами напрямую. Потом после проверки на валидность либо использую sql запросы на изменения данных, либо методы объекта рекордсет. При этом я при открытии формы редактирования из "главной" я передаю флаг открытия через глобальную переменую, а в форме редактирования проверяю этот флаг и формирую логику загрузки формы (обычно запрещаю открытие формы если флаг отсутствует). После внесения изменений я закрываю форму, выполняю апдейт таблицы, передаю управление главной форме, в которой выполняю перезапрос источника данных. Как я понимаю такую же конструкцию можно реализовать и в FoxPro. Но вероятно это не оптимальный путь. Потому и хотелось бы посмотреть как это делается - минимальный набор команд, реализующий задачу. Неплохо бы посмотреть оба варианта, или идеологии. Начать с простого, а потом опытным путем пойти к сложному. Буду весьма признателен, Владимир, за оба примера реализации:-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2006, 14:56 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
ВладимирМ В принципе, в данном примере кое чего не хватает, а кое-что лишнее. Но вообще-то, прежде чем что-то писать дальше хотелось бы уточнить в какой идеологии предполагается работать. Идеология процедурного программирования - подчиненная форма модальная. Пока не закончишь в ней работать и не закроешь ее не можешь ни вернуться к исходной форме, ни вызвать другие формы (не связанные с редактированием) Идеология объектного программирования - форма для редактирования - самодостаточна. Факт изменения в ней данных напрямую не зависит от факта открытия/закрытия других форм. Допустимо переключаться в любую другую форму в любой момент времени. Спасибо за ответ и вложенный файл. Понятие буфферизации или, как ты образно именуешь ее -"калька", вполне понятно. тут складывается смешная ситуация - когда все компоненты задачи сами по себе понятны, но при сложении возникают либо ошибки, либо просто непонимание того, что сделано. Сразу оговорюсь, я большой новичок в FoxPro, но не новичок в ООП и БД вообще. Есть опыт создания приложений в Access, Delphi, php Необходимость изучения FoxPro продиктована профессиональной деятельностью. Когда я работал в Access я скорее выполнял идеологию объектную. Во-первых я работаю с рекордсетами, а не таблицами напрямую. Потом после проверки на валидность либо использую sql запросы на изменения данных, либо методы объекта рекордсет. При этом я при открытии формы редактирования из "главной" я передаю флаг открытия через глобальную переменую, а в форме редактирования проверяю этот флаг и формирую логику загрузки формы (обычно запрещаю открытие формы если флаг отсутствует). После внесения изменений я закрываю форму, выполняю апдейт таблицы, передаю управление главной форме, в которой выполняю перезапрос источника данных. Как я понимаю такую же конструкцию можно реализовать и в FoxPro. Но вероятно это не оптимальный путь. Потому и хотелось бы посмотреть как это делается - минимальный набор команд, реализующий задачу. Неплохо бы посмотреть оба варианта, или идеологии. Начать с простого, а потом опытным путем пойти к сложному. Буду весьма признателен, Владимир, за оба примера реализации:-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2006, 15:12 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
То что ты описал, это нечто среднее между объектным и процедурным подходом. Причем ближе к процедурному. К сожалению (а может, к счастью), "стандартного" варианта не существует. Впрочем, кое что общее есть. Чуть позже попробую описать. Иногда и работать надо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2006, 15:50 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
ВладимирМТо что ты описал, это нечто среднее между объектным и процедурным подходом. Причем ближе к процедурному. Век живи век учись. Значит я не знал более эффективных способов. Тем более будет все это полезно. Я набрасаю маленький проектик, чтобы как говорится не с нуля. Правда там что-то не работает открытие формы в режиме редактирования, поскольку я использую вероятно нововедение - комбобоксы, отсюда и раотает не так. Хотя почему-то и оценка не меняется... ВладимирМ К сожалению (а может, к счастью), "стандартного" варианта не существует. Впрочем, кое что общее есть. Чуть позже попробую описать. Иногда и работать надо Согласен. Ответы на форумах занимают массу времени. работа превращается просто в хобби :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2006, 17:33 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
Посмотри вложенный файл. Запуск через главный стартовый файл exams.prg Там все достаточно примитивно сделано. Самый простой вариант. Все написано на VFP6SP5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2006, 23:05 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
ВладимирМПосмотри вложенный файл. Запуск через главный стартовый файл exams.prg Там все достаточно примитивно сделано. Самый простой вариант. Все написано на VFP6SP5 Мучас грасисас, грандэ сеньоро! Покрытил посмотрел. Очень интересно. Я постараюсь описать общий подход и опубликую. А ты посмотришь верно и все понял? Единственно, что не работет добавления новой записи. Вернее не работала сначала. А потом я решил проверить кое-что, перезапустил фокс и все стало работать:-)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2006, 11:15 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
Владимир. Изучаю пример. Не совсем все понимаю. Как я понял, особое место играет хранимая процедура newid. Она запоминает старый установленный id в таблице tablists и определяет новый id. Это ее главная и единственная задача кажется? Далее прости за глупый вопрос, но не нашел ответа. Ты во многих местах используешь записи такого характера m.ИмяПеременной, а что такое m. Вероятно какая-то принятая запись ссылки, но на что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2006, 19:58 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
Что означает префикс (буква) "m." перед именем Цель процедуры NewId - это генерация автоинкремента. Она запоминает последний использованный номер и при создании новой записи автоматически формирует новое значение ключевого поля. Вовсе не обязательно, что последний использованный номер в настояще время реально существует. Последний использованный, разумеется не самой таблицей TabLists (это всего-лишь хранилище), а той таблицей, для которой и происходит генерация нового значения ключевого поля. Посмотри структуру твоих таблиц. Я во ВСЕ таблицы добавил новое ключевое поле, в свойстве Default которого происходит вызов хранимой процедуры NewId(). Значение по умолчанию (Default) Ключевое поле играет особую роль при организации ссылочной целостности данных. Ключевое поле Начиная с версии VFP8 был введен новый тип данных Integer-Autoincrement. Точнее, это конечно не тип данных, а некое дополнительное ограничение, накладываемое на тип данных Integer. Так вот, это тип данных как раз и выполняет ту же функцию, но другими средствами. AutoIncrement ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2006, 22:31 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
Спасибо, Владимир, за столь исчерпывающий ответ. Что касается префикса m, это действительно открытие для меня. Поскольку в справке почитать об этом не удалось. Вероятно, это документировано, но правильно задать вопрос справочной системе мне не удавалось. Теперь все становится ясным. Насчет действия хранимой процедуры, назначения значений по умолчанию, понятия ключевого и индексированного поля, инкрементность значений поля - все это мне знакомо. К сожалению, раньше не было опыта использования хранимых процедур. Хотя есть понимание их назначения и методологии использования. Действительно, я увидел , что ты основательно поработал над моей схемой БД. Правда я сознательно шел на отказ от модели, основанной на суррогатных ключах. Понятное дело, что среди студентов вполне возможны однофамильцы и даже полные тезки. Однако для упрощения конструкции определяется бизнес-правило, что ФИО уникально в пределах данной БД. Вопрос в том, можно ли (я это естественно возможно, поскольку мой вариант хотя и примитивен, но более или менее работает) реализовать тот же механизм взаимодействия форм, но без использования суррогатных ключей. Вероятно я бы просто сделал динамический источник данных. В виде курсора - куда направляется результат выполнения запроса. Но такой подход скорее процедурный. насколько я понял, твоя реализация тоже частично процедурная,частично основанная на ХП. А какова реализация объектной идеологии? Создание некоего управляющего класса, который берет на себя "разруливание" ситуации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 11:04 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
criptonПравда я сознательно шел на отказ от модели, основанной на суррогатных ключах. Понятное дело, что среди студентов вполне возможны однофамильцы и даже полные тезки. Однако для упрощения конструкции определяется бизнес-правило, что ФИО уникально в пределах данной БД. Зря. Суррогатный ключ незначительно усложняет структуру базы данных, но значительно упрощает сопровождение и модификацию базы данных. А также поддержание ссылочной целостности. Примеров проблем при использовании в качестве ключа ФИО - "вагон и маленькая тележка". Начиная от однофамильцев и кончая удалением и вставкой одной и той же фамилии. criptonВопрос в том, можно ли (я это естественно возможно, поскольку мой вариант хотя и примитивен, но более или менее работает) реализовать тот же механизм взаимодействия форм, но без использования суррогатных ключей. Разумеется можно. Если посмотреть на схему работы, то я передаю в качестве параметра в подчиненную форму код записи с которой предполагается работать. Далее, опираясь на этот код записи можно выполнить модификацию в родительской форме. Собственно, нужен всего-лишь этот самый "код записи". Т.е. поле или набор полей по значению которого можно однозначно идентифицировать запись. criptonнасколько я понял, твоя реализация тоже частично процедурная,частично основанная на ХП. А какова реализация объектной идеологии? Создание некоего управляющего класса, который берет на себя "разруливание" ситуации? В целом, именно так. Только цель этого управляющего класса несколько иная. Подчиненная форма уже независима. Ей вобщем-то, все-равно, будет открыта родительская форма или нет. Она получила входной параметр - код записи. Вот эту запись она и обрабатывает. В родительской форме необходимо просто сделать обновление картинки по факту модификации в подчиненной форме. Сейчас это сделано "процедурным" способом. Просто ждем окончания работы подчиненной формы. "Объектный" способ заключается в том, что факт закрытия подчиненной формы должен автоматические инициировать обновление всех открытых форм так или иначе связанных с модифицируемой информацией. Вот задача класса-посредника как раз и заключается в том, чтобы получить сигнал от подчиненной формы о том, что надо обновить информацию. Определить список форм, где это надо сделать и запустить в этих формах процесс обновления. Другими словами, "объектный" подход - это управление через события (выполнить действие при наступлении события), а процедурный - через последовательность (выполнить действие после очередной команды). На самом деле, "в чистом виде" "объектный" подход реализовать невозможно. Всегда будет некое "смешение" стилей. Просто нужно, по возможности, избегать модальных форм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2006, 14:46 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
Владимир, спасибо за ответ. Из тебя выйдет неплохой преподаватель. Объясняешь все четко, лаконично и по существу. А может ты и работаешь им? :-) ВладимирМЗря. Суррогатный ключ незначительно усложняет структуру базы данных, но значительно упрощает сопровождение и модификацию базы данных. А также поддержание ссылочной целостности. Я объясню. Дело в том, что этот пример взят из одной книги как учебный. Обычно я в своих проектах использую модель данных, основанную на суррогатных ключах. Так действительно проще управлять, и ФИо в качестве ключа ужасное решение, как и любое ключевое поля представляющее собой текстовое поле с несколькими словами. Но как говорится пример есть, слов из песни не выкинешь. Правда с суррогатными ключами тоже возможны проблемки. В следствие уникальности записи с суррогатным ключем (если оно автоинкрементно) есть опасность ввода вторичной записи с подобными данными. Правда, это от лукавого:-) ВладимирМ Подчиненная форма уже независима. Ей вобщем-то, все-равно, будет открыта родительская форма или нет. Она получила входной параметр - код записи. Вот эту запись она и обрабатывает. В родительской форме необходимо просто сделать обновление картинки по факту модификации в подчиненной форме. Сейчас это сделано "процедурным" способом. Просто ждем окончания работы подчиненной формы. Вот здесь немного не догнал. В твоем коде вроде нигде явно не указывается тип буфферизации, тем неменее все работает. Как такое получается и почему? :-) Сорри если вопрос глупый... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2006, 16:28 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
авторПравда с суррогатными ключами тоже возможны проблемки. В следствие уникальности записи с суррогатным ключем (если оно автоинкрементно) есть опасность ввода вторичной записи с подобными данными. А вот об этом недавно напоминал один уважаемый товарищ. О том что вводя суррогатный ключ, про естественный ключ не следует забывать, и наложить на него индекс типа Candidate (возможно с фильтром NOT DELETED()). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2006, 16:57 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
criptonВот здесь немного не догнал. В твоем коде вроде нигде явно не указывается тип буфферизации, тем неменее все работает. Как такое получается и почему? :-) Указывается. Причем именно явно. Это надо смотреть в DataEnvironment подчиненной формы. Свойства объектов Cursor.BufferModeOverride = 5 При этом, режим буферизации таблиц главной формы остался без изменений. Т.е. там таблицы вообще не буфферизированы. Поскольку подчиненная форма работает в Private DataSession, то такое разделение возможно. Получается независимые сеансы данных. Один - в главной форме и другой - в подчиненной. Данные одной формы практически не зависят от данных другой формы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2006, 16:59 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
Cyv авторПравда с суррогатными ключами тоже возможны проблемки. В следствие уникальности записи с суррогатным ключем (если оно автоинкрементно) есть опасность ввода вторичной записи с подобными данными. А вот об этом недавно напоминал один уважаемый товарищ. О том что вводя суррогатный ключ, про естественный ключ не следует забывать, и наложить на него индекс типа Candidate (возможно с фильтром NOT DELETED()). Во-первых, получить дубль суррогатного ключа - невозможно. Мы его сами генерируем, сами и должны организовать генерацию так, чтобы этого не случилось. Чтобы исключить такое событие с гарантией, вводят индекс типа Primary по ключевым полям. Этот индекс по самой своей природе исключает возможность появления дублей. Во-вторых, факт наличия естесственного ключа никак не может служить гарантией исключения дубля суррогатного ключа. Значение суррогатного ключа никак, никоим образом, не должно зависеть от значения других полей той же записи. Это разные данные, предназначенные для разных целей. Естесственный ключ - для облегчения просмотра (отображения) информации. Информация для пользователя Суррогатный ключ - для обеспечения ссылочной целостности базы данных. Информация даже не для программиста, а для функционирования системы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2006, 17:09 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
Я говорил о дубле естественного ключа. О том что элементарный индекс Candidate с NOT DELETED() часто ставить забывают, ставя только Primary на суррогатный. Извиняюсь что влез в разговор Преподавателя и Ученика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2006, 17:21 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
ВладимирМ criptonВот здесь немного не догнал. В твоем коде вроде нигде явно не указывается тип буфферизации, тем неменее все работает. Как такое получается и почему? :-) Указывается. Причем именно явно. Это надо смотреть в DataEnvironment подчиненной формы. Свойства объектов Cursor.BufferModeOverride = 5 При этом, режим буферизации таблиц главной формы остался без изменений. Т.е. там таблицы вообще не буфферизированы. Поскольку подчиненная форма работает в Private DataSession, то такое разделение возможно. Получается независимые сеансы данных. Один - в главной форме и другой - в подчиненной. Данные одной формы практически не зависят от данных другой формы. Я тут немного отсутствовал. Было срочное дело. Вот значит в чем тут дело. А я обратил, кстати, внимание на то, что форма диалога находится в другой сессии, но не очень понял, для чего это было сделано. Теперь ясно. И, кстати, очень удобно. Да, неплохо бы почитать хорошую книгу с богатым примером. Не можешь указать какие-нибудь электронные источники. Типовые учебники у меня есть, но это все так, для быстрого старта. Для серьезного понимания и изучения они не годятся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2006, 14:52 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
ВладимирМВо-первых, получить дубль суррогатного ключа - невозможно. Мы его сами генерируем, сами и должны организовать генерацию так, чтобы этого не случилось. Чтобы исключить такое событие с гарантией, вводят индекс типа Primary по ключевым полям. Этот индекс по самой своей природе исключает возможность появления дублей. Во-вторых, факт наличия естесственного ключа никак не может служить гарантией исключения дубля суррогатного ключа. Значение суррогатного ключа никак, никоим образом, не должно зависеть от значения других полей той же записи. Это разные данные, предназначенные для разных целей. Естесственный ключ - для облегчения просмотра (отображения) информации. Информация для пользователя Суррогатный ключ - для обеспечения ссылочной целостности базы данных. Информация даже не для программиста, а для функционирования системы. Я вполне понимаю назначение суррогатного ключа. Безусловно он вводится для облегчения функционирования системы. Тем не менее, в нем все-таки есть некая странность. Поясню. Был у меня такой небольшой опыт. Я делал одной маленькой фирме совсем небольшой проектик на MSACCESS. Надо сказать, что в том момент, я вообще ничего не знал о базах данных. Фирмой владел один знакомый, который и попросил помочь автоматизировать учет денежного и товарного оборота. Я тогда не знал об 1с ничего, и что такое ИС для меня было пустым звуком. Тем не менее я обложился кучей книг, изучил все примеры аксесса. И за месяц сделал им системку, которая потом с небольшими доделками успешно проработала 3 года. Так вот возникла однажды такая проблема. Имеется таблицы Категория(мастер) и Товар(деталь) Товар может принадлежать одной и только одной категории в категории может быит множество товаром, а мгет и не быть вообще - пока не завезли. Так вот в каждой таблице к качестве ключа использовался счетчик уникальность на название товар не отслеживалось Поскольку товаров много, был организован поиск. Однако пользователь - дама, не шибко разбирающаяся в ПК вместо того, чтобы посмотреть есть ли такие названия, порой вводила их дважды и трижды Кончено, это не очень повлияло на работу в целом, но такая ситуация была. Потом я конечно понял, как избежать подобных ошибок. Но как иллюстрация к вопросу обсуждения может послужить:-)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2006, 15:27 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
cripton Так вот возникла однажды такая проблема. Имеется таблицы Категория(мастер) и Товар(деталь) Товар может принадлежать одной и только одной категории в категории может быит множество товаром, а мгет и не быть вообще - пока не завезли. Так вот в каждой таблице к качестве ключа использовался счетчик уникальность на название товар не отслеживалось Поскольку товаров много, был организован поиск. Однако пользователь - дама, не шибко разбирающаяся в ПК вместо того, чтобы посмотреть есть ли такие названия, порой вводила их дважды и трижды Кончено, это не очень повлияло на работу в целом, но такая ситуация была. Потом я конечно понял, как избежать подобных ошибок. Но как иллюстрация к вопросу обсуждения может послужить:-)) В данном случае наблюдается "не доделанная" структура данных, в подобных случаях используют либо правило записи (что вообще говоря при работе с буферизироваными таблицами не совсем удобно), либо навешивают ограничение через индекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2006, 16:33 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
cripton Я вполне понимаю назначение суррогатного ключа ... Имеется таблицы Категория(мастер) и Товар(деталь) Товар может принадлежать одной и только одной категории в категории может быит множество товаром, а мгет и не быть вообще - пока не завезли. Так вот в каждой таблице к качестве ключа использовался счетчик уникальность на название товар не отслеживалось Поскольку товаров много, был организован поиск. Однако пользователь - дама, не шибко разбирающаяся в ПК вместо того, чтобы посмотреть есть ли такие названия, порой вводила их дважды и трижды Кончено, это не очень повлияло на работу в целом, но такая ситуация была. Потом я конечно понял, как избежать подобных ошибок. Но как иллюстрация к вопросу обсуждения может послужить:-)) Это как раз иллюстрирует тот факт, что Вы не вполне понимаете назначение суррогатного ключа. Суррогатный ключ никак, никоим образом, не должен зависеть от содержимого остальных полей таблицы. Для суррогатного ключа совершенно все-равно, будут дубли в других полях таблицы или нет. Его это ни с какого боку не интересует. Это вообще не его задача. Назначение суррогатного ключа - это однозначная идентификация записи таблицы. Все. Причем под термином "запись" в данном случае понимается не "сущность" (товар), а именно физическая запись. "Набор байтов" на диске. Некая "область памяти". Содержимое этой "области памяти" не имеет никакого значения. А вот чтобы избежать дублей среди "сущностей" вводятся естесственные ключи. Как раз о них и говорил Cyv . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2006, 18:12 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
ВладимирМ[quot cripton] Суррогатный ключ никак, никоим образом, не должен зависеть от содержимого остальных полей таблицы. Для суррогатного ключа совершенно все-равно, будут дубли в других полях таблицы или нет. Его это ни с какого боку не интересует. Это вообще не его задача. Назначение суррогатного ключа - это однозначная идентификация записи таблицы. Все. Владимир, это определение не суррогатного ключа, а первичного ключа - Primary Key (PK), а суррогатный (синоним в данном контексте - искусственный) он называется потому, что он не содержит семантики - нет атрибута сущности, которая ему соответствует. Если можно найти в сущности такой атрибут, который соответствует вашему определению PK, то добавлять суррогатный ключ совсем не обязательно. Например, ИНН вполне может служить PK для сущности - "организации" и добавлять суррогатный PK в такую сущность нет необходимости. С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2006, 21:03 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
Отвечаю и Владимиру и Алексею. Думаю оба автора сообщений правы. И мы получили вполне исчерпывающий ответ поэтому вопрос:-) Владимир, мы вроде были на ТЫ? и Вдруг Вы:-)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 10:07 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
Во всех определениях типа "Суррогатный ключ", "Естесственный ключ", Primary Key, Foreign Key содержится слово "ключ". Все эти термины об одном и том же . Об обеспечении ссылочной целостности. Добавочное прилагательное призвано всего-лишь подчеркнуть некоторую особенность создания или применения данного ключа. Primary, Foreign - это указание на область применения Суррогатный, Естесственный - это указание на способ формирования При этом, когда говорят о Суррогатных или Естесственных ключах всегда неявно подразумевают, что речь идет именно о Primary. Цель Primary key - это однозначная идентификация записи. "Естесственный ключ", в общем случае, этого обеспечить не может. Почему? Обсуждалось многократно. Поищите здесь и на форуме по MS SQL. Поэтому ИНН не может служить PK для идентификации организации (а про ИНН писали еще больше) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 10:38 |
|
||
|
Редактирование записей одной формы из другой
|
|||
|---|---|---|---|
|
#18+
ВладимирМВо всех определениях типа "Суррогатный ключ", "Естесственный ключ", Primary Key, Foreign Key содержится слово "ключ". Все эти термины об одном и том же . Об обеспечении ссылочной целостности. Ну строго говоря, Primary Key никакого отношение к ССЫЛОЧНОЙ ЦЕЛОСТНОСТИ не имеет, Не так ли?! ВладимирМ Добавочное прилагательное призвано всего-лишь подчеркнуть некоторую особенность создания или применения данного ключа. Primary, Foreign - это указание на область применения Суррогатный, Естесственный - это указание на способ формирования Разумеется ВладимирМ При этом, когда говорят о Суррогатных или Естесственных ключах всегда неявно подразумевают, что речь идет именно о Primary. Это так, но когда говорят о Primary, никогда не имеет в вижу только суррогатные. (см. ниже) ВладимирМ Цель Primary key - это однозначная идентификация записи. "Естесственный ключ", в общем случае, этого обеспечить не может. ТЕОРЕТИЧЕСКИ может. ВладимирМ Поэтому ИНН не может служить PK для идентификации организации (а про ИНН писали еще больше) Опять же, ТЕОРЕТИЧЕСКИ может. С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 12:23 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33737619&tid=1591524]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
185ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
75ms |
get tp. blocked users: |
2ms |
| others: | 237ms |
| total: | 550ms |

| 0 / 0 |
