2012,01,21, Saturday
SELECT文を使うストアドプロシージャをVBAで実行したのに、レコードセットを返さない場合があります。
原因は、ストアドプロシージャ内で
(1)INSERTもしくはUPDATE文
(2)SElECT文
の順に実行しているためです(私の場合)。
(1)INSERTもしくはUPDATEを実行した時点で、レコードセットはないと判断されてしまうらしい。
こういうときはストアドにSET NOCOUNT ONを記述しましょう。
位置は、INSERTもしくはUPDATE文の前でいいようです。
原因は、ストアドプロシージャ内で
(1)INSERTもしくはUPDATE文
(2)SElECT文
の順に実行しているためです(私の場合)。
(1)INSERTもしくはUPDATEを実行した時点で、レコードセットはないと判断されてしまうらしい。
こういうときはストアドにSET NOCOUNT ONを記述しましょう。
位置は、INSERTもしくはUPDATE文の前でいいようです。
2011,11,24, Thursday
会社で発生した問題の解決事例を上げます。
Accessとデータベースサーバ(SQL Server)の接続を行う場合、データリンクプロパティのダイアログボックスを開いて設定します。
この時、ネットワークにサーバは存在するのに、下記のようなエラーメッセージが出てつながらないことがあります。
サーバの存在は確認できるけど、サーバ内のデータベースを選択できない、等。
自分の解決策を書きます。
<解決策>
(1)データリンクプロパティで「すべて」タブを選択
(2)「Network Library」に「DBMSSOCN」と書かれている場合、「値の編集」で空欄にする
(3)「接続」タブに戻ると、データベースに接続可能になっている
<解説>
「Network Library」にはデータベースとの接続方法が設定されています。
上記の「dbmssocn」は「Winsock TCP/IP」を意味します。
参考:接続文字列の使用
しかし、特定せずに空欄のままにした方がいいこともあるようです。
Access2010で新規作成したADPには規定値で「DBMSSOCN」が入るようなので、作った時にここを外すのもいいかもしれません。
Accessとデータベースサーバ(SQL Server)の接続を行う場合、データリンクプロパティのダイアログボックスを開いて設定します。
この時、ネットワークにサーバは存在するのに、下記のようなエラーメッセージが出てつながらないことがあります。
プロバイダの初期化中にエラーが発生したため、接続のテストに失敗しました。[DBNETLIB][ConnectionOpen(Connect()).]SQL Serverが存在しないか、アクセスが拒否されました。
サーバの存在は確認できるけど、サーバ内のデータベースを選択できない、等。
自分の解決策を書きます。
<解決策>
(1)データリンクプロパティで「すべて」タブを選択
(2)「Network Library」に「DBMSSOCN」と書かれている場合、「値の編集」で空欄にする
(3)「接続」タブに戻ると、データベースに接続可能になっている
<解説>
「Network Library」にはデータベースとの接続方法が設定されています。
上記の「dbmssocn」は「Winsock TCP/IP」を意味します。
参考:接続文字列の使用
しかし、特定せずに空欄のままにした方がいいこともあるようです。
Access2010で新規作成したADPには規定値で「DBMSSOCN」が入るようなので、作った時にここを外すのもいいかもしれません。
2011,09,09, Friday
Microsoft Accessを使ったアプリケーションを使った時、
「引数が間違った型、許容範囲外、または競合しています。」というエラーメッセージが出る事があります。
自分とは異なる環境で作られたAccessを起動すると、こうなるようです。
例えばwin7で作られたものをXPで起動するとか。
こういうケースの場合
(1)参照設定を一旦全てチェックを外し、OKボタンを押す
(2)再び外した設定にチェックをつける
でメッセージが出なくなり、無事に使えます。
全ての参照設定ではなく
「Microsoft ActiveX Data Objects x.x Library」か
「OLE Automation」のどちらかを外す→再設定でいいこともあります。
「引数が間違った型、許容範囲外、または競合しています。」というエラーメッセージが出る事があります。
自分とは異なる環境で作られたAccessを起動すると、こうなるようです。
例えばwin7で作られたものをXPで起動するとか。
こういうケースの場合
(1)参照設定を一旦全てチェックを外し、OKボタンを押す
(2)再び外した設定にチェックをつける
でメッセージが出なくなり、無事に使えます。
全ての参照設定ではなく
「Microsoft ActiveX Data Objects x.x Library」か
「OLE Automation」のどちらかを外す→再設定でいいこともあります。
2011,07,13, Wednesday
最近Windowsでアップデートできるようになった下記の2件ですが、おすすめしません。
Microsoft Office 2010 Service Pack 1 (32 ビット版): KB2510690
Microsoft Office 2010 Service Pack 1 (64 ビット版): KB2510690
私の職場でこれを行うと、Access2010が動かせなくなってしまいました!
これでは仕事になりません。
このアップデートは任意の更新なので、しばらく様子を見た方が良いでしょう。
※2011/11/16追記
シャットダウン時にうっかりインストールしてしまいましたが、やはりまだ障害が起こります。
フォームを開く際、パラメータを要求されることがあります。
まだバージョンアップは避けた方が賢明です。
Microsoft Office 2010 Service Pack 1 (32 ビット版): KB2510690
Microsoft Office 2010 Service Pack 1 (64 ビット版): KB2510690
私の職場でこれを行うと、Access2010が動かせなくなってしまいました!
これでは仕事になりません。
このアップデートは任意の更新なので、しばらく様子を見た方が良いでしょう。
※2011/11/16追記
シャットダウン時にうっかりインストールしてしまいましたが、やはりまだ障害が起こります。
フォームを開く際、パラメータを要求されることがあります。
まだバージョンアップは避けた方が賢明です。
2011,07,01, Friday
ルール違反となる操作をした際に出てくる既定のメッセージを、独自のエラーメッセージに置き換えてみます。
既定のメッセージとは、例えば下記のようなものです。
「DELETEステートメントはREFERENCE制約"FK_外部キー名"と競合しています。
競合が発生したのは、データベース"データベース名"、テーブル"dbo.テーブル名"です。」
これは親子関係にあるテーブルのうち、子レコードを持つ親レコードを消そうとした際に表示されます。
言いたいことはわかるのですが、Windowsのダイアログと一緒で無味乾燥ですよね。
変更する方法は、下記が参考になります。
参考:http://www.accessclub.jp/samplefile/samplefile_75.htm
ポイントは余り使わないであろう Form_Error で処理を書くところですね。
削除ならForm_Beforedelconfirmでも良さげに思えますが、自分はうまくいかなかった。
既定のメッセージとは、例えば下記のようなものです。
「DELETEステートメントはREFERENCE制約"FK_外部キー名"と競合しています。
競合が発生したのは、データベース"データベース名"、テーブル"dbo.テーブル名"です。」
これは親子関係にあるテーブルのうち、子レコードを持つ親レコードを消そうとした際に表示されます。
言いたいことはわかるのですが、Windowsのダイアログと一緒で無味乾燥ですよね。
変更する方法は、下記が参考になります。
参考:http://www.accessclub.jp/samplefile/samplefile_75.htm
ポイントは余り使わないであろう Form_Error で処理を書くところですね。
削除ならForm_Beforedelconfirmでも良さげに思えますが、自分はうまくいかなかった。
| Microsoft Office | 23:58 | comments (0) | trackback (x) |
2011,06,30, Thursday
剰余を求める時に使うMOD関数。
Excelのワークシート関数では
MOD ( 割られる数 , 割る数 )
VBAの関数では
割られる数 mod 割る数
で剰余が返ります。
同じMicrosoft社の製品なのに、なんで形式が違うんでしょう?
答えは、VBAとワークシート関数では生まれた時期が違うから、ということらしいです。
参考:http://kurokiline.yoka-yoka.jp/e162343.html
使う方としては面倒ですが、開発側の気持ちもわかります。
でも、やっぱり統一して欲しいのが本音。
ただ、今後Microsoftがそういう部分を直すかは疑問。
Office製品はどんどん安くなってますからね。
Excelのワークシート関数では
MOD ( 割られる数 , 割る数 )
VBAの関数では
割られる数 mod 割る数
で剰余が返ります。
同じMicrosoft社の製品なのに、なんで形式が違うんでしょう?
答えは、VBAとワークシート関数では生まれた時期が違うから、ということらしいです。
参考:http://kurokiline.yoka-yoka.jp/e162343.html
使う方としては面倒ですが、開発側の気持ちもわかります。
でも、やっぱり統一して欲しいのが本音。
ただ、今後Microsoftがそういう部分を直すかは疑問。
Office製品はどんどん安くなってますからね。
2011,06,22, Wednesday
仕事上、Microsoft AccessとSQL Serverを連携させたアプリケーションをよく使います。
サーバマシン上のSQL Serverにデータやストアドプロシージャを保存し、
クライアントマシン上のAccessからそれらを呼び出すのです。
で、先日タイトルのようなエラーメッセージが出てしまいました。
ストアドの構成としては、
(1)あるテーブルにINSERT INTO文を実行
(2)そのテーブルのSELECT文を実行し、その結果を返す
なのですが、(1)まではうまくいっている模様。
調べてみると、(1)を実行した後に出てくる「xx件処理されました」というメッセージが問題らしい。
メッセージを非表示にするには「SET NOCOUNT ON」を使います。
これを(1)と(2)の間に置くと、エラーメッセージがでなくなりました。
参考:http://prg.seesaa.net/article/18297356.html
サーバマシン上のSQL Serverにデータやストアドプロシージャを保存し、
クライアントマシン上のAccessからそれらを呼び出すのです。
で、先日タイトルのようなエラーメッセージが出てしまいました。
ストアドの構成としては、
(1)あるテーブルにINSERT INTO文を実行
(2)そのテーブルのSELECT文を実行し、その結果を返す
なのですが、(1)まではうまくいっている模様。
調べてみると、(1)を実行した後に出てくる「xx件処理されました」というメッセージが問題らしい。
メッセージを非表示にするには「SET NOCOUNT ON」を使います。
これを(1)と(2)の間に置くと、エラーメッセージがでなくなりました。
参考:http://prg.seesaa.net/article/18297356.html
2011,06,21, Tuesday
Accessで「クラスはオートメーションまたは予測したインターフェースをサポートしていません」というメッセージが出た際には、解決策がいくつかあります。
いずれも、ソースの間違いではなくライブラリが破損しているので、直そうというものです。
(1)scrrun.dllを新しくする
scrrun.dllが古い可能性があるので、web上からダウンロードし、上書きします。
参考:http://www.gizcollabo.jp/vbtomo/log/archive/vbqanda_1343_2.html
(2)Microsoft MDACをインストール
参考:http://www.eases.jp/product/ukiuki/faq2.htm
(3)「プログラムと機能」でAccessを修復する
Accessがない場合はMicrosoft Office Professionalとかがあると思うので、それを修復しましょう。
私は3の方法で解決しました。
いずれも、ソースの間違いではなくライブラリが破損しているので、直そうというものです。
(1)scrrun.dllを新しくする
scrrun.dllが古い可能性があるので、web上からダウンロードし、上書きします。
参考:http://www.gizcollabo.jp/vbtomo/log/archive/vbqanda_1343_2.html
(2)Microsoft MDACをインストール
参考:http://www.eases.jp/product/ukiuki/faq2.htm
(3)「プログラムと機能」でAccessを修復する
Accessがない場合はMicrosoft Office Professionalとかがあると思うので、それを修復しましょう。
私は3の方法で解決しました。
2011,06,09, Thursday
<環境>
Microsoft Windows 7 Professional
Microsoft Access2010
レポートやフォームに設定するオブジェクトの枠線は、太さを
「細線,1,2,3,4,5,6」
の7段階で設定できます。
細線と1の太さは、印刷プレビューだと見た目ほとんど同じです。
しかし、印刷してみると明らかに違います。
↑はPDFで出力し、一部をキャプチャしたものです。
必要に応じて使い分けましょう。
That's all!(そんだけ)
ちなみに、枠線の太さはVBAだとBorderWidthで設定します。
細線なら
フォームまたはレポート名.オブジェクト名.BorderWidth = 0
太さ1なら
フォームまたはレポート名.オブジェクト名.BorderWidth = 1
Microsoft Windows 7 Professional
Microsoft Access2010
レポートやフォームに設定するオブジェクトの枠線は、太さを
「細線,1,2,3,4,5,6」
の7段階で設定できます。
細線と1の太さは、印刷プレビューだと見た目ほとんど同じです。
しかし、印刷してみると明らかに違います。
↑はPDFで出力し、一部をキャプチャしたものです。
必要に応じて使い分けましょう。
That's all!(そんだけ)
ちなみに、枠線の太さはVBAだとBorderWidthで設定します。
細線なら
フォームまたはレポート名.オブジェクト名.BorderWidth = 0
太さ1なら
フォームまたはレポート名.オブジェクト名.BorderWidth = 1
Tweet |
TOP PAGE △