LEADERSOFT.ru Разработка на заказ программ и сайтов
Форумы по информационным технологиям
 
Регистрация  |  Вход
left
Форумы Минимизировать
ПоискСписок форумов
  Программирование  Microsoft Access. Файлы mdb и accdb  ПЕРЕВОД СТОЛБЦА...
 ПЕРЕВОД СТОЛБЦА В СТРОКУ
 
 25.06.2012 22:40:55
epsilon_group
27 сообщения


ПЕРЕВОД СТОЛБЦА В СТРОКУ
Добрый вечер!

Столкнулся с такой задачей. Есть массив ( таблица ) со столбцами Код; Артикул
и повторяющимися значениями в Столбце "Код"
Например:
Код Артикул
9801 202-01-FX-01-VK
9801 202-01-FX-03-KK
9801 202-01-FX-06-KK
9802 202-02-FX-01-KK

Нужно преобразовать таблицу в такой вид:
Код Артикул
9801 202-01-FX-01-VK; 202-01-FX-03-KK; 202-01-FX-06-KK
9802 202-02-FX-01-KK

Т.е. один столбец сделать строкой

Не подскажите какой-нибудь путь решения этой задачи. Может быть в Access есть стандартная функция преобразования столбца массива с строку и наоборот как в Excel ?

Заранее спасибо.
С уважением,
Василий
 26.06.2012 20:39:08
Admin1
731 сообщения
1-ый


Re: ПЕРЕВОД СТОЛБЦА В СТРОКУ

1. Такой функции нет, поэтому придется делать группировку по полю Код и писать обработку запроса в VBA. 
2. Можно использовать в запросе TRANSFORM для создания перекрестной таблицы, но это не точное решение.
TRANSFORM Sum(Таблица1.Кол_во) AS [Sum-Кол_во]
SELECT Таблица1.Код
FROM Таблица1
GROUP BY Таблица1.Код
PIVOT Таблица1.Артикул;

 26.06.2012 21:22:57
epsilon_group
27 сообщения


Re: ПЕРЕВОД СТОЛБЦА В СТРОКУ
Спасибо Вам ответ. Я понял, что нужно код писать. Столкнулся вот с чем.

Я решил сделать так ( возможно не самый лучший вариант ):
Из этой таблицы TABLE_2
Код Артикул
9801 202-01-FX-01-VK
9801 202-01-FX-03-KK
9801 202-01-FX-06-KK
9802 202-02-FX-01-KK

создать Новую таблицу TABLE_1, где не будет повторяющихся значений в столбце "Код" и вторая таблица будет иметь
в моем примере только две строки
Код
9801
9802

И перебрав строки из TABLE_1, взяв значения из столбца Код, использовать каждое значение как фильтр, заполнить новую таблицу TABLE_3


Set rst = dbs.OpenRecordset("TABLE_1")
counter = rst.RecordCount
rst.MoveFirst
Do Until counter = 0
counter = counter - 1

Code = rst!Код
Set rstTemp = dbs.OpenRecordset("TABLE 3")

With rstTemp
.AddNew

Set rstt = dbs.OpenRecordset( _
"SELECT * FROM TABLE_1 ")
rstt.Filter = "Код ='" & Code & "'" - Фильтр

Set rstTemp2 = rstt.OpenRecordset()
counter2 = rstTemp2.RecordCount
rstTemp2.MoveFirst
Article = rstTemp2!Артикул

Do Until counter2 = 0
counter2 = counter2 - 1

Article = Article & ";" & rstt!Артикул
stTemp2.MoveNext
Loop

!Артикул= Article
.Update
.Bookmark = .LastModified
End With
Loop


У меня не работает фильтр в конструкции кода:


Set rstt = dbs.OpenRecordset( _
"SELECT * FROM TABLE_1 ")
rstt.Filter = "Код ='" & Code & "'" - Фильтр

Set rstTemp2 = rstt.OpenRecordset()
counter2 = rstTemp2.RecordCount
rstTemp2.MoveFirst
Article = rstTemp2!Артикул

Хотя я сделал все как в примере из HELPа чуть его изменив

Set rstTemp = dbsNorthwind.OpenRecordset( _
"SELECT * FROM Employees", dbOpenDynaset, dbReadOnly)
OpenRecordsetOutput rstTemp

' Use the Filter property to retrieve only certain
' records with the next OpenRecordset call.
Debug.Print "Opening recordset from existing " & _
"Recordset object to filter records..."
rstTemp.Filter = "LastName >= 'M'"
Set rstTemp2 = rstTemp.OpenRecordset()
OpenRecordsetOutput rstTemp2

Возможно где-то у меня ошибка. Тогда не подскажите конструкцию написания Recodset с фильтром


С уважением,
Василий
 27.06.2012 7:46:35
Admin1
731 сообщения
1-ый


Re: ПЕРЕВОД СТОЛБЦА В СТРОКУ
 Измененный Admin1  на 27.06.2012 7:47:22)

Мне кажется можно сделать проще. Для этого надо написать функцию, которая будут объединять строки по коду. Ее нужно добавить в запрос SELECT Таблица1.Код, funGetStrings([Код]) AS Артикул FROM Таблица1 GROUP BY Таблица1.Код;

Вот пример этой функции.

Public Function funGetStrings(Код As Long) As String
Dim dbs As DAO.Database, rst As DAO.Recordset, i As Integer
    funGetStrings = ""
    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset("SELECT * FROM [Test] WHERE [Код]=" & Код)
    Dim Arr As Variant
    If rst.RecordCount <> 0 Then
        With rst
            .MoveLast 'Заполняем запрос
            .MoveFirst 'Устанавливаем строку
            i = rst.RecordCount 'определяем число записей
            Arr = rst.GetRows(i) 'Прочитываем данные
        End With
    End If
    rst.Close 'Закрываем запрос
    Set dbs = Nothing 'Закрываем базу
   
    ' Обработка массива и возврат строки
    ' For n = 0 to i
    '    funGetStrings = funGetStrings + Arr(i)
    ' NEXT
    '
End Function

 29.06.2012 23:42:06
epsilon_group
27 сообщения


Re: ПЕРЕВОД СТОЛБЦА В СТРОКУ
Добрый вечер!

Спасибо Вам за пример функции:

Public Function funGetStrings(Код As Long) As String
Dim dbs As DAO.Database, rst As DAO.Recordset, i As Integer
    funGetStrings = ""
    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset("SELECT * FROM [Test] WHERE [Код]=" & Код)
    Dim Arr As Variant
    If rst.RecordCount <> 0 Then
        With rst
            .MoveLast 'Заполняем запрос
            .MoveFirst 'Устанавливаем строку
            i = rst.RecordCount 'определяем число записей
            Arr = rst.GetRows(i) 'Прочитываем данные
        End With
    End If
    rst.Close 'Закрываем запрос
    Set dbs = Nothing 'Закрываем базу
   
    ' Обработка массива и возврат строки
    ' For n = 0 to i
    '    funGetStrings = funGetStrings + Arr(i)
    ' NEXT
    '
End Function

[/QUOTE]


Я ее немного видоизменил, а именно

If rst.RecordCount <> 0 Then

rst.MoveLast 'Заполняем запрос

rst.MoveFirst 'Устанавливаем строку

counter = rst.RecordCount 'определяем число записей

funGetStrings = ""


Do Until counter = 0
counter = counter - 1
funGetStrings = funGetStrings & "" & rst!Артикул & ";" ' Формируем строку

rst.MoveNext 'Переходим на следующую строку
Loop
End If

в результате получаем таблицу где для каждого кода собираем все Артикулы в строку типа : Артикул1; Артикул2; и т.д.

А если еще усложнить задачу. Если у каждого кода есть еще и например параметр Страна. В этом случае функция будет иметь два параметра Public Function funGetStrings(Код As Variant; Страна As Variant ) As String

Запрос с двумя параметрами Код и Страна будет таким ?

Set rst = dbs.OpenRecordset("SELECT * FROM [TABLE1] WHERE [Код]= & Код And [Код]=" & Страна )

или нет ? Я никак не могу запомнить. где в запросе с двумя ( несколькими параметрами ) должны быть знаки " и &

С уважением,
Василий

P.S. Правильно я понимаю что параметры Код, Страна должны быть типа Integer а не String
  Программирование  Microsoft Access. Файлы mdb и accdb  ПЕРЕВОД СТОЛБЦА...
ПоискПоиск  Список форумовСписок форумов  
right