アプリ版:「スタンプのみでお礼する」機能のリリースについて

アクセスのフォームにカンマ区切りで数値を入力し、そのまま反映させデータ出力したいです。

つい先日はお世話になりました。
おかげさまで出したい表を作れるようになりました。

そ、そして今度は、その表をマクロやフォームを使って簡単に出そうと試みています。

JANコードというフォームにJAN「aaaaaaaaaaaaa」を入力すると、
「aaaaaaaaaaaaa」という商品の在庫を所持している店舗を出すというものです。
↓↓↓
--------------------------------
JAN |店舗 |
-------------------------------|
aaaaaaaaaaaaa |1,2,4,6 |
--------------------------------


理想は、カンマ区切りの複数JANをフォームに入力したら、それらの一覧表が出力される仕様です。
↓↓↓
--------------------------------
JAN |店舗 |
-------------------------------|
aaaaaaaaaaaaa |1,2,4,6 |
--------------------------------
bbbbbbbbbbbbb |1,3,5,6 |
--------------------------------

ですが、今現在は単品でしか表が出せないという問題です。

下記のクエリの抽出条件で、入力した数値を導きだそうとしています。
In ([Forms]![在庫所持店舗表作成]![JAN])

単品なら上手く事が運び、表がでるのですが、
カンマ区切りの複数になると抽出条件が一致しませんとエラー表示が出ます。
どうやら、フォームで入力したカンマ区切りの数値が、
クエリ抽出条件側では「カンマ」が取り除かれています。

フォーム「aaaaaaaaaaaaa,bbbbbbbbbbbbb」
↓↓↓
クエリ上「aaaaaaaaaaaaabbbbbbbbbbbbb」

このクエリで使用しているテーブルには勿論、
26桁のJANなんか存在しませんので、エラー表示です。。

カンマ区切りJAN「aaaaaaaaaaaaa,bbbbbbbbbbbbb」のまま反映させる方法はありませんか??
複数商品の検索が出来ないとほぼ使い物になりませんorz

アクセス2000を使用しています。
何卒!何卒よろしくお願い致します。。。

「アクセスのフォームにカンマ区切りで数値を」の質問画像

A 回答 (14件中1~10件)

#13です。



質問者さんへ (数値型を前提に)

私の回答は、テキスト型での回答になってますので、すでに無視されていると思います。
書いていない前提条件等々あるのですが、加筆する気は失せました。
(数値型(十進型)でも動くものはありますが)

#3【クエリの場合】での注意点を

既に【B】部分は【C】であると理解されていると思います。
入力するJANが1件の時、どの程度チェックされてから実行されていたでしょうか。

【チェックしていなかった場合】置き換えることで動きが異なるものがあります。
(DoCmd.OpenQuery("クエリ名") にて)

そのパターンの一部を紹介します
1)半角で先頭数字+どこかに英文字 例「123456789012a」
2)半角で先頭英文字+いろいろ 例「a123456789012」
3)全角で数字のみ 例「1234567890123」

従来のフォームを参照する形では、1)2)は0件、3)では、あったら抽出されました。

「半角」で且つ「数字のみ」・・・・ のチェックが必要になります。

db.QueryDefs("クエリ名").Execute などの異なる実行のさせ方をすると、また動きが違ったりしていました。

DexMachina さんによると、このような条件は回答時に書かなければならないことのように思いますが、エラーになる/動作が変わる部分については不要ということなのかもしれません。
上記パターンを含め、いろいろな条件を想定した動作の違いについて、DexMachina さんから追加説明があるかもしれません。

数値型(十進型)を使ってみた感じとして(テーブルを直接開いた時)

書式に 0 を設定しないと、コードとして表示できませんね。
(0を13個ならべて?、新規入力が面倒でしたので、正解はわかりません)
「1234567890123」を入力すると、「1.234567890123E+12」表示
書式を設定して初めて「1234567890123」に、

これを元にテーブル作成クエリでテーブル作ってみると、書式は設定されないようで、
「1.234567890123E+12」で表示

書式の再設定が必要で、何かめんどくさいですね。

テーブル作成ではなく、全レコード削除&追加クエリの方がやりやすかったり?
(聞かれてもいない案はNGでしたね。独り言と受け流してください)

ご迷惑をおかけしました。
    • good
    • 0

#11です



回答ありがとうございます。

最後に、私からのお願いがあります。
次の1点だけ質問者さんに説明してあげてください。

#3の内容を見た時、私は混乱しました。(質問者さんは私以上だったかも:想像です)

質問内容では、

> おかげさまで出したい表を作れるようになりました。
> そ、そして今度は、その表をマクロやフォームを使って簡単に出そうと試みています。
> --------------------------------
> JAN |店舗 |
> -------------------------------|
> aaaaaaaaaaaaa |1,2,4,6 |
> --------------------------------

#1補足でのSQL内容では
> SELECT _単品在庫リアル.自社コード AS JAN, _単品在庫リアル.店舗コード

・店舗コードが店舗
・前回解決されたという関数部分の記述がない
・抽出条件から、店舗コードは、1店舗と考えた方が良さそう
・「出す」「出力」の先は、フォーム? レポート?

#10では、勝手な想像と表現しましたが、
「今回のクエリで出来上がったテーブルを元に、前回質問されたものを組み込んだ結果で質問内容が書かれた」と、解釈したほうが素直だと思います。


> テーブル作成クエリの仕様を変更してまでフォーム表示にこだわるのは、裏技的な何かがあるのでしょうか。

具体的な方法の説明が、私にとっては必要不可欠なんです。
(質問者さんは、私以上かも)

フォームに表示したものへ、前回の関数をどう組み込んで・・・・
出力先がレポートなら、フォームからレポートへの展開の仕方・・・・

前提条件もろもろ以前に、実現の仕方がわからないんです。


#3 後半に書かれている【クエリの場合】の記述だけ、であれば、混乱はしませんでした。

しかも質問者さんにとっては、前回質問でBAになられた方からの回答なので、内容すべてを信じる傾向が強いのでは?と思ってみたり・・・・
    • good
    • 0

No.8です。


前回に続き、見落としによる修正がありましたので・・・(汗)

クエリ上でのカンマの消失から考えて、JANコードは数値型と推測していますが、
「抽出条件でデータ型が一致しません」のエラーは、30246kikuさんも検証の通り、
桁オーバーでは発生しません。
下記のご質問の際と同様に、関連する他のクエリで上記エラーが発生している
可能性がありますので、確認してみてください:
http://oshiete.goo.ne.jp/qa/6237619.html


さて・・・

> 動く記述が1つもないように、私には思えるのですが??


もしも仮にNo.3で締め切られていたなら、それはyukinosuke1104さんがご自身で 
 1)「【A】 & ~」の「【A】」は、先に用意した文字列へ置き換えるものと理解し、
 2)その結果発生したエラーから、元のテーブル作成クエリを選択クエリに変換
  してからSQLビューを表示してみて、同様の操作を行った
ことによって【解決された】ものと、私なら判断します。
(実際、質問を締め切る際に、質問者の方から、私の回答の不足を補う内容を
 記述して下さったことが、今までに何度かあります)


No.8でも記述しましたが、危惧したのは「ある特殊条件で、意図しない動作をする」
点です。
「動かない車」に乗って事故を起こすことは(まず)ありませんが、「時にブレーキが
きかなくなる車」は事故を起こし得ます。
危機感ゆえの「強い表現」(それでも「と思われる」(No.3)「そう言い得る」(No.8)として
丸めたつもりですが)と理解戴ければ、と思います。


・・・yukinosuke1104さんの質問の本題から外れすぎますので、ここまでとします。
※添付画像が削除されました。
    • good
    • 0

#10です




【質問者さんへ】

#3の回答以降、補足等記述されておりませんが、いかがお過ごしですか。
このスレでは、他の回答者さんの登場は期待できないと思います。

私の思い込み、連続投稿でやる気を失わせ、いろいろとご迷惑をおかけしました。

そんな私からの提案ですが、他の回答者さんからの回答を得るために一度これを閉じ
(★ここに記述した回答をいただいてから)
新しく質問を立てられたらいかがでしょうか。
閉じずに同じ内容を他で・・・・マルチポストとみなされるでしょう(まともな回答は得られないと思います)

その時には、この質問へのリンクを張ってもいいでしょうし、
(アドレスを書けば、勝手にリンクしてくれるみたいです)

必要な情報は、
JANコードを入れられている「自社コード」が何の型か。
テーブル作成クエリと表示上のものとの関係。
処理の記述(マクロを使っているとか、これこれこういう順でやっているとか)
処理対象の件数がどれほどか。

最低、上記の4つになります。

追加で、「自社コード」にインデックスをつけているとか、いないとか・・・・・
(速度の話になると出てきます)


このサイトで、ってこともありますが、他のサイトで・・・・の選択肢もあります。
他の方が記述して、削除対象になっていないことから、記述して削除されることはないと思いますが、
事務局の方は通報をトリガとして動くようですので、消されない保障はありません。
誰が通報するのかもあると思いますが・・・・・
(過去に以下サイトで回答されている方の ブログアドレスを参考になるので・・・・
 って書いていたら、営業宣伝目的と判断したので記述するな・・・・って通達が???)
他の人がそのアドレスを書いたとしても、すぐには削除対象にしないそうですが・・・・

Access Club / moug

私が足元にも及ばない方々が回答されてます。
ただ、教育の色が強いので、回答されたものを自らどんどん検証していかないと、相手にしてもらえません。

今回の私の投稿が生き残るかどうかわかりませんが、
もし消されるような事態になったとして、その前に質問者さんの目に止まればと思います。

議論、このサイトでは禁止されていた(?)ような気がしますが、これが該当するかどうか???
(ノウハウを教えていただこうとしているので、議論にはならないような・・・)


私は BA コレクターではありません。
できた、とか、助かった・・・・とかの記述があるだけで十分です。

回答を待ってから、現状のまま #3 部分を BA にしてみるのも有りかと。
(どれか BA を選ばないと締め切ることができないんですよね)
実際に、どのような対応をとられるのか教えてもらえそうです。

迷惑をかけた私が選ばれる・・・・・これはおかしな話ですよね。
他の回答者はお一人です。選択肢は #3か、#8か、新規のものか・・・・
言い回し等のインパクトからすると、やはり #3でしょうか??


以上 マルチポストにならないように質問を新規にしてみては・・・・の提案でした

追記)「 DJOIN 」で検索されると、いいことがあるかもしれません。
    • good
    • 0

#9です



DexMachina さんのノウハウにすがるしかありません。
以下2点、よろしくお願いいたします。

質問者さんにとっても、JAN用の設定の仕方等、勉強になると思います。
設定の仕方に特許があるとか、提示するとXXの著作権に抵触する可能性がある等々、
法的に保護しないといけないものであれば結構です。(法については無知です)

1)エラーの出し方
2)JAN 13桁フィールドの作り方

自分でやってみろ・・・・それは、なし、でお願いいたします。
このサイトは、丸投げを容認している(した)ようですので、この2点に関して丸投げさせてください。
それとも別の質問として立ち上げればよろしいでしょうか。
(ここのほうが、実物を持っている質問者さんが登場しやすいと思ってます)
質問者さんのスレを一時借りるような格好になるかと思いますが、
質問者さんにも有益な情報になると思っていますので、蚊帳の外ではないと思います。

余力があれば、以下についてもお願いいたします。


> 添付画像を見れば ・・・・
申し訳ありませんでした。
私は画像より文章のほうを重視しています
(入力された文字列をSQLに組み込む時に、私が注意している部分だったので)
(ちなみに、私だったらNGです)
(なお、画像上でも13桁以外のものはなさそうですが)


私の勝手な想像ですが、
今回のクエリで出来上がったテーブルを元に、前回質問されたものを組み込んだ結果で質問内容が書かれたように思えたります。
なので、そのクエリをフォーム表示にするのはいかがなものでしょう、と思ったりします。
テーブル作成クエリの仕様を変更してまでフォーム表示にこだわるのは、裏技的な何かがあるのでしょうか。



私は、動いているといわれている部分、触りたくありません。
いじるのは必要最小限にとどめたいです。

クエリから関数を呼ぶってのは、私も提示したので良く使いますが、
エラーがあっても動ききることを第一に考えますね。
(エラーがあったら MsgBox で表示・・・・・テンプレートかなんかでしょうか)
    • good
    • 0

#7です



DexMachina さん 回答ありがとうございました。

質問者さんへ

【致命的】なものを提示して申し訳ありませんでした。
すべてを検証して回答しているわけではないので、今後 DexMachina さんのように検証することを怠らないようにしたいと思います。

#2時点での完全一致版は以下のようになります。

(InStr("," & [Forms]![在庫所持店舗表作成]![JAN] & ",", "," & _単品在庫リアル.自社コード & ",") > 0)

#2の時より、また遅くなると思います。(検証していないので想像です)

今後、もしかして質問者さんが遭遇するかもしれない、私が思い込みしたことついて記述していきます。
DexMachina さんからも、回答/アドバイスいただけたら、今後の質問者さんの役に立つと勝手に思ってます。
私がテキスト型と勝手に決め付けた経緯になりますが、

フォーム「aaaaaaaaaaaaa,bbbbbbbbbbbbb」
↓↓↓
クエリ上「aaaaaaaaaaaaabbbbbbbbbbbbb」

と解釈された模様。

> ・・・・抽出条件が一致しませんとエラー表示が出ます

数値として解釈されたのなら比較相手が数値でないと・・・・テキスト型なのかな?
(エラーを「抽出条件でデータ型が一致しません」と想像して解釈)(検証していません)
これ以降、テキスト型・・・・頭から離れません。

質問者さんへ、
テキスト型でなっかた場合、ごめんなさい。#4以降すべてを無視してください。
(精進が足りないですね)

連続投稿という形で、いろいろなやり方のサンプル的なものを記述しました。
(事務局からは文字数が足りなければ連続してOKだと言われています)
やり方はいろいろあり、どの方法が1番速いのか?
提示された、また、補足された内容からは判断できませんでした。
それゆえ、私の考えれるパターンを紹介させていただきました。
#1、2で記述したものは、遅くなる方向のものでしかない(と思っている)ので、処理をガラッと変える必要がありました。

内容を書かず、箇条書き部分にとどめておくべきでした。
私の中では方法も含め、どのような選択肢があるかもわからない、Accessに慣れていない方と決め付けていました。
大変失礼いたしました。
回答は、質問された内容以外のことについて、余計なことは言わない、
代替案・・・以ての外。

教訓になります。

#3の方法が最速なんですね。
いろいろやり方がある中、最適な1つをチョイスできるように精進していきたいと思います。

検証・・・・私が怠っていたものなので、言われているエラーの出し方をトライしてみました。
フィールドの型が判明していないので、数値型(長整数)でやってみました。
事前に 1 ~ 9 の値を持つレコードを作っておいて、フォームのテキストボックスに
1 を入れると、1 が抽出されました。
1,2 を入れると、何も抽出されず・・・ですが、エラーを表示させることはできませんでした。
12 の値を持つレコードを作っておくと、1,2 で 12 が抽出されました。

長整数の最大値 2147483647 を超えないとだめなのかと思い、2147483647,2147483647 でも同様にエラーは出ません。抽出されないだけです。
数値の13桁を扱えるのは十進型だと思いますが、JAN用にどのように設定するのかもあわせ、検証された環境を記述していただけませんか?
    • good
    • 0

No.3です。


本来、質問者の方からの補足要求などがない限り、連投はするべきでないと思っているの
ですが(→量に圧倒されてやる気を殺ぎかねない)、修正&指摘事項がありましたので・・・

> ・テーブル作成クエリ(SQL)をフォームのレコードソースに設定する

これはこちらのミスです。大変失礼致しました(汗)
前回は字数削減のため、式の各要素を「【A】」等に置き換えて表記しましたが、SQL文内の
改行への対応を説明していませんでしたので、それも含めて
「Forms!店舗一覧.RecordSource = 【A】 & Me!JAN & 【C】」
についての実例を提示しておきます:
(「vbCrLf」はVBAで生成した文字列に改行を入れる場合に使用します。また、前に半角
 Spaceを入れた「_」は、VBA編集画面内で改行を行う場合に使用します(=生成した文字
 列には影響しません):
 いずれも既にご存知かもしれませんが念のため)
※こちらの環境ではエラーとなったため、「_」つきのテーブル名は「[ ]」で囲みました。
  (『「[ ]」で括ったためにエラーになる』ということはないので、そちらの環境でもこのままでOKです)

Forms!店舗一覧.RecordSource = _
 "SELECT [_単品在庫リアル].自社コード AS JAN, [_単品在庫リアル].店舗コード" & vbCrLf _
  & "FROM [_単品在庫リアル] INNER JOIN [_店舗マスタ]" & vbCrLf _
  & "ON [_単品在庫リアル].店舗コード = [_店舗マスタ].店舗コード" & vbCrLf _
  & "WHERE ((([_単品在庫リアル].自社コード) In (" & Me![JAN] & "))" & vbCrLf _
  & "AND (([_単品在庫リアル].理論在庫数量) <> 0)" & vbCrLf _
  & "AND (([_店舗マスタ].事業部コード)=0))" & vbCrLf _
  & "ORDER BY [_単品在庫リアル].自社コード, [_単品在庫リアル].店舗コード;"

なお、細かい話になりますが、「Null」は「In (Null)」では抽出できません。
(もちろん「Not In (Null)」でも抽出できません:
 Null関連には「Is Null」「Not Is Null」を条件に指定するか、Nz関数、IsNull関数での評価
 結果を使用します)

今回は「Not」が付いているので結果としては目的通りになりますが、一応、この点についても
修正を掛けました。
(具体的には「理論在庫数量<>0」とするだけ:これで0と同時にNullも抽出対象外になります)

> ・JAN 13桁って言った時、Longでは表現できなかったと思うので、テキスト型?

少なくともこちらの環境では、ご質問の
> フォーム「aaaaaaaaaaaaa,bbbbbbbbbbbbb」
> ↓↓↓
> クエリ上「aaaaaaaaaaaaabbbbbbbbbbbbb」
を再現するのは、数値型の場合のみと確認済みです。
(なお、全角「,」については、カンマの存在を強調したいというyukinosuke1104さんの
 配慮によるものと思います:
 添付画像を見れば、実際の入力は半角の「,」でされていることがわかるはず)
    • good
    • 0

#6です



現在は、回答あったものを検証しているのでしょうか。
がんばってください。

#6の余談は余談なので、スルーしてください。


補足ですが #5にある 2)、3)は、テーブルを作成するまでの処理しか書いていません。
マクロ等で続けて処理しているときには、その処理も盛り込む必要があります。
( 1-1)、1-2)であれば、マクロ側の処理はそのままで良いと思います)

テーブル作成後の処理を追加する部分は、3)でいえば、

  If (Not IsNull(Me.JAN)) Then
    ・・・・・
    db.QueryDefs("Q2").Execute ' テーブル作成の実行
    ・・・・・ ’★
  End If

上記★部分に追加していきます。

2)、3)で提示した処理をマクロから・・・・は、マクロは不慣れなので変換の仕方がわかりません。

処理している関数部分を標準モジュールに移動し、
Public Function の宣言に変更し、
Me.JAN 部分を [Forms]![フォーム名]![JAN] に置き換え、
マクロからは、アクション「プロシージャの実行」から実行すればよいような気もします。
その後で、作られたテーブルからの処理を行えばよいように思いますが??

 ここで質問者さんへ・・・・・フィールド「自社コード」の型は何でしょうか?

・質問者さんも#3の方も記述しているんで、理解されているのかと思っていましたが
「aaaaaaaaaaaaa,bbbbbbbbbbbbb」でのカンマは全角ですよね。
全角のものでSQL文字列作っても動作するんですかね?

これについても読まれたら、詳しい説明があるかもしれません。

私はマクロについては不慣れなのでやり方はわかりませんが、VBAなら Const で定義できると思います。
マクロでのやり方がわからなければ、補足にて質問されると良いと思います。

検証されて、おかしい等々あれば補足してください。
    • good
    • 0

#4,5です



修正と余談になります


修正)

#4での
mySplit = Split(vS, ",")(i - 1)
は、
mySplit = Split(vS, ",")(iNum - 1)
でした。


余談)

入力する件数が多くなるにつれて 1)→ 3)となっていくのかもしれません。

1-1)、1-2)で分割する方法は、他の場面で流用できます。
たとえば、コンボボックスの2列目、3列目をクエリの抽出条件に使いたいとか・・・・

フォームを「F1」、コンボボックスを「cbx01」と仮定し、3列目を条件にしたい場合、

1-1)の方法を使うと、
3列目のデータをテキストボックス「tx3」(不可視)に前もって設定します。
(コンボボックス「cbx01」のクリック時とかで)

Me.tx3 = Me.cbx01.Column(2)

クエリでは、 XX = [Forms]![F1]![tx3]  で参照します。


1-2)の方法を使ってみると

標準モジュールに以下の関数を記述しておきます

Public Function myComb(sS As String, iNum As Integer) As Variant
  On Error Resume Next
  myComb = Eval(sS & ".Column(" & iNum - 1 & ")")
  If (IsError(myComb)) Then myComb = ""
End Function

クエリから3列目を参照したい時には

myComb("[Forms]![F1]![cbx01]",3) で参照できます。



今回のクエリの動作はテーブル作成でよかったんですよね?
    • good
    • 0

【つづき】



2)クエリの内容を参照&書き換え実行
#1の補足に書かれたクエリの名前を「Q1」と仮定します。

ボタンが押された時に、クエリ「Q1」内の

[Forms]![在庫所持店舗表作成]![JAN]

部分を入力(指定)されたものに置き換えて実行します。

Private Sub btn_Click()
  Dim db As DAO.Database
  Dim sSql As String
  Dim sRep As String

  If (Not IsNull(Me.JAN)) Then
    Set db = CurrentDb
    sRep = "'" & Replace(Me.JAN, ",", "','") & "'"
    sSql = db.QueryDefs("Q1").SQL
    sSql = Replace(sSql, "[Forms]![在庫所持店舗表作成]![JAN]", sRep)
    db.Execute sSql ' テーブル作成の実行
    Set db = Nothing
  End If
End Sub

どの道このクエリはフォームを参照しなくなるので、置換しやすい文字列にしておいてもいいかも。
クエリ内を、

((_単品在庫リアル.自社コード) In (XXXXXXXX))

にしたら、VBA での置き換え部分も

sSql = Replace(sSql, "XXXXXXXX", sRep)

のように変更します。

aaaa,bbbb の入力で、'aaaa','bbbb' にしたものを置き換えてます。
置き換えた後では、

((_単品在庫リアル.自社コード) In ('aaaa','bbbb'))

になり、それを実行させてます。
「自社コード」は、テキスト型ですよね??


3)テンポラリテーブルを使用した絞込みをする
テンポラリテーブル「T_tmp」を用意しておきます。フィールドは「自社コード」のみ
テーブル「_単品在庫リアル」と「T_tmp」を、自社コードで内部結合させます。

実行のボタンをクリックした時の処理は以下

Private Sub btn_Click()
  Dim db As DAO.Database
  Dim rs As DAO.Recordset
  Dim sAry() As String
  Dim i As Long

  Set db = CurrentDb
  db.Execute "DELETE * FROM T_tmp;"
  If (Not IsNull(Me.JAN)) Then
    Set rs = db.OpenRecordset("T_tmp")
    sAry = Split(Me.JAN, ",")
  
    For i = 0 To UBound(sAry)
      rs.AddNew
      rs(0) = sAry(i) ' 入力されたコードをカンマ分割し登録
      rs.Update
    Next
    rs.Close
    Set rs = Nothing
    db.QueryDefs("Q2").Execute ' テーブル作成の実行
  End If
  Set db = Nothing
End Sub

ここで実行するクエリ「Q2」の記述内容は以下

SELECT _単品在庫リアル.自社コード AS JAN, _単品在庫リアル.店舗コード INTO T1_在庫保持
FROM (_単品在庫リアル INNER JOIN T_tmp ON _単品在庫リアル.自社コード = T_tmp.自社コード) INNER JOIN _店舗マスタ ON _単品在庫リアル.店舗コード = _店舗マスタ.店舗コード
WHERE (((_単品在庫リアル.理論在庫数量) Not In (0,Null)) AND ((_店舗マスタ.事業部コード)=0))
ORDER BY _単品在庫リアル.自社コード, _単品在庫リアル.店舗コード;


これら以外にもやり方はあると思いますが・・・・・
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています