อีกสักครั้งเถอะ

   
สำหรับทุกท่าน ที่ถามให้ติดตามด้วย อย่างน้อยๆ กลับมาขอบคุณผู้ตอบ ให้มีกำลังใจตอบต่อไป หรือแจ้งการตอบรับ ด้วยว่า OK หรือไม่ แล้วทุกท่านจะได้รับไมตรีที่อบอุ่น จากชาว FOX ครับ....ท่านขอความช่วยเหลือมา เรามีไมตรีตอบ ครับ ...
จิ้งจอกเก่า
13 ก.พ. 46 เวลา 9:14:54 น. --> 203.149.51.111,
   
   
เห็นด้วยครับ!!! อย่างปล่อยให้กระทู้ของท่านเต็มไปด้วยคำตอบที่รอคอยการกลับมาของท่าน
ผมเห็นกระทู้ที่ผ่านๆมาหลายๆกระทู้ผู้ตอบถกกันจนเขี้ยวแทบหักแต่ไม่เห็นร่องรอยเจ้าของกระทู้ ยกตัวอย่างให้เห็นก็กระทู้เมื่อไม่นานมานี้ผมตามอ่านอยู่ 2วัน ผู้ตอบมองปัญหาไม่เหมือนกัน คนหนึ่งตีความตามคำสั่งแบบตรงไปตรงมา อีกคนมองภาพกว้างถึงความเป็นไปได้ "คำตอบของทั้งสองถูกทั้งคู่ครับ" แต่คำตอบแบบภาพกว้างถ้าตีความแบบตรงไปตรงมาจะมี logic แปลกๆอธิบายยาก

if used("table_a")
use in table_a -----> ปิด Alias ที่ชื่อ table_a ไม่ใช่ปิด table_a
ถ้า alias นี้ทำหน้าที่เป็น flag คำสั่งนี้จึงเหมือนการ
reset flag
else
use table_a in 0 ----->เปิด table_a จริงๆ
endif

แต่ถ้าตีความตามคำสั่งแบบตรงไปตรงมา logic นี้จะเป็นการ ปิด table_a ถ้าเปิดอยู่ และ เปิดถ้าปิด

เชื่อมั้ยว่าผู้ตอบถกกันจนเขี้ยวแทบหักแต่ไม่เห็นร่องรอยเจ้าของกระทู้แม้นแต่เงา
ป่านนี้คนตอบคงเข็ดเขี้ยวไม่ค่อยอยากตอบ แต่เหตุการณ์แบบนี้จะไม่เกิดขึ้น
ถ้าท่านเจ้าของกระทู้จะกรุณากลับมาเหลียวแลกระทู้ของท่านสักนิด
x86
14 ก.พ. 46 เวลา 15:36:52 น. --> 210.203.179.163
  
   
เอาอีกแล้วคุณ x86 ผมว่าจะเลิกไปแล้วนะนี่กับกระทู้ #2573
แต่ก่อนอื่น ขอขอบคุณในความปราถนาดีของทั้ง2ท่านที่กระตุ้นเจ้าของกระทู้ให้มาต่อกระทู้

แต่จำเป็นต้องว่ากันต่ออีกครับ เพราะที่คุณว่า
"use in table_a -----> ปิด Alias ที่ชื่อ table_a ไม่ใช่ปิด table_a
ถ้า alias นี้ทำหน้าที่เป็น flag คำสั่งนี้จึงเหมือนการ reset flag"
ผมไม่ได้ว่าอย่างนั้น แต่ถ้าเป็นคุณสรุป ผมก็ไม่เห็นด้วย

use in talble_a มีผล เหมือนกับ ข้างล่าง (แต่ไม่ต้องเปลือง var oldSelect)
oldSelect = SELECT()
SELECT table_a
USE
SELECT (oldselect)

use ตัวนี้ปิด table ใน selected area มีผลให้ alias หาย(ปิด)ไป การอธิบายว่าเป็นการปิด
alias ไม่ได้มีใครอธิบายย้อนทางแบบนี้ ยิ่งบอกว่าปิด alias แต่ไม่ปิด table ยิ่งไม่ได้ใหญ่
(รบกวนคุณทดสอบคำสังดูหน่อยครับ มีตัวอย่างในกระทู้ 2573 อีกส่วนหนึ่ง)

แต่ถ้าจะเล่นแง่โดยเปิด table แล้วกำหนด alias ให้ไขว้กัน เช่น
use tx alias table_a in 0 && tx อยู่ใน w a #1 ได้ alias เป็น table_a
use table_a alias tx in 0 && table_a อยู่ใน w a #2 ได้ alias เป็น tx

use in table_a ปิด tx ใน#1 ทำให้ alias ที่ตั้งใจตั้งให้ตรงกับชื่อ table_a หายไป
แล้วถือว่า table_a จริงๆ ที่เปิดใน #2 (alias tx) ยังไม่ปิด แบบนี้ก็คงไม่ไหวครับ และ
ถ้าการถาม/ตอบปัญหา ต้องระวังกรณียอกย้อนกันขนาดนี้ ก็คงไม่เป็นอันทำอะไรกันแล้ว

ไม่ขอยกตัวอย่างอื่นทีจะเล่นกันได้อีกเช่น use ... again เดี๋ยวจะเข้าใจผิดอีกว่าผมหาเรื่อง
แต่กลัวว่าเรื่องที่ละเอียดอ่อน และผลการ ปิด/เปิด ซึ่งเป็นจุดสำคัญของ logic ของ code block
จะถูกตีความคลาดเคลื่อน และมีผลกับข้อสรุปอย่างสำคัญด้วย
** เช่น** มีผลทำให้ที่คุณเสริมว่า alias เป็น flag ... ถูก reset ใช้อธิบายไม่ได้โดยปริยาย
(ไม่อภิปรายตรงนี้แล้วกันนะครับ กลัวหาว่าผมดุดันอีก กัดไม่เลิก)

สรุป ประเด็นผมเน้นตรงที่ว่า ผมตอบคำถามคุณเด็กดีว่า
use in table_a นั้นไม่ได้ use (ซ้ำ) อะไรอีกนอกจากปิด table_a

และถกกันต่อเนื่อง ก็เพราะ code นี้ดูเผินๆ แล้วเป็น construct ที่เราคุ้นกันมาก คือ
set up /clean up code อย่างที่คุณเดาสุ่มบอก (ซึ่งผมรับนะครับว่าควรใช้)
แต่บังเอิญไม่ใช่ประเด็นหลัก

และเมื่อคิดต่อเนื่องว่า table_a taggle ปิด/เปิดในแต่ละ pass ก็เป็น logic ที่"แปลก"
แต่ถ้าเข้าใจว่า table_a เปิดหลังผ่าน code ชุดนี้เสมอก็จะได้ logic อีกแบบที่เข้าได้
กับ logic มาตรฐานที่คุ้นเคยกัน

******
ไม่ใช่อยากจะมาต่อความยาวสาวความยืดอีก เท่านี้ผมก็รำคาญตัวเองแย่อยู่แล้ว
แต่ตัดสินใจว่าจำเป็นต้องปกป้อง **ความถูกต้อง**ของคำสั่ง use in table_a ครับ
******
พิมพ์ยาวจนได้ ขออภัยคุณ "จิ้งจอกเก่า" ที่มาทำลายบรรยากาศของกระทู้นี้
อย่าโกรธผมนะครับคุณ x86 ขออภัยที่อาจจะล่วงเกินคุณ
สำหรับคุณเด็กดี ผมเห็นใจครับ เป็นผมเห็นแบบนี้ก็คงเปิดแน่บไปละครับ
สอง
15 ก.พ. 46 เวลา 0:39:16 น. --> 202.28.179.1, w
  
   
ขอแก้คำผิด taggle -> toggle
สอง
15 ก.พ. 46 เวลา 0:40:23 น. --> 202.28.179.1, w
  
   
Proc Dispatch_InhibittFlag_2_Access_tables
...
do case
case x=1
create cursor table_a( Flag L, )
create cursor table_b( Flag L, )
create cursor table_c( Flag L, )

case x=2
create cursor table_b( Flag L, )
create cursor table_c( Flag L, )
create cursor table_d( Flag L, )
case x=3
...
endcase
endproc

Proc Do_Open_tables_IF_Inhibitflag_notSet
...
if used("table_a")
use in table_a
else
use table_a in 0
endif
if used("table_b")
use in table_b
else
use table_b in 0
endif
...
...

endproc

มันน่าจะมีลักษณะแบบนี้ครับ
x86
15 ก.พ. 46 เวลา 12:14:32 น. --> 210.203.179.12,
  
   
คุณ x86 ครับ ที่คุณเขียนว่า
use in table_a -----> ปิด Alias ที่ชื่อ table_a ไม่ใช่ปิด table_a

หลัง use in table_a
table_a ปิด ใหมครับ
ถ้าปิดก็ ok
ถ้าคุณบอกว่าไม่ปิด ก็รับไม่ได้ครับ
เพราะ table_a ที่จริงแล้ว *ปิด
ปิด alias โดยไม่ปิด table_a ทำไม่ได้ครับ อย่างที่ผมพยายามอธิบายไว้

ที่เหลือไม่ใช่ประเด็นครับ
สอง
15 ก.พ. 46 เวลา 17:53:06 น. --> 202.28.179.1, w
  
   
ถูกต้องครับ
use in table_a -----> ปิด Alias ที่ชื่อ table_a ไม่ใช่ปิด table_a

และ หลังจากใช้คำสั่ง use in table_a alias ที่ชื่อว่า table_a ก็ถูกปิดไปจริงๆครับ

สำหรับความหมายของ Alias ลองดู Syntax ด้านล่างนี้ประกอบครับ (ผมตัดมาจาก Help )

Syntax

CREATE CURSOR alias_name
(fname1 type [(precision [, scale])
[NULL | NOT NULL]
[CHECK lExpression [ERROR cMessageText]]
[DEFAULT eExpression]
[UNIQUE]
[NOCPTRANS]]
[, fname2 ...])
| FROM ARRAY ArrayName

Arguments

alias_name Specifies the name of the temporary table to create. alias_name can be a name expression.

หรือลองดูคำสั่งต่อไปนี้ครับ

ี use table_other again in 0 alias table_a share

x86
15 ก.พ. 46 เวลา 19:28:34 น. --> 210.203.179.12,
  
   

แสดงว่าคุณใช้วิธีอธิบายที่เล่นแง่ *ใช้ alias ที่ไม่ตรงกับ table name มาอธิบาย*
- - - - - -
[use table_other again in 0 alias table_a share] ของคุณ

==ก็คืออันเดียวกันกับที่ผมดักคอไว้ก่อนแล้วข้างบน=รวมถึง share ของคุณ กับ use ... again
...
use tx alias table_a in 0 && tx อยู่ใน w a #1 ได้ alias เป็น table_a
use table_a alias tx in 0 && table_a อยู่ใน w a #2 ได้ alias เป็น tx

use in table_a ปิด tx ใน#1 ทำให้ alias ที่ตั้งใจตั้งให้ตรงกับชื่อ table_a หายไป
แล้วถือว่า table_a จริงๆ ที่เปิดใน #2 (alias tx) ยังไม่ปิด แบบนี้ก็คงไม่ไหวครับ และ
ถ้าการถาม/ตอบปัญหา ต้องระวังกรณียอกย้อนกันขนาดนี้ ก็คงไม่เป็นอันทำอะไรกันแล้ว

ไม่ขอยกตัวอย่างอื่นทีจะเล่นกันได้อีกเช่น use ... again เดี๋ยวจะเข้าใจผิดอีกว่าผมหาเรื่อง
...
- - - - - - - - -
และถ้าจะให้ตรงไปตรงมา ผมว่าเริ่มที่ use command ก็น่าจะเป็นธรรมชาติที่สุด
เพราะประโยคคำสั่งที่อยู่ในเนื้อเรื่องก็เป็น use
และก็ว่ากันด้วยเรื่อง table ไม่ใช่ cursor (ซึ่งคุณก็คงว่ามัน เป็น temporary table... )

นี่ก็มาจาก Help เหมือนกัน
USE [[DatabaseName!]Table | SQLViewName | ?] [IN nWorkArea | cTableAlias]
....<ตัดออก>
[ALIAS cTableAlias] ....<ตัดออก>

Parameters

DatabaseName!]TableName
____Specifies the name of the table to open. ...<ตัดออก>
(สังเกตว่า table ถูกเปิด ไม่ใช่ alias)
... <ตัดออก>
IN cTableAlias
____Specifies that the table is opened in the work area of a table that is currently open.
The alias of the open table is specified with cTableAlias ... <ตัดออก>
(แต่ table ถูกเรียกด้วย alias)
... <ตัดออก>
ALIAS cTableAlias
____Creates an alias for the table. You can refer to a table by its alias in commands and
functions that require or support an alias. When a table is opened, it is automatically
assigned an alias, which is the table name if ALIAS isn't included. You can create a
different alias for the table by including ALIAS and a new alias ... <ตัดออก>
(สังเกตว่า alias ไม่ได้ถูกเปิด แต่ถูกสร้าง/กำหนดขึ้น)
(และเวลาเรากล่าวถึง alias โดยทั่วไป ก็หมายถึง table name เดียวกัน ถ้าต้องมา
เผื่อว่าจะเป็น table_other มาขอใช้ชื่อ table_a ก็ ..... อย่างที่ว่าไว้ข้างบน)
...<ตัดออก>
Remarks
If USE is issued without a table name and a table file is open in the currently selected
work area, the table is closed. Also, a table is closed when another table is opened in
the same work area. ...<ตัดออก>
(ประโยคสำคัญ!. ถ้า use โดยไม่มี table name อะไรละครับที่ถูกปิด -- the table is closed
แล้ว alias ที่เกี่ยวข้องหายไป)
สอง
15 ก.พ. 46 เวลา 21:23:15 น. --> 202.28.179.1, w
  
   
-ต่อ-
ในตัวอย่างที่คุณแสดง
[*และ หลังจากใช้คำสั่ง use in table_a alias ที่ชื่อว่า table_a ก็ถูกปิดไปจริงๆครับ*]

เอาตามที่คุณว่าเป็น alias table_a ถูกปิด
แต่ คำถามที่สำคัญกว่า"ชื่อเรียก"ถูกปิด คือ table เจ้าของชื่อถูกปิด
0. มี alias ถูกปิดโดย table(/cursor ที่คุณนำเข้ามาเป็นแง่) ที่ alias นั้นอ้างถึงไม่ปิดด้วยหรือไม่
1. ถ้าก่อนหน้านี้ USE talbe_a IN 0 => table_a ถูกปิดใหม (ขอร้องครับ ไม่เอา use .. again)
2. ถ้าเป็น use table_other again in 0 alias table_a share => table_other ถูกปิดใหมครับ?
(คุณตั้งใจจะใช้แง่นี้จริงๆ หรือ ว่า table_other ไม่ใช่ table_a ทั้งๆที่โดยเนื้อหามันคือ table_a!)
3. และถ้าเป็น create cursor table_a => table_a ที่เป็น cursor (ไม่ใช่ aias) ปิดใหม?
(ขอวิจารณ์เพิ่ม cursor ถูกสร้างและเปิดเป็น temporay file. อันที่จริง cursor ที่สร้างนี้ก็ต้องมีชื่อ
แต่เป็นชื่อที่ไม่มีความหมาย เพราะ generate ขึ้นมาอ้างอิงภายในไม่เกี่ยวกับ program ของ user
และจะไม่มี file เก็บไว้บน disk เมื่อปิด cursor แต่ vfp ต้องการ alias เพื่อใช้เป็น identifier
ให้ user สามารถอ้างอิงหรือใช้ใน ีuser program ..... Alias เป็นเพียงชื่อ)

สำหรับผม
0 ไม่มี ต้องมี table ที่เปืดใน work area ของ alias นั้นปิดตาม
1-3 ปิด, ปิด และ ปิด

คุณได้แสดง point จุดของคุณชัดแล้วครับ ผมอ่านแล้วเข้าใจได้
ผมเพียงเป็นคนสู้เพื่อหลักการมากคนหนึ่ง จึง(พยายาม)พูดมากไป
สอง
15 ก.พ. 46 เวลา 21:23:57 น. --> 202.28.179.1, w
  
   
ผมไม่ได้เล่นแง่หรือเบี่ยงเบนใดๆครับ
ความหมายของคำว่า Alias นั้นหมายถึง ชื่อเล่น ที่เราตั้งให้กับ Table หรือ Temporary Table ที่เราเปิดขึ้นใช้งาน เพื่อให้มี meaning ที่เข้าใจง่ายในการเขียน/อ่าน โปรแกรม

Cursor เป็น Temporary table ครับ

"alias_name Specifies the name of the temporary table to create" ผมลืมเน้นข้อความนี้ทีผมยก Syntax ของคำสั่ง create cursor มาประกอบ

นี่คงเป็นอีกสาเหตุหนึ่งที่ทำให้เป็นข้อถกเถียงในกระทู้ที่ผมตามอ่านอยู่ 2 วัน คือคนหนึ่งมองว่ามันไม่สามารถระบุได้ว่า
table_a ที่เห็นใน if block และ else block คือ physical table ตัวเดียวกัน เนื่องจากไม่ว่า statemets ก่อนหน้าหรือ ตามหลัง if else block เป็นอย่างไรมีอยู่หรือไม่ ( มองภาพกว้างหรือ คิดลึก ) และการอธิบายเป็นภาษาพูดด้วยตัวอักษรมันมองภาพยากครับ

ส่วนอีกคนตีความตรงตัวตาม Statement ทุกประการ

ผมจึงบอกว่า "คำตอบของทั้งสองถูกทั้งคู่ครับ" จะผิดก็ที่ถูกเจ้าของกระทู้ทอดทิ้งครับ





x86
15 ก.พ. 46 เวลา 22:19:02 น. --> 210.203.179.12,
  
ขอเชิญร่วมตอบคำถามครับ
 
ผู้ตอบ :
รหัสผ่าน :
รูปภาพ :
คำตอบ :