แสดงกระทู้

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 - pattan0013

หน้า: 1 2 [3] 4
37
Query มีทั้งแบบที่ Update ข้อมูลได้ และไม่ได้ครับ ขึ้นอยู่กับประเภทและความสัมพันธ์ของตารางหรือคิวรีที่นำมาสร้างคิวรี

เช่น Crosstab Query หรือ Total Query แบบนี้จะ Update ไม่ได้
หรือ Select Query ที่มีการเชื่อมโยงข้อมูลจากหลายๆ ตาราง ก็มีโอกาสที่ไม่สามารถแก้ไขได้ครับ

วิธีแก้ไขคือสร้างคิวรีแบบ 1:1 ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: pattan0013

38
ใช้ Append Query ครับ
โดยกำหนด JobNo = Forms![ชื่อฟอร์ม]![JobNo]
และกำหนดฟิลล์ให้มันก็ได้แล้วครับ
โพสต์นี้ได้รับคำขอบคุณจาก: pattan0013

39
น่าจะแบบนี้นะครับงั้น
จากตาราง



ในคิวรี่

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

40
สร้างแบบเดียวกันครับ แต่สร้าง Union Query อีกตารางหนึ่ง เพราะข้อมูลที่ได้ต้องแยกกัน แต่สามารถรวมกันแสดงภายหลังได้จาก JobNo ครับ

โดยต้องปรับเปลี่ยน เอา IS NOT Null ออกทั้ง 2 คิวรี่เลยนะครับ เพราะเราต้องเก็บ JobNo ทั้งหมดของทั้ง TruckNo และ TruckOwn ไว้สร้างความสัมพันธ์กัน
โดยตัวรายงานต้องปรับเปลี่ยนเล็กน้อย โดยกำหนดแหล่งระเบียนสำหรับรายงานนี้ใหม่ครับตามตัวอย่าง
โพสต์นี้ได้รับคำขอบคุณจาก: pattan0013

41
Truck Owner 1-10 คือฟิลล์ที่อยู่ใน tblTruck_Imp เหมือนกับ truck no 1 หรือเปล่าครับ
หรือ อยู่ในตารางอื่นๆ อธิบายเพิ่มหน่อยหรือมีภาพด้วยก็ดี
โพสต์นี้ได้รับคำขอบคุณจาก: pattan0013

42
วิธีนี้ใช้ Union Query นะครับ โดยจับกลุ่ม Jobno ตาม Truck No 1 - 10 ที่มี โดยถ้าเป็นช่องว่างๆ ไม่มีข้อมูลก็จะไม่นำมาแสดง
ตัวอย่างโค้ด
โค๊ด: [Select]
select Jobno,[truck no 1] as TruckNo from tbltruck_imp WHERE [truck no 1] IS NOT NULL
Union
Select Jobno,[truck no 2] from tbltruck_imp WHERE [truck no 2] IS NOT NULL
Union
Select Jobno,[truck no 3] from tbltruck_imp WHERE [truck no 3] IS NOT NULL
Union
Select Jobno,[truck no N] from tbltruck_imp WHERE [truck no [N] IS NOT NULL;
์N คือ Field TruckNo N ที่มี ต่อลงมาเรื่อยๆ
เราจะได้ผลลัพธ์ ตามคิวรี่ชื่อ
UnionTruck_Imp


อ้างถึง
TruckNo นี้ใช้ใน JobNo อะไรบ้าง?
ที่ตัวรายงาน เราใช้การจัดกลุ่ม และใช้  TruckNo เป็น HeadGroup
และนำ Jobno มาวางไว้ในส่วน Detail เพื่อแสดง JobNo ตาม TruckNo ครับ

อ้างถึง
Truck นี้ใช้งานกี่งาน??
เมื่อได้คิวรี่ Union แล้วก็ใช้การ Count เพื่อนับจำนวนของ JobNo โดยลำดับตาม TruckNo ที่มี
โค๊ด: [Select]
SELECT UnionTruck_Imp.TruckNo, Count(UnionTruck_Imp.Jobno) AS จำนวนงาน
FROM UnionTruck_Imp
GROUP BY UnionTruck_Imp.TruckNo;
ลองดูการแสดงผลจากตัวอย่างนะครับ ถ้าต้องการแสดงแบบไหนอีกจะทำตัวอย่างให้ดูเน้อ :cool:

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

43
UNION QUERY เพื่อจับกลุ่ม Truck 1 ถึง 10 ครับ และ JopNo
ตัวอย่างเดี่ยวทำให้ดูเน้อ
โพสต์นี้ได้รับคำขอบคุณจาก: pattan0013

44
ใช้วิธีการซ่อน Control ต่างๆ ที่อยู่ในแต่ละ Area ของฟอร์มดูนะครับ  วิธีง่ายๆ ตามด้านล่างนี้ครับ
==================================================
เพิ่มปุ่ม Command เข้าไปในฟอร์ม 4 ปุ่ม
Name:    cmdShowAll  |  cmdShowA1 | cmdShowA2   |  cmdShowA3
Caption:  [Show All]    |   [Show #1]  |  [Show #2]    |   [Show #3]

และที่ Control แต่ตัว เฉพาะใน Area 1, 2 และ 3 ให้ระบายรวบ ทุกๆ Control ใน Area นั้นๆ
     แล้วเปลี่ยน Properties ที่ชื่อว่า tag เป็นตัวเลข 1, 2 และ 3 ตามแต่ละ Area
     ส่วน Control อื่นๆ ที่ต้องพิมพ์ทุกๆครั้ง ไม่ต้องระบุครับ
เมื่อคลิกปุ่มหนึ่งปุ่มใดใน 4 ปุ่ม นี้ จะทำการซ่อน/แสดง Control ตาม Area
หลังจากที่ซ่อนแล้ว สามารถสั่งพิมพ์ฟอร์มได้ต่างต้องการครับ
----------------------------------------------------------------------------------------

Option Compare Database
Option Explicit


Sub ShowForm(Optional ShowArea As Byte = 0)
   'ซ่อน/แสดง Control
   Dim ctl As Control
   Dim ShowMe As Boolean
   
   'ShowArea = 0 is Show All
   
   'ย้ายโฟกัสมาที่ Control ตัวอื่นก่อน กัน Error ขณะซ่อน Control ที่โฟกัสอยู่
   txtDATE.Tag = ""
   txtDATE.SetFocus
   'วนซ่อน Control
   For Each ctl In Me.Controls
        If ShowArea = 0 Or ctl.Tag = "" Or ctl.Tag = ShowArea Then
           'Show All | Show for No Tag | Show for Matching Area
           ctl.Visible = True
        Else
           ctl.Visible = Fase
        End If
       
   Next ctl
   
   'ซ่อนปุ่มคำสั่ง Show ต่างๆ
   cmdShowAll.Visible = False
   cmdShowA1.Visible = False
   cmdShowA2.Visible = False
   cmdShowA3.Visible = False
   '4 ปุ่มนี้ แสดงเมื่อ Form_load หรือ Detail_DblClick
End Sub

Private Sub cmdShowAll_Click()
   ShowForm
End Sub

Private Sub cmdShowA1_Click()
  Call ShowForm(1)
End Sub

Private Sub cmdShowA2_Click()
  Call ShowForm(2)
End Sub

Private Sub cmdShowA3_Click()
  Call ShowForm(3)
End Sub


Private Sub Detail_DblClick(Cancel As Integer)
   'คลิกๆ ที่ว่าง (Form Detail) เพื่อแสดงปุ่มที่ซ่อนไป
   cmdShowAll.Visible = True
   cmdShowA1.Visible = True
   cmdShowA2.Visible = True
   cmdShowA3.Visible = True
End Sub

----------------------------------------------------------------------------------------


ลองปรับใช้ดูนะครับ
ูู๋^J^
โพสต์นี้ได้รับคำขอบคุณจาก: pattan0013

45
จากเดิมอักษรย่อกลุ่มคือ TEX SEX และ AEX ซึ่งนับได้ 3 ตัวอักษร
ท่านใช้ TE, SE และ AE ซึ่งนับได้ 2 ตัวอักษร ดังนั้นแก้เลขตัวนี้ครับ
X = DMax("Right(JobNo,4)", "[Export_Booking_Table]", "Left([JobNo],6) = cmbG & Left([txtDate2], 4)")

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

46
ไฟล์ฉบับเหมือนจะง่ายไม่ผูกอะไรครับ :shout:
จากกระทู้เก่าท่านเห็นมี Value แยกหมวดอยู่ผมเลยแอบเอามาใส่ในนี้ให้มีเป็นแนวด้วยนะครับ หรือก็คือ ID จะรันแยกหมวดและปีเดือนครับ(แต่ Table2 จะไม่เทพอย่างท่าน PNR )
โค๊ด: [Select]
Private Sub cmd_QuNew_Click()
If IsNull(cmbG) Then
    Me.cmbG.SetFocus
    MsgBox "เลือกกลุ่ม"
Else
    Me.txtID = AutotxtID
End If
End Sub

Function AutotxtID() As String
Dim X As Variant
Dim bk, cmbG As String
    cmbG = Me.cmbG
    X = DMax("Right(ID,4)", "[Table1]", "Left([ID],7) = cmbG & Left([txtDate2], 4)")
    If IsNull(X) Then bk = 1 Else bk = X + 1
    AutotxtID = cmbG & Left([txtDate2], 4) & Format(bk, "0000")
End Function

หรือตัวอย่างของท่าน PNR มีระบบผูกตาราง,คิวรี่,ฯลฯ
https://www.thai-access.com/index.php?topic=1063.msg4744#msg4744
โพสต์นี้ได้รับคำขอบคุณจาก: pattan0013

47
ได้ข้อมูลมาจากเฟสบุ๊กเพจ "โปรแกรมเมอร์ไทย Thai programmer" ครับ

https://goalkicker.com/?fbclid=IwAR1TjcRyaWd6r_xdj510qNJOu_3B2c9EV_AWjkJ0_lyZqxdBS3bYFHCZERo

แนะนำเพิ่มเติมว่า สำหรับคนที่ชอบเขียนโปรแกรม ให้ศึกษาวิชา Data Structure (ส่วนนึงอยู่ในหนังสือ Algorithms) และ Algorithms เพราะจะช่วยให้ขยับโลกทัศน์ในการวิเคราะห์และหาวิธีตอบโจทย์ที่ซับซ้อนยิ่งขึ้นได้
โพสต์นี้ได้รับคำขอบคุณจาก: pattan0013

48
ระบบรันเลขที่ในเว็บมีเยอะเลยค้นหาดูก่อนครับ เพียงแต่เขาจะรันหรือทำงานบนฟอร์มกันซะส่วนใหญ่นะ :yuush:
โพสต์นี้ได้รับคำขอบคุณจาก: pattan0013

49
ลองดูวิธีการของเขานะครับ (ไม่รู้เวิร์กไหม)
http://accesshosting.com/create-login-form-ms-access
โพสต์นี้ได้รับคำขอบคุณจาก: pattan0013

50
ได้ครับ ต้องสร้างระบบ Login แล้วเช็คว่าผู้ใช้คนนี้อยู่แผนกไหน ก็ให้เห็ยเฉพาะข้อมูลของแผนกตัวเอง
โพสต์นี้ได้รับคำขอบคุณจาก: pattan0013

51
ความคิดผมอยากทำ Form 1 หน้าแล้วมี Textbox หรือ ช่องเลือกวัน 2 ช่องให้ใส่วันที่ต้องการเริ่มต้นหากับวันสุดท้ายที่ต้องการหาแล้วให้ Query ออกมาเป็น DataSheet ข้อมูลที่ต้องการ ไม่ทราบว่า Criteria ใน Query สามารถทำได้ไหมครับ???
สามารถทำได้ครับ  แนวทางที่คิดมาถูกต้องแล้ว

ผมสมมุติ ฟิลล์ ชื่อ OpenJobs นะครับ
มี textbox 2 ตัวชื่อ txtStartDate กับ txtEndDate
บน form ชื่อ form1

ที่ฟิลล์  OpenJobs ใส่ Criteria ว่า
Between Forms!Form1!txtStartDate And Forms!form1!txtEndDate

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

52
ห้อง MS Access / : การรันเลขสัญญา
« เมื่อ: 05 ม.ค. 63 , 15:03:07 »
เพิ่มเติมนิดหน่อยจากอันเดิมครับ คือเราจะสร้าง Field YearStamp ไว้ในตารางด้วย โดยเราจะกำหนด Year(Now()) เพื่อเก็บปีไว้ทุกครั้ง ถ้าโปรแกรมตรวจเจอว่า ข้อมูล Field YearStamp นั้น เป็นปีใหม่และยังไม่มีเลขที่รันลำดับมาก่อน (มาจาก QryMaxInt) ก็จะเริ่มนับใหม่ทันที

โดยผมจะเพิ่ม textbox ชื่อ txtYears ไว้เก็บปีปัจจุบันไว้อ้างอิงกับข้อมูลเดิมที่มีอยู่ใน Query MaxInt
โค้ดประมาณนี้

โค๊ด: [Select]
Private Sub cmdRun_Click()
Dim intMax As Integer

    If Not IsNull(Me.RunC) Then
    Me.txtYears = Year(Now())
    Me.Dirty = False
    intMax = Nz(DLookup("MaxInt", "QryMaxInt", "RunC = " & Me.RunC & " And  Yearstamp = '" & Me.txtYears & "'"))
    intMax = intMax + 1
    Me.runrun = "C-" & Year(Date) & "-" & RunC & Right("0000" & intMax, 4)
    End If   
End Sub

ส่วนในคิวรี่ชื่อ QryMax กับ QryMaxInt ก็นำฟิลล์ YearStamp ใส่ลงไปด้วยเพื่อใช้ในการแยกข้อมูลระหว่างปีเก่าและปีใหม่ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: pattan0013

53
ห้อง MS Access / : การรันเลขสัญญา
« เมื่อ: 23 ธ.ค. 62 , 10:48:28 »
ลองดูไม่รู้ต้องการแบบนี้ไหม

ขั้นตอนที่ 1 สร้างคิวรี่ ตั้งชื่อว่า QryMax
โค้ด
โค๊ด: [Select]
SELECT Table1.RunC, Nz(Max(Right([runrun],4)),0) AS [Max]
FROM Table1
GROUP BY Table1.RunC;

ขั้นตอนที่ 2 สร้างคิวรี่ ตั้งชื่อว่า QryMaxInt
โค้ด
โค๊ด: [Select]
SELECT qryMax.RunC, Val([Max]) AS MaxInt
FROM qryMax;

ที่ฟอร์ม ปุ่ม Run ใส่โค้ด
โค๊ด: [Select]
Private Sub cmdRun_Click()
Dim intMax As Integer
    If Not IsNull(Me.RunC) Then
    Me.Dirty = False
    intMax = Nz(DLookup("MaxInt", "QryMaxInt", "RunC = " & Me.RunC & ""))
    intMax = intMax + 1
    Me.runrun = "C-" & Year(Date) & "-" & RunC & Right("0000" & intMax, 4)
    End If
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: pattan0013

54
ห้อง MS Access / : รันเลขที่ใบเสร็จ
« เมื่อ: 07 ส.ค. 62 , 12:39:34 »
ได้ไม่ได้ก็แจ้งความก้าวหน้าด้วยนะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: pattan0013

หน้า: 1 2 [3] 4