ฟังชั่น Const ดึงค่ามาจาก Textbox ได้อย่างไรครับ
กระทู้เก่าบอร์ด อ.Yeadram

 4,383   21
URL.หัวข้อ / URL
ฟังชั่น Const ดึงค่ามาจาก Textbox ได้อย่างไรครับ


ฟังชั่น Const ดึงค่ามาจาก Textbox ได้อย่างไรครับ
ผมเก็บค่าคงที่โดยการเขียนโค๊ด ตัวอย่างว่า

Const    tCurrentPeriod   = "2012"

ซึ่งนำเอาชื่อตัวแปร tCurrentPeriod ค่าคงที่นี้ไปใช้ต่อยอด โดยเมื่อรันแล้ว ค่า tcurrentPeriod ภายในตารางจะเท่ากับ 2012 หมด ( อันนี้ทำได้แล้วครับ )

อยากถามต่อว่า ถ้าสมมุติ ผมต้องการให้ตัวแปร tCurrentPeriod ของผมทำการดึงค่า มากจาก Textbox ที่ถูกสร้างขึ้นภายในหน้า Form ได้อย่างไรครับ

สมมุติ
ชื่อ Textbox คือ text01
ชื่อ Form คือ ChangePeriod   

21 Reply in this Topic. Dispaly 2 pages and you are on page number 1

1 @R12121
ไม่รู้เข้าใจคำถามถูกหรือเปล่านะครับ
แต่ผมคิดว่าไม่ได้นะครับ เพราะการประกาศตัวแปรแบบนี้มันจะต้องประกาศก่อนที่จะอ่านค่าใน Textbox ของคุณเสียอีก
ดังนั้นคุณน่าจะใช้เป็น Module แทน

ยังไงผมประสบการณ์เรื่องนี้ไม่ค่อยมาก รอท่านอื่นๆก่อนแล้วกันครับ
2 @R12122
ขอบคุณ คุณ TTT ครับ เอาโค๊ดจริงมาให้ครับ
ถ้าผมจะทำเป็น Module แทนนี่มีวิธียังไงบ้างครับ

Const tCurrentPeriod = "201201"
Private Sub btnUpdate_Click()
    Call prUpdate
    MsgBox "Update completed ... "
End Sub
Sub prClearOutstanding(iDB As Database)
Dim MySQL As String
    MySQL = "Update tbProductOutstanding "
    MySQL = MySQL & "Set Inbound = 0, OutBound = 0 "
    MySQL = MySQL & "Where Period = '" & tCurrentPeriod & "'"
    iDB.Execute MySQL
End Sub

ถ้าผมกำหนดเงีือนไขตรง Where Period = " ชื่อพารามิเตอร์ " จะได้ละเปล่าครับ รบกวนด้วยครับผมมือใหม่จริง ๆ
3 @R12124
หรือ มีฟังชั่นไหนใช้แทนได้บ้างละเปล่าครับ ขอบคุณครับ
4 @R12127
ผมยังไม่เข้าใจว่า ในเมื่อคุณกำหนดให้เป็นค่าคงที่แล้ว จะดึงค่าจาก textbox เพื่ออะไรครับ คือว่า งง อยู่ ไม่เข้าใจจุดประสงค์ในการทำเลยครับ เพราะถ้าเปลี่ยนค่าได้มันก็ไม่ใช่ค่าคงที่ สร้างเป็นตัวแปร (Dim) จะต่างกันอย่างไร

ไม่มันใจในคำถาม ไม่กล้าตอบอ่ะครับ
5 @R12129
ถึง TTT
ใช่ครับ ในตอนแรกผมใช้เป็นค่าคงที่จะได้กำหนดเป็นค่าเดียว แต่พอใช้ไปเลยคิดว่าให้รับค่าจาก textbox หรือ combobox จะดีกว่า แสดงว่าผมควรประกาศตัวแปรแบบ Dim ซึ่งจะรับค่าจาก box ได้อย่างไรครับ อยากทราบรูปแบบการประกาศครับ ขอบคุณครับ
6 @R12131
แทนที่ Const tCurrentPeriod = "201201 ด้วย
dim tCurrentPeriod as string
tCurrentPeriod = Format(Year(Date),"yyyy") & Format(month(Date),"mm")

เป็นตัวอย่างจากหนังสือ จุดมุ่งหมาย ต้องการให้รู้ period ในช่วงเวลานั้น
ซึ่งทดแทนด้วย code ด้านบน ส่วนจะ apply นำไปใช้กับ textbox คงไม่ยาก เช่น tCurrentPeriod= Text1.Value เป็นต้น
7 @R12139
ขอบคุณครับ ทำได้แล้วครับ แต่ติดปัญหา Runtime Error 3002 ครับเนื่องจากเกิดค่าซ้ำ

เช่น ผมกำหนดใน Text1 ค่าคือ 2010 แต่พอกดปุ่มอัพเดตอีกครั้งข้อมูลจะไม่เข้าครับ

เนื่องจากเกิดค่า 2010 ซ้ำ ลองแก้ Relation index แล้วไม่ได้

8 @R12141
งั้นลองใหม่นะครับ จากโค๊ดเดิมที่คุณโพส
จาก
Const tCurrentPeriod = "201201"
เปลี่ยนเป็น
Dim tCurrentPeriod As String

และจากบรรทัด Call prUpdate ผมไม่เห็นคำสั่ง prUpdate เพราะคุณไม่ได้โพสมา เห็นแต่ prClearOutstanding ฉนั้นในคำสั่ง prUpdate ของคุณให้เพิ่มบรรทัด
tcurrentPeriod = Format(Date, "yyyymm")
เป็นบรรทัดแรกของคำสั่ง prUpdate หรือคำสั่งอื่นๆ ก่อนอ้างถึง tcurrentPeriod เพื่อให้มันมีค่าที่ต้องการ

ปล. tcurrentPeriod = Format(Date, "yyyymm") หมายถึง คุณต้องการรูปแบบ ปีกับเดือน ณ ปัจจุบัน นะครับ หากต้องการใส่ค่าเองโดยการอ้างถึง Textbox อย่างที่คุณต้องการให้ใช้เป็น
tcurrentPeriod = Format(Me.Text1, "yyyymm")
ประมาณนี้ และใน Text1 ของคุณต้องมั่นใจว่ารูปแบบที่ใส่เป็นแบบวันที่นะครับ ประมาณนี้
ผมเดาเอาแบบกว้างๆนะครับ ใช้จริงต้องปรับแต่งดูครับ
9 @R12144
ถึง คุณ TTT ลองทำตามแล้ว ได้แล้วครับผม พี่เก่งมาก ๆ

ขอบคุณจริง ๆๆ ครับ ที่มาตอบ อาจจะพิมขอบคุณสั้นไปหน่อยแต่มาจากใจจริง ๆ ครับ

10 @R12159
มีปัญหาเกิดขึ้นครับ คุณ TTT จากรูปเลยครับ ถ้าผมสั่งอัพเดตในเดือนใหม่มันจะทำให้ไปอ่าน Record เก่าทั้งหมดเลยครับที่มีการบันทึก และทำหักล้างไปด้วยครับ อยากให้ว่า

เช่น มีการรับสินค้าในเดือนใหม่ 10 ชิ้น ยอดรับเข้าของผมก็มีแค่ 10 ชิ้นครับ

ไม่ใช่นำยอดเก่ามารวมด้วย หรือนำยอดหักออกในเดือนก่อนมาแจ้งมาด้วยครับ






จากตัวอย่างในเดือนที่สองผมเพิ่มสินค้า 001 ไป 60 ชิ้น เอาออกไป 10 ชิ้น
สินค้า 002 เพิ่มไป 20 ชิ้น
สินค้า 004 ออกไป 50 ชิ้น

เดือนถัดมาผมเพิ่มสินค้าชนิดที่ 2 ไป 40ชิ้น
* มันเอายอดรวมมาให้หมดเลยครับ
รวมถึงเอายอดเดิมมาใส่ให้ด้วย ครับ

จะให้แสดงแต่ยอด 40 ชิ้นของเดือน 3 ในสินค้าชนิดที่ 2 ได้อย่างไรครับ

11 @R12160


ขออภัยแก้ไข ตัวอย่างนี้ครับ ข้างบนมีลักษณะคล้ายกันแต่ตัวเลขที่ยกเป็นอันนี้ครับ
12 @R12161
1. จากโค๊ดผมไม่เห็นมีส่วนไหนเป็นคำสั่งรวมค่า (+) ในฟิลด์ Inbound แต่ถ้าเป็นในตัวอย่างแสดงว่ามีคำสั่งในการรวมค่า
2. สังเกตุว่าก่อนหน้านี้คุณจะใช้เงือนไขการรวมยอดแบบเป็น ปี อย่างเดียวใช่หรือไม่ ส่วนตอนนี้คุณจะเปลี่ยนเป็นรวมยอดเดือนๆไป ถ้าเป็นอย่างนั้นจริง คุณต้องหาคำสั่งการรวมยอดในฟอร์ม หรือที่ใดไม่รู้ที่อ้างถึง แล้วแก้เงือนไขใหม่ให้รวมยอดโดยอ้างเดือนด้วยครับ
3. ถ้าจะทดสอบว่าจริงหรือเปล่า คุณลองเปลี่ยน Format(Date, "yyyymm") เป็น Format(Date, "yyyy")
4. ถ้าทุกอย่างเป็นอย่างว่า แสดงว่าคุณต้องหาคำสั่งในการรวมค่า แก้จากการรวมค่าเป็นปี ให้เป็นเดือนแทน
ปล. ข้อสังเกตุทั้งหมดถือว่าเป็นคำถามด้วยนะครับ ถามไม่ใช่ก็ตอบให้ทราบด้วยนะครับ
13 @R12166

ใช้ครับจะรวมยอดเฉพาะเดือนได้อย่างไรครับ

โค๊ดคำสั่ง Update Outstanding ครับ


ส่วนอันนี้เป็นโคํดอัพเดตค่ารวมยอดด้านล่างครับ



ผมลองเปลี่ยนเป็นเฉพาะปี จะได้แบบนี้ครับแต่ค่ายังถูกรวมอยู่ต้องการแยกครับ
ไม่รู้ต้องเพิ่มโค๊ดในส่วนไหน ขอบคุณจริง ๆ ครับ







14 @R12167
ส่วนตัวผมไม่อยากแก้คำสั่งที่ใช้คำนวณอย่างนี้สักเท่าไร เพราะไม่รู้จะมีผลกระทบกับอะไรบ้าง (ไม่ได้เห็นภาพรวม และเหตุผลที่ต้องเขียนแบบนี้) แต่เท่าที่ดูน่าจะอยู่ที่ prAccumulateOutstanding() บรรทัด
tOldQty = iTargetRec!Inbound
นั่นหมายถึง คุณนำค่าในฟิลด์ Inbound ทั้งหมดมาบวก ใช่หรือเปล่าครับ ถ้าใช่ก็ลองเปลี่ยนเป็น
tOldQty = DLookup("ชื่อฟิลด์ในตาราง", "ชื่อตาราง", "[ชื่อฟิลด์ในตาราง] = '" & ชื่อฟิลด์บนฟอร์มที่ต้องการเทียบ & "'"))
เช่น
tOldQty = DLookup("Inbound", "tbProductOutstanding", "[Period] = " & Formst(Date, "yyyymm") & "and ProductCod = " & Form!iRecSub!ProductCode

คือผมพยามคิดแบบที่แก้ให้น้อยที่สุด เพราะผมไม่รู้ผลกระทบกับอย่างอื่นๆที่ตามมาว่ามีหรือไม่

จากโค๊ดที่ให้อาจใช้ไม่ได้จริง ลองอ้างถึงฐานข้อมุลโดยตรงกับฟอร์มให้ถูกต้องตามชื่อที่คุณใช้จริงดูครับ
ปล. สำรองข้อมูลก่อนลองทุกครั้งนะครับ และถ้าท่านอื่นๆ เข้ามาอ่านมีอะไรแนะนำก็เชิญเลยนะครับ แนวคิดผมอาจไม่ถูกต้องก็ได้
15 @R12168
แก้ไขหน่อยครับ ต้องใช้ Cint() เพราะเป็น Integer
tOldQty = Cint(DLookup("Inbound", "tbProductOutstanding", "[Period] = " & Format(Date, "yyyymm") & "and ProductCod = " & Form!iRecSub!ProductCode)
16 @R12169




ใส่โค๊ดไปตามนี้ครับ มันบอกว่าหา Field iRecSub ไม่เจอครับ





17 @R12170
พอดีช่วงเย็นผมไม่ว่าง ต่ออีกนิดเลยแล้วกันนะครับ
คือหลักการณ์อยู่ที่ คุณต้องหาค่า Inbound เก่า ที่มีเงื่อนไขว่าต้องเป็น เลขสินค้าเดียวกัน และ เลข Period มาได้ก่อน แล้วจึงนำมาบวกค่าใหม่

คือการรวมข้อมูลแบบมีเงื่อนไข ลักษณะแบบนี้ ถ้าง่ายสุด อาจใช้คำสั่ง SQL กับฐานข้อมูลโดยตรงไปเลย เช่น

DoCmd.RunSQL("Update [tbProductOutstanding] Set [Inbound] = iif(isnull(Inbound)," & Forms![ชื่อฟอร์มคุณ].[ชื่อฟิลด์ที่ใส่ค่าเพิ่มลงไป] & ",[Inbound] + " & Forms![ชื่อฟอร์มคุณ].[ชื่อฟิลด์ที่ใส่ค่าเพิ่มลงไป] & ")"& " Where [Period] = " & Forms![ชื่อฟอร์มคุณ].[ชื่อฟิลด์ที่แสดงเลข Period] & "And [ProductCode] = " & Forms![ชื่อฟอร์มคุณ].[ชื่อฟิลด์ที่แสดงเลข ProductCode])

ซึ่งก็นั่นอีกแหละครับ อาจมีเหตุผลอีกร้อยแปดในการออกแบบที่ไม่สามารถทำอย่างที่ผมยกตัวอย่างให้ได้

ฉนั้นผมจึงให้ได้แค่แนวทางนะครับ คุณต้องลองศึกษาและพิจารณาดูว่าใช้แบบไหนเหมาะสม
18 @R12171
เพิ่งเห็นการตอบของคุณนะครับ
คือคุณต้องตรวจสอบคำสั่งให้ดีครับ ผมเขียนแบบว่าสดๆเลย อาจมีการผิดพลาดได้ เช่น ที่คุณโพสมา เห็นแล้วว่า Form!iRecSub!ProductCode มันผิดอ่ะครับ Form ต้องเป็น Forms!iRecSub!ProductCode
หรือถ้าเป็น Sub Form ก็ต้องอ้างให้ถูกอ่ะครับ ผมไม่รู้เรื่องของชื่อที่ถูกต้องในการอ้างถึงฟอร์มของคุณอ่ะครับ

เรื่องรูปแบบดูได้จาก F1 Help เช่นในหน้า VBA คุณไฮไลท์ที่คำว่า Dlookup แล้วกด F1 ตรวจสอบรู้แบบให้ถูกต้องครับ
19 @R12172
ขอบคุณสำหรับคำแนะนำครับ

ผมคิดว่าถ้าอย่างงั้น ผมจะสร้าง Field ใหม่ชื่อว่า InboundNew และ OutBoundNew

* โดยที่กำหนดเงื่อนไขให้

นำเอา ค่า Inbound ของ Period ที่ 255502 นำมาลบกับ Inbound ของ Period ที่ 255503 แล้วทำการเก็บค่าใหม่ เข้าไปใน Field InboundNew หรือ OutboundNew ได้ละเปล่าครับ ถ้ามีปีสุดท้ายก็เอาปีสุดท้ายเป็นตัวตั้งทำการลบไปเรื่อย ๆ ครับ



เมื่อทำการลบออกจะถูกเก็บค่าไปยัง Field InboundNew ค่าที่ได้ก็จะมีค่าแค่ 50 ของ PLS-001 เท่านั้นครับ แบบนี้จะได้ละเปล่า จะยากเข้าไปละเปล่าครับ


อันนี้เป็นส่วนของ Qurey ที่ทำการกำหนดเปิดตาม Period ครับ

20 @R12173
อืม! ผมขอแนะนำให้ก่อนทำ คุณศึกษาเรื่องคิวรี่ดูครับ และ SQL Statement ดูก่อนจะดีมากครับ เพราะจะทำให้ต่อยอดความคิดได้ บางที่สิ่งที่คุณอยากทำมันไม่ยากเลยนะครับ แค่คุณรู้คำสั่งที่จะใช้มัน
คุณลองค้นหาในกระทู้นี้คำว่า สรุปผลรวมข้อมูล Running Sum หรือที่นี่ดูครับ TopicID 2188 แล้วปรับใช้ดูครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2771s