Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Редактирование CrossTable / 10 сообщений из 10, страница 1 из 1
09.02.2004, 21:45
    #32403418
AlTis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование CrossTable
ms sql server2000 + adp.
Столкнулся со следующей задачей:
необходимо представить данные в виде CrossTable, причём должно поддерживаться редактирование данных.
Искал что-то подобное, по ссылкам нашёл ХП, которая разворачивает таблицу

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
CREATE PROC sp_CrossTab
  @table        AS sysname,                      -- Table to crosstab
 
  @onrows       AS nvarchar( 128 ),                -- Grouping key values (on rows)
 
  @onrowsalias  AS sysname = NULL,               -- Alias for grouping column
 
  @oncols       AS nvarchar( 128 ),                -- Destination columns (on columns)
 
  @sumcol       AS sysname = NULL                -- Data cells
 
AS

DECLARE
  @sql AS varchar( 8000 ),
  @NEWLINE AS char( 1 )

SET @NEWLINE = CHAR( 10 )
SET @sql = 'SELECT' + @NEWLINE + ' ' + @onrows +
  CASE
    WHEN @onrowsalias IS NOT NULL THEN ' AS ' + @onrowsalias
    ELSE ''
  END

CREATE TABLE #keys(keyvalue nvarchar( 100 ) NOT NULL PRIMARY KEY)

DECLARE @keyssql AS varchar( 1000 )
SET @keyssql = 
  'INSERT INTO #keys ' +
  'SELECT DISTINCT CAST(' + @oncols + ' AS nvarchar(100))' +
  'FROM ' + @table

EXEC (@keyssql)

DECLARE @key AS nvarchar( 100 )
SELECT @key = MIN(keyvalue) FROM #keys

WHILE @key IS NOT NULL
BEGIN
  SET @sql = @sql + ','                   + @NEWLINE +
    '  SUM(CASE CAST(' + @oncols +
                     ' AS nvarchar(100))' + @NEWLINE +
    '        WHEN N''' + @key +
           ''' THEN ' + CASE
                          WHEN @sumcol IS NULL THEN '1'
                          ELSE @sumcol
                        END + @NEWLINE +
    '        ELSE 0'                      + @NEWLINE +
    '      END) AS c' + @key
  
  SELECT @key = MIN(keyvalue) FROM #keys
  WHERE keyvalue > @key
END
SET @sql = @sql         + @NEWLINE +
  'FROM ' + @table      + @NEWLINE +
  'GROUP BY ' + @onrows + @NEWLINE +
  'ORDER BY ' + @onrows

PRINT @sql  + @NEWLINE  -- For debug
 
EXEC (@sql)
GO


Таблицу развернуть получилось. Далее я немного модифицировал код ХП, что именно, результат работы ХП я сохраняю как View, далее закачиваю во временную таблицу, вешаю на таблицу тригер, который изменяет данные в "родных" табл..
Вроде бы всё ок, но я никак не могу нормально отобразить заголовки столбцов.
На этом я и застрял.

Кто нибудь наверняка сталкивался с подобными проблемами.
Поделитесь опытом и скажите, я на верном пути?
Как это вообще делается?
...
Рейтинг: 0 / 0
10.02.2004, 06:50
    #32403521
Pavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование CrossTable
Здрастть всем, давненько меня тут не было!

Про верность пути судить не берусь, потому как мне и в голову не приходило редактировать сводные данные. Как то все редактированием исходных решалось. А вообще то есть триггеры Instead of, ими порешать можно. А что касается имен полей, например так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Set Nocount On
	
	If  (@Move_content_id Is Null) Or ( @Move_content_id =  0 )
	Begin
		Select Top  0  Null As Move_line_id, Null As Properties_group_id, Null As [Кол-во]
		Return
	End
	
	Declare @SqlStr VarChar( 7000 ), @orderStr VarChar( 1000 )

	Set @SqlStr = 'Select a.Move_line_id, a.Properties_group_id, Max(a.Move_line_quantity) As [Кол-во]'
	Set @orderStr = ''
	
	Select @sqlstr = @sqlstr + ', Max(Case c.Property_id When ' + Cast(c.Property_id As VarChar( 10 )) + ' Then d.Property_Value End) As [' + d.Property_name + ']',
	@orderStr = (Case @orderStr When '' Then ' Order By ' Else @orderStr + ', ' End) + '[' + d.Property_name + ']'
		From Properties d Inner Join PropertiesGroupsLines c On d.Property_id = c.Property_id
		Inner Join PropertiesGroups b On c.Properties_group_id = b.Properties_group_id
		Inner Join MovesLines a On b.Properties_group_id = a.Properties_group_id
			Where (a.Move_Content_id = @Move_content_id)
				Group By c.Property_id, d.Property_name

	Set @sqlstr = @sqlstr + ' From PropertiesValues d Inner Join PropertiesGroupsLines c On d.Property_value_id = c.Property_value_id Right Outer Join MovesLines a Inner Join PropertiesGroups b On a.Properties_group_id = b.Properties_group_id On c.Properties_group_id = b.Properties_group_id Where (a.Move_Content_id = ' + Cast(@Move_content_id As VarChar( 10 )) + ') Group By a.Move_line_id, a.Properties_group_id' + @orderStr
	
	Execute(@sqlstr)
...
Рейтинг: 0 / 0
10.02.2004, 09:36
    #32403613
AlTis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование CrossTable
2Pavel
Спасибо, но честно говоря я мало чего понял в коде.

2ALL
Неужели никто не делал нечто подобное?
Подскажите куда смотреть...
Я как-то где-то здесь видел коментарий Сенина Виктора по данному вопросу, но никак не могу его(коментарий) найти.
...
Рейтинг: 0 / 0
10.02.2004, 09:42
    #32403623
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование CrossTable
>но я никак не могу нормально отобразить заголовки столбцов.

что означает сия фраза?
что такое не нормально ?
что такое нормально ?
...
Рейтинг: 0 / 0
10.02.2004, 09:55
    #32403636
AlTis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование CrossTable
2АлексейК
Попробуй запусти эту ХП.
Заголовки столбцов будут такие : с1, с2, с3........
А мне надо, что бы заголовки столбцов назывались примерно так Товар1, Товар2,.... (Под Товаром подразумеваются данные таблицы @table столбца @oncols)
Я не очень силён в SQL, поэтому и прошу помощи.
...
Рейтинг: 0 / 0
10.02.2004, 09:59
    #32403643
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование CrossTable
покажи как вызываешь?

что у тебя в
@onrowsalias AS sysname = NULL, -- Alias for grouping column
...
Рейтинг: 0 / 0
10.02.2004, 10:09
    #32403652
AlTis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование CrossTable
Есть таблица t
c r v
1 10 100
2 10 110
3 11 120
4 11 130
5 11 140

exec sp_CrossTab 't','c','СТОЛБЕЦ','r','v'

@onrowsalias - псевдоним столбца, по которому происходит группировка
...
Рейтинг: 0 / 0
10.02.2004, 11:14
    #32403799
Pavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование CrossTable
Ну я жк в примере показал - As [Кол-во]
т.е. ты можешь сам назначать полям нужные названия. Вот только от универсальной процедурки придется отказаться, либо вводить в нее какие-то дополнительные критерии именования полей.
...
Рейтинг: 0 / 0
10.02.2004, 16:16
    #32404485
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование CrossTable
можно как павел написал при сливе во временную таблицу а можно и кростаб поменять если тебе с не нравится


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
alter PROC sp_CrossTab
  @table        AS sysname,                      -- Table to crosstab
 
  @onrows       AS nvarchar( 128 ),                -- Grouping key values (on rows)
 
  @onrowsalias  AS sysname = NULL,               -- Alias for grouping column
 
  @oncols       AS nvarchar( 128 ),                -- Destination columns (on columns)
 
  @sumcol       AS sysname = NULL                -- Data cells
 
AS

DECLARE
  @sql AS varchar( 8000 ),
  @NEWLINE AS char( 1 )

SET @NEWLINE = CHAR( 10 )
SET @sql = 'SELECT' + @NEWLINE + ' ' + @onrows +
  CASE
    WHEN @onrowsalias IS NOT NULL THEN ' AS ' + @onrowsalias
    ELSE ''
  END

CREATE TABLE #keys(keyvalue nvarchar( 100 ) NOT NULL PRIMARY KEY)

DECLARE @keyssql AS varchar( 1000 )
SET @keyssql = 
  'INSERT INTO #keys ' +
  'SELECT DISTINCT CAST(' + @oncols + ' AS nvarchar(100))' +
  'FROM ' + @table

EXEC (@keyssql)

DECLARE @key AS nvarchar( 100 )
SELECT @key = MIN(keyvalue) FROM #keys

WHILE @key IS NOT NULL
BEGIN
  SET @sql = @sql + ','                   + @NEWLINE +
    '  SUM(CASE CAST(' + @oncols +
                     ' AS nvarchar(100))' + @NEWLINE +
    '        WHEN N''' + @key +
           ''' THEN ' + CASE
                          WHEN @sumcol IS NULL THEN '1'
                          ELSE @sumcol
                        END + @NEWLINE +
    '        ELSE 0'                      + @NEWLINE +

' END) AS ' + @oncols + @key
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  
  SELECT @key = MIN(keyvalue) FROM #keys
  WHERE keyvalue > @key
END
SET @sql = @sql         + @NEWLINE +
  'FROM ' + @table      + @NEWLINE +
  'GROUP BY ' + @onrows + @NEWLINE +
  'ORDER BY ' + @onrows

 PRINT @sql  + @NEWLINE  -- For debug
 
EXEC (@sql)



если тебе не нравятся значения @оncols - можешь хоть временную таблицу добавить со своими названиями и подставлять их
...
Рейтинг: 0 / 0
10.02.2004, 19:00
    #32404754
AlTis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование CrossTable
Pavel,АлексейК
Большое спасибо, всё получилось.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Редактирование CrossTable / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]