📄 merch_forg_month_rpt.old.ec
字号:
/*=====================================
中行商户本外卡交易统计月报表
相关数据库: cur_settle_ls, his_settle_ls
函数名:merch_foreign_month_rpt()
程 序:Wubin 2001/09/15
=====================================*/
#include <stdio.h>
#include <math.h>
#include "all.h"
#include "macro_def.h"
$include "db_struct.h"
$include sqlca;
$include sqlhdr;
EXEC SQL WHENEVER SQLERROR CALL error_handler;
EXEC SQL WHENEVER SQLWARNING CALL warning_handler;
EXEC SQL WHENEVER NOT FOUND CALL notfound_handler;
/* defined in cglfx.ec */
extern struct {
char bankid[12];
char hostid[3];
int count;
double amount;
} bankids[400];
struct {
char merchid[18];
int count;
double amount;
} merchids_card[50000];
$char card_table1[40][4] = {
"02",
"01",
"51",
"52",
"53",
"54",
"55",
"",
NULL,
};
extern double get_qs_tip(), get_bank_name(), type2buf();
int merch_foreign_month_rpt(file, start_date, end_date, acq_bank_id)
char *file;
$parameter char *start_date, *end_date, *acq_bank_id;
{
FILE *fp;
int i, ret;
double total_tran_amt;
char settle_date[9];
int cur_flag=0;
$S_tran_ls ls;
$S_sys_param sy;
$double amt_tmp, tran_amt;
$char sqlstr[1024], bankid[18], hostid[3];
$char bankname[50], merchid[18];
$char merchant_id[12], merchantname[41];
char bankid1[12], hostid1[3];
$int count, bank_num, merch_num;
$int total_card_cnt[100], card_cnt[100], total_tran_cnt;
$short indi, indi1, indi2 ;
$double card_amt[100],total_card_amt[100];
bank_num = merch_num= ret = 0;
total_tran_amt = 0.0;
if ( ret = select_sys_param(&sy) ) {
errcall(ERROR, "查本地参数表错误[%d]!",ret);
return ( -1 );
}
#ifdef wyz020428_mod
#else
get_settle_date(settle_date):
/*判断查询cur_settle_ls OR his_settle_ls OR BOTH */
if (strcmp(settle_date, end_date) > 0)
cur_flag = 0;
else
if (strcmp(settle_date, start_date) >= 0)
cur_flag = 1;
else
cur_flag = 2;
#endif
/***************
* 统计下级行
***************/
memset(&bankids, 0, sizeof(bankids));
#ifdef wyz020428_mod
if (acq_bank_id[0] == 0 ) {
#else
if (!strcmp(G_cen_bankid, G_bankid)) {
#endif
sprintf(sqlstr,
"select distinct bank_id, count(*) \
from bank_info \
where adm_bank_id = \'%s\' group by bank_id",
#ifdef wyz020428_mod
sy.bank_id);
#else
G_cen_bankid);
#endif
$prepare adm_bank from $sqlstr;
$declare adm_bank_cur cursor for adm_bank;
$open adm_bank_cur;
if ( SQLCODE ) {
errcall ( ERROR, "open adm_bank_cur err[%d]",SQLCODE );
return ( -1 );
}
while ( bank_num < 400 ) {
$fetch adm_bank_cur into $bankid, $count:indi;
if ( SQLCODE == SQLNOTFOUND )
break;
if ( SQLCODE ) {
$close adm_bank_cur;
errcall ( ERROR, "fetch adm_bank_cur err[%d]",SQLCODE );
return ( -1 );
}
if ( indi != -1 && count ) {
DelSpace(bankid);
if ( memcmp(bankid, "0000", 4) ) {
strcpy ( bankids[bank_num].bankid, bankid );
strcpy ( bankids[bank_num].hostid, "00" );
bankids[bank_num].count = count;
bank_num ++;
}
}
}
$close adm_bank_cur;
#ifdef wyz020428_mod
strcpy(bankids[bank_num].bankid, sy.bank_id);
#else
strcpy(bankids[bank_num].bankid, G_cen_bankid);
#endif
strcpy ( bankids[bank_num].hostid, "00" );
bankids[bank_num].count = 1;
} else {
strcpy(bankids[0].bankid, acq_bank_id);
strcpy(bankids[0].hostid, "00" );
bankids[0].count = 1;
}
/***************/
if (!(fp = fopen(file, "w"))) {
daylog(ERROR, "Open %s error!", file);
return(-1); /* File operate error */
}
bank_num = 0;
while (bankids[bank_num].bankid[0] != 0) {
strcpy(acq_bank_id, bankids[bank_num].bankid);
memset(total_card_amt, 0, sizeof(total_card_amt));
memset(total_card_cnt, 0, sizeof(total_card_cnt));
/***************
* 统计商户数
***************/
memset(&merchids_card, 0, sizeof(merchids_card));
#ifdef wyz020428_mod
sprintf(sqlstr,
"select distinct merchant_id, count(*), sum(tran_amt) \
from cur_settle_ls \
where tran_type in (1,2,3,5,6,7,8,9,10,14) \
and saf_flag = \'0\' \
and tran_flag = \'0\' \
and tran_amt != 0 \
and manual_flag = \'N\' \
and resp_code like \'00\' \
and snd_settle_date >= \'%s\' and snd_settle_date <= \'%s\' \
and acq_bank_id = \'%s\' \
and card_type in (01,02,51,52,53,54,55) \
group by merchant_id", \
start_date, end_date, acq_bank_id);
#else
if (cur_flag == 1)
sprintf(sqlstr,
"select distinct merchant_id, count(*), sum(tran_amt) \
from cur_settle_ls \
where acq_bank_id = \'%s\' \
and snd_settle_date >= \'%s\' \
and snd_settle_date <= \'%s\' \
group by merchant_id",
G_cen_bankid, start_date, end_date);
else if (cur_flag == 0)
sprintf(sqlstr,
"select distinct merchant_id, count(*), sum(tran_amt) \
from his_settle_ls \
where acq_bank_id = \'%s\' \
and snd_settle_date >= \'%s\' \
and snd_settle_date <= \'%s\' \
group by merchant_id",
G_cen_bankid, start_date, end_date);
else
sprintf(sqlstr,
"select distinct merchant_id, count(*), sum(tran_amt) \
from cur_settle_ls \
where acq_bank_id = \'%s\' \
and snd_settle_date >= \'%s\' \
and snd_settle_date <= \'%s\' \
group by merchant_id \
UNION \
select distinct merchant_id, count(*), sum(tran_amt) \
from cur_settle_ls \
where acq_bank_id = \'%s\' \
and snd_settle_date >= \'%s\' \
and snd_settle_date <= \'%s\' \
group by merchant_id",
G_cen_bankid, start_date, end_date
G_cen_bankid, start_date, end_date);
#endif
$prepare merch_forg from $sqlstr;
$declare merch_forg_cur cursor for merch_forg;
$open merch_forg_cur;
if ( SQLCODE ) {
errcall ( ERROR, "open merch_forg_cur err[%d]",SQLCODE );
return ( -1 );
}
while ( merch_num < 50000 ) {
$fetch merch_forg_cur into $merchid, $count:indi1, $tran_amt:indi2;
if ( SQLCODE == SQLNOTFOUND )
break;
if ( SQLCODE ) {
$close merch_forg_cur;
errcall ( ERROR, "fetch merch_forg_cur err[%d]",SQLCODE );
return ( -1 );
}
if ( indi1 != -1 && indi2 != -1 && count ) {
DelSpace(merchid);
get_sign_bank(merchid, bankid1, hostid1);
if (strcmp(acq_bank_id, bankid1) == 0) {
strcpy ( merchids_card[merch_num].merchid, merchid );
merchids_card[merch_num].count = count;
merchids_card[merch_num].amount = tran_amt;
merch_num ++;
}
}
}
$close merch_forg_cur;
#ifdef wyz020428_mod
sprintf(sqlstr,
"select distinct merchant_id, count(*), sum(tran_amt) \
from his_settle_ls \
where tran_type in (1,2,3,5,6,7,8,9,10,14) \
and saf_flag = \'0\' \
and tran_flag = \'0\' \
and tran_amt != 0 \
and manual_flag = \'N\' \
and resp_code like \'00\' \
and snd_settle_date >= \'%s\' and snd_settle_date <= \'%s\' \
and acq_bank_id = \'%s\' \
and card_type in (01,02,51,52,53,54,55) \
group by merchant_id", \
start_date, end_date, acq_bank_id);
$prepare merch_forg2 from $sqlstr;
$declare merch_forg_cur2 cursor for merch_forg2;
$open merch_forg_cur2;
if ( SQLCODE ) {
errcall ( ERROR, "open merch_forg_cur2 err[%d]",SQLCODE );
return ( -1 );
}
while ( merch_num < 400 ) {
$fetch merch_forg_cur2 into $merchid, $count:indi1, $tran_amt:indi2;
if ( SQLCODE == SQLNOTFOUND )
break;
if ( SQLCODE ) {
$close fkhfx_cur2;
errcall ( ERROR, "fetch merch_forg_cur2 err[%d]",SQLCODE );
return ( -1 );
}
DelSpace(merchid);
if ( indi1 != -1 && indi2 != -1 && count ) {
get_sign_bank(merchid, bankid1, hostid1);
if (strcmp(acq_bank_id,bankid1) == 0) {
for ( i=0; i<merch_num; i++ )
if ( !strcmp ( merchids_card[i].merchid, merchid) )
break;
if ( i >= merch_num ) {
strcpy ( merchids_card[merch_num].merchid, merchid );
merchids_card[merch_num].count = count;
merchids_card[merch_num].amount = tran_amt;
merch_num ++;
} else {
merchids_card[i].count += count;
merchids_card[i].amount += tran_amt;
}
}
}
}
$close merch_forg_cur2;
#else
#endif
/****************/
merch_num = 0;
/* 如果联行资料中的收单行没有商户发生交易, 则不统计 */
if (merchids_card[0].merchid[0] != 0) {
if (FileHead_merch_foreign_month(fp, start_date, end_date, acq_bank_id)) {
fclose(fp);
return(-2); /* Database operate error */
}
}
while (merchids_card[merch_num].merchid[0] != 0) {
strcpy(merchant_id, merchids_card[merch_num].merchid);
get_merchant_name(merchant_id,merchantname);
i = 0;
memset(card_amt, 0, sizeof(card_amt));
memset(card_cnt, 0, sizeof(card_cnt));
while (card_table1[i] != NULL && card_table1[i][0] != '\0') {
$declare merch_forg_cur3 cursor for
select count(*), sum(tran_amt) from cur_settle_ls
where merchant_id = :merchant_id
and card_type = :card_table1[i]
and tran_type in (1,2,3,5,6,7,8,9,10,14)
and saf_flag = '0'
and tran_amt != 0
and tran_flag = '0'
and manual_flag = 'N'
and resp_code like '00%'
and snd_settle_date >= :start_date and snd_settle_date <= :end_date and acq_bank_id = :acq_bank_id;
$open merch_forg_cur3;
if (SQLCODE) {
daylog(ERROR, "Open merch_forg_cur3![%d]", SQLCODE);
fclose(fp);
return(-2);
}
while (1) {
$fetch merch_forg_cur3 into $count:indi1, $tran_amt:indi2;
if (SQLCODE == 100) break;
if (SQLCODE) {
daylog(ERROR, "Fetch merch_forg_cur3 error![%d]", SQLCODE);
$close merch_forg_cur3;
fclose(fp);
return(-2);
}
if ( indi1 != -1 && indi2 != -1 && count ) {
card_amt[i] += tran_amt;
card_cnt[i] += count;
}
}
$close merch_forg_cur3;
$declare merch_forg_cur4 cursor for
select count(*), sum(tran_amt) from his_settle_ls
where merchant_id = :merchant_id
and card_type = :card_table1[i]
and tran_type in (1,2,3,5,6,7,8,9,10,14)
and saf_flag = '0'
and tran_flag = '0'
and tran_amt != 0
and manual_flag = 'N'
and resp_code like '00%'
and snd_settle_date >= :start_date and snd_settle_date <= :end_date and acq_bank_id = :acq_bank_id;
$open merch_forg_cur4;
if (SQLCODE) {
daylog(ERROR, "Open merch_forg_cur4![%d]", SQLCODE);
fclose(fp);
return(-2);
}
while (1) {
$fetch merch_forg_cur4 into $count:indi1, $tran_amt:indi2;
if (SQLCODE == 100) break;
if (SQLCODE) {
daylog(ERROR, "Fetch merch_forg_cur4 error![%d]", SQLCODE);
$close merch_forg_cur4;
fclose(fp);
return(-2);
}
if ( indi1 != -1 && indi2 != -1 && count ) {
card_amt[i] += tran_amt;
card_cnt[i] += count;
}
}
$close merch_forg_cur4;
total_card_amt[i] += card_amt[i];
total_card_cnt[i] += card_cnt[i];
i++;
}
fprintf(fp, "%-30s %14.2lf %14.2lf %14.2lf %14.2lf %14.2lf %14.2lf %14.2lf %14.2lf\n", merchantname, card_amt[0], card_amt[1], card_amt[2], card_amt[3], card_amt[4], card_amt[5], card_amt[6],merchids_card[merch_num].amount);
fprintf(fp, "%-30s %14d %14d %14d %14d %14d %14d %14d %14d\n\n", " ", card_cnt[0], card_cnt[1], card_cnt[2], card_cnt[3], card_cnt[4], card_cnt[5], card_cnt[6],merchids_card[merch_num].count);
total_tran_amt += merchids_card[merch_num].amount; /* 总计交易金额 */
total_tran_cnt += merchids_card[merch_num].count; /* 总计交易金额 */
merch_num++;
}
/* 报表结尾 */
if (merchids_card[0].merchid[0] != 0) {
fprintf(fp, "------------------------------------------------------------------------------------------------------------------------------------------------------\n");
if (total_tran_cnt)
fprintf(fp, "%-30s %14.2lf %14.2lf %14.2lf %14.2lf %14.2lf %14.2lf %14.2lf %14.2lf\n", "合计金额: ",total_card_amt[0], total_card_amt[1], total_card_amt[2], total_card_amt[3], total_card_amt[4], total_card_amt[5], total_card_amt[6], total_tran_amt);
fprintf(fp, "%-30s %14d %14d %14d %14d %14d %14d %14d %14d\n\n\f", "合计笔数: ",total_card_cnt[0], total_card_cnt[1], total_card_cnt[2], total_card_cnt[3], total_card_cnt[4], total_card_cnt[5], total_card_cnt[6], total_tran_cnt);
}
bank_num++; /* 统计下一个银行 */
}
fclose(fp);
return(0);
}
int FileHead_merch_foreign_month(FILE *fp, char *start_date, char *end_date, char *acq_bank_id)
{
char date1[11],date2[11],bank_name[21];
str2date(date1, start_date, "/");
str2date(date2, end_date, "/");
get_bank_name(acq_bank_id,"00", bank_name);
fprintf(fp, "%37s 中国银行 BTS 系统\n", " ");
fprintf(fp, "%37s中行商户本外卡交易统计月报表\n\n", " ");
fprintf(fp, "收单行号:%s 收单行名: %s\n",acq_bank_id,bank_name);
fprintf(fp, "日期:%s 到 %s%103s单位:人民币元\n",date1,date2," ");
fprintf(fp, "======================================================================================================================================================\n");
fprintf(fp, "%-30s %14s %14s %14s %14s %14s %14s %14s %14s\n", "商户名称","借记卡","信用卡","VISA", "MC", "AE", "DC", "JCB", "合计");
fprintf(fp, "------------------------------------------------------------------------------------------------------------------------------------------------------\n");
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -