Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

bestimmten Wert im Bericht anzeigen lassen

Begonnen von dobby110, Juni 14, 2016, 11:43:30

⏪ vorheriges - nächstes ⏩

dobby110

Hallo zusammen,

ich bastele gerade an einem Bericht.
Dieser dient zu Statistik-Zwecken.
Vom Aufbau sieht es folgendermaßen aus:

Ich beziehe mich in dem Bericht auf eine Abfrage und bekomme alle Investments je Fonds mit deren vereinbarten Werten angezeigt.
Die Gruppierung nach Fonds stelle ich lediglich über die Gruppierungsfunktion in dem Bericht dar. Unter jedem Fonds (Block) lasse ich mir noch die Gesamtsumme des Fonds im Fußbereich anzeigen. Hier wird lediglich die Summe gezogen.
Soweit so gut ... das funktioniert auch alles so, wie ich es gerne will.

Ich habe eine weitere Tabelle und eine Abfrage, die mir das genaue Fondsvermögen angibt. Allerdings schaffe ich es nicht, das Fondsvermögen aus dieser Abfrage in meinen Bericht zu integrieren.
Die Daten beziehen sich jeweils immer auf einen Ultimotermin und ich brauche den Wert des Fondsvermögens im Fußbereich.
Kann mir jemand sagen, wie ich mich auf den Wert meiner Abfrage (Fondsvermögen) des jeweiligen Fonds beziehen kann? 

Ich habe es über ein Textfeld probiert und als Steuerelementinhalt folgenden "Code" probiert:

[abf_nach_Valuta_Fondsvermögen]![Fondsvermögen]

Das kann aber natürlich nicht funktionieren.
Ich muss ja irgendwie noch den betroffenen Fonds mitgeben, für den ich den Wert erhalten will.

War das verständlich?

DF6GL

Hallo,
#
wenn lediglich ein Wert (Einzelwert, Summe, Durchschnittswert) aus einer "fremden" Tabelle oder Abfrage benötigt wird, könnten die Domänenaggregatsfunktionen (siehe VBA-Hilfe) hilfreich sein.  ---> DLookup(), DSum(), DCount(),AVG(), etc...

Wenn mehrere DS zur Anzeige gebracht werden sollen, könnte z. B. ein Unterbericht zur Lösung beitragen.

dobby110

Vielen Dank.

Ich hab es jetzt so versucht:

Als Steuerelementinhalt

=DLookup("[Fondsvermögen]", "abf_nach_Valuta_Fondsvermögen", "[betroffener Fonds] = [Fonds]")


Dann erhalte ich aber die Fehlermeldung:

Der von Ihnen eingegeben 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.

Hat jemand eine Idee? Ich habe auch schon versucht, meine Abfrage
in [...] zu setzen, funktioniert aber auch nicht.

=DLookup("[Fondsvermögen]", "[abf_nach_Valuta_Fondsvermögen]", "[betroffener Fonds] = [Fonds]")

Zu meinen Gedankengängen:


- "Fondsvermögen" ist der Wert, den ich haben möchte
- "abf_nach_Valuta_Fondsvermögen" ist die Abfrage, auf die ich mich beziehen möchte
- "betroffener Fonds" in meinem Bericht entspricht dem Feld "Fonds" in meiner Abfrage



MaggieMay

Hi,

erster Hinweis: als Trennzeichen sollte hier das Semikolon verwendet werden.

Zitat"betroffener Fonds" in meinem Bericht entspricht dem Feld "Fonds" in meiner Abfrage
Dann wohl eher so herum:
=DLookup("Fondsvermögen"; "abf_nach_Valuta_Fondsvermögen"; "Fonds=" & [betroffener Fonds])
Freundliche Grüße
MaggieMay

dobby110

Danke, funktioniert aber leider auch nicht.
Bekomme dann auf dem Bericht "#Fehler" ausgewiesen.

Vielleicht noch eine kurze Erklärung.
Wenn ich den Bericht öffne, werde ich nach einem Ultimotermin gefragt. Hier trage ich dann bspw. den 31.05.2016 ein.
So zieht der Bericht alle Daten vom 31.05.2016 aus der Abfrage.

Die zweite Abfrage mit den Fondsvermögen funktioniert genauso. Auch hier wird nach dem Ultimotermin gefragt und ich bekomme alle Fondsvermögen zum 31.05.2016, wenn ich diesen Termin abfrage.

Wenn ich den genannten Code benutze, werde ich aber nicht nach dem Ultimotermin in der Abfrage mit meinen Fondsvermögen gefragt und dadurch entsteht vermutlich der Fehler? Ich müsste mich also noch irgendwie auf den gewünschten Ultimotermin beziehen können oder erreichen, dass nach diesem gefragt wird.
Hat jemand eine Lösung?

MaggieMay

Hi,

du könntest evtl. beide Abfragen kombinieren und als Datensatzquelle für den Bericht einsetzen.

Zeig doch mal den SQL-Code der beiden Abfragen, dann sehen wir weiter.
Freundliche Grüße
MaggieMay

dobby110

Guten Morgen,

das wäre meiner Meinung nach auch die einfachste Lösung gewesen.
Problem ist nur, wenn ich das Fondsvermögen mit in die Abfrage einbaue, bekomme ich nicht mehr das gewünschte Ergebnis geliefert und habe die Datensätze mehrfach im Ergebnis.
Nur aus diesem Grund habe ich die zweite Abfrage mit den Fondsvermögen erstellt.

SQL für die Abfrage der Statistik:


SELECT DISTINCTROW Massnahmen.[Name Investment], Massnahmen.[betroffener Fonds], Massnahmen.[Kombi ID], Massnahmen.Währung, Sum(Massnahmen.Commitment) AS [Summe von Commitment], Sum(Massnahmen.[Höhe Capital Call]) AS [Summe von Höhe Capital Call], Sum(Massnahmen.[Höhe Distribution2]) AS [SummevonHöhe Distribution2], [Investments / Fonds].[Aktiv?]
FROM [Investments / Fonds] INNER JOIN Massnahmen ON ([Investments / Fonds].[FondsInvestment ID] = Massnahmen.[Kombi ID]) AND ([Investments / Fonds].[FondsInvestment ID] = Massnahmen.[Kombi ID]) AND ([Investments / Fonds].[FondsInvestment ID] = Massnahmen.[Kombi ID]) AND ([Investments / Fonds].[Fonds in Investments] = Massnahmen.[betroffener Fonds])
WHERE (((Massnahmen.Valuta)<[Bis Valuta]))
GROUP BY Massnahmen.[Name Investment], Massnahmen.[betroffener Fonds], Massnahmen.[Kombi ID], Massnahmen.Währung, [Investments / Fonds].[Aktiv?]
HAVING ((([Investments / Fonds].[Aktiv?])=True));



SQL für die Abfrage der Fondsvermögen:


SELECT StatistikFondsverm.ID, StatistikFondsverm.Fonds, StatistikFondsverm.Fondsvermögen, StatistikFondsverm.Monat, StatistikFondsverm.Ultimotermin
FROM StatistikFondsverm
WHERE (((StatistikFondsverm.Ultimotermin)=[Ultimotermin für Fondsvermögen]));

DF6GL

Hallo,

Warum gruppiert die Abfrage, wenn im Bericht gruppiert wird (was generell der richtige Weg ist) ?


Parameter-Kriterien in der Abfrage sind  auch zu vermeiden.  Kriterienwerte sollten bei Aufruf des Berichtes bei der Openreportmethode an das OpenArgs-Argument übergeben werden.

Der Bericht sollte so entwickelt werden, das er beim direkten Aufruf und ohne Angabe eines Kriterium alle DS wie gewünscht anzeigen kann.

Zum eigentlichen Problem:   Ist das Feld "betroffener Fonds" im Bericht tatsächlich als Textfeld-Steuerelement  vorhanden ?

Schreib auch mal so:


=DLookup("Fondsvermögen"; "abf_nach_Valuta_Fondsvermögen"; "Fonds=" & []![betroffener Fonds])


Zudem sind Sonder- und Leerzeichen in Namen der Sache nicht förderlich und sollten (eigentlich müssen) vermieden werden.

dobby110

Danke für die Antwort.

Mit den Namen ist mir bewusst. Die stammen aber noch aus meinen Access-Anfängen. Mittlerweile versuche ich das zu vermeiden.

Zu den Gruppierungen.

Ich gruppiere die Abfrage weil ich die Summe aus allen Umsätzen (Massnahmen) je Investment benötige.

In dem Bericht gruppiere ich dann nach den Fonds, in denen die Investments stecken.

Ich habe mal ein Screenshot des Berichts beigefügt, wie das aussehen soll. betroffener Fonds habe ich sogar zwei Mal auf dem Bericht.
In der farbigen Spalte will ich dann die Summen für den Fonds sehen, die ich im Bericht errechnen lasse. Und dahinter will ich auch noch das tatsächliche Fondsvermögen, welches in einer gesonderten Tabelle festgehalten wird.
Den Code habe ich probiert, funktioniert aber auch nicht.

Vielleicht ist es durch den Screenshot etwas verständlicher.
(betroffener Fonds ist ein Kombinationsfeld) Ist das evtl. das Problem?

MaggieMay

Hi,

du könntest den Parameter in einer globalen Variablen speichern und per Funktionsaufruf in die Abfrage holen:
SELECT StatistikFondsverm.ID, StatistikFondsverm.Fonds, StatistikFondsverm.Fondsvermögen, StatistikFondsverm.Monat, StatistikFondsverm.Ultimotermin
FROM StatistikFondsverm
WHERE (((StatistikFondsverm.Ultimotermin)=get_UltimoterminfürFondsvermögen()));


Public Function get_UltimoterminfürFondsvermögen()
    get_UltimoterminfürFondsvermögen = var_UltimoTermin
End Function


Abfragen kannst du den Parameter via Formular oder InputBox vor dem oder beim Öffnen des Berichts.

Wenn Ultimotermin ein Datumsfeld ist, sollte auch noch eine geeignete Datumsformatierung zum Einsatz kommen.
Freundliche Grüße
MaggieMay

dobby110

Vielen Dank,

an welcher Stelle muss ich die Codes denn einsetzen?
Im Bericht? Oder in der Abfrage für die Statistik?

MaggieMay

Das eine ist der SQL-Code der Abfrage und das andere ist eine Prozedur, die du in einem allgemeinen Modul speichern kannst. Wie das nun zum Einsatz kommt, hängt auch davon ab, wie der Bericht geöffnet wird. Hast du ein Formular aus dem heraus das gestartet wird oder wie hast du das gelöst? Und dann musst du halt entscheiden, ob du den Parameter per Formular vorgeben oder per Inputbox abfragen willst.

Man könnte die Prozedur auch folgendermaßen gestalten:
' Variablendeklaration außerhalb der Prozeduren mit modulübergreifender Gültigkeit
Global var_UltimoTermin As Variant

Public Function get_UltimoterminfürFondsvermögen()
    If IsNull(var_UltimoTermin) Then var_UltimoTermin = InputBox("Bitte Termin eingeben")
    ' -> hier sollte noch eine Überprüfung der Eingabe stattfinden...
    '     im Fehlerfall auf NULL setzen
    get_UltimoterminfürFondsvermögen = var_UltimoTermin
End Function


Dann musst du nur sicherstellen, dass der Parameter vor erneutem Öffnen des Berichts gelöscht wird, damit du nicht immer auf demselben Parameter hängen bleibst.

Abfrage:
SELECT StatistikFondsverm.ID, StatistikFondsverm.Fonds, StatistikFondsverm.Fondsvermögen, StatistikFondsverm.Monat, StatistikFondsverm.Ultimotermin
FROM StatistikFondsverm
WHERE StatistikFondsverm.Ultimotermin=CDbl(NZ(get_UltimoterminfürFondsvermögen(),0));

Freundliche Grüße
MaggieMay