วันที่

หลายๆท่านคงจะพบปะสังสรรค์ปัญหาเกี่ยวกับวันที่กันบ้างพอสมควร ไม่ว่าจะเป็นเรื่องของ 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

Down Load ตัวอย่างการใช้งาน