/* imp-medical.p - Import Medical data */ /* Format of an import line: */ /* NOTE: If you do not have data for an item, replace the field with */ /* a '-'. DO NOT put bogus data in there as it is used when */ /* looking at a record to determine it's intent! */ /* */ /* # 1 - Student ID REQUIRED SPM ID of the student to record note for */ /* # 2 - Medical Code REQUIRED Medical code to import under */ /* # 3 - Status REQUIRED Status of code (specific to medical code)*/ /* # 4 - Waived REQUIRED Yes or No */ /* # 5 - Date #1 OPTIONAL Date #1 */ /* # 6 - Comment #1 OPTIONAL Comment #1 */ /* # 7 - Date #2 OPTIONAL Date #2 */ /* # 8 - Comment #2 OPTIONAL Comment #2 */ /* # 9 - Date #3 OPTIONAL Date #3 */ /* #10 - Comment #3 OPTIONAL Comment #3 */ /* #11 - Date #4 OPTIONAL Date #4 */ /* #12 - Comment #4 OPTIONAL Comment #4 */ /* #13 - Date #5 OPTIONAL Date #5 */ /* #14 - Comment #5 OPTIONAL Comment #5 */ /* #15 - Date #6 OPTIONAL Date #6 */ /* #16 - Comment #6 OPTIONAL Comment #6 */ /* #17 - Date #7 OPTIONAL Date #7 */ /* #18 - Comment #7 OPTIONAL Comment #7 */ /* #19 - Date #8 OPTIONAL Date #8 */ /* #20 - Comment #8 OPTIONAL Comment #8 */ /* #21 - Date #9 OPTIONAL Date #9 */ /* #22 - Comment #9 OPTIONAL Comment #9 */ /* #23 - Date #10 OPTIONAL Date #10 */ /* #24 - Comment #10 OPTIONAL Comment #10 */ /* #25 - General Comments OPTIONAL General Comments */ /* 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 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 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 Streams */ DEFINE STREAM ImportStream. DEFINE STREAM ExportStream. DEFINE STREAM LogStream. /* 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) " Medical Data Importation Statistics ". /* First, get the import file */ QueryBlock: DO WHILE TRUE ON ERROR UNDO, RETURN ON ENDKEY UNDO, RETURN: /* Define the form */ FORM ImportFile LABEL " Import from" FORMAT "x(255)" VIEW-AS FILL-IN SIZE 32 BY 1 SPACE(1) 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" 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 ImportFile LABEL " Import from" FORMAT "x(255)" VIEW-AS FILL-IN SIZE 32 BY 1 SPACE(1) 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" 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) TITLE COLOR VALUE(the-color.c-title) " Import Student Medical Data ". /* See if the note exists */ IF SEARCH(ImportFile) = ? THEN DO: BELL. {safe-msg.i "'Cannot find the import source 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. /* 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 rquired 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] = ?) THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "One or more REQURIED fields missing, NOT imported" SKIP. NEXT ImportLoop. END. /* Lookup the student */ FIND stu-base WHERE stu-base.stu-id = ImportText[1] NO-LOCK NO-ERROR. IF NOT AVAILABLE stu-base THEN DO: {&WriteLog} "Student ID *NOT* on file, NOT imported" SKIP. ErrorCnt = ErrorCnt + 1. NEXT ImportLoop. END. /* Lookup medical code */ FIND medical-code WHERE medical-code.medical-code-name = ImportText[2] NO-LOCK NO-ERROR. IF NOT AVAILABLE medical-code THEN IF AutoCreate THEN DO: CREATE medical-code. ASSIGN medical-code.medical-code-name = CAPS(ImportText[2]) medical-code.description = "<< CREATED BY IMPORTER >>". {&WriteLog} "Created medical code, please check it!" SKIP. END. ELSE DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Medical code not on file, NOT imported" SKIP. NEXT ImportLoop. END. /* Load the medical data (if any) */ FIND LAST stu-medical OF stu-base WHERE stu-medical.medical-code-id = medical-code.medical-code-id NO-ERROR. IF AVAILABLE stu-medical THEN /* Backup existing entry if we are going to replace it */ IF ReplaceMode THEN EXPORT STREAM ExportStream stu-base.stu-id medical-code.medical-code-name stu-medical.medical-status stu-medical.waived stu-medical.medical-date[1] stu-medical.date-comment[1] stu-medical.medical-date[2] stu-medical.date-comment[2] stu-medical.medical-date[3] stu-medical.date-comment[3] stu-medical.medical-date[4] stu-medical.date-comment[4] stu-medical.medical-date[5] stu-medical.date-comment[5] stu-medical.medical-date[6] stu-medical.date-comment[6] stu-medical.medical-date[7] stu-medical.date-comment[7] stu-medical.medical-date[8] stu-medical.date-comment[8] stu-medical.medical-date[9] stu-medical.date-comment[9] stu-medical.medical-date[10] stu-medical.date-comment[10] stu-medical.comments. ELSE DO: /* Don't overwrite an existing entry */ {&WriteLog} "Existing medical data entry, NOT imported" SKIP. NEXT ImportLoop. END. ELSE DO: /* Create a new code */ CREATE stu-medical. ASSIGN stu-medical.stu-seq = stu-base.stu-seq stu-medical.medical-code-id = medical-code.medical-code-id. END. /* Import status code */ IF LOOKUP(ImportText[3], medical-code.medical-status-list) = 0 THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "Unknown status " ImportText[3] " for medical code, status NOT set" SKIP. END. ELSE stu-medical.medical-status = ENTRY(LOOKUP(ImportText[3], medical-code.medical-status-list), medical-code.medical-status-list). /* Import other, easily imported bits */ ASSIGN stu-medical.waived = ImportText[4] BEGINS "Y" stu-medical.medical-date[1] = DATE(ImportText[5]) stu-medical.date-comment[1] = ImportText[6] stu-medical.medical-date[2] = DATE(ImportText[7]) stu-medical.date-comment[2] = ImportText[8] stu-medical.medical-date[3] = DATE(ImportText[9]) stu-medical.date-comment[3] = ImportText[10] stu-medical.medical-date[4] = DATE(ImportText[11]) stu-medical.date-comment[4] = ImportText[12] stu-medical.medical-date[5] = DATE(ImportText[13]) stu-medical.date-comment[5] = ImportText[14] stu-medical.medical-date[6] = DATE(ImportText[15]) stu-medical.date-comment[6] = ImportText[16] stu-medical.medical-date[7] = DATE(ImportText[17]) stu-medical.date-comment[7] = ImportText[18] stu-medical.medical-date[8] = DATE(ImportText[19]) stu-medical.date-comment[8] = ImportText[20] stu-medical.medical-date[9] = DATE(ImportText[21]) stu-medical.date-comment[9] = ImportText[22] stu-medical.medical-date[10] = DATE(ImportText[23]) stu-medical.date-comment[10] = ImportText[23] stu-medical.comments = ImportText[25] NO-ERROR. IF ERROR-STATUS:ERROR THEN DO: ErrorCnt = ErrorCnt + 1. {&WriteLog} "One or more invalid dates, NOT imported" SKIP. UNDO ImportLoop, NEXT ImportLoop. 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.