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

Вниз

Обновление значений полей взятых из присоединенной таблицы   Найти похожие ветки 

 
Kostafey ©   (2007-04-17 18:54) [0]

В продолжение темы http://delphimaster.net/view/3-1173792940/

Итак, есть набор даных (ADODataSet, СУБД Access), построенный как

select * from
(
 (
   Meropr
   left join TipMeropr on TipMeropr.TMer_id = Meropr.Mer_TMer_id
 )
 left join Valute on  Valute.V_id = Meropr.Mer_V_id
)
left join Location on  Location.L_id = Meropr.Mer_L_id

значения свойств

ADODataSetMeropr.Properties["Unique Table"].Value := "Meropr";
ADODataSetMeropr.Properties["Resync Command"].Value := "..."
ADODataSetMeropr.Properties["Update Resync"].Value := adResyncAll;

соответствующим образом введены.

Проблема в том, что при изменении, например Meropr.Mer_TMer_id
значения других полей взятых из таблицы TipMeropr будут обновлены
только после выполнения Post.
Можно ли это каким-либо образом сделать до выполнения Post ?


 
Kostafey ©   (2007-04-17 19:38) [1]

Вообще, проблему решил, но не очень красиво.

В момент изменения Meropr.Mer_TMer_id я отключал свойство
DataSource:=nil того TDBEdit, который должен отображать
поле данных таблицы TipMeropr, после чего его свойству
Text присавивается требуемое знаечение поля.
Зырытие формы редактирования происходит вместе с Post или Cancel.

При каждом отобажении формы (FormShow) значения DataSource
всех TDBEdit-ов и прочих контролов восстанавливаются.

Не слишком примитивно?


 
Kostafey ©   (2007-04-20 23:52) [2]

Все же конструктивной критики хотелось бы услышать.


 
Johnmen ©   (2007-04-21 00:28) [3]

Прочитал 2 (два) раза. Ничего не понял.


 
Kostafey ©   (2007-04-21 00:40) [4]

> Прочитал 2 (два) раза. Ничего не понял.

Постараюсь выражаться яснее.

Набор данных (ADODataSet) построен на основе объединения нескольких таблиц.
Нужно этот НД редактировать (Insert, Edit, etc).
В статье http://delphikingdom.ru/asp/viewitem.asp?catalogid=420
рассказывается как редактировать НД построенных на нескольких таблицах.

Но обновление данных в визуальных компонентах (DBGrid, DBEdit, и тд.) в случае если
мы меняем значения внешних ключей таблицы (указанной в "Unique Table") происходит только
выполнения Post этого набора данных.

Я бы хотел иметь возможность видеть изменения до сохранения.


 
Kostafey ©   (2007-04-21 00:49) [5]

В статье еще пример есть http://www.delphikingdom.com/zip/adopart3.zip (18k)
Можно с ним для наглядности поэкспериментировать.
нажать Button1 и менять значения в поле AbonentID.
Изменения не отобразятся до нажания Post.


 
Johnmen ©   (2007-04-21 00:50) [6]

Да это [4] понятно, и почему после поста обновляется, тоже очевидно.
Неясно вот это [1]


 
Kostafey ©   (2007-04-21 00:59) [7]

> Неясно вот это [1]

Попробую сказать то же самое другими словами.

Когда происходит изменение значения внешних ключей таблицы (указанной в "Unique Table")
я присваиваю DataSource:=nil тем DBEdit, которые должны отображать поля из связанной
таблицы. То есть как раз те поля которые и изменятся послы выполнения Post.
DBEdit.Text я присваиваю данные, которые отобразились бы после Post.
Когда выполняется Post/Cancel все возвращается на круги своя и DBEdit.DataSource
получают прежние значения.

Так яснее или лучше на примере?


 
Johnmen ©   (2007-04-21 01:05) [8]


> DBEdit.Text я присваиваю данные, которые отобразились бы после Post.

Т.е. они известны? Откуда?


 
Kostafey ©   (2007-04-21 01:11) [9]

> Т.е. они известны? Откуда?

Все просто.
Для редактирования внешних ключей данной (родительской) таблицы пользователь
должен выбрать запись из дочерней таблице. Значения полей дочерней таблицы отображаются в
другой форме. Пользователь выбирает желаемую запись и данные передаются в форму
редактирования родительской таблицы, но не только уникальный ключ дочерней (он же внешний для
родительской), но и другие текстовые поля которые и отображаются в форме редактирования
родительской таблицы.


 
Kostafey ©   (2007-04-21 01:18) [10]

> [9] Kostafey ©   (21.04.07 01:11)

Похоже я несколько напутал с терминологией родительская-дочерняя таблицы.
Гм..


 
Kostafey ©   (2007-04-21 22:44) [11]

Короче,
Таблицы:

Table1:
 id
 Dogovor
 FK_Table2_id

Table2:
 id
 Familiya


Набор данных1: (работающий с Table1)

 Table1.id
 Table1.Dogovor
 Table1.FK_Table2_id
 Table2.Familiya


Form1 работает с Набором данных1, на ней есть
DBEdit1.DataSource="Источник Данных1";
DBEdit1.DataField="Table2.Familiya";

Form2 работает с Набором данных2 = Table2

Пользователь открывает Form1 и редактирует поле
Table1.Dogovor
Затем открывает Form2 и выибирает необходимое
Table2.Familiya

После чего происходит следующее:
-Form2 закрывается, пользователь возвращается к Form1
-Table2.id передается в Table1.FK_Table2_id
-DBEdit1.DataSource:=nil;
-DBEdit1.Text:=Table2.Familiya
-при Post/Cancel DBEdit1.DataSource:="Источник Данных1";

Работает, то оно работает но выглядит глуповато.


 
Kostafey ©   (2007-04-21 22:45) [12]

Источник Данных1 ссылается на Набор данных1


 
Johnmen ©   (2007-04-21 23:00) [13]

У меня такое ощущение, что ты не знаешь о лукапных полях.
Если это так, читай Lookup fields, TLookupCombobox, потренируйся добавлять лукапное поле в набор данных с пом. Field Editor"а(даблклик на компоненте - держателе НД, типа TQuery, TTable etc).


 
Kostafey ©   (2007-04-21 23:05) [14]

Да нет, все я знаю про Лукап-поля, как раз наоборот и возникли такие проблемы,
что я отказался от их использования.
Необходимо было выполнять фильтрацию и сортировку по лукап-полям.


 
Kostafey ©   (2007-04-21 23:06) [15]

Я ж хотел иметь гибкие наборы данных, чтобы в одном наборе данных можно было бы и все виды
фильтраций/сортировок проводить, и его же использовать для ввода/модификации данных !


 
Johnmen ©   (2007-04-21 23:30) [16]

Вообще говоря, способы фильтрации и сортировки никакого отношения к способам редактирования не имеют.
Рекомендую обратиться к Query компонентам, отказавшись навсегда от Table.


 
Kostafey ©   (2007-04-22 01:06) [17]

> Вообще говоря, способы фильтрации и сортировки никакого
> отношения к способам редактирования не имеют.

Вы хотите сказать, что для редактирования данных и их
отображения (с возможностью фильтрации и сортировки) всегда
необходимо сосздавать отдельные наборы данных ?


> Рекомендую обратиться к Query компонентам, отказавшись навсегда
> от Table.

А чем ADODataSet плох?
Запросы на получение наборов данных из разных таблиц,
фильтрации, сортировки я делаю за счет SQL.


 
Johnmen ©   (2007-04-22 14:28) [18]


> Вы хотите сказать, что для редактирования данных и ихотображения
> (с возможностью фильтрации и сортировки) всегданеобходимо
> сосздавать отдельные наборы данных ?

Нет.

> А чем ADODataSet плох?Запросы на получение наборов данных
> из разных таблиц,фильтрации, сортировки я делаю за счет SQL.

Он вполне хорош.
Теперь надо бы взглянуть с его позиций на [11]. Какие запросы, какие поля в НД. Зачем DBEdit, если существует DBLookupCombobox...

ЗЫ
Заметь, что кроме меня никто в этой ветке не пытается что-то сказать. Я так думаю, что в связи с недостаточной ясностью постановки вопроса...


 
Kostafey ©   (2007-04-22 14:50) [19]

> Какие запросы, какие поля в НД.

Привети тексты запросов ?


> Зачем DBEdit, если существует DBLookupCombobox

Дело в том, что для выбора значений полей из связанной (справочной таблицы)
я использую другую форму, т.е. роль DBLookupCombobox выполняет DBEdit с кнопкой
принажатии на которую отображается форма с DBGrid.

А кроме того, разьве значения в DBLookupCombobox обновятся до Post?
Попробую.


> ЗЫ
> Заметь, что кроме меня никто в этой ветке не пытается что-
> то сказать. Я так думаю, что в связи с недостаточной ясностью
> постановки вопроса

За это спасибо, но как можно объяснить задачу кратко и в то же время
понятно? В [11] я это поробовал сдалать на упрощенном примере.


 
Johnmen ©   (2007-04-22 15:03) [20]


> Дело в том, что для выбора значений полей из связанной (справочной
> таблицы)я использую другую форму, т.е. роль DBLookupCombobox
> выполняет DBEdit с кнопкойпринажатии на которую отображается
> форма с DBGrid.

Опять не понимаю... ЗАЧЕМ ДЛЯ ВЫБОРА ИЗ СПРАВОЧНОЙ ТАБЛИЦЫ используется не к селу не к городу DBEdit, а не специально для этого предназначенный DBLookupCombobox?


 
Kostafey ©   (2007-04-22 15:09) [21]

> А кроме того, разьве значения в DBLookupCombobox обновятся
> до Post?
> Попробую.

Да, конечно, изменения отображаются до выполнения Post.

Но тут вот какое дело. Мне не нужно иметь список всех записей из ListSource.
Т.е. DBLookupEdit был бы идеальным решением, но его нет.

Почему не устраивает DBLookupCombobox?
В примере [11] все упрощено, но если к Фамилии добавить Имя, Отчество и т.д.,
то получается, что выбирать значение из связанной таблицы по одному только полю в
DBLookupCombobox никак нельзя, а в другой форме (выбора значения связаннной таблицы)
можно и все поля показать, и поиск записи сделать.

А Вы случайно не знаете, где DBLookupEdit можно взять или, как вариант,
убрать кнопку в DBLookupCombobox для отображения выпадающего списка ?


 
Johnmen ©   (2007-04-22 15:13) [22]

Правильно ли я догадываюсь, что за одну "операцию" выполняется внесение в справочник нового значения и выбор его для подстановки в основной НД?
И проблема именно в этом?


 
Kostafey ©   (2007-04-22 15:15) [23]

> что за одну "операцию" выполняется внесение в справочник
> нового значения

Перед выбором имеется и такая возможность.


> и выбор его для подстановки в основной НД?

Да, да, все верно.


 
Johnmen ©   (2007-04-22 15:28) [24]

Тогда ещё один вопрос - как организован справочник в плане уникального ключа?


 
Kostafey ©   (2007-04-22 15:31) [25]

> Тогда ещё один вопрос - как организован справочник в плане
> уникального ключа?

Обычное автоинкрементное поле (СУБД Access)


 
Johnmen ©   (2007-04-22 15:51) [26]

В таком случае, не вставив новую запись в таблицу справочника, невозможно узнать её идентификатор, используемый для ссылок из др.таблиц. А это значит, что не только Post б.д. выполнен, но и запись РЕАЛЬНО вставлена. После чего получен идентификатор. И уже он прописан в редактируемый НД.
Отступлений от этой схемы не существует.


 
Kostafey ©   (2007-04-22 15:56) [27]

> [26] Johnmen ©   (22.04.07 15:51)

Нет, не совсем так.
В справочной таблице как раз вставка-то (Post) выполняется. Или выбирается уже существующее значение.
Вопрос в том как до выполнения Post основного НД увидеть поля, которые берутся из справочного НД.


 
Johnmen ©   (2007-04-22 16:15) [28]


> Вопрос в том как до выполнения Post основного НД увидеть
> поля, которые берутся из справочного НД.

????
Да как угодно! Через не раз упомянутый DBLookupcombobox, например...


 
logic   (2007-04-22 16:18) [29]

у вас наверное всетаки проблемма тут

Table1.id
Table1.Dogovor
Table1.FK_Table2_id
Table2.Familiya

я бы так не делал, т.к. это все таки редактируемый нд
тут надо связями пользоваться
ps: это ничего, что вклинился в ваш разговор ? :)


 
Kostafey ©   (2007-04-22 16:21) [30]

> Да как угодно! Через не раз упомянутый DBLookupcombobox,
> например...

Ну так во про то и речь, что

> Мне не нужно иметь список всех записей из ListSource.

А вот как раз сейчас ищу DBLookupEdit.
Говорят в RxLib есть такой.


 
Kostafey ©   (2007-04-22 16:26) [31]

> Table1.id
> Table1.Dogovor
> Table1.FK_Table2_id
> Table2.Familiya

Это просто пример, но суть он отражает.


> я бы так не делал, т.к. это все таки редактируемый нд

На то есть статья http://delphikingdom.ru/asp/viewitem.asp?catalogid=420


> тут надо связями пользоваться

Имеете в виду поля с внешними ключами? А куда ж без них.


> ps: это ничего, что вклинился в ваш разговор ? :)

:))


 
Johnmen ©   (2007-04-22 16:29) [32]


> Ну так во про то и речь, что
> Мне не нужно иметь список всех записей из ListSource.

Ну так отфильтруй. В чём здесь-то проблема?


 
Kostafey ©   (2007-04-22 16:35) [33]

> Ну так отфильтруй. В чём здесь-то проблема?

Хм. не совсем правильно выразился.

Мне вообще не нужно чтобы отображался какой-либо список,
ни кнопка для открытия этого списка, только текущее значение.


 
MsGuns ©   (2007-04-22 19:14) [34]

DBLookUpComboBox не предназначен для ВСТАВКИ в справочник новых значений. Если надо добавлять/корректировать справочник "по ходу", следует вынести его на отдельную, МОДАЛЬНУЮ форму через обычную сетку и давать выбирать или добавлять именно в ней.
Все остальное от лукавого ;)


 
Kostafey ©   (2007-04-22 19:24) [35]

> [34] MsGuns ©   (22.04.07 19:14)

Трижды ударился головой в шкаф, проверил целостность шкафа.


> DBLookUpComboBox не предназначен для ВСТАВКИ в справочник
> новых значений

Да мне этот хр..., долб..., недо..., короче, DBLookUpComboBox не нужен,
не использую я его.


> МОДАЛЬНУЮ форму через обычную сетку и давать выбирать или
> добавлять именно в ней.

Всю ветку объясняю что именно так я и сделал.

Вопрос то в том как после этого изменения увидеть до выполнения Post.

Нашел компонент TDBLookupText, но он какой-то древний не компилируется стандартно.
Как выполнить процедуру Register компонента ?


 
MsGuns ©   (2007-04-22 20:29) [36]

Вставку в справочник выполнять запросом, сразу после инсерта вытаскивая идентификатор.

Для акцеса такое может прокатить :
INSERT INTO TABLE
SELECT MAX(ID)

А вообще-то @@Identity


 
Kostafey ©   (2007-04-22 20:46) [37]

> [36] MsGuns ©   (22.04.07 20:29)

От ударов головой пострадал стол и еще несколько предметов мебели.


> Для акцеса такое может прокатить :
> INSERT INTO TABLE
> SELECT MAX(ID)

Вообще, спасибо, весьма познавательно. Но вопрос не в этом.

В чем же вопрос? А собственно в чем?
<На столе появилось еще пару вмятин>

Вам не доводилось пользоваться TDBLookupText.
Замечательная штука, только не работает. Для Delphi4 была написана.
У меня Delphi7 скоимпилировал, пробую использовать,
все значения свойств настроил, а он, зараза, ничего не показывает. :(

В исходнике его чтоль покопаться? Вроде не очень большой...


 
MsGuns ©   (2007-04-22 22:19) [38]

Я уже давно не использую всякие лукапы. Только в формах редактирования и не в гридах.


 
Kostafey ©   (2007-04-23 03:33) [39]

> [38] MsGuns ©   (22.04.07 22:19)

В таком случае посмотрите на [0] и [1], а лучше сразу на [11].
В них и сформулирован вопрос который я уже до сих пор не решил,
т.е. решил, но не очень красиво.

Был бы очень признателен за Ваши советы по этому вопросу.


 
имя   (2007-06-01 22:32) [40]

Удалено модератором



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

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

Наверх




Память: 0.56 MB
Время: 0.041 c
15-1190108510
Empleado
2007-09-18 13:41
2007.10.21
Порекомендуйте Линух или подобную OS


2-1190800377
O.O
2007-09-26 13:52
2007.10.21
Как удалить файл с атрибутом "только для чтения"


10-1138545805
АлександрМ
2006-01-29 17:43
2007.10.21
Параграфы и таблицы в Word


3-1182153666
mefodiy
2007-06-18 12:01
2007.10.21
SQL запрос с использованием LIKE


2-1191060534
Pacific
2007-09-29 14:08
2007.10.21
Процесс





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский