Primary Key via code

Status
Niet open voor verdere reacties.

so10070

Gebruiker
Lid geworden
4 feb 2014
Berichten
424
Ik tracht aan een geïmporteerde spreadsheet een nieuwe kolom toe te voegen. Dit moet een primary key zijn. Maar krijg deze foutmelding: "Definitie van index of veldrelatie bevat ongeldige definitie van DID" (fout: 3409). Hier ontstaat de fout: .Indexes.Append idxPK. Hierbij de code.
Code:
Private Sub cmbImport_Click()
    Dim sqlDelete As String
    Dim sqlPK As String
    
    If MsgBox("Let wel op: alle bewaarde gegevens gaan onherroepelijk verloren", vbYesNo, "Verwijderen van records") = vbYes Then
        Dim db As Object 'late binding
        Dim tdf As Object 'late binding
        Dim idxPK As Object 'late binding
        
        DoCmd.DeleteObject acTable, "Diversiteitscodes"
        DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, "Diversiteitscodes", "C:\Diversiteit\Te importeren Excel\Controlerapport Diversiteitscode.xlsx", True
        
        'toekennen van primary key
        Set db = CurrentDb()
        Set tdf = db.TableDefs("Diversiteitscodes")
        Set idxPK = tdf.CreateIndex("PrimaryKey")

        With tdf
            With idxPK 'index toevoegen aan de indexcollectie van tabel
                .Fields.Append .CreateField("DID")
                .Primary = True
            End With
            .Indexes.Append idxPK
        End With

        Set db = Nothing
        Set tdf = Nothing
        Set idxPK = Nothing
    End If
End Sub
 
Wat is het nut van dat sleutelveld? Het is een importtabel, dus de gegevens kunnen nooit gerelateerd zijn aan andere tabellen in je database. Hooguit zijn er velden die gerelateerd zijn aan een PK uit een andere tabel. Dus, als je de sleutel toch niet nodig hebt voor koppelingen, kun je net zo makkelijk (of veel beter zelfs) de tabel [Diversiteitscodes] eerst leegmaken voordat je importeert. Dan heb je hetzelfde resultaat, maar dan beter omdat je bij het verwijderen van de tabel ook de opmaak kwijt bent. Als je de tabel [Diversiteitscodes] eenmalig goed opmaakt, heb je bij de volgende imports nog steeds de eerder ingestelde opmaak. En daar heb je meer aan dan aan een nietszeggend sleutelveld. En by the way: als je in die tabel een sleutelveld maakt (met Autonummering neem ik aan) dan blijft dat ook gewoon staan.
 
Je hebt gelijk. Het is niet nodig dat sleutelveld in deze tijdelijke tabel aan te maken. Maar de theoretische kwestie blijft hangen: er wordt daar een fout gegenereerd die ik niet begrijp! :(
 
Ik snap 'm wel: de techniek is volgens mij fout. Je wilt een PK toevoegen aan een bestaande tabel. De belangrijkste eigenschap van een uniek veld is, dat het (jawel) unieke waarden bevat. Als je aan een bestaande tabel een veld toevoegt, kan daar nooit wat in staan, het veld bestond immers nog niet. Een leeg veld kan en mag nooit een PK zijn.
 
Ok, ik begrijp het: beter - zoals je eerst vermeldde - een standaard lege tabel (structuurtabel) die telkens aangevuld wordt met gegevens. :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan