Microsoft Access 掲示板

views
4 フォロー
5,901 件中 681 から 720 までを表示しています。
11
Sign is "B" 2023/12/05 (火) 08:40:03 7fdfc@46fae >> 9

すみません、000-000は抽出されます。
000ー000が抽出されません。(長音符)

9

SQLには問題はなさそうてすね。

こちらのサンプルでは問題なく抽出されます。

ちょっと原因が想像できないです。

1
りんご 2023/12/04 (月) 19:04:44 935bc@0e907

データは縦に持つので、そんな事はやりません。正規化して下さい。

8
Sign is "B" 2023/12/04 (月) 17:18:56 7fdfc@46fae >> 7

週を跨ぎ返事が遅くなりすみません。

SELECT T_出力.ID, T_出力.[〒], T_出力.住所1, T_出力.住所2, T_出力.社名1, T_出力.社名2, T_出力.社名3, T_出力.役職, T_出力.氏名, T_出力.敬称, T_出力.連名役職, T_出力.連名, T_出力.連名敬称, T_出力.備考
FROM T_出力
WHERE (((T_出力.[〒]) Not Like "#######"));

こちらSQL文です。

7
フィールド:LenB(StrConv(Nz([T_出力].[〒],""),128))
抽出条件:<>"7"

これはおそらく全角文字以外がふくまれているかを判定したかったのでしょう。ただし、この式ではその目的を達成してません。
話がややこしくなるので、まずはこの条件は削除しておいて、Not Like "#######"の抽出条件の方が解決してから取り組みましょうか。

しかし、今度は消す前は抽出されていた000-000が抽出されなくなってしまいました。

私の提示したシンプルなサンプルのテーブルにそのデータを追加して試してみてください。
こちらのサンプルでは抽出されました。

問題のクエリに他に抽出条件はありませんか。

わからないようならSQLビューにして表示されるSQL文をコピーしてここに貼り付けてください。

8

hatena さんに責任を負わせたいのではないのでご安心を(笑)。
私もいろいろ試した上で、そのようにしたいと自己責任で判断しました。

6
Sign is "B" 2023/12/01 (金) 17:16:41 7fdfc@46fae

同じサンプルを作成したところ、Hatenaさんと同じ実行結果になりました。
他に何か抽出条件が設定されているのではないかと思い探してみたところ、

フィールド:LenB(StrConv(Nz([T_出力].[〒],""),128))
抽出条件:<>"7"

上記が見つかりました。
いつ書いたのか、なぜ書いたのか、どんな意味なのか全く思い出せませんでしたが、こちらを消したところ、000-000や000&000は抽出されるようになりました。

しかし、今度は消す前は抽出されていた000-000が抽出されなくなってしまいました。
7桁の半角数字以外のレコードを抽出するという目的がまだ達成できていません。

7
banjo 2023/12/01 (金) 17:15:36 7774f@e72db

ちょっと考えが進んだので、書き残させて下さい。
試した感じだと、この両方が自分更新可・他者更新不可で動くようです。

Set rs = db.OpenRecordset("table1", dbOpenTable, dbReadOnly + dbFailOnError)
Set rs = db.OpenRecordset("table1", dbOpenTable, dbFailOnError, dbReadOnly)

判断できるのは、
Access のほうで、「ロールバックを想定してるんならおまえが操作するんだよな?」ということで
切り替えてくれるらしいこと。
一応 LockEditにdbReadOnlyが受け付けられるパターンがあること……です。
ただし、(飽くまでも私の環境では)何か動作が不安定な感じがあるので、
MS の公式外、保証外、裏技、昔はできたけど既に見捨てられた何かなのかもしれません。

このへんのせいで、日本語でも英語でも解説が散らばったのかもしれません。
「かもしれない」が続きましたが、改めて言って、
hatenaさんが書いて下さったところが本道なのだと思います。
私もそちらに従わせていただきます。

6

いえ、全然、正統ではないです。
WEB上の情報と、自分の少ない経験のみですので。

結局、最終的には自分で試してみるしかないですね。

5

あら、読み落としてました。
ちょっと意味不明な注意書きですね。

4
banjo 2023/12/01 (金) 16:14:17 a7fa5@fcedf

ちなみにこんなことをする必要はありませんが、間違えてたまたま dbReadOnly + dbFailOnError にしたところ、自分は更新できる・他のユーザは更新できないという振る舞いもしました。このへんも完全に謎ですが、正統と思われる hatena さんの書いて下さった感じで使いたいと思います。

3
banjo 2023/12/01 (金) 16:07:28 a7fa5@fcedf

>>hatena様、情報を整理して紹介して下さってありがとうございます。
hatenaさんがおっしゃれば心強いです! 私もやっと安心です。

ただ、公式もたまに間違っているときがありますので、実際にテストして確認するということも必要になります。

それが、まさに Database.OpenRecordset メソッド (DAO) のページにあるようで……
https://learn.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/database-openrecordset-method-dao

注: dbReadOnly を Options 引数または LockedEdit 引数のどちらか一方で使用することはできますが、両方では使用できません。 両方の引数で使用すると、実行時エラーが発生します。

ただ、検索していると昔は入れられた節があり???、修正漏れなのかもしれません。
「間違った(?)解説」は、海外の出版物でもちょくちょく出会い、本当に戸惑いました。

ともあれ本当にありがとうございました!

2

気になって検索してみたら、間違った(?)解説してあるサイトが結構ありますね。
このような場合はまずはMSの公式を参照して確認するのがいいです。
ただ、公式もたまに間違っているときがありますので、実際にテストして確認するということも必要になります。

1

DAOのOpenRecordset dbReadOnlyでテーブルを読み取り専用にできるでしょうか?

OptionsとLockEditに入れられるようですが、

dbReadOnly はOptionsだけだと思いますが。(下記参照)

Options引数
RecordsetOptionEnum 列挙 (DAO) | Microsoft Learn

LockEdit引数
LockTypeEnum 列挙 (DAO) | Microsoft Learn

読み取り専用になるのが解説によって「自分だけ」「他人だけ」「全員」で分かれています。

上記のMSの公式のリンク先の解説では、

dbReadOnly Recordset を読み取り専用として開きます。

となってます。開いたRecordsetが読み取り専用になるということだと読み取れます。他のユーザーが更新できないとは書かれてません。

他のユーザーがレコードを変更できないようにするなら、下記ではないでしょうか。

dbDenyWrite 他のユーザーが Recordset のレコードを変更できないようにします。

私は下記のように理解しています。もし、試した結果が異なる場合は指摘してください。

'このレコードセットのみ読み取り専用。他ユーザーは更新可能。
Set rs = CurrentDb.OpenRecordset("テーブル名", dbOpenTable, dbReadOnly)

'このレコードセットは更新可能。他ユーザーは更新不可。
Set rs = CurrentDb.OpenRecordset("テーブル名", dbOpenTable, dbDenyWrite)

'このレコードセットも他ユーザーも更新不可。
Set rs = CurrentDb.OpenRecordset("テーブル名" ,dbOpenTable ,dbReadOnly + dbDenyWrite)
5

フィールドの書式プロパティもなにも設定されてませんか。

こちらで作成したサンプルでは正しい結果になってますね。

画像1

画像1

上記の画像のようなサンプルを新規作成した場合はどうなりますか。

4
Sign is "B" 2023/12/01 (金) 11:05:20 7fdfc@46fae >> 3

定型入力は何も設定されておりませんでした。

レポート出力の際は7つテキストボックスを作成し、それぞれ=Mid([〒],1,1)~=Mid([〒],7,1)という風にしています。ですので郵便番号フィールドは、更新クエリでハイフンを""に置換し、7桁数字の書式にしています。

000-000や000&000は、7桁数字以外が抽出されているかどうかの検証中に抽出条件から外れていたので例えとして提示致しました。

"7桁の数字"以外が正確に抽出されるためにはどのような抽出条件を設定すれば良いか、というのが本題です。
Not Like "#######"
この抽出条件で一見問題ないように見えて、例のようなデータが抽出条件に引っかからなかったので、原因と対策を知りたいです。

3
hatena 2023/12/01 (金) 10:40:26 修正

そのフィールドに定型入力が設定されてませんか。
もし、されているならその設定を教えてください。

ちなみに郵便番号フィールドなら、000-0000 という書式になるはずですが、
000-000 というのはどのような事情でしょうか。

2
Sign is "B" 2023/12/01 (金) 08:45:10 7fdfc@46fae >> 1

000-000が、本来抽出されなければならないはずが抽出されませんでした。
000&000も、本来抽出されなければならないはずが抽出されませんでした。(別サンプル)

ちなみに、0から始まる郵便番号が正しく表示されるよう、郵便番号フィールドは短いテキスト型になっています。

1

「抽出条件をすり抜けてしまいました」とは、具体的にどうなったのでしょうか。
「000-000」というデータが表示されたのか、表示されなかったのか、どちらでしょうか。

Not Like "#######" なら表示されるのが正常です。
こちらでサンプルを作成しましたが、表示されました。

2
nokonoko 2023/11/30 (木) 15:44:01 c4a93@54883

回答ありがとうございました。
ご指導の通りの方法を検討します。

3
Sign is "B" 2023/11/30 (木) 15:23:32 7fdfc@46fae

おふたりとも大変分かりやすい説明です、ありがとうございました。
MOS合格できそうです。

2
hiroton 2023/11/30 (木) 10:31:40 57b07@f966d

人間がコードを記述するときに楽をするための仕様ですね

VBAはコードを記述する際に、高頻度でその用途で使われるモノは省略しても良いとして、様々なモノが省略可能なように作られました

つまり、Me..Value[]で囲むのも、省略した場合、コードが実行されるタイミングで記述されているとみなしてコードが実行されています

これらは、省略したとき、意図しない解釈がされてしまう場合には明記する必要があります

例えば「1」という名前のテキストボックスを作成します。これをコード上で記述する場合、単に「1」と記述すると、コードの解釈としては数値の「1」を記述したと解釈されます

a = 1 + 1

この記述は常にa=2です

a = [1] + 1

この記述は「aに「1という名前のコントロール」の値に「1」を加えた値を代入する」となります

1

レコードセットを取得してから重複を削除するのは難しいので、
サブフォームのレコードソースのクエリから、SQLでフィルターと同じ抽出条件を設定して、DISTINCTで重複を排除したレコードセットを取得すると考え方になります。

1

便利だなと思ったのはMe.まで入力すると入力補助でテキストボックスとかの名前が出てくることくらいです。

これはかなりのメリットだと思いますが。これがあるおかげで、コード入力がはかどりますし、タイプミスによるエラーも防げます。
また、Me.があれば、フォーム(レポート)に関連するコントロール、メソッド、プロパティと分かりますので、コードを後から読むときに解読しやすいです。ないと、それ以外の何かの可能性も考慮しつつ読む必要がでてきます。
他の関数などと名前が重複したりすると、バグの原因になりかねません。

.Valueに関しては、教材に載っているけど説明が乏しく、何のためにあるのか全く分かりません。

Valueはそのオブジェクトが持っている値を取得するプロパティです。
このプロパティはよく使用することが多いので既定のプロパティとされていて、省略することができます。
値を取得したいときは省略してもいいのですが、関数などと名前が重複したりするとバグの原因になったりするので、大きなプロジェクトの場合は、省略しない方がいいと思います。

また、テキストボックスを[]で囲む時と囲まない時の違いが分かりません。

通常は囲まなくても大丈夫ですが、コントロール名に半角スペースが含まれていたり、VBAのコードとバッティングする記号が含まれていたりするとコントロール名と認識できない場合がありまので、その時は必要になります。

3
すずやん 2023/11/24 (金) 09:58:55

Accessのvbaで処理する方法を探していたんですね。それは気づけませんでした。

以下の記載は参考になるでしょうか。

https://support.microsoft.com/ja-jp/office/sharepoint-にデータをインポート-リンク-または移動する-65bf7b03-74bf-445c-959a-24b7a401ddee

https://naberium.com/2022/07/22/adoを利用してsharepoint-listの一覧を取得する/
↑これはエクセルの場合ですが

以下のように有料のドライバーとしても売ってるので、それなりに難しそうですね。
https://www.cdata.com/jp/kb/tech/sharepoint-odbc-access-linked-tables.rst

2
すぅ 2023/11/24 (金) 09:08:18 fbd7f@b9210

すずやんさま 返信ありがとうございます。
手動でパスを取得する方法はわかっています。
access vbaで処理する方法を模索しています。
access側でボタンをクリックするとsharepointのドキュメント内フォルダを
一覧表示するのが目的です。
宜しくお願いいたします。

4
名前なし 2023/11/24 (金) 04:15:05 4dbaf@07047

すずやん様
もしかすれば、Accessも歴史が長く、ハードもソフトも未熟・非力な時に決まった軽量な既定がそのまま遺産になったのかもしれないですね。

ともあれ、ありがとうございました。

3
すずやん 2023/11/23 (木) 13:09:18

んー、なんでしょうね。
「とりあえず実行は許可して結果から判断できるようにする」てのを既定値にしているのかもしれませんね。
じゃないと「OptionDatabase.Execute」の設定や記述がおかしいのか、それとも実行した内容がおかしいのかが判別しにくいから、というのかもしれません。

2

ヘルプだと同じような RecordsetOptionEnum を持つ OptionDatabase.Execute メソッドの既定値が dbInconsistent らしいんです。
「(既定値) 矛盾した更新を実行します (Microsoft Access ワークスペースのみ)。」
実験してませんが、ソースぐらいしか指定しないと矛盾を許してるんでしょうか。
Executeのほうも、何故既定があえてユルいのか不思議です。

1
すずやん 2023/11/23 (木) 08:12:18

sharepointは使っていませんが、このあたりの方法ではどうでしょうか。
https://begin-prog.site/sharepoint-how-to-get-file-folder-link

1
すずやん 2023/11/23 (木) 08:01:38

ちょっと調べてみましたが、たしかに分からないですね。
希望する動作の値をセットするしかないのかもしれません。

3
みりん梅酒 2023/11/22 (水) 17:19:55 d5f54@e2687

Shift-JISに無い文字を抽出すれば良いのであれば、いったんcsv(sjis)に出力して文字化けさせて
csvを一時テーブルにインポートして元テーブル結合させて絞り込み~じゃダメですかね。
元テーブルに名前以外の主キーがある前提ですが、こんな感じのvbaで。

Public Sub A()
Dim 元テーブル名 As String
Dim 一時テーブル名 As String
Dim 主キー As String
Dim 一時ファイル As String

元テーブル名 = "T_住所録"
一時テーブル名 = "TMP"
主キー = "ID"
一時ファイル = "C:\temp\名前リスト.CSV"

    On Error Resume Next
    CurrentDb.Execute "drop table " & 一時テーブル名, dbFailOnError
    DoCmd.TransferText acExportDelim, , 元テーブル名, 一時ファイル, True  
    DoCmd.TransferText acImportDelim, , 一時テーブル名, 一時ファイル, True

    Dim Qdf    As DAO.QueryDef
    Dim strSQL As String
    strSQL = "SELECT A.氏名 FROM " & 元テーブル名 & " A  INNER JOIN " & 一時テーブル名 & " B  ON A." & 主キー & "=B." & 主キー & " WHERE INSTR(B.氏名,'?')"
    Set Qdf = CurrentDb.CreateQueryDef("文字化けチェッククエリ", strSQL)

    CurrentDb.QueryDefs("文字化けチェッククエリ").Sql = strSQL
    CurrentDb.QueryDefs.Refresh

    Set Qdf = Nothing
    DoCmd.OpenQuery "文字化けチェッククエリ"
End Sub

2

「環境依存文字」という定義が今となっては難しいですね。

はしご高、立つ崎は、現在のUnicode対応のフォントならたいてい普通に表示できると思いますが。
どのようなフォントを使かおうとしているのでしょうか。

1
hiroton 2023/11/22 (水) 14:50:19 fee61@f966d

ここはチャット型掲示板ではないので、最低でも1日程度はまたないとそもそも網にかかってないのだろうと感じることがありますね

ちょっと前に似たような話題がありました
外字を含むレコードを抽出したい

スマートな方法はありません

19
マスオ 2023/11/22 (水) 12:18:40 ddfe5@e6213

りんごさん相対関係は最初作ろうと思ってたのですが内容的にお互い全てが対象となりますので不可なのです。品目はコンボで選択する形になっており、よくあるパターンとして絞り込みは出来る様にしているのです。

18
りんご 2023/11/22 (水) 12:00:44 935bc@0e907

サブにはA、Bの品目・金額は両方とも入力必要で(相対品目として)、繰越入力の時は説明した通りの決まった切り分けとなります。

 品目の相対関係を管理するテーブルを別に作らないの?
 まずは、きちんと正規化しておかないと、質問して完成しても、設計が杜撰だから破綻している、捨てて下さいとなるだけですよ。残念ながら。

17
マスオ 2023/11/22 (水) 11:40:35 ddfe5@e6213

りんごさん イメージとしてはそんな感じですが、日付や取引先(Nullの場合あり)・伝票番号・その他テキストはメインテーブルにしてます。サブにはA、Bの品目・金額は両方とも入力必要で(相対品目として)、繰越入力の時は説明した通りの決まった切り分けとなります。

16
りんご 2023/11/22 (水) 11:17:36 935bc@0e907 >> 15

品目A 金額A   品目B・金額B
>あ   1000    繰越  1000
>繰越  500     い   500

要するにこういう事?

品目日付金額区分
1,000入庫
500振替出庫
500振替入庫
15
マスオ 2023/11/22 (水) 10:35:58 ddfe5@e6213

りんごさん 財務の振替の様なもので伝票に記入するイメージで直感的にそれに沿った処理フォームにしています。実際は
品目A 金額A   品目B・金額B
あ   1000    繰越  1000
繰越  500     い   500
で金額AとBの合計値は合致させる必要があります。(繰越入力フォーム基のクエリでこうなる様にしてます)
繰越時はA・Bどちらかになるかは決まってますが日々の処理ではどちらかになるかはランダムなのです。
これも説明不足でした(すみません)。

14
りんご 2023/11/22 (水) 09:54:56 935bc@0e907 >> 13

>●処理イメージ(サブ)
品目A 金額A   品目B・金額B
あ   1000
          い   500

但し品目のグループにより品目A・金額Aに入るか品目B・金額Bに入るかの切り分けがあります

下記のようにしない理由は?
●処理イメージ(サブ)

品目金額グループ
1,000A
500B