แสดงกระทู้

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 - ปิ่นณรงค์

หน้า: 1 ... 19 20 21 [22] 23 24 25 ... 32
379
ขอบคุณค้า อันแรกทำได้แล้วค่ะ เหลือแสดงวันที่ค่ะ
ทำคิวรี่แรกก่อนแบบนี้ครับ

โค๊ด: [Select]
SELECT format(StockDate,"DD-MMM"), Takein, TakeOut, Balance
FROM StockBefore
UNION SELECT format(StockDate,"DD-MMM"), Takein, TakeOut,  '' as Balance
FROM StockCard;

อันตอนต่อไป กำหนด วันที่ โดยรันวันที่ลงมา ผมใช้ การสร้างตาราง ขึ่นมามี 365 วัน ตัวอย่างคำสั่ง สร้างตารางที่จะเก็บไว้ชื่อ TempDate365 ตั้งชื่อ Field ว่า Stockdate
บน Module
โค๊ด: [Select]
Option Compare Database
Public Sub MakeDate365(Optional ByVal pYear As Integer, _
        Optional ByVal pTable As String = "TempDate365", _
        Optional ByVal pField As String = "Stockdate")
    Dim db As DAO.Database
    Dim dte As Date
    Dim dteLast As Date
    Dim intYear As Integer
    Dim rs As DAO.Recordset
    Dim strMsg As String

On Error GoTo ErrorHandler

    intYear = IIf(pYear = 0, Year(Date), pYear)
    dte = DateSerial(intYear, 1, 1)
    dteLast = DateSerial(intYear, 12, 31)

    Set db = CurrentDb
    Set rs = db.OpenRecordset(pTable, dbOpenTable, dbAppendOnly)

    Do While dte <= dteLast
        rs.AddNew
        rs.Fields(pField).Value = dte
        rs.Update
        dte = dte + 1
    Loop
    rs.Close

ExitHere:
    On Error GoTo 0
    Set rs = Nothing
    Set db = Nothing
    Exit Sub

ErrorHandler:
    strMsg = "Error " & Err.Number & " (" & Err.Description _
        & ") in MakeDate365"
    MsgBox strMsg
    GoTo ExitHere
End Sub



สร้างคิวรี่ใหม่ ชื่อ  StockQuery2
กำหนดค่าดังนี้
โค๊ด: [Select]
SELECT TempDate365.StockDate, IIf(IsNull([Takein]),0,[Takein]) AS Take_in, IIf(IsNull([Takeout]),0,[Takeout]) AS Take_out, (select  [BeforeQty] from [StockBeforeQuery] ) AS Before_Qty
FROM StockQuery RIGHT JOIN TempDate365 ON StockQuery.StockDate = TempDate365.StockDate
WHERE (((TempDate365.StockDate) Between [forms]![Main]![StockBefore] And [forms]![Main]![EndDate]));

ที่คิวรี่ตัวต่อไป ชื่อ StockQuery3
โค๊ด: [Select]
SELECT T1.[Before_Qty]+(select nz(sum(T2.Take_in),0) from StockQuery2 as T2 where  T2.StockDate <= T1.StockDate)-
(select nz(sum(T2.Take_out),0) from StockQuery2 as T2 where T2.StockDate <= T1.StockDate) AS TotalQty, *
FROM StockQuery2 AS T1
ORDER BY T1.StockDate;

ผลลัพท์ที่ได้


ตัวอย่างด้านล่าง

380


จากตัวอย่างคุณ ชิ้น/แพ็ก น่าจะไม่ได้นำไปคำนวน น่าจะคำนวน ที่ จำนวน x ราคา และแสดงผลรวม
แต่ผมคิดว่า ตรงชิ้น/แพ็ก และราคานั้น น่าจะต้องไปกำหนดที่ตาราง Product ไว้เลยนะครับ เพราะมันเป็น Detail ของตัวสิ้นค้านั้นๆอยู่แล้ว
เราแค่ใส่รหัสสินค้า และ กำหนดจำนวน แค่นั้นครับ ส่วน textbox อื่นเราก็ปิดไม่ให้มีการกรอกหรือห้ามแก้ไขไปเลยจะดีกว่า

ซึ่งผมได้ทำตัวอย่างโดยแก้ไขให้ใหม่โดยมีส่วนที่เพิ่มเข้ามาดังนี้
1.ที่ตาราง Product นั้นเพิ่ม Field Price และ Quality ไว้เลย ในกรณีที่เป็นสินค้าใหม่ จะมีแจ้งเตือนให้ใส่ข้อมูลจำนวนต่อ/แพ็ก 
และราคาในครั้งแรก เมื่อใส่รหัสสินค้าครั้งต่อไปจะแสดงให้อัตโนมัติ
2.กรณีที่เป็นรหัสสินค้าเก่าที่ลงทะเบียนไว้แล้วจะแสดง (ชื่อสินค้า)  (จำนวน/แพ็ก)  (ราคา) มาให้และจะไม่ได้สามารถกดเข้าไปแก้ไขได้
(ป้องกันข้อผิดพลาด) และสะดวกกับเราด้วยเพราะเราแค่ใส่จำนวนเข้าไปเท่านั้น
3.ให้แสดงผลรวมทั้งหมดไว้ด้านล่างสุด (ไม่ได้เก็บลงในตาราง) แต่ ส่วนท้ายของรายการสินค้าจะเก็บไว้ในตาราง BillDetail ชื่อ Total
คำสั่งมีการเพิ่มเติ่มบางส่วนถ้าไม่เข้าใจตรงไหนสอบถามได้นะครับ

ส่วนจากที่ถามมาผมได้ใช้ฟังชั่น Nz เข้ามาด้วยเพื่อให้ textbox ที่ว่าง อยู่ให้ค่าเท่ากับ 0
ในตัวอย่างเพิ่มคำสั่ง โดยผมรวมกลุ่มไว้เป็น Sub ไว้เพื่อสะดวกในการใช้งาน

คำสั่งที่ textbox ชื่อ Price
โค๊ด: [Select]
Private Sub Price_AfterUpdate()
Call CalTotal
End Sub

คำสั่งที่ textbox ชื่อ Amount
โค๊ด: [Select]
Private Sub Amount_AfterUpdate()
Call CalTotal
End Sub

อันนี้คือ คำสั่งที่รวมไว้อันเดี่ยวแล้ว คือให้ จำนวน(Amount) x ด้วย ราคา(Price)
แล้ว ใช้ Call...ชื่อ Sub 

โค๊ด: [Select]
Sub CalTotal()
Me.Total = Nz(Me.Amount, 0) * Nz(Me.Price, 0)
End Sub

ตัวอย่างด้านล่าง

381
ห้อง MS Access / : ระบบจองห้องประชุม
« เมื่อ: 05 มิ.ย. 61 , 21:01:05 »
ผมส่ง ID Line ไปทางข้อความนะครับ พี่ อาจจะต้องคุยกันยาวๆ เดี่ยวผมช่วยเต็มที่ครับ

382
ทำคิวรี่แรกก่อนแบบนี้ครับ

โค๊ด: [Select]
SELECT format(StockDate,"DD-MMM"), Takein, TakeOut, Balance
FROM StockBefore
UNION SELECT format(StockDate,"DD-MMM"), Takein, TakeOut,  '' as Balance
FROM StockCard;

383
ห้อง MS Access / : สอบถามการ join Output ครับ
« เมื่อ: 05 มิ.ย. 61 , 10:22:22 »
ทำตามตัวอย่างได้แล้วครับ และถ้าเราต้องการ Source มากว่า2รายการที่ยกตัวอย่าง ก็ทำแบบเดียวกันเลยใช่มั้ยครับ
ใช่ครับ คุณ prajak กำหนดที่ Union อันเดียวพอ

SELECT Date, Output,  'POFab' as Source
FROM TblPOFab
UNION
SELECT Date, Output,  'Production' as Source
FROM TblProduction
UNION
SELECT ..............  'ตั้งชื่อ' as Source
FROM กำหนดTable;
กี่ตารางก็ได้คับ แต่ตอนจบ SQL เราค่อยใส่เครื่องหมาย ;  นะครับและ ไม่ต้องใส่ UNION ให้อันสุดท้ายนะครับ คิวรี่อื่นๆ กำหนดเหมือนเดิมครับ

384
ห้อง MS Access / : ระบบจองห้องประชุม
« เมื่อ: 04 มิ.ย. 61 , 22:34:42 »
สวัสดีครับ
ผมอยากได้แบบที่ 2 ครับผม
รบกวนด้วยนะครับ
เพิ่มเติมอีกนิดนะพี่ ผมกำลังทดลองทำให้อยู่ แต่คงทำให้เป็นทีละส่วนๆไปนะครับ

1.เราจะกำหนดรอบการประชุมอย่างไร
2.แต่ละรอบกำหนดไหมกี่ ช.ม.
3.ถ้าสมมุติรอบเช้ามีการจองประชุม 8.00 - 12.00 น. รอบต่อไปให้จองได้ตอนกี่โมง (Delay ระหว่างรอบประชุมนานเท่าไร)

ถ้าจะให้ดีและตอบโจทย์ที่สุด ผมว่าพี่สร้างฟอร์ม ที่ต้องการมาครับว่าอยากได้แบบไหน ส่วนคำสั่งและรายละเอียดอื่นๆผมจะใส่ให้ เพื่อผมจะได้มองเห็นภาพว่าควรสร้างไปแบบไหนดี

385
ห้อง MS Access / : สอบถามการ join Output ครับ
« เมื่อ: 04 มิ.ย. 61 , 21:51:26 »
ลองอันใหม่ด้านบนครับ สร้างเงื่อนไขไว้รองรับแล้ว

386
ห้อง MS Access / : สอบถามการ join Output ครับ
« เมื่อ: 04 มิ.ย. 61 , 21:19:32 »
แบบใหม่เสร็จละครับ กดที่ form result แล้วเลือกปี จากนั้นรัน Report ดูครับ


โดยขั้นแรก สร้างคิวรี่ Union ก่อนใส่
โค๊ด: [Select]
SELECT Date, Output,  'POFab' as Source
FROM TblPOFab
UNION SELECT Date, Output,  'Production' as Source
FROM TblProduction;
จะได้ข้อมูลและชื่อตารางมา

ขั้นที่สอง
กำหนด Year: Year([Date]) เพื่อให้ได้เฉพาะปีมา
กำหนด MONTH: "เดือน" & Month([Date])  จะได้ "เดือน 1,2,3,4,5.......12"
ตรง OutPut ให้ Sum


ขั้นที่สาม

โค๊ด: [Select]
SELECT Sum1.Source, Sum(IIf([Month]="เดือน1",([output]))) AS เดือน1, Sum(IIf([Month]="เดือน2",([output]))) AS เดือน2, Sum(IIf([Month]="เดือน3",([output]))) AS เดือน3, Sum(IIf([Month]="เดือน4",([output]))) AS เดือน4, Sum(IIf([Month]="เดือน5",([output]))) AS เดือน5, Sum(IIf([Month]="เดือน6",([output]))) AS เดือน6, Sum(IIf([Month]="เดือน7",([output]))) AS เดือน7, Sum(IIf([Month]="เดือน8",([output]))) AS เดือน8, Sum(IIf([Month]="เดือน9",([output]))) AS เดือน9, Sum(IIf([Month]="เดือน10",([output]))) AS เดือน10, Sum(IIf([Month]="เดือน11",([output]))) AS เดือน11, Sum(IIf([Month]="เดือน12",([output]))) AS เดือน12
FROM Sum1
GROUP BY Sum1.Source, Sum1.Year
HAVING (((Sum1.Year)=[Forms]![Result]![getYears]));

Group by Source  ไว้แล้วกำหนดที่ละเดือนเพื่อให้เข้าเงื่อนไขและแสดงผลทั้ง 12 เดือน

ตัวอย่างด้านล่าง

387
เพิ่มเติมนิดนึงนะครับ
Me.txt_BranchName = DLookup("BranchName", "tblBranch", "BranchCode='" & Forms!ชื่อฟอร์ม!txt_BranchCode & "'")

ดูเครื่องหมาย ' ให้ดีนะครับ ถ้าในตารางข้อมูลเป็น text  ต้องมี ' ด้วย

388
เปิดให้สามารถกด "แจ้งลบกระทู้นี้หรือติดต่อผู้ดูแล"  มุมขวาล่างของโพสต์นั้นๆครับ
ปล.ผู้อ่านได้พบเห็นหลายๆวิธีก็ดีนะครับ  :shout:

ขอบคุณครับ

389
ห้อง MS Access / : ระบบจองห้องประชุม
« เมื่อ: 03 มิ.ย. 61 , 21:06:42 »
สวัสดีครับ สอบถามเพิ่มเติม ที่ว่าห้ามจองวันที่เวลลาซ้ำกัน แบบไหนครับ
1.แบบ เฉพาะเจาะจงไปเลยเช่นถ้านาย ก จอง วันที่ 3/6/2561 เวลา 08.00 น. ถ้านาย ข.จะจองเวลานี้ไม่ได้ แต่สามารถจองง 08.01น.ได้


2.แบบกำหนดช่วง เช่น นาย ก. จอง วันที่ 3/6/2561 เวลา 08.00 น. ถึง 16.00 น. เพราะคำว่าห้องประชุม ประชุมครั้งนึงมันใช้เวลานานกว่าจะเสร็จ เลยไม่แน่ใจว่าแบบ 1 หรือ 2

390
สวัสดีครับ การอ้างอิง ตัว Control textbox ถ้าเป็นฟอร์มหลักก็สามารถอ้างอิง me.textbox1 หรือ ใน Dlookup  Forms!ฟอร์มหลัก!textbox1 ได้เลย
แต่เมื่อเป็น SubForm ต้องอ้างอิงเริ่มจาก ฟอร์มหลักไปหาฟอร์มรอง แบบนี้ครับ Forms!ฟอร์มหลัก.ฟอร์มรอง!textbox1
จากตัวอย่างเดิมถ้าท่านจะอ้างอิง Function Dlookup ต้องใส่แบบนี้ครับ
โค๊ด: [Select]
Me.textbox2 = DLookup("ProductName", "Product", "ProductCode='" & Forms!MainForm.SubForm!textbox1 & "'")
แต่ผมได้ออกแบบใหม่ให้ท่านลองพิจารณาดูคือ เมื่อเรากรอกรหัสใหม่ที่ไม่มีใน ตาราง Product ก็ให้แจ้งเตือน
และเมื่อใส่รหัสและกำหนดชื่อใหม่เรียบร้อยแล้ว เมื่อกด Enter หรือ กด Tab ไปที่ textbox ตัวต่อไปจะมีข้อความสอบถาม ถ้ากดใช่ ก็จะสั่งให้มันบันทึกเก็บไปในตาราง Product ให้เราเลย

เมื่อกด YES


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

391
ขอบคุณมากครับ

แต่ยัง error อยู่ครับ
คือโปรแกรมผม มันเป็น form ซ้อน form อยู่อ่ะครับ
 ผมลองใส่ code ในตัว subform แล้วรันเฉพาะ subform
ใช้ได้ ไม่ error

แต่พอรัน form ชื่อ input มัน error
ทำไงดีคับ
อ่อเปน Sub Form เดี่ยวแก้ให้ครับ

392
สวัสดีครับ เราสามารถใช้ Function Dlookup เพื่อค้นหาข้อมูลจากตารางเป้าหมายได้ครับ
ผมยกตัวอย่าง
โค๊ด: [Select]
Me.textbox2 = DLookup("ProductName", "Product", "ProductCode='" & Forms!Form1!textbox1 & "'")

ส่วนใน Function กำหนดดังนี้ DLookup("Fieldที่ต้องการแสดงผลลัพท์", "ตารางที่เราต้องการ", "เงือนไขคือ Field ProductCode ในตาราง = ='" & Forms!Form1!textbox1 & "'")   
Forms!Form1!textbox1 คือการกำหนดไปที่ textbox1 ที่เราจะกรอกค้นห้าข้อมูล


ในคำสั่งนี้คือ ถ้าเรากำหนด รหัสของสินค้า และสั่งค้นหา ถ้ารหัสที่เราระบุใน textbox1 ตรงกับ Field ProductCode ในตาราง Product
ก็จะแสดงชื่อของ ProductName ออกมา

สมมุติข้อมูลในตาราง Product เป็นแบบนี้นะครับ


เมื่อเราต้องการค้นหา รหัสเลข 3 เราก็กรอกเลข 3 ใน textbox1 แล้วกดค้นหาจะได้ ProductName ดังรูป


แต่ถ้ากรณีรหัสที่เรากรอกลงไปยังไม่มีการลงทะเบียนไว้นั้นจะมีแจ้งเตือนให้เราทราบเพื่อจะได้ลงทะเบียนใหม่ดังรูป


และเมื่อลงทะเบียนใหม่เสร็จแล้วคำสั่งที่จะ Add new รหัสและชื่อใหม่ ในตาราง Product ใส่คำสั่งที่ปุ่ม บันทึก ดังนี้




โค๊ด: [Select]
Sub AddNewToProductTable()
On Error GoTo Err_Err
    Dim DB As Database
    Dim rs As Recordset
    Set DB = CurrentDb()
    Set rs = DB.OpenRecordset("Product", dbOpenDynaset)
    rs.AddNew
    rs![ProductCode] = Me.textbox1
    rs![ProductName] = Me.textbox2
    rs.Update
Exit_err:
        Exit Sub
Err_Err:
        MsgBox Error$
        MsgBox "Error, ( Add NewProduct)!", vbExclamation, "แจ้ง"
        Resume Exit_err
End Sub
ที่ปุ่ม Save Event onclick
ใส่ไปว่า Call AddNewToProductTable()

ผมได้เพิ่มส่วนที่ดักจับข้อผิดพลาดไว้ด้วยนะครับลองศึกษาจากโปรแกรมตัวอย่างดูนะครับสงสัยตรงไหนสอบถามได้
ตัวอย่างด้านล่างนะครับ

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

394
ห้อง MS Access / : การ Import ไฟล์รูปภาพ
« เมื่อ: 01 มิ.ย. 61 , 11:46:23 »
ผมลองทำตัวอย่างใหม่ เมื่อกดจัดเก็บให้เพิ่ม (1),(2) เก็บไว้กรณี ชื่อซ้ำ ประมาณนนี้นะครับ
เวลากำหนด Pathเอง ให้ใส่แบบนี้นะครับ C:\PIC   หรือถ้ามี Sub Folder C:\PIC\SUBFLODER ประมาณนี้ครับ


เพิ่มไฟล์ครั้งแรก ที่ OutputPath จะแสดงชื่อไฟล์ปกติ


เมื่อเพิ่ม ไฟล์อันต่อไปซึ่งซ้ำกับอันแรก มันจะนับต่อแบบนี้ ผมลองกดอันที่ชื่อซ้ำกัน 3 ครั้ง นะครับ


ไฟล์ใน Floder ที่ได้


Path ในตาราง


ส่วน Function ที่เพิ่มตามนี้เลย
โค๊ด: [Select]
Function FileNameGetUnique(sFileName As String) As String
    Dim lCount As Long, lPosDot As Long
    Dim sFileNoExtension As String, sExtension As String
    On Error GoTo ErrFailed
    If Len(sFileName) = 0 Then
        Debug.Assert "ไม่เจอไฟล์ที่จะปรับปรุงนะครับ" & FileNameGetUnique
        Exit Function
    End If
    lPosDot = InStrRev(sFileName, ".")
    If lPosDot Then
        sFileNoExtension = Left$(sFileName, lPosDot - 1)
        sExtension = Mid$(sFileName, lPosDot)
    Else
        sFileNoExtension = sFileName
    End If
    Do
        lCount = lCount + 1
    Loop While Len(Dir$(sFileNoExtension & "(" & CStr(lCount) & ")" & sExtension))
    FileNameGetUnique = sFileNoExtension & "(" & CStr(lCount) & ")" & sExtension
    Exit Function
ErrFailed:
    Debug.Print Err.Description
    Debug.Assert False
    FileNameGetUnique = ""
End Function

395
ห้อง MS Access / : การ Import ไฟล์รูปภาพ
« เมื่อ: 31 พ.ค. 61 , 16:32:41 »
เดี่ยวพรุ่งนี้เพิ่มให้นะครับ คุณ Prajak ลืมตรวจเช็คดูตรงนั้นขอโทษด้วยนะครับ

396
ห้อง MS Access / : การ Import ไฟล์รูปภาพ
« เมื่อ: 30 พ.ค. 61 , 19:26:19 »

ปรับปรุงใหม่ให้แล้วนะครับ มีจุดที่จะกำหนด Default Path ได้นะครับตรง
กำหนด Default Path ที่
Private Sub Default_AfterUpdate()
If Default = True Then
Me.SetPath = "C:\Pic"
Else
Me.SetPath = Null
End If
End Sub

หมายเหตุ
1.ก่อนจะกด Import ให้กำหนด Path ที่จะจัดเก็บก่อน ถ้ายังไม่ระบุจะมีแจ้งเตือน
2.ปรับปรุงให้แสดงชื่อหลัง Path จัดเก็บแล้ว
3.ถ้ายังใส่รายละเอียดเกี่ยวกับการ import รูปไม่เสร็จแล้วไปกดปิดฟอร์ม รูปในหน้านั้นจะไม่บันทึกในตารางให้ (ป้องกันข้อผิดพลาด)
4.ตำแหน่งของ Path ถ้าติ๊กเลือก Default Path หลังกดปุ่ม จัดเก็บ แล้ว Path จะแสดง Default หรือ ถ้ากำหนด Path เองก็จะกับไปยัง Path ที่กำหนดไว้ เพื่อให้พร้อมในการ จัดเก็บไฟล์ใหม่

ตัวอย่างด้านล่างนะครับ

หน้า: 1 ... 19 20 21 [22] 23 24 25 ... 32