Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Anfügeabfrage oder Aktualisierungsabfrage??

Begonnen von Q9000, Januar 01, 2011, 15:59:33

⏪ vorheriges - nächstes ⏩

Q9000

Hallo Leute,

ein frohes Neues allen wünsche!!  :D

Okay, ich bin dem Rat der Experten gefolgt und habe meine Daten anstatt mit einer verknüpften Tabelle in eine eigene Tabelle in Access geholt.
Das Ergebnis ist ein super Geschwindigkeitsgewinn. Klasse!

Aber wie halte ich meine Tabelle nun mit den neuesten Daten aktuell? Welcher Abfragetyp ist praktikabler?

Die bestehenden Daten bleiben immer unverändert und es kommen nahezu täglich Neue hinzu.

Wenn ich eine Anfügeabfrage nehme, wie mache ich ihr klar, welche Daten neu sind?
Wenn ich eine Aktualisierungsabfrage nehme, muß ich in zwei Schitten gehen, erst alles löschen und dann alle Daten neu einschreiben. Oder?

Wie macht ein Profi das? Über ein Makro?

Danke!

Viele Grüße Günter


database

#1
Hallo,

auch dir ein gutes Neues Jahr!

ZitatDie bestehenden Daten bleiben immer unverändert und es kommen nahezu täglich Neue hinzu.
Gibt eigentlich schon die Antwort auf die Frage.

Wie du nun der Abfrage klar machst, welche Daten sie anhängen soll hängt von mehereren Parametern deiner Gegebenheiten ab.
Kommen aus der zu importierenden Datenmenge EINDEUTIGE Kennzeichen mit, also z.B. ein Primärschlüssel, kann sich Access an diesem orieniteren und nur jene Datensätze einlesen,
die noch nicht in der Tabelle vorhanden sind.

Es gibt natürlich auch die Möglichkeit die alte Tabelle ganz zu verwerfen und die neue, geänderte Tabelle wieder unter dem alten Namen zu importieren.
Die Datenbank sollte dann aber regelmäßig komprimiert werden um eine ungebührliche Vergrößerung (Dateigröße) hintan zu halten. .... wenn du noch mit Access 2003 arbeitest - sieh mal da rein:
http://www.donkarl.com?FAQ6.6
...oder die Option 'Beim Schließen komprimieren' verwenden - geht auch bei Access 2007

Wie hast du ...
Zitatmeine Daten anstatt mit einer verknüpften Tabelle in eine eigene Tabelle in Access geholt
... das bisher bewerkstelligt?

Q9000

Hallo Peter,

danke Dir.

Ja bisher kamen die Daten aus einer verknüpften DBASE Datei in der sie aktuell sind. Leider wird das zu langsam.

Ein eindeutiges Feld habe ich wohl nicht. Ein Datumsfeld, der Rest sind Meßergebnisse und Bezeichnungen ....

Wenn ich jetzt ein Makro nehme, alle Datensätze löschen lasse und dann per Anfügeabfrage alle neu einschreibe, ist das ein guter Weg?

Gruß Günter

database

Hallo Günter,

vergiß Makros ...  :-\

Erzeuge einen Button auf einem Formular und dann schreib ins Klick-Ereignis z.B.



Private Sub cmdDeinButton_Click()

    'Access-Meldungen abstellen
    DoCmd.SetWarnings False
    'Deine aktuelle Tabelle entleeren
    DoCmd.RunSQL "DELETE FROM DeineTabelle"

    'Mittels Transfer-Befehl die aktuellsten Daten holen

    DoCmd.TransferDatabase acImport, "dBase IV", "DeinLaufwerk:\UndVerzeichnisMitDerDBase\", acTable, _
                           "Dateiname.dbf", "DeineAccessTabelle"

    'Access-Meldungen wieder zulassen
    DoCmd.SetWarnings True
 
End Sub


Versuch das mal, ich denke dass das funktionieren sollte ...  ;)

Q9000

Hallo Peter,

wenn das funktioniert, das wäre ziemlich genial!!!!  :)

Aber: Der Dateipfad zum Einlesen der Daten

ist natürlich auf meinem Laptop ein anderer als im Firmennetzwerk.

Die Ursprungsdaten sind in der verknüpften (DBASE) Tabelle Waage_X in meiner Datenbank!

Wie ist denn der Pfad zur eigenen Datenbank/Tabellen/Waage_X ???? Der muß doch auch erreichbar sein???!!!!

Das wäre die perfekte Lösung!!!

Weiß das jemand?!?

GlG Günter

DF6GL

Hallo,


wieso ist der Pfad unterschiedlich?



Wenn die Daten (DBase-Dateien)   im Firmennetzwerk liegen, dann ist der Pfad von überall her immer gleich, solange die Verzeichnisse  auf jedem Rechner auch gleich gemappt sind. Wenn die Zuordnung eines Netzwerkpfades zu einem Laufwerksbuchstaben nicht überall gleich ist, kannst Du auch anstelle des Laufwerkbuchstabens  den UNC-Pfadnamen verwenden, z. B.:


\\DeinServername\LaufwerkAufDemServer\DeinDBverzeichnis\DeineDBaseDatei.dbf







database

#6
Hallo Günter,

ich hoffe, wir reden hier nicht von ZWEI unterschiedlichen Dingen gleichzeitig...

1. Befindet sich die besagte dBase-Datei in einem Verzeichnis auf deinem LapTop?
   1. 1.  Wenn JA - als Kopie in einem Verzeichnis?
   1. 2.  Wenn JA - als Verknüpfung zu einem Original im Firmennetz?

2. Befindet sich in deiner ACCESS - Datenbank auf deinem LapTop eine verknüpfte dBase-Tabelle?
   2. 1. Wenn JA - verknüpft mit der Datei auf DEINEM Rechner?
   2. 2. Wenn JA - verknüpft mit dem Original im Firmennetz?

Mein Lösungsvorschlag kreist um 1, konkret 1. 1.
Trifft 1. 2. zu musst du den Vorschlag von Franz in den Transfer-Befehl übernehmen

also statt
"DeinLaufwerk:\UndVerzeichnisMitDerDBase\"

dann eben

"\\DeinServername\LaufwerkAufDemServer\DeinDBverzeichnis\"

Wenn aber die Punkte unter 2 für dich zutreffen KÖNNTEST du mittels


SELECT WAAGE_X.* INTO ACC_Waage_X
FROM WAAGE_X;


die Daten aus der verknüpften dBase Tabelle in eine Access Tabelle (ACC_Waage_X) importieren und brauchst den TransferBefehl gar nicht
In jedem Fall ist die Access-Tabelle natürlich vorher zu entleeren!

Umgelegt auf meinen Codevorschlag schaut das dann so aus:


Private Sub cmdDeinButton_Click()

   'Access-Meldungen abstellen
   DoCmd.SetWarnings False

   'Deine aktuelle Tabelle entleeren
   DoCmd.RunSQL "DELETE FROM DeineAccessTabelle"

   'Mittels Transfer-Befehl die aktuellsten Daten aus einem Verzeichnis auf deinem Rechner holen
   'DoCmd.TransferDatabase acImport, "dBase IV", "DeinLaufwerk:\UndVerzeichnisMitDerDBase\", acTable, _
                          "Dateiname.dbf", "DeineAccessTabelle"

    'Mittels Transfer-Befehl die aktuellsten Daten aus einer Freigabe am Server holen
   'DoCmd.TransferDatabase acImport, "dBase IV", "\\DeinServername\Freigabename\", acTable, _
                          "Dateiname.dbf", "DeineAccessTabelle"

    'Mittels Transfer-Befehl die aktuellsten Daten aus einem Verzeichnis auf einem Server holen
   'DoCmd.TransferDatabase acImport, "dBase IV", "\\DeinServername\LaufwerkAufDemServer\DeinDBverzeichnis\", acTable, _
                          "Dateiname.dbf", "DeineAccessTabelle"

   'Daten der verknüpften dBase Datei in der eigenen Datenbank aktualisieren
   'DoCmd.RunSQL "SELECT NameDerVerknüpftenDBaseTabelle.* INTO DeineAccessTabelle FROM NameDerVerknüpftenDBaseTabelle;"

   'Access-Meldungen wieder zulassen
   DoCmd.SetWarnings True
 
End Sub



Gaensi

Hallo Günter,

habe mal den Code von Peter zwecks variabler Dateinamen und -pfade noch etwas modifiziert

Private Sub cmdDeinButton_Click()

    'Access-Meldungen abstellen
    DoCmd.SetWarnings False
    'Deine aktuelle Tabelle entleeren
    DoCmd.RunSQL "DELETE FROM DeineTabelle"

    '
    Dim file as string
Dim imp_file As String
Dim imp_pfad as string
    Dim myfd As FileDialog
    Set myfd = Application.FileDialog(msoFileDialogFilePicker)
    myfd.AllowMultiSelect = False
    myfd.InitialView = msoFileDialogViewDetails
    myfd.InitialFileName = "C:\"
    myfd.Filters.Add "DBASE", "*.dbf", 2
myfd.FilterIndex = 2
    myfd.Show
For Each myfile In myfd.SelectedItems
    file = myfile
    Next
imp_pfad = get_pfad(file)
imp_file = get_file(file)
'Mittels Transfer-Befehl die aktuellsten Daten holen
    DoCmd.TransferDatabase acImport, "dBase IV", imp_pfad, acTable, _
                           imp_file, "DeineAccessTabelle"

    'Access-Meldungen wieder zulassen
    DoCmd.SetWarnings True
 
End Sub


Private Function get_pfad(einstr as string)
'holt nur Pfad ohne filename
Dim laenge As Double
Dim bis As Double
laenge = Len(einstr)

For i = laenge To 1 Step -1
    If Mid(einstr, i, 1) = "\" Then
        bis = i
        laenge = laenge - i
        Exit For
    End If
Next i
get_pfad = Mid(einstr, 1, bis)

End Function


Private Function get_file(einstr As String)
'holt nur filename ohne Pfad
Dim laenge As Double
Dim bis As Double
laenge = Len(einstr)

For i = laenge To 1 Step -1
If Mid(einstr, i, 1) = "\" Then
bis = i + 1
Exit For
End If
Next i
get_file = Mid(einstr, bis, laenge)
End Function
Kommt Moses nicht zum Berg, muss der Berg eben zu Moses

Q9000

Hallo Leute, danke,

puhh das liest sich aber ziemlich kompliziert für mich. Wäre da ein Makro mit Aktualisierungsabfrage nicht viel einfacher gewesen?

Ich versuche noch einmal die Ausgangslage zu erläutern:

- Auf meinem Laptop ist eine Kopie der Waage_x.dbf (Darin sind alle Daten enthalten)
- diese ist als verknüpfte Tabelle in meiner Datenbank

Wenn die Datenbank nun in der Firma installiert wird, braucht nur die Verknüpfung zur original Waage_X.dbf neu hergestellt zu werden und schon läuft alles! (1 einziger Schritt)

Da dies aber zu langsam arbeitet:

- habe ich jetzt die Daten in die neue (interne) Tabelle WAAGE geholt um die Datenbank zu beschleunigen. Nun muß ich aber möglichst anwenderfreundlich dafür sorgen, dass die Daten der Waage bei Bedarf einfach über die original Waage_X.dbf aktualisiert werden können.
Und das soll funktioneren sobald die Verknüpfung der Waage_x zur Originaldatei hergestellt wird. Es soll bei dem 1 Schritt Verfahren bleiben!

Jetzt kommt aber noch ein kleines Problem für mich. Ich will nur ein paar ausgewählte Felder haben. Der Rest ist für mich überflüssig und daher bremsend für die Datenbank.
Ich muß also in dem Skript genau die Felder bezeichnen, die ich haben will.

Ich hoffe, ich habe Euch jetzt nicht schwindelig geschrieben!  ???

Danke!

LG Günter


Gaensi

Hallo Günter

Zitatpuhh das liest sich aber ziemlich kompliziert für mich. Wäre da ein Makro mit Aktualisierungsabfrage nicht viel einfacher gewesen?


einfach ausprobieren  :-X

ZitatDa dies aber zu langsam arbeitet

dann vergiss die Verknüpfung

ZitatNun muß ich aber möglichst anwenderfreundlich dafür sorgen, dass die Daten der Waage bei Bedarf einfach über die original Waage_X.dbf aktualisiert werden können.

Also kommen wir zum Code:
ich gebe zu, dass das als ganzes etwas schwierig ist, deshalb ein Erklärungsversuch:
Private Sub cmdDeinButton_Click()
Access-Meldungen abstellen   
DoCmd.SetWarnings False   
Deine aktuelle Tabelle entleeren   
DoCmd.RunSQL "DELETE FROM DeineTabelle"    
Diverse Variablen generieren
Dim file as string
Dim imp_file As String
Dim imp_pfad as string   
Dim myfd As FileDialog

hier wird der File Dialog konfiguriert
File Dialog ist nichts anderes als das Office-eigene Menue "Datei öffnen" 
Set myfd = Application.FileDialog(msoFileDialogFilePicker)   
myfd.AllowMultiSelect = False   
myfd.InitialView = msoFileDialogViewDetails   
myfd.InitialFileName = "C:\"   
myfd.Filters.Add "DBASE", "*.dbf", 2
myfd.FilterIndex = 2   
myfd.Show
For Each myfile In myfd.SelectedItems
 
hier wird die selektierte Datei übergeben
file = myfile   
Next
   
die selektierte datei wird aufgeteilt in "Pfad und File, weil Docmd.transfer das so haben möchte,....
imp_pfad = get_pfad(file)
imp_file = get_file(file)
   
 
....und wird somit variabel. Egal ob auf Laptop oder in der Firma
Mittels Transfer-Befehl die aktuellsten Daten holen
DoCmd.TransferDatabase acImport, "dBase IV", imp_pfad, acTable, imp_file, "DeineAccessTabelle"   
Access-Meldungen wieder zulassen   
DoCmd.SetWarnings True 
End Sub


das ist eine separate Function die den Filenamen aus dem Pfad holt:
Private Function get_file(einstr As String)
Dim laenge As Double
Dim bis As Double
laenge = Len(einstr)
For i = laenge To 1 Step -1
If Mid(einstr, i, 1) = "\" Then
bis = i + 1
Exit For
End If
Next i
get_file = Mid(einstr, bis, laenge)
End Function

das ist eine separate Function die nur den Pfad ohne Dateiname holt:

Private Function get_pfad(einstr as string)
Dim laenge As Double
Dim bis As Double
laenge = Len(einstr)
For i = laenge To 1 Step -1   
If Mid(einstr, i, 1) = "\" Then       
bis = i           
Exit For   
End If
Next i
get_pfad = Mid(einstr, 1, bis)
End Function


um die Feldnamen zu löschen, sollte man wissen, ob die immer gleich benamst sind.
wenn ja dann könnte man es "Hardcoden", wovon ich allerdings kein Freund bin...
...nichts schlimmeres als Strukturänderungen >:(

Gruß Gaensi
Kommt Moses nicht zum Berg, muss der Berg eben zu Moses