|
![]() |
#1 |
Moderator
|
2 Прокопьева: опять-таки на случай, когда Вас не интересуют вопросы ограничения доступа, можно-таки попробовать построить перекрестный запрос в любимом Access'е.
В качестве примера построим перекрестный запрос, отражающий за заданный период обороты по количеству номенклатуры (строки) в разрезе по складам (столбцы) - на основе таблиц InventTrans и InventDim. Итак, по шагам: 1. Убедитесь, что у вас на компьютере уже создан источник ODBC, настроенный на базу данных Аксапты, и вам известны все его необходимые параметры (в т.ч. логин и пароль к БД). 2. Создайте новую базу данных Access (именно базу в формате mdb, а не проект в формате adp - в проекте вы, увы, не сможете создать перекрестный запрос). 3. В этом новом mdb-файле перейдите на закладку "Модули", создайте новый модуль и скопируйте в него следующую небольшую процедуру, создающую 3 запроса: Код: 'Код - Access VBA Sub TestPivotQuery() Dim dbs As DAO.Database Dim qdf As DAO.QueryDef Set dbs = CurrentDb 'Запрос 1 - получение исходных данных для построения перекрестного запроса Set qdf = dbs.CreateQueryDef("qry_1_GetSourceData") qdf.Connect = "ODBC;DSN=yourDSN;UID=yourUserID;PWD=yourPassword;SERVER=yourServer;" 'ЗАПРОС К СЕРВЕРУ - на диалекте SQL используемой СУБД(!) '(ненужное закомментировать) '----------------------------------------- 'для MS SQL Server 'qdf.SQL = "SELECT t.ItemId, d.InventLocationId, t.TransType, t.Direction, t.StatusReceipt, t.StatusIssue, t.Qty" & _ " FROM InventTrans t, InventDim d" & _ " WHERE UPPER(t.InventDimId) = UPPER(d.InventDimId)" & _ " AND t.DataAreaId = d.DataAreaId" & _ " AND t.DataAreaId = 'yor'" & _ " AND t.DatePhysical Between '2006-05-01' And '2006-05-31'" '----------------- 'для Oracle qdf.SQL = "SELECT t.ItemId, d.InventLocationId, t.TransType, t.Direction, t.StatusReceipt, t.StatusIssue, t.Qty" & _ " FROM InventTrans t, InventDim d" & _ " WHERE UPPER(t.InventDimId) = UPPER(d.InventDimId)" & _ " AND t.DataAreaId = d.DataAreaId" & _ " AND t.DataAreaId = 'yor'" & _ " AND t.DatePhysical Between TO_DATE('01.05.2006', 'DD.MM.YYYY') And TO_DATE('31.05.2006', 'DD.MM.YYYY')" '----------------------------------------- '(здесь запросы для разных СУБД отличаются только самой последней строчкой с датами) Set qdf = Nothing 'Запрос 2 - "приведение в порядок" вещественных значений: в данном случае это Qty '(это преобразование текста в число реально имеет смысл только для Oracle) Set qdf = dbs.CreateQueryDef("qry_2_NormalQty") 'запрос на диалекте Access SQL qdf.SQL = "SELECT ItemId, InventLocationId, TransType, Direction, StatusReceipt, StatusIssue," & _ " Val(Replace([Qty],',','.')) AS QtyN FROM [qry_1_GetSourceData]" Set qdf = Nothing 'Запрос 3 - собственно перекрестный запрос Set qdf = dbs.CreateQueryDef("qry_3_Cross") 'запрос на диалекте Access SQL qdf.SQL = "TRANSFORM Sum(QtyN) AS [Sum_Qty]" & _ " SELECT ItemId, Sum(QtyN) AS [Total Qty]" & _ " FROM [qry_2_NormalQty]" & _ " GROUP BY ItemId" & _ " PIVOT InventLocationId" Set qdf = Nothing Set dbs = Nothing End Sub - раскомментируйте строки, относящиеся к вашей СУБД и закомментируйте другую; - пропишите свои параметры подключения к источнику ODBC (вместо "your...") в операторе qdf.Connect = ...; - пропишите свою компанию - DataAreaId - вместо 'yor'; - подкорректируйте по вашему желанию период по датам для поля DatePhysical с таким расчетом, чтобы в выборку попало не более 10-20 тыс.записей из таблицы InventTrans. 5. Убедитесь, что в меню Tools / References включена ссылка на библиотеку "Microsoft DAO 3.6 Object Library" (если она еще не включена, то включите). 6. Запустите процедуру (например, находясь в любом месте ее тела, нажмите F5). По окончании ее работы на закладке "Запросы" окна базы данных появятся три запроса, созданные процедурой. 7. Запустите на выполнение запрос "qry_3...". Через некоторое (небольшое) время вам будут предъявлены результаты выполнения в стандартном табличном виде: количественные обороты номенклатуры (строки) на складах (столбцы) за заданный в условиях первого запроса период. Все эти запросы вы могли бы создать и вручную на закладке "Запросы", но в рамках примера кодом быстрее (и мне объяснять, и вам воплощать). Обращаю внимание, что первый запрос - это запрос к серверу, вручную через меню строится так (в англ.версии Access): на закладке Queries/ кнопка New/ Design View (OK)/ Close (в ответ на Show Table)/ (далее в строке меню) Query/ SQL Specific/ Pass-Through. Это еще не всё. Если у вас - Access 2002-2003, то можно воспользоваться еще одной фичей. Откроем второй запрос qry_2... в конструкторе (Design). В меню выберем: View / PivotTable View. Дальше, думаю, всё понятно и не так сложно. Если список полей для перетаскивания в сводную таблицу не виден, то выполните команду меню View / Field List. При желании далее можно выполнить команду меню PivotTable / Export to Microsoft Office Excel и мы окажемся в другом любимом продукте, причём, как с исходными данными (на одном листе), так и с бланком сводной таблицы (на другом). В общем, разнообразных "сводно-перекрестных таблиц" у нас теперь - просто завались ![]() P.S. Для того, чтобы фича "PivotTable View" была доступной в Access, на вашем компьютере должны быть установлены Office Web Components (при установке Office по умолчанию они могут быть выключены). Последний раз редактировалось Gustav; 02.08.2006 в 13:30. |
|
![]() |
#2 |
Участник
|
Спасибо
Попробую разобраться с импортом, может и получиться (ранее его не касалась). Но если появятся еще идеи - я готова выслушать ... |
|