📄 agtpay.ec
字号:
EXEC SQL ROLLBACK WORK;
return (-1);
}
/* 验证 */
if (datahead.sum_num != tot_num)
{
batlog("文件实际笔数与汇总信息不符合![%d][%d] [%s][%d]", datahead.sum_num, tot_num, __FILE__, __LINE__);
}
if ( datahead.sum_amt - suc_amt - bad_amt < -ZEROAMT
|| datahead.sum_amt - suc_amt - bad_amt > ZEROAMT)
{
batlog("文件实际金额与汇总信息不符合![%.2lf][%.2lf] [%s][%d]", datahead.sum_amt, suc_amt+bad_amt, __FILE__, __LINE__);
}
/* 生成结果文件 */
ret = gen_retfile(&datahead, suc_num, bad_num, suc_amt, reflag);
if (ret != 0)
{
batlog("生成结果文件错! [%s][%d]", __FILE__, __LINE__);
return (-1);
}
/* 关闭数据库 */
EXEC SQL CLOSE DATABASE;
if (SQLCODE)
{
batlog("关闭数据库失败!database_name[%s][%d] [%s][%d]", database, SQLCODE, __FILE__, __LINE__);
return (-1);
}
batlog("批量代发工资完成! [%s][%d]", __FILE__, __LINE__);
return (0);
}
/* 写日志函数
* Function: batlog(char * fmt,...)
*/
void batlog(va_alist) /* va_alist = parameters table*/
va_dcl
{
va_list args;/* a varible in order to check parameters table */
char *sign,*fmt;
char err_str1[80],err_str2[80];
char outfile[80];
char *home;
FILE *logfd;
time_t itm;
struct tm *stm;
memset(err_str1,'-',79); err_str1[79]='\0';
memset(err_str2,'*',79); err_str2[79]='\0';
memset(outfile,0x0,80);
itm=time(&itm);
stm=localtime(&itm);
sprintf(outfile,"./%s", ERRNAME );
/* initial parameters table, set args at start of parameters table */
va_start(args);
if ((logfd=fopen(outfile,"a"))==NULL)
{
fprintf(stderr,"Error in open %s\n",outfile);
return;
}
fprintf(logfd,"%s\n",err_str2);
fprintf(logfd,"%4d/%02d/%02d %02d:%02d:%02d\n",\
stm->tm_year+1900,\
stm->tm_mon+1,stm->tm_mday,\
stm->tm_hour,stm->tm_min,stm->tm_sec);
fmt=va_arg(args,char *);
vfprintf(logfd,fmt,args);
fprintf(logfd,"\n%s\n",err_str1);
fflush(logfd);
va_end(args); /* clear parameters table */
fclose(logfd);
}
/* 去右空格函数
* Function: char *batlog(char * fmt,...)
*/
char * rtrim ( char *str )
{
char *endp;
if ( str == NULL ) return str;
for ( endp = strchr (str, '\0'); endp != (char*)str && *--endp == ' '; )
*endp = '\0';
return (str);
}
/*取文件中某个域的值
*Function: get_value(char * line, int *index, char * value)
* line -- 原字符串
* index -- 起始位置
* value -- 域值
*/
char *
get_value(char * line, int *index, char * value)
{
char *p = NULL;
p = strchr(&line[*index], '|');
if (p == NULL)
{
p = strchr(&line[*index], '\n');
if (p == NULL)
{
return(NULL);
}
}
strncpy(value, &line[*index], p - &(line[*index]));
*index = *index + (p - &(line[*index])) + 1;
return (value);
}
/*取第一行汇总信息
*Function: read_tot_line(char * line, struct s_data_head *head)
* line -- 原内容字符串
* head -- 第一行汇总信息结构体指针
*return: 0 -- 成功 <0 -- 失败
*/
int
read_tot_line(char * line, struct s_data_head * head)
{
char tmpstr[80+1];
int index = 0;
memset(tmpstr, 0, sizeof(tmpstr));
/* 单位名称 */
get_value(line, &index, tmpstr);
rtrim(tmpstr);
strncpy(head->corp_name, tmpstr, 60);
/* 合计金额 */
memset(tmpstr, 0, sizeof(tmpstr));
get_value(line, &index, tmpstr);
rtrim(tmpstr);
head->sum_amt = atof(tmpstr);
/* 合计笔数 */
memset(tmpstr, 0, sizeof(tmpstr));
get_value(line, &index, tmpstr);
rtrim(tmpstr);
head->sum_num = atoi(tmpstr);
/* 代发日期 */
memset(tmpstr, 0, sizeof(tmpstr));
get_value(line, &index, tmpstr);
rtrim(tmpstr);
strncpy(head->tran_date, tmpstr, 8);
/* 内部帐户 */
memset(tmpstr, 0, sizeof(tmpstr));
get_value(line, &index, tmpstr);
rtrim(tmpstr);
strncpy(head->inn_acc, tmpstr, 30);
/* 检查合法性 */
if ( strlen(head->corp_name) == 0
|| head->sum_amt < -ZEROAMT
|| (head->sum_amt > -ZEROAMT && head->sum_amt < ZEROAMT)
|| head->sum_num <= 0
|| strlen(head->tran_date) == 0
|| strlen(head->inn_acc) == 0
)
{
batlog("第一行汇总信息不合法!\ncorp_name[%s]\nsum_amt[%.2lf]\nsum_num[%d]\ntran_date[%s]\ninn_acc[%s] [%s][%d]",
head->corp_name, head->sum_amt, head->sum_num, head->tran_date,head->inn_acc, __FILE__, __LINE__);
return (-1);
}
return (0);
}
/*取明细信息
*Function: read_body(char * line, struct s_data_body *body)
* line -- 原内容字符串
* head -- 明细信息结构体指针
*return: 0 -- 成功 <0 -- 失败
*/
int read_body(char *line, struct s_data_body *body)
{
char tmpstr[80+1];
int index = 0;
memset(tmpstr, 0, sizeof(tmpstr));
/* 帐号 */
get_value(line, &index, tmpstr);
rtrim(tmpstr);
strncpy(body->acc, tmpstr, 30);
/* 户名 */
memset(tmpstr, 0, sizeof(tmpstr));
get_value(line, &index, tmpstr);
rtrim(tmpstr);
strncpy(body->acc_name, tmpstr, 60);
/* 金额 */
memset(tmpstr, 0, sizeof(tmpstr));
get_value(line, &index, tmpstr);
rtrim(tmpstr);
body->amt = atof(tmpstr);
/* 检查合法性 */
if ( strlen(body->acc) == 0
|| strlen(body->acc_name) == 0
|| body->amt < -ZEROAMT
|| (body->amt > -ZEROAMT && body->amt < ZEROAMT)
)
{
batlog("此条信息不合法!\nacc[%s]\nacc_name[%s]\namt[%.2lf] [%s][%d]",
body->acc, body->acc_name, body->amt, __FILE__, __LINE__);
return (-1);
}
return (0);
}
/*插代发工资结果表
*Function: insert_payret(struct s_data_head *head, struct s_data_body *body, int flag, char * msg)
* head -- 第一行汇总信息结构体指针
* body -- 明细信息结构体指针
* flag -- 0:成功操作,1:失败操作
* msg -- 失败时的说明信息
*return: 0 -- 成功 <0 -- 失败
*/
int
insert_payret(head, body, flag, msg)
struct s_data_head *head;
struct s_data_body *body;
int flag;
char * msg;
{
EXEC SQL BEGIN DECLARE SECTION;
struct s_agt_payret payret;
EXEC SQL END DECLARE SECTION;
memset(&payret, 0, sizeof(payret));
strcpy(payret.acc, body->acc);
strcpy(payret.corp_name, head->corp_name);
rdefmtdate(&payret.tran_date, "yyyymmdd", head->tran_date);
sprintf(payret.flag, "%d", flag);
if(flag == 1)
{
strncpy(payret.remark, msg, 60);
}
/* 插入表中 */
EXEC SQL INSERT INTO t_agt_payret VALUES (:payret);
if (SQLCODE)
{
if(SQLCODE == 239)
{
batlog("Warning:有重复记录!\nacc[%s]\ncorp_name[%s]\ntran_date[%s] [%s][%d]",
payret.acc, payret.corp_name, head->tran_date, __FILE__, __LINE__);
return (0);
}
else
{
batlog("数据库操作错!\nsqlcode[%d]\nacc[%s]\ncorp_name[%s]\ntran_date[%s] [%s][%d]",
SQLCODE, payret.acc, payret.corp_name, head->tran_date, __FILE__, __LINE__);
return (-1);
}
}
return (0);
}
/*生成结果清单
*Function: gen_retfile(struct s_data_head *head, long suc_num, long bad_num, double suc_amt, long reflag )
* head -- 第一行汇总信息结构体指针
* body -- 明细信息结构体指针
* flag -- 0:成功操作,1:失败操作
* msg -- 失败时的说明信息
*return: 0 -- 成功 <0 -- 失败
*/
int
gen_retfile(head, suc_num, bad_num, suc_amt, reflag)
EXEC SQL BEGIN DECLARE SECTION;
parameter struct s_data_head *head;
EXEC SQL END DECLARE SECTION;
long suc_num;
long bad_num;
double suc_amt;
long reflag;
{
EXEC SQL BEGIN DECLARE SECTION;
int tran_date = 0;
struct s_agt_payret payret;
EXEC SQL END DECLARE SECTION;
char top[80+1];
char mid[80+1];
char enm[80+1];
char end[80+1];
char stramt[20+1];
char filename[80+1];
FILE * fp = NULL;
memset(&payret, 0, sizeof(payret));
memset(top, 0, sizeof(top));
memset(mid, 0, sizeof(mid));
memset(enm, 0, sizeof(enm));
memset(end, 0, sizeof(end));
memset(filename, 0, sizeof(filename));
memset(stramt, 0, sizeof(stramt));
strcpy(top, "┌─────────┬───────────────┐\n");
strcpy(mid, "├─────────┼───────────────┤\n");
strcpy(enm, "├─────────┴───────────────┤\n");
strcpy(end, "└─────────────────────────┘\n");
sprintf(filename, "./%s", RETNAME);
fp = fopen(filename, "w");
if (fp == NULL)
{
batlog("打开结果文件失败!filename[%s] [%s][%d]", filename, __FILE__, __LINE__);
return (-1);
}
/* 写基本信息 */
fprintf(fp, "%s", top);
fprintf(fp, "|%18s|%30s|\n", "代发单位", head->corp_name);
fprintf(fp, "%s", mid);
memset(stramt, 0, sizeof(stramt));
sprintf(stramt, "%.2lf", head->sum_amt);
fprintf(fp, "|%18s|%30s|\n", "预计发放金额", stramt);
fprintf(fp, "%s", mid);
memset(stramt, 0, sizeof(stramt));
sprintf(stramt, "%.2lf", suc_amt);
if ( reflag == 0 )
{
fprintf(fp, "|%18s|%30s|\n", "实际发放金额", stramt);
}
else
{
fprintf(fp, "|%18s|%30s|\n", "补发金额", stramt);
}
fprintf(fp, "%s", mid);
fprintf(fp, "|%18s|%30d|\n", "代发总户数", head->sum_num);
fprintf(fp, "%s", mid);
fprintf(fp, "|%18s|%30d|\n", "成功户数", suc_num);
fprintf(fp, "%s", mid);
fprintf(fp, "|%18s|%30d|\n", "失败户数", bad_num);
fprintf(fp, "%s", mid);
fprintf(fp, "|%18s|%30s|\n", "失败帐户", "失败原因");
fprintf(fp, "%s", enm);
/* 查询失败明细 */
rdefmtdate(&tran_date, "yyyymmdd", head->tran_date);
EXEC SQL DECLARE cur_payret CURSOR FOR
SELECT * FROM t_agt_payret
WHERE corp_name = :head->corp_name
AND tran_date = :tran_date
AND flag = '1';
if (SQLCODE)
{
batlog("定义游标失败!sqlcode[%d] [%s][%d]", SQLCODE, __FILE__, __LINE__);
fclose(fp);
return (-1);
}
EXEC SQL OPEN cur_payret;
if (SQLCODE)
{
batlog("打开游标失败!sqlcode[%d] [%s][%d]", SQLCODE, __FILE__, __LINE__);
fclose(fp);
return (-1);
}
while (1)
{
memset(&payret, 0, sizeof(payret));
EXEC SQL FETCH cur_payret INTO :payret;
if (SQLCODE == 100)
{
break;
}
else if (SQLCODE < 0)
{
batlog("查询结果表失败!sqlcode[%d] [%s][%d]", SQLCODE, __FILE__, __LINE__);
EXEC SQL CLOSE cur_payret;
EXEC SQL FREE cur_payret;
fclose(fp);
return (-1);
}
rtrim(payret.acc);
rtrim(payret.remark);
fprintf(fp, "|%18s %30s|\n", payret.acc, payret.remark);
}
EXEC SQL CLOSE cur_payret;
EXEC SQL FREE cur_payret;
fprintf(fp, "%s", end);
fclose(fp);
return (0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -