Thursday, January 30, 2014

คราวที่แล้วว่าถึงวิธีการเปลี่ยน บาท ให้เป็น ข้อความ มาคราวนี้ว่าด้วยเรื่อง เปลี่ยน dollar ให้เป็นข้อความบ้าง เพราะว่าไปเจอบาง script ที่ฝรั่งทำไว้ มันดันแสดงได้แค่หลักแสน วันนี้ก็เลยไปหาวิธีให้มันทำได้หลักล้านหรือหลายล้านมา

ไป copy เขามาใช้งานนะครับ ไม่ได้เขียนเอง มาดูกันว่าเขาทำกันอย่างไร วิธีการนี้ เป็นการเขียน custom function นะครับ นั่นก็คือสร้าง function สำหรับเปลี่ยน dollar ให้เป็นข้อความ ด้วยตัวเอง ไม่ได้เป็น function มาตราฐานของ filemaker ครับ

เขาใช้หลาย function ประกอบกันนะครับ ให้ copy เอาไปสร้างตามลำดับได้ดังนี้

1. อย่างแรก เปิด custom function ขึ้นมาก่อน จาก file --> manage --> custom function
2. ก็ทำการ new custom function ขึ้นมา แล้วก็แค่ copy code ข้างล่าง เอาไปแปะตามตัวอย่าง ห้ามเปลี่ยนชื่อนะครับ (แต่ถ้าใครเข้าใจ ก็เปลี่ยนชื่อได้)
คราวนี้ มาคัดลอก code ข้างล่างไปสร้างแต่ละ function ดู เพราะ function ทั้งหมด ที่เห็นนี้ มันเรียกใช้กันเองหมดเลยนะครับ

Function 1 : ConvertMoneyToWords  ( amount ) <-- copy เอาส่วนนี้ไปใส่ช่อง function Name แต่เอาตัวที่อยู่ในวงเล็บไปใส่ในช่อง Function Parameter แทน ตามรูปด้านบน

Let(
roundedAmount = Round( amount; 2 )
dollars = Div(roundedAmount;1); 
cents = (Mod(roundedAmount;1) * 100) ];

    If (dollars = 0; "zero"; ConvertIntToWords ( dollars; 10^15 )) & " dollars and "
       & If (cents = 0; "no"; cents ) & "/100"
)

========================================
Function 2 : ConvertIntToWords( amount; base )

If (base=1; If (amount > 0; ConvertSmallIntToWords ( amount ));
Let ( [large = Div(amount;base); small = Mod(amount;base); nextBase = NextLowerBase( base ) ];
If ( large = 0; ConvertIntToWords( amount; nextBase );
Let ( rest = ConvertIntToWords( small; nextBase );
ConvertIntToWords(large;100) & " " & BaseName(base) & If (rest <> ""; " " & rest ) )
)
)
)

========================================
Function 3 : BaseName  ( base )

Case ( base = 1; "<invalid>";
base = 100; "hundred";
base = 1000; "thousand";
base = 10^6; "million";
base = 10^9; "billion";
base = 10^12; "trillion";
base = 10^15; "quadrillion"
)

========================================
Function 4 : NextLowerBase  ( base )

Case( base > 1000; Div(base;1000);
base = 1000; 100;
base = 100; 1
)

========================================
Function 5 : ConvertSmallIntToWords  ( num )

Case( num < 10;
Case( num=9; "nine"; num=8; "eight"; num=7; "seven"; num=6; "six"; num=5; "five"; num=4; "four"; num=3; "three"; num=2; "two"; num=1; "one"; num=0; "zero" );
num < 20;
Case( num=10; "ten"; num=11; "eleven"; num=12; "twelve"; num=13; "thirteen"; num=14; "fourteen"; num=15; "fifteen"; num=16; "sixteen";
num=17; "seventeen"; num=18; "eighteen"; num=19; "nineteen" );
num < 30; If( num = 20; "twenty"; "twenty-" & ConvertSmallIntToWords( num-20 ) );
num < 40; If( num = 30; "thirty"; "thirty-" & ConvertSmallIntToWords( num-30 ) );
num < 50; If( num = 40; "fourty"; "fourty-" & ConvertSmallIntToWords( num-40 ) );
num < 60; If( num = 50; "fifty"; "fifty-" & ConvertSmallIntToWords( num-50 ) );
num < 70; If( num = 60; "sixty"; "sixty-" & ConvertSmallIntToWords( num-60 ) );
num < 80; If( num = 70; "seventy"; "seventy-" & ConvertSmallIntToWords( num-70 ) );
num < 90; If( num = 80; "eighty"; "eighty-" & ConvertSmallIntToWords( num-80 ) );
num < 100; If( num = 90; "ninety"; "ninety-" & ConvertSmallIntToWords( num-90 ) );
"<error - too large number in ConvertSmallIntToWords: " & num & ">"
)

========================================

เมื่อทำ custon function ทั้งหมด เสร็จแล้ว ก็ให้สร้าง sctipt ในการเรียกใช้ function เท่านั้น ตามตัวอย่างข้างล่าง

ผมต้องการ convert เลข 10000 ซึ่งมันอยู่ใน field ชื่อ Total Amount นะครับ
ก็แค่สร้าง script ชื่อ convert เรียกใช้ function ที่ชื่อ ConvertMoneyToWords(Field ที่ต้องการ convert) ตามตัวอย่างด้านบน


จากนั้น ผมก็ฝัง script นี้ไว้ที่คำว่า [ Convert ] สีแดงๆ ที่เห็น โดยการพิมพ์คำว่า [ Convert ] ก่อน จากนั้นก็สร้าง Button Setup ให้มัน เพื่อเรียกใช้ script covert  

หวังว่าคงเข้าใจนะครับ ... 






11 ความคิดเห็น:

  1. ขอบคุณมาก ๆ ครับ

    กรณีเขียนโปรแกรมให้มีกำหนดระยะเวลาใช้งาน ต้องเขียนอย่างไรครับ เช่น โปรแกรม A ให้ใช้ได้ถึงวันที่ 10 กุมภาพันธ์ 2557

    ReplyDelete
  2. เอ ผมไม่เคยทำแหะ แต่ถ้าจะทำ ก็น่าจะใช้ script เข้าดักก็ได้ครับ

    ReplyDelete
  3. พอจะมีแนวการเขียนหรือไม่ครับ

    ReplyDelete
  4. ผมจะสร้างตัวแปร global ตัวหนึ่ง สำหรับเก็บวันที่ ที่ผมแจกโปรแกรม ประมาณว่าก่อนแจก ผมจะ set วันที่ให้ตัวแปรนี้ โดยสร้าง account ที่ให้สิทธิ์ user เป็น data entry ซึ่งจะไม่สามารถแก้ไข layout หรือ เข้าแก้ไข field ได้

    แล้วผมก็จะมี script อีกตัวหนึ่ง ที่ get วันที่ปัจจุบัน แล้วไปเปรียบเทียบกับ วันที่ในตัวแปร global หากลบกันแล้ว ได้มากกว่า 5 วัน (ยกตัวอย่าง) ก็ให้ไป layout ที่ทำไร ไม่ได้สักอย่างประมาณนี้

    แต่วิธีนี้ก็มีข้อเสียคือหาก user รู้วิธี bypass script ตอนเริ่มโปรแกรม ก็เสร็จ หรือ user set เวลาของเครื่องให้เปลี่ยนไป อีก ก็เสร็จ

    ทางที่ดีที่สุดคือ ติดตั้ง filemaker server แล้ว host file ที่เราต้องการให้ user ใช้งานไว้ที่ฝั่งเรา จากนั้นก็สร้าง link file ในการเข้าใช้งาน server นี้ผ่านทาง internet ส่งไปให้ user เมื่อครบกำหนด เรา เอา file นั้นออกจาก server จะง่ายกว่าไหมครับ คือเราไม่ได้ให้ file งานจริงๆ ไป ให้ไปเฉพาะ link file แต่ถ้า user ไม่มี internet ก็ใช้ไม่ได้เช่นกัน นั้่นคือข้อเสียครับ

    ReplyDelete
  5. ขอบคุณมาก ๆ ครับ ผมมีอีกคำถามครับ คำสั่ง วันที่ปัจจุบันของเครื่อง ใช้คำสั่งอะไรครับ เช่น ใน Excel ใช้คำสั่ง Today() แต่ใน filemaker 11,12 ไม่ทราบว่าใช้คำสั่งตัวไหนครับ ขอบคุณล่วงหน้าครับ

    ReplyDelete
  6. ผมใส่ สูตร get(currentdate) ใน filed ที่จะให้โชว์วันที่ปัจจุบัน แต่พอวันรุ่งขึ้น filed ที่ให้โชว์ วันที่ปัจจุบัน ยังเป็นวันที่ ของเมื่อวานอยู่ ผมทำผิดตรงไหนหรือเปล่าครับ ขอความรู้ด้วยครับ

    ReplyDelete
  7. การ update วันที่ปัจจุบันนั้นทำได้ 2 วิธีนะครับ
    1. สร้าง field โดยใช้ type แบบ calculation จากนั้นก็สั่ง get(currentdate) เข้าไปเลย วิธีนี้ จะทำให้ field นั้นๆ ได้ค่าของวันที่ปัจจุบันเสมอ ไม่ว่าจะเปิดโปรแกรมเมื่อไรนะครับ

    2. สร้าง field type เป็น date ธรรมดา แล้วใช้ script ทำการ get(currentdate) ไปใส่ที่ field นี้ ซึ่งมันจะได้วันที่ปัจจุบันต่อเมื่อเราทำการเรียกใช้ script นี้ ผมคิดว่าปัญหาที่พบ เกิดจากการทำแบบที่ 2 นี้ ใช่ไหมครับ วิธีการแก้ไข ก็คือ เราต้องสั่งให้โปรแกรมทำการ run script ที่ update วันที่ปัจจุบันใน File --> File Option จากนั้นก็เลือกว่าให้ทำการ run script ที่สั่งให้ update วันที่ปัจจุบัน ทุกๆครั้งที่เราเปิดโปรแกรมครับ

    ไม่ งง นะครับ ?

    ReplyDelete
  8. ผมทำตามแบบ วิธีที่ 1 ครับ แต่พอวันรุ่งขึ้น เปิด file ขึ้นมา วันที่ยังคงเป็นวันที่ของเมื่อวาน ครับ
    ผมเขียนสูตร ตามนี้ครับ filed ชื่อ current date type เป็น calculation สั่ง get(currentdate) และกำหนดการจัดเก็บเป็น Global ผมก็เลยงง ครับ ทางคุณ สุชาติ พอจะมี email ที่ผมจะส่งข้อมูลไปให้ดูได้หรือไม่ครับ เผื่อว่าผมเขียนผิด ขอบคุณครับ

    ReplyDelete
  9. อันนี้ run ในเครื่อง หรือ run จาก server ครับ ? ต้องระวังเรื่องการใช้ตัวแปร global ให้ดีหน่ะครับ ลองปลดเอา global ออก แล้วเป็นอีกไหมครับ ? ส่ง email หาผมได้ที่ diowcnx@gmail.com ครับ

    ReplyDelete
  10. run จากเครื่องครับ แต่หากเรากด new record วันที่จะเปลี่ยนให้เป็นวันที่ปัจจุบันครับ แต่ถ้าไม่มีการ new record วันที่จะเป็นวันที่เดิม

    ReplyDelete

บทความอื่นๆ