AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Stored Procedure innerhalb anderer SP
Thema durchsuchen
Ansicht
Themen-Optionen

Stored Procedure innerhalb anderer SP

Ein Thema von Hansa · begonnen am 31. Mai 2006 · letzter Beitrag vom 11. Jun 2006
Antwort Antwort
Seite 1 von 2  1 2      
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#1

Stored Procedure innerhalb anderer SP

  Alt 31. Mai 2006, 11:45
Datenbank: FB • Version: 1.5 • Zugriff über: FIBPlus
Hi,

Zuerst die SP :

SQL-Code:
CREATE PROCEDURE TESTPREISSP8
RETURNS (
    ID INTEGER,
    NR INTEGER,
    BEZ CHAR(30),
    PREIS DECIMAL(15,2))
AS
begin
  for
    select ID, NR, BEZ, PREIS from ART, ERMITTLE_ARTPREIS (ID,5,'01.01.2006')
    where (ID <= 111)
    into :ID,:NR,:BEZ, :PREIS
   do
  suspend;
end^
Die liefert eine Datenmmenge zurück, die eben nur durch ID <= 111 eingeschränkt ist. Die innere SP ERMITTLE_ARTPREIS hat einen Rückgabewert PREIS und der steht immer auf 0. Lasse ich die einzeln laufen, dann wird der richtige Wert angezeigt. Allerdings sieht es so aus, daß der Wert Preis auf einem Wert stehenbleibt. Vorhin hat mit anderem WHERE überall als Preis 13,44 drin gestanden. Was ist da falsch ?
Gruß
Hansa
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Stored Proceduree immerhalb anderer SP

  Alt 31. Mai 2006, 12:05
Hallo Hansa,

das ist der seltsamste JOIN, den ich jemals gesehen habe. Führe doch SELECT und den Aufruf der inneren SP hintereinander aus.

Grüße vom marabu
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#3

Re: Stored Proceduree immerhalb anderer SP

  Alt 31. Mai 2006, 12:11
Der Code von "Ermittle_ArtPreis" ist nicht uninteressant um den Fehler zu finden )

Ein direkter JOIN wäre ihmo am Besten.
Falls der Code in ERMITTLE_ARTPREIS sehr komplex ist, und du ihn auslagern möchtest, dann ist aus meiner Sicht eine eine UDF für diesen Zweck angebrachter.

Variante 1: (bei "relativ" wenigen Artikeln)
SQL-Code:
CREATE FUNCTION Ermittle_Artpreis
(
  Zeitpukt DATETIME
)
RETURNS TABLE
AS
SELECT ID,ArtNr,Preis FROM ... bla
Das Ganze dann mit deinem äußeren SELECT Joinen.

Variante 2: (bei "relativ" vielen Artikeln)

SQL-Code:
FUNCTION Get_ARTPREIS
(
  @ID INT,
  @Zeitpukt DATETIME
)
RETURNS MONEY
AS
RETURN
SELECT TOP 1 Preis FROM ... bla
WHERE ID = @ID
      AND
      @Zeitpunkt BETWEEN Preis_Startdatum AND Preis_EndDatum
[/sql]

verwenden:

SQL-Code:
SELECT ID,ArtNr,Preis FROM ... bla

SELECT ID, NR, BEZ, dbo.Get_ARTPREIS ('01.01.2006') FROM Artikel
WHERE ...
/ EDIT : UDF berbessert
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

Re: Stored Proceduree immerhalb anderer SP

  Alt 31. Mai 2006, 12:13
Zitat von marabu:
das ist der seltsamste JOIN, den ich jemals gesehen habe.
Habe mich selber gewundert, daß überhaupt was kam und zwar ohne Fehlermeldung. Das ist doch schon mal gut, oder geht das so doch nicht ?


Zitat von marabu:
Führe doch SELECT und den Aufruf der inneren SP hintereinander aus.
Wie Du meinen ? Die SP braucht ja die ID um den richtigen Preis zu errechnen, was so aber noch nicht richtig ist.
Gruß
Hansa
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Stored Procedure innerhalb anderer SP

  Alt 31. Mai 2006, 12:24
Zitat von Hansa:
Wie Du meinen ?
Hier kommt die Langfassung zu meinem Beitrag:

Du machst ein SELECT auf ART und ein singleton SELECT auf ERMITTLE_ARTPREIS. Dein JOIN bildet das kartesische Produkt - das singleton result wird nie mehr verändert und bezieht sich immer auf den Zufallswert von ID, bevor du die Variable in der INTO-Klausel befüllst. Klappen tut es schon, aber es tut nicht was du willst.

Kannst du nicht erst dein SELECT FROM ART INTO machen und anschließen über das dann determinierte ID deine SP aufrufen?

marabu
  Mit Zitat antworten Zitat
alex517

Registriert seit: 23. Nov 2004
Ort: Bernau b. Berlin
273 Beiträge
 
Delphi XE5 Enterprise
 
#6

Re: Stored Procedure innerhalb anderer SP

  Alt 31. Mai 2006, 12:45
Hi Hansa,

versuchs doch mal damit
SQL-Code:
CREATE PROCEDURE TESTPREISSP8
RETURNS (
    ID INTEGER,
    NR INTEGER,
    BEZ CHAR(30),
    PREIS DECIMAL(15,2))
AS
begin
  for
    select A.ID, A.NR, A.BEZ, P.PREIS
    from
      ART A
      join ERMITTLE_ARTPREIS (A.ID, 5, '01.01.2006') P on (1=1)
    where (ID <= 111)
    into :ID,:NR,:BEZ, :PREIS
  do
    suspend;
end^
alex
Alexander
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

Re: Stored Procedure innerhalb anderer SP

  Alt 31. Mai 2006, 15:21
@jens : hier die SP

SQL-Code:
CREATE PROCEDURE TESTPREISSP8 (
    ID_ART INTEGER,
    ABDATUM DATE)
RETURNS (
    PREIS DECIMAL(15,2))
AS
BEGIN
  SELECT FIRST 1 PREIS FROM ART WHERE
    (ID_ART = :ID_ART) AND (ABDATUM <= :ABDATUM)
  ORDER BY ABDATUM DESC INTO :PREIS;
  IF (PREIS IS NULL) THEN PREIS = 0;
  SUSPEND;
END^
@Marabu : Du meinst ein "Select from select from select" in der Richtung, oder was ?

@Alex : wie es aussieht ist das genau das, wie ich das eigentlich vorhatte.

Aktuell hat sich allerdings noch herausgestellt, daß es auch gut wäre, ein Anfangs- und Enddatum zu haben, also BETWEEN. Wie ich das sehe, wäre der Join mit der SP dann eher ein Umweg. Muß das alles jetzt erst mal testen. Und daß solch "seltsamer Code" geht, das weiß ich ! Aber nicht mehr wie genau.

Noch eine Frage
Zitat von alex517:
on (1=1)
Was hat es damit genau auf sich ?
Gruß
Hansa
  Mit Zitat antworten Zitat
alex517

Registriert seit: 23. Nov 2004
Ort: Bernau b. Berlin
273 Beiträge
 
Delphi XE5 Enterprise
 
#8

Re: Stored Procedure innerhalb anderer SP

  Alt 31. Mai 2006, 15:45
Zitat von Hansa:
Noch eine Frage
on (1=1) Was hat es damit genau auf sich ?
Join-Syntax:
JOIN <tableref> ON <search_condition>

und da <search_condition> nun mal verlangt wird, kommt da auch eine hin (1=1)

alex
Alexander
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#9

Re: Stored Procedure innerhalb anderer SP

  Alt 31. Mai 2006, 15:59
Also praktisch nur Dummy-Funktion ? Dein Code geht übrigens ! Mit folgender Änderung :

SQL-Code:
    from
      ART A left join...
Verstehe zwar nicht wieso, aber so gehts. Noch weniger verstehe ich allerdings, wieso mein Anfangscode nicht ging. 8)
Gruß
Hansa
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#10

Re: Stored Procedure innerhalb anderer SP

  Alt 10. Jun 2006, 23:54
SQL-Code:
CREATE PROCEDURE TESTPREISSP8
RETURNS (
    ID INTEGER,
    NR INTEGER,
    BEZ CHAR(30),
    PREIS DECIMAL(15,2))
AS
begin
  for
    select ID, NR, BEZ, PREIS from ART, ERMITTLE_ARTPREIS (ID,5,'01.01.2006')
    where (ID <= 111)
    into :ID,:NR,:BEZ, :PREIS
   do
  suspend;
end^
Ich schätze hier liegt eine Verwechslung vor zwischen ID und ID.
Da steht ERMITTLE_ARTPREIS (ID,5,'01.01.2006'): Das ID bezieht sich aber auf den Rückgabeparameter ID und nicht auf das ID, das du aus ART liest. Eigentlich müsste da zwar noch ein Doppelpunkt davor stehen, aber der Compiler beschwert sich oftmals trotzdem nicht. Hab ich mir auch schon paar mal die Zähne ausgebissen...
Was du wolltest, war wohl eher:

SQL-Code:
CREATE PROCEDURE TESTPREISSP8
RETURNS (
    ID INTEGER,
    NR INTEGER,
    BEZ CHAR(30),
    PREIS DECIMAL(15,2))
AS
begin
  for
    select ID, NR, BEZ from ART
    where (ID <= 111)
    into :ID,:NR,:BEZ
   do
     begin
       select PREIS from ERMITTLE_ARTPREIS(:ID,5,'01.01.2006') into :PREIS;
       suspend;
     end
end^
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  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 18:44 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