Artikel

4.3.2: Prozentuale Kontexte


Lektion

Lassen Sie uns mehr über Situationen erfahren, die Prozentsätze beinhalten.

Übung (PageIndex{1}): Einen Tipp hinterlassen

Welcher dieser Ausdrücke steht für ein Trinkgeld von 15 % auf eine Mahlzeit von 20 $? Welche stellen die Gesamtrechnung dar?

(15cdot 20)

(20+0,15cdot 20)

(1.15cdot 20)

(frac{15}{100}cdot 20)

Übung (PageIndex{2}): Ein Autohaus

Ein Autohaus zahlt einen Großhandelspreis von 12.000 US-Dollar für den Kauf eines Fahrzeugs.

1. Das Autohaus will 32 % Gewinn machen.

  1. Um wie viel erhöhen sie den Preis des Fahrzeugs?
  2. Wie hoch ist der Verkaufspreis des Fahrzeugs nach dem Aufschlag?

2. Während einer Sonderverkaufsveranstaltung bietet der Händler einen Rabatt von 10 % auf den Verkaufspreis. Wie viel zahlt ein Kunde nach dem Rabatt für dieses Fahrzeug?

Bist du bereit für mehr?

Dieses Autohaus zahlt dem Verkäufer einen Bonus für den Verkauf des Autos in Höhe von 6,5 % des Verkaufspreises. Wie viel Provision hat der Verkäufer verloren, als er sich entschieden hat, einen Rabatt von 10 % auf den Autopreis anzubieten?

Übung (PageIndex{3}): Provision in einem Fitnessstudio

  1. Für jede verkaufte Fitnessstudio-Mitgliedschaft behält das Fitnessstudio 42 US-Dollar und der Mitarbeiter, der sie verkauft hat, erhält 8 US-Dollar. Wie hoch ist die Provision, die der Mitarbeiter als Prozentsatz der Gesamtkosten der Mitgliedschaft im Fitnessstudio verdient hat?
  2. Wenn ein Mitarbeiter einen Familienpass für 135 US-Dollar verkauft, wie hoch ist die Provision, die er behält?

Übung (PageIndex{4}): Kartensortierung: Prozentuale Situationen

Ihr Lehrer gibt Ihnen ein Kartenset. Wechseln Sie mit Ihrem Partner ab, indem Sie eine Situation mit einem Deskriptor zuordnen. Erkläre deinem Partner für jedes Spiel deine Argumentation. Wenn Sie anderer Meinung sind, arbeiten Sie daran, eine Einigung zu erzielen.

Zusammenfassung

Es gibt viele alltägliche Situationen, in denen ein Prozentsatz eines Geldbetrags zu diesem Betrag hinzugefügt oder davon abgezogen wird, um an eine andere Person oder Organisation ausgezahlt zu werden:

geht zuwie es funktioniert
Mehrwertsteuerdie Regierungzum Preis des Artikels hinzugefügt
Trinkgeld (Tipp)der Kellnerzu den Kosten des Essens hinzugefügt
Interesseder Kreditgeber (oder Kontoinhaber)wird dem Saldo des Kredits, der Kreditkarte oder des Bankkontos hinzugefügt
Markupder Verkäuferzum Preis eines Artikels hinzugefügt, damit der Verkäufer einen Gewinn erzielen kann
Abschlag (Rabatt)der Kundevom Preis eines Artikels abgezogen, um den Kunden zum Kauf zu animieren
KommissionDer Verkäufervon der eingezogenen Zahlung abgezogen
Tabelle (PageIndex{1})

Beispielsweise,

  • Wenn eine Restaurantrechnung 34 US-Dollar beträgt und der Kunde 40 US-Dollar zahlt, hinterlässt er 6 US-Dollar als Trinkgeld für den Kellner. Das sind 18% von $34, also haben sie ein Trinkgeld von 18% hinterlassen. Aus Kundensicht können wir uns dies als eine Erhöhung der Restaurantrechnung um 18% vorstellen.
  • Wenn ein Makler einer Familie hilft, ihr Haus für 200.000 US-Dollar zu verkaufen und eine Provision von 3% erhält, dann verdient der Makler 6.000 US-Dollar, weil ((0,03)cdot 200.000=6.000) und die Familie erhält 194.000 US-Dollar, weil (200.000-6.000 =194.000). Aus Sicht der Familie können wir uns dies als einen Rückgang des Verkaufspreises des Hauses um 3% vorstellen.

Trainieren

Übung (PageIndex{5})

Ein Autohaus zahlt 8.350 Dollar für ein Auto. Sie erhöhen den Preis um 17,4%, um den Verkaufspreis zu erhalten. Wie hoch ist der Verkaufspreis des Autos bei diesem Händler?

Übung (PageIndex{6})

Ein Geschäft bietet 20% Rabatt auf Hosen. Mit diesem Rabatt beträgt der Preis für eine Hose vor Steuern 15,20 USD. Was war der Originalpreis der Hose?

  1. ($3.04)
  2. ($12.16)
  3. ($18.24)
  4. ($19.00)

Übung (PageIndex{7})

Lin kauft mit ihrem Vater eine Couch und hört, wie er den Verkäufer fragt: „Wie hoch ist Ihre Provision?“ Die Verkäuferin sagt, dass ihre Provision (5frac{1}{2}\%) des Verkaufspreises beträgt.

  1. Wie viel Provision erhält der Verkäufer durch den Verkauf einer Couch für 495 US-Dollar?
  2. Wie viel Geld bekommt der Laden durch den Verkauf der Couch?

Übung (PageIndex{8})

Ein Student nimmt bei einer Bank einen Kredit in Höhe von 7.500 US-Dollar auf. Wie hoch ist der Restbetrag des Darlehens nach einem Jahr (vorausgesetzt, der Student hat noch keine Zahlungen geleistet):

  1. wenn die Bank jedes Jahr 3,8% Zinsen berechnet?
  2. wenn die Bank jährlich 5,3% Zinsen berechnet?

(Ab Lektion 4.2.4)

Übung (PageIndex{9})

Verbinde die Situationen mit den Gleichungen.

  1. Mai schlief (x) Stunden und Kiran schlief (frac{1}{10}) weniger.
  2. Kiran übte (x) Stunden am Klavier, und Mai übte (frac{2}{5}) weniger.
  3. Mai trank (x) oz Saft und Kiran trank (frac{4}{3}) mehr.
  4. Kiran gab (x) Dollar aus und Mai gab (frac{1}{4}) weniger aus.
  5. Mai aß (x) Gramm Mandeln und Kiran aß (1,5) mal mehr.
  6. Kiran sammelte (x) Pfund Recycling und Mai sammelte (frac{3}{10}) weniger.
  7. Mai ist (x) Kilometer gelaufen und Kiran ist (frac{3}{8}) mehr gelaufen.
  8. Kiran hat (x) Rätsel gelöst und Mai hat (frac{3}{5}) noch mehr abgeschlossen.

(y=2.33x)

(y=1,375x)

(y=0,6x)

(y=0,9x)

(y=0,75x)

(y=1,6x)

(y=0,7x)

(y=2,5x)

(Ab Einheit 4.1.5)


3.2 Die Elemente der Kultur

Kultur wurde früher als Symbole, Sprache, Überzeugungen, Werte und Artefakte definiert, die Teil jeder Gesellschaft sind. Wie diese Definition nahelegt, gibt es zwei grundlegende Komponenten von Kultur: Ideen und Symbole einerseits und Artefakte (materielle Gegenstände) andererseits. Der erste Typ, der als immaterielle Kultur bezeichnet wird, umfasst die Werte, Überzeugungen, Symbole und die Sprache, die eine Gesellschaft definieren. Der zweite Typ, materielle Kultur genannt, umfasst alle physischen Gegenstände der Gesellschaft, wie ihre Werkzeuge und Technologien, Kleidung, Essgeschirr und Transportmittel. Diese Elemente der Kultur werden als nächstes diskutiert.


5.1. Arten der Konvertierung

Spezifische Typkonvertierungen in der Programmiersprache Java werden in 13 Arten unterteilt.

5.1.1. Identitätskonvertierung

Eine Konvertierung von einem Typ in denselben Typ ist für jeden Typ zulässig.

Das mag trivial erscheinen, hat aber zwei praktische Konsequenzen. Erstens ist es immer erlaubt, dass ein Ausdruck von Anfang an den gewünschten Typ hat, was die einfach formulierte Regel erlaubt, dass jeder Ausdruck einer Umwandlung unterliegt, wenn auch nur einer trivialen Identitätsumwandlung. Zweitens bedeutet dies, dass es einem Programm aus Gründen der Klarheit erlaubt ist, redundante Cast-Operatoren einzuschließen.

5.1.2. Erweiterung der primitiven Konvertierung

19 spezifische Konvertierungen von primitiven Typen werden als . bezeichnet Erweiterung primitiver Konvertierungen :

byte zu short , int , long , float oder double

short to int , long , float oder double

char zu int , long , float oder double

int zu long , float oder double

In den folgenden Fällen, in denen der numerische Wert exakt beibehalten wird, gehen bei einer Konvertierung von Erweiterungsprimitiven keine Informationen über die Gesamtgröße eines numerischen Werts verloren:

von einem ganzzahligen Typ zu einem anderen ganzzahligen Typ

von byte , short oder char zu einem Gleitkommatyp

von float zu double in einem strikten fp-Ausdruck (§15.4)

Bei einer sich erweiternden primitiven Konvertierung von float in double, die nicht striktfp ist, können Informationen über die Gesamtgröße des konvertierten Werts verloren gehen.

Eine sich erweiternde primitive Konvertierung von int in float oder von long in float oder von long in double kann zu führen Genauigkeitsverlust d. h., das Ergebnis kann einige der niederwertigsten Bits des Werts verlieren. In diesem Fall ist der resultierende Gleitkommawert eine korrekt gerundete Version des ganzzahligen Werts, wobei die Rundung auf die nächste Rundungsrichtlinie (§4.2.4) verwendet wird.

Eine erweiternde Umwandlung eines vorzeichenbehafteten ganzzahligen Werts in einen ganzzahligen Typ T erweitert einfach die Zweier-Komplement-Darstellung des ganzzahligen Werts, um das breitere Format auszufüllen.

Eine erweiternde Konvertierung eines Zeichens in einen ganzzahligen Typ T null erweitert die Darstellung des Zeichenwerts, um das breitere Format auszufüllen.

Trotz der Tatsache, dass Genauigkeitsverluste auftreten können, führt eine Konvertierung von Erweiterungsprimitiven nie zu einer Laufzeitausnahme (§11.1.1).

Beispiel 5.1.2-1. Erweiterung der primitiven Konvertierung

Dies weist darauf hin, dass bei der Konvertierung vom Typ int in den Typ float Informationen verloren gegangen sind, da Werte vom Typ float nicht auf neun signifikante Stellen genau sind.

5.1.3. Einschränkende primitive Konvertierung

22 spezifische Konvertierungen von primitiven Typen werden als . bezeichnet Einschränken primitiver Konvertierungen :

int in byte , short oder char

long to byte , short , char oder int

float to byte , short , char , int oder long

double to byte , short , char , int , long oder float

Bei einer einschränkenden primitiven Konvertierung können Informationen über die Gesamtgröße eines numerischen Werts sowie Genauigkeit und Reichweite verloren gehen.

Eine verengende primitive Konvertierung von Double in Float verwendet die Rundungsrichtlinie für die nächste Rundung (§4.2.4). Diese Konvertierung kann an Präzision verlieren, aber auch an Reichweite, was zu einer Float-Null von einem Double ungleich Null und einer Float-Infinity von einem endlichen Double führt. Eine doppelte NaN wird in eine Float-NaN umgewandelt und eine doppelte Unendlichkeit wird in eine gleichzeichenbehaftete Float-Unendlichkeit umgewandelt.

Eine einschränkende Konvertierung einer vorzeichenbehafteten Ganzzahl in eine ganzzahlige T verwirft einfach alle außer den n Bits niedrigster Ordnung, wobei n ist die Anzahl der Bits, die verwendet werden, um den Typ T darzustellen. Dies kann neben einem möglichen Informationsverlust über die Größe des Zahlenwertes dazu führen, dass das Vorzeichen des resultierenden Wertes vom Vorzeichen des Eingabewertes abweicht.

Eine einschränkende Konvertierung eines char in einen ganzzahligen Typ T verwirft ebenfalls einfach alle außer dem n Bits niedrigster Ordnung, wobei n ist die Anzahl der Bits, die verwendet werden, um den Typ T darzustellen. Neben einem möglichen Informationsverlust über die Größe des numerischen Werts kann dies dazu führen, dass der resultierende Wert eine negative Zahl ist, obwohl chars 16-Bit-Integer-Werte ohne Vorzeichen darstellen.

Eine einschränkende Konvertierung einer Gleitkommazahl in einen ganzzahligen Typ T erfordert zwei Schritte:

Im ersten Schritt wird die Gleitkommazahl entweder in ein long , wenn T long ist, oder in ein int , wenn T byte , short , char oder int ist, wie folgt umgewandelt:

Wenn die Gleitkommazahl NaN ist (§4.2.3), ist das Ergebnis des ersten Schrittes der Konvertierung ein int oder long 0 .

Andernfalls, wenn die Gleitkommazahl keine Unendlichkeit ist, wird der Gleitkommawert auf einen ganzzahligen Wert V gerundet, wobei die Rundungsrichtlinie zum Runden auf Null (§4.2.4) verwendet wird. Dann gibt es zwei Fälle:

Wenn T long ist und dieser ganzzahlige Wert als long dargestellt werden kann, dann ist das Ergebnis des ersten Schrittes der Long-Wert V.

Andernfalls, wenn dieser ganzzahlige Wert als int dargestellt werden kann, ist das Ergebnis des ersten Schritts der int-Wert V .

Andernfalls muss einer der beiden folgenden Fälle zutreffen:

Der Wert muss zu klein sein (ein negativer Wert mit großem Betrag oder negativer Unendlichkeit), und das Ergebnis des ersten Schritts ist der kleinste darstellbare Wert vom Typ int oder long .

Der Wert muss zu groß sein (ein positiver Wert mit großem Betrag oder positiv unendlich), und das Ergebnis des ersten Schritts ist der größte darstellbare Wert vom Typ int oder long .

Wenn T int oder long ist, ist das Ergebnis der Konvertierung das Ergebnis des ersten Schritts.

Wenn T byte , char oder short ist, ist das Ergebnis der Konvertierung das Ergebnis einer einschränkenden Konvertierung in den Typ T (§5.1.3) des Ergebnisses des ersten Schritts.

Trotz der Tatsache, dass Überlauf, Unterlauf oder andere Informationsverluste auftreten können, führt eine einschränkende primitive Konvertierung nie zu einer Laufzeitausnahme (§11.1.1).

Beispiel 5.1.3-1. Einschränkende primitive Konvertierung

Dieses Programm erzeugt die Ausgabe:

Die Ergebnisse für char , int und long sind nicht überraschend, da sie die minimalen und maximalen darstellbaren Werte des Typs ergeben.

Die Ergebnisse für byte und short verlieren Informationen über Vorzeichen und Größe der Zahlenwerte und verlieren auch an Genauigkeit. Die Ergebnisse können verstanden werden, indem die niederwertigen Bits des minimalen und maximalen int untersucht werden. Der minimale int ist hexadezimal 0x80000000 , und der maximale int ist 0x7ffffffff . Dies erklärt die kurzen Ergebnisse, die die unteren 16 Bit dieser Werte sind, nämlich 0x0000 und 0xffff, es erklärt die char-Ergebnisse, die auch die unteren 16 Bit dieser Werte sind, nämlich 'u0000' und 'uffff' und es erklärt die Byte-Ergebnisse, die die unteren 8 Bits dieser Werte sind, nämlich 0x00 und 0xff .

Beispiel 5.1.3-2. Einschränken von primitiven Conversions, bei denen Informationen verloren gehen

5.1.4. Primitive Konversion erweitern und verengen

Die folgende Konvertierung kombiniert sowohl erweiternde als auch verengende primitive Konvertierungen:

Zuerst wird das Byte in ein Int über die Konvertierung der primitiven Erweiterung (§5.1.2) umgewandelt, und dann wird das resultierende int durch die Konvertierung der primitiven Erweiterung (§5.1.3) in ein char konvertiert.

5.1.5. Erweiterung der Referenzkonvertierung

EIN Erweiterung der Referenzkonvertierung existiert von einem beliebigen Referenztyp S bis zu einem beliebigen Referenztyp T , vorausgesetzt, S ist ein Untertyp von T (§4.10).

Erweiterungsreferenzkonvertierungen erfordern zur Laufzeit nie eine spezielle Aktion und lösen daher zur Laufzeit nie eine Ausnahme aus. Sie bestehen einfach darin, eine Referenz als einen anderen Typ zu betrachten, der zum Zeitpunkt der Kompilierung als korrekt bewiesen werden kann.

Der Nulltyp ist kein Referenztyp (§4.1), und daher existiert keine erweiternde Referenzkonvertierung vom Nulltyp in einen Referenztyp. Viele Konvertierungskontexte erlauben jedoch explizit die Konvertierung des Nulltyps in einen Referenztyp.

5.1.6. Einschränkende Referenzkonvertierung

EIN Einschränkende Referenzumwandlung behandelt Ausdrücke eines Verweistyps S als Ausdrücke eines anderen Verweistyps T , wobei S kein Untertyp von T ist. Die unterstützten Typenpaare sind in §5.1.6.1 definiert. Im Gegensatz zur Konvertierung von Erweiterungsreferenzen müssen die Typen nicht direkt miteinander verknüpft sein. Es gibt jedoch Einschränkungen, die die Konvertierung zwischen bestimmten Typenpaaren verbieten, wenn statisch nachgewiesen werden kann, dass kein Wert von beiden Typen sein kann.

Eine einschränkende Referenzkonvertierung kann einen Test zur Laufzeit erfordern, um zu validieren, dass ein Wert des Typs S ein legitimer Wert des Typs T ist. Aufgrund des Fehlens parametrisierter Typinformationen zur Laufzeit können einige Konvertierungen jedoch nicht vollständig durch einen Laufzeittest validiert werden. Sie werden zur Kompilierzeit markiert (§5.1.6.2). Für Konvertierungen, die durch einen Laufzeittest vollständig validiert werden können, und für bestimmte Konvertierungen, die parametrisierte Typinformationen beinhalten, aber zur Laufzeit noch teilweise validiert werden können, wird eine ClassCastException geworfen, wenn der Test fehlschlägt (§5.1.6.3).

5.1.6.1. Zulässige Konvertierung von einschränkenden Referenzen

Eine einschränkende Verweiskonvertierung liegt vom Verweistyp S in den Verweistyp T vor, wenn alle der folgenden Bedingungen zutreffen:

Wenn es einen parametrisierten Typ X gibt, der ein Supertyp von T ist, und einen parametrisierten Typ Y, der ein Supertyp von S ist, so dass die Löschungen von X und Y gleich sind, dann sind X und Y nicht beweisbar verschieden (§4.5 ).

Bei der Verwendung von Typen aus dem Paket java.util als Beispiel existiert keine einschränkende Referenzkonvertierung von ArrayList<String> in ArrayList<Object> oder umgekehrt, da die Typargumente String und Object nachweislich verschieden sind. Aus dem gleichen Grund existiert keine einschränkende Referenzkonvertierung von ArrayList<String> in List<Object> oder umgekehrt. Die Ablehnung von nachweislich unterschiedlichen Typen ist ein einfaches statisches Tor, um "dumme" einschränkende Referenzkonvertierungen zu verhindern.

Einer der folgenden Fälle trifft zu:

S und T sind Klassentypen und entweder | S | <: | T | oder | T | <: | S |.

S und T sind Schnittstellentypen.

S ist ein Klassentyp, T ist ein Schnittstellentyp und S benennt keine endgültige Klasse (§8.1.1).

S ist ein Klassentyp, T ist ein Schnittstellentyp und S benennt eine letzte Klasse, die die von T benannte Schnittstelle implementiert.

S ist ein Schnittstellentyp, T ist ein Klassentyp und T benennt keine endgültige Klasse.

S ist ein Schnittstellentyp, T ist ein Klassentyp und T benennt eine letzte Klasse, die die von S benannte Schnittstelle implementiert.

S ist der Klassentyp Object oder der Interface-Typ java.io.Serializable oder Cloneable (die einzigen Interfaces, die von Arrays implementiert werden (§10.8)), und T ist ein Array-Typ.

S ist ein Array-Typ SC[], das heißt, ein Array von Komponenten des Typs SC T ist ein Array-Typ TC[], das heißt, ein Array von Komponenten des Typs TC und es existiert eine einschränkende Referenzumwandlung von SC in TC.

S ist eine Typvariable, und eine einschränkende Referenzumwandlung existiert von der oberen Grenze von S zu T .

T ist eine Typvariable, und von S bis zur oberen Grenze von T existiert entweder eine erweiternde Referenzkonvertierung oder eine einschränkende Referenzkonvertierung.

S ist ein Kreuzungstyp S1 &. & Sn , und für alle ich (1 ≤ ichn ), besteht entweder eine erweiternde Referenzumwandlung oder eine einschränkende Referenzumwandlung von Sich zu T.

T ist ein Kreuzungstyp T1 &. & Tn , und für alle ich (1 ≤ ichn ), besteht entweder eine erweiternde Referenzkonvertierung oder eine einschränkende Referenzkonvertierung von S nach Tich .

5.1.6.2. Aktivierte und nicht markierte einschränkende Referenzkonvertierungen

Eine einschränkende Referenzumwandlung ist entweder geprüft oder ungeprüft . Diese Begriffe beziehen sich auf die Fähigkeit der Java Virtual Machine, die Typkorrektheit der Konvertierung zu überprüfen oder nicht.

Wenn eine einschränkende Referenzkonvertierung deaktiviert ist, kann die Java Virtual Machine ihre Typkorrektheit nicht vollständig überprüfen, was möglicherweise zu Heap-Verschmutzung (§4.12.2) führt. Um dies dem Programmierer anzuzeigen, verursacht eine nicht markierte einschränkende Referenzkonvertierung eine Kompilierzeit ungeprüfte Warnung , sofern nicht durch @SuppressWarnings (§9.6.4.5) unterdrückt. Wenn dagegen eine einschränkende Referenzkonvertierung nicht deaktiviert ist, wird sie überprüft, dass die Java Virtual Machine ihre Typkorrektheit vollständig überprüfen kann, sodass zur Kompilierzeit keine Warnung ausgegeben wird.

Die nicht markierten einschränkenden Referenzumwandlungen sind wie folgt:

Eine einschränkende Referenzkonvertierung von einem Typ S in eine parametrisierte Klasse oder einen Schnittstellentyp T wird deaktiviert, es sei denn, mindestens eine der folgenden Bedingungen ist zutrifft:

Alle Typargumente von T sind unbeschränkte Platzhalter.

T <: S , und S hat keinen anderen Untertyp X als T, wobei die Typargumente von X nicht in den Typargumenten von T enthalten sind.

Eine einschränkende Referenzkonvertierung von einem Typ S in eine Typvariable T ist nicht markiert.

Eine einschränkende Referenzumwandlung von einem Typ S in einen Kreuzungstyp T1 &. & Tn ist nicht markiert, wenn ein T exists existiertich (1 ≤ ichn ) so dass S kein Untertyp von T . istich und eine verengende Referenzumwandlung von S nach Tich ist ungeprüft.

5.1.6.3. Einschränken von Referenzkonvertierungen zur Laufzeit

Alle geprüft einschränkende Referenzumsetzungen erfordern eine Gültigkeitsprüfung zur Laufzeit. Diese Konvertierungen erfolgen in erster Linie in Klassen- und Interfacetypen, die nicht parametrisiert sind.

Manche ungeprüft einschränkende Referenzumsetzungen erfordern eine Gültigkeitsprüfung zur Laufzeit. Dies hängt davon ab, ob die nicht markierte einschränkende Referenzkonvertierung völlig ungeprüft oder teilweise ungeprüft . Eine teilweise ungeprüfte einschränkende Referenzumsetzung erfordert eine Gültigkeitsprüfung zur Laufzeit, während eine vollständig ungeprüfte einschränkende Verweisumsetzung dies nicht tut.

Diese Begriffe beziehen sich auf die Kompatibilität der an der Konvertierung beteiligten Typen wenn als Rohtypen betrachtet . Wenn die Konvertierung konzeptionell ein "Upcast" ist, dann ist die Konvertierung völlig ungeprüft Es ist kein Laufzeittest erforderlich, da die Konvertierung im nicht generischen Typsystem der Java Virtual Machine zulässig ist. Im Gegensatz dazu, wenn die Konvertierung konzeptionell ein "Downcast" ist, dann ist die Konvertierung teilweise ungeprüft selbst im nicht generischen Typsystem der Java Virtual Machine ist eine Laufzeitprüfung erforderlich, um die Kompatibilität der an der Konvertierung beteiligten (Roh-)Typen zu testen.

Am Beispiel von Typen aus dem java.util-Paket wird eine Konvertierung von ArrayList<String> nach Collection<T> komplett deaktiviert, da der (rohe) Typ ArrayList ein Untertyp des (rohen) Typs Collection in der Java Virtual Machine ist. Dagegen wird eine Konvertierung von Collection<T> nach ArrayList<String> teilweise deaktiviert, da der (rohe) Typ Collection kein Untertyp des (rohen) Typs ArrayList in der Java Virtual Machine ist.

Die Kategorisierung einer ungeprüften einschränkenden Referenzumwandlung ist wie folgt:

Eine ungeprüfte verengende Referenzumwandlung von S in einen Nicht-Schnitttyp T ist vollständig ungeprüft, wenn | S | <: | T |.

Andernfalls ist es teilweise deaktiviert.

Eine ungeprüfte verengende Referenzumwandlung von S in einen Kreuzungstyp T1 &. & Tn ist völlig unmarkiert, wenn für alle ich (1 ≤ ichn ), entweder S <: Tich oder eine verengende Referenzumwandlung von S nach Tich ist komplett ungeprüft.

Andernfalls ist es teilweise deaktiviert.

Die Laufzeitgültigkeitsprüfung für eine geprüfte oder teilweise ungeprüfte einschränkende Referenzumsetzung sieht wie folgt aus:

Wenn der Wert zur Laufzeit null ist, ist die Konvertierung zulässig.

Andernfalls sei R die Klasse des Objekts, auf das der Wert verweist, und sei T die Löschung (§4.6) des Typs, in den konvertiert wird. Dann:

Wenn R eine gewöhnliche Klasse ist (keine Array-Klasse):

Wenn T ein Klassentyp ist, muss R entweder dieselbe Klasse wie T (§4.3.4) oder eine Unterklasse von T sein, oder es wird eine ClassCastException geworfen.

Wenn T ein Schnittstellentyp ist, muss R die Schnittstelle T implementieren (§8.1.5), oder es wird eine ClassCastException geworfen.

Wenn T ein Arraytyp ist, wird eine ClassCastException ausgelöst.

Beachten Sie, dass R keine Schnittstelle sein kann, wenn diese Regeln zum ersten Mal für eine bestimmte Konvertierung angewendet werden, aber R kann eine Schnittstelle sein, wenn die Regeln rekursiv angewendet werden, da der Laufzeitreferenzwert auf ein Array verweisen kann, dessen Elementtyp ein Schnittstellentyp ist.

Wenn T ein Klassentyp ist, muss T Object (§4.3.2) sein, oder es wird eine ClassCastException geworfen.

Wenn T ein Schnittstellentyp ist, muss R entweder dieselbe Schnittstelle wie T oder eine Unterschnittstelle von T sein, oder es wird eine ClassCastException ausgelöst.

Wenn T ein Arraytyp ist, wird eine ClassCastException ausgelöst.

Wenn R eine Klasse ist, die ein Array vom Typ RC [] repräsentiert, d. h. ein Array von Komponenten vom Typ RC :

Wenn T ein Klassentyp ist, muss T Object (§4.3.2) sein, oder es wird eine ClassCastException geworfen.

Wenn T ein Schnittstellentyp ist, muss T der Typ java.io.Serializable oder Cloneable sein (die einzigen von Arrays implementierten Schnittstellen), oder es wird eine ClassCastException ausgelöst.

Wenn T ein Array-Typ TC [] ist, d. h. ein Array von Komponenten des Typs TC , wird eine ClassCastException geworfen, es sei denn, entweder TC und RC sind derselbe primitive Typ oder TC und RC sind Referenztypen und werden durch eine rekursive Anwendung dieser Laufzeitregeln.

Wenn die Umwandlung in einen Kreuzungstyp T . erfolgt1 &. & Tn , dann für alle ich (1 ≤ ichn ), eine eventuell erforderliche Laufzeitprüfung für eine Konvertierung von S nach Tich wird auch für die Umwandlung in den Kreuzungstyp benötigt.

5.1.7. Boxen-Umwandlung

Die Boxing-Konvertierung behandelt Ausdrücke eines primitiven Typs als Ausdrücke eines entsprechenden Referenztyps. Konkret werden die folgenden neun Konvertierungen als Boxumwandlungen :

Vom Typ Boolean zu Typ Boolean

Vom Typ-Byte zum Typ-Byte

Von Typ Short zu Typ Short

Vom Typ char zum Typ Character

Von Typ int zu Typ Integer

Von Typ Long zu Typ Long

Vom Typ Float zu Typ Float

Vom Typ Double zum Typ Double

Vom Nulltyp zum Nulltyp

Diese Regel ist notwendig, weil der Bedingungsoperator (§15.25) Boxing-Konvertierung auf die Typen seiner Operanden anwendet und das Ergebnis in weiteren Berechnungen verwendet.

Zur Laufzeit läuft die Boxkonvertierung wie folgt ab:

Wenn p ein Wert vom Typ boolean ist, wandelt die Boxing-Konvertierung p in eine Referenz r der Klasse und vom Typ Boolean um, sodass r .booleanValue() == p

Wenn p ein Wert vom Typ byte ist, wandelt die Boxing-Konvertierung p in eine Referenz r vom Typ Byte um, sodass r .byteValue() == p

Wenn p ein Wert vom Typ char ist, wandelt die Boxkonvertierung p in eine Referenz r der Klasse und vom Typ Character um, sodass r .charValue() == p

Wenn p ein Wert des Typs short ist, dann konvertiert die Boxing-Konvertierung p in eine Referenz r der Klasse und des Typs Short , sodass r .shortValue() == p

Wenn p ein Wert vom Typ int ist, dann konvertiert die Boxing-Konvertierung p in eine Referenz r vom Typ und vom Typ Integer , sodass r .intValue() == p

Wenn p ein Wert vom Typ long ist, dann konvertiert die Boxing-Konvertierung p in eine Referenz r der Klasse und vom Typ Long , sodass r .longValue() == p

Wenn p ein Wert vom Typ float ist, dann:

Wenn p nicht NaN ist, konvertiert die Boxing-Konvertierung p in eine Referenz r der Klasse und des Typs Float , sodass r .floatValue() zu p ausgewertet wird

Andernfalls konvertiert die Boxing-Konvertierung p in eine Referenz r der Klasse und des Typs Float, sodass r .isNaN() als wahr ausgewertet wird

Wenn p ein Wert vom Typ double ist, dann:

Wenn p nicht NaN ist, konvertiert die Boxing-Konvertierung p in eine Referenz r der Klasse und des Typs Double , sodass r .doubleValue() zu p ausgewertet wird

Andernfalls konvertiert die Boxing-Konvertierung p in eine Referenz r der Klasse und des Typs Double, sodass r .isNaN() als wahr ausgewertet wird

Wenn p ein Wert eines anderen Typs ist, entspricht die Boxing-Konvertierung einer Identitätskonvertierung (§5.1.1).

Wenn der einzuschließende Wert p das Ergebnis der Auswertung eines konstanten Ausdrucks (§15.29) vom Typ boolean , byte , char , short , int oder long ist und das Ergebnis true , false ist, ein Zeichen im Bereich 'u0000 ' bis einschließlich 'u007f' oder eine ganze Zahl im Bereich von -128 bis einschließlich 127, dann seien a und b die Ergebnisse von zwei beliebigen Boxing-Konvertierungen von p . Es gilt immer a == b .

Idealerweise würde das Boxen eines primitiven Werts immer eine identische Referenz ergeben. In der Praxis ist dies mit bestehenden Implementierungstechniken möglicherweise nicht machbar. Die obige Regel ist ein pragmatischer Kompromiss, der verlangt, dass bestimmte gemeinsame Werte immer in ununterscheidbare Objekte verpackt werden. Die Implementierung kann diese träge oder eifrig zwischenspeichern. Für andere Werte lässt die Regel seitens des Programmierers keine Annahmen über die Identität der eingerahmten Werte zu. Dies ermöglicht (aber nicht erforderlich) die gemeinsame Nutzung einiger oder aller dieser Referenzen.

Dies stellt sicher, dass das Verhalten in den meisten Fällen das gewünschte ist, ohne dass eine übermäßige Leistungseinbuße verursacht wird, insbesondere bei kleinen Geräten. Implementierungen mit weniger Speicherbeschränkung können beispielsweise alle char- und short-Werte sowie int- und long-Werte im Bereich von -32 KB bis +32 KB zwischenspeichern.

Eine Boxing-Konvertierung kann zu einem OutOfMemoryError führen, wenn eine neue Instanz einer der Wrapper-Klassen ( Boolean , Byte , Character , Short , Integer , Long , Float oder Double ) zugewiesen werden muss und nicht genügend Speicherplatz verfügbar ist.

5.1.8. Unboxing-Konvertierung

Die Unboxing-Konvertierung behandelt Ausdrücke eines Referenztyps als Ausdrücke eines entsprechenden primitiven Typs. Konkret werden die folgenden acht Konvertierungen als Unboxing-Konvertierungen :

Vom Typ Boolean zu Typ Boolean

Von Typ-Byte zu Typ-Byte

Von Typ Short zu Typ Short

Vom Typ Character zum Typ char

Vom Typ Integer zum Typ int

Von Typ Long zu Typ Long

Von Typ Float zu Typ Float

Von Typ Double zu Typ Double

Zur Laufzeit läuft die Unboxing-Konvertierung wie folgt ab:

Wenn r eine Referenz vom Typ Boolean ist, konvertiert die Unboxing-Konvertierung r in r .booleanValue()

Wenn r eine Referenz vom Typ Byte ist, konvertiert die Unboxing-Konvertierung r in r .byteValue()

Wenn r eine Referenz vom Typ Character ist, konvertiert die Unboxing-Konvertierung r in r .charValue()

Wenn r eine Referenz vom Typ Short ist, konvertiert die Unboxing-Konvertierung r in r .shortValue()

Wenn r eine Referenz vom Typ Integer ist, konvertiert die Unboxing-Konvertierung r in r .intValue()

Wenn r eine Referenz vom Typ Long ist, konvertiert die Unboxing-Konvertierung r in r .longValue()

Wenn r eine Referenz vom Typ Float ist, konvertiert die Unboxing-Konvertierung r in r .floatValue()

Wenn r eine Referenz vom Typ Double ist, konvertiert die Unboxing-Konvertierung r in r .doubleValue()

Wenn r null ist, löst die Unboxing-Konvertierung eine NullPointerException aus

Ein Typ heißt in einen numerischen Typ umwandelbar wenn es sich um einen numerischen Typ (§4.2) oder um einen Referenztyp handelt, der durch Unboxing-Konvertierung in einen numerischen Typ umgewandelt werden kann.

Ein Typ heißt in einen integralen Typ umwandelbar wenn es sich um einen ganzzahligen Typ handelt oder es sich um einen Referenztyp handelt, der durch Unboxing-Konvertierung in einen ganzzahligen Typ umgewandelt werden kann.

5.1.9. Nicht markierte Konvertierung

Sei G eine generische Typdeklaration mit . benennen n Typparameter.

Da ist ein ungeprüfte Konvertierung vom rohen Klassen- oder Schnittstellentyp (§4.8) G zu einem beliebigen parametrisierten Typ der Form G < T1 . Tn >.

Da ist ein ungeprüfte Konvertierung vom rohen Array-Typ G [] k zu einem beliebigen Array-Typ der Form G < T1 . Tn >[]k. (Die Notation [] k bezeichnet einen Array-Typ von k Maße.)

Die Verwendung einer ungeprüften Konvertierung verursacht eine Kompilierzeit ungeprüfte Warnung es sei denn, alle Typargumente Tich (1 ≤ ichn ) sind unbegrenzte Platzhalter (§4.5.1), oder die Warnung wird durch @SuppressWarnings unterdrückt (§9.6.4.5).

Die ungeprüfte Konvertierung wird verwendet, um eine reibungslose Interaktion von Legacy-Code, der vor der Einführung von generischen Typen geschrieben wurde, mit Bibliotheken zu ermöglichen, die einer Konvertierung unterzogen wurden, um Genericity zu verwenden (ein Prozess, den wir Generierung nennen). Unter solchen Umständen (insbesondere Clients des Collections Framework in java.util ) verwendet Legacy-Code Rohtypen (z. B. Collection anstelle von Collection<String> ). Ausdrücke von Rohtypen werden als Argumente an Bibliotheksmethoden übergeben, die parametrisierte Versionen derselben Typen wie die Typen ihrer entsprechenden formalen Parameter verwenden.

Solche Aufrufe können unter dem Typsystem mit Generics nicht als statisch sicher nachgewiesen werden. Das Ablehnen solcher Aufrufe würde große Teile des vorhandenen Codes ungültig machen und sie daran hindern, neuere Versionen der Bibliotheken zu verwenden. Dies wiederum würde Bibliotheksanbieter davon abhalten, Generika zu nutzen. Um eine solche unerwünschte Wendung von Ereignissen zu verhindern, kann ein Rohtyp in einen willkürlichen Aufruf der generischen Typdeklaration umgewandelt werden, auf die sich der Rohtyp bezieht. Die Umstellung ist zwar nicht solide, wird aber als Zugeständnis an die Praktikabilität geduldet. In solchen Fällen wird eine ungeprüfte Warnung ausgegeben.

5.1.10. Aufnahmekonvertierung

Lassen Sie G eine generische Typdeklaration (§8.1.2, §9.1.2) benennen mit n Typparameter A1 . EINn mit entsprechenden Schranken U1 . Un .

Es existiert ein Capture-Konvertierung aus einem parametrisierten Typ G < T1 . Tn > (§4.5) zu einem parametrisierten Typ G < S1 . Sn > , wo, für 1 ≤ ichn :

Wenn Tich ist ein Argument vom Typ Wildcard (§4.5.1) der Form ? , dann Sich ist eine Variable vom frischen Typ, deren obere Schranke U . istich [ EIN1 := S1 . EINn := Sn ] und deren untere Grenze der Nulltyp ist (§4.1).

Wenn Tich ist ein Wildcard-Typargument der Form ? verlängert Bich , dann Sich ist eine Variable vom frischen Typ, deren obere Schranke glb( Bich , Uich [ EIN1 := S1 . EINn := Sn ] ) und deren untere Grenze der Nulltyp ist.

Es ist ein Kompilierzeitfehler, wenn für zwei beliebige Klassen (nicht Schnittstellen) Vich und VJ , Vich ist keine Unterklasse von VJ oder umgekehrt.

Wenn Tich ist ein Wildcard-Typargument der Form ? hervorragendich , dann Sich ist eine Variable vom frischen Typ, deren obere Schranke U . istich [ EIN1 := S1 . EINn := Sn ] und deren untere Schranke B istich .

Die Capture-Konvertierung für jeden anderen Typ als einen parametrisierten Typ (§4.5) fungiert als Identitätskonvertierung (§5.1.1).

Die Capture-Konvertierung wird nicht rekursiv angewendet.

Die Capture-Konvertierung erfordert zur Laufzeit nie eine spezielle Aktion und löst daher zur Laufzeit nie eine Ausnahme aus.

Die Capture-Konvertierung wurde entwickelt, um Platzhalter nützlicher zu machen. Um die Motivation zu verstehen, schauen wir uns zunächst die Methode java.util.Collections.reverse() an:

Die Methode kehrt die als Parameter bereitgestellte Liste um. Es funktioniert für jeden Listentyp, daher ist die Verwendung des Platzhaltertyps List<?> als Typ des Formalparameters durchaus angemessen.

Überlegen Sie nun, wie man reverse() implementieren würde:

Die Implementierung muss die Liste kopieren, Elemente aus der Kopie extrahieren und in das Original einfügen. Um dies typsicher zu machen, müssen wir dem Elementtyp der eingehenden Liste einen Namen T geben. Wir tun dies in der privaten Dienstmethode rev() . Dazu müssen wir die eingehende Argumentliste vom Typ List<?> als Argument an rev() übergeben. Im Allgemeinen ist List<?> eine Liste unbekannten Typs. Es ist kein Untertyp von List<T> für irgendeinen Typ T . Eine solche Subtyp-Beziehung zuzulassen wäre nicht stichhaltig. Angesichts der Methode:

der folgende Code würde das Typsystem untergraben:

Ohne besondere Ausnahme können wir also sehen, dass der Aufruf von reverse() nach rev() nicht zulässig wäre. Wenn dies der Fall wäre, wäre der Autor von reverse() gezwungen, seine Signatur wie folgt zu schreiben:

Dies ist unerwünscht, da es dem Aufrufer Implementierungsinformationen offenlegt. Schlimmer noch, der Designer einer API könnte argumentieren, dass die Signatur mit einem Platzhalter das ist, was die Aufrufer der API benötigen, und erst später feststellen, dass eine typsichere Implementierung ausgeschlossen war.

Der Aufruf von reverse() nach rev() ist zwar harmlos, lässt sich aber nicht mit einer allgemeinen Subtyping-Beziehung zwischen List<?> und List<T> begründen. Der Aufruf ist harmlos, da das eingehende Argument zweifellos eine Liste irgendeiner Art ist (wenn auch eine unbekannte). Wenn wir diesen unbekannten Typ in einer Typvariablen X erfassen können, können wir daraus schließen, dass T X ist. Das ist die Essenz der Capture-Konvertierung. Die Spezifikation muss natürlich mit Komplikationen umgehen, wie nicht triviale (und möglicherweise rekursiv definierte) Ober- oder Untergrenzen, das Vorhandensein mehrerer Argumente usw.

Mathematisch versierte Leser werden die Capture-Konvertierung mit der etablierten Typentheorie in Verbindung bringen wollen. Leser, die mit der Typentheorie nicht vertraut sind, können diese Diskussion überspringen - oder einen geeigneten Text studieren, wie z Typen und Programmiersprachen von Benjamin Pierce, und gehen Sie dann diesen Abschnitt noch einmal durch.

Hier ist dann eine kurze Zusammenfassung der Beziehung der Einfangumwandlung zu etablierten typtheoretischen Begriffen. Wildcard-Typen sind eine eingeschränkte Form von existenziellen Typen. Die Capture-Umwandlung entspricht lose einer Öffnung eines Wertes existenzieller Art. Eine Capture-Umwandlung eines Ausdrucks e kann man sich als Öffnen von e in einem Bereich vorstellen, der den Ausdruck der obersten Ebene umfasst, der e einschließt.

Die klassische Open-Operation für Existenzialien erfordert, dass die erfasste Typvariable dem geöffneten Ausdruck nicht entkommen darf. Das Open, das der Capture-Konvertierung entspricht, befindet sich immer in einem Bereich, der ausreichend groß ist, sodass die erfasste Typvariable niemals außerhalb dieses Bereichs sichtbar sein kann. Der Vorteil dieses Schemas besteht darin, dass keine enge Operation erforderlich ist, wie im Papier definiert Zur abweichungsbasierten Subtypisierung für parametrische Typen von Atsushi Igarashi und Mirko Viroli, in den Proceedings der 16th European Conference on Object Oriented Programming (ECOOP 2002). Eine formelle Darstellung von Platzhaltern finden Sie unter Wilder FJ von Mads Torgersen, Erik Ernst und Christian Plesner Hansen, im 12. Workshop zu Foundations of Object Oriented Programming (FOOL 2005).

5.1.11. String-Konvertierung

Jeder Typ kann in den Typ String umgewandelt werden durch String-Konvertierung .

Ein Wert x des primitiven Typs T wird zuerst in einen Referenzwert umgewandelt, als ob er als Argument an einen entsprechenden Klasseninstanz-Erstellungsausdruck (§15.9) übergeben würde:

Wenn T boolean ist, verwenden Sie new Boolean(x).

Wenn T char ist, dann verwende new Character(x).

Wenn T byte, short oder int ist, verwenden Sie new Integer(x).

Wenn T lang ist, verwenden Sie new Long(x).

Wenn T float ist, dann verwende new Float(x).

Wenn T double ist, dann verwende new Double(x).

Dieser Referenzwert wird dann durch Stringkonvertierung in den Typ String umgewandelt.

Jetzt müssen nur noch Referenzwerte berücksichtigt werden:

Wenn die Referenz null ist, wird sie in die Zeichenfolge " null " umgewandelt (vier ASCII-Zeichen n , u , l , l ).

Andernfalls wird die Konvertierung wie durch einen Aufruf der toString-Methode des referenzierten Objekts ohne Argumente durchgeführt, aber wenn das Ergebnis des Aufrufs der toString-Methode null ist, wird stattdessen die Zeichenfolge " null " verwendet.

Die Methode toString wird durch die ursprüngliche Klasse Object (§4.3.2) definiert. Viele Klassen überschreiben es, insbesondere Boolean , Character , Integer , Long , Float , Double und String .

5.1.12. Verbotene Conversions

Jede nicht ausdrücklich erlaubte Konvertierung ist verboten.

5.1.13. Value-Set-Konvertierung

Wertesatzumwandlung ist der Vorgang, bei dem ein Gleitkommawert von einem Wertsatz auf einen anderen abgebildet wird, ohne seinen Typ zu ändern.

Innerhalb eines Ausdrucks, der nicht FP-strict (§15.4) ist, bietet die Wertesatzkonvertierung Auswahlmöglichkeiten für eine Implementierung der Programmiersprache Java:

Wenn der Wert ein Element des Wertsatzes float-extended-exponent ist, kann die Implementierung den Wert nach ihrer Wahl auf das nächste Element des float-Wertsatzes abbilden. Diese Konvertierung kann zu einem Überlauf (in diesem Fall wird der Wert durch eine Unendlichkeit des gleichen Vorzeichens ersetzt) ​​oder zu einem Unterlauf (in diesem Fall kann der Wert an Genauigkeit verlieren, da er durch eine subnormale Zahl oder eine Null mit demselben Vorzeichen ersetzt wird) führen.

Wenn der Wert ein Element der Wertemenge des doppelten erweiterten Exponenten ist, kann die Implementierung den Wert nach ihrer Wahl auf das nächste Element der doppelten Wertemenge abbilden. Diese Konvertierung kann zu einem Überlauf (in diesem Fall wird der Wert durch eine Unendlichkeit mit demselben Vorzeichen ersetzt) ​​oder einem Unterlauf (in diesem Fall kann der Wert an Genauigkeit verlieren, da er durch eine subnormale Zahl oder Null mit demselben Vorzeichen ersetzt wird) führen.

Innerhalb eines FP-strict-Ausdrucks (§15.4) bietet die Wertesatzkonvertierung keine Auswahlmöglichkeiten, jede Implementierung muss sich gleich verhalten:

Wenn der Wert vom Typ float ist und kein Element der float-Wertemenge ist, muss die Implementierung den Wert dem nächsten Element der float-Wertemenge zuordnen. Diese Konvertierung kann zu einem Überlauf oder Unterlauf führen.

Wenn der Wert vom Typ double ist und kein Element der double-Wertemenge ist, muss die Implementierung den Wert dem nächsten Element der double-Wertemenge zuordnen. Diese Konvertierung kann zu einem Überlauf oder Unterlauf führen.

Innerhalb eines FP-strict-Ausdrucks ist das Zuordnen von Werten aus der Wertemenge float-extended-exponent oder double-extended-exponent nur dann erforderlich, wenn eine Methode aufgerufen wird, deren Deklaration nicht FP-strict ist und die Implementierung das Ergebnis repräsentiert des Methodenaufrufs als Element einer Wertemenge mit erweitertem Exponenten.

Ob in FP-strict Code oder Code, der nicht FP-strict ist, die Wertesatzkonvertierung lässt immer alle Werte unverändert, deren Typ weder float noch double ist.


Eines der am schwierigsten zu erklärenden Konzepte bei der Einführung neuer Leute in Business Objects ist der Kontext.

Ich stelle mir jetzt vor, dass Blog-Leser, die seit einiger Zeit mit den Tools arbeiten, zustimmend mit dem Kopf nicken, nur um innezuhalten und zu sagen: “Hey, warte mal, redet Dave über Universumskontexte oder Berichtberechnungskontexte?&# 8221

Und die Antwort ist natürlich ja.

Beide Konzepte können ziemlich kompliziert sein und es dauert eine Weile, bis sie vollständig verstanden sind. Da ich bereits eine Reihe von Blog-Beiträgen über Universumskontexte geschrieben habe, dachte ich, es wäre an der Zeit, mich der Berichtstechnik von Berechnungskontexten zuzuwenden. Beachten Sie, dass dieses Konzept in Desktop Intelligence und Web Intelligence verwendet wird, jedoch nicht in Crystal. Dieser Beitrag soll nur einen Überblick geben. Ich habe Pläne für einen ausführlichen Beitrag zu jedem der verschiedenen Kontextoperatoren, in dem ich viel mehr in die Tiefe gehen werde. Für diesen Beitrag ist es mein Ziel, das Konzept vorzustellen und einige grundlegende Definitionen bereitzustellen.

Einführung in den Berechnungskontext

Der Standardberechnungskontext wird durch die Dimensionen definiert, die an einem Berichtsblock teilnehmen. Diese Eigenschaft macht den dynamischen Charakter von Maßnahmen möglich. Wenn Dimensionen aus einem Block entfernt oder zu einem Block hinzugefügt werden, ändert sich der Kontext und die Kennzahlbeträge ändern sich ebenfalls. Dies wird durch die Projektionsfunktion gesteuert, die vom Universe-Designer für jede Kennzahl festgelegt wurde.

Ein Berichtersteller möchte jedoch manchmal, dass eine Kennzahl auf einen bestimmten Wert festgelegt wird. Prozentsätze sind ein wirklich einfaches Beispiel. Um einen Beitragsprozentsatz zu berechnen, muss ich jeden einzelnen Wert durch die Gesamtsumme dividieren. Um dies zu tun, muss ich wissen, wie ich die Gesamtsumme überall dort generieren kann, wo ich sie haben möchte. Um das zu tun das, muss ich verstehen, wie die verschiedenen Berechnungskontextoperatoren verwendet werden.

Kontextoperatoren

Es gibt einen einfachen (aber leistungsstarken) Satz von Kontextoperatoren, aus denen ich wählen kann. Ich beabsichtige, jeden einzelnen in diesem Blogbeitrag kurz zu definieren und dann in zukünftigen Beiträgen näher darauf einzugehen. Wie ich zu Beginn erwähnt habe, basiert der Standardkontext für eine Kennzahl auf den Dimensionswerten, die in der Blockstruktur vorhanden sind. Ich kann ändern, welche dieser Dimensionen sich auf die Berechnung auswirken, indem ich einen der folgenden drei Kontextoperatoren verwende.

  • In wird verwendet, um genau anzugeben, welche Dimensionen in einen Kontext aufgenommen werden sollen. Andere Bemaßungen im Block werden ignoriert. Das Hinzufügen/Entfernen von Elementen aus dem Block hat keinen Einfluss auf diese Berechnung, es sei denn, im Kontext wurde eine entfernte Bemaßung angegeben. In diesem Fall wird ein #MULTIVALUE-Fehler angezeigt.
  • Für jedes wird benutzt um enthalten eine Dimension in einem Kontext. Der Berechnungskontext wird weiterhin von anderen Werten im Block beeinflusst.
  • Für alle wird benutzt um ausschließen eine Dimension aus einem Kontext. Andere Abmessungen des Blocks werden weiterhin berücksichtigt. Das Hinzufügen oder Entfernen von Werten aus einem Block kann den Wert ändern, aber die ForAll-Elemente werden immer ignoriert.

Die oben aufgeführten Operatoren benötigen alle eine oder mehrere Dimensionen als Teil ihrer Syntax. Der Berechnungskontext kann jedoch durch mehr als einen Satz von Dimensionswerten angegeben werden. Es gibt eine Reihe von Schlüsselwörtern für die Berichtsstruktur, die ebenfalls verwendet werden können.

  • Im Bericht legt den Kontext auf Berichts- oder “gesamtsumme”-Ebene fest. Jede Formel mit diesen Schlüsselwörtern für den Kontext gibt eine Gesamtsumme zurück. Beachten Sie, dass die Gesamtsumme weiterhin von Berichtsfiltern beeinflusst werden kann.
  • Im Block legt den Kontext für jeden Blockabschnitt fest. Seit Jahren warte ich darauf, dass diese Einstellung umbenannt wird, um widerzuspiegeln, wie sie wirklich funktioniert, aber das ist nicht der Fall. Ich nehme an, es ist aus Gründen der Abwärtskompatibilität. Wenn ein Bericht nur einen Block enthält, sind “In Block” und “In Bericht” identisch. Wenn ein Block jedoch in Abschnitte unterteilt wird, generiert dieser Kontext eine Summe für jeden Abschnittswert. Aus diesem Grund gebe ich an, dass ein besserer Name stattdessen möglicherweise “In Abschnitt” gewesen wäre, aber solange ich weiß, was er bewirkt, spielt das spezifische Wort keine Rolle.
  • In Körper ist der Standardstandardkontext für jede Datenzeile.

Mit Desktop Intelligence haben wir die Möglichkeit, In der aktuellen Seite was sehr nützlich sein kann und in Web Intelligence leider noch nicht verfügbar ist. Ich muss wahrscheinlich nicht erklären, wie die Summe von “CurrentPage” abgeleitet wird.

Schließlich können diese Schlüsselwörter an mehreren Stellen in einer Formel vorkommen. Die gebräuchlichsten sind die Kontexteinstellungen “input” und “output”, aber bestimmte Funktionen (wie z. B. RunningSum()) haben auch einen Kontext “reset”.

  • Eingang Kontext wird verwendet, um die Eingabewerte für die Formel zu bestimmen.
  • Ausgabe Kontext wird verwendet, um den Ausgabebereich der Formel zu bestimmen.
  • Zurücksetzen Kontext wird verwendet, um zu bestimmen, wann eine laufende Funktion bei Null beginnt.

Im Eingabekontext referenzierte Bemaßungen müssen nicht im Block erscheinen. Ausgabe- und Rücksetzbemaßungen müssen im Block erscheinen, um korrekt zu funktionieren. Für viele Berechnungen funktioniert der Standardeingabekontext einwandfrei. Ich werde später ein Beispiel zeigen, bei dem es wichtig ist, den Eingabekontext zu verstehen. Vorerst möchte ich zu einem einfachen Beispiel übergehen.

Beispiel für einen einfachen Berechnungskontext

Es ist schwer, einige der Feinheiten des Berechnungskontexts ohne gute Beispiele vollständig zu erfassen. Für diesen Beitrag werde ich ein einfaches, aber häufiges Beispiel anführen, das ich bereits erwähnt habe: Beitragsprozentsatz. Ich beginne mit einem einfachen Block mit einer Dimension (Resort), einer Kennzahl (Umsatz) und einer Gesamtsumme, wie hier gezeigt.

Dieser Block enthält bereits eine Summe. Wenn dies eine typische Tabellenkalkulation wäre, könnte ich den Gesamtwert mithilfe einer Zeilen-/Spaltenadresse referenzieren, aber das funktioniert in Web Intelligence nicht. Das bedeutet, dass ich eine andere Technik verwenden muss, um die Gesamtsumme zu generieren. Ich habe die Lösung bereits erwähnt… alles, was ich tun muss, ist eine einfache Formel zu erstellen, die wie folgt aussieht:

=[Umsatz] / [Umsatz] im Bericht

Denken Sie daran, dass die Im Bericht Kontext projiziert die Maßnahme auf die Gesamtberichtssumme. Durch die Verwendung dieses Berechnungskontextoperators im Nenner meiner Division stelle ich sicher, dass ich in dieser Formel immer durch die Gesamtsumme dividiere. Die Ergebnisse?

Was kommt als nächstes?

Dieser Beitrag hat kaum an der Oberfläche der Berechnungskontextfrage gekratzt. Es lieferte einige kurze Definitionen und ein einfaches Beispiel. Ich habe mehrere andere Beiträge geplant, die dieses oft verwirrende Thema viel detaillierter behandeln. Zuerst möchte ich mehr über In versus ForEach versus ForAll sprechen und wie sie sich unterscheiden. Als nächstes plane ich, Eingabe- und Ausgabekontext zu behandeln und wann jeder verwendet werden sollte. Während ich diesen Beitrag schreibe, ist keiner der beiden vorerst viel mehr als eine Gliederung, daher habe ich kein geschätztes Veröffentlichungsdatum.

Aber sie werden veröffentlicht. Letztlich.

144 Antworten auf “Berechnungskontext Teil I: Übersicht”

Danke für diesen tollen Beitrag, ich freue mich schon sehr auf zukünftige Beiträge zu diesem Thema.

Berechnungskontexte werden oft missverstanden und erraten, auch nach jahrelanger Erfahrung damit. Hoffentlich wird dies das Verständnis aller Webi- und Deski-Benutzer erhöhen.

Hallo Dave. Wenn Sie ein DJ wären, würde ich sagen, dass Sie die Show lieben! ! Jedes Mal, wenn ich Berechnungskontexte verwenden muss, muss ich zu den ersten Prinzipien zurückkehren und Beispiele durcharbeiten, um mein Verständnis zu unterstützen. Ausführlichere Beiträge werden also großartig sein.

Wie auch immer, in Ihrem obigen Beispiel haben Sie keine Aggregatfunktion und keine Klammern. Meine einfache Art, sich die Syntax zu merken, besteht darin, dass Eingabekontexte in Klammern stehen, z. Summe(Maß im Kontext) und Ausgabekontexte liegen außerhalb der Klammern, z.B. Summe(Maß) im Kontext. Ist vor diesem Hintergrund der IN REPORT im Nenner technisch gesehen der Input- oder Output-Kontext?

Hallo Dave,
Vielen Dank, dass Sie Berechnungskontexte als Thema für diesen Beitrag ausgewählt haben. Ich kann einfach nicht aufhören zu erwähnen, dass ich in meinem vorherigen Interview nach dem Unterschied zwischen For Each und For All gefragt wurde. Ich habe geantwortet, werde aber sehen, wie viel davon richtig ist, indem Sie Ihr lesen nächster Beitrag…
Ich suche nach etwas zu Integra-Lösungen, konnte sie aber nicht finden, Quoram taucht auf. Ich verstehe, dass Integra mit Quoram fusioniert hat, aber wo finde ich die Materialien?

Hallo Grantie, danke für deinen Kommentar. Die Wahrheit ist, dass Sie keine Aggregatfunktionen für die Formel verwenden müssen, wenn die Projektionsfunktion richtig definiert ist. Im obigen Fall habe ich es der Einfachheit halber weggelassen. Der Eingabekontext steht immer in Klammern. Um Ihre Frage zu beantworten, ist “In Report” der Ausgabekontext.

Jus, die Firma Integra Solutions und die dazugehörige Website existiert nicht mehr. Als ich auf der Quorum-Site einen Link zur Download-Seite geholt habe, scheint es, dass sie die Site seit meinem letzten Blick neu gestaltet haben. Ich habe gesucht, und es sind noch PDF-Dateien verfügbar, aber sie scheinen nirgendwo auf einer Seite indiziert zu sein. Ich weiß nicht, was ich vorschlagen soll, außer zu versuchen, die Kontaktseite zu verwenden.

Gibt es einen bestimmten Artikel, nach dem Sie gesucht haben? Wenn es etwas ist, das ich erstellt habe, kann ich es hier in meinem Blog als Referenz veröffentlichen.

Hallo Dave. Ja, ich verstehe die Projektion und darauf wollte ich wohl hinaus. Ohne dass es explizit da ist, weiß ich nie, ob die SUM-Funktion (wie durch die Projektion Ihres Objekts definiert) den In-Bericht im Eingabe- oder Ausgabekontext einschließen würde kann verstehen, ob ich mich auf den Input- oder Output-Kontext beziehe.

Tut mir leid, weiterzufahren. Ich weiß, in diesem Beispiel ist es weder hier noch dort, aber es hat mich gestört und ich habe nie eine Antwort darauf bekommen. Nach Ihren Angaben entspricht Ihr [Umsatz] im Bericht also der Summe ([Umsatz]) im Bericht.

Meine Güte. Sehen Sie, warum ich kämpfe. Und ich versuche gleichzeitig, mich mit einem Fan-Fall-Problem zu beschäftigen!!

Tolle Seite. Danke, dass du dein Gehirn teilst.

Grantie, in jeder gegebenen Zeile eines Blocks sind die Standardwerte für den Eingabe- und Ausgabekontext immer “In Body”. Wenn sich ein Wert in einer Fußzeile eines Umbruchs befindet, basiert der Ausgabekontext auf der Struktur des Umbruchs. Um die Sache noch verwirrender zu machen, macht die Eingabe bei einer Sum()-Projektion selten einen Unterschied. Angenommen, Sie haben detaillierte Zeilenwerte von 1, 2, 3, 4 und 5. Angenommen, 1, 2 und 3 sind detaillierte Werte für “A” und 4 und 5 gehören zu B, etwa so:

Wenn ich den Dimensionswert unterbreche, erhalte ich Folgendes:

Wenn ich eine Berichtssumme möchte, spielt es keine Rolle, ob mein Eingabekontext der Dimensionswert (1 + 2 + 3 + 4 + 5) oder der Bruchwert (6 + 9) ist, da beide Ergebnisse immer noch 15 sind interessant, wenn Mittelwerte oder andere Operationen verwendet werden.

Hallo Dave,
Ich muss immer bei den Notizen nachschauen, wenn ich mit Input- und Output-Kontexten zu tun habe. Können Sie mir den Unterschied zwischen Eingabe- und Ausgabekontexten erklären?

Einer ist für die Eingabe und der andere für die Ausgabe.

Im Ernst, das ist ein Thema für den nächsten Blogbeitrag. Es ist ein bisschen viel als Kommentar zu behandeln, also bleib dran für mehr…

Hallo Dave, ich muss den Berechnungskontext in meinem Bericht verwenden. Ich benötige die Daten in einem Bericht aus vier verschiedenen Universen, die sich in unterschiedlichen Körnungen/Hierarchien befinden. Es wäre großartig, wenn Sie mehr Details mit Beispielen zu In, For Each, For All, In Report, In Block und In Body veröffentlichen könnten Kontexte..danke im Voraus..

Hi, Yogesh, ich habe vor, mehr über ForEach und ForAll und so weiter zu schreiben. Ich habe einen Beitrag im Entwurfsstatus, den ich jetzt fertigstellen muss. Ich hoffe, Sie können geduldig sein, da sich die Dinge manchmal langsam bewegen.

Du bist immer gut mit deinem Beitrag und er hilft mir sehr. Ich würde gerne mehr Beiträge zum Berechnungskontext sehen. Eine besondere Frage, die ich habe, lautet: Können wir Dimensionen verwenden, die nicht im Block, aber in der Abfrage verfügbar sind, um die Berechnung der Kennzahl mithilfe des erweiterten Berechnungskontexts zu ändern? weiter, wenn wir können, wie wir bei mehreren Abfragen (Datenanbietern) vorsichtig sein sollten.

Hallo Mathew, ich habe mehr Beiträge im “Entwurfsmodus” zu diesem Thema. Ich hoffe, einige davon bald fertig zu stellen. Um Ihre Frage zu beantworten, muss sich jede Dimension, die am Ausgabekontext beteiligt ist, im Block befinden. Eine Dimension, die am Eingabekontext teilnimmt, muss nicht vorhanden sein.

Hallo Dave. Danke für den Beitrag. Ich finde es wirklich hilfreich. Ich bin jedoch auf ein Problem gestoßen, das meiner Meinung nach die Verwendung des Berechnungskontexts erfordert, an dem ich mir in der letzten Woche oder so ohne Glück den Kopf zerbrochen habe.

Stellen Sie sich vor, wir würden den Umsatz nach Kunden aufschlüsseln, aber jeder Kunde könnte in mehreren Bundesstaaten leben. Das Universum besteht aus einem Kontext, der unsere Kunden und Kennzahlen enthält, und einem zweiten Kontext, der Kunden mit Staaten verbindet. Wenn ich sie in einem Block zusammenfüge, funktioniert alles gut (stellen Sie sich vor, die erste Spalte ist der Zustand, die zweite der Kunde und die dritte der Umsatz):

A X 10
A Y 5
A-Z 12
B Y 5
C Z 12
gesamt: 27 (die Summe der drei Kunden)

Wenn ich nun den Kunden aus dem Block entferne, erhalte ich:

A 27 (das ist richtig)
B 27 (wir möchten, dass dies 5 ist)
C 27 (wir möchten, dass dies 12 ist)
t: 27

Ebenso, wenn ich die Zustände unterbreche, würde ich Folgendes erhalten:

A X 10
A Y 5
A-Z 12
Gesamt: 27

Ich habe jede erdenkliche Kombination von Eingabe- und Ausgabeberechnungskontexten ausprobiert und immer die obigen Ergebnisse erhalten. Irgendwelche Gedanken?

Übrigens, wenn es einen Unterschied macht, sind wir bei BOE XI r2 (hoffentlich später in diesem Jahr auf 3.1).

Hallo Darius und willkommen. Was Sie beschrieben haben, nenne ich “unausgeglichene Datenanbieter”, da Sie Dimensionswerte auf verschiedenen Ebenen haben. State befindet sich auf einer höheren Ebene als Customer, und Sie verwenden customer, um die beiden Datensätze zusammenzuführen. Ich denke, wenn Sie den folgenden Beitrag lesen, werden Sie eine genaue Beschreibung Ihres Problems mit einer Lösung sehen.

Nun zu den schlechten Nachrichten: Die ForceMerge()-Funktion existiert erst ab XI 3.0. Wenn Sie mit Web Intelligence arbeiten, haben Sie bis zum Upgrade kein Glück. Wenn Sie Desktop Intelligence verwenden, können Sie versuchen, die Funktion MultiCube() in einer ähnlichen Lösung zu verwenden.

Vielen Dank. Nach dem, was ich gelesen habe, sieht das genau nach dem aus, was ich suche. Der einzige Fehler ist, dass in meinem Beispiel alles von einem einzigen Datenanbieter kommt (wenn auch mit mehreren Kontexten), aber ich werde es versuchen, wenn wir zu XI 3.0 wechseln. Theoretisch denke ich, dass es den Zweck erfüllt.

Glücklicherweise haben meine Kunden noch nicht danach gefragt, und ich gehe nicht davon aus, dass sie versuchen, einen Bericht mit den Daten zu erstellen, die dieses Problem verursachen würden. Ich versuche nur, ihnen einen Schritt voraus zu sein…

Jetzt möchte ich in meinem Bericht die folgenden Dimensionen und die Anzahl der eindeutigen RiskIDs auf Entitätsebene. wie nachstehend. d.h. ich möchte die Funktion Count() erweitern, um Entity in den Eingabekontext einzubeziehen.
Region Länderanzahl (RiskIDs)
Asien Indien 5

Bitte lassen Sie mich wissen, wie man die Formel für oben schreibt.
Danke,
Poonam N.

Hallo und danke für deine Frage. Soweit ich sehen kann, erfordert dieses Problem keinen Kontext. Erstellen Sie einfach eine neue Variable, die Entität mit Risiko-ID kombiniert, und zählen Sie dann die Ergebnisse.

Beim Zusammenführen eines Lieferantennamens wird nur ein Wert dupliziert.

Beispiel: Vendor enthält hfc, uhc und aetna aus Tabelle A.claim Vendor enthält uhc aetna und cobra

Beim Zusammenführen habe ich HFC
ähm
aetna
aetna
Kobra

aetna wiederholt sich zweimal in der zusammengeführten Dimension. Könnten Sie mir bitte bei der Lösung helfen.

Hallo, das ist wirklich kein Kontextproblem. Wie an anderer Stelle erwähnt, ist dieser Blog nicht als Quelle der persönlichen Unterstützung gedacht. Vielleicht möchten Sie BOB ausprobieren oder sich mit Ihren Fragen an den technischen Support wenden, wenn diese nicht mit einem Beitrag hier zusammenhängen. Vielen Dank.

Wir haben Probleme mit der %age-Berechnung in einem Drill-Bericht XI R2 SP4 festgestellt. Die Summe, durch die wir geteilt wurden, wurde immer gefiltert. XI 3-Funktion NOFILTER([Objekt]-Drill) funktioniert in SP4 – diese ‘drill-Option’ ist in der SP4-Hilfe nicht dokumentiert – also hatten wir uns zuvor mit zwei Datenquellen zufrieden gegeben, aber das ist viel besser.

Wird der Berechnungskontext nur für die Aggregation verwendet?
Wenn nicht, welche Funktionen können wir verwenden?
Bitte geben Sie eine klare Definition für den Berechnungskontext an

Ich habe letzte Woche Web-Intelligence-Kurse unterrichtet und ich denke, zu den wichtigsten Dingen gehören Eingabe-/Ausgabekontexte und Datenverfolgung (und die neuen Formeln).
Ich wünschte, wir hätten in Web Intelligence die Möglichkeit, eine Formel in ihren Kontexten auszuwerten (wie wir es mit dem alten DesktopIntelligence konnten).

Ich schätze Ihre Art, die Konzepte zu erklären, sehr.
Dieser Blog hat mir wirklich sehr geholfen.
Cab, werfen Sie bitte mehr Licht in die Eingabe- und Ausgabekontexte?

Danke & Grüße,
Girish Jawale

Ich versuche, Formelkontext zu erstellen,
Mir fallen 3 Maßnahmen ein.

Maßnahme 1 — PY Gesamtausgaben
Maßnahme 2 — Cy Gesamtausgaben
Maßnahme 3 —-CY Total Spend Total (bis Ende des Vormonats)

Ich war in der Lage, die ersten 2 zu erstellen, mein Problem ist, dass die 3. erstellt wird.
Danke für Ihre Hilfe.

Hallo Sunil, Sie haben kein Kontextproblem in Ihrem Szenario. Es scheint, dass Sie eine Berechnung benötigen, die alles außer dem aktuellen Monat enthält. Ich würde mit Code experimentieren, der in etwa so aussieht:
=Sum(Ausgaben) - Summe(Ausgaben) Wobei (Monat = Aktueller Monat)
Dadurch erhalten Sie eine Gesamtsumme und dann den Betrag für den aktuellen Monat “zurück”, so dass eine aktuelle Jahressumme bis zum Ende des Vormonats übrig bleibt. Das ist nur eine Idee und nicht die eigentliche Syntax, wie Sie sicherlich wissen.

Eine schöne, klare und prägnante Zusammenfassung der Kontextoperatoren. Meine Fragen. ist in Bezug auf Berechnungen mit Details der Abmessungen? z.B.

Zwei erforderliche Berechnungen sind Datum und GeographicID. Die Berechnung des Datums hängt jedoch von der GeographicID ab, da sich zwei Sites eine gemeinsame GeographicID teilen. z.B.

goodCalls = if (numCalls/denCalls) IN geographicID < 2% then numCalls

Während das obige Beispiel korrekt berechnet, werden die Werte nicht korrekt nach oben auf Datumsebene übertragen.

Ich habe eine spezielle Situation, in der Sie mich vielleicht führen können. Ich habe einen Webi-Bericht, in dem ich Unterbrechungen und Abschnitte für bestimmte Spalten festgelegt habe. Als Teil der Berechnung muss ich den Durchschnitt für bestimmte Spalten erstellen und den Berichtdurchschnitt nach Unterbrechung, Abschnitt und Gesamtdurchschnitt erstellen. Wenn ich nun die Durchschnittsfunktion innerhalb des Abschnitts auf die Trennspalte und die Abschnittsspalte anwende, erweisen sich die Durchschnitte als richtig…..aber wenn ich den Gesamtdurchschnitt aller Spaltenwerte außerhalb des Abschnitts in einem anderen Block anzeigen muss ….the Wert wird nur summiert….Es findet keine Durchschnittsberechnung statt…wie empfohlen Ich habe versucht, Kontextoperatoren anzuwenden Im Bericht, Im Abschnitt ……aber ohne Erfolg ….können Sie mich wissen lassen, ob es eine Möglichkeit gibt, dies zu erreichen? Das.

Hallo, danke für das Thema und die nützlichen Informationen zum Kontext, ich habe eine einfache Anforderung, die die Gesamtsumme außerhalb des Abschnitts berechnen muss, sagen wir, ich habe einen Abschnitt über das Produkt und innerhalb des Abschnitts werden die Unterprodukte gezählt und diese Unterprodukte werden dynamisch basierend auf den Eingabeaufforderungswerten. Sobald sie generiert sind, muss ich die Anzahl der Produkte außerhalb des Abschnitts berechnen. Ich kann den Cout innerhalb des Abschnitts abrufen, aber ich kann den Cout außerhalb des Abschnitts nicht abrufen Ausgabe.

Darsh, können Sie bitte versuchen, eine Summe / Zählung zu erstellen, anstatt die Durchschnittsfunktion zu verwenden?

Hallo Dave.
Ich genieße es oft, auf Ihre Website zu stoßen, wenn ich nach BO-Fragen googele.
Planen Sie, bald Ihren nächsten Blog auf forEach and forAll zu schreiben?
Diese Themen sind, wie Sie schon sagten, ziemlich schwierig zu erklären und auch mit ihnen vertraut zu werden.

Dave – was soll ich sagen…..danke

Hallo Dave, Danke für dieses Schreiben. Ich bin nach dem Lesen Ihres Blogs nie mit leeren Händen gegangen. Bekomme hier immer eine Antwort :) Nochmals vielen Dank!

Es scheint, als ob einige der Formeln nicht richtig veröffentlicht wurden.
Hallo Dave,
Ich habe Hierarchie Division->Market->Center. Ich habe einen Abschnitt zur Marktdimension mit sales$ als Kennzahl erstellt. Ich wollte den Umsatz$ auf Divisionsebene nicht für jeden Markt anzeigen, obwohl er nach Märkten unterteilt ist. Ich habe versucht, Eingabe- und Ausgabekontexte zu verwenden, funktioniert immer noch nicht. Ich habe es versucht mit

Ich erhalte einen mehrwertigen Fehler, wenn ich verwende

Ich erhalte maximal Sales$ aus allen Divisionen.

Jede Hilfe zu den zu verwendenden Berechnungskontexten oder -syntax wäre dankbar.

Kannst du bitte das Problem, das poonam gepostet hat, im Detail erklären?
“Kommentar von Poonam N 15. April 2010 um 6:40 Uhr “.

Ich wollte alle Dimensionen im Bericht und 5 in der Summe anzeigen.

Können Sie bitte erklären, wie es geht.

Erstellen Sie eine Variable, die Risiko-ID und Entität kombiniert, und zählen Sie die eindeutigen Ergebnisse. Du würdest bekommen

Verkäufe-1001
Verkäufe-1001
Verkäufe-1002
Marketing-1001
Marketing-1001
Marketing-1003
Bildung-1001
Bildung-1001

Wenn Sie die eindeutigen Werte zählen, zählen Sie Folgendes:

Verkäufe-1001
Verkäufe-1002
Marketing-1001
Marketing-1003
Bildung-1001

Hallo Dave,
Du hast es klar erklärt. Möchte mehr über BO wissen.
Da ich neu in diesem Tool bin, könnte mir bitte ein paar Schritte zum Einstieg mit BO raten.
Beim Lesen Ihrer Blogs gibt es immer eine Vorstellung von BO.
Vielen Dank!

Hallo Dave. Wollte nur die Diskussion auf das Ranking erweitern. Ich habe erfolgreich Berechnungskontexte und Rankings verwendet, um die x Top-Kunden anzuzeigen, wobei die verbleibenden Kunden in “Others” gruppiert sind. Aber wenn ich in dieser Dimension eine Pause mache, wird die Rangfolge innerhalb der Pause zurückgesetzt, was bedeutet, dass jeder Kunde jetzt als 1 eingestuft wird. Ich sehe keine Möglichkeit, meine Variablen anzuweisen, das Zurücksetzen bei einer Pause zu ignorieren. Hast du das geknackt>?

Dieser Blog hat mir sehr geholfen, die grundlegenden Konzepte von Berechnungskontexten zu verstehen. Danke, Dave.
Ich wünschte, Sie hätten noch mehr Blogs zu diesem Thema veröffentlicht, die in Entwürfen waren…

Danke für diesen Beitrag und Blog im Allgemeinen. Es hat mir wirklich bei einigen kniffligen Konzepten geholfen, die anscheinend nicht in Büchern behandelt werden (insbesondere der Beitrag zu unausgeglichenen Datenanbietern!).

Nachdem ich dies gelesen hatte, schien ich Kontexte für die meisten Dinge gut zu verwenden, aber unter einigen Umständen bin ich bei der Verwendung von Zählungen gegen eine Mauer gestoßen. Insbesondere die Verwendung von CountAll für ein Bemaßungsobjekt.

Ich habe das Problem auf BOB geschrieben:

Ist der 2. Teil dieses Beitrags schon erschienen? Ich freue mich darauf.

Warte gespannt auf deinen nächsten Beitrag zu diesem Thema. Ich hoffe, Sie werden bald etwas über In,ForALL,ForEach-Kontexte schreiben

warte auf den nächsten Beitrag!!

Hallo Dave,
Ich lese deine Blogs sehr oft. Sie sind sehr informativ und leicht verständlich. Die Art und Weise, wie du die komplexen Dinge erklärst, macht unser Leben wirklich sehr einfach.

Warte sehnsüchtig auf deine nächsten Beiträge zum Thema Berechnungskontexte.

Seit dem Aufwachen habe ich wieder angefangen, alle Ihre Blog-Posts zu lesen.

Ich sollte alle BO-Dinge vervollständigen, tatsächlich begreifen.

Ich habe kürzlich einige Berichte mit der Funktion ForceMerge() veröffentlicht, die in der Spalte hervorragend funktioniert. Die Spalte, auf die ich dies angewendet habe, hat einen Filter im ersten Bericht und einen anderen Filter im zweiten Bericht. Der dritte Bericht kombiniert beides. Die dritte Berichtssumme ist korrekt, aber die Summen der ersten und zweiten Berichtsspalte sind nicht … es zeigt die gesamte Berichtssumme für das Feld ForceMerge() an.

Was vermisse ich? Ich habe es versucht: =If([Provider Type Group] = “Arzt”) Then Sum([fmRTS]) Else 0 aber dies ergibt immer noch die gesamte Berichtssumme, nicht nur die Gesamtsumme wobei = ‘Arzt’.

Gedanken? Jede Hilfe wird geschätzt.

Ihre Blogs sind sehr hilfreich und lassen mich die Konzepte gut verstehen.
Auch dieser Blog ist gut geschrieben. Ich warte sehnsüchtig auf eure ausführlichen Blogs für jeden und für alle.

Hallo Dave, ich brauche dringend dein Fachwissen. Dieser #Mehrwert hat mich verblüfft.

Ich habe einen Bericht, in dem ich die Zeit in Wochen berechne, die für die Bearbeitung einer Serviceanfrage benötigt wird.

Ich habe also eine Variable, die Wochen berechnet. das Beispiel ist für diejenigen, die 0-4 Wochen dauern.

Variablenname Count0-4
=If[Wochen]<5 Then Count([CompletedInstallTurnaround].[SR Number])

Ich habe dann auch eine Variable, die zählt, wie viele Datensätze in dieser Zählung enthalten waren.

Variablenname Summe0-4
=LaufendeSumme([Anzahl0-4])

Dies gibt mir eine korrekte Summe, wie viele Serviceanfragen zwischen 0-4 Wochen gedauert haben.

Ich versuche, die Variable Total0-4 in einem zweiten Bericht anzuzeigen, und erhalte #MULTIVALUE

Ich habe dann versucht, die max-Funktion und die letzte Funktion zu verwenden

Ich habe auch versucht, "in Report" zur obigen Variablen hinzuzufügen.

Ich erhalte immer noch den Fehler #MULTIVALUE bei jedem von ihnen.

Wie erhalte ich die Summe aus der ersten Abfrage, die bei der zweiten Abfrage angezeigt wird?

Hallo Karen, Ihr Problem liegt wahrscheinlich daran, dass Sie in einer “If”-Anweisung auf ein Dimensionsobjekt verweisen. Wenn sich das Dimensionsobjekt – [Wochen] in Ihrem Fall – nicht im Block befindet, werden die Kennzahlen über die Ebene von Wochen hinaus aufgerollt (Projekt) und befinden sich daher nicht mehr im gleichen Berechnungskontext. Es gibt zu viele Wochen, daher erhalten Sie einen #MULTIVALUE-Fehler.

Sie können versuchen, ein paar Variablen zu erstellen, um dies zu beheben. Erstellen Sie zunächst eine Flag-Variable mit einer Syntax wie dieser:

=Wenn [Wochen] < 5 Dann 1 sonst 0

Verwenden Sie dann dieses Flag in der “Where”-Klausel einer anderen Variablen wie folgt:

Das ist nicht der genaue Code, aber Sie könnten sehen, wohin ich gehe. Durch die Verwendung der Where-Klausel können Sie auf etwas verweisen, das nicht im Block enthalten ist, wodurch Sie manchmal einen Fehler mit mehreren Werten umgehen können.

Dave, das hat perfekt funktioniert. Ich bin so froh, dass ich Ihre Seite gefunden habe. Ich habe so viele hilfreiche Informationen gefunden. Ich hatte die Berechnungen ins Universum gestellt, was nicht das war, was ich tun wollte. Ich kann die jetzt wieder herausziehen und es richtig machen.

Hallo Dave,
Als ehemaliger BOBJ-Mitarbeiter und BOBJ-Trainer finde ich deine Erklärungen sehr verständlich – und obwohl ich vieles von dem weiß, was du hier hast, weiß ich, wie du sagst – da ist immer was!!

Danke fürs Teilen!!

Hallo Herr Dave Rathbun
Können Sie bitte demonstrieren, wie dynamische Kennzahlen erstellt werden?
Ich möchte die Differenz zwischen dem Umsatz von zwei beliebigen Jahren aus verfügbaren 3 Jahren mit nur 1 Kennzahl berechnen und die Differenz in der anderen Spalte anzeigen.

Vielen Dank im Voraus für Ihre kostbare Zeit.

Hallo, dies ist nicht wirklich ein Problem mit dem Berechnungskontext, und ich habe gesehen, dass Sie dieselbe Frage auf BOB gepostet haben, was wahrscheinlich der beste Ort ist. Vielen Dank.

Hallo Herr
Das bin nicht ich, ich habe den Beitrag gesehen, aber nicht funktioniert.

bitte helfen.
auf deine Antwort wartend.

Wie gesagt, es ist kein Problem mit dem Berechnungskontext, und daher ist es nicht wirklich angebracht, in Kommentaren zu diesem Blogbeitrag darauf einzugehen. Wenn Sie in dem aufgeführten Thema zusätzliche Details angeben können, was Sie versucht haben, wie sich Ihre Situation unterscheidet und was Sie letztendlich benötigen, werden Sie vermutlich bessere Ergebnisse erzielen. Vielen Dank.

Hallo Dave,
Ich finde immer, dass Ihre Beiträge mein Wissen und oft mein Produkt verbessern, und dieser Beitrag über Berechnungskontexte ist einer, den ich am nützlichsten gefunden habe.

Ich habe jedoch ein anhaltendes Problem mit Kontexten für Median- und andere Perzentilfunktionen. Ich kann die Ergebnisse leicht testen, indem ich die Quelle herausschiebe, um zu übertreffen, zu sortieren und dann die mittlere Reihe zu finden, damit ich weiß, was ich sehen sollte und mit dem vergleichen kann, was ich bekomme.
Wenn ich die Medianfunktion verwende, sind die Ergebnisse für jede Zeile in einem Block korrekt, aber wenn ich versuche, den Median für den gesamten Block in einer Tabellenfußzeile zu erhalten, war das Ergebnis nie korrekt. Welchen Kontext sollte ich verwenden, um meine Fehler zu beheben?
Danke im Voraus.

Ich habe noch nie so viel mit der Medianfunktion experimentiert und ich glaube nicht, dass ich jemals versucht habe, sie mit einem Kontextoperator zu verwenden. Normalerweise ist der Fußzeilenkontext der Umbruch (oder Umbrüche, wenn mehrere). Wenn ich einen Block mit Resort, Year und Revenue habe und bei Resort unterbreche, dann ist der Fußzeilenkontext In ([Resort]), wie Sie wahrscheinlich wissen.

Dave, Sie werden von Mitgliedern des Bus Obj Boards sehr empfohlen. Ich brauche dringend Ihr Fachwissen.

Ich muss einen Bericht erstellen, der ein Top-10-Ranking ist (der abgeschlossen wurde), aber der Bericht ist zu groß, um ihn in Excel oder CSV zu exportieren.

Der Kreuztabellenbericht enthält links Elemente und oben einzelne Geschäftsnummern (jede Geschäftsnummer gehört auch zu einer “group”). Die Daten sind die Anzahl der Kisten, die jede Filiale seit Anfang des Jahres verkauft hat.

Mein eigentliches Problem ist, dass ich den Bericht auf eine exportierbare (überschaubare) Datenmenge reduzieren kann, indem ich einen Filter verwende, der die Ergebnisse für diese Registerkarte so einschränkt, dass nur die Ergebnisse für eine bestimmte “group” von Geschäften angezeigt werden, aber Jedes Mal, wenn ich den Filter verwende, wird die Bestellung basierend auf den Verkäufen der ausgewählten “Gruppe” von Geschäften neu sortiert, anstatt die Gesamtsumme zu verwenden.

Ich muss die Artikel mit der Gesamtsumme vergleichen, weil wir versuchen, Verteilungslücken aufzuzeigen. Ich kann es nicht dazu bringen, die Gesamtsumme widerzuspiegeln, nur die Einzelgruppensumme.

Jede Hilfe hierzu wäre dankbar.

Hallo Dave,
Wenn ich die Gesamtsumme der Einnahmen für drei Jahre berechnen möchte, bei denen es in einem Jahr einen Abschnittsbruch und in einem Bundesstaat einen Bruch gibt, wie kann ich das tun

Eine Gesamtsumme kann immer mit dem Kontext “In Report” in der Formel generiert werden.

Glenn, können Sie die Funktion NoFilter() als Teil der Formel verwenden, um die Gesamtsumme zu erhalten, auch nachdem Sie Filter auf den Bericht angewendet haben.

Warten auf die Fortsetzung von “Berechnungskontext Teil I: Übersicht”

Hallo Dave,
Ich versuche, eine Fehlerspanne zu implementieren und ein Flag zu setzen, wenn diese Grenze bestanden ist. Ich habe dies in Webi implementiert, aber der Benutzer möchte nach Flag (J / N) filtern. Ich habe eine Variable erstellt, die dieses Flag enthält, aber wenn ich sie als Filter verwende, wird nur ein Wert Y angezeigt, nicht N Wenn der Benutzer diesen einzigen Wert Y auswählt, werden keine Daten angezeigt. Ich glaube, ich vermisse etwas, kann aber nicht herausfinden, was es ist "Jeder Rat wird sehr geschätzt. (Vielen Dank)

Können Sie ein paar Details zu den von Ihnen verwendeten Daten und Formeln posten? Ich vermute, dass Ihre Nummern – ohne Kontext – zusammengerollt werden. Das “Y” wird dann auf der obersten Ebene der “grand total” berechnet, was zu einem einzigen Wert führt. Weitere Details würden helfen, Ihre Frage zu klären.

X und Y sind Spalten, die Werte zusammenfassen. Diese Spalten befinden sich in einer Tabelle mit der Flag-Variablen.
Flagvariable : If(Abs(x – y) > Abs(Margin of Error) Then “Y” Else “N”

Die obige Variable funktioniert einwandfrei, aber wenn ich die Flag-Variable als Filter im Bericht festlege. Es würde nur Y anzeigen und wenn ausgewählt, werden keine Daten angezeigt. Ich hoffe, das hat geholfen.

Datenbeispiel:
Fehlerspanne: 0,03

Irgendwelche Gedanken? Die Filter von Webi können keine Kontexte verwenden, selbst wenn Sie sie als Dimension festlegen.

Hallo Dave,
Ich habe einen Bericht, der die fünf wichtigsten Projekte und ihren Umsatzprozentsatz anzeigt. Der Prozentsatz eines Projektumsatzes wird als Projektumsatz/Umdrehungen aller Projekte berechnet.
Hier kann ich nicht den Gesamtprojektumsatz in jedem Datensatz abrufen, um den Prozentsatz zu berechnen. Könnten Sie bitte vorschlagen.

Beispieldaten:
Projektumdrehungsprozentsatz
1 500 (500/2000)*100=25%
2 400 (400/2000)*100=20%
3 300 …..
4 200 ……
5 100 ……
Summe der Top 5 = 1500
Summe aller Projekte = 2000 (ich berechne nach Formel: sum(nofilter([proj_rev])))

Sie benötigen irgendwo einen “In-Bericht”, um die Gesamtsumme zu erhalten. Außerdem muss ich manchmal mit der Funktion NoFilter() spielen und entscheiden, ob sie stattdessen besser als Sum(NoFilter()) oder NoFilter(Sum()) funktioniert.

@Satya,Sie können diese Formel verwenden “[Messwert]/(Summe([Messwert]) im Bericht)”

Hallo Dave,
Ich möchte ein bestimmtes Objekt im Kontext (Datei) ausschließen und dann die Summe mit einem anderen Objekt als Ausgabe nehmen (Nachteile) und dann wieder auf Dateiebene summieren. Ich habe jede Kombination von ForAll und ForEach ausprobiert und sogar etwas mit In versucht, aber es scheint nicht zu funktionieren. Ich habe auch in Erwägung gezogen, zwei verschiedene Abfragen zu verwenden, sodass die Kosten auf Konsensebene erfasst werden, aber bei Verwendung von forcemerge() werden die Kosten einer Sendung nur für eine Datei verwendet, in der sich die Nachteile befinden. Ich hoffe du verstehst meine Frage. Nachfolgend eine Übersicht über die Daten, die ich in meinem Bericht habe und die Ergebnisse, die ich abrufen möchte.

Erforderliche zusammenfassende Übersicht:

Könnten Sie mir bitte bei diesem Problem helfen? Oder ist dies nicht möglich?

Ich dachte, ich wäre Ihrer Frage gefolgt, aber als ich mir Ihre Beispieldaten ansah, war ich wieder verwirrt. Wie viele Datenanbieter haben Sie derzeit? Wird Ihre endgültige Ausgabe 3 Zeilen (wie in Ihrem zweiten Beispiel) oder 5 (wie im ersten) haben? Denn basierend auf den 3 Zeilen scheint es, als könnten Sie einfach einen Block mit “file” und “Cons Costs” erstellen und basierend auf den 5 Zeilen der Rohdaten, die Sie angezeigt haben, sollten sich die Kosten beim Entfernen natürlich erhöhen das “Cons”-Objekt. Oder ist dies die endgültige Ausgabe, die Sie suchen?

Wenn Sie nach dem suchen, was Sie gepostet haben, habe ich Ihre Beispieldaten in einer Tabelle erstellt, einen Webi-Bericht erstellt und diese Ausgabe generiert:

Meine Formel war diese:
=Summe([Kosten] FürAlle([Datei])) In ([Kons])

Hallo Dave,
Danke für die schnelle Antwort. Ich möchte mein Problem lösen, ohne einen zusätzlichen Datenanbieter zu verwenden. Das bedeutet, dass alle Informationen in einem Datenprovider verfügbar sind. Derzeit sehen meine Rohdaten wie folgt aus:

Cons-Datei Kosten
1 A 10
2 B 20
3 B 30
1 B 5
2 C 25

Nachdem ich eine Variable namens “Cons cost” erstellt habe, kann ich die folgende Tabelle erstellen (wie die Rohdaten, aber mit der neu erstellten Variable. Diese Variable berechnet die Gesamtkosten für jede Sendung.

Cons-Datei Kosten Cons-Kosten
1 A 10 15
2 B 20 45
3 B 30 30
1 B 5 15
2 C 25 45

Nun möchte ich einen Block erstellen, der mir die folgende Übersicht bietet. Diese Übersicht sollte alle Nachteile der einzelnen Nachteile in einer bestimmten Datei zusammenfassen. Für Datei B: Kosten(Nachteile 1)+Kosten(Nachteile 2)+Kosten(Nachteile 3)=15+45+30=90.

Datei Nachteile Kosten
Ein 15
B 90
C 45

Was ich als Ausgabe erhalte, ist der folgende Block, der nicht das ist, was ich brauche. Aus irgendeinem Grund erhalte ich die Gesamtkosten, wenn ich das Contra-Objekt entferne.
Datei Nachteile Kosten
Ein 90
B 90
C 90

Ich hoffe, das klärt meine Frage.

Sie erhalten dies, weil der Wert für “file” nicht mehr verfügbar ist, was in diesem Fall anscheinend dazu führt, dass “In [File]” wie “In Report” agiert und Sie die Gesamtsumme erhalten.

Grundsätzlich funktioniert es so: Alles im Eingabekontext muss nicht im Block sein. Alles im Ausgabekontext muss sich im Block befinden. Sie können nicht nach “file” summieren und es verwenden, um eine Berechnung zu steuern, es sei denn, es befindet sich in irgendeiner Weise im Ausgabeblock.

Ich habe auch versucht, eine Unterbrechung zu erstellen und die Ergebnisse zu falten, aber die Summe der Unterbrechungen funktioniert aufgrund des auftretenden #MULTIVALUE-Fehlers nicht.

Maarten, ich denke, Ihr SQL sollte wie folgt aussehen, um das gewünschte Ergebnis zu erzielen.

select B.file,sum(A.CONS_COST)
aus
(wählen Sie cons,sum(COST) als CONS_COST
aus Tabelle_A
nach CONS by gruppieren
) A,Tabelle_A B
wobei A.cons=B.cons
gruppieren nach B.Datei

Tabelle_A hat die Daten wie unten

Ich bin mir nicht sicher, ob wir das auf Berichtsebene erreichen können.

Vielen Dank für diese Seite – Ich habe viel daraus gelernt. Es gibt jedoch etwas, an dem ich derzeit feststecke und ich hoffte, Sie könnten mir einen Hinweis geben:

Ich habe einen Bericht, der nach einer Datumsdimension unterteilt ist, aber ich muss alle Datumsangaben der Dimension in jedem Abschnitt verfügbar haben. Ich habe es mit nofilter(date) versucht, aber das hilft nicht und ‘im Bericht’ gibt mir einen #mehrwertigen Fehler. Gibt es einen Kontextoperator, der mir dabei helfen könnte?

Hallo Rob, das klingt nicht nach einem Kontextproblem, da Sie Dimensionswerte vermissen, anstatt die Funktionsweise von Kennzahlen anzupassen. Es gibt hier ein paar andere Blog-Posts, in denen es darum geht, Daten zu erstellen, vielleicht hilft einer davon.

Ich verwende derzeit webi 4.0.

Ich habe zwei Berichte in einer Datei. Der erste enthält den Gesamtumsatz aller Regionen und der zweite ist nach Regionen aufgeschlüsselt.

Im Regionsbericht muss ich einige Ausgaben berechnen, bei denen ich das Verhältnis ermitteln muss, indem ich die Ausgaben der Region durch die Gesamtausgaben dividiere.

So sieht mein Maß ungefähr aus:

(if[Ausgaben]=1 Then [Region Ausgaben]* [erworbener Gewinn])/ (if[Ausgaben]=1 Then [Gesamtausgaben]* [erworbener Gewinn]) im Bericht

Ich habe Flag verwendet, um Mehrwertfehler zu vermeiden

Schätzen Sie Ihre Hilfe.

Hallo Judy, um das Problem klar zu verstehen, könnten Sie bitte einen kleinen Datensatz und das gewünschte Ergebnis angeben, das Sie erreichen möchten?

Hallo, ich brauche ein paar Ideen, um etwas zu erreichen. Ich arbeite an einer Tabelle, die die Top 10 der Vorfälle nach Konfigurationselement anzeigen muss (nicht kompliziert), wo ich feststecke, befindet sich in der Spalte, die den Prozentsatz anzeigen muss, da ich den Prozentsatz basierend auf der Gesamtzahl der Vorfälle anzeigen muss und nicht auf den in der Tabelle aufgeführten:

CI01 | 116 | 11,42%
CI02 | 86 | 8,46 %
CI03 | 59 | 5,81%
CI04 | 47 | 4,63%
CI05 | 47 | 4,63%
CI06 | 47 | 4,63%
CI07 | 43 | 4,23%
CI08 | 38 | 3,74%
CI09 | 35 | 3,44%
CI10 | 29 | 2,85%

Die Gesamtzahl der Vorfälle für dieses Beispiel beträgt 1.016 und wenn ich die Tabelle mit allen Daten zeige, werden alle Prozentsätze richtig berechnet. Wenn ich ein Ranking hinzufüge oder die Tabelle irgendwie filtere, werden die Prozentsätze basierend auf den in der Tabelle angezeigten Informationen berechnet, die nur den Prozentsatz der Top 10 darstellen:

CI01 | 116 | 21,21 %
CI02 | 86 | 15,72%
CI03 | 59 | 10,79 %
CI04 | 47 | 8,59%
CI05 | 47 | 8,59%
CI06 | 47 | 8,59%
CI07 | 43 | 7,86%
CI08 | 38 | 6,95 %
CI09 | 35 | 6,40%
CI10 | 29 | 5,30%

Der Prozentsatz wird nach dieser Formel berechnet: [CR - Ticket Count]/(Sum([CR - Ticket Count]) In Report)
*CR – Ticket Count ist eine Konstante 𔄙″, die von der Datenbank für jedes Ticket gesendet wird und ist als SUM-Maß im Universum definiert.

Alle Ideen werden geschätzt. Vielen Dank.

Ein Rang oder ein Filter sind zwei verschiedene Möglichkeiten, um Daten zu reduzieren. Wenn Sie die Gesamtsumme wollen alle Filter ignorieren dann erledigt das die NoFilter()-Funktion für Sie. Eine gute erste Vermutung könnte sein:

[CR - Ticketanzahl]/NoFilter((Sum([CR - Ticketanzahl]) im Bericht))

Dave Rathbun, du bist ein Genie. Ich wusste nicht, dass einer der “NoFilter()”. Ich habe genau das bekommen, was ich gesucht habe. Vielen Dank.

Hallo Dave,
Ich muss die Summe aller Zeilen für eine meiner Kennzahlenspalten sehen, auch wenn in webi.i ein dynamischer Filter auf Berichtsebene angewendet wird. Ich habe versucht, die Funktion noFilter() zu verwenden, aber das funktioniert nicht.

Sie müssen mehr Details als “funktioniert” angeben, um nützliche Antworten zu erhalten.

Tausend Dank für den Beitrag. Es hat mir wirklich geholfen, einen sehr detaillierten Level-Bericht zu erstellen. Ich hoffe, Sie könnten eine Lösung für ein Detail meines Berichts vorschlagen.
Ich habe in meinem Bericht eine Tabelle Region- Standort – Status – #der Bewerbungen. Ich habe ein horizontal gestapeltes Diagramm (x-Achsen-Position, Y-Achse % der Anzahl) nach Status. Das Problem ist, dass der % für den gesamten Bericht oder jeden Wert berechnet wird, der über die Eingabesteuerung angegeben wird, während ich einen % für jeden Standort nach Status möchte.
Beispiel: location = Bay Area Ich möchte, dass mein % für jeden Status/Anzahl der Bay Area gezählt wird. Während ich % als Anzahl jedes Status für Bay Area für den gesamten Bericht oder jeden Filter erhalte, wähle ich aus, welcher sich ständig ändert. Gibt es eine Möglichkeit, die ich übersehen habe, wo der Berechnungskontext auf die Diagramme angewendet werden kann?

Ich warte nur auf Ihren ausführlichen Beitrag zum Kontext von Eingabe und Ausgabe.
Könntest du es bitte so früh wie möglich posten.

Bitte poste den Teil II zum Berechnungskontext und warte gespannt darauf, ihn von dir zu sehen.

Wie immer scheinst du Dinge zu erklären, bei denen ich endlich den “ah ha”-Moment habe, den ich schon sehr lange vermisst habe. Vielen Dank!

Wieder einmal hat mir diese eine Seite geholfen, einen Problempunkt zu überwinden. Ich habe immer wieder versucht, ForEach und ForAll zu verwenden, und was ich brauche, war IN! 100% geliefert!

Ich arbeite an einem Bericht, in dem ich Berechnungskontexte verwenden muss…Ich habe die folgenden Dimensionen: Benutzer, Daten und Kommentare. Und meine Tabelle sieht so aus:

U1 D1 C1
U2 D2 C2
U3 D3 C3
U3 D3 C4
U4 D4 C5
U4 D4 C6
U4 D4 C7
U4 D4 C8

Aber die Kommentare mit demselben Datum und Benutzernamen sind tatsächlich derselbe Kommentar…und müssen nur einmal gezählt werden. Ich habe Berechnungskontexte mit Count([Comment]In([User][Date])) verwendet. Es funktioniert nicht und es gibt mir die folgenden Ergebnisse…

U1 D1 1
U2 D2 1
U3 D3 0
U4 D4 0

Gilt ein Abschnitt als Filter? Ich habe einen Bericht mit Abschnitten und muss eine laufende Summe für die letzten 3 Monate berechnen, aber ich muss die resultierende Tabelle so filtern, dass sie die Monate 4-6 anzeigt, aber die laufende Summe mit den Monaten 1-3 berechnet. Aufgrund der Version, die ich verwende, muss ich die Summe als Stunden + vorherige (Stunden) + vorherige (vorherige (Stunden)) berechnen. Ich habe die Funktion NoFilter() um die Summenberechnung herum hinzugefügt. Wenn ich mir den ersten Abschnitt ansehe, ist die Summe korrekt, aber wenn ich mir den nächsten Abschnitt ansehe, wird die Summe auch anhand der Stundenzahl aus dem ersten Abschnitt berechnet. Ich kann also nur davon ausgehen, dass die Funktion NoFilter() den Abschnitt in der Berechnung entfernt.

Gibt es eine Möglichkeit, NoFilter() zu verwenden, aber die Berechnung für jeden Abschnitt zurückzusetzen?

Dein Beitrag ist wirklich hilfreich..Inspiriert von all deiner Arbeit..Ich selbst habe hier einen geschrieben:
http://gauravkalra.wordpress.com/

Lass mich wissen, wie das aussieht. Ich habe in meinem ersten Post sehr weniger Details aufgenommen..und versucht, es auch interessant zu halten:). Ich hoffe, dass ich noch mehr davon verfolgen kann.

Ja, ein Abschnitt ist definitiv ein Filter. Aber nicht alles ist verloren. Wenn ich dies in der Vergangenheit tun musste, habe ich etwas in diese Richtung getan. Angenommen, unser Abschnitt bezieht sich auf das Resort-Objekt, und in jedem Abschnitt befinden sich Daten aus drei Jahren. Ich möchte eine laufende Summe von 3 Jahren, aber nur dort, wo das Resort gleich ist. Ich könnte drei Objekte bauen. Der erste heißt “Vorheriger Umsatz” und hat diese Formel:

=If Previous([Resort]) = [Resort] Then Previous([Umsatz]) sonst 0

Die nächste wird als Vorherige Vorherige Revnue bezeichnet:

=If Previous(Previous([Resort])) = [Resort] Then Previous(Previous([Revenue])) sonst 0

Zum Schluss die laufenden 3 Umsatzjahre:

=[Umsatz] + [Vorheriger Umsatz] + [Vorheriger Vorheriger Umsatz]

Die Summe vergleicht dann den aktuellen Resort-Wert mit den beiden vorherigen Zeilen und enthält nur den Umsatz, wenn die Resort-Werte gleich sind.

Gleichzeitig können Sie die Funktion RunningSum() verwenden, die bereits über eine eingebaute Reset-Funktion verfügt.

Was Sie also wirklich haben, ist dies:

U1 D1 C1
U1 D2 C2
U3 D3 C3
U3 D3 C3 (dies sollte C3 sein, nicht C4, da es derselbe Kommentar ist)
U4 D4 C4
U4 D4 C4
U4 D4 C4
U4 D4 C4 (die letzten vier sind gleich)

Was ist die gewünschte Ausgabe davon?

Hallo Dave, ich lese deinen Blog immer wieder, um eine Lösung für ein Datenberechnungs-/Analyseproblem zu finden.
Ich habe eine Messung namens [Ergebniswert] für A=4,3,2,<2,<2 und für B=4,3,<2,<2,<2. Das System prüft ein Maß mit dem Namen [numerischer Wert] für A=4,3,2,2,2 und für B=4,3,2,2,2 durch Entfernen des "<"-Zeichens. Das System gibt auch ein Maß mit dem Namen [berechneter Wert ] für A=4,3,2,1,1 und B=4,3,1,1,1 unter Verwendung des halben Wertes nach "<". Ich brauche eine Regel für meine Berechnung. Die Regel lautet: Wenn die Gesamtanzahl von "<" kleiner ist als die Gesamtanzahl der Datenanzahl, verwenden Sie die Hälfte des Wertes nach "<". wenn insgesamt "<" größer oder gleich der Gesamtzahl der Daten ist, setzen Sie die Daten mit "<" auf 0. Ich erstelle eine Kennzahl [berechneter Wert_neu]in der Registerkarte "bericht 1", die A=4,3,2,1,1 und B=4 ergibt ,3,0,0,0,0. Wenn ich Durchschnitt und Perzentil für [berechneter Wert] und [berechneter Wert_neu] für A und B berechne, gibt es kein Problem. Aber wenn ich eine weitere Registerkarte "report2" erstelle, um den Durchschnitt und das Perzentil zusammenzufassen, gibt es kein Problem für den Durchschnitt und das Perzentil für [berechneter Wert], aber #multivalue für [berechneter Wert_neu]. Ich versuche alles und funktioniert nicht. Bitte helfen Sie. Grüße, Shaohua

Hallo, ich habe das nächste Problem und möchte sehen, ob Sie mir einen Rat geben können, lassen Sie es mich erklären.
Ich habe zwei Datenanbieter, weil die Daten aus unterschiedlichen Datenbanken stammen.

TABELLE1 TABELLE2
Datums-ID-Detail Detail Kosten
29.04.13 A A1 A1 5
29.04.13 A A2 A2 1
29.04.13 A A3 A3 3
29.04.13 B B1 B1 4
29.04.13 B B2 B2 2
29.04.13 C C1 C1 7
29.04.13 C C2 C2 4
29.04.13 C C3 C3 3

Der Bericht, den ich starten muss, muss so aussehen:

PRÜFBERICHT
Datums-ID Kosten
29.04.13 A 9
29.04.13 B 6
29.04.13 C 14

Aber was ich bekomme ist so etwas:

PRÜFBERICHT
Datums-ID Kosten
29.04.13 A 29
29.04.13 B 29
29.04.13 C 29

Ich habe versucht, die nächsten Kombinationen zu verwenden:

Summe(Kosten) ForEach(Datum,Id)
RunningSum(costRow)
RunningSum(costDate,Id)
RunningSum(Kosten) ForEach(Datum,Id)

Können Sie mir bei dieser Berechnung helfen?

Hallo Dave,
Wenn wir Foreach in Aggregationsfunktionen mit Where-Klausel verwenden, müssen wir dann eine bestimmte Reihenfolge für die Angabe der Foreach-Klausel einhalten?
Bitte siehe unten stehendes Beispiel:
Meine Formel ist
=Durchschnitt(
[Durchschnitt der Sitzung]
Wo([KP1]=𔄣″ Und([Sitzungsstatus]=”C”) Und([Jahr]=�″))
ForEach([Kurscode][Sitzungsnummer])
)

Diese obige Formel liefert die richtigen Ergebnisse, aber wenn ich die Foreach-Klausel vor der “where”-Klausel angebe, gibt sie ein falsches Ergebnis.

=Durchschnitt(
[Sitzungsdurchschnitt] ForEach([Kurscode][Sitzungsnummer])
Wo([Kp1]=𔄣″ Und([Sitzungsstatus]=”C”) Und([Jahr]=�″))
)

Bitte helfen Sie mir, den Unterschied zu verstehen.
Danke,
Mani

Ihre Beiträge sind so informativ und ich bin ein großer Fan. Ich bin sicher, das ist einfach und ich vermisse etwas, aber ich habe jede Variation des Berechnungskontexts ohne Erfolg ausprobiert. Ich habe vier Spalten (siehe unten ‘table’). Ich möchte, dass die Prozentsätze wie in “COLUMN4″ gezeigt korrekt berechnet werden, aber aus irgendeinem Grund werden sie nicht wie erforderlich berechnet. Im Grunde möchte ich also feststellen, wie oft ein bestimmtes Fahrzeugmerkmal in einzigartigen Modellen innerhalb der Untermenge der einzigartigen Marken in der Tabelle verwendet wird. Ich möchte dann die Top 3 Autofunktionen basierend auf der Spalte NUTZUNGSVERHÄLTNIS % einstufen. Theoretisch scheint es einfach genug, aber ich habe buchstäblich Stunden damit verbracht und kann es nicht herausfinden. Bitte lassen Sie mich wissen, was ich vermisse. Ich würde es WIRKLICH zu schätzen wissen.

Für die Spalte USAGE RATIO % habe ich die folgenden Berechnungskontexte verwendet (in jeder Variation):
SPALTE3/COLUMN2 Foreach([MAKE][MODEL])in Block
SPALTE3/COLUMN2 In([MAKE][MODEL])
SPALTE3/COLUMN2 In([WAGENFUNKTION][HERSTELLEN][MODELL])

SPALTE1 SPALTE2 SPALTE3 SPALTE4
AUTOFUNKTION | #MAKE (Einzigartig) | #AUTOFUNKTIONEN IN EINZIGARTIGEN MODELLEN| NUTZUNGSVERHÄLTNIS % (Spalte3/Spalte2)
Navigationssystem | 50 | 15 | 30%
Rückfahrkamera | 15 | 6 | 40%
Sitzheizung | 30 | 12 | 40%
Monddach | 45 | 30 | 67 %
Top-Airbags | 20 | 10 | 50%

Ich habe vorhin ein Dilemma mit dem Berechnungskontext gepostet, aber es ist noch nicht auf der Website aufgetaucht (hoffe, es ist durchgegangen! Bitte lassen Sie es mich wissen, wenn Sie es nicht erhalten haben.) Ich wollte einen saubereren Screenshot der fraglichen Tabelle bereitstellen. kann aber nicht herausfinden, wie man eine an dieses Forum anhängt. Im Grunde versuche ich nur, Spalte 4 (USAGE RATIO) zu erhalten. Auf dem Papier ist es so einfach, in Excel, aber aus irgendeinem Grund nicht in BO aufgrund von Berechnungskontexten, aber keine funktioniert für mich. Zum Hintergrund: Wenn Sie die Daten hierarchisch betrachten, befindet sich ‘Make’ auf der obersten Ebene, Unique ‘Model’ ist eine Untergruppe von Make und ‘Car Feature’, die detaillierteste Ebene, wird angeboten in einigen ‘Models’ von den zugehörigen ‘Makes’. Ich möchte zeigen, wie oft ein Auto-Feature in den einzigartigen Modellen einer bestimmten Marke verwendet wird (die ich habe) und dann diese Anzahl von Modellen durch die Anzahl der Marken für jedes Auto-Feature dividieren (was ich nicht herausfinden kann). wie man korrekte Ergebnisse macht und rendert). Ich habe buchstäblich keine anderen Leute, die ich konsultieren kann, die über BO-Kenntnisse verfügen, und BOB hat bisher keine Arbeitsvorschläge gemacht. Ich hoffe, Sie können helfen… Danke.

sagen wir, wenn ich ein Kennzahlobjekt in meinem Bericht habe und daraus eine Variable erstelle (ohne Kontext definiert) Beispiel zur Kategorisierung der Umsatzkennzahl (1-100 Millionen, 100-200 Millionen) .

Was wird der Standardkontext für diese Kennzahl sein? Würde es beim Erstellen der Variablen alle Dimensionen im Bericht berücksichtigen?

Der Standardkontext basiert auf den Dimensionen, die in dem Block (oder Abschnitt) enthalten sind, der die neue Variable enthält. Befindet sich die Kennzahl beispielsweise in einer eigenständigen Zelle, lautet der Ausgabekontext “Im Bericht.” Wenn sich die Kennzahl innerhalb eines Blocks befindet, bestimmen die Dimensionen im Block den Ausgabekontext. Wenn Sie den spezifischen Kontext “In Report” in die Formel einschließen und diese Kennzahl in einen Block einfügen, überschreibt der angegebene Kontext die Dimensionsstruktur und Sie erhalten stattdessen die Gesamtsumme des Berichts.

Danke Dave, für die schnelle Antwort. Aber das Problem für mich ist, dass ich einen Abschnitt über die neue Variable erstellen muss.

Nur um Sie wissen zu lassen, wenn ich nur rev in der Formel ‘rev = 1mill’ verwendet habe, dann wird 𔃱-100mill’..dieselbe ID in verschiedenen Kategorien angezeigt (bei der Untersuchung stellte ich fest, dass die ID zwei Zeilen enthält) die Tabelle (Datenbank) aufgrund einer Spalte (die in meinem Bericht nicht verfügbar ist) mit anderen Werten).

Für die Formel habe ich also so etwas wie ‘rev in (id)=1mill’ und dann 𔃱-100mill’… verwendet, wodurch der Kontext für die Kennzahl definiert und auf nur die ID beschränkt wurde.

Ich konnte den Abschnitt für diese Variable einrichten, stieß jedoch auf Probleme, als ich versuchte, ein Eingabesteuerelement für diese Variable zu erstellen.

Soweit ich weiß, ist dieser Blog nicht für Personalangelegenheiten gedacht.Bitte ignorieren Sie dies, wenn Sie Ihre Zeit verschwenden.

Schätzen Sie Ihren Beitrag zur Business Intelligence-Welt wirklich..besonders für Anfänger wie mich.

Im Allgemeinen können Sie keine Kennzahl (oder eine von einer Kennzahl abgeleitete Variable) als Abschnitt verwenden. Der Grund dafür ist, dass der Umfang (oder Kontext) der Maßnahme durch den Abschnitt definiert wird und nicht umgekehrt. Wenn ich seit Ewigkeiten eine Aufschlüsselung nach Bereich erstellen musste (10-19, 20-29, 30-39 usw.), dann habe ich das als Dimensionsobjekt in meinem Universum erstellt, anstatt es zu versuchen auf dem Bericht.

Ich bin neu bei BOB Webi Reporting und habe bei einem neuen Unternehmen angefangen, bei dem das Universum anders aufgebaut ist als ich zuvor gearbeitet habe. Wir versuchen, einen einfachen rollenden 12-Monats-Bericht von TY vs Monate im Vergleich zur gleichen Zeit LY) Ich bin in der Lage, das Rollen mit (Jahr * 100) + Monat Nbr für jeden Block zu erhalten. (Block1 hat LY-Daten und Block2 hat TY-Daten) Das Problem, das ich habe, besteht darin, eine Variable zu erstellen, die Daten aus jedem Block berechnen kann. Der Bericht zeigt Monat, Woche des Monats, Retouren, Verkäufe und RA% Verkäufe für jeden 12-Monats-Block an.

Letztes Jahr (Block1) Dieses Jahr (Block2)
Monat Woche RRA LY Umsatz LY Monat Woche RRA TY Umsatz TY
1. August $50 $6.000 1. August $20 $7.000

Was ich tun möchte, ist einen 3. Block hinzuzufügen oder die Summen in den 2. Block aufzunehmen, der RRA TY – RRA LY (erstellte Variable RRA TY-LY Change) und eine andere Berechnung, die die %-Differenz (=[RRA TY-LY Ändern]/[RRA LY])
Wenn ich versuche, diese dem Bericht hinzuzufügen, erhalte ich einen einzelnen Wert, der in jeder Zeile dupliziert wird, oder ein Fehler mit mehreren Werten.
Irgendwelche Vorschläge?

Hoffe ihr könnt einem kompletten Neuling helfen. Ich arbeite in Webi Intelligence (BOXI XI R2) ohne Zugriff auf das Universum.

Ich habe in Web Intelligence eine Berichtsmessvariable erstellt, die 1 zurückgibt, wenn ein Datensatz aktuell ist, und 0, wenn nicht. Ich habe eine Tabelle im Bericht mit einem Abschnittswechsel zum Fallmanager. Wenn ich diese Kennzahl in der Tabellenfußzeile summiere, wird der richtige Wert für diesen Abschnitt zurückgegeben.

Ich habe jedoch versucht, eine Übersichtstabelle in einem separaten Block zu erstellen, und wenn ich darin genau dieselbe Formel versuche, erhalte ich den Fehler #multivalue. Irgendwelche Ideen?

Marcus, das Problem hängt wahrscheinlich damit zusammen, dass Ihr 0/1-Indikator nur auf Zeilenebene gültig ist. Sobald Sie versuchen, es auf eine höhere Ebene zu projizieren, erhalten Sie einen #MULTIVALUE-Fehler, da mehrere Werte (in diesem Fall zwei verschiedene Zustände) zur Auswahl stehen. Sie könnten stattdessen versuchen, Ihren aktuellen Indikator als Teil einer “Where”-Klausel für eine Summe zu verwenden, da die dort verwendeten Werte nicht im Block erscheinen müssen. So etwas wie:

sum([Messung]) wobei ([Aktuelles Flag] = 1)

Haben Sie für dieses Jahr (TY) und letztes Jahr (LY) getrennte Objekte im Universum oder zerlegen Sie sie im Bericht?

Ich habe ein Problem bei der Berechnung der Zeit, die nur für einen bestimmten Status benötigt wird, der an einer Serviceanfrage beteiligt ist, #mehrwertiger Fehler Berechnen Sie die Zeit, die für den Status ” ausstehend” benötigt wird, die in die Berechnung der Werktage eingehen sollte

Anforderungsstatus Startzeit Stoppzeit Gesamte benötigte Zeit
101 Entwurf 01.07.13 05.07.13 4
101 Rezension 6-Jul-13 7-Jul-13 1
101 WIP 7-Jul-13 8-Jul-13 1
101 Ausstehend 8-Jul-13 9-Jul-13 1
101 Ausstehend 10-Jul-13 11-Jul-13 1

Erwartete Ausgabe
Anfrage ohne Gesamtzeit (ausstehend)
101 2

Hallo,
Können Sie mir den Berechnungskontext Teil II zur Verfügung stellen?

Hallo Dave danke für die außergewöhnlichen Artikel immer…. 4 Jahre sind vergangen wir warten sehnsüchtig auf die späteren Kapitel!

Mich auch! Wann werde ich dazu kommen, sie zu schreiben, weiß das jemand?

Im Ernst, ich habe meinen Entwurf für den zweiten Teil dieses Artikels entstaubt und werde ihn hoffentlich ohne allzu große Verzögerung veröffentlichen können.

Ich liebe deine Blogs und bin so froh, dass sie häufig auftauchen, wenn ich nach etwas suche. Ich bin hier ein wenig ratlos. Ich habe eine Situation, in der ich einige Dimensionen (Kunden- und Geschäftsperioden) und die damit verbundenen Umsätze in $ einbeziehe. Was ich tun möchte, ist, die Verkäufe $ für jeden Kunden NUR für den letzten Abrechnungszeitraum anzuzeigen.

So zeige ich zum Beispiel:

Kunde 1 — 201401 — $1.000
Kunde 1 — 201402 — $2.000
Kunde 1 — 201403 — $1.500
Kunde 2 — 201401 — $1.700
Kunde 2 — 201402 — $2.000
Kunde 2 — 201403 — $2.500

Kunde 1 — 201403 — $1.500
Kunde 2 — 201403 — $2.500

Ich bin ziemlich nah dran, aber ich kann es anscheinend nicht richtig hinbekommen. Gibt es eine Möglichkeit, ein Maß für das Maximum (Dimension) zu erhalten? Wenn ja, kann ich es nirgendwo finden oder erraten, wie die Syntax aussehen könnte. Also habe ich eine Variable erstellt, um mir den maximalen Abrechnungszeitraum anzugeben, und da sie über die Eingabeaufforderung ausgewählt werden, lautet die Variable =Max([Hauptabfrage].[Geschäftszeitraum]) im Bericht. Ich habe es MaxUserResponse genannt.

Dann habe ich mir diese Formel ausgedacht: =([Sales $] ForEach ([MaxUserResponse]))

Das Ergebnis, das ich erhalte, ist der Gesamtumsatz in $ über die Geschäftsjahre hinweg, was sinnvoll ist, da ForEach dies tut. Aber ich habe auch =([Sales $] In([MaxUserResponse])) versucht. Ich habe die Summe für alle Kunden für alle Geschäftsperioden erhalten. Als ich =([Sales $] In([Customer][MaxUserResponse])) versuchte, erhielt ich die Summe über alle Geschäftsperioden pro Kunde.

Was vermisse ich? Ich weiß, dass ich in der Nähe bin… Bitte helfen? Danke!

Ich glaube, ich habe es herausgefunden. Ich habe gerade eine Where-Klausel zu meiner Formel hinzugefügt. Also sieht es jetzt so aus:

([Umsatz $] In ([Hauptabfrage].[Kundenname])) Wobei ([Hauptabfrage].[Geschäftsperiode] = [MaxUserResponse])

Danke fürs Lesen…
Tietje

ausgezeichneter Beitrag… Konnten Sie den Rest der Kontextoperatoren gemäß Ihren Vorschlägen veröffentlichen… Ich bin sicher, dass das Lesen Ihrer Beiträge sicherlich dazu beitragen wird, viele meiner Zweifel zu klären andere Beiträge von dir, um einen besseren Einblick in BO zu bekommen

Hallo, ich muss eine ähnliche Lösung implementieren. Ich muss die Daten in drei Kategorien aufteilen, basierend auf dem Prozentsatz zum Gesamtwert, die oberen 70 % in Kategorie 1, die nächsten 20 % in Kategorie 2, die letzten 10 % in Kategorie 3. Irgendeine Idee, wie ich das machen kann?

Ein nützlicher Link, er hat meinen Tag gerettet. Danke Dave.

Ich muss eine durchschnittliche Bettenzahl in einem Krankenhaus anzeigen, aber jedes Krankenhaus hat ein Gültigkeitsbeginn- und -endedatum. Ich muss die Anzahl der Betten pro Krankenhaus auf einer Summenebene anzeigen, das ist eine durchschnittliche Anzahl für jedes Krankenhaus, unabhängig davon, wie viele Einträge für Gültigkeitsdaten pro Krankenhaus vorhanden sind.

Ich benötige die obigen Daten zusammengefasst wie folgt:

Ich habe versucht, den Durchschnitt der Kennzahl ForAll “Gültigkeitsbeginn” zu ermitteln, um die Datumsdimension aus der Berechnung auszuschließen. Ich habe auch versucht, die Kennzahl “In Hospital” zu mitteln, um nur Hospital in den Berechnungskontext einzubeziehen. In beiden Fällen erhalte ich folgende Ausgabe, in der das Maß für jede Datumseingabe pro Krankenhaus aufsummiert wird:

Ich habe eine seltsame Situation. Ich habe Kontonummern und Kontostand aus einer Abfrage. Der BO-Bericht scheint den negativen Saldo zu vernachlässigen. Wenn ich den Saldo zusammenfasse, werden also nur positive Werte berücksichtigt.
Das heißt, Sum([Balance]) liefert das gleiche Ergebnis wie Sum([Balance]) Where ([Balance]>0) und Sum([Balance]) Where ([Balance]<0) gibt null zurück.
Aber es gibt einen negativen Saldo. Wenn ich Kontonummer und Saldo in einen separaten Bericht ziehe und einen Berichtsfilter für [Saldo]<0 anwende, kann ich die negativen Salden gegen die Konten sehen. Aber wenn ich die Konten entferne, wird eine leere Zelle für den Saldo angezeigt.
Irgendeine Ahnung, was los ist.

Ich habe das Beispiel aus diesem Link http://bi.srivatsakr.com/2011/08/converting-rows-into-single-cell-comma.html verwendet, um mehrere Textwerte, die einer ID entsprechen, in eine Zelle zu bekommen, aber wie ich Ich muss dies für zwei Arten von Mehrfachwerten tun, und meine Hauptabfrage enthält bereits zu viele Informationen. Ich habe alles genau wie im Beispiel in meiner Hauptabfrage gemacht und hat wunderbar funktioniert, aber für die zweite versuche ich, sie in a zu erstellen zweite Abfrage (als ob ich diese auch in die Hauptabfrage einbeziehen würde, dauert es ewig), ich habe in einem zweiten Bericht getestet und es hat gut funktioniert, aber dann habe ich versucht, sie in den Hauptbericht aufzunehmen und ich erhalte #multivalue, ich habe die zusammengeführt main ids, ich habe die Variablen als Detailvariablen gemacht, ich habe eine Indikatorvariable (Boolean) für den Vergleich mit dem Maximalwert erstellt und es funktioniert immer noch nicht.

In der zweiten Abfrage und Meldung habe ich sowas

ID – Art des Kontakts
123 – Normalpost
123 – E-Mail
123 – Telefon
234 – E-Mail

Wenn ich das Linkbeispiel in einem zweiten Bericht mache, kann ich es so aussehen lassen:

ID – Art des Kontakts
123 – Post, E-Mail, Telefon
234 – E-Mail

Aber wenn ich versuche, es in den Hauptbericht zu verschieben, sieht es so aus:

ID – Art des Kontakts
123 – #mehrwertig
234 – E-Mail

meine Variablen sehen so aus:
Dieses habe ich auch als Boolean ausprobiert und es hat immer noch nicht funktioniert.
Max. Kontakttyp=Max([Kontakttyp]) In ([Abfrage2].[ID])

Ein Detail-Variablen-Link zur Haupt-ID von Query1
ID-Kontakttyp = =[Kontakttyp]

Ein Detail-Variablen-Link zur Haupt-ID von Query1
Concat Type Contact = If IsNull(Previous(Self([ID])))Then [ID Type of Contact] Else ([ID Type of Contact]+”, “+Previous(Self([ID])) )

Eine Messvariable:
Alle Kontakttypen = = [Concat Type Contact] Wobei ([ID Type of Contact] = [Max Type Contact])

Was vermisse ich? Wie kann ich es richtig mit dem Hauptbericht verknüpfen und zum Laufen bringen?

Hallo Dave,
wann werden Sie viel ausführlicher über den Kontext schreiben.
warten auf Ihren Post.Bitte machen Sie es schnell.

Ich habe mich gefragt, ob Sie mir helfen könnten, die Prozentsätze (G) der Inlist-Werte (V/X)% und (Y/X)% innerhalb derselben Dimension (V,X,Y) in Kreuztabellen zu berechnen.

V X Y G F
A 6 100 25 % %
B 12 200 50 % %
B 18 300 75 % %
C 24 400 100 % %
D 30 500 125 % %
E 36 600 150 % %

Ich habe eine Anforderung in einem Webi-Bericht wie unten beschrieben. Ich habe alles außer den geplanten YTD-Kosten. Jetzt muss ich die geplanten YTD-Kosten basierend auf den geplanten Kosten, dem Portfolio, dem Projektnamen, dem Monat und der Häufigkeit berechnen.
Kann mir jemand helfen, wie man dies in BO Webi oder über eine SQL-Abfrage erreicht, ist auch in Ordnung.

Hallo Dave,
Ich bin ein großer Fan von dir geworden. Aber die nächsten Blogs zu Eingabe- und Ausgabekontexten finde ich nicht wie von Ihnen versprochen in diesem Blog.
Haben Sie diese noch nicht veröffentlicht oder finde ich nicht den richtigen Link?
Warte sehnsüchtig auf deine Beiträge.
Grüße,
Arup

Ich habe große Probleme, eine einfache Abfrage zu dem zu ändern, was ich möchte. – Ich glaube, ich gebe die Formel richtig ein, da ich keine Probleme habe, bevor ich so etwas verwende:.

Abfrage 1 (Produkt / Geschäft / Lager)
Abfrage 2 (Geschäft) Eindeutige Liste von Geschäften, die von mir in einem anderen Universum festgelegt wurden.

Zusammenführen: query1.store = query2.store
Quelldimension: Query2.store

Momentan gibt mir Abfrage 1 einen Gesamtbestand nach Filiale / Produktebene.
Ich benötige, dass die Stores aus Abfrage 2 derjenige sind, mit dem ich summiere, also habe ich es versucht:

=Summe([Stock].[Total Branch Stock Unit] ForEach ([Query 2].[STORE]))

Dies gibt mir immer noch die Bestandszahl aus Abfrage 1 (sie sollte niedriger sein, da ich dies auf einer anderen Registerkarte getestet habe, um zu sehen, was die Ausgabe ist).

Ich habe viele Variationen der obigen Formel ausprobiert, aber alle scheinen mir die Summe des Produkts aus Abfrage 1 zu erhalten, wenn ich sie tatsächlich gegen Abfrage 2 speichern muss.

Bitte um Hinweis, Hilfe wäre sehr dankbar.

Webi 4.1. Ich muss eine Kennzahl in meinem Webi-“dashboard” basierend auf dem maximalen Datum für diese Kennzahl abrufen. Wenn die Antwort auf diese Frage an anderer Stelle gepostet wurde, verzeihen Sie mir bitte und weisen Sie mich in die richtige Richtung.

Hallo Dave, etwas anderes Problem. Ich habe eine Tabelle, die im Bericht mit der Spalte Jahr/Kontennummer/Stadt angezeigt wird.
Daten sind wie
2003 /c01 /London
2004 /c01 / NYcity
Ich möchte eine andere Spalte anzeigen, die den Stadtwert anzeigt, wobei Jahr = maximales Jahr für alle Zeilen
Beispielsweise:
2003 /c01 /London / NYcity
2004 /c01 / NYcity / NYcity
Irgendeine Ahnung, wie ich das sortieren kann.
Grüße
GB

Hallo Dave
Ich habe einen Kreuztabellenbericht mit 5-Jahres-Daten von 2001 bis 2005 erstellt
Es gibt ein Objektjahr (Typnummer) im Universum.
Im Bericht wurde eine andere Variable MAX_YEAR_NO erstellt, die max(Year) ist.

In der Kreuztabelle habe ich diese Berichtsvariable in der Formel verwendet
=([Umsatz] Wobei ([Jahr]=[ MAX_YEAR_NO]) ForAll([Jahr] )

Die Formel summiert den Umsatz für alle 5 Jahre, aber in dieser Kreuztabelle erwarte ich nur Daten für das maximale Jahr, also 2005.
Wenn ich die Formel ändere, indem ich den konstanten Wert 2005 anstelle der Variablen ]=[ MAX_YEAR_NO] hinzufüge, funktioniert es.
Aber ich möchte eine dynamische Formel anstelle eines konstanten hartcodierten Werts verwenden.

Irgendeine Ahnung . vielen Dank im Voraus

Ich versuche, ein Liniendiagramm zu erstellen, das die letzten 12 Monate mit Belastungen und Zahlungen anzeigt. Das ist der einfache Teil. Ich versuche auch, zwei “baseline”-Zeilen hinzuzufügen, die die durchschnittlichen Gebühren und Zahlungen für das erste 12-Monatsfenster anzeigen. Die durchschnittlichen Gebühren in den ersten 12 Monaten betrugen beispielsweise 18.000 US-Dollar pro Monat. Ich möchte die monatlichen Gebühren auf einer Linie grafisch darstellen und dann eine andere Linie haben, die über den aktuellen 12-Monats-Zeitraum bei $ 18.000 verläuft. Gibt es eine Möglichkeit, dies dynamisch statt hart zu codieren??

Max(Year), wenn Sie das Jahr angeben, ist das Jahr selbst. Wenn Sie das maximale Jahr für den Bericht angeben möchten, sollte Ihr MAX_YEAR_NO wahrscheinlich so lauten wie Max([Jahr]) im Bericht.

Danke für den Blog. Die Informationen sind für einen jungen Entwickler wie mich sehr hilfreich.

Wurden die anderen Teile dieser Serie veröffentlicht? Ich habe alle deine Blogs gelesen, aber ich konnte sie nicht finden. Ich habe auch das BOB-Forum durchsucht, aber kein Glück.

Wie bereits erwähnt, ist dies mit Abstand der am häufigsten nachgefragte Beitrag, den ich noch nicht geschrieben habe. Ich habe tatsächlich einen Teil davon begonnen, seit ich auf diese Site zurückgekehrt bin, aber ich weiß nicht, ob / wann es abgeschlossen sein wird. Danke für Ihr Interesse/Kommentar!

Danke für das Update Dave. Gibt es noch andere von Ihnen erstellte Werke zum Lesen, die nicht auf BO beschränkt sind?

Ich arbeite in letzter Zeit mehr mit Tableau, daher geht es in meinem letzten Beitrag um Ähnlichkeiten zwischen Web Intelligence und Tableau in Bezug auf Variablen und Formeln. Wenn Sie nach anderen Dingen suchen, die ich schreibe, die nicht einmal im Entferntesten mit BI zu tun haben, lassen Sie es mich wissen und ich werde einige Links posten.

Bin schon lange ein Fan deines Blogs– hilfreich, klar und gut geschrieben. Immer nützliche Informationen, wenn ich irgendein Problem googele.

Vor kurzem führte mich eine Frage auf Ihre Website und eine andere…
Ich dachte, ich mache Sie auf Ihre Inhalte aufmerksam, die an anderer Stelle (fast ausschließlich Wort für Wort) ohne Quellenangabe verwendet werden: http://bo-reports.blogspot.com/2016/06/introducing-calculation-context-default.html?_sm_au_ =iVVvvvNRJt65HBV6

Hallo, danke für den Fund. Ich habe diese Domain zu meinem Hotlink-Skript hinzugefügt.

Vielen Dank für die Erstellung dieses Blogs, wirklich nützlich, was Sie mit uns teilen. Ich habe ein Problem, bei dem ich die Lösung nicht finden kann / den falschen Ansatz habe.

Ich muss den Umsatzbeitrag jedes Mitarbeiters mit folgender Formel berechnen: (Stunden/Gesamtstunden)*Umsatz

Dies funktioniert gut, wenn ich die Customer-Dimension in der Tabelle habe, ich mache eine Pause beim Employee und blende die Tabellenzeilen mit dem Kunden aus. Ich muss dasselbe in einem Diagramm replizieren und kann den gleichen Trick anscheinend nicht ausführen, indem ich die Linien ausblende und nur die Zwischensumme der Mitarbeiterpause einblende.

Spalte1 Spalte2 Spalte3
Mitarbeiter-Kundenformel —— Diese Zeile ausblenden
Gesamtsumme des Mitarbeiters (Formel)

Formel= ([Stunden]/([Stunden] Für alle ([Mitarbeiter])))*[Umsatz]

Ich müsste das obige replizieren, aber ohne die Kundendimension, d.h.

Spalte 1 Spalte 2
Mitarbeiterformel

Summe([Stunden] FürEach ([Kunde])) / Summe([Stunden] FürAlle ([Mitarbeiter]) In ([Kunde]) * Summe([Umsatz] FürEach ([Kunde]))

berücksichtigt aber nicht die Kundendimension.

Irgendeine Idee, wie ich diese Arbeit bekommen kann?

Ich arbeite in letzter Zeit mehr mit Tableau, daher geht es in meinem letzten Beitrag um Ähnlichkeiten zwischen Web Intelligence und Tableau in Bezug auf Variablen und Formeln. Wenn Sie nach anderen Dingen suchen, die ich schreibe, die nicht einmal im Entferntesten mit BI zu tun haben, lassen Sie es mich wissen und ich werde einige Links posten. – Ja, ich bin sehr interessiert.

Beste Erklärung von Berechnungskontexten, die ich online gefunden habe. Vielen Dank dafür

Hallo Dave, ich versuche derzeit, die Spalte basierend auf dem Managernamen zu unterbrechen, und möchte den Umsatz für jeden Managernamen am Ende der Pause summieren. Das Problem, mit dem ich konfrontiert bin, ist, dass ich die Gesamtsumme der Spalte in den Pausen anstelle der Summe für jeden Manager erhalte. Ich habe eine ähnliche Funktion auf der GP-Spalte ausgeführt und es hat gut funktioniert. Ich habe ein Problem nur in der Spalte "Umsatz".

Weißt du, wo ich falsch liege?

Ich müsste die Struktur Ihres Berichts sehen. Können Sie noch ein paar Angaben machen?

Wenn Sie eine schnellere Antwort benötigen, können Sie versuchen, auf BOB zu posten, falls Sie dies noch nicht getan haben. Es gibt viele Formelexperten.

Hallo Dave,
In einem meiner Berichte erstelle ich eine Bucket-Variable, die auf zwei weiteren Variablen basiert, und wenn ich die Bucket-Variable in den Bericht bringe, wird ein mehrwertiger Fehler ausgegeben. Ich weiß, dass mehrwertige Fehler erstellt werden, wenn zwei oder mehr Werte für diese Variable zurückgegeben werden. Aber dies ist eine nicht verschmolzene Dimension. Ich kann mir nicht vorstellen, dass sich Webi so verhält. Ich habe Bucket-Variablen als Dimensionen in anderen Berichten erstellt und sie haben gut funktioniert.

Hier ist die Bucket-Variable

var Eimer
= If([var DaysLetterVerified]<6 ) Then "0-5"
ElseIf( ([var DaysLetterVerified]<11) )Then "6-10"
ElseIf( ([var DaysLetterVerified]<16) ) Then "11-15"
ElseIf( ([var DaysLetterVerified]<21) ) Then "16-20"
ElseIf( ([var DaysLetterVerified]<26) ) Then "21-25"
ElseIf( ([var DaysLetterVerified]<30) ) Then "26-30"
ElseIf( ([var DaysLetterVerified]35) ) Then 󈬔+”

[var DaysLetterVerified]
=DaysBetween([var MinLetterDt][Verifizierter Dt])

[var MinLetterDt]
=Min([Bestätigungsbrief gesendet Dt]) ForEach ([Bestätigungs-Barcode-ID])

Wenn Sie etwas sehr Offensichtliches spüren können, lassen Sie es mich bitte wissen. ( Ich bin ein Anfänger)

Ich versuche, das Ergebnis einer Maßnahme AUSSCHLIESSLICH selbst auszuwerten. Ex. Wenn ich 10 Zeilen in einer Tabelle habe. Ich möchte eine Kennzahl erstellen, die das Ergebnis einer Formel unter Berücksichtigung der anderen 9 Zeilen (ohne aktuelle Zeile) für jede der 10 Zeilen berechnet. Gibt es so etwas wie “no in body”-Kontext, das ich dafür verwenden könnte?

Nicht direkt, das ist mir bekannt, aber das (oder so ähnlich) würde funktionieren:
Summe(x) im Bericht - Summe(x) im Text
Sie sagten, wenn Sie 10 Zeilen hätten, wollten Sie neun davon summieren und die aktuelle Zeile weglassen. Das ist, was diese Formel tun würde.

Hinterlasse eine Antwort

  • Seiten

    von Mahboob Mohammed am 2021-02-24
    von Jamie Oswald am 19.10.2020
    von Dave Rathbun am 18.10.2020
    von Renu am 2020-09-22
    von DropX am 23.07.2020

Nicht von SAP BusinessObjects unterstützt oder mit SAP BusinessObjects verbunden • Copyright © David G. Rathbun
Präsentiert von WordPress • Podcast-Technologie von podPress


Abstrakt

Die Frage, ob Contract Farming (CF) ein alternativer Weg für die Kommerzialisierung landwirtschaftlicher Produkte in Afrika sein kann, wurde insbesondere nach den weltweiten großflächigen Landerwerben (LSLA) von 2008/09 breit diskutiert. In diesem Artikel wird versucht, die Diskussionen in lokale Kontexte zu übertragen, indem kontextspezifische Bilder externer Interventionen, einschließlich der von CF und LSLA, im Fall eines Sojabohnenprojekts in Zentralmosambik illustriert werden. Zwei Dörfer desselben Projekts wurden vergleichend analysiert und dabei auf differenzierte politische Reaktionen „von unten“ fokussiert: Die Einheimischen in einem Dorf zögerten, sich an CF zu beteiligen und widerstanden eine CF-Firma und LSLA, während die Einheimischen im anderen Dorf aktiv an CF teilnahmen, und eingearbeitet LSLA in ihren Lebensunterhalt. Die auf Feldforschung basierenden Ergebnisse legen nahe, dass im ehemaligen Dorf Nachkriegserfahrungen der ländlichen Revitalisierung, ein sich selbst tragendes Netzwerk auf der Grundlage matrilinearer Abstammung und sich überschneidende Rollen traditioneller und politischer Autoritäten eine Grundlage für die Widerstand. Im Gegensatz dazu waren in letzterem Dorf die historisch akkumulierte Abhängigkeit von externen Eingriffen, die soziale Differenzierung auf der Grundlage geldorientierter kapitalistischer Verhältnisse und die Konzentration der Macht auf einen lokalen Führer eine Grundlage für Gründung.


4. Bedrohungsmodelle und Risiken

Dieser Abschnitt ist nicht normativ.

4.1. Bedrohungsmodelle

Das Erteilen von Berechtigungen für nicht authentifizierte Ursprünge entspricht in Anwesenheit eines Netzwerkangreifers der Erteilung der Berechtigungen für einen beliebigen Ursprung. Der Zustand des Internets ist so, dass wir tatsächlich davon ausgehen müssen, dass ein Netzwerkangreifer anwesend ist. Im Allgemeinen fallen Netzwerkangreifer in 2 Klassen: passiv und aktiv.

4.1.1. Passiver Netzwerkangreifer

Ein "Passiver Netzwerkangreifer" ist eine Partei, die in der Lage ist, Verkehrsflüsse zu beobachten, aber nicht in der Lage ist oder sich entscheidet, den Verkehr auf den Schichten, auf die sich diese Spezifikation bezieht, nicht zu ändern.

Die Überwachung von Netzwerken auf diese Weise "untergräbt die Absicht, Parteien ohne die Zustimmung dieser Parteien zu kommunizieren", und man "kann sich nicht gegen die schändlichsten Akteure verteidigen, während sie eine Überwachung durch andere Akteure ermöglicht, egal wie wohlwollend manche sie fürchten". [RFC7258] Daher erfordern die in diesem Dokument definierten Algorithmen Mechanismen, die den Datenschutz auf der Anwendungsebene gewährleisten, nicht nur Integrität.

4.1.2. Aktiver Netzwerkangreifer

Ein "Aktiver Netzwerk-Angreifer" verfügt über alle Fähigkeiten eines "Passiven Netzwerk-Angreifers" und ist zusätzlich in der Lage, alle Daten, die das Netzwerk durchlaufen, zu modifizieren, zu blockieren oder wiederzugeben.Diese Fähigkeiten stehen potenziellen Gegnern auf vielen Ebenen der Fähigkeit zur Verfügung, von kompromittierten Geräten, die öffentliche drahtlose Netzwerke anbieten oder einfach daran teilnehmen, bis hin zu Internetdienstanbietern, die indirekt Sicherheits- und Datenschutzschwachstellen einführen, während sie den Datenverkehr aus finanziellen Gründen manipulieren ([VERIZON] und [COMCAST] sind aktuelle Beispiele) an Parteien mit der direkten Absicht, die Sicherheit oder den Datenschutz zu gefährden, die in der Lage sind, einzelne Benutzer, Organisationen oder sogar ganze Bevölkerungsgruppen anzusprechen.

4.2. Ahnenrisiko

Der Algorithmus für sichere Kontexte durchläuft alle Vorfahren eines bestimmten Kontexts, um zu bestimmen, ob der Kontext selbst sicher ist oder nicht. Warum sollten wir ein sicher zugestelltes Dokument in einem iframe nicht an sich als sicher betrachten?

Die kurze Antwort ist, dass dieses Modell Missbrauch ermöglichen würde. Die Implementierung von [WEBCRYPTOAPI] in Chrome war ein frühes Experiment zum Sperren von APIs, um Kontexte zu sichern, und ging nicht durch die Vorfahren eines Kontexts. Die Annahme war, dass das Sperren der API auf eine Ressource, die selbst sicher bereitgestellt wurde, ausreichen würde, um eine sichere Nutzung zu gewährleisten. Das Ergebnis war jedoch, dass Entitäten wie Netflix iframe- und postMessage()-basierte Shims erstellten, die die API unsicheren Kontexten aussetzten. Die Einschränkung war kaum mehr als eine Geschwindigkeitsbegrenzung, die den unsicheren Zugriff auf die API verlangsamte, aber einen solchen Zugriff völlig ineffektiv verhinderte.

Während die Algorithmen in diesem Dokument unsichere Kontexte nicht perfekt von sicheren Kontexten isolieren (wie in § 5.1 Unvollständige Isolierung erörtert), bieten die Vorfahrenprüfungen einen ziemlich robusten Schutz für die Garantien der Authentifizierung, Vertraulichkeit und Integrität, die solche Kontexte bieten sollten zur Verfügung stellen.

4.3. Risiken im Zusammenhang mit unsicheren Kontexten

Bestimmte Webplattformfunktionen, die einen deutlichen Einfluss auf die Sicherheit oder den Datenschutz eines Benutzers haben, sollten nur in sicheren Kontexten zur Verfügung stehen, um die oben genannten Bedrohungen abzuwehren. Funktionen, die in unsicheren Kontexten verfügbar sind, riskieren, diese Fähigkeiten für Netzwerkangreifer offenzulegen:

  1. Die Möglichkeit, sensible Daten (personenbezogene Daten, Anmeldeinformationen, Zahlungsinstrumente usw.) zu lesen und zu ändern. [CREDENTIAL-MANAGEMENT-1] ist ein Beispiel für eine API, die sensible Daten verarbeitet.
  2. Die Fähigkeit, Eingaben von Sensoren auf dem Gerät eines Benutzers zu lesen und zu ändern (Kamera, Mikrofon und GPS sind besonders bemerkenswert, aber sicherlich auch weniger offensichtlich gefährliche Sensoren wie der Beschleunigungsmesser). [GEOLOCATION-API] und [MEDIACAPTURE-STREAMS] sind historische Beispiele für Funktionen, die Sensoreingaben verwenden.
  3. Die Möglichkeit, auf Informationen über andere Geräte zuzugreifen, auf die ein Benutzer Zugriff hat. [DISCOVERY-API] und [WEB-BLUETOOTH] sind gute Beispiele.
  4. Die Möglichkeit, Benutzer mit temporären oder dauerhaften Identifikatoren zu verfolgen, einschließlich Identifikatoren, die sich nach einiger Zeit selbst zurücksetzen (z. B. window.sessionStorage), Identifikatoren, die der Benutzer manuell zurücksetzen kann (z. B. [ENCRYPTED-MEDIA], Cookies [RFC6265] und [IndexedDB ]), sowie die Identifizierung von Hardwarefunktionen, die der Benutzer nicht einfach zurücksetzen kann.
  5. Die Möglichkeit, einen Status für einen Ursprung einzuführen, der über Browsersitzungen hinweg bestehen bleibt. [SERVICE-WORKERS] ist ein großartiges Beispiel.
  6. Die Möglichkeit, die native Benutzeroberfläche eines Benutzeragenten in irgendeiner Weise zu manipulieren, wodurch Details entfernt, verdeckt oder manipuliert werden, die für das Verständnis eines Benutzers von seinem Kontext relevant sind. [FULLSCREEN] ist ein gutes Beispiel.
  7. Die Möglichkeit, einige Funktionen einzuführen, für die eine Benutzerberechtigung erforderlich ist.

Diese Liste ist nicht erschöpfend, soll Ihnen aber ein Gefühl für die Arten von Risiken geben, die wir beim Schreiben oder Implementieren von Spezifikationen berücksichtigen sollten.

Hinweis: Es ist zwar wichtig, ein Feature selbst auf sichere Kontexte zu beschränken, aber wir sollten nicht vergessen, dass Einrichtungen, die solche Informationen enthalten (wie neue Netzwerkzugriffsmechanismen oder andere generische Funktionen mit Zugriff auf Netzwerkdaten), ebenso sensibel sind.


Das Beispiel

In diesem Beispiel erstellt jedes positionierte Element aufgrund seiner Positionierungs- und Z-Indexwerte seinen eigenen Stapelkontext. Die Hierarchie der Stapelkontexte ist wie folgt organisiert:

Es ist wichtig zu beachten, dass DIV #4, DIV #5 und DIV #6 Kinder von DIV #3 sind, so dass das Stapeln dieser Elemente innerhalb von DIV#3 vollständig aufgelöst wird. Sobald das Stapeln und Rendern innerhalb von DIV #3 abgeschlossen ist, wird das gesamte DIV #3-Element zum Stapeln im Wurzelelement in Bezug auf das DIV seines Geschwisters weitergegeben.


Prozentsätze in den realen Beispielen

Du hast einen tollen Sommerjob als Verkäuferin bei Shmacy's bekommen. Sie erhalten eine Provision von 4% für jeden Verkauf, den Sie tätigen, zusätzlich zu Ihrem Lohn von 8,50 USD/Stunde. Nach einer langen siebenstündigen Schicht belief sich Ihr Umsatz auf 1.250 USD. Wie hoch ist Ihr Gesamtverdienst für diese Schicht?

Erstens verdienen Sie 8,50 US-Dollar pro Stunde und haben sieben anstrengende Stunden gearbeitet. Das wären 8,50 $ × 7 = 59,50 $.

Außerdem verdienten Sie 4 % Ihres Umsatzes oder 4 % von $1250. Nach der Proportionalmethode würde dies folgendermaßen aussehen:

 

Multiplizieren Sie nun beide Seiten mit (100)(1250), um diese Nenner wegzulassen.

Und dividiere durch den Koeffizienten (100).

 

Sie haben also 50 US-Dollar Provision verdient.

Wenn Sie Ihre Provision und Ihren Lohn kombinieren, haben Sie an einem Tag insgesamt 59,50 USD + 50 USD = 109,50 USD verdient. Cha-ching!

Beispiel 2

Die Sports Shmauthority bietet einen fantastischen Verkauf ihrer Winterausrüstung an, 65 % Rabatt auf den regulären Preis. Sie finden die Snowboardjacke, die Sie sich seit dem letzten Jahr wünschen. Vor dem Verkauf waren es 220 Dollar. Wie viel ist es jetzt?

Schöner Fund! Okay, diese Jacke ist 65 % günstiger als 220 $. Wir müssen zuerst herausfinden, was 65 % von 220 US-Dollar sind. Übersetzen wir das in eine Gleichung:

Was (x) ist (=) 65 % (0,65) von (multiplizieren) 220?

Das Schwierige an Rabatten ist, sich daran zu erinnern, dass dies der Preis ist aus, nicht der Preis, den Sie zahlen. Um den Verkaufspreis zu ermitteln, ziehen Sie einfach den Betrag vom Originalpreis ab.

Diese tolle Jacke kostet nur 77 US-Dollar! Punktzahl!

Beispiel 3

Alle Pullover sind 30% auf den Originalpreis. Als cleverer Käufer haben Sie außerdem einen Gutschein für 15% Rabatt auf alle Artikel, einschließlich Sale-Artikeln. Wie viel kostet ein 75-Dollar-Pullover?

Nun könnten Sie versucht sein, diese beiden Prozentsätze zu kombinieren und zu sagen, dass der Pullover 45 % günstiger ist, aber das wird nicht funktionieren. Sie können solche Rabatte nicht kombinieren.

Nehmen Sie zuerst 30% Rabatt, um den Verkaufspreis zu finden. dann erhalten Sie 15% Rabatt auf den Verkaufspreis, um den zu zahlenden Betrag einschließlich Ihres Coupons zu ermitteln.

Das ist der Betrag aus, daher müssen wir diesen Betrag vom ursprünglichen Preis abziehen.

Das ist der Verkaufspreis, aber Sie möchten diesen Coupon trotzdem verwenden. Jetzt müssen wir 15% von diesem Preis abziehen.

15% von 52,50 $ = 0,15 × 52,50 $ = 7,875 $

Nun runden Sie auf den nächsten Cent.    

Ziehen Sie diesen Betrag schließlich vom Verkaufspreis ab.

Dieser Pullover, der ursprünglich 75 US-Dollar kostete, ist jetzt nur noch 44,62 US-Dollar!

Beispiel 4

Süss! Jeans bei American Shmeagle sind 40 % günstiger. Wie viel werden Sie für eine Jeans bezahlen, die ursprünglich 80 US-Dollar kostete? Vergessen Sie nicht die 9,25 % Mehrwertsteuer – berechnen Sie immer den Rabatt Vor die Umsatzsteuer hinzurechnen.

Berechnen Sie zuerst den Rabatt von 40%. Wir können dies tun, indem wir es in eine Gleichung übersetzen:

40% (0,40) von (multiplizieren) $80 ist (gleich) was (x)?

Das ist unser Rabatt, also ziehen Sie diesen von 80 $ ab.

Das ist unser Verkaufspreis. Jetzt ist es an der Zeit, die Umsatzsteuer hinzuzufügen: 9,25% von 48 US-Dollar sind was?

9,25% (0,0925) von (multiplizieren) 48 $ ist (gleich) was (x)?

Addieren Sie die Umsatzsteuer zum Verkaufspreis.

Die Gesamtsumme für die Jeans beträgt 52,44 USD.

Beispiel 5

Sie investieren 200 US-Dollar in ein Sparkonto mit 4% Zinsen jedes Jahr. Wenn Sie das Konto drei Jahre lang nicht berühren, wie viel Geld haben Sie nach diesen drei Jahren auf Ihrem Konto?

Dieses Problem ist nicht ganz so einfach, wie es zunächst scheint. Wir müssen damit umgehen Zinseszins. Ermitteln Sie die Jahresendsumme jedes Jahr, bevor Sie die Zinsen für das folgende Jahr berechnen.

Jahr4% von GesamtGesamtjahresende
14% von $200 = $8$200 + 8 = $208
24% von 208 $ = 8,32 $$208 + 8.32= $216.32
34% von 216,32 $ = 8,65 $$216.32 + 8.65 = $224.97

Nach drei Jahren hat Ihr Bankkonto jetzt 224,97 USD. Sie haben 24,97 $ verdient, indem Sie einfach nur herumgesessen und nichts getan haben. Darüber kann man sich nicht beschweren!

Wie man es NICHT macht:

Hätten Sie die Zinsen für die drei Jahre (4 % × 3 Jahre = 12 %) kombiniert und dann die Zinsen angesetzt, hätten Sie weniger verdient als bei der Aufzinsung:

Nach drei Jahren hätte Ihr Gesamtbetrag 200 $ + 24 = 224 $ betragen, satte 97 weniger als der Zinseszins. 

(Ja, damit kann man kaum eine Packung Kaugummi kaufen, aber stellen Sie sich vor, Sie investieren 200.000 USD statt 200 USD, und Sie können sehen, dass dies wirklich einen Unterschied macht.)

Beispiel 6

Nach einem besonders schönen Mittagessen beträgt Ihre Rechnung 44,75 $. Sie und Ihre beiden Freunde teilen sich die Rechnung zu gleichen Teilen auf. Wie viel schulden Sie jeweils? (Vergessen Sie nicht, ein Trinkgeld von 20% hinzuzufügen!)

Da wir es mit einer realen Situation zu tun haben, ist es völlig akzeptabel, den Betrag auf 45 $ zu runden, eine einfache Zahl, die in Drittel geteilt werden kann.

Außerdem können Sie das Trinkgeld entweder vor der Aufteilung der Rechnung oder nach der Aufteilung berechnen. In jedem Fall erhalten Sie die gleiche Antwort.

Teilen Sie, bevor Sie Tipp:

Tipp vor dem Teilen:

jeder


Anmerkungen

Eine Studie, die den Nigerian Demographic and Health Survey von 1990 verwendet, zeigt, dass Polygynie zwar nicht mit dem Überleben während der Neugeborenen- und Kindheitsperiode verbunden ist, aber positiv assoziiert mit dem Überleben von Kindern während der postneonatalen Phase (Ukwuani et al. 2002).

Einige Anthropologen (insbesondere Goody 1973) haben widerlegt, dass wirtschaftliche Faktoren weit verbreitete Polygynie motivieren und auf die Bedeutung sozialer und kultureller Merkmale hingewiesen. Obwohl wir diese Meinungsverschiedenheit nicht diskutieren, beschreiben wir die sozialen und kulturellen Elemente der Polygynie.

Von den 48 Ländern in Subsahara-Afrika schließen wir 13 Länder aus unserer Studie aus, da das DHS in diesen Ländern zwischen 2000 und 2010 nicht tätig war (Angola, Botswana, Zentralafrikanische Republik, Komoren, Elfenbeinküste, Dschibuti, Äquatorialguinea , Guinea-Bissau, Mauritius, Seychellen, Somalia, Südsudan und Togo). Darüber hinaus schließen wir fünf Länder aus, weil die Daten nicht öffentlich verfügbar sind (Kap Verde, Eritrea, Gambia, Mauretanien, Südafrika) und ein Land (Lesotho), weil keine Polygynie-Daten erhoben wurden, was zu einer endgültigen Stichprobe von 29 Ländern führte.

Die Rücklaufquoten werden in den Berichten zur Umfragedokumentation für jedes Land veröffentlicht, die online verfügbar sind (http://www.measuredhs.com/).

Obwohl das DHS kleinere Aggregateinheiten (d. h. „Cluster“) enthält, sind sie nicht für kontextbezogene Analysen gedacht, sondern sind Aufzählungsbereiche, die nur zum Zwecke der Stichprobenziehung gezogen werden.

Die Stichproben für jede Region sind groß – im Durchschnitt enthalten sie 964 Haushalte (zwischen 266 und 7.091), 1.145 Frauen (zwischen 306 und 7.297) und 488 Männer (zwischen 80 und 3.358). Im Ergebnis macht die Einbeziehung bzw. das Weglassen des Indexhaushalts aus den aggregierten Analysen keinen Unterschied. Zum Beispiel in der Region Kigal in Mali – der kleinsten Stichprobe von Frauen (n = 306) für jede unserer Regionen – 7,19 % der Frauen sind in polygynen Gewerkschaften. Wenn wir die Indexfamilie bei der Erstellung dieses Index weglassen, würde der Wert zwischen den Familien um weniger als ein Drittel von 1 % variieren. Da dies kaum einen Unterschied macht, schließen wir die Indexfamilie ein, weil (1) wir einen einheitlichen Wert für jede Region bevorzugen und (2) das Entfernen der Indexfamilie die Korrelation zwischen dem aggregierten Niveau und dem individuellen Niveau ändert, aber nicht vollständig beseitigt ( Raudenbush und Bryk 2002).

Der Querschnittscharakter der Daten verbietet es uns, Veränderungen in der Familienstruktur zwischen der Geburt eines Kindes und dem Zeitpunkt der Erhebung bzw. bei verstorbenen Kindern bis zum Zeitpunkt des Todes zu berücksichtigen. Daher ist es möglich, dass monogame Gewerkschaften polygyn wurden nach Geburt und/oder Tod des Kindes. Tatsächlich könnte der Eintritt in eine polygyne Familie eine direkte Reaktion auf den Tod eines Kindes sein. Wir reduzieren die Wahrscheinlichkeit einer Fehlklassifizierung der Familienstruktur, indem wir die Analysen auf Geburten beschränken, die in den fünf Jahren vor der Erhebung stattgefunden haben. Dieser Bias ist jedoch weiterhin möglich und sollte bei der Interpretation der Ergebnisse berücksichtigt werden.

Eine Einschränkung des Bildungsverhältnisses von Frauen zu Männern besteht darin, dass es nur eine Dimension der Geschlechterungleichheit (d. h. den Bildungsstand) widerspiegelt. Da Bildung jedoch eine zentrale Determinante für Einkommen, Beruf und Gesundheit des Einzelnen ist, ist sie ein ideales Maß, um die Ungleichheiten zwischen den Lebenschancen von Frauen und Männern umfassender zu erfassen. Das DHS misst auch die Ungleichheit der Geschlechter durch eine Reihe von Fragen zur Beteiligung von Frauen an Haushaltsentscheidungen, jedoch werden diese Fragen nur in zwei Dritteln der Länder in unserer Studie gestellt und sind in ähnlicher Weise durch ihren Fokus auf eine einzige Dimension der Ungleichheit eingeschränkt .

Ein Ansatz mit festen Effekten auf Länderebene ermöglicht es uns, konstante, unbeobachtete Faktoren zu kontrollieren, die in den afrikanischen Ländern südlich der Sahara variieren. Da ein Ansatz mit festen Effekten weniger effizient ist, werden unsere Analysen konservativere Schätzungen ergeben.


4.3.2: Prozentuale Kontexte

Beim Drucken von Musik müssen viele Notationselemente, die nicht explizit in der Eingabedatei vorkommen, zur Ausgabe hinzugefügt werden. Vergleichen Sie beispielsweise die Eingabe und Ausgabe des folgenden Beispiels:

Die Eingabe ist eher spärlich, aber in der Ausgabe wurden Taktstriche, Vorzeichen, Schlüssel und Taktart hinzugefügt. Wenn LilyPond interpretiert Bei der Eingabe werden die Musikinformationen von links nach rechts geparst, ähnlich wie ein Interpret die Partitur liest. Beim Lesen der Eingabe merkt sich das Programm, wo Taktgrenzen sind und welche Tonhöhen explizite Vorzeichen erfordern. Diese Informationen müssen auf mehreren Ebenen gespeichert werden. Ein Vorzeichen betrifft beispielsweise nur eine einzelne Notenzeile, während ein Taktstrich über die gesamte Partitur synchronisiert werden muss.

Innerhalb von LilyPond sind diese Regeln und Informationen gruppiert in Kontexte. Wir haben den Voice-Kontext bereits vorgestellt. Andere sind die Kontexte Notensystem und Partitur. Kontexte sind hierarchisch, um die hierarchische Natur einer Musikpartitur widerzuspiegeln. Beispiel: Ein Notensystemkontext kann viele Stimmenkontexte enthalten und ein Notenkontext kann viele Notensystemkontexte enthalten.

Jeder Kontext ist dafür verantwortlich, einige Notationsregeln durchzusetzen, einige Notationsobjekte zu erstellen und die zugehörigen Eigenschaften zu pflegen. Zum Beispiel kann der Voice-Kontext ein Vorzeichen einleiten und dann behält der Notensystem-Kontext die Regel bei, um das Vorzeichen für den Rest des Takts anzuzeigen oder zu unterdrücken.

Als weiteres Beispiel wird die Synchronisation von Taktstrichen standardmäßig im Notenkontext behandelt. In manchen Musikstücken möchten wir jedoch möglicherweise nicht, dass die Taktstriche synchronisiert sind &ndash betrachten eine polymetrische Partitur im 4/4- und 3/4-Takt. In solchen Fällen müssen wir die Standardeinstellungen der Noten- und Notensystemkontexte ändern.

Bei sehr einfachen Partituren werden Kontexte implizit erstellt, und Sie müssen sich ihrer nicht bewusst sein. Bei größeren Stücken, beispielsweise mit mehr als einer Notenzeile, müssen diese explizit erstellt werden, um sicherzustellen, dass Sie so viele Notenzeilen erhalten, wie Sie benötigen, und dass sie in der richtigen Reihenfolge sind. Bei Satzteilen mit spezieller Notation ist es üblich, bestehende Kontexte zu modifizieren oder sogar völlig neue Kontexte zu definieren.

Zusätzlich zu den Kontexten Partitur, Notensystem und Stimme gibt es Kontexte, die zwischen Noten- und Notensystemebenen passen, um Notensystemgruppen zu steuern, wie die Kontexte PianoStaff und ChorStaff. Es gibt auch alternative Notenzeilen- und Stimmkontexte sowie Kontexte für Texte, Percussion, Griffbretter, Generalbass usw.


Wofür gibt die Bundesregierung Ihre Steuergelder aus? Sozialversicherungsprogramme, meist

Es ist Frühling, was den Beginn des Budgetierungsprozesses für den Kongress bedeutet und für viele Amerikaner ein toller Versuch, ihre Einkommenssteuern einzureichen. Das macht es zu einem guten Zeitpunkt, die Ausgabengewohnheiten der Bundesregierung in einem breiteren Kontext zu betrachten als nur die diesjährigen Schlachten.

Wenn man über die Ausgaben des Bundes nachdenkt, sollte man sich daran erinnern, dass die Bundesregierung, wie der ehemalige Finanzminister Peter Fisher einmal sagte, im Grunde „eine gigantische Versicherungsgesellschaft“ ist, wenn auch eine mit „Nebengeschäften in der Landesverteidigung und im Heimatland“. ” Im Geschäftsjahr 2016, das am 30. September endete, gab die Bundesregierung knapp 4 Billionen US-Dollar aus, und etwa 2,7 Billionen US-Dollar – mehr als zwei Drittel des Gesamtbetrags – gingen für verschiedene Arten von Sozialversicherungen (Sozialversicherungen) Sicherheit, Medicaid und Medicare, Arbeitslosengeld, Veteranengeld und dergleichen). Weitere 604 Milliarden US-Dollar oder 15,3 Prozent der Gesamtausgaben entfielen auf die nationale Verteidigung. Die Nettozinszahlungen für Staatsschulden beliefen sich auf etwa 240 Milliarden US-Dollar oder 6,1 Prozent. Bildungshilfe und damit verbundene soziale Dienste beliefen sich auf rund 114 Milliarden US-Dollar oder weniger als 3% aller Bundesausgaben. Alles andere – Erntesubventionen, Raumfahrt, Autobahnreparaturen, Nationalparks, Entwicklungshilfe und vieles mehr – machten die restlichen 6% aus.

Es kann hilfreich sein, den Anteil der Ausgaben an der gesamten US-Wirtschaft zu betrachten, der über lange Zeiträume einen konsistenten Bezugsrahmen bietet. Im Geschäftsjahr 2016 beliefen sich die Gesamtausgaben des Bundes auf 21,5% des Bruttoinlandsprodukts oder BIP. In den letzten Jahrzehnten bewegten sich die Bundesausgaben meist innerhalb weniger Prozentpunkte über oder unter 20 %. Die größte Ausnahme in jüngster Zeit war der Hypotheken-Crash von 2008: Im Fiskaljahr 2009 führten ein Anstieg der staatlichen Hilfsausgaben in Verbindung mit einer schrumpfenden Wirtschaft dazu, dass die Bundesausgaben auf 24,4 % des BIP anstiegen, den höchsten Stand seit dem Zweiten Weltkrieg, als die Bundesausgaben mit fast 43 % des BIP erreicht. (Wir haben uns für unsere Ausgabendaten auf archivierte historische Daten aus dem endgültigen Budget des ehemaligen Präsidenten Barack Obama gestützt. Der ursprüngliche Haushaltsvorschlag von Präsident Donald Trump enthält keine historischen Daten.)

Gemessen als Anteil am BIP ist das größte langfristige Wachstum der Bundesausgaben bei den Humandienstleistungen zu verzeichnen, einer breiten Kategorie, die verschiedene Arten von Sozialversicherungen, anderen Gesundheitsprogrammen, Bildungshilfe und Veteranenleistungen umfasst. Von weniger als 1 % des BIP während des Zweiten Weltkriegs (als viele Hilfsprogramme aus der Zeit der Depression entweder beendet oder auf die Kriegsanstrengungen verlagert wurden), belaufen sich die Bundesausgaben für menschliche Dienstleistungen heute auf 15,5 % des BIP. Im Fiskaljahr 2010 war sie sogar um 16,1 % höher, hauptsächlich aufgrund höherer Ausgaben für Arbeitslosengeld, Nahrungsmittelhilfe und andere Hilfsformen während der Großen Rezession. Heute sind die Hauptwachstumstreiber der Ausgaben für Humandienstleistungen Medicaid, Medicare und Social Security.

Während die Ausgaben für menschliche Dienstleistungen im Laufe der Zeit einen größeren Anteil am BIP ausmachen, ist der Anteil der Verteidigung geringer geworden: Er lag im Geschäftsjahr 2016 bei 3,3%, gegenüber 4,7% noch im Haushaltsjahr 2010.Im Allgemeinen, und vielleicht nicht überraschend, verbrauchen die Verteidigungsausgaben in Kriegszeiten mehr des BIP (weit mehr als ein Drittel auf dem Höhepunkt des Zweiten Weltkriegs) und weniger in Friedenszeiten. Die größte Ausnahme war die militärische Aufrüstung der Reagan-Ära (die sogar eine Aufrüstung beschleunigte, die spät in der Carter-Regierung begann): Von einem Post-Vietnam-Tief von 4,5% des BIP im Fiskaljahr 1979 erreichten die Verteidigungsausgaben schließlich ihren Höhepunkt bei 6% des BIP in Geschäftsjahr 1986.

Neben Personaldienstleistungen und Landesverteidigung sind die Zinsen für Staatsschulden die zweitgrößte Kategorie der Bundesausgaben. Ohne die an staatliche Treuhandfonds (wie die Sozialversicherungs- und Militärrentenfonds) und verschiedene andere kleine staatliche Kreditprogramme gezahlten Zinsen entsprachen die Nettozinsen in Höhe von 240 Milliarden US-Dollar, die im Fiskaljahr 2016 auf Bundesschulden gezahlt wurden, 1,3 % des BIP. Obwohl die Gesamtverschuldung der öffentlichen Hand weiter gestiegen ist (sie lag im Februar bei fast 19,96 Billionen US-Dollar und erreichte damit die gesetzliche Schuldengrenze), schwankt der Dollarbetrag der tatsächlich gezahlten Zinsen mit dem allgemeinen Zinsumfeld. Die Zinsen sind jetzt recht niedrig, aber in den 1980er und 1990er Jahren waren sie in diesen Jahrzehnten viel höher, die Nettozinszahlungen erreichten oder überstiegen oft 3 % des BIP.


Schau das Video: Mathe2 - 5a - AH Niveau I (Oktober 2021).