I believe Nate's suggestion will work for your case. Let me explain in more detail:
You'll have your question /data/date_question where your user enters the month number.
You'll also have some
hidden value, say /data/entered_dates that accumulates the dates that have been entered so far. At first this value will be "" - nothing.
Your date question will have the validation condition
not(
contains(/data/entered_dates,
concat('-', /data/date_question, '-')) - this will test whether the answer to /data/date_question has already been entered. [note the '-'s - I will explain later]
We'll use
case management to persist the entered_dates between sessions. So, we'll need some intermediary hidden value called, EG, /data/new_entered_dates.
/data/new_entered_dates will have the calculate condition '=concat(/data/entered_dates, '-' /data/date_question, '-') [note the '-'s]
Now we'll save /data/new_entered_dates to some case property (for simplicity, entered_dates)
We'll also _load_ that case property on subsequent form entriers into the hidden value /data/date_question
So, if we enter '4' the first time, the case property will be saved with the value '-4-' and if the user tries to enter this again, the validaiton condition will fail.
This case property will continue to accumulate for subsequent month values.
The reason we use the '-' is because otherwise if we enter date '14' then later on we will not be able to enter '4' because this is contained within '14'. The '-' allow us to specify the exact value.
If you only want to enforce that the date number must increase then this is even easier. We simply save the last entered month value to the case in some property EG last_date and then enforce that /data/date_question > /data/last_date, saving /data/date_question to property last_date on subsequent form entries.
Hope this all makes sense!
Best,
Will