我想迭代我的Payment表中的行。用户选择了想要预订的月份和年份,如果这个房子是在今年和月份预订的话,我想查看每个原始。我想比较一下
HouseID == chosenHouseID && BookingMonth == chosenBookingMonth &&
BookingYear==chosenBookingYear.
如果这是真的,它应弹出消息框,其中包含本月已预订房屋的信息。此外,如果用户选择超过一个月,即numMonths将是3,它应该增加月份的值(这是一个文本)它应该转到下一个值(如果没有下一个值,那么它应该做mod 12)并且做再次检查。也许有必要将BookingMonth的数据类型切换为数字?
但是我希望我清楚自己想做什么。我有使用Java,C,Python和Visual Basic的经验,但我在Access中没有做太多,所以它很混乱。我找不到任何有用的信息如何执行此操作。请就我的问题告诉我。
谢谢
答案 0 :(得分:0)
是的,你绝对应该将[BookingMonth]存储为数字。从长期来看,将“月”列保持为文本将是令人讨厌的,因为“八月”<“1月”和“12”<“2”。您必须至少进行一定数量的杂耍才能将文本值转换为数值,因此您可以轻松地将它们保存为数字。 (请注意,如果要在报告中使用它们,您始终可以格式化它们作为文本。)
至于您的搜索要求,如果用户提供[chosenBookingYear],[chosenBookingMonth]和[numberOfMonthsToBook],那么您可以使用VBA DateAdd
函数安全地派生[endOfBookingYear]和[endOfBookingMonth]对于“明年”的价值......
endOfBookingYear = Year(DateAdd("m", numberOfMonthsToBook - 1, DateSerial(chosenBookingYear, chosenBookingMonth, 1)))
...和...
endOfBookingMonth = Month(DateAdd("m", numberOfMonthsToBook - 1, DateSerial(chosenBookingYear, chosenBookingMonth, 1)))
最后,要在不循环各个行的情况下执行查找,您可以将[BookingYear]和[BookingMonth]连接在一起,使用...创建类似“2013/05”的内容。
BookingYear & "/" & Format(BookingMonth, "00")
...所以你可以创建一个类似这样的SELECT查询:
SELECT * FROM Payment
WHERE HouseID = chosenHouseID AND
(
(BookingYear & "/" & Format(BookingMonth, "00"))
BETWEEN (chosenBookingYear & "/" & Format(chosenBookingMonth, "00"))
AND (endOfBookingYear & "/" & Format(endOfBookingMonth, "00"))
)