- 締切済み
accessのVBで処理を作成したい(インプットボックスからの検索)
こんにちは、 「出荷テーブル」 ID [オートナンバー] 伝票番号 [テキスト型] 商品 [テキスト型] 製造番号 [テキスト型] フォームに[txt製造番号]に入力した後に、テーブルから、入力した値と同じものを検索して、 あった場合→「出荷テーブル」にレコードを追加(検索したものと同じ内容で、伝票番号だけ「伝票番号+D」にする) なかった場合→メッセージ(在庫がありません)と出して、処理を中止。 いろいろ過去ログを探してみたのですが、どれを参考にすればいいのかわかりません。どなたか教えて下さい。お願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
s_husky です。 ちょい、心配になって戻ってきました。 基本的なフローは判った訳ですから、次は、細部を完成する段階です。 この場合、OKWaveを上手に利用することが肝心です。 質問1、在庫確認コードは、どちらが宜しいでしか? isFound=CBool(DCount("*","在庫テーブル","製造番号='" & 製造番号 &"'") > 0) isFound=CBool(DLookup("製造番号","在庫テーブル","製造番号='" & 製造番号 &"'") <> "") 同じ結果のようですが、皆様は、どちらを主にお使いですか? 質問2、Insert文を実行する CnnExecute関数を Access版に改造したのですが.... 次は、SQLServer+Access.adp で使ってきた SQL文を実行する関数です。 Access版に改造して DbsExecute関数として利用するつもりです。 改変を試みたのですが、途中でエラーが出ます。 不具合箇所を教えて下さい。 Public Function CnnExecute(ByVal strSQL As String) As Boolean On Error GoTo Err_CnnExecute Dim isOK As Boolean Dim cnn As ADODB.Connection isOK = True Set cnn = CurrentProject.Connection With cnn .Errors.Clear .BeginTrans .Execute strSQL .CommitTrans End With Exit_CnnExecute: On Error Resume Next cnn.Close Set cnn = Nothing CnnExecute = isOK Exit Function Err_CnnExecute: isOK = False If cnn.Errors.Count > 0 Then ErrMessage cnn.Errors(0), strSQL cnn.RollbackTrans Else MsgBox "プログラムエラーが発生しました。システム管理者に報告して下さい。(CnnExecute)", _ vbExclamation, " 関数エラーメッセージ" End If Resume Exit_CnnExecute End Function 質問3、Insert文を次のように作成しましたが、エラーが出ます。 XXXXXXXXXXXXXXX ※まあ、このように、小分けして質問して、答をつなぎ合わせるのが手っ取り早いということです。
s_husky です。 strSQLText = "INSERT・・・" DBSExecute(strSQLText) の部分を完成すれば動きます。 DBSExecute(strSQLText)の部分は、 dbs を宣言し、セットし、Executeメソッドを使うように書いても構いません。ヘルプ文で、簡単にサンプルコードを参照できます。 DBCount("*","在庫テーブル","製造番号='" & 製造番号 &"'") と少し、コードを最適化する部分があります。 なお、コードを機械的に真似ても一切動作しませんので、あくまでもフローのみを参考にして下さい。具体的にコードか書かれて、躓かれた点については幾らでも答える用意があります。 ※繰り返しますが、フローのみを参照して下さい。
isFound = CBool(DBCount("製造番号","在庫テーブル","製造番号='" & 製造番号 &"'") > 0) *バグです。訂正しておきます。
・InputBoxを利用して[製造番号]を入力させるのか、TextBox[製造番号]の更新後処理なのかを惑わせる質問です。 ・検索方法についても、DLookup関数を使用するのか、それとも、ADODBで高速化を図りたいのか不明です。 ・出荷テーブルへの追加は、INSERT文を使用する予定でしょうか? ・[伝票番号]とは、[発注テーブル]のそれでしょうか? この辺りが不明だと、全コードを示せということになります。 その場合、それぞれに作法というのがあり、質問者にマッチした回答になる保証がありません。 ですから、次のようなフローにて多少自前のコードを書いて、どこでどう躓いているのかを明らかにされたらどうでしょうか? Dim isOK As Boolean Dim isFound As Boolean Dim 製造番号 As String Dim strSQLText As String If Len(Me.製造番号 & "") > 0 Then 製造番号=UCase(Me.製造番号) isFound = CBool(DBCount("製造番号","出荷テーブル","製造番号='" & 製造番号 &"'") > 0) If isFound Then strSQLText = "INSERT INTO 出荷テーブル ・・・・" isOK = DBSExecute(strSQLText) If isOK Then Message "[出荷テーブル] に追加しました。" Else ErrMsg ""[出荷テーブル]への追加でエラーが発生しました。(XXXXX)" End If Else Message "該当する[製造番号]の在庫はありません。" End If End If DBSExecute: dbs.Execute を使用します。 Message、ErrMsg: MsgBox に置き換えます。 ※全体のフローとコードも似たり寄ったりと思います。 ※コードも2、30行と大変短いものです。 ※まず、自分なりのコードを書くことが先決ではないでしょうか? ※その上で、不明点を一つひとつ質問した方が解決が早いと思いますが。
補足
回答ありがとうございます。説明が少なくてすいません。現在クエリで処理をしているのですが、検索されなかった時の処理をしたくて、VBAに初挑戦してたところで、参考になるコードを探していました。 ・TextBox[txt製造番号]の更新後処理です。 ・検索方法ですが、DLookup関数・ADODBをどちらを使うのかまだよく理解していません。 ・出荷テーブルへの追加は、INSERT文で追加しようと思ってます。 ・[伝票番号]は、[出荷テーブル]の中にあります(製造番号と同じところ)