Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];

Вниз

Выбор из справочника   Найти похожие ветки 

 
Ascer   (2005-10-06 16:00) [0]

Уж не знаю , возможно это вопрос для "Основной". Хотел спросить как ALL осуществляет выбор из справочников. Сейчас поясню. Надо заполнить некие данные на человека(да неважно на что). По ходу дела надо выбирать некоторые значения из справочников. Я обычно использовал для этого ComboBox и его клоны. Справочники, естественно, находятся в БД. То есть оператор либо пишет от руки (обязательное условие) и значение выбирается из итемсов comboboxа, либо распахивает весь список и мышкой находит нужное. Когда количество строк в справочнике превышает некоторое значение, начинаются во-превых тормоза с открытием формы(надо ведь наполнить все comboboxы, а их может быть N) и второе - противоречие с принципами работы клиент-серверной технологии, ведь тянуть приходится весь справочник. Вот и вопрос, кто чем пользуется для решения этой проблемы?


 
Курдль ©   (2005-10-06 16:08) [1]

Выдавать юзеру сначала окно критериев выбора, потом - поиск в базе запросом.
А из оставшихся - можно и мышкой в таблице.


 
msguns ©   (2005-10-06 16:13) [2]

Для отображения в гриде что-то типа этого:

SELECT C.ID, C.BNAME, C.TID, C.BCLTNAME, C.BCLTVOL, C.THID, C.PYEAR, C.PID, C.PHID,
   C.BINVNUM, C.BPRICE, C.BDATEIN, C.BDATEOUT, C.BAVAIL, C.CID, C.UID, C.ONUM, C.SNUM,
   C.BADDR, C.BSTORR,  C.BSTORB,  C.BSTORS,  C.BSTORN, C.BAUTORS, C.BANNOT, C.BMOVINFO,
   T.TYPENAME, TH.THEMNAME, P.PUBNAME, PH.PHNAME, CN.CONDNAME, U.USERFIO, U.USERDEP
   FROM
     (((((CTLG C LEFT JOIN DTHEME TH ON (C.THID = TH.ID))
           LEFT JOIN DTYPE T ON (C.TID = T.ID))
           LEFT JOIN DPUB P ON (C.PID = P.ID))
           LEFT JOIN DPHOUSE PH ON (C.PHID = PH.ID))
           LEFT JOIN DCOND CN ON (C.CID = CN.ID))
           LEFT JOIN DUSER U ON (C.UID = U.ID)


Для инсерта-апдэйта "навороченных" записей, т.е. где множество полей, в т.ч. связанных со справочником, предпочитаю вместо редактирования в гриде юзать модальные формы, где можно вполне комфортно и наглядно расположить ВСЕ поля записи.
Для выбора из справочников можно использовать комбобоксы (если справочник небольшой по объему, то все его записи просто вкачиваются в список, из которого юзер и выбирает) либо кнопки для открытия опять же модальных форм со справочниками (большие по объему или кол-ву вспомогательных полей спр-ки) с возможностью как выбора, так и вставки или изменения в самом спр-ке.
Есть еще "псевдо-справочник", который я, к примеру, весьма полюбляю, т.к. он не требует таблицы. Собственно, справочник - это всего лишь набор неповторяющихся значений некоторого поля основной таблицы. Весьма неплох для объектов, у которых не может быть много варианнтов значений.
Если юзер добавляет новое значение, после поста всей записи справочник просто автоматически будет "пополнен".


 
Desdechado ©   (2005-10-06 18:31) [3]

[0]
тормоза, имхо, не от впихивания в комбо, а от обращения к таблицам справочников
если справочники открыть сразу все при загрузке программы, а не режима, то в режим будешь влетать
справочники меняются редко, поэтому такой буфер вполне допустим


 
jiny   (2005-10-06 21:59) [4]

В принципе есть другой метод :
1) создать форму для стандартного справочника, где можно вписать только общие для всех справочников процедуры и функции, пример :
содержание : toolbar, dbgridEh c двуми колонками (код, наименование),panel,button, actionlist, назовем форму SprStandard;
2) определиться что именно будет возвращать на форму, вызвавшею ее (пример : код, наименование)
3) создать в public фрейма переменную типа Tform or Tframe, в зависимости от того куда будет возвращаться результат.
пример :
public
 TmpDestination: Tframe;
 TmpQr: TIbquery;

а вот что нужно прописать на кнопку "Добавить" :
begin
   (TmpDestination.findComponent("lblCod") as Tlabel).Caption:=Tmpqr.fieldByName(MyGrid.Columns[0].FieldName).AsString;
   (TmpDestination.findComponent("lblName") as Tlabel).Caption:=Tmpqr.fieldByName(MyGrid.Columns[1].FieldName).AsString;
close;
end;

4) создать фрейм "выбор , допустим, города" (содержание фрейма : lblCod,LblName типа TLabel) назовем фрейм FreSelectCity
добавим кнопочки BtnAdd,BtnClear, где на BtnAddOnclick
впишем :
Application.createForm(TSprStandard,SprStandard);
with SprStandard do
begin
 TmpQr:=qrCity (допустим что это таблица городов)

{тут же можно назначить свой поисковик из actionlist фрема,
либо сделать запрос открытия таблицы отсюда}

 MyGrid.Colums[0].Fieldname:="num_cty" (это будет идентификатор)
 MyGrid.Colums[1].Fieldname:="name_cty" (это будет наименование)
 TmpDestination:=FreSelectCity;
 Showmodal;
end;

6) расположим фрем FreSelectCity на требуемой форме и запускаем программу

Это вкратце, ну чем мог помог, надеюсь :)



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.039 c
2-1130842281
Gera
2005-11-01 13:51
2005.11.20
Как программно запустить из трея чужое приложение


4-1127118369
Quattro
2005-09-19 12:26
2005.11.20
FlashWindow


9-1120200139
Pasechnick
2005-07-01 10:42
2005.11.20
GLScene и ATI


3-1128854779
ssk
2005-10-09 14:46
2005.11.20
Аналог оракловой функции NVL в BDE


2-1130744171
abu
2005-10-31 10:36
2005.11.20
Целые числа в TDate





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский