I think you'll need another table where you'd log the scheduling and sending of your alert emails. Presumably the record and or it's data changes frequently so your start up script would appear to have two parts for this. Part 1 would check the data in the first related record and add a new record to the email schedule table if such an entry had not already been made. Part 2 would check the email schedule table for any records that were set up for sending an email 3 weeks previously that have not yet logged the sending of an email. You haven't indicated what information you want to put in the email, but you can either populate a field in the email schedule table with the text you want in the body of your email or you can just have the script enter the ID number or numbers of the relevant records that will then serve as the source of the data included in the info.
Your email schedule table would need at least these fields
EmailSendON (date field, date when email is to be sent)
EmailSentOn (date field, date when email was actually sent)
Then you'd add whatever additional data fields are needed to produce the email, a text field with the message for the email body and/or ID fields that link to records in your database needed to construct the email at the time it is sent.
To compute the send on date, you'd use: Set Field [EmailSchedule::EmailSendON ; Get ( CurrentDate ) + 21 ] to enter a date 3 weeks in the future.