Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Как транспонировать таблицу?  [new]
Alex1st
Member

Откуда:
Сообщений: 11
Люди!
Кто может подсказать, как можно запросом транспонировать таблицу?
Имеем тэйбл: по горизонтали районы, по вертикали менеджеры, на перекрестье - суммы.
Нужно, чтобы по горизонтали стали менеджеры, по вертикали - районы.
КАК?!!..
На ВБА можно создать таблицу с полями из столбца менеджеров, а потом
перебрать всю таблицу вручную. Только долгл это и муторно...
А на SQL как?
25 фев 03, 09:54    [134630]     Ответить | Цитировать Сообщить модератору
 Re: Как транспонировать таблицу?  [new]
Alex1st
Member

Откуда:
Сообщений: 11
Блин, отвечаю сам себе...
Эта функция "распрямит" перекрестный запрос в строчную таблицу с тремя полями, а уже ее спокойно разворачиваем перекрестным запросом в лбую нужную сторону!

Option Compare Database

Sub TransformToRows(tIN_TableName, tOUT_TableName, tDataType As DataTypeEnum)
Dim MyRstIn As Recordset
Dim MyRstOut As Recordset
Dim tFields(2)
Dim tData
Dim J As Long, I As Long
Dim TableHeight, TableWidth

'создать выходную таблицу
tFields(0) = "Строки"
tFields(1) = "Столбцы"
tFields(2) = "Данные"
MakeTable tOUT_TableName, tFields, tDataType

'открыть исходную
Set MyRstIn = CurrentDb.OpenRecordset(tIN_TableName, dbOpenDynaset)
'открыть выходную
Set MyRstOut = CurrentDb.OpenRecordset(tOUT_TableName, dbOpenDynaset)

TableWidth = MyRstIn.fields.Count - 1

ReDim tData(TableWidth)

With MyRstIn
.MoveLast
.MoveFirst
TableHeight = .RecordCount
End With

'получение данных в таблицу
For I = 1 To TableHeight

tData(0) = MyRstIn.fields(0) ' Данные из первого столбца

' получить данные
For J = 1 To TableWidth
tData(1) = MyRstIn.fields(J).Name ' Имя столбца J
tData(2) = MyRstIn.fields(J) ' Данные столбца J

' записать данные
With MyRstOut
.AddNew
'Заполнение полей значениями
.fields(tFields(0)) = tData(0)
.fields(tFields(1)) = tData(1)
.fields(tFields(2)) = tData(2)
.Update
End With

Next J

MyRstIn.MoveNext
Next I

MyRstIn.Close
Set MyRstIn = Nothing
MyRstOut.Close
Set MyRstOut = Nothing

End Sub


Sub MakeTable(tTableName, tFields, tDataType)
'создать таблицу по шаблону пользователя
Dim MyTable As TableDef
Dim MyField As Field
Dim MyRst As Recordset
Dim MyIdx As Index

On Error Resume Next
CurrentDb.TableDefs.Delete tTableName

Set MyTable = CurrentDb.CreateTableDef(tTableName)

'Первое заголовочное поле
MyTable.fields.Append MyTable.CreateField(tFields(0), dbText)
'Второе заголовочное поле
MyTable.fields.Append MyTable.CreateField(tFields(1), dbText)

'Поля данных
For J = LBound(tFields) + 2 To UBound(tFields)
MyTable.fields.Append MyTable.CreateField(tFields(J), tDataType)
Next

CurrentDb.TableDefs.Append MyTable
Set MyTable = Nothing

End Sub
25 фев 03, 14:23    [134935]     Ответить | Цитировать Сообщить модератору
 Re: Как транспонировать таблицу?  [new]
Alex1st
Member

Откуда:
Сообщений: 11
ВАЖНО:
для работы нужно подключить MS DAO 3.6 Obj Lib из Tools-References!!!
25 фев 03, 14:27    [134942]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как транспонировать таблицу?  [new]
Alexus12
Member

Откуда:
Сообщений: 2868
поправка:
сойдет любой DAO, главное, чтоб был
4 авг 04, 16:00    [858887]     Ответить | Цитировать Сообщить модератору
 Re: Как транспонировать таблицу?  [new]
Alexus12
Member

Откуда:
Сообщений: 2868
'Запускать так:

1) создать в базе сохраненный запрос MyFromQuery на основе исходной (трансформируемой) таблицы,
в котором будет:
первое поле - уникальный ID записи
второе и последующее поля - поля с данными

2) Создать в VBA (на клик кнопки и т.п.) вызов процедуры запуска:

TransformToRows "MyFromQuery", "MyTransformedTable", dbText 'последний параметр = тип DataTypeEnum = указывает, какого типа данные в таблице (dbCurrency, dbLong и тд., см  DAO.DataTypeEnum)


3) в результате работы будет создана "распрямленная" таблица MyTransformedTable с полями:
Строки	Столбцы	Данные
5946	Март	58
5946	Апрель	89
5946	Май	56
12 июл 05, 14:11    [1696440]     Ответить | Цитировать Сообщить модератору
 Re: Как транспонировать таблицу?  [new]
Alex_Piter
Guest
Спасибо, Alexus12, обработка запустилась. :-) Единственное, что у меня структура исходной "перекрестной" таблички несколько более расширенная, не Строка-Столбец-Данные, как у Вас, а Строка (Длина) - Столбец1 (Ширина1) - Данные1 (Цена1); (Ширина2) - (Цена2); (Ширина3) - (Цена3). Поэтому и получилась на выходе чепуха. :-) Вот как быть в таком случае, чтоб получить из этого всего нормальную "распрямленную" таблицу? Куда и чего надо добавить (или, наоборот, покоцать)? Или разбить мою табличку на отдельные простые куски и обрабатывать их по-отдельности? Но сие довольно муторно. :-(
12 июл 05, 14:34    [1696618]     Ответить | Цитировать Сообщить модератору
 Re: Как транспонировать таблицу?  [new]
Alexus12
Member

Откуда:
Сообщений: 2868
выход один - разберись в коде и адаптируй под свои нужды ;)
12 июл 05, 14:58    [1696725]     Ответить | Цитировать Сообщить модератору
 Re: Как транспонировать таблицу?  [new]
Alex_Piter
Guest
Уже более-менее разобрался, спасибо. :-) По крайней мере, основную часть таблицы, ту самую, которая перекрестная, распрямить получилось. Надо было убрать поле Dlina, оно все портило. :-) А дальше уже было просто - вытащил запросом данные из этой самой MyTransformedTable в другую табличку, добавил к ней еще один столбец с длинами, срастил (опять же, запросом) с первым куском, где у меня горизонталь - наименования и длины. Ну, а потом, при помощи конкатенкации строк в ту же таблицу (чтоб была строка типа "[деталь] [длина]x[ширина]) и еще одного запроса перекинул все это в справочник номенклатуры. Еще раз спасибо за помощь, так я быстро свои экселевские таблички в номенклатуру закину! :-)

Успехов!!! :-)
12 июл 05, 15:19    [1696808]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить