Ok, so this is a follow-up on my last post Name of month in expense report.
I promised that I would tell you how I did to get this expense report, to be editable only until a certain date and how the field that is telling us for which month this report is valid for, would keep it’s value even if the report is opened later on.
In this example, let’s say that our finance dep would like the employees to deliver their expense reports prior to the 16 of the current month. The employees should still be able to open these reports later on to be able to check and compare but not being able to make any changes or to save the report.
If you haven’t already created a data connection to submit the form back to the form library and added a button for the users to do this with, please do so 🙂
Set the correct month and keep its value
Now we need to do a few things to keep the value of the field for which month this report is for. What I am taking about is the field right after the title.
Start by adding a new field of the type string called ValidMonth.
Add another field of the type whole number (integer) called Day and give it the value substring(TodaysDate, 9, 2), now we know which day it is.
We should now give the submit button a rule.
Highlight the button, click on the button Manage rules in the ribbon.
The action we would like this rule to do for us is to set the value of ValidMonth to the name of the month for which this report should have. It could be the current month but it could also be the upcoming month if it is created between the 16th and 31st.
Create a new rule with the condition to be fired only if ValidMonth is equal to Empty and Day is less than or equal to 15. The action should be to set ValidMonth to the name of the current month. The rule should look like this:
But what if we would create a new form between the 16th and 31st?
We need to create one more field to hold the name of the next month.
Give the field the name NextMonth with the value MonthNr +1
Ok, so now we have the number of the upcoming month, let’s use it to set the name of the next month.
Create one more rule for the save button with the condition to be fired only if ValidMonth is equal to Empty and Day is less than or equal to 31 and greater than 15. The action should be to set ValidMonth to the name of the next month. The rule should look like this:
There you go!
Now the form’s month is set only once and depending on if it should be valid for this month or the next, it will get the correct one. If you add these rules to the Form load it will be set when you open the form.
Editable until a certain date
Let’s add a rule for the submit button. Make it a formatting rule with the condition to only fire when Day is greater than 15 and mark the choice to Hide this control. That way the button will be hidden when the date is greater than 15th, and they will not be able to save any changes.
What if we want to create a new report between the 16th and 31st?
Ok, so we also need to check if ValidMonth is equal to MonthName, in that case the submit button should not be seen.
So, add another condition to that same rule that says:
and ValidMonth equals MonthName (be sure to use “and”)
Ok, there you go!
That was pretty easy 🙂
Right now I am composing a form in InfoPath for an expense report. I thought that I would share a couple of things with you guys.
I will start of with this post and will probably follow up with one or two more.
In this post I will show you how I accomplished this:
Putting in the name of the month into the form
Ok, first of all you need to create a new data connection to get information from a XML-file.
Copy this code, put it in a Notepad and save it in UTF-8 format as Month.xml:
<?xml version="1.0" encoding="UTF-8"?> <months> <month id="1" name="Januari"/> <month id="2" name="Februari"/> <month id="3" name="Mars"/> <month id="4" name="April"/> <month id="5" name="Maj"/> <month id="6" name="Juni"/> <month id="7" name="Juli"/> <month id="8" name="Augusti"/> <month id="9" name="September"/> <month id="10" name="Oktober"/> <month id="11" name="November"/> <month id="12" name="December"/> </months>
Now create a data connection and choose to get data from another source such as a XML-file. Browse to the file Month.xml and choose to get data whenever the form is opened.
In the Main data source create a new field of the type string called TodaysDate.
Give this field the default value of Today() which will give you todays date.
Create another field of the type string called MonthNrText.
Give this field the default value of substring(TodaysDate, 6, 2) (that is when the date format is like 2012-01-06)
Now let’s create a new field and convert MonthNrText to an integer to take away the leading zeros.
Call this new field MonthNr and give it the value of number(MonthNrText)
Now we have the number of the current month, let’s make one more filed to get the name of this month.
Let’s create a field of the type string and name it MonthName. With this field we will compare the id in the secondary data source against our field MonthNr.
Give this filed the default value of @name[@id = MonthNr], this is how it is done.
Click on the left button insert Field or Group... Choose the secondary data source Month and the field name. Then choose to add a filter to that data by clicking the button Filter data. A new dialog opens up where we choose to Add a new filter.
In the first drop down choose select a field or group and point to id in the secondary data source. In the second drop down choose is equals to and in the final drop down choose select a field or group and point to MonthNr. Here you have all the dialogs:
Ok, so there it is! Now we have the name of the current month.
In the next post I will show you how I made the form keep the name of the valid month, even if it is opened up later and how I made the form editable only until a certain date.