Microsoft Access 掲示板

views
4 フォロー
6,283 件中 2,121 から 2,160 までを表示しています。
5

hatena様

少し自信が無かったのですが、確認できて本当に助かりました。
なるほどです。Filterがされていた場合でもSQLは取得できるのですね。
勉強になりました。

解決とさせていただきます。
どうもありがとうございました。

4

提示のコードで問題なさそうですが、解決済みということでいいでしょうか。

Recordsetの部分を RecordsetClone あるいは Recordset.Clone にした方が高速に処理はできます。詳細は、下記を参照してください。

フォームの Recordset, RecorsetClone, RecordSet.Clone の違いとは? - hatena chips

検索フィールドでの選択の値を拾えばSQLは再現できるのですが、サブフォームコントロール状で、直接フィルタをされた場合、SQLが生成できないため、このような方法で検討しています。

フィルターがかかっている場合、Filterプロパティに条件式が格納されてますので、それを使えばSQLは生成できると思います。リンクフィールド名が LinkFld で数値型なら、下記のような感じです。

Dim stSQL As String 
With Me.subForm1.Form
    stSQL = "update Qry_対象者 set 対象フラグ=true where LinkFld =" &  !LinkFld & " And (" & .Filter & ");"
End With
3

お返事遅くなり申し訳ございません。

メインフォームにサブフォーム1があり、サブフォーム2がサブフォームに連動(親/子フォールドで連結)されています。ヘッダにある検索条件でサブフォームのデータを抽出します。その状態で、抽出済みのレコードに対して、
対象フラグというYes/No型のフィールドにチェックをするというコマンドボタンのアクションで、チェックを付すロジックでのご相談です。検索フィールドでの選択の値を拾えばSQLは再現できるのですが、サブフォームコントロール状で、
直接フィルタをされた場合、SQLが生成できないため、一応、このような方法で検討しています。

Private Sub 全て選択_Click()

    CurrentDb.Execute "update Qry_対象者 set 対象フラグ=false", dbFailOnError

    Set rs = Me.Controls("subForm1").Form.Recordset

    Me.Painting = False

    rs.MoveLast
    rs.MoveFirst

    Do Until rs.EOF

        rs.Edit
            rs![対象フラグ] = True
        rs.Update

        rs.MoveNext

    Loop

    Me.Painting = True

    Me.Controls("subForm1").Form.Requery

End Sub

4

上記リンク先は64ビット非対応なので、64ビットにも対応したものに下記得ました。

フォーム上にラベルとコマンドボタンを配置します。
フォームプロパティの「境界線スタイル」を「なし」に設定してタイトルバーを非表示にします。

フォームのモジュールに下記のコードを設定します。

Option Compare Database
Option Explicit
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" ( _
ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As Long
Private Declare PtrSafe Sub ReleaseCapture Lib "user32.dll" ()

Private Const WM_NCLBUTTONDOWN = &HA1
Private Const HTCAPTION = 2

Private Sub コマンド1_Click()
    DoCmd.Close acForm, Me.Name
End Sub

Private Sub ラベル0_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button And acLeftButton Then
        ReleaseCapture
        Call SendMessage(Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
    End If
End Sub

Private Sub ラベル0_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Debug.Print "ドラッグ移動しました", Me.WindowLeft, Me.WindowTop
End Sub

上記でラベル部分をクリックしてドラッグするとフォームを移動できます。
マウスボタンを開放すると、イミディエイトウィンドウに、移動後のフォームの位置が出力されます。
Accessウィンドウのクライアントエリアの左上を原点とする座標位置になります。

2
hiroton 2022/12/08 (木) 17:59:48 a043c@f966d

いっそタイトルバー無くしてフォームのMouseMoveイベント使ってフォームをドラッグ移動できるようにするとか

1

基本的には無理かと。
Win API を駆使すれば可能かもしれませんが、難易度はかなり高そう。

1

「Access QRコード」をキーワードにWEB検索すれば、解説ページいろいろ見つかります。
例えば、
ACCESSでバーコードを作成する方法 - たすけてACCESS

6
チョコラブ 2022/12/05 (月) 12:44:49 a1353@4d8ec >> 4

プロパティもVBAで設定していますが、以前、直接コントロールソースに書き込んだら20列あるためなのか、フォームのデザインビューとフォームビューの切り替えがすごく遅くなってしまったのでVBAで対応することにしました。

仕方なくADOで対応することにしました。ありがとうございました。

5
チョコラブ 2022/12/05 (月) 12:42:39 a1353@4d8ec >> 3

部品番号が同じで、顧客部品番号が違うもののリストがあるので、同じ部品番号の1番目を選択した時と2番目を選択した時を区別したいのです。(2列目は顧客部品番号があり、違う番号になっている)

仕方ないのでIDを取得し、ADOで抽出することにしました。

アドバイスありがとうございました。

6
MM 2022/12/05 (月) 09:32:00 9e872@b3ff4

私の使っている、あるAccessファイルは、端末の1つがノイズだらけの工場内にWi-Fi接続で、ランタイム版です。
不定期かつ頻繁に、メインPCから見て、突然作業が中断されデータベースに矛盾がある状態になります。
そのファイルをファールサーバーから強制切断後、改めてメインPCがら開くと、矛盾が自動修復され、使えるようになります。

6

DoCmd.TransferText メソッドを使うなら、下記のような感じです。

Private Sub コマンド1_Click()
    Dim htmlFileName As String
    htmlFileName = "C:\TEST\TEST.html"
    Dim InportTableNames As String
    InportTableNames = "Table,Table1,Table2" 'インポートしたいテーブル名をカンマ区切りで設定

    Dim tbl
    For Each tbl In Split(InportTableNames,",")
        DoCmd.TransferText acImportHTML, , tbl, htmlFileName, True, tbl
    Next
End Sub
4
hatena 2022/12/04 (日) 02:09:32 修正

部品番号コンボボックスの下記プロパティの設定はどうなってますか。

値集合ソース
値集合タイプ
連結列
列数
列幅

ちなみに、リストの選択した行の1列目の値を表示させたい場合は、
「連結列」を「1」と設定しておけば、下記でOKです。

Private Sub 部品番号_AfterUpdate()
    Me.部品ID = Me.部品番号.Value
End Sub

あるいは、部品IDテキストボックスのコントロールソースを下記のように設定すればコード不要です。

=[部品番号]
3
りんご 2022/12/03 (土) 23:17:22 4d616@0e907 >> 2

大雑把にやってみた限りでは、特に問題なく転記出来ました。

下記の通りになりますが、Clickイベントだと正しく行番号が取得できますが、更新後処理イベントに入れると正しく表示されません。

Debug.printの結果も、すべて1が続く感じになるのかしら。

関係があるのでしょうか?

ちょっとよくわかりません。コード以外も想定通りかひと通りチェックするくらいでしょうか。例えば、VBAの画面で、ClickイベントとAfterUpdateイベントを試しているが、実は何かの弾みで、コンボボックスのプロパティの更新後処理イベントの[イベントプロシージャ]が外れてしまっていたり。

2
チョコラブ 2022/12/03 (土) 21:32:46 9af1b@d60f0

リンゴ様

情報が足りずにすみません。
下記の通りになりますが、Clickイベントだと正しく行番号が取得できますが、更新後処理イベントに入れると正しく表示されません。
関係があるのでしょうか?

Private Sub 部品番号_AfterUpdate()
    If Me.部品番号.ListIndex <> -1 Then
        Me.部品ID = Me.部品番号.Column(0,Me.部品番号.ListIndex)
        Debug.Print Me.部品番号.ListIndex
    End If
End Sub

1
りんご 2022/12/03 (土) 20:58:03 4d616@0e907

 取り敢えず、PrivateからEnd Subまでのコードを提示したほうが回答がつきやすいはずです。そして、次のようなサイトをググって、違いがないか見比べると自己解決できるかもしれません。■T'sWare フォーム&コントロール プロパティ活用辞典-094 ~ListIndex~

5
りんご 2022/12/02 (金) 15:17:51 7ce21@0e907 >> 4

 以下、質問文の限られた情報から回答しています。実情と違う場合は、すみません。
 html画面で見れるようにhtml出力。html出力だから、htmlインポート。htmlインポートだから、見出し毎のテーブル。これでは、机の上の書類を見出し毎のダンボールに詰めただけに見えます。データベースの制約が実装されていなければ、無意味です。
 関係データベースの設計図をきちんと設計しましょう。設計図があるから、CRUD画面のパターンが決まり、データベースの制約に従ってCRUDを実行出来る様になります。データベースは手間がかかるものですし、手間を省くピントもずれているように見えてしまいます。

4
質問太郎 2022/12/02 (金) 10:38:13 b6edf@5e89d >> 2

ありがとうございます。
非連結になっていなかったので、テキストフォームのコントロールソースを消してみました。

・有効数、無効数ともに1しかカウントしなくなった(1から増えない)
・次のレコードは0スタートになった(前は0はセットするけどカウントボタンを押すと前回の続きの数値が入る)

といった状況です。。。

4

hatenaさん、アドバイス有難う御座います。
現在、マクロ操作を繰り返す手順でやってますが、改めて考えてみます。
りんごさん、「html出力の是非、データベース間接アクセスの是非を見直すべきでは?」の指摘の意図が良く判りませんでした。詳しく教えて頂ければ幸いです。

2

手作業で、htmlインポートウィザードで設定をして完了をクリックした後、「インポート操作の保存」にチェックをいれて、「名前を付けて保存」にお好みの名前を付けて、「インポートの保存」をクリックします。
これを、必要なテーブルの数だけ繰り返します。

マクロで「保存済みインポート/エクスポート操作の実行」アクションで上記で保存したインポート操作を選択すれば、実行することができます。

VBAなら、
DoCmd.RunSavedImportExport "インポート操作の名前"

3

連結フォームの非連結テキストボックスならうまく行くはずです。
こちらのサンプルではうまくいってます。
どこか間違っているのか、情報として出されていない部分に原因があるのでしょう。

どうしてもわからなければ、ファイル送信フォームから現状のAccessファイルを送ってくれれば原因が分かるかもしれません。送信フォームは右カラムの下にあります。

1
りんご 2022/12/01 (木) 17:16:40 c564b@0e907

 無意味です。html出力の是非、データベース間接アクセスの是非を見直すべきでは?

2
質問太郎 2022/12/01 (木) 17:00:24 b6edf@5e89d >> 1

ありがとうございます。
次のレコードをマクロビルダーでやっていて、
レコード移動>新しいレコード
にしてるので、追加のコードを入れてもうまくいかないです。。。

1

「有効数」「無効数」 は非連結のテキストボックスでしょうか。
でレコード移動時に、これらのテキストボックスの値を 0 にしたいということでしょうか。

もしそうならば、フォームのレコード移動時のイベントプロシージャを下記のように記述すればいいでしょう。

Private Sub Form_Current()
    Me!有効数 = 0
    Me!無効数 = 0
End Sub
4
あしべ 2022/11/29 (火) 08:43:12 52b25@c8c45 >> 3

遅くなりましたm(_ _)m
insert intoによるレコード追加はできました。
最悪これで良いですけどできればselect intoでできると良いんですけどね。不思議です。。

2
えいじ 2022/11/28 (月) 23:09:51

言葉足らずで申し訳ございません。
回答ありがとうございました。

2

サブフォームコントロールなので、更に、サブフォームのフィルタからも抽出が可能です。

サブフォームのFilterプロパティを使って抽出したいというのが目的なら、下記のようなコードで可能です。

Me.サブフォームコントロール名.Form.Filter = "抽出条件式"
Me.サブフォームコントロール名.Form.FilterOn = True
1

サブフォームに抽出されているレコードセットを特定する方法についてご教授いただけますでしょうか。

サブフォームのレコードセットは、メインフォームから取得するなら、
Me.サブフォームコントロール名.Form.Recordset
で取得できます。

ただ、あまり使う必要性がある場面は少ないと思いますが、具体的にはどのようなことをしたいのでしょうか。

1

やりたいことをもう少し具体的に説明してもらえませんか。

フォームヘッダーのテキストボックスに 親ID を入力して、[検索]ボタンをクリックしたら、詳細セクションに該当するレコードの 子ID, 顧客ID を表示したいということでしょうか。

上記の推測であっているなら、下記のようにすればいいでしょう。

テーブルをレコードソースとする帳票フォームを作成します。
フォームウィザードで表形式を選択すれば簡単に作成できます。
このフォームを開いたときはすべてのレコードが表示されますが、表示したくない場合は、フォームプロパティを下記のように設定します。

フィルター False
読み込み時にフィルターを適用 はい

あとは、必要に応じて「追加の許可」「削除の許可」「更新の許可」を設定してください。

フォームヘッダーにテキストボックスとコンボボックスを配置して、名前をそれぞれ、
txtFind, cmdFind とします。

cmdFindのクリック時のイベントプロシージャを下記のように記述します。

Private Sub cmdFind_Click()
    Me.Filter = "親ID=" & Me.txtFind
    Me.FilterOn = True
End Sub

以上です。

3

空のテーブルを作成しておいて、INSERT INTO でレコードを追加した場合はどうなりますか。

2
あしべ 2022/11/25 (金) 13:08:16 52b25@c8840 >> 1

hatena様:

はい。SQL文はそのまま同じです。
普通に目視確認で、ファイルを開き直してもTABLE1は存在しません。

1

Oracleの環境がないので確認はできませんが、下記の点について情報補足してください。

提示のSQLは実際のものをコピーしたものですか。
TABLE1が存在しないというのはどのように確認しましたか。
ファイルを閉じてから再度開いても存在してませんか。

2
みどり 2022/11/23 (水) 14:52:18 a8670@817c8

hatenaさん、ご返信ありがとうございます。

なるほど、"#"で括る必要はないのですね
回答頂いた方法で、正常に動作しました。
誠にありがとうございました。

1

クエリのSQLビューにSQLを記述するのですよね。
なんかVBAとか関数内の記述と混同してませんか。VBAや関数内ではSQL文は文字列にする必要がありますが、クエリのSQLビューならSQLをそのまま記述すればOKです。

基本、SQLServerなどのデータベースと同じ記述でいいです。

SELECT
 O.partsCode
,O.orderDate
,O.deliveryDate
,( SELECT COUNT(myDate) AS A
   FROM calendar
   WHERE (myDate BETWEEN O.orderDate AND O.deliveryDate)
      AND (holidayFlag = true)) AS myholiDay
FROM myDate AS O;
11
こじゅわい 2022/11/11 (金) 15:34:50 350e2@3e38e

お忙しいところご教授ありがとうございます。

そうなんです。その通りなんです。
でも、壁はとりあえず乗り越えたいので・・・

ご指摘の通り照合順序を明示的に付加したところ意図する結果が得られました。
流石です。

COLLATE Japanese_XJIS_100_CI_AS Like N'%㉑%'
COLLATE Japanese_Bushu_Kakusu_100_CI_AS Like N'%㉑%'

感謝!

10

ODBCリンクテーブルのフィールドの値に対して文字列比較を行う際の
照合順序(並び順序)はバックエンド側で適用されているものに準拠しますので、
まずはリンク先である Azure SQL データベースの設定を確認して下さい。
恐らく Japanese90 や Japanese_ などの古い照合順序が適用されているのではないかと。

9
りんご 2022/11/11 (金) 14:27:42 c564b@0e907

 七転八倒して抽出出来るようになったとしても、負の遺産化するだけで意味がない。丸数字を止めれば済む話ではないでしょうか。

8
こじゅわい 2022/11/11 (金) 14:18:29 350e2@3e38e

留意点を踏まえて勉強しながら検討してみます。
とても親切にご教授頂きありがとうございます。

続けでまた壁に当たりました・・・
今回はバックエンドが Azure の SQLデータベース なのですが、同様に丸数字(㉑~)が抽出できません。

どなたかヒントをお願いします。m(__)m

7

と言うことで「日本語」で「最適化」で進めてみます。

その場合は次の点に留意されることをお奨めします。

・Access の[新規データベースの並び順序]オプションの設定値は環境ごとに異なる。
 したがって、そのデータベースを複数のPC/ユーザー間で共有する場合、
 それぞれの環境のオプション設定の違いにより、そのデータベースの
 最適化/修復が他の環境で実行された際にそのデータベースの並び順序が
 変更される可能性がある。

・そのデータベースの並び順序が「日本語」である場合、
 半角/全角のアラビア数字(0~9,0~9)、丸数字(⓪~⑨)、
 二重丸数字(⓵~⓽)について、同じ数を表す文字は区別されない。
 例えば Like "*➀" という条件で文字列比較を行なった場合、
 "基本セット➀"だけでなく"基本セット1"や"基本セット1"とも後方一致する。

後者の仕様がメリット/デメリットのどちらとして働くかは、
それぞれの要求仕様や運用方針によって評価が異なってくるでしょう。

以上の点を踏まえた上で、どの並び順序を適用すべきかについて
検討してみて下さい。