rupi01
Goto Top

Access 2K7 - Aus einer Abfrage eine VBA Funktion mit Variablen aufrufen

Ich benötige dringend Hilfe vom Könner!

Hallo Kollegen,

ich beschäftige mich gerade mit einer Access 2K7 DB.

In dieser DB habe ich eine Abfrage (View) die mir Datensätze aus den verschiednsten Tabellen anzeigt. U.a. sollen hier auch einige Felder berechnet werden. Dazu ist es aber notwendig, einen vorherigen Wert aus dem View auszulesen.

Aus dieser Abfrage, soll nun eine Funktion aufgerufen werden, der 3 (1 ist der Vergleichskey und mit 2 muss gerechnet werden) Variablen übergeben werden müssen. Hier endet mein Latein jetzt. Ich weiß, wie man eine Funktion mit einer Variablen aufruft, aber nicht mit mehreren und kann dazu auch nirgends etwas finden.

Der Aufruf lautet:

Ausdr1: Functionname([Var1], [Var2], [Var3]) -
Fehlermeldung:
Der von Ihnen eingegebne Ausdruck ist syntaktisch falsch.
Sie haben einen Operanden oder Operator nicht angegeben, Sie haben ein ungültiges Zeichen oder Komma eingegeben, oder Sie haben einen Text eingegeben, ohne diesen in Anführungszeichen zu setzen.

Das sagt viel, mir leider gar nichts!!! Ich finde mich nicht zurecht.

Vielen Dank im Voraus für die vielen Tipps.
Danke
mfg
ARuprecht

Content-Key: 125832

Url: https://administrator.de/contentid/125832

Ausgedruckt am: 28.03.2024 um 13:03 Uhr

Mitglied: 76109
76109 25.09.2009 um 19:07:29 Uhr
Goto Top
Hallo rupi01!

In einer Abfrage werden Argumente mit einem ";" getrennt z.B.:
"Ausdr1: Wenn(x=y;1;2)"

Gruß Dieter
Mitglied: rupi01
rupi01 29.09.2009 um 14:46:43 Uhr
Goto Top
Hallo Dieter,

danke für Deinen Tipp. Wenn ic h das mache, erhalte ich folgendes:
"Kompilierungsfehler.in Abfrageausdruck 'GETGEFKMBYTID([tbl1].[Var1];[tbl1].[Var2];[tbl2].[Var3])'

Ich weiss nicht mehr weiter. Zum besseren Verständnis möchte ich die Aufgabe etwas genauer erklären.

Ich habe eine DB von Oracle 10g (XE) nach Access 2K7 migriert. In der Oracle DB gibt es eine View, deren SQL Script so aussieht:
CREATE OR REPLACE VIEW V_TD_GESAMT
(FZGID, BEZ, TYP, KZ, STARTKM,
TINHALT, SPRIT, KAUFDAT, VKDAT, NDAUERPA,
FZGIDNR, FZGKEY01, FZGKEY02, FZGKEY03, AKTIV,
TID, TDATUM, TLITER, GESKM, BETRAG,
PREISJELITER, GEFKM, VERBRAUCH, KOSTEN100KM, THEOREICHW,
TYPID, TYPART, SPAID, SPAART)
AS
SELECT TD_FZGSTAMM."FZGID",
TD_FZGSTAMM."BEZ",
TD_FZGSTAMM."TYP",
TD_FZGSTAMM."KZ",
TD_FZGSTAMM."STARTKM",
TD_FZGSTAMM."TINHALT",
TD_FZGSTAMM."SPRIT",
TD_FZGSTAMM."KAUFDAT",
TD_FZGSTAMM."VKDAT",
TD_FZGSTAMM."NDAUERPA",
TD_FZGSTAMM."FZGIDNR",
TD_FZGSTAMM."FZGKEY01",
TD_FZGSTAMM."FZGKEY02",
TD_FZGSTAMM."FZGKEY03",
TD_FZGSTAMM."AKTIV",
TD_TANKDATEN."TID",
TD_TANKDATEN."TDATUM",
TD_TANKDATEN."TLITER",
TD_TANKDATEN."GESKM",
TD_TANKDATEN."BETRAG",
ROUND(Betrag/TLITER,3) PreisJeLiter,
Getgefkmbytid(TID, geskm, startkm) gefKM,
CASE WHEN Getgefkmbytid(TID, geskm, startkm) <> 0 THEN ROUND(TLITER*100/Getgefkmbytid(TID, geskm, startkm),3) ELSE NULL END verbrauch,
CASE WHEN Getgefkmbytid(TID, geskm, startkm) <> 0 THEN ROUND(TLITER*100/Getgefkmbytid(TID, geskm, startkm) * Betrag/TLITER,3) ELSE NULL END kosten100km,
CASE WHEN Getgefkmbytid(TID, geskm, startkm) <> 0 THEN ROUND(TINHALT/(TLITER/Getgefkmbytid(TID, geskm, startkm)),3) ELSE NULL END theoreichw,
TD_FZGTYP."TYPID", TD_FZGTYP."TYPART",
TD_SPRITART."SPAID", TD_SPRITART."SPAART" FROM TD_FZGSTAMM, TD_TANKDATEN, TD_FZGTYP, TD_SPRITART WHERE TD_FZGSTAMM.fzgid = TD_TANKDATEN.fzgid AND TD_FZGSTAMM.typ = TD_FZGTYP.typid AND TD_FZGSTAMM.sprit = TD_SPRITART.spaid

Die Prozedur GETGEFKMBYTID sieht so aus:
CREATE OR REPLACE FUNCTION Getgefkmbytid(inTid NUMBER, geskm NUMBER , startkm NUMBER) RETURN NUMBER IS
tmpVar NUMBER;

BEGIN
tmpVar := 0;

SELECT MAX(GESKM) INTO tmpVar FROM TD_TANKDATEN WHERE TDATUM < (SELECT TDATUM FROM TD_TANKDATEN a WHERE a.TID = inTid AND a.fzgid = TD_TANKDATEN.fzgid) ORDER BY TDATUM DESC;


SELECT CASE WHEN tmpVar IS NOT NULL THEN geskm-tmpVar ELSE geskm-STARTKM END INTO tmpVar FROM dual;

RETURN tmpVar;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
RAISE;
END Getgefkmbytid;

dabei sollen die gefahrenen km nach jedem Tankvorgang berechnet werden in GETGEFKMBYTID.

Und genau das soll in einer Abfrage in Access 2K7 passieren. Da ich überhaupt nicht weiss wie, bin ich momentan nur am rumprobieren, aber eigentlich schon ziemlich weit bis auf diesen Prozedur (Modul) aufruf.
In der 1. Selectanweisung der Prozedur (Oracle) ist das Statement SELECT.......from..........where..<(SELECT.....FROM TD_TANKDATEN a where a.TID = inTID and a.FZGID = TD_TANKDATEN.FZGID) ORDER ......
Hier wird ein und die selbe Tabelle gleichzeitig 2x angesprochen einmal als "a" und einmal mit dem Tabellennamen. Genauso das mit dem "INTO" hier schieße ich den Tabellenwert in eine temporäre Variable. Und das CASE WHEN - Bedingungen innerhalb von SQL.
Wie funktioniert das in A2K7?????? geht das überhaupt?? Ich habe in meinen Büchern nix gefunden!!

Danke an alle Access-Cracks da draußen!
mfg
Andreas
Mitglied: 76109
76109 29.09.2009 um 15:26:31 Uhr
Goto Top
Hallo rupi01!

Sorry, da habe ich Dich missverstandenface-sad

Ich hatte wegen der Bezeichnung "Ausdr1:" fälschlicherweise angenommen, dass es sich um eine Abfrage-Tabelle in Access handelt. In SQL-Abfragen, werden die Argumente natürlich mit Komma getrennt.

'GETGEFKMBYTID([tbl1].[Var1],[tbl1].[Var2],[tbl2].[Var3])'

In SQL bin ich leider nicht so bewandert, aber falls mir zu Deinem Posting doch noch etwas einfällt, gebe ich Dir bescheid.


Gruß Dieter
Mitglied: rupi01
rupi01 29.09.2009 um 15:50:54 Uhr
Goto Top
Hallo Dieter,

jetzt dreh' ich mich dann im Kreis face-smile. Wenn ich mit Komma trenne laufe ich auf den Fehler vom Ursprungs-Posting!

Wenn Du etwas rauskriegst wäre das toll. Ich suche auch weiter, weiss aber schon nicht mehr wo ich noch suchen soll.

Danke für Deine Hilfe

mfg
Andreas