von rso » So, 12.02.2006 14:11
Hallo Barlee
Ja, das könnte ich so machen; aber Du gibst mir recht, das ist nicht die "elegante" Methode. Bei diesem kleinen Beispiel macht es zwar tatsächlich keinen Unterschied, aber wenn die Bedingung umfangreicher ist, dann hat man aufgrund der Formelwiederholung eine rechte Menge redundanten Code, was sich nebst der Performance auch auf die Übersichtlichkeit (wegen Wartung und Weiterentwicklung) auswirkt.
Mein aufgeführtes Beispiel ist nämlich nur eine extrem vereinfachte Problemstellung zum Erlernen, wie man diese in SQL grundsätzlich lösen kann. Tatsächlich kommen diese Problemlösungen nachher in viel komplexeren Problemstellungen zum Tragen, wie sich aus nachfolgendem Formelbeispiel - dargestellt in der SQL-Syntax von MS Access - ableiten lässt:
Abfrage: 11 Position tracking
SELECT [10 Transactions].TransactionNo, [10 Transactions].Date, [10 Transactions].Operation, [10 Transactions].Quantity, [10 Transactions].Title, [10 Transactions].Currency, [10 Transactions].UnitPrice, IIf([10 Transactions]![Operation]="Buy",[10 Transactions]![Quantity]*[10 Transactions]![UnitPrice]*-1,[10 Transactions]![Quantity]*[10 Transactions]![UnitPrice]) AS [Market Value], [10 Transactions].Commission, IIf([10 Transactions]![Operation]="Dividend",[10 Transactions]![UnitPrice],[Market Value]+[10 Transactions]![Commission]) AS Total, [10 Transactions].ExchangeRate, IIf(IsNull([10 Transactions]![ExchangeRate]),[Total],[Total]*[10 Transactions]![ExchangeRate]) AS [Total CHF], IIf([10 Transactions]![Operation]="Buy",[Quantity],IIf([10 Transactions]![Operation]="Sale",[Quantity]*-1,0)) AS [Adjusted Quantity], CInt(DSum("[Adjusted Quantity]","11 Position tracking","[Date]*1<=" & [Date]*1)) AS [Total Units], IIf([10 Transactions]![Operation]="Buy",[Total CHF]*-1,IIf([10 Transactions]![Operation]="Sale",[Quantity]*DLast("[ø-Unit Cost]","11 Position tracking","[Date]*1<" & [Date]*1)*-1,0)) AS [Adjusted Total CHF], CCur(DSum("[Adjusted Total CHF]","11 Position tracking","[Date]*1<=" & [Date]*1)) AS [Total Cost], IIf([Total Units]=0,0,[Total Cost]/[Total Units]) AS [ø-Unit Cost], IIf([10 Transactions]![Operation]="Sale",[Total CHF]*-1+[Quantity]*DLast("[ø-Unit Cost]","11 Position tracking","[Date]*1<" & [Date]*1),0) AS [Real P/L], 0 AS [Unreal P/L], IIf([10 Transactions]![Operation]="Dividend",[Total CHF]*-1,0) AS Dividend FROM [10 Transactions] ORDER BY [10 Transactions].Date
Wenn in diesem Beispiel noch Formelwiederholungen zum Tragen kommen, dann befürchte ich, den Überblick zu verlieren.
Aus diesem Grund wäre ich sehr interessiert daran zu wissen, wie man in Base bzw. der dazugehörigen SQL-Syntax mit Bezug auf einen Alias weiterrechnen könnte. Möglicherweise geht das irgendwie mit der UPDATE-, INSERT- oder SET-Funktion oder mit einem Umweg über Tabellenansichten (auch View oder Sicht genannt), da man diese auch mit SQL definieren kann.
Mein einfaches Beispiel sähe dann so aus:
1) casewhen(Tarifgehalt<=100000,Tarifgehalt+Zulage1,Tarifgehalt+Zulage2) as Bruttogehalt
2) Bruttogehalt*Sozialzuschlag as Gehalt
In MS-Access ist das simpel zu realisieren, man gibt einfach in der gleichen Abfrage den Alias ein und schon wird das neue Feld berechnet.
Hast Du eine Idee, wie man das in Base machen könnte?
Danke und Gruss
rso
Hallo Barlee
Ja, das könnte ich so machen; aber Du gibst mir recht, das ist nicht die "elegante" Methode. Bei diesem kleinen Beispiel macht es zwar tatsächlich keinen Unterschied, aber wenn die Bedingung umfangreicher ist, dann hat man aufgrund der Formelwiederholung eine rechte Menge redundanten Code, was sich nebst der Performance auch auf die Übersichtlichkeit (wegen Wartung und Weiterentwicklung) auswirkt.
Mein aufgeführtes Beispiel ist nämlich nur eine extrem vereinfachte Problemstellung zum Erlernen, wie man diese in SQL grundsätzlich lösen kann. Tatsächlich kommen diese Problemlösungen nachher in viel komplexeren Problemstellungen zum Tragen, wie sich aus nachfolgendem Formelbeispiel - dargestellt in der SQL-Syntax von MS Access - ableiten lässt:
Abfrage: 11 Position tracking
SELECT [10 Transactions].TransactionNo, [10 Transactions].Date, [10 Transactions].Operation, [10 Transactions].Quantity, [10 Transactions].Title, [10 Transactions].Currency, [10 Transactions].UnitPrice, IIf([10 Transactions]![Operation]="Buy",[10 Transactions]![Quantity]*[10 Transactions]![UnitPrice]*-1,[10 Transactions]![Quantity]*[10 Transactions]![UnitPrice]) AS [Market Value], [10 Transactions].Commission, IIf([10 Transactions]![Operation]="Dividend",[10 Transactions]![UnitPrice],[Market Value]+[10 Transactions]![Commission]) AS Total, [10 Transactions].ExchangeRate, IIf(IsNull([10 Transactions]![ExchangeRate]),[Total],[Total]*[10 Transactions]![ExchangeRate]) AS [Total CHF], IIf([10 Transactions]![Operation]="Buy",[Quantity],IIf([10 Transactions]![Operation]="Sale",[Quantity]*-1,0)) AS [Adjusted Quantity], CInt(DSum("[Adjusted Quantity]","11 Position tracking","[Date]*1<=" & [Date]*1)) AS [Total Units], IIf([10 Transactions]![Operation]="Buy",[Total CHF]*-1,IIf([10 Transactions]![Operation]="Sale",[Quantity]*DLast("[ø-Unit Cost]","11 Position tracking","[Date]*1<" & [Date]*1)*-1,0)) AS [Adjusted Total CHF], CCur(DSum("[Adjusted Total CHF]","11 Position tracking","[Date]*1<=" & [Date]*1)) AS [Total Cost], IIf([Total Units]=0,0,[Total Cost]/[Total Units]) AS [ø-Unit Cost], IIf([10 Transactions]![Operation]="Sale",[Total CHF]*-1+[Quantity]*DLast("[ø-Unit Cost]","11 Position tracking","[Date]*1<" & [Date]*1),0) AS [Real P/L], 0 AS [Unreal P/L], IIf([10 Transactions]![Operation]="Dividend",[Total CHF]*-1,0) AS Dividend FROM [10 Transactions] ORDER BY [10 Transactions].Date
Wenn in diesem Beispiel noch Formelwiederholungen zum Tragen kommen, dann befürchte ich, den Überblick zu verlieren.
Aus diesem Grund wäre ich sehr interessiert daran zu wissen, wie man in Base bzw. der dazugehörigen SQL-Syntax mit Bezug auf einen Alias weiterrechnen könnte. Möglicherweise geht das irgendwie mit der UPDATE-, INSERT- oder SET-Funktion oder mit einem Umweg über Tabellenansichten (auch View oder Sicht genannt), da man diese auch mit SQL definieren kann.
Mein einfaches Beispiel sähe dann so aus:
1) casewhen(Tarifgehalt<=100000,Tarifgehalt+Zulage1,Tarifgehalt+Zulage2) as Bruttogehalt
2) Bruttogehalt*Sozialzuschlag as Gehalt
In MS-Access ist das simpel zu realisieren, man gibt einfach in der gleichen Abfrage den Alias ein und schon wird das neue Feld berechnet.
Hast Du eine Idee, wie man das in Base machen könnte?
Danke und Gruss
rso