⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 merch_forg_month_rpt.old.ec

📁 在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便
💻 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 + -