アプリ版:「スタンプのみでお礼する」機能のリリースについて

ACCESS VBA ヘッダなしCSVの入力について

”商品管理.mdb”の中に

下のような”商品TBL”があります

商品ID  納入日    仕入NO   管理コード 
9  20100305    25596
10  20100326    19229
11  20100412    65841
12  20100423    26845


上の商品TBLテーブルの管理コードを入れる元データとして
下のような”管理.csv”があります

20100326,20100305,123
20100326,20100326,456
20100326,20100412,222
20100326,20100423,1111

ヘッダーはありませんが

1列目:納入日、2列目:仕入NO、3列目:管理コード

になります。


やりたいことは
”商品TBL”の ”納入日”と”仕入NO”と
管理.csvの”納入日”と”仕入NO”(ヘッダーはありませんが1カラムと2カラム)
が一致した場合、管理.csvの管理コード(3カラム目)を
”商品TBL”の管理コードに入力したいのです。


色々参考にしているのですがやり方がわかりません


今何とか”商品TBL”に管理.csvを読み込ませる所までは出来ましたが
ただ単にデータを追加させる事が出来た程度です。

商品TBLと管理CSVを比較してマッチしたら管理コードを入力できる方法を
どなたか、お教え願います。

以下現在の状況です

Private Sub コマンド0_Click()
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const ForReading = 1

Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")

objConnection.Open _
"Provider = Microsoft.Jet.OLEDB.4.0; " & _
"Data Source = c:\test\商品管理.mdb"

objRecordSet.Open "SELECT * FROM 商品TBL", _
objConnection, adOpenStatic, adLockOptimistic

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\test\管理.csv")

Do Until objFile.AtEndOfStream
strkanri = objFile.ReadLine
MsgBox strkanri
arrkanri = Split(strkanri, ",")

objRecordSet.AddNew
objRecordSet("納入日") = arrkanri(0)
objRecordSet("仕入NO") = arrkanri(1)
objRecordSet("管理コード") = arrkanri(2)
objRecordSet.Update

Loop

objRecordSet.Close
objConnection.Close



End Sub

A 回答 (3件)

「納入日」「仕入NO」は、数値型と仮定します。



Do Loop 部分を以下にしてどうなりますか。


  Do Until objFile.AtEndOfStream
    strkanri = objFile.ReadLine
    MsgBox strkanri
    arrkanri = Split(strkanri, ",")

    objRecordSet.Filter = "納入日=" & arrkanri(0) _
              & " AND 仕入NO =" & arrkanri(1)
    If (objRecordSet.EOF) Then
      objRecordSet.AddNew
      objRecordSet("納入日") = arrkanri(0)
      objRecordSet("仕入NO") = arrkanri(1)
    End If
    objRecordSet("管理コード") = arrkanri(2)
    objRecordSet.Update
  Loop



1度「納入日」「仕入NO」で絞込みします。
結果、なければ全部を追加し、あれば「管理コード」のみを更新します。

ただし、絞り込んだ際に1件しかないはず、、が前提条件となります。

「商品ID」との関係がわからないので、あった時だけとすると、

    If (Not objRecordSet.EOF) Then
      objRecordSet("管理コード") = arrkanri(2)
      objRecordSet.Update
    End If

の方が良いかも?


データ量は見ていないので、使えるものなのかは判断してください。
    • good
    • 0
この回答へのお礼

30246kiku様

アドバイスありがとうございます、
希望の動きが出来ました。

また落とし穴的な注意点も非常に助かります。


もしよろしければ
2点ほど30246kiku様のアドバイスをお聞きしたいのですが、

・仕入NOが0から始まるものもあるのでフィールドを文字型にしています、その場合対処法

・商品TBLに同じ値の「納入日」「仕入NO」の行もあります、それらには同じ管理コードを
 付け足していく場合の方法

お手間をかけますが、もう少しお付き合い願えれば大変ありがたいです。

なにとぞよろしくお願いいたします。

お礼日時:2010/05/01 11:15

#1です



以下のようにしてみてどうなりますか。

  Do Until objFile.AtEndOfStream
    strkanri = objFile.ReadLine
    MsgBox strkanri
    arrkanri = Split(strkanri, ",")

    objRecordSet.Filter = "納入日=" & arrkanri(0) _
              & " AND 仕入NO ='" & arrkanri(1) & "'"
    Do While (Not objRecordSet.EOF)
      objRecordSet("管理コード") = arrkanri(2)
      objRecordSet.Update
      objRecordSet.MoveNext
    Wend
  Loop



「仕入NO」がテキスト型であれば、' ' で arrkanri(1) の内容を囲います。
複数あるのであれば、絞り込まれた分を、ぐるぐる回します。
    • good
    • 0
この回答へのお礼

30246kiku様

貴重なアドバイスありがとうございます!!

おかげさまで希望通りの動作が出来ました。
ありがとうございます。

お礼日時:2010/05/02 15:31

#2です



記述間違いです。

    Do While (Not objRecordSet.EOF)

    While (Not objRecordSet.EOF)
です。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています