質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

1回答

2452閲覧

Form.OrderByOnで初期化に失敗する

Chandler_Bing

総合スコア673

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2021/10/08 13:43

編集2021/10/09 08:14

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

VBA

1SQL = "SELECT A, B, C, D, E, F, IIF(IsNUll([G],'')<>'',1,0) AS G " _ 2 & " FROM table_a " _ 3 & " WHERE A = '" & メインフォームのデータ & "'" 4rs.CursorLocation = adUseClient 5rs.Open SQL, サーバー接続, adOpenDynamic, adLockReadOnly 6Set Me.サブフォーム名.Form.Recordset = rs.Clone 7 8rs.Close 9 10サブフォーム名.Form.OrderBy = "A,B" 11サブフォーム名.Form.OrderByOn = True '// こいつが悪さをしている

サーバーに接続してレコードを取得し、その内容をサブフォームに表示するプログラムです。
サブフォーム名.Form.OrderByOn = Trueを実行すると、データプロバイダー初期化できませんでした。
というエラーが表示されます。
→レコードの件数を確認するとサーバーの件数と一致するのでSQLの実行自体は上手くいっています。

どこに原因がありますでしょうか?
SELECTで取得するカラム数を増やしてから今回の事象が発生しました。

IIFを使用しているのが原因なのでしょうか?

ご教授のほどよろしくお願いします。

★追記①★
SQL文のNzをIsNUllに変更いたしました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

AccessのフォームやレポートはDAOのレコードセットと連結するのが前提で設計されてます。レコードセットプロパティにテーブル名やSQLを設定したときは、DAOのレコードセットと連結されます。

この質問のコードでADOレコードセットと連結させることはできますが、FilterプロパティやOrdeByプロパティはADOレコードセットと連結させたときは使用できません。

前の質問にも回答しましたが、レコードセットプロパティにSQLを設定すれば、FilterプロパティやOrdeByプロパティを使用できます。SQLのIN句を利用すれば外部データベースにも接続できます。

投稿2021/10/08 17:15

hatena19

総合スコア33795

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chandler_Bing

2021/10/09 01:56

ありがとうございます。 サブフォーム名.Form.OrderBy = "A,B" サブフォーム名.Form.OrderByOn = True '// こいつが悪さをしている を使用せずに、 SQL = "SELECT A, B, C, D, E, F, IIF(NZ([G],'')<>'',1,0) AS G " _ & " FROM table_a " _ & " WHERE A = '" & メインフォームのデータ & "'" にORDER BY を指定すると rs.Open SQL, サーバー接続, adOpenDynamic, adLockReadOnlyの部分で データベースに接続できないとう旨のエラーが出てしまいます。
hatena19

2021/10/09 03:04

接続先のデータベースはなんですか。Access? SQL SERVER? ・・・・
Chandler_Bing

2021/10/09 05:31

SQL SERVERになっております。
hatena19

2021/10/09 06:31

NZはAccess独自の関数なのでSQL SERVERでは使えません。 前の質問で回答もらってますよね。
Chandler_Bing

2021/10/09 08:17 編集

すみません。 質問文にあやまりがありました。(※訂正します。) こちらIS NULL を使用しております。 Form.OrderByOnを削除するとソートはされませんが、レコードは取得できます。 これはなぜなのでしょうか?
hatena19

2021/10/09 08:30

上の回答にも書きましたが、ADOレコードセットとの接続では OrderBy OrderByOn の機能は使えません。
Chandler_Bing

2021/10/09 09:04

ありがとうございます。理解不足ですみません。 ADOレコードセットとの接続 = アクセスのデータベースではなく、サーバー側からのデータ取得ということでしょうか? その場合に、OrderBy や OrderByOn が使えないとなると、どのようにしてレコードを並べ替えればよいのでしょうか??
hatena19

2021/10/09 09:20

DAOレコードセットをRecordsetプロパティに設定するか、レコードセットプロパティにSQLを設定すれば、OrderBy OrderByOn を遣えます。 ADOのレコードセットを使いたい場合は、ADOのレコードセットを開く時に、SQLで ORDER BY で並べ替えてそれをレコードセットに設定することになります。あるいは、ADOレコードセットのSORTプロパティで並べ替えてから、フォームのRecordsetプロパティに設定することになります。
Chandler_Bing

2021/10/09 11:20

>SQLで ORDER BY で並べ替え つまり以下の形ですよね? SQL = "SELECT A, B, C, D, E, F, IIF(IsNUll([G],'')<>'',1,0) AS G " _ & " FROM table_a " _ & " WHERE A = '" & メインフォームのデータ & "'" _ & " ORDER BY A, B" rs.CursorLocation = adUseClient rs.Open SQL, サーバー接続, adOpenDynamic, adLockReadOnly Set Me.サブフォーム名.Form.Recordset = rs.Clone これでもエラーがでるよのですが、hatena19様からみて上記だと動くはずという認識でしょうか?
hatena19

2021/10/09 11:27

SQLに間違いがなければ動くという認識ですが。 SQL SERVERとの接続は経験がないので、これ以上の回答は私には難しいです。
Chandler_Bing

2021/10/09 11:32

行けました。。。。 サブフォーム名.Form.OrderBy = "A,B" ↑こいつもコメントアウトし、SQL文にORDER BY 句を付与で動きました。 お騒がせ致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問