Discussion:
Wozu braucht man Views?
(zu alt für eine Antwort)
Daniel Grosche
2004-09-28 14:17:14 UTC
Permalink
Hallo!

Also erst einmal ich bin ein absoluter Neuling auf dem Gebiet FoxPro und
versuche mir VFP mithilfe des "Visual FoxPro Anwendungsentwickler" anzueignen.

Das Buch gefällt mir auch ganz gut und bisher bin ich mit allem recht gut klar
gekommen, bis ich in Kapitel 7 auf die Views gestoßen bin. Ein View wird als
temporäre Tabelle definiert, die aus anderen Tabellen besteht (o.ä.), und es
wird gesagt, dass man später auf den Zugriff von Tabellen vollkommen
verzichtet.

Meine Frage ist, wozu brauche ich eigentlich diese Views? Man kann doch die
Tabellen untereinander recht gut verknüpfen, Formulare erstellen und ähnliches
ohne das man noch die zusätzliche Instanz vom View braucht? Also welche
Vorteile haben Views, wie kann man sie konkret anwenden, was kann ein View, was
eine normale Tabelle nicht kann, und inwiefern wird damit etws verienfacht?

Fragen über Fragen...

Bis denne,
Daniel

--- FPD v2.5b.190704 GoldED+/W32 1.1.5-30512
Stefan Wuebbe
2004-09-29 06:44:45 UTC
Permalink
Hallo Daniel
Post by Daniel Grosche
Meine Frage ist, wozu brauche ich eigentlich diese Views? Man kann doch die
Tabellen untereinander recht gut verknüpfen, Formulare erstellen und ähnliches
ohne das man noch die zusätzliche Instanz vom View braucht? Also welche
Vorteile haben Views, wie kann man sie konkret anwenden, was kann ein View, was
eine normale Tabelle nicht kann, und inwiefern wird damit etws verienfacht?
Du hast Recht, man kann ohne Views arbeiten. Aber es gibt Vorteile -
sie sind wiederverwendbare SQL Statements und können
- mehrere Tabellen gleichzeitig darstellen
- berechnete Felder enthalten
- ganz oder teilweise aktualisierbar sein oder auf Wunsch schreibgeschützt
- als Remote-View können sie mit RDBMS Servern verbinden, wie Oracle,
MySQL oder MS SqlServer / MSDE
- und deren evtl. abweichende Datentypen umbiegen
- sie können "parametrisierbar" sein, also dynamische WHERE Bedingungen
enthalten
- und arbeiten dadurch gut mit Vfp Grids zusammen, in denen SET FILTER
relativ langsam funktioniert
- und sind oft eine gute Lösung für "grid reconstruction" Probleme, siehe
auch http://groups.google.com/advanced_group_search
- stellen eine zusätzliche Pufferung zum Backend her
- Datenumgebungen werden oft vereinfacht, übersichtlicher, leichter zu pflegen



hth
-Stefan
Holger Vorberg
2004-09-29 07:29:42 UTC
Permalink
Hi,

ein View (Ansicht) liefert dir einen Ausschnitt (eine bestimmte Ansicht) auf
eine Tabelle.
Der View ist am Ende zunächst mal eine SQL Abfrage. Die von dir zu
bestimmenden Tabellen werden durchsucht und das Ergebnis daraus als
temporäre Tabelle (CurSOR) zur Verfügung gestellt. Wenn du also mit einem
View arbeitest, dann arbeitest du eigentlich auch nur mit einer Tabelle, mit
dem Unterschied, dass diese Tabelle zunächst erst aufgrund von Bedingungen
zusammengestellt wird, und zwar jedes Mal aufs neue, wenn du den View
öffnest. Das macht das ganze so flexibel, da du über parameterisierte Views
die Möglichkeit hast, immer wieder andere Datenmengen über die gleiche
Ansicht ermitteln zu können. Für mich wäre eine Arbeit ohne Views undenkbar.
Ich arbeite nur mit Views und habe nirgendwo direkten Zugriff auf Tabellen
in meinen Anwendungen. Da ich bzw. wir immer nur Auszüge aus Tabellen und so
gut wie niemals ganze Tabelle benötigen, macht es die Verwendung von Views
geradezu erforderlich. Die SQL Sprache ist dafür ja entwickelt worden, für
eine mengenmäßige Betrachtung von Daten.

Abgesehen davon ist meine Erfahrung die, dass die Tabellen und Indexe
weitaus seltener defekt gehen, wenn man mit Views drauf zugreift, anstatt
direkt.
--
Tschüß,

Holger Vorberg
MS Visual FoxPro MVP
dFPUG Regionalleiter Bielefeld
Alexander Schmid
2004-09-30 15:18:52 UTC
Permalink
Hallo Holger
Post by Holger Vorberg
Ich arbeite nur mit Views und habe nirgendwo direkten Zugriff auf Tabellen
in meinen Anwendungen.
Nur mit Views zu arbeiten, interessiert mich sehr. Wofür ich aber noch
keine grundsätzliche Lösung gefunden habe, ist die Navigation, also
Vor- und Rückwärtsblättern in Tabellen nur mit Views. Scheint mir
irgendwie nicht sinnvoll, vor allem bei grossen Tabellen. Wie machst
Du das? Setzt Du bei jedem Blättern einen entsprechenden SQL-Befehl
ab, der den nächsten Datensatz liest? Wenn ja, ist das nicht ein
"Zeitfresser"? Skizziere mir doch bitte, wie Du das machst. Danke im
Voraus und schöne Grüsse

Alex
Holger Vorberg
2004-10-01 06:32:56 UTC
Permalink
Hi,
Post by Alexander Schmid
Nur mit Views zu arbeiten, interessiert mich sehr. Wofür ich aber noch
keine grundsätzliche Lösung gefunden habe, ist die Navigation, also
Vor- und Rückwärtsblättern in Tabellen nur mit Views. Scheint mir
irgendwie nicht sinnvoll, vor allem bei grossen Tabellen. Wie machst
Du das? Setzt Du bei jedem Blättern einen entsprechenden SQL-Befehl
ab, der den nächsten Datensatz liest? Wenn ja, ist das nicht ein
"Zeitfresser"? Skizziere mir doch bitte, wie Du das machst. Danke im
Voraus und schöne Grüsse
ehrlich gesagt ist mir nicht klar, wo du da ein Problem siehst ?!

Das Vor- und Rückwärtsblättern funktioniert doch bei Views genauso wie bei
Tabellen.
Im einfachsten Fall mit halt mit "SKIP" und "SKIP -1".
Die Größe der Tabelle ist dabei doch irrelevant. Beim View musst du halt
vorher dafür sorgen, dass du dir nur einen Ausschnitt aus der Tabelle holst,
da ja eine SELECT Abfrage zu Grunde liegt. Und selbst wenn ich mit einem
View arbeite, der mir immer nur einen Satz zieht spielt die Größe der
Tabelle eigentlich keine Rolle, sofern ich für die Abfrage eine
Rushmoreoptimierung erzielen kann.

Wir verwenden in unserer Anwendung sogar ausschliesslich Remote Views !!
Das heisst, die Anwendung ist mit VFP Programmiert, die Datenbank ist z.Zt.
eine VFP Datenbank, wir greifen aber über Remote Views (ODBC) auf die Daten
zu. Geschwindigkeitsprobleme haben wir nicht. Ein Umstellung auf eine andere
Datenbank könnten wir mit einer einfachen Änderung eines ODBC Connection
Strings, der sich in einer .INI Datei befindet, erledigen.
--
Tschüß,

Holger Vorberg
MS Visual FoxPro MVP
dFPUG Regionalleiter Bielefeld
Olaf Doschke
2004-10-01 10:18:52 UTC
Permalink
Post by Holger Vorberg
Ein Umstellung auf eine andere
Datenbank könnten wir mit einer einfachen Änderung eines ODBC Connection
Strings, der sich in einer .INI Datei befindet, erledigen.
Mere Mortals läßt ja auch sowas in der Art zu, nimmt aber,
solange man auf VFP-Daten zugreifen möchte immer noch
lokale Views, die im Namen alle mit lv_beginnen und wenn
man auf Remotezugriff umschaltet werden Views mit rv_
genommen.

Wenn Du wirklich dieselben Remoteviews für die VFP-
als auch die Remotedatenbank (meist ja wohl MS SQL-Server)
nimmst, schränkst Du Dich im SQL ja schon etwas ein,
richtig? So werden z.B. gegenseitig nicht alle Feldtypen
unterstützt und das auf beiden Datenbanken funktionierende
SQL muß das berücksichtigen.

Einerseits macht das den Umstieg dann wirklich einfach,
aber auch nur, wenn man schon im voraus weiß, wo's hin-
gehen soll. Je mehr Datenbanken man damit unterstützen
will je mehr schränkt man sich damit doch ein. Und ehrlich
gesagt schmeckt mir diese mehr oder minder große Lüge
der leichten Datenbankmigration nicht.

Ich hab's im Laufe der Zeit in mehreren (Lern)stufen errreicht,
daß die VFP-Datenbank in ihrer Performance trotz massiv
steigender Datenmenge und leicht steigender Userzahl besser
wurde, so daß sich die Befürchtung, die Performance reicht
irgendwann nicht mehr nie bestätigt hatte.

Gerade was ODBC angeht hattest Du außerdem ja schon
selbst mal gesagt, damit setzt man auf einen aussterbenden
Ast. Totgesagte leben zwar immer länger, aber Cursoradap-
toren zu nutzen wäre dann ja schon der zukunftsträchtigere
Schritt. Das sollte man auch berücksichtigen. Ich muß dazu
sagen, daß ich keinerlei Erfahrungen mit Cursoradaptoren
gemacht habe, man las in der Anfangszeit von VFP8 oft-
mals Fragen sehr grundsätzlicher Art "Wie geht das überhaupt?"
"Hat jemand mal ein Beispiel?" und nach einer Zeit kam das
Thema gar nicht mehr. Insofern landet man dann evtl. doch
wieder bei Views, purem SQL bzw. xBase-Code a la
Scan..Endscan, Scatter, Gather. Und um mal Christof Wol-
lenhaupts Geschmack zu erwähnen: Gerade letztens ver-
schmähte er wieder Views und lobte für SQL-Server anbin-
dung SQL-Passthrough aus. Mag ein wenig Geschmacks-
sache sein, aber Views haben schon so ihre Kinken.

Um zur Frage nach "Blättern in den Daten" zurückzukommen:
a) Ohne View: Tabelle komplett anbinden ist natürlich zunächst
mal "schön schnell". Es stellt sich aber trotzdem schnell das
Problem ein, daß man doch lieber nur einen nach mehreren
frei wählbaren Kriterien eingeschränken Ausschnitt der Daten
sehen möchte, was mit SET FILTER TO nur bedingt mach-
bar ist. Der Ansatz führt häufig auch zu einem sich leicht
rächenden unnormalisierten Tabellendesign, selbst wenn
man mit SET RELATION TO arbeitet, um passende Child-
daten anzuzeigen.

b) Mit Views: Da man hier mit Viewparametern und JOINS
arbeitet hat man die gewünschte Ansicht im gewünschten
Ausschnitt, natürlich aber zum Preis, das die Daten zunächst
mal beschafft werden müssen. Das ist dabei auch gar nicht
mal der Punkt, denn so oder so muß das, was auf den Clients
angezeigt wird durchs Netzwerk kommen. Alleine aber schon
die Stabilität der Dateien spricht für Views, SQL-Abfragen und
derlei und gegen direkte Tabellenanbindung.

Da man beim Selektieren der Daten - wie auch immer - in Anzeige-
cursoren aber die Wartezeit auf das Gesamtergebnis hat kommt
man schnell auf die Idee, die Wartezeit ähnlich der Tabellenanbindung
zu drücken, indem man eben die Daten nur Seitenweise holt, also z.B.
nur die ersten 10-20 Ergebnisdatensätze auf "Seite 1", für "Seite 2"
dann die nächsten 10-20 etc. Und genau das stellt sich per Views auf
VFP-Daten bzw. SQL als nicht machbar heraus, es gibt hier nur TOP,
womit man die ersten Datensätze holen könnte und bei umgekehrter
Sortierung die letzten, aber nie die Mitte eines Ergebnisses, ohne
es vorher nicht vollständig zu heben. Da hilft es sehr eine Serverdaten-
bank zu haben, die ein Ergebnis Stückweise liefern kann.

Seitenweise Navigation ist das übliche bei Webanwendung, nicht
jedoch bei Desktopanwendungen. Da bietet sich eher die Strate-
gie an eine Vorabfilterung anzubieten, die Defaultmäßig z.B. auf
Daten des aktuell angemeldeten Users oder der letzten 6 Monate
einschränkt.

Wenn Du unbedingt seitenweise Navigation möchtest, böte es
sich z.B. an den Schritt zu einem Applikationsserver zu gehen,
der die Applikationslogik als Zwischenstelle zwischen Datenbank
und Applikationsfrontend bildet und dabei wirklich Datenbank-
bzw. Fileservernah läuft und so quasi eine Foxprodatenbank
ganz oder teilweise zur Serverdatenbank machen kann, je nachdem
ob das Applikationsfronten nach wie vor auch am Applikationsserver
vorbei auf die/einige Datenbankfiles zugreifen kann oder nicht.

Tschüß, Olaf.
Holger Vorberg
2004-10-01 12:04:43 UTC
Permalink
Hi,
Post by Olaf Doschke
lokale Views, die im Namen alle mit lv_beginnen und wenn
man auf Remotezugriff umschaltet werden Views mit rv_
genommen.
das finde ich z.B. eher unpraktisch. Die Namenskonvention meine ich.
Abgesehen davon muss man mehr Views pflegen.
Post by Olaf Doschke
Wenn Du wirklich dieselben Remoteviews für die VFP-
als auch die Remotedatenbank (meist ja wohl MS SQL-Server)
nimmst, schränkst Du Dich im SQL ja schon etwas ein,
richtig?
ja, getestet ist das alles mit VFP und SQL Server, aber einschränken ?
Naja, wir verwenden ANSI SQL. Die Abfragen beinhalten daher natürlich
keinerlei DB spezifische Funktionen.
Es werden ganz schlicht nur die Felder geholt. Keine Berechnungen und
sonstige Konvertierungen, also keine VFP Funktionen. Das passiert alles
innerhalb der Applikation.
Post by Olaf Doschke
So werden z.B. gegenseitig nicht alle Feldtypen
unterstützt und das auf beiden Datenbanken funktionierende
SQL muß das berücksichtigen.
wir haben kompatible Feldtypen verwendet.
Zum Beispiel sind alle Datumsfelder vom Typ DateTime, weil es beim SQL
Server nur DateTime gibt.
Post by Olaf Doschke
Gerade was ODBC angeht hattest Du außerdem ja schon
selbst mal gesagt, damit setzt man auf einen aussterbenden
Ast. Totgesagte leben zwar immer länger, aber Cursoradap-
toren zu nutzen wäre dann ja schon der zukunftsträchtigere
Schritt.
Wir würden sicherlich gerne CursorAdpter in Verbindung mit OLE DB nutzen.
Das derzeitige Problem ist aber, dass wir ein Framework benutzen (Visual
FoxExpress) und dort sämtliche Tabellen bzw. Views in spezielle
"CursorKlassen" gekapselt sind. Leider gibt es in der aktuellen Version noch
keine Variante dieser "CursorKlassen", die mit VFP CursorAdaptern arbeiten
kann. Zwar ist das in Arbeit aber halt noch nicht gebrauchsfertig. Solange
arbeiten wird dann eben mit der View/ODBC Variante.
Post by Olaf Doschke
Gerade letztens ver-
schmähte er wieder Views und lobte für SQL-Server anbin-
dung SQL-Passthrough aus.
SPT verwende wir auch ziemlich intensiv. Schon allein dafür um für die Views
eine Shared Connection zu erstellen. <g>
Außerdem gibt es viele Stellen in unserer Anwendung, wo man Abfragen
abschickt, die erst zur Laufzeit zusammengebastelt werden und keinem Muster
entsprechen, welches man in einen View packen könnte.
--
Tschüß,

Holger Vorberg
MS Visual FoxPro MVP
dFPUG Regionalleiter Bielefeld
Olaf Doschke
2004-09-29 11:13:47 UTC
Permalink
Hallo Daniel!

Neben all den Vorteilen, die ich definitiv nicht anzweifle
noch ein paar Schattenseiten und weitere Entscheidungs-
kriterien Pro/Contra Tabellen/Views/"purem" SQL:

-Views, insbesondere visuell mit dem Viewdesigner erstellte,
sind im verwendbaren SQL etwas eingeschränkt. Das heißt
nicht, daß keine komplexen Views möglich sind, aber man
kommt schnell dahin, daß der Viewdesigner beim ändern
eines Views streikt, den man z.B. mit beliebigem SQL per
Create SQL View erzeugt hat. Es gestaltet sich schon schwer
visuell mehrere Tabellen zu joinen.

Ein empfehlenswertes Programm zum Überarbeiten (solcher)
Views ist eView. Zu finden bei www.universalthread.com
-> VFP Zone ->Downloads -> Download ID: 9474

Als Alternative zum Viewdesigner kann man wie gesagt auch
mittels 'Create SQL View' und DBSETPROP arbeiten, um
beliebige Selects nutzen zu können. eView erzeugt aus beste-
henden Views entsprechenden Code. Es gibt dann aber immer
noch Einschränkungen im Gegensatz zu "puren" SQL-Abfragen.

Insbesondere bezüglich Abfragen mit Makrosubstitution von z.B.
WHERE-Klauseln. Viewparameter sind da nicht ganz so flexibel,
da Viewparameter immer da sind und mit irgendeinem Wert
befüllt werden. Man muß also dann schon geschickt vorgehen,
wenn man z.B. gar nicht nach einem Zeitraum einschränken
möchte, müssen Parameter wie z.B. vDatumAb und vDatumBis
auf date(1900,1,1) und date(9999,1,1) gesetzt werden. In
Makrosubstitution &lcWhereklausel kann man die Einschränkung
auf Datum in der Whereklausel dagegen einfach weglassen.

Makrosubstitution geht zwar auch in Views, ist aber mit Vorsicht
zu genießen:

bis einschließlich VFP7 geht folgendes:
Release lcWhereclause && lcWhereclause undefined!
Create SQL View vTest as select * from tabelle where &lcWhereklausel

Ab vfp8 geht aber nur noch folgendes:
lcWhereclause = ".T."
Create SQL View vTest as select * from tabelle where &?lcWhereklausel
Wenn man per DBGETPROP überprüft ist der Select tatsächlich 1:1 so
übernommen und nicht etwa als select * from tabelle where .T. gespeichert.

Fraglich ist, ob zukünftige VFP-Versionen da noch restriktiver werden...
Ab VFP8 geht z.B. sogar der "Universalview":
lcSQL = "select * from tabelle"
Create SQL View vTest as &?lcSQL.
lcSQL ist danach auch durch andere Selects ersetzbar, nur was definiert
man da als updateable, und was sind die Keyfelder?

Nachteil von purem SQL: Selbst bei Select ... Into Cursor ... Readwrite hat
man keine Anbindung mehr an die ursprünglichen Tabellen und muß die
Tabellenaktualisierung auch irgendwie programmieren, während man bei
Views wie bei Tabellen im allgemeinen mit TABLEUPDATE aus-
kommt. Man muß nur die entsprechenden Spalten beschreibbar
machen und die nötigen Updateinformationen (Keyfelder) im
View einstellen.

Ein Vorteil beim Anbinden der Tabellen direkt ist, daß deren
Indizes permanent sind. Sowohl bei Views als auch Cursoren
muß man mit "on the fly" Indizes arbeiten, wenn man diese
braucht. Allerdings ist Tabellenanbindung auch schon bei mittlerem
Datenaufkommen nicht mehr empfehlenswert: SET FILTER TO
macht Scrollen im Grid z.B. ruckelig. Netzwerklast steigt trotz
solcher Filter mit der Anzahl der Datensätze.

Weitere Empfehlungen zu Views:

Nehme eine getrennte Viewdatenbank, das hat Vorteile
in getrennter Wartbarkeit, höherer Stabilität etc. Es ist sogar
empfehlenswert die Viewdatenbank lokal zu halten, d.h. neben
der Applikation zu installieren, so daß jeder Benutzer "seine"
Views nutzt. Es können trotzdem lokale Views zur Anbindung
an eine auf einem Server liegende FoxPro-Datenbank ver-
wendet werden. Der Unterschied lokal/remote bezieht sich
nur darauf, daß Remoteviews über eine Connection gehen.

Ich selbst habe keinen puristischen Ansatz:
Ich nutze Views (meist im Zusammenhang mit dem Framework
Mere Mortals), SQL-Selects und öffne auch mal Tabellen
direkt. Letzteres aber nur bei Tabellen, die definitiv bei unter
100 Datensätzen bleiben und auch nur wenigen zur Pflege
angezeigt werden. Meist öffne ich Tabellen eher im Zusammen-
hang mit z.B. SCAN-Schleifen und ähnlichem, was man neben
SQL, Views und Tabellen auch noch zur Verfügung hat.

Tschüß, Olaf.
Olaf Doschke
2004-09-29 11:32:07 UTC
Permalink
Post by Olaf Doschke
lcSQL = "select * from tabelle"
Create SQL View vTest as &?lcSQL.
lcSQL ist danach auch durch andere Selects ersetzbar, nur was definiert
man da als updateable, und was sind die Keyfelder?
Nochwas dazu:
a) "ab VFP8" ist irreführend:
ab VFP8 geht nur noch &?,
vor VFP8 geht &? und & alleine,
speziell ... as &?lcSQL geht aber in VFP7 nicht.

b) Hat man zuerst einen Select:
lcSQL = "select * from tabelle1"
use vTest in 0
und danach dann mal
lcSQL = "select * from tabelle2"
use vTest in 0

So läuft der erste Select, beim zweiten erhält man aber eine
Fehlermeldung: "Base table fields have been changed..."

Der View merkt sich also, welche Felder es in welcher
Tabelle gibt und überprüft das bei Ausführung auch wieder.

Das gilt nicht nur bei solchen "Trickviews", sondern
allgemein: Views sind gegenüber Strukturänderungen
von zugrundeliegenden Tabellen empfindlich und
werfen genau diesen Fehler auf, wenn man den
View nicht bei Tabellenänderungen neu definiert.

Tschüß, Olaf.
Lesen Sie weiter auf narkive:
Loading...