Microsoft Access 掲示板

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

クエリAで下記のように設定すればいいでしょう。

フィールド [Forms]![フォームA]![検索BOX]
表示
抽出条件 Like "*" & [種類] & "*"
10

ご回答ありがとうございます。
ひとまずRecordSource に直接 SOL文を書く方向でトライしてみます。
またどうしても分からないときは質問させていただきます。

質問に回答いただきありがとうございました。

9

クエリは使わずに、 フォームを開く時に、RecordSource に直接 SOL文を設定してしまうという方法になりますね。

12

物を取りに来た人には残りに在庫が あといくつあるのか を表示しなければなりません。

それなら、
物を取りに来た時に、現時点での在庫数が分かればいいのですよね。
過去をさかぼって、在庫数の変化を表示する必要はないですよね。

クエリで、入出庫台帳 と 在庫品マスター を品名IDで結合して、
集計クエリにして下記のように設定すればいいのでは。

フィールド 品名ID 品名 在庫数: Nz([入庫数量])-Nz([出庫数量]) 最低在庫数量
テーブル 入出庫台帳 在庫品マスター 入出庫台帳
集計 グループ化 グループ化 合計 グループ化
 

管理者がこのデータベースを立ち上げた時に最低在庫数量を下回っている物を表示させたいと思っています。

上記の集計クエリから、下記のようにクエリを作成すればいいでしょう。

フィールド 品名ID 品名 在庫数 不足数量: [最低在庫数量]-[在庫数]
抽出条件 <[最低在後数量]
11
igaguri 2019/04/23 (火) 21:29:42 32a1e@d14a6

説明が下手で申し訳ありません。
物を取りに来た人には残りに在庫が あといくつあるのか を表示しなければなりません。最低在庫数量を下回れば購買部署に連絡もします。が、連絡がうまく伝わらなかった時のことも考えて、管理者がこのデータベースを立ち上げた時に最低在庫数量を下回っている物を表示させたいと思っています。(ここまでできあがれば次に発注を絡めようと思っています。)

こんな考え方はしないのでしょうか?

8

早々のご返信ありがとうございます。
受注日はグループ化したくないのです。金額が受注日ごとにバラけるのは避けたいので…
なんとかグループ化せずに(フィールドに乗せずに)抽出条件を書けないものでしょうか?

…というか書いてて思ったのですが、これは最初に回答いただいた「別の出力なので一つのクエリで実現は不可能」に繋がりますか…?

10

入出庫IDごとに在庫数量が必要となると、レコード件数毎に、DSumで計算することになるので、重くなります。式も複雑になります。
「在庫数量」フィールドをテーブルに追加して、そこにVBAで計算しながら書き込んでいくようにした方がいいですね。
累計値をテーブルに自動入力する関数 - hatena chips
の後半部分の「累計を入力する関数」を使うと簡単に累計が入力できます。

9

最初の回答で、現在庫量はクエリで計算で求めた方かいいとしましたが、質問が、

在庫数量が テーブル B_1 在庫品マスター の最低在庫数量より少なくなったら一覧表で抽出されるようにすることを前提にした時、

ということだったのでそのように回答しました。
ある時点(現在)で、最低在庫数量より少ないものの一覧を表示するということですよね。
ある時点で、品名ごとの在庫数量を集計するのは、集計クエリで簡単にできます。その結果と最低在庫数量を比較すればいいだけですので。

しかし、その後のやりとりでの話は、在庫量の変化履歴(累計)を表示することになっています。
これは必要ですか。最初の質問内容とは異なってますが。

7
hatena 2019/04/23 (火) 19:55:28 修正 >> 6

クエリCを、クエリAのグループ集計 フィールド[担当(グループ化)]、[区分(グループ化)]、、[受注日(グループ化)]、[金額(合計)]
として、
OpenArgs引数に "受注日 between #" & Me.受注日自 & "# And #" & Me.受注日至 & "#"
ではダメですか。

あるいは、クエリは使わずに、 フォームを開く時に、RecordSource に直接 SOL文を設定してしまうという方法もあります。

8
igaguri 2019/04/23 (火) 19:47:48 32a1e@d14a6

 ありがとうございます。できました。
が、1.添付画像のように入出庫IDごとに在庫数量がかわるものがのぞましいのですが・・・。
  2.最初の相談であった「期ごと」でする場合はどのようなテーブルを用意したらよろしいのでしょうか?

6
mae 2019/04/23 (火) 19:38:29 修正 13630@32811

ご回答ありがとうございます。
無事に抽出条件が適用されたフォームを開くことができました。
意図的に抽出条件の枠を作る発想は思いつきませんでした。

申し訳ございません、さらに突っ込んだ質問をさせてください。
クエリA・・・フィールド[区分]、[担当]、[金額]、[受注日]
クエリC・・・クエリAのグループ集計 フィールド[担当(グループ化)]、[区分(グループ化)]、[金額(合計)]、[受注日(where条件)](抽出条件を書かないと保持されないですが・・・)
クエリAに[受注日]を追加して日付で範囲指定したい場合、;後の抽出条件で書くことは可能でしょうか?
クエリCには表示されないフィールドなので無理でしょうか・・・?

9
island 2019/04/23 (火) 15:11:01 ae49e@a036a

返信が遅くなりすみません。

やりたかったことが上のコードをもとに出来ました。
クエリ(q_mitu)でもユニオンができることがわかりこれから幅が広がりそうです。
ありがとうございました。

select 見積書送付NO, ファイル名, 見積日付, 会社名, 氏名, 現場名, 工事名 from q_mitu
union all
select 見積書送付NO, ファイル名, 見積日付, 会社名, 氏名, 現場名, 工事名 from T_mitumori;

5

すみません。サンプル作成して動作確認してみましたが、抽出条件が無視されますね。
下記に修正してください。

開く時のイベントプロシージャ

Private Sub Form_Open(Cancel As Integer)
    Dim Args
    Args = Split(Me.OpenArgs, ";")
    Me.RecordSource = Args(0)
    Me.Filter = Args(1)
    Me.FilterOn = True
End Sub

フォームを開くコードは、下記で。

DOCmd.OpenForm "F売上集計", , , , , , "クエリC;[クエリC]![区分]='" & [Forms]![フォームB]![区分] & "'"

第7引数に、"クエリ名;抽出条件" というようにクエリ名と抽出条件を;で区切って設定してください。

4

ご回答ありがとうございます。
修正版のアドバイスでレコードソースの置き換えには成功しました。
申し訳ございません、もう1点確認したいのですが、

Docmd.OpenForm "フォームA", , , "抽出条件", , , "クエリC"

ここの"抽出条件"は、あくまでフォームAに対する抽出条件になるのでしょうか?
たとえば "[クエリC]![区分]= '" & [Forms]![フォームB]![区分] & "' " と入力しても無視されます…
クエリCの抽出条件をVBA上で行いたい場合、上記の一文で対応可能でしょうか?
不可の場合、別途構文を用いることで可能になるのでしょうか?

お手数をおかけしますがご確認よろしくお願い致します。

3
hatena 2019/04/22 (月) 19:14:32 修正 >> 2

前回の回答を下記に修正します。

まず、フォームのデザインビューで「レコードソース」プロパティをは空白にしておいてください。
開く時のイベントプロシージャは下記にしてください。

Private Sub Form_Open(Cancel As Integer)
    Me.RecordSource = Me.OpenArgs
End Sub

フォームを開く時は、OpenArgs には、テーブル名かクエリ名を設定しておいてください。

2
mae 2019/04/22 (月) 16:23:19 修正 13630@32811 >> 1

ご回答ありがとうございます。
クエリC・・・[担当(グループ化)]、[区分(グループ化)]、[金額(合計)] ということでいいんですよね??
例えば抽出条件式に

Docmd.OpenForm "フォームA", , , "[クエリC]![区分]=[Forms]![フォームB]![区分]", , , "クエリC"

と記述しても開く時にパラメータの入力を求められてしまいます。"抽出条件式"にはフォームAに関係しているフィールドしか記述できませんか?
区分の抽出をしたい場合はクエリCの抽出条件に書き込むしかないのでしょうか?

1

クエリB は担当毎の集計、
欲しいのは、担当+区分毎の特定の区分の集計、
まったく別の出力なので一つのクエリで実現は不可能です。

クエリC・・・[担当、区分(グループ化)]、[金額(合計)]

というクエリを作成しておいて、フォームA を開く時に、レコードソースを書き換えるようにすればいいでしょう。

Docmd.OpenForm "フォームA", , , "抽出条件式", , , "クエリC"

というように OpemArgs引数(第7引数)にクエリ名を設定しておいて、
フォームAの開く時のイベントプロシージャに下記のように記述します。

Private Sub Form_Open(Cancel As Integer)
    If Me.OpenArgs <> "" Then
        Me.RecordSource = Me.OpenArgs
    End If
End Sub
7

品名ID が数値型なら、

在庫数量: DSum("Nz(入庫数量)-Nz(出庫数量)","F_1 入出庫台帳","品名ID=" & [品名ID]) 

テキスト型なら、

在庫数量: DSum("Nz(入庫数量)-Nz(出庫数量)","F_1 入出庫台帳","品名ID='" & [品名ID] & "'")

としてください。
DSumの代3引数には、SQLとしての条件式を文字列として設定します。

下記の内容を理解されることをお勧めします。

Access上のコード内で引用符(")と単引用符(')の使い分けについて - hatena chips

6
igaguri 2019/04/21 (日) 17:52:32 32a1e@d14a6

ちなみに教えていただいた構文で計算されたものを添付します。画像1

5
igaguri 2019/04/21 (日) 17:46:20 32a1e@d14a6

ありがとうございます。品名IDごとに在庫数量を出したい場合は

在庫数量: DSum("Nz(入庫数量)-Nz(出庫数量)","F_1 入出庫台帳","品名ID=" & [品名ID] & ") と思い記述してみたところ

不適切な文字列が含まれています という メッセージボックスが表示され、一番最後の ") の部分が反転表示されてしまいます。
 " を削除すると  指定した閉じかっこが多すぎます とメッセージボックスが表示されてしまいます。
"" や ()の使い方を教えていただけませんか?

4

在庫数量: DSum("入庫数量-出庫数量","F_1 入出庫台帳","入出庫日<#" & [入出庫日] & "# OR 入出庫日=#" & [入出庫日 ] & "# AND 入出庫ID<=" & [ 入出庫ID] & ")")

まず、入庫数量、出庫数量に未入力(Null)がある場合は、"入庫数量-出庫数量" の部分は "Nz(入庫数量)-Nz(出庫数量)" としてください。
[入出庫日 ]  [ 入出庫ID] の部分の全角空白は削除してください。(フィールド名に全角空白がない場合。)
あと、( が足らないですね。

在庫数量: DSum("Nz(入庫数量)-Nz(出庫数量)","F_1 入出庫台帳","入出庫日<#" & [入出庫日] & "# OR (入出庫日=#" & [入出庫日] & "# AND 入出庫ID<=" & [入出庫ID] & ")")
3
igaguri 2019/04/20 (土) 21:32:59 32a1e@d14a6

入出庫ID 品名ID  入出庫日  入庫数量 出庫数量
  4    1   2019/04/01  20    
  5    1   2019/04/10  5
  6    1   2019/04/12        6

のデータがサンプルとして入力してあります。

2
igaguri 2019/04/20 (土) 21:27:04 32a1e@d14a6

お世話になります。

https://hatenachips.blog.fc2.com/blog-entry-443.html を参考にして

フィールド 入出庫ID,品名ID,入出庫日,入庫数量,出庫数量,作業者ID がある テーブル F_1 入出庫台帳 を作成し、
クエリ F_1 入出庫台帳 在庫数量計算 を作成しました。
HPを参考に
在庫数量: DSum("入庫数量-出庫数量","F_1 入出庫台帳","入出庫日<#" & [入出庫日] & "# OR 入出庫日=#" & [入出庫日 ] & "# AND 入出庫ID<=" & [ 入出庫ID] & ")")
と記述しましたが、入出庫日を求めるメッセージボックスと入出庫IDを求めるメッセージボックスが表示され、何も入力せず進めると在庫数量に #エラーが表示されます。構文が間違っているのでしょうか?

6
igaguri 2019/04/20 (土) 18:32:21 32a1e@d14a6

ありがとうございます。

5

Accessの機能ではなく、リンク先のページでダウンロードできるライブラリー(DLL)の機能ですね。
リンク先に詳細に使い方が説明されているのでその通りにすればできると思います。

私自身は、PaSoRiを持ってないので、これ以上のアドバイスはできまません。

4
igaguri 2019/04/20 (土) 12:35:06 32a1e@d14a6

ありがとうございます。こういう記事を見たものでできるのかな?と思いご相談させていただきました。

https://tsware.jp/download/accpasori/

1

「クエリを作成して 在庫数量を作成し計算させる」というのがデータベースでの原則的な方法です。

在庫数量フィールドを持たせると、新規追加や更新があるたびに在庫数量フィールドも更新する必要がありますが、更新漏れがあったりして実際の在庫との乖離が発生した場合、面倒になります。

期間が長くなって計算量が多くなり処理が重くなったら、期首在庫フィールドを持たせて、期ごとに現在庫を計算するというように対処するのがいいでしょう。

3

Accessに関する質問というより、Felicaカードの機能に関する質問ですよね。
もちろんAccessに標準でそのような機能はないです。
Felicaカードのソフトの方で対応しているかどうかの質問ですので、ここで聞くよりメーカーに直接問い合わせてください。

バーコードリーダなら、ソフトで読み取ったコードをアクティブなソフトにキー送信する機能があるというのは聞いたことがあります。そのような機能がFelicaカードのソフトにもあるかどうかということになるかと思います。

2

Accessに関する質問というより、Felicaカードの機能に関する質問ですよね。
もちろんAccessに標準でそのような機能はないです。
Felicaカードのソフトの方で対応しているかどうかの質問ですので、ここで聞くよりメーカーに直接問い合わせてください。

1
igaguri 2019/04/19 (金) 22:47:24 32a1e@d14a6

SUICA用に ソニーの PaSoRi RC-S380 はもっています。

7
igaguri 2019/04/19 (金) 18:33:02 32a1e@d14a6

検索できました。ありがとうございます!!

6

上記であっているなら、下記のコードを試してみてください。

Private Sub JANコードで検索する_Click()
    Forms![F_1 在庫品マスター 入庫の登録画面].SetFocus
    Forms![F_1 在庫品マスター 入庫の登録画面]!JANコード.SetFocus
    DoCmd.FindRecord Me.JANコード検索, acEntire
    Docmd.Close acForm, Me.Name
End Sub

FindRecord はアクティブなフォームのフォーカスのあるコントロールが対象ですので、
フォームにSetFocusしてから、コントロールにSetFocusする必要があります。

5

整理すると、下記のようなことでしょうか。

フォーム[F_1 在庫品マスター 入庫の登録画面]
  レコードソース [B_1 在庫品マスター]

このフォーム上のコマンドボタン [検索画面を開く]
これをクリックすると、[F_4_1 JANコード検索画面]
が開く。

フォーム[F_4_1 JANコード検索画面]
  テキストボックス [JANコード検索]
  コマンドボタン [JANコードで検索する]

[JANコード検索] にJANコードを入力する。
あるいは、バーコードリーダから読み込んで入力される。

[JANコードで検索する]をクリックすると、

[F_1 在庫品マスター 入庫の登録画面]で、
入力したJANコードと一致するレコードが検索されて表示される。

11
5流クン 2019/04/19 (金) 17:40:49 73ee0@9ec8c

報告します。
Set ws = Workbooks("auctions_ado.xlsm").Worksheets("sheet1")

Set ws = ThisWorkbook.Worksheets("sheet1")
に変更したところ、エラーが出なくなりました。

7
5流クン 2019/04/19 (金) 17:30:45 73ee0@9ec8c

スクレイピングの結果は、CSVに出力されます。
しかし、そのままだと使い物にならないので、'を’’に変換したり、
外字を変換したり、文字数をカウントして調整したりします。

この段階では、EXCELLにありますが、CSVで保存をするだけなので問題ありません。

4
igaguri 2019/04/19 (金) 17:23:02 32a1e@d14a6

テーブル B_1 在庫品マスター をレコードソースにしているJANコード フォーム F_1 在庫品マスター 入庫の登録画面 の JANコード を検索したいのですが・・・。

8

select 見積書送付NO,ファイル名,見積日付 from T_mitu union select  見積書送付NO,ファイル名,見積日付 from T_mitumori;

このSQLの「見積日付 from」の部分の空白が全角空白になってます。これを半角空白にしてください。
あと、union ではな、union all にしてください。
union だと重複排除の処理が発生しますので重くなります。

select 見積書送付NO, ファイル名, 見積日付 from T_mitu
union all
select 見積書送付NO, ファイル名, 見積日付 from T_mitumori;

あと、添付ファイル型のフィールドがありますが、これはユニオンクエリに含めないようにしてください。

6
hatena 2019/04/19 (金) 16:10:36 修正

その外注したプログラムはスクレイピングの結果をエクセルに出力するものなのですか。
最終的Accessに格納するならcsvで出力してもらったら方が楽だったかも知れませんね。

やっていることの全体像が分からないのでなんとも言えませんが、
処理を分けて実行するようにして、どこで問題が発生しているか切り分けをすることから始めるべきかと思います。

スクレイピング結果をシート上に出力する。
このデータに問題がないか確認する。
その後、そのシートデータをAccessに出力するようにする。

出力は、"INSERT INTO " をExcuteするのではなく、
Recordsetとして開いて、AddNewする方法を試してみるといいかもしれません。

出力先のAccessファイルはローカルにあるのですよね。
ネットワーク上にあって共有しているとかだと、それが影響することもあります。

5
5流クン 2019/04/19 (金) 15:53:35 73ee0@9ec8c

ご指摘の通りです。
実は、ieオブジェクトのスクレイピングは自作したのですが、
重くてどうにもならない状況になり、ほかの言語のプログラムを外注しました。

ところが、この方がデータベースの知識がなかった。。。。。
さすがに、c+やRUBYを覚えるのが嫌なのでというわけです。
適当な値段で、請け負ってくれる方がいたら、作り直したいです。

情報が入手しやすいので、良い面もありましたが
EXCELL VBAも、どういうものかな~と思い始めています。

ただ、全部作り直すのは、大変すぎます。

今回の場合、
Set ws = Workbooks("取得.xlsx").Worksheets("sheet1")

Workbooks("取得.xlsx").Worksheets("sheet1").activate
に戻すと、エラーは多発しなくなりました。

ただ、これはありえないことなので、悩みどころです。

7
island 2019/04/19 (金) 15:44:15 ae49e@a036a

追記です。
2つのテーブルには主キーが設定されていませんでした。あと、複数値を持つフィールドですが説明にあるような多対多のリレーションシップはありません。