/* gradutil.p - grading utilities */ /* 10/03/2008 BMD Qualify all master-schedule-mark records by schd-version-id 12/14/2010 BMD Handle setting a letter-grade instead of pass/fail for overridden grading policies (for TWeb & sp-main) 05/13/2011 BMD Add method to get limited # of mark labels for a course with an MSM override (e-grmain) 05/13/2011 BMD Reconcile with multi-grading-bldg-xlate version of gradutil.p installed @ GISD Test server 06/14/2011 BMD Handle MSM Marks better -- change ordering returned (should never have been grading-period-id based). Use the correct grading-period-id to lookup the student mark (don't force to primaryPeriod for non-posting purposes). */ /* Include commons */ {listutil.i DEFINE NEW} {common.i} /* Define Buffers */ DEFINE BUFFER PrimaryBldg FOR building. DEFINE BUFFER PrimaryPeriod FOR grading-period. DEFINE BUFFER PrimaryCourse FOR master-schd. /* These are only valid between within internal procedures called from */ /* within gradutil.p (no external references or calls) */ DEFINE BUFFER SchdVersion FOR schd-version. DEFINE BUFFER MasterSchd FOR master-schd. DEFINE BUFFER StuSchd FOR stu-schedule. /* An overridable, master grading policy. When not ?, this will be the */ /* grading policy that gradutil will use for returning and interpretting */ /* all marks. It should only be used when using a uniform mark method */ DEFINE VARIABLE MasterGradingPolicy AS CHARACTER INITIAL ? NO-UNDO. DEFINE VARIABLE CachedStartDate AS DATE NO-UNDO. DEFINE VARIABLE CachedEndDate AS DATE NO-UNDO. /* Define a temp-table to handle final-mark processing */ DEFINE TEMP-TABLE FinalMarks NO-UNDO FIELD mark-id AS INTEGER FIELD GPId AS INTEGER /* only used in GetMSMCourseIdents */ FIELD TheValue AS CHARACTER FIELD InsertOrder AS INTEGER INDEX theIndex InsertOrder. /* Reset all context */ PROCEDURE resetContext: FIND FIRST PrimaryBldg WHERE RECID(PrimaryBldg) = ? NO-ERROR. FIND FIRST PrimaryPeriod WHERE RECID(PrimaryPeriod) = ? NO-ERROR. FIND FIRST PrimaryCourse WHERE RECID(PrimaryCourse) = ? NO-ERROR. FIND FIRST SchdVersion WHERE RECID(SchdVersion) = ? NO-ERROR. FIND FIRST MasterSchd WHERE RECID(MasterSchd) = ? NO-ERROR. FIND FIRST StuSchd WHERE RECID(StuSchd) = ? NO-ERROR. CachedStartDate = ?. CachedEndDate = ?. FOR EACH FinalMarks: DELETE FinalMarks. END. END PROCEDURE. /* Setup the primary grading period */ PROCEDURE SetPrimaryPeriod: /* Define Parameters */ DEFINE PARAMETER BUFFER GradePeriod FOR grading-period. /* Load up our context buffers */ FIND PrimaryPeriod WHERE RECID(PrimaryPeriod) = RECID(GradePeriod) NO-LOCK. FIND PrimaryBldg OF PrimaryPeriod NO-LOCK. END PROCEDURE. /* SetPrimaryPeriod */ /* Set the 'primary' course */ PROCEDURE SetCourse: /* Define Parameters */ DEFINE PARAMETER BUFFER MasterSchd FOR master-schd. /* Load up the context buffers */ FIND PrimaryCourse WHERE RECID(PrimaryCourse) = RECID(MasterSchd) NO-LOCK. END PROCEDURE. /* SetCourse */ /* Set a master grading policy */ PROCEDURE SetGradingPolicy: /* Define Parameters */ DEFINE INPUT PARAMETER TheGradingPolicy AS CHARACTER NO-UNDO. /* set the policy */ MasterGradingPolicy = TheGradingPolicy. END PROCEDURE. /* SetGradingPolicy */ /* Get the grading policy for the passed stu-grade record */ PROCEDURE GradingPolicy: /* Define Parameters */ DEFINE PARAMETER BUFFER StuGrade FOR stu-grade. DEFINE OUTPUT PARAMETER GradingPolicy AS CHARACTER NO-UNDO. /* Load the scheduling version */ IF NOT AVAILABLE SchdVersion OR SchdVersion.bldg-id <> StuGrade.bldg-id THEN FIND FIRST SchdVersion NO-LOCK WHERE SchdVersion.school-year-id = StuGrade.school-year-id AND SchdVersion.bldg-id = StuGrade.bldg-id AND SchdVersion.active-schedule = Yes NO-ERROR. IF NOT AVAILABLE SchdVersion THEN RETURN. /* Find the master schedule as well */ IF NOT AVAILABLE MasterSchd OR MasterSchd.course-id <> StuGrade.course-id OR MasterSchd.section-id <> StuGrade.section-id THEN DO: FIND FIRST MasterSchd OF SchdVersion NO-LOCK WHERE MasterSchd.course-id = StuGrade.course-id AND MasterSchd.section-id = StuGrade.section-id NO-ERROR. /* Clear the cache */ ASSIGN CachedStartDate = ? CachedEndDate = ?. END. IF NOT AVAILABLE MasterSchd THEN RETURN. /* Load up the student schedule */ IF NOT AVAILABLE StuSchd OR StuSchd.stu-seq <> StuGrade.stu-seq OR StuSchd.course-id <> StuGrade.course-id OR StuSchd.section-id <> StuGrade.section-id THEN FIND FIRST StuSchd NO-LOCK WHERE StuSchd.school-year-id = MasterSchd.school-year-id AND StuSchd.bldg-id = MasterSchd.bldg-id AND StuSchd.schd-version-id = MasterSchd.schd-version-id AND StuSchd.course-id = MasterSchd.course-id AND StuSchd.section-id = MasterSchd.section-id AND StuSchd.current-entry = Yes AND StuSchd.stu-seq = StuGrade.stu-seq NO-ERROR. IF NOT AVAILABLE StuSchd THEN RETURN. /* See if we have an 'override' grading policy. We do this here as */ /* opposed to up top so the master-schd and student schd records are */ /* always loaded */ IF MasterGradingPolicy <> ? THEN GradingPolicy = MasterGradingPolicy. ELSE IF StuSchd.override-grading-policy THEN GradingPolicy = StuSchd.grading-policy. ELSE GradingPolicy = MasterSchd.grading-policy. END PROCEDURE. /* GradingPolicy = GetGradingPolicy */ /* Given a stu-grade record and mark index, return a textual mark */ PROCEDURE FetchMark: /* Define Parameters */ DEFINE PARAMETER BUFFER StuGrade FOR stu-grade. DEFINE INPUT PARAMETER MarkPtr AS INTEGER NO-UNDO. DEFINE OUTPUT PARAMETER TheMarkText AS CHARACTER INITIAL "" NO-UNDO. /* Define Buffers */ DEFINE BUFFER GradingPeriodMark FOR grading-period-mark. DEFINE BUFFER StuGradeMark FOR stu-grade-mark. DEFINE BUFFER CourseLevelGrade FOR course-level-grade. /* Define Variables */ DEFINE VARIABLE GradingPolicy AS CHARACTER NO-UNDO. /* Bomb out if needed */ IF NOT AVAILABLE StuGrade THEN RETURN. /* Fetch the mark */ FIND FIRST GradingPeriodMark NO-LOCK WHERE GradingPeriodMark.school-year-id = StuGrade.school-year-id AND GradingPeriodMark.bldg-id = StuGrade.bldg-id AND GradingPeriodMark.grading-period-id = StuGrade.grading-period-id AND GradingPeriodMark.mark-order = MarkPtr NO-ERROR. IF NOT AVAILABLE GradingPeriodMark THEN RETURN. /* Fetch the mark for the student */ FIND FIRST StuGradeMark OF StuGrade NO-LOCK WHERE StuGradeMark.mark-id = GradingPeriodMark.mark-id NO-ERROR. IF NOT AVAILABLE StuGradeMark OR StuGradeMark.course-level-grade-id = ? THEN RETURN. /* After this, any failures are 'bad' */ TheMarkText = "BAD". /* Fetch the grade record */ FIND FIRST CourseLevelGrade OF StuGradeMark NO-LOCK NO-ERROR. IF NOT AVAILABLE CourseLevelGrade THEN RETURN. /* Get the grading policy */ RUN GradingPolicy(BUFFER StuGrade, OUTPUT GradingPolicy). /* Extract the grade */ CASE GradingPolicy: WHEN "Letter" THEN TheMarkText = CourseLevelGrade.letter-grade. WHEN "Numeric" THEN TheMarkText = TRIM(STRING(CourseLevelGrade.numeric-grade-high, ">>9.99")). WHEN "Pass/Fail" THEN TheMarkText = STRING(CourseLevelGrade.pass-fail, "Pass/Fail"). END. END PROCEDURE. /* FetchMark */ /* Given a stu-grade record and mark index, return a textual mark */ PROCEDURE FetchStuMark: /* Define Parameters */ DEFINE PARAMETER BUFFER StuGrade FOR stu-grade. DEFINE INPUT PARAMETER MarkPtr AS INTEGER NO-UNDO. DEFINE OUTPUT PARAMETER TheMarkText AS CHARACTER INITIAL "" NO-UNDO. /* Define Buffers */ DEFINE BUFFER GradingPeriodMark FOR grading-period-mark. DEFINE BUFFER StuGradeMark FOR stu-grade-mark. DEFINE BUFFER CourseGradeLevel FOR course-level-grade. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER SchdVersion FOR schd-version. /* Define Variables */ DEFINE VARIABLE GradingPolicy AS CHARACTER NO-UNDO. /* Bomb out if needed */ IF NOT AVAILABLE StuGrade THEN RETURN. FIND SchdVersion NO-LOCK WHERE SchdVersion.school-year-id = StuGrade.school-year-id AND SchdVersion.bldg-id = StuGrade.bldg-id AND SchdVersion.active-schedule. /* Check for master-schd-mark entry for course */ IF CAN-FIND(FIRST MasterSchdMark WHERE MasterSchdMark.school-year-id = StuGrade.school-year-id AND MasterSchdMark.bldg-id = StuGrade.bldg-id AND MasterSchdMark.schd-version-id = SchdVersion.schd-version-id AND MasterSchdMark.course-id = StuGrade.course-id AND MasterSchdMark.section-id = StuGrade.section-id) THEN /* Get the mark for a master-schd-mark override */ RUN FetchStuMSMMark(BUFFER StuGrade, MarkPtr, OUTPUT TheMarkText). ELSE DO: /* Fetch the mark */ FIND FIRST GradingPeriodMark NO-LOCK WHERE GradingPeriodMark.school-year-id = StuGrade.school-year-id AND GradingPeriodMark.bldg-id = StuGrade.bldg-id AND GradingPeriodMark.grading-period-id = StuGrade.grading-period-id AND GradingPeriodMark.mark-order = MarkPtr NO-ERROR. IF NOT AVAILABLE GradingPeriodMark THEN RETURN. /* Fetch the mark for the student */ FIND FIRST StuGradeMark OF StuGrade NO-LOCK WHERE StuGradeMark.mark-id = GradingPeriodMark.mark-id NO-ERROR. IF NOT AVAILABLE StuGradeMark OR StuGradeMark.course-level-grade-id = ? THEN RETURN. /* After this, any failures are 'bad' */ TheMarkText = "BAD". /* Fetch the grade record */ FIND FIRST CourseGradeLevel OF StuGradeMark NO-LOCK NO-ERROR. IF NOT AVAILABLE CourseGradeLevel THEN RETURN. /* Get the grading policy */ RUN GradingPolicy(BUFFER StuGrade, OUTPUT GradingPolicy). /* Extract the grade */ CASE GradingPolicy: WHEN "Letter" THEN TheMarkText = CourseGradeLevel.letter-grade. WHEN "Numeric" THEN TheMarkText = TRIM(STRING(CourseGradeLevel.numeric-grade-high, ">>9.99")). WHEN "Pass/Fail" THEN TheMarkText = STRING(CourseGradeLevel.pass-fail, "Pass/Fail"). END. END. END PROCEDURE. /* FetchStuMark */ /* Given a stu-grade record and mark index, return a textual mark */ /* for a master-schd-mark override */ PROCEDURE FetchStuMSMMark: /* Define Parameters */ DEFINE PARAMETER BUFFER StuGrade FOR stu-grade. DEFINE INPUT PARAMETER MarkPtr AS INTEGER NO-UNDO. DEFINE OUTPUT PARAMETER TheMarkText AS CHARACTER INITIAL "" NO-UNDO. /* Define Buffers */ DEFINE BUFFER GradingPeriodMark FOR grading-period-mark. DEFINE BUFFER StuGradeMark FOR stu-grade-mark. DEFINE BUFFER CourseGradeLevel FOR course-level-grade. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER SchdVersionBuff FOR schd-version. DEFINE BUFFER StuGradeBuff FOR stu-grade. /* Define Variables */ DEFINE VARIABLE GradingPolicy AS CHARACTER NO-UNDO. DEFINE VARIABLE IdentList AS CHARACTER NO-UNDO. DEFINE VARIABLE GrdPerList AS CHARACTER NO-UNDO. DEFINE VARIABLE ListPtr AS INTEGER NO-UNDO. DEFINE VARIABLE RecGrdPerId AS INTEGER NO-UNDO. /* Get a list of the mark idents and grading period id's */ RUN GetMSMCourseIdents(BUFFER StuGrade, OUTPUT IdentList, OUTPUT GrdPerList, YES). IF identList = "" THEN RETURN. /* Get the position of the MarkPtr in the ident list */ ListPtr = LOOKUP(STRING(MarkPtr), IdentList). IF ListPtr = 0 THEN RETURN. /* Get the record-grading-period-id corresponding to TheMarkIdent */ RecGrdPerId = INTEGER(ENTRY(ListPtr, GrdPerList)). /* Get the active schd-version */ FIND FIRST SchdVersionBuff NO-LOCK WHERE SchdVersionBuff.school-year-id = StuGrade.school-year-id AND SchdVersionBuff.bldg-id = StuGrade.bldg-id AND SchdVersionBuff.active-schedule = true NO-ERROR. IF NOT AVAILABLE SchdVersionBuff THEN RETURN. /* try to get the grading-period-mark */ FIND FIRST GradingPeriodMark NO-LOCK WHERE (GradingPeriodMark.school-year-id = StuGrade.school-year-id) AND (GradingPeriodMark.bldg-id = StuGrade.bldg-id) AND (GradingPeriodMark.grading-period-id = RecGrdPerId) AND (GradingPeriodMark.mark-order = MarkPtr) NO-ERROR. IF NOT AVAILABLE GradingPeriodMark THEN RETURN. /* Get the master-schd-mark record for the course */ FIND FIRST MasterSchdMark NO-LOCK WHERE MasterSchdMark.school-year-id = StuGrade.school-year-id AND MasterSchdMark.bldg-id = StuGrade.bldg-id AND MasterSchdMark.schd-version-id = SchdVersionBuff.schd-version-id AND MasterSchdMark.course-id = StuGrade.course-id AND MasterSchdMark.section-id = StuGrade.section-id AND MasterSchdMark.grading-period-id = StuGrade.grading-period-id AND MasterSchdMark.record-grading-period-id = RecGrdPerId AND MasterSchdMark.record-mark-id = GradingPeriodMark.mark-id NO-ERROR. IF NOT AVAILABLE MasterSchdMark THEN RETURN. /* Get the stu-grade for the record grading period */ FIND FIRST StuGradeBuff NO-LOCK WHERE StuGradeBuff.school-year-id = MasterSchdMark.school-year-id AND StuGradeBuff.bldg-id = MasterSchdMark.bldg-id AND StuGradeBuff.course-id = MasterSchdMark.course-id AND StuGradeBuff.section-id = MasterSchdMark.section-id AND StuGradeBuff.grading-period-id = MasterSchdMark.record-grading-period-id AND StuGradeBuff.stu-seq = StuGrade.stu-seq NO-ERROR. IF NOT AVAILABLE StuGradeBuff THEN RETURN. /* Fetch the mark for the student */ FIND FIRST StuGradeMark OF StuGradeBuff NO-LOCK WHERE StuGradeMark.mark-id = GradingPeriodMark.mark-id NO-ERROR. IF NOT AVAILABLE StuGradeMark OR StuGradeMark.course-level-grade-id = ? THEN RETURN. /* After this, any failures are 'bad' */ TheMarkText = "BAD". /* Fetch the grade record */ FIND FIRST CourseGradeLevel OF StuGradeMark NO-LOCK NO-ERROR. IF NOT AVAILABLE CourseGradeLevel THEN RETURN. /* Get the grading policy */ RUN GradingPolicy(BUFFER StuGradeBuff, OUTPUT GradingPolicy). /* Extract the grade */ CASE GradingPolicy: WHEN "Letter" THEN TheMarkText = CourseGradeLevel.letter-grade. WHEN "Numeric" THEN TheMarkText = TRIM(STRING(CourseGradeLevel.numeric-grade-high, ">>9.99")). WHEN "Pass/Fail" THEN TheMarkText = STRING(CourseGradeLevel.pass-fail, "Pass/Fail"). END. END PROCEDURE. /* FetchStuMSMMark */ /* Return a list of labels for a grading period */ PROCEDURE GetPeriodLabels: /* Define Parameters */ DEFINE INPUT PARAMETER StartPeriodNum AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER EndPeriodNum AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER ShortLabels AS LOGICAL NO-UNDO. DEFINE OUTPUT PARAMETER LabelList AS CHARACTER INITIAL "" NO-UNDO. /* Just qualify the creation with our default building */ RUN prv_BldgPeriodLabels (BUFFER PrimaryBldg, StartPeriodNum, EndPeriodNum, ShortLabels, OUTPUT LabelList). END PROCEDURE. /* GetPeriodLabels */ /* Return marks for a given course for a student and course */ PROCEDURE GetPeriodMarks: /* Define Parameters */ DEFINE PARAMETER BUFFER StuSchedule FOR stu-schedule. DEFINE INPUT PARAMETER StartPeriodNum AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER EndPeriodNum AS INTEGER NO-UNDO. DEFINE OUTPUT PARAMETER MarkList AS CHARACTER NO-UNDO. /* Define Variables */ DEFINE VARIABLE TheMark AS CHARACTER NO-UNDO. DEFINE VARIABLE CourseStartDate AS DATE NO-UNDO. DEFINE VARIABLE CourseEndDate AS DATE NO-UNDO. DEFINE VARIABLE InlineList AS CHARACTER NO-UNDO. DEFINE VARIABLE PrefixList AS CHARACTER NO-UNDO. DEFINE VARIABLE SuffixList AS CHARACTER NO-UNDO. DEFINE VARIABLE FinalMark AS CHARACTER NO-UNDO. DEFINE VARIABLE MSMOverRide AS LOGICAL INITIAL NO NO-UNDO. DEFINE VARIABLE order AS INTEGER INITIAL 0 NO-UNDO. /* Define Buffers */ DEFINE BUFFER GradingPeriod FOR grading-period. DEFINE BUFFER GradingPeriodMark FOR grading-period-mark. DEFINE BUFFER GradingMark FOR grading-mark. DEFINE BUFFER StuGrade FOR stu-grade. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER BldgXlate FOR grading-bldg-xlate. DEFINE BUFFER MarkInPeriod FOR grading-period-mark. DEFINE BUFFER SchdPeriod FOR grading-period. DEFINE BUFFER stuYear FOR stu-year. DEFINE BUFFER FinalMarks FOR FinalMarks. DEFINE BUFFER MasterStuSchd FOR master-schd. DEFINE BUFFER xlateLookup FOR grading-bldg-xlate. FIND stuYear NO-LOCK WHERE stuYear.school-year-id = StuSchedule.school-year-id AND stuYear.stu-seq = StuSchedule.stu-seq. FIND MasterStuSchd OF StuSchedule NO-LOCK. FIND FIRST MasterSchdMark OF MasterStuSchd NO-LOCK NO-ERROR. IF AVAILABLE MasterSchdmark THEN DO: IF AVAILABLE PrimaryCourse THEN DO: RUN GetMSMPeriodMarks(BUFFER StuSchedule, StartPeriodNum, EndPeriodNum, OUTPUT MarkList). RETURN. END. END. DO: /* Find the start/end date for the course */ RUN prv_CourseInSession(StuSchedule.bldg-id, StuSchedule.course-id, StuSchedule.section-id, OUTPUT CourseStartDate, OUTPUT CourseEndDate). /* Process all periods in our range */ FOR EACH GradingPeriod NO-LOCK WHERE GradingPeriod.school-year-id = StuSchedule.school-year-id AND GradingPeriod.bldg-id = PrimaryBldg.bldg-id AND GradingPeriod.grading-period-num >= StartPeriodNum AND GradingPeriod.grading-period-num <= EndPeriodNum BY GradingPeriod.school-year-id BY GradingPeriod.bldg-id BY GradingPeriod.grading-period-num: /* Process all marks in this period */ MarkLoop: FOR EACH GradingPeriodMark OF GradingPeriod BY GradingPeriodMark.school-year-id BY GradingPeriodMark.bldg-id BY GradingPeriodMark.grading-period-id BY GradingPeriodMark.mark-order: /* Load the Mark definition */ FIND GradingMark OF GradingPeriodMark NO-LOCK NO-ERROR. IF NOT AVAILABLE GradingMark THEN NEXT. /* now translate the period/mark, if we have to */ IF (StuYear.bldg-id <> stuSchedule.bldg-id) AND (StuYear.bldg-id = PrimaryBldg.bldg-id) THEN DO: FIND FIRST BldgXlate NO-LOCK WHERE (BldgXlate.school-year-id = StuYear.school-year-id) AND (BldgXlate.bldg-id = StuYear.bldg-id) AND (BldgXlate.grading-period-id = GradingPeriod.grading-period-id) AND (BldgXlate.mark-id = GradingPeriodMark.mark-id) AND (BldgXlate.xlate-bldg-id = StuSchedule.bldg-id) NO-ERROR. IF AVAILABLE BldgXlate THEN DO: IF CAN-FIND(FIRST xlateLookup WHERE xlateLookup.school-year-id = StuYear.school-year-id AND xlateLookup.bldg-id = StuYear.bldg-id AND xlateLookup.grading-period-id = GradingPeriod.grading-period-id AND xlateLookup.mark-id = GradingPeriodMark.mark-id AND xlateLookup.xlate-bldg-id = StuSchedule.bldg-id AND RECID(xlateLookup) <> RECID(BldgXlate)) THEN DO: MultiBlock: FOR EACH BldgXlate NO-LOCK WHERE BldgXlate.school-year-id = StuYear.school-year-id AND BldgXlate.bldg-id = StuYear.bldg-id AND BldgXlate.grading-period-id = GradingPeriod.grading-period-id AND BldgXlate.mark-id = GradingPeriodMark.mark-id AND BldgXlate.xlate-bldg-id = StuSchedule.bldg-id: FIND FIRST MarkInPeriod NO-LOCK WHERE (MarkInPeriod.school-year-id = BldgXlate.school-year-id) AND (MarkInPeriod.bldg-id = BldgXlate.xlate-bldg-id) AND (MarkInPeriod.grading-period-id = BldgXlate.xlate-grading-period-id) AND (MarkInPeriod.mark-id = BldgXlate.xlate-mark-id) NO-ERROR. IF NOT AVAILABLE MarkInPeriod THEN NEXT. /* See if we have a stu-grade */ FIND FIRST StuGrade NO-LOCK WHERE StuGrade.school-year-id = StuSchedule.school-year-id AND StuGrade.bldg-id = MarkInPeriod.bldg-id AND StuGrade.stu-seq = StuSchedule.stu-seq AND StuGrade.course-id = StuSchedule.course-id AND StuGrade.section-id = StuSchedule.section-id AND StuGrade.grading-period-id = MarkInPeriod.grading-period-id NO-ERROR. IF NOT AVAILABLE StuGrade THEN NEXT. RUN fetchMark(BUFFER StuGrade, MarkInPeriod.mark-order, OUTPUT theMark). IF theMark = "" THEN NEXT. LEAVE MultiBlock. END. /* Each BldgXlate */ END. ELSE /* Default 1-mapping processing */ FIND FIRST MarkInPeriod NO-LOCK WHERE (MarkInPeriod.school-year-id = BldgXlate.school-year-id) AND (MarkInPeriod.bldg-id = BldgXlate.xlate-bldg-id) AND (MarkInPeriod.grading-period-id = BldgXlate.xlate-grading-period-id) AND (MarkInPeriod.mark-id = BldgXlate.xlate-mark-id) NO-ERROR. END. /* Available BldgXlate */ END. ELSE IF StuYear.bldg-id <> StuSchedule.bldg-id THEN DO: FIND MarkInPeriod NO-LOCK WHERE (MarkInPeriod.school-year-id = StuSchedule.school-year-id) AND (MarkInPeriod.bldg-id = StuSchedule.bldg-id) AND (MarkInPeriod.grading-period-id = GradingPeriodMark.grading-period-id) AND (MarkInPeriod.mark-id = GradingPeriodMark.mark-id) NO-ERROR. END. ELSE FIND MarkInPeriod WHERE RECID(MarkInPeriod) = RECID(GradingPeriodMark) NO-LOCK. IF AVAILABLE MarkInPeriod THEN DO: /* Find the StuGrade record (if any) */ FIND FIRST StuGrade NO-LOCK WHERE StuGrade.school-year-id = StuSchedule.school-year-id AND StuGrade.bldg-id = MarkInPeriod.bldg-id AND StuGrade.stu-seq = StuSchedule.stu-seq AND StuGrade.course-id = StuSchedule.course-id AND StuGrade.section-id = StuSchedule.section-id AND StuGrade.grading-period-id = MarkInPeriod.grading-period-id NO-ERROR. IF AVAILABLE StuGrade THEN DO: /* Get the text for this mark (if any) */ RUN FetchMark(BUFFER StuGrade, MarkInPeriod.mark-order, OUTPUT TheMark). END. ELSE TheMark = "". END. ELSE TheMark = "". /* See if we should restrict this by a primary course */ IF GradingMark.final-mark THEN DO: /* If we have a primary course, we enable the checking to see */ /* if the course is really 'final' or not */ IF AVAILABLE PrimaryCourse AND PrimaryCourse.bldg-id = StuSchedule.bldg-id AND PrimaryCourse.course-id = StuSchedule.course-id AND PrimaryCourse.section-id = StuSchedule.section-id THEN DO: RUN prv_CourseInSession(PrimaryCourse.bldg-id, PrimaryCourse.course-id, PrimaryCourse.section-id, OUTPUT CourseStartDate, OUTPUT CourseEndDate). END. ELSE DO: RUN prv_CourseInSession(MasterStuSchd.bldg-id, MasterStuSchd.course-id, MasterStuSchd.section-id, OUTPUT CourseStartDate, OUTPUT CourseEndDate). END. /* Record the final mark */ FIND FIRST FinalMarks WHERE FinalMarks.mark-id = GradingMark.mark-id NO-ERROR. IF NOT AVAILABLE FinalMarks THEN DO: CREATE FinalMarks. ASSIGN order = order + 1 FinalMarks.InsertOrder = order FinalMarks.mark-id = GradingMark.mark-id. END. IF TheMark = "" THEN NEXT MarkLoop. FinalMarks.theValue = TheMark. NEXT MarkLoop. END. /* See where to add the mark */ CASE GradingMark.position-in-list: WHEN "Prefix" THEN PrefixList = PrefixList + "," + TheMark. WHEN "Inline" THEN InlineList = InlineList + "," + TheMark. WHEN "Suffix" THEN SuffixList = SuffixList + "," + TheMark. END. END. /* for each grading period mark */ END. /* Piece the list together */ IF LENGTH(PrefixList) <> 0 THEN {gradutil.i ADD-TO-LIST MarkList SUBSTR(PrefixList,2)} IF LENGTH(InlineList) <> 0 THEN {gradutil.i ADD-TO-LIST MarkList SUBSTR(InLineList,2)} IF LENGTH(SuffixList) <> 0 THEN {gradutil.i ADD-TO-LIST MarkList SUBSTR(SuffixList,2)} /* append the final marks */ FOR EACH FinalMarks BY FinalMarks.InsertOrder: {gradutil.i ADD-TO-LIST MarkList STRING(FinalMarks.theValue)} DELETE FinalMarks NO-ERROR. END. END. END PROCEDURE. /* GetPeriodMarks */ /* Return marks for a given master-schd-mark override course for a student and course */ PROCEDURE GetMSMPeriodMarks: /* Define Parameters */ DEFINE PARAMETER BUFFER StuSchedule FOR stu-schedule. DEFINE INPUT PARAMETER StartPeriodNum AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER EndPeriodNum AS INTEGER NO-UNDO. DEFINE OUTPUT PARAMETER MarkList AS CHARACTER NO-UNDO. /* Define Variables */ DEFINE VARIABLE TheMark AS CHARACTER NO-UNDO. DEFINE VARIABLE InlineList AS CHARACTER NO-UNDO. DEFINE VARIABLE PrefixList AS CHARACTER NO-UNDO. DEFINE VARIABLE SuffixList AS CHARACTER NO-UNDO. DEFINE VARIABLE FinalMark AS CHARACTER NO-UNDO. DEFINE VARIABLE order AS INTEGER INITIAL 0 NO-UNDO. DEFINE VARIABLE CourseStartDate AS DATE NO-UNDO. DEFINE VARIABLE CourseEndDate AS DATE NO-UNDO. /* Define Buffers */ DEFINE BUFFER StuYear FOR stu-year. DEFINE BUFFER GradingPeriod FOR grading-period. DEFINE BUFFER GradingPeriodMark FOR grading-period-mark. DEFINE BUFFER GradingMark FOR grading-mark. DEFINE BUFFER StuGrade FOR stu-grade. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER FinalMarks FOR FinalMarks. DEFINE BUFFER MasterStuSchd FOR master-schd. DEFINE BUFFER MarkInPeriod FOR grading-period-mark. DEFINE BUFFER BldgXlate FOR grading-bldg-xlate. FIND stuYear NO-LOCK WHERE stuYear.school-year-id = StuSchedule.school-year-id AND stuYear.stu-seq = StuSchedule.stu-seq. FIND MasterStuSchd OF StuSchedule NO-LOCK. /* Process all periods in our range */ MarkLoop: FOR EACH MasterSchdMark NO-LOCK WHERE MasterSchdMark.school-year-id = StuSchedule.school-year-id AND MasterSchdMark.bldg-id = StuSchedule.bldg-id AND MasterSchdMark.schd-version-id = StuSchedule.schd-version-id AND MasterSchdMark.course-id = StuSchedule.course-id AND MasterSchdMark.section-id = StuSchedule.section-id BY MasterSchdMark.mark-order: FIND GradingPeriod NO-LOCK WHERE GradingPeriod.school-year-id = StuSchedule.school-year-id AND GradingPeriod.bldg-id = StuSchedule.bldg-id AND GradingPeriod.grading-period-id = MasterSchdMark.grading-period-id NO-ERROR. IF NOT AVAILABLE GradingPeriod THEN NEXT. IF GradingPeriod.grading-period-num < StartPeriodNum OR GradingPeriod.grading-period-num > EndPeriodNum THEN NEXT. FIND GradingPeriodMark NO-LOCK WHERE GradingPeriodMark.school-year-id = MasterSchdMark.school-year-id AND GradingPeriodMark.bldg-id = MasterSchdMark.bldg-id AND GradingPeriodMark.grading-period-id = MasterSchdMark.record-grading-period-id AND GradingPeriodMark.mark-id = MasterSchdMark.record-mark-id NO-ERROR. IF NOT AVAILABLE GradingPeriodMark THEN NEXT. /* Find the StuGrade record (if any) */ FIND FIRST StuGrade NO-LOCK WHERE StuGrade.school-year-id = StuSchedule.school-year-id AND StuGrade.bldg-id = StuSchedule.bldg-id AND StuGrade.stu-seq = StuSchedule.stu-seq AND StuGrade.course-id = StuSchedule.course-id AND StuGrade.section-id = StuSchedule.section-id AND StuGrade.grading-period-id = GradingPeriod.grading-period-id NO-ERROR. IF AVAILABLE StuGrade THEN DO: /* Get the text for this mark (if any) */ RUN FetchStuMSMMark(BUFFER StuGrade, GradingPeriodMark.mark-order, OUTPUT TheMark). END. ELSE TheMark = "". /* Load the Mark definition */ FIND GradingMark OF GradingPeriodMark NO-LOCK NO-ERROR. IF NOT AVAILABLE GradingMark THEN NEXT. /* See if we should restrict this by a primary course */ IF GradingMark.final-mark THEN DO: IF AVAILABLE PrimaryCourse AND PrimaryCourse.bldg-id = StuSchedule.bldg-id AND PrimaryCourse.course-id = StuSchedule.course-id AND PrimaryCourse.section-id = StuSchedule.section-id THEN DO: RUN prv_CourseInSession(PrimaryCourse.bldg-id, PrimaryCourse.course-id, PrimaryCourse.section-id, OUTPUT CourseStartDate, OUTPUT CourseEndDate). END. ELSE DO: RUN prv_CourseInSession(MasterStuSchd.bldg-id, MasterStuSchd.course-id, MasterStuSchd.section-id, OUTPUT CourseStartDate, OUTPUT CourseEndDate). END. /* Record the final mark */ FIND FIRST FinalMarks WHERE FinalMarks.mark-id = GradingMark.mark-id NO-ERROR. IF NOT AVAILABLE FinalMarks THEN DO: CREATE FinalMarks. ASSIGN order = order + 1 FinalMarks.InsertOrder = order FinalMarks.mark-id = GradingMark.mark-id. END. IF TheMark = "" THEN NEXT MarkLoop. FinalMarks.theValue = TheMark. NEXT MarkLoop. END. /* See where to add the mark */ CASE GradingMark.position-in-list: WHEN "Prefix" THEN PrefixList = PrefixList + "," + TheMark. WHEN "Inline" THEN InlineList = InlineList + "," + TheMark. WHEN "Suffix" THEN SuffixList = SuffixList + "," + TheMark. END. END. /* MarkLoop */ /* Piece the list together */ IF LENGTH(PrefixList) <> 0 THEN {gradutil.i ADD-TO-LIST MarkList SUBSTR(PrefixList,2)} IF LENGTH(InlineList) <> 0 THEN {gradutil.i ADD-TO-LIST MarkList SUBSTR(InLineList,2)} IF LENGTH(SuffixList) <> 0 THEN {gradutil.i ADD-TO-LIST MarkList SUBSTR(SuffixList,2)} FOR EACH FinalMarks BY FinalMarks.InsertOrder: {gradutil.i ADD-TO-LIST MarkList STRING(FinalMarks.TheValue)} DELETE FinalMarks NO-ERROR. END. END PROCEDURE. /* GetMSMPeriodMarks */ /* Return a list of period/mark IDs in a list */ PROCEDURE GetPeriodMarkIDList: /* Define Parameters */ DEFINE PARAMETER BUFFER TheBldg FOR building. DEFINE INPUT PARAMETER StartPeriodNum AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER EndPeriodNum AS INTEGER NO-UNDO. DEFINE OUTPUT PARAMETER MarkList AS CHARACTER NO-UNDO. /* Define Variables */ DEFINE VARIABLE TheMark AS CHARACTER NO-UNDO. DEFINE VARIABLE CourseStartDate AS DATE NO-UNDO. DEFINE VARIABLE CourseEndDate AS DATE NO-UNDO. DEFINE VARIABLE InlineList AS CHARACTER NO-UNDO. DEFINE VARIABLE PrefixList AS CHARACTER NO-UNDO. DEFINE VARIABLE SuffixList AS CHARACTER NO-UNDO. DEFINE VARIABLE FinalMark AS CHARACTER NO-UNDO. DEFINE VARIABLE order AS INTEGER INITIAL 0 NO-UNDO. /* Define Buffers */ DEFINE BUFFER GradingPeriod FOR grading-period. DEFINE BUFFER GradingPeriodMark FOR grading-period-mark. DEFINE BUFFER GradingMark FOR grading-mark. DEFINE BUFFER FinalMarks FOR FinalMarks. /* Process all periods in our range */ FOR EACH GradingPeriod NO-LOCK WHERE GradingPeriod.school-year-id = TheBldg.school-year-id AND GradingPeriod.bldg-id = TheBldg.bldg-id AND GradingPeriod.grading-period-num >= StartPeriodNum AND GradingPeriod.grading-period-num <= EndPeriodNum BY GradingPeriod.school-year-id BY GradingPeriod.bldg-id BY GradingPeriod.grading-period-num: /* Process all marks in this period */ MarkLoop: FOR EACH GradingPeriodMark OF GradingPeriod BY GradingPeriodMark.school-year-id BY GradingPeriodMark.bldg-id BY GradingPeriodMark.grading-period-id BY GradingPeriodMark.mark-order: /* Load the Mark definition */ FIND GradingMark OF GradingPeriodMark NO-LOCK NO-ERROR. IF NOT AVAILABLE GradingMark THEN NEXT. /* Get the text for this mark (if any) */ theMark = STRING(GradingPeriodMark.grading-period-id) + "/" + STRING(GradingPeriodMark.mark-id). /* See if we should restrict this by a primary course */ IF GradingMark.final-mark THEN DO: IF AVAILABLE primaryCourse THEN DO: RUN prv_CourseInSession(PrimaryCourse.bldg-id, PrimaryCourse.course-id, PrimaryCourse.section-id, OUTPUT CourseStartDate, OUTPUT CourseEndDate). IF CourseEndDate < GradingPeriod.start-date OR CourseEndDate > GradingPeriod.end-date THEN NEXT MarkLoop. END. FIND FIRST FinalMarks WHERE FinalMarks.mark-id = GradingPeriodMark.mark-id NO-ERROR. IF NOT AVAILABLE FinalMarks THEN DO: CREATE FinalMarks. ASSIGN order = order + 1 FinalMarks.InsertOrder = order FinalMarks.mark-id = GradingPeriodMark.mark-id. END. /* Skip blank final marks */ IF TheMark = "" THEN NEXT MarkLoop. /* assign the mark value */ FinalMarks.TheValue = TheMark. /* iterate */ NEXT MarkLoop. END. /* See where to add the mark */ CASE GradingMark.position-in-list: WHEN "Prefix" THEN PrefixList = PrefixList + "," + TheMark. WHEN "Inline" THEN InlineList = InlineList + "," + TheMark. WHEN "Suffix" THEN SuffixList = SuffixList + "," + TheMark. END. END. END. /* Piece the list together */ IF LENGTH(PrefixList) <> 0 THEN {gradutil.i ADD-TO-LIST MarkList SUBSTR(PrefixList,2)} IF LENGTH(InlineList) <> 0 THEN {gradutil.i ADD-TO-LIST MarkList SUBSTR(InLineList,2)} IF LENGTH(SuffixList) <> 0 THEN {gradutil.i ADD-TO-LIST MarkList SUBSTR(SuffixList,2)} FOR EACH FinalMarks BY FinalMarks.InsertOrder: {gradutil.i ADD-TO-LIST MarkList STRING(FinalMarks.TheValue)} DELETE FinalMarks NO-ERROR. END. END PROCEDURE. /* GetPeriodMarkIDList */ /* Return a list of Yes/No for each mark whether it should be enabled or not */ PROCEDURE GetPeriodMarksEnabledIdents: /* Define Parameters */ DEFINE PARAMETER BUFFER StuSchedule FOR stu-schedule. DEFINE INPUT PARAMETER StartPeriodNum AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER EndPeriodNum AS INTEGER NO-UNDO. DEFINE OUTPUT PARAMETER IdentList AS CHARACTER NO-UNDO. /* Define Buffers */ DEFINE BUFFER masterSchd FOR master-schd. /* Invoke for this student */ FIND FIRST masterSchd OF StuSchedule NO-LOCK. RUN GetPeriodMarksEnabled(BUFFER masterSchd, StartPeriodNum, EndPeriodNum, OUTPUT IdentList). RETURN. END PROCEDURE. /* GetPeriodMarksEnabledIdents */ /* Same as above, but for a section */ PROCEDURE GetPeriodMarksEnabled: /* Define Parameters */ DEFINE PARAMETER BUFFER MasterSchd FOR master-schd. DEFINE INPUT PARAMETER StartPeriodNum AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER EndPeriodNum AS INTEGER NO-UNDO. DEFINE OUTPUT PARAMETER IdentList AS CHARACTER NO-UNDO. /* Define Variables */ DEFINE VARIABLE TheIdent AS CHARACTER NO-UNDO. DEFINE VARIABLE CourseStartDate AS DATE NO-UNDO. DEFINE VARIABLE CourseEndDate AS DATE NO-UNDO. DEFINE VARIABLE InlineList AS CHARACTER NO-UNDO. DEFINE VARIABLE PrefixList AS CHARACTER NO-UNDO. DEFINE VARIABLE SuffixList AS CHARACTER NO-UNDO. DEFINE VARIABLE FinalMarkIdent AS CHARACTER NO-UNDO. DEFINE VARIABLE order AS INTEGER INITIAL 0 NO-UNDO. /* Define Buffers */ DEFINE BUFFER GradingPeriod FOR grading-period. DEFINE BUFFER GradingPeriodMark FOR grading-period-mark. DEFINE BUFFER GradingMark FOR grading-mark. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER FinalMarks FOR FinalMarks. /* Check if there is a master-schd-mark override for the grading period */ IF CAN-FIND(FIRST MasterSchdMark WHERE MasterSchdMark.school-year-id = MasterSchd.school-year-id AND MasterSchdMark.bldg-id = MasterSchd.bldg-id AND MasterSchdMark.schd-version-id = MasterSchd.schd-version-id AND MasterSchdMark.course-id = MasterSchd.course-id AND MasterSchdMark.section-id = MasterSchd.section-id) THEN DO: RUN GetMSMPeriodMarksEnabled(BUFFER MasterSchd, StartPeriodNum, EndPeriodNum, OUTPUT IdentList). END. ELSE DO: /* Find the start/end date for the course */ RUN prv_CourseInSession(MasterSchd.bldg-id, MasterSchd.course-id, MasterSchd.section-id, OUTPUT CourseStartDate, OUTPUT CourseEndDate). /* Process all periods in our range */ FOR EACH GradingPeriod NO-LOCK WHERE GradingPeriod.school-year-id = MasterSchd.school-year-id AND GradingPeriod.bldg-id = MasterSchd.bldg-id AND GradingPeriod.grading-period-num >= StartPeriodNum AND GradingPeriod.grading-period-num <= EndPeriodNum BY GradingPeriod.school-year-id BY GradingPeriod.bldg-id BY GradingPeriod.grading-period-num: /* Process all marks in this period */ MarkLoop: FOR EACH GradingPeriodMark OF GradingPeriod BY GradingPeriodMark.school-year-id BY GradingPeriodMark.bldg-id BY GradingPeriodMark.grading-period-id BY GradingPeriodMark.mark-order: /* Load the Mark definition */ FIND GradingMark OF GradingPeriodMark NO-LOCK NO-ERROR. IF NOT AVAILABLE GradingMark THEN NEXT. /* See if this mark should be enabled */ IF GradingPeriod.grading-period-id = PrimaryPeriod.grading-period-id THEN DO: TheIdent = STRING(GradingPeriodMark.mark-order). IF GradingPeriodMark.mark-required THEN TheIdent = "-" + TheIdent. END. ELSE TheIdent = "". /* See if we should restrict this by a primary course */ IF GradingMark.final-mark THEN DO: /* If we have a primary course, we enable the checking to see */ /* if the course is really 'final' or not */ IF AVAILABLE PrimaryCourse AND PrimaryCourse.bldg-id = MasterSchd.bldg-id AND PrimaryCourse.course-id = MasterSchd.course-id AND PrimaryCourse.section-id = MasterSchd.section-id THEN DO: RUN prv_CourseInSession(PrimaryCourse.bldg-id, PrimaryCourse.course-id, PrimaryCourse.section-id, OUTPUT CourseStartDate, OUTPUT CourseEndDate). END. ELSE DO: RUN prv_CourseInSession(MasterSchd.bldg-id, MasterSchd.course-id, MasterSchd.section-id, OUTPUT CourseStartDate, OUTPUT CourseEndDate). END. /* See if this would be the 'final' period for the mark */ IF CourseEndDate < GradingPeriod.start-date OR CourseEndDate > GradingPeriod.end-date THEN NEXT MarkLoop. FIND FIRST FinalMarks WHERE FinalMarks.mark-id = GradingMark.mark-id NO-ERROR. IF NOT AVAILABLE FinalMarks THEN DO: CREATE FinalMarks. ASSIGN order = order + 1 FinalMarks.InsertOrder = order FinalMarks.mark-id = GradingMark.mark-id. END. IF TheIdent = "" THEN NEXT MarkLoop. FinalMarks.TheValue = TheIdent. NEXT MarkLoop. END. /* See where to add the mark */ CASE GradingMark.position-in-list: WHEN "Prefix" THEN PrefixList = PrefixList + "," + TheIdent. WHEN "Inline" THEN InlineList = InlineList + "," + TheIdent. WHEN "Suffix" THEN SuffixList = SuffixList + "," + TheIdent. END. END. END. /* Piece the list together */ IF LENGTH(PrefixList) <> 0 THEN {gradutil.i ADD-TO-LIST IdentList SUBSTR(PrefixList,2)} IF LENGTH(InlineList) <> 0 THEN {gradutil.i ADD-TO-LIST IdentList SUBSTR(InLineList,2)} IF LENGTH(SuffixList) <> 0 THEN {gradutil.i ADD-TO-LIST IdentList SUBSTR(SuffixList,2)} FOR EACH FinalMarks BY FinalMarks.InsertOrder: {gradutil.i ADD-TO-LIST IdentList STRING(FinalMarks.TheValue)} DELETE FinalMarks NO-ERROR. END. END. END PROCEDURE. /* GetPeriodMarksEnabled */ /* Return list of Yes/No for each mark whether it should eb enabled or not */ PROCEDURE GetMSMPeriodMarksEnabledIdents: /* Define Parameters */ DEFINE PARAMETER BUFFER StuSchedule FOR stu-schedule. DEFINE INPUT PARAMETER StartPeriodNum AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER EndPeriodNum AS INTEGER NO-UNDO. DEFINE OUTPUT PARAMETER IdentList AS CHARACTER NO-UNDO. /* Define Buffers */ DEFINE BUFFER MasterSchd FOR master-schd. /* Invoke the section based module */ FIND FIRST MasterSchd OF StuSchedule NO-LOCK. RUN GetMSMPeriodMarksEnabled(BUFFER MasterSchd, StartPeriodNum, EndPeriodNum, OUTPUT IdentList). RETURN. END PROCEDURE. /* GetMSMPeriodMarksEnabledIdents */ /* Return list of Yes/No for each mark whether it should eb enabled or not */ PROCEDURE GetMSMPeriodMarksEnabled: /* Define Parameters */ DEFINE PARAMETER BUFFER MasterSchd FOR master-schd. DEFINE INPUT PARAMETER StartPeriodNum AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER EndPeriodNum AS INTEGER NO-UNDO. DEFINE OUTPUT PARAMETER IdentList AS CHARACTER NO-UNDO. /* Define Variables */ DEFINE VARIABLE TheIdent AS CHARACTER NO-UNDO. DEFINE VARIABLE CourseStartDate AS DATE NO-UNDO. DEFINE VARIABLE CourseEndDate AS DATE NO-UNDO. DEFINE VARIABLE InlineList AS CHARACTER NO-UNDO. DEFINE VARIABLE PrefixList AS CHARACTER NO-UNDO. DEFINE VARIABLE SuffixList AS CHARACTER NO-UNDO. DEFINE VARIABLE FinalMarkIdent AS CHARACTER NO-UNDO. DEFINE VARIABLE order AS INTEGER INITIAL 0 NO-UNDO. DEFINE VARIABLE GMNList AS CHARACTER NO-UNDO. /* Define Buffers */ DEFINE BUFFER GradingPeriod FOR grading-period. DEFINE BUFFER GradingPeriodMark FOR grading-period-mark. DEFINE BUFFER GradingMark FOR grading-mark. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER FinalMarks FOR FinalMarks. /* Process all periods in our range */ FOR EACH GradingPeriod NO-LOCK WHERE GradingPeriod.school-year-id = MasterSchd.school-year-id AND GradingPeriod.bldg-id = MasterSchd.bldg-id AND GradingPeriod.grading-period-num >= StartPeriodNum AND GradingPeriod.grading-period-num <= EndPeriodNum BY GradingPeriod.school-year-id BY GradingPeriod.bldg-id BY GradingPeriod.grading-period-num: /* Process all marks in this period */ MarkLoop: FOR EACH GradingPeriodMark OF GradingPeriod BY GradingPeriodMark.school-year-id BY GradingPeriodMark.bldg-id BY GradingPeriodMark.grading-period-id BY GradingPeriodMark.mark-order: /* Load the Mark definition */ FIND GradingMark OF GradingPeriodMark NO-LOCK NO-ERROR. IF NOT AVAILABLE GradingMark THEN NEXT. FIND FIRST MasterSchdMark NO-LOCK WHERE MasterSchdMark.school-year-id = MasterSchd.school-year-id AND MasterSchdMark.bldg-id = MasterSchd.bldg-id AND MasterSchdMark.schd-version-id = MasterSchd.schd-version-id AND MasterSchdMark.course-id = MasterSchd.course-id AND MasterSchdMark.section-id = MasterSchd.section-id AND MasterSchdMark.grading-period-id = PrimaryPeriod.grading-period-id AND MasterSchdMark.record-grading-period-id = GradingPeriod.grading-period-id AND MasterSchdMark.record-mark-id = GradingMark.mark-id NO-ERROR. /* See if this mark should be enabled */ IF AVAILABLE MasterSchdMark THEN DO: TheIdent = STRING(GradingPeriodMark.mark-order). IF GradingPeriodMark.mark-required THEN TheIdent = "-" + TheIdent. END. ELSE TheIdent = "". /* See if a final course */ IF GradingMark.final-mark THEN DO: /* If we have a primary course, we enable the checking to see */ /* if the course is really 'final' or not */ IF AVAILABLE PrimaryCourse AND PrimaryCourse.bldg-id = MasterSchd.bldg-id AND PrimaryCourse.course-id = MasterSchd.course-id AND PrimaryCourse.section-id = MasterSchd.section-id THEN DO: RUN prv_CourseInSession(PrimaryCourse.bldg-id, PrimaryCourse.course-id, PrimaryCourse.section-id, OUTPUT CourseStartDate, OUTPUT CourseEndDate). END. ELSE DO: RUN prv_CourseInSession(MasterSchd.bldg-id, MasterSchd.course-id, MasterSchd.section-id, OUTPUT CourseStartDate, OUTPUT CourseEndDate). END. /* Record the final mark */ FIND FinalMarks WHERE FinalMarks.mark-id = GradingMark.mark-id NO-ERROR. IF NOT AVAILABLE FinalMarks THEN DO: CREATE FinalMarks. ASSIGN order = order + 1 FinalMarks.InsertOrder = order FinalMarks.mark-id = GradingMark.mark-id. END. IF TheIdent = "" THEN NEXT MarkLoop. FinalMarks.TheValue = TheIdent. NEXT MarkLoop. END. /* See where to add the mark */ CASE GradingMark.position-in-list: WHEN "Prefix" THEN PrefixList = PrefixList + "," + TheIdent. WHEN "Inline" THEN InlineList = InlineList + "," + TheIdent. WHEN "Suffix" THEN SuffixList = SuffixList + "," + TheIdent. END. END. END. /* Piece the list together */ IF LENGTH(PrefixList) <> 0 THEN {gradutil.i ADD-TO-LIST IdentList SUBSTR(PrefixList,2)} IF LENGTH(InlineList) <> 0 THEN {gradutil.i ADD-TO-LIST IdentList SUBSTR(InLineList,2)} IF LENGTH(SuffixList) <> 0 THEN {gradutil.i ADD-TO-LIST IdentList SUBSTR(SuffixList,2)} /* add the final marks */ FOR EACH FinalMarks BY FinalMarks.InsertOrder: {gradutil.i ADD-TO-LIST IdentList STRING(FinalMarks.TheValue)} DELETE FinalMarks NO-ERROR. END. RETURN. END PROCEDURE. /* GetMSMPeriodMarksEnabled */ /* See if the course is enabled -- SET PERIOD must be called before calling this */ PROCEDURE GetCourseEnabled: /* Define Parameters */ DEFINE PARAMETER BUFFER TheCourse FOR master-schd. DEFINE OUTPUT PARAMETER EnabledFlag AS LOGICAL INITIAL No NO-UNDO. /* Define Variables */ DEFINE VARIABLE CourseEndDate AS DATE NO-UNDO. DEFINE VARIABLE CourseStartDate AS DATE NO-UNDO. /* Define buffers */ DEFINE BUFFER MasterSchdMark FOR master-schd-mark. /* Check if this course has a master-schd-mark override */ IF AVAILABLE PrimaryPeriod THEN FIND FIRST MasterSchdMark NO-LOCK WHERE MasterSchdMark.school-year-id = TheCourse.school-year-id AND MasterSchdMark.bldg-id = TheCourse.bldg-id AND MasterSchdMark.schd-version-id = TheCourse.schd-version-id AND MasterSchdMark.course-id = TheCourse.course-id AND MasterSchdMark.section-id = TheCourse.section-id AND MasterSchdMark.grading-period-id = PrimaryPeriod.grading-period-id NO-ERROR. IF NOT AVAILABLE MasterSchdMark THEN FIND FIRST MasterSchdMark NO-LOCK WHERE MasterSchdMark.school-year-id = TheCourse.school-year-id AND MasterSchdMark.bldg-id = TheCourse.bldg-id AND MasterSchdMark.schd-version-id = TheCourse.schd-version-id AND MasterSchdMark.course-id = TheCourse.course-id AND MasterSchdMark.section-id = TheCourse.section-id NO-ERROR. /* If checking for a single course, and a master-schd-mark overide and the single grading period is not the same as the entry grading period for the override, then reject the course */ IF AVAILABLE PrimaryPeriod AND AVAILABLE MasterSchdMark AND PrimaryPeriod.grading-period-id <> MasterSchdMark.grading-period-id THEN RETURN. /* If not a master-schd-mark override check course dates */ IF NOT AVAILABLE MasterSchdMark THEN DO: /* Find the start/end date for the course */ RUN prv_CourseInSession(TheCourse.bldg-id, TheCourse.course-id, TheCourse.section-id, OUTPUT CourseStartDate, OUTPUT CourseEndDate). /* See if the course is in our date range or not */ IF CourseEndDate < PrimaryPeriod.start-date OR CourseStartDate > PrimaryPeriod.end-date THEN RETURN. END. /* Mark the course in use */ EnabledFlag = Yes. END PROCEDURE. /* GetCourseEnabled */ /* Return labels for a specific course */ PROCEDURE GetCourseLabels: /* Define Parameters */ DEFINE PARAMETER BUFFER StuGrade FOR stu-grade. DEFINE INPUT PARAMETER ShortLabels AS LOGICAL NO-UNDO. DEFINE OUTPUT PARAMETER LabelList AS CHARACTER NO-UNDO. /* Define Variables */ DEFINE VARIABLE InlineList AS CHARACTER NO-UNDO. DEFINE VARIABLE PrefixList AS CHARACTER NO-UNDO. DEFINE VARIABLE SuffixList AS CHARACTER NO-UNDO. DEFINE VARIABLE TheMark AS CHARACTER NO-UNDO. DEFINE VARIABLE CourseEndDate AS DATE NO-UNDO. DEFINE VARIABLE CourseStartDate AS DATE NO-UNDO. DEFINE VARIABLE FinalMark AS CHARACTER NO-UNDO. DEFINE VARIABLE order AS INTEGER INITIAL 0 NO-UNDO. /* Define Buffers */ DEFINE BUFFER GradingPeriod FOR grading-period. DEFINE BUFFER GradingPeriodMark FOR grading-period-mark. DEFINE BUFFER GradingMark FOR grading-mark. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER FinalMarks FOR FinalMarks. DEFINE BUFFER SchdVersion FOR schd-version. /* Load the grading period */ FIND FIRST GradingPeriod OF StuGrade NO-LOCK NO-ERROR. IF NOT AVAILABLE GradingPeriod THEN RETURN. FIND SchdVersion NO-LOCK WHERE SchdVersion.school-year-id = StuGrade.school-year-id AND SchdVersion.bldg-id = StuGrade.bldg-id AND SchdVersion.active-schedule. /* Check for master-schd-mark entry for course */ IF CAN-FIND(FIRST MasterSchdMark WHERE MasterSchdMark.school-year-id = StuGrade.school-year-id AND MasterSchdMark.bldg-id = StuGrade.bldg-id AND MasterSchdMark.schd-version-id = SchdVersion.schd-version-id AND MasterSchdMark.course-id = StuGrade.course-id AND MasterSchdMark.section-id = StuGrade.section-id AND MasterSchdMark.grading-period-id = StuGrade.grading-period-id) THEN /* Get the labels for the overridden master-schd-mark */ RUN GetMSMCourseLabels(StuGrade.school-year-id, StuGrade.bldg-id, StuGrade.course-id, StuGrade.section-id, StuGrade.grading-period-id, ShortLabels, OUTPUT LabelList). ELSE DO: /* Process all marks in this period */ MarkLoop: FOR EACH GradingPeriodMark OF GradingPeriod BY GradingPeriodMark.school-year-id BY GradingPeriodMark.bldg-id BY GradingPeriodMark.grading-period-id BY GradingPeriodMark.mark-order: /* Load the Mark definition */ FIND GradingMark OF GradingPeriodMark NO-LOCK NO-ERROR. IF NOT AVAILABLE GradingMark THEN NEXT. /* Get the mark */ TheMark = (IF GradingMark.period-mark THEN GradingPeriod.grading-period-name ELSE IF ShortLabels THEN GradingMark.short-mark-name ELSE GradingMark.mark-name). /* See if we should restrict this by a primary course */ IF GradingMark.final-mark THEN DO: /* Find the start/end date for the course */ RUN prv_CourseInSession(StuGrade.bldg-id, StuGrade.course-id, StuGrade.section-id, OUTPUT CourseStartDate, OUTPUT CourseEndDate). /* See if this would be the 'final' period for the mark */ IF CourseEndDate < GradingPeriod.start-date OR CourseEndDate > GradingPeriod.end-date THEN NEXT MarkLoop. FIND FinalMarks WHERE FinalMarks.mark-id = GradingMark.mark-id NO-ERROR. IF NOT AVAILABLE FinalMarks THEN DO: CREATE FinalMarks. ASSIGN order = order + 1 FinalMarks.InsertOrder = order FinalMarks.mark-id = GradingMark.mark-id. END. IF TheMark = "" THEN NEXT MarkLoop. FinalMarks.TheValue = TheMark. NEXT MarkLoop. END. /* See where to add the mark */ CASE GradingMark.position-in-list: WHEN "Prefix" THEN PrefixList = PrefixList + "," + TheMark. WHEN "Inline" THEN InLineList = InlineList + "," + TheMark. WHEN "Suffix" THEN SuffixList = SuffixList + "," + TheMark. END. END. /* Piece the list together */ IF LENGTH(PrefixList) <> 0 THEN {gradutil.i ADD-TO-LIST LabelList SUBSTR(PrefixList,2)} IF LENGTH(InlineList) <> 0 THEN {gradutil.i ADD-TO-LIST LabelList SUBSTR(InLineList,2)} IF LENGTH(SuffixList) <> 0 THEN {gradutil.i ADD-TO-LIST LabelList SUBSTR(SuffixList,2)} FOR EACH FinalMarks BY FinalMarks.InsertOrder: {gradutil.i ADD-TO-LIST LabelList STRING(FinalMarks.TheValue)} DELETE FinalMarks NO-ERROR. END. END. END PROCEDURE. /* GetCourseLabels */ /* BRYAN */ /* Master-schd-mark labels for a course */ PROCEDURE GetMSMCourseLabelRange: /* Define Parameters */ DEFINE INPUT PARAMETER YearID AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER BldgID AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER CourseID AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER SectionID AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER startGP AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER endGP AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER ShortLabels AS LOGICAL NO-UNDO. DEFINE OUTPUT PARAMETER LabelList AS CHARACTER NO-UNDO. /* Define Variables */ DEFINE VARIABLE InlineList AS CHARACTER NO-UNDO. DEFINE VARIABLE PrefixList AS CHARACTER NO-UNDO. DEFINE VARIABLE SuffixList AS CHARACTER NO-UNDO. DEFINE VARIABLE TheMark AS CHARACTER NO-UNDO. DEFINE VARIABLE FinalMark AS CHARACTER NO-UNDO. DEFINE VARIABLE order AS INTEGER INITIAL 0 NO-UNDO. DEFINE VARIABLE CourseStartDate AS DATE NO-UNDO. DEFINE VARIABLE CourseEndDate AS DATE NO-UNDO. /* Define Buffers */ DEFINE BUFFER gradingPeriod FOR grading-period. DEFINE BUFFER RecordGradingPeriod FOR grading-period. DEFINE BUFFER GradingPeriodMark FOR grading-period-mark. DEFINE BUFFER GradingMark FOR grading-mark. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER SchdVersionBuff FOR schd-version. DEFINE BUFFER FinalMarks FOR FinalMarks. FIND FIRST SchdVersionBuff NO-LOCK WHERE SchdVersionBuff.school-year-id = YearID AND SchdVersionBuff.bldg-id = BldgID AND SchdVersionBuff.active-schedule = true NO-ERROR. IF NOT AVAILABLE SchdVersionBuff THEN RETURN. MarkLoop: FOR EACH GradingPeriod NO-LOCK WHERE GradingPeriod.school-year-id = YearID AND GradingPeriod.bldg-id = BldgID AND GradingPeriod.grading-period-num >= startGP AND GradingPeriod.grading-period-num <= endGP, EACH MasterSchdMark NO-LOCK WHERE MasterSchdMark.school-year-id = YearID AND MasterSchdMark.bldg-id = BldgID AND MasterSchdMark.schd-version-id = SchdVersionBuff.schd-version-id AND MasterSchdMark.course-id = CourseID AND MasterSchdMark.section-id = SectionID AND MasterSchdMark.grading-period-id = GradingPeriod.grading-period-id BY MasterSchdMark.school-year-id BY MasterSchdMark.bldg-id BY MasterSchdMark.schd-version-id BY MasterSchdMark.course-id BY MasterSchdMark.section-id BY MasterSchdMark.mark-order BY MasterSchdMark.grading-period-id: FIND FIRST RecordGradingPeriod NO-LOCK WHERE RecordGradingPeriod.school-year-id = MasterSchdMark.school-year-id AND RecordGradingPeriod.bldg-id = MasterSchdMark.bldg-id AND RecordGradingPeriod.grading-period-id = MasterSchdMark.record-grading-period-id. /* Load the Mark definition */ FIND GradingMark WHERE GradingMark.school-year-id = MasterSchdMark.school-year-id AND GradingMark.bldg-id = MasterSchdMark.bldg-id AND GradingMark.mark-id = MasterSchdMark.record-mark-id NO-LOCK NO-ERROR. IF NOT AVAILABLE GradingMark THEN NEXT. /* Get the mark */ TheMark = (IF GradingMark.period-mark THEN RecordGradingPeriod.grading-period-name ELSE IF ShortLabels THEN GradingMark.short-mark-name ELSE GradingMark.mark-name). /* See if we should restrict this by a primary course */ IF GradingMark.final-mark THEN DO: FIND FinalMarks WHERE FinalMarks.mark-id = GradingMark.mark-id NO-ERROR. IF NOT AVAILABLE FinalMarks THEN DO: CREATE FinalMarks. ASSIGN order = order + 1 FinalMarks.InsertOrder = order FinalMarks.mark-id = GradingMark.mark-id. END. IF TheMark = "" THEN NEXT MarkLoop. FinalMarks.TheValue = TheMark. NEXT MarkLoop. END. /* See where to add the mark */ CASE GradingMark.position-in-list: WHEN "Prefix" THEN PrefixList = PrefixList + "," + TheMark. WHEN "Inline" THEN InLineList = InlineList + "," + TheMark. WHEN "Suffix" THEN SuffixList = SuffixList + "," + TheMark. END. END. /* Piece the list together */ IF LENGTH(PrefixList) <> 0 THEN {gradutil.i ADD-TO-LIST LabelList SUBSTR(PrefixList,2)} IF LENGTH(InlineList) <> 0 THEN {gradutil.i ADD-TO-LIST LabelList SUBSTR(InLineList,2)} IF LENGTH(SuffixList) <> 0 THEN {gradutil.i ADD-TO-LIST LabelList SUBSTR(SuffixList,2)} FOR EACH FinalMarks BY FinalMarks.InsertOrder: {gradutil.i ADD-TO-LIST LabelList STRING(FinalMarks.TheValue)} DELETE FinalMarks NO-ERROR. END. END PROCEDURE. /* GetMSMCourseLabels */ /* BRYAN */ /* Master-schd-mark labels for a course */ PROCEDURE GetMSMCourseLabels: /* Define Parameters */ DEFINE INPUT PARAMETER YearID AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER BldgID AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER CourseID AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER SectionID AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER gpID AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER ShortLabels AS LOGICAL NO-UNDO. DEFINE OUTPUT PARAMETER LabelList AS CHARACTER NO-UNDO. /* Define Variables */ DEFINE VARIABLE InlineList AS CHARACTER NO-UNDO. DEFINE VARIABLE PrefixList AS CHARACTER NO-UNDO. DEFINE VARIABLE SuffixList AS CHARACTER NO-UNDO. DEFINE VARIABLE TheMark AS CHARACTER NO-UNDO. DEFINE VARIABLE FinalMark AS CHARACTER NO-UNDO. DEFINE VARIABLE order AS INTEGER INITIAL 0 NO-UNDO. DEFINE VARIABLE CourseStartDate AS DATE NO-UNDO. DEFINE VARIABLE CourseEndDate AS DATE NO-UNDO. /* Define Buffers */ DEFINE BUFFER RecordGradingPeriod FOR grading-period. DEFINE BUFFER GradingPeriodMark FOR grading-period-mark. DEFINE BUFFER GradingMark FOR grading-mark. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER SchdVersionBuff FOR schd-version. DEFINE BUFFER FinalMarks FOR FinalMarks. FIND FIRST SchdVersionBuff NO-LOCK WHERE SchdVersionBuff.school-year-id = YearID AND SchdVersionBuff.bldg-id = BldgID AND SchdVersionBuff.active-schedule = true NO-ERROR. IF NOT AVAILABLE SchdVersionBuff THEN RETURN. MarkLoop: FOR EACH MasterSchdMark NO-LOCK WHERE MasterSchdMark.school-year-id = YearID AND MasterSchdMark.bldg-id = BldgID AND MasterSchdMark.schd-version-id = SchdVersionBuff.schd-version-id AND MasterSchdMark.course-id = CourseID AND MasterSchdMark.section-id = SectionID BY MasterSchdMark.school-year-id BY MasterSchdMark.bldg-id BY MasterSchdMark.schd-version-id BY MasterSchdMark.course-id BY MasterSchdMark.section-id BY MasterSchdMark.grading-period-id BY MasterSchdMark.mark-order: IF gpID <> ? AND MasterSchdMark.grading-period-id <> gpID THEN NEXT. FIND FIRST RecordGradingPeriod NO-LOCK WHERE RecordGradingPeriod.school-year-id = MasterSchdMark.school-year-id AND RecordGradingPeriod.bldg-id = MasterSchdMark.bldg-id AND RecordGradingPeriod.grading-period-id = MasterSchdMark.record-grading-period-id. /* Load the Mark definition */ FIND GradingMark WHERE GradingMark.school-year-id = MasterSchdMark.school-year-id AND GradingMark.bldg-id = MasterSchdMark.bldg-id AND GradingMark.mark-id = MasterSchdMark.record-mark-id NO-LOCK NO-ERROR. IF NOT AVAILABLE GradingMark THEN NEXT. /* Get the mark */ TheMark = (IF GradingMark.period-mark THEN RecordGradingPeriod.grading-period-name ELSE IF ShortLabels THEN GradingMark.short-mark-name ELSE GradingMark.mark-name). /* See if we should restrict this by a primary course */ IF GradingMark.final-mark THEN DO: FIND FinalMarks WHERE FinalMarks.mark-id = GradingMark.mark-id NO-ERROR. IF NOT AVAILABLE FinalMarks THEN DO: CREATE FinalMarks. ASSIGN order = order + 1 FinalMarks.InsertOrder = order FinalMarks.mark-id = GradingMark.mark-id. END. IF TheMark = "" THEN NEXT MarkLoop. FinalMarks.TheValue = TheMark. NEXT MarkLoop. END. /* See where to add the mark */ CASE GradingMark.position-in-list: WHEN "Prefix" THEN PrefixList = PrefixList + "," + TheMark. WHEN "Inline" THEN InLineList = InlineList + "," + TheMark. WHEN "Suffix" THEN SuffixList = SuffixList + "," + TheMark. END. END. /* Piece the list together */ IF LENGTH(PrefixList) <> 0 THEN {gradutil.i ADD-TO-LIST LabelList SUBSTR(PrefixList,2)} IF LENGTH(InlineList) <> 0 THEN {gradutil.i ADD-TO-LIST LabelList SUBSTR(InLineList,2)} IF LENGTH(SuffixList) <> 0 THEN {gradutil.i ADD-TO-LIST LabelList SUBSTR(SuffixList,2)} FOR EACH FinalMarks BY FinalMarks.InsertOrder: {gradutil.i ADD-TO-LIST LabelList STRING(FinalMarks.TheValue)} DELETE FinalMarks NO-ERROR. END. END PROCEDURE. /* GetMSMCourseLabels */ /* Returns mark ideintifications for a specific course master-schd-mark override */ PROCEDURE GetCourseIdents: /* Define Parameters */ DEFINE PARAMETER BUFFER StuGrade FOR stu-grade. DEFINE OUTPUT PARAMETER IdentList AS CHARACTER NO-UNDO. /* Define Variables */ DEFINE VARIABLE TheIdent AS CHARACTER NO-UNDO. DEFINE VARIABLE CourseStartDate AS DATE NO-UNDO. DEFINE VARIABLE CourseEndDate AS DATE NO-UNDO. DEFINE VARIABLE InlineList AS CHARACTER NO-UNDO. DEFINE VARIABLE PrefixList AS CHARACTER NO-UNDO. DEFINE VARIABLE SuffixList AS CHARACTER NO-UNDO. DEFINE VARIABLE FinalIdent AS CHARACTER NO-UNDO. DEFINE VARIABLE GrdPerList AS CHARACTER NO-UNDO. DEFINE VARIABLE order AS INTEGER INITIAL 0 NO-UNDO. /* Define Buffers */ DEFINE BUFFER GradingPeriod FOR grading-period. DEFINE BUFFER GradingPeriodMark FOR grading-period-mark. DEFINE BUFFER GradingMark FOR grading-mark. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER FinalMarks FOR FinalMarks. DEFINE BUFFER SchdVersion FOR schd-version. /* Load up the grading period */ FIND GradingPeriod OF StuGrade NO-LOCK NO-ERROR. IF NOT AVAILABLE GradingPeriod THEN RETURN. /* Schd Version */ FIND FIRST SchdVersion NO-LOCK WHERE SchdVersion.school-year-id = StuGrade.school-year-id AND SchdVersion.bldg-id = StuGrade.bldg-id AND SchdVersion.active-schedule. /* Check for master-schd-mark entry for course */ IF CAN-FIND(FIRST MasterSchdMark WHERE MasterSchdMark.school-year-id = StuGrade.school-year-id AND MasterSchdMark.bldg-id = StuGrade.bldg-id AND MasterSchdMark.schd-version-id = SchdVersion.schd-version-id AND MasterSchdMark.course-id = StuGrade.course-id AND MasterSchdMark.section-id = StuGrade.section-id AND MasterSchdMark.grading-period-id = StuGrade.grading-period-id) THEN /* Get the course Idents for an master-schd-mark override */ RUN GetMSMCourseIdents(BUFFER StuGrade, OUTPUT IdentList, OUTPUT GrdPerList, NO). ELSE DO: /* Process all marks in this period */ MarkLoop: FOR EACH GradingPeriodMark OF GradingPeriod BY GradingPeriodMark.school-year-id BY GradingPeriodMark.bldg-id BY GradingPeriodMark.grading-period-id BY GradingPeriodMark.mark-order: /* Load the Mark definition */ FIND GradingMark OF GradingPeriodMark NO-LOCK NO-ERROR. IF NOT AVAILABLE GradingMark THEN NEXT. /* Get the index */ TheIdent = STRING(GradingPeriodMark.mark-order). IF GradingPeriodMark.mark-required THEN TheIdent = "-" + TheIdent. /* See if we should restrict this by a primary course */ IF GradingMark.final-mark THEN DO: /* Find the start/end date for the course */ RUN prv_CourseInSession(StuGrade.bldg-id, StuGrade.course-id, StuGrade.section-id, OUTPUT CourseStartDate, OUTPUT CourseEndDate). /* See if this would be the 'final' period for the mark */ IF CourseEndDate < GradingPeriod.start-date OR CourseEndDate > GradingPeriod.end-date THEN NEXT MarkLoop. FIND FinalMarks WHERE FinalMarks.mark-id = GradingMark.mark-id NO-ERROR. IF NOT AVAILABLE FinalMarks THEN DO: CREATE FinalMarks. ASSIGN order = order + 1 FinalMarks.InsertOrder = order FinalMarks.mark-id = GradingMark.mark-id. END. IF TheIdent = "" THEN NEXT MarkLoop. FinalMarks.TheValue = TheIdent. NEXT MarkLoop. END. /* See where to add the mark */ CASE GradingMark.position-in-list: WHEN "Prefix" THEN PrefixList = PrefixList + "," + TheIdent. WHEN "Inline" THEN InlineList = InlineList + "," + TheIdent. WHEN "Suffix" THEN SuffixList = SuffixList + "," + TheIdent. END. END. /* Piece the list together */ IF LENGTH(PrefixList) <> 0 THEN {gradutil.i ADD-TO-LIST IdentList SUBSTR(PrefixList,2)} IF LENGTH(InlineList) <> 0 THEN {gradutil.i ADD-TO-LIST IdentList SUBSTR(InLineList,2)} IF LENGTH(SuffixList) <> 0 THEN {gradutil.i ADD-TO-LIST IdentList SUBSTR(SuffixList,2)} FOR EACH FinalMarks BY FinalMarks.InsertOrder: {gradutil.i ADD-TO-LIST IdentList STRING(FinalMarks.TheValue)} DELETE FinalMarks NO-ERROR. END. END. END PROCEDURE. /* GetCourseIdents */ /* Returns mark ideintifications for a specific course with master-schd-mark override */ PROCEDURE GetMSMCourseIdents: /* Define Parameters */ DEFINE PARAMETER BUFFER StuGrade FOR stu-grade. DEFINE OUTPUT PARAMETER IdentList AS CHARACTER NO-UNDO. DEFINE OUTPUT PARAMETER GrdPerList AS CHARACTER NO-UNDO. DEFINE INPUT PARAMETER KeepPositive AS LOGICAL NO-UNDO. /* Define Variables */ DEFINE VARIABLE TheIdent AS CHARACTER NO-UNDO. DEFINE VARIABLE TheGPId AS CHARACTER NO-UNDO. DEFINE VARIABLE InlineList AS CHARACTER NO-UNDO. DEFINE VARIABLE InlineGPId AS CHARACTER NO-UNDO. DEFINE VARIABLE PrefixList AS CHARACTER NO-UNDO. DEFINE VARIABLE PrefixGPId AS CHARACTER NO-UNDO. DEFINE VARIABLE SuffixList AS CHARACTER NO-UNDO. DEFINE VARIABLE SuffixGPId AS CHARACTER NO-UNDO. DEFINE VARIABLE FinalIdent AS CHARACTER NO-UNDO. DEFINE VARIABLE FinalGPId AS CHARACTER NO-UNDO. DEFINE VARIABLE order AS INTEGER INITIAL 0 NO-UNDO. /* Define buffers */ DEFINE BUFFER GradingPeriod FOR grading-period. DEFINE BUFFER GradingPeriodMark FOR grading-period-mark. DEFINE BUFFER GradingMark FOR grading-mark. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER SchdVersionBuff FOR schd-version. DEFINE BUFFER FinalMarkList FOR FinalMarks. /* Get the active schd-version */ FIND FIRST SchdVersionBuff NO-LOCK WHERE SchdVersionBuff.school-year-id = StuGrade.school-year-id AND SchdVersionBuff.bldg-id = StuGrade.bldg-id AND SchdVersionBuff.active-schedule = true NO-ERROR. IF NOT AVAILABLE SchdVersionBuff THEN RETURN. /* Load up the grading period */ FIND GradingPeriod OF StuGrade NO-LOCK NO-ERROR. IF NOT AVAILABLE GradingPeriod THEN DO: RETURN. END. MarkLoop: FOR EACH MasterSchdMark NO-LOCK WHERE MasterSchdMark.school-year-id = StuGrade.school-year-id AND MasterSchdMark.bldg-id = StuGrade.bldg-id AND MasterSchdMark.schd-version-id = SchdVersionBuff.schd-version-id AND MasterSchdMark.course-id = StuGrade.course-id AND MasterSchdMark.section-id = StuGrade.section-id AND MasterSchdMark.grading-period-id = GradingPeriod.grading-period-id, /* Process all marks in this period */ EACH GradingPeriodMark NO-LOCK WHERE GradingPeriodMark.school-year-id = MasterSchdMark.school-year-id AND GradingPeriodMark.bldg-id = MasterSchdMark.bldg-id AND GradingPeriodMark.grading-period-id = MasterSchdMark.record-grading-period-id AND GradingPeriodMark.mark-id = MasterSchdMark.record-mark-id BY MasterSchdMark.mark-order BY GradingPeriodMark.mark-order: /* Load the Mark definition */ FIND GradingMark OF GradingPeriodMark NO-LOCK NO-ERROR. IF NOT AVAILABLE GradingMark THEN NEXT. /* Get the index */ ASSIGN TheIdent = STRING(GradingPeriodMark.mark-order) TheGPId = STRING(MasterSchdMark.record-grading-period-id). /* If required and not keeping the ident positive add negative sign */ IF GradingPeriodMark.mark-required AND NOT KeepPositive THEN TheIdent = "-" + TheIdent. /* See if we should restrict this by a primary course */ IF GradingMark.final-mark THEN DO: /* not sure how to handle this */ IF TheIdent = "" THEN DO: TheGPId = "". NEXT MarkLoop. END. FIND FIRST FinalMarkList WHERE (FinalMarkList.mark-id = GradingMark.mark-id) AND (FinalMarkList.GPID = MasterSchdMark.record-grading-period-id) NO-ERROR. IF NOT AVAILABLE FinalMarkList THEN DO: CREATE FinalMarkList. ASSIGN order = order + 1 FinalMarkList.InsertOrder = order FinalMarkList.mark-id = GradingMark.mark-id FinalMarkList.GPId = MasterSchdMark.record-grading-period-id FinalMarkList.TheValue = TheIdent. END. NEXT MarkLoop. END. /* See where to add the mark */ CASE GradingMark.position-in-list: WHEN "Prefix" THEN ASSIGN PrefixList = PrefixList + "," + TheIdent PrefixGPId = PrefixGPId + "," + TheGPId. WHEN "Inline" THEN ASSIGN InlineList = InlineList + "," + TheIdent InlineGPID = InlineGPId + "," + TheGPId. WHEN "Suffix" THEN ASSIGN SuffixList = SuffixList + "," + TheIdent SuffixGPId = SuffixGPId + "," + TheGPId. END. END. /* Piece the list together */ IF LENGTH(PrefixList) <> 0 THEN DO: {gradutil.i ADD-TO-LIST IdentList SUBSTR(PrefixList,2)} {gradutil.i ADD-TO-LIST GrdPerList SUBSTR(PrefixGPId,2)} END. IF LENGTH(InlineList) <> 0 THEN DO: {gradutil.i ADD-TO-LIST IdentList SUBSTR(InLineList,2)} {gradutil.i ADD-TO-LIST GrdPerList SUBSTR(InLineGPId,2)} END. IF LENGTH(SuffixList) <> 0 THEN DO: {gradutil.i ADD-TO-LIST IdentList SUBSTR(SuffixList,2)} {gradutil.i ADD-TO-LIST GrdPerList SUBSTR(SuffixGPId,2)} END. FOR EACH FinalMarkList BY FinalMarkList.InsertOrder: {gradutil.i ADD-TO-LIST IdentList STRING(FinalMarkList.TheValue)} {gradutil.i ADD-TO-LIST GrdPerList STRING(FinalMarkList.GPId)} DELETE FinalMarkList NO-ERROR. END. END PROCEDURE. /* GetMSMCourseIdents */ /* Return a student Mark */ PROCEDURE GetStuMark: /* Define Parameters */ DEFINE PARAMETER BUFFER StuGrade FOR stu-grade. DEFINE INPUT PARAMETER TheMarkIdent AS INTEGER NO-UNDO. DEFINE OUTPUT PARAMETER TheMark AS CHARACTER NO-UNDO. /* Get the mark */ RUN FetchStuMark(BUFFER StuGrade, ABS(TheMarkIdent), OUTPUT TheMark). END PROCEDURE. /* GetStuMark */ /* Return a course-level-grade record for the given mark */ PROCEDURE GetStuMarkGrade: /* Define Parameters */ DEFINE PARAMETER BUFFER StuGrade FOR stu-grade. DEFINE INPUT PARAMETER TheMarkIdent AS INTEGER NO-UNDO. DEFINE PARAMETER BUFFER CourseLevelGrade FOR course-level-grade. /* Define Buffers */ DEFINE BUFFER GradingMark FOR grading-period-mark. DEFINE BUFFER StuGradeMark FOR stu-grade-mark. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER SchdVersion FOR schd-version. /* Clear the buffer */ FIND CourseLevelGrade WHERE RECID(CourseLevelGrade) = ? NO-ERROR. /* Bomb out if needed */ IF NOT AVAILABLE StuGrade THEN RETURN. FIND SchdVersion NO-LOCK WHERE SchdVersion.school-year-id = StuGrade.school-year-id AND SchdVersion.bldg-id = StuGrade.bldg-id AND SchdVersion.active-schedule. /* Check for master-schd-mark entry for course */ IF CAN-FIND(FIRST MasterSchdMark WHERE MasterSchdMark.school-year-id = StuGrade.school-year-id AND MasterSchdMark.bldg-id = StuGrade.bldg-id AND MasterSchdMark.schd-version-id = SchdVersion.schd-version-id AND MasterSchdMark.course-id = StuGrade.course-id AND MasterSchdMark.section-id = StuGrade.section-id) THEN /* Get the grade for a master-schd-mark overide */ RUN GetMSMStuMarkGrade(BUFFER StuGrade, TheMarkIdent, BUFFER CourseLevelGrade). ELSE DO: /* Fetch the mark */ FIND FIRST GradingMark NO-LOCK WHERE GradingMark.school-year-id = StuGrade.school-year-id AND GradingMark.bldg-id = StuGrade.bldg-id AND GradingMark.grading-period-id = StuGrade.grading-period-id AND GradingMark.mark-order = Abs(TheMarkIdent) NO-ERROR. IF NOT AVAILABLE GradingMark THEN RETURN. /* Fetch the mark for the student */ FIND FIRST StuGradeMark OF StuGrade NO-LOCK WHERE StuGradeMark.mark-id = GradingMark.mark-id NO-ERROR. IF NOT AVAILABLE StuGradeMark OR StuGradeMark.course-level-grade-id = ? THEN RETURN. /* Fetch the grade record */ FIND FIRST CourseLevelGrade OF StuGradeMark NO-LOCK NO-ERROR. END. END PROCEDURE. /* GetStuMarkGrade */ /* Return a master-schd-mark override course-level-grade record for the given mark */ PROCEDURE GetMSMStuMarkGrade: /* Define Parameters */ DEFINE PARAMETER BUFFER StuGrade FOR stu-grade. DEFINE INPUT PARAMETER TheMarkIdent AS INTEGER NO-UNDO. DEFINE PARAMETER BUFFER CourseLevelGrade FOR course-level-grade. /* Define variables */ DEFINE VARIABLE TheIdentList AS CHARACTER NO-UNDO. DEFINE VARIABLE GrdPerList AS CHARACTER NO-UNDO. DEFINE VARIABLE ListPtr AS INTEGER NO-UNDO. DEFINE VARIABLE RecGrdPerId AS INTEGER NO-UNDO. /* Define Buffers */ DEFINE BUFFER GradingPeriodMark FOR grading-period-mark. DEFINE BUFFER StuGradeMark FOR stu-grade-mark. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER StuGradeBuff FOR stu-grade. DEFINE BUFFER SchdVersionBuff FOR schd-version. /* Get the schd-version */ FIND FIRST SchdVersionBuff NO-LOCK WHERE SchdVersionBuff.school-year-id = StuGrade.school-year-id AND SchdVersionBuff.bldg-id = StuGrade.bldg-id AND SchdVersionBuff.active-schedule = true NO-ERROR. IF NOT AVAILABLE SchdVersionBuff THEN RETURN. /* Get the lists of the markIdent and the Record grading period id's */ RUN GetMSMCourseIdents(BUFFER StuGrade, OUTPUT TheIdentList, OUTPUT GrdPerList, YES). /* Get the position of TheMarkIdent */ ListPtr = LOOKUP(STRING(ABS(TheMarkIdent)), TheIdentList). IF ListPtr = 0 THEN RETURN. /* Get the record-grading-period-id corresponding to TheMarkIdent */ RecGrdPerId = INTEGER(ENTRY(ListPtr, GrdPerLIst)). /* Clear the buffer */ FIND CourseLevelGrade WHERE RECID(CourseLevelGrade) = ? NO-ERROR. /* Get the master-schd-mark for the markIdent */ FIND FIRST MasterSchdMark NO-LOCK WHERE MasterSchdMark.school-year-id = StuGrade.school-year-id AND MasterSchdMark.bldg-id = StuGrade.bldg-id AND MasterSchdMark.schd-version-id = SchdVersionBuff.schd-version-id AND MasterSchdMark.course-id = StuGrade.course-id AND MasterSchdMark.section-id = StuGrade.section-id AND MasterSchdMark.grading-period-id = StuGrade.grading-period-id AND MasterSchdMark.record-grading-period-id = RecGrdPerId NO-ERROR. IF NOT AVAILABLE MasterSchdMark THEN RETURN. /* Get the stu-grade for the master-schd-mark record in grading period */ FIND FIRST StuGradeBuff NO-LOCK WHERE StuGradeBuff.school-year-id = MasterSchdMark.school-year-id AND StuGradeBuff.bldg-id = MasterSchdMark.bldg-id AND StuGradeBuff.course-id = MasterSchdMark.course-id AND StuGradeBuff.section-id = MasterSchdMark.section-id AND StuGradeBuff.grading-period-id = MasterSchdMark.record-grading-period-id AND StuGradeBuff.stu-seq = StuGrade.stu-seq NO-ERROR. /* Fetch the grading-period-mark specified by master-schd-mark */ FIND FIRST GradingPeriodMark NO-LOCK WHERE GradingPeriodMark.school-year-id = StuGradeBuff.school-year-id AND GradingPeriodMark.bldg-id = StuGradeBuff.bldg-id AND GradingPeriodMark.grading-period-id = StuGradeBuff.grading-period-id AND GradingPeriodMark.mark-id = MasterSchdMark.record-mark-id NO-ERROR. IF NOT AVAILABLE GradingPeriodMark THEN RETURN. /* Fetch the mark for the student */ FIND FIRST StuGradeMark OF StuGradeBuff NO-LOCK WHERE StuGradeMark.mark-id = GradingPeriodMark.mark-id NO-ERROR. IF NOT AVAILABLE StuGradeMark OR StuGradeMark.course-level-grade-id = ? THEN RETURN. /* Fetch the grade record */ FIND FIRST CourseLevelGrade OF StuGradeMark NO-LOCK NO-ERROR. END PROCEDURE. /* GetMSMStuMarkGrade */ /* Write a grade out to a student record */ PROCEDURE SetStuMark: /* Define Parameters */ DEFINE PARAMETER BUFFER StuGrade FOR stu-grade. DEFINE INPUT PARAMETER TheMarkIdent AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER TheMark AS CHARACTER NO-UNDO. DEFINE OUTPUT PARAMETER MarkOK AS LOGICAL INITIAL No NO-UNDO. /* Define Variable */ DEFINE VARIABLE TheNumMark AS DECIMAL NO-UNDO. DEFINE VARIABLE GradingPolicy AS CHARACTER NO-UNDO. /* Define Buffers */ DEFINE BUFFER CourseLevelGrade FOR course-level-grade. DEFINE BUFFER GradingMark FOR grading-period-mark. DEFINE BUFFER StuGradeMark FOR stu-grade-mark. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER SchdVersion FOR schd-version. /* Make sure we have something */ IF NOT AVAILABLE StuGrade THEN RETURN. FIND SchdVersion NO-LOCK WHERE SchdVersion.school-year-id = StuGrade.school-year-id AND SchdVersion.bldg-id = StuGrade.bldg-id AND SchdVersion.active-schedule. /* Check for master-schd-mark entry for course */ IF CAN-FIND(FIRST MasterSchdMark WHERE MasterSchdMark.school-year-id = StuGrade.school-year-id AND MasterSchdMark.bldg-id = StuGrade.bldg-id AND MasterSchdMark.schd-version-id = SchdVersion.schd-version-id AND MasterSchdMark.course-id = StuGrade.course-id AND MasterSchdMark.section-id = StuGrade.section-id) THEN /* Set the master-schd-mark override mark */ RUN SetMSMStuMark(BUFFER StuGrade, TheMarkIdent, TheMark, OUTPUT MarkOk). ELSE DO: /* Fetch the mark specified by the index */ FIND FIRST GradingMark NO-LOCK WHERE GradingMark.school-year-id = StuGrade.school-year-id AND GradingMark.bldg-id = StuGrade.bldg-id AND GradingMark.grading-period-id = StuGrade.grading-period-id AND GradingMark.mark-order = ABS(TheMarkIdent) NO-ERROR. IF NOT AVAILABLE GradingMark THEN RETURN. /* Handle blanking out a grade */ IF (TheMark = "") OR (TheMark = ?) THEN DO: /* Don't accept a blank mark for a required mark */ IF GradingMark.mark-required THEN RETURN. /* Fetch the mark for the student. If there is no existing */ /* mark, that OK since all we are going to do is delete it */ /* anyway. */ FIND FIRST StuGradeMark OF StuGrade WHERE StuGradeMark.mark-id = GradingMark.mark-id NO-ERROR. IF NOT AVAILABLE StuGradeMark THEN DO: MarkOK = Yes. RETURN. END. /* Clear it out */ DO TRANSACTION: DELETE StuGradeMark NO-ERROR. IF ERROR-STATUS:ERROR THEN RETURN. END. /* Mark us as OK and leave */ MarkOK = Yes. RETURN. END. /* Get the grading policy */ RUN GradingPolicy(BUFFER StuGrade, OUTPUT GradingPolicy). /*** Translate the mark into an id ***/ /* Lookup the passed grade based on how grades are recorded */ CASE GradingPolicy: /* Letter/Alpha based grades */ WHEN "Letter" THEN FIND FIRST CourseLevelGrade NO-LOCK WHERE CourseLevelGrade.school-year-id = MasterSchd.school-year-id AND CourseLevelGrade.bldg-id = MasterSchd.bldg-id AND CourseLevelGrade.course-level-id = MasterSchd.course-level-id AND CourseLevelGrade.letter-grade = TheMark NO-ERROR. /* Numeric grades */ WHEN "Numeric" THEN DO: /* Convert the mark */ TheNumMark = DECIMAL(TheMark) NO-ERROR. IF ERROR-STATUS:ERROR THEN RETURN. /* Look the mark up */ FIND FIRST CourseLevelGrade NO-LOCK WHERE CourseLevelGrade.school-year-id = MasterSchd.school-year-id AND CourseLevelGrade.bldg-id = MasterSchd.bldg-id AND CourseLevelGrade.course-level-id = MasterSchd.course-level-id AND CourseLevelGrade.numeric-grade-low <= TheNumMark AND CourseLevelGrade.numeric-grade-high >= TheNumMark NO-ERROR. END. /* Pass/Fail grades */ WHEN "Pass/Fail" THEN DO: FIND FIRST CourseLevelGrade NO-LOCK WHERE CourseLevelGrade.school-year-id = MasterSchd.school-year-id AND CourseLevelGrade.bldg-id = MasterSchd.bldg-id AND CourseLevelGrade.course-level-id = MasterSchd.course-level-id AND CourseLevelGrade.letter-grade = TheMark NO-ERROR. IF NOT AVAILABLE CourseLevelGrade THEN DO: IF TheMark BEGINS "P" THEN FIND LAST CourseLevelGrade NO-LOCK WHERE CourseLevelGrade.school-year-id = MasterSchd.school-year-id AND CourseLevelGrade.bldg-id = MasterSchd.bldg-id AND CourseLevelGrade.course-level-id = MasterSchd.course-level-id AND CourseLevelGrade.pass-fail = Yes NO-ERROR. ELSE FIND FIRST CourseLevelGrade NO-LOCK WHERE CourseLevelGrade.school-year-id = MasterSchd.school-year-id AND CourseLevelGrade.bldg-id = MasterSchd.bldg-id AND CourseLevelGrade.course-level-id = MasterSchd.course-level-id AND CourseLevelGrade.pass-fail = No NO-ERROR. END. END. END. /* See if we have a grade */ IF NOT AVAILABLE CourseLevelGrade THEN RETURN. /* Set the mark */ DO TRANSACTION: /* Fetch/create an entry for the student mark */ FIND FIRST StuGradeMark OF StuGrade WHERE StuGradeMark.mark-id = GradingMark.mark-id NO-ERROR. IF NOT AVAILABLE StuGradeMark THEN DO: CREATE StuGradeMark. ASSIGN StuGradeMark.school-year-id = StuGrade.school-year-id StuGradeMark.bldg-id = StuGrade.bldg-id StuGradeMark.stu-seq = StuGrade.stu-seq StuGradeMark.grading-period-id = StuGrade.grading-period-id StuGradeMark.stu-grade-seq = StuGrade.stu-grade-seq StuGradeMark.mark-id = GradingMark.mark-id. END. /* Assign the grade */ ASSIGN StuGradeMark.course-level-id = CourseLevelGrade.course-level-id StuGradeMark.course-level-grade-id = CourseLevelGrade.course-level-grade-id. END. /* Mark all well */ MarkOK = Yes. RETURN. END. END PROCEDURE. /* SetStuMark */ /* Write a master-schd-mark override grade out to a student record */ PROCEDURE SetMSMStuMark: /* Define Parameters */ DEFINE PARAMETER BUFFER StuGrade FOR stu-grade. DEFINE INPUT PARAMETER TheMarker AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER TheMark AS CHARACTER NO-UNDO. DEFINE OUTPUT PARAMETER MarkOK AS LOGICAL INITIAL No NO-UNDO. /* Define Variables */ DEFINE VARIABLE TheNumMark AS DECIMAL NO-UNDO. DEFINE VARIABLE GradingPolicy AS CHARACTER NO-UNDO. DEFINE VARIABLE TheIdentList AS CHARACTER NO-UNDO. DEFINE VARIABLE GrdPerList AS CHARACTER NO-UNDO. DEFINE VARIABLE ListPtr AS INTEGER NO-UNDO. DEFINE VARIABLE RecGrdPerId AS INTEGER NO-UNDO. /* Define Buffers */ DEFINE BUFFER CourseLevelGrade FOR course-level-grade. DEFINE BUFFER GradingPeriodMark FOR grading-period-mark. DEFINE BUFFER StuGradeMark FOR stu-grade-mark. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER SchdVersionBuff FOR schd-version. DEFINE BUFFER StuGradeBuff FOR stu-grade. FIND FIRST SchdVersionBuff NO-LOCK WHERE SchdVersionBuff.school-year-id = StuGrade.school-year-id AND SchdVersionBuff.bldg-id = StuGrade.bldg-id AND SchdVersionBuff.active-schedule = true NO-ERROR. IF NOT AVAILABLE SchdVersionBuff THEN RETURN. /* Get the lists of the markIdent and the Record grading period id's */ RUN GetMSMCourseIdents(BUFFER StuGrade, OUTPUT TheIdentList, OUTPUT GrdPerList, YES). find grading-period of stuGrade no-lock. /* Make sure the mark ident is positive */ theMarker = ABS(TheMarker). /* Get the position of TheMarker */ ListPtr = LOOKUP(STRING(TheMarker), TheIdentList). /* Get the record-grading-period-id corresponding to TheMarkIdent */ RecGrdPerId = INTEGER(ENTRY(ListPtr, GrdPerLIst)). /* Try to get the gradingperiodmark */ FIND FIRST GradingPeriodMark NO-LOCK WHERE (GradingPeriodMark.school-year-id = StuGrade.school-year-id) AND (GradingPeriodMark.bldg-id = StuGrade.bldg-id) AND (GradingPeriodMark.grading-period-id = RecGrdPerId) AND (GradingPeriodMark.mark-order = theMarker) NO-ERROR. IF NOT AVAILABLE GradingPeriodMark THEN DO: RETURN. END. /* Get the master-schd-mark for the markIdent */ FIND FIRST MasterSchdMark NO-LOCK WHERE MasterSchdMark.school-year-id = StuGrade.school-year-id AND MasterSchdMark.bldg-id = StuGrade.bldg-id AND MasterSchdMark.schd-version-id = SchdVersionBuff.schd-version-id AND MasterSchdMark.course-id = StuGrade.course-id AND MasterSchdMark.section-id = StuGrade.section-id AND MasterSchdMark.grading-period-id = StuGrade.grading-period-id AND MasterSchdMark.record-grading-period-id = RecGrdPerId AND MasterSchdMark.record-mark-id = GradingPeriodMark.mark-id NO-ERROR. IF NOT AVAILABLE MasterSchdMark THEN DO: RETURN. END. /* Get the stu-grade for the master-schd-mark record in grading period */ FIND FIRST StuGradeBuff NO-LOCK WHERE StuGradeBuff.school-year-id = MasterSchdMark.school-year-id AND StuGradeBuff.bldg-id = MasterSchdMark.bldg-id AND StuGradeBuff.course-id = MasterSchdMark.course-id AND StuGradeBuff.section-id = MasterSchdMark.section-id AND StuGradeBuff.grading-period-id = MasterSchdMark.record-grading-period-id AND StuGradeBuff.stu-seq = StuGrade.stu-seq NO-ERROR. /* Check if there is a stu-grade record for the master-schd-mark override */ IF NOT AVAILABLE StuGradeBuff THEN DO TRANSACTION: CREATE StuGradeBuff. ASSIGN StuGradeBuff.school-year-id = MasterSchdMark.school-year-id StuGradeBuff.bldg-id = MasterSchdMark.bldg-id StuGradeBuff.course-id = MasterSchdMark.course-id StuGradeBuff.section-id = MasterSchdMark.section-id StuGradeBuff.grading-period-id = MasterSchdMark.record-grading-period-id StuGradeBuff.stu-seq = StuGrade.stu-seq. END. /* Handle blanking out a grade */ IF (TheMark = "") OR (TheMark = ?) THEN DO: /* Don't accept a blank mark for a required mark */ IF GradingPeriodMark.mark-required THEN RETURN. /* Fetch the mark for the student. If there is no existing */ /* mark, that OK since all we are going to do is delete it */ /* anyway. */ FIND FIRST StuGradeMark OF StuGradeBuff WHERE StuGradeMark.mark-id = GradingPeriodMark.mark-id NO-ERROR. IF NOT AVAILABLE StuGradeMark THEN DO: MarkOK = Yes. RETURN. END. /* Clear it out */ DO TRANSACTION: DELETE StuGradeMark NO-ERROR. IF ERROR-STATUS:ERROR THEN RETURN. END. /* Mark us as OK and leave */ MarkOK = Yes. RETURN. END. /* Get the grading policy */ RUN GradingPolicy(BUFFER StuGradeBuff, OUTPUT GradingPolicy). /* Lookup the passed grade based on how grades are recorded */ CASE GradingPolicy: /* Letter/Alpha based grades */ WHEN "Letter" THEN FIND FIRST CourseLevelGrade NO-LOCK WHERE CourseLevelGrade.school-year-id = MasterSchd.school-year-id AND CourseLevelGrade.bldg-id = MasterSchd.bldg-id AND CourseLevelGrade.course-level-id = MasterSchd.course-level-id AND CourseLevelGrade.letter-grade = TheMark NO-ERROR. /* Numeric grades */ WHEN "Numeric" THEN DO: /* Convert the mark */ TheNumMark = DECIMAL(TheMark) NO-ERROR. IF ERROR-STATUS:ERROR THEN RETURN. /* Look the mark up */ FIND FIRST CourseLevelGrade NO-LOCK WHERE CourseLevelGrade.school-year-id = MasterSchd.school-year-id AND CourseLevelGrade.bldg-id = MasterSchd.bldg-id AND CourseLevelGrade.course-level-id = MasterSchd.course-level-id AND CourseLevelGrade.numeric-grade-low <= TheNumMark AND CourseLevelGrade.numeric-grade-high >= TheNumMark NO-ERROR. END. /* Pass/Fail grades */ WHEN "Pass/Fail" THEN IF TheMark BEGINS "P" THEN FIND LAST CourseLevelGrade NO-LOCK WHERE CourseLevelGrade.school-year-id = MasterSchd.school-year-id AND CourseLevelGrade.bldg-id = MasterSchd.bldg-id AND CourseLevelGrade.course-level-id = MasterSchd.course-level-id AND CourseLevelGrade.pass-fail = Yes NO-ERROR. ELSE FIND FIRST CourseLevelGrade NO-LOCK WHERE CourseLevelGrade.school-year-id = MasterSchd.school-year-id AND CourseLevelGrade.bldg-id = MasterSchd.bldg-id AND CourseLevelGrade.course-level-id = MasterSchd.course-level-id AND CourseLevelGrade.pass-fail = No NO-ERROR. END. /* See if we have a grade */ IF NOT AVAILABLE CourseLevelGrade THEN DO: RETURN. END. /* Set the mark */ DO TRANSACTION: /* Fetch/create an entry for the student mark */ FIND FIRST StuGradeMark OF StuGradeBuff WHERE StuGradeMark.mark-id = GradingPeriodMark.mark-id NO-ERROR. IF NOT AVAILABLE StuGradeMark THEN DO: CREATE StuGradeMark. ASSIGN StuGradeMark.school-year-id = StuGradeBuff.school-year-id StuGradeMark.bldg-id = StuGradeBuff.bldg-id StuGradeMark.stu-seq = StuGradeBuff.stu-seq StuGradeMark.grading-period-id = StuGradeBuff.grading-period-id StuGradeMark.stu-grade-seq = StuGradeBuff.stu-grade-seq StuGradeMark.mark-id = GradingPeriodMark.mark-id. END. /* Assign the grade */ ASSIGN StuGradeMark.course-level-id = CourseLevelGrade.course-level-id StuGradeMark.course-level-grade-id = CourseLevelGrade.course-level-grade-id. END. /* Mark all well */ MarkOK = Yes. RETURN. END PROCEDURE. /* SetMSMStuMark */ /* Translate a passed grading-period-mark buffer into a mark Ident */ /* that can be used for subsequent fetch/stor operations */ PROCEDURE XlateMark: /* Define Parameters */ DEFINE PARAMETER BUFFER GradingMark FOR grading-mark. DEFINE OUTPUT PARAMETER TheIdent AS CHARACTER INITIAL ? NO-UNDO. /* Define Buffers */ DEFINE BUFFER GradingPeriodMark FOR grading-period-mark. /* Load the associated record */ FIND FIRST GradingPeriodMark OF PrimaryPeriod NO-LOCK WHERE GradingPeriodMark.mark-id = GradingMark.mark-id NO-ERROR. IF NOT AVAILABLE GradingPeriodMark THEN RETURN. /* Get the index */ TheIdent = STRING(GradingPeriodMark.mark-order). IF GradingPeriodMark.mark-required THEN TheIdent = "-" + TheIdent. END. /* Cleanup & delete ourselves */ PROCEDURE Cleanup: DELETE PROCEDURE THIS-PROCEDURE. END. /* --------------------------- Private IPs for gradutil only ---------------- */ /* prv_CourseInSession will take a passed bldg/course/section and return the */ /* start and end date for the course. */ PROCEDURE prv_CourseInSession: /* Define parameters */ DEFINE INPUT PARAMETER TheBldgID AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER TheCourseID AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER TheSectionID AS INTEGER NO-UNDO. DEFINE OUTPUT PARAMETER CourseStartDate AS DATE NO-UNDO. DEFINE OUTPUT PARAMETER CourseEndDate AS DATE NO-UNDO. /* Define Buffers */ DEFINE BUFFER MasterSchdMeets FOR master-schd-meets. DEFINE BUFFER SchdPeriod FOR schd-period. FIND FIRST SchdVersion NO-LOCK WHERE SchdVersion.school-year-id = PrimaryPeriod.school-year-id AND SchdVersion.bldg-id = TheBldgID AND SchdVersion.active-schedule = Yes NO-ERROR. IF NOT AVAILABLE SchdVersion THEN RETURN. FIND FIRST MasterSchd OF SchdVersion NO-LOCK WHERE MasterSchd.course-id = TheCourseID AND MasterSchd.section-id = TheSectionID NO-ERROR. IF NOT AVAILABLE MasterSchd THEN RETURN. /* Find the start/end dates for the course */ FOR EACH MasterSchdMeets OF MasterSchd NO-LOCK: /* Find the starting time */ FIND FIRST SchdPeriod NO-LOCK WHERE SchdPeriod.school-year-id = MasterSchdMeets.school-year-id AND SchdPeriod.bldg-id = MasterSchdMeets.bldg-id AND SchdPeriod.schd-version-id = MasterSchdMeets.schd-version-id AND SchdPeriod.schd-group-id = MasterSchd.schd-group-id AND SchdPeriod.schd-period-id = MasterSchdMeets.start-schd-period-id. /* Prime the variable values */ IF CourseStartDate = ? THEN ASSIGN CourseStartDate = SchdPeriod.start-date CourseEndDate = SchdPeriod.end-date. ELSE CourseStartDate = MIN(CourseStartDate, SchdPeriod.start-date). /* Handle differing start/end periods */ IF MasterSchdMeets.start-schd-period-id <> MasterSchdMeets.end-schd-period-id THEN FIND FIRST SchdPeriod NO-LOCK WHERE SchdPeriod.school-year-id = MasterSchdMeets.school-year-id AND SchdPeriod.bldg-id = MasterSchdMeets.bldg-id AND SchdPeriod.schd-version-id = MasterSchdMeets.schd-version-id AND SchdPeriod.schd-group-id = MasterSchd.schd-group-id AND SchdPeriod.schd-period-id = MasterSchdMeets.end-schd-period-id. /* Assign the max ending date */ CourseEndDate = MAX(CourseEndDate, SchdPeriod.end-date). END. END PROCEDURE. /* prv_CourseInSession */ /* This routine takes a given building and period range and returns */ /* the mark labels for those periods */ PROCEDURE prv_BldgPeriodLabels: /* Define Parameters */ DEFINE PARAMETER BUFFER TheBldg FOR building. DEFINE INPUT PARAMETER StartPeriodNum AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER EndPeriodNum AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER ShortLabels AS LOGICAL NO-UNDO. DEFINE OUTPUT PARAMETER LabelList AS CHARACTER INIT "" NO-UNDO. /* Define Variables */ DEFINE VARIABLE InlineList AS CHARACTER NO-UNDO. DEFINE VARIABLE PrefixList AS CHARACTER NO-UNDO. DEFINE VARIABLE SuffixList AS CHARACTER NO-UNDO. DEFINE VARIABLE TheMark AS CHARACTER NO-UNDO. DEFINE VARIABLE CourseEndDate AS DATE NO-UNDO. DEFINE VARIABLE CourseStartDate AS DATE NO-UNDO. DEFINE VARIABLE FinalMark AS CHARACTER NO-UNDO. DEFINE VARIABLE order AS INTEGER INITIAL 0 NO-UNDO. /* Define Buffers */ DEFINE BUFFER GradingPeriod FOR grading-period. DEFINE BUFFER GradingPeriodMark FOR grading-period-mark. DEFINE BUFFER GradingMark FOR grading-mark. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER FinalMarks FOR FinalMarks. DEFINE BUFFER SchdVersion FOR schd-version. FIND SchdVersion OF TheBldg NO-LOCK WHERE SchdVersion.active-schedule. /* If the labels are for one course check for a master-schd-mark entry */ IF AVAILABLE PrimaryCourse AND CAN-FIND(FIRST MasterSchdMark WHERE MasterSchdMark.school-year-id = TheBldg.school-year-id AND MasterSchdMark.bldg-id = TheBldg.bldg-id AND MasterSchdMark.schd-version-id = SchdVersion.schd-version-id AND MasterSchdMark.course-id = PrimaryCourse.course-id AND MasterSchdMark.section-id = PrimaryCourse.section-id) THEN /* Get the period labels for a master-schd-mark overide */ RUN GetMSMCourseLabelRange(PrimaryCourse.school-year-id, PrimaryCourse.bldg-id, PrimaryCourse.course-id, PrimaryCourse.section-id, StartPeriodNum, EndPeriodNum, ShortLabels, OUTPUT LabelList). ELSE DO: /* Process all periods in our range */ FOR EACH GradingPeriod OF TheBldg NO-LOCK WHERE GradingPeriod.grading-period-num >= StartPeriodNum AND GradingPeriod.grading-period-num <= EndPeriodNum BY GradingPeriod.school-year-id BY GradingPeriod.bldg-id BY GradingPeriod.grading-period-num: /* Process all marks in this period */ MarkLoop: FOR EACH GradingPeriodMark OF GradingPeriod BY GradingPeriodMark.school-year-id BY GradingPeriodMark.bldg-id BY GradingPeriodMark.grading-period-id BY GradingPeriodMark.mark-order: /* Load the Mark definition */ FIND GradingMark OF GradingPeriodMark NO-LOCK NO-ERROR. IF NOT AVAILABLE GradingMark THEN NEXT. /* Get the mark */ TheMark = (IF GradingMark.period-mark THEN GradingPeriod.grading-period-name ELSE IF ShortLabels THEN GradingMark.short-mark-name ELSE GradingMark.mark-name). /* Handle a 'final' mark */ IF GradingMark.final-mark THEN DO: /* If we have a primary course, we enable the checking to see */ /* if the course is really 'final' or not */ IF AVAILABLE PrimaryCourse THEN DO: /* Find the start/end date for the course */ RUN prv_CourseInSession(PrimaryCourse.bldg-id, PrimaryCourse.course-id, PrimaryCourse.section-id, OUTPUT CourseStartDate, OUTPUT CourseEndDate). /* See if this would be the 'final' period for the mark */ IF CourseEndDate < GradingPeriod.start-date OR CourseEndDate > GradingPeriod.end-date THEN NEXT MarkLoop. END. /* check for a temp-table entry for this mark */ FIND FIRST FinalMarks WHERE FinalMarks.mark-id = GradingMark.mark-id NO-LOCK NO-ERROR. /* If we didn't find it, create it */ IF NOT AVAILABLE FinalMarks THEN DO: CREATE FinalMarks. ASSIGN order = order + 1 FinalMarks.InsertOrder = order FinalMarks.mark-id = GradingMark.mark-id. END. /* Skip if nothing to record */ IF TheMark = "" THEN NEXT MarkLoop. FinalMarks.TheValue = TheMark. /* Iterate */ NEXT MarkLoop. END. /* See where to add the mark */ CASE GradingMark.position-in-list: WHEN "Prefix" THEN PrefixList = PrefixList + "," + TheMark. WHEN "Inline" THEN InlineList = InlineList + "," + TheMark. WHEN "Suffix" THEN SuffixList = SuffixList + "," + TheMark. END. END. END. /* Piece the list together */ IF LENGTH(PrefixList) <> 0 THEN {gradutil.i ADD-TO-LIST LabelList SUBSTR(PrefixList,2)} IF LENGTH(InlineList) <> 0 THEN {gradutil.i ADD-TO-LIST LabelList SUBSTR(InLineList,2)} IF LENGTH(SuffixList) <> 0 THEN {gradutil.i ADD-TO-LIST LabelList SUBSTR(SuffixList,2)} /* add the final marks */ FOR EACH FinalMarks BY FinalMarks.InsertOrder: {gradutil.i ADD-TO-LIST LabelList STRING(FinalMarks.TheValue)} DELETE FinalMarks NO-ERROR. END. END. END PROCEDURE. /* prv_BldgPeriodLabels */ /* See if the course is enabled --- We don't need this procedure... It does the same thing as the procedure above... It is being called when a fifth parameter is passed to gradutil.i for COURSE-ENABLED... Not killing it just in case its being called from somwhere sneaky */ PROCEDURE GetMSMCourseEnabled: /* Define Parameters */ DEFINE PARAMETER BUFFER TheCourse FOR master-schd. DEFINE OUTPUT PARAMETER EnabledFlag AS LOGICAL INITIAL No NO-UNDO. /* Define Variables */ DEFINE VARIABLE CourseEndDate AS DATE NO-UNDO. DEFINE VARIABLE CourseStartDate AS DATE NO-UNDO. /* Define buffers */ DEFINE BUFFER MasterSchdMark FOR master-schd-mark. /* Check if this course has a master-schd-mark override */ FIND FIRST MasterSchdMark NO-LOCK WHERE MasterSchdMark.school-year-id = TheCourse.school-year-id AND MasterSchdMark.bldg-id = TheCourse.bldg-id AND MasterSchdMark.schd-version-id = TheCourse.schd-version-id AND MasterSchdMark.course-id = TheCourse.course-id AND MasterSchdMark.section-id = TheCourse.section-id AND MasterSchdMark.record-grading-period-id = PrimaryPeriod.grading-period-id NO-ERROR. /* If checking for a single course, and a master-schd-mark overide and the single grading period is not the same as the entry grading period for the override, then reject the course */ IF AVAILABLE PrimaryPeriod AND AVAILABLE MasterSchdMark AND PrimaryPeriod.grading-period-id <> MasterSchdMark.record-grading-period-id THEN RETURN. /* If not a master-schd-mark override check course dates */ IF NOT AVAILABLE MasterSchdMark THEN DO: /* Find the start/end date for the course */ RUN prv_CourseInSession(TheCourse.bldg-id, TheCourse.course-id, TheCourse.section-id, OUTPUT CourseStartDate, OUTPUT CourseEndDate). /* See if the course is in our date range or not */ IF CourseEndDate < PrimaryPeriod.start-date OR CourseStartDate > PrimaryPeriod.end-date THEN LEAVE. END. /* Mark the course in use */ EnabledFlag = Yes. END PROCEDURE. /* GetMSMCourseEnabled */ /* -------------- */ /* Main line code */ RETURN.