Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1344 / 2272 ツリー ←次へ | 前へ→

【7604】レコード追加時の重複について 水無月 06/3/29(水) 14:31 質問[未読]
【7606】Re:レコード追加時の重複について たん 06/3/29(水) 14:50 回答[未読]
【7607】Re:レコード追加時の重複について 水無月 06/3/29(水) 15:19 質問[未読]
【7608】Re:レコード追加時の重複について たん 06/3/29(水) 15:35 回答[未読]
【7609】Re:レコード追加時の重複について 水無月 06/3/29(水) 16:05 質問[未読]
【7611】Re:レコード追加時の重複について たん 06/3/29(水) 16:47 回答[未読]
【7612】Re:レコード追加時の重複について 水無月 06/3/29(水) 16:59 お礼[未読]

【7604】レコード追加時の重複について
質問  水無月  - 06/3/29(水) 14:31 -

引用なし
パスワード
   こんにちは、水無月と申します。
下記についてご教授宜しくお願いします。

フォームに「HEAD」「START」「END」「BANGO」というテキストボックスを設置して「TOUROKU」ボタンをクリックした際に「T_TP」というテーブルにレコードを追加するイベントを行います。
例えば、HEADに「A」、STARTに「10050」、ENDに「10100」、BANGOに「60」とするとA10050〜A10100までの連続番号のTPNOとその全レコードのBANGOに60が登録されます。
この次にA10000〜A10100までを登録しようとした場合、現在はテーブルのインデックスが重複なしになっているため、重複が出たときにエラーが出ます。でもA10000〜A10049まではノーチェックで登録されてしまいます。そうではなくて、登録しようとしたNOが1つでも重複している場合、1つも登録することなく元のフォームに戻り入力し直すようにしたいのです。
でもどうすればいいのか分からず困っています。どうか宜しくお願いします。
(ちなみにHEADはつく場合と空白の場合があります)

Private Sub cmd_TOROKU_Click()

  Dim cn As ADODB.Connection
  Dim rs As ADODB.Recordset
  Dim i As Long

  Set cn = CurrentProject.Connection
  Set rs = New ADODB.Recordset
  rs.Open "T_TP", cn, adOpenKeyset, adLockOptimistic
  
  For i = CLng(Me!START) To CLng(Me!END)
  
  If IsNull(Me!HEAD) Then
    rs.AddNew
      rs!TPNO = CStr(i)
      rs!BANGO = Me!BANGO
    rs.Update
  Else
    rs.AddNew
      rs!TPNO = Me!HEAD + CStr(i)
      rs!BANGO = Me!BANGO
    rs.Update
  End If
  
  Next i
  
  If IsNull(Me!HEAD) Then
    MsgBox ("No." & Me!START & "から" & Me!END & "まで登録しました")
  Else
    MsgBox ("No." & Me!HEAD + Me!START & "から" & Me!HEAD + Me!END & "まで登録しました")
  End If
  
  rs.Close: Set rs = Nothing
  cn.Close: Set cn = Nothing
    
End Sub

【7606】Re:レコード追加時の重複について
回答  たん  - 06/3/29(水) 14:50 -

引用なし
パスワード
   # 発言の際は、投稿の内容欄の大きさに合わせて、適宜、
# 手動で改行を入れて下さい。(引用しにくいし、見にくいので)

>この次にA10000〜A10100までを登録しようとした場合、現在はテーブルのインデックスが重複なしになっているため、重複が出たときにエラーが出ます。でもA10000〜A10049まではノーチェックで登録されてしまいます。そうではなくて、登録しようとしたNOが1つでも重複している場合、1つも登録することなく元のフォームに戻り入力し直すようにしたいのです。

A10000〜A10100までを抽出条件にしたデータセットを開き、そのデータセットの
件数が0件なら処理を行ない、
0件でないなら、エラーメッセージ等を吐き出して、処理を行なわなければ良い。

以上。

【7607】Re:レコード追加時の重複について
質問  水無月  - 06/3/29(水) 15:19 -

引用なし
パスワード
   申し訳ありません。今度から気をつけます。

返信ありがとうございます。

実は、SQLやFilterプロパティを使ってみようと思ったのですが、
その抽出条件の書き方が分からないのです。

お手数ですが教えてください。

【7608】Re:レコード追加時の重複について
回答  たん  - 06/3/29(水) 15:35 -

引用なし
パスワード
   >実は、SQLやFilterプロパティを使ってみようと思ったのですが、
>その抽出条件の書き方が分からないのです。

Accessなのだったら、クエリを生成し、SQLビューで表示させれば、
SQL文自体は作成可能でしょう。

ただ、ADOで制御するプログラムを組む必要があるのなら、
SQL文を手書きで組めるように、構文の記述法等を把握していない
のであれば、今後、同じ事で苦しむだけでしょう。

SQL文の例が必要なら、まずはクエリを作ってみることです。

その上で出来あがったものを元に、ヘルプでSQL文の基礎を覚える
べきでしょう。
当然、抽出条件の書き方は、非常に大事です。

分からないと言って、提示されたSQL文を見るのも一つの方法かも
しれませんが、それでは応用が利かなくなるだけです。

まずは、自身で、クエリを元にSQL文を作って、それをベースに
問い合わせるべきでしょう。

【7609】Re:レコード追加時の重複について
質問  水無月  - 06/3/29(水) 16:05 -

引用なし
パスワード
   たんさんへ。
またまたお返事ありがとうございます。
実は、自分でSQLを組んではいたのですが上手く動かないのです。
下記のどこが悪いのか教えて頂けませんか?

Private Sub cmd_TOROKU_Click()

  Dim cn As ADODB.Connection
  Dim rs As ADODB.Recordset
  Dim i As Long
  Dim mySQL As String
  Dim et As Integer

  Set cn = CurrentProject.Connection
  Set rs = New ADODB.Recordset
  rs.Open "T_TP", cn, adOpenKeyset, adLockOptimistic
  
  For i = CLng(Me!START) To CLng(Me!END)
  mySQL = "SELECT T_TP. TPNO FROM T_TP WHERE (T_TP.TPNO)='CStr(i)';"
  Next i
  
  et = rs.RecordCount
  
  If et = 0 Then
  
    For i = CLng(Me!START) To CLng(Me!END)
    
    If IsNull(Me!HEAD) Then
      rs.AddNew
        rs!TPNO = CStr(i)
        rs!BANGO= Me!BANGO
      rs.Update
    Else
      rs.AddNew
        rs!TPNO = Me!HEAD + CStr(i)
        rs!BANGO= Me!BANGO
      rs.Update
    End If
  
    Next i
  
    If IsNull(Me!HEAD) Then
      MsgBox ("No." & Me!START & "から" & Me!END & "まで登録しました")
    Else
      MsgBox ("No." & Me!HEAD + Me!START & "から"
            & Me!HEAD + Me!END & "まで登録しました")
    End If
    
  Else
    MsgBox "重複した試験片番号があります"
  End If
  
  rs.Close: Set rs = Nothing
  cn.Close: Set cn = Nothing
    
End Sub

【7611】Re:レコード追加時の重複について
回答  たん  - 06/3/29(水) 16:47 -

引用なし
パスワード
   >  For i = CLng(Me!START) To CLng(Me!END)
>  mySQL = "SELECT T_TP. TPNO FROM T_TP WHERE (T_TP.TPNO)='CStr(i)';"
>  Next i

For〜Nextで回さなくても、Betweenなり、< と >の組み合わせで、
START〜END間の分を抽出条件に出来るでしょうに。

# それに、このロジック意味無いようにしか見えません。

抽出条件の書き方をヘルプできちんと覚えましょう。

# テーブルがAccess以外なら、そのデータベースでのSQL文の記述法に
# 依存します。(抽出条件等)

あと、「うまく動かない」とだけ言われても、こちらも困ります。
「どう」うまく動かないのかを明確にして下さい。

【7612】Re:レコード追加時の重複について
お礼  水無月  - 06/3/29(水) 16:59 -

引用なし
パスワード
   申し訳ありません。
本を読みながら勉強中のド素人なものですから、あまり応用がききません。
まだ理解も足りません。

もっと勉強してから出直します。

お手数をお掛けしました。

1344 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078228
(SS)C-BOARD v3.8 is Free