ปัญหาชวนปวดหัว

ฉันจะทำอย่างไรดี ตอนสร้างฟอร์มแล้วกำหนด ตารางฐานข้อมูลใน DataEnviroment แล้วต่อมาต้องทำการย้ายฐานข้อมูลไปอยู่ directory อื่น?

เมื่อเผลอไป zap ข้อมูลอันเป็นสุดที่รัก (โอ้ลัลลลล…ล้าาาา) จ๊ากๆๆๆๆ

 

สร้างฟอร์มแล้วกำหนด ตารางฐานข้อมูลใน DataEnviroment แล้วต่อมาต้องทำการย้ายฐานข้อมูลไปอยู่ directory อื่น?

สำหรับท่านที่สร้างฟอร์มโดยใช้ DataEnvironment เพื่อกำหนดตาราง วิว และความสัมพันธ์ต่างๆ เพื่อใช้ในฟอร์ม ตอนสร้างมันจะจำ path ของ directory นั้นไว้เมื่อเรานำโปรแกรมที่สร้างเสร็จแล้วไปแจกจ่ายแล้วเปลี่ยน directory เป็นชื่อใหม่ หรือเขียนโปรแกรมบน Drive C: แล้วเปลี่ยนใจอยากจะทำระบบเป็นแบบ Client Access โดย ก๊อบปี้เฉพาะฐานข้อมูลไปไว้ที่ LAN ส่วนโปรแกรมก็ไว้ที่ Drive C: ซึ่ง directory ตอนแรกกับหลังจากย้ายแล้วไม่ตรงกันเป็นต้น หรือทำอย่างไรก็ได้ ที่ทำให้มันเกิด error ตามภาพด้านล่างนี้

c1101.gif (2948 bytes)

แสดงว่าฟอร์มนั้นหา ฐานข้อมูลชื่อ mydatabase.dbc ไม่เจอ …. แล้วเราจะจัดการกับมันอย่างไรดีล่ะ?

การแก้ปัญหาที่เกิดขึ้น เราต้องสามารถที่จะกำหนด direve และ path ให้กับฟอร์มต่างๆที่เราสร้างขึ้นมาได้เอง โดยทำดังนี้

1. ในกรณีที่เราต้องการเปลี่ยน drive และ path โดยไม่ต้องการยุ่งกับโปรแกรม ก็ให้สร้างไฟล์ ที่มีนามสกุล .H (header file) เช่น MyApp.H  โดยใช้ Text Editor อะไรก็ได้ หรือจะใช้คำสั่งที่ command window ก็ได้ โดยพิมพ์ดังนี้

MODIFY COMMMAND MYAPP.H

จากนั้นก็ป้อนคำสั่งดังนี้

                                  c1102.gif (3386 bytes)

แล้วทำการ save ไฟล์นี้ โดยกดปุ่ม Ctrl-W

2. เมื่อคุณทำการสร้างฟอร์มขึ้นมา แล้วทำการ กำหนดตารางในส่วนของ DataEnvironment ใน Form Designer แล้ว ให้คุณทำการคลิ๊กเมาส์ปุ่มขวาที่ DataEnviroment ทำการเลื่อก Properties…   (จะมีสักกี่ฟอร์มก็ต้องทำจ๊ะ)

3. คลิ๊กที่แท๊ป Method แล้ว คลิ๊กสองครั้งที่ BeforeOpenTabel

    c1103.gif (6706 bytes)

จากนั้นก็ทำการป้อนโปรแกรมดังต่อไปนี้

#INCLUDE MYAPP.H
IF !EMPTY(DATA_PATH) and !EMPTY(DATA_DRIVE)
=AMEMBERS(A_Cursors,THISFORM.dataenvironment,1)
=ASORT(A_Cursors, 2)
nStartpos=ASUBSCRIPT(A_Cursors, ASCAN(A_Cursors, “Object”),1)
FOR I = nstartpos TO ALEN(A_cursors,1)
IF A_Cursors(i,2) = “Object”
cObjClass = “THISFORM.DATAENVIRONMENT.”+a_cursors(i,1)+”.class”
IF EVAL(cObjClass)=”Cursor”
cObjName=”THISFORM.DATAENVIRONMENT.” ;
+ A_Cursors(i,1)+”.DATABASE”
Data_Name=EVAL(cObjName)
NewDataPath=ALLTRIM(data_drive)+ ALLTRIM(data_path) ;
+ ALLTRIM(SUBSTR(Data_Name, RAT(“\”,Data_Name)+1))
oRef = EVAL( “THISFORM.DATAENVIRONMENT.”+a_cursors(i,1) )
oRef.Database = newdatapath
ENDIF
ELSE
EXIT
ENDIF
ENDFOR
ENDIF

4. หลังจากนี้ต่อไป เมื่อคุณต้องการที่จะเปลี่ยน directory หรือ path ก็สามารถทำได้โดยการแก้ที่ไฟล์ MYAPP.H ก็พอ

 

การนำข้อมูลกลับหลังจากที่ได้ zap ไปแล้ว

สี่เท้ายังรู้พลาด สองเท้าที่สวมใส่ บาจา ก็ต้องมีเพลี่ยงพล้ำกันบ้าง ด้วยเหตุผลกลใดไม่ทราบเมื่อท่านพิมพ์สามตัวอักษรสังหาร (ZAP) โดยไม่ตั้งใจแต่นิ้วมันพาไป ต่อไปนี้ท่านไม่ต้องมานั่งน้ำตาตกหรือเหงื่อตกอีกต่อไป เรามีฟังก์ชัน UNZAP มานำเสนอ…. มังกรทองให้เสียง ชอว์ลิ้วเฮียงนำแสดง

FUNCTION UNZAP
PARAMETER nRECORD
IF nRECORD>0 .AND. USED()
IF RECCOUNT()=0
FILENAME=DBF()
USE
HANDLE=FOPEN(FILENAME,2)
IF HANDLE>0
BYTE=FREAD(HANDLE,32)
BKUP_BYTE=BYTE
FIELD_SIZE=ASC(SUBSTR(BYTE,11,1))+(ASC(SUBSTR(BYTE,12,1))*256)
FILE_SIZE=FSEEK(HANDLE,0,2)
BYTE8=CHR(INT(nRECORD/(256*256*256)))
BYTE7=CHR(INT(nRECORD/(256*256)))
BYTE6=CHR(INT(nRECORD/256))
BYTE5=CHR(MOD(nRECORD,256))
BYTE=SUBSTR(BYTE,1,4)+BYTE5+BYTE6+BYTE7+BYTE8+SUBSTR(BYTE,9)
=FSEEK(HANDLE,0)
=FWRITE(HANDLE,BYTE)
=FCHSIZE(HANDLE,FILE_SIZE+(FIELD_SIZE*nRECORD))
=FCLOSE(HANDLE)
ENDIF
USE &FILENAME
ENDIF
ELSE
WAIT WIND “ERROR CANNOT UNZAP…..”
ENDIF
RETURN

วิธีใช้

USE CUSTOMER
ZAP
=UNZAP(100)

การที่เราจะ UNZAP ข้อมูลเก่ากลับมานั้นเราจำเป็นต้องทราบจำนวนเรคคอร์ดที่มีอยู่ทั้งหมดของไฟล์นั้นๆก่อน แต่ถ้าท่านไม่ทราบก็ให้ประมาณจำนวนเรคอร์ดแล้วใส่ตัวเลขเข้าไปก่อน เมื่อทำการ UNZAP เรียบร้อยก็จะได้ข้อมูลเท่ากับจำนวนเรคคอร์ดที่ท่านได้ใส่เข้าไป จากนั้นก็ทำการ BROWSE ดูว่า เรคคอร์ดสุดท้ายที่เป็นข้อมูลจริงๆ เป็นเรคคอร์ดที่เท่าไหร่ (ถัดจากนั้นจะเป็นขยะ) เมื่อได้จำนวนเรคคอร์ดที่เป็นจริงแล้ว ก็ให้ท่านกลับไป ZAP ข้อมูลนั้นใหม่อีกครั้ง แล้วก็ UNZAP ตามจำนวนเรคคอร์ดที่เป็นจริง….

ZAP ไม่ใช่ปัญหาแต่ปัญหามีกลิ่นติดจาน มีสารตกค้างต้องใช้ ไลป้อนเอฟ (เอ…ได้ค่าโฆษนาหรือเปล่าเนี่ย)