FoxPro Club Главная

Конференция Решения Фотоальбом Сайт М.Дроздова Статьи Файловый архив Книга Visual FoxPro 9.0 Русский Help для Visual FoxPro
Пользователей: 9176
Вход
Пример использования иерархических возможностей MSHFlexGrid и True DB Grid

В приведенном примере продемонстрирована возможность использования в Microsoft Visual FoxPro иерархических возможностей ActiveX-контролов Microsoft Hierarchical FlexGrid и Component One True DB Grid


 
Прислал: Кольцов Роман Васильевич   Категория: Работа с данными


*** Пример использования в Microsoft Visual FoxPro иерархических возможностей
*** ActiveX Microsoft Hierarchical FlexGrid и Component One True DB Grid
*** (c) Кольцов Роман Васильевич aka rvc44, 2003
*** mailto: Roman.Koltsov gmail.com

*** В примере используется OLE-автоматизация Microsoft Access, поэтому
*** для успешной работы необходим не очеь старый Microsoft Access (лучше 2003)
*** Кто знает, как создать иерархический рекордсет без Access, велкам!

*** Перед использованием добавьте на вкладке User DNS в Пуск -> Настройка ->
*** ПанельУправления -> Администрирование -> Источники данных (ODBC)
*** новый источник данных с именем netar, драйвером Microsoft Access Driver (*.mdb)
*** и базой данных C:\Temp\netar.mdb. Для настройки DNS можно создать и
*** сохранить пустой файл произвольного типа с именем "netar.mdb", т.к.
*** в дальнейшем программа его все равно удаляет и создает новый!
*** Кто знает, как настроить DNS программно, велкам!

*** Внимание! Важная особенность, описанная в одной из конференций.
*** Hierarchical FlexGrid как и TreeView работает с Twip'ами, поэтому
*** при расчете ширины ячеек нужно учитывать Twip'ы
*** и в качестве параметров для метода HitTest, при реализации
*** Drag&Drop нужно передавать координаты в Twip'ах.

#define cnLOG_PIXELS_X 88
#define cnLOG_PIXELS_Y 90
#define cnTWIPS_PER_INCH 1440
* 1440 твипов на дюйм
#define flexAlignLeftCenter 1
#define flexAlignCenterTop 3
#define flexAlignCenterCenter 4

*** Возможные значений параметра type в методе CreateField
#define dbBoolean 1 && Логический
#define dbByte 2 && Числовой (байт)
#define dbInteger 3 && Числовой (целое)
#define dbLong 4 && Числовой (длинное целое)
#define dbCurrency 5 && Денежный
#define dbSingle 6 && Числовой (одинароне с плавающей точкой)
#define dbDouble 7 && Числовой (двойное с плавающей точкой)
#define dbDate 8 && Дата/время
#define dbBinary 9
#define dbText 10 && Текстовый
#define dbLongBinary 11 && Поле объекта OLE
#define dbMemo 12 && Поле МЕМО
#define dbGUID 15 && Числовой (код репликации)
#define dbDecimal 20 && Числовое (действительное)

*** Возможные значений параметра в методе Quit
#define acQuitPrompt 0
#define acQuitSaveAll 1
#define acQuitSaveNone 2

*** Метод Init формы Visual FoxPro, на которой размещены ActiveX компоненты:
*** сверху True DB Grid и снизу MSHFlexGrid (для сравнения их возможностей)
LPARAM pUpForm * Вызывающая форма верхнего уровня
LOCAL sw As Long

This.UpForm=pUpForm

************* Создаем базу данных netar.mdb с двумя таблицами Goods и Categs ***********
* Непосредственно для создания таблиц используется метод CreateTableDef
* tabledef = database.CreateTableDef ([name], [attributes], [sourcetablename], [connect])
* Для создания полей таблицы используется объект Field и метод CreateField
* field = tabledef.CreateField ([name], [type], [size])
* После того, как таблица будет описана и в ней созданы необходимые поля,
* ее нужно будет добавить в базу данных. Для добавления таблицы в базу данных
* используется метод Append
* Для создания новой таблицы неоходимо определить новый объект TableDef
* (Table Definition - описание таблицы).
* Объект TableDef содержит всю необходимую информацию для определения таблицы БД.
*****************************************************************************************

oAcc=CREATEOBJECT("Access.Application")
WAIT WINDOW NOWAIT "Запуск Access..."
* Hide the instance of Microsoft Access.
* Microsoft Knowledge Base Article - 167659
sw = ShowWindow(oAcc.hWndAccessApp, 2)

* Созданим БД Access "Нетарифные меры регулирования ВЭД" для анализа ГТД
cMDB="C:\temp\netar.mdb" && ThisForm.MDBFullPath
IF FILE("&cMDB.")
delete file &cMDB.
ENDIF
oAcc.Visible = .F.
oAcc.NewCurrentDatabase(cMDB)
oMDB=oAcc.CurrentDB

* Создадим таблицу Goods базы данных netar.mdb
oTbl=oMDB.CreateTableDef("Goods")
oTbl.Fields.Append(oTbl.CreateField("Direction", dbText, 5)) && .Append(oFld)
oTbl.Fields.Append(oTbl.CreateField("Sync", dbText, 30)) && Invisible
oTbl.Fields.Append(oTbl.CreateField("GTD", dbText, 23))
oTbl.Fields.Append(oTbl.CreateField("G022", dbText, 254))
oTbl.Fields.Append(oTbl.CreateField("G33", dbText, 10))
oTbl.Fields.Append(oTbl.CreateField("G31_1", dbText, 254))
oTbl.Fields.Append(oTbl.CreateField("G38", dbDouble))
oTbl.Fields.Append(oTbl.CreateField("G46", dbDouble))
oMDB.TableDefs.Append(oTbl)

* Создадим таблицу Categs базы данных netar.mdb
oTbl=oMDB.CreateTableDef("Categs")
oTbl.Fields.Append(oTbl.CreateField("G32", dbDouble))
oTbl.Fields.Append(oTbl.CreateField("G441", dbText, 4))
oTbl.Fields.Append(oTbl.CreateField("Sync", dbText, 30)) && Invisible
oTbl.Fields.Append(oTbl.CreateField("G442", dbText, 254))
oTbl.Fields.Append(oTbl.CreateField("G443", dbText, 254))
oMDB.TableDefs.Append(oTbl)

* Для "иерархии" имеем 2 курсора CurDclHead и CurDclCmpr.
* (их содержимое не привожу по соображениям госбезопасности ;-) )
* Перегоним их в 2 иерархических рекордсета
* Синхронизация между рекордсетами будет осуществляться по полю Sync
* Все поля в соответствующих курсорах и рекордсетах одноименные

* Конвертация "вручную" курсора1 в рекордсет1 с соответствующими полями
oRS=oMDB.OpenRecordSet("Goods")
SELECT CurDclCmpr && CurDclHead соответствующий курсор
SCAN
oRS.AddNew
FOR j = 0 TO oRS.Fields.Count-1
cFName=oRs.Fields(j).Name
vValue=EVALUATE(cFName)
oRs.Fields(j).Value=vValue
ENDFOR
oRS.Update
oRS.MoveFirst
ENDSCAN
oRS.Close

* Конвертация "вручную" курсора2 в рекордсет2 с соответствующими полями
oRS=oMDB.OpenRecordSet("Categs")
SELECT CurDclHead
SCAN
oRS.AddNew
FOR j = 0 TO oRS.Fields.Count-1
cFName=oRs.Fields(j).Name
vValue=EVALUATE(cFName)
oRs.Fields(j).Value=vValue
ENDFOR
oRS.Update
oRS.MoveFirst
ENDSCAN
oRS.Close
USE IN CurDclHead

oMDB.Close
oAcc.Quit(acQuitSaveAll)
RELEASE oAcc
WAIT CLEAR

* Демонстрация использования иерархических рекордсетов
* Используется MSDataShape провайдер для создания иерархического
* рекордсета из таблиц Goods и Categs базы данных C:\temp\netar.mdb

oConnection = CREATEOBJECT("ADODB.Connection")
oRecordSet = CREATEOBJECT("ADODB.Recordset")

WITH oConnection
.Provider="MSDataShape"
.OPEN("DSN=NETAR") && NETAR настроена на C:\temp\netar.mdb
ENDWITH

oRecordSet.ActiveConnection = oConnection
oRecordSet.OPEN ("SHAPE {SELECT * FROM Goods} AS Cmn2 " + ;
"APPEND ({SELECT * FROM Categs} AS Cmn2A RELATE " + ;
"Sync TO Sync) AS Cmn2A")

* Начиняем Component One True DB Grid:
With ThisForm.TDBGrid1
.DataSource = oRecordSet
.ExtendRightColumn = .T.
.ReBind
.Columns(0).Caption = "Тип ГТД"
.Columns(0).Width = 117 && 78
.Columns(1).Caption = "ГТД"
.Columns(1).Width = 215 && 143
.Columns(2).Visible = .F. && Номер товара
.Columns(3).Caption = "Код товара"
.Columns(3).Width = 100 && 68
.Columns(4).Caption = "Вес нетто"
.Columns(4).Width = 95 && 63
.Columns(5).Caption = "Статистич. стоимость"
.Columns(5).Width = 110 && 78
.Columns(6).Caption = "Наименование товара"
.Columns(7).Caption = "Отправитель / Получатель"
.Columns(8).Visible = .F. && ГТД
.Columns(9).Caption = "№ товара в ГТД"
.Columns(10).Caption = "Код документа"
.Columns(11).Caption = "№ документа"
.Columns(12).Caption = "Дата выдачи документа"
EndWith

With ThisForm
* Начиняем Microsoft Hierarchical FlexGrid (для сравнения!):
* Можно реализовать более красивую начинку по желанию (поэлементо)
.MSHFlexGrid.DataSource = oRecordSet


.Width = 553
.Resize()
.Visible=.t.
EndWith

* Отмеченные недостатки MSHFlexGrid, по сравнению с True DB Grid:
* - отсутствие поддержки работы с прокруткой колесиком мыши;
* - отсутствие встроенного механизма поддержки печати;
* - если не "замораживать" левый столбец, то вызов вручную методов Expand
* и Collapse (щелчки на "+" и "-" в строках грида) доступен только в
* первом столбце грида и, как следствие, недоступен при прокрутке вправо.
* - Символы "+" и "-" для разворачивания "иерархии" маленького размера
* В остальном эти два грида практически идентичны. Выбор за вами...

 
Сделайте оценку этого решения Плохо Удовлетворительно Так себе Хорошо Отлично Текущая оценка: (2.417) Вложение [3.57]kb
Дополнения пользователей
Пример использования иерархических возможностей MSHFlexGrid и True DB Grid
[+][?]
ShmSoft
19.04.06 17:25:37

Hi, кто Это смотрит...
Вот это Шмяга, так Шмяга...
Подскажи, автор, какой язык программирования использовать.

Home
19.04.06 20:14:11

Роман Васильевич - выложи рабочий пример
Кольцов Роман Васильевич
25.04.06 12:15:11

Используй язык программирования Visual FoxPro сборки 09.00.0000.3504 для Windows. На нем точно
будет работать, проверено!

Кольцов Роман Васильевич
25.04.06 12:15:34

Уважаемый ShmSoft! Я рекомендовал Вам это решение в качестве примера автоматизации Microsoft
Access. Из него, по крайней мере, четко видно как создавать БД Access (файл .mdb) и таблицы в этой
БД программным способом из под Visual FoxPro. Что Вам показалось здесь "шмягой" я не знаю?! Просто
удивлен! Если Вы действительно считаете себя программистом, то не грех поднапрячь свои
мыслительные способности  и переделать пример под собственные нужды, а не ждать готовенького. Если
что-то не понятно, то пишите в личку, объясню как могу...
Кольцов Роман Васильевич
25.04.06 12:15:55

Новый, на этот раз рабочий пример поддержки иерархических возможностей MSHFlexGrid и True DB Grid,
извлеченный из моего реально работающего приложения специально опубликовал за следом, 21.04.06,
для любителей "готовых" решений. Надеюсь это поможет! ;-)
Вот ссылка: http://www.foxclub.ru/sol/index.php?act=view&id=535

An
09.06.07 14:09:59

А пример в FoxTalk за январь 1998 Дуга Хеннинга "Как нам углубиться в данные"? У меня журнал за
этот год без дискеты.
Кто знает где взять, откликнитесь! 
[Дополнить]



© 2000-2017 Fox Club 
При размещении любых материалов с сайта на других ресурсах- прямая ссылка на www.foxclub.ru обязательна
Яндекс.Метрика