Очередная диллема - "ТОВАРЫ-ЦЕНЫ"...

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
AnryGTR
Сообщения: 116
Зарегистрирован: 15 янв 2007, 15:58

Очередная диллема - "ТОВАРЫ-ЦЕНЫ"...

Сообщение AnryGTR » 02 фев 2007, 15:57

Здравствуйте, товарищи ГУРУ!
Две таблицы (мастер-деталь) - товары и цены на них. Я никак не могу реализовать следующее:
в гриде стоит наименование товара, и цена(LookUpField). Как мне сделать, чтобы когда я
редактировал цену прямо в Гриде (DBGridEh) у меня в таблицу цен заносилась новая цена, а
у текущей - дата окончания действия становилась сегодняшней. У меня сейчас происходит так:
пытаюсь редактировать цену, НО при попытке выпадает список с ценами которые уже есть
в таблице цен, а другую я ввести не могу... :-(
Или так сделать невозможно? Работаю через FIBDataSet (6.45).
Может я не тот компонент юзаю?

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Сообщение Attid » 02 фев 2007, 16:28

ну ты бы структуру хоть немного описал, а то мож я что-то не так понял.

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

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Re: Очередная диллема - "ТОВАРЫ-ЦЕНЫ"...

Сообщение Slavik » 02 фев 2007, 17:00

Забей на лукапы, т.к. они сильно тормознутые на больших выборках, да и не нужны в твоём случае.

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

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

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 02 фев 2007, 17:03

Может, лучше сделать правильно?
Цену показывать не в лукап, а в обычном поле, из SELECT ... JOIN ...
А на редактирование навесить UpdateObject, который куда надо что надо запишет? Или без UpdateObject, но в UpdateSQL записать вызов процедуры, которая сделает то же.
Или в триггер всё запихать, если такой функционал безусловен для цен.

AnryGTR
Сообщения: 116
Зарегистрирован: 15 янв 2007, 15:58

Сообщение AnryGTR » 02 фев 2007, 17:23

Вау, ребята спасибо, рульны варианты, только вот я с тригеррами как-то не очень, нельзя ли мини триггер написать как он это делать будет...? Был бы премного благодарен.
Кстати, а насчёт лукапов - это правда ?
А то они у меня сплошь и рядом, может действительно забить на них и делать всё через Селект?

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Сообщение Slavik » 02 фев 2007, 18:15

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 писал(а):Кстати, а насчёт лукапов - это правда ?
А то они у меня сплошь и рядом, может действительно забить на них и делать всё через Селект?
Всё зависит от ситуации.

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

Если это маленький статичный справочник с одним информационным полем (например, типы документов), одинаковый для всех записей выборки, то использование лукапа удобно.

В остальных случаях я добавляю в колонку кнопку вызова полноценной формы соответствущего справочника, где и поля все есть, и поиск можно организовать и фильтрацию, и сортировку и добавление новых элементов, и вообще всё, что душе угодно :). И вызывается только при необходимости внести изменения. Тем более, обычно, это та же форма, что и для редактирования справочника.

Ответить