หลายๆท่านคงจะพบปะสังสรรค์ปัญหาเกี่ยวกับวันที่กันบ้างพอสมควร ไม่ว่าจะเป็นเรื่องของ Y2K ซึ่งฝรั่งตาน้ำข้าวมันหลอกชาวโลกทั้งหลายให้หลงคารมมาแล้ว แต่ บ่ มีอะในกอ ไก่ ขอ ไข่ มีแต่เสียตัง โดยส่วนตัว Y2K หรืออะไรพวกนี้ถ้าเรากำหนดการป้อน ปี เป็นแบบ 4 หลักแล้วปัญหาก็ไม่มี เราจะใช้คำสั่งกำหนด ปีเป็น 4 หลัก ดังนี้
SET CENTURY ON
แต่ประเด็นที่เราจะมาดูกันคือ จะทำอย่างไรกับฟิลด์วันที่ดี แล้วอยากจะให้วันที่เป็นแบบที่เราต้องการ (ผู้เขียนต้องการต่างหาก)
อยากให้ฟิลด์วันที่ แสดงเป็น วันที่แบบ ไทยๆ เช่น 10 กันยายน 2543 (วันครบรอบ 2 ขวบ ของ web site ไวเหมือนใจนึก)
เมื่อเข้าไปป้อนอยากป้อนสั้นๆ แค่ 10/09/2543
แล้วถ้าผู้ใช้ป้อน เป็น 2000 ก็ให้แปลงมาเป็น 2543 ให้ด้วยก็ดี
พอป้อนเสร็จก็ให้แสดงกลับเป็นอย่างเก่า 10 กันยายน 2543
และสิ่งที่ขาดมิได้คือตรวจสอบการป้อนวันที่ว่าถูกต้องหรือเปล่า
เรามาเริ่มกันเลยละกันครับ
ให้คุณสร้างฟังก์ชันต่างๆดังนี้ก่อนครับ
*BC2BE.PRG
***************************************************************
* Function Convert date from BC to BE
* —โปรแกรม…… แปลงค่าวันที่จาก ค.ศ. เป็น พ.ศ.
* —ตัวอย่าง…… cTDATE=BC2BE(DATE())
***************************************************************
FUNC BC2BE
PARA BCDATE && ค.ศ.
IF TYPE(‘BCDATE’)#’D’
RETURN ”
ENDIF
LOCAL cDD,cMM
cDD = ALLT(STR(DAY(BCDATE),2))
cDD = IIF(LEN(cDD)=1,”0″+cDD,cDD)
cMM = ALLT(STR(MONTH(BCDATE),2))
cMM = IIF(LEN(cMM)=1,”0″+cMM,cMM)
RETU cDD+’/’+cMM+’/’+STR(YEAR(BCDATE)+543,4)
*BE2BC.PRG
***************************************************************
* Function Convert date from BE to BC
* —โปรแกรม…… แปลงค่าวันที่จาก พ.ศ. เป็น ค.ศ.
*– นำไปใช้…… dEDATE=BE2BC(’25/03/2543′)
***************************************************************
FUNC BE2BC
PARA BEDATE && DD/MM/YYYY พ.ศ.
LOCAL nDD,nMM,nYYYY
IF TYPE(‘BEDATE’)#’C’
RETURN ”
ENDIF
nDD = VAL(SUBST(BEDATE,1,2))
nMM = VAL(SUBST(BEDATE,4,2))
nYYYY = VAL(SUBST(BEDATE,7,4))-543
IF TYPE(‘nDD’)#’N’ .OR. TYPE(‘nMM’)#’N’ .OR. TYPE(‘nYYYY’)#’N’
RETURN ”
ELSE
IF nDD > 0 .AND. nMM > 0 .AND. nYYYY > 0
RETURN DATE(nYYYY,nMM,nDD)
ENDIF
ENDIF
RETURN ”
*BE2TD.PRG
***************************************************************
* —FUNCTION BE2TD
* —โปรแกรม…… แปลงค่าวันที่ไทยเป็นแบบภาษาไทยเต็มยศ
*– นำไปใช้…… cTdate=BE2TD(’12/01/2543′)
***************************************************************
FUNC BE2TD
PARA cTDATE
IF TYPE(‘cTDATE’)#’C’
RETURN ”
ENDIF
RETURN SUBST(cTDATE,1,2) + ‘ ‘ + ;
TCMONTH(BE2BC(cTDATE)) + ‘ ‘ + ;
SUBST(cTDATE,7,4)
*TD2BE.PRG
***************************************************************
* —FUNCTION TD2BE
* —โปรแกรม…… แปลงค่าวันที่ไทยเต็มเป็นวันที่ไทย
*– นำไปใช้…… cTdate=TD2BE(’12 มกราคม 2543’)
***************************************************************
FUNC TD2BE
PARA cTDATE
LOCAL cMM,nMM
STOR SPACE(2) TO nMM
IF TYPE(‘cTDATE’)#’C’
RETURN ”
ENDIF
DO CASE
CASE AT(‘มกราคม’, cTDATE) > 0
cMM = ‘มกราคม’
nMM = ’01’
CASE AT(‘กุมภาพันธ์’, cTDATE) > 0
cMM = ‘กุมภาพันธ์’
nMM = ’02’
CASE AT(‘มีนาคม’, cTDATE) > 0
cMM = ‘มีนาคม’
nMM = ’03’
CASE AT(‘เมษายน’, cTDATE) > 0
cMM =’เมษายน’
nMM = ’04’
CASE AT(‘พฤษภาคม’, cTDATE) > 0
cMM = ‘พฤษภาคม’
nMM = ’05’
CASE AT(‘มิถุนายน’, cTDATE) > 0
cMM = ‘มิถุนายน’
nMM = ’06’
CASE AT(‘กรกฎาคม’, cTDATE) > 0
cMM = ‘กรกฎาคม’
nMM = ’07’
CASE AT(‘สิงหาคม’, cTDATE) > 0
cMM = ‘สิงหาคม’
nMM = ’08’
CASE AT(‘กันยายน’, cTDATE) > 0
cMM = ‘กันยายน’
nMM = ’09’
CASE AT(‘ตุลาคม’, cTDATE) > 0
cMM = ‘ตุลาคม’
nMM = ’10’
CASE AT(‘พฤศจิกายน’, cTDATE) > 0
cMM = ‘พฤศจิกายน’
nMM = ’11’
CASE AT(‘ธันวาคม’, cTDATE) > 0
cMM = ‘ธันวาคม’
nMM = ’12’
ENDCASE
IF !EMPTY(nMM)
RETURN ALLT(LEFT(cTDATE,ATC(cMM,cTDATE)-1))+ ;
‘/’+nMM+’/’ + RIGHT(cTDATE,LEN(cTDATE)- ;
(ATC(cMM,cTDATE)+LEN(cMM)))
ENDIF
RETURN ”
*CHKTD.PRG
***************************************************************
* —FUNCTION CHKTD
* —โปรแกรม…… ตรวจสอบการป้อนวันที่ไทย
*– นำไปใช้…… LDate=CHKTD(’22/01/2543′) return .T. or .F.
***************************************************************
FUNC CHKTD
PARA BEDATE && พ.ศ.
IF TYPE(‘BEDATE’)#’C’
RETURN .F.
ENDIF
ON ERROR mABC= ERROR()
LOCAL nDD,nMM,nYYYY,XXX,mABC
mABC=0
nDD = VAL(SUBSTR(BEDATE,1,2))
nMM = VAL(SUBSTR(BEDATE,4,2))
nYYYY = VAL(SUBSTR(BEDATE,7,4))-543
XXX=DATE(nYYYY,nMM,nDD)
ON ERROR
IF mABC # 0 .OR. EMPTY(XXX)
RETURN .F.
ENDIF
RETURN .T.
*TCMONTH.PRG
***************************************************************
* —FUNCTION TCMONTH
* —โปรแกรม…… แปลงค่าเดือนเป็นภาษาไทย
*– นำไปใช้…… mMONTH=TCMONTH(DATE())
***************************************************************
FUNC TCMONTH
PARA dDATE
IF TYPE(‘dDATE’)#’D’
RETURN ”
ENDIF
DO CASE
CASE MONTH(dDATE)=1
RETURN ‘มกราคม’
CASE MONTH(dDATE)=2
RETURN ‘กุมภาพันธ์’
CASE MONTH(dDATE)=3
RETURN ‘มีนาคม’
CASE MONTH(dDATE)=4
RETURN ‘เมษายน’
CASE MONTH(dDATE)=5
RETURN ‘พฤษภาคม’
CASE MONTH(dDATE)=6
RETURN ‘มิถุนายน’
CASE MONTH(dDATE)=7
RETURN ‘กรกฎาคม’
CASE MONTH(dDATE)=8
RETURN ‘สิงหาคม’
CASE MONTH(dDATE)=9
RETURN ‘กันยายน’
CASE MONTH(dDATE)=10
RETURN ‘ตุลาคม’
CASE MONTH(dDATE)=11
RETURN ‘พฤศจิกายน’
CASE MONTH(dDATE)=12
RETURN ‘ธันวาคม’
ENDCASE
RETURN ”
*TM2M.PRG
***************************************************************
* —FUNCTION TM2M
* —โปรแกรม…… แปลงค่าเดือนไทยเต็มเป็นเดือน
* —ผู้เขียน…….. Kasem K.
* —วันแก้ไข……. 12.08.99
*– นำไปใช้…… nMonth=TM2M(‘มกราคม’)
***************************************************************
FUNCTION TM2M
PARAMETER cTMONTH
nMM = 0
DO CASE
CASE AT(‘มกราคม’, cTMONTH) > 0
nMM = 01
CASE AT(‘กุมภาพันธ์’, cTMONTH) > 0
nMM = 02
CASE AT(‘มีนาคม’, cTMONTH) > 0
nMM = 03
CASE AT(‘เมษายน’, cTMONTH) > 0
nMM = 04
CASE AT(‘พฤษภาคม’, cTMONTH) > 0
nMM = 05
CASE AT(‘มิถุนายน’, cTMONTH) > 0
nMM = 06
CASE AT(‘กรกฎาคม’, cTMONTH) > 0
nMM = 07
CASE AT(‘สิงหาคม’, cTMONTH) > 0
nMM = 08
CASE AT(‘กันยายน’, cTMONTH) > 0
nMM = 09
CASE AT(‘ตุลาคม’, cTMONTH) > 0
nMM = 10
CASE AT(‘พฤศจิกายน’, cTMONTH) > 0
nMM = 11
CASE AT(‘ธันวาคม’, cTMONTH) > 0
nMM = 12
ENDCASE
RETURN nMM
สร้างเสร็จแล้ว ต่อมาก็เริ่มสร้าง คลาสย่อย เพื่อเก็บเอาไปใช้งานในโอกาสต่อไปในภายภาคหน้า
พิมพ์คำสั่งที่ Command Windows ดั่งนี้
CLEATE CLASS
จากนั้นป้อนข้อมูลตามตัวอย่างดังภาพ
แล้วก็คลิกปุ่ม OK จากนั้นท่านก็จะเข้าสู่ Class Designer
กำหนด Property ของ Object ดังนี้
Alignment = 2-Center
FontName = MS Sans Serif
Format = K
Width = 130
ที่ Object: txtdateth Procedure: Valid ป้อนคำสั่ง
LOCAL nYEAR
IF This.Value#’ / / ‘
IF SUBSTR(This.Value,7,4) > ‘1800’ AND SUBSTR(This.Value,7,4) < ‘2200’
nYEAR=VAL(SUBSTR(This.Value,7,4))+543
This.Value=SUBSTR(This.Value,1,6)+ALLT(STR(nYEAR))
ENDIF
IF SUBSTR(This.Value,7,4) <= ‘1800’ OR SUBSTR(This.Value,7,4) > ‘2743’
=MESSAGEBOX(‘ป้อนวันที่ไม่ถูกต้อง’,64,”)
RETURN 0
ENDIF
IF !CHKTD(This.Value)
=MESSAGEBOX(‘ป้อนวันที่ไม่ถูกต้อง’,64,”)
RETURN 0
ENDIF
ENDIF
ที่ Object: txtdateth Procedure: LostFocus ป้อนคำสั่ง
IF This.Value#’ / / ‘
This.Value = BE2TD(This.Value)
ELSE
This.Value = ”
ENDIF
This.InputMask = ”
ที่ Object: txtdateth Procedure: GotFocus ป้อนคำสั่ง
IF This.Value#’ / / ‘
This.Value = TD2BE(This.Value)
This.InputMask = ’99/99/9999’
ENDIF
จากนั้นก็ทำการ บันทึกเก็บไว้ใช้งานได้เลยครับท่าน โดยกดปุ่ม Ctrl + W