UPDATE tabel1 vanuit tabel2 met alle velden die tabel2 bevat?

Status
Niet open voor verdere reacties.

PieterJanVdb

Gebruiker
Lid geworden
10 jan 2011
Berichten
7
Allen,

Ik geraak er niet uit en vind ook nergens een antwoord op internet.
Ik werk met Microsoft Access 2007.

Ik heb een redelijk grote database met verschillende (grote) tabellen met heel veel velden (100+ velden). Op regelmatige basis moet hierbij info aangevuld worden in bestaande tabellen, deze info is beschikbaar als een Excel-bestand. Ik heb al een Form gemaakt waarbij ik het Excel-werkblad importeer in een tijdelijke tabel. Nu moet deze tabel samengevoegd worden met de juiste tabel, maar het gaat altijd over andere velden.

Ik geef een voorbeeld, ik stel als voorbeeld een tabel "weer", met als velden "datum", "plaats", "temperatuur", "druk", "neerslagtype", "neerslaghoeveelheid", "grondtemperatuur", "windrichting", "windsterkte", "dauwpunt", ...
Vervolgens wil ik dan nieuwe gegevens aanvullen, bijvoorbeeld een Excel-bestand met als data "datum", "plaats", "neerslagtype" en "temperatuur". Eerst importeer ik alles in een tijdelijke tabel "temp".

Ik heb dan al volgende SQL:
Code:
UPDATE weer, temp
SET weer.neerslagtype=temp.neerslagtype, weer.temperatuur= temp.temperatuur
WHERE weer.datum=temp.datum AND weer.plaats=temp.plaats

Nu, dat werkt allemaal fijn, maar volgende keer heb ik een Excel-bestand met als velden "datum", "plaats", "windrichting" en "windsterkte", daarna nog een andere combinatie, ....
En ik zou willen vermijden dat ik 300 verschillende queries hiervoor moet schrijven. Zeker omdat er soms wel eens een veldnaam (bijvoorbeeld "pollenconcentratie" of "bewolkingstype") bijkomt.

Ik krijg het maar niet voor elkaar om iets te maken in de stijl van:
Code:
UPDATE weer, temp
SET weer.*=temp.* (voor alle velden waar temp.* bestaat)
WHERE weer.datum=temp.datum AND weer.plaats=temp.plaats

Ter info, data mag overschreven worden, normaal gezien is die data die ik wil importeren er nog niet, hetzelfde, of nauwkeuriger in de nieuwe import.
Normaal gezien bestaat "datum" en "plaats" in de tabel "weer" al voor elke import die kan gebeuren, mocht die nog niet bestaan, dan moet die niet ingevoerd worden.

Gaat dit überhaupt wel lukken met sql of ga ik dit met VBA moeten oplossen? Andere voorstellen zijn ook zeker welkom!

Alvast bedankt voor de hulp!
 
Gaat dit überhaupt wel lukken met sql of ga ik dit met VBA moeten oplossen?
Wat denk je? :).
Je gewenste constructie is volslagen onmogelijk in een query; zodra je gaat bijwerken of toevoegen moet je aangeven welk veld in welk veld moet. Dat kun je dus nooit met een * oplossen. VBA dus.
Je zult een recordset moeten openen op basis van de Temp tabel, elke veldnaam moeten uitlezen en in een string zetten (zonder datum en plaats) en met die velden een query moeten opbouwen. Die je dan runt.
 
Het blijft nog even rustig, dus ik heb de tijd gebruikt om alvast een voorschotje te doen op een procedure die bij mij perfect werkt:
Code:
Sub TempImport()
Dim strSQL As String, sFields As String, sWhere As String
Const T1 As String = "[Weer]"
Const T2 As String = "[Temp]"
Dim rs As DAO.Recordset
Dim fld As DAO.Field

    Set rs = CurrentDb.OpenRecordset("Temp")
    With rs
        For Each fld In .Fields
            Select Case fld.Name
                Case "Datum", "Plaats"
                    If Not sWhere = "" Then sWhere = sWhere & " AND "
                    sWhere = sWhere & T1 & "." & fld.Name & "=" & T2 & "." & fld.Name
                Case Else
                    If Not sFields = "" Then sFields = sFields & ","
                    sFields = sFields & T1 & "." & fld.Name & "=" & T2 & "." & fld.Name
            End Select
        Next fld
    End With
    strSQL = "UPDATE " & T1 & "," & T2 & " SET " & sFields & " WHERE " & sWhere
    CurrentDb.Execute strSQL, dbFailOnError
End Sub
 
Yes, enorm bedankt voor de hulp!
Door een tikfoutje heeft het wel even geduurd (hij was helemaal de draad kwijt omdat ik vroeg om een UDPATE te doen! :o eer ik dat gevonden had....)

Ik verbaas me er telkens over hoe eenvoudig zo'n programma toch kan zijn. Ik heb zelf wel al een beetje VBA geschreven, maar ik vind mijn eigen code altijd zo omslachtig, zeker niet volgens de regels van de kunst! Volgende keer ga ik zeker proberen om eerst zelf de code te schrijven en ze te posten, hopelijk leer ik het dan ooit om "mooier" te programmeren.

Erg bedankt voor je tijd, moeite, ......
 
Wil je mijn eerste probeersels hebben? 'A confindence booster by any man's standard' :D.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan