Имя: Пароль:
1C
1C 7.7
v7: Помогите с запросом sql 1с++
,
0 failures
 
29.03.12
06:25
Я начинающий в прямых запросах к SQL. Столкнулся с одной проблемой. Есть примерно такой код:

тз.ВыбратьСтроки();
Пока тз.ПолучитьСтроку()=1 Цикл
   ДокОснование=тз.ДокОснование;
   Пока ПустоеЗначение(докОснование.ДокОснование)=0 Цикл
       докОснование=ДокОснование.ДокОснование;
   КонецЦикла;
   тз.ДокОснование=ДокОснование;
КонецЦикла;

То есть ищется первый документ в структуре подчиненности (все документы одного типа, поле "докоснование" - поле документа, а не журнала). Можно ли создать прямой запрос через 1с++, чтобы по списку документов получить соответствующие документы, которые первые в структуре подчиненности?
47 Ёпрст
 
29.03.12
09:50
(41) дык совсем недавно ставил - всё равно вылет, пришлось на 24 откатиться аварийно..
48 Ёпрст
 
29.03.12
09:51
хотя 26 работает шустрее на части запросов по сравнению с 24, почему - загадка :)
49 failures
 
29.03.12
10:15
(26) индексированная таблица не помогла, много времени уходит на построение индекса...
50 Mikeware
 
29.03.12
10:17
51 Он
 
29.03.12
10:21
(50) Что в файле?
52 Mikeware
 
29.03.12
10:23
(51)
2012-03-29 12:15        138022        138022  1cpp.rar
#  Архив 1cpp.rar
2006-11-02 11:20         26754          5962  1CPP_Classes.als
2008-06-02 19:59         14219          4269  1CppSQLTab.als
2010-06-03 15:16         85028         17274  1C++_Add.als
2008-03-27 14:25         60708         18576  Transact_SQL.als
2010-05-05 12:40        318857         68726  1C++.als
2010-05-05 12:40         43313          8706  ИндексированнаяТаблица.als
2010-05-05 12:40         64095         14103  ТабличоеПоле.als
#
# Всего:                Размер          Сжат  Файлы
#                       138022        138022  1
53 viktor_vv
 
29.03.12
10:23
(49) А индекс ты строишь по внутреннему идентификатору или по представлению ?
54 Он
 
29.03.12
10:25
(52) Transact_SQL.als - похоже то, что нужно. Остальное у меня есть.
Спасибо.
55 Mikeware
 
29.03.12
10:26
(54) там лишь выдержки из BOL. правда, на русском, но это кагбэ пофиг.
56 failures
 
29.03.12
10:28
(53) итз.ДобавитьИндекс("Ссылка","Ссылка");
57 Ёпрст
 
29.03.12
10:29
(56) *ССылка
58 viktor_vv
 
29.03.12
10:31
(56) итз.ДобавитьИндекс("Ссылка","*Ссылка");

так понятнее будет наверное.
59 failures
 
29.03.12
10:36
(57) Все равно индекс строится медленно... В таблице для поиска получается всегда больше 50 000 строк...
60 failures
 
29.03.12
10:38
Надо как-то этот поиск весь средствами sql организовать, иначе все равно все медленно работает...
61 Он
 
29.03.12
10:39
(55) Поставил. Посмотрел. Да - куце.
На безрыбье и рак рыба.

Как заставить Скуль2005 освободить память после завершения сеанса 1С?
На локальной 2-й тренируюсь.
62 Ёпрст
 
29.03.12
10:43
(61) как дружил с 2005, для начала ?
63 Mikeware
 
29.03.12
10:44
(60) у тебя точно вся цепочка подчинения - документы одного вида?
64 Он
 
29.03.12
10:50
(62) Дружили до меня.
Я просто взял дистрибут 2005-го, КаталогИБ и бэкап.
Дома поставил поднял - всё работает. Но память жрёт падлюка и не отдаёт после завершения сеанса 1С.
Чую, что в Студио что-то надо настроить. А что?
65 Ёпрст
 
29.03.12
10:52
(64) взять секретный релиз платформы и попробовать на нём, это для начала.
66 Андрюха
 
29.03.12
10:53
(65) Отче, надёже князь говорит, что память-то не 1С жрет, а SQL
67 Ёпрст
 
29.03.12
10:54
(66) дык мот он в соединениях скуля еще висит
68 Ёпрст
 
29.03.12
10:55
да и 1с-ина не сразу высвобождает ресуры после закрытия
69 Андрюха
 
29.03.12
10:57
1С на клиенте, а SQL на сервере я так понимаю выжирает
70 Ёпрст
 
29.03.12
10:59
(69) да не..он же дома, на домашнем компике всё делает
71 failures
 
29.03.12
11:00
(63) нет, там есть документы других видов. Но меня они не интересуют. К тому же если их обрабатывать, то будет зацикливание.
72 Андрюха
 
29.03.12
11:01
(70) Пхх... Дома-то чё, пускай лопает, в крайнем случае ресетнулся.
73 Ёпрст
 
29.03.12
11:02
(72) ну а порево как глядеть ? Тормозит же всё!
:)
74 Mikeware
 
29.03.12
11:07
(71) Если главная ветка цепочки - документы одного вида (скажем, заявки- коректирующие заявки), и тебе нужно найти корень (док с пустым основанием) - на мой взгляд, лучше всего рекурсивная функция.
Тем более, что тебе не нужна вся цепочка, и надо искать регулярно...
75 failures
 
29.03.12
11:24
(74) сейчас реализована рекурсивная функция, но она реализована как цикл... вопрос в том, что рекурсия большая, обращений много, и потому все делается медленно...
76 Mikeware
 
29.03.12
11:25
(75) сиквельную функцию
77 Андрюха
 
29.03.12
11:41
(76) Есть наброски?
78 failures
 
29.03.12
11:44
нет набросков. я же говорю, что начинающий, не знаю как сделать рекурсивный поиск в sql.
79 dk
 
29.03.12
11:51
(78) можно в скуле запросом, уровней на 5 просчитать
а потом остальные уровни в 1с допилить - т.к. допиливать скорее всего не придется, то скорость должна прилично возрасти
80 Mikeware
 
29.03.12
11:59
(77) как-то так:

CREATE FUNCTION DocRoot(@doc char(9))
RETURNS char(4)
AS
BEGIN
 DECLARE @CurDocRoot char(9)
 DECLARE @DocRoot char(9)
 SET @CurDocRoot = SELECT right($Заявка.ДокОснование,9)
   FROM $Документ.ЗаявкаПокупателя Заявка
  where Заявка.iddoc=@doc

  IF (@CurDocRoot=$ПустойИД)
     SET @DocRoot= @doc
  ELSE
     SET @DocRoot= Select dbo.DocRoot(@CurDocRoot)
RETURN(@DocRoot)
END
---------
у меня нет длинных цепочек, а в 1с лезть лениво...
81 Андрюха
 
29.03.12
12:17
(80) Не силен в SQL процедурах. И чё, этим можно пользоваться из 1С?
82 Ёпрст
 
29.03.12
12:18
(81) в клюшках - запросто!
83 Андрюха
 
29.03.12
12:20
научите!!!
84 Ёпрст
 
29.03.12
12:24
(83) чему ? хошь, по адо, хошь с помощью 1cpp
Или тебя научить писать пользовательские функции?
:)
85 Ёпрст
 
29.03.12
12:25
с 1сpp быстрее - есть встроенный метапарсер имён
86 Андрюха
 
29.03.12
12:27
Нее, пользовательскую функцию допустим я сам попытаюсь, а можно пример вызова из 1c++ чтобы с возвращением результата, скажем документа какого-нибудь
87 Гефест
 
29.03.12
12:29
(86) Вот например остаток на каждую дату в запросе без ВТ:

   ТекстЗапроса = "
   |declare @@curDate datetime
   |declare @@endDate datetime
   |
   |set @@curDate = cast('"+Дата1+"' AS datetime)  
   |set @@endDate = cast('"+Дата2+"' AS datetime)
   |
   |set nocount on
   |
   |
   |while @@curDate<=cast('"+Дата2+"' AS datetime)
   |begin
   |     insert into #DateTable(Товар,ОстатокТовара,Расход,Дата)
   |     SELECT
   |       Рег.Товар                [Товар],
   |       SUM(Рег.ОстатокТовара)    [ОстатокТовара],  
   |       SUM(Рег.Расход)            [ОстатокТовара],  
   |       @@curDate                [Дата]
   |     FROM
   |        (  
   |           SELECT
   |             $rg.Товар                    [Товар],
   |             $rg.ОстатокДляПродажи        [ОстатокТовара],  
   |             0                            [Расход]  
   |           FROM
   |             $РегистрИтоги.ОстаткиТоваров AS rg (nolock)
   |           WHERE
   |              rg.period = dateadd(m,-1,dateadd(dd,-day(@@curDate)+1,@@curDate))";
                   Если СписокНоменклатура.РазмерСписка()>0 Тогда    
                       ТекстЗапроса = ТекстЗапроса + "
                       |AND $rg.Товар IN (SELECT val FROM #СписокТоваров)";
                       ЗапросSQL.УложитьСписокОбъектов(СписокНоменклатура,"#СписокТоваров","Номенклатура");    
                   КонецЕсли;  
                   Если СписокСклады.РазмерСписка()>0 Тогда    
                       ТекстЗапроса = ТекстЗапроса + "
                       |AND $rg.Склад IN (SELECT val FROM #СписокСкладов)";
                       ЗапросSQL.УложитьСписокОбъектов(СписокСклады,"#СписокСкладов","МестаХранения");    
                   КонецЕсли;  
                   ТекстЗапроса = ТекстЗапроса + "
   |           UNION ALL
   |           SELECT
   |             $ra.Товар                                      [Товар],
   |             $ra.ОстатокДляПродажи*(1-ra.debkred*2)        [ОстатокТовара],  
   |             0                                                [Расход]  
   |           FROM
   |             $Регистр.ОстаткиТоваров ra (nolock)
   |           INNER JOIN
   |             _1sjourn j (nolock) on j.iddoc = ra.iddoc
   |           WHERE
   |              cast(left(j.date_time_iddoc,8) AS datetime) between dateadd(dd,-day(@@curDate)+1,@@curDate) AND @@curDate";
                   Если СписокНоменклатура.РазмерСписка()>0 Тогда    
                       ТекстЗапроса = ТекстЗапроса + "
                       |AND $ra.Товар IN (SELECT val FROM #СписокТоваров)";
                   КонецЕсли;    
                   Если СписокСклады.РазмерСписка()>0 Тогда    
                       ТекстЗапроса = ТекстЗапроса + "
                       |AND $ra.Склад IN (SELECT val FROM #СписокСкладов)";
                   КонецЕсли;    
                   ТекстЗапроса = ТекстЗапроса + "  
   |           UNION ALL  
   |
   |           SELECT
   |             $ra2.Товар                                      [Товар],
   |             0                                                [ОстатокТовара],  
   |             $ra2.ОстатокДляПродажи*ra2.DEBKRED            [Расход]  
   |           FROM
   |             $Регистр.ОстаткиТоваров ra2 (nolock)
   |           INNER JOIN
   |             _1sjourn j (nolock) on j.iddoc = ra2.iddoc
   |           WHERE
   |              cast(left(j.date_time_iddoc,8) AS datetime) = @@curDate";
                   Если СписокНоменклатура.РазмерСписка()>0 Тогда    
                       ТекстЗапроса = ТекстЗапроса + "
                       |AND $ra2.Товар IN (SELECT val FROM #СписокТоваров)";
                   КонецЕсли;      
                   Если СписокСклады.РазмерСписка()>0 Тогда    
                       ТекстЗапроса = ТекстЗапроса + "
                       |AND $ra2.Склад IN (SELECT val FROM #СписокСкладов)";
                   КонецЕсли;      
                   ТекстЗапроса = ТекстЗапроса + "
   |           UNION ALL
   |
   |           SELECT
   |             $ra3.Товар                                      [Товар],
   |             0                                                [ОстатокТовара],  
   |             0                                                [Расход]  
   |           FROM
   |             $Регистр.ОстаткиТоваров ra3 (nolock)
   |           INNER JOIN
   |             _1sjourn j (nolock) on j.iddoc = ra3.iddoc
   |           WHERE
   |              cast(left(j.date_time_iddoc,8) AS datetime) between @@curDate AND @@endDate";
                   Если СписокНоменклатура.РазмерСписка()>0 Тогда    
                       ТекстЗапроса = ТекстЗапроса + "
                       |AND $ra3.Товар IN (SELECT val FROM #СписокТоваров)";
                   КонецЕсли;          
                   Если СписокСклады.РазмерСписка()>0 Тогда    
                       ТекстЗапроса = ТекстЗапроса + "
                       |AND $ra3.Склад IN (SELECT val FROM #СписокСкладов)";
                   КонецЕсли;          
                   ТекстЗапроса = ТекстЗапроса + "  
   |        ) Рег  
   |     GROUP BY
   |        Рег.Товар
   |     set @@curDate = dateadd(dd,1,@@curDate)
   |  end
   |";    
   
   

   рез = ЗапросSQL.Выполнить(ТекстЗапроса);
   Если рез = 0 Тогда
       Сообщить(ЗапросSQL.ПолучитьОписаниеОшибки());
       Возврат;
   КонецЕсли;
88 Андрюха
 
29.03.12
12:32
(87) О, спасибо!
89 Mikeware
 
29.03.12
12:37
(83)
рс=создатьОбъект("ODBCRecordSet");
рс.УстановитьТекстовыйПараметр("ВыбДокумент",ДокументКореньКоторогоИщем)$
Корень=рс.ВыполнитьСкалярный("select dbo.DocRoot(:ВыбДокумент)");
90 Ёпрст
 
29.03.12
12:41
(87) вот будет другая периодичность хранения останкови и усё, писец котёнку
:)
91 Ёпрст
 
29.03.12
12:43
да и.. проще как то табличку с датами соединить с запросам по останкам, и в нём группировку по дате слепить..
92 Mikeware
 
29.03.12
12:43
(91) албанские пионеры не ищут простых путей!
93 Андрюха
 
29.03.12
12:47
(89) И ШО РАБОТАЕТ???
94 Гефест
 
29.03.12
12:48
(90) Это негарантийный случай!
(91) В те даты, когда не было движений, остаток будет null. А тут фсе есть
95 Андрюха
 
29.03.12
12:50
Плин, если в (89) рабочий вариант, то можно начинать ср@ть кирпичами от счастья...
96 Ёпрст
 
29.03.12
12:51
(94) дык с табличкой дат соединяешься и там coalesce(0,запросПоОстанкам.Остаток)

ну хотя, работает и ладно
97 viktor_vv
 
29.03.12
12:51
(95) Кажись только начиная с 2005 MSSQL, если ничего не путаю.
98 viktor_vv
 
29.03.12
12:52
(97)+ Наверное путаю, это про рекурсивные запросы.
99 Андрюха
 
29.03.12
12:53
Пошёл пробувати
100 Андрюха
 
29.03.12
12:53
100 кстати
101 Гефест
 
29.03.12
12:55
(96) Дык остаток-то не 0, а некое число
102 Андрюха
 
29.03.12
12:56
Ругается. Cannot find either column "dbo" or the user-defined function or aggregate "dbo.DocRoot", or the name is ambiguous.

ЧЯДНТ?
103 Ёпрст
 
29.03.12
12:58
(101) не вкурил твою мыслю.
104 Mikeware
 
29.03.12
12:58
(102) так функцию-то создал?
105 Mikeware
 
29.03.12
12:58
(101) а ноль - это  буква, чтоль?
106 Z1
 
29.03.12
13:02
(87) Вместо
cast(left(j.date_time_iddoc,8) AS datetime) between ...
надо наоборот  дату(ы) преобразовывать в строку

j.date_time_iddoc between Стр_дата1 and Стр_Дата2

ну и еще в 87 нет как создается #DateTable и какие на ней индексы
107 Гефест
 
29.03.12
13:03
(103) Например, на первое число остаток 10, второго и третьего числа движений по регистру нет

Если я соединю таблицу дат с ВТ ОстаткиИОбороты по твоему способу, то остаток будет на первое число 10, на второе и третье число остаток 0. А должен быть 10
108 viktor_vv
 
29.03.12
13:04
(96) А разве не Isnull()? coalesce() в таком варианте всегода 0 вернет по идее.
109 Андрюха
 
29.03.12
13:04
(104) Неа )))
110 Ёпрст
 
29.03.12
13:11
(107) а.. ты об этом
(108) ага, но смысл понятен
111 Mikeware
 
29.03.12
13:13
(109) дык!
112 Z1
 
29.03.12
14:51
(87) Вы понимаете что запрос надо обязательно
улучшить как написано в (106)  ?
113 Он
 
29.03.12
16:18
ТекстЗапроса = "
   |SELECT Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура], Рег.КоличествоОстаток as Количество
   |FROM $РегистрОстатки.ОстаткиТМЦ (:НаДату,, (Номенклатура),,, (Количество)) as Рег";
   //|FROM $РегистрОстатки.ОстаткиТМЦ as Рег";
   RS.УстановитьТекстовыйПараметр("НаДату", ВыбДата);
   ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса);

ВыбДата - реквизит на форме типа Дата

Выдаёт:
{C:\BASE1C\ERT\ПРЯМЫЕ.ERT(32)}: State 42000, native 102, message [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near '20120101'.

Что не так делаю?
114 viktor_vv
 
29.03.12
16:34
|FROM $РегистрОстатки.ОстаткиТМЦ (:НаДату,, ,(Номенклатура),(Количество) ) as Рег";
115 viktor_vv
 
29.03.12
16:35
И на конец дня надо :НаДату~
116 Он
 
29.03.12
16:36
(114) Измерение "Номенклатура" 2-е из 4-х
117 Mikeware
 
29.03.12
16:37
(116) пофиг.
читай список параметров
118 Он
 
29.03.12
16:39
(115)
{C:\BASE1C\ERT\ПРЯМЫЕ.ERT(33)}: State 42000, native 102, message [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near '20111231Z'.

Надо видимо как то преобразовать ВыбДата.
В статье Акцента напрямую ставятся
119 Mikeware
 
29.03.12
16:40
(118) запятую поставил?
120 Он
 
29.03.12
16:41
(114) Сделал как в (114). Результат тот же.
121 Он
 
29.03.12
16:42
Подставлял ПолучитьПозициюДокумента.
Тоже выплёвывает.
122 viktor_vv
 
29.03.12
16:43
RS.УстановитьТекстовыйПараметр("НаДату", ВыбДата);
RS.Отладка(1);
   ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса);

RS.Отладка(0);

Правда вывалит дофига наверное.
123 Он
 
29.03.12
16:47
SELECT Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура], Рег.КоличествоОстаток as Количество
FROM (
select
rg405_vt.sp4062 as Фирма,
rg405_vt.sp408 as Номенклатура,
rg405_vt.sp418 as Склад,
rg405_vt.sp3117 as ЦенаПрод,
rg405_vt.sp411 as КоличествоОстаток,
rg405_vt.sp10260 as КолВоСВОстаток,
rg405_vt.sp11365 as ВесОстаток
from rg405 as rg405_vt (nolock)
where rg405_vt.period={d '2012-03-01'}
and (
rg405_vt.sp411 <> 0 or
rg405_vt.sp10260 <> 0 or
rg405_vt.sp11365 <> 0
)
124 Mikeware
 
29.03.12
16:49
SELECT Остатки.Номенклатура [Номенклатура $Справочник.Номенклатура]
   , Остатки.КоличествоОстаток
FROM $РегистрОстатки.ОстаткиТМЦ(:ВыбДата~,,,
       (Номенклатура),(Количество)) as Остатки
125 Он
 
29.03.12
16:57
(124) Пробовал.
Упростил:

   ТекстЗапроса = "
   |SELECT Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура], Рег.КоличествоОстаток as Количество
   //|FROM $РегистрОстатки.ОстаткиТМЦ (:НаДату,,, (Номенклатура), (Количество)) as Рег";
   |FROM $РегистрОстатки.ОстаткиТМЦ (:НаДату) as Рег";
   RS.УстановитьТекстовыйПараметр("НаДату", ВыбДата);

Та же граната
126 viktor_vv
 
29.03.12
17:02
|FROM $РегистрОстатки.ОстаткиТМЦ(:НаДату) as Рег";

Пробел убери  $РегистрОстатки.ОстаткиТМЦ (:НаДату) as Рег"
127 Ёпрст
 
29.03.12
17:03
(124) и база поди формата ДБФ ?
:)))))))))))))))))))))))))))))))))))))))))))
128 Он
 
29.03.12
17:14
Пипец!!!
Дело в пробеле было *нервный смех*

(126) Спасибо!
129 Он
 
29.03.12
17:15
Прямым получилось в 53 раза быстрее сделать ВыгрузитьИтоги()
130 Он
 
29.03.12
17:19
Я так понимаю - СводныйОстаток() будет также с добавлением WHERE.
Так?
131 Ёпрст
 
29.03.12
17:21
(129) что то у тебя не так с базо, либо ты не то делаешь
если на ТА то выирышь небольшой, если на отличную от ТА дату - то да, выигрышь будет за счет пересчета итогов
132 viktor_vv
 
29.03.12
17:25
Че-то как-то да, сильно быстро. Обычно этои операции не особо отличаются по скорости. Тем более учитывая во что у тебя развернулась ВТ, то берешь ты на ТА остатки.
133 Он
 
29.03.12
17:25
(131) На ТА ВыгрузитьИтоги() отработало раз в 10 быстрее прямого

А вот на дату.
Базу обследую на предмет косяков перед свёрткой. Незакрытых регистров несколько уже нашёл.
134 viktor_vv
 
29.03.12
17:27
(130) Сводный остаток будет с указанием только необходимых измерений в параметрах ВТ.
135 Он
 
29.03.12
17:27
ТекстЗапроса = "
   |SELECT Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура], Рег.КоличествоОстаток as Количество
   //|FROM $РегистрОстатки.ОстаткиТМЦ (:НаДату,,, (Номенклатура), (Количество)) as Рег";
   |FROM $РегистрОстатки.ОстаткиТМЦ(:НаДату) as Рег";
   RS.УстановитьТекстовыйПараметр("НаДату", ВыбДата);
   ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса);
   Сообщить("" + ТЗ.КоличествоСтрок() + " = " + (_GetPerformanceCounter() - Нач) / 1000);
   ТЗ.Выгрузить(Тпр);
   Тпр.Свернуть("Номенклатура", "Количество");
   Тпр.Сортировать("Номенклатура");
   Форма.Обновить();
   
   Нач = _GetPerformanceCounter();
   Рег = СоздатьОбъект("Регистр.ОстаткиТМЦ");
   Рег.ВременныйРасчет(1);
   РассчитатьРегистрыНа(ВыбДата);
   Рег.ВыгрузитьИтоги(ТЗ);
   Сообщить("" + ТЗ.КоличествоСтрок() + " = " + (_GetPerformanceCounter() - Нач) / 1000);
   ТЗ.Выгрузить(Т);
   Т.Свернуть("Номенклатура", "Количество");
   Т.Сортировать("Номенклатура");

Две ТЗ перед глазами. Абсолютно идентичны.
136 Он
 
29.03.12
17:30
(134) Это понятно.
Сделал на 01.01.08. Результат (сек):
0.006
0.399
137 Mikeware
 
29.03.12
17:35
(136) разница в том, что временный расчет считает сначала, а виртуальная таблица - с того конца, откуда быстрее.
и в этом, кстати, есть и засада
138 Он
 
29.03.12
17:36
(137) Надо запомнить.
Ща попробую на 01.01.05
139 Mikeware
 
29.03.12
17:38
+(137) сворачивать не надо, после запроса все и так будет свернуто по номенклатуре.
а
left join $Справочник.Номенклатура Спр (nolock) on Спр.id=Остатки.Номенклатура
group by Спр.descr
сразу даст и отсортированную
140 Mikeware
 
29.03.12
17:40
+(139) а если выгрузить оба запроса в индексированные таблицы, и применить Разность() - получишь различия
141 Он
 
29.03.12
17:42
(139) После ВыгрузитьИтоги() надо свернуть. Поэтому и эту свернул для чистоты эксремента.

(139) Рано ещё мне такие прибамбасы. Я только что свой первый работающий запрос написал.
142 Ёпрст
 
29.03.12
17:43
(141) Зачем сворачивать после выгрузитьИтоги ?
143 Он
 
29.03.12
17:44
(142) Там ТЗ со всеми измерениями и ресурсами.
144 Ёпрст
 
29.03.12
17:45
(143) а ну да, фильтры то ты не установил
145 viktor_vv
 
29.03.12
17:46
(139) Order by , а то сейчас насворачиваешь ему по наименованию :).
146 Mikeware
 
29.03.12
17:47
(145) каюсь, грешен.
приспичило сейчас обновить старый отчет, воюю с группировками - вот и вырвалось...