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

📄 export.ec

📁 在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便
💻 EC
📖 第 1 页 / 共 2 页
字号:
/****************************************************
 *	数据转出
 *		止付名单转出(hmdtorpt)
 *		商户资料转出(shoptorpt)
 *	A驱:/dev/fd0135ds18	B驱:/dev/fd196ds15
 *	若有不同, 需在文件$WORKDIR/etc/Floopy中配置
 *
 * 最后修改:	周国祥 2001/08/23
 ****************************************************/
#include <stdio.h>
#include <curses.h>
#include <sys/types.h>
#include <sys/timeb.h>
#include <time.h>

#include "tool.h"
#include "mytools.h"
$include "db_struct.h"


EXEC SQL INCLUDE sqlda;
EXEC SQL INCLUDE sqltypes;
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;

int doscp(char *src, char *driver, char *des)
{
	char cmd[128];

	sprintf(cmd, "doscp -m %s %s:%s >/dev/null 2>&1", src, driver, des);
	return(system(cmd));
}

int dosformat(char *driver, long *disk_size, long *free_size)
{
	FILE *fp;
	char cmd[128], out[64];
	int i;

	sprintf(out, "/tmp/.hmdout.%d", getpid());

	sprintf(cmd , "dosformat %s <<_!_ >%s 2>/dev/null\n\n_!_", driver, out);
	if (system(cmd)) {
	    unlink(out);
	    return(-1);
	}

	fp = fopen(out, "r");
	for (i = 0; i < 7; i++) fgets(cmd, 100, fp);
	if (*disk_size == 0)
	    sscanf(cmd, "%ld", disk_size);
	fgets(cmd, 100, fp);
	sscanf(cmd, "%ld", free_size);
	fclose(fp);
	unlink(out);
	return(0);
}

int getsize(char *driver, long *disk_size, long *free_size)
{
	FILE *fp;
	char cmd[128], out[64];
	unsigned int ret;
	int sec, track;

	sprintf(out, "/tmp/.hmdout.%d", getpid());

	sprintf(cmd, "dosdir %s >%s 2>/dev/null", driver, out);
	if (system(cmd)) {
	    unlink(out);
	    return(-1);
	}

	fp = fopen(out, "r");
	fseek(fp, -5, SEEK_END);
	fscanf(fp, "%s", cmd);
	if (!strcmp(cmd, "free")) {
	    fseek(fp, -19, SEEK_END);
	    fscanf(fp, "%ld", free_size);
	} else
	    if (*disk_size) *free_size = *disk_size;
	    else {
		fclose(fp);
		sprintf(cmd, "dtype %s >%s 2>/dev/null", driver, out);
		ret = system(cmd);
		if (ret && ret != 0x5d00 && ret != 0x6e00 && ret != 0x6f00) {
		    unlink(out);
		    return(-1);
		}

		fp = fopen(out, "r");
		fgets(cmd, 100, fp);
		if (!strstr(cmd, "MS-DOS")) {
		    fclose(fp);
		    unlink(out);
		    return(-1);
		}
		sscanf(cmd, "%*s%*[^0-9]%d%*[^0-9]%d", &sec, &track);
		*disk_size = *free_size = (long)sec * track * 1024;
	    }
	fclose(fp);
	unlink(out);
	return(0);
}

/*
 * 转出黑名单数据
 * 增加将黑名单转出到硬盘选项 2001.09.08 Wubin Added
 */
int hmdtoprt()
{
	$S_wb_list hmd;
	FILE *fpout;
	WINDOW *win;
	char fileday[128], fileout[128], screen[64], name[16];
	char driver[16], lastday[11], prefix[5], flag;
	char driver1[64], driver2[64];
	long disk_size = 0, free_size, bytes;
	int ch, diskno = 1;
	char	buf[128];
	char	*workdir;

	workdir = (char *)getenv("WORKDIR");
		
	sprintf(screen, "/tmp/.hmdtoprt.%d", getpid());
	scr_dump(screen);

	disp_below("止付名单转出");
	clear_wline(stdscr, LINES-1);
	win = newwin(16, 80, 4, 0);
	wrefresh(win);

	strcpy(fileout, "印刷格式转出");
	ch = strlen(fileout) + 1;
	strcpy(fileout + ch, "报表格式转出");
	ch += strlen(fileout + ch) + 1;
	strcpy(fileout + ch, " 取消 ");
	ch = multi_select(win, 1, "    请选择:", fileout, 3, 0, 0, 0);
	if (ch == 2) {
		delwin(win);
		scr_restore(screen);
		unlink(screen);
		return(0);
	}
	if (ch == 1) {
$ifdef zgx010823_added;
$else;
	    /*
	     * 因用户提出除转出到软盘外还须于硬盘中保存, 以便软盘损坏时
	     * 手工转出当时同样的数据, 为此每次转出数据文件保留前两次
	     */
	    sprintf(buf, "mv %s/prt/hmd_02.rpt %s/prt/hmd_01.rpt > /dev/null 2>&1", workdir, workdir);
	    system(buf);
	    sprintf(buf, "mv %s/prt/hmd.rpt %s/prt/hmd_02.rpt > /dev/null 2>&1", workdir, workdir);
	    system(buf);
$endif;
	    set_prompt(PROMPT_OFF);
	    getdatef(lastday, "");
	    mvwprintw(win, 1, 4, "请输入止付名单登记日期: [%s]", lastday);
	    if (in_item(win, "", 1, 29, lastday, 8, NULL, NULL, 0, 0) !=
		ENTER) {
		delwin(win);
		scr_restore(screen);
		unlink(screen);
		return(0);
	    }
	    mvwprintw(win, 3, 4, "正在生成止付名单统计表, 请稍候 ...");
	    wrefresh(win);
	    sprintf(fileout, "%s/prt/hmd.rpt", workdir);
	    ch = hmd_rpt(fileout, lastday);
	    if (!ch) {
		print_file(win, 5, 14, 1, fileout);
		h_winprompt(win, 14, 4, "生成报表成功! 任意键继续...", 1, 0);
	    } else {
		switch (ch) {
		    case -1:
			h_winprompt(win, 14, 4, "生成报表出错!", 1, 0);
			break;
		    case -2:
			h_winprompt(win, 14, 4, "数据库操作错误!", 1, 0);
			break;
		}
	    }
	    delwin(win);
	    scr_restore(screen);
	    unlink(screen);
	    return(0);
	}

	EXEC SQL DECLARE hmd_cur CURSOR FOR
	SELECT * FROM wb_list ORDER BY card_no;

	EXEC SQL OPEN hmd_cur;
	if (sqlca.sqlcode) {
	    h_winprompt(win, 14, 4, "取止付名单出错, 请重做!", 1, 0);
	    delwin(win);
	    scr_restore(screen);
	    unlink(screen);
	    return(-1);
	}
	EXEC SQL FETCH hmd_cur INTO :hmd;
	if (sqlca.sqlcode == 100) {
	    EXEC SQL CLOSE hmd_cur;
	    h_winprompt(win, 14, 4, "无止付名单, 按任意键继续", 1, 0);
	    delwin(win);
	    scr_restore(screen);
	    unlink(screen);
	    return(0);
	} else if (sqlca.sqlcode) {
	    EXEC SQL CLOSE hmd_cur;
	    h_winprompt(win, 14, 4, "取止付名单出错, 请重做!", 1, 0);
	    delwin(win);
	    scr_restore(screen);
	    unlink(screen);
	    return(-1);
	}

	prefix[0] = 0;
/***
	strcpy(lastday, "0000/00/00");
****/
	strcpy(lastday, "00000000");
	sprintf(fileday, "%s/etc/HMD", workdir);
	fpout = fopen(fileday, "r");
	if (fpout) {
	    fscanf(fpout, "%s", lastday);
	    fclose(fpout);
	}

	strcpy(driver1, "/dev/fd0135ds18");
	strcpy(driver2, "/dev/fd196ds15");

	sprintf(fileout, "%s/etc/Floopy", workdir);
	fpout = fopen(fileout, "r");
	if (fpout) {
	    while (1) {
		fscanf(fpout, "%s", fileout);
		if (feof(fpout)) break;
		if (fileout[0] == 'A') sscanf(fileout, "%*s%s", driver1);
		if (fileout[0] == 'B') sscanf(fileout, "%*s%s", driver2);
	    }
	    fclose(fpout);
	}



		strcpy(fileout, " A 驱 ");
		ch = strlen(fileout) + 1;
		strcpy(fileout + ch, " B 驱 ");
		ch += strlen(fileout + ch) + 1;
		strcpy(fileout + ch, " 硬盘 ");
		ch += strlen(fileout + ch) + 1;
		strcpy(fileout + ch, " 取消 ");
		ch = multi_select(win, 1, "    请选择驱动器:", fileout, 4, 0, 0, 0);

		if (ch == 2) {
			sprintf(fileout, "/tmp/.hmdout.%d", getpid());
	    	sprintf(name, "hmd.%03d", diskno);
	    	clear_wline(win, 3);
	    	mvwprintw(win, 3, 4, "止付名单转出中 (文件名: %s/tmp/%s) 请稍候 ...", workdir, name);
	    	wrefresh(win);

	    	fpout = fopen(fileout, "w");
	    	while (1) {
				if (strncmp(hmd.card_no, prefix, 4)) {
		    		strncpy(prefix, hmd.card_no, 4);
		    		prefix[4] = 0;
		    		fprintf(fpout, "\n%%%s$\n\n", prefix);
		   		}
				if (!strcmp(hmd.wb_type, "205")) 
					flag = '-';
				else 
					if (strcmp(hmd.input_date, lastday) >= 0) 
						flag = '+';
					else 
						flag = ' ';

				fprintf(fpout, "%4.4s %4.4s %4.4s %3.3s%c$\n", hmd.card_no + 4, hmd.card_no + 8, hmd.card_no + 12, hmd.card_no + 16, flag);

				EXEC SQL FETCH hmd_cur INTO :hmd;
				if (sqlca.sqlcode == 100) break;
				else if (sqlca.sqlcode) {
		   	 		EXEC SQL CLOSE hmd_cur;
		    		h_winprompt(win, 14, 4, "取止付名单出错, 请重做!", 1, 0);
	    	    	fclose(fpout);
		    		unlink(fileout);
		    		delwin(win);
		    		scr_restore(screen);
		    		unlink(screen);
		    		return(-1);
				}
	        del_st_space("wb_list", &hmd);
	    	}
	    	fclose(fpout);

	    /*
	     * 因用户提出除转出到软盘外还须于硬盘中保存, 以便软盘损坏时
	     * 手工转出当时同样的数据, 为此每次转出数据文件保留前两次
	     */
		if (diskno == 1) {
	    	sprintf(buf, "mkdir %s/tmp/hmd_01 >/dev/null 2>&1", workdir);
	    	system(buf);
	    	sprintf(buf, "mkdir %s/tmp/hmd_02 >/dev/null 2>&1", workdir);
	    	system(buf);
	    	sprintf(buf, "rm -f %s/tmp/hmd_01/*; mv %s/tmp/hmd_02/hmd.* %s/tmp/hmd_01 > /dev/null 2>&1", workdir, workdir, workdir);
	    	system(buf);
	    	sprintf(buf, "rm -f %s/tmp/hmd_02/hmd.*; mv %s/tmp/hmd.* %s/tmp/hmd_02 > /dev/null 2>&1", workdir, workdir, workdir);
	    	system(buf);
	    	sprintf(buf, "rm -f %s/tmp/hmd.* > /dev/null 2>&1", workdir);
	    	system(buf);
		}
		sprintf(buf, "cp %s %s/tmp/hmd.%03d > /dev/null 2>&1", fileout, workdir, diskno);
		system(buf);
 		h_winprompt(win, 14, 4, "印刷格式的止付名单转出成功!", 1, 0); 
		clear_screen(win);
		goto end;
	
	}
		switch (ch) {
		    case 0:
			strcpy(driver, driver1);
			break;
	 	  	case 1:
			strcpy(driver, driver2);
			break;
	  	  	default:
			EXEC SQL CLOSE hmd_cur;
			delwin(win);
			scr_restore(screen);
			unlink(screen);
			return(-1);
		}

		sprintf(fileout, "/tmp/.hmdout.%d", getpid());

		while (1) {
	    	mvwprintw(win, 1, 4, "请插入第 %d 张软盘 [ Enter 确认 ESC 取消 ]", diskno);
	    	do {
			ch = getkey(win);
			if (ch == ESCAPE) {
			    EXEC SQL CLOSE hmd_cur;
		 	   	unlink(fileout);
		 	   	delwin(win);
		 	   	scr_restore(screen);
		 	   	unlink(screen);
		   		return(-1);
				}
	    	} while (ch != ENTER);

	    	if (!yorn(win, 3, "    是否格式化该软盘?", "1.是", "0.否", 0, 0)) {
				mvwprintw(win, 3, 4, "正在格式化软盘, 请稍候 ...");
				wrefresh(win);
				if (dosformat(driver, &disk_size, &free_size)) {
		  	  		h_winprompt(win, 14, 4, "格式化出错, 按任意键继续", 1, 0);
		   	 		clear_screen(win);
		    		continue;
				}
	    	} else {
				mvwprintw(win, 3, 4, "正在检测软盘, 请稍候 ...");
				wrefresh(win);
				if (getsize(driver, &disk_size, &free_size)) {
		    		h_winprompt(win, 14, 4, "读软盘出错, 按任意键继续", 1, 0);
		    		clear_screen(win);
		    		continue;
				}
				if (free_size < 31) {
		    		h_winprompt(win, 14, 4, "软盘剩余空间不足, 按任意键继续", 1, 0);
		    		clear_screen(win);
		    		continue;
				}
	    	}

	    
	    	sprintf(name, "hmd.%03d", diskno);
	    	clear_wline(win, 3);
	    	mvwprintw(win, 3, 4, "止付名单转出中 (文件名: %s) 请稍候 ...", name);
	    	wrefresh(win);

	    	bytes = 0;
	    	fpout = fopen(fileout, "w");
	    	while (bytes <= free_size - 31) {
				if (strncmp(hmd.card_no, prefix, 4)) {
		    	strncpy(prefix, hmd.card_no, 4);
		    	prefix[4] = 0;
		    	fprintf(fpout, "\n%%%s$\n\n", prefix);
		    	bytes += 12;
				}

⌨️ 快捷键说明

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