เชื่อมฟิวด์ใน Query
กระทู้เก่าบอร์ด อ.Yeadram

 2,812   20
URL.หัวข้อ / URL
เชื่อมฟิวด์ใน Query

Shipment     Customer             Province         Invoice             umbering              Expr4
193               โฮมโปรดักส์           พิษณุโลก               BE                31404                โฮมโปรดักส์(พิษณุโลก) : BE-31404

193               โฮมโปรดักส์             พิษณุโลก             BE                 31405      โฮมโปรดักส์(พิษณุโลก) : BE-31405

193                โฮมโปรดักส์            พิษณุโลก            BE                  31406           โฮมโปรดักส์(พิษณุโลก) : BE-31406

193                ไทยดำรงค์             พิษณุโลก            S2E                 3035        ไทยดำรงค์(พิษณุโลก) : S2E-3035

จากข้อมูลด้านบน ผมทำใน Query ผมใช้   "&"   เชื่อมฟิวด์ ได้ดังนี้ครับ

Expr4: [customer] & "(" & [Province] & ")" & " : " & [Invoice] & "-" & [Numbering]

ตอนนี้ผมติดตรงที่ว่า
ผมจะ Group By "Shipment" เพื่อให้ได้ข้อมูลเป็น

Shipment        Expr1
193                 โฮมโปรดักส์(พิษณุโลก) : ฺBE-31404,BE-31405,BE-31406 ; ไทยดำรงค์(พิษณุโลก) : S2E-3035

ผมยังทำไม่ได้เลยครับ
รบกวนทุกๆท่านด้วยครับ
ขอบคุณครับ

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

1 @R18469
ต้องเขียน Function วน loop ต่อ string ครับ
คงต้องรอท่านที่ code เก่ง และ มีเวลาพอเข้ามาตอบครับ
2 @R18471
ขอบคุณอาจารย์พิชัยครับ
3 @R18484
4 @R18485
ลองอีกที
5 @R18486
เอาเป็นว่าผมทำรูปไม่ขึ้นแต่ได้ลองเขียน VBA ดูได้ผลออกมาแต่ยังไม่ได้ลองว่าถ้าเจอจำนวนข้อมูลเยอะขึ้นมันจะทำงานได้ไหมนะครับ

ถ้าสนใจก็ส่งเมล์มาที่ somjate.s@hotmail.com ผมจะส่งไฟล์ที่ทำไว้ไปให้ครับ
6 @R18487
ไฟล์ส่งไปไว้ที่เมล์กลางแล้วครับ

accboard@gmail.com
7 @R18490
แก้ไขตรงนี้เพิ่มครับ

'ให้ใส่ msg เพิ่มครับ
' Debug.Print ChkCusBef & ">>>>>>>>>>>>" & ChkCusAT
msg = msg & ";" & Expr & ":" & Expr1
8 @R18493
คุณ sjs ครับ

      ผมลองทำดูแล้วครับ มันติด Debug บรรทัดนี้ครับ

Set Rst2 = Db.OpenRecordset(sql2, dbOpenDynaset)

ผมได้ส่งไฟล์งานไปให้ คุณ sjs ตาม email แล้วนะครับ
ขอบคุณมากครับ
9 @R18494
จากที่ผมดูในไฟล์ที่ส่งมามี 3 จุดที่ต้องแก้คือ
1.ใน Set Rst2 = Db.OpenRecordset(sql2, dbOpenDynaset) เป็นเพราะว่าค่าเป็น Number ไม่ใช่ String ตามที่ผมใส่ไว้ครับต้องแก้เครื่องหมายให้เป็น Number ครับ.
2.    Do While Not Rst2.EOF
                            MixStr2 = Rst2.Fields("Invoice").Value & "-" & Rst2.Fields("umbering").Value -- > อันนี้ชื่อไม่ตรงกับฟิลด์ในตารางครับ
3. ฟิลด์ Customer ตารางที่อ้างถึงยังมีค่าว่างอยู่ถึงถ้าเขียนใน VBA ต้องใส่เงื่อนไขเอาค่าที่ว่างออกครับผม
10 @R18495
Test ครับ
11 @R18496
เรียน คุณ sjs ครับ
ผมลองแก้ไขตามข้อมที่ 1 แล้ว ผลออกมาเป็นแบบนี้ึครับ

12 @R18500
ถ้าตาราง (สมมุติชื่อ Table1) เป็นดังนี้:

Shipment     Customer             Province        Invoice             umbering 193               โฮมโปรดักส์           พิษณุโลก               BE               31404
193               โฮมโปรดักส์             พิษณุโลก             BE                 31405
193               โฮมโปรดักส์            พิษณุโลก            BE                  31406
193               ไทยดำรงค์             พิษณุโลก            S2E                 3035

1. สร้างฟังก์ชั่นใน Module ดังนี้:
Function ConcatRelated(expression$, domain$, criterial$)
    Dim rs As Recordset
    Dim SQLCmd$, ConCat1$, ConCat2$, Temp1$, Temp2$

    SQLCmd = "SELECT " & expression$ & " FROM " & domain$ & " WHERE " & criterial$ & " ORDER BY " & expression$
    Set rs = CurrentDb.OpenRecordset(SQLCmd)
    
    If Not rs.EOF Then rs.MoveFirst

    Temp1 = rs(0) & rs(1)
    ConCat1 = rs(0) & "(" & rs(1) & ")"
    
    Do While Not rs.EOF
        If Temp1 <> rs(0) & rs(1) Then
            ConCat1 = ConCat1 & ": " & ConCat2
            ConCat2 = rs(2) & "-" & rs(3)
            ConCat1 = ConCat1 & "; " & rs(0) & "(" & rs(1) & ")"
        Else
            If ConCat2 & "" = "" Then
               ConCat2 = rs(2) & "-" & rs(3)
            Else
               If Temp2 <> rs(2) & rs(3) Then
                    ConCat2 = ConCat2 & ", " & rs(2) & "-" & rs(3)
               End If
            End If
        End If
        Temp1 = rs(0) & rs(1)
        Temp2 = rs(2) & rs(3)
        rs.MoveNext
    Loop
    
    If ConCat1 & "" <> "" Then
        ConcatRelated = ConCat1 & "; " & ConCat2
    End If
    rs.Close: Set rs = Nothing
End Function


2. สร้างคิวรี่ใหม่ ใส่ SQL ดังนี้:
SELECT Shipment, ConcatRelated("Customer, Province, Invoice, umbering","Table1","Shipment=" & [Shipment]) AS Expr1
FROM Table1
GROUP BY Shipment
ORDER BY Shipment;


ผลลัพธ์: 193 ไทยดำรงค์(พิษณุโลก): S2E-3035; โฮมโปรดักส์(พิษณุโลก); BE-31404, BE-31405, BE-31406

ประมาณนี้ ลองปรับใช้ดูครับ ผมคงไม่มีเวลาตามกระทู้เท่าไหร่ยังไงหากติดขัดลองถามท่านอื่นๆดูนะครับ

ปล. Data Type ในส่วนของฟิลด์ ผมไม่รู้คุณกำหนดเป็นอะไร แต่จากตัวอย่างฟิลด์ที่มีแต่ตัวเลขผมกำหนดเป็น Number ทั้งหมด
13 @R18501
ของผมรันในไฟล์ที่คุณ อภิศักดิ์ ส่งมาก็เป็นตัวเลขที่เก็บไว้เหมือนกันครับ
ผมว่าน่าจะใช้ Dlookup ช่วยดึงชื่อมาแสดงแทนรหัสก็ได้นะครับคือจะใส่ใน Code VBA ก็ได้ใน Query ก็ได้มีให้เลือกได้หลายทางเอาทางที่คุณ อภิศักดิ์ เข้าใจก็ได้ครับ
14 @R18502
อื่ม เดาว่า ตารางมีการสร้างความสัมพันธ์ (Relationships) กับตารางอื่นๆ เช่น ฟิลด์ Customer สัมพันธ์กับตาราง tb_Customer และฟิลด์ Province สัมพันธ์กับตาราง tb_Province และฟิลด์ Invoice สัมพันธ์กับตาราง tb_Invoice อะไรประมาณนี้ ซึ่งผมก็คงไม่รู้รายละเอียดข้อมูลคุณ การแก้ไขง่ายสุดคือ สร้างคิวรี่ขึ้นใหม่โดยดึงฟิลด์จากตารางอื่นๆที่สร้างความสัมพันธ์กันไว้เพื่อแสดงตารางที่มีข้อมูลให้ตรงตามความต้องการก่อน โดยสมมุติใช้ชื่อ Query1 แล้วค่อยนำชื่อคิวรี่ Query1 ไปใช้แทนชื่อ Table1 ต่อไป
15 @R18509
ตามที่ คุณ TTT เดาเลยครับ แต่เหมือนว่าข้อมูลไม่เป็นปัจจุบันนะครับ ผมลองแก้ไข เพิ่มเติม ข้อมูลไม่เปลี่ยนแปลงเลยครับ ผมขอเพิ่มเติมข้อมูลของผมนะครับ

- ตารางเดิมชื่อ tblTransport ฟอร์มชื่อ frmTransport

-ผมทำตาม R18502 สร้าง Query4 ข้อมูลไปเก็บไว้ที่ Table1 แล้วสร้าง Query5

SELECT Shipment, ConcatRelated("Customer, Province, Invoice, umbering","Table1","Shipment=" & [Shipment]) AS Expr1

FROM Table1

GROUP BY Shipment

ORDER BY Shipment;

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

- หากตาราง Table1 มีการสร้างความสัมพันธ์ (Relationships) กับตารางอื่นๆ เช่น ฟิลด์ Customer สัมพันธ์กับตาราง tb_Customer และฟิลด์ Province สัมพันธ์กับตาราง tb_Province และฟิลด์ Invoice สัมพันธ์กับตาราง tb_Invoice

- โดยตาราง Table1 เก็บข้อมูลในลักษณะแบบตัวเลขดังนี้:
-------------------------------------------------------------------------
Shipment   Customer     Province    Invoice    umbering
-------------------------------------------------------------------------
193                  1                    1             1            31404
193                  1                    1             1            31405
193                  1                    1             1            31406
193                  2                    1             2              3035
194                  1                    2             3            61991
194                  1                    2             4            61991
------------------------------------------------------------------------
- ฟิลด์ Customer ในตาราง Table1 สัมพันธ์กับตาราง tb_Customer.ID ดังนี้:
---------------------
ID    Customer
---------------------
1     โฮมโปรดักส์
2     ไทยดำรงค์
---------------------

- ฟิลด์ Province ในตาราง Table1 สัมพันธ์กับตาราง tb_Province.ID ดังนี้:
-------------------
ID    Province
-------------------
1     พิษณุโลก
2     กรุงเทพฯ
-------------------

- ฟิลด์ Invoice ในตาราง Table1 สัมพันธ์กับตาราง tb_Invoice.ID ดังนี้:
------------------
ID    Invoice
------------------
1        BE
2       S2E
3       B2K
4       B2K
------------------
ดังนั้นหากเราใช้การอ้างถึง Table1 อย่างเดียวเหมือนตัวอย่างด้านบนโดยเขียน SQL เหมือนเดิมดังนี้:
-------------------------------------------------------------------------------------------------------------------
SELECT Shipment, ConcatRelated("Customer, Province, Invoice, umbering","Table1","Shipment=" & [Shipment]) AS Expr1
FROM Table1
GROUP BY Shipment
ORDER BY Shipment;
-------------------------------------------------------------------------------------------------------------------
ผลลัพธ์ที่ได้จะเป็น:
-------------------------------------------------------------------------
Shipment                            Expr1
-------------------------------------------------------------------------
193          1(1): 1-31404, 1-31405, 1-31406; 2(1): 2-3035
194          1(2): 3-61991, 4-61991
-------------------------------------------------------------------------

- แต่หากเราต้องการผลลัพธ์ที่แสดงเป็นข้อความในฟิลด์จากตารางอื่นที่เราสร้าง Relationships ไว้แล้ว สามารถทำได้ 2 วิธีคือ:

1. สร้างคิวรี่ขึ้นใหม่เพื่อแสดงตารางที่มีข้อมูลให้ตรงตามความต้องการก่อน โดยสมมุติใช้ชื่อ Query1 แล้วค่อยนำชื่อคิวรี่ Query1 ไปใช้แทนชื่อ Table1

- สร้างคิวรี่ใหม่โดยเขียน SQL ดังนี้:
-------------------------------------------------------------------------------------------------------------------
SELECT Table1.Shipment, tb_Customer.Customer, tb_Province.Province, tb_Invoice.Invoice, Table1.umbering
FROM tb_Invoice INNER JOIN (tb_Province INNER JOIN (tb_Customer INNER JOIN Table1 ON tb_Customer.ID = Table1.Customer) ON tb_Province.ID = Table1.Province) ON tb_Invoice.ID = Table1.Invoice;
-------------------------------------------------------------------------------------------------------------------
- คิวรี่ Query1 จะได้ผลลัพธ์แสดงตารางดังนี้:
-----------------------------------------------------------------------------------
Shipment   Customer     Province    Invoice    umbering
-----------------------------------------------------------------------------------
193        โฮมโปรดักส์            พิษณุโลก               BE          31404
193        โฮมโปรดักส์            พิษณุโลก               BE          31405
193        โฮมโปรดักส์            พิษณุโลก               BE          31406
193        ไทยดำรงค์            พิษณุโลก              S2E           3035
194        โฮมโปรดักส์            กรุงเทพฯ                 BK          61991
194        โฮมโปรดักส์            กรุงเทพฯ               B2K          61991
-----------------------------------------------------------------------------------
- จากนั้นสร้าง SQL ขึ้นใหม่อีกตัว แล้วเขียน SQL statement โดยใช้ชื่อ Query1 แทน Table1 ดังนี้:
-------------------------------------------------------------------------------------------------------------------
SELECT Shipment, ConcatRelated("Customer, Province, Invoice, umbering","Query1","Shipment=" & [Shipment]) AS Expr1
FROM Table1
GROUP BY Shipment
ORDER BY Shipment;
-------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------
Shipment                                      Expr1
-----------------------------------------------------------------------------------------
193          ไทยดำรงค์(พิษณุโลก): S2E-3035; โฮมโปรดักส์(พิษณุโลก); BE-31404, BE-31405, BE-31406
194          โฮมโปรดักส์(กรุงเทพฯ); B2K-61991, BK-61991
-----------------------------------------------------------------------------------------

17 @R18511
2. แทนชื่อ Table1 โดยการเขียนเป็นซับคิวรี่แทน วิธีนี้จะรวบลัดไม่ต้องสร้างคิวรี่ใหม่

- เขียน SQL statement โดยใช้ซับคิวรี่แทนชื่อ Table1 ดังนี้:
------------------------------------------------------------------------------------------------------------------------
SELECT Shipment, ConcatRelated("Customer, Province, Invoice, umbering","(SELECT Table1.Shipment, tb_Customer.Customer, tb_Province.Province, tb_Invoice.Invoice, Table1.umbering FROM tb_Invoice INNER JOIN (tb_Province INNER JOIN (tb_Customer INNER JOIN Table1 ON tb_Customer.ID = Table1.Customer) ON tb_Province.ID = Table1.Province) ON tb_Invoice.ID = Table1.Invoice)","Shipment=" & [Shipment]) AS Expr1
FROM Table1
GROUP BY Shipment
ORDER BY Shipment;
------------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------
Shipment                                      Expr1
-----------------------------------------------------------------------------------------
193          ไทยดำรงค์(พิษณุโลก): S2E-3035; โฮมโปรดักส์(พิษณุโลก); BE-31404, BE-31405, BE-31406
194          โฮมโปรดักส์(กรุงเทพฯ); B2K-61991, BK-61991
-----------------------------------------------------------------------------------------

ลองปรับใช้ดูนะครับ
18 @R18526
ขอบคุณครับ คุณ TTT ผมทำตามวิธีที่ 1 ได้แล้วครับ ตอนนี้ลองทำวิธีที่ 2 อยู่ครับ
ผมขอถามเพิ่มเติมครับ
-ใน Query นี้
SELECT Shipment, ConcatRelated("Customer, Province, Invoice, umbering","Query1","Shipment=" & [Shipment]) AS Expr1
FROM Table1
GROUP BY Shipment
ORDER BY Shipment;

ถ้าผมจะเลือกใช้เฉพาะฟิวด์ "Shipment , Customer , Province"
ได้หรือไม่ครับ (ผมลองเอาฟิวด์ "Invoice , umbering" ออก มันฟ้องว่า "Run time error'3265': ไม่พบรายการในคอลเลกชั่นนี้"



ขอบคุณครับ
19 @R18539
หมายถึงคุณต้องการให้แสดงออกมาแค่ฟิลด์ Customer และ Province อย่างนี้ใช่ป่าว

193          ไทยดำรงค์(พิษณุโลก); โฮมโปรดักส์(พิษณุโลก)

ถ้าใช้ก็ต้องเขียนฟังก์ชั่นแบบนี้แทนครับ

Function ConcatRelated2(expression$, domain$, criterial$)
    Dim rs As Recordset
    Dim SQLCmd$, ConCat$, Temp$

    SQLCmd = "SELECT " & expression$ & " FROM " & domain$ & " WHERE " & criterial$ & " ORDER BY " & expression$
    Set rs = CurrentDb.OpenRecordset(SQLCmd)
    
    If Not rs.EOF Then rs.MoveFirst

    Temp = rs(0) & rs(1)
    ConCat = rs(0) & "(" & rs(1) & ")"
    
    Do While Not rs.EOF
        If Temp <> rs(0) & rs(1) Then
            ConCat = ConCat & "; " & rs(0) & "(" & rs(1) & ")"
            Temp = rs(0) & rs(1)
        End If
        rs.MoveNext
    Loop
    
    If ConCat & "" <> "" Then
        ConcatRelated2 = ConCat
    End If
    rs.Close: Set rs = Nothing
End Function
20 @R18555
ขอบคุณมากครับ คุณ TTT สำหรับความช่วยเหลือทั้งหมดนี้ สำเร็จไปอีก 1 งาน
และก็ขอขอบคุณ อาจารย์พิชัย และคุณ sjs ด้วยนะครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2148s