Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Редактирование identity полей в TADOQuery / 17 сообщений из 17, страница 1 из 1
08.10.2003, 09:31
    #32287058
dishlo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование identity полей в TADOQuery
Есть два TADOQuery с запросами к одной таблице. У обоих стоит BatchOptimistic. При добавлении стоки в одном квери, хочется что бы эта строка добавилась к другому квери. Рефрешить - глупо, мне нужна только одна строка, и она на клиенте уже есть.
Если просто копировать эту строку, то возникает проблема с identity полем, его редактировать нельзя.
Пытался в адо создавать вместо TAutoIncField поле TIntegerField, редактировать получалось, но после Post(), возвращалось старое значение.
...
Рейтинг: 0 / 0
08.10.2003, 10:10
    #32287108
vlad451
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование identity полей в TADOQuery
Почему рефрешить глупо?
...
Рейтинг: 0 / 0
08.10.2003, 11:14
    #32287244
dishlo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование identity полей в TADOQuery
в этом случае рефрешить - это ненужная нагрузка на сеть и сервер. Ради одной строки, которая уже есть на клиенте, надо подтаскивать сотни и тысячи.
Совсем не оптимальное решение.
...
Рейтинг: 0 / 0
08.10.2003, 11:48
    #32287331
Добрый
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование identity полей в TADOQuery
Неоптимально иметь на клиенте сотни и тысячи записей
...
Рейтинг: 0 / 0
08.10.2003, 11:53
    #32287337
dishlo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование identity полей в TADOQuery
ну и чего неоптимального иметь на клиенте справочник организаций из пары сотен записей?
А вообще, лучше подсказали бы как мне проблему решить, может что подправить в исходниках адо, или где есть компонент подходящий?
...
Рейтинг: 0 / 0
08.10.2003, 14:07
    #32287619
dishlo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование identity полей в TADOQuery
ну, наверняка ведь кто-нибудь в исходники адо лазил, разбирался
...
Рейтинг: 0 / 0
08.10.2003, 16:59
    #32287981
Mik Prokoshin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование identity полей в TADOQuery
Так Вы пытаетесь записать в поле identity просто какое-то свое значение или надо просто добавить во вторую таблицу строку, чтобы сервер сам сгенерировал identity ? А если записывать значение самому, то зачем там на сервере вообще identity во второй таблице ?
...
Рейтинг: 0 / 0
09.10.2003, 07:56
    #32288333
dishlo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование identity полей в TADOQuery
В целом схема выглядит так.
Один рекордсет предоставляется юзеру для модификаций (вставить удалить изменить), а второй рекордсет используется только для лукапов. В первом рекордсете, много столбцов, а во втором только ID, name.
Допустим у нас есть
- справочник контрагентов.
- счет фактура.
Добавляем новую счет-фактуру, из лукапа выбираем контрагента. Если нужного контрагента нет, то открываем первый рекордсет и добавляем контрагента. И вот у нас ситуация - в лукапе этого контрагента и его айдишника нет.
Таких пар датасетов, для модификации и лукапа, в проге много.
...
Рейтинг: 0 / 0
10.10.2003, 08:58
    #32289518
dishlo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование identity полей в TADOQuery
После продолжительного исследования адошных исходников выяснилось следующее.
1. Всякие дельфийские TDataSet, TADOQuery и прочее, это надстройка над recordset.
2. В MSDN, в спецификации recordset'а сказано, что можно задать любые поля и открыть его с пустым connection. Получим полноценный пустой рекордсет с нужными полями.
3. Теоретически я мог бы открыть свой лукап recordset, потом создать новый рекодсет, создать в нем такие же поля как и в лукапе, заменив автоинкрементное поле на простой интежер, открыть его с пустым connection и скопировать в него данные из лукапа. Получаю полноценный рекордсет с возможностью редактировать любое поле.
4. В Дельфи нельзя открыть рекордсет с пустым connection. В visual basic можно, а в Дельфи нельзя.



У меня остаются сомнения, может быть как-то можно открыть в дельфи?
...
Рейтинг: 0 / 0
10.10.2003, 09:05
    #32289522
Mik Prokoshin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование identity полей в TADOQuery
А зачем disconnected dataset нужен ?
У Вас - надо добавить запись для lookup, так ведь это означает, что надо ввести записи в соотвествующие таблицы ? Ну так открывайте их, добавляйте записи, новые значения ID записывайте в счет-фактуру.
Однако тут какие-то непонятки в архитектуре. То ли Вы вообще собрались всегда двумя рекорсетами обходиться, то ли как... Зачем все же Identity вставлять непосредственно, непонятно. Поля Identity пользователь что ли, вводит ?
...
Рейтинг: 0 / 0
10.10.2003, 09:37
    #32289548
dishlo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование identity полей в TADOQuery
В архитектуре приложения есть один принцип - редактируют поля таблицы в одном датасете, а для лукапов используется другой датасет.
Приложение многооконное, допустим используется один датасет для лукапа и редактирования. Я открываю окно справочника контрагентов, накладываю фильтр, потом отрываю окно счет-фактрур и - О, ужас! - у половины счет-фактур нет контрагента.
Поэтому, решено, что лукап - это одно, а редактирование - это другое. Но возникает проблема, если я добавил нового контрагента, то в лукап он не попадет. Единственный выход - рефрешить, но это нерационально.
...
Рейтинг: 0 / 0
10.10.2003, 09:50
    #32289561
Артем1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование identity полей в TADOQuery
Помнится мне, что у Recordset-а есть метод, что-то типа CloneRecordset.
Может, стоит им воспользоваться? Клонировать датасет справочника после редактирования и присвоить лукапу?
...
Рейтинг: 0 / 0
10.10.2003, 10:01
    #32289576
dishlo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование identity полей в TADOQuery
Да, есть такой метод, но набор полей разный. В лукапе их обычно два - три, а в основном датасете значительно больше. К тому же один лукап может использоваться для разных датасетов. Например.

Лукап
Код: plaintext
select ID, name from contragent

Dataset1
Код: plaintext
1.
select ID, name, field1, field2, field3... feildN from contragent
where field1 <  0 

Dataset2
Код: plaintext
1.
select ID, name, field1, field2, field3... feildN from contragent
where field1 >=  0  


что будет если я в лукап склонирую любой из этих датасетов?
...
Рейтинг: 0 / 0
10.10.2003, 10:06
    #32289579
Mik Prokoshin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование identity полей в TADOQuery
Эта проблема концептуальна. Мы для себя решили, что проще - рефрешить. Иначе - надо делать общий datamodule и использовать один общий dataset для lookup и редактирования. Но это сложно в разработке. Просто так перетаскивать строки из одного датасета в другой - не выйдет, насколько я знаю. Попробуйте делать для для lookup TADOQuery.Recordset.Resync + TADOQuery.Resync и поиграть с 'Resync Command' ADO property, указывая там, например, "SELECT * FROM ... WHERE PK > ?".
...
Рейтинг: 0 / 0
10.10.2003, 10:06
    #32289581
Артем1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование identity полей в TADOQuery
Не, в таком случае, конечно, не получится.
Клон - это же полная копия, я проверял.

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

Единственно, что могу посоветовать - максимально оттягивать момент
рефреша лукапа, но это ты и сам понимаешь.
...
Рейтинг: 0 / 0
10.10.2003, 10:08
    #32289584
Артем1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование identity полей в TADOQuery
Resync Command, насколько я помню, должен возвращать одну строку
...
Рейтинг: 0 / 0
10.10.2003, 11:33
    #32289721
Mik Prokoshin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование identity полей в TADOQuery
Угу. Артем1 прав, Resync Command не поможет.
Или Requery или использовать один датасет для lookup и редактирования или действительно работать с disconnected dataset. Но последнее я не пробовал...
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Редактирование identity полей в TADOQuery / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]