/* imp-grades.p - Import student report cards */ /***************************** Modifications **********************************/ /* */ /* 04/01/1999 LW Added logic to accommodate courses with master-schd-mark */ /* overides for grading periods */ /* */ /********************************* Note: **************************************/ /* Note: All grades are assumed to be letter grades */ /* Note: Grades must be defined in the same order that the associated marks */ /* are defined in the grading-period-mark table!! */ /* Fld 1 Bldg Code 2 Student ID 3 Course # 4 Section # 5 Grading Period Name 6 Grade #1 (required!) 7 Grade #2 (optional, unless required by period) 8 Grade #3 (optional, unless required by period) 9 Grade #4 (optional, unless required by period) 10 Grade #5 (optional, unless required by period) 11 Comment Code #1 12 Comment Code #2 13 Comment Code #3 14 Comment Code #4 15 Comment Code #5 16 General Comments */ /* Include commons */ {common.i NEW} {p-init.i "'IMPORTER'"} {gradutil.i DEFINE NEW} {cmntutil.i DEFINE NEW} /* Constants */ &SCOPED WriteCmd PUT STREAM LogStream UNFORMATTED &SCOPED WriteHdr "#" LineCnt ", " ImportText[2] ", " ImportText[3] ": " &SCOPED WriteLog {&WriteCmd} {&WriteHdr} /* Define Variables */ DEFINE VARIABLE SchoolYearName AS CHARACTER NO-UNDO. DEFINE VARIABLE ImportFile AS CHARACTER NO-UNDO. DEFINE VARIABLE ExportFile AS CHARACTER NO-UNDO. DEFINE VARIABLE LogFile AS CHARACTER NO-UNDO. DEFINE VARIABLE ReplaceMode AS LOGICAL NO-UNDO. DEFINE VARIABLE PurgeMode AS LOGICAL NO-UNDO. DEFINE VARIABLE ImportText AS CHARACTER EXTENT 50 NO-UNDO. DEFINE VARIABLE LineCnt AS INTEGER NO-UNDO. DEFINE VARIABLE AutoCreate AS LOGICAL NO-UNDO. /* Variables for statistics */ DEFINE VARIABLE TotalLineCnt AS INTEGER NO-UNDO. DEFINE VARIABLE StartTime AS INTEGER NO-UNDO. DEFINE VARIABLE LastUpdate AS INTEGER NO-UNDO. DEFINE VARIABLE PercentDone AS DECIMAL NO-UNDO. DEFINE VARIABLE LinesPerSec AS DECIMAL NO-UNDO. DEFINE VARIABLE ErrorCnt AS INTEGER NO-UNDO. DEFINE VARIABLE Elapsed AS CHARACTER NO-UNDO. DEFINE VARIABLE TimeRemain AS CHARACTER NO-UNDO. DEFINE VARIABLE MSMEnabled AS LOGICAL NO-UNDO. DEFINE VARIABLE CourseEnabled AS LOGICAL NO-UNDO. DEFINE VARIABLE GradeList AS CHARACTER EXTENT 20 NO-UNDO. DEFINE VARIABLE GradePtr AS INTEGER NO-UNDO. DEFINE VARIABLE CommentList AS CHARACTER EXTENT 99 NO-UNDO. DEFINE VARIABLE CommentPtr AS INTEGER NO-UNDO. DEFINE VARIABLE TheComment AS INTEGER NO-UNDO. DEFINE VARIABLE theCommentID AS INTEGER NO-UNDO. DEFINE VARIABLE Done AS LOGICAL NO-UNDO. /* Define Buffers */ DEFINE BUFFER SchoolYear FOR school-year. DEFINE BUFFER Building FOR building. DEFINE BUFFER SchdVersion FOR schd-version. DEFINE BUFFER StuBase FOR stu-base. DEFINE BUFFER StuYear FOR stu-year. DEFINE BUFFER GradingPeriod FOR grading-period. DEFINE BUFFER AltGradingPeriod FOR grading-period. DEFINE BUFFER CourseCatalog FOR course-catalog. DEFINE BUFFER MasterSchd FOR master-schd. DEFINE BUFFER MasterSchdMark FOR master-schd-mark. DEFINE BUFFER StuSchedule FOR stu-schedule. DEFINE BUFFER SchdStatus FOR schd-status. DEFINE BUFFER StuGrade FOR stu-grade. DEFINE BUFFER AltStuGrade FOR stu-grade. DEFINE BUFFER GradingPeriodMark FOR grading-period-mark. DEFINE BUFFER StuGradeComment FOR stu-grade-comment. DEFINE BUFFER CourseLevelGrade FOR course-level-grade. DEFINE BUFFER StuGradeMark FOR stu-grade-mark. DEFINE BUFFER GradingComment FOR grading-comment. /* Define Streams */ DEFINE STREAM ImportStream. DEFINE STREAM LogStream. DEFINE STREAM ExportStream. /* Status frame */ FORM TotalLineCnt COLUMN-LABEL "Total!Lines" FORMAT "zzzzz9" LineCnt COLUMN-LABEL "Curnt!Line" FORMAT "zzzzz9" PercentDone COLUMN-LABEL "%age!Done" FORMAT "zz9.99%" LinesPerSec COLUMN-LABEL "Lines!/sec" FORMAT "zz9.99" ErrorCnt COLUMN-LABEL "Errors" FORMAT "zzzz9" Elapsed COLUMN-LABEL "Elapsed!Time" TimeRemain COLUMN-LABEL "Time!Remain" WITH FRAME StatusFrame 1 DOWN CENTERED ROW 9 OVERLAY COLOR VALUE(the-color.c-proc) TITLE COLOR VALUE(the-color.c-title) " Student Grades Importation Statistics ". /* First, get the import file */ QueryBlock: DO WHILE TRUE ON ERROR UNDO, RETURN ON ENDKEY UNDO, RETURN: /* Define the form */ FORM SchoolYearName LABEL " School Year to import to" FORMAT "x(9)" ImportFile LABEL " Import from" FORMAT "x(255)" VIEW-AS FILL-IN SIZE 32 BY 1 SPACE(1) PurgeMode LABEL " Purge grades first" FORMAT "Yes/No" SKIP ReplaceMode LABEL " Existing records should be" FORMAT "Replaced/Kept" LogFile LABEL " Log import results to" FORMAT "x(255)" VIEW-AS FILL-IN SIZE 32 BY 1 SPACE(1) AutoCreate LABEL " Auto-create codes" FORMAT "Yes/No" SKIP ExportFile LABEL " Backup replaced data to" FORMAT "x(255)" VIEW-AS FILL-IN SIZE 32 BY 1 WITH FRAME QueryFrame OVERLAY 1 DOWN CENTERED ROW 10 SIDE-LABELS COLOR VALUE(the-color.c-proc) PROMPT VALUE(the-color.c-input). /* Default things for the user */ ON LEAVE OF ImportFile IN FRAME QueryFrame DO: /* Define Variables */ DEFINE VARIABLE DotPtr AS INTEGER NO-UNDO. /* Get pointer to decimal */ DotPtr = INDEX(ImportFile:SCREEN-VALUE, "."). IF DotPtr = 0 THEN RETURN. /* Default the log file */ IF LogFile:SCREEN-VALUE = "" THEN LogFile:SCREEN-VALUE = SUBSTR(SELF:SCREEN-VALUE, 1, DotPtr - 1) + ".log". /* Default the backup file */ IF ExportFile:SCREEN-VALUE = "" THEN ExportFile:SCREEN-VALUE = SUBSTR(SELF:SCREEN-VALUE, 1, DotPtr - 1) + ".org". END. /* Query the user */ UPDATE SchoolYearName SKIP ImportFile SKIP PurgeMode SKIP ReplaceMode SKIP LogFile SKIP AutoCreate SKIP ExportFile SKIP WITH FRAME QueryFrame OVERLAY 1 DOWN CENTERED ROW 8 SIDE-LABELS COLOR VALUE(the-color.c-proc) PROMPT VALUE(the-color.c-input) TITLE COLOR VALUE(the-color.c-title) " Import Student Grades ". /* See if the note exists */ IF SEARCH(ImportFile) = ? THEN DO: BELL. {safe-msg.i "'Cannot find the import source file'"} NEXT. END. /* Load the year buffer */ FIND SchoolYear WHERE SchoolYear.school-year-name = SchoolYearName NO-LOCK NO-ERROR. IF NOT AVAILABLE SchoolYear THEN DO: BELL. {safe-msg.i "'School year not on file'"} NEXT. END. /* Make sure the backup file should be overwritten */ IF SEARCH(ExportFile) <> ? THEN DO: DO ON ERROR UNDO, NEXT QueryBlock ON ENDKEY UNDO, NEXT QueryBlock: MESSAGE COLOR VALUE(the-color.c-alert) " " ExportFile "already exists " SKIP " Do you want to overwrite it?" SKIP VIEW-AS ALERT-BOX QUESTION BUTTONS YES-NO UPDATE OverwriteFile AS LOGICAL. END. /* Iterate if not okay */ IF NOT OverwriteFile THEN NEXT. END. /* Done */ LEAVE. END. /* Purge catalogs */ IF PurgeMode THEN DO: MESSAGE "Purging grades, please be patient...". FOR EACH StuGrade: DELETE StuGrade. END. HIDE MESSAGE NO-PAUSE. END. /* Load the profile */ FIND FIRST spm-prof NO-LOCK. /* Get line count */ INPUT STREAM ImportStream THROUGH VALUE("wc -l " + ImportFile). IMPORT STREAM ImportStream ImportText. INPUT STREAM ImportStream CLOSE. TotalLineCnt = INTEGER(ImportText[1]). DISPLAY TotalLineCnt WITH FRAME StatusFrame. /* Open the file */ INPUT STREAM ImportStream FROM VALUE(ImportFile). OUTPUT STREAM LogStream TO VALUE(LogFile) PAGE-SIZE 0. OUTPUT STREAM ExportStream TO VALUE(ExportFile) PAGE-SIZE 0. /* Hide the query frame */ HIDE FRAME QueryFrame NO-PAUSE. /* Reset counters */ ASSIGN StartTime = TIME LastUpdate = StartTime. /* Begin Processing */ ImportLoop: REPEAT ON ERROR UNDO, LEAVE ON ENDKEY UNDO, LEAVE: /* Get a line */ ImportText = "". IMPORT STREAM ImportStream ImportText. LineCnt = LineCnt + 1. /* Update status display */ IF (TIME - LastUpdate) > 2 THEN DO: DISPLAY LineCnt (LineCnt / TotalLineCnt) * 100 @ PercentDone LineCnt / (TIME - StartTime) @ LinesPerSec ErrorCnt STRING(TIME - StartTime, "HH:MM:SS") @ Elapsed STRING(INTEGER((TotalLineCnt - LineCnt) / (LineCnt / (TIME - StartTime))), "HH:MM:SS") @ TimeRemain WITH FRAME StatusFrame. LastUpdate = TIME. END. /* Make sure we have our required fields */ IF (ImportText[1] = "") OR (ImportText[1] = ?) OR (ImportText[2] = "") OR (ImportText[2] = ?) OR (ImportText[3] = "") OR (ImportText[3] = ?) OR (ImportText[4] = "") OR (ImportText[4] = ?) OR (ImportText[5] = "") OR (ImportText[5] = ?) OR (ImportText[6] = "") OR (ImportText[6] = ?) THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "One or more REQUIRED fields missing, NOT imported" SKIP. NEXT ImportLoop. END. /* Make sure we can find the building */ FIND FIRST Building OF SchoolYear NO-LOCK WHERE Building.bldg-code = ImportText[1] NO-ERROR. IF NOT AVAILABLE Building THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Bldg is not on file, NOT imported" SKIP. NEXT ImportLoop. END. /* Load the version buffer */ FIND FIRST SchdVersion OF Building NO-LOCK WHERE SchdVersion.active-schedule = Yes. /* See if the student is already on file */ FIND StuBase WHERE StuBase.stu-id = ImportText[2] NO-ERROR. IF AVAILABLE StuBase THEN FIND StuYear OF SchoolYear WHERE StuYear.stu-seq = StuBase.stu-seq NO-ERROR. IF NOT AVAILABLE StuBase OR NOT AVAILABLE StuYear THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Student is not on file, NOT imported" SKIP. NEXT ImportLoop. END. /* See if we can find the grading period */ FIND FIRST GradingPeriod OF Building NO-LOCK WHERE GradingPeriod.grading-period-name = ImportText[5] NO-ERROR. IF NOT AVAILABLE GradingPeriod THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Unknown grading period, NOT imported" SKIP. NEXT ImportLoop. END. {gradutil.i SET PRIMARY-PERIOD GradingPeriod} {cmntutil.i SET GRADING_PERIOD GradingPeriod} /* Lookup the course */ FIND FIRST CourseCatalog OF Building NO-LOCK WHERE CourseCatalog.course-code = ImportText[3] NO-ERROR. IF NOT AVAILABLE CourseCatalog THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "No such course catalog entry on file, NOT imported" SKIP. NEXT ImportLoop. END. /* Lookup the master schedule */ FIND FIRST MasterSchd OF SchdVersion NO-LOCK WHERE MasterSchd.course-id = CourseCatalog.course-id AND MasterSchd.section-num = INTEGER(ImportText[4]) NO-ERROR. IF NOT AVAILABLE MasterSchd THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "No such master schd entry on file, NOT imported" SKIP. NEXT ImportLoop. END. /* See if this course is enabled */ {gradutil.i GET COURSE-ENABLED MasterSchd CourseEnabled} IF NOT CourseEnabled THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Course is not enabled for this grading period, NOT imported" SKIP. NEXT ImportLoop. END. /* Lookup this schedule entry */ FIND FIRST StuSchedule OF SchdVersion NO-LOCK WHERE StuSchedule.course-id = MasterSchd.course-id AND StuSchedule.section-id = MasterSchd.section-id AND StuSchedule.current-entry = Yes AND StuSchedule.stu-seq = StuYear.stu-seq NO-ERROR. IF NOT AVAILABLE StuSchedule THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Specified course/section not in students schedule, NOT imported" SKIP. NEXT ImportLoop. END. /* See if the course is dropped */ FIND SchdStatus OF StuSchedule NO-LOCK. IF SchdStatus.include-report-card = No THEN DO: {&WriteLog} "Warning: importing grades into a 'dropped' course" SKIP. END. /* Check if there is a master-schd-mark override for this course */ IF NOT CAN-FIND(FIRST MasterSchdMark OF SchdVersion WHERE MasterSchdMark.course-id = StuSchedule.course-id AND MasterSchdMark.section-id = StuSchedule.section-id AND MasterSchdMark.grading-period-id = GradingPeriod.grading-period-id) THEN DO: /* See if there is already an entry for this period/course */ FIND FIRST StuGrade WHERE StuGrade.school-year-id = StuSchedule.school-year-id AND StuGrade.bldg-id = StuSchedule.bldg-id AND StuGrade.course-id = StuSchedule.course-id AND StuGrade.section-id = StuSchedule.section-id AND StuGrade.grading-period-id = GradingPeriod.grading-period-id AND StuGrade.stu-seq = StuSchedule.stu-seq NO-ERROR. IF AVAILABLE StuGrade THEN DO: /* Handle unreplacable mode */ IF NOT ReplaceMode THEN DO: {&WriteLog} "Existing grades entry for this course/period, NOT imported" SKIP. NEXT ImportLoop. END. /* Collect mark based grades */ GradeList = "". FOR EACH GradingPeriodMark OF GradingPeriod NO-LOCK, FIRST StuGradeMark OF StuGrade NO-LOCK WHERE StuGradeMark.mark-id = GradingPeriodMark.mark-id, FIRST CourseLevelGrade OF StuGradeMark NO-LOCK: GradeList[GradingPeriodMark.mark-order] = CourseLevelGrade.letter-grade. END. /* Collect comments */ ASSIGN CommentPtr = 0 CommentList = "". FOR EACH StuGradeComment OF StuGrade NO-LOCK, FIRST GradingComment OF StuGradeComment NO-LOCK: ASSIGN CommentPtr = CommentPtr + 1 CommentList[CommentPtr] = STRING(GradingComment.grading-comment-num). END. /* Create a backup */ EXPORT STREAM ExportStream Building.bldg-code StuYear.stu-id CourseCatalog.course-code MasterSchd.section-num GradingPeriod.grading-period-name GradeList[1 FOR 5] CommentList[1 FOR 5] StuGrade.comments. END. ELSE DO: /* Create an entry */ CREATE StuGrade. ASSIGN StuGrade.school-year-id = StuSchedule.school-year-id StuGrade.bldg-id = StuSchedule.bldg-id StuGrade.stu-seq = StuSchedule.stu-seq StuGrade.course-id = StuSchedule.course-id StuGrade.section-id = StuSchedule.section-id StuGrade.grading-period-id = GradingPeriod.grading-period-id. END. /* Process each imported grade */ DO GradePtr = 1 TO 5: /* Skip blank grades */ IF (ImportText[GradePtr + 5] = "") OR (ImportText[GradePtr + 5] = ?) THEN NEXT. /* Load the mark pointer up */ FIND FIRST GradingPeriodMark OF GradingPeriod NO-LOCK WHERE GradingPeriodMark.mark-order = GradePtr NO-ERROR. IF NOT AVAILABLE GradingPeriodMark THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Grade where there is no mark for the period, NOT imported" SKIP. UNDO ImportLoop, NEXT ImportLoop. END. /* Xlate the mark */ FIND FIRST CourseLevelGrade OF Building NO-LOCK WHERE CourseLevelGrade.course-level-id = MasterSchd.course-level-id AND CourseLevelGrade.letter-grade = ImportText[GradePtr + 5] NO-ERROR. IF NOT AVAILABLE CourseLevelGrade THEN DO: IF NOT AutoCreate THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Unknown letter grade, NOT imported" SKIP. UNDO ImportLoop, NEXT ImportLoop. END. /* Create a new grade */ CREATE CourseLevelGrade. ASSIGN CourseLevelGrade.school-year-id = Building.school-year-id CourseLevelGrade.bldg-id = Building.bldg-id CourseLevelGrade.course-level-id = MasterSchd.course-level-id CourseLevelGrade.letter-grade = CAPS(ImportText[GradePtr + 5]) CourseLevelGrade.description = "<< CREATED BY IMPORTER >>". {&WriteLog} "Created grade " ImportText[GradePtr + 5] ", Please check it out" SKIP. END. /* Load/Create StuGradeMark record */ FIND FIRST StuGradeMark OF StuGrade WHERE StuGradeMark.mark-id = GradingPeriodMark.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.grading-period-id = StuGrade.grading-period-id StuGradeMark.stu-seq = StuGrade.stu-seq StuGradeMark.stu-grade-seq = StuGrade.stu-grade-seq StuGradeMark.mark-id = GradingPeriodMark.mark-id. END. /* Set the mark in place */ ASSIGN StuGradeMark.course-level-id = CourseLevelGrade.course-level-id StuGradeMark.course-level-grade-id = CourseLevelGrade.course-level-grade-id. END. /* A master-schd-mark override course */ END. ELSE DO: /* Go through each of the master-schd-mark overrides to find existing grades */ FOR EACH MasterSchdMark OF SchdVersion NO-LOCK WHERE MasterSchdMark.course-id = StuSchedule.course-id AND MasterSchdMark.section-id = StuSchedule.section-id AND MasterSchdMark.grading-period-id = GradingPeriod.grading-period-id: /* Get the grading-period for the recorded-in grading period */ FIND FIRST AltGradingPeriod OF Building NO-LOCK WHERE AltGradingPeriod.grading-period-id = MasterSchdMark.record-grading-period-id. /* See if there is already an entry for this period/course */ FIND FIRST StuGrade WHERE StuGrade.school-year-id = StuSchedule.school-year-id AND StuGrade.bldg-id = StuSchedule.bldg-id AND StuGrade.course-id = StuSchedule.course-id AND StuGrade.section-id = StuSchedule.section-id AND StuGrade.grading-period-id = AltGradingPeriod.grading-period-id AND StuGrade.stu-seq = StuSchedule.stu-seq NO-ERROR. IF AVAILABLE StuGrade THEN DO: /* Handle unreplacable mode */ IF NOT ReplaceMode THEN DO: {&WriteLog} "Existing grades entry for this course/period, NOT imported" SKIP. NEXT ImportLoop. END. /* Collect mark based grades */ GradeList = "". FOR EACH GradingPeriodMark OF AltGradingPeriod NO-LOCK, FIRST StuGradeMark OF StuGrade NO-LOCK WHERE StuGradeMark.mark-id = GradingPeriodMark.mark-id, FIRST CourseLevelGrade OF StuGradeMark NO-LOCK: GradeList[GradingPeriodMark.mark-order] = CourseLevelGrade.letter-grade. END. /* Collect comments */ ASSIGN CommentPtr = 0 CommentList = "". FOR EACH StuGradeComment OF StuGrade NO-LOCK, FIRST GradingComment OF StuGradeComment NO-LOCK: ASSIGN CommentPtr = CommentPtr + 1 CommentList[CommentPtr] = STRING(GradingComment.grading-comment-num). END. /* Create a backup */ EXPORT STREAM ExportStream Building.bldg-code StuYear.stu-id CourseCatalog.course-code MasterSchd.section-num AltGradingPeriod.grading-period-name GradeList[1 FOR 5] CommentList[1 FOR 5] StuGrade.comments. END. ELSE DO: /* Create an entry */ CREATE StuGrade. ASSIGN StuGrade.school-year-id = StuSchedule.school-year-id StuGrade.bldg-id = StuSchedule.bldg-id StuGrade.stu-seq = StuSchedule.stu-seq StuGrade.course-id = StuSchedule.course-id StuGrade.section-id = StuSchedule.section-id StuGrade.grading-period-id = AltGradingPeriod.grading-period-id. END. END. /* Process each imported grade */ DO GradePtr = 1 TO 5: /* Skip blank grades */ IF (ImportText[GradePtr + 5] = "") OR (ImportText[GradePtr + 5] = ?) THEN NEXT. /* Get the master-schd-mark override to set the grading period */ FIND FIRST MasterSchdMark OF SchdVersion NO-LOCK WHERE MasterSchdMark.course-id = StuSchedule.course-id AND MasterSchdMark.section-id = StuSchedule.section-id AND MasterSchdMark.grading-period-id = GradingPeriod.grading-period-id AND MasterSchdMark.mark-order = GradePtr NO-ERROR. IF NOT AVAILABLE MasterSchdMark THEN NEXT. /* Get the grading-period for the override */ FIND FIRST AltGradingPeriod OF Building NO-LOCK WHERE AltGradingPeriod.grading-period-id = MasterSchdMark.record-grading-period-id. /* Check for the stu-grade for the course and overridden period */ FIND FIRST StuGrade WHERE StuGrade.school-year-id = StuSchedule.school-year-id AND StuGrade.bldg-id = StuSchedule.bldg-id AND StuGrade.course-id = StuSchedule.course-id AND StuGrade.section-id = StuSchedule.section-id AND StuGrade.grading-period-id = AltGradingPeriod.grading-period-id AND StuGrade.stu-seq = StuSchedule.stu-seq NO-ERROR. /* Load the grading-period-mark from the mark pointer */ FIND FIRST GradingPeriodMark OF AltGradingPeriod NO-LOCK WHERE GradingPeriodMark.mark-order = GradePtr NO-ERROR. IF NOT AVAILABLE GradingPeriodMark THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Grade where there is no mark for the period, NOT imported" SKIP. UNDO ImportLoop, NEXT ImportLoop. END. /* Xlate the mark */ FIND FIRST CourseLevelGrade OF Building NO-LOCK WHERE CourseLevelGrade.course-level-id = MasterSchd.course-level-id AND CourseLevelGrade.letter-grade = ImportText[GradePtr + 5] NO-ERROR. IF NOT AVAILABLE CourseLevelGrade THEN DO: IF NOT AutoCreate THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Unknown letter grade, NOT imported" SKIP. UNDO ImportLoop, NEXT ImportLoop. END. /* Create a new grade */ CREATE CourseLevelGrade. ASSIGN CourseLevelGrade.school-year-id = Building.school-year-id CourseLevelGrade.bldg-id = Building.bldg-id CourseLevelGrade.course-level-id = MasterSchd.course-level-id CourseLevelGrade.letter-grade = CAPS(ImportText[GradePtr + 5]) CourseLevelGrade.description = "<< CREATED BY IMPORTER >>". {&WriteLog} "Created grade " ImportText[GradePtr + 5] ", Please check it out" SKIP. END. /* Load/Create StuGradeMark record */ FIND FIRST StuGradeMark OF StuGrade WHERE StuGradeMark.mark-id = GradingPeriodMark.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.grading-period-id = StuGrade.grading-period-id StuGradeMark.stu-seq = StuGrade.stu-seq StuGradeMark.stu-grade-seq = StuGrade.stu-grade-seq StuGradeMark.mark-id = GradingPeriodMark.mark-id. END. /* Set the mark in place */ ASSIGN StuGradeMark.course-level-id = CourseLevelGrade.course-level-id StuGradeMark.course-level-grade-id = CourseLevelGrade.course-level-grade-id. END. END. /* Get the stu-grade record */ FIND FIRST StuGrade WHERE StuGrade.school-year-id = StuSchedule.school-year-id AND StuGrade.bldg-id = StuSchedule.bldg-id AND StuGrade.course-id = StuSchedule.course-id AND StuGrade.section-id = StuSchedule.section-id AND StuGrade.grading-period-id = GradingPeriod.grading-period-id AND StuGrade.stu-seq = StuSchedule.stu-seq. /* Process each imported comment */ DO CommentPtr = 1 TO 5: /* Skip blank comments */ IF (ImportText[CommentPtr + 10] = "") OR (ImportText[CommentPtr + 10] = ?) THEN NEXT. /* Make sure it's a number */ TheComment = INTEGER(ImportText[CommentPtr + 10]) NO-ERROR. IF ERROR-STATUS:ERROR OR (TheComment < 1) OR (TheComment > 999) THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Non-numeric or out of range comment, NOT imported" SKIP. UNDO ImportLoop, NEXT ImportLoop. END. /* Xlate the comment */ {cmntutil.i GET GRADE_COMMENT_ID theComment MasterSchd theCommentID} IF theCommentID = ? THEN DO: IF NOT AutoCreate THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Unknown comment code, NOT imported" SKIP. UNDO ImportLoop, NEXT ImportLoop. END. /* Create a new comment code */ CREATE GradingComment. ASSIGN GradingComment.school-year-id = GradingPeriod.school-year-id GradingComment.bldg-id = GradingPeriod.bldg-id GradingComment.grading-period-id = GradingPeriod.grading-period-id GradingComment.grading-comment-num = TheComment GradingComment.description = "<< CREATED BY IMPORTER >>". {&WriteLog} "Created comment Code " TheComment ", Please check it out" SKIP. END. /* Load/Create StuGradeComment record */ FIND FIRST StuGradeComment WHERE StuGradeComment.school-year-id = StuGrade.school-year-id AND StuGradeComment.bldg-id = StuGrade.bldg-id AND StuGradeComment.grading-period-id = StuGrade.grading-period-id AND StuGradeComment.stu-seq = StuGrade.stu-seq AND StuGradeComment.stu-grade-seq = StuGrade.stu-grade-seq AND StuGradeComment.grading-comment-id = theCommentID NO-ERROR. IF NOT AVAILABLE StuGradeComment THEN DO: CREATE StuGradeComment. ASSIGN StuGradeComment.school-year-id = StuGrade.school-year-id StuGradeComment.bldg-id = StuGrade.bldg-id StuGradeComment.grading-period-id = StuGrade.grading-period-id StuGradeComment.stu-seq = StuGrade.stu-seq StuGradeComment.stu-grade-seq = StuGrade.stu-grade-seq StuGradeComment.grading-comment-id = theCommentID. END. END. /* Assign general comment */ StuGrade.comments = ImportText[16]. END. /* Final statistics update */ DISPLAY LineCnt (LineCnt / TotalLineCnt) * 100 @ PercentDone LineCnt / (TIME - StartTime) @ LinesPerSec ErrorCnt STRING(TIME - StartTime, "HH:MM:SS") @ Elapsed STRING(INTEGER((TotalLineCnt - LineCnt) / (LineCnt / (TIME - StartTime))), "HH:MM:SS") @ TimeRemain WITH FRAME StatusFrame. /* Close the input & log streams */ INPUT STREAM ImportStream CLOSE. OUTPUT STREAM LogStream CLOSE. OUTPUT STREAM ExportStream CLOSE. /* We are done */ {gradutil.i CLEAN_UP} {safe-msg.i "'Import Complete'"} RETURN.