geïmporteerde tabellen: relaties verbroken na update: automatisch herstellen?

Status
Niet open voor verdere reacties.

hoingkatleen

Gebruiker
Lid geworden
1 sep 2014
Berichten
87
Een nieuwe vraag: Ik heb een access-dbase van de overheid waarin info staat die ik verder wil aanvullen. Aan die dbase zelf mag ik niet prutsen, dus ik heb een nieuwe gemaakt waarin ik 2 tabellen geïmporteerd heb. Mijn eigen 3de tabel is eraan gekoppeld.
Die overheids-dbase wordt regelmatig aangevuld, dus ik moet de geïmporteerde tabellen af en toe updaten. Maar als ik dat doe, worden de relaties verbroken.
Ik had eerst gekozen voor de optie gelinkte tabellen. Maar daar kon ik geen referentiële integriteit afdwingen.

What to do best?
 
Ik zou, als je regelmatig data moet bijwerken vanuit een extern bestand, dat niet op deze manier doen. Ik zou een database maken met alle tabellen zoals je zou doen als je de db zelf zou maken. Vervolgens zou ik de externe tabellen als zelfstandige tabel (liefst onder een vaste naam, bijvoorbeeld Import_1 en Import_2) importeren. Dan staan de nieuwe/gewijzigde data uiteraard nog niet in je vaste tabellen, en daar maak je dan Toevoeg/BIjwerk queries voor. Die zorgen ervoor dat de importtabellen netjes aan de eigen tabellen worden toegevoegd.
Voordelen
1. je kunt vaste relaties leggen
2. je tabellen hebben de correcte veldopmaak; bij import is dat meestal niet het geval
3. je kunt onbeperkt importeren, want je overschrijft steeds de importtabellen
4. je kunt exact bepalen welke records er wél en welke niet moeten worden geïmporteerd
5. het proces is van a-z vastgelegd en zonder problemen te herhalen

Nadelen: zou ik niet weten :)
 
Octafish, als ik dit uitwerk, begrijp ik het toch goed dat je die Import1 en 2 (of hoe ik ze ook noem) niet zou linken met de oorspronkelijke database he? Dus dan moet er gewoon op regelmatige tijdstippen een nieuwe import gebeuren en moeten die toevoeg/bijwerkqueries worden uitgevoerd, right?
 
Dat zou ik inderdaad zo doen.
 
OK, en kan ik die geïmporteerde tabellen meteen een andere naam geven? Nu vind ik enkel terug dat ze hun naam behouden zoals in de brondatabase, of als dat al in de nieuwe dbase bestaat, dat er dan 1 achter de naam komt. Maar nergens een optie waar je een naam kan kiezen; Dus alleen handmatig op te lossen dan?
 
Als je importeert via VBA, dan kun je het importbestand zelf een naam laten bepalen. Ik heb een tijdje met een db gewerkt waarbij elke week een (zelfde) importtabel moest worden gemaakt die dan een vaste naam kreeg + de datum.
 
yes! Gelukt! IN vba zelfs!!
Ik heb nu code om eerst de nodige tabellen opnieuw te importeren en daarna de toevoeg- en bijwerkqueries uit te voeren.
Code:
DoCmd.SetWarnings False
DoCmd.DeleteObject acTable, "Tbl_R_Patient"
DoCmd.TransferDatabase acImport, "Microsoft Access", _
"pad naar de brondatabase", acTable, "Tbl_R_Patient", "Tbl_R_Patient"
DoCmd.DeleteObject acTable, "Tbl_R_Procedure"
DoCmd.TransferDatabase acImport, "Microsoft Access", _
"pad naar de brondatabase", acTable, "Tbl_R_Procedure", "Tbl_R_Procedure"

DoCmd.OpenQuery "qry_pas_eigen_data_aan_patiënt"
DoCmd.OpenQuery "qry_pas_eigen_data_aan_procedure"
DoCmd.OpenQuery "qry_voeg_meest_recente_records_toe_patiënt"
DoCmd.OpenQuery "qry_voeg_meest_recente_records_toe_procedure"

DoCmd.SetWarnings True

Die code wordt uitgevoerd zodra het hoofdformulier wordt geopend :-). Zo werk je altijd met up-to-date gegevens.

Wellicht zitten er nog beginnersfouten in, maar ik ben al trots als complete vba-leek :-D

Thanks Octafish!!!!!
 
Wellicht zitten er nog beginnersfouten in, maar ik ben al trots als complete vba-leek :-D
Succes mag je trots op zijn :). Maar ik zou wel een kleine aanpassing willen voorstellen. Je gooit nu de tabel [Tbl_R_Procedure] weg en maakt 'm opnieuw. Daarmee gooi je één van de grootste voordelen van deze procedure met het badwater weg, en dat is zonde. Bij een import worden de gegevens namelijk geïmporteerd met veldinstellingen die zelden bruikbaar zijn. Door een import tabel klaar te zetten, kun je die velden precies opmaken volgens de eisen die je aan de gegevens stelt. En als je de import dan uitvoert, heb je dus gelijk de gegevens geïmporteerd zoals je ze nodig hebt.
Mijn voorstel zou dus zijn: gooi de tabel niet weg, maar maak 'm alleen leeg. De importprocedure werkt dan verder exact hetzelfde, met bovengenoemd voordeel.
 
De vraag is nog niet als opgelost gezet dus even mijn 5 pieces of eight...
Ik doe het zoals Octafish; een formuliertje met een 5-tal knoppen (zie printscreen onderaan). Een (gekoppelde) database op deze manier updaten gaat dan heel vlug en kost maar een paar klikken, distributie naar verschillende instellingen verloopt dan vlotjes.

VBA code wat er onder de verschillende knoppen steekt
O. Koppelingsbeheer rechtstreeks openen (eventueel verbroken koppelingen herstellen voor importeren)
Code:
Private Sub CmbKoppelen_Click()
DoCmd.RunCommand acCmdLinkedTableManager
End Sub
1. Via de gewone weg alle tabellen uit de oude database importeren, daarbij worden deze tabellen geïmporteerd met een cijfer 1 erachter
Code:
Private Sub CmbImport_Click()
DoCmd.RunCommand acCmdImportAttachAccess
End Sub
2. Alle EIGEN tabellen leegmaken (als voorbeeld de tabel autorisaties genomen; spreekt vanzelf dat je de procedures moet uitbreiden voor iedere tabel)
Code:
    MySQL = "DELETE * " & "FROM autorisaties;"
    DoCmd.RunSQL MySQL
3. Alle data uit de tabellen met een 1 achter kopiëren naar de oorspronkelijke tabel
Code:
MySQL = "INSERT INTO autorisaties SELECT * FROM autorisaties1;"
            DoCmd.RunSQL MySQL
4. De geïmporteerde tabellen (die met een 1 achter dus, als ze bestaan, wegkieperen)
Code:
If Not IsNull(DLookup("Name", "MSYSOBJECTS", "Name='autorisaties1'")) Then
          DoCmd.RunSQL "DROP TABLE autorisaties1"
        End If
5. De boel via standaard beheren/comprimeren terug in zijn normale proporties brengen of je zit met een DB die dubbel zo groot is.

Addertje onder het gras; heb je in je nieuwe DB tabellen bepaalde zaken aangepast, toegevoegd in de tabel(len) dan kan het gebeuren dat je die ook eerst gelijkaardig moet doen in je importtabellen of je loopt tegen een fout aan.
 

Bijlagen

  • Adminpagina.jpg
    Adminpagina.jpg
    102,4 KB · Weergaven: 26
heel erg bedankt voor alle hulp!
Ik heb het intussen opgelost door geen knoppen te gebruiken maar gelijkaardige code achter het formulier te steken bij opstart. Dan kunnen mijn gebruikers altijd met verse data werken :-).
 
@Johan:
Je kunt je hele procedure versimpelen door gebruik te maken van de tabelcollectie. Je lust dan door alle tabellen heen waarvan de naam op 1 eindigt. In dummycode krijg je dan zoiets:
Code:
If Right(sTabel1,1)=1 then
    MySQL = "DELETE FROM " & Left(sTabel1, Len(sTabel1)-1)
    DoCmd.RunSQL "INSERT INTO " & Left(sTabel1, Len(sTabel1)-1) & " SELECT * FROM " & sTabel1
    DoCmd.RunSQL "DROP TABLE " & sTabel1
End If

Maakt je code een stuk korter en overzichtelijker. Bovendien hoef je helemaal niks te doen als je een tabel weghaalt of toevoegt.
 
Code:
DoCmd.SetWarnings False
DoCmd.DeleteObject acTable, "Tbl_R_Patient"
DoCmd.TransferDatabase acImport, "Microsoft Access", _
"pad naar de brondatabase", acTable, "Tbl_R_Patient", "Tbl_R_Patient"
DoCmd.DeleteObject acTable, "Tbl_R_Procedure"
DoCmd.TransferDatabase acImport, "Microsoft Access", _
"pad naar de brondatabase", acTable, "Tbl_R_Procedure", "Tbl_R_Procedure"

DoCmd.OpenQuery "qry_pas_eigen_data_aan_patiënt"
DoCmd.OpenQuery "qry_pas_eigen_data_aan_procedure"
DoCmd.OpenQuery "qry_voeg_meest_recente_records_toe_patiënt"
DoCmd.OpenQuery "qry_voeg_meest_recente_records_toe_procedure"

DoCmd.SetWarnings True

Ik wil hier nog eens op terugkomen want het werkt niet altijd. Ik heb een lokale kopie van het bronbestand en hier werkt dat perfect. Maar als ik mijn database bij mijn collega zet die ze moet gaan gebruiken, en we koppelen die aan haar bronbestand (identiek aan het mijne alleen zitten er al wat meer data in ondertussen), dan doet ie het niet. We hebben het juiste pad geformuleerd in de code, maar toch worden de nieuwe data niet toegevoegd in mijn database. Zit er een fout in de code?

Alvast bedankt aan wie er eens naar kan kijken!
 
Ik zie dat je nog steeds kiest voor het weggooien van je tabellen. Zul je wel een goede reden voor hebben :).
Wat gebeurt er als je stapsgewijs door de code loopt?
 
Zou ik eens moeten uittesten. Probleem is dat ik dat telkens op de PC van mijn collega moet uitproberen en ik kan haar er niet telkens af zwieren :-).
Ik probeer binnenkort. En als dat het probleem niet is, dan zijn het wellicht de toevoeg- en bijwerkquery's?

Ik kan hier ook moeilijk een voorbeeld opladen waar je het probleem ziet, want de brondatabase is een overheidsbestand waar ik geen rechten op heb...
 
OK, ik heb het gevonden! Er zat plots onterecht een relatie tussen de 2 geïmporteerde tabellen, na het kopiëren naar een andere PC. Geen idee hoe dat komt, maar heb die relatie terug verwijderd en nu werkt het wel :-). Fiew!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan