Thursday, January 30, 2014

7:39 PM
11
คราวที่แล้วว่าถึงวิธีการเปลี่ยน บาท ให้เป็น ข้อความ มาคราวนี้ว่าด้วยเรื่อง เปลี่ยน 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  

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






บทความอื่นๆ