AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi View, Stored Procedure oder doch Abfrage?
Thema durchsuchen
Ansicht
Themen-Optionen

View, Stored Procedure oder doch Abfrage?

Offene Frage von "PASST"
Ein Thema von PASST · begonnen am 8. Mai 2009 · letzter Beitrag vom 8. Mai 2009
Antwort Antwort
Seite 1 von 2  1 2      
PASST

Registriert seit: 30. Mär 2005
Ort: Krefeld
325 Beiträge
 
Delphi 7 Enterprise
 
#1

View, Stored Procedure oder doch Abfrage?

  Alt 8. Mai 2009, 12:39
Datenbank: ADS • Version: 9.10 • Zugriff über: Advantage Komponenten
Hallo allerseits,

ich habe eine Verständnisfrage, die sich weniger auf Delphi sondern mehr auf das Design der DB bezieht.

Ich lasse eine Auswertung über eine recht komplexe Abfrage mit 250 Zeilen erstellen. Ich könnte diese Abfrage jetzt in Delphicode packen, halte es aber für besser, dies direkt in der DB einzutragen.

Als View kann ich sie nicht eintragen, da ich mit drei Parametern arbeite. Also bleibt doch eigentlich nur eine Stored Procedure. ODer was meint ihr dazu?

Gruß,
Peter
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: View, Stored Procedure oder doch Abfrage?

  Alt 8. Mai 2009, 13:02
Hallo,

SPs sind immer die 1. Wahl (geringerer Traffic, Wiederverwendbarkeit usw.).
Aufwändig finde ich aber die Pflege bei Änderungen,
gerade wenn man mehrere Kunden hat.


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#3

Re: View, Stored Procedure oder doch Abfrage?

  Alt 8. Mai 2009, 13:42
Zitat von PASST:
Ich lasse eine Auswertung über eine recht komplexe Abfrage mit 250 Zeilen erstellen. Ich könnte diese Abfrage jetzt in Delphicode packen, halte es aber für besser, dies direkt in der DB einzutragen.

Als View kann ich sie nicht eintragen, da ich mit drei Parametern arbeite. Also bleibt doch eigentlich nur eine Stored Procedure. ODer was meint ihr dazu?
Falls die Plattform auf Win32 beschränkt ist, kannst Du das ganze auch als Delphi-DLL in einer Stored Procedure hinterlegen.
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: View, Stored Procedure oder doch Abfrage?

  Alt 8. Mai 2009, 14:07
Zitat von PASST:
Als View kann ich sie nicht eintragen, da ich mit drei Parametern arbeite
Kommt drauf an.
Man kann ja einschränkende Filter per WHERE-Bedingung auch noch später in der Anwendung setzen:
SELECT * FROM View_Irgendwas WHERE Tabelle1.Feld1=:Feld1 AND Tabelle2.Feld2=:Feld2 Es hängt eben von der Struktur deiner Abfrage ab, ob dieser Weg funktioniert.
Wann immer möglich sollte man Views gegenüber Stored Procedures bevorzugen, da Views viel leichter
auf ein anderes DBMS portiert werden können.
Ausserdem sind Views in der Anwendung pflegeleichter, da sich Views im Prinzip wie normale Tabellen verhalten.
Bitte jetzt nicht falsch verstehen; Stored Procedures haben viele Einsatzgebiete, die man mit Views überhaupt nicht erreichen kann.
Andreas
  Mit Zitat antworten Zitat
PASST

Registriert seit: 30. Mär 2005
Ort: Krefeld
325 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: View, Stored Procedure oder doch Abfrage?

  Alt 8. Mai 2009, 14:16
Im Grunde geht es mir auch darum, unabhängig von Delphi zu sein, insofern möchte ich diese Abfrage in der DB speichern.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

Re: View, Stored Procedure oder doch Abfrage?

  Alt 8. Mai 2009, 14:23
Hallo,

kannst Du uns die Abfrage mal hier zeigen, eventuell fällt dann eine Entscheidung leichter.

Geht es um eine komplizierte Abfrage über mehrere Tabellen, bei der nur ein Teil der Where-Bedingung variabel ist, sprich über Parameter gesteuert wird? Dann ist shimas Vorschlag die beste Wahl, da eine Viewdefinition relativ leicht von einer Datenbank auf eine andere portiert werden kann (sofern sie nicht zu abgefahren ist). Die Unabhängigkeit von Delphi (oder jeden beliebigen anderen Client) bleibt bestehen.
  Mit Zitat antworten Zitat
PASST

Registriert seit: 30. Mär 2005
Ort: Krefeld
325 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: View, Stored Procedure oder doch Abfrage?

  Alt 8. Mai 2009, 14:42
Hm, so im Detail will ich diese Abfrage jetzt nicht offenlegen. Es geht um ein Rechnungsausgangsbuch unserer noch in XBase++ programmierten Anwendung. Ich bau die Abfrage aber mal beispielhaft nach:
SQL-Code:
select rechnungsdatum, rechnungsnummer, kunde, waehrung,
round(sum(case when typ='WAREthen wert else 0 end)) as [ware],
round(sum(case when typ='VERPACKUNGthen wert else 0 end)) as [verpackung],
..., mwst_einfach, mwst_voll, sum([ware] + ... + mwst_voll) as [brutto]
from
(select rechnungsdatum, rechnungsnummer, kunde, waehrung, typ, waehrung, wert, (wert * mwst), mwstart
from
(select rechnungsdatum, rechnungsnummer, kunde, waehrung, waehrung, 'WAREas [typ],
sum(einheiten * preis + ... + case when irgendwas then ... else ... end) as [wert]
from auftrag
where ...irgendwas...
group by ...

union

select rechnungsdatum, rechnungsnummer, kunde, waehrung, waehrung, 'VERPACKUNG',
sum(einheiten * preis + ... + case when irgendwas then ... else ... end)
from auftrag
where ...irgendwas...
group by ...

union
...insgesamt 8x...
) subalias1
where printdate >= convert(:vondatum, sql_date)
and printdate <= convert(:bisdatum, sql_date)
and firma = :fma
and wert <> 0
) subalias2
group by firma, rechnungsdatum, rechnungsnummer, kunde, waehrung
order by firma, rechnungsdatum, rechnungsnummer
Vielleicht hat ja jemand eine Idee?

Gruß
Peter
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

Re: View, Stored Procedure oder doch Abfrage?

  Alt 8. Mai 2009, 15:04
Hallo,

View draus machen:
SQL-Code:
create view DasIstAberGanzSchoenVielSQLOderSo as
select rechnungsdatum, rechnungsnummer, kunde, waehrung,
round(sum(case when typ='WAREthen wert else 0 end)) as [ware],
round(sum(case when typ='VERPACKUNGthen wert else 0 end)) as [verpackung],
..., mwst_einfach, mwst_voll, sum([ware] + ... + mwst_voll) as [brutto]
from
(select rechnungsdatum, rechnungsnummer, kunde, waehrung, typ, waehrung, wert, (wert * mwst), mwstart
from
(select rechnungsdatum, rechnungsnummer, kunde, waehrung, waehrung, 'WAREas [typ],
sum(einheiten * preis + ... + case when irgendwas then ... else ... end) as [wert]
from auftrag
where ...irgendwas...
group by ...

union

select rechnungsdatum, rechnungsnummer, kunde, waehrung, waehrung, 'VERPACKUNG',
sum(einheiten * preis + ... + case when irgendwas then ... else ... end)
from auftrag
where ...irgendwas...
group by ...

union
...insgesamt 8x...
)
where wert <> 0
) subalias2
group by firma, rechnungsdatum, rechnungsnummer, kunde, waehrung
order by firma, rechnungsdatum, rechnungsnummer
Abfrage sähe dann so aus:
SQL-Code:
Select * from DasIstAberGanzSchoenVielSQLOderSo
where printdate >= convert(:vondatum, sql_date)
and printdate <= convert(:bisdatum, sql_date)
and firma = :fma
wenn:
where ...irgendwas... nicht variabel ist.

Bei genauerem Detailwissen zu dem Aufbau Deines SQL's könnte man eventuell auch noch entscheiden, ob der 8x vorkommende Block nicht auch in eine View ausgelagert wird und dann zur Laufzeit ein Konstrukt wie
SQL-Code:
select 'VERPACKUNG', * from AchtMalView
where 'die Einschränkung' = 'für Verpackung ist'
benutzt werden könnte.
SQL-Code:
select rechnungsdatum, rechnungsnummer, kunde, waehrung,
round(sum(case when typ='WAREthen wert else 0 end)) as [ware],
round(sum(case when typ='VERPACKUNGthen wert else 0 end)) as [verpackung],
..., mwst_einfach, mwst_voll, sum([ware] + ... + mwst_voll) as [brutto]
from
(select rechnungsdatum, rechnungsnummer, kunde, waehrung, typ, waehrung, wert, (wert * mwst), mwstart
from
select 'VERPACKUNG', * from AchtMalView where 'die Einschränkung' = 'für Verpackung ist'
union
select 'WARE', * from AchtMalView where 'die Einschränkung' = 'für Ware ist'
union
... und noch die übrigen ...
)
group by firma, rechnungsdatum, rechnungsnummer, kunde, waehrung
order by firma, rechnungsdatum, rechnungsnummer
Auch hieraus ließe sich noch eine View machen, auf die dann per
SQL-Code:
Select * from
where printdate >= convert(:vondatum, sql_date)
and printdate <= convert(:bisdatum, sql_date)
and firma = :fma
zugegriffen wird. Je nach Komplexität der mehrfachvorkommenden Union-Teiles kann das die Wartung deutlich vereinfachen. Es muss dann nicht mehr in jedem Union-Teil geändert werden, sondern nur noch einmal in der entsprechenden View.

Das kann man aber letztlich nur bei vollständiger Kenntnis der Abfrage sinnvoll entscheiden.
  Mit Zitat antworten Zitat
PASST

Registriert seit: 30. Mär 2005
Ort: Krefeld
325 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: View, Stored Procedure oder doch Abfrage?

  Alt 8. Mai 2009, 16:49
Die Variante den größten Teil in einen View zu packen, wie du es geschrieben hast, habe ich auch schon gemacht.
Ich frage mich, ob ich diesen Teil, dann nicht in eine Stored Procedure packen kann/sollte/darf:
SQL-Code:
Select * from
where printdate >= convert(:vondatum, sql_date)
and printdate <= convert(:bisdatum, sql_date)
and firma = :fma
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

Re: View, Stored Procedure oder doch Abfrage?

  Alt 8. Mai 2009, 16:58
Hallo,

soll denn die ganze Arbeit auf die Datenbank ausgelagert werden, sprich: Benötigst Du keine Ergebnisse im Programm?
Wenn Du das Ergebnis im Programm benötigts, dann ist an dem letzten SQL durch Auslagerung... nix mehr zu verbessern. Einmal müssen die Paramter an die Datenbank gegeben werden und das Ergebnis abgeholt werden.
Und mit weniger Aufwand und pflegeleichter als dem "verbliebenen" Select, wirst Du es nicht mehr hinbekommen.

Einen Bedarf / eine Notwendigkeit, das verbliebene Select noch in eine Stored Procedure zu packen, sehe ich nicht.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz