(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Как написать коммерческое приложение на Access

Источник: 5codelines

Хочу представить Вам функции, без которых нормальная жизнь программы на MS Access не возможно.

Их всего три:

  • CM_LT_AddAllExt() - добавляет в текущую базу ссылки на таблицы из mdb файла
  • CM_LT_AddAllExt_ODBC() - добавляет в текущую базу ссылки на ODBC таблицы на сервере
  • CM_LT_DelAll() - удаляет таблицы-ссылки из текущей базы

Они позволяют создать в интерфейсной базе ссылки на таблицы из базы с данным. У меня они запускаются каждый раз при запуске. Написаны они давным давно, но полезны до сих пор.

Текст функций:

view plain copy to clipboard print
  1. Public Function CM_LT_AddAllExt(ByVal stPathToBase As String) As Long  
  2. ' <Скоков С.А.> создана: 2004-02-05  
  3. ' подлинковывает все таблицы из указанной базы  
  4. ' проверяет существует ли подлинковываемая таблица в текущей как ссылка, то обновляется строка подключения.  
  5. ' если же в тек. базе есть таблица с таким именем (не ссылка), то подлинковываемая таблица пропускается  
  6. ' т.о. перед вызовом этой функции удалять линкованные таблицы не нужно  
  7. ' вход: stPathToBase - путь и имя базы  
  8. ' выход: количество не подлинкованных таблиц, в случае ошибки возвращает -1  
  9.   
  10. On Error GoTo Err_  
  11.     CM_LT_AddAllExt = 0  
  12.   
  13.     Dim tdf As TableDef  
  14.     Dim db As Database  
  15.     Dim bIsSysOrLink As Boolean  
  16.     Dim stNameTbl As String  
  17.     Dim lCountNotLinket As Long ' количество не подлинкованных таблиц  
  18.     Dim stConnect As String  
  19.     Dim dbCur As DAO.Database  
  20.     Dim tdfNew As DAO.TableDef  
  21.     Dim tdfsCur As DAO.TableDefs  
  22.   
  23.     stConnect = ";DATABASE=" & stPathToBase  
  24.     Set dbCur = CurrentDb  
  25.     Set tdfsCur = dbCur.TableDefs  
  26.   
  27.     '-- делаем масив таблиц в текущей базе  
  28.     Dim masNameTbl() As String  
  29.     Dim i As Long  
  30.   
  31.     tdfsCur.Refresh  
  32.     ReDim masNameTbl(tdfsCur.count - 1)  
  33.     i = 0  
  34.     For Each tdf In tdfsCur  
  35.         masNameTbl(i) = tdf.Name  
  36.         i = i + 1  
  37.     Next tdf  
  38.   
  39.     '-- коннектимся к базе  
  40.     Set db = OpenDatabase(stPathToBase)  
  41.   
  42.     lCountNotLinket = 0  
  43.     '-- линкуем  
  44.     For Each tdf In db.TableDefs  
  45.         bIsSysOrLink = (tdf.Attributes And dbSystemObject) Or _  
  46.                     (tdf.Attributes And dbHiddenObject) _  
  47.                     Or (tdf.Attributes And dbAttachedTable) ' системная или присеоединенная ли?  
  48.   
  49.         If Not bIsSysOrLink Then  ' если не то что выше, то можно делать линк  
  50.             stNameTbl = tdf.Name  
  51.             '-- если такая таблица существует в текущей базе  
  52.             If SerchStrInMas(masNameTbl, stNameTbl) <> -1 Then  
  53.                 '-- то проверяем подлинкованая ли? иначе пропускаем эту таблицу и переходим на следующую  
  54.                 If (tdfsCur(stNameTbl).Attributes And dbAttachedTable) Then  
  55.                     '-- обновляем путь к бд  
  56.                     tdfsCur(stNameTbl).Connect = stConnect  
  57.                     tdfsCur(stNameTbl).RefreshLink  
  58.                 Else  
  59.                     Debug.Print "CM_LT_AddAllExt(), пропущена таблица:", stNameTbl  
  60.                     lCountNotLinket = lCountNotLinket + 1  
  61.                 End If  
  62.             Else  
  63.                 '-- не существует - то линкуем  
  64.                 Set tdfNew = dbCur.CreateTableDef(stNameTbl)  
  65.                 tdfNew.SourceTableName = stNameTbl  
  66.                 tdfNew.Connect = stConnect  
  67.                 tdfsCur.Append tdfNew  
  68.             End If  
  69.         End If  
  70.     Next tdf  
  71.   
  72.     db.Close  
  73.     Set db = Nothing  
  74.   
  75.     tdfsCur.Refresh  
  76.     Set tdfsCur = Nothing  
  77.     Set dbCur = Nothing  
  78.   
  79.     CM_LT_AddAllExt = lCountNotLinket  
  80. Exit_:  
  81.     Exit Function  
  82.   
  83. Err_:  
  84.     CM_LT_AddAllExt = -1  
  85.     Err.Raise Err.Number, "CM_LT_AddAllExt()->" & Err.Source, Err.Description '-- передаем ошибку в вызвавшую функцию  
  86.   
  87.     Resume Exit_  
  88. End Function  
  89.   
  90. Private Function SerchStrInMas(ByRef masStr() As String, ByRef SerchStr As String) As Long  
  91. ' <Скоков С.А.> создана: 2004-02-05  
  92.   
  93. ' Поиск строки в строковом массиве  
  94. ' вход: masStr - массив строк  
  95. '       SerchStr - искомая строка  
  96. ' выход:  
  97. '   номер элемента массива, в котором была найдена подстрока SerchStr, иначе -1 (когда нет совпадений)  
  98. '   при ошибке возвращает -1  
  99.   
  100. On Error GoTo Err_  
  101.   
  102.     Dim i As Long  
  103.   
  104.     SerchStrInMas = -1  
  105.   
  106.     For i = LBound(masStr) To UBound(masStr)  
  107.         If masStr(i) = SerchStr Then  
  108.             SerchStrInMas = i  
  109.             Exit For  
  110.         End If  
  111.     Next i  
  112.   
  113. Exit_:  
  114.     Exit Function  
  115. Err_:  
  116.     SerchStrInMas = -1  
  117.     Resume Exit_  
  118. End Function  
  119.   
  120. Public Function CM_LT_AddAllExt_ODBC(ByVal stConnectStr As String) As Long  
  121. ' <Кулага С.Ю.> создана: 2006-10-12  
  122.   
  123. '   подлинковывает все таблицы из указанной базы  
  124. '   проверяет существует ли подлинковываемая таблица в текущей как ссылка, то удаляет.  
  125. '   если же это является таблицей, то подлинковываемая таблица пропускается  
  126. '   т.е. перед вызовом этой функции удалять линкованные таблицы не нужно, он удалить необходимые сама  
  127. ' вход: stConnectStr - строка подключения ADO  
  128. ' выход: количество не подлинкованных таблиц, в случае ошибки возвращает -1  
  129.   
  130. On Error GoTo Err_  
  131.     CM_LT_AddAllExt_ODBC = 0  
  132.   
  133.     Dim bIsSysOrLink As Boolean  
  134.     Dim stNameTbl As String  
  135.     Dim tdf As TableDef  
  136.     Dim lCountNotLinket As Long ' количество не подлинкованных таблиц  
  137.     Dim cnn As ADODB.Connection  
  138.     Dim rst As ADODB.Recordset  
  139.     Dim stConnectTbl As String  
  140.     Dim dbCur As DAO.Database  
  141.     Dim tdfNew As DAO.TableDef  
  142.     Dim tdfsCur As DAO.TableDefs  
  143.   
  144.     stConnectTbl = "ODBC;" & stConnectStr  
  145.     Set dbCur = CurrentDb  
  146.     Set tdfsCur = dbCur.TableDefs  
  147.   
  148.     ' делаем масив таблиц в текущей базе  
  149.     Dim masNameTbl() As String  
  150.     Dim i As Long  
  151.   
  152.     ReDim masNameTbl(tdfsCur.count - 1)  
  153.     i = 0  
  154.     For Each tdf In tdfsCur  
  155.         masNameTbl(i) = tdf.Name  
  156.         i = i + 1  
  157.     Next tdf  
  158.   
  159.     ' коннектимся к базе  
  160.     Set cnn = New ADODB.Connection  
  161.     cnn.Open (stConnectStr)  
  162.     Set rst = cnn.OpenSchema(adSchemaTables)  
  163.   
  164.     lCountNotLinket = 0  
  165.     ' линкуем  
  166.     Do While Not rst.EOF  
  167.         stNameTbl = rst("TABLE_NAME")  
  168.         ' если такая таблица существует в текущей базе  
  169.         If SerchStrInMas(masNameTbl, stNameTbl) <> -1 Then  
  170.             ' то проверяем линкованая ли? иначе пропусаем эту таблицу и переходим на следующую  
  171.             If (tdfsCur(stNameTbl).Attributes And (dbAttachedTable + dbAttachedODBC)) Then  
  172.                 '-- обновляем путь к бд  
  173.                 tdfsCur(stNameTbl).Connect = stConnectTbl  
  174.                 tdfsCur(stNameTbl).RefreshLink  
  175.             Else  
  176.                 Debug.Print "CM_LT_AddAllExt_ODBC(), пропущена таблица:", stNameTbl  
  177.                 lCountNotLinket = lCountNotLinket + 1  
  178.             End If  
  179.         Else  
  180.             '-- не существует - то линкуем  
  181.             Set tdfNew = dbCur.CreateTableDef(stNameTbl)  
  182.             tdfNew.SourceTableName = stNameTbl  
  183.             tdfNew.Connect = stConnectTbl  
  184.             tdfsCur.Append tdfNew  
  185.         End If  
  186.         rst.MoveNext  
  187.     Loop  
  188.   
  189.     tdfsCur.Refresh  
  190.     Set tdfsCur = Nothing  
  191.     Set dbCur = Nothing  
  192.   
  193.     rst.Close  
  194.     cnn.Close  
  195.     CM_LT_AddAllExt_ODBC = lCountNotLinket  
  196.   
  197. Exit_:  
  198.     Exit Function  
  199.   
  200. Err_:  
  201.     Err.Raise Err.Number, "CM_LT_AddAllExt_ODBC()->" & Err.Source, Err.Description '-- передаем ошибку в вызвавшую функцию  
  202.     CM_LT_AddAllExt_ODBC = -1  
  203.     Resume Exit_  
  204. End Function  
  205.   
  206. Public Function CM_LT_DelAll() As Boolean  
  207. ' <Скоков С.А.> создана: 2003-12-12  
  208.   
  209. ' удаляет все связаные таблицы в текущей базе  
  210.   
  211. On Error GoTo Err_  
  212.   
  213.     Dim tdf As TableDef  
  214.     Dim db As Database  
  215.     Dim bIsAttached As Boolean  
  216.   
  217.     Set db = CurrentDb  
  218.   
  219.     For Each tdf In db.TableDefs  
  220.         bIsAttached = (tdf.Attributes And dbAttachedODBC) _  
  221.                 Or (tdf.Attributes And dbAttachedTable) ' присеоединенная таблица обыкновенная или ODBC  
  222.   
  223.         If bIsAttached Then ' удаляем только прилинкованные  
  224.             DoCmd.DeleteObject acTable, tdf.Name  
  225.         End If  
  226.     Next  
  227.   
  228.     Set db = Nothing  
  229.     CM_LT_DelAll = True  
  230. Exit_:  
  231.     Exit Function  
  232. Err_:  
  233.     CM_LT_DelAll = False  
  234.   
  235.     Err.Raise Err.Number, "CM_LT_DelAll()->" & Err.Source, Err.Description '-- передаем ошибку в вызвавшую функцию  
  236.     Resume Exit_  
  237. End Function  

До встречи!



 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 23.06.2011 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
IBM RATIONAL Clearcase Floating User License + Sw Subscription & Support 12 Months
SmartBear LoadComplete - Node-Locked License Subscription w/ 250 Virtual Users (includes 1 year of Maintenance)
GFI LanGuard подписка на 1 год (25-49 лицензий)
Microsoft Office 365 Бизнес. Подписка на 1 рабочее место на 1 год
Купить CommView for WiFi 1 лицензия
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Программирование на Microsoft Access
CASE-технологии
OS Linux для начинающих. Новости + статьи + обзоры + ссылки
Компьютерный дизайн - Все графические редакторы
СУБД Oracle "с нуля"
Мастерская программиста
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100