first,dfirst,findfirst

23/09/2008 - 11:53 von Phil Belloni | Report spam
Hi



Access 2003, MSSQL 2000



Ich muss bei einer Access-Applikation die Daten von Access auf MSSQL
portieren.

Nun habe ich folgendes festgestellt, dass gewisse Berechnungen nicht
stimmen, da z.B. first, dfirst, und FindFirst eingesetzt wurde. Die Tabelle
worauf zugegriffen wird enthàlt fast eine Million Datensàtze, Tendenz stark
steigend.



Problembeschreibung:



Es gibt in Access-SQL:

First, Last



und:

dfirst, dlast (DomErsterWert...)



in VBA:

Findfirst, Findlast



1. In der Access-Hilfe für FIRST, LAST ist zu finden:

Die Methoden First, Last, MoveFirst und MoveLast eines DAO -Recordsets geben
lediglich den Wert eines angegebenen Feldes im ersten oder letzten Datensatz
des Resultsets einer Abfrage zurück. Da Datensàtze gewöhnlich in keiner
bestimmten Reihenfolge zurückgegeben werden (außer die Abfrage enthàlt eine
ORDER BY-Klausel), geben diese Funktionen willkürliche Datensàtze zurück.



Der Ex-Programmierer hat überall keine OrderBy-Klausel drinn... damit können
die Datensàtze willkürlich sein.



2. In der Access-Hilfe für dFIRST, dLAST (DomErsterWert) ist zu finden:

Wenn Sie den ersten oder den letzten Datensatz in einer Gruppe von
Datensàtzen (einer Domàne) zurückgeben möchten, sollten Sie eine Abfrage
erstellen, die aufsteigend oder absteigend sortiert und deren
TopValues-Eigenschaft auf 1 festgelegt ist. Weitere Informationen finden Sie
unter dem Hilfethema zur TopValues-Eigenschaft. Von Visual Basic aus können
Sie auch ein Recordset-ADO-Objekt erstellen und die Methoden MoveFirst oder
MoveLast verwenden, um den ersten oder letzten Datensatz in einer Gruppe von
Datensàtzen zurückzugeben.



Der Ex-Programmierer benutzt diese Form in Textbox SteuerelementDatenquelle

Beispiel:

DomErsterWert("Feld";"Tabelle";"Kriterium"

Hier ist keine Möglichkeit für ein OrderBy möglich, was soll ich tun? Wie
oben beschrieben mit TOP usw.?

Wie ist eure Erfahrung?



3. In der Hilfe von FINDFIRST und FINDLAST ist nix von dieser Problematik
beschrieben. Kann ich davon ausgehen, dass ich damit die gleichen Probleme
habe, von wegen willkürlichen Datensàtze? Denn da ist meines Wissens auch
kein Order By möglich.





Soll ich komplett auf "Select TOP 1 Feld FROM Tabelle ORDER BY Feld"
umsteigen?

Und zu allem Übel kommt noch dazu, dass wenn eine Query ein First enthàlt,
die SQL aus Access an den MSSQL zuerst alle Datensàtze holt und danach erst
das First in Access ausgeführt wird... natürlich, denn der MSSQL kennt ja
den Befehl nicht... (kommt das bei MSSQL2008? ;-)



Ich bin für jeden Fetzen an Informationen Dankbar!

Gruss und Dank
 

Lesen sie die antworten

#1 Christa Kurschat
23/09/2008 - 13:52 | Warnen spam
Hallo Phil,

Phil Belloni schrieb:

Hi



Access 2003, MSSQL 2000



Ich muss bei einer Access-Applikation die Daten von Access auf
MSSQL portieren.




Viel Spaß ;-)

Nun habe ich folgendes festgestellt, dass gewisse Berechnungen
nicht stimmen, da z.B. first, dfirst, und FindFirst eingesetzt
wurde. Die Tabelle worauf zugegriffen wird enthàlt fast eine
Million Datensàtze, Tendenz stark steigend.



Problembeschreibung:



Es gibt in Access-SQL:

First, Last




Gibts im SQL Server nicht und wird's auch nicht geben.
Ersatz: Min und Max, oder TOP 1 mit entsprechender Sortierung



und:

dfirst, dlast (DomErsterWert...)




Das gibt's auch nicht, siehe oben.



in VBA:

Findfirst, Findlast




Würde ich Top1 mit entsprechender Sortierung (asc, desc) nehmen.



1. In der Access-Hilfe für FIRST, LAST ist zu finden:

Die Methoden First, Last, MoveFirst und MoveLast eines DAO
-Recordsets geben lediglich den Wert eines angegebenen Feldes
im ersten oder letzten Datensatz des Resultsets einer Abfrage
zurück. Da Datensàtze gewöhnlich in keiner bestimmten
Reihenfolge zurückgegeben werden (außer die Abfrage enthàlt
eine ORDER BY-Klausel), geben diese Funktionen willkürliche
Datensàtze zurück.


Der Ex-Programmierer hat überall keine OrderBy-Klausel
drinn... damit können die Datensàtze willkürlich sein.





Eben drum ist First oder Last auch in Acc Müll, vor allem ohne Sortierung.



2. In der Access-Hilfe für dFIRST, dLAST (DomErsterWert) ist
zu finden:
Wenn Sie den ersten oder den letzten Datensatz in einer Gruppe
von Datensàtzen (einer Domàne) zurückgeben möchten, sollten
Sie eine Abfrage erstellen, die aufsteigend oder absteigend
sortiert und deren TopValues-Eigenschaft auf 1 festgelegt ist.
Weitere Informationen finden Sie unter dem Hilfethema zur
TopValues-Eigenschaft. Von Visual Basic aus können Sie auch
ein Recordset-ADO-Objekt erstellen und die Methoden MoveFirst
oder MoveLast verwenden, um den ersten oder letzten Datensatz
in einer Gruppe von Datensàtzen zurückzugeben.


Der Ex-Programmierer benutzt diese Form in Textbox
SteuerelementDatenquelle
Beispiel:

DomErsterWert("Feld";"Tabelle";"Kriterium"

Hier ist keine Möglichkeit für ein OrderBy möglich, was soll
ich tun? Wie oben beschrieben mit TOP usw.?




Ja.

Wie ist eure Erfahrung?




Ich habe das soweit vermieden, wo es ging.



3. In der Hilfe von FINDFIRST und FINDLAST ist nix von dieser
Problematik beschrieben. Kann ich davon ausgehen, dass ich
damit die gleichen Probleme habe, von wegen willkürlichen
Datensàtze? Denn da ist meines Wissens auch kein Order By
möglich.




Soll ich komplett auf "Select TOP 1 Feld FROM Tabelle ORDER BY
Feld" umsteigen?

Und zu allem Übel kommt noch dazu, dass wenn eine Query ein
First enthàlt, die SQL aus Access an den MSSQL zuerst alle
Datensàtze holt und danach erst das First in Access ausgeführt
wird... natürlich, denn der MSSQL kennt ja den Befehl nicht...
(kommt das bei MSSQL2008? ;-)



Nein.
Ich würde die Abfragen, die First usw. enthalten umbauen und auf den SQL
Server bringen.
Ansonsten làufst Du in eine Performance-Falle.

Gruß
Christa
Access-FAQ: http://www.donkarl.com
SQL-Server-FAQ: www.sqlfaq.de
InsideSql: www.insidesql.org

Ähnliche fragen