Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.11.2015, 20:35
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию Подскажите варианты формирование списка двух DBComboBox с двух таблиц

Всем доброе время суток,
Есть две таблицы «GOV_ETALON» и «REGISTER_ETALON», в этих таблицах есть данные о данные о сотрудниках. При добавлении новых записей в таблицы, эти данные могут повторяться. Данные о сотрудниках, истинны для обеих таблиц.
Чтобы не набирать их по новому, как посоветовали, вместо DBComboBox использовать DBLookupComboBox и дополнительный DataSet для формирования автоматического формирования списка "Фамилии+Имени+Отчества".
Итак, есть таблица «GOV_ETALON» в ней поля:

Код:
«фамилия»
«имя»
«ученая степень»
«ученое звание»
«должность»
И таблица «REGISTER_ETALON» в ней поля:

Код:
«фамилия»
«имя»
«отчество»
«телефон»
«e-mail»
На каждой из двух форм, будет по одному DBLookupComboBox (в списке которого, должна быть инф-ция о ФИО сотрудника). А вся инф-ция о сотрудниках, должна наверное аккумулироваться в DataSet
или само проектирование не так?
- Или как-нибудь через "view" - попробовать?
- Или это нужно создавать новую таблицу сотрудников, где хранить эти данные, и с которой наполнять DBLookupComboBox? (конечно не хотелось бы)

Заранее спасибо

Последний раз редактировалось Konstantin-78, 29.11.2015 в 20:39.
Ответить с цитированием
  #2  
Старый 30.11.2015, 06:21
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

1. Совсем не понятно, что делать то надо (т.е. что хочется получить на ыыходе).
2. Действительно, БД надо переделывать (судя по представленной информации). Как я понимаю, вторая таблица содержит список сотрудников, а первая - список тех же сотрудников с указанием "научных" "аттрибутов". Если я все правильно понял, то:
- вторую таблицу оставляем как есть
- делаем 3 справочника:
-- ученые степени
-- ученые звания
-- должности
Далее варианты:
а) у нас у каждого сотрудника есть либо степень, либо звание, либо должность, либо любая комбинация всего этого. Тогда первую таблицу удаляем, а во второй делаем ссылки на справочники.
б) у нас только у некоторых сотрудников есть степень/звание/должность. тогда имеет смысл держать их отдельно, но таблица будет иметь вид:
Код:
create table GOV_ETALON
(
id integer primary key,
emploee_id integer references REGISTER_ETALON.id,
rank_id integer references RANKS.id,
status_id integer references STATUSES.id,
position_id integer references POSITIONS.id
);
где последние три поля - индексы из соотв. справочника.

Ну и на закуску, можно сделать пару view, для того, что бы не заморачиваться в запросах с клиента.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Konstantin-78 (30.11.2015)
  #3  
Старый 30.11.2015, 11:40
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
1. Совсем не понятно, что делать то надо (т.е. что хочется получить на ыыходе).
На выходе просто хочется получить сформированнный список "Фамилий" в DBLookupComboBox или ComboBox (на двух формах, из двух таблиц), состоящий из всех существующих данных в обоих таблицах. Чтобпользователь мог выбрать уже готовую фамилию, а дальше программа сама бы притащилыа бы всю информацию по этому пользователю.
Конечно, если инф-я будет с разный таблиц, то не все поля будут заполняться.

Последний раз редактировалось Konstantin-78, 30.11.2015 в 11:56.
Ответить с цитированием
  #4  
Старый 30.11.2015, 11:49
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

а если попробывать, что-то типа этого:

Код:
select g.KEEP_LAST_NAME, g.KEEP_NAME, g.KEEP_DEGREE, g.KEEP_RANK, g.KEEP_POSITION,
       r.KEEP_TELEPHONE, r.KEEP_E_MAIL from GOV_ETALON g
left join REGISTER_ETALON r on (g.KEEP_LAST_NAME=r.KEEP_LAST_NAME  and g.KEEP_NAME=r.KEEP_NAME)

если что в GOV_ETALON еще можно "Отчество" добавить. И тогда еще в условии третий параметр появится...

но тогда правда, с REGISTER_ETALON - люди не добавятся

Но последний вариант, с дополнительной таблице мне все думаю понравится, где можно хранить всю инф. о сотруднике.

Я думал обойтись без классификатора сотрудников, но думаю не удастся.
Буду в доп. таблицу добавять сотрудников, сразу при добавлении их в GOV_ETALON и REGISTER_ETALON, основываясь на разных ФИО, ну конечно и в классификаторе, навсякий случай кнопку "добавить" сделаю.

Цитата:
первую таблицу удаляем...
первую таблицу удалить нельзя, т.к. в ней находится еще инф. не связанная с таблице №2, но использующая соотрудника из этой таблицы

Последний раз редактировалось Konstantin-78, 30.11.2015 в 12:06.
Ответить с цитированием
  #5  
Старый 30.11.2015, 20:11
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Тут вопрос в том, хочешь ты быстро получить результат или хочешь сделать по нормальному. Если сделать по нормальному, то надо все переделывать. Если быстро результат, то UNION [ALL] спасет отца русской демократии:
Код:
select first_name, middle_name, last_name, phone, email, NULL as rank, NULL as degree, NULL as position from REGISTER_ETALON
union all
select first_name, NULL as middle_name, last_name, NULL as phone, NULL as email, rank, degree, position from GOV_ETALON
Если надо убрать повторы, то убери из запроса 'all'

PS.
Цитата:
Цитата:
первую таблицу удаляем...
первую таблицу удалить нельзя, т.к. в ней находится еще инф. не связанная с таблице №2, но использующая соотрудника из этой таблицы
Удаляем - в смысле переделываем (инфа переносится в др. таблицу, сама таблица удаляется, а вместо нее делается view).

Последний раз редактировалось lmikle, 30.11.2015 в 20:13.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Konstantin-78 (30.11.2015)
  #6  
Старый 30.11.2015, 22:15
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Ваш запрос замечательный и делает все что мне нужно, но не совсем, посмотрев на его результат. Я понял, что нужно делать как Вы сказали "по нормальному".

- В 1-ой таблице у меня хранится информация по первой категории деталей отличной от 2-ой каткгории (разные параметры, одни и те же сотрудники)
Во 2-ой таблице у меня хранится информация по второй категории деталей отличной от 1-ой каткгории (разные параметры, одни и те же сотрудники)

Из Ваших предложений, я понял:
- Просто нужно создать таблицу-справочник сотрудников, в которой будет хранится полная инф-я о сотрудниках (званния, тел., e-mail и т.д.).

На двух формах, на параметрах "Фамилия" поставить DBEdit, под ним поставить DBLookUpComboBox.
Пользователь при добавлении новой детали, открывает DBLookUpComboBox, в списке которого хранится ФИО. Если такая ФИО есть в справочнике, то при ее выборе, я запросом, достаю из справочника дополнительные значения параметров (тел., e-mail и т.д.), и вставляю их в соответствующие окошки на форме. Если такой ФИО нет, то он просто заполняет все параметры сотрудника (ФИО, звания и т.д.).
При сохранении в записи (детали), программа проверяет, если сотрудник с таким ФИО в справочнике. Если есть программа его не добавляет в справочник, если нет, то идет пополнение справочника новым сотрудником.

Конечно в самом справочнике сделать, возможным добавление, редактирование, удаление записи от руки.

Последний раз редактировалось Konstantin-78, 30.11.2015 в 22:30.
Ответить с цитированием
  #7  
Старый 01.12.2015, 01:02
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, в общем, в правильном направлении идет мысль.
Только проверь, есть ли смысл разбивать эту информацию на несколько таблиц. Т.е. если у тебя всегда будет отношение один-к-одному, то смысла в разбивании нет, просто в разных формах показывать разный набор полей.
Ответить с цитированием
  #8  
Старый 01.12.2015, 01:26
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Ну, в общем, в правильном направлении идет мысль.
Только проверь, есть ли смысл разбивать эту информацию на несколько таблиц. Т.е. если у тебя всегда будет отношение один-к-одному, то смысла в разбивании нет, просто в разных формах показывать разный набор полей.
Если вы имеете в виду под информацией - "детали к каждой категории", то том много разных параметров (между двумя категориями). А делать таблицу с 40-ка полями, у меня рука не поднимается (темболее это еще не все поля...)

Подскажите пожалуйста еще такой вопросик: у меня получится запихнуть связку из трех полей ("фамилия", "имя", "отчество") в список DBLookUpComboBox? Или мне делать в справочнике дополнительное поле, в котором, будут хранится эти 3 значения (ФИО)? И DBLookUpComboBox перенаправлять на него.

Последний раз редактировалось Konstantin-78, 01.12.2015 в 01:38.
Ответить с цитированием
  #9  
Старый 01.12.2015, 05:54
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Код:
select first_name || ' ' || middle_name || ' ' || last_name as FIO
from ...
Или можно попробовать сделать вычисляемое поле. Но т.к. все-равно для этого справочника надо делать отдельный запрос, то можно не мучаться и сделать так, как показано выше.
Ответить с цитированием
  #10  
Старый 01.12.2015, 15:35
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
[code]
...как показано выше.
извиняюсь, это вы о дополнительном поле?
Ответить с цитированием
  #11  
Старый 01.12.2015, 18:31
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ага, просто на уровне запроса формируется поле для отображения.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:19.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter