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

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'
                        说明: p_sfa01:工单号码
                                  p_sfa03:料件编号
                 p_sfa08:作业编号
                 p_sfa12:发料单位
                 p_sfa27:被替代料号
                 p_sfa012:工艺段号 GP 5.20以下版本不需要
                 p_sfa013:工艺序  GP 5.20以下版本不需要
            大致逻辑:工单已发欠料量=已发套数*实际QPA-已发数量   (其中:实际QPA=应发/生产数量)

 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'
                        说明: 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

如何讓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

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. 屈:挫折志氣。
 
章旨
孟子言:運用縱橫之術,取悅人君,以遂其志,乃是妾婦之道。能居仁、立禮、行義,有獨立人格者,始為大丈夫。
語譯
景春說:「公孫衍、張儀,難道不能算是真正的大丈夫嗎?他們一生氣,諸侯便恐懼,深怕他們遊說別的諸侯來攻打;如果在家安居,未遊說諸侯、挑撥離間,天下的戰火便止熄。」  
孟子說:「這種人怎能算是大丈夫呢!您沒學過禮嗎?男子成年舉行冠禮時,由父親訓勉他做成人的道理;女子要出 嫁時,由母親告誡她做妻子的道理,臨行母親送到門口,還告誡說:『妳到夫家後,一定要敬重公婆,言行一定要戒慎,不要違逆丈夫的旨意。』可見以順從為正 道,是為人妾婦的道理。真正的大丈夫,以仁居心,住的是天下最寬敞的住宅;以禮立身,站的是天下最中正的位置;以義行事,行的是天下最寬闊的大道。得志的 時候,和人民一起遵行所得的正道;不得志的時候,自己單獨遵行所得的正道。富貴不能擾亂他的心意,貧賤不能改變他的節操,威武不能挫折他的志氣。這才叫做 大丈夫!」