Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) Получить цену товара из регистра (число прочтений - 5971 )
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Получить цену товара из регистра
22. Октября 2007 :: 13:39
Печать  
Имеем регистр - Цены продажи (оборотный). Измерения: Товар, Категория цен. Реквизит: Цена. Можно как то исхитрится и получить цену всех товаров (или списку товаров - необходимо и то и другое) по нескольким категориям (не всем, но и не одной). Как бы на входных параметрах задаем список товаров либо берем все товары и необходимые категории цен на выходе получаем список товаров с ценой для каждой категории. Примерно так:
Товар1 - Категория1 - Цена товара1 по категории1
Товар1 - Категория2 - Цена товара1 по категории2
Товар2 - Категория1 - Цена товара2 по категории1
и тд.

Пробовал состряпать сам... Но что то не выходит каменный цветочек... Вот, примерно, чего я добился:
     |SELECT TOP 100 -- Это пока для проверки
     |      CAST(Товар.CODE AS INT) AS ID
     |      ,(      SELECT TOP 1
     |                  $РегистрЦен.Цена
     |            FROM
     |                  $Регистр.ЦеныПродажи AS РегистрЦен
     |            WHERE
     |                  $РегистрЦен.Товар=Товар.ID
-- Здесь должно быть еще условие на категорию
     |            ORDER BY
     |                  РегистрЦен.IDDoc DESC
     |      )
     |FROM
     |      $Справочник.Номенклатура AS Товар
     |WHERE
     |      Товар.ISMARK=0 AND Товар.ISFOLDER=2
     |ORDER BY
     |      Товар.CODE";
Но запрос изначально не правильный, так как вложенный селект не может возвращать больше 1- строки (ну или по крайней мере он мне выдает ошибку, если убрать TOP 1).

Подскажите плз, как такое можно реализовать?

з.ы. Категории тоже получаются SELECT-ом с условием...
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Получить цену товара из регистра
Ответ #1 - 22. Октября 2007 :: 14:48
Печать  
Возможно пригодится мой вариант, правда это для DBF, для SQL даже попроще... возможно тебя устроит просто левое соединение (у меня надо было так, по всей номенклатуре)

Код
Выбрать все
|SELECT Запрос.Ном AS [Номенклатура $Справочник.Номенклатура]
	|, MAX(Запрос.Цена) AS ЦенаРег
	|, MAX(Запрос.Себ) AS ЦенаСпр
	|, MAX(Запрос.Цена + Запрос.Себ) AS Признак
	|
	|FROM (
	|
	|SELECT Номенклатура.ID AS Ном
	|, 0 AS Цена
	|, $Номенклатура.Себестоимость AS Себ
	|FROM $Справочник.Номенклатура AS Номенклатура
	|	WHERE Номенклатура.ID IN (" + ТекстЗапросаВлож +  ")
	|
	|UNION ALL
	|
	|SELECT $Цены.Номенклатура AS Ном
	|, $Цены.Цена AS Цена
	|, 0 AS Себ
	|FROM $Регистр.Цены AS Цены
	|WHERE ($Цены.Фирма = :ВыбФирма)
	|AND
	|Цены.IDDOC =
	|(
	|SELECT RIGHT(MAX(DTOS(Журнал.DATE) + Журнал.TIME + Журнал.IDDOC), 9)
	|FROM 1SJOURN AS Журнал
	|INNER JOIN $Регистр.Цены AS Цены1 ON Цены1.IDDOC = Журнал.IDDOC
	|WHERE ($Цены.Номенклатура = $Цены1.Номенклатура)
	|AND ($Цены1.Фирма = $Цены.Фирма)
	|)
	|	AND $Цены.Номенклатура IN (" + ТекстЗапросаВлож +  ")
	|
	|) AS Запрос
	|
	|GROUP BY
	|	Запрос.Ном;
 

  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Получить цену товара из регистра
Ответ #2 - 23. Октября 2007 :: 06:41
Печать  
Мало чем помогло... SQL не поддерживает запросы типа: SELECT FROM ( SELECT... Печаль

з.ы. Научите меня лучше пользовать "курсор", попробую через временную таблицу. Прокатит ли такой вариант:
Select катагории цен
По ним цикл
Select по товарам
По ним вложенный цикл
НУ а тут уже Select в регистры цен с условием на категорию и цену и Insert в #TMP, потом уже select из него и результат мне...
Такое имеет право на жизнь?
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Получить цену товара из регистра
Ответ #3 - 23. Октября 2007 :: 07:14
Печать  
zenik писал(а) 23. Октября 2007 :: 06:41:
Мало чем помогло... SQL не поддерживает запросы типа: SELECT FROM ( SELECT... Печаль


Озадачен Кто это тебе сказал?
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Получить цену товара из регистра
Ответ #4 - 23. Октября 2007 :: 07:57
Печать  
Цитата:
Озадачен Кто это тебе сказал?

Ага... За это я и ненавидел кошек... Оказалось, что просто не умел их готовить  Класс
Разобрался с SELECT FROM SELECT, работает...

Но все же... SQL не проникнется конструкцией:
SELECT Запрос.Ном AS [Номенклатура $Справочник.Номенклатура]
, MAX(Запрос.Цена) AS ЦенаРег
, MAX(Запрос.Себ) AS ЦенаСпр
, MAX(Запрос.Цена + Запрос.Себ) AS Признак
FROM ( SELECT Номенклатура.ID AS Ном

SQL не воспринимает "(" после FROM.
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Получить цену товара из регистра
Ответ #5 - 23. Октября 2007 :: 08:06
Печать  
zenik писал(а) 23. Октября 2007 :: 07:57:
[quote author=U_zer link=1193060353/0#3 SQL не воспринимает "(" после FROM.


Наверное, ты просто неверно написал подзапрос. Все он нормально воспринимает.
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Получить цену товара из регистра
Ответ #6 - 23. Октября 2007 :: 08:16
Печать  
Цитата:
Наверное, ты просто неверно написал подзапрос. Все он нормально воспринимает.


Да я просто эксперимента ради попробовал такую конструкцию:
SELECT * FROM ( SELECT * FROM Article1C )
Ругается на "("
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near ')'.

Понятное дело, что такой запрос в жизни нафиг не нужен, но это же упрощенный пример...
SELECT * FROM Article1C - нормально отрабатывает, без проблем
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Получить цену товара из регистра
Ответ #7 - 23. Октября 2007 :: 08:30
Печать  
Так, вот каких результатов я смог добиться:
SELECT TOP 10000 -- Пока для опытов
     T.CODE
     ,T.DESCR
     ,K.CODE
     ,K.DESCR
     ,R.SP15250
FROM
     RA15251 R
     ,( SELECT ID,CODE,DESCR FROM SC104 ) T
     ,( SELECT ID,CODE,DESCR FROM SC223 WHERE RTRIM(LTRIM(CODE)) IN (1,3) ) K
WHERE
     T.ID=R.SP15248
     AND K.ID=R.SP15249
ORDER BY
     R.IDDOC DESC

НО! Как теперь из этого запроса взять только ОДНУ ПОСЛЕДНЮЮ цену товара?
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Получить цену товара из регистра
Ответ #8 - 23. Октября 2007 :: 10:51
Печать  
там все же написано
Цены.IDDOC =
     |(
     |SELECT RIGHT(MAX(DTOS(Журнал.DATE) + Журнал.TIME + Журнал.IDDOC), 9)

заменить на

Цены.IDDOC =
     |(
     |SELECT RIGHT(MAX(Журнал.DATE_TIME_IDDOC), 9)

Если у регистра стоит быстрая обработка движений - можно оттуда брать без соединения с журналом
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Получить цену товара из регистра
Ответ #9 - 23. Октября 2007 :: 10:54
Печать  
Применительно к твоему если сильно не думать:

WHERE 
     T.ID=R.SP15248 
     AND K.ID=R.SP15249
AND R.IDDOC = (Select Max(Позиция) ...)
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Получить цену товара из регистра
Ответ #10 - 23. Октября 2007 :: 12:03
Печать  
Цитата:
Применительно к твоему если сильно не думать:

WHERE 
     T.ID=R.SP15248 
     AND K.ID=R.SP15249
AND R.IDDOC = (Select Max(Позиция) ...)


А если чуть-чуть подумать и применительно к моему случаю сказать что такого волшебного написать вместо "(Позиция) ... ". Я не доганяю

з.ы. Все пока делаю в QA...
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Получить цену товара из регистра
Ответ #11 - 23. Октября 2007 :: 12:54
Печать  
>>А если чуть-чуть подумать
Я думал ты подумаешь  Подмигивание
AND R.IDDOC = (Select right(max(J.date_time_iddoc),9) from _1sjourn as j (nolock)
inner join RA15251 as R1 (nolock) on R1.IDDOC = j.IDDOC
where --тут сам напиши по аналогии условие R1.Товар = R.Товар и т.п. , хрен знает что там у тебя что означает)
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Получить цену товара из регистра
Ответ #12 - 23. Октября 2007 :: 13:10
Печать  
Я не могу понять зачем еще что то брать из журнала? В регистре есть IDDOC, есть DATE_TIME_IDDOC... Зачем еще и журнал то вплетать? Можно же и без него... Но как...

По аналогии, я сделал так:
AND R.IDDOC=(SELECT MAX(R2.IDDOC) FROM RA15251 R2 )

Но получил только одну запись, ту которую сделал последний документ...
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Получить цену товара из регистра
Ответ #13 - 23. Октября 2007 :: 14:17
Печать  
Мальца подправил:

SELECT --TOP 1000
     T.CODE
     ,T.DESCR
     ,K.CODE
     ,K.DESCR
     ,R.SP15250
--      ,*
FROM
     RA15251 R
     ,( SELECT ID,CODE,DESCR FROM SC104) T
     ,( SELECT ID,CODE,DESCR FROM SC223 WHERE RTRIM(LTRIM(CODE)) IN ('1','3') ) K
WHERE
     T.ID=R.SP15248
     AND K.ID=R.SP15249
     AND R.IDDOC = (SELECT MAX(R2.IDDOC) FROM RA15251 R2 WHERE T.ID=R2.SP15248)
ORDER BY
     R.IDDOC DESC

Но получаю почемуто не все... Т.е. для категории 3 - 62000 с хвостиком, а для категории 1 - всего 150... Хотя количество цен должно быть одинаковое. Чем они срезаются, не понятно Печаль
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Получить цену товара из регистра
Ответ #14 - 23. Октября 2007 :: 14:19
Печать  
А... Понял чем срезаются, но не понял как избавиться... Срезаются они тем, что документ переоценка создается сперва по 1-й категории, а потом по 3-й. т.е. идет перекрытие... Как бы от него избавиться...?
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Получить цену товара из регистра
Ответ #15 - 23. Октября 2007 :: 15:29
Печать  
Все. Получился каменный цветочек. Если кому интересно:

SELECT
     T.CODE
     ,T.DESCR
     ,K.CODE
     ,K.DESCR
     ,R.SP15250
--      ,*
FROM
     RA15251 R
     ,( SELECT ID,CODE,DESCR FROM SC104) T
     ,( SELECT ID,CODE,DESCR FROM SC223 WHERE RTRIM(LTRIM(CODE)) IN ('1','3') ) K
WHERE
     T.ID=R.SP15248
     AND K.ID=R.SP15249
     AND R.IDDOC = (SELECT MAX(R2.IDDOC) FROM RA15251 R2 WHERE T.ID=R2.SP15248 AND K.ID=R2.SP15249)
ORDER BY
     R.IDDOC DESC
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Получить цену товара из регистра
Ответ #16 - 23. Октября 2007 :: 21:26
Печать  
zenik писал(а) 23. Октября 2007 :: 13:10:
Я не могу понять зачем еще что то брать из журнала? В регистре есть IDDOC, есть DATE_TIME_IDDOC... 

Мдя... я об этом же писал ранее, но овета "Да, у меня так и есть, быстрая обработка" не получил
ЗЫ. Фпринципе моно было бы и спасибо сказать...


  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Получить цену товара из регистра
Ответ #17 - 24. Октября 2007 :: 06:02
Печать  
Вадимко, прости... Спасибо!!! Просто написал запрос - и побег быстренько дальше писать.

А причем здесь "быстрая обработка движений"? Поле IDDOC есть и у регистров без этого признака... А DATE_TIME_IDDOC просто не пригодился. Можно обойтись и IDDOC... Или я чего то не знаю?
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Получить цену товара из регистра
Ответ #18 - 24. Октября 2007 :: 06:18
Печать  
IDDOC - это не последнее значение цены, расположение определяет Дата, Время, Иддок
Попробуй создать новый документ и поперемещать его (дата, время)
Документ, созданный последним, станет ЗА документом с ТАКИМ ЖЕ временем и датой
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Получить цену товара из регистра
Ответ #19 - 24. Октября 2007 :: 07:33
Печать  
Ага, ход мысли понятен... Но для данного документа - это не суть важно. Данный документ определяет ЦЕНУ товара. И логично, что назначать цену "задним числом" - сам себе злобный буратино. А так, на будущее учту. Или переделать... Ладно подумаю еще.

з.ы. Еще паз спсб.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Получить цену товара из регистра
Ответ #20 - 24. Октября 2007 :: 07:56
Печать  
zenik писал(а) 24. Октября 2007 :: 07:33:
Ага, ход мысли понятен... Но для данного документа - это не суть важно. Данный документ определяет ЦЕНУ товара. И логично, что назначать цену "задним числом" - сам себе злобный буратино. А так, на будущее учту. Или переделать... Ладно подумаю еще.

з.ы. Еще паз спсб.

Лучше послушай  совета Вадимко и переделай, а то появиться например УРБД и запрос перестанет неожиданно правильно работать.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать