Data importeren van andere access 2010 database

Status
Niet open voor verdere reacties.

john64

Gebruiker
Lid geworden
12 jun 2011
Berichten
268
Goedemorgen,

Een aantal maanden geleden heb ik een database gemaakt voor ons bedrijf. Nu we er een tijdje mee gewerkt hebben zijn er wat verbeterpunten aangegeven .
Ik heb op basis van die oude database een nieuwe database gemaakt, en deze wil ik vullen met data uit de oude.
Een aantal tabellen zijn gelijk gebleven, sommige hebben extra velden gekregen, of anders benoemd.

Hoe kan ik in mijn nieuwe database gegeven halen uit een andere, en daarbij gelijk evt. nieuwe velden vullen met een default waarde.
Als ik de toevoegquery bekijk heb ik een mogelijkheid om records toe te voegen aan een bestaande tabel in aan andere database, maar ik zie geen mogelijkheid om een tabel in de "eigen database" te vullen vanuit de oude db.

Misschien is het alleen mogelijk m.b.v. VBA ?

Data exporteren heb ik gedaan met:
Code:
dbDoel = "'.\DATA Register - TE VULLEN.accdb'"

'Vullen tabel tblKlant
strSQL = "INSERT INTO tblKlant ( KlantID, Klant )" & _
                " IN " & dbDoel & _
                " SELECT tlkpKlant.KlantID, tlkpKlant.Klant" & _
                " FROM tlkpKlant"
DoCmd.RunSQL (strSQL)

Deze tabel kan 1-op-1 overgezet worden. Maar hoe kan ik bij andere tabellen nieuwe velden vullen in de andere database?

Vandaar dat ik dacht, misschien moet ik andersom werken, en de data importeren vanuit de andere database, waarbij ik nieuwe velden kan vullen met een waarde ?
Ik zou dus eigenlijk moeten werken met een 'dbBron' i.p.v. 'dbDoel'

Iemand een idee ?


mvg
John
 
Als ik de toevoegquery bekijk heb ik een mogelijkheid om records toe te voegen aan een bestaande tabel in aan andere database, maar ik zie geen mogelijkheid om een tabel in de "eigen database" te vullen vanuit de oude db.
Ik zie dat niet zo als een probleem. Ik neem aan dat je de tabelnamen in je nieuwe db niet hebt veranderd en dus alleen aanpassingen/uitbreidingen hebt gemaakt. In dat geval zou ik de oude tabellen koppelen in de nieuwe db. Ze krijgen dan dezelfde naam met een cijfer, want ze kunnen natuurlijk niet dezelfde naam krijgen als bestaande tabellen. Vervolgens maak je toevoegqueries, en voer je die allemaal 1 x uit.
Je kunt dat zelfs nog automatiseren als dat heel veel tabellen zijn, want je kunt door de tabellencollectie lopen en op basis van bestaande 'koppeltjes' Insert queries maken. Je hoeft verder geen velden te weten namelijk, want die zijn toch identiek.
 
Niet alle tabellen hebben zelfde naam, en niet alle velden zijn identiek. Sommige hebben een wat meer logischer naam gekregen. Er zijn andere tabellen bijgekomen die een relatie hebben met uit de oude tabel over te nemen tabellen, enz.

Code:
    dbBron = "'.\DATA Certificaatregister CI.accdb'"
    
    'Vullen tabel tblKlant
    strSQL = "INSERT INTO tblKlant ( KlantID, Klant )" & _
                " SELECT tlkpKlant.KlantID, tlkpKlant.Klant" & _
                " FROM tlkpKlant" & _
                " IN " & dbBron
    DoCmd.RunSQL (strSQL)

    'Vullen tabel tblCertificaathouder
    strSQL = "INSERT INTO tblCertificaathouder ( CertificaathouderID, KlantID, Achternaam)" & _
                " SELECT tblCertificaathouder.CertificaathouderID, tblCertificaathouder.KlantID, tblCertificaathouder.Achternaam" & _
                " FROM tblCertificaathouder" & _
                " IN " & dbBron
    DoCmd.RunSQL (strSQL)

Heb het geprobeerd met bovenstaande code. Het vullen van de tabel tblKlant gaat goed. Alle records uit oude tabel worden overgenomen.
Met het vullen van tabel tblCertificaathouder gaat het fout. (dit is slechts een gedeelte van de velden van deze tabel)
Krijg een melding:
Fout 3828: er kan niet worden verwezen naar een tabel met een veld voor meerdere waarden wanneer gebruik wordt gemaakt van een IN-component die naar een andere database verwijst.
tblKlant en tblCertificaathouder zijn met een 1-op-veel relatie met elkaar verbonden.

Begrijp uit jouw reactie dat het beter is om de tabellen uit de oude database te koppelen in de nieuwe, en vandaar uit toevoegqueries te maken naar tabellen in de nieuwe database (in dat geval zijn zowel de oude als de nieuwe tabellen beschikbaar in dezelfde database). Na het uitvoeren van alle toevoegqueries, kunnen de gekoppelde tabellen weer verwijderd worden. Is dit correct ?

Als dat laatste het geval is, welke VBA code zou ik dan kunnen gebruiken om geautomatiseerd alle tabellen uit de bron-database te koppelen aan de huidige database ? Als daar code voor beschikbaar is, dan zal ik met VBA en SQL-code de diverse tabellen vullen. Daarna wil ik de gekoppelde tabellen weer ontkoppelen/verwijderen (ook weer met VBA). Is dat mogelijk ?
 
Laatst bewerkt:
De foutmelding is redelijk verklarend:
Code:
Fout 3828: er kan niet worden verwezen naar een tabel met een veld voor meerdere waarden wanneer gebruik wordt gemaakt van een IN-component die naar een andere database verwijst.
Blijkbaar heb je een veld gemaakt met meervoudige waarden. Ik zou me eerst eens goed achter de oren krabben of je dat echt wel nodig hebt, en of het niet veel verstandiger is (dat is het meestal namelijk) om een eigen gekoppelde tabel voor die gegevens te maken. Je houdt je database dan namelijk netjes genormaliseerd. En wie wil dat nu niet :).
Verder doe je alles vanuit de export database, en ik zou het inderdaad allemaal vanuit de nieuwe database doen met koppelingen. Maakt voor je queries niets uit. Daarvoor hoef je dan ook niks te programmeren; gewoon een toevoegquery maken, alle velden uit de bron erheen jassen, kijken welke velden niet matchen (die hebben een andere naam gekregen) en handmatig koppelen en draaien maar. Ben je zeker 5 keer zo snel klaar als dat je alles in VBA gaat schrijven.
 
Probleem is (of uitdaging, is maar hoe je er tegenaan kijkt ;)), dat deze oorspronkelijke database bij 3 verschillende klanten (stand-alone) draait).
Om deze nieuwe versie uit te rollen en hun bestaande data te importeren in de nieuwe db, wil ik universele code gebruiken om de data in te lezen. Vandaar dat ik dacht om dit met VBA te doen (ook weer een leermomentje om kennis VBA te vergroten)
Uitgevogeld dat een tabel koppelen gaat met
Code:
dbBron = ".\DATA Certificaatregister CI.accdb"
txtApp = "Microsoft Access"

DoCmd.TransferDatabase acLink, txtApp, dbBron, acTable, "tlkpKlant", "tmp_tlkpKlant", False
'hier code om andere tabellen te koppelen

Er is vast ook wel een mogelijkheid om d.m.v. een loop in 1 keer alle tabellen te koppelen door alle tabledefs uit te lezen ? Maar zover ben ik helaas nog niet ... (misschien een kleine hint ?)
 
Er is vast ook wel een mogelijkheid om d.m.v. een loop in 1 keer alle tabellen te koppelen door alle tabledefs uit te lezen ? Maar zover ben ik helaas nog niet ... (misschien een kleine hint ?)
Beter nog: bruikbare code :).

Code:
Function fGetTables() As Collection
Dim collTables As New Collection
Dim tdf As TableDef
    Set db = CurrentDb
    With CurrentDb
        .TableDefs.Refresh
        For Each tdf In .TableDefs
            With tdf
                collTables.Add Item:=.Name & .Connect, Key:=.Name
            End With
        Next
        Set fGetTables = collTables
        Set collTables = Nothing
        Set tdf = Nothing
    End With
    Set db = Nothing
End Function

Function CheckTables()
Dim i As Integer
Dim strTbl As String
Dim collTbls As Collection
    Set collTbls = fGetTables
    For i = collTbls.Count To 1 Step -1
        strTbl = fParseTable(collTbls(i))
        MsgBox strTbl
    Next i

End Function

Code:
Function fParseTable(strIn As String) As String
    If Left(strIn, 4) = "MSys" Then fParseTable = strIn Else: fParseTable = Left$(strIn, InStr(1, strIn, ";") - 1)
End Function

Code:
Function fGetTables() As Collection
Dim collTables As New Collection
Dim tdf As TableDef, db As Database
    Set db = CurrentDb
    With db
        .TableDefs.Refresh
        For Each tdf In .TableDefs
            With tdf
                collTables.Add Item:=.Name & .Connect, Key:=.Name
            End With
        Next
        Set fGetTables = collTables
        Set collTables = Nothing
        Set tdf = Nothing
    End With
    Set db = Nothing
End Function
 
In een andere vraag lang geleden (2009 :)), werd er een vraag gesteld over een fout die optreedt bij een toevoegquery (http://www.helpmij.nl/forum/showthr...y-INSERT-INTO-kan-geen-opzoekveld-voor-meerde)
Toevoegquery met foutmelding: In de query INSERT INTO kan geen opzoekveld voor meerdere waarden worden opgenomen.

Je gaf toen als antwoord
Speciaal voor die stakkers die wèl met 2007 werken, heb ik me er toch maar in verdiept... Jouw bijwerkquery loopt spaak op de bijlage-velden. Als je die weghaalt, gaat het prima.
Ik vraag me überhaupt af waarom je de afbeeldingen in de database wilt opslaan, want dat gaat je wel een paar gieg kosten... Je kunt beter een koppeling opslaan naar de afbeeldingen.

Michel
Ik denk dat ik nu het zelfde heb. Ik heb aantal tabellen waarin een bijlage (bijv. een logo, of een ingescande handtekening) opgenomen is. In formulieren heb ik afgedwongen dat er slechts 1 record in deze tabel opgenomen kan worden. Hoe kan ik deze bijlage(n) toch overnemen in de nieuwe tabel? Of kan ik, als ik een link naar een jpg bestand opneem, dit bestand ook laten zien op een formulier ? Zo ja hoe ?

(als ik hiervoor een nieuwe vraag moet starten, please let me know - het gaat wel allemaal over importeren van ene database naar andere)
 
En daar sta ik nog steeds achter :). Bijlagen en plaatjes horen niet in een database maar in aparte mappen waar je met tekstvelden naar verwijst.
Hoe je dat doet, komt regelmatig voorbij op het forum; moet te vinden zijn!
 
Tip voor een volgende keer: herbenoem geen velden... waarom? Als je er perse een ander veld bij wilt hebben dat er qua naam op lijkt geef je hem een kleine herkenbare toevoeging. Of... wil de klant dat..? Beseft ie wel dat ie mogelijk toch uiteindelijk voor dat extra werk toch betaald....
En het is toch bij een database noodzakelijk om unieke veldnamen te hebben... dat maakt een database juist zo speciaal, dus veldnamen veranderen is vragen om verwarring en problemen.

Hoe goed heb je dit allemaal gedocumenteerd... zodat later iemand die het overneemt nog snapt wat je uitgespookt hebt...?
 
André,
Ik heb eigenlijk de database opnieuw opgezet, dus van scratch aan begonnen. De data van de eerste database moet niet verloren gaan, vandaar dat ik op één of andere manier deze data wil converteren, en naar de juiste tabellen in de nieuwe database verplaats. Ik ben al bezig met VBA script om dit te automatiseren, want zoals gezegd zijn er 3 standalone versies op 3 verschillende locaties, elk met dezelfde frontend, maar eigen backend, en dus eigen data.
In de nieuwe database is alles gedocumenteerd, zodat duidelijk is / zou moeten zijn, wat waar gebeurt :)

Ik heb in mijn database (t.b.v. registratie certificaathouders) voor iedere certificaathouder een eigen map waarin de gebruiker verschillende soorten documenten kan opslaan (correspondentie, kopie certificaten, etc.)
Ik snap jullie betoog over opnemen van bijlagen in een database, gezien de multi-valued eigenschap hiervan (ondanks dat access wel systeemtabellen aanmaakt, waardoor de database wel genormaliseerd blijft)

In de oude database hebben gebruikers dus wel bijlagen toegevoegd. Als ik in mijn nieuwe versie die bijlagen eruit wil halen moeten die bijlagen natuurlijk niet verloren gaan. Is er VBA code beschikbaar om de bijlage uit de database te halen en op te slaan in een specifieke map. Per certificaathouder is er een eigen map, hoe ik daar iets in moet opslaan is bekend, maar hoe ik een bijlage uit een database moet filteren; geen idee.
Hebben jullie ideeën hierover ?

En is het ook mogelijk de inhoud van een jpg bestand te tonen in de database als plaatje op een formulier, ook al opgeslagen hyperlink vanuit de database naar de harde schijf?
 
ondanks dat access wel systeemtabellen aanmaakt, waardoor de database wel genormaliseerd blijft
ik vind dat een vorm van schijnnormalisatie. Om te beginnen ben je alleen compatibel met Access versies dus als je ooit wilt upgraden naar bijv. SQL Server (Express) dan ben je in de aap gelogeerd. Verder zijn het interne tabellen waar je nauwelijks bijkomt.
Plaatjes tonen vanuit een map op een formulier is, zoals ik al eerder zei, een onderwerp dat hier regelmatig aan bod komt. Met voorbeelden :).
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan