1-1

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Помогите создать стандартными средствами С5.5 (ABC) запрос (Browse)
если можно с примером

Код: Выделить всё

 
таблица товара (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
Tomas Sachkov <tomas@ellink.ru>

(Добавление)

А можно без примера, в общем виде? :)

Собственно, я не знаю, как к 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)
Ответить