/* imp-master.p - Import the master schedule */ /* Format for import lines is ** Note that there can be multiple occurances of a given master ** ** master schedule with different meeting #'s (#20) to allow ** ** >1 meeting for a course to be loaded. ** 1 - BldgCode 2 - Course Code 3 - Section # 4 - Credits (blank = course catalog) 5 - Scheduling Group (blank = SEMESTER) 6 - Course Fee (blank = use course catalog) 7 - Grading policy (Letter, Pass/Fail, Numeric. blank=course catalog) 8 - Seat limit (? = No limit, <> ? is seat limit, blank=crscat) 9 - FTE Limit (? = No limit, <> ? is FTE limit, blank=crscat) 10 - Course grading level (blank=course catalog) 11 - Allow Conflicts? Y/N (blank = Course Catalog) 12 - Include in attendance? Y/N (blank = course catalog) 13 - Include in GPA calcs? Y/N " " " 14 - Include in honor rolls? Y/N " " " 15 - Include in Progress reports? Y/N " " " 16 - Include in ranking? Y/N " " " 17 - Include in report cards? Y/N " " " 18 - Retakes get credit? Y/N " " " 19 - Comments 20 - Meeting # (default to 1) 21 - Meets in room 22 - Taught by personnel code 23 - Starting scheduling period 24 - Ending scheduling period (default to starting period) 25 - Meets what period in the day 26 - List of days course meets (i.e. M,W,F - names per schd-version!!!) */ /* Include commons */ {common.i NEW} {p-init.i "'IMPORTER'"} /* Constants */ &SCOPED WriteCmd PUT STREAM LogStream UNFORMATTED &SCOPED WriteHdr "#" LineCnt ", " ImportText[1] ", " ImportText[2] ": " &SCOPED WriteLog {&WriteCmd} {&WriteHdr} /* Define Variables */ DEFINE VARIABLE SchoolYear 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 TheList AS CHARACTER NO-UNDO. DEFINE VARIABLE ThePtr AS INTEGER NO-UNDO. DEFINE VARIABLE StartSchdPeriod AS CHARACTER NO-UNDO. DEFINE VARIABLE EndSchdPeriod AS CHARACTER NO-UNDO. /* Define Buffers */ DEFINE BUFFER YearBuff FOR school-year. DEFINE BUFFER BldgBuff FOR building. DEFINE BUFFER VrsnBuff FOR schd-version. /* 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) " Master Schedule Importation Statistics ". /* First, get the import file */ QueryBlock: DO WHILE TRUE ON ERROR UNDO, RETURN ON ENDKEY UNDO, RETURN: /* Define the form */ FORM SchoolYear 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 master schedule 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 SchoolYear SKIP ImportFile SKIP PurgeMode SKIP ReplaceMode SKIP LogFile SKIP AutoCreate SKIP ExportFile SKIP WITH FRAME QueryFrame OVERLAY 1 DOWN CENTERED ROW 10 SIDE-LABELS COLOR VALUE(the-color.c-proc) PROMPT VALUE(the-color.c-input) TITLE COLOR VALUE(the-color.c-title) " Import Master Schedule ". /* 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 YearBuff WHERE YearBuff.school-year-name = SchoolYear NO-LOCK NO-ERROR. IF NOT AVAILABLE YearBuff 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 master-schedule, please be patient...". FOR EACH master-schd OF YearBuff: DELETE master-schd. END. FOR EACH master-schd-meets OF YearBuff: DELETE master-schd-meets. END. FOR EACH master-schd-stats OF YearBuff: DELETE master-schd-stats. END. FOR EACH master-schd-display OF YearBuff: DELETE master-schd-display. END. HIDE MESSAGE NO-PAUSE. END. /* 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[21] = "") OR (ImportText[21] = ?) OR (ImportText[22] = "") OR (ImportText[22] = ?) OR (ImportText[23] = "") OR (ImportText[23] = ?) OR (ImportText[25] = "") OR (ImportText[25] = ?) OR (ImportText[26] = "") OR (ImportText[26] = ?) THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "One or more REQUIRED fields missing, NOT imported" SKIP. NEXT ImportLoop. END. /* Handle a missing meeting # */ IF (ImportText[20] = "") OR (ImportText[20] = ?) THEN ImportText[20] = "1". /* Make sure we can find the building */ FIND FIRST BldgBuff OF YearBuff NO-LOCK WHERE BldgBuff.bldg-code = ImportText[1] NO-ERROR. IF NOT AVAILABLE BldgBuff THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Bldg is not on file, NOT imported" SKIP. NEXT ImportLoop. END. /* Load the version buffer */ FIND FIRST VrsnBuff OF BldgBuff NO-LOCK WHERE VrsnBuff.active-schedule = Yes. /* See if the course is already on file */ FIND FIRST course-catalog OF BldgBuff WHERE course-catalog.course-code = ImportText[2] NO-ERROR. IF NOT AVAILABLE course-catalog THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Course is not in course catalog, NOT imported" SKIP. NEXT ImportLoop. END. /* See if the master schd record is still around */ FIND FIRST master-schd OF VrsnBuff WHERE master-schd.course-id = course-catalog.course-id AND master-schd.section-num = INTEGER(ImportText[3]) NO-ERROR. IF AVAILABLE master-schd THEN DO: /* See if we have the master-schd-meets entry */ FIND FIRST master-schd-meets OF master-schd WHERE master-schd-meets.meet-num = INTEGER(ImportText[20]) NO-ERROR. IF AVAILABLE master-schd-meets THEN DO: /* Handle unreplacable mode */ IF NOT ReplaceMode THEN DO: {&WriteLog} "Existing master-schd entry on file, NOT imported" SKIP. NEXT ImportLoop. END. /* Load ancillary records */ FIND course-level OF master-schd NO-LOCK. FIND schd-group OF master-schd NO-LOCK. FIND personnel OF master-schd-meets NO-LOCK. FIND room-catalog OF master-schd-meets NO-LOCK. FIND period-catalog OF master-schd-meets NO-LOCK. /* Build up day List */ TheList = "". DO ThePtr = 1 TO VrsnBuff.days-per-sequence: IF NOT master-schd-meets.meet-on-day[ThePtr] THEN NEXT. TheList = TheList + "," + VrsnBuff.day-names[ThePtr]. END. SUBSTR(TheList, 1, 1) = "". /* Load starting period */ FIND FIRST schd-period OF VrsnBuff NO-LOCK WHERE schd-period.schd-group-id = master-schd.schd-group-id AND schd-period.schd-period-id = master-schd-meets.start-schd-period-id. StartSchdPeriod = schd-period.period-name. /* Load ending period */ FIND FIRST schd-period OF VrsnBuff NO-LOCK WHERE schd-period.schd-group-id = master-schd.schd-group-id AND schd-period.schd-period-id = master-schd-meets.end-schd-period-id. EndSchdPeriod = schd-period.period-name. /* Create a backup */ EXPORT STREAM ExportStream BldgBuff.bldg-code course-catalog.course-code master-schd.section-num master-schd.credits schd-group.schd-group-name master-schd.course-fee master-schd.grading-policy (IF master-schd.enforce-seat-limit THEN master-schd.max-seat-cnt ELSE ?) (IF master-schd.enforce-fte-limit THEN master-schd.max-fte ELSE ?) course-level.course-level-code master-schd.allow-conflicts master-schd.include-attend master-schd.include-gpa master-schd.include-honor master-schd.include-progress master-schd.include-rank master-schd.include-report-card master-schd.retake-credit master-schd.comments master-schd-meets.meet-num room-catalog.room-name personnel.personnel-code StartSchdPeriod EndSchdPeriod period-catalog.period-name TheList. END. END. ELSE DO: CREATE master-schd. ASSIGN master-schd.school-year-id = VrsnBuff.school-year-id master-schd.bldg-id = VrsnBuff.bldg-id master-schd.schd-version-id = VrsnBuff.schd-version-id master-schd.course-id = course-catalog.course-id master-schd.section-num = INTEGER(ImportText[3]) master-schd.allow-conflict = master-schd.allow-conflict master-schd.balance-by-age = course-catalog.balance-by-age master-schd.balance-by-age-high = course-catalog.balance-by-age-high master-schd.balance-by-age-low = course-catalog.balance-by-age-low master-schd.balance-by-gender = course-catalog.balance-by-gender master-schd.balance-by-gender-male-pct = course-catalog.balance-by-gender-male-pct master-schd.balance-by-grade = course-catalog.balance-by-grade master-schd.balance-by-grade-high-id = course-catalog.balance-by-grade-high-id master-schd.balance-by-grade-low-id = course-catalog.balance-by-grade-low-id master-schd.balance-retakes = course-catalog.balance-retakes master-schd.course-cost = course-catalog.course-cost master-schd.course-fee = course-catalog.course-fee master-schd.course-level-id = course-catalog.course-level-id master-schd.credits = course-catalog.credits master-schd.enforce-fte-limit = course-catalog.enforce-fte-limit master-schd.enforce-seat-limit = course-catalog.enforce-seat-limit master-schd.grading-policy = course-catalog.grading-policy master-schd.include-attend = course-catalog.include-attend master-schd.include-gpa = course-catalog.include-gpa master-schd.include-honor = course-catalog.include-honor master-schd.include-progress = course-catalog.include-progress master-schd.include-rank = course-catalog.include-rank master-schd.include-report-card = course-catalog.include-report-card master-schd.max-fte = course-catalog.max-fte master-schd.max-seat-cnt = course-catalog.max-seat-cnt master-schd.min-fte = course-catalog.min-fte master-schd.min-seat-cnt = course-catalog.min-seat-cnt master-schd.per-fte-cost = course-catalog.per-fte-cost master-schd.per-seat-cost = course-catalog.per-seat-cost master-schd.preferred-fte = course-catalog.preferred-fte master-schd.preferred-seat-cnt = course-catalog.preferred-seat-cnt master-schd.retake-credit = course-catalog.retake-credit NO-ERROR. /* Check for errors */ IF ERROR-STATUS:ERROR THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Bad master schedule section # of " ImportText[3] ", not imported" SKIP. UNDO ImportLoop, NEXT ImportLoop. END. END. /* Find/Create the meeting record */ FIND FIRST master-schd-meets OF master-schd WHERE master-schd-meets.meet-num = INTEGER(ImportText[20]) NO-ERROR. IF NOT AVAILABLE master-schd-meets THEN DO: CREATE master-schd-meets. ASSIGN master-schd-meets.school-year-id = master-schd.school-year-id master-schd-meets.bldg-id = master-schd.bldg-id master-schd-meets.schd-version-id = master-schd.schd-version-id master-schd-meets.course-id = master-schd.course-id master-schd-meets.section-id = master-schd.section-id master-schd-meets.meet-num = INTEGER(ImportText[20]). END. /* Handle defaults */ IF (ImportText[4] = ?) OR (ImportText[4] = "") THEN ImportText[4] = STRING(course-catalog.credits). IF (ImportText[5] = ?) OR (ImportText[5] = "") THEN ImportText[5] = "SEMESTER". IF (ImportText[6] = ?) OR (ImportText[6] = "") THEN ImportText[6] = STRING(Course-catalog.course-fee). IF (ImportText[7] = ?) OR (ImportText[7] = "") THEN ImportText[7] = course-catalog.grading-policy. IF (ImportText[8] = "") THEN ImportText[8] = IF course-catalog.enforce-seat-limit THEN STRING(course-catalog.max-seat-cnt) ELSE ?. IF (ImportText[9] = "") THEN ImportText[9] = IF course-catalog.enforce-fte-limit THEN STRING(course-catalog.max-fte) ELSE ?. IF (ImportText[10] = ?) OR (ImportText[10] = "") THEN DO: FIND course-level OF course-catalog NO-LOCK. ImportText[10] = course-level.course-level-code. END. IF (ImportText[11] = ?) OR (ImportText[11] = "") THEN ImportText[11] = STRING(course-catalog.allow-conflicts). IF (ImportText[12] = ?) OR (ImportText[12] = "") THEN ImportText[12] = STRING(course-catalog.include-attend). IF (ImportText[13] = ?) OR (ImportText[13] = "") THEN ImportText[13] = STRING(course-catalog.include-gpa). IF (ImportText[14] = ?) OR (ImportText[14] = "") THEN ImportText[14] = STRING(course-catalog.include-honor). IF (ImportText[15] = ?) OR (ImportText[15] = "") THEN ImportText[15] = STRING(course-catalog.include-progress). IF (ImportText[16] = ?) OR (ImportText[16] = "") THEN ImportText[16] = STRING(course-catalog.include-rank). IF (ImportText[17] = ?) OR (ImportText[17] = "") THEN ImportText[17] = STRING(course-catalog.include-report-card). IF (ImportText[18] = ?) OR (ImportText[18] = "") THEN ImportText[18] = STRING(course-catalog.retake-credit). IF (ImportText[24] = ?) OR (ImportText[24] = "") THEN ImportText[24] = ImportText[23]. /* Lookup the grading level */ FIND FIRST course-level OF BldgBuff NO-LOCK WHERE course-level.course-level-code = ImportText[10] NO-ERROR. IF NOT AVAILABLE course-level THEN DO: IF NOT AutoCreate THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Unknown course level " ImportText[10] ", course NOT imported" SKIP. UNDO ImportLoop, NEXT ImportLoop. END. CREATE course-level. ASSIGN course-level.school-year-id = BldgBuff.school-year-id course-level.bldg-id = BldgBuff.bldg-id course-level.course-level-code = CAPS(ImportText[10]) course-level.description = "<< CREATED BY IMPORTER >>". {&WriteLog} "Created course level " ImportText[10] ", Please check it out" SKIP. END. /* Lookup the schedule group */ FIND FIRST schd-group OF VrsnBuff NO-LOCK WHERE schd-group.schd-group-name = ImportText[5] NO-ERROR. IF NOT AVAILABLE schd-group THEN DO: IF NOT AutoCreate THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Unknown schd group " ImportText[5] ", course NOT imported" SKIP. UNDO ImportLoop, NEXT ImportLoop. END. CREATE schd-group. ASSIGN schd-group.school-year-id = VrsnBuff.school-year-id schd-group.bldg-id = VrsnBuff.bldg-id schd-group.schd-version-id = VrsnBuff.schd-version-id schd-group.schd-group-name = CAPS(ImportText[5]) schd-group.description = "<< CREATED BY IMPORTER >>". {&WriteLog} "Created schd group " ImportText[5] ", Please check it out" SKIP. END. /* Lookup the room-catalog */ FIND FIRST room-catalog OF BldgBuff NO-LOCK WHERE room-catalog.room-name = ImportText[21] NO-ERROR. IF NOT AVAILABLE room-catalog THEN DO: IF NOT AutoCreate THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Unknown room code " ImportText[21] ", course NOT imported" SKIP. UNDO ImportLoop, NEXT ImportLoop. END. CREATE room-catalog. ASSIGN room-catalog.school-year-id = BldgBuff.school-year-id room-catalog.bldg-id = BldgBuff.bldg-id room-catalog.room-name = CAPS(ImportText[21]) room-catalog.description = "<< CREATED BY IMPORTER >>". {&WriteLog} "Created room " ImportText[21] ", Please check it out" SKIP. END. /* Lookup the period-catalog */ FIND FIRST period-catalog OF VrsnBuff NO-LOCK WHERE period-catalog.period-name = ImportText[25] NO-ERROR. IF NOT AVAILABLE period-catalog THEN DO: IF NOT AutoCreate THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Unknown period " ImportText[25] ", course NOT imported" SKIP. UNDO ImportLoop, NEXT ImportLoop. END. CREATE period-catalog. ASSIGN period-catalog.school-year-id = VrsnBuff.school-year-id period-catalog.bldg-id = VrsnBuff.bldg-id period-catalog.schd-version-id = VrsnBuff.schd-version-id period-catalog.period-name = CAPS(ImportText[25]) period-catalog.comments = "<< CREATED BY IMPORTER >>". {&WriteLog} "Created period " ImportText[25] ", Please check it out" SKIP. END. /* Lookup teacher */ FIND FIRST personnel OF YearBuff NO-LOCK WHERE personnel.personnel-code = ImportText[22] NO-ERROR. IF NOT AVAILABLE personnel THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Personnel code " ImportText[22] " is not on file, course NOT imported" SKIP. UNDO ImportLoop, NEXT ImportLoop. END. /* See if the person is assigned to the same building as the room */ FIND FIRST personnel-bldg OF BldgBuff NO-LOCK WHERE personnel-bldg.personnel-id = personnel.personnel-id NO-ERROR. IF NOT AVAILABLE personnel-bldg THEN DO: IF NOT AutoCreate THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "personnel code " ImportText[22] " not assigned to this building, course NOT imported" SKIP. UNDO ImportLoop, NEXT ImportLoop. END. /* Load a department up */ FIND FIRST department OF BldgBuff NO-LOCK. /* Associate the person and building */ CREATE personnel-bldg. ASSIGN personnel-bldg.school-year-id = BldgBuff.school-year-id personnel-bldg.bldg-id = BldgBuff.bldg-id personnel-bldg.dept-id = department.dept-id personnel-bldg.personnel-id = personnel.personnel-id personnel-bldg.fte = personnel.fte personnel-bldg.personnel-class-id = personnel.personnel-class-id. /* Handle a house, if needed */ IF BldgBuff.has-houses THEN DO: FIND FIRST house OF BldgBuff NO-LOCK NO-ERROR. IF AVAILABLE house THEN personnel-bldg.house-id = house.house-id. END. END. /* Find the starting schd-period */ FIND FIRST schd-period OF VrsnBuff NO-LOCK WHERE schd-period.schd-group-id = schd-group.schd-group-id AND schd-period.period-name = ImportText[23] NO-ERROR. IF NOT AVAILABLE schd-period THEN DO: IF NOT AutoCreate THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Schd Period " ImportText[23] " not on file, course NOT imported" SKIP. UNDO ImportLoop, NEXT ImportLoop. END. CREATE schd-period. ASSIGN schd-period.school-year-id = schd-group.school-year-id schd-period.bldg-id = schd-group.bldg-id schd-period.schd-version-id = schd-group.schd-version-id schd-period.schd-group-id = schd-group.schd-group-id schd-period.period-name = CAPS(ImportText[23]) schd-period.description = "<< CREATED BY IMPORTER >>". {&WriteLog} "Created schd period " ImportText[23] ", Please check it out" SKIP. END. StartSchdPeriod = STRING(schd-period.schd-period-id). /* Find the ending schd-period */ FIND FIRST schd-period OF VrsnBuff NO-LOCK WHERE schd-period.schd-group-id = schd-group.schd-group-id AND schd-period.period-name = ImportText[24] NO-ERROR. IF NOT AVAILABLE schd-period THEN DO: IF NOT AutoCreate THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Schd Period " ImportText[24] " not on file, course NOT imported" SKIP. UNDO ImportLoop, NEXT ImportLoop. END. CREATE schd-period. ASSIGN schd-period.school-year-id = schd-group.school-year-id schd-period.bldg-id = schd-group.bldg-id schd-period.schd-version-id = schd-group.schd-version-id schd-period.schd-group-id = schd-group.schd-group-id schd-period.period-name = CAPS(ImportText[24]) schd-period.description = "<< CREATED BY IMPORTER >>". {&WriteLog} "Created schd period " ImportText[24] ", Please check it out" SKIP. END. EndSchdPeriod = STRING(schd-period.schd-period-id). /* Verify the grading policy */ ThePtr = LOOKUP(ImportText[7], "Letter,Pass/Fail,Numeric"). IF ThePtr = 0 THEN DO: {&WriteLog} "Unknown grading policy " ImportText[7] ", course NOT imported" SKIP. UNDO ImportLoop, NEXT ImportLoop. END. ImportText[7] = ENTRY(ThePtr, "Letter,Pass/Fail,Numeric"). /* Set things in place */ ASSIGN master-schd.credits = DECIMAL(ImportText[4]) master-schd.schd-group-id = schd-group.schd-group-id master-schd.course-fee = DECIMAL(ImportText[6]) master-schd.grading-policy = ImportText[7] master-schd.enforce-seat-limit = ImportText[8] <> ? master-schd.max-seat-cnt = (IF ImportText[8] <> ? THEN INTEGER(ImportText[8]) ELSE master-schd.max-seat-cnt) master-schd.enforce-fte-limit = ImportText[9] <> ? master-schd.max-fte = (IF ImportText[9] <> ? THEN INTEGER(ImportText[9]) ELSE master-schd.max-fte) master-schd.course-level-id = course-level.course-level-id master-schd.allow-conflicts = ImportText[11] BEGINS "Y" master-schd.include-attend = ImportText[12] BEGINS "Y" master-schd.include-gpa = ImportText[13] BEGINS "Y" master-schd.include-honor = ImportText[14] BEGINS "Y" master-schd.include-progress = ImportText[15] BEGINS "Y" master-schd.include-rank = ImportText[16] BEGINS "Y" master-schd.include-report-card = ImportText[17] BEGINS "Y" master-schd.retake-credit = ImportText[18] BEGINS "Y" master-schd.comments = ImportText[19] master-schd-meets.personnel-id = personnel.personnel-id master-schd-meets.room-id = room-catalog.room-id master-schd-meets.start-schd-period-id = INTEGER(StartSchdPeriod) master-schd-meets.end-schd-period-id = INTEGER(EndSchdPeriod) master-schd-meets.period-id = period-catalog.period-id NO-ERROR. /* Check for errors */ IF ERROR-STATUS:ERROR THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Errors importing/converting course data, course NOT imported" SKIP. UNDO ImportLoop, NEXT ImportLoop. END. /* Now see what days we meet */ DO ThePtr = 1 TO VrsnBuff.days-per-sequence: master-schd-meets.meet-on-day[ThePtr] = CAN-DO(ImportText[26], VrsnBuff.day-names[ThePtr]). END. /* Initialize the master-schd-stats file */ FOR EACH schd-period NO-LOCK WHERE schd-period.school-year-id = master-schd.school-year-id AND schd-period.bldg-id = master-schd.bldg-id AND schd-period.schd-version-id = master-schd.schd-version-id AND schd-period.schd-group-id = master-schd.schd-group-id: /* See if we have an entry yet */ FIND FIRST master-schd-stats NO-LOCK WHERE master-schd-stats.school-year-id = master-schd.school-year-id AND master-schd-stats.bldg-id = master-schd.bldg-id AND master-schd-stats.schd-version-id = master-schd.schd-version-id AND master-schd-stats.course-id = master-schd.course-id AND master-schd-stats.section-id = master-schd.section-id AND master-schd-stats.schd-period-id = schd-period.schd-period-id NO-ERROR. IF NOT AVAILABLE master-schd-stats THEN DO: CREATE master-schd-stats. ASSIGN master-schd-stats.school-year-id = master-schd.school-year-id master-schd-stats.bldg-id = master-schd.bldg-id master-schd-stats.schd-version-id = master-schd.schd-version-id master-schd-stats.course-id = master-schd.course-id master-schd-stats.section-id = master-schd.section-id master-schd-stats.schd-period-id = schd-period.schd-period-id. END. END. 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 */ {safe-msg.i "'Import Complete'"} RETURN.