/* @tier medium @module cm @transform common-online */ /* * cm_ol_0029.pgc - 통계 요약 조회 서비스 (CM_OL_0029) [tier=medium] * * 영업일(DATE)로 일 집계 뷰(cm_daily_v)를 조회하여 당일 거래 건수 합계와 * 금액 총계를 응답한다. 뷰는 상태별 행을 보유하므로 SUM 집계로 단건화한다. * (ATMI void SVC(TPSVCINFO*) 대응) */ #include #include #include "txcore.h" #include "txcore_dbio.h" #include "acq_util.h" #include "cm_core.h" EXEC SQL INCLUDE sqlca; TX_SERVICE(CM_OL_0029, ctx) { EXEC SQL BEGIN DECLARE SECTION; char h_date[9]; long h_cnt; long h_total; EXEC SQL END DECLARE SECTION; char bizdate[16]; char wonbuf[32]; long avg; tx_log(TX_LOG_INFO, "[CM_OL_0029] 통계 요약 조회 서비스 진입"); if (tx_buf_get(ctx->in, "DATE", bizdate, sizeof(bizdate)) != TX_OK) { tx_log(TX_LOG_ERROR, "[CM_OL_0029] DATE 누락"); tx_return(ctx, TX_EINVAL, ctx->out); return; } if (!date_is_valid(bizdate)) { tx_log(TX_LOG_WARN, "[CM_OL_0029] 영업일 형식 오류 date=%s", bizdate); tx_return(ctx, TX_EINVAL, ctx->out); return; } memset(&h_date, 0, sizeof(h_date)); strncpy(h_date, bizdate, sizeof(h_date) - 1); h_cnt = 0; h_total = 0; EXEC SQL SELECT NVL(SUM(cnt), 0), NVL(SUM(total_amt), 0) INTO :h_cnt, :h_total FROM cm_daily_v WHERE biz_date = :h_date; if (sqlca.sqlcode == TX_SQL_NOTFOUND) { tx_log(TX_LOG_INFO, "[CM_OL_0029] 집계 없음 date=%s", bizdate); tx_return(ctx, TX_ENOENT, ctx->out); return; } if (sqlca.sqlcode != TX_SQL_OK) { TX_DBIO_LOG_ERR("CM_OL_0029 SELECT cm_daily_v"); tx_return(ctx, TX_EDB, ctx->out); return; } /* 평균 거래금액 파생 계산 */ avg = (h_cnt > 0) ? (h_total / h_cnt) : 0; amount_format_won(h_total, wonbuf, sizeof(wonbuf)); tx_buf_reset(ctx->out); tx_buf_sets(ctx->out, "DATE", bizdate); tx_buf_setlong(ctx->out, "CNT", h_cnt); tx_buf_setlong(ctx->out, "TOTAL", h_total); tx_buf_setlong(ctx->out, "AVG", avg); tx_buf_sets(ctx->out, "TOTALWON", wonbuf); tx_log(TX_LOG_INFO, "[CM_OL_0029] 요약완료 date=%s cnt=%ld total=%ld avg=%ld", bizdate, h_cnt, h_total, avg); tx_return(ctx, TX_OK, ctx->out); }