แสดงกระทู้

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - SakDa

หน้า: 1 2 [3] 4 5 6 7
33
ขอบคุณสำหรับคำตอบครับ ได้หละครับ ผมใช้ code  SELECT CASE  เลือกได้ครับทุกรายงาน
โพสต์นี้ได้รับคำขอบคุณจาก: SakDa

34
ก่อนอื่นต้องขอขอบคุณอาจารณ์ทุกท่านนะครับ ที่ได้แก้ไขปัญหาต่างๆ ในการทำ Code  ....
สำหรับโพสนี้ ก็หวังว่าท่านที่ต้องการทำแบบผม กำลังมองหาวิธีการต่างๆนานา (เหมือนผม)
จะได้รับประโยชน์ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: SakDa

35
Dlookup แก้เป็นแบบนี้ครับ
โค๊ด: [Select]
=DLookUp("[100]","100100","[code] =  '" & [Reports]![scorereport]![code] & "' and [groupName] = '" & [Reports]![scorereport].[groupName] & "'")
โพสต์นี้ได้รับคำขอบคุณจาก: SakDa

36
ขอบคุณมากๆเลยครับคุณ PNR ผมทำได้แล้วครับ ขอบคุณสำหรับความช่วยเหลือทุกคำถามนะครับ :D
โพสต์นี้ได้รับคำขอบคุณจาก: SakDa

37
ใช้การกำหนด RowSource ครับ ตัวอย่าง
สมมุติ ชื่อตาราง table1
        ชื่อฟิลล์ที่นำมาแสดงชื่อรายการในคอมโบบ๊อกชื่อ NationalID


Private Sub cbPlantID_AfterUpdate()
Dim SQL As String
If Me.cbPlantID = 5 Then
SQL = "SELECT NationalID  FROM Table1;"
Else
SQL = "SELECT NationalID FROM Table1 WHERE (((PlantID)=[forms]![ชื่อฟอร์มหลัก]![cbPlantID]));"
End If
Forms![ชื่อฟอร์มหลัก]![ชื่อฟอร์มย่อย].Form.cbNationalID.RowSource = SQL
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: SakDa

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

อ้างถึง
สลับการเคลียร์ค่าระหว่างรหัสงาน กับ ชื่อ งาน คิดว่า เมื่อตอนเราสั่งคลิกบน คอมโบบ็อกซ์
รหัสงาน เสร็จให้คาไว้อยู่ ฟอร์มย่อยแสดงข้อมูล ยังไม่เคลียร์ค่าบนคอมโบบ็อกซ์ combobox jc

ใช้ Events Got_Focus ได้เลยครับ เมื่อ Cersor โฟกัสที่คอมโบบ๊อกไหนEvents ก็จะทำงาน

อ้างถึง
พอเราคลิกเลือก ชื่องาน comboBox jn ก็อยากให้ไปเคลียร์ค่า combobox jc ก่อน แล้วค่อยไปเรียกคิวรี่มาแสดง
ถ้าเราเคลียค่าของ combobox jc ก็แสดงว่า เราต้องการแสดงผลของ ชื่องานที่เราเลือก โดยไม่สนใจว่ารหัสงานอะไรใช่หรือไม่
ถ้าใช้แก้โค้ดตามด้านล่างได้เลย

แก้โค้ดเป็นแบบนี้
โค๊ด: [Select]
Private Sub jc_AfterUpdate()
MultiFilter
End Sub
Private Sub jn_AfterUpdate()
MultiFilter
End Sub
Private Sub jc_GotFocus()
Me.jn.Value = Null
End Sub
Private Sub jn_GotFocus()
Me.jc.Value = Null
End Sub
Private Sub MultiFilter()
Dim sql As String
 sql = "SELECT * FROM [Qry_Sub_F1S1] WHERE [group] Like '" & Nz(Me.gr, "*") & "' AND [Jobcode] Like '" & Nz(Me.jc, "*") & "' AND [jobname] Like '" & Nz(Me.jn, "*") & "'"
 Me.F1S1.Form.RecordSource = sql
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: SakDa

39
ลองดูครับ
โค้ดแก้เป็นแบบนี้นะครับ ที่ combobox ทั้งสามตัว

โค๊ด: [Select]
Private Sub Combo143_AfterUpdate()
MultiFilter
End Sub
Private Sub Combo150_AfterUpdate()
MultiFilter
End Sub
Private Sub Combo181_AfterUpdate()
MultiFilter
End Sub
Private Sub MultiFilter()
Dim sql As String
 sql = "SELECT * FROM [Qry_Sub_F1S1] WHERE [group] Like '" & Nz(Me.Combo150, "*") & "' AND [Jobcode] Like '" & Nz(Me.Combo143, "*") & "' AND [jobname] Like '" & Nz(Me.Combo181, "*") & "'"
 Me.F1S1.Form.RecordSource = sql
End Sub

ที่จริงถ้าจะให้สมบูรณ์ขึ้นควรจะต้องกำหนด ให้เมื่อเลือก Comboตัวแรกแล้ว ตัวต่อไปให้แสดงความตัวแรก และเมื่อเลือกตัวที่ 3 ก็ให้แสดงข้อมูลเฉพาะที่กำหนดไว้ใน คอมโบแรกกับคอมโบทีสอง
แต่ไม่ได้ทำให้ดูเพราะข้อมูลยังไม่ครบถ้วนเช่น AssignmentsGroup ไม่มีข้อมูล Field Group ถ้ามีมาครบถ้วนสามารถทำให้ได้ครับ
ส่วนการค้นหาหลายเงื่อนไขก็ดูจากตัวอย่างได้เลย


โพสต์นี้ได้รับคำขอบคุณจาก: SakDa

40
ถ้าต้องการจัดข้อความให้อยู่กึ่งกลางเซลล์ที่รวม ทั้งแนวตั้งและนอนด้วย เท่าที่คิดออกคือไปสั่งออกรายงานใน Excel แต่เขียนโค้ดเยอะทีเดียว ถ้าจะทำใน Access วิธีเท่าที่คิดออก เป็นแค่การหลอกตาเท่านั้น ข้อความในบรรทัดที่ซ้ำจะหายไปตามต้องการ แต่ข้อความจะยังคงอยู่ที่บรรทัดแรกเสมอ ไม่สามารถไปกึ่งกลางเซลล์ที่รวมได้

วิธีการคือ
- การซ่อนข้อความที่ซ้ำ ให้กำหนด Hide Duplicate property ของเท็กซ์บ็อกซ์ที่แสดง "เหตุผลที่ซื้อ" (สมมุติชื่อ txtReason) เป็น Yes แต่ข้อความนี้จะพิมพ์เสมอเมื่อเป็นบรรทัดแรกของหน้า
- การพิมพ์ขอบของเซลล์ที่รวม เราจะสร้างคอนโทรลของเส้น แทนการใช้กรอบของเท็กซ์บ็อกซ์ ดังนั้น Border Style ของ txtReason กำหนดให้เป็น Transparent ไป ให้สร้างเส้นแนวนอน lineUpper อยู่ที่ขอบบนของ txtReason และให้มีความยาวเท่ากันพอดี  เส้น lineLower วางอยู่ขอบล่าง  เส้น lineRight เป็นแนวตั้งวางอยู่ขอบขวา ส่วนขอบซ้ายคงไม่จำเป็นเพราะเท็กซ์บ็อกซ์ทางซ้ายจะพิมพ์เส้นนั้นอยู่แล้ว   เส้นทั้ง 3 ต้องจัดเลเยอร์ให้อยู่เหนือ txtReason ด้วยนะครับ
- lineUpper จะพิมพ์เมื่อ txtReason พิมพ์ (ซึ่งก็คือบรรทัดแรกของกลุ่มข้อความที่ซ้ำ) โดยเช็คได้จาก .IsVisible property
- lineLower จะพิมพ์เมื่อเป็นบรรทัดสุดท้ายในหน้า ซึ่งต้องใช้เทคนิคให้ระบบรันรายงาน 2 หน (ไม่ใช่เราสั่งพิมพ์ 2 หน) หนแรกเช็คได้จากค่า .Pages property ของ Report object จะเป็นศูนย์ เราใช้หนแรกเพื่อบันทึกว่าบรรทัดไหนเป็นบรรทัดสุดท้ายในแต่ละหน้า โดยบันทึกลงในตัวแปรอะเรย์ A  ค่าของ A(เลขที่บรรทัด) จะเป็น TRUE   ส่วนหนที่สองเพื่อตรวจกับ A ว่า ถ้าบรรทัดที่พิมพ์คือบรรทัดสุดท้ายในหน้านั้น ก็ให้พิมพ์ lineLower
- การบังคับให้ระบบรันรายงาน 2 หน ทำด้วยการสร้างเท็กซ์บ็อกซ์ที่มี Control Source เป็น =[Pages]  เอาไว้ใน Page Header section แต่เราไม่ได้ต้องการจะเห็นมัน เราก็กำหนด Visible property ของเท็กซ์บ็อกซ์ให้เป็น No 
- การที่จะรู้ว่าบรรทัดที่พิมพ์เป็นบรรทัดที่เท่าไหร่ ก็ให้สร้างเท็กซ์บ็อกซ์ txtSeq ที่มี Constrol Source เป็น =1, Running Sum property เป็น Over All และ Visible property เป็น No

อธิบายยืดยาว แต่โค้ดมีสั้นๆแค่
โค๊ด: [Select]
Option Compare Database
Option Explicit

Dim A() As Boolean

Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
    Me.lineUpper.Visible = Me.txtReason.IsVisible
    If Me.Pages <> 0 Then Me.lineLower.Visible = A(Me.txtSeq)
End Sub

Private Sub PageFooterSection_Format(Cancel As Integer, FormatCount As Integer)
    If Me.Pages = 0 Then
        ReDim Preserve A(Me.txtSeq)
        A(Me.txtSeq) = True
    End If
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: SakDa

41
ทำได้ครับ โดยการใช้คำสั่ง UPDATE sql statement โดยสมมุติชื่อต่างๆดังนี้

ตารางรายการสินค้า P
ฟิลด์รายการสินค้า ITEM
ฟิลด์ยอดคงเหลือ BALQTY

ตารางรายการเบิก I
ฟิลด์รายการสินค้า ITEM
ฟิลด์ยอดยกมา FWQTY
ฟิลด์จำนวนเบิก  ISSUEQTY
ฟิลด์ที่เป็นคีย์ที่ระบุได้ว่าเป็นรายการเบิกรายการนี้ PK เช่น เลขที่เบิก xxx

โค้ดพื้นฐานที่ใช้ก็คือ
โค๊ด: [Select]
CurrentDB.Execute "update [P] inner join [I] on [P].[ITEM] = [I].[ITEM] set [P].[BALQTY] = [I].[FWQTY] - [I].[ISSUEQTY] where [I].[PK] = xxx", dbFailOnError

หมายเหตุ :

- ถ้ายอดยกมา นำมาจากยอดคงเหลืออยู่แล้ว ก็สามารถใช้ set [P].[BALQTY] = [P].[BALQTY] - [I].[ISSUEQTY] แทนก็จะเหมาะสมกว่า

- ส่วน [I].[PK] = xxx หรือส่วนอื่นๆอีก อาจแตกต่างจากนี้ ขึ้นกับว่ามีฟิลด์อะไรบ้างที่ใช้ระบุว่าเป็นเอกสารการเบิกนี้ และค่าของมันมีประเภทข้อมูลตามที่ระบุในตารางว่าเป็น Text หรือ Number

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

42
รบกวนสอบถามคะ

เราสามารถ update ข้อมูลหลายๆ record ได้พร้อมๆกันไหมคะ

เช่น มีข้อมูล 1ชุด ฃ
ตารางรายการสินค้า

รายการสินค้า       ยอดคงเหลือ
AA                      5
BB                      6
CC                      7

แล้วสร้างตารางสำหรับดึงข้อมูลมาทำรายการเบิกโดยจะเบิกพร้อมๆกันมากกว่า 1 รายการ โดยสร้างเป็น continuous forms

โดยให้แสดง

รายการสินค้า        ยกมา        จำนวนเบิก       คงเหลือ
AA                     5                1                4
ฺฺBB                     6                2                4

แล้วกดปุ้มบันทึก ให้ยอดคงเหลือจากรายการเบิก ไปอัพเดทในยอดคงเหลือในตารางรายการสินค้า โดยอัพเดทพร้อมกันทั้ง2 รายการ โดยการกดปุ่มเพียงครั้งเดียว
รายละเอียดแบบนี้สามารถทำได้มั้ยคะ รบกวนขอคำแนะนำด้วยคะ

โพสต์นี้ได้รับคำขอบคุณจาก: SakDa

43

ใช้การสร้าง HeadGroup นะครับ
ใช้การตัดสระโดย Replace()

โค้ด
SELECT Table1.CustomerName, Left(Replace(Replace(Replace(Replace(Replace([CustomerName],"เ",""),"แ",""),"ไ",""),"ใ",""),"โ",""),1) AS GroupString, *
FROM Table1
ORDER BY Left(Replace(Replace(Replace(Replace(Replace([CustomerName],"เ",""),"แ",""),"ไ",""),"ใ",""),"โ",""),1);

กรณีถ้าอยากให้แต่ละตัวอักษรแยกหน้าออกไปเช่น หน้าที่ 1 หมวดอักษร ก หน้าที่ 2 หมวดอักษร ข
(แสดงผลในมุมมองเหมือนพิมพ์หรือ Print Preview Mode)
สามารถกำหนดค่าตามรูปด้านล่างได้เลยครับ




ลองดูตัวอย่างครับ


โพสต์นี้ได้รับคำขอบคุณจาก: SakDa

44
กำหนด Format ครับ
" รายการนำเข้า จำนวน"& Format([txtจำนวนเงิน], "Standard") &" บาท"

โค๊ด: [Select]
Format (210.6, "#,##0.00")
Result: '210.60'

Format (210.6, "Standard")
Result: '210.60'

Format (0.981, "Percent")
Result: '98.10%'

Format (1267.5, "Currency")
Result: '$1,267.50'
โพสต์นี้ได้รับคำขอบคุณจาก: SakDa

45
ตอนเลือกเสร็จ  ต้องมีคำสั่งให้ซับฟอร์มรีเฟรซ หรือ รีคิวรี่ ด้วยครับ
โพสต์นี้ได้รับคำขอบคุณจาก: SakDa

46
เพิ่มเป็นแบบนี้ครับ
โค๊ด: [Select]
Private Sub Combo0_AfterUpdate()
If Me.Combo0 = "1" Then
Me.Text1.Locked = False
Me.Text1 = "0"
Me.Text2.Locked = False
Me.Text2 = "0"
Me.Text3.Locked = False
Me.Text3 = "0"
Me.Text4.Locked = True
Me.Text4 = Null
Me.Text5.Locked = True
Me.Text5 = Null
Me.Text6.Locked = True
Me.Text6 = Null
ElseIf Me.Combo0 = "2" Then
Me.Text1.Locked = False
Me.Text1 = "0"
Me.Text2.Locked = False
Me.Text2 = "0"
Me.Text3.Locked = False
Me.Text3 = "0"
Me.Text4.Locked = False
Me.Text4 = "0"
Me.Text5.Locked = False
Me.Text5 = "0"
Me.Text6.Locked = False
Me.Text6 = "0"
ElseIf Me.Combo0 = "3" Then
Me.Text1.Locked = False
Me.Text1 = "0"
Me.Text2.Locked = False
Me.Text2 = "0"
Me.Text3.Locked = True
Me.Text3 = Null
Me.Text4.Locked = True
Me.Text4 = Null
Me.Text5.Locked = True
Me.Text5 = Null
Me.Text6.Locked = True
Me.Text6 = Null
Else
Me.Text1.Locked = True
Me.Text1 = Null
Me.Text2.Locked = True
Me.Text2 = Null
Me.Text3.Locked = True
Me.Text3 = Null
Me.Text4.Locked = True
Me.Text4 = Null
Me.Text5.Locked = True
Me.Text5 = Null
Me.Text6.Locked = True
Me.Text6 = Null
End If
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: SakDa

47
ขอบคุณครับ ตั้งตารอเลยครับ
โพสต์นี้ได้รับคำขอบคุณจาก: SakDa

48
Work order คือชื่อฟิลล์ คับจากโค้ดน่าจะเป็น string ครับ
ส่วน  Like '*'" คือแสดงทั้งหมด

ถ้าอยากสร้างการค้นหาแบบหลายเงื่อนไขลองแบบนี้

Dim sql As String
    sql = "SELECT * FROM [ชื่อตาราง] WHERE [รหัสงาน] Like '" & Nz(Me.cbWorkID, "*") & "' AND [กลุ่มที่ทำ] Like '" & Nz(Me.cbGroupWork, "*") & "' AND [วันส่งงาน] Like '" & Nz(Me.txtWorkSendDate, "*") & "'"
    Forms![ชื่อฟอร์ม].RecordSource = sql

หรือถ้ายังไม่ค่อยเข้าใจ ให้ทำตัวอย่างข้อมูลส่งไฟล์เข้ามาเดี่ยวเพิ่มโค้ดให้นะ

โพสต์นี้ได้รับคำขอบคุณจาก: SakDa

หน้า: 1 2 [3] 4 5 6 7