project BLF > class TSODImport > method ImportSODDataBRole

Description

ImportSODDataBRole: submethod of ImportSODDate


Parameters


icFileNameSODRolesinputcharacterName of the file that will be used to read out the content to be uploaded
icFileNameSODResourcesinputcharacterName of the file that will be used to read out the content to be uploaded
icDelimiterinputcharacterDelimiter that will be used to read the different properties on a single line in the input files
olImportErroroutputlogicalIndicates if an error occured during the import of the file-content
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


BLF
method TSODImport.ImportSODData


program code (program1/tsodimport.p)


/* =============================================================== */
/* Read the Roles and RoleResources from file into the temp-tables */
/* =============================================================== */
if icFileNameSODRoles <> ?
then do :
    /* ====== ROLES ====== */
    <M-74 run WriteMessagesToLog
       (input  'Extract of file content started. File: ':U + icFileNameSODRoles (icMessage), 
        input  ? (icProgressErrorMessage), 
        input  ? (ilIncludetFcMessages), 
        output viFcReturnSuper (oiReturnStatus)) in TSODImport>
    assign viLineCounter = 0
           olImportError = false.
    input stream sImpStream from value(icFileNameSODRoles).
    repeat /*  error undo, throw */ :
        import stream sImpStream unformatted vcLine.
        assign viLineCounter = viLineCounter + 1.
        if viLineCounter = 1 
        then do:
            if num-entries(vcLine,icDelimiter) = 1
            then do :
                <M-9 run WriteMessagesToLog
                   (input  'Error: this file is not a comma-separated file. File: ':U + icFileNameSODRoles (icMessage), 
                    input  error-status:get-message(1) (icProgressErrorMessage), 
                    input  ? (ilIncludetFcMessages), 
                    output viFcReturnSuper (oiReturnStatus)) in TSODImport>
                assign olImportError = true.
                Return.
            end. /* if num-entries(vcLine,icDelimiter) = 1 */
            if num-entries(vcLine,icDelimiter) <> 4
            then do :
                <M-61 run WriteMessagesToLog
                   (input  'Error: expected 4 columns, actual number of columns: ':U + string(num-entries(vcLine,icDelimiter)) + '. File: ':U + icFileNameSODRoles (icMessage), 
                    input  error-status:get-message(1) (icProgressErrorMessage), 
                    input  ? (ilIncludetFcMessages), 
                    output viFcReturnSuper (oiReturnStatus)) in TSODImport>
                assign olImportError = true.
                Return.
            end. /* if num-entries(vcLine,icDelimiter) <> */
            next.
        end. /* if viLineCounter = 1 */
        vcCSVEntries[1] = entry(1,vcLine,icDelimiter).
        if num-entries(vcLine,icDelimiter) < 2
        then vcCSVEntries[2] = "".
        else vcCSVEntries[2] = entry(2,vcLine,icDelimiter).
        if num-entries(vcLine,icDelimiter) < 3
        then vcCSVEntries[3] = "true":U.
        else vcCSVEntries[3] = entry(3,vcLine,icDelimiter).
        if num-entries(vcLine,icDelimiter) < 4
        then vcCSVEntries[4] = "false":U.
        else vcCSVEntries[4] = entry(4,vcLine,icDelimiter).
        if vcCSVEntries[3] <> "true":U  and 
           vcCSVEntries[3] <> "false":U and  
           vcCSVEntries[3] <> "yes":U   and 
           vcCSVEntries[3] <> "no":U
        then do :
            <M-60 run WriteMessagesToLog
               (input  'Error: incorrect active flag (':U + vcCSVEntries[3] + ') on line ':U + string(viLineCounter) + ': it should be TRUE or FALSE. File: ':U + icFileNameSODRoles (icMessage), 
                input  error-status:get-message(1) (icProgressErrorMessage), 
                input  ? (ilIncludetFcMessages), 
                output viFcReturnSuper (oiReturnStatus)) in TSODImport>
            assign olImportError = true.
            next.
        end. /* if vcCSVEntries[3] <> "true":U  and  */
        if vcCSVEntries[4] <> "true":U  and 
           vcCSVEntries[4] <> "false":U and  
           vcCSVEntries[4] <> "yes":U   and 
           vcCSVEntries[4] <> "no":U
        then do :
            <M-46 run WriteMessagesToLog
               (input  'Error: incorrect exclude-from-SOD flag (':U + vcCSVEntries[4] + ') on line ':U + string(viLineCounter) + '. File: ':U + icFileNameSODRoles (icMessage), 
                input  error-status:get-message(1) (icProgressErrorMessage), 
                input  ? (ilIncludetFcMessages), 
                output viFcReturnSuper (oiReturnStatus)) in TSODImport>
            assign olImportError = true.
            next.
        end. /* if vcCSVEntries[4] <> "true":U  and */
        create tImportSODRole.
        assign tImportSODRole.Role_ID             = viLineCounter
               tImportSODRole.RoleName            = vcCSVEntries[1]
               tImportSODRole.RoleDescription     = vcCSVEntries[2]
               tImportSODRole.RoleIsActive        = (vcCSVEntries[3] = "true":U or vcCSVEntries[3] = "yes")
               tImportSODRole.RoleSODException    = (vcCSVEntries[4] = "true":U or vcCSVEntries[4] = "yes")
               tImportSODRole.tc_Rowid            = string(viLineCounter).
    end. /* repeat : */
    input stream sImpStream close.
    <M-3 run WriteMessagesToLog
       (input  'Extract of file content ended. File: ':U + icFileNameSODRoles (icMessage), 
        input  error-status:get-message(1) (icProgressErrorMessage), 
        input  ? (ilIncludetFcMessages), 
        output viFcReturnSuper (oiReturnStatus)) in TSODImport>
    /* ====== ROLE-RESOURCES ====== */
    <M-87 run WriteMessagesToLog
       (input  'Extract of file content started. File: ':U +  icFileNameSODResources (icMessage), 
        input  ? (icProgressErrorMessage), 
        input  ? (ilIncludetFcMessages), 
        output viFcReturnSuper (oiReturnStatus)) in TSODImport>
    assign viLineCounter = 0.
    input stream sImpStream from value(icFileNameSODResources).
    ROLERESOURCEBLOCK: repeat on error undo, throw:
        import stream sImpStream unformatted vcLine.
        assign viLineCounter = viLineCounter + 1.
        if viLineCounter = 1 
        then do:
            if num-entries(vcLine,icDelimiter) = 1
            then do :                
                <M-42 run WriteMessagesToLog
                   (input  'Error: this file is not a comma-separated file. File: ':U + icFileNameSODResources (icMessage), 
                    input  error-status:get-message(1) (icProgressErrorMessage), 
                    input  ? (ilIncludetFcMessages), 
                    output viFcReturnSuper (oiReturnStatus)) in TSODImport>
                assign olImportError = true.
                Return.
            end. /* if num-entries(vcLine,icDelimiter) = 1 */
            if num-entries(vcLine,icDelimiter) < 5
            then do :                
                <M-71 run WriteMessagesToLog
                   (input  'Error: expected 5 columns, actual number of columns: ':U + string(num-entries(vcLine,icDelimiter)) + '. File: ':U + icFileNameSODResources (icMessage), 
                    input  error-status:get-message(1) (icProgressErrorMessage), 
                    input  ? (ilIncludetFcMessages), 
                    output viFcReturnSuper (oiReturnStatus)) in TSODImport>
                assign olImportError = true.
                Return.
            end. /* if num-entries(vcLine,icDelimiter) < 5 */
            next.
        end. /* if viLineCounter = 1  */
        /* The number of columns on these lines differs but from column 6 onwards we can find Roles */
        do viColumnCounter = 6 to num-entries(vcLine,icDelimiter):
            if entry(viColumnCounter,vcLine,icDelimiter) <> "":U and 
               entry(viColumnCounter,vcLine,icDelimiter) <> ?
            then do:
                find first tImportSODRole where 
                           tImportSODRole.rolename = entry(viColumnCounter,vcLine,icDelimiter) 
                           no-error.
                if not available tImportSODRole
                then do :
                    <M-63 run WriteMessagesToLog
                       (input  'Error: unknown role(':U + entry(viColumnCounter,vcLine,icDelimiter) + ') on line ' + string(viLineCounter) + '. File: ':U + icFileNameSODResources (icMessage), 
                        input  error-status:get-message(1) (icProgressErrorMessage), 
                        input  ? (ilIncludetFcMessages), 
                        output viFcReturnSuper (oiReturnStatus)) in TSODImport>
                    assign olImportError = true.
                    next ROLERESOURCEBLOCK.
                end. /* if not available tImportSODRole */
                assign viRoleResourceCounter = viRoleResourceCounter + 1.
                create tImportSODRoleResource.
                assign tImportSODRoleResource.RoleResource_ID     = viRoleResourceCounter
                       tImportSODRoleResource.tc_Rowid            = string(viRoleResourceCounter)
                       tImportSODRoleResource.Role_ID             = tImportSODRole.Role_ID
                       tImportSODRoleResource.tc_ParentRowid      = tImportSODRole.tc_Rowid
                       tImportSODRoleResource.tcResourceURI       = entry(4,vcLine,icDelimiter).
            end. /* if entry(viColumnCounter,vcLine,icDelimiter) <> "":U and */
        end. /* do viColumnCounter = 6 to num-entries(vcLine,icDelimiter) */
    end. /* ROLERESOURCEBLOCK repeat */
    input stream sImpStream close.    
    <M-50 run WriteMessagesToLog
       (input  'Extract of file content ended. File: ':U +  icFileNameSODResources (icMessage), 
        input  error-status:get-message(1) (icProgressErrorMessage), 
        input  ? (ilIncludetFcMessages), 
        output viFcReturnSuper (oiReturnStatus)) in TSODImport>
end. /* if icFileNameSODRoles <> ? <> ? */

/* =============================================================== */
/* Call method in BRole to save the Roles and RoleResources        */
/* =============================================================== */
if olImportError = true 
then Return.
if can-find (first tImportSODRole) 
then do on error undo, throw:
    /* Start and open BRole */
    <M-16 run WriteMessagesToLog
       (input  'Calling BRole started':U (icMessage), 
        input  ? (icProgressErrorMessage), 
        input  ? (ilIncludetFcMessages), 
        output viFcReturnSuper (oiReturnStatus)) in TSODImport>
    <I-98 {tFcStartAndOpenInstance
         &CLASS                = "BRole"
         &SESSIONID            = "viSessionTSODID"}>
    /* First ensure that we pass our data to the t_s-tables of BRole - there is no normal method to do this so we really have to do a manual run */
    /* Note we cannot pass dImportSODForRole 'by-reference' when calling gipr_STables as the indexes on the temp-table ares not exactly the same */
    <M-22 run WriteMessagesToLog
       (input  'Transfer data to BRole started':U (icMessage), 
        input  ? (icProgressErrorMessage), 
        input  ? (ilIncludetFcMessages), 
        output viFcReturnSuper (oiReturnStatus)) in TSODImport>
    run gipr_STables in vhBRoleFromSODImportInst (input dataset dImportSODForRole).
    <M-68 run WriteMessagesToLog
       (input  'Transfer data to BRole ended':U (icMessage), 
        input  error-status:get-message(1) (icProgressErrorMessage), 
        input  true (ilIncludetFcMessages), 
        output viFcReturnSuper (oiReturnStatus)) in TSODImport>
    /* Call MaintainByDataset - it will use the t_s-tables in the instance as input for its processing */
    <M-21 run WriteMessagesToLog
       (input  'Call BRole:MaintainByDataset started':U (icMessage), 
        input  ? (icProgressErrorMessage), 
        input  ? (ilIncludetFcMessages), 
        output viFcReturnSuper (oiReturnStatus)) in TSODImport>
    <M-47 run MaintainByDataset
       (input  'SAVE':U (icAction), 
        output vpDummy (opPrimaryKey), 
        output vpDummy (opRowid), 
        output viDummy (oiDraftInstance), 
        output viExternalReturnStatus (oiReturnStatus)) in BRole>
    <M-56 run WriteMessagesToLog
       (input  'Result of running BRole:MaintainByDataset(): ':U + string(viExternalReturnStatus) (icMessage), 
        input  error-status:get-message(1) (icProgressErrorMessage), 
        input  True (ilIncludetFcMessages), 
        output viFcReturnSuper (oiReturnStatus)) in TSODImport>        
    <M-69 run WriteMessagesToLog
       (input  'Call BRole:MaintainByDataset ended':U   + ' - Returnstatus: ' + string(viExternalReturnStatus) (icMessage), 
        input  ? (icProgressErrorMessage), 
        input  ? (ilIncludetFcMessages), 
        output viFcReturnSuper (oiReturnStatus)) in TSODImport>
    /* Closing BRole */
    empty temp-table tImportSODRole.
    empty temp-table tImportSODRoleResource.
    <I-86 {tFcCloseAndStopInstance
         &CLASS           = "BRole"}>    
    <M-6 run WriteMessagesToLog
       (input  'Calling BRole ended':U (icMessage), 
        input  error-status:get-message(1) (icProgressErrorMessage), 
        input  true (ilIncludetFcMessages), 
        output viFcReturnSuper (oiReturnStatus)) in TSODImport>
    if viExternalReturnStatus < 0 
    then return.
end. /* if can-find (first tImportSODRole)  */