/* tranutil.p - transcript grade handling utilities */ /* Include commons */ {common.i} {listutil.i DEFINE NEW} {gradutil.i DEFINE NEW} /* An overridable, master grading policy. When not ?, this will be the */ /* grading policy that tranutil 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 temp tables */ /* For each year/bldg, a ordered list of marks that represents that */ /* school year and buildings marking pattern. The final mark, if any */ /* is special in that the grading-period-id is set to ? */ DEFINE TEMP-TABLE MarkItem NO-UNDO FIELD school-year-id LIKE grading-period.school-year-id FIELD bldg-id LIKE grading-period.bldg-id FIELD grading-period-id LIKE grading-period.grading-period-id FIELD mark-id LIKE grading-mark.mark-id FIELD mark-order AS INTEGER FIELD transcript-mark LIKE grading-mark.transcript-mark FIELD transcript-order AS INTEGER FIELD transcript-name AS CHARACTER FIELD period-mark LIKE grading-mark.period-mark FIELD mark-name AS CHARACTER FIELD final-mark LIKE grading-mark.final-mark FIELD use-disposition LIKE grading-mark.use-disposition-code INDEX MarkOrder school-year-id bldg-id mark-order INDEX TranOrder school-year-id bldg-id transcript-mark transcript-order. /* This is a list of only the grading periods where the final mark */ /* was enabled. When trying to find a final mark for a student, */ /* this table is consulted */ DEFINE TEMP-TABLE FinalMark NO-UNDO FIELD school-year-id LIKE grading-period.school-year-id FIELD bldg-id LIKE grading-period.bldg-id FIELD grading-period-id LIKE grading-period.grading-period-id FIELD mark-id LIKE grading-mark.mark-id FIELD final-order AS INTEGER INDEX FinalOrder school-year-id bldg-id final-order. /* Check/Load the MarkItem temp-table for a passed year/bldg */ PROCEDURE LoadBldgMarks: /* Define Parameters */ DEFINE INPUT PARAMETER SchoolYearID LIKE school-year.school-year-id NO-UNDO. DEFINE INPUT PARAMETER BldgID LIKE building.bldg-id NO-UNDO. DEFINE OUTPUT PARAMETER MarkCnt AS INTEGER NO-UNDO. DEFINE OUTPUT PARAMETER TranscriptCnt AS INTEGER NO-UNDO. /* Define Variables */ DEFINE VARIABLE FinalCnt AS INTEGER INITIAL 0 NO-UNDO. DEFINE VARIABLE PrefixCnt AS INTEGER INITIAL 1000 NO-UNDO. DEFINE VARIABLE InfixCnt AS INTEGER INITIAL 10000 NO-UNDO. DEFINE VARIABLE SuffixCnt AS INTEGER INITIAL 100000 NO-UNDO. DEFINE VARIABLE MarkPtr AS INTEGER NO-UNDO. /* for keeping final marks in order */ DEFINE VARIABLE FinalPtr AS INTEGER INITIAL 999 NO-UNDO. /* Define Buffers */ DEFINE BUFFER MarkItem FOR MarkItem. DEFINE BUFFER GradePeriod FOR grading-period. DEFINE BUFFER GradeMark FOR grading-period-mark. DEFINE BUFFER TheMark FOR grading-mark. DEFINE BUFFER FinalMark FOR FinalMark. DEFINE BUFFER otherMark FOR FinalMark. /* See if we are already on-line */ FIND LAST MarkItem WHERE MarkItem.school-year-id = SchoolYearID AND MarkItem.bldg-id = BldgID USE-INDEX MarkOrder NO-ERROR. IF AVAILABLE MarkItem THEN DO: /* Record the last mark # */ MarkCnt = MarkItem.mark-order. /* Get last transcript record */ FIND LAST MarkItem WHERE MarkItem.school-year-id = SchoolYearID AND MarkItem.bldg-id = BldgID AND MarkItem.transcript-mark = Yes USE-INDEX TranOrder. TranscriptCnt = MarkItem.transcript-order. /* We are done */ RETURN. END. /* Load the file */ PeriodLoop: FOR EACH GradePeriod NO-LOCK WHERE GradePeriod.school-year-id = SchoolYearID AND GradePeriod.bldg-id = BldgID BY GradePeriod.school-year-id BY GradePeriod.bldg-id BY GradePeriod.start-date BY GradePeriod.end-date: /* Process enabled marks for the period */ MarkLoop: FOR EACH GradeMark OF GradePeriod NO-LOCK, FIRST TheMark OF GradeMark NO-LOCK BY GradeMark.school-year-id BY GradeMark.bldg-id BY GradeMark.grading-period-id BY GradeMark.mark-order: IF TheMark.final-mark THEN DO: /* Discard repeated final marks */ FIND FIRST FinalMark WHERE FinalMark.school-year-id = GradePeriod.school-year-id AND FinalMark.bldg-id = GradePeriod.bldg-id AND FinalMark.grading-period-id = GradePeriod.grading-period-id AND FinalMark.mark-id = TheMark.mark-id NO-ERROR. IF NOT AVAILABLE FinalMark THEN DO: /* Record the final mark */ CREATE FinalMark. ASSIGN FinalMark.school-year-id = GradePeriod.school-year-id FinalMark.bldg-id = GradePeriod.bldg-id FinalMark.grading-period-id = GradePeriod.grading-period-id FinalMark.mark-id = TheMark.mark-id FinalMark.final-order = finalPtr + 1. END. ELSE DO: NEXT MarkLoop. END. /* Assign 'end of the line' order to the mark */ ASSIGN finalPtr = finalPtr + 1 MarkPtr = finalPtr. IF CAN-FIND(FIRST OtherMark NO-LOCK WHERE OtherMark.school-year-id = FinalMark.school-year-id AND OtherMark.bldg-id = FinalMark.bldg-id AND OtherMark.mark-id = FinalMark.mark-id AND RECID(OtherMark) <> RECID(FinalMark)) THEN NEXT MarkLoop. END. ELSE CASE TheMark.position-in-list: WHEN "Prefix" THEN ASSIGN PrefixCnt = PrefixCnt + 1 MarkPtr = PrefixCnt. WHEN "Suffix" THEN ASSIGN SuffixCnt = SuffixCnt + 1 MarkPtr = SuffixCnt. WHEN "Inline" THEN ASSIGN InfixCnt = InfixCnt + 1 MarkPtr = InfixCnt. END. /* Create an entry */ CREATE MarkItem. ASSIGN MarkItem.school-year-id = GradePeriod.school-year-id MarkItem.bldg-id = GradePeriod.bldg-id MarkItem.grading-period-id = IF TheMark.final-mark THEN ? ELSE GradePeriod.grading-period-id MarkItem.mark-id = GradeMark.mark-id MarkItem.mark-order = MarkPtr MarkItem.transcript-mark = TheMark.transcript-mark MarkItem.transcript-name = TheMark.short-mark-name MarkItem.period-mark = TheMark.period-mark MarkItem.final-mark = TheMark.final-mark MarkItem.mark-name = IF TheMark.period-mark THEN STRING(GradePeriod.grading-period-num) ELSE TheMark.short-mark-name MarkItem.use-disposition = TheMark.use-disposition-code. END. END. /* Init Counters */ ASSIGN MarkCnt = 0 TranscriptCnt = 0. /* Reorder list */ FOR EACH MarkItem WHERE MarkItem.school-year-id = SchoolYearID AND MarkItem.bldg-id = BldgID AND MarkItem.final-mark = NO BY MarkItem.school-year-id BY MarkItem.bldg-id BY MarkItem.mark-order: /* Update mark counter */ ASSIGN MarkCnt = MarkCnt + 1 MarkItem.mark-order = MarkCnt. /* Handle transcript mark */ IF MarkItem.transcript-mark THEN ASSIGN TranscriptCnt = TranscriptCnt + 1 MarkItem.transcript-order = TranscriptCnt. /* Fix transcriptable names, (unless they are the final grade) */ IF MarkItem.transcript-mark AND NOT MarkItem.final-mark THEN MarkItem.transcript-name = MarkItem.transcript-name + STRING(TranscriptCnt). END. FOR EACH MarkItem WHERE MarkItem.school-year-id = SchoolYearID AND MarkItem.bldg-id = BldgID AND MarkItem.final-mark = YES BY MarkItem.school-year-id BY MarkItem.bldg-id BY MarkItem.mark-order: /* Update mark counter */ ASSIGN MarkCnt = MarkCnt + 1 MarkItem.mark-order = MarkCnt. /* Handle transcript mark */ IF MarkItem.transcript-mark THEN ASSIGN TranscriptCnt = TranscriptCnt + 1 MarkItem.transcript-order = TranscriptCnt. /* Fix transcriptable names, (unless they are the final grade) */ IF MarkItem.transcript-mark AND NOT MarkItem.final-mark THEN MarkItem.transcript-name = MarkItem.transcript-name + STRING(TranscriptCnt). END. END. /* Set a master grading policy */ PROCEDURE SetGradingPolicy: /* Define Parameters */ DEFINE INPUT PARAMETER TheGradingPolicy AS CHARACTER NO-UNDO. /* set the policy */ MasterGradingPolicy = TheGradingPolicy. END. /* Get the grading policy for the passed stu-grade record */ PROCEDURE GradingPolicy: /* Define Parameters */ DEFINE PARAMETER BUFFER StuTranCourse FOR stu-transcript-course. DEFINE OUTPUT PARAMETER GradingPolicy AS CHARACTER INITIAL ? NO-UNDO. /* Define Buffers */ DEFINE BUFFER SchdVersion FOR schd-version. DEFINE BUFFER StuSchd FOR stu-schedule. DEFINE BUFFER MasterSchd FOR master-schd. DEFINE BUFFER CourseCatalog FOR course-catalog. /* Handle a high level override */ IF MasterGradingPolicy <> ? THEN DO: GradingPolicy = MasterGradingPolicy. RETURN. END. /* See if there is a specific grading policy for the course */ IF StuTranCourse.override-grading-policy THEN DO: GradingPolicy = StuTranCourse.grading-policy. RETURN. END. /* See if this is a 'automatic' course */ IF StuTranCourse.section-id <> ? THEN DO: /* Load active schedule version */ FIND FIRST SchdVersion NO-LOCK WHERE SchdVersion.school-year-id = StuTranCourse.school-year-id AND SchdVersion.bldg-id = StuTranCourse.bldg-id AND SchdVersion.active-schedule = Yes NO-ERROR. IF AVAILABLE SchdVersion THEN DO: FIND FIRST StuSchd NO-LOCK WHERE StuSchd.school-year-id = SchdVersion.school-year-id AND StuSchd.bldg-id = SchdVersion.bldg-id AND StuSchd.schd-version-id = SchdVersion.schd-version-id AND StuSchd.course-id = StuTranCourse.course-id AND StuSchd.section-id = StuTranCourse.section-id AND StuSchd.current-entry = Yes AND StuSchd.stu-seq = StuTranCourse.stu-seq NO-ERROR. IF AVAILABLE StuSchd AND StuSchd.override-grading-policy THEN DO: GradingPolicy = StuSchd.grading-policy. RETURN. END. /* Try for the master schedule */ FIND FIRST MasterSchd NO-LOCK WHERE MasterSchd.school-year-id = SchdVersion.school-year-id AND MasterSchd.bldg-id = SchdVersion.bldg-id AND MasterSchd.schd-version-id = SchdVersion.schd-version-id AND MasterSchd.course-id = StuTranCourse.course-id AND MasterSchd.section-id = StuTranCourse.section-id NO-ERROR. IF AVAILABLE MasterSchd THEN DO: GradingPolicy = MasterSchd.grading-policy. RETURN. END. END. END. /* Lookup the course */ FIND FIRST CourseCatalog NO-LOCK WHERE CourseCatalog.school-year-id = StuTranCourse.school-year-id AND CourseCatalog.bldg-id = StuTranCourse.bldg-id AND CourseCatalog.course-id = StuTranCourse.course-id NO-ERROR. IF AVAILABLE CourseCatalog THEN DO: GradingPolicy = CourseCatalog.grading-policy. RETURN. END. /* Default grading policy */ GradingPolicy = "Letter". END. /* Get transcriptable labels list */ PROCEDURE GetTranLabels: /* Define Parameters */ DEFINE INPUT PARAMETER SchoolYearID LIKE school-year.school-year-id NO-UNDO. DEFINE INPUT PARAMETER BldgID LIKE building.bldg-id NO-UNDO. DEFINE OUTPUT PARAMETER LabelList AS CHARACTER NO-UNDO. /* Define Variables */ DEFINE VARIABLE MarkCnt AS INTEGER NO-UNDO. DEFINE VARIABLE TranCnt AS INTEGER NO-UNDO. /* Define Buffers */ DEFINE BUFFER MarkItem FOR MarkItem. /* Make sure the building is loaded */ RUN LoadBldgMarks(SchoolYearID, BldgID, OUTPUT MarkCnt, OUTPUT TranCnt). /* Process them there transcript marks */ FOR EACH MarkItem WHERE MarkItem.school-year-id = SchoolYearID AND MarkItem.bldg-id = BldgID AND MarkItem.transcript-mark = Yes BY MarkItem.school-year-id BY MarkItem.bldg-id BY MarkItem.transcript-mark BY MarkItem.transcript-order: LabelList = LabelList + "," + MarkItem.transcript-name. END. /* Clear off leader */ SUBSTR(LabelList, 1, 1) = "". END. /* Get transcriptable idents list */ PROCEDURE GetTranIdents: /* Define Parameters */ DEFINE INPUT PARAMETER SchoolYearID LIKE school-year.school-year-id NO-UNDO. DEFINE INPUT PARAMETER BldgID LIKE building.bldg-id NO-UNDO. DEFINE OUTPUT PARAMETER IdentList AS CHARACTER NO-UNDO. /* Define Variables */ DEFINE VARIABLE MarkCnt AS INTEGER NO-UNDO. DEFINE VARIABLE TranCnt AS INTEGER NO-UNDO. /* Define Buffers */ DEFINE BUFFER MarkItem FOR MarkItem. /* Make sure the building is loaded */ RUN LoadBldgMarks(SchoolYearID, BldgID, OUTPUT MarkCnt, OUTPUT TranCnt). /* Process them there transcript marks */ FOR EACH MarkItem WHERE MarkItem.school-year-id = SchoolYearID AND MarkItem.bldg-id = BldgID AND MarkItem.transcript-mark = Yes BY MarkItem.school-year-id BY MarkItem.bldg-id BY MarkItem.transcript-mark BY MarkItem.transcript-order: IdentList = IdentList + "," + STRING(MarkItem.mark-order). END. /* Clear off leader */ SUBSTR(IdentList, 1, 1) = "". END. /* Get transcriptable idents list */ PROCEDURE GetDispositionIdents: /* Define Parameters */ DEFINE INPUT PARAMETER SchoolYearID LIKE school-year.school-year-id NO-UNDO. DEFINE INPUT PARAMETER BldgID LIKE building.bldg-id NO-UNDO. DEFINE OUTPUT PARAMETER IdentList AS CHARACTER NO-UNDO. /* Define Variables */ DEFINE VARIABLE MarkCnt AS INTEGER NO-UNDO. DEFINE VARIABLE TranCnt AS INTEGER NO-UNDO. /* Define Buffers */ DEFINE BUFFER MarkItem FOR MarkItem. /* Make sure the building is loaded */ RUN LoadBldgMarks(SchoolYearID, BldgID, OUTPUT MarkCnt, OUTPUT TranCnt). /* Process them there transcript marks */ FOR EACH MarkItem WHERE MarkItem.school-year-id = SchoolYearID AND MarkItem.bldg-id = BldgID AND MarkItem.use-disposition = Yes BY MarkItem.school-year-id BY MarkItem.bldg-id BY MarkItem.transcript-order: IdentList = IdentList + "," + STRING(MarkItem.mark-order). END. /* Clear off leader */ SUBSTR(IdentList, 1, 1) = "". END. /* Get a list of grading periods for which the course takes marks list */ PROCEDURE GetTranGradingPeriods: /* Define Parameters */ DEFINE PARAMETER BUFFER StuTranCourse FOR stu-transcript-course. DEFINE OUTPUT PARAMETER PeriodList AS CHARACTER NO-UNDO. /* Define Variables */ DEFINE VARIABLE MarkCnt AS INTEGER NO-UNDO. DEFINE VARIABLE TranCnt AS INTEGER NO-UNDO. DEFINE VARIABLE TheMark AS CHARACTER NO-UNDO. DEFINE VARIABLE TheDisposition AS CHARACTER NO-UNDO. DEFINE VARIABLE GradingPolicy AS CHARACTER NO-UNDO. /* Define Buffers */ DEFINE BUFFER MarkItem FOR MarkItem. DEFINE BUFFER FinalMark FOR FinalMark. DEFINE BUFFER StuTranMark FOR stu-transcript-mark. DEFINE BUFFER StuTranYear FOR stu-transcript-year. DEFINE BUFFER CourseGrade FOR course-level-grade. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER GradingBldgXlate FOR grading-bldg-xlate. DEFINE BUFFER SchdVersion FOR schd-version. DEFINE BUFFER GradePeriod FOR grading-period. DEFINE BUFFER CourseDisposition FOR course-disposition. DEFINE BUFFER xlateLookup FOR grading-bldg-xlate. /* Make sure the building is loaded */ RUN LoadBldgMarks(StuTranCourse.school-year-id, StuTranCourse.bldg-id, OUTPUT MarkCnt, OUTPUT TranCnt). /* Get the grading policy */ RUN GradingPolicy(BUFFER StuTranCourse, OUTPUT GradingPolicy). /* fetch the stuTranYear */ FIND FIRST StuTranYear NO-LOCK WHERE StuTranYear.stu-seq = StuTranCourse.stu-seq AND StuTranYear.transcript-id = StuTranCourse.transcript-id AND StuTranYear.school-year-id = StuTranCourse.school-year-id. /* Process them there transcript marks */ MarkLoop: FOR EACH MarkItem NO-LOCK WHERE MarkItem.school-year-id = StuTranCourse.school-year-id AND MarkItem.bldg-id = StuTranYear.bldg-id AND MarkItem.transcript-mark = Yes BY MarkItem.school-year-id BY MarkItem.bldg-id BY MarkItem.transcript-mark BY MarkItem.transcript-order: FIND FIRST SchdVersion NO-LOCK WHERE (SchdVersion.school-year-id = StuTranCourse.school-year-id) AND (SchdVersion.bldg-id = StuTranCourse.bldg-id) AND (SchdVersion.active-schedule = Yes). FIND FIRST MasterSchdMark NO-LOCK WHERE MasterSchdMark.school-year-id = StuTranCourse.school-year-id AND MasterSchdMark.bldg-id = StuTranCourse.bldg-id AND MasterSchdMark.schd-version-id = SchdVersion.schd-version-id AND MasterSchdMark.course-id = StuTranCourse.course-id AND MasterSchdMark.section-id = StuTranCourse.section-id NO-ERROR. IF StuTranCourse.bldg-id <> StuTranYear.bldg-id THEN DO: /* xlate the mark */ /* MarkItem is the Grading Period Mark in the student's home building */ IF MarkItem.grading-period-id <> ? THEN DO: FIND FIRST GradingBldgXlate NO-LOCK WHERE (GradingBldgXlate.school-year-id = StuTranYear.school-year-id) AND (GradingBldgXlate.bldg-id = StuTranYear.bldg-id) AND (GradingBldgXlate.grading-period-id = MarkItem.grading-period-id) AND (GradingBldgXlate.mark-id = MarkItem.mark-id) AND (GradingBldgXlate.xlate-bldg-id = StuTranCourse.bldg-id) NO-ERROR. IF NOT AVAILABLE GradingBldgXlate THEN DO: NEXT MarkLoop. END. /* Only bother with checking multiples if we have multi-mappings */ IF CAN-FIND(FIRST xlateLookup WHERE xlateLookup.school-year-id = StuTranYear.school-year-id AND xlateLookup.bldg-id = StuTranYear.bldg-id AND xlateLookup.grading-period-id = MarkItem.grading-period-id AND xlateLookup.mark-id = MarkItem.mark-id AND xlateLookup.xlate-bldg-id = StuTranCourse.bldg-id AND RECID(xlateLookup) <> RECID(GradingBldgXlate)) THEN multiBlock: DO: /* We'll spit back the first one we come to that matches, or if we don't find any marks, we'll leave the current buffer alone */ FOR EACH xlateLookup NO-LOCK WHERE xlateLookup.school-year-id = StuTranYear.school-year-id AND xlateLookup.bldg-id = StuTranYear.bldg-id AND xlateLookup.grading-period-id = MarkItem.grading-period-id AND xlateLookup.mark-id = MarkItem.mark-id AND xlateLookup.xlate-bldg-id = StuTranCourse.bldg-id: /* We're permissive here -- when we find a mark, we go with it */ FIND StuTranMark NO-LOCK WHERE StuTranMark.stu-seq = StuTranCourse.stu-seq AND StuTranMark.transcript-id = StuTranCourse.transcript-id AND StuTranMark.transcript-seq = StuTranCourse.transcript-seq AND StuTranMark.grading-period-id = GradingBldgXlate.xlate-grading-period-id AND StuTranMark.mark-id = GradingBldgXlate.xlate-mark-id NO-ERROR. IF AVAILABLE StuTranMark THEN DO: FIND GradingBLdgXlate NO-LOCK WHERE RECID(GradingBldgXlate) = RECID(xlateLookup). LEAVE multiBlock. END. END. /* each possible mapping */ END. /* multiblock (CAN-FIND) */ END. ELSE DO: /* we are looking for a final mark */ FOR EACH FinalMark NO-LOCK WHERE (FinalMark.school-year-id = StuTranYear.school-year-id) AND (FinalMark.bldg-id = StuTranYear.bldg-id) AND (FinalMark.mark-id = MarkItem.mark-id) BY FinalMark.final-order DESCENDING: FIND FIRST GradingBldgXlate NO-LOCK WHERE (GradingBldgXlate.school-year-id = StuTranYear.school-year-id) AND (GradingBldgXlate.bldg-id = StuTranYear.bldg-id) AND (GradingBldgXlate.mark-id = MarkItem.mark-id) AND (GradingBldgXlate.grading-period-id = FinalMark.grading-period-id) AND (GradingBldgXlate.xlate-bldg-id = StuTranCourse.bldg-id) NO-ERROR. IF NOT AVAILABLE GradingBldgXlate THEN NEXT. /* See if this grade has been awarded */ FIND StuTranMark NO-LOCK WHERE StuTranMark.stu-seq = StuTranCourse.stu-seq AND StuTranMark.transcript-id = StuTranCourse.transcript-id AND StuTranMark.transcript-seq = StuTranCourse.transcript-seq AND StuTranMark.grading-period-id = GradingBldgXlate.xlate-grading-period-id AND StuTranMark.mark-id = GradingBldgXlate.xlate-mark-id NO-ERROR. IF NOT AVAILABLE StuTranMark THEN NEXT. /* Got it ! */ LEAVE. END. IF NOT AVAILABLE GradingBldgXlate OR NOT AVAILABLE FinalMark THEN NEXT MarkLoop. END. /* if we got here, we sucessfully translated the other building mark */ /* to the home building. Now, check for a MSM Override */ IF AVAILABLE MasterSchdMark THEN DO: /* reseek to find the correct MasterSchdMark */ FIND FIRST MasterSchdMark NO-LOCK WHERE MasterSchdMark.school-year-id = StuTranCourse.school-year-id AND MasterSchdMark.bldg-id = StuTranCourse.bldg-id AND MasterSchdMark.schd-version-id = SchdVersion.schd-version-id AND MasterSchdMark.course-id = StuTranCourse.course-id AND MasterSchdMark.section-id = StuTranCourse.section-id AND MasterSchdMark.record-grading-period-id = GradingBldgXlate.xlate-grading-period-id AND MasterSchdMark.record-mark-id = GradingBldgXlate.xlate-mark-id NO-ERROR. IF NOT AVAILABLE MasterSchdMark THEN DO: NEXT MarkLoop. END. END. /* now we can find the grade */ FIND StuTranMark NO-LOCK WHERE StuTranMark.stu-seq = StuTranCourse.stu-seq AND StuTranMark.transcript-id = StuTranCourse.transcript-id AND StuTranMark.transcript-seq = StuTranCourse.transcript-seq AND StuTranMark.grading-period-id = GradingBldgXlate.xlate-grading-period-id AND StuTranMark.mark-id = GradingBldgXlate.xlate-mark-id NO-ERROR. IF AVAILABLE StuTranMark THEN DO: PeriodList = PeriodList + "," + STRING(StuTranMark.grading-period-id). /* Handle the student having or not having the mark */ FIND CourseGrade OF StuTranMark NO-LOCK NO-ERROR. IF MarkItem.use-disposition THEN DO: TheDisposition = "?". FIND CourseDisposition OF StuTranMark NO-LOCK NO-ERROR. IF AVAILABLE CourseDisposition THEN TheDisposition = CourseDisposition.course-disposition-code. END. ELSE TheDisposition = "". /* Lookup the mark */ IF AVAILABLE CourseGrade THEN CASE GradingPolicy: WHEN "Letter" THEN TheMark = CourseGrade.letter-grade. WHEN "Numeric" THEN TheMark = TRIM(STRING(CourseGrade.numeric-grade-high, ">>9.99")). WHEN "Pass/Fail" THEN TheMark = STRING(Coursegrade.pass-fail, "Pass/Fail"). END. ELSE TheMark = "???". END. ELSE DO: TheMark = "". END. NEXT MarkLoop. END. /* If we get to this point, the course is in the student's home buidling */ /* Handle normal vs final marks */ IF MarkItem.final-mark THEN DO: FinalLoop: FOR EACH StuTranMark NO-LOCK WHERE StuTranMark.stu-seq = StuTranCourse.stu-seq AND StuTranMark.transcript-id = StuTranCourse.transcript-id AND StuTranMark.transcript-seq = StuTranCourse.transcript-seq AND StuTranMark.mark-id = MarkItem.mark-id, GradePeriod OF StuTranMark NO-LOCK BY GradePeriod.grading-period-num DESCENDING: LEAVE FinalLoop. END. END. ELSE /* Get the grade */ FIND StuTranMark NO-LOCK WHERE StuTranMark.stu-seq = StuTranCourse.stu-seq AND StuTranMark.transcript-id = StuTranCourse.transcript-id AND StuTranMark.transcript-seq = StuTranCourse.transcript-seq AND StuTranMark.grading-period-id = MarkItem.grading-period-id AND StuTranMark.mark-id = MarkItem.mark-id NO-ERROR. /* Handle the student having or not having the mark */ IF AVAILABLE StuTranMark THEN DO: PeriodList = PeriodList + "," + STRING(StuTranMark.grading-period-id). /* Lookup the mark */ FIND CourseGrade OF StuTranMark NO-LOCK NO-ERROR. IF MarkItem.use-disposition THEN DO: TheDisposition = "?". FIND CourseDisposition OF StuTranMark NO-LOCK NO-ERROR. IF AVAILABLE CourseDisposition THEN TheDisposition = CourseDisposition.course-disposition-code. END. ELSE TheDisposition = "". IF AVAILABLE CourseGrade THEN CASE GradingPolicy: WHEN "Letter" THEN TheMark = CourseGrade.letter-grade. WHEN "Numeric" THEN TheMark = TRIM(STRING(CourseGrade.numeric-grade-high, ">>9.99")). WHEN "Pass/Fail" THEN TheMark = STRING(Coursegrade.pass-fail, "Pass/Fail"). END. ELSE TheMark = "???". END. ELSE DO: TheMark = "". END. /* Add the mark to the list */ END. /* Clear off leader */ SUBSTR(PeriodList, 1, 1) = "". END. /* GetTranGradingPeriods */ /* Get transcriptable grades list */ PROCEDURE GetTranGrades: /* Define Parameters */ DEFINE PARAMETER BUFFER StuTranCourse FOR stu-transcript-course. DEFINE OUTPUT PARAMETER GradeList AS CHARACTER NO-UNDO. DEFINE OUTPUT PARAMETER DispositionList AS CHARACTER NO-UNDO. /* Define Variables */ DEFINE VARIABLE MarkCnt AS INTEGER NO-UNDO. DEFINE VARIABLE TranCnt AS INTEGER NO-UNDO. DEFINE VARIABLE TheMark AS CHARACTER NO-UNDO. DEFINE VARIABLE TheDisposition AS CHARACTER NO-UNDO. DEFINE VARIABLE GradingPolicy AS CHARACTER NO-UNDO. /* Define Buffers */ DEFINE BUFFER MarkItem FOR MarkItem. DEFINE BUFFER FinalMark FOR FinalMark. DEFINE BUFFER StuTranMark FOR stu-transcript-mark. DEFINE BUFFER StuTranYear FOR stu-transcript-year. DEFINE BUFFER CourseGrade FOR course-level-grade. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER GradingBldgXlate FOR grading-bldg-xlate. DEFINE BUFFER SchdVersion FOR schd-version. DEFINE BUFFER GradePeriod FOR grading-period. DEFINE BUFFER CourseDisposition FOR course-disposition. DEFINE BUFFER xlateLookup FOR grading-bldg-xlate. /* Get the grading policy */ RUN GradingPolicy(BUFFER StuTranCourse, OUTPUT GradingPolicy). /* fetch the stuTranYear */ FIND FIRST StuTranYear NO-LOCK WHERE StuTranYear.stu-seq = StuTranCourse.stu-seq AND StuTranYear.transcript-id = StuTranCourse.transcript-id AND StuTranYear.school-year-id = StuTranCourse.school-year-id. /* Make sure the course building is loaded */ RUN LoadBldgMarks(StuTranCourse.school-year-id, StuTranCourse.bldg-id, OUTPUT MarkCnt, OUTPUT TranCnt). /* Make sure the home building is loaded */ RUN LoadBldgMarks(StuTranCourse.school-year-id, StuTranYear.bldg-id, OUTPUT MarkCnt, OUTPUT TranCnt). /* Process them there transcript marks */ MarkLoop: FOR EACH MarkItem NO-LOCK WHERE MarkItem.school-year-id = StuTranCourse.school-year-id AND MarkItem.bldg-id = StuTranYear.bldg-id AND MarkItem.transcript-mark = Yes BY MarkItem.school-year-id BY MarkItem.bldg-id BY MarkItem.transcript-mark BY MarkItem.transcript-order: FIND FIRST SchdVersion NO-LOCK WHERE (SchdVersion.school-year-id = StuTranCourse.school-year-id) AND (SchdVersion.bldg-id = StuTranCourse.bldg-id) AND (SchdVersion.active-schedule = Yes). FIND FIRST MasterSchdMark NO-LOCK WHERE MasterSchdMark.school-year-id = StuTranCourse.school-year-id AND MasterSchdMark.bldg-id = StuTranCourse.bldg-id AND MasterSchdMark.schd-version-id = SchdVersion.schd-version-id AND MasterSchdMark.course-id = StuTranCourse.course-id AND MasterSchdMark.section-id = StuTranCourse.section-id NO-ERROR. IF StuTranCourse.bldg-id <> StuTranYear.bldg-id THEN DO: /* xlate the mark */ IF MarkItem.grading-period-id <> ? THEN DO: FIND FIRST GradingBldgXlate NO-LOCK WHERE (GradingBldgXlate.school-year-id = StuTranYear.school-year-id) AND (GradingBldgXlate.bldg-id = StuTranYear.bldg-id) AND (GradingBldgXlate.grading-period-id = MarkItem.grading-period-id) AND (GradingBldgXlate.mark-id = MarkItem.mark-id) AND (GradingBldgXlate.xlate-bldg-id = StuTranCourse.bldg-id) NO-ERROR. IF NOT AVAILABLE GradingBldgXlate THEN DO: GradeList = GradeList + "," + "". DispositionList = DispositionList + "," + IF MarkItem.use-disposition THEN "?" ELSE "". NEXT MarkLoop. END. /* Do we have potential multiple marks mapped to the same home mark? */ IF CAN-FIND(FIRST xlateLookup WHERE xlateLookup.school-year-id = StuTranYear.school-year-id AND xlateLookup.bldg-id = StuTranYear.bldg-id AND xlateLookup.grading-period-id = MarkItem.grading-period-id AND xlateLookup.mark-id = MarkItem.mark-id AND xlateLookup.xlate-bldg-id = StuTranCourse.bldg-id AND RECID(xlateLookup) <> RECID(GradingBldgXlate)) THEN MultiBlock: DO: /* We'll spit back the first one we come to that matches, or if we don't find any marks, we'll leave the current buffer alone */ FOR EACH xlateLookup NO-LOCK WHERE xlateLookup.school-year-id = StuTranYear.school-year-id AND xlateLookup.bldg-id = StuTranYear.bldg-id AND xlateLookup.grading-period-id = MarkItem.grading-period-id AND xlateLookup.mark-id = MarkItem.mark-id AND xlateLookup.xlate-bldg-id = StuTranCourse.bldg-id: /* We're permissive here -- when we find a mark, we go with it */ FIND StuTranMark NO-LOCK WHERE StuTranMark.stu-seq = StuTranCourse.stu-seq AND StuTranMark.transcript-id = StuTranCourse.transcript-id AND StuTranMark.transcript-seq = StuTranCourse.transcript-seq AND StuTranMark.grading-period-id = xlateLookup.xlate-grading-period-id AND StuTranMark.mark-id = xlateLookup.xlate-mark-id NO-ERROR. IF AVAILABLE StuTranMark THEN DO: FIND GradingBLdgXlate NO-LOCK WHERE RECID(GradingBldgXlate) = RECID(xlateLookup). LEAVE multiBlock. END. END. /* each possible mapping */ END. /* multiblock (CAN-FIND) */ END. ELSE DO: /* we are looking for a final mark */ FOR EACH FinalMark NO-LOCK WHERE (FinalMark.school-year-id = StuTranYear.school-year-id) AND (FinalMark.bldg-id = StuTranYear.bldg-id) AND (FinalMark.mark-id = MarkItem.mark-id) BY FinalMark.final-order DESCENDING: FIND FIRST GradingBldgXlate NO-LOCK WHERE (GradingBldgXlate.school-year-id = StuTranYear.school-year-id) AND (GradingBldgXlate.bldg-id = StuTranYear.bldg-id) AND (GradingBldgXlate.mark-id = MarkItem.mark-id) AND (GradingBldgXlate.grading-period-id = FinalMark.grading-period-id) AND (GradingBldgXlate.xlate-bldg-id = StuTranCourse.bldg-id) NO-ERROR. IF NOT AVAILABLE GradingBldgXlate THEN NEXT. /* See if this grade has been awarded */ FIND StuTranMark NO-LOCK WHERE StuTranMark.stu-seq = StuTranCourse.stu-seq AND StuTranMark.transcript-id = StuTranCourse.transcript-id AND StuTranMark.transcript-seq = StuTranCourse.transcript-seq AND StuTranMark.grading-period-id = GradingBldgXlate.xlate-grading-period-id AND StuTranMark.mark-id = GradingBldgXlate.xlate-mark-id NO-ERROR. IF NOT AVAILABLE StuTranMark THEN NEXT. /* Got it ! */ LEAVE. END. IF NOT AVAILABLE GradingBldgXlate OR NOT AVAILABLE FinalMark THEN DO: GradeList = GradeList + "," + "". DispositionList = DispositionList + "," + IF MarkItem.use-disposition THEN "?" ELSE "". NEXT MarkLoop. END. END. /* if we got here, we sucessfully translated the other building mark */ /* to the home building. Now, check for a MSM Override */ IF AVAILABLE MasterSchdMark THEN DO: /* reseek to find the correct MasterSchdMark */ FIND FIRST MasterSchdMark NO-LOCK WHERE MasterSchdMark.school-year-id = StuTranCourse.school-year-id AND MasterSchdMark.bldg-id = StuTranCourse.bldg-id AND MasterSchdMark.schd-version-id = SchdVersion.schd-version-id AND MasterSchdMark.course-id = StuTranCourse.course-id AND MasterSchdMark.section-id = StuTranCourse.section-id AND MasterSchdMark.record-grading-period-id = GradingBldgXlate.xlate-grading-period-id AND MasterSchdMark.record-mark-id = GradingBldgXlate.xlate-mark-id NO-ERROR. IF NOT AVAILABLE MasterSchdMark THEN DO: GradeList = GradeList + "," + "". DispositionList = DispositionList + "," + IF MarkItem.use-disposition THEN "?" ELSE "". NEXT MarkLoop. END. END. /* now we can find the grade */ FIND StuTranMark NO-LOCK WHERE StuTranMark.stu-seq = StuTranCourse.stu-seq AND StuTranMark.transcript-id = StuTranCourse.transcript-id AND StuTranMark.transcript-seq = StuTranCourse.transcript-seq AND StuTranMark.grading-period-id = GradingBldgXlate.xlate-grading-period-id AND StuTranMark.mark-id = GradingBldgXlate.xlate-mark-id NO-ERROR. IF AVAILABLE StuTranMark THEN DO: /* Handle the student having or not having the mark */ FIND CourseGrade OF StuTranMark NO-LOCK NO-ERROR. IF MarkItem.use-disposition THEN DO: TheDisposition = "?". FIND CourseDisposition OF StuTranMark NO-LOCK NO-ERROR. IF AVAILABLE CourseDisposition THEN TheDisposition = CourseDisposition.course-disposition-code. END. ELSE TheDisposition = "". /* Lookup the mark */ IF AVAILABLE CourseGrade THEN CASE GradingPolicy: WHEN "Letter" THEN TheMark = CourseGrade.letter-grade. WHEN "Numeric" THEN TheMark = TRIM(STRING(CourseGrade.numeric-grade-high, ">>9.99")). WHEN "Pass/Fail" THEN TheMark = STRING(Coursegrade.pass-fail, "Pass/Fail"). END. ELSE TheMark = "???". END. ELSE DO: DispositionList = DispositionList + "," + IF MarkItem.use-disposition THEN "?" ELSE "". TheMark = "". END. GradeList = GradeList + "," + TheMark. DispositionList = DispositionList + "," + TheDisposition. NEXT MarkLoop. END. /* If we get to this point, the course is in the student's home buidling */ /* Handle normal vs final marks */ IF MarkItem.final-mark THEN DO: FinalLoop: FOR EACH StuTranMark NO-LOCK WHERE StuTranMark.stu-seq = StuTranCourse.stu-seq AND StuTranMark.transcript-id = StuTranCourse.transcript-id AND StuTranMark.transcript-seq = StuTranCourse.transcript-seq AND StuTranMark.mark-id = MarkItem.mark-id, GradePeriod OF StuTranMark NO-LOCK BY GradePeriod.grading-period-num DESCENDING: LEAVE FinalLoop. END. END. ELSE /* Get the grade */ FIND StuTranMark NO-LOCK WHERE StuTranMark.stu-seq = StuTranCourse.stu-seq AND StuTranMark.transcript-id = StuTranCourse.transcript-id AND StuTranMark.transcript-seq = StuTranCourse.transcript-seq AND StuTranMark.grading-period-id = MarkItem.grading-period-id AND StuTranMark.mark-id = MarkItem.mark-id NO-ERROR. /* Handle the student having or not having the mark */ IF AVAILABLE StuTranMark THEN DO: /* Lookup the mark */ FIND CourseGrade OF StuTranMark NO-LOCK NO-ERROR. IF MarkItem.use-disposition THEN DO: TheDisposition = "?". FIND CourseDisposition OF StuTranMark NO-LOCK NO-ERROR. IF AVAILABLE CourseDisposition THEN TheDisposition = CourseDisposition.course-disposition-code. END. ELSE TheDisposition = "". IF AVAILABLE CourseGrade THEN CASE GradingPolicy: WHEN "Letter" THEN TheMark = CourseGrade.letter-grade. WHEN "Numeric" THEN TheMark = TRIM(STRING(CourseGrade.numeric-grade-high, ">>9.99")). WHEN "Pass/Fail" THEN TheMark = STRING(Coursegrade.pass-fail, "Pass/Fail"). END. ELSE TheMark = "???". END. ELSE DO: TheMark = "". DispositionList = DispositionList + "," + IF MarkItem.use-disposition THEN "?" ELSE "". END. /* Add the mark to the list */ GradeList = GradeList + "," + TheMark. DispositionList = DispositionList + "," + TheDisposition. END. /* Clear off leader */ SUBSTR(GradeList, 1, 1) = "". SUBSTR(DispositionList, 1, 1) = "". END. /* Get mark based labels list */ PROCEDURE GetMarkLabels: /* Define Parameters */ DEFINE INPUT PARAMETER SchoolYearID LIKE school-year.school-year-id NO-UNDO. DEFINE INPUT PARAMETER BldgID LIKE building.bldg-id NO-UNDO. DEFINE OUTPUT PARAMETER LabelList AS CHARACTER NO-UNDO. /* Define Variables */ DEFINE VARIABLE MarkCnt AS INTEGER NO-UNDO. DEFINE VARIABLE TranCnt AS INTEGER NO-UNDO. /* Define Buffers */ DEFINE BUFFER MarkItem FOR MarkItem. /* Make sure the building is loaded */ RUN LoadBldgMarks(SchoolYearID, BldgID, OUTPUT MarkCnt, OUTPUT TranCnt). /* Process them there not necessarily transcript marks */ FOR EACH MarkItem WHERE MarkItem.school-year-id = SchoolYearID AND MarkItem.bldg-id = BldgID BY MarkItem.school-year-id BY MarkItem.bldg-id BY MarkItem.mark-order: LabelList = LabelList + "," + MarkItem.mark-name. END. /* Clear off leader */ SUBSTR(LabelList, 1, 1) = "". END. /* Get mark based idents list */ PROCEDURE GetMarkIdents: /* Define Parameters */ DEFINE INPUT PARAMETER SchoolYearID LIKE school-year.school-year-id NO-UNDO. DEFINE INPUT PARAMETER BldgID LIKE building.bldg-id NO-UNDO. DEFINE OUTPUT PARAMETER IdentList AS CHARACTER NO-UNDO. /* Define Variables */ DEFINE VARIABLE MarkCnt AS INTEGER NO-UNDO. DEFINE VARIABLE TranCnt AS INTEGER NO-UNDO. /* Define Buffers */ DEFINE BUFFER MarkItem FOR MarkItem. /* Make sure the building is loaded */ RUN LoadBldgMarks(SchoolYearID, BldgID, OUTPUT MarkCnt, OUTPUT TranCnt). /* Process them there transcript marks */ FOR EACH MarkItem WHERE MarkItem.school-year-id = SchoolYearID AND MarkItem.bldg-id = BldgID BY MarkItem.school-year-id BY MarkItem.bldg-id BY MarkItem.mark-order: IdentList = IdentList + "," + STRING(MarkItem.mark-order). END. /* Clear off leader */ SUBSTR(IdentList, 1, 1) = "". END. /* Get mark based grades list */ PROCEDURE GetMarkGrades: /* Define Parameters */ DEFINE PARAMETER BUFFER StuTranCourse FOR stu-transcript-course. DEFINE OUTPUT PARAMETER GradeList AS CHARACTER NO-UNDO. DEFINE OUTPUT PARAMETER DispositionList AS CHARACTER NO-UNDO. /* Define Variables */ DEFINE VARIABLE MarkCnt AS INTEGER NO-UNDO. DEFINE VARIABLE TranCnt AS INTEGER NO-UNDO. DEFINE VARIABLE TheMark AS CHARACTER NO-UNDO. DEFINE VARIABLE GradingPolicy AS CHARACTER NO-UNDO. DEFINE VARIABLE TheDisposition AS CHARACTER NO-UNDO. /* Define Buffers */ DEFINE BUFFER MarkItem FOR MarkItem. DEFINE BUFFER FinalMark FOR FinalMark. DEFINE BUFFER StuTranMark FOR stu-transcript-mark. DEFINE BUFFER CourseGrade FOR course-level-grade. DEFINE BUFFER SchdVersion FOR schd-version. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER GradingBldgXlate FOR grading-bldg-xlate. DEFINE BUFFER StuTranYear FOR stu-transcript-year. DEFINE BUFFER GradePeriod FOR grading-period. DEFINE BUFFER CourseDisposition FOR course-disposition. DEFINE BUFFER xlateLookup FOR grading-bldg-xlate. /* Make sure the building is loaded */ RUN LoadBldgMarks(StuTranCourse.school-year-id, StuTranCourse.bldg-id, OUTPUT MarkCnt, OUTPUT TranCnt). /* Get the grading policy */ RUN GradingPolicy(BUFFER StuTranCourse, OUTPUT GradingPolicy). /* load the StuTranYear */ FIND FIRST StuTranYear NO-LOCK WHERE StuTranYear.stu-seq = StuTranCourse.stu-seq AND StuTranYear.transcript-id = StuTranCourse.transcript-id AND StuTranYear.school-year-id = StuTranCourse.school-year-id. /* Process them there transcript marks */ MarkLoop: FOR EACH MarkItem WHERE MarkItem.school-year-id = StuTranCourse.school-year-id AND MarkItem.bldg-id = StuTranYear.bldg-id BY MarkItem.school-year-id BY MarkItem.bldg-id BY MarkItem.mark-order: FIND FIRST SchdVersion NO-LOCK WHERE (SchdVersion.school-year-id = StuTranCourse.school-year-id) AND (SchdVersion.bldg-id = StuTranCourse.bldg-id) AND (SchdVersion.active-schedule = Yes). FIND FIRST MasterSchdMark NO-LOCK WHERE MasterSchdMark.school-year-id = StuTranCourse.school-year-id AND MasterSchdMark.bldg-id = StuTranCourse.bldg-id AND MasterSchdMark.schd-version-id = SchdVersion.schd-version-id AND MasterSchdMark.course-id = StuTranCourse.course-id AND MasterSchdMark.section-id = StuTranCourse.section-id NO-ERROR. IF StuTranCourse.bldg-id <> StuTranYear.bldg-id THEN DO: /* xlate the mark */ IF MarkItem.grading-period-id <> ? THEN DO: FIND FIRST GradingBldgXlate NO-LOCK WHERE (GradingBldgXlate.school-year-id = StuTranYear.school-year-id) AND (GradingBldgXlate.bldg-id = StuTranYear.bldg-id) AND (GradingBldgXlate.grading-period-id = MarkItem.grading-period-id) AND (GradingBldgXlate.mark-id = MarkItem.mark-id) AND (GradingBldgXlate.xlate-bldg-id = StuTranCourse.bldg-id) NO-ERROR. IF NOT AVAILABLE GradingBldgXlate THEN DO: GradeList = GradeList + "," + "". DispositionList = DispositionList + "," + IF MarkItem.use-disposition THEN "?" ELSE "". NEXT MarkLoop. END. /* Only bother with checking multiples if we have multi-mappings */ IF CAN-FIND(FIRST xlateLookup WHERE xlateLookup.school-year-id = StuTranYear.school-year-id AND xlateLookup.bldg-id = StuTranYear.bldg-id AND xlateLookup.grading-period-id = MarkItem.grading-period-id AND xlateLookup.mark-id = MarkItem.mark-id AND xlateLookup.xlate-bldg-id = StuTranCourse.bldg-id AND RECID(xlateLookup) <> RECID(GradingBldgXlate)) THEN multiBlock: DO: /* We'll spit back the first one we come to that matches, or if we don't find any marks, we'll leave the current buffer alone */ FOR EACH xlateLookup NO-LOCK WHERE xlateLookup.school-year-id = StuTranYear.school-year-id AND xlateLookup.bldg-id = StuTranYear.bldg-id AND xlateLookup.grading-period-id = MarkItem.grading-period-id AND xlateLookup.mark-id = MarkItem.mark-id AND xlateLookup.xlate-bldg-id = StuTranCourse.bldg-id: /* We're permissive here -- when we find a mark, we go with it */ FIND StuTranMark NO-LOCK WHERE StuTranMark.stu-seq = StuTranCourse.stu-seq AND StuTranMark.transcript-id = StuTranCourse.transcript-id AND StuTranMark.transcript-seq = StuTranCourse.transcript-seq AND StuTranMark.grading-period-id = xlateLookup.xlate-grading-period-id AND StuTranMark.mark-id = xlateLookup.xlate-mark-id NO-ERROR. IF AVAILABLE StuTranMark THEN DO: FIND GradingBLdgXlate NO-LOCK WHERE RECID(GradingBldgXlate) = RECID(xlateLookup). LEAVE multiBlock. END. END. /* each possible mapping */ END. /* multiblock (CAN-FIND) */ END. ELSE DO: /* we are looking for a final mark */ FOR EACH FinalMark NO-LOCK WHERE (FinalMark.school-year-id = StuTranYear.school-year-id) AND (FinalMark.bldg-id = StuTranYear.bldg-id) AND (FinalMark.mark-id = MarkItem.mark-id) BY FinalMark.final-order DESCENDING: FIND FIRST GradingBldgXlate NO-LOCK WHERE (GradingBldgXlate.school-year-id = StuTranYear.school-year-id) AND (GradingBldgXlate.bldg-id = StuTranYear.bldg-id) AND (GradingBldgXlate.mark-id = MarkItem.mark-id) AND (GradingBldgXlate.grading-period-id = FinalMark.grading-period-id) AND (GradingBldgXlate.xlate-bldg-id = StuTranCourse.bldg-id) NO-ERROR. IF NOT AVAILABLE GradingBldgXlate THEN NEXT. /* See if this grade has been awarded */ FIND StuTranMark NO-LOCK WHERE StuTranMark.stu-seq = StuTranCourse.stu-seq AND StuTranMark.transcript-id = StuTranCourse.transcript-id AND StuTranMark.transcript-seq = StuTranCourse.transcript-seq AND StuTranMark.grading-period-id = GradingBldgXlate.xlate-grading-period-id AND StuTranMark.mark-id = GradingBldgXlate.xlate-mark-id NO-ERROR. IF NOT AVAILABLE StuTranMark THEN NEXT. /* Got it ! */ LEAVE. END. IF NOT AVAILABLE GradingBldgXlate OR NOT AVAILABLE FinalMark THEN DO: GradeList = GradeList + "," + "". DispositionList = DispositionList + "," + IF MarkItem.use-disposition THEN "?" ELSE "". NEXT MarkLoop. END. END. /* if we got here, we sucessfully translated the other building mark */ /* to the home building. Now, check for a MSM Override */ IF AVAILABLE MasterSchdMark THEN DO: /* reseek to find the correct MasterSchdMark */ FIND FIRST MasterSchdMark NO-LOCK WHERE MasterSchdMark.school-year-id = StuTranCourse.school-year-id AND MasterSchdMark.bldg-id = StuTranCourse.bldg-id AND MasterSchdMark.schd-version-id = SchdVersion.schd-version-id AND MasterSchdMark.course-id = StuTranCourse.course-id AND MasterSchdMark.section-id = StuTranCourse.section-id AND MasterSchdMark.record-grading-period-id = GradingBldgXlate.xlate-grading-period-id AND MasterSchdMark.record-mark-id = GradingBldgXlate.xlate-mark-id NO-ERROR. IF NOT AVAILABLE MasterSchdMark THEN DO: GradeList = GradeList + "," + "". DispositionList = DispositionList + "," + IF MarkItem.use-disposition THEN "?" ELSE "". NEXT MarkLoop. END. END. /* now we can find the grade */ FIND StuTranMark NO-LOCK WHERE StuTranMark.stu-seq = StuTranCourse.stu-seq AND StuTranMark.transcript-id = StuTranCourse.transcript-id AND StuTranMark.transcript-seq = StuTranCourse.transcript-seq AND StuTranMark.grading-period-id = GradingBldgXlate.xlate-grading-period-id AND StuTranMark.mark-id = GradingBldgXlate.xlate-mark-id NO-ERROR. /* Handle the student having or not having the mark */ IF AVAILABLE StuTranMark THEN DO: /* Lookup the mark */ FIND CourseGrade OF StuTranMark NO-LOCK NO-ERROR. IF MarkItem.use-disposition THEN DO: TheDisposition = "?". FIND CourseDisposition OF StuTranMark NO-LOCK NO-ERROR. IF AVAILABLE CourseDisposition THEN TheDisposition = CourseDisposition.course-disposition-code. END. ELSE TheDisposition = "". IF AVAILABLE CourseGrade THEN CASE GradingPolicy: WHEN "Letter" THEN TheMark = CourseGrade.letter-grade. WHEN "Numeric" THEN TheMark = TRIM(STRING(CourseGrade.numeric-grade-high, ">>9.99")). WHEN "Pass/Fail" THEN TheMark = STRING(Coursegrade.pass-fail, "Pass/Fail"). END. ELSE TheMark = "???". END. ELSE DO: TheMark = "". DispositionList = DispositionList + "," + IF MarkItem.use-disposition THEN "?" ELSE "". END. GradeList = GradeList + "," + TheMark. DispositionList = DispositionList + "," + TheDisposition. NEXT MarkLoop. END. /* If we get to this point, the course is in the student's home buidling */ /* Handle normal vs final marks */ IF MarkItem.final-mark THEN DO: FinalLoop: FOR EACH StuTranMark NO-LOCK WHERE StuTranMark.stu-seq = StuTranCourse.stu-seq AND StuTranMark.transcript-id = StuTranCourse.transcript-id AND StuTranMark.transcript-seq = StuTranCourse.transcript-seq AND StuTranMark.mark-id = MarkItem.mark-id, GradePeriod OF StuTranMark NO-LOCK BY GradePeriod.grading-period-num DESCENDING: LEAVE FinalLoop. END. END. ELSE /* Get the grade */ FIND StuTranMark NO-LOCK WHERE StuTranMark.stu-seq = StuTranCourse.stu-seq AND StuTranMark.transcript-id = StuTranCourse.transcript-id AND StuTranMark.transcript-seq = StuTranCourse.transcript-seq AND StuTranMark.grading-period-id = MarkItem.grading-period-id AND StuTranMark.mark-id = MarkItem.mark-id NO-ERROR. /* Handle the student having or not having the mark */ IF AVAILABLE StuTranMark THEN DO: /* Lookup the mark */ FIND CourseGrade OF StuTranMark NO-LOCK NO-ERROR. IF MarkItem.use-disposition THEN DO: TheDisposition = "?". FIND CourseDisposition OF StuTranMark NO-LOCK NO-ERROR. IF AVAILABLE CourseDisposition THEN TheDisposition = CourseDisposition.course-disposition-code. END. ELSE TheDisposition = "". IF AVAILABLE CourseGrade THEN CASE GradingPolicy: WHEN "Letter" THEN TheMark = CourseGrade.letter-grade. WHEN "Numeric" THEN TheMark = TRIM(STRING(CourseGrade.numeric-grade-high, ">>9.99")). WHEN "Pass/Fail" THEN TheMark = STRING(Coursegrade.pass-fail, "Pass/Fail"). END. ELSE TheMark = "???". END. ELSE DO: TheMark = "". TheDisposition = IF MarkItem.use-disposition THEN "?" ELSE "". /* DispositionList = DispositionList + "," + */ END. /* Add the mark to the list */ GradeList = GradeList + "," + TheMark. DispositionList = DispositionList + "," + TheDisposition. END. /* Clear off leader */ SUBSTR(GradeList, 1, 1) = "". SUBSTR(DispositionList, 1, 1) = "". END. /* Get label by ident */ PROCEDURE GetIdentLabel: /* Define Parameters */ DEFINE INPUT PARAMETER SchoolYearID LIKE school-year.school-year-id NO-UNDO. DEFINE INPUT PARAMETER BldgID LIKE building.bldg-id NO-UNDO. DEFINE INPUT PARAMETER TheIdent AS CHARACTER NO-UNDO. DEFINE OUTPUT PARAMETER TheLabel AS CHARACTER NO-UNDO. /* Define Variables */ DEFINE VARIABLE MarkNum AS INTEGER NO-UNDO. DEFINE VARIABLE MarkCnt AS INTEGER NO-UNDO. DEFINE VARIABLE TranCnt AS INTEGER NO-UNDO. /* Define Buffers */ DEFINE BUFFER MarkItem FOR MarkItem. /* Make sure the building is loaded */ RUN LoadBldgMarks(SchoolYearID, BldgID, OUTPUT MarkCnt, OUTPUT TranCnt). /* See if we can convert the ident */ MarkNum = INTEGER(TheIdent) NO-ERROR. IF ERROR-STATUS:ERROR THEN RETURN. /* See the the selected mark exists */ FIND FIRST MarkItem WHERE MarkItem.school-year-id = SchoolYearID AND MarkItem.bldg-id = BldgID AND MarkItem.mark-order = MarkNum NO-ERROR. IF NOT AVAILABLE MarkItem THEN RETURN. /* Set the label */ TheLabel = MarkItem.mark-name. END. /* Get grade level record by ident */ PROCEDURE GetIdentGradeLevel: /* Define Parameters */ DEFINE PARAMETER BUFFER StuTranCourse FOR stu-transcript-course. DEFINE INPUT PARAMETER TheIdent AS CHARACTER NO-UNDO. DEFINE PARAMETER BUFFER TheGrade FOR course-level-grade. DEFINE PARAMETER BUFFER TheDisposition FOR course-disposition. /* Define Variables */ DEFINE VARIABLE MarkNum AS INTEGER NO-UNDO. DEFINE VARIABLE MarkCnt AS INTEGER NO-UNDO. DEFINE VARIABLE TranCnt AS INTEGER NO-UNDO. /* Define Buffers */ DEFINE BUFFER MarkItem FOR MarkItem. DEFINE BUFFER FinalMark FOR FinalMark. DEFINE BUFFER StuTranMark FOR stu-transcript-mark. /* Clear the buffer */ IF AVAILABLE TheGrade THEN FIND TheGrade WHERE RECID(TheGrade) = ? NO-ERROR. /* Make sure the building is loaded */ RUN LoadBldgMarks(StuTranCourse.school-year-id, StuTranCourse.bldg-id, OUTPUT MarkCnt, OUTPUT TranCnt). /* See if we can convert the ident */ MarkNum = INTEGER(TheIdent) NO-ERROR. IF ERROR-STATUS:ERROR THEN RETURN. /* See if the selected mark exists */ FIND FIRST MarkItem WHERE MarkItem.school-year-id = StuTranCourse.school-year-id AND MarkItem.bldg-id = StuTranCourse.bldg-id AND MarkItem.mark-order = MarkNum NO-ERROR. IF NOT AVAILABLE MarkItem THEN RETURN. /* Handle normal vs final marks */ IF MarkItem.final-mark THEN DO: /* Check each final mark in order */ FinalLoop: FOR EACH FinalMark WHERE FinalMark.school-year-id = MarkItem.school-year-id AND FinalMark.bldg-id = MarkItem.bldg-id AND FinalMark.mark-id = MarkItem.mark-id BY FinalMark.school-year-id BY FinalMark.bldg-id BY FinalMark.final-order DESCENDING: /* Get the grade */ FIND StuTranMark NO-LOCK WHERE StuTranMark.stu-seq = StuTranCourse.stu-seq AND StuTranMark.transcript-id = StuTranCourse.transcript-id AND StuTranMark.transcript-seq = StuTranCourse.transcript-seq AND StuTranMark.grading-period-id = FinalMark.grading-period-id AND StuTranMark.mark-id = FinalMark.mark-id NO-ERROR. IF AVAILABLE StuTranMark THEN LEAVE FinalLoop. END. END. ELSE /* Get the grade */ FIND StuTranMark NO-LOCK WHERE StuTranMark.stu-seq = StuTranCourse.stu-seq AND StuTranMark.transcript-id = StuTranCourse.transcript-id AND StuTranMark.transcript-seq = StuTranCourse.transcript-seq AND StuTranMark.grading-period-id = MarkItem.grading-period-id AND StuTranMark.mark-id = MarkItem.mark-id NO-ERROR. /* Now we handle the student having or missing the grade */ IF AVAILABLE StuTranMark THEN DO: /* Lookup the mark */ FIND TheGrade OF StuTranMark NO-LOCK NO-ERROR. FIND TheDisposition OF StuTranMark NO-LOCK NO-ERROR. END. END. /* Get grade by ident */ PROCEDURE GetIdentGrade: /* Define Parameters */ DEFINE PARAMETER BUFFER StuTranCourse FOR stu-transcript-course. DEFINE INPUT PARAMETER TheIdent AS CHARACTER NO-UNDO. DEFINE OUTPUT PARAMETER TheGrade AS CHARACTER NO-UNDO. /* Define Variables */ DEFINE VARIABLE GradingPolicy AS CHARACTER NO-UNDO. /* Define Buffers */ DEFINE BUFFER CourseGrade FOR course-level-grade. /* Get the grading policy */ RUN GradingPolicy(BUFFER StuTranCourse, OUTPUT GradingPolicy). /* Load the grade-level buffer */ RUN GetIdentGradeLevel (BUFFER StuTranCourse, TheIdent, BUFFER CourseGrade, BUFFER course-disposition). /* Decode the results */ IF AVAILABLE CourseGrade THEN CASE GradingPolicy: WHEN "Letter" THEN TheGrade = CourseGrade.letter-grade. WHEN "Numeric" THEN TheGrade = TRIM(STRING(CourseGrade.numeric-grade-high, ">>9.99")). WHEN "Pass/Fail" THEN TheGrade = STRING(Coursegrade.pass-fail, "Pass/Fail"). END. ELSE TheGrade = "". END. /* Get grade by ident */ PROCEDURE GetIdentDisposition: /* Define Parameters */ DEFINE PARAMETER BUFFER StuTranCourse FOR stu-transcript-course. DEFINE INPUT PARAMETER TheIdent AS CHARACTER NO-UNDO. DEFINE OUTPUT PARAMETER TheDisposition AS CHARACTER NO-UNDO. /* Define Variables */ DEFINE VARIABLE GradingPolicy AS CHARACTER NO-UNDO. /* Define Buffers */ DEFINE BUFFER CourseDisposition FOR course-disposition. /* Load the grade-level buffer */ RUN GetIdentGradeLevel (BUFFER StuTranCourse, TheIdent, BUFFER course-level-grade, BUFFER CourseDisposition). /* Decode the results */ IF AVAILABLE CourseDisposition THEN DO: TheDisposition = CourseDisposition.course-disposition-code. END. ELSE TheDisposition = "". END. /* Return what type of transcript this is */ /* Possible tokens are */ /* MANUAL/AUTOMATIC - Is this a manually or automatically updated course */ /* MASTER/CATALOG - Is course referenced in MASTER schd or COURSE catalog */ PROCEDURE GetCourseAttrs: /* Define Parameters */ DEFINE PARAMETER BUFFER StuTranCourse FOR stu-transcript-course. DEFINE OUTPUT PARAMETER CourseInfo AS CHARACTER NO-UNDO. /* Define Buffers */ DEFINE BUFFER SchdVersion FOR schd-version. DEFINE BUFFER StuSchd FOR stu-schedule. DEFINE BUFFER MasterSchd FOR master-schd. /* See if this is a 'automatic' course */ IF StuTranCourse.section-id <> ? THEN DO: /* Load active schedule version */ FIND FIRST SchdVersion NO-LOCK WHERE SchdVersion.school-year-id = StuTranCourse.school-year-id AND SchdVersion.bldg-id = StuTranCourse.bldg-id AND SchdVersion.active-schedule = Yes NO-ERROR. IF AVAILABLE SchdVersion THEN DO: FIND FIRST StuSchd NO-LOCK WHERE StuSchd.school-year-id = SchdVersion.school-year-id AND StuSchd.bldg-id = SchdVersion.bldg-id AND StuSchd.schd-version-id = SchdVersion.schd-version-id AND StuSchd.course-id = StuTranCourse.course-id AND StuSchd.section-id = StuTranCourse.section-id AND StuSchd.current-entry = Yes AND StuSchd.stu-seq = StuTranCourse.stu-seq NO-ERROR. IF AVAILABLE StuSchd THEN CourseInfo = CourseInfo + ",AUTOMATIC". ELSE CourseInfo = CourseInfo + ",MANUAL". /* Try for the master schedule */ FIND FIRST MasterSchd NO-LOCK WHERE MasterSchd.school-year-id = SchdVersion.school-year-id AND MasterSchd.bldg-id = SchdVersion.bldg-id AND MasterSchd.schd-version-id = SchdVersion.schd-version-id AND MasterSchd.course-id = StuTranCourse.course-id AND MasterSchd.section-id = StuTranCourse.section-id NO-ERROR. IF AVAILABLE MasterSchd THEN CourseInfo = CourseInfo + ",MASTER". ELSE CourseInfo = CourseInfo + ",CATALOG". END. ELSE /* No Schd Version record implies no master shcd or student schd */ CourseInfo = ",MANUAL,CATALOG". END. ELSE /* No section implies no reference to master schd or student schd */ CourseInfo = ",MANUAL,CATALOG". /* Clean up the string */ SUBSTR(CourseInfo, 1, 1) = "". END. /* Return what type of transcript year this is */ /* Possible tokens are */ /* MANUAL/AUTOMATIC - Is this a manually or automatically updated year */ PROCEDURE GetYearAttrs: /* Define Parameters */ DEFINE PARAMETER BUFFER StuTranYear FOR stu-transcript-year. DEFINE OUTPUT PARAMETER YearInfo AS CHARACTER INITIAL "MANUAL" NO-UNDO. /* Define Buffers */ DEFINE BUFFER SchdVersion FOR schd-version. DEFINE BUFFER StuYear FOR stu-year. DEFINE BUFFER StuSchd FOR stu-schedule. /* See if there is a stu-year record for the transcript year */ IF NOT CAN-FIND(StuYear OF StuTranYear) THEN RETURN. /* See if the student has any schedules at all for the year */ FOR EACH StuSchd NO-LOCK WHERE (StuSchd.school-year-id = StuTranYear.school-year-id) AND (StuSchd.stu-seq = StuTranYear.stu-seq) AND (StuSchd.current-entry = Yes), FIRST SchdVersion OF StuSchd NO-LOCK WHERE SchdVersion.active-schedule = Yes: /* IF we have a course, it's automatic */ YearInfo = "AUTOMATIC". RETURN. END. END. /* Store a mark with validation */ /* See notes at the top of this file for a short explanation of how final-marks are dealt with. */ PROCEDURE SetIdentMark: /* Define parameters */ DEFINE PARAMETER BUFFER StuTranCourse FOR stu-transcript-course. DEFINE INPUT PARAMETER TheIdent AS CHARACTER NO-UNDO. DEFINE INPUT PARAMETER TheGrade AS CHARACTER NO-UNDO. DEFINE OUTPUT PARAMETER GradeOK AS LOGICAL INITIAL No NO-UNDO. /* Define Variables */ DEFINE VARIABLE MarkNum AS INTEGER NO-UNDO. DEFINE VARIABLE MarkCnt AS INTEGER NO-UNDO. DEFINE VARIABLE TranCnt AS INTEGER NO-UNDO. DEFINE VARIABLE TheNumMark AS DECIMAL NO-UNDO. DEFINE VARIABLE GradingPolicy AS CHARACTER NO-UNDO. DEFINE VARIABLE GPID AS INTEGER INITIAL ? NO-UNDO. DEFINE VARIABLE IsEnabled AS LOGICAL INITIAL No NO-UNDO. /* Define Buffers */ DEFINE BUFFER TheMark FOR course-level-grade. DEFINE BUFFER MarkItem FOR MarkItem. DEFINE BUFFER FinalMark FOR FinalMark. DEFINE BUFFER StuTranMark FOR stu-transcript-mark. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER MasterSchd FOR master-schd. DEFINE BUFFER GradingPeriodMark FOR grading-period-mark. DEFINE BUFFER GradingPeriod FOR grading-period. DEFINE BUFFER SchdVersion FOR schd-version. DEFINE BUFFER FinalTempMark FOR FinalMark. /* Make sure the building is loaded */ RUN LoadBldgMarks(StuTranCourse.school-year-id, StuTranCourse.bldg-id, OUTPUT MarkCnt, OUTPUT TranCnt). /* Get the grading policy */ RUN GradingPolicy(BUFFER StuTranCourse, OUTPUT GradingPolicy). /* See if we can convert the ident */ MarkNum = INTEGER(TheIdent) NO-ERROR. IF ERROR-STATUS:ERROR THEN RETURN. /* See if the selected mark exists */ FIND FIRST MarkItem WHERE MarkItem.school-year-id = StuTranCourse.school-year-id AND MarkItem.bldg-id = StuTranCourse.bldg-id AND MarkItem.mark-order = MarkNum NO-ERROR. IF NOT AVAILABLE MarkItem THEN RETURN. /* Xlate non-blank grades */ IF (TheGrade <> "") AND (TheGrade <> ?) THEN DO: /*** Translate the grade into an id ***/ /* Lookup the passed grade based on how grades are recorded */ CASE GradingPolicy: /* Letter/Alpha based grades */ WHEN "Letter" THEN FIND FIRST TheMark NO-LOCK WHERE TheMark.school-year-id = StuTranCourse.school-year-id AND TheMark.bldg-id = StuTranCourse.bldg-id AND TheMark.course-level-id = StuTranCourse.course-level-id AND TheMark.letter-grade = TheGrade NO-ERROR. /* Numeric grades */ WHEN "Numeric" THEN DO: /* Convert the mark */ TheNumMark = DECIMAL(TheGrade) NO-ERROR. IF ERROR-STATUS:ERROR THEN RETURN. /* Look the mark up */ FIND FIRST TheMark NO-LOCK WHERE TheMark.school-year-id = StuTranCourse.school-year-id AND TheMark.bldg-id = StuTranCourse.bldg-id AND TheMark.course-level-id = StuTranCourse.course-level-id AND TheMark.numeric-grade-low <= TheNumMark AND TheMark.numeric-grade-high >= TheNumMark NO-ERROR. END. /* Pass/Fail grades */ WHEN "Pass/Fail" THEN IF TheGrade BEGINS "P" THEN FIND LAST TheMark NO-LOCK WHERE TheMark.school-year-id = StuTranCourse.school-year-id AND TheMark.bldg-id = StuTranCourse.bldg-id AND TheMark.course-level-id = StuTranCourse.course-level-id AND TheMark.pass-fail = Yes NO-ERROR. ELSE FIND FIRST TheMark NO-LOCK WHERE TheMark.school-year-id = StuTranCourse.school-year-id AND TheMark.bldg-id = StuTranCourse.bldg-id AND TheMark.course-level-id = StuTranCourse.course-level-id AND TheMark.pass-fail = No NO-ERROR. END. /* If no mark, then it's illegal */ IF NOT AVAILABLE TheMark THEN RETURN. END. /* scope some buffers outside of the loop */ FIND FIRST FinalMark WHERE RECID(FinalMark) = ? NO-LOCK NO-ERROR. FIND FIRST MasterSchdMark WHERE RECID(MasterSchdMark) = ? NO-LOCK NO-ERROR. FIND FIRST FinalTempMark WHERE RECID(FinalTempMark) = ? NO-LOCK NO-ERROR. /* Handle normal vs final marks */ IF MarkItem.final-mark THEN DO: /* get the schdVersion */ FIND FIRST SchdVersion NO-LOCK WHERE (SchdVersion.school-year-id = StuTranCourse.school-year-id) AND (SchdVersion.bldg-id = StuTranCourse.bldg-id) AND (SchdVersion.active-schedule = Yes). /* reset our counter */ GPID = ?. /* Check each final mark in order */ FinalLoop: FOR EACH FinalMark WHERE FinalMark.school-year-id = MarkItem.school-year-id AND FinalMark.bldg-id = MarkItem.bldg-id AND FinalMark.mark-id = MarkItem.mark-id BY FinalMark.school-year-id BY FinalMark.bldg-id BY FinalMark.final-order DESCENDING: /* check for a MasterSchdMark override */ FIND FIRST MasterSchdMark NO-LOCK WHERE (MasterSchdMark.school-year-id = StuTranCourse.school-year-id) AND (MasterSchdMark.bldg-id = StuTranCourse.bldg-id) AND (MasterSchdMark.schd-version-id = SchdVersion.schd-version-id) AND (MasterSchdMark.course-id = StuTranCourse.course-id) AND (MasterSchdMark.section-id = StuTranCourse.section-id) AND (MasterSchdMark.record-mark-id = FinalMark.mark-id) NO-ERROR. IF AVAILABLE MasterSchdMark THEN DO: FIND FinalTempMark NO-LOCK WHERE (FinalTempMark.school-year-id = MasterSchdMark.school-year-id) AND (FinalTempMark.bldg-id = MasterSchdMark.bldg-id) AND (FinalTempMark.grading-period-id = MasterSchdMark.record-grading-period-id) AND (FinalTempMark.mark-id = MasterSchdMark.record-mark-id) NO-ERROR. LEAVE FinalLoop. END. /* fetch the schedule, etc. and use gradutil to see when its active */ FIND FIRST MasterSchd OF SchdVersion NO-LOCK WHERE (MasterSchd.course-id = StuTranCourse.course-id) AND (MasterSchd.section-id = StuTranCourse.section-id) NO-ERROR. IF NOT AVAILABLE MasterSchd THEN LEAVE FinalLoop. /* when this loop finishes, we will have the GPID of the courses */ /* ending grading period */ FOR EACH GradingPeriodMark NO-LOCK WHERE GradingPeriodMark.school-year-id = StuTranCourse.school-year-id AND GradingPeriodMark.bldg-id = StuTranCourse.bldg-id AND GradingPeriodMark.mark-id = FinalMark.mark-id, GradingPeriod OF GradingPeriodmark BY GradingPeriodMark.school-year-id BY GradingPeriodMark.bldg-id BY GradingPeriodMark.grading-period-id BY GradingPeriodMark.mark-order: {gradutil.i SET PRIMARY-PERIOD GradingPeriod} {gradutil.i GET COURSE-ENABLED MasterSchd IsEnabled} IF IsEnabled THEN GPID = GradingPeriodMark.grading-period-id. END. IF GPID <> ? THEN LEAVE FinalLoop. END. /* finalLoop */ IF AVAILABLE FinalTempMark THEN FIND FinalMark WHERE RECID(FinalMark) = RECID(FinalTempMark) NO-LOCK NO-ERROR. ELSE IF GPID <> ? THEN DO: FIND FinalMark NO-LOCK WHERE FinalMark.school-year-id = StuTranCourse.school-year-id AND FinalMark.bldg-id = StuTranCourse.bldg-id AND FinalMark.grading-period-id = GPID AND FinalMark.mark-id = MarkItem.mark-id NO-ERROR. END. IF AVAILABLE FinalMark THEN /* load the MarkItem */ FIND FIRST MarkItem WHERE MarkItem.school-year-id = StuTranCourse.school-year-id AND MarkItem.bldg-id = StuTranCourse.bldg-id AND MarkItem.grading-period-id = ? AND MarkItem.mark-id = FinalMark.mark-id AND MarkItem.mark-order = MarkNum NO-ERROR. END. /* Get the grade */ FIND StuTranMark WHERE StuTranMark.stu-seq = StuTranCourse.stu-seq AND StuTranMark.transcript-id = StuTranCourse.transcript-id AND StuTranMark.transcript-seq = StuTranCourse.transcript-seq AND StuTranMark.grading-period-id = (IF AVAILABLE FinalMark THEN FinalMark.grading-period-id ELSE MarkItem.grading-period-id) AND StuTranMark.mark-id = MarkItem.mark-id NO-ERROR. /* If there was no mark, create one */ IF NOT AVAILABLE StuTranMark AND AVAILABLE TheMark THEN DO: CREATE StuTranMark. ASSIGN StuTranMark.transcript-id = StuTranCourse.transcript-id StuTranMark.transcript-seq = StuTranCourse.transcript-seq StuTranMark.school-year-id = StuTranCourse.school-year-id StuTranMark.bldg-id = StuTranCourse.bldg-id StuTranMark.stu-seq = StuTranCourse.stu-seq StuTranMark.grading-period-id = (IF AVAILABLE FinalMark THEN FinalMark.grading-period-id ELSE MarkItem.grading-period-id) StuTranMark.mark-id = MarkItem.mark-id. END. /* Handle setting/clearing the grade */ IF AVAILABLE TheMark THEN ASSIGN StuTranMark.course-level-id = TheMark.course-level-id StuTranMark.course-level-grade-id = TheMark.course-level-grade-id. ELSE IF AVAILABLE StuTranMark THEN /* Clear the grade */ DELETE StuTranMark. /* Flag A-Okay */ GradeOK = Yes. END. /* Store a mark with validation */ /* See notes at the top of this file for a short explanation of how final-marks are dealt with. */ PROCEDURE SetIdentDisposition: /* Define parameters */ DEFINE PARAMETER BUFFER StuTranCourse FOR stu-transcript-course. DEFINE INPUT PARAMETER TheIdent AS CHARACTER NO-UNDO. DEFINE INPUT PARAMETER DispositionCode AS CHARACTER NO-UNDO. DEFINE OUTPUT PARAMETER DispositionOK AS LOGICAL INITIAL No NO-UNDO. /* Define Variables */ DEFINE VARIABLE MarkNum AS INTEGER NO-UNDO. DEFINE VARIABLE MarkCnt AS INTEGER NO-UNDO. DEFINE VARIABLE TranCnt AS INTEGER NO-UNDO. DEFINE VARIABLE TheNumMark AS DECIMAL NO-UNDO. DEFINE VARIABLE GPID AS INTEGER INITIAL ? NO-UNDO. DEFINE VARIABLE IsEnabled AS LOGICAL INITIAL No NO-UNDO. /* Define Buffers */ DEFINE BUFFER MarkItem FOR MarkItem. DEFINE BUFFER FinalMark FOR FinalMark. DEFINE BUFFER StuTranMark FOR stu-transcript-mark. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER MasterSchd FOR master-schd. DEFINE BUFFER GradingPeriodMark FOR grading-period-mark. DEFINE BUFFER GradingPeriod FOR grading-period. DEFINE BUFFER SchdVersion FOR schd-version. DEFINE BUFFER FinalTempMark FOR FinalMark. DEFINE BUFFER TheDisposition FOR course-disposition. /* Make sure the building is loaded */ RUN LoadBldgMarks(StuTranCourse.school-year-id, StuTranCourse.bldg-id, OUTPUT MarkCnt, OUTPUT TranCnt). /* See if we can convert the ident */ MarkNum = INTEGER(TheIdent) NO-ERROR. IF ERROR-STATUS:ERROR THEN RETURN. /* See if the selected mark exists */ FIND FIRST MarkItem WHERE MarkItem.school-year-id = StuTranCourse.school-year-id AND MarkItem.bldg-id = StuTranCourse.bldg-id AND MarkItem.mark-order = MarkNum NO-ERROR. IF NOT AVAILABLE MarkItem THEN RETURN. /* Xlate non-blank grades */ IF (DispositionCode <> "") AND (DispositionCode <> ?) THEN DO: /*** Translate the grade into an id ***/ FIND FIRST TheDisposition WHERE TheDisposition.school-year-id = StuTranCourse.school-year-id AND TheDisposition.bldg-id = StuTranCourse.bldg-id AND TheDisposition.course-disposition-code = DispositionCode NO-LOCK NO-ERROR. /* If no mark, then it's illegal */ IF NOT AVAILABLE TheDisposition THEN RETURN. END. /* scope some buffers outside of the loop */ FIND FIRST FinalMark WHERE RECID(FinalMark) = ? NO-LOCK NO-ERROR. FIND FIRST MasterSchdMark WHERE RECID(MasterSchdMark) = ? NO-LOCK NO-ERROR. FIND FIRST FinalTempMark WHERE RECID(FinalTempMark) = ? NO-LOCK NO-ERROR. /* Handle normal vs final marks */ IF MarkItem.final-mark THEN DO: /* get the schdVersion */ FIND FIRST SchdVersion NO-LOCK WHERE (SchdVersion.school-year-id = StuTranCourse.school-year-id) AND (SchdVersion.bldg-id = StuTranCourse.bldg-id) AND (SchdVersion.active-schedule = Yes). /* reset our counter */ GPID = ?. /* Check each final mark in order */ FinalLoop: FOR EACH FinalMark WHERE FinalMark.school-year-id = MarkItem.school-year-id AND FinalMark.bldg-id = MarkItem.bldg-id AND FinalMark.mark-id = MarkItem.mark-id BY FinalMark.school-year-id BY FinalMark.bldg-id BY FinalMark.final-order DESCENDING: /* check for a MasterSchdMark override */ FIND FIRST MasterSchdMark NO-LOCK WHERE (MasterSchdMark.school-year-id = StuTranCourse.school-year-id) AND (MasterSchdMark.bldg-id = StuTranCourse.bldg-id) AND (MasterSchdMark.schd-version-id = SchdVersion.schd-version-id) AND (MasterSchdMark.course-id = StuTranCourse.course-id) AND (MasterSchdMark.section-id = StuTranCourse.section-id) AND (MasterSchdMark.record-mark-id = FinalMark.mark-id) NO-ERROR. IF AVAILABLE MasterSchdMark THEN DO: FIND FinalTempMark NO-LOCK WHERE (FinalTempMark.school-year-id = MasterSchdMark.school-year-id) AND (FinalTempMark.bldg-id = MasterSchdMark.bldg-id) AND (FinalTempMark.grading-period-id = MasterSchdMark.record-grading-period-id) AND (FinalTempMark.mark-id = MasterSchdMark.record-mark-id) NO-ERROR. LEAVE FinalLoop. END. /* fetch the schedule, etc. and use gradutil to see when its active */ FIND FIRST MasterSchd OF SchdVersion NO-LOCK WHERE (MasterSchd.course-id = StuTranCourse.course-id) AND (MasterSchd.section-id = StuTranCourse.section-id) NO-ERROR. IF NOT AVAILABLE MasterSchd THEN LEAVE FinalLoop. /* when this loop finishes, we will have the GPID of the courses */ /* ending grading period */ FOR EACH GradingPeriodMark NO-LOCK WHERE GradingPeriodMark.school-year-id = StuTranCourse.school-year-id AND GradingPeriodMark.bldg-id = StuTranCourse.bldg-id AND GradingPeriodMark.mark-id = FinalMark.mark-id, GradingPeriod OF GradingPeriodmark BY GradingPeriodMark.school-year-id BY GradingPeriodMark.bldg-id BY GradingPeriodMark.grading-period-id BY GradingPeriodMark.mark-order: {gradutil.i SET PRIMARY-PERIOD GradingPeriod} {gradutil.i GET COURSE-ENABLED MasterSchd IsEnabled} IF IsEnabled THEN GPID = GradingPeriodMark.grading-period-id. END. IF GPID <> ? THEN LEAVE FinalLoop. END. /* finalLoop */ IF AVAILABLE FinalTempMark THEN FIND FinalMark WHERE RECID(FinalMark) = RECID(FinalTempMark) NO-LOCK NO-ERROR. ELSE IF GPID <> ? THEN DO: FIND FinalMark NO-LOCK WHERE FinalMark.school-year-id = StuTranCourse.school-year-id AND FinalMark.bldg-id = StuTranCourse.bldg-id AND FinalMark.grading-period-id = GPID AND FinalMark.mark-id = MarkItem.mark-id NO-ERROR. END. IF AVAILABLE FinalMark THEN /* load the MarkItem */ FIND FIRST MarkItem WHERE MarkItem.school-year-id = StuTranCourse.school-year-id AND MarkItem.bldg-id = StuTranCourse.bldg-id AND MarkItem.grading-period-id = ? AND MarkItem.mark-id = FinalMark.mark-id AND MarkItem.mark-order = MarkNum NO-ERROR. END. /* Get the grade */ FIND StuTranMark WHERE StuTranMark.stu-seq = StuTranCourse.stu-seq AND StuTranMark.transcript-id = StuTranCourse.transcript-id AND StuTranMark.transcript-seq = StuTranCourse.transcript-seq AND StuTranMark.grading-period-id = (IF AVAILABLE FinalMark THEN FinalMark.grading-period-id ELSE MarkItem.grading-period-id) AND StuTranMark.mark-id = MarkItem.mark-id NO-ERROR. /* If there was no mark, create one */ IF NOT AVAILABLE StuTranMark AND AVAILABLE TheDisposition THEN DO: DispositionOK = no. RETURN. END. /* Handle setting/clearing the grade */ IF AVAILABLE TheDisposition THEN ASSIGN StuTranMark.course-disposition-id = TheDisposition.course-disposition-id. ELSE IF AVAILABLE StuTranMark THEN StuTranMark.course-disposition-id = ?. /* Flag A-Okay */ DispositionOK = Yes. END. /* Cleanup & delete ourselves */ PROCEDURE Cleanup: DELETE PROCEDURE THIS-PROCEDURE. END. RETURN.