過去ログ

                                Page     575
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼フォームでNo.を入力したときそのレコードを表示したい  水無月 04/3/18(木) 14:59
   ┗Re:フォームでNo.を入力したときそのレコードを表示したい  クロ 04/3/18(木) 15:32
      ┗Re:フォームでNo.を入力したときそのレコードを表示したい  水無月 04/3/18(木) 16:16
         ┗Re:フォームでNo.を入力したときそのレコードを表示したい  クロ 04/3/18(木) 16:39
            ┗Re:フォームでNo.を入力したときそのレコードを表示したい  水無月 04/3/18(木) 17:18
               ┗Re:フォームでNo.を入力したときそのレコードを表示したい  クロ 04/3/18(木) 17:34
                  ┗Re:フォームでNo.を入力したときそのレコードを表示したい  水無月 04/3/19(金) 10:34
                     ┗Re:フォームでNo.を入力したときそのレコードを表示したい  クロ 04/3/19(金) 12:02
                        ┗Re:フォームでNo.を入力したときそのレコードを表示したい  水無月 04/3/19(金) 13:27
                           ┗Re:フォームでNo.を入力したときそのレコードを表示したい  クロ 04/3/19(金) 14:58
                              ┗Re:フォームでNo.を入力したときそのレコードを表示したい  水無月 04/3/19(金) 15:41
                                 ┗Re:フォームでNo.を入力したときそのレコードを表示したい  MJ 04/3/19(金) 15:59
                                    ┣Re:フォームでNo.を入力したときそのレコードを表示したい  水無月 04/3/22(月) 10:32
                                    ┗Re:フォームでNo.を入力したときそのレコードを表示したい  水無月 04/3/26(金) 9:53

 ───────────────────────────────────────
 ■題名 : フォームでNo.を入力したときそのレコードを表示したい
 ■名前 : 水無月
 ■日付 : 04/3/18(木) 14:59
 -------------------------------------------------------------------------
   こんにちは。
私は現在、本を読んで独学でデータベースを作成しているところです。
でも、初心者で基礎がないものですから、本に書いてないことはどうしたらいいのか分からなくて、こちらに頼ることにしました。
どなたか教えてください。

フォームでコード(主キー)を入力したとき、そのコードがすでに使われているならば、レコードをフォーム上に表示したいのです。

まず取引先住所録のテーブルがあります。
その主キーはオートナンバーではなく、自分で取引先コードをつけれるようにしています。データ型は文字列で、10桁まで数字などを入力できるようにしています。

フォームは非連結で作成して、「登録」のコマンドボタンをクリックすることで登録されるようにしています。

そしてそのフォームに取引先コードを入力したときに、すでにそのコードを持つレコードが登録されているなら、そのデータをフォーム上に表示し、まだ使用されていないのなら、そのまま新規レコードとして登録したいので、何も表示しなくていいようにする方法はありませんか?

本などを読んで、DLOOKUP関数を使うのかなと思い、挑戦してみましたが、どうやって構文を書いていいのか分からず、作業がストップしてしまいました。

どうかよろしくお願いいたします。

 ───────────────────────────────────────  ■題名 : Re:フォームでNo.を入力したときそのレコードを表示したい  ■名前 : クロ  ■日付 : 04/3/18(木) 15:32  -------------------------------------------------------------------------
   検索対象テーブル:Aテーブルとします。

非連結フォーム上の取引先コードテキストボックス
の更新前処理のイベントに

Private Sub 取引先コード_BeforeUpdate(Cancel As Integer)
Dim i As Integer
If Len(Nz(Me.取引先コード, "")) = 0 Then
  i = 0
Else
  i = DLookup("取引先コード", "Aテーブル", "取引先コード = '" & Me.取引先コード & "'")
  If i = 0 Then
   Exit Sub
  Else
   MsgBox "このコードは既に使われています。", vbCritical, "警告"
   Cancel = True
   '入力された対象を選択状態にする
   Me.取引先コード.SelStart = 0
   Me.取引先コード.SelLength = LenB(Me.取引先コード.Value)
  End If
End If
End Sub

こんな感じでしょうか?

 ───────────────────────────────────────  ■題名 : Re:フォームでNo.を入力したときそのレコードを表示したい  ■名前 : 水無月  ■日付 : 04/3/18(木) 16:16  -------------------------------------------------------------------------
   早速のお返事ありがとうございます!
すぐに入力してみました。

でも
>  i = DLookup("取引先コード", "Aテーブル", "取引先コード = '" & Me.取引先コード & "'")
のところで実行時エラー3075というのがでます。
フォームのコードの所に「123456789」と入力してEnterを押したら出ました。
内容は「クエリ式'コード"123456789"の構文エラー:演算子がありません。」です。


データベースについて詳しくいうと
テーブル名は「住所録」で、主キーは「コード」で中身は下記になります。

フィールド名    データ型    サイズ     IME入力   IME変換
コード    テキスト    10       オフ    無変換
会社名1   テキスト    30       オン    一般
会社名2   テキスト    20       オン    一般
フリガナ   テキスト    30       半角カタカナ  一般
郵便番号   テキスト    8        オフ    無変換
住所1    テキスト    60       オン    一般
住所2    テキスト    30       オン    一般
電話番号   テキスト    12       オフ    無変換
FAX番号   テキスト    12       オフ    無変換

それでこのコードを非連結フォームに入力したとき、コードがすでに登録されている場合その他の項目も表示したいのです。

申し訳ありませんが、もう一度お教えください。

 ───────────────────────────────────────  ■題名 : Re:フォームでNo.を入力したときそのレコードを表示したい  ■名前 : クロ  ■日付 : 04/3/18(木) 16:39  -------------------------------------------------------------------------
   このコードを非連結フォームに入力するテキストボックスに書いたんですよね?
当方では大丈夫なのですが...

一応、テーブル名とフィールド名を実名にし、非連結フォームに入力するテキ
ストボックス名を「txtCODE」として再度書きます。

Private Sub txtCODE_BeforeUpdate(Cancel As Integer)
Dim i As Integer
If Len(Nz(Me.txtCODE, "")) = 0 Then
  i = 0
Else
 'テーブル「住所録」の「コード」フィールドと「txtCODE」が同じものの
 'テーブル「住所録」の「コード」フィールドを「i」に代入
  i = DLookup("コード", "住所録", "コード = '" & Me.txtCODE & "'")
  If i = 0 Then
   Exit Sub
  Else
   MsgBox "このコードは既に使われています。", vbCritical, "警告"
   Cancel = True
   '入力された対象を選択状態にする
   Me.txtCODE.SelStart = 0
   Me.txtCODE.SelLength = LenB(Me.txtCODE.Value)
  End If
End If
End Sub

 ───────────────────────────────────────  ■題名 : Re:フォームでNo.を入力したときそのレコードを表示したい  ■名前 : 水無月  ■日付 : 04/3/18(木) 17:18  -------------------------------------------------------------------------
   お返事ありがとうございます。
今度は書いてくださったのをコピーして、非連結フォームの「コード」というテキストボックスの更新前処理のイベントに書き込みました。そしてtxtCODEはコードに修正しました。
その結果、次のようなエラーが出ました。

実行時エラー94
Nullの使い方が不正です。

デバッグしたらやはり
>  i = DLookup("コード", "住所録", "コード = '" & Me.txtCODE & "'")
の部分が黄色くなりました。

この原因の心当たりはありませんでしょうか?
何度もお手数をおかけしまして申し訳ありませんが、どうぞお願いいたします。

 ───────────────────────────────────────  ■題名 : Re:フォームでNo.を入力したときそのレコードを表示したい  ■名前 : クロ  ■日付 : 04/3/18(木) 17:34  -------------------------------------------------------------------------
   ごめんなさいDLookUpだと新規の時にNullのエラーがでますので
DCountでやった方がいいですね...

Private Sub コード_BeforeUpdate(Cancel As Integer)

Dim i As Integer
'空欄判定
If Len(Nz(Me.コード, "")) <> 0 Then
  '有無の判定
  i = DCount("*", "住所録", "コード = '" & Me.コード & "'")
  If i <> 0 Then
   MsgBox "このコードは既に使われています。", vbCritical, "警告"
   Cancel = True
   '入力された対象を選択状態にする
   Me.コード.SelStart = 0
   Me.コード.SelLength = LenB(Me.コード.Value)
  End If
End If

End Sub

これでいいと思います。

 ───────────────────────────────────────  ■題名 : Re:フォームでNo.を入力したときそのレコードを表示したい  ■名前 : 水無月  ■日付 : 04/3/19(金) 10:34  -------------------------------------------------------------------------
   クロ さん、何度もお返事ありがとうございます。
今朝早速やってみました。

使用中のコードを入力すると警告のメッセージボックスが出ます。
これで重複することはなくなりました。
ありがとうございます。

それで、この警告だけではなくそのコードで登録されているレコードをフォーム上に表示することはできませんか?

>Private Sub コード_BeforeUpdate(Cancel As Integer)
>
>Dim i As Integer
>'空欄判定
>If Len(Nz(Me.コード, "")) <> 0 Then
>  '有無の判定
>  i = DCount("*", "住所録", "コード = '" & Me.コード & "'")
>  If i <> 0 Then
>   MsgBox "このコードは既に使われています。", vbCritical, "警告"

ここにフォームの会社名1にレコードの会社名1を表示するとういう文を書けばいいのでしょうか?

>   Cancel = True
>   '入力された対象を選択状態にする
>   Me.コード.SelStart = 0
>   Me.コード.SelLength = LenB(Me.コード.Value)
>  End If
>End If
>
>End Sub

お手数ですが宜しくお願いいたします。

 ───────────────────────────────────────  ■題名 : Re:フォームでNo.を入力したときそのレコードを表示したい  ■名前 : クロ  ■日付 : 04/3/19(金) 12:02  -------------------------------------------------------------------------
   メッセージボックス内に表示する方法でいいでしょうか

Dim i As Integer
Dim str As String
'空欄判定
If Len(Nz(Me.コード, "")) <> 0 Then
  '有無の判定
  i = DCount("*", "住所録", "コード = '" & Me.コード & "'")
  If i <> 0 Then
   str = DLookup("会社名1", "住所録", "コード = '" & Me.コード & "'")

   MsgBox "このコードは「" & str & "」で既に使われています。", vbCritical, "警告"
   
   Cancel = True
   '入力された対象を選択状態にする
   Me.コード.SelStart = 0
   Me.コード.SelLength = LenB(Me.コード.Value)
  End If
End If

 ───────────────────────────────────────  ■題名 : Re:フォームでNo.を入力したときそのレコードを表示したい  ■名前 : 水無月  ■日付 : 04/3/19(金) 13:27  -------------------------------------------------------------------------
   >メッセージボックス内に表示する方法でいいでしょうか

お返事ありがとうございます。
ただ私が行いたいのは、フォームにコードを入力して、すでに登録済みのレコードを表示することで、住所などが変更になったときに編集をしてもう一度登録できるようにしたいのです。
なので住所録登録用の非連結フォーム上に表示する方法を教えてください。
宜しくお願いします。

 ───────────────────────────────────────  ■題名 : Re:フォームでNo.を入力したときそのレコードを表示したい  ■名前 : クロ  ■日付 : 04/3/19(金) 14:58  -------------------------------------------------------------------------
   >ただ私が行いたいのは、フォームにコードを入力して、すでに登録済みのレコードを表示することで、住所などが変更になったときに編集をしてもう一度登録できるようにしたいのです。
>なので住所録登録用の非連結フォーム上に表示する方法を教えてください。
>宜しくお願いします。

非連結フォームのレイアウト情報もなく、私にどのように表示しろいうのでしょうか?
何故、非連結フォームを使っているでしょうかレコードソースを「住所録」にすれば
済むことでは無いでしょうか?
それがダメなら「住所録」と同様のテーブル(ワークテーブル)を用意して非連結フォー
ム上の「コード」を抽出条件にしたクエリを非連結フォームのレコードソースにしてみ
てはどうですか?あるいはSQLで書いてもいいと思います。

 ───────────────────────────────────────  ■題名 : Re:フォームでNo.を入力したときそのレコードを表示したい  ■名前 : 水無月 <asahi-g@asahigroup.net>  ■日付 : 04/3/19(金) 15:41  -------------------------------------------------------------------------
   お手数ばかりおかけしまして申し訳ありません。

確かに非連結フォームにする意味はないかもしれませんが、以前間違えたレコードに入力してしまい正しいデータが消えて困ったことがあったので、できれば登録をクリックするまでは保存するか破棄するかを選択できる余地のあるようにしたかったのです。あと勉強の意味も少しあったのですが。

>非連結フォームのレイアウト情報もなく、私にどのように表示しろいうのでしょうか?
非連結フォームはテーブルと全く同じ項目を作っています。テキストボックスの名前や書式も同じにしています。説明不足で申し訳ありません。

>それがダメなら「住所録」と同様のテーブル(ワークテーブル)を用意して非連結フォー
>ム上の「コード」を抽出条件にしたクエリを非連結フォームのレコードソースにしてみ
>てはどうですか?あるいはSQLで書いてもいいと思います。
これからやってみます。
ありがとうございました。

 ───────────────────────────────────────  ■題名 : Re:フォームでNo.を入力したときそのレコードを表示したい  ■名前 : MJ  ■日付 : 04/3/19(金) 15:59  -------------------------------------------------------------------------
   こんにちは。

横から失礼します。

コードの更新後処理イベントで、
下記のようにされては如何でしょう。

  Dim DB As Database
  Dim RS As Recordset
  Dim strSQL As String
  
  Set DB = CurrentDb
  
  strSQL = "SELECT * FROM 住所録 WHERE コード = '" & Me![コード] & "'"
  Set RS = DB.OpenRecordset(strSQL, dbOpenDynaset)
  
  If RS.EOF = False Then
    Me![コントロール名1] = RS![フィールド名1]
    Me![コントロール名2] = RS![フィールド名2]
    Me![コントロール名3] = RS![フィールド名3]
  Else
    Me![コントロール名1] = Null
    Me![コントロール名2] = Null
    Me![コントロール名3] = Null
  End If

でも、もっとも簡単だと思うのは、

住所蹈董璽屮襪函ト碓譽侫@璽襯氷柔「僚蚕袁織錙璽D董璽屮襪覆襪發里鰺儖佞靴董「
フォームは、このワークテーブルとの連結フォームにします。

コード入力後、ワークテーブルのレコードを削除し、
住所録テーブルに該当するレコードが存在する場合は、
追加クエリでこのレコードを、住所録テーブルからワークテーブルへ
レコードを追加します。

そして、入力完了後の登録ボタンでは、
削除クエリで、住所録テーブル内の同一レコードを削除し、
追加クエリでワークテーブルから住所録テーブルへレコードを追加する。

というような感じですが、如何でしょう。

 ───────────────────────────────────────  ■題名 : Re:フォームでNo.を入力したときそのレコードを表示したい  ■名前 : 水無月  ■日付 : 04/3/22(月) 10:32  -------------------------------------------------------------------------
   ▼MJ さんお返事ありがとうございます。
返信遅くなり申し訳ありません。

下記の方法で上手くできました。
ありがとうございます!
>  Dim DB As Database
>  Dim RS As Recordset
>  Dim strSQL As String
>  
>  Set DB = CurrentDb
>  
>  strSQL = "SELECT * FROM 住所録 WHERE コード = '" & Me![コード] & "'"
>  Set RS = DB.OpenRecordset(strSQL, dbOpenDynaset)
>  
>  If RS.EOF = False Then
>    Me![コントロール名1] = RS![フィールド名1]
>    Me![コントロール名2] = RS![フィールド名2]
>    Me![コントロール名3] = RS![フィールド名3]
>  Else
>    Me![コントロール名1] = Null
>    Me![コントロール名2] = Null
>    Me![コントロール名3] = Null
>  End If

ワークテーブルを使う方法はまた試してみます。
本当にありがとうございました。

 ───────────────────────────────────────  ■題名 : Re:フォームでNo.を入力したときそのレコードを表示したい  ■名前 : 水無月  ■日付 : 04/3/26(金) 9:53  -------------------------------------------------------------------------
   MJ さん、こんにちは。

以前はご教授ありがとうございます。それで下記の方法を自分なりに考えてやとうとしてみました。
しかし、クエリに関してもまだまだ理解が足りないため、どうやったら上手くできるか構成がまとまりません。
もう少し詳しくご説明頂くことはできませんでしょうか?
どうか宜しくお願いします。

>フォームは、このワークテーブルとの連結フォームにします。
>
>コード入力後、ワークテーブルのレコードを削除し、
>住所録テーブルに該当するレコードが存在する場合は、
>追加クエリでこのレコードを、住所録テーブルからワークテーブルへ
>レコードを追加します。
>
>そして、入力完了後の登録ボタンでは、
>削除クエリで、住所録テーブル内の同一レコードを削除し、
>追加クエリでワークテーブルから住所録テーブルへレコードを追加する。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 575