我已经好几年没有接触Access了,所以我的VBA生锈了。我试图在Access中执行一个复杂的If / Then / Else函数,所以我想将它变成一个自定义函数,而不是一个过于复杂的IIF语句。
我的功能是这样的:
Option Compare Database
Option Explicit
Public Function fnM01Errors(AUTO_CLM_ID As String, MED_CLM_ROLL_IND As String, CLM_FWD_EFF_DT As Date, CLM_FWD_CAN_DT As Date, CCF_PKG_TY As String, CLM_FWD_APPLY_IND As String, MED_EFF_DATE As Date)
If [AUTO_CLM_ID] = "Y" And [MED_CLM_ROLL_IND] <> "R" Or ([AUTO_CLM_ID] = "N" Or [AUTO_CLM_ID] Like "*-*") And [MED_CLM_ROLL_IND] <> "N" Then
fnM01Errors = "AUTO CLM_FWD_IND does not match MED_CLM_ROLL_IND"
If CLM_FWD_EFF_DT <> Null And CLM_FWD_CAN_DT <> Null And CCF_PKG_TY = "HRA" And CLM_FWD_APPLY_IND = "Y" And MED_EFF_DATE >= CLM_FWD_CAN_DT And MED_CLM_ROLL_IND = "N" Then
fnM01Errors = "No Error"
If CLM_FWD_EFF_DT <> Null And CLM_FWD_CAN_DT <> Null And CCF_PKG_TY = "HSA" And CLM_FWD_APPLY_IND = "Y" And MED_EFF_DATE >= CLM_FWD_CAN_DT And MED_CLM_ROLL_IND = "N" Then
fnM01Errors = "INVALID_ePro_ERROR"
If CLM_FWD_EFF_DT <> Null And CLM_FWD_CAN_DT <> Null And CCF_PKG_TY = "HSA" And CLM_FWD_APPLY_IND = "Y" And MED_EFF_DATE >= CLM_FWD_CAN_DT And MED_CLM_ROLL_IND = "R" Then
fnM01Errors = "AUTO CLM_FWD_IND does not match MED_CLM_ROLL_IND"
End Function
在我的查询中,我这样称呼它:
Error: fnM01Errors([AUTO-CLM-ID],[MED_CLM_ROLL_IND],Nz([CLM_FWD_EFF_DT],#12/31/2099#),Nz([CLM_FWD_CAN_DT],#12/31/2099#),[CCF-PKG-TY],[MED_CCF_IND],Nz([MED_EFF_DATE],#12/31/2099#))
它一直给我一个错误:
查询表达式中的数据类型不匹配
我认为是因为它发现了NULL日期,其中有很多,所以那是我将Nz()函数添加到date字段中的时候。但是,我什至不确定这是否正确。
在我将数据集拆开以寻找大海捞针之前,谁能告诉我这段代码在逻辑上是否正确?
答案 0 :(得分:3)
您犯了一些错误:
Variant
。 If
必须以End If
if x <> Null
不起作用。请改用If not IsNull(x) Then
。 您还可以使用以下构造:
If...then
ElseIf ...then
ElseIf...then
End if
请注意,如果您的表中将包含大量数据,请使用IIF() will be be much faster。
答案 1 :(得分:1)
重新考虑带有嵌套IIF()
的纯SQL解决方案。可以说,仅是许多逻辑子句就不会太复杂,再加上避免类型转换并在设置中添加另一个编码层:
SELECT
...
IIF([AUTO_CLM_ID] = 'Y'
AND [MED_CLM_ROLL_IND] <> 'R'
OR ([AUTO_CLM_ID] = 'N' OR [AUTO_CLM_ID] LIKE '*-*')
AND [MED_CLM_ROLL_IND] <> 'N',
'AUTO CLM_FWD_IND does not match MED_CLM_ROLL_IND',
IIF(CLM_FWD_EFF_DT IS NOT NULL
AND CLM_FWD_CAN_DT IS NOT NULL
AND CCF_PKG_TY = 'HRA'
AND CLM_FWD_APPLY_IND = 'Y'
AND MED_EFF_DATE >= CLM_FWD_CAN_DT
AND MED_CLM_ROLL_IND = 'N',
'No Error',
IIF(CLM_FWD_EFF_DT IS NOT NULL
AND CLM_FWD_CAN_DT IS NOT NULL
AND CCF_PKG_TY = 'HSA'
AND CLM_FWD_APPLY_IND = 'Y'
AND MED_EFF_DATE >= CLM_FWD_CAN_DT
AND MED_CLM_ROLL_IND = 'N',
'INVALID_ePro_ERROR',
IIF(CLM_FWD_EFF_DT IS NOT NULL
AND CLM_FWD_CAN_DT IS NOT NULL
AND CCF_PKG_TY = 'HSA'
AND CLM_FWD_APPLY_IND = 'Y'
AND MED_EFF_DATE >= CLM_FWD_CAN_DT
AND MED_CLM_ROLL_IND = 'R',
'AUTO CLM_FWD_IND does not match MED_CLM_ROLL_IND',
NULL)
)
)
) AS fnM01Errors
FROM myTable
答案 2 :(得分:1)
您可以减少这一点:
Public Function fnM01Errors( _
AUTO_CLM_ID As String, _
MED_CLM_ROLL_IND As String, _
CLM_FWD_EFF_DT As Variant, _
CLM_FWD_CAN_DT As Variant, _
CCF_PKG_TY As String, _
CLM_FWD_APPLY_IND As String, _
MED_EFF_DATE As Variant)
If [AUTO_CLM_ID] = "Y" And [MED_CLM_ROLL_IND] <> "R" Or ([AUTO_CLM_ID] = "N" Or [AUTO_CLM_ID] Like "*-*") And [MED_CLM_ROLL_IND] <> "N" Then
fnM01Errors = "AUTO CLM_FWD_IND does not match MED_CLM_ROLL_IND"
ElseIf Not IsNull(CLM_FWD_EFF_DT + CLM_FWD_CAN_DT) Then
If CCF_PKG_TY = "HRA" And CLM_FWD_APPLY_IND = "Y" And MED_EFF_DATE >= CLM_FWD_CAN_DT And MED_CLM_ROLL_IND = "N" Then
fnM01Errors = "No Error"
ElseIf CCF_PKG_TY = "HSA" And CLM_FWD_APPLY_IND = "Y" And Nz(MED_EFF_DATE >= CLM_FWD_CAN_DT, False) Then
If MED_CLM_ROLL_IND = "N" Then
fnM01Errors = "INVALID_ePro_ERROR"
ElseIf MED_CLM_ROLL_IND = "R" Then
fnM01Errors = "AUTO CLM_FWD_IND does not match MED_CLM_ROLL_IND"
End If
End If
End If
End Function