0

在访问数据库中,我创建了一个比较查询中的 3 个字段的函数:

字段:
CostMacDON
CostKentFRY
CostBurgKIN
TurnMacDON
TurnKentFRY
TurnBurgKIN
CustMacDON
CustKentFRY
CustBurgKIN

Public function Eval(MacD, KentF, BurgK)
'Note: the real evaluation is a bit more complex, this is just an oversymplified example
if MacD>KentF and MacD>BurgK
 Eval="MD is the highest"
else
 Eval="MD is NOT the Highest"
endif

结束函数

在我使用的访问查询视图中调用该函数

Evaluate Cost: Eval(CostMacDON, CostKentFRY, CostBurgKIN)
         ====       ----        ----         ----
Evaluate Turn: Eval(TurnMacDON, TurnKentFRY, TurnBurgKIN)
         ====       ----        ----         ----
Evaluate Cust: Eval(CustMacDON, CustKentFRY, CustBurgKIN)
         ====       ----        ----         ----

但是......由于成本/转弯/客户的所有这些重复,我希望通过调整函数来简化查询。经过一些研究,我似乎应该重组我真正想避免的表格。(因为这只是拼图的一小部分)

我希望用户能够添加其他字段,所以我也想避免复杂的 sql 语句。SO..我想这样调用函数

评估成本:Eval("Cost")

Public function Eval(EvalType as variant)
Dim MacD as Variant  (??)
Dim KentF as Variant  (??)
Dim BurgK as Variant  (??)
MacD= EvalType & "MacDON"
KentF= EvalType & "KentFRY"
BurgK= EvalType & "BurgKIN"

' 但是,这给了我 3 个字段的名称,我想比较内容!?!

if MacD>KentF and MacD>KentF
 Eval="MD is the highest"
else
 Eval="MD is NOT the Highest"
endif

结束函数

有人知道这是否可以做到吗?

4

2 回答 2

0

您必须打开一个记录集或使用 DLookup() 聚合函数将数据从表中提取到函数中。

可能还需要传入记录的函数ID。

Public Function Eval(EvalType As Variant, varID As Variant) As String

DLookup() 示例:

MacD = DLookup(EvalType & "MacDON", "tablename", "ID=" & varID)

于 2021-01-13T12:39:21.167 回答
0

您的代码中没有任何内容显示与表/记录集的任何交互?如果您询问如何从表中字段名称不固定但可以动态变化的字段中检索值,那么可以通过将字段名称作为变量传递给例如打开的记录集来完成。

例如你可以做

MyField$ = "MacDCost" 
MyValue = MyRecordSet(MyField)

您可以尽情地玩 MyField$。例如:

Dim MyRSt as Recordset
Dim Shops(3) As String
Dim Type(3) As String
Dim ShopTeller as Long
Dim TypeTeller as Long
Dim MyValue as Double

Shops(0)="MacD"
Shops(1)="BurK"
Shops(2)="KenF"
MyType(0)="Cost"
MyType(1)="Turn"
MyType(2)="Cust"

Set MyRst=CurrentDB.OpenRecordset("MyTable")
MyRst.MoveFirst

TypeTeller = 0 
    Do
        MyValue = 0
        ShopTeller = 0
        Do
            myValue = MyValue + CDbl(MyRst(Shops(ShopTeller) & MyType(TypeTeller)))
            ShopTeller = ShopTeller + 1
        Loop Until ShopTeller = UBound(Shops)
        Msgbox "Total " & MyType (TypeTeller) & "from all junk food outlets is :" & MyValue, vbExclamation & VbOKOnly
        TypeTeller = TypeTeller + 1
    Loop Until TypeTeller = UBound(MyType)

MyRst.Close
Set MyRst = Nothing 

但是,如果您希望用户能够添加/删除“商店”等,那么您真的不能将该信息保存在同一个表中 - 例如,您需要有一个包含商店的表和一个包含其他数据(替换上面的 2 个数组),然后通过 ID 字段链接它们并使用 JOIN 检索值。

于 2021-01-13T19:05:38.993 回答