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

📄 edc_forg_month_rpt.ec

📁 在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便
💻 EC
字号:
/*=====================================
中行外卡EDC交易统计月报表
相关数据库:	cur_settle_ls, his_settle_ls
函数名:edc_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;

EXEC SQL WHENEVER SQLERROR CALL error_handler;
EXEC SQL WHENEVER SQLWARNING CALL warning_handler;
EXEC SQL WHENEVER NOT FOUND CALL notfound_handler;
#define	MAX_MERCH_NUM	5000

struct {
	char	bankid[12];
	char	hostid[3];
	int		count;
	double	amount;
}	bankids_card[MAX_MERCH_NUM];

$char	foreign_table[40][4] = {
		"51",
		"52",
		"53",
		"54",
		"55",
		"",
		NULL,
};

extern double get_qs_tip(), get_bank_name(), type2buf();

int edc_foreign_month_rpt(file, s_date, e_date)
char *file;
char *s_date, *e_date;
{
	FILE	*fp;
	int	i, ret;
	double 	total_tran_amt;
	$char	start_date[9];
	$char	end_date[9];
	$S_tran_ls ls;
	$double amt_tmp, tran_amt;
	$char	sqlstr[1024];
	$char	bankid[18], hostid[3];
	$char	bankname[50], acq_bank_id[12];
	$int 	count, bank_num;
	$int	foreign_cnt[40];
	$int	total_foreign_cnt[40], total_tran_cnt;
	$short	indi1, indi2 ;
	$double foreign_amt[40],total_foreign_amt[40];
	$S_sys_param sy;
	
	strcpy(start_date, s_date);
	strcpy(end_date, e_date);

	bank_num = ret = total_tran_cnt = 0;
	total_tran_amt = 0.0;
	if ( ret = select_sys_param(&sy) ) {
		daylog(ERROR, "查本地参数表错误[%d]!",ret);
		return ( -1 );
	}
	memset(total_foreign_amt, 0, sizeof(total_foreign_amt));
	memset(total_foreign_cnt, 0, sizeof(total_foreign_cnt));

/***************
* 统计发卡行数
***************/
	memset(&bankids_card, 0, sizeof(bankids_card));
#ifdef wyz020429_mod
	sprintf(sqlstr,
		"select distinct acq_bank_id, count(*), sum(tran_amt) \
		from cur_tran_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 local_sys_date >= \'%s\' and  local_sys_date <= \'%s\' \
		and card_type in (51,52,53,54,55)  \
		group by acq_bank_id", \
		start_date, end_date);
#else
	sprintf(sqlstr,
		"select distinct acq_bank_id, count(*), sum(tran_amt) \
		from cur_settle_ls		\
		where snd_settle_date >= \'%s\'	\
		and  snd_settle_date <= \'%s\'	\
		and card_type > '50'		\
		group by acq_bank_id",
		start_date, end_date);
#endif

	$prepare edc_forg from $sqlstr;
	if (SQLCODE) {
		daylog(ERROR, "PREPARE Failed[%d]", SQLCODE);
		return -1;
	}

	$declare edc_forg_cur cursor for edc_forg;
	if (SQLCODE) {
		daylog(ERROR, "DECLARE Failed[%d]", SQLCODE);
		return -1;
	}

	$open edc_forg_cur;
	if (SQLCODE) {
		daylog(ERROR, "open edc_forg_cur err[%d]", SQLCODE);
		return -1;
	}

	while ( bank_num < MAX_MERCH_NUM ) {
		$fetch edc_forg_cur into $bankid,  $count:indi1, $tran_amt:indi2;
		if ( SQLCODE == SQLNOTFOUND )
			break;
		if ( SQLCODE ) {
			daylog(ERROR, "fetch edc_forg_cur err[%d]", SQLCODE);
			$close edc_forg_cur;
			return ( -1 );
		}
		if ( indi1 != -1 && indi2 != -1 && count ) {
			DelSpace(bankid);
			strcpy ( bankids_card[bank_num].bankid, bankid );
			strcpy ( bankids_card[bank_num].hostid, "00" );
			bankids_card[bank_num].count = count;
			bankids_card[bank_num].amount = tran_amt;
			bank_num ++;
		}
	}
	$close edc_forg_cur;

#ifdef wyz020429_mod
		sprintf(sqlstr,
			"select distinct acq_bank_id, count(*), sum(tran_amt) \
			from his_tran_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 local_sys_date >= \'%s\' and  local_sys_date <= \'%s\' \
			and card_type in (51,52,53,54,55)  \
			group by acq_bank_id", \
			start_date, end_date);
#else
	sprintf(sqlstr,
		"select distinct acq_bank_id, count(*), sum(tran_amt) \
		from his_settle_ls		\
		where snd_settle_date >= \'%s\'	\
		and snd_settle_date <= \'%s\'	\
		and card_type > '50'		\
		group by acq_bank_id",
		start_date, end_date);
#endif

	$prepare edc_forg2 from $sqlstr;
	$declare edc_forg_cur2 cursor for edc_forg2;

	$open edc_forg_cur2;
	if (SQLCODE) {
		daylog(ERROR, "open edc_forg_cur2 err[%d]", SQLCODE);
		return -1;
	}

	while ( bank_num < MAX_MERCH_NUM ) {
		$fetch edc_forg_cur2 into $bankid, $count:indi1, $tran_amt:indi2;
		if ( SQLCODE == SQLNOTFOUND )
			break;
		if ( SQLCODE ) {
			$close edc_forg_cur2;
			daylog(ERROR, "fetch edc_forg_cur2 err[%d]", SQLCODE);
			return -1;
		}
		DelSpace(bankid);
		if ( indi1 != -1 && indi2 != -1 && count ) {
			for ( i=0; i<bank_num; i++ )
				if ( !strcmp ( bankids_card[i].bankid, bankid) )
					break;
			if ( i >= bank_num ) {
				strcpy ( bankids_card[bank_num].bankid, bankid );
				strcpy ( bankids_card[bank_num].hostid, "00" );
				bankids_card[bank_num].count = count;
				bankids_card[bank_num].amount = tran_amt;
				bank_num ++;
			} else {
				bankids_card[i].count += count;
				bankids_card[i].amount += tran_amt;
			}
		}
	}
	$close edc_forg_cur2;
/****************/

	if (!(fp = fopen(file, "w"))) {
		daylog(ERROR, "Open %s error!", file);
		return(-1);	/* File operate error */
	}
	bank_num = 0;
	if (FileHead_edc_foreign_month(fp, start_date, end_date)) {
		fclose(fp);
		return(-2);	/* Database operate error */
	}
	while (bankids_card[bank_num].bankid[0] != 0) {
		strcpy(acq_bank_id, bankids_card[bank_num].bankid);
		get_bank_name(acq_bank_id,"00",bankname);

		i = 0;
		memset(foreign_amt, 0, sizeof(foreign_amt));
		memset(foreign_cnt, 0, sizeof(foreign_cnt));
		while (foreign_table[i] != NULL && foreign_table[i][0] != '\0') {
$ifdef wyz020429_mod;
			$declare edc_forg_cur3 cursor for
			select count(*), sum(tran_amt) from cur_tran_ls
			where acq_bank_id = :acq_bank_id
			and card_type = :foreign_table[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 local_sys_date >= :start_date
			and local_sys_date <= :end_date;
$else;
			$declare edc_forg_cur3 cursor for
			select count(*), sum(tran_amt) from cur_settle_ls
			where acq_bank_id = :acq_bank_id
			and card_type = :foreign_table[i] 
			and snd_settle_date >= :start_date
			and snd_settle_date <= :end_date;
			if (SQLCODE) {
				daylog(ERROR, "DECLARE Failed![%d]", SQLCODE);
				fclose(fp);
				return(-2);
			}
$endif;
			$open edc_forg_cur3;

			if (SQLCODE) {
				daylog(ERROR, "Open edc_forg_cur3![%d]", SQLCODE);
				fclose(fp);
				return(-2);
			}
			while (1) {
				$fetch edc_forg_cur3 into $count:indi1, $tran_amt:indi2;
				if (SQLCODE == 100) break;
				if (SQLCODE) {
					daylog(ERROR, "Fetch edc_forg_cur3 error![%d]", SQLCODE);
					$close edc_forg_cur3;
					fclose(fp);
					return(-2);
				}
				if ( indi1 != -1 && indi2 != -1 && count ) {
					foreign_amt[i] += tran_amt;
					foreign_cnt[i] += count;
				}
			}
			$close edc_forg_cur3;

$ifdef wyz020429_mod;
			$declare edc_forg_cur4 cursor for
			select count(*), sum(tran_amt) from his_tran_ls
			where acq_bank_id = :acq_bank_id
			and card_type = :foreign_table[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 local_sys_date >= :start_date
			and local_sys_date <= :end_date;
$else;
			$declare edc_forg_cur4 cursor for
			select count(*), sum(tran_amt) from his_settle_ls
			where acq_bank_id = :acq_bank_id
			and card_type = :foreign_table[i] 
			and snd_settle_date >= :start_date
			and snd_settle_date <= :end_date;
			if (SQLCODE) {
				daylog(ERROR, "DECLARE Failed![%d]", SQLCODE);
				fclose(fp);
				return(-2);
			}
$endif;

			$open edc_forg_cur4;

			if (SQLCODE) {
				daylog(ERROR, "Open edc_forg_cur4![%d]", SQLCODE);
				fclose(fp);
				return(-2);
			}
			while (1) {
				$fetch edc_forg_cur4 into $count:indi1, $tran_amt:indi2;
				if (SQLCODE == 100) break;
				if (SQLCODE) {
					daylog(ERROR, "Fetch edc_forg_cur4 error![%d]", SQLCODE);
					$close edc_forg_cur4;
					fclose(fp);
					return(-2);
				}
				if ( indi1 != -1 && indi2 != -1 && count ) {
					foreign_amt[i] += tran_amt;
					foreign_cnt[i] += count;
				}
			}
			$close edc_forg_cur4;
			total_foreign_amt[i] += foreign_amt[i];
			total_foreign_cnt[i] += foreign_cnt[i];
		    i++;
		}

		fprintf(fp, "%-20s %14.2lf(%5d) %14.2lf(%5d) %14.2lf(%5d) %14.2lf(%5d) %14.2lf(%5d) %14.2lf(%6d)\n", bankname, foreign_amt[0],foreign_cnt[0],foreign_amt[1], foreign_cnt[1], foreign_amt[2],foreign_cnt[2], foreign_amt[3],foreign_cnt[3], foreign_amt[4],foreign_cnt[4], bankids_card[bank_num].amount,bankids_card[bank_num].count);
		total_tran_amt +=  bankids_card[bank_num].amount;
		total_tran_cnt +=  bankids_card[bank_num].count;
		bank_num++;
	}
	/* 报表结尾 */
	fprintf(fp, "---------------------------------------------------------------------------------------------------------------------------------------------------------\n");
	if (total_tran_cnt)
		fprintf(fp, "%-20s %14.2lf(%5d) %14.2lf(%5d) %14.2lf(%5d) %14.2lf(%5d) %14.2lf(%5d) %14.2lf(%6d)\n\n", "合计:  ",total_foreign_amt[0],total_foreign_cnt[0],  total_foreign_amt[1],total_foreign_cnt[1], total_foreign_amt[2],total_foreign_cnt[2], total_foreign_amt[3],total_foreign_cnt[3], total_foreign_amt[4],total_foreign_cnt[4], total_tran_amt,total_tran_cnt);
	fclose(fp);
	return(0);
}

int FileHead_edc_foreign_month(FILE *fp, char *start_date, char *end_date)
{
	char date1[11],date2[11],bank_name[21];

$ifdef wyz020429_mod;
	$S_sys_param sys;
	$select * into :sys from sys_param;
	if (SQLCODE) {
		daylog(ERROR, "Select sys_param error!");
		return(-1);
	}
	del_st_space("sys_param", &sys);
$else;
$endif;
	str2date(date1, start_date, "/");
	str2date(date2, end_date, "/");
#ifdef wyz020429_mod
	get_bank_name(sys.bank_id,"00", bank_name);
#else
	get_bank_name(G_bankid,"00", bank_name);
#endif

/*	fprintf(fp, "%32s  %s\n", " ",GV_filehead); */
	fprintf(fp, "%32s中国银行 BTS 系统\n", " ");
	fprintf(fp, "%32s外卡 EDC 交易统计月报表\n\n", " ");
	fprintf(fp, "日期:%s 到  %s%105s单位:人民币元\n",date1,date2," ");
	fprintf(fp, "=========================================================================================================================================================\n");
	fprintf(fp, "%-20s %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 + -