AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.05.2007, 12:18   #1  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Цитата:
Сообщение от oip Посмотреть сообщение
Не в джойне дело.
В нем тожа, просто сначала темы не понять чего автор хочит, толи через И толи через ИЛИ... Смотрите мой первый пост, там чтото похожее на правду...
Старый 29.05.2007, 12:48   #2  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 438 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Сори. Последний раз фигню написал. На автобус спешил (похавать).
Есть три тиблицы как я понял. Первая номенклатуры. Вторая характеристики и третья связь характеристик с номенклатурами.
X++:
While select table1//номенклатуры
{
    While select table2//характеристики
    {
        select table3 // связь
        where table3.itemId=ItemId && table3 && 
        table3.feature=table2.id //т.е. А.В. С и т.д. по очереди
        if (table2.id = C && table3) //последней и характеристика есть
        {
         ,    
        }
        if (! table3)
        {
        //как только первой нет выходим и берём следующую номенклатуру для проверки
        break;
        }
    }
}
Хотя через одно место, в принципе если подумать можно ещё как нибудь придумать даже быстрее, только всё равно будет через то место.

Последний раз редактировалось miklenew; 29.05.2007 в 14:52.
Старый 29.05.2007, 12:58   #3  
leshy is offline
leshy
Участник
 
118 / 11 (1) +
Регистрация: 23.02.2004
Адрес: Киев
[QUOTE=miklenew;139595]
Есть три тиблицы как я понял. /QUOTE]

Две таблицы: Таблица товаров и таблица характеристик. Хотя это ничего не меняет.
Старый 29.05.2007, 12:12   #4  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Это чо папало...Так низя...
Старый 29.05.2007, 12:48   #5  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
И получаем жесткий подвисон (это - про нижеприведенное сообщение )

Уж лучше тогда вариант с count

X++:
while select table1 //ItemId
group by itemId
{
    select count(RecId) from table2
    group by itemId/*, feature - это лишнее*/
    where table2.itemid == table1.itemid;
    
    if (table2.recId == #NeededAmountOfFeautres)
    {
     //save value
    }
}

Последний раз редактировалось kashperuk; 29.05.2007 в 13:11.
Старый 29.05.2007, 13:08   #6  
leshy is offline
leshy
Участник
 
118 / 11 (1) +
Регистрация: 23.02.2004
Адрес: Киев
Цитата:
Сообщение от kashperuk Посмотреть сообщение
И получаем жесткий подвисон (это - про нижеприведенное сообщение )

Уж лучше тогда вариант с count

X++:
while select table1 //ItemId
group by itemId
{
    select count(RecId) from table2
    group by itemId, feature
    where table2.itemid == table1.itemid;
    
    if (table2.recId == #NeededAmountOfFeautres)
    {
     //save value
    }
}
В твоем варианте Иван нужно использовать контейнеры. Ради справедливости следует сказать что оно и сейчас реализовано через контейнеры: сначала выбираются все конфигурации а потом накладываются в качестве фильтра на таблицу конфигураций. Это отлично работало пока некоторых конфигураций с заданными харкетиристиками не стало слишком много (в моем случае 500), в этом случае система ругается что [Microsoft][ODBC SQL Server Driver][SQL Server]Line 1: Incorrect syntax near '('. Если вариантов меньше. все работает как нужно.
Не могу понять почему: есть какое то ограничение на размер запроса? (длина строки получается больше 9000 символов) или что-то другое?
Старый 29.05.2007, 13:42   #7  
Yugene is offline
Yugene
Участник
 
46 / 11 (1) +
Регистрация: 02.12.2004
Адрес: Moscow
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Уж лучше тогда вариант с count
Но только не забыть наложить-таки условие на select ... from table2, иначе выберутся просто все номенклатуры, у которых два любых свойства.

leshy
Размер запроса ограничивается SQL Server'ом, как-то натыкались...
Старый 29.05.2007, 14:33   #8  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
Цитата:
Сообщение от Yugene Посмотреть сообщение
leshy
Размер запроса ограничивается SQL Server'ом, как-то натыкались...
AFAIK ограничение по длинне запроса в SQL Server 2000 8Kb, так что 9000 символов не выходят за сей предел. Если конечно сосчитали правильно, а не посимвольно
Старый 29.05.2007, 14:41   #9  
leshy is offline
leshy
Участник
 
118 / 11 (1) +
Регистрация: 23.02.2004
Адрес: Киев
Цитата:
Сообщение от Lemming Посмотреть сообщение
AFAIK ограничение по длинне запроса в SQL Server 2000 8Kb, так что 9000 символов не выходят за сей предел. Если конечно сосчитали правильно, а не посимвольно
Lemming подскажите пожалуйста как мне узнать длину запроса, потому что я действительно считал посимвольно.
Старый 29.05.2007, 14:52   #10  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
Cool
жара однако, 9000 символов это больше 8 Кб, приношу свои извенения, ашыпся. Похоже ограничение на длинну запроса, как раз и является причиной ошибки.
Старый 31.05.2007, 14:13   #11  
Dolter is offline
Dolter
1C
1C
 
83 / 18 (1) ++
Регистрация: 18.11.2005
Чистый T-SQL (только что проверил работоспособность):
X++:
SELECT id, descr, SUM(f1) AS f1, SUM(f2) AS f2, SUM(f3) AS f3
FROM (SELECT t1.id
                       , t1.descr
                       , CASE WHEN t2.f = 1 THEN t2.f ELSE NULL END AS f1
                       , CASE WHEN t2.f = 2 THEN t2.f ELSE NULL END AS f2
                       , CASE WHEN t2.f = 3 THEN t2.f ELSE NULL END AS f3
            FROM Table1 AS t1 INNER JOIN
                                              Table2 AS t2 ON t1.id = t2.id) AS derivedtbl_1
GROUP BY id, descr
HAVING (SUM(f1) IS NOT NULL) AND (SUM(f2) IS NOT NULL) AND (SUM(f3) IS NOT NULL)
З.Ы. как это сделать в Аксапте - без понятия :-)

Последний раз редактировалось Dolter; 31.05.2007 в 14:16.
Старый 31.05.2007, 14:51   #12  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2499 (89) +++++++++
Регистрация: 20.08.2005
А зачем так сложно?
X++:
SELECT Table1.Id, Table1.Descr
FROM Table1 INNER JOIN Table2 ON Table1.Id = Table2.Id
WHERE Table2.f = 1 OR Table2.f = 2 OR Table2.f = 3 /*или Table2.f IN (1, 2, 3)*/
GROUP BY Table1.Id, Table1.Descr
HAVING COUNT(*) = 3
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Dolter (1).
Теги
ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Помогите с запросом AvrDen DAX: Программирование 8 07.08.2007 15:24
Помогите с запросом Antonuch DAX: Программирование 4 21.06.2007 15:46
помогите с запросом oleg_e DAX: Программирование 4 10.10.2006 13:04
Помогите с запросом.. DarkBear DAX: Программирование 2 15.08.2005 13:38
Помогите с SQL запросом malex DAX: Программирование 8 26.07.2005 13:43

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:11.