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
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
Private Sub 部品番号_AfterUpdate()
If Me.部品番号.ListIndex <> -1 Then
Me.部品ID = Me.部品番号.Column(0,Me.部品番号.ListIndex)
Debug.Print Me.部品番号.ListIndex
End If
End Sub
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;
hatena様
少し自信が無かったのですが、確認できて本当に助かりました。
なるほどです。Filterがされていた場合でもSQLは取得できるのですね。
勉強になりました。
解決とさせていただきます。
どうもありがとうございました。
提示のコードで問題なさそうですが、解決済みということでいいでしょうか。
Recordsetの部分を RecordsetClone あるいは Recordset.Clone にした方が高速に処理はできます。詳細は、下記を参照してください。
フォームの Recordset, RecorsetClone, RecordSet.Clone の違いとは? - hatena chips
フィルターがかかっている場合、Filterプロパティに条件式が格納されてますので、それを使えばSQLは生成できると思います。リンクフィールド名が LinkFld で数値型なら、下記のような感じです。
お返事遅くなり申し訳ございません。
メインフォームにサブフォーム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
上記リンク先は64ビット非対応なので、64ビットにも対応したものに下記得ました。
フォーム上にラベルとコマンドボタンを配置します。
フォームプロパティの「境界線スタイル」を「なし」に設定してタイトルバーを非表示にします。
フォームのモジュールに下記のコードを設定します。
上記でラベル部分をクリックしてドラッグするとフォームを移動できます。
マウスボタンを開放すると、イミディエイトウィンドウに、移動後のフォームの位置が出力されます。
Accessウィンドウのクライアントエリアの左上を原点とする座標位置になります。
なるほど、その手がありましたね。
下記で、方法を紹介してます。
タイトルバー以外をドラッグしてフォームを移動させる - hatena chips
いっそタイトルバー無くしてフォームのMouseMoveイベント使ってフォームをドラッグ移動できるようにするとか
基本的には無理かと。
Win API を駆使すれば可能かもしれませんが、難易度はかなり高そう。
「Access QRコード」をキーワードにWEB検索すれば、解説ページいろいろ見つかります。
例えば、
ACCESSでバーコードを作成する方法 - たすけてACCESS
プロパティもVBAで設定していますが、以前、直接コントロールソースに書き込んだら20列あるためなのか、フォームのデザインビューとフォームビューの切り替えがすごく遅くなってしまったのでVBAで対応することにしました。
仕方なくADOで対応することにしました。ありがとうございました。
部品番号が同じで、顧客部品番号が違うもののリストがあるので、同じ部品番号の1番目を選択した時と2番目を選択した時を区別したいのです。(2列目は顧客部品番号があり、違う番号になっている)
仕方ないのでIDを取得し、ADOで抽出することにしました。
アドバイスありがとうございました。
私の使っている、あるAccessファイルは、端末の1つがノイズだらけの工場内にWi-Fi接続で、ランタイム版です。
不定期かつ頻繁に、メインPCから見て、突然作業が中断されデータベースに矛盾がある状態になります。
そのファイルをファールサーバーから強制切断後、改めてメインPCがら開くと、矛盾が自動修復され、使えるようになります。
DoCmd.TransferText メソッドを使うなら、下記のような感じです。
部品番号コンボボックスの下記プロパティの設定はどうなってますか。
値集合ソース
値集合タイプ
連結列
列数
列幅
ちなみに、リストの選択した行の1列目の値を表示させたい場合は、
「連結列」を「1」と設定しておけば、下記でOKです。
あるいは、部品IDテキストボックスのコントロールソースを下記のように設定すればコード不要です。
大雑把にやってみた限りでは、特に問題なく転記出来ました。
Debug.printの結果も、すべて1が続く感じになるのかしら。
ちょっとよくわかりません。コード以外も想定通りかひと通りチェックするくらいでしょうか。例えば、VBAの画面で、ClickイベントとAfterUpdateイベントを試しているが、実は何かの弾みで、コンボボックスのプロパティの更新後処理イベントの[イベントプロシージャ]が外れてしまっていたり。
リンゴ様
情報が足りずにすみません。
下記の通りになりますが、Clickイベントだと正しく行番号が取得できますが、更新後処理イベントに入れると正しく表示されません。
関係があるのでしょうか?
Private Sub 部品番号_AfterUpdate()
If Me.部品番号.ListIndex <> -1 Then
Me.部品ID = Me.部品番号.Column(0,Me.部品番号.ListIndex)
Debug.Print Me.部品番号.ListIndex
End If
End Sub
取り敢えず、PrivateからEnd Subまでのコードを提示したほうが回答がつきやすいはずです。そして、次のようなサイトをググって、違いがないか見比べると自己解決できるかもしれません。■T'sWare フォーム&コントロール プロパティ活用辞典-094 ~ListIndex~
以下、質問文の限られた情報から回答しています。実情と違う場合は、すみません。
html画面で見れるようにhtml出力。html出力だから、htmlインポート。htmlインポートだから、見出し毎のテーブル。これでは、机の上の書類を見出し毎のダンボールに詰めただけに見えます。データベースの制約が実装されていなければ、無意味です。
関係データベースの設計図をきちんと設計しましょう。設計図があるから、CRUD画面のパターンが決まり、データベースの制約に従ってCRUDを実行出来る様になります。データベースは手間がかかるものですし、手間を省くピントもずれているように見えてしまいます。
ありがとうございます。
非連結になっていなかったので、テキストフォームのコントロールソースを消してみました。
・有効数、無効数ともに1しかカウントしなくなった(1から増えない)
・次のレコードは0スタートになった(前は0はセットするけどカウントボタンを押すと前回の続きの数値が入る)
といった状況です。。。
hatenaさん、アドバイス有難う御座います。
現在、マクロ操作を繰り返す手順でやってますが、改めて考えてみます。
りんごさん、「html出力の是非、データベース間接アクセスの是非を見直すべきでは?」の指摘の意図が良く判りませんでした。詳しく教えて頂ければ幸いです。
あるいは、DoCmd.TransferText メソッドでも可能です。
DoCmd.TransferText メソッド (Access) | Microsoft Learn
手作業で、htmlインポートウィザードで設定をして完了をクリックした後、「インポート操作の保存」にチェックをいれて、「名前を付けて保存」にお好みの名前を付けて、「インポートの保存」をクリックします。
これを、必要なテーブルの数だけ繰り返します。
マクロで「保存済みインポート/エクスポート操作の実行」アクションで上記で保存したインポート操作を選択すれば、実行することができます。
VBAなら、
DoCmd.RunSavedImportExport "インポート操作の名前"
連結フォームの非連結テキストボックスならうまく行くはずです。
こちらのサンプルではうまくいってます。
どこか間違っているのか、情報として出されていない部分に原因があるのでしょう。
どうしてもわからなければ、ファイル送信フォームから現状のAccessファイルを送ってくれれば原因が分かるかもしれません。送信フォームは右カラムの下にあります。
無意味です。html出力の是非、データベース間接アクセスの是非を見直すべきでは?
ありがとうございます。
次のレコードをマクロビルダーでやっていて、
レコード移動>新しいレコード
にしてるので、追加のコードを入れてもうまくいかないです。。。
「有効数」「無効数」 は非連結のテキストボックスでしょうか。
でレコード移動時に、これらのテキストボックスの値を 0 にしたいということでしょうか。
もしそうならば、フォームのレコード移動時のイベントプロシージャを下記のように記述すればいいでしょう。
遅くなりましたm(_ _)m
insert intoによるレコード追加はできました。
最悪これで良いですけどできればselect intoでできると良いんですけどね。不思議です。。
言葉足らずで申し訳ございません。
回答ありがとうございました。
サブフォームのFilterプロパティを使って抽出したいというのが目的なら、下記のようなコードで可能です。
サブフォームのレコードセットは、メインフォームから取得するなら、
Me.サブフォームコントロール名.Form.Recordset
で取得できます。
ただ、あまり使う必要性がある場面は少ないと思いますが、具体的にはどのようなことをしたいのでしょうか。
やりたいことをもう少し具体的に説明してもらえませんか。
フォームヘッダーのテキストボックスに 親ID を入力して、[検索]ボタンをクリックしたら、詳細セクションに該当するレコードの 子ID, 顧客ID を表示したいということでしょうか。
上記の推測であっているなら、下記のようにすればいいでしょう。
テーブルをレコードソースとする帳票フォームを作成します。
フォームウィザードで表形式を選択すれば簡単に作成できます。
このフォームを開いたときはすべてのレコードが表示されますが、表示したくない場合は、フォームプロパティを下記のように設定します。
フィルター False
読み込み時にフィルターを適用 はい
あとは、必要に応じて「追加の許可」「削除の許可」「更新の許可」を設定してください。
フォームヘッダーにテキストボックスとコンボボックスを配置して、名前をそれぞれ、
txtFind, cmdFind とします。
cmdFindのクリック時のイベントプロシージャを下記のように記述します。
以上です。
空のテーブルを作成しておいて、INSERT INTO でレコードを追加した場合はどうなりますか。
hatena様:
はい。SQL文はそのまま同じです。
普通に目視確認で、ファイルを開き直してもTABLE1は存在しません。
Oracleの環境がないので確認はできませんが、下記の点について情報補足してください。
提示のSQLは実際のものをコピーしたものですか。
TABLE1が存在しないというのはどのように確認しましたか。
ファイルを閉じてから再度開いても存在してませんか。
hatenaさん、ご返信ありがとうございます。
なるほど、"#"で括る必要はないのですね‼
回答頂いた方法で、正常に動作しました。
誠にありがとうございました。
クエリのSQLビューにSQLを記述するのですよね。
なんかVBAとか関数内の記述と混同してませんか。VBAや関数内ではSQL文は文字列にする必要がありますが、クエリのSQLビューならSQLをそのまま記述すればOKです。
基本、SQLServerなどのデータベースと同じ記述でいいです。
お忙しいところご教授ありがとうございます。
そうなんです。その通りなんです。
でも、壁はとりあえず乗り越えたいので・・・
ご指摘の通り照合順序を明示的に付加したところ意図する結果が得られました。
流石です。
COLLATE Japanese_XJIS_100_CI_AS Like N'%㉑%'
COLLATE Japanese_Bushu_Kakusu_100_CI_AS Like N'%㉑%'
感謝!
ODBCリンクテーブルのフィールドの値に対して文字列比較を行う際の
照合順序(並び順序)はバックエンド側で適用されているものに準拠しますので、
まずはリンク先である Azure SQL データベースの設定を確認して下さい。
恐らく Japanese90 や Japanese_ などの古い照合順序が適用されているのではないかと。
七転八倒して抽出出来るようになったとしても、負の遺産化するだけで意味がない。丸数字を止めれば済む話ではないでしょうか。
留意点を踏まえて勉強しながら検討してみます。
とても親切にご教授頂きありがとうございます。
続けでまた壁に当たりました・・・
今回はバックエンドが Azure の SQLデータベース なのですが、同様に丸数字(㉑~)が抽出できません。
どなたかヒントをお願いします。m(__)m
その場合は次の点に留意されることをお奨めします。
・Access の[新規データベースの並び順序]オプションの設定値は環境ごとに異なる。
したがって、そのデータベースを複数のPC/ユーザー間で共有する場合、
それぞれの環境のオプション設定の違いにより、そのデータベースの
最適化/修復が他の環境で実行された際にそのデータベースの並び順序が
変更される可能性がある。
・そのデータベースの並び順序が「日本語」である場合、
半角/全角のアラビア数字(0~9,0~9)、丸数字(⓪~⑨)、
二重丸数字(⓵~⓽)について、同じ数を表す文字は区別されない。
例えば Like "*➀" という条件で文字列比較を行なった場合、
"基本セット➀"だけでなく"基本セット1"や"基本セット1"とも後方一致する。
後者の仕様がメリット/デメリットのどちらとして働くかは、
それぞれの要求仕様や運用方針によって評価が異なってくるでしょう。
以上の点を踏まえた上で、どの並び順序を適用すべきかについて
検討してみて下さい。