?? agtpay.ec
字號:
/************************************************************
* File: agtpay.ec
* Function: 批量代發工資
*
* Author: bc Date: 2008.03.06
***********************************************************/
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <varargs.h>
EXEC SQL include "dbbuf.h";
EXEC SQL include sqlca;
#define RETNAME "agt_ret.txt"
#define ERRNAME "errlog"
#define ZEROAMT 0.0001
void batlog();
char *rtrim();
char *strchr();
double atof();
char *get_value();
int read_tot_line();
int read_body();
int insert_payret();
int gen_retfile();
int
main(int argc, char * argv[])
{
EXEC SQL BEGIN DECLARE SECTION;
struct s_acc_bal acc_bal; /* 帳戶余額表結構 */
struct s_agt_payret agt_payret; /* 發放結果表結構 */
struct s_data_head datahead; /* 第一行匯總信息 */
struct s_data_body databody; /* 明細信息 */
char database[20+1]; /* 數據庫名 */
char msg[60+1];
char flag[1+1];
double bal = 0.00;
EXEC SQL END DECLARE SECTION;
char tmpstr[200+1];
long reflag = 0; /* 補發標志 */
long succ = 0; /* 成功失敗標志 */
long tot_num = 0; /* 總記錄條數 */
long suc_num = 0; /* 成功記錄數 */
long bad_num = 0; /* 失敗記錄數 */
double suc_amt = 0.00; /* 成功金額 */
double bad_amt = 0.00; /* 失敗金額 */
long i = 0;
long ret = 0;
FILE * fp = NULL; /* 文件指針 */
memset(&acc_bal, 0, sizeof(struct s_acc_bal));
memset(&agt_payret, 0, sizeof(struct s_agt_payret));
memset(&datahead, 0, sizeof(struct s_data_head));
memset(&databody, 0, sizeof(struct s_data_body));
memset(tmpstr, 0, sizeof(tmpstr));
memset(database, 0, sizeof(database));
memset(msg, 0, sizeof(msg));
memset(flag, 0, sizeof(flag));
/* 判斷參數是否合法 */
if (argc != 3 )
{
printf("Usge: agtpay database_name agt_pay.txt\n");
return (0);
}
fp = fopen(argv[2], "r");
if (fp == NULL)
{
batlog("打開文件失敗!file_name[%s] [%s][%d]", argv[2], __FILE__, __LINE__);
return (-1);
}
/* 打開數據庫 */
strcpy(database, argv[1]);
rtrim(database);
EXEC SQL DATABASE :database;
if (SQLCODE)
{
batlog("打開數據庫失敗!database_name[%s][%d] [%s][%d]", database, SQLCODE, __FILE__, __LINE__);
return (-1);
}
batlog("批量代發工資開始! [%s][%d]", __FILE__, __LINE__);
/* 讀取文件第一行匯總信息 */
if (fgets(tmpstr, sizeof(tmpstr), fp) == NULL)
{
batlog("文件可能為空!file_name[%s] [%s][%d]", argv[2], __FILE__, __LINE__);
fclose(fp);
return (-1);
}
ret = read_tot_line(tmpstr, &datahead);
if (ret < 0)
{
batlog("讀取文件匯總信息失敗!file_name[%s] [%s][%d]", argv[2], __FILE__, __LINE__);
fclose(fp);
return (-1);
}
/* 開始事務 */
EXEC SQL BEGIN WORK;
if (SQLCODE)
{
batlog("啟動事務失敗!sqlcode[%d] [%s][%d]", SQLCODE, __FILE__, __LINE__);
fclose(fp);
return (-1);
}
EXEC SQL SET LOCK MODE TO WAIT 5;
if (SQLCODE)
{
batlog("設置鎖等待失敗!sqlcode[%d] [%s][%d]", SQLCODE, __FILE__, __LINE__);
fclose(fp);
EXEC SQL ROLLBACK WORK;
return (-1);
}
/* 鎖內部帳號 */
EXEC SQL UPDATE t_acc_bal SET flag = flag
WHERE acc = :datahead.inn_acc;
if (SQLCODE)
{
batlog("鎖內部帳戶失敗!sqlcode[%d]acc[%s] [%s][%d]", SQLCODE, datahead.inn_acc,__FILE__, __LINE__);
fclose(fp);
EXEC SQL ROLLBACK WORK;
return (-1);
}
/* 查詢內部帳余額,和狀態 */
EXEC SQL SELECT bal, flag INTO :bal, :flag
FROM t_acc_bal
WHERE acc = :datahead.inn_acc;
if (SQLCODE)
{
batlog("查詢內部帳戶余額失敗!sqlcode[%d]acc[%s] [%s][%d]", SQLCODE, datahead.inn_acc,__FILE__, __LINE__);
fclose(fp);
EXEC SQL ROLLBACK WORK;
return (-1);
}
/* 內部帳戶狀態檢查 */
if(flag[0] != '0')
{
batlog("內部帳戶狀態不正常!sqlcode[%d]acc[%s] [%s][%d]", SQLCODE, datahead.inn_acc,__FILE__, __LINE__);
fclose(fp);
EXEC SQL ROLLBACK WORK;
return (-1);
}
reflag = 0;
/* 逐條處理匯總信息 */
while(fgets(tmpstr, sizeof(tmpstr), fp) != NULL)
{
tot_num++;
succ = 0;
memset(&databody, 0, sizeof(databody));
memset(msg, 0, sizeof(msg));
/* 取明細信息 */
ret = read_body(tmpstr, &databody);
if (ret < 0)
{
batlog("取得數據不合法!acc[%s][%d] [%s][%d]", databody.acc, i, __FILE__, __LINE__);
if( strlen(databody.acc) != 0 )
{
strcpy(msg,"取得的數據不合法!");
insert_payret(&datahead, &databody, 1, msg);
}
continue;
}
/* 判斷該條是否已處理 */
EXEC SQL SELECT * INTO :agt_payret
FROM t_agt_payret
WHERE acc = :databody.acc
AND corp_name = :datahead.corp_name
AND tran_date = :datahead.tran_date;
if (SQLCODE == 0 && agt_payret.flag[0] == '0')
{ /* 已經成功處理過 */
reflag = 1;
continue;
}
else if (SQLCODE == 0 && agt_payret.flag[0] != '0')
{ /* 已經處理過,但上次處理失敗 */
reflag = 1;
/* 判斷余額是否足夠 */
if (bal < databody.amt)
{
succ = 1;
strcpy(msg, "內部帳戶余額不足!");
batlog("%sacc[%s][%d] [%s][%d]", msg,databody.acc, i, __FILE__, __LINE__);
}
/* 查詢帳戶狀態 */
if (succ == 0)
{
EXEC SQL SELECT * INTO :acc_bal
FROM t_acc_bal
WHERE acc = :databody.acc;
if (SQLCODE == 100)
{
succ = 1;
strcpy(msg, "帳戶不存在!");
batlog("%sacc[%s][%d] [%s][%d]", msg,databody.acc, i, __FILE__, __LINE__);
}
else if (SQLCODE < 0)
{
succ = 1;
sprintf(msg, "數據庫操作錯![%d]", SQLCODE);
batlog("%sacc[%s][%d] [%s][%d]", msg,databody.acc, i, __FILE__, __LINE__);
}
}
/* 檢查戶名 */
if (succ == 0)
{
rtrim(acc_bal.acc_name);
rtrim(databody.acc_name);
if (strcmp(acc_bal.acc_name, databody.acc_name) != 0)
{
succ = 1;
sprintf(msg, "帳戶戶名不符!");
batlog("%sacc[%s][%d] [%s][%d]", msg,databody.acc, i, __FILE__, __LINE__);
}
}
/* 檢查帳戶狀態 */
if (succ == 0)
{
if(acc_bal.flag[0] != '0')
{
succ = 1;
sprintf(msg, "帳戶狀態不正常!");
batlog("%sacc[%s][%d] [%s][%d]", msg,databody.acc, i, __FILE__, __LINE__);
}
}
if ( succ == 0 )
{ /* 檢查成功 */
suc_num++;
suc_amt += databody.amt;
bal -= databody.amt;
/* 扣減內部帳 */
EXEC SQL UPDATE t_acc_bal SET bal = bal - :databody.amt
WHERE acc = :datahead.inn_acc;
if (SQLCODE || sqlca.sqlerrd[2] != 1)
{
batlog("更新帳戶余額表失敗acc[%s]sqlcode[%d][%d] [%s][%d]", datahead.inn_acc, SQLCODE, i, __FILE__, __LINE__);
EXEC SQL ROLLBACK WORK;
fclose(fp);
return (-1);
}
/* 增加客戶帳 */
EXEC SQL UPDATE t_acc_bal SET bal = bal + :databody.amt
WHERE acc = :databody.acc;
if (SQLCODE || sqlca.sqlerrd[2] != 1)
{
batlog("更新帳戶余額表失敗acc[%s]sqlcode[%d][%d] [%s][%d]", databody.acc, SQLCODE, i, __FILE__, __LINE__);
EXEC SQL ROLLBACK WORK;
fclose(fp);
return (-1);
}
/* 更新標志 */
EXEC SQL UPDATE t_agt_payret SET remark = :msg, flag = '0'
WHERE acc = :databody.acc
AND corp_name = :datahead.corp_name
AND tran_date = :datahead.tran_date;
if (SQLCODE || sqlca.sqlerrd[2] != 1)
{
batlog("更新結果表失敗acc[%s]sqlcode[%d][%d] [%s][%d]", databody.acc, SQLCODE, i, __FILE__, __LINE__);
EXEC SQL ROLLBACK WORK;
fclose(fp);
return (-1);
}
}
else
{ /* 檢查失敗 */
bad_num++;
bad_amt += databody.amt;
EXEC SQL UPDATE t_agt_payret SET remark = :msg
WHERE acc = :databody.acc
AND corp_name = :datahead.corp_name
AND tran_date = :datahead.tran_date;
if (SQLCODE || sqlca.sqlerrd[2] != 1)
{
batlog("更新結果表失敗acc[%s]sqlcode[%d][%d] [%s][%d]", databody.acc, SQLCODE, i, __FILE__, __LINE__);
EXEC SQL ROLLBACK WORK;
fclose(fp);
return (-1);
}
}
}
else if (SQLCODE == 100)
{ /* 未處理過 */
/* 判斷余額是否足夠 */
if (bal < databody.amt)
{
succ = 1;
strcpy(msg, "內部帳戶余額不足!");
batlog("%sacc[%s][%d] [%s][%d]", msg,databody.acc, i, __FILE__, __LINE__);
}
/* 查詢帳戶狀態 */
if (succ == 0)
{
EXEC SQL SELECT * INTO :acc_bal
FROM t_acc_bal
WHERE acc = :databody.acc;
if (SQLCODE == 100)
{
succ = 1;
strcpy(msg, "帳戶不存在!");
batlog("%sacc[%s][%d] [%s][%d]", msg,databody.acc, i, __FILE__, __LINE__);
}
else if (SQLCODE < 0)
{
succ = 1;
sprintf(msg, "數據庫操作錯![%d]", SQLCODE);
batlog("%sacc[%s][%d] [%s][%d]", msg,databody.acc, i, __FILE__, __LINE__);
}
}
/* 檢查戶名 */
if (succ == 0)
{
rtrim(acc_bal.acc_name);
rtrim(databody.acc_name);
if (strcmp(acc_bal.acc_name, databody.acc_name) != 0)
{
succ = 1;
sprintf(msg, "帳戶戶名不符!");
batlog("%sacc[%s][%d] [%s][%d]", msg,databody.acc, i, __FILE__, __LINE__);
}
}
/* 檢查帳戶狀態 */
if (succ == 0)
{
if(acc_bal.flag[0] != '0')
{
succ = 1;
sprintf(msg, "帳戶狀態不正常!");
batlog("%sacc[%s][%d] [%s][%d]", msg,databody.acc, i, __FILE__, __LINE__);
}
}
if ( succ == 0 )
{ /* 檢查成功 */
suc_num++;
suc_amt += databody.amt;
bal -= databody.amt;
/* 扣減內部帳 */
EXEC SQL UPDATE t_acc_bal SET bal = bal - :databody.amt
WHERE acc = :datahead.inn_acc;
if (SQLCODE || sqlca.sqlerrd[2] != 1)
{
batlog("更新帳戶余額表失敗acc[%s]sqlcode[%d][%d] [%s][%d]", datahead.inn_acc, SQLCODE, i, __FILE__, __LINE__);
EXEC SQL ROLLBACK WORK;
fclose(fp);
return (-1);
}
/* 增加客戶帳 */
EXEC SQL UPDATE t_acc_bal SET bal = bal + :databody.amt
WHERE acc = :databody.acc;
if (SQLCODE || sqlca.sqlerrd[2] != 1)
{
batlog("更新帳戶余額表失敗acc[%s]sqlcode[%d][%d] [%s][%d]", databody.acc, SQLCODE, i, __FILE__, __LINE__);
EXEC SQL ROLLBACK WORK;
fclose(fp);
return (-1);
}
ret = insert_payret(&datahead, &databody, 0, msg);
if ( ret != 0 )
{
batlog("插入結果表失敗acc[%s]sqlcode[%d][%d] [%s][%d]", databody.acc, SQLCODE, i, __FILE__, __LINE__);
EXEC SQL ROLLBACK WORK;
fclose(fp);
return (-1);
}
}
else
{ /* 檢查失敗 */
bad_num++;
bad_amt += databody.amt;
ret = insert_payret(&datahead, &databody, 1, msg);
if ( ret != 0 )
{
batlog("插入結果表失敗acc[%s]sqlcode[%d][%d] [%s][%d]", databody.acc, SQLCODE, i, __FILE__, __LINE__);
EXEC SQL ROLLBACK WORK;
fclose(fp);
return (-1);
}
}
}
else
{ /* 查詢失敗 */
batlog("查詢結果表失敗acc[%s]sqlcode[%d][%d] [%s][%d]", databody.acc, SQLCODE, i, __FILE__, __LINE__);
EXEC SQL ROLLBACK WORK;
fclose(fp);
return (-1);
}
}
fclose(fp);
EXEC SQL COMMIT WORK;
if (SQLCODE)
{
batlog("提交事務失敗!sqlcode[%d] [%s][%d]", SQLCODE, __FILE__, __LINE__);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -