จัดการข้อมูล(ต่อ)

บทที่แล้วคุณได้ทราบวิธีการสร้างฐานข้อมูล และแฟ้มดัชนี ต่างๆแล้ว มาในบทนี้ คุณจะได้เรียนรู้ถึงการใช้งานข้อมูล การกระทำกับข้อมูลว่ามีวิธีการอย่างไรบ้าง

จากตัวอย่าง program4 คุณคงได้เห็นคำสั่งที่เกี่ยวกับการจัดการข้อมูลมาบ้างแล้ว ทีนี้เราจะมาทำความเข้าใจกับคำสั่งต่างๆเหล่านั้นกัน

คำสั่งแรกที่จะทำการพูดถึงก็คือการเปิดแฟ้มข้อมูล (table) ขึ้นมาใช้งาน  เราใช้คำสั่ง USE ซึ่งมีรูปแบบดังนี้

USE [TableName | SQLViewName | ?]
[IN nWorkArea | cTableAlias]
[AGAIN]
[NOREQUERY [nDataSessionNumber]]
[NODATA]
[INDEX IndexFileList | ?
[ORDER [nIndexNumber | IDXFileName
| [TAG] TagName [OF CDXFileName]
[ASCENDING | DESCENDING]]]]
[ALIAS cTableAlias]
[EXCLUSIVE]
[SHARED]
[NOUPDATE]

การเขียนโปรแกรมต่างๆ นั้นการทำงานกับ table เราอาจจำเป็นต้องทำการเปิด table หลายๆ table พร้อมๆกันในโปรแกรมฉะนั้นเราจำเป็นต้องกำหนดตำแหน่ง(Work Area) ให้กับ table นั้นๆด้วยโดยใช้คำสั่ง

SELECT nWorkArea | cTableAlias

คุณลองป้อนคำสั่งตามตัวอย่างด้านล่าง ที่ command windows แล้วลองสังเกตุการทำงานของแต่ละคำสั่งดู (คุณต้องสร้าง database MYDATABASE ก่อน ตัวอย่างอยู่ที่บทที่แล้ว)

CLOSE ALL
OPEN DATABASE MYDATABASE
SELECT 1
USE SALESMAN
BROWSE
SELECT 2
USE CUSTOMER
BROWSE
SELECT SALESMAN
BROWSE
SELECT 0
USE PRODUCT
BROWSE

จากตัวอย่างเป็นการกำหนดตำแหน่งให้กับ table SALESMAN ให้อยู่ ณ.ตำแหน่งที่ 1 และ table CUSTOMER อยู่ ณ.ตำแหน่งที่ 2 และ table PRODUCT คุณทราบหรือไม่ว่าอยู่ตำแหน่งที่เท่าไหร่   คำตอบอยู่ตำแหน่งที่ 3 เรารู้ได้อย่างไรละ ถ้าเราใช้คำสั่ง SELECT 0 ในการกำหนดตำแหน่ง โปรแกรมจะทำการหาตำแหน่งล่างสุดที่ยังว่างอยู่มาให้ซึ่งก็คือตำแหน่งที่ 3

ในการเขียนโปรแกรมรับค่าจากผู้ใช้แล้วนำค่านั้นๆเพิ่มเข้าสู่ table (ไม่ใช่ป้อน) ใน Visual FoxPro ก็มีคำสั่งที่สามารถทำได้โดยใช้คำสั่งดังนี้

INSERT INTO Salesman (SALES_ID,NAME,ADDRESS,COMMRATE), ;
VALUE(“10099″,”MR.SOMCHAI”,”175 SATHORN RD.”,0.50)
BROWSE

หรือ

SELECT Salesman <
APPEND BLANK
REPLACE  SALES_ID WITH “10099”, NAME WITH “MR.SOMCHAI”, ;
ADDRESS WITH “175 SATHORN RD.”, COMMRATE WITH 0.50
BROWSE

จากทั้งสองตัวอย่างเป็นการเพิ่มข้อมูลเข้าสู่ table SALESMAN เหมือนกันแต่วิธีการเขียนคำสั่งต่างกัน การใช้งานนั้นขึ้นอยู่กับความเหมาะสม ณ.ขณะนั้นว่าจะเลือกใช้งานแบบไหน ทีนี้เรามาดูรูปแบบคำสั่งของ INSERT INTO ว่าเป็นอย่างไร

INSERT INTO dbf_name [(fname1 [, fname2, …])]
VALUES (eExpression1 [, eExpression2, …])
– Or –
INSERT INTO dbf_name FROM ARRAY ArrayName | FROM MEMVAR

คีย์เวิร์ด MEMVAR มันหมายถึงอะไร?  การทำงานใน Visual FoxPro ที่เกี่ยวกับฐานข้อมูลถ้าเป็นนักเขียนโปรแกรมจริงๆน๊ะไม่ใช่เล่นๆ ส่วนใหญ่เขาจะใช้ตัวแปรเมมโมรี (memory variables) แทนการใช้ชื่อ ฟิลด์(field) ในการอ้างถึงข้อมูลใน table ชื่อของตัวแปรนี้จะเป็นชื่อเดียวกันกับชื่อ ฟิลด์ ใน table เพียงแต่จะมีตัวสัญลักษณ์บอกว่าเป็นตัวแปรเมมโมรี โดยนำ m.มาใส่ไวหน้าชื่อฟิลด์ เช่น  m.sales_id , m.name เป็นต้น แล้วมันจะเกี่วยกับ คีย์เวิร์ด MEMVAR ยังไง… คีย์เวิร์ด MEMVAR เป็นตัวแทนของ ตัวแปรเมมโมรีทั้งหมดใน table เมื่อเราอ้างถึง table นั้นๆ

ทีนี้เรามาดูคำสั่งเกี่ยวกับการแก้ไขข้อมูล การนำข้อมูลจาก table เก็บไว้ในตัวแปรเมมโมรี และการนำตัวแปรเมมโมรีกลับไป update ข้อมูลใน table จากตัวอย่าง program4 คุณจะได้พบกับนิพจน์คำสั่ง  scatter memvar, gather memvar สองตำสั่งนี้เป็นส่วนหนึ่งของการนำข้อมูลจาก table มาเก็บไว้ที่ตัวแปรเมมโมรี เรามาตัววิธีใช้กันดีกว่า ให้ทำการป้อนคำสั่งตามตัวอย่างด้านล่างที่ command windows แล้วลองสังเกตุว่าเกิดอะไรขึ้นบ้าง

CLOSE ALL
OPEN DATABASE MYDATABASE
USE SALESMAN IN 1
BROWSE   &&  คุณจะเห็นข้อมูลเก่าที่ป้อนไว้ก่อนหน้านี้ กด ปุ่ม Esc เพื่อออกจาก browse
GO TOP
SCATTER MEMVAR
? m.sales_id + m.name + m.address + TRANSFORM(m.commrate, ‘@z 999.99’)
m.name = ‘MR.ARKIRA SUPERMAN’
m.commrate = 7.80
GATHER MEMVAR
BROWSE
m.name=’MRS.SOMSRI’
REPLACE NAME WITH m.name
BROWSE

คำสั่ง SCATTER เป็นการนำข้อมูลจาก เรคคอร์ดปัจจุบันของ table มาเก็บไว้ในตัวแปรเมมโมรี

คำสั่ง GATHER เป็นการ update ข้อมูลจากตัวแปรเข้าสู่ table ณ.เรคคอร์ปัจจุบัน

ส่วนคำสั่ง REPLACE คล้ายกับ GATHER แต่ถ้าในกรณีที่ต้องการ update ทั้งเรคคอร์ด คำสั่ง gatter จะสะดวกกว่า

ทีนี้เรามาดูรูปแบบคำสั่งของทั้ง 3 คำสั่งกัน

SCATTER
[FIELDS FieldNameList
| FIELDS LIKE Skeleton | FIELDS EXCEPT Skeleton] [MEMO]
TO ArrayName | TO ArrayName BLANK | MEMVAR | MEMVAR BLANK
| NAME ObjectName

ถ้าในกรณีที่เราต้องการตัวแปรเมมโมรีโดยไม่ต้องการให้มีข้อมูลจากเรคคอร์เลย เราสามารถใช้ คีย์เวิร์ด MEMVAR BLANK เราใช้ในกรณีที่ต้องการจะเพิ่มข้อมูลใหม่เข้าไป เราจำเป็นต้องทำให้ตัวแปรนั้นๆว่างเปล่าก่อน เช่น

SCATTER MEMVAR BLANK

GATHER FROM ArrayName | MEMVAR | NAME ObjectName
[FIELDS FieldList | FIELDS LIKE Skeleton | FIELDS EXCEPT Skeleton]
[MEMO]

REPLACE FieldName1 WITH eExpression1 [ADDITIVE]
[, FieldName2 WITH eExpression2 [ADDITIVE]] …
[Scope] [FOR lExpression1] [WHILE lExpression2]
[IN nWorkArea | cTableAlias]
[NOOPTIMIZE]

ต่อมาก็มาถึงคำสั่ง ลบข้อมูล จริงๆไปหาอ่านได้ทั่วไป เพราะคำสั่งที่ใช้คือคำสั่ง

DELETE   [Scope] [FOR lExpression1] [WHILE lExpression2]
[IN nWorkArea | cTableAlias]
[NOOPTIMIZE]

หรือคำสั่ง

DELETE FROM [DatabaseName!]TableName
[WHERE FilterCondition1 [AND | OR FilterCondition2 …]]

สองคำสั่งข้างต้นการทำงานเหมือนกันคือลบได้เหมือนกันแต่ต่างกันตรงที่ คำสั่งที่สองทำการลบได้โดยไม่ต้องเปิด table ก่อนก็ดูเอาแล้วกันว่าท่านสะดวกแบบใหนเลือกได้ตามสบายสองตัวบาทเดียว

ตั้งแต่สมัย dBASE เรื่อยมาการลบขอมูลของ table นั้นเป็นการลบหลอกๆ คือ จะทำการทำตำหนิไว้ว่าได้ถูกลบไปแล้วแต่จริงๆยังไม่ได้ลบดังนั้นเราสามารถเรียกข้อมูลเก่ากลับมาได้โดยใช้คำสั่ง

RECALL
[Scope] [FOR lExpression1] [WHILE lExpression2]
[NOOPTIMIZE]

แต่ถ้าเราต้องการลบข้อมูลที่ถูกลบไปแล้วจริงๆ เพราะเหตุว่ารกเหลือกเกิน เปลืองเนื้อที่ ก็ใช้คำสั่ง    PACK ครับท่าน   ยิ่งไปกว่านั้นถ้าต้องการลบทั้ง table โดยไม่สนใจเลยว่าจะมีเรคคอร์ใดถูกลบหรือไม่ เอาง่ายๆก็คือล้างทิ้งทั้งหมดไฟล์ เหลือแต่โครงร่าง(structure) ไว้ก็ใช้คำสั่ง ZAP เรียบร้อยโรงเรียนไทย

ที่กล่าวมายืดยาวถึงขนาดนี้ถ้าผู้ใดที่เขียน FoxPro หรือโปรแกรมทำนองนี้อยู่แล้วก็ขออภัยไว้ด้วยที่หลงเข้ามาอ่าน ตอนนี้ทำไว้ให้มือใหม่จะได้รู้ว่ามีข้อมูลอยู่จะทำกับมันอย่างไร แล้วจะต้องใช้คำสั่งอะไรบ้างก็เท่านั้นเอง