- ベストアンサー
ACCESSで在庫管理 備考欄の組み込み方
- ACCESSで在庫管理を始めました。備考欄を設けたら、備考を入れたものは数が別でカウントされるようになってしまいました。
- 現在の在庫管理の状態は、商品ベースと入出庫明細のテーブル、入荷票と出荷票のフォーム、在庫表と要発注表のクエリ、在庫表と要発注表のレポートという構成です。
- 備考欄を大きめにとって、そこに備考をどんどん追加するような形式の在庫管理をしたいのですが、可能でしょうか?
- みんなの回答 (13)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>(入荷数+出荷数) 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 から変更すれば済むことですが・・・。 さて、どっちが良いのかはプロではないので明確な意見を持ち合わせていません。
その他の回答 (12)
Len(備考& '') で、なんで列[備考]が空欄か否かが判るのか?つまり、真(True)か偽(False)を判定できるのか? Len(備考') ではなく '' を付加しているのはなぜか? 後者は、Len関数が空値を引数にすれば真偽を判定できないから。 前者は、真は0以外、偽は0という約束事があるから。 [イミディエイト] ? CBool(0) False ? CBool(1) True ちっと、意味不明かも知れないので補足しておきます。
>空欄のときも区切り表示として「;」が出るみたいですが・・・。 [イミディエイト] ? 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 にも意味があるんですか?? これらは、行番号です。
お礼
ありがとうございます。 Len(備考& '')というほうにしました。 すいません、それと・・・ (入荷数+出荷数) AS 現在庫 を追加してみたんですが、数の計算ではなくて、数を文字列として 認識しているのか、たとえば入荷合計数が10、出荷合計数が5だと 現在庫105 ってなってしまいます。 これで最後の質問だといいんですが。(^^;
もう終ったと言えば終わっているし、まだだと言えば、まだ・・・。 >? 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ヶ月考え続けました。 根性だけが解決します。
お礼
おはようございます。 早速ですが!!やっとやっと備考欄が表示されました!! 贅沢ですが、空欄のときも区切り表示として「;」が出るみたいですが これは非表示にすることもできますか? それと、在庫数表示の式をすっかり忘れていて、最後にポンと (入荷数+出荷数) AS 現在庫 を追加してみたんですが、数の計算ではなくて、数を文字列として 認識しているのか、たとえば入荷合計数が10、出荷合計数が5だと 現在庫105 ってなってしまいます。 自分が試せる範囲として("入荷数"+"出荷数") AS 現在庫なんてやってみたら 現在庫 入荷数出荷数 と出ました。 なるほど~でした。。。(・_・;) 1981年からプログラミングを!! 私が生まれた年ですね。プログラミング歴26年なんですね。尊敬~~。 まだまだパソコンなんて普及してない頃ですよね。すごい。。。 ちなみに、その4行の意味、わかりません。。 最初の10 20 30 40 にも意味があるんですか?? 意味がないのなら、プリントしたCはAとBを足したものってことでしょうか?
テーブル[入出庫明細]のテーブル構造を示されたし。 入出庫明細: 商品ベース_商品ID______文字列 入荷数______________________数値 となっていますか? 商品ID______________________文字列 入庫数______________________数値 の間違いじゃないですか? エラーメッセージでは、テーブルが見つからないではなくパラメータ不足。 つまり、テーブルに存在しない列名が指示されているという意味。 この場合、集計列の[入荷数]かもしれないし条件文の[商品ベース_商品ID]かも知れません。
お礼
ありがとうございます。 アドバイス通りでした。条件文が違ったようです。 ? DBSum("入荷数","入出庫明細","商品ID='" & [商品ID] & "'") AS 入荷数 でやってみたら、1行下に入荷数の合計がピッと出ました。 これでOKですよね! 出荷数もOKでした。 最後に ? DBSelect("SELECT 備考 FROM 入出庫明細 WHERE 商品ID='" & [商品ID] & "'") AS 備考欄 をイミディエイトウィンドウでテストしたところ、 「コンパイルエラー: 修正候補:式」 と表示されました。 まだ終わりではないんですよね。(>_<。)
補足
テーブル[入出庫明細]のテーブル構造はご指摘の通り↓です。 商品ID______________________文字列 入庫数______________________数値
なーんだ、主キーが長整数ではなく文字列だと最初から言ってくれれば・・・。 数量=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' となっています。
DBSum(集計する列名, 集計対象テーブル名, 集計する条件) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ フォームのイミディエイトウインドウで先ずはテストされたがいいです。 [イミディイト] ? DBSum("入荷数","入出庫明細","商品ベース_商品ID=1") これが出来たら、1の部分を以下の用に修正! DBSum("入荷数","入出庫明細","商品ベース_商品ID=" & [商品ID]) 多分、列名、テーブル名、条件文のいずれかが間違っています。 ですから、レコード数に等しいエラーが出る訳です。 クエリですと、このようにエラーが出た場合には強制終了という悲惨な結果に。 まあ、エラー=中断というクエリシステムを自作するのが一番ですが、ちょっと、初心者には・・・。 ですから、せめて、一つひとつをイミディエイトウインドウでテストされたがいいです。 >別のモジュールとして登録しました。 標準モジュールは、自作関数のタイプ別に集約されたがいいです。 データベース関数-----DBLookup()、DBSum()、DBSelect() ファイルシステム関数--FileSize()、GetFileList() フォームシステム関数--FormIsLoaded() レポートシステム関数--EraseNonPrint() 共通記号定数--------Public Const conGotoMain = "^(+({HOME}))" 共通標準関数--------Rounds()、Pause()、CutStr() これは、私の標準モジュールのタイプ別分類と名称です。 何も、これに従う必要はありません。 が、一応の基本かと思います。
お礼
ありがとうございます。 モジュールは、一緒に登録しても「End Function」という文で 別々に登録してくれるんですね。自分の見解なんですが。 なので、アドバイスを受けて1つにまとめてみました。 ここまではOKでしょうか? イミディエイトウインドウなのですが、自分なりに調べて、 VisualBasicEditorの[表示]-[イミディエイトウインドウ]をクリックで 出したのですが、このことで合ってますか? そして、IDのほうは例えば「A06-123」というようなコードなので 「1」の代わりに「A06-123」を入れてテストしたらよいですか? 今のところ↑の方法でやってみていますが、エラー続きです。 でも、強制終了の必要がなくなり、助かってます。 今から列名、テーブル名をじっくり見なおしてみます。 条件文に間違いがあると、もう私にはわかりませんよね・・・(@_@;)
おしいです。実に、おしいです。 理由は、既に、成功しているからです。 >DBSum("入荷数","入出庫明細","商品ベース_商品ID=" & [商品ID]) AS 入荷数 をModule1として保存 この3つのモジュールを削除して作業は終了です。
お礼
おはようございます。 毎回迅速なご回答、本当にありがとうございます。 早速3つのモジュールを削除して試したのですが、やはり同じエラーが出てしまいます。 閉じても閉じても延々とそのエラーメッセージが出るので、強制終了しています。(-_-;) 最初に教えて頂いた、モジュールは2つに分けて登録するのかな!?と思って、 DBSum()~End Functionを1つのモジュールとして、 DBSelect()~End Functionを別のモジュールとして登録しました。 何か根本的に間違っていますか?(T_T) でも、おしいんですよね?(その言葉が励みです)
補足
エラーの内容ですが 関数エラーメッセージ SELECT文の実行時にエラーが発生しました。(DBSum) ・Err Description=1 つ以上の必要なパラメーターの値が設定されていません。 ・SQL Text=SELECT SUM(入荷数) FROM 入出庫明細 WHERE 商品ベース_商品ID=1 となっています。
<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) などと、備考欄の長さ制限でもして置く必要があります。
>訂正が必要ですよね? もちろん。 >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文の限界を破ります。
お礼
迅速な回答ありがとうございます。 丁寧に教えていただいたおかげで、4までは成功しました。 意味もなんとなくわかりました。 で、次は違うエラーが出ました。。。 『クエリ式'DBSum("入荷数","入出庫明細","商品ベース_商品ID=" & ]商品ID])'のコンパイルエラーが発生しました。』 というものです。 モジュールの登録を間違ったのでしょうか? 文面通り受け取って、 DBSum("入荷数","入出庫明細","商品ベース_商品ID=" & [商品ID]) AS 入荷数 をModule1として保存 DBSum("出荷数","入出庫明細","商品ベース_商品ID=" & [商品ID]) AS 出荷数 をModule2として保存 DBSelect("SELECT 備考 FROM 入出庫明細 WHERE 商品ベース_商品ID=" & [商品ID],",") AS 備考欄 ををModule3として保存したんですが、 何か恥ずかしい間違いをしていそうで・・・。(なんとなくですが) ちなみに、最初に教えていただいた長いプログラム(?)は 別の名前で保存済みです。 本当にすみません。おしいですか?
訂正: 現在庫の計算式の+-に誤りが・・・。
- 1
- 2
お礼
ありがとうございました!!遂に出来ました!! でも、今回できたのは、Husky2007さんに作っていただいたあの標準モジュールあってのものですよね。 やっぱりかなり詳しくないとできないですね( ̄~ ̄;) 本当に長々と根気強く教えていただいてありがとうございました。 お茶ぐらいごちそうしたいもんです。