This man is too old to remember everything in his brain. Right now, he needs a place to write down what he has studied.
標籤
4GL
(1)
人才發展
(10)
人物
(3)
太陽能
(4)
心理
(3)
心靈
(10)
文學
(31)
生活常識
(14)
光學
(1)
名句
(10)
即時通訊軟體
(2)
奇狐
(2)
爬蟲
(1)
音樂
(2)
產業
(5)
郭語錄
(3)
無聊
(3)
統計
(4)
新聞
(1)
經濟學
(1)
經營管理
(42)
解析度
(1)
遊戲
(5)
電學
(1)
網管
(10)
廣告
(1)
數學
(1)
機率
(1)
雜趣
(1)
證券
(4)
證券期貨
(1)
ABAP
(15)
AD
(1)
agentflow
(4)
AJAX
(1)
Android
(1)
AnyChart
(1)
Apache
(14)
BASIS
(4)
BDL
(1)
C#
(1)
Church
(1)
CIE
(1)
CO
(38)
Converter
(1)
cron
(1)
CSS
(23)
DMS
(1)
DVD
(1)
Eclipse
(1)
English
(1)
excel
(5)
Exchange
(4)
Failover
(1)
Fedora
(1)
FI
(57)
File Transfer
(1)
Firefox
(3)
FM
(2)
fourjs
(1)
Genero
(1)
gladiatus
(1)
google
(1)
Google Maps API
(2)
grep
(1)
Grub
(1)
HR
(2)
html
(23)
HTS
(8)
IE
(1)
IE 8
(1)
IIS
(1)
IMAP
(3)
Internet Explorer
(1)
java
(4)
JavaScript
(22)
jQuery
(6)
JSON
(1)
K3b
(1)
ldd
(1)
LED
(3)
Linux
(117)
Linux Mint
(4)
Load Balance
(1)
Microsoft
(2)
MIS
(2)
MM
(51)
MSSQL
(1)
MySQL
(27)
Network
(1)
NFS
(1)
Office
(1)
OpenSSL
(1)
Oracle
(126)
Outlook
(3)
PDF
(6)
Perl
(60)
PHP
(33)
PL/SQL
(1)
PL/SQL Developer
(1)
PM
(3)
Postfix
(2)
postfwd
(1)
PostgreSQL
(1)
PP
(50)
python
(5)
QM
(1)
Red Hat
(4)
Reporting Service
(28)
ruby
(11)
SAP
(234)
scp
(1)
SD
(16)
sed
(1)
Selenium
(3)
Selenium-WebDriver
(5)
shell
(5)
SQL
(4)
SQL server
(8)
sqlplus
(1)
SQuirreL SQL Client
(1)
SSH
(2)
SWOT
(3)
Symantec
(2)
T-SQL
(7)
Tera Term
(2)
tip
(1)
tiptop
(24)
Tomcat
(6)
Trouble Shooting
(1)
Tuning
(5)
Ubuntu
(37)
ufw
(1)
utf-8
(1)
VIM
(11)
Virtual Machine
(2)
VirtualBox
(1)
vnc
(3)
Web Service
(2)
wget
(1)
Windows
(19)
Windows
(1)
WM
(6)
Xvfb
(2)
youtube
(1)
yum
(2)
2015年6月29日 星期一
javascript 如何 新增/刪除 html select oprions
function cat02_func(o1) {
var o2 = document.getElementById("中分類");
for (i=o2.options.length-1;i>=0;i--) {
o2.remove(i); //要把每一個option刪除
}
var new_option = new Option("",""); //先加空值
o2.options.add(new_option);
for (i = 0; i < cat02_ary.length; i++) {
if (cat02_ary[i].indexOf(o1.value) >= 0) {
var idx = cat02_ary[i].indexOf(",");
var str = cat02_ary[i].slice(idx+1);
var new_option = new Option(str,str);
o2.options.add(new_option); //用這兩行增加option
}
}
}
2015年6月17日 星期三
TNS-12555: TNS:permission denied
System parameter file is /u2/oracle/10g/network/admin/listener.ora
Log messages written to /u2/oracle/10g/network/log/listener.log
Trace information written to /u2/oracle/10g/network/trace/listener.trc
Trace level is currently 0
Started with pid=23250
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=tiptop)(PORT=1521)))
Error listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0)))
TNS-12555: TNS:permission denied
TNS-12560: TNS:protocol adapter error
TNS-00525: Insufficient privilege for operation
Linux Error: 1: Operation not permitted
No longer listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=tiptop)(PORT=1521)))
通过日志错误信息可知,应该跟权限有关,最后发现了一个隐藏的信息,
/var/tmp/.oracle这个目录比较特殊,如果oracle没有对此目录的操作权限的话,oracle用户就无法进入/var/tmp/.oracle文件夹.
方法很简单,以下兩者皆可(建議2)
1.chmod 777 /var/tmp/.oracle 之后就ok了.
2.su 成 root,(或sudo) ,然後 chown -R oracle:oinstall /var/tmp.oracle
Log messages written to /u2/oracle/10g/network/log/listener.log
Trace information written to /u2/oracle/10g/network/trace/listener.trc
Trace level is currently 0
Started with pid=23250
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=tiptop)(PORT=1521)))
Error listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0)))
TNS-12555: TNS:permission denied
TNS-12560: TNS:protocol adapter error
TNS-00525: Insufficient privilege for operation
Linux Error: 1: Operation not permitted
No longer listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=tiptop)(PORT=1521)))
通过日志错误信息可知,应该跟权限有关,最后发现了一个隐藏的信息,
/var/tmp/.oracle这个目录比较特殊,如果oracle没有对此目录的操作权限的话,oracle用户就无法进入/var/tmp/.oracle文件夹.
方法很简单,以下兩者皆可(建議2)
1.chmod 777 /var/tmp/.oracle 之后就ok了.
2.su 成 root,(或sudo) ,然後 chown -R oracle:oinstall /var/tmp.oracle
2015年6月15日 星期一
TIPTOP ERP 常用业务计算逻辑总结
http://blog.csdn.net/yihuiworld/article/details/44946041
TIPTOP ERP 常用业务计算逻辑总结
一、制造
1、订单未交量:(oeb12-oeb24+oeb25-oeb26)*oeb05_fac
(订单量 - 出货量 +销退量(折让且原订单出货)-被结案数量)* 销售/库存单位换算率
条件:oea00<>'0' AND oeb70 = 'N' AND oeaconf = 'Y'
2、请购未转采购量:(pml20-pml21)*pml09
[原料一般请购] (请购量-累计已转采购量)* 请购单位/库存单位的转换率
条件:pml011 !='SUB' AND pmk18 != 'X' AND ( pml16 <='2' OR pml16='S' OR pml16='R' OR pml16='W')
3、一般采购未交量:(pmn20-pmn50+pmn55+pmn58)*pmn09
[原料一般采购] (采购量-已交量+验退量+仓退[折让且原采购单换货])* 采购单位/料件库存单位的转换率
条件:pmn011 !='SUB' AND pmm18 != 'X' AND ( pmn16 <='2' OR pmn16='S' OR pmn16='R' OR pmn16='W')
4、采购结案时才计算的超/短交交量:pmn57=(pmn50-pmn20-pmn55)*pmn09
[>0则为超交;<0则为短交] (已交量-采购量-验退量)* 采购单位/料件库存单位的转换率
条件:采购单已结案
5、一般工单在制量:(sfb08-sfb09-sfb10-sfb11-sfb12)*ima55_fac
(生产数量-完工数量-再加工数量-FQC在验量-报废数量)* 生产单位/库存单位换算率
条件:sfb04 <'8' AND sfb87!='X' AND ( sfb02 !='7' AND sfb02 !='8' AND sfb02 !='11' AND sfb02 != '15' )
6、委外在制量=委外工单在制量+委外IQC在验量
委外工单在制量:(sfb08-sfb09-sfb10-sfb11-sfb12)*ima55_fac
(生产数量-完工数量-再加工数量-FQC在验量-报废数量)* 生产单位/库存单位换算率
条件:sfb04 <'8' AND sfb87!='X' AND ( sfb02='7' OR sfb02='8')
委外IQC在验量:(rvb07-rvb29-rvb30)*pmn09
(实收数量-验退量-入库量)* 生产单位/库存单位换算率
条件:rvb04 = pmn01 AND rvb03 = pmn02 AND rvaconf='Y' AND rva10 ='SUB' AND pmn43 = 0
7、工单备料欠料量:(sfa05-sfa06-sfa065+sfa063-sfa062)*sfa13
(应发数量-已发数量-委外代买量+下阶报废-超领)* 发料单位/库存单位换算率
条件:sfb04 !='8' AND sfb87!='X' AND sfb02 != '15'
注意:因为GP5.20以上版本欠料时也可以先不补欠料就超领,会造成上述计算式可能为负数
则计算出的备料欠料量应修正为0
8、工单已发欠料量:CALL s_shortqty(p_sfa01,p_sfa03,p_sfa08,p_sfa12,p_sfa27,p_sfa012,p_sfa013)
RETURNING g_short_qty(即返回已发欠料量),再*sfa13
条件:sfb04 !='8' AND sfb87!='X' AND sfb02 != '15'
9、最小发料套数: CALL s_minp(p_wono,p_check,p_percent,p_opseq,p_prcocess,p_sequence)
RETURNING l_stat,l_minp (l_stat结果码:0.OK、1.Fail;l_minp:最小发料套数值)
条件:sfb04 !='8' AND sfb87!='X' AND sfb02 != '15'
说明:FQC量指的是"有FQC单但是该FQC还没有完工入库的量
(即FQC单没有在完工入库单sfv17里面)"
11、IQC在验量=已收货待IQC验+IQC已验待入库/验退
IQC在验量:(rvb07-rvb29-rvb30)*pmn09
(实收数量-验退量-入库量)* 生产单位/库存单位换算率
条件:rvb04 = pmn01 AND rvb03 = pmn02 AND rvaconf='Y' AND rva10 !='SUB'
已收货待IQC验:上述IQC在验量增加条件:
AND (rvb39='Y' AND
(SELECT COUNT(*) FROM qcs_file WHERE qcs01=rvb01 AND qcs02=rvb02 AND qcs14='Y' AND qcs00<'5')=0)
IQC已验待入库/验退:上述IQC在验量增加条件:
AND (rvb39='N' OR
(rvb39='Y' AND (SELECT COUNT(*) FROM qcs_file WHERE qcs01=rvb01 AND qcs02=rvb02 AND qcs14='Y' AND qcs00<'5')>=1)
)
12、FQC在验量:sfb11*ima55_fac
工单FQC量* 生产单位/库存单位换算率
条件:sfb02 <> '7' AND sfb87!='X' AND sfb02 <> '8' AND sfb02 <> '11' AND sfb04 <'7'
13、预计可用量=可用库存量 - 订单受订量 - 工单备料量 + 请购未转采购量 + 采购未交量 + IQC在验量 + 工单在制量 + 委外在制量 +FQC在验量
二、财务
1、应付期末余额(贷方)=历史累计和(贷-借)+本期贷方发生额-本期借方发生额
历史累计和(贷-借):SUM(apm07f-apm06f) WHERE apm04=年 AND apm05<月 GROUP BY 科目,客户...
本期贷方发生额: SUM(apm07f) WHERE apm04=年 AND apm05=月 GROUP BY 科目,客户...
本期借方发生额: SUM(apm06f) WHERE apm04=年 AND apm05=月 GROUP BY 科目,客户...
2、应收期末余额(借方)=历史累计和(借-贷)+本期借方发生额-本期贷方发生额
历史累计和(借-贷):SUM(ooo08d-ooo08c) WHERE ooo06=年 AND ooo07<月 GROUP BY 科目,客户...
本期借方发生额: SUM(ooo08d) WHERE ooo06=年 AND ooo07=月 GROUP BY 科目,客户...
本期贷方发生额: SUM(ooo08c) WHERE ooo06=年 AND ooo07=月 GROUP BY 科目,客户...
3、入库/退货未匹配量=rvv87-rvv23 暂估数量=rvv88
(计价数量-已请款匹配量)
条件:rvv03!='2' AND rvv89!='Y' AND ((B.rvv87 > B.rvv23+B.rvv88) OR (A.rvu00='3' AND B.rvv87=0))
计价数量-已请款匹配量-暂估数量>0 且含 仓退折让(需判断是否有做待抵)
4、原币未付=apc08-apc10-apc14-apc16
(原币合计-原币已付金额-原币直接冲帐金额-原币留置金额)
条件:apa42 = 'N' AND apa34f > (apa35f+apa20)
本币未付=apc09-apc11-apc15-apc16*apa14 (g_apz.apz27 = 'N'时)
(本币合计-本币已付金额-本币直接冲帐金额-原币留置金额*立账汇率)
条件:apa42 = 'N' AND apa34f > (apa35f+apa20)
本币未付=apc13-apc16*apa72 (g_apz.apz27 = 'Y'时)
(本币未冲金额-原币留置金额*重估汇率)
条件:apa42 = 'N' AND apa34f > (apa35f+apa20)
TIPTOP ERP 常用业务计算逻辑总结
一、制造
1、订单未交量:(oeb12-oeb24+oeb25-oeb26)*oeb05_fac
(订单量 - 出货量 +销退量(折让且原订单出货)-被结案数量)* 销售/库存单位换算率
条件:oea00<>'0' AND oeb70 = 'N' AND oeaconf = 'Y'
2、请购未转采购量:(pml20-pml21)*pml09
[原料一般请购] (请购量-累计已转采购量)* 请购单位/库存单位的转换率
条件:pml011 !='SUB' AND pmk18 != 'X' AND ( pml16 <='2' OR pml16='S' OR pml16='R' OR pml16='W')
3、一般采购未交量:(pmn20-pmn50+pmn55+pmn58)*pmn09
[原料一般采购] (采购量-已交量+验退量+仓退[折让且原采购单换货])* 采购单位/料件库存单位的转换率
条件:pmn011 !='SUB' AND pmm18 != 'X' AND ( pmn16 <='2' OR pmn16='S' OR pmn16='R' OR pmn16='W')
4、采购结案时才计算的超/短交交量:pmn57=(pmn50-pmn20-pmn55)*pmn09
[>0则为超交;<0则为短交] (已交量-采购量-验退量)* 采购单位/料件库存单位的转换率
条件:采购单已结案
5、一般工单在制量:(sfb08-sfb09-sfb10-sfb11-sfb12)*ima55_fac
(生产数量-完工数量-再加工数量-FQC在验量-报废数量)* 生产单位/库存单位换算率
条件:sfb04 <'8' AND sfb87!='X' AND ( sfb02 !='7' AND sfb02 !='8' AND sfb02 !='11' AND sfb02 != '15' )
6、委外在制量=委外工单在制量+委外IQC在验量
委外工单在制量:(sfb08-sfb09-sfb10-sfb11-sfb12)*ima55_fac
(生产数量-完工数量-再加工数量-FQC在验量-报废数量)* 生产单位/库存单位换算率
条件:sfb04 <'8' AND sfb87!='X' AND ( sfb02='7' OR sfb02='8')
委外IQC在验量:(rvb07-rvb29-rvb30)*pmn09
(实收数量-验退量-入库量)* 生产单位/库存单位换算率
条件:rvb04 = pmn01 AND rvb03 = pmn02 AND rvaconf='Y' AND rva10 ='SUB' AND pmn43 = 0
7、工单备料欠料量:(sfa05-sfa06-sfa065+sfa063-sfa062)*sfa13
(应发数量-已发数量-委外代买量+下阶报废-超领)* 发料单位/库存单位换算率
条件:sfb04 !='8' AND sfb87!='X' AND sfb02 != '15'
注意:因为GP5.20以上版本欠料时也可以先不补欠料就超领,会造成上述计算式可能为负数
则计算出的备料欠料量应修正为0
8、工单已发欠料量:CALL s_shortqty(p_sfa01,p_sfa03,p_sfa08,p_sfa12,p_sfa27,p_sfa012,p_sfa013)
RETURNING g_short_qty(即返回已发欠料量),再*sfa13
条件:sfb04 !='8' AND sfb87!='X' AND sfb02 != '15'
说明:
p_sfa01:工单号码
p_sfa03:料件编号
p_sfa08:作业编号
p_sfa12:发料单位
p_sfa27:被替代料号
p_sfa012:工艺段号 GP 5.20以下版本不需要
p_sfa013:工艺序 GP 5.20以下版本不需要
大致逻辑:工单已发欠料量=已发套数*实际QPA-已发数量 (其中:实际QPA=应发/生产数量)
RETURNING l_stat,l_minp (l_stat结果码:0.OK、1.Fail;l_minp:最小发料套数值)
条件:sfb04 !='8' AND sfb87!='X' AND sfb02 != '15'
说明:
p_wono:工单号码 sfb01
p_check:是否检查最小套数 sma73
p_percent:检查完工误差率 ima153
(CALL s_get_ima153(sr.sfb05) RETURNING l_ima153)
p_opseq:作业编号 一般传空值'',表示不检查作业编号
p_prcocess:一般传空值''
p_sequence:一般传空值''
大致逻辑:最小发料套数 = ((已发-报废+超领)/应发)*生产数量*(1+完工误差率)(1+发料误差率)
10、一般退料可退量:[不考虑发料误差]:sfa06-((sfb09
+ sfb11)* sfa161)-g_sfs05
[asfi528] 已发-((完工数量+FQC量)*实际QPA)-当前退料单其他项次已退量和说明:FQC量指的是"有FQC单但是该FQC还没有完工入库的量
(即FQC单没有在完工入库单sfv17里面)"
11、IQC在验量=已收货待IQC验+IQC已验待入库/验退
IQC在验量:(rvb07-rvb29-rvb30)*pmn09
(实收数量-验退量-入库量)* 生产单位/库存单位换算率
条件:rvb04 = pmn01 AND rvb03 = pmn02 AND rvaconf='Y' AND rva10 !='SUB'
已收货待IQC验:上述IQC在验量增加条件:
AND (rvb39='Y' AND
(SELECT COUNT(*) FROM qcs_file WHERE qcs01=rvb01 AND qcs02=rvb02 AND qcs14='Y' AND qcs00<'5')=0)
IQC已验待入库/验退:上述IQC在验量增加条件:
AND (rvb39='N' OR
(rvb39='Y' AND (SELECT COUNT(*) FROM qcs_file WHERE qcs01=rvb01 AND qcs02=rvb02 AND qcs14='Y' AND qcs00<'5')>=1)
)
12、FQC在验量:sfb11*ima55_fac
工单FQC量* 生产单位/库存单位换算率
条件:sfb02 <> '7' AND sfb87!='X' AND sfb02 <> '8' AND sfb02 <> '11' AND sfb04 <'7'
13、预计可用量=可用库存量 - 订单受订量 - 工单备料量 + 请购未转采购量 + 采购未交量 + IQC在验量 + 工单在制量 + 委外在制量 +FQC在验量
二、财务
1、应付期末余额(贷方)=历史累计和(贷-借)+本期贷方发生额-本期借方发生额
历史累计和(贷-借):SUM(apm07f-apm06f) WHERE apm04=年 AND apm05<月 GROUP BY 科目,客户...
本期贷方发生额: SUM(apm07f) WHERE apm04=年 AND apm05=月 GROUP BY 科目,客户...
本期借方发生额: SUM(apm06f) WHERE apm04=年 AND apm05=月 GROUP BY 科目,客户...
2、应收期末余额(借方)=历史累计和(借-贷)+本期借方发生额-本期贷方发生额
历史累计和(借-贷):SUM(ooo08d-ooo08c) WHERE ooo06=年 AND ooo07<月 GROUP BY 科目,客户...
本期借方发生额: SUM(ooo08d) WHERE ooo06=年 AND ooo07=月 GROUP BY 科目,客户...
本期贷方发生额: SUM(ooo08c) WHERE ooo06=年 AND ooo07=月 GROUP BY 科目,客户...
3、入库/退货未匹配量=rvv87-rvv23 暂估数量=rvv88
(计价数量-已请款匹配量)
条件:rvv03!='2' AND rvv89!='Y' AND ((B.rvv87 > B.rvv23+B.rvv88) OR (A.rvu00='3' AND B.rvv87=0))
计价数量-已请款匹配量-暂估数量>0 且含 仓退折让(需判断是否有做待抵)
4、原币未付=apc08-apc10-apc14-apc16
(原币合计-原币已付金额-原币直接冲帐金额-原币留置金额)
条件:apa42 = 'N' AND apa34f > (apa35f+apa20)
本币未付=apc09-apc11-apc15-apc16*apa14 (g_apz.apz27 = 'N'时)
(本币合计-本币已付金额-本币直接冲帐金额-原币留置金额*立账汇率)
条件:apa42 = 'N' AND apa34f > (apa35f+apa20)
本币未付=apc13-apc16*apa72 (g_apz.apz27 = 'Y'时)
(本币未冲金额-原币留置金额*重估汇率)
条件:apa42 = 'N' AND apa34f > (apa35f+apa20)
Perl 特殊字元和8進位/16進位表示方法
$x = 0377; # 以「0」開頭是 8 進位表示法,因此 0377 代表十進位的 255
$y = 0xfe; # 以「0x」開頭是 16 進位表示法,因此 0xfe 代表十進位的 254
$x / $y 是數字,但是一旦用以下方式,就成為ASCII/UTF-8 的字串:
$x = chr(0xfe);
$y = "\xfe";
以上等價
$x = chr(0xFEFF);
$y = "\x{FEFF}"; #數字太大,要用{}標示
以上等價
這些字串也可以用 pack("ccc",...),見以下範例:
[root@EIP-API-AP erp]# perl
print "0x64\n";
print "\x64\n";
print chr(0x64)."\n";
print pack("C",0x64)."\n";
__END__
0x64
d
d
d
結論:"\x64" 等價 chr(0x64) 等價 pack("C",0x64) 但 不等價 0x64
$y = 0xfe; # 以「0x」開頭是 16 進位表示法,因此 0xfe 代表十進位的 254
$x / $y 是數字,但是一旦用以下方式,就成為ASCII/UTF-8 的字串:
$x = chr(0xfe);
$y = "\xfe";
以上等價
$x = chr(0xFEFF);
$y = "\x{FEFF}"; #數字太大,要用{}標示
以上等價
這些字串也可以用 pack("ccc",...),見以下範例:
[root@EIP-API-AP erp]# perl
print "0x64\n";
print "\x64\n";
print chr(0x64)."\n";
print pack("C",0x64)."\n";
__END__
0x64
d
d
d
結論:"\x64" 等價 chr(0x64) 等價 pack("C",0x64) 但 不等價 0x64
如何讓excel讀取utf-8 編碼的csv檔案時,不會有亂碼?
其實如果以筆記本或類似UltraEdit打開時,不會是亂碼。
原因是excel 預設打開csv檔案,是用 ANSI編碼打開。
解決方式有二:
1. excel打開,menu->資料->從文字檔->選擇要打開的csv,選擇utf-8編碼開啟
2. 當初寫入csv時,開頭寫入utf-8 BOM(byte order mark)編碼如下(第45列)
1 #!/usr/bin/perl
2
3 require "$ENV{HOME}/perl/setEnv.pl";
4
5 use MIME::QuotedPrint;
6 use MIME::Base64;
7 use Mail::Sendmail 0.75; # doesn't work with v. 0.74!
8 use DBI;
9 use utf8;
10 use Encode;
11
12 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time-86400);
13 $year += 1900;
14 $mon += 1;
15 $mon = sprintf("%02d", $mon);
16
17 %mail = (
18 from => 'mis@echochem.com.tw',
19 #to => 'tracy\@echochem.com.tw',
20 to => "tyruan\@echochem.com.tw",
21 subject => '客戶主檔'."$year/$mon"
22 );
23 $mail{smtp} = 'x.x.x.x'; #要改
24
25 $boundary = "====" . time() . "====";
26 $mail{'content-type'} = "multipart/mixed; boundary=\"$boundary\"";
27
28 #$message = encode_qp( "客戶主檔 $year/$mon 資料" );
29 $message = encode_qp( "Customer Master Data $year/$mon " );
30
31 $file = $^X; # This is the perl executable
32
33 my $dbh = DBI->connect( "dbi:Oracle:$yyy", "$zzz", "$www" ) #要改
34 || die( $DBI::errstr . "\n" );
35 $dbh->{AutoCommit} = 0;
36
37 my $sth = $dbh->prepare(qq{
38 select rmnth,occ01,occ02,occ11,occ18,ta_occ09
39 from axm_tbl_occ
40 where rmnth = to_char(trunc(sysdate,'mm')-1,'yyyymm')
41 });
42 $sth->execute();
43 chdir "$ENV{HOME}/perl/erp";
44 open FILE, "> 客戶主檔.csv";
45 print FILE chr(0xFEFF);
#print FILE pack("CCC",0xef,0xbb,0xbf);#也可以,
#print FILE "\x{FEFF}"; #也可以,
見http://stackoverflow.com/questions/7418946/force-utf-8-byte-order-mark-in-perl-file-output
46 print FILE "資料月份,客戶代碼,客戶名稱,統一編號,客戶全名,業務區域\n";
47 while(my @data = $sth->fetchrow_array()) {
48 $data[2] =~ s/,//g;
49 $data[4] =~ s/,//g;
50 print FILE "$data[0],$data[1],$data[2],$data[3],$data[4],$data[5]\n";
51 }
52 close FILE;
53 $sth->finish();
54 $dbh->disconnect();
55
56 open (F, "< 客戶主檔.csv") or die "Cannot read $file: $!";
57 binmode F; undef $/;
58 my $body;
59 while (my $line = <F>) {
60 $body .= $line;
61 }
62 $mail{body} = encode_base64($body);
63 close F;
64 print $mail{body};
65
66 $boundary = '--'.$boundary;
67 $mail{body} = <<END_OF_BODY;
68 $boundary
69 Content-Type: text/plain; charset="utf-8"
70 Content-Transfer-Encoding: quoted-printable
71
72 $message
73 $boundary
74 Content-Type: application/octet-stream; name="客戶主檔.csv"
75 Content-Transfer-Encoding: base64
76 Content-Disposition: attachment; filename="客戶主檔.csv"
77
78 $mail{body}
79 $boundary--
80 END_OF_BODY
81
82 sendmail(%mail) || print "Error: $Mail::Sendmail::error\n";
83
原因是excel 預設打開csv檔案,是用 ANSI編碼打開。
解決方式有二:
1. excel打開,menu->資料->從文字檔->選擇要打開的csv,選擇utf-8編碼開啟
2. 當初寫入csv時,開頭寫入utf-8 BOM(byte order mark)編碼如下(第45列)
1 #!/usr/bin/perl
2
3 require "$ENV{HOME}/perl/setEnv.pl";
4
5 use MIME::QuotedPrint;
6 use MIME::Base64;
7 use Mail::Sendmail 0.75; # doesn't work with v. 0.74!
8 use DBI;
9 use utf8;
10 use Encode;
11
12 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time-86400);
13 $year += 1900;
14 $mon += 1;
15 $mon = sprintf("%02d", $mon);
16
17 %mail = (
18 from => 'mis@echochem.com.tw',
19 #to => 'tracy\@echochem.com.tw',
20 to => "tyruan\@echochem.com.tw",
21 subject => '客戶主檔'."$year/$mon"
22 );
23 $mail{smtp} = 'x.x.x.x'; #要改
24
25 $boundary = "====" . time() . "====";
26 $mail{'content-type'} = "multipart/mixed; boundary=\"$boundary\"";
27
28 #$message = encode_qp( "客戶主檔 $year/$mon 資料" );
29 $message = encode_qp( "Customer Master Data $year/$mon " );
30
31 $file = $^X; # This is the perl executable
32
33 my $dbh = DBI->connect( "dbi:Oracle:$yyy", "$zzz", "$www" ) #要改
34 || die( $DBI::errstr . "\n" );
35 $dbh->{AutoCommit} = 0;
36
37 my $sth = $dbh->prepare(qq{
38 select rmnth,occ01,occ02,occ11,occ18,ta_occ09
39 from axm_tbl_occ
40 where rmnth = to_char(trunc(sysdate,'mm')-1,'yyyymm')
41 });
42 $sth->execute();
43 chdir "$ENV{HOME}/perl/erp";
44 open FILE, "> 客戶主檔.csv";
45 print FILE chr(0xFEFF);
#print FILE pack("CCC",0xef,0xbb,0xbf);#也可以,
#print FILE "\x{FEFF}"; #也可以,
見http://stackoverflow.com/questions/7418946/force-utf-8-byte-order-mark-in-perl-file-output
46 print FILE "資料月份,客戶代碼,客戶名稱,統一編號,客戶全名,業務區域\n";
47 while(my @data = $sth->fetchrow_array()) {
48 $data[2] =~ s/,//g;
49 $data[4] =~ s/,//g;
50 print FILE "$data[0],$data[1],$data[2],$data[3],$data[4],$data[5]\n";
51 }
52 close FILE;
53 $sth->finish();
54 $dbh->disconnect();
55
56 open (F, "< 客戶主檔.csv") or die "Cannot read $file: $!";
57 binmode F; undef $/;
58 my $body;
59 while (my $line = <F>) {
60 $body .= $line;
61 }
62 $mail{body} = encode_base64($body);
63 close F;
64 print $mail{body};
65
66 $boundary = '--'.$boundary;
67 $mail{body} = <<END_OF_BODY;
68 $boundary
69 Content-Type: text/plain; charset="utf-8"
70 Content-Transfer-Encoding: quoted-printable
71
72 $message
73 $boundary
74 Content-Type: application/octet-stream; name="客戶主檔.csv"
75 Content-Transfer-Encoding: base64
76 Content-Disposition: attachment; filename="客戶主檔.csv"
77
78 $mail{body}
79 $boundary--
80 END_OF_BODY
81
82 sendmail(%mail) || print "Error: $Mail::Sendmail::error\n";
83
2015年6月11日 星期四
居天下之廣居,立天下之正位,行天下之大道。得志與民由之,不得志獨行其道。
http://www.nani.com.tw/slearn/slchin/chin_c/chin_c_b/chin_c_b6_1.htm
|
||||
景春曰:「公孫衍、張儀,豈不誠大丈夫哉?一怒而諸侯懼,安居而天下熄。」
孟子曰:「是焉得為大丈夫乎!子未學禮乎?丈夫之冠也,父命之;女子之嫁也,母命之,往送之門,戒之曰:『往
之女家,必敬必戒,無違夫子。』以順為正者,妾婦之道也。居天下之廣居,立天下之正位,行天下之大道。得志與民由之,不得志獨行其道。富貴不能淫,貧賤不
能移,威武不能屈。此之謂大丈夫!」
|
||||
1. 景春:孟子時人,講求縱橫之術。
2. 公孫衍:戰國時縱橫家,魏國人,初仕魏國官員,後任秦相。
3. 張儀:戰國時縱橫家,魏國人,相秦惠王,以連橫策略遊說六國事秦。
4. 一怒而諸侯懼:怒則遊說諸侯,使其互相攻擊,故諸侯畏懼。
5. 安居而天下熄:安居在家,未遊說諸侯、挑撥離間,則天下戰火熄滅。
6. 冠:音ㄍㄨㄢˋ,行冠禮。古時士人年二十行冠禮,始為成人。
7. 命:訓勉、教導。
8. 女家:你的家,指夫家。女,音ㄖㄨˇ,通「汝」。
9. 夫子:此指丈夫。
10. 以順為正:以順從為正道。
11. 居天下之廣居:此指以仁居心,乃天下最寬敞的住宅。
12. 立天下之正位:此指以禮立身,乃天下最中正的位置。
13. 行天下之大道:此指以義行事,乃天下最寬闊的大道。
14. 得志與民由之:得志的時候,和人民一起遵行所得之道。由,遵循。
15. 不得志獨行其道:不得志的時候,自己單獨遵行所得之道。
16. 淫:放逸心志,即蕩亂其心意。
17. 移:改變節操。
18. 屈:挫折志氣。
|
||||
孟子言:運用縱橫之術,取悅人君,以遂其志,乃是妾婦之道。能居仁、立禮、行義,有獨立人格者,始為大丈夫。
|
||||
景春說:「公孫衍、張儀,難道不能算是真正的大丈夫嗎?他們一生氣,諸侯便恐懼,深怕他們遊說別的諸侯來攻打;如果在家安居,未遊說諸侯、挑撥離間,天下的戰火便止熄。」
孟子說:「這種人怎能算是大丈夫呢!您沒學過禮嗎?男子成年舉行冠禮時,由父親訓勉他做成人的道理;女子要出
嫁時,由母親告誡她做妻子的道理,臨行母親送到門口,還告誡說:『妳到夫家後,一定要敬重公婆,言行一定要戒慎,不要違逆丈夫的旨意。』可見以順從為正
道,是為人妾婦的道理。真正的大丈夫,以仁居心,住的是天下最寬敞的住宅;以禮立身,站的是天下最中正的位置;以義行事,行的是天下最寬闊的大道。得志的
時候,和人民一起遵行所得的正道;不得志的時候,自己單獨遵行所得的正道。富貴不能擾亂他的心意,貧賤不能改變他的節操,威武不能挫折他的志氣。這才叫做
大丈夫!」
|
||||
訂閱:
文章 (Atom)