SAP BusinessObjects 4.3 SP4 환경에서 BO API로 만든 프로그램을 배치 파일로 실행하는 샘플을 보여드리겠습니다.
## 전제 조건
- Java 기반 BO SDK (RESTful SDK 또는 Java SDK)
- BOE 서버 연결 정보
---
## 1. Java 프로그램 예시 (BO SDK)
```java
// BOReportRunner.java
import com.crystaldecisions.sdk.framework.*;
import com.crystaldecisions.sdk.occa.infostore.*;
import com.crystaldecisions.sdk.plugin.desktop.report.*;
public class BOReportRunner {
public static void main(String[] args) throws Exception {
if (args.length < 4) {
System.out.println("Usage: BOReportRunner <server> <username> <password> <reportName>");
System.exit(1);
}
String server = args[0];
String username = args[1];
String password = args[2];
String reportName = args[3];
IEnterpriseSession session = null;
try {
// 1. 세션 연결
ISessionMgr mgr = CrystalEnterprise.getSessionMgr();
session = mgr.logon(username, password, server, "secEnterprise");
System.out.println("[INFO] BO 로그인 성공: " + server);
// 2. InfoStore 쿼리
IInfoStore infoStore = (IInfoStore) session.getService("", "InfoStore");
String query = "SELECT SI_ID, SI_NAME FROM CI_INFOOBJECTS "
+ "WHERE SI_NAME='" + reportName + "' "
+ "AND SI_PROGID='CrystalEnterprise.Report'";
IInfoObjects results = infoStore.query(query);
if (results.size() == 0) {
System.out.println("[ERROR] 리포트를 찾을 수 없습니다: " + reportName);
System.exit(2);
}
// 3. 리포트 스케줄 실행
IInfoObject report = (IInfoObject) results.get(0);
ISchedulingInfo schedInfo = report.getSchedulingInfo();
schedInfo.setType(CeScheduleType.ONCE);
infoStore.schedule(results);
System.out.println("[INFO] 리포트 스케줄 완료: " + reportName
+ " (ID: " + report.getID() + ")");
} finally {
if (session != null) session.logoff();
System.out.println("[INFO] 세션 종료");
}
}
}
```
---
## 2. 배치 파일 (`run_bo_report.bat`)
```bat
@echo off
setlocal EnableDelayedExpansion
:: ================================================
:: BO Report Runner - Batch Launcher
:: 용도: BO API Java 프로그램 실행 래퍼
:: ================================================
:: --- 환경 설정 ---
set BO_HOME=C:\Program Files (x86)\SAP BusinessObjects\SAP BusinessObjects Enterprise XI 4.0
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_351
set APP_HOME=C:\BOApp
:: --- BO SDK Classpath ---
set CP=%APP_HOME%\BOReportRunner.jar
set CP=%CP%;%BO_HOME%\java\lib\cecore.jar
set CP=%CP%;%BO_HOME%\java\lib\celib.jar
set CP=%CP%;%BO_HOME%\java\lib\ceplugins.jar
set CP=%CP%;%BO_HOME%\java\lib\cesession.jar
set CP=%CP%;%BO_HOME%\java\lib\corbaidl.jar
set CP=%CP%;%BO_HOME%\java\lib\ebus420.jar
set CP=%CP%;%BO_HOME%\java\lib\logging.jar
:: --- 실행 파라미터 ---
set BO_SERVER=your-bo-server:6400
set BO_USER=Administrator
set BO_PASS=your_password
set REPORT_NAME=Monthly_Sales_Report
:: --- 로그 설정 ---
set LOG_DIR=%APP_HOME%\logs
set LOG_FILE=%LOG_DIR%\bo_report_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%_%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%.log
set LOG_FILE=%LOG_FILE: =0%
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"
:: --- 실행 ---
echo [%DATE% %TIME%] BO Report Runner 시작 >> "%LOG_FILE%"
echo [%DATE% %TIME%] Server: %BO_SERVER%, Report: %REPORT_NAME% >> "%LOG_FILE%"
"%JAVA_HOME%\bin\java.exe" ^
-cp "%CP%" ^
-Xms256m -Xmx512m ^
BOReportRunner ^
"%BO_SERVER%" "%BO_USER%" "%BO_PASS%" "%REPORT_NAME%" ^
>> "%LOG_FILE%" 2>&1
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% EQU 0 (
echo [%DATE% %TIME%] 실행 성공 (Exit: %EXIT_CODE%) >> "%LOG_FILE%"
echo 성공적으로 완료되었습니다.
) else (
echo [%DATE% %TIME%] 실행 실패 (Exit: %EXIT_CODE%) >> "%LOG_FILE%"
echo [오류] 실행 실패. 로그 확인: %LOG_FILE%
)
endlocal
exit /b %EXIT_CODE%
```
---
## 3. Windows 스케줄러 등록 배치 (`register_task.bat`)
```bat
@echo off
:: ================================================
:: Windows Task Scheduler 등록 스크립트
:: 관리자 권한으로 실행 필요
:: ================================================
set TASK_NAME=BO_Monthly_Report
set BAT_FILE=C:\BOApp\run_bo_report.bat
set RUN_USER=DOMAIN\svc_bo_account
set RUN_TIME=06:00
set SCHEDULE=MONTHLY
set RUN_DAY=1
echo [작업 스케줄러 등록 시작]
:: 기존 작업 삭제 (있을 경우)
schtasks /delete /tn "%TASK_NAME%" /f >nul 2>&1
:: 신규 등록
schtasks /create ^
/tn "%TASK_NAME%" ^
/tr "\"%BAT_FILE%\"" ^
/sc %SCHEDULE% ^
/d %RUN_DAY% ^
/st %RUN_TIME% ^
/ru "%RUN_USER%" ^
/rp ^
/rl HIGHEST ^
/f
if %ERRORLEVEL% EQU 0 (
echo [성공] 작업 등록 완료: %TASK_NAME%
echo 실행 시간: 매월 %RUN_DAY%일 %RUN_TIME%
) else (
echo [오류] 작업 등록 실패. 관리자 권한으로 실행하세요.
)
:: 등록 확인
echo.
echo [등록된 작업 정보]
schtasks /query /tn "%TASK_NAME%" /fo LIST
pause
```
---
## 4. 폴더 구조 및 실행 방법
```
C:\BOApp\
├── BOReportRunner.jar ← 컴파일된 Java 프로그램
├── run_bo_report.bat ← 실행 배치
├── register_task.bat ← 스케줄러 등록
└── logs\
└── bo_report_YYYYMMDD_HHMMSS.log
```
**명령라인 직접 실행:**
```bat
C:\BOApp\run_bo_report.bat
```
**스케줄러 등록 (관리자 CMD):**
```bat
C:\BOApp\register_task.bat
```
---
## 주요 포인트
| 항목 | 내용 |
|------|------|
| **비밀번호 보안** | 배치 파일 대신 암호화된 설정 파일 또는 Windows Credential Manager 사용 권장 |
| **로그 관리** | 날짜/시간 기반 로그 파일로 이력 추적 |
| **Exit Code** | Java 프로그램의 `System.exit()` 코드를 배치에서 그대로 전달 |
| **서비스 계정** | 스케줄러는 전용 서비스 계정(`svc_bo_account`)으로 실행 권장 |
추가로 필요한 부분(REST API 방식, 리포트 파라미터 전달, 이메일 알림 등)이 있으면 말씀해 주세요!