为什么此查询更改起作用?

时间:2018-08-03 15:58:53

标签: ms-access access-vba

我最终取消了WHERE子句中给我带来问题的部分,但最初我通过做一些对我来说毫无意义的事情来使此查询正常工作,并希望有人能对此有所了解正在这里。整个查询和功能都在下面,但是我不确定所有这些都是必需的

因此,该查询以前一直有效,并且此WHERE子句仍在另一个查询中成功使用。现在在where子句的这一行中使用了多个函数,但是,如果我只使用以ModifiedStartDate开头的部分,则查询工作正常。所以看来问题出在ModifiedDate上。 WHERE子句中给我们带来问题的部分是:

and ModifiedDate(r.EXPIRATION_DATE, ModifiedStartDate(r.COMMENCEMENT_DATE, 
PaySched_MaxFreq(r.RE_CONTRACT_KEY))) > #1/1/2019#   

查询失败,错误为“条件表达式中的数据类型不匹配”。因此,仅做一些测试,我最终在WHERE子句中添加了以下部分:

and r.RE_CONTRACT_KEY NOT IN (1)

然后查询成功了?!?! 我真的不知道如何添加这一行来神奇地解决数据类型不匹配错误。没有RE_CONTRACT_KEY = 1,所以它不是不好的数据。

我进行了一些测试,并使用了ModifiedDate函数,并将其放入select子句中,它工作正常。我还使用DATEADD函数向SELECT子句添加了另一个字段,以确保函数结果仍被视为日期,并且确实如此。查询在下面,功能在下面。

SELECT DISTINCT ....
FROM ((((((PAYMENT_LINE_ITEM AS pli 
INNER JOIN PAYMENT_SCHEDULE AS tps ON pli.PAYMENT_SCHEDULE_KEY = 
ps.PAYMENT_SCHEDULE_KEY) 
INNER JOIN RECONTRACT AS r ON pli.RE_CONTRACT_KEY = r.RE_CONTRACT_KEY) 
INNER JOIN Conversion_ProductCategory AS cpc ON cpc.Value = pli.PAYMENT_TYPE) 
INNER JOIN ManualEntry AS me ON me.LeaseID = r.RE_CONTRACT_ID) 
LEFT JOIN Mapping_CostCenter AS mcc ON mcc.CostCenter = me.CostCenter) 
INNER JOIN PIW_Exclusions AS pe ON pe.RE_CONTRACT_ID = r.RE_CONTRACT_ID) 
LEFT JOIN FacilityCode_Address_xRef AS fca ON fca.[Facility Code] = 
mcc.placecode & "-" & mcc.placecodedescription
WHERE pli.PAYMENT_TYPE  in ("rent","storage","parking")  
    and ModifiedDate(r.EXPIRATION_DATE, 
    ModifiedStartDate(r.COMMENCEMENT_DATE, 
    PaySched_MaxFreq(r.RE_CONTRACT_KEY))) > #1/1/19#
    and PE.Reason = "rent extension" 
    and r.RE_CONTRACT_KEY NOT IN (1) 'New line added that made query work

函数:

Public Function ModifiedDate(DateToModify As Date, DateToCompare As Date) As 
Date

Select Case DateToModify
Case #2/28/2000#, #2/28/2004#, #2/28/2008#, #2/28/2012#, #2/28/2016#, 
#2/28/2020#, #2/28/2024#, #2/28/2028#, #2/28/2032#, #2/28/2036#, #2/28/2040#, 
#2/28/2044#, #2/28/2048#
    DateToModify = DateAdd("d", 1, DateToModify)
End Select

If DatePart("d", DateAdd("d", 1, DateToModify)) = DatePart("d", 
DateToCompare) Then

    ModifiedDate = DateAdd("d", 1, DateToModify)

Else
    ModifiedDate = DateToModify
End If

End Function

如果您感到好奇,那么最后一个有效的WHERE子句是:

WHERE pli.PAYMENT_TYPE  in ("rent","storage","parking") 
    and r.EXPIRATION_DATE > #1/1/19#
    and PE.Reason = "rent extension"

0 个答案:

没有答案