dポイントプレゼントキャンペーン実施中!

ACCESSで在庫管理を始めました。
なんとか在庫管理だけはできるようになりましたが、
備考欄を設けたら、備考を入れたものは数が別でカウントされるように
なってしまいました。

今の在庫管理の状態は
<テーブル>
・商品ベース(商品ID、商品名が入っている)
・入出庫明細

<フォーム>
・入荷票(入出庫明細テーブルに入力される)
・出荷票(入出庫明細テーブルに入力される)

<クエリ>
・在庫表
・要発注表(在庫が1以下のものだけ表示する設定)

<レポート>
・在庫表(クエリの在庫表のレポート)
・要発注表(クエリの要発注表のレポート)

という感じです。

フォームに商品IDを入れると、自動で商品名が表示されるようにしており(DLOOKUP)、
その下に入庫や出庫数を入力する欄、最後に備考入力欄を設けています。

たとえば、返品によって在庫が1つ増えたときに「返品」などというふうに
備考を入れたいのですが、そうすると在庫表や要発注表で
備考情報なしの物は今までの入出庫明細の合計で1行に在庫数が
ずばっと出ますが、備考を入れた物はその下に同じ商品IDで
数行に出ます。
(結局最後はそれを手で計算する)

本当は、1行におさめて、備考欄を大きめにとって、そこに備考は
どんどん追加されるような感じにしたいのですが、可能でしょうか?

質問の仕方も下手ですみません。
補足要求してください。宜しくお願い致します。

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

>(入荷数+出荷数) AS 現在庫



ちょっと、DBSum関数に落とし穴があったみたいです。
テストで見落としていました。
まあ、還暦目前のじっちゃまのことです。
許されたし。

Public Function DBSum(ByVal strField As String, _
ByVal strTable As String, _
Optional strWhere As String = "") As Variant
・・・・
End Function

このように戻り値の型を Variant にしています。
ですから、

SELECT DBSum("数量","入出庫明細") AS AAA, DBSum("数量","入出庫明細") AS BBB, AAA+BBB;

AAA=80
BBB=80
AAA+BBB=8080

とクエリではなります。

これは、DBSum関数は、対象列や戻り値の型を知って使えということです。

SELECT CDbl(DBSum("数量","入出庫明細")) AS AAA, CDbl(DBSum("数量","入出庫明細")) AS BBB・・・

AAA+BBB=160

CINT・・・・整数
CLng・・・・長整数
CDbl・・・・倍精度

このように、列[数量]の型に変換してみて下さい。
そうすれば、この不具合は是正されます。
まあ、戻り値を Variant から変更すれば済むことですが・・・。
さて、どっちが良いのかはプロではないので明確な意見を持ち合わせていません。
    • good
    • 0
この回答へのお礼

ありがとうございました!!遂に出来ました!!
でも、今回できたのは、Husky2007さんに作っていただいたあの標準モジュールあってのものですよね。
やっぱりかなり詳しくないとできないですね( ̄~ ̄;)

本当に長々と根気強く教えていただいてありがとうございました。

お茶ぐらいごちそうしたいもんです。

お礼日時:2007/10/17 13:32

Len(備考& '')



で、なんで列[備考]が空欄か否かが判るのか?つまり、真(True)か偽(False)を判定できるのか?

Len(備考')

ではなく '' を付加しているのはなぜか?

後者は、Len関数が空値を引数にすれば真偽を判定できないから。
前者は、真は0以外、偽は0という約束事があるから。

[イミディエイト]
? CBool(0)
False
? CBool(1)
True

ちっと、意味不明かも知れないので補足しておきます。
    • good
    • 0

>空欄のときも区切り表示として「;」が出るみたいですが・・・。



[イミディエイト]
? DBSelect("SELECT 備考 FROM 入出庫明細 WHERE 商品ID='A06-123' AND Len(備考& '')")
返品;通常
? DBSelect("SELECT 備考 FROM 入出庫明細 WHERE 商品ID='A06-123' AND Not 備考 is Null")
返品;通常

列[備考]が空欄(=Null,長さ0)でなけりゃという条件をWhere節に追加すれば回避できます。

Len(備考& '')
Not 備考 is Null

一般的には後者ですが Access では前者を多用する向きも・・・。

>最初の10 20 30 40 にも意味があるんですか??

これらは、行番号です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
Len(備考& '')というほうにしました。

すいません、それと・・・
(入荷数+出荷数) AS 現在庫
を追加してみたんですが、数の計算ではなくて、数を文字列として
認識しているのか、たとえば入荷合計数が10、出荷合計数が5だと
現在庫105 ってなってしまいます。

これで最後の質問だといいんですが。(^^;

お礼日時:2007/10/17 11:29

もう終ったと言えば終わっているし、まだだと言えば、まだ・・・。



>? DBSum("入荷数","入出庫明細","商品ID='" & [商品ID] & "'") AS 入荷数
でやってみたら、1行下に入荷数の合計がピッと出ました。

出る訳はないのだが・・・。

? DBSum("入荷数","入出庫明細","商品ID='A06-123'")

なら出ます。

念のために、以下の入出庫明細の備考欄を連結表示してみます。

入出庫明細:
ID__日付____________商品ID____数量___備考
1___2007/10/10__A06-123__30_____通常
2___2007/10/10__A06-123__20_____返品

[イミディエイト]

? DBSelect("SELECT 備考 FROM 入出庫明細 WHERE 商品ID='A06-123'")
返品;通常

関数のテストだから、='"& [商品ID]・・とかAS 入荷数とかは書かないで行います。

=====================================================================

ここまで済んだら、ANo4に戻って、1,2,3,4と攻めて終了です。
ここで諦めちゃだめです。
1981年に初めてプログラミングした時には、

10 INPUT A
20 INPUT B
30 C=A+B
40 PRINT C

この僅か4行を理解するのに2ヶ月考え続けました。
根性だけが解決します。
    • good
    • 0
この回答へのお礼

おはようございます。
早速ですが!!やっとやっと備考欄が表示されました!!
贅沢ですが、空欄のときも区切り表示として「;」が出るみたいですが
これは非表示にすることもできますか?

それと、在庫数表示の式をすっかり忘れていて、最後にポンと
(入荷数+出荷数) AS 現在庫
を追加してみたんですが、数の計算ではなくて、数を文字列として
認識しているのか、たとえば入荷合計数が10、出荷合計数が5だと
現在庫105 ってなってしまいます。
自分が試せる範囲として("入荷数"+"出荷数") AS 現在庫なんてやってみたら
現在庫 入荷数出荷数 と出ました。
なるほど~でした。。。(・_・;)

1981年からプログラミングを!!
私が生まれた年ですね。プログラミング歴26年なんですね。尊敬~~。
まだまだパソコンなんて普及してない頃ですよね。すごい。。。
ちなみに、その4行の意味、わかりません。。
最初の10 20 30 40 にも意味があるんですか??
意味がないのなら、プリントしたCはAとBを足したものってことでしょうか?

お礼日時:2007/10/17 10:38

テーブル[入出庫明細]のテーブル構造を示されたし。



入出庫明細:

商品ベース_商品ID______文字列
入荷数______________________数値

となっていますか?

商品ID______________________文字列
入庫数______________________数値

の間違いじゃないですか?

エラーメッセージでは、テーブルが見つからないではなくパラメータ不足。
つまり、テーブルに存在しない列名が指示されているという意味。
この場合、集計列の[入荷数]かもしれないし条件文の[商品ベース_商品ID]かも知れません。

この回答への補足

テーブル[入出庫明細]のテーブル構造はご指摘の通り↓です。

商品ID______________________文字列
入庫数______________________数値

補足日時:2007/10/16 15:45
    • good
    • 0
この回答へのお礼

ありがとうございます。
アドバイス通りでした。条件文が違ったようです。
? DBSum("入荷数","入出庫明細","商品ID='" & [商品ID] & "'") AS 入荷数
でやってみたら、1行下に入荷数の合計がピッと出ました。
これでOKですよね!

出荷数もOKでした。

最後に
? DBSelect("SELECT 備考 FROM 入出庫明細 WHERE 商品ID='" & [商品ID] & "'") AS 備考欄
をイミディエイトウィンドウでテストしたところ、
「コンパイルエラー: 
修正候補:式」
と表示されました。

まだ終わりではないんですよね。(>_<。)

お礼日時:2007/10/16 15:10

なーんだ、主キーが長整数ではなく文字列だと最初から言ってくれれば・・・。



数量=1 --------------> 数字列
品名='A-1' -----------> 文字列
日付=#2007/01/10#----> 日付・時刻型

このように、文字列の値はシングルクォーテーション(’)で囲むという約束事があります。

[イミディイト]
? DBSum("入荷数","入出庫明細","商品ベース_商品ID='A06-123'")

で成功する筈です。

DBSum("入荷数","入出庫明細","商品ベース_商品ID='" & [商品ID] & "'")

ならば、同じようにシングルクォーテーション(’)で囲めば成功します。

この回答への補足

補足する場所を間違えました(>_<;)

エラーの内容ですが
関数エラーメッセージ
SELECT文の実行時にエラーが発生しました。(DBSum)
・Err Description=1 つ以上の必要なパラメーターの値が設定されていません。
・SQL Text=SELECT SUM(入荷数) FROM 入出庫明細 WHERE 商品ベース_商品ID='A06-123'

となっています。

補足日時:2007/10/16 13:35
    • good
    • 0
この回答へのお礼

ありがとうございます。

まだ同じエラーが出てしまいます。(補足に書いたエラーです)

お礼日時:2007/10/16 13:37

DBSum(集計する列名, 集計対象テーブル名, 集計する条件)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
フォームのイミディエイトウインドウで先ずはテストされたがいいです。

[イミディイト]
? DBSum("入荷数","入出庫明細","商品ベース_商品ID=1")

これが出来たら、1の部分を以下の用に修正!

DBSum("入荷数","入出庫明細","商品ベース_商品ID=" & [商品ID])

多分、列名、テーブル名、条件文のいずれかが間違っています。
ですから、レコード数に等しいエラーが出る訳です。
クエリですと、このようにエラーが出た場合には強制終了という悲惨な結果に。

まあ、エラー=中断というクエリシステムを自作するのが一番ですが、ちょっと、初心者には・・・。
ですから、せめて、一つひとつをイミディエイトウインドウでテストされたがいいです。

>別のモジュールとして登録しました。

標準モジュールは、自作関数のタイプ別に集約されたがいいです。

データベース関数-----DBLookup()、DBSum()、DBSelect()
ファイルシステム関数--FileSize()、GetFileList()
フォームシステム関数--FormIsLoaded()
レポートシステム関数--EraseNonPrint()
共通記号定数--------Public Const conGotoMain = "^(+({HOME}))"
共通標準関数--------Rounds()、Pause()、CutStr()

これは、私の標準モジュールのタイプ別分類と名称です。
何も、これに従う必要はありません。
が、一応の基本かと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
モジュールは、一緒に登録しても「End Function」という文で
別々に登録してくれるんですね。自分の見解なんですが。
なので、アドバイスを受けて1つにまとめてみました。
ここまではOKでしょうか?

イミディエイトウインドウなのですが、自分なりに調べて、
VisualBasicEditorの[表示]-[イミディエイトウインドウ]をクリックで
出したのですが、このことで合ってますか?

そして、IDのほうは例えば「A06-123」というようなコードなので
「1」の代わりに「A06-123」を入れてテストしたらよいですか?

今のところ↑の方法でやってみていますが、エラー続きです。
でも、強制終了の必要がなくなり、助かってます。

今から列名、テーブル名をじっくり見なおしてみます。
条件文に間違いがあると、もう私にはわかりませんよね・・・(@_@;)

お礼日時:2007/10/16 12:16

おしいです。

実に、おしいです。
理由は、既に、成功しているからです。

>DBSum("入荷数","入出庫明細","商品ベース_商品ID=" & [商品ID]) AS 入荷数
をModule1として保存

この3つのモジュールを削除して作業は終了です。

この回答への補足

エラーの内容ですが
関数エラーメッセージ
SELECT文の実行時にエラーが発生しました。(DBSum)
・Err Description=1 つ以上の必要なパラメーターの値が設定されていません。
・SQL Text=SELECT SUM(入荷数) FROM 入出庫明細 WHERE 商品ベース_商品ID=1

となっています。

補足日時:2007/10/16 13:18
    • good
    • 0
この回答へのお礼

おはようございます。
毎回迅速なご回答、本当にありがとうございます。

早速3つのモジュールを削除して試したのですが、やはり同じエラーが出てしまいます。
閉じても閉じても延々とそのエラーメッセージが出るので、強制終了しています。(-_-;)

最初に教えて頂いた、モジュールは2つに分けて登録するのかな!?と思って、
DBSum()~End Functionを1つのモジュールとして、
DBSelect()~End Functionを別のモジュールとして登録しました。

何か根本的に間違っていますか?(T_T)
でも、おしいんですよね?(その言葉が励みです)

お礼日時:2007/10/16 10:37

<DBSelect関数について>



これは、フォームのVBエディタのイミディエイトウインドウを開いてテストしてもいいです。

[イミディエイト]
? DBSelect("SELECT 備考 FROM 入荷明細 WHERE 商品マスター_ID=1")
返品;通常
? DBSelect("SELECT 備考 FROM 入荷明細 WHERE 商品マスター_ID=1", "/")
返品/通常
? DBSelect("SELECT 備考 FROM 入荷明細 WHERE 商品マスター_ID=1", ",")
返品,通常

つまり、DBSelect関数は条件に合致する全レコードの指定列を区切り記号で連結して一文で返します。

<アドバイス>

将来的には、入荷明細に行区分を追加されたがいいです。
[通常][返品][運賃][経費][無償][その他]などなど。
そうでなければ、

Left(DBSelect("SELECT 備考 FROM 入荷明細 WHERE 商品マスター_ID=1", ","), 36)

などと、備考欄の長さ制限でもして置く必要があります。
    • good
    • 0

>訂正が必要ですよね?



もちろん。

>IDというのは商品IDと置きなおしていいのでしょうか?

もちろん。

>DBSelect("SELECT ・・・・・;") のところが全然わかりません。

ステップバイステップで。

>DBSum() を標準モジュールに。

DBSelect() も標準モジュールに登録する必要があります。

まず、クエリーのデザインモードで商品マスターを配置して下さい。
そうして、以下の作業を・・・。

1____________________________________________________________________________________________________________________________

フィールド=品名

まずは、これだけ。

SQLビューに切り替えると

SELECT 品名
FROM 商品マスター;

となっています。

2____________________________________________________________________________________________________________________________

フィールド=入荷数: DBSum("数量","入荷明細","商品マスター_ID=" & [ID])

SELECT DBSum("数量","入荷明細","商品マスター_ID=" & [ID]) AS 入荷数
FROM 商品マスター;

次に、これに成功することです。

3____________________________________________________________________________________________________________________________

フィールド=備考欄: DBSelect("SELECT 備考 FROM 入荷明細 WHERE 商品マスター_ID=" & [ID],",")

商品マスター_ID=" & [ID]
      |        |
      |        +--------> 商品マスターの主キー列名。
      +------------------> 入荷明細の商品マスターとリンクしている列名。

SELECT DBSelect("SELECT 備考 FROM 入荷明細 WHERE 商品マスター_ID=" & [ID],",") AS 備考欄
FROM 商品マスター;

そして、これにも成功することです。

4____________________________________________________________________________________________________________________________

以上を合成すること。

最も単純な、

SELECT 列名
FROM 商品マスター;

の拡張。

SELECT
列名1,
列名2,
・・・・
列名n
FROM 商品マスター;

まあ、これが一番判りやすいです。
そのためには、DBSum()、DBSelect()を標準モジュールに登録して単一Select文の限界を破ります。
    • good
    • 0
この回答へのお礼

迅速な回答ありがとうございます。
丁寧に教えていただいたおかげで、4までは成功しました。

意味もなんとなくわかりました。

で、次は違うエラーが出ました。。。

『クエリ式'DBSum("入荷数","入出庫明細","商品ベース_商品ID=" & ]商品ID])'のコンパイルエラーが発生しました。』
というものです。

モジュールの登録を間違ったのでしょうか?

文面通り受け取って、
DBSum("入荷数","入出庫明細","商品ベース_商品ID=" & [商品ID]) AS 入荷数
をModule1として保存

DBSum("出荷数","入出庫明細","商品ベース_商品ID=" & [商品ID]) AS 出荷数
をModule2として保存

DBSelect("SELECT 備考 FROM 入出庫明細 WHERE 商品ベース_商品ID=" & [商品ID],",") AS 備考欄
ををModule3として保存したんですが、
何か恥ずかしい間違いをしていそうで・・・。(なんとなくですが)

ちなみに、最初に教えていただいた長いプログラム(?)は
別の名前で保存済みです。

本当にすみません。おしいですか?

お礼日時:2007/10/15 16:23

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