2017-10-05 1 views
0

Ich habe eine Excel-Datei, die einige Daten enthält, die ich in eine Access-Datenbank exportieren möchte. In der C-Spalte habe ich ein Feld namens 'Description'. Normalerweise besetzt dieses Feld nur eine Zelle, aber es kann passieren, dass es länger ist.Aktualisieren vorherige Zeile

enter image description here

In diesem Fall zum Beispiel hat AP.01 5 Reihen Beschreibung bekommt. Wie kann die erste Zeile mit den nächsten Zeilen aktualisiert werden?

Dieser Code funktioniert nicht, weil ich meine aktuelle Zeile aktualisiere, aus diesem Grund ist die UPDATE-Anweisung nutzlos. Wie kann ich meinen Code reparieren?

EDIT Ich poste hier die For-Schleife

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 Ich erklärte id As Integer und wenn Spalte Code einen Wert dann id = id + 1. Auf diese Weise weiß ich immer, welche Zeile ich ändern muss. Ich habe auch updateDB geändert (jetzt verwende ich 3 Parameter) und ich habe eine WHERE-Bedingung in meine Abfrage eingefügt. Trotz der Aktualisierung hat sich nichts geändert

+0

Beginnen Sie, indem Sie "Option Explicit" auf Ihr Modul setzen und versuchen Sie es zu debuggen. Es wird Ihnen sagen, welche Teile Ihres Codes nicht korrekt sind. – Vityata

+0

Aber ich weiß wo der Fehler ist. Wenn ich updateDB anrufe, bin ich in einem For und wenn mein Index = 3 ist, aktualisiere ich die dritte Zeile. Ich weiß nicht, wie ich eine vorherige Zeile aktualisieren soll. Mein Code funktioniert nur mit der aktuellen Zeile – Matteo

Antwort

1

In der Datenbank können Sie keine Datensätze ohne PrimaryKey speichern (eigentlich können Sie, aber es ist schlechte Idee). Da in Ihrer Lösungs-ID in der Tat Excel-Zeilennummer ist (Entschuldigung, wenn ich nicht korrekt bin, aber es sieht wie aus Code aus), könnte es sehr schwierig sein, es in Zukunft zu pflegen (falls jemand eine Beschreibungszeile hinzufügt oder entfernt). Es wäre besser, ID-Spalte in Text zu ändern und Code als PK zu verwenden. Speichern der Beschreibung könnte auf zwei Arten gelöst werden:

1) Verketten Sie alle Zeilen, die Beschreibung in 1 Variable enthalten, fügen Sie vbNewLine dazwischen hinzu und speichern Sie sie im Beschreibungsfeld.

2) Relationeller, aber auch komplexer - create 2nd Tabelle für die Beschreibung mit PK als d. H. Autonumber, ForeignKey Code bezieht sich auf Haupttabelle. Wartung wird hier sehr komplex sein. Nicht wirklich Mühe wert.

Anzahl der Änderungen im Code ist ziemlich groß, so tut mir leid, ich werde nicht festen Code bereitstellen, aber ich hoffe, die Idee ist klar.

BTW: Der Grund, warum Beschreibung nicht aktualisiert wird, ist in Ihrem Beitrag beschrieben. Sie steigen nur id, wenn der Code vorhanden ist, so dass jeder Beschreibung Feld aus der ersten Gruppe haben id = 1. Die einfachste fix im Code wäre 2 Update-Anweisungen erstellen - eine für die Zeilen mit Code

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

Zweite eine für Zeilen ohne Code:

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

Das Inkrement der ID ist korrekt. Wenn ich nicht wie ein PK ID habe, muss ich unbedingt deklarieren, oder? Ich werde versuchen, meinen Code mit Ihren Hinweisen zu ändern – Matteo

+0

Es ist kein Muss, aber gute Praxis. Und der Code scheint in deinem Fall realer PK zu sein (in Zukunft wird vielleicht jemand Zeilen neu ordnen?). Aber ID ist auch OK. Die Hauptsache ist, dass Sie in 1 Datenbanksatz vollständige Daten von Excel (einschließlich vieler Beschreibungszeilen) speichern oder über ein komplexeres Datenmodell nachdenken sollten. – smartobelix

Verwandte Themen