Rlock กับ Unlock

SELE NO
GO 1
IF RLOCK()
REPLACE NO WITH No+1
Thisform.text2.value = No
UNLOCK
ENDIF

***************************************************************************************************************************
* Function : Running No.
* Use : Table -> RUNNO.DBF
* Example : ?PADL(RUNNO(‘RUNNO’,’CN’,.F.),7,’0′) && for Display New Runno no
* : ?PADL(RUNNO(‘RUNNO’,’CN’,.T.),7,’0′) && for Dispaly New Runno no and Update new Running No
***************************************************************************************************************************
FUNCTION RUNNO (cTABLENAME,cFIELDNAME,lFLDUPDATE)
* cTABLENAME = TABLE FOR RUNNING NO.
* cFIELDNAME = FIELDNAME FOR KEEP LAST RUNNO
* lFLDUPDATE = CONDITION FOR UPDATE FIELD
IF PARAMETERS() < 2
RETURN 0 && CANNOT GENERATE RUNNING NO
ENDIF
IF PARAMETERS() = 2
lFLDUPDATE = .F.
ENDIF
LOCAL nRUNNO
USE (cTABLENAME) SHARED IN 0
SELECT (cTABLENAME)
DO WHILE !RLOCK()
* WAITTING FOR LOCK RECORD
ENDDO
nRUNNO = &cFIELDNAME + 1
IF lFLDUPDATE
REPLACE &cFIELDNAME WITH nRUNNO
ENDIF
UNLOCK
USE IN (cTABLENAME)
RETURN nRUNNO
ENDFUNC

วิธีใช้
====
ก่อนอื่นต้องสร้างตารางขึ้นมาสำหรับเก็บ หมายเลข runno จากนั้นก็ทำการเพิ่ม record ว่างๆ 1 record
* ถ้ามีตัวคุม หลายตัว ก็ใช้วิธีสร้างฟิลด์เพิ่มเอา แต่ record ต้อง มี 1 เท่านั้น เช่น สมุติต้องการมี runno สำหรับ invoice และ credit note ก็สร้างตารางรอไว้เช่น

CREATE TABLE MYRUN (INV N (5,0),CN N (5,0) )
* จากนั้น insert record ว่างๆ 1 record
INSERT INTO MYRUN(INV,CN) VALUES(0,0)

เวลาใช้งานก็เรียกใช้ function ดังนี้

?RUNNO(‘MYRUN’,’CN’) && จะให้ค่าเป็น numeric 1 แต่ไม่มีการ update runno ลงตารางจริง
?PADL(RUNNO(‘MYRUN’,’CN’),5,’0′) && ให้ค่าเป็น ‘00001’ แต่ไม่มีการ update runno ลงตารางจริง

?RUNNO(‘MYRUN’,’CN’,.T.) && จะให้ค่าเป็น numeric 1 แล้วทำการ update runno ลงตารางจริง
?PADL(RUNNO(‘MYRUN’,’CN’,.T.),5,’0′) && ให้ค่าเป็น ‘00001’ แล้วทำการ update runno ลงตารางจริง