Страница 1 из 1
Очередная диллема - "ТОВАРЫ-ЦЕНЫ"...
Добавлено: 02 фев 2007, 15:57
AnryGTR
Здравствуйте, товарищи ГУРУ!
Две таблицы (мастер-деталь) - товары и цены на них. Я никак не могу реализовать следующее:
в гриде стоит наименование товара, и цена(LookUpField). Как мне сделать, чтобы когда я
редактировал цену прямо в Гриде (DBGridEh) у меня в таблицу цен заносилась новая цена, а
у текущей - дата окончания действия становилась сегодняшней. У меня сейчас происходит так:
пытаюсь редактировать цену, НО при попытке выпадает список с ценами которые уже есть
в таблице цен, а другую я ввести не могу...
Или так сделать невозможно? Работаю через FIBDataSet (6.45).
Может я не тот компонент юзаю?
Добавлено: 02 фев 2007, 16:28
Attid
ну ты бы структуру хоть немного описал, а то мож я что-то не так понял.
ты список цен получай в ридонли транзакции может ты её блокируешь ?
хотя DBGridEh и редактирование цены у меня обычно в отдельной форме, думаю проблем быть не должно.
Re: Очередная диллема - "ТОВАРЫ-ЦЕНЫ"...
Добавлено: 02 фев 2007, 17:00
Slavik
Забей на лукапы, т.к. они сильно тормознутые на больших выборках, да и не нужны в твоём случае.
В таблице товаров, к примеру, храни текущую цену. Её и показывай в гриде. Тогда редактирование будет происходить без проблем. А (опять же к примеру) в триггере на обновление таблицы товаров проверяй, не пытаються ли её изменить. Если факт изменения цены установлен, то обновляй таблицу цен, как хочешь: можешь закрыть старую цену и открыть новую или ещё что-то.
Если же очень нужно видеть историю цен по товару, то тогда используй на форме отдельный гридик с ценами (и соответственно одтельный датасет, связанный с основным).
Добавлено: 02 фев 2007, 17:03
WildSery
Может, лучше сделать правильно?
Цену показывать не в лукап, а в обычном поле, из SELECT ... JOIN ...
А на редактирование навесить UpdateObject, который куда надо что надо запишет? Или без UpdateObject, но в UpdateSQL записать вызов процедуры, которая сделает то же.
Или в триггер всё запихать, если такой функционал безусловен для цен.
Добавлено: 02 фев 2007, 17:23
AnryGTR
Вау, ребята спасибо, рульны варианты, только вот я с тригеррами как-то не очень, нельзя ли мини триггер написать как он это делать будет...? Был бы премного благодарен.
Кстати, а насчёт лукапов - это правда ?
А то они у меня сплошь и рядом, может действительно забить на них и делать всё через Селект?
Добавлено: 02 фев 2007, 18:15
Slavik
AnryGTR писал(а):...нельзя ли мини триггер написать как он это делать будет...?
Пример
тела простейшего триггера на AFTER UPDATE для таблицы товаров (ITEMS):
Код: Выделить всё
if (new.PRICE <> old.PRICE) then begin
-- Закрываем старую цену
update PRICES set DATE_MAX = current_date
where ITEM = new.ID and DATE_MAX is null;
-- Открываем новую цену
insert into ITEMS (ITEM, PRICE, DATE_MIN)
values (new.ID, new.PRICE, current_date);
end
где ITEMS - таблица товаров с уникальным полем ID; PRICES - таблица цен со ссылкой на товар ITEM (ID в ITEMS).
AnryGTR писал(а):Кстати, а насчёт лукапов - это правда ?
А то они у меня сплошь и рядом, может действительно забить на них и делать всё через Селект?
Всё зависит от ситуации.
Чтобы правильно отобразиться, лукап-поле
полностью прочитывает лукап-датасет, что напрягает излишне сервер и сетку, и забирает память на клиенте под хранение, что далеко не всегда необходимо. Кроме того, если данных в датасетах лукапа много, то чтобы отобразить их, лукап-поле для каждой записи твоей выборки проводит поиск нужной записи в лукап-датасете, напрягая клиентский комп.
Если это
маленький статичный справочник с одним информационным полем (например, типы документов), одинаковый для всех записей выборки, то использование лукапа удобно.
В остальных случаях я добавляю в колонку кнопку вызова полноценной формы соответствущего справочника, где и поля все есть, и поиск можно организовать и фильтрацию, и сортировку и добавление новых элементов, и вообще всё, что душе угодно

. И вызывается только при необходимости внести изменения. Тем более, обычно, это та же форма, что и для редактирования справочника.