Microsoft Access ClubAccessフォーラムの過去ログIndexページAccess超初心者対象ForumAccess初級者対象ForumAccess初・中級者対象ForumAccess VBA Tips ForumDAO、ADO、SQL Forum

     

No7624.リンクテーブルの更新をVBAにて行いたい。

タイトルリンクテーブルの更新をVBAにて行いたい。
記事No: 7624
投稿日: 2008/08/29(Fri) 10:23
投稿者: takumi
OS:XP
Access Version:2003

いつもお世話になっております。

MSSQL2005からODBCでリンクテーブルを作成しております。

そこで、このリンク先の更新を行うのに、リンクテーブルマネージャを使用して更新することが多いのですが、これを自動で全てのリンクテーブルを更新したいと思い、過去ログ等をあさっておりましたが、どうも考えている処理と違うので質問させていただきます。

調べた内容で試したところ、リンク先の更新というよりもリンク先を作成するというものになってしまい、必要外のテーブルまで作成されてしまいます。

やりたいことは、現在あるリンクテーブルのリンク先を更新したいだけなのです。

コントロールというテーブルで
フィールド名 値
SQLServer (local)
DBName   TestDB
USERID   sa
PASS     sa

があり、下記のコードは試しました。

Dim Db As DAO.Database
Dim Tb As DAO.TableDef
Dim ToDb As DAO.Database
Dim ToTb As DAO.TableDef
Dim TbNm As String

Set Db = CurrentDb
Set ToDb = DBEngine.OpenDatabase("", False, False, "ODBC;Driver={SQL Server};" & _
"Server=" & Me.SQLServer & ";" & _
"Database=" & Me.DBName & ";UID=" & Me.USERID & ";PWD=" & Me.PASS & ";")
For Each ToTb In ToDb.TableDefs
TbNm = ToTb.Name
Set Tb = Db.CreateTableDef("dbo_" & Mid$(TbNm, 5))
Tb.SourceTableName = Mid$(TbNm, 5)

Tb.Connect = "ODBC;Driver={SQL Server};" & _
"Server=" & Me.SQLServer & ";" & _
"Database=" & Me.DBName & ";UID=" & Me.USERID & ";PWD=" & Me.PASS & ";"
Tb.Attributes = Tb.Attributes Or dbAttachSavePWD
Db.TableDefs.Append Tb
Next

上記を試したところDb.TableDefs.Append Tbの場所で"テーブル名 はすでに存在しています。"と表示され止まります。そこでエラー処理にて全て無視させたところ、リンクテーブルは必要のないものまで全て取ってきておりました。

ただ単に更新だけを行うにはどのように記述すればよろしいでしょうか?若しくは参考となるサイト様をお教えいただけませんでしょうか?

宜しくお願いいたします。

タイトルRe: リンクテーブルの更新をVBAにて行いたい。
記事No: 7625
投稿日: 2008/08/29(Fri) 10:37
投稿者: yo
リンクテーブルの更新をヘルプで見てみたら、

RefreshLink メソッド

がヒットしました。
これが参考になるかなと思います。

でも、更新させるのは面倒なので、リンクテーブルを削除して新たにテーブルをリンクすると言う方法で
いいと思うのですが、だめでしょうか?

> 上記を試したところDb.TableDefs.Append Tbの場所で"テーブル名 はすでに存在しています。"と表示され止まります。そこでエラー処理にて全て無視させたところ、リンクテーブルは必要のないものまで全て取ってきておりました。
コードを見ますと、すべてのテーブルをリンクしてしまっていますよね。
すでにあるテーブルをリンクしようとすると、メッセージが出てとまってしまうということですね。
これでは、すべてのテーブルをリンクしようとしてしまうので、まずはリンクするテーブルを限定させてあげればいいと思います。
そして、リンクする前に現在のリンクテーブルを削除するようにしないと、すでにあるものとしてエラーになってしまいます。

タイトルRe^2: リンクテーブルの更新をVBAにて行いたい。
記事No: 7627
投稿日: 2008/08/29(Fri) 11:18
投稿者: takumi
yo 様

お返事ありがとうございます。

いったん削除して、その後リンクをするというやり方でも問題はありません。

>コードを見ますと、すべてのテーブルをリンクしてしまっていますよね。
この部分でしょうか?
TbNm = ToTb.Name
Set Tb = Db.CreateTableDef("dbo_" & Mid$(TbNm, 5))
Tb.SourceTableName = Mid$(TbNm, 5)
>すでにあるテーブルをリンクしようとすると、メッセージが出てとまってしまうということですね。
そうです。
>これでは、すべてのテーブルをリンクしようとしてしまうので、まずはリンクするテーブルを限定させてあげればいいと思います。
テーブルを限定する方法としては、全てのテーブル名を記述する様な感じでしょうか?それとも何かしらで取得するといった形でしょうか?
>そして、リンクする前に現在のリンクテーブルを削除するようにしないと、すでにあるものとしてエラーになってしまいます。
いったん削除し、再度作成させてあげるということですね。

RefreshLinkメソッド及び上記の方法で一度調べてみたいと思います。

宜しくお願いいたします。

タイトルRe^3: リンクテーブルの更新をVBAにて行いたい。
記事No: 7630
投稿日: 2008/08/29(Fri) 11:39
投稿者: yo
For Each〜Nextですべてのテーブルをループするようになっています。
> For Each ToTb In ToDb.TableDefs
> TbNm = ToTb.Name
> Set Tb = Db.CreateTableDef("dbo_" & Mid$(TbNm, 5))
> Tb.SourceTableName = Mid$(TbNm, 5)
>
> Tb.Connect = "ODBC;Driver={SQL Server};" & _
> "Server=" & Me.SQLServer & ";" & _
> "Database=" & Me.DBName & ";UID=" & Me.USERID & ";PWD=" & Me.PASS & ";"
> Tb.Attributes = Tb.Attributes Or dbAttachSavePWD
> Db.TableDefs.Append Tb
> Next

テーブル数が多いのだったら、いったん変数にテーブル名を入れておいて(配列を使うといいかも)、
オブジェクトの削除とテーブルのリンクをその変数を使ってループするとコードが長くならなくて
いいのではないでしょうか。

参考まで。。。これは普通のテーブルのリンクの例ですが、
Dim t_name(8) as string
Dim i As Integer
DoCmd.SetWarnings False
t_name(0) = "申込書"
t_name(1) = "受渡票"
t_name(2) = "返却"
t_name(3) = "備考"
t_name(4) = "返却マスタ"
t_name(5) = "備考マスタ"
t_name(6) = "取扱者マスタ"
t_name(7) = "カレンダー"
For i = 0 To 7
DoCmd.DeleteObject acTable, t_name(i)
Next
For i = 0 To 7
DoCmd.TransferDatabase acLink, "Microsoft Access", f_name, acTable, t_name(i), t_name(i)
Next

タイトルRe^4: リンクテーブルの更新をVBAにて行いたい。
記事No: 7639
投稿日: 2008/08/29(Fri) 14:08
投稿者: takumi
yo様

> テーブル数が多いのだったら、いったん変数にテーブル名を入れておいて(配列を使うといいかも)、
> オブジェクトの削除とテーブルのリンクをその変数を使ってループするとコードが長くならなくて
> いいのではないでしょうか。
そうなのです…テーブル数が多いのです。(約50〜)

コードを参考にさせていただき、作成したところ削除は問題なく出来ているのですが、下記のコードでエラーが出ます。
DoCmd.TransferDatabase acLink, "ODBC データベース", "ODBC;Driver={SQL Server};Server=" & Me.SQLServer & ";Database=" & Me.DBName & ";UID=" & Me.USERID & ";PWD=" & Me.PASS & ";", acTable, t_name(i)

内容は"3001 引数が無効です"と出ます。
どの部分が問題なのでしょうか…

宜しくお願いいたします。

タイトルRe^5: リンクテーブルの更新をVBAにて行いたい。
記事No: 7642
投稿日: 2008/08/29(Fri) 15:22
投稿者: yo
t_name(i)のところにテーブル名を指定して、この一行だけで実行したらどうなりますか?

タイトルRe^6: リンクテーブルの更新をVBAにて行いたい。
記事No: 7644
投稿日: 2008/08/29(Fri) 15:36
投稿者: takumi
yo様

> t_name(i)のところにテーブル名を指定して、この一行だけで実行したらどうなりますか?
同じ現象ですね。引数が無効です。と言われます。

タイトルRe^7: リンクテーブルの更新をVBAにて行いたい。
記事No: 7645
投稿日: 2008/08/29(Fri) 15:43
投稿者: yo
それでは、その文が間違っているわけですから、
その1行だけで実行できるように修正してみてください。

タイトルRe^8: リンクテーブルの更新をVBAにて行いたい。
記事No: 7657
投稿日: 2008/09/02(Tue) 09:09
投稿者: takumi
> それでは、その文が間違っているわけですから、
> その1行だけで実行できるように修正してみてください。

yo様

回答が遅くなりましたが、無事出来るようになりました。
出来なかった理由としましては、リンク元の名前とリンク後の名前が違った事と、リンク後の名前を指定していなかった事でした。

引数が無効の理由は、リンク後の名前を指定していなかった。
その後、リンク先のテーブル名が見つからないというエラーになり、確認したところ、リンク元とリンク後のテーブル名が違っていた為でした。

そこで下記のようにしたところ問題なく更新できました。
Dim t_name(8), l_name(8) As String
Dim i As Integer
t_name(0) = リンク元テーブル名

==========省略==========

l_name(7) = リンク後テーブル名
For i = 0 To 7
DoCmd.DeleteObject acTable, l_name(i)
Next
For i = 0 To 7
Dim sql As Variant
sql = ("ODBC;Driver={SQL Server};" & _
"Server=" & Me.SQLServer & ";" & _
"Database=" & Me.DBName & ";UID=" & Me.USERID & ";PWD=" & Me.PASS & ";")
DoCmd.TransferDatabase acLink, "ODBC データベース", sql, acTable, t_name(i), l_name(i)
Next
MsgBox "更新完了"

何度もお付き合いいただき本当にありがとうございました。

タイトルRe^9: リンクテーブルの更新をVBAにて行いたい。
記事No: 7658
投稿日: 2008/09/02(Tue) 09:10
投稿者: takumi
すみません。クローズし忘れてました。


このAccessフォーラム過去ログ集は、Microsoft Access Club が運営しています

年額2,400円でドメインネームサーバーをご用意します。自宅サーバ構築時にご利用下さい。自宅サーバーは応用範囲が広いです。
年額2,400円でドメインネームサーバー。
自社・自宅サーバ構築時にご利用下さい。
やはり、自前サーバーは応用範囲が広いです。

 

ページの先頭へ 前ページへ戻る