public.ec

来自「在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便」· EC 代码 · 共 786 行 · 第 1/2 页

EC
786
字号
#ifdef zgx020409_del
/**************************************************
 * public.ec 部分已被移到dblib/目录中的public.ec
 *	     inq_select(),int_select()移到dbprg/的
 *	     win_select.ec中
 **************************************************/



/*=============================================================
 * 功能: 		BTS数据库处理公共函数
 * 最后修改日期:	
 * 
 * 周国祥	2001/04/29 增加inq_select()函数,
 * 	           用于界面输入时弹出选择窗口
 * 周国祥	2001/05/15 增加get_sign_bank()函数,
 * ===========================================================*/

#include <stdio.h>
#include <curses.h>
#include "mytools.h"

EXEC SQL INCLUDE sqlca;
EXEC SQL WHENEVER SQLERROR CALL error_handler;
EXEC SQL WHENEVER SQLWARNING CALL warning_handler;
EXEC SQL WHENEVER NOT FOUND CALL notfound_handler;

$char sqlstring[2000];

$include "db_struct.h";

int sql_run(str)
char *str;
{
	strcpy(sqlstring,str);
	EXEC SQL PREPARE s_comm FROM :sqlstring;
	EXEC SQL EXECUTE s_comm;
	return(sqlca.sqlcode);
}

int query_count(str)
char *str;
{
	$int couts;
	$short indi;

	strcpy(sqlstring,str);
	EXEC SQL PREPARE q_comm_1 FROM :sqlstring;
	EXEC SQL DECLARE query_cur CURSOR FOR q_comm_1;
	EXEC SQL OPEN query_cur;
	EXEC SQL FETCH query_cur INTO :couts:indi;
	if ((indi == -1) || sqlca.sqlcode) couts = 0;
	EXEC SQL CLOSE query_cur;
	return(couts);
}

long calc_long(str)
char *str;
{
	$long total;
	$short indi;

	strcpy(sqlstring,str);
	EXEC SQL PREPARE q_comm_2 FROM :sqlstring;
	EXEC SQL DECLARE calcl_cur CURSOR FOR q_comm_2;
	EXEC SQL OPEN calcl_cur;
	EXEC SQL FETCH calcl_cur INTO :total:indi;
	if ((indi == -1) || sqlca.sqlcode) total = 0;
	EXEC SQL CLOSE calcl_cur;
	return(total);
}

double calc_double(str)
char *str;
{
	$double total;
	$short indi;

	strcpy(sqlstring,str);
	EXEC SQL PREPARE q_comm_3 FROM :sqlstring;
	EXEC SQL DECLARE calcd_cur CURSOR FOR q_comm_3;
	EXEC SQL OPEN calcd_cur;
	EXEC SQL FETCH calcd_cur INTO :total:indi;
	if ((indi == -1) || sqlca.sqlcode) total = 0;
	EXEC SQL CLOSE calcd_cur;
	return(total);
}

int get_title(char *title_name)
{
	$char center_name[41];
	$short indi;
	$char	bankid[12], hostid[3];

	title_name[0] = 0;
	EXEC SQL SELECT bank_id, host_id
		INTO :bankid, :hostid
		FROM sys_param;
	if (sqlca.sqlcode)
		return(sqlca.sqlcode);
	DelSpace(bankid);
	DelSpace(hostid);

	EXEC SQL SELECT bank_name
		INTO :center_name
		FROM bank_info
		WHERE bank_id = :bankid and host_id = :hostid;
	if (!sqlca.sqlcode)
		strcpy(title_name, center_name);
	return(sqlca.sqlcode);
}

/*
 * 获取bankid之IP地址
 */
int	get_ipaddr( id_in, ip_in )
char	id_in[12], ip_in[21];
{
	$char id[12], ip[21];
	int	len;

	memcpy(id, id_in, 12);
	memcpy(ip, ip_in, 21);

	EXEC SQL DECLARE addr_cur CURSOR FOR
	SELECT tran_ip_addr1
	FROM	bank_base
	WHERE	bank_id = :id;

	EXEC SQL OPEN addr_cur;
	EXEC SQL FETCH addr_cur INTO :ip;
	if (sqlca.sqlcode)
		return(sqlca.sqlcode);

	DelSpace(ip);
	strcpy(ip_in, ip);
	
	return (0);
}

int get_master(card, t)
char *card;
$parameter S_card_acct *t;
{
	$char m_card_no[19];
	
	sprintf(m_card_no,"%12.12s?00?",card);
/*================== WuBin 2001-4-9 21:02 ======Start==============
	EXEC SQL SELECT T41_card_no, T41_c_amt, T41_auth_cnt, T41_auth_amt,
			T41_auth_total, T41_balance, T41_deposit_cnt, 
			T41_deposit_amt
		 INTO :t->T41_master_card_no, :t->T41_c_amt, :t->T41_auth_cnt, 
		      :t->T41_auth_amt, :t->T41_auth_total, :t->T41_balance, 
		      :t->T41_deposit_cnt, :t->T41_deposit_amt
		 FROM card_acct 
		 WHERE T41_card_no MATCHES :m_card_no;
===========================2001-4-9 21:02=======End==============*/
	EXEC SQL SELECT card_no, card_amt, auth_cnt, auth_amt,
			auth_total, balance, deposit_cnt, 
			deposit_amt
		 INTO :t->card_no, :t->card_amt, :t->auth_cnt, 
		      :t->auth_amt, :t->auth_total, :t->balance, 
		      :t->deposit_cnt, :t->deposit_amt
		 FROM card_acct 
		 WHERE card_no MATCHES :m_card_no;


	return(sqlca.sqlcode);
}


int get_master_cardno(char *card, char *master)
{
	$char card_no[19],master_cardno[19],acc[13];
	
	strcpy(card_no,card);
	memcpy(acc,card_no,12);
	acc[12]='\0';

/*================== WuBin 2001-4-9 21:14 ======Start==============
	EXEC SQL SELECT MAX(T41_card_no) INTO :master_cardno 
		 FROM card_t 
		 WHERE T41_card_no[1,12] =:acc AND  
		       T41_card_no[14,15]="00";
===========================2001-4-9 21:14=======End==============*/
	EXEC SQL SELECT MAX(card_no) INTO :master_cardno 
		 FROM card_acct 
		 WHERE card_no[1,12] =:acc AND  
		       card_no[14,15]="00";

	memcpy(master,master_cardno,19);

	if(SQLCODE)  errcall(ERROR,"get_master_cardno error! [%d]",SQLCODE);

	return(sqlca.sqlcode);
}

/* 获取主卡帐户状态 */
int get_master_accstat(char *card, char *stat)
{
	$char a_stat[2],master[19];
	char card_no[19];
	int ret;
	
	strcpy(card_no,card);

	ret=get_master_cardno(card_no,master);
	if(ret) return(ret);

/*================== WuBin 2001-4-9 21:16 ======Start==============
	EXEC SQL SELECT T41_a_stat INTO :a_stat 
		 FROM card_acct 
		 WHERE T41_card_no = :master;
===========================2001-4-9 21:16=======End==============*/
	EXEC SQL SELECT master_stat INTO :a_stat 
		 FROM card_acct 
		 WHERE card_no = :master;

	memcpy(stat,a_stat,1);

	if(SQLCODE<0)  errcall(ERROR,"get_master_accstat error! [%d]",SQLCODE);
	return(sqlca.sqlcode);
}


int get_master_accno(char *card, char *no)
{
	$char acc_no[22],master[19];
	char card_no[19];
	int ret;
	
	strcpy(card_no,card);

	ret=get_master_cardno(card_no,master);
	if(ret) return(ret);

/*================== WuBin 2001-4-9 21:17 ======Start==============
	EXEC SQL SELECT T41_acc_no INTO :acc_no 
		 FROM card_acct 
		 WHERE T41_card_no = :master;
===========================2001-4-9 21:17=======End==============*/
	EXEC SQL SELECT acct_no INTO :acc_no 
		 FROM card_acct 
		 WHERE card_no = :master;

	memcpy(no,acc_no,12); /* 帐户号现只用12位 */

	if(SQLCODE)  errcall(ERROR,"get_master_accno error! [%d]",SQLCODE);
	return(sqlca.sqlcode);
}

/*
 * 弹出查询窗口进行选择
 * 必须两个字段,一般为code,name
 * sql_str形式:select code, name from table_name
 */
inq_select(char *sql_str, char *sel_code, char *sel_name)
{
	$char	code[20];
	$char	name[80];
	int	code_len = 0, name_len = 0;
	$char	sqlstring[1024];
	char	scr_dump_file[80];

	int	c, cc;
	WINDOW	*w, *boxw;
	int	row, col, srow, scol;
	
	int	i, j, oi;
	int	win_lines, win_cols;
	char	redraw = 0;
	$int	max_recno;
	$int	tmp_recno;
	$int	fst_recno;

	strcpy(sqlstring, sql_str);

	$prepare inquery_p FROM :sqlstring;
	$declare inquery_cur scroll cursor for inquery_p;
	$open inquery_cur;
	if (SQLCODE) {
		errcall(ERROR, "open cursor for %s.(%d)", sqlstring, SQLCODE);
		return(-1);
	}

	/*
	 * 计算总记录数,及code,name的最大长度,以便确定窗口大小
	 */
	max_recno = 0;
	while (1) {
		$fetch inquery_cur INTO :code, :name;
		if (SQLCODE) 
			break;
		max_recno ++;
		DelSpace(code);
		if (strlen(code) > code_len)
			code_len = strlen(code);
		DelSpace(name);
		if (strlen(name) > name_len)
			name_len = strlen(name);
	}

	if (max_recno == 0) {
		errcall(DEBUG, "inq_select no any entries");
		return(-2);
	}

	if (code_len % 2)	/* 使其为偶数 */
		code_len ++;
	win_cols = code_len + name_len + 2 + 2 + 2;
	if (win_cols < 16)
		win_cols = 16;
	if (win_cols > COLS - 12)
		return(-3);
	win_lines = 8;
	srow = 5;
	scol = COLS - win_cols - 8;

	

	sprintf( scr_dump_file, "/tmp/.inq_select.%d", getpid() );
	scr_dump ( scr_dump_file );

	boxw = newwin(win_lines+2+2, win_cols+4, srow-1, scol-2);
	w = newwin(win_lines+2, win_cols, srow, scol);

	zut_win_wboxclear(boxw, 1);
	wrefresh(boxw);

	for (i = 0; i < win_lines; i++) {
		tmp_recno = i + 1;
		$fetch absolute $tmp_recno inquery_cur into :code, :name;
		if (SQLCODE) 
			break;
		
		DelSpace(code);
		DelSpace(name);

		mvwprintw(w, i, 2, "%s", code);
		mvwprintw(w, i, 2+code_len+2, "%s", name);
	}

	mvwprintw(w, win_lines+1, 2, "↑↓移动 ESC退出");

	i = 0;
	mvwprintw(w, i, 0, "→");
	oi = 0;
	fst_recno = 1;
	redraw = 0;
	keypad(w, TRUE);
	while (1) {
		mvwprintw(w, i, 0, "→");
		wrefresh(w);
		switch (wgetch(w)) {
		case	KEY_UP:
		case	KEY_LEFT:
			if (i == 0) {
				if (fst_recno == 1) {
					beep();
					wattron(w, A_REVERSE);
					mvwprintw(w, win_lines, 0, "已到第一条.  ");
					wattroff(w, A_REVERSE);
					continue;
				}
				fst_recno--;
				redraw = 1;
			} else
				i--;
			break;
		case	KEY_DOWN:
		case	KEY_RIGHT:
			if (fst_recno + i == max_recno) {
				beep();
				wattron(w, A_REVERSE);
				mvwprintw(w, win_lines, 0, "已到最后一条.");
				wattroff(w, A_REVERSE);
				continue;
			}
			if (i == win_lines-1) {
				if (fst_recno+win_lines-1 == max_recno) {
					beep();
					wattron(w, A_REVERSE);
					mvwprintw(w, win_lines, 0, "已到最后一条.");
					wattroff(w, A_REVERSE);
					continue;
				}
				fst_recno++;
				redraw = 1;
			} else
				i++;
			break;
#ifdef STAR500
		case	KEY_F(12):

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?