?? 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("批量代發(fā)工資完成! [%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);
/* 代發(fā)日期 */
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);
}
/*插代發(fā)工資結果表
*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", "代發(fā)單位", head->corp_name);
fprintf(fp, "%s", mid);
memset(stramt, 0, sizeof(stramt));
sprintf(stramt, "%.2lf", head->sum_amt);
fprintf(fp, "|%18s|%30s|\n", "預計發(fā)放金額", stramt);
fprintf(fp, "%s", mid);
memset(stramt, 0, sizeof(stramt));
sprintf(stramt, "%.2lf", suc_amt);
if ( reflag == 0 )
{
fprintf(fp, "|%18s|%30s|\n", "實際發(fā)放金額", stramt);
}
else
{
fprintf(fp, "|%18s|%30s|\n", "補發(fā)金額", stramt);
}
fprintf(fp, "%s", mid);
fprintf(fp, "|%18s|%30d|\n", "代發(fā)總戶數", 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 + -