2017-10-05 8 views
0

私は、Accessデータベースにエクスポートするいくつかのデータを含むExcelファイルを持っています。 C列には「Description」というフィールドがあります。通常、このフィールドはただ1つのセルを占有しますが、それはより長く発生します。この場合前の行を更新します

enter image description here

、例えば、AP.01は、説明の5行を持っています。最初の行を次の行でどのように更新できますか?

Public Sub updateDB(ByVal PathDB As String, str As String, id As Integer) 
    Dim db As New cDB 
    Dim v As New cVoce 
    Dim rs As ADODB.Recordset = db.RecordSet 
    v.Description = str 
    db.connetti_DB(PathDB) 
    db.get_rs("UPDATE Voice SET Description = '" + v.Description + "' WHERE id= '"+id+"'") 

End Sub 

Public Function get_rs(ByVal query As String) As ADODB.Recordset 
    If db Is Nothing Then rs = Nothing : Return rs 

    rs = New ADODB.Recordset 
    rs.CursorType = ADODB.CursorTypeEnum.adOpenStatic 
    rs.LockType = ADODB.LockTypeEnum.adLockOptimistic 

    rs.Open(query, db) 
    Return rs 
End Function 

このコードは、現在の行を更新するため機能しません。この理由は、このため、UPDATE命令は役に立ちません。コードを修正するにはどうすればよいですか? Iループ

For r = 2 To grid.RowCount - 1 

     vett = Split(grid(r, 1).Text) 
     total = UBound(Split(grid(r, 1).Text, ".")) 
     If grid(r, 1).Text <> "" Then 
      Select Case total 
       Case 0 
        Dim chapter As New cChapter 
        flag = 1 
        id = id + 1 
        chapter.Cod = grid(r, 1).Text.Substring(0, 1) 
        chapter.Description = grid(r, 3).Text 

        If Left(vett(0), 1) >= Chr(65) And Left(vett(0), 1) <= Chr(90) Then 
         chapter.Cod = Left(vett(0), 1) 
         oldChap = chap.Cod 
         If chapter.Cod <> oldCap Then 
          chapters.Add(chapter) 
         End If 
        End If 
        chapters.Add(chapter) 
        stringChap = chap.Description 

        Dim par As New cParagraph 
        If Left(vett(0), 2) >= Chr(65) And Left(vett(0), 2) <= Chr(90) Then 
         par.Cod = Left(vett(0), 2) 
         par.Cod_Chapter = Left(vett(0), 1) 
         oldPar = par.Cod 
         If par.Cod <> oldPar Then 
          paragraphs.Add(par) 
         End If 
        End If 
        If grid(r, 3).Text.Length > 255 Then 
         par.Description = grid(r, 3).Text.ToString.Substring(0, 252) + "..." 
        Else 
         par.Description = grid(r, 3).Text.ToString 
        End If 
        paragraphs.Add(par) 
        stringPar = par.Description 

       Case 1 

        flag = 2 
        id = id + 1 
        c_Voc = voc.Cod_Chapter 
        p_Voc = voc.Cod_Paragraph 
        voc.Cod_Chapter = grid(r, 1).Text.Substring(0, 1) 
        voc.Cod_Paragraph = grid(r, 1).Text.Split(".")(0) 
        voc.Cod_Voice = Right(vett(0), 2) 
        If grid(r, 3).Text.Length > 255 Then 
         voc.Description = grid(r, 3).Text.ToString.Substring(0, 252) + "..." 
        Else 
         voc.Description = grid(r, 3).Text.ToString 
         If voc.Description.EndsWith("-") Then 
          a = Replace(voc.Description, "-", "") 
          voc.Description = a 
         End If 
        End If 
        stringVoice = voc.Description 
        voices.Add(voc) 
        voices.Save_DB(dbDest) 

       Case 2 
        flag = 3 
        id = id + 1 
        sVoice = New cVoice 
        oldSvoice = voice.Cod_SVoice 
        sVoice.Cod_SVoice = Left(vett(0), 2) 

        If sVoice.Cod_SVoce <> oldSvoice Then 
         voices.Add(sVoice) 
         voices.Save_DB(dbDest) 
        End If 

        If grid(r, 3).Text.Length > 255 Then 
         sVoice.Description = grid(r, 3).Text.ToString.Substring(0, 252) + "..." 
        Else 
         sVoice.Description = grid(r, 3).Text 
        End If 
        stringSvoice = sVoice.Description 

        sVoice.Cod_Voce = Left(vett(0), 5) 
        sVoice.Price1 = grid(r, 12).Text 
        sVoice.Price2 = sVoice.Price1 
        sVoice.UniMi = grid(r, 11).Text 
        sVoce.Sep = "." 
        voices.Add(sVoce) 
        voices.Save_DB(dbDest) 

      End Select 

     Else 
      If flag = 1 Then 
       stringChap = grid(r, 3).Text 
       chap.Description = stringChap & grid(r, 3).Text 
       stringPar = grid(r, 3).Text 
       paragraph.Description = stringPar & grid(r, 3).Text 
      End If 

      If flag = 2 Then 
       stringVoice = grid(r, 3).Text 
       voc.Description = voc.Description & stringVoice 
       voices.updateDB(dbDest, stringVoice, id) 
       voices.Add(voc) 
      End If 

      If flag = 3 Then 
       stringSvoice = grid(r, 3).Text 
       sVoice.Description = stringSvoice & grid(r, 3).Text 
       voices.Add(sVoice) 
      End If 
      chapter.Save_DB(dbDest) 
      paragraph.Save_DB(dbDest) 
      voice.Save_DB(dbDest) 
     End If 
    Next 

EDIT2ためにここに投稿

EDIT Iは整数とコード列は、値を有する次いで、ID = ID + 1がIDを宣言しました。このようにして、私は常にどの行を修正しなければならないかを知っています。私はupdateDBも変更しました(今は3つのパラメータを使用しています)、WHERE条件をクエリに追加しました。更新にもかかわらず、何も変更されていません

+0

まず、モジュールの上に 'Option Explicit'を入れてデバッグしようとします。コードのどの部分が正しくないかがわかります。 – Vityata

+0

しかし、私はどこにエラーがあるか知っています。私がupdateDBを呼び出すとき、私はForに入っていて、インデックスが3ならば、私は3番目の行を更新します。私は前の行を更新する方法を知らない。私のコードは現在の行でのみ動作します – Matteo

答えて

1

データベースでは、PrimaryKeyなしでレコードを保存することはできません(実際は可能ですが、悪い考えです)。あなたのソリューションIDは実際にはExcelの行番号です(私は間違っているがコードから見える場合は申し訳ありません)。将来(ユーザーが説明行を追加または削除する場合)にそれを維持することは非常に難しいかもしれません。 ID列をテキストに変更し、コードをPKとして使用する方がよいでしょう。 説明を格納する2つの方法で解決することができました。

1)説明を含むすべての行を1つの変数に連結し、その間にvbNewLineを追加し、説明フィールドに格納します。

2)より多くのリレーショナルでありながらより複雑な - PKとの記述のための第2のテーブル、すなわちautonumber、メインテーブルを参照するForeignKeyコードを作成する。メンテナンスは非常に複雑です。努力する価値はありません。

コードの変更量はかなり大きいので、残念ながら固定コードは提供しませんが、わかりやすかったです。

BTW:説明が更新されない理由は、あなたの投稿に記載されています。コードを持つ行の一つ

UPDATE Voice SET Description = '" + v.Description + "' WHERE id= '"+id+"' 

セカンド - コードが存在する場合にのみあなたはので、すべての説明フィールドは、あなたのコード内= 1.最も簡単な修正は2つの更新ステートメントを作成することですIDを持っている最初のグループから、IDを増加していますコードなし行の場合:

UPDATE Voice SET Description = Description + CHAR(13) + CHAR(10) + '" + v.Description + "' WHERE id= '"+id+"' 
+0

IDの増分は正しいです。私がPKのようなIDを持っていないなら、私は必然的に宣言する必要がありますか?あなたのヒントを使ってコードを修正しようとします – Matteo

+0

これは必ずしも良いことではありません。そして、コードはあなたのケースでもっと現実的なPKのように思えます(将来、誰かが行を再配置するでしょうか?)。しかし、イドもOKです。主なものは、1つのデータベースレコードでは、Excelからの完全なデータ(多くの説明行を含む)を格納するか、より複雑なデータモデルについて考える必要があります。 – smartobelix

関連する問題