win_select.old.ec

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

EC
774
字号
/*******************************************************
 * 程序名: 	win_select.ec 窗口选择处理函数
 * 功  能:      用于界面输入时弹出选择窗口
 * 
 * 周国祥	2001/04/29 增加inq_select()函数,
 *
 * 周国祥	2002/04/09 从public.ec中分离出来
 * 周国祥  	2002/05/06 修改bitmap_select()并将之
 *		           从../XXX_ADM/pubname.c中
 *			   移入
 *
 *******************************************************/

#include <stdio.h>
#include <curses.h>
#include "mytools.h"
#include "bitmap.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";

/*
 * 弹出查询窗口进行选择
 * 必须两个字段,一般为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_len, code);
		mvwprintw(w, i, 2+code_len+2, "%-*s", name_len, name);
	}

	mvwprintw(w, win_lines+1, 2, "%-*s", win_cols-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, "%-*s", win_cols, "已到第一条.  ");
					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, "%-*s", win_cols, "已到最后一条.");
				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, "%-*s", win_cols, "已到最后一条.");
					wattroff(w, A_REVERSE);
					continue;
				}
				fst_recno++;
				redraw = 1;
			} else
				i++;
			break;
#ifdef STAR500
		case	KEY_F(12):
#else
		case	KEY_PPAGE:
#endif
			if (fst_recno == 1) {
				beep();
				wattron(w, A_REVERSE);
				mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到第一页.  ");
				wattroff(w, A_REVERSE);
				continue;
			}
			fst_recno -= win_lines;
			if (fst_recno <= 0)
				fst_recno = 1;
/*
			i = 0;
*/
			redraw = 1;
			break;
#ifdef STAR500
		case	KEY_F(13):
#else
		case	KEY_NPAGE:
#endif
			if (fst_recno + win_lines >= max_recno) {
				beep();
				wattron(w, A_REVERSE);
				mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到最后一页.");
				wattroff(w, A_REVERSE);
				continue;
			}
			fst_recno += win_lines;
			if (i + fst_recno >= max_recno) {
				/* 最后一页调整i */
				i = max_recno - fst_recno;
			}
/*
			i = 0;
*/
			redraw = 1;
			break;
		case	KEY_F(4):
		case	'\n':
		case	'\r':
/*================== WuBin 2001-6-22 10:39 ======Start==============*/
			tmp_recno = fst_recno+i;
			$fetch absolute $tmp_recno inquery_cur into :code, :name;
/*===========================2001-6-22 10:39=======End==============*/
			$close inquery_cur;
			DelSpace(code);
			DelSpace(name);
			strcpy(sel_code, code);
			strcpy(sel_name, name);
			delwin(w);
			delwin(boxw);
			scr_restore ( scr_dump_file );
			unlink ( scr_dump_file );
			return(0);
		case	'\033':
			$close inquery_cur;
			strcpy(sel_code, "");
			strcpy(sel_name, "");
			delwin(w);
			delwin(boxw);
			scr_restore ( scr_dump_file );
			unlink ( scr_dump_file );
			return(-3);
		default:
			beep();
			continue;
		}
		mvwprintw(w, win_lines, 0, "%-*s", win_cols, " ");
		mvwprintw(w, oi, 0, "  ");
		wrefresh(w);
		oi = i;
		if (redraw == 0) {
			continue;
		}
		for (j = 0; j < win_lines; j++) {
			tmp_recno = fst_recno + j;
			$fetch absolute $tmp_recno inquery_cur into :code, :name;
			if (SQLCODE) {
				mvwprintw(w, j, 0, "%-*s", win_cols, " ");
				continue;
			}
			mvwprintw(w, j, 2, "%-*s", code_len, code);
			mvwprintw(w, j, 2+code_len+2, "%-*s", name_len, name);
			redraw = 0;
		}
	}
}


/*
 * 根据主键名(以','号分隔)及键值(以','号分隔)
 * 构造WHERE串
 */
int make_where_str(where_str, key, keyval)
char	*where_str, *key, *keyval;
{
	int	i, cnt;
	char	key_str[256], keyval_str[256];
	char	tmpbuf[256], tmpbuf1[31], tmpbuf2[31];;

	strcpy(key_str, key);
	if (key_str[strlen(key) - 1] != ',')
		strcat(key_str, ",");

	strcpy(keyval_str, keyval);
	if (keyval_str[strlen(keyval) - 1] != ',')
		strcat(keyval_str, ",");

	strcpy(where_str, " 1=1 ");
	cnt = zut_get_seperate(key_str, ',');
	if (cnt != zut_get_seperate(keyval_str, ',')) {
		return(-1);
	}
	for (i = 0; i < cnt; i++) {
		zut_get_fld(key_str, i, tmpbuf1, ',');
		zut_get_fld(keyval_str, i, tmpbuf2, ',');
		sprintf(tmpbuf, " and %s=\'%s\'", tmpbuf1, tmpbuf2);
		strcat(where_str, tmpbuf);
	}
	return(0);
}

/*
 * 弹出查询窗口进行选择
 * 必需两个字段,一般为code,name
 * sql_str形式:select code, name from table_name
 */
int int_select(char *sql_str, int sel_code, char *sel_name)
{
	$int	code;
	$char	name[80];
	int	code_len = 6, 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_select FROM :sqlstring;
	$declare inquery_cur_select scroll cursor for inquery_select;
	$open inquery_cur_select;
	if (SQLCODE)
		return(-1);

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

	if (max_recno == 0) {
		return(-2);
	}


	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/.int_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_select into :code, :name;
		if (SQLCODE) 
			break;
		
		DelSpace(name);

		mvwprintw(w, i, 2, "%-*d", code_len, code);
		mvwprintw(w, i, 2+code_len+2, "-*%s", name_len, 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, "→");

⌨️ 快捷键说明

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