если можно с примером
Код: Выделить всё
таблица товара (product)pre(PROD)
--------------------------------
ID ProdName
--------------------------------
001 Шурупы-10 таблица товара
002 Шурупы-20
003 Гвоздь-100
004 Шурупы-30
005 Отвертка(STAYER No.1)
007 Отвертка(STAYER 5.0x100)
--------------------------------
таблица истории цен продажи (ccost)pre(COST)
--------------------------------
ID ProdID DateCg Cost в этой таблице происходит
-------------------------------- переоценка товара в течении
081 001 12.03.04 0.30 дня
082 002 12.03.04 0.35
083 003 12.03.04 0.40
084 004 12.03.04 0.50
085 005 12.03.04 21.00
086 007 12.03.04 19.50
087 007 13.03.04 20.00
088 007 14.03.04 21.00
099 003 14.03.04 0.50
100 005 15.03.04 22.00
--------------------------------
GLO:WorkDate long -глобальная переменная рабочей датаы(актуальной)
связь между таблицами
один ко многим
product ccost
PROD:ID <----------------<< COST:ProdID
ПРИМЕР:
нужно получить такой запрос при GLO:WorkDate=14.03.04
типа COST:DateCg<=GLO:WorkDate и максимальный (COST:ID) чтобы каждой записи
таблицы товара соответствовала одна запись таблицы цены
чтобы получилось:
Код: Выделить всё
-----------------------------------------------------------
код наименование дата пер цена
еоценки
-----------------------------------------------------------
001 Шурупы-10 12.03.04 0.30
002 Шурупы-20 12.03.04 0.35
003 Гвоздь-100 14.03.04 0.50
004 Шурупы-30 12.03.04 0.50
005 Отвертка(STAYER No.1) 12.03.04 21.00
007 Отвертка(STAYER 5.0x100) 14.03.04 21.00
(Добавление)
А можно без примера, в общем виде?

Собственно, я не знаю, как к TPS писать запросы. Да и не сказано, что за хранилище используется. Но знаю, как решить поставленную задачу.
1. Написать функцию, отбирающую последнюю запись за день для данного PROD:ID. Что-то типа:
Код: Выделить всё
FilterCost PROCEDURE(LONG ProdID),LONG
CODE
CLEAR(COST:Record,1)
COST:DateCg = GLO:WorkDate
COST:ProdID = ProdID
SET(COST:ProdID_DateCg_CostID_Key,COST:ProdID_DateCg_CostID_Key)
! Ключ трехкомпонентный
PREVIOUS(CCost)
IF ErrorCode() OR !
~((COST:DateCg <= GLO:WorkDate) AND !
(COST:ProdID = ProdID))
CLEAR(COST:Record)
END
RETURN(COST:ID)
Естественно, открытие-закрытие файлов и прочая сервичная лабуда тоже должна быть.
2. В Browse в локальных переменных создать локальные переменные, такие же по типу и формату, как поля для отображения из CCost.
3. Добавить эти локальные переменные в List для Browse по Product.
4. Найти точку вставки с названием типа "Перед формированием (заполнением) QUEUE". Даже не представляю, как она называется в АВС, но наверняка есть.
5. Вызвать FilterCost(PROD:ID). Здесь есть тонкий философский момент: функция у меня возвращает COST:ID. В общем-то, на текущий момент найденая запись из CCost должна быть в памяти. Я бы все равно добавил GET и явно ее перечитал.
Код: Выделить всё
CLEAR(COST:Record)
COST:ID = FilterCost(PROD:ID)
GET(CCost,COST:ID_Key)
IF ErrorCode() OR (COST:ID = 0)
...
END
6. Присвоить локальным переменным, указанным в List, соответствующие значения из CCost.
В Legacy такая схема работает однозначно. Думаю, что и в АВС - тоже.
С уважением,
В.Смелик
(Добавление)
Я предпочитаю такие вещи не делать одним View-запросом.
Если на SQL еще можно, то для Клариона подобный запрос может быть довольно сложным и тормозным.
Я бы сделал так:
1. Бровз по таблице товаров
В качестве переменной для колонки "Текущая цена" ставим локальную переменную.
2. В точке вставки где заполняется запись пишем код:
Код: Выделить всё
! предполагается наличие в таблице CCOST ключа типа:
Prod_Key KEY(+COST:ProdID,+COST:DateCg,+COST:ID),NOCASE,OPT
Clear(COST:Record,1)
COST:ProdID = PROD:ID
COST:DateCg = GLO:WorkDate
Set(COST:Prod_Key,COST:Prod_Key)
Previous(CCOST)
if ErrorCode() OR (COST:ProdID <> PROD:ID)
Clear(COST:Record)
.
Если убрать строчку инициализации COST:DateCg, то получим вообще последнюю цену товара.
=============================
С уважением, Олег А. Руденко.
Oleg_Rudenko@mail.ru
Oleg_Rudenko@mail333.com
Библиотека DynaLib
http://dynalib.narod.ru
Написал: ClaList(2)