0

私はVBAの完全な初心者です。コードを書くつもりはありませんでしたが、それなしで探していたものをどのように達成できるかわからなかったので、コードを書くことになりました。私はインターネットで 3 日間、1 日 10 時間検索していましたが、あまり運がありませんでした。セキュリティで保護したい Access データベースがあります。最初に達成しようとしていることを説明させてください。

1)テーブル内の値、アイテムのアイテムコードを検索するフォームにコンボボックスがあります。これは基本的に在庫の問題です。各アイテムの残りの在庫を返す計算フィールドを持つクエリがあります。商品コードをパラメーターとして取り、その特定の商品コードの残りの在庫を返す別のクエリがあります。

私がやりたいのは、残りの在庫が0かどうかを確認することです。そうであれば、コンボボックスリストからこのアイテムコードを選択すると、メッセージボックスにアイテムの在庫がないため発行できないというメッセージが表示されます。コンボボックスをリセットします(つまり、選択が行われていないかのように)

これが私のコードです。コンボボックスの afterUpdate イベント:

Private Sub Item_Code_AfterUpdate()

Dim dbMyDatabase As DAO.Database

Dim rsMyRecords As DAO.Recordset

Dim strQuery As String

strQuery = "SELECT [Store_Items].[Item Code], Store_Items.[Opening Stock], IIf((Nz([Opening Stock],0)+Nz([Quantity Purchased],0)-Nz([Quantity Issued],0)<0),0,(Nz([Opening Stock],0)+Nz([Quantity Purchased],0)-Nz([Quantity Issued],0))) AS [Remaining Stock] FROM (Purchases RIGHT JOIN Store_Items ON Purchases.[Item Code] = Store_Items.[Item Code]) LEFT JOIN Issuances ON Store_Items.[Item Code] = Issuances.[Item Code] WHERE (((Store_Items.[Item Code])=[Forms]![Issuances]![Item Code]));"

Set dbMyDatabase = CurrentDb

Set rsMyRecords = dbMyDatabase.OpenRecordset(strQuery)

Dim Msg, Style, Title, Response

Msg = "This Item is out of Stock! You Cannot Issue this item!"
Style = vbOK
Title = "Warning!"

If rsMyRecords![Item Code] <= 0 Then
Response = MsgBox(Msg, Style, Title)
If Response = vbOK Then Me![Item Code].Requery

End Sub 

2) ナビゲーション パネルの 2 つのバージョンを作成しました。1 つはすべてのフォームにアクセスでき、もう 1 つはアクセスが制限されています。これは、ログインの種類によって決定されます。今、機能するのは最初のものだけです.ElseIfが機能しない理由がわかりません. 他のタイプでログインしようとすると、ログイン ボタンをクリックしても何も起こりません。

また、ナビゲーション ペインを非表示にして、ログインの種類に応じてデータベース デザインの編集とデザイン ビューでのテーブルとフォームの表示を可能にする既定のメニューにアクセスしたいのですが、これを実現する方法がわかりません。

Private Sub LoginBUtton_Click()

'Check to see if data is entered into the UserName combo box

    If IsNull(Me.CBOLogin) Or Me.CBOLogin = "" Then
      MsgBox "You must select a user type.", vbOKOnly, "No User name"
        Me.CBOLogin.SetFocus
        Exit Sub
    End If

    'Check to see if data is entered into the password box

    If IsNull(Me.TextPass) Or Me.TextPass = "" Then
      MsgBox "No Password Entered, Enter a password.", vbOKOnly, "No Password"
        Me.TextPass.SetFocus
        Exit Sub
    End If

    'Check value of password in Users to see if this
    'matches value chosen in combo box

    If Me.TextPass.Value = DLookup("Password", "Users", _
            "[UserID]=" & Me.CBOLogin.Value) Then



    ElseIf (Me.CBOLogin.Value = "Developer") Then
    DoCmd.Close acForm, "LoginForm", acSaveNo
    DoCmd.OpenForm "FullAccessNav"


    ElseIf (Me.CBOLogin.Value = "Office") Then
    DoCmd.Close acForm, "LoginForm", acSaveNo
    DoCmd.OpenForm "LimitedAccessNav"


    ElseIf (Me.CBOLogin.Value = "Store") Then
    DoCmd.Close acForm, "loginForm", acSaveNo
    DoCmd.OpenForm "LimitedAccessNav"

    Else
            MsgBox "Password Invalid. Please Try Again", vbOKOnly, _
            "Invalid Entry!"
            Me.TextPass.SetFocus

    End If

    'If User Enters incorrect password 3 times database will shutdown

    intLogonAttempts = intLogonAttempts + 1

    If intLogonAttempts > 3 Then
      MsgBox "You do not have access to this database.Please contact admin.", _
               vbCritical, "Restricted Access!"
        Application.Quit
    End If

End Sub

助けてください?:S

4

1 に答える 1

0

ログインの問題は解決できましたが、まだデータ検証のビットが残っています。コンボ ボックスのリストからアイテム コードをクリックすると、ランタイム エラー 3421 が発生します。

これは、コンボ ボックスからアイテム コードを選択したときに起こりたいことです。その商品コードのクエリから計算フィールドを取得したい (この計算フィールドには、計算された商品の残りの在庫が含まれています) 0 の場合、メッセージを表示して、ユーザーがこのレコードを入力できないようにしたいので、コンボボックスをリセットするとうまくいくと思いますか?

在庫が特定のレベルにある場合、メッセージボックスを表示したいだけで、通常はユーザーにレコードを入力させます。それ以外の場合、ユーザーは通常どおりレコードを入力します。

次の行で実行時エラー 3421「データ型変換エラー」が発生します。

Set rs = db.OpenRecordset("SELECT [在庫状況] FROM [InventoryStatusSpecificItem] WHERE [商品コード] = [フォーム]![発行]![ItemCBO]", ダイナセット)

Private Sub ItemCBO_AfterUpdate()

    Dim db As DAO.Database
    Dim rs As DAO.Recordset

    Set db = CurrentDb()


    Set rs = db.OpenRecordset("SELECT [Remaining Stock] FROM [InventoryStatusSpecificItem] WHERE [Item Code] = [Forms]![Issuances]![ItemCBO]", Dynaset)



    If rs.Fields([Remaining Stock]) = "0" Then
    MsgBox "This item is out of stock! Cannot Issue!", vbExclamation + vbOKOnly, "Attention!", vbExclamation
    Me!ItemCBO = Null

    ElseIf rs.Fields("Stock Status") = "Order Now!" Then
    MsgBox "This item has reached its minimum quantity level. Only " + StrRemainingStock + " remains. Quantity Measured as " + StrMeasuredIn, vbExclamation + vbOKOnly, "Attention!"

    Else
    Me!ItemCBO.Requery

    End If

    'close recordset
    rs.Close
    Set db = Nothing
于 2013-01-16T15:11:18.040 に答える