Access VBA質問箱 IV

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

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


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

【9725】枝番に連番を振る処理について ゆか 07/8/2(木) 10:20 質問[未読]
【9729】Re:枝番に連番を振る処理について Nao 07/8/2(木) 18:01 回答[未読]
【9732】Re:枝番に連番を振る処理について ゆか 07/8/3(金) 19:38 お礼[未読]

【9725】枝番に連番を振る処理について
質問  ゆか  - 07/8/2(木) 10:20 -

引用なし
パスワード
   初めまして。
現在作っているデータベースで分からなくなってしまったので教えていただきたいのですが・・・。

記述したコードは事業者NOごとに入校許可証の番号を連番で振るというものです。単純に1番から振る場合には本で見て分かったのですが、今回教えていただきたいのは連番を更新するという手順です。
具体的に言いますと、
T1・・・現在有効な許可番号を収納したテーブル
T2・・・これまでに発行した許可番号を収納したテーブル
の2つがあり、事業者NOごとにT2から発行済み番号の最大値+1(stSQL2)を取得し
それをT1に順番に入れていく・・・これをDAOを使ってやろうと思っています。

コードは以下のとおりです。

Private Sub コマンド1_Click()

Dim ds As DAO.Database
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset
Dim fld As DAO.Field
Dim fldid1 As String
Dim stSQL1 As String
Dim stSQL2 As String
Dim i As String
Dim j As String

'T1(現在データテーブル)の事業者NOと許可証番号を昇順に並び替え
stSQL1 = "SELECT T1.事業者NO, T1.許可証番号 FROM T1 WHERE (((T1.事業者NO) > 0)) ORDER BY T1.事業者NO, T1.許可証番号"

'交付済許可証番号マスター(履歴データテーブル)の次付与番号を事業者NOの昇順に並び替え
stSQL2 = "SELECT T2.事業者NO, Max(T2.許可証番号) AS 許可証番号の最大, Max(([許可証番号])+1) AS 次付与番号 FROM T2 GROUP BY T2.事業者NO HAVING (((T2.事業者NO) > 0)) ORDER BY T2.事業者NO"


Set db = CurrentDb()
Set rs1 = db.OpenRecordset(stSQL1, dbOpenDynaset)
Set rs2 = db.OpenRecordset(stSQL2, dbOpenDynaset)
Set fld = rs1.Fields("許可証番号")

If rs1.BOF = False Then
  rs1.MoveFirst
  i = 1
  fldid1 = ""
  
  
  Do Until rs1.EOF
    rs1.Edit
      If fldid1 <> rs1!事業者NO Then
        '事業者NOが変わったら交付済許可証番号マスターから次付与番号を取得
    ☆   rs2.FindFirst "事業者NO" = rs1!事業者NO
        j = rs2!次付与番号
        i = j
        fldid1 = rs1!事業者NO
      End If
      fld = i
    rs1.Update
    i = i + 1
    rs1.MoveNext
  Loop
End If

rs1.Close
rs2.Close
Set rs1 = Nothing
Set rs2 = Nothing
db.Close
Set db = Nothing

End Sub


もし改行などの関係でみにくくなってしまっていたらごめんなさい。

ループに入ったときに最初にT1の事業者NOを参照して同じ事業者NOをT2から検索し、stSQL2で出している次付与番号を取ってきてT1に入れていく。
そういった処理を『☆』のあたりに記述したつもりでした。いらない変数もありますが・・・。

実行してみても特にエラーが出ないためどのように記述したらよいのかよく分かりません。『☆』部分がおかしいのは間違いないとは思うのですが・・・
どなたか教えていただけないでしょうか。よろしくお願いします。
ちなみにまだ記述はしていませんが、最後にT1のレコードをすべてT2に追加して履歴として残すつもりです。

【9729】Re:枝番に連番を振る処理について
回答  Nao  - 07/8/2(木) 18:01 -

引用なし
パスワード
   本当にこれ実行してエラーが出ないんですか?

単純なコピペならエラーバリバリだと思いますけど?
Dim ds As DAO.Database
  ^^
Set db = CurrentDb()
  ^^
そもそもここからエラーです。
(もしかして本物には On Error が付いてるとかはない?)

とりあえず FindFirst のところということで
事業者NO(2バイトの英数字はエリア名としては不適当ですが)
がテキスト型なら

rs2.FindFirst "事業者NO = '" & rs1!事業者NO & "'"

数字型なら

rs2.FindFirst "事業者NO = " & rs1!事業者NO

でどうでしょうか?

追伸:
事業者NOのエリア型が???です。
SQLの「T2.事業者NO) > 0)) 」から見ると数字型(でないとエラーになるはず)
Dim fldid1 As String に格納して比較しているところではテキスト型

まずこの辺で問題が出ると思いますけど・・・

【9732】Re:枝番に連番を振る処理について
お礼  ゆか  - 07/8/3(金) 19:38 -

引用なし
パスワード
   Naoさん 初めまして。

ご丁寧な回答ありがとうございます。


まず、変数宣言の部分ですが、指摘されてびっくりしました。
まったく気づきませんでした。コピペなので原文そのままです。
どうしてエラーが出なかったんでしょうか・・・逆に不安です。
通常はVBEでデバッグ作業をすると思いますが、私はイマイチ
イミディエイトなどの見方や使い方が分からず、実際にDBで
実行してみて確認していました。そのときには何も出なかったんです。
本来のやり方をこれから勉強します。


次に、事業者NOのデータ型はご指摘いただいたとおり数値型でした。
変数宣言部分を As Integer に、Fldid1 = 0 に変更しました。
エリア名についてですが、実は時間の都合上データベースを作りながら
Accessを勉強していったという経緯がありまして、『間違いではないけれど
適切ではない』というものについての知識はまったくありませんでした。
形上はデータの格納もできますし、今のところエラーもないので(と自分では
思っているんですけど、普通に考えたらありえない話ですね。)
ある日、別のエリア名を変更したとき、クエリやフォーム、マクロなど
あらゆるものがエラーになってしまった経験があります。
指摘されたことはあったのですが訂正したときの弊害が大きすぎて
手が出せなくなってしまっていたというのが実際のところです。
最初に『テーブル』についてよく勉強をしなかったのを今でも悔やんでいます。

データ型が決まったので教えていただいた

>数字型なら
>
>rs2.FindFirst "事業者NO = " & rs1!事業者NO

を記述したところスムーズに動きました!ありがとうございます。


少しずつでもできるようになってくると楽しいですね。
本当にありがとうございました!

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