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 + -
显示快捷键?