สมัครสมาชิก

แสดงกระทู้

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] 2 3 ... 16
1
ห้อง MS Access / : ขอคำแนะนำออกแบบฐานข้อมูล Access
« เมื่อ: วันนี้ เวลา 09:28:23 »
สวัสดีครับ ผมขอเสนอแบบนี้นะครับ ไม่รู้ว่าโอเคไหม
จากข้อมูลนี้มีแบ่งด้วยกัน 2 ส่วนคือ
1. ส่วนที่เป็นประวัติและข้อมูลส่วนตัวของเกษตรกร
2. ข้อมูลส่วนของโฉนดที่ดิน จำนวนไร่ และสถานะการปลูกและการตรวจสอบ

ID น่าจะสร้างจากเลขบัตรประจำตัวประชาชนเพราะไม่มีค้าซ้ำกันแน่นอนครับ
การออกแบบความสัมพันธ์ (ReletionShip) เลยกำหนดให้เป็นแบบ One To Many
เพราะเกษตรกร 1 คนอาจจะมีแปลงนาได้หลายๆแปลง หรือมีโฉนดหลายใบครับซึ่งถ้าเรากำหนด
ID จากเลขบัตรประจำตัวประชาชนก็จะง่ายต่อการค้นหา การลบ แก้ไข และการจัดกลุ่มครับ

ในส่วนของเลขที่โฉนดที่ดิน จะสร้าง PrimaryKey ไว้เพื่อเลขที่โฉนดแปลงนา ต้องไม่ซ้ำกันคับ

ส่วนที่ผมคิดว่าน่าจะออกแบบตารางออกมาก็ประมาณนี้ครับ


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


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

2
รบกวนสอบถามอาจารย์ทุกท่านคะ

เราสามารถใช้ Query Add ข้อมูลที่เป็นรูปแบบ Attachment (ที่สร้างแยกใน Form เปล่า)   แล้วใช้ Query
ในการเพิ่มAttachment ลงในตารางได้ไหมคะ โดยที่เราไม่ได้ดึงตารางนั้นๆขึ้นมาใช้

หรือมีวิธีหรือคำแนะนำอื่นๆไหมคะ  :question:

ขอบคุณคะ :love:

ข้อมูลที่เป็นรูปแบบ Attachment (ที่สร้างแยกใน Form เปล่า) มีหน้าตาฟอร์มที่ออกแบบไว้ไหมครับ
จะได้ลองคิดแนวทางให้ครับว่าคุณต้องการแบบไหน Attachment ที่จะเพิ่มเข้าไปคืออะไร 
แล้วจะเลือก Attachment อย่างไร เพื่อนำไปบันทึกลงในตาราง
ลงตาราง ชื่ออะไรครับ ลองอธิบายเพิ่มอีกนิดนะครับ

 :grin: :grin:

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

3
จะลองแก้ไขดูครับ

โปรแกรมสร้างจาก access Version ไหน ครับ
ลองส่งชิ้นงานนั้น Zip ไฟล์ ของชิ้นงานส่งมาทาง Inbox ครับเดี่ยวตรวจเช็คให้อีกที

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

4
พอดีว่าใช้ computer 2 เครื่อง เขียนโปรแกรมด้วยเกี่ยวข้องกันไหมครับ

ลองเช็คตามนี้ดูว่าแก้ไขได้ไหม
1.ดูตรง Reference ว่ามีตัวไหนหายไปหรือไม่ กด Ctrl + G > Tool > Reference
2.เช็คการตั้งค่าภาษาด้วยครับ ว่ามีภาษาไทย หรือไม่
3.ถ้าเกิดที่ฟอร์มไหนให้ Copy Form นั้นไป Backupไว้ แล้วลบอันเก่าออก แก้ชื่ออันที่เพิ่ง Copy ไปเป็นชื่อเดิมแทนแล้วลองเปิดดูว่ายังเป็นไหม
โพสต์นี้ได้รับคำขอบคุณจาก: Chatthadon

5
รบกวนสอบถามครับ ถ้าในคิวรี่มี่2ฟิวด์คือ ฟิวด์A กับฟิวด์B
ต้องการให้ที่ฟิวด์B = ฟิวด์A ลบ(-) ฟิวด์Aของrecordก่อนหน้า ต้องใช้สูตรยังไงครับ

ถ้า อันล่างลบอันบน น่าจะประมาณนี้ครับคุณประจักษ์

โค๊ด: [Select]
SELECT Table1.ID, Table1.Item, Table1.A, DLookUp("[A]","Table1","[ID]=" & [ID]-1)-NZ([a],0) AS B
FROM Table1;

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

6
:love: :prettiness:

ขอบคุณค่ะอาจารย์เดี๋ยวลองทำดูแล้วจะมารายงานอีกรอบนะคะ
อีกอย่างหนึ่งค่ะ ขอสอบถามอาจารย์เกี่ยวกับคำสั่งตรงนี้นะค่ะ  :grin: :grin: ความหมายคืออะไรหรอคะ

ขอบคุณค่ะ :love: :love: :love:

ตรง Set DB = Nothing
      Set rs = Nothing   

ปกติ เมื่อเราเรียกใช้ หรืออ้างอิงไปยัง Record หรือ database ตัวไหนเมื่อเรียกใช้งานเสร็จแล้วก็ควรจะสั่งปิด หรือยกเลิกการเรียกใช้ไปครับ
DB คือ การกำหนดเรียกใช้ อ้างอิง database
RS คือเรียกใช้อ้างอิง Recordset


MsgBox "ADD  :  " & NewData & "  Success", vbInformation, "status"
เป็นการสร้างกล่องข้อความตอบโต้เพื่อแสดงข้อความว่าได้เพิ่มข้อมูลใหม่ลงไปเสร็จแล้วครับ

Response = acDataErrContinue

ปกติเมื่อใช้ combobox แล้วเมื่อไม่มีรายการจะมีข้อความของระบบ แจ้งว่าข้อมูลไม่ได้อยู่ในรายการ ซึ่งคำสั่งนี้ สั่งปิดข้อความแจ้งเตือนครับ

Me.textbox2.SetFocus
SetFocus คือ การกำหนดว่าให้ Cursor ไปแสดงที่ Control ตัวไหน
โพสต์นี้ได้รับคำขอบคุณจาก: jangthekop

7
สวัสดีค่ะอาจารย์ ทำได้แล้วค่ะ แต่พอทำเหมือนกันแต่เป็นที่ SubForm จะขึ้นแบบตามรูปภาพนะค่ะ
*** แต่ข้อมูลที่เราเพิ่มไปบันทึกในตารางแล้วนะคะ แต่ไม่แสดงที่ตัวเลือกเหมือนฟอร์มหลักนะค่ะ ไม่แน่ใจว่าผิดตรงไหนรึเปล่าคะ
รบกวนอาจารย์แนะนำด้วยนะคะ...ขอบคุณค่ะ :love: :love: :love: :prettiness: :prettiness:

แก้จาก Me.CB_รหัสวัสดุ = null
เป็น  Me.CB_รหัสวัสดุ.Undo 

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

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

8


ตัวอย่างนี้ใช้ได้กับ Form หลัก หรือ Subform ได้หมด ครับ
เพราะเป็นการกำหนด Event ของตัว Control ครับ โดยผมได้สร้างตัวอย่างกรณีที่เป็น SubForm ไว้แล้วด้วยครับ แต่ผมยังให้มันไปเพิ่มที่ตารางเดิมอยู่ แต่สามารถเปลี่ยนได้ตามต้องการคับ

ส่วนการเพิ่ม Item_cat เมื่อกด Yes เพื่อจะเพิ่มรายการให้แล้วก็ให้แสดง InputBox ขึ้นมาเพื่อรับค่าของ Item_Cat อีก Field แล้วจึงบันทึกค่าลงไปในตารางครับ


โค๊ด: [Select]
Option Compare Database

Private Sub Cb_ItemList_GotFocus()
Me.Cb_ItemList.Requery
End Sub

Private Sub Cb_ItemList_NotInList(NewData As String, Response As Integer)
    Dim i As Integer
    Dim Msg As String
 
  'ให้โปรแกรมแจ้งเตือนเมื่อเจอ ข้อมูลที่ไม่มีในรายการ
    If NewData = "" Then Exit Sub
    Msg = "'" & NewData & "' ไม่มีในรายการ" & vbCr & vbCr
    Msg = Msg & "ต้องการเพิ่มรายการใหม่ ?"
    i = MsgBox(Msg, vbQuestion + vbYesNo, "Checked")
   
'ถ้าเราตอบ Yes จะเริ่มการบันทึกลงไปในตารางทันที
    If i = vbYes Then
    Dim addItem_Cat As String
    addItem_Cat = InputBox("กำลังจะเพิ่มรายการ " & NewData & vbCrLf & "กรุณาระบุค่า..:", "เพิ่มค่าสำหรับ Field ITEM_Cat")
    If Not IsNull(Me.Cb_ItemList) And addItem_Cat <> "" Then
            Set DB = CurrentDb()
            Set rs = DB.OpenRecordset("TblItem_List", DB_OPEN_DYNASET) ' TblItem_List คือชื่อตารางที่จะเพิ่มรายการ
           
            LastID = Dmax("Item_ID", "TblItem_List")  'ตรงส่วนนี้คือการหาค่า ID ล่าสุดที่มีอยู่แล้วนำมา +1 เพื่อไม่ให้ซ้ำกัน
            LastID = LastID + 1
           
    rs.AddNew
    rs![Item_ID] = LastID  'Item_ID คือ ฟิลล์ Item_ID ในตาราง
    rs![Item_Name] = NewData    'Item_Name คือ ฟิลล์ Item_Nameในตาราง
    rs![Item_Cat] = addItem_Cat
    rs.Update
   
    Set DB = Nothing
    Set rs = Nothing
    MsgBox "ADD  :  " & NewData & "  Success", vbInformation, "status"
            Response = acDataErrContinue
            Me.Cb_ItemList.Undo
            Me.textbox2.SetFocus
 End If
 Else
    Response = acDataErrContinue
 End If
End Sub
             

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

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

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

ลองดูตัวอย่างนี้ครับ รายละเอียดตัว Control
Combobox  : รายชื่อ ผมสร้างชื่อ  Cb_ItemList
ชื่อตาราง       : TblItem_List
                    มีฟิลล์  Item_ID  และ Item_NAME
Textbox      : ไว้สำหรับรองรับ Cursor ไว้เฉยๆ ครับ ตั้งชื่อ Textbox2
คุณสามารถ เพิ่มรายการเข้าไปได้ทันที โดยเมื่อคุณใส่รายการใหม่เข้าไปจะมีการแจ้งเตือน


เมื่อตอบ Yes ก็จะบันทึกไปที่ตารางทันที

โค๊ด: [Select]
Private Sub Cb_ItemList_GotFocus()
Me.Cb_ItemList.Requery
End Sub

Private Sub Cb_ItemList_NotInList(NewData As String, Response As Integer)
    Dim i As Integer
    Dim Msg As String
 
 
  'ให้โปรแกรมแจ้งเตือนเมื่อเจอ ข้อมูลที่ไม่มีในรายการ
    If NewData = "" Then Exit Sub
    Msg = "'" & NewData & "' ไม่มีในรายการ" & vbCr & vbCr
    Msg = Msg & "ต้องการเพิ่มรายการใหม่ ?"
    i = MsgBox(Msg, vbQuestion + vbYesNo, "Checked")
   
'ถ้าเราตอบ Yes จะเริ่มการบันทึกลงไปในตารางทันที
    If i = vbYes Then
    Dim DB As Database
    Dim rs As Recordset
    Dim LastID As Integer
   
   
            Set DB = CurrentDb()
            Set rs = DB.OpenRecordset("TblItem_List", DB_OPEN_DYNASET) ' TblItem_List คือชื่อตารางที่จะเพิ่มรายการ
           
            LastID = DMax("Item_ID", "TblItem_List")  'ตรงส่วนนี้คือการหาค่า ID ล่าสุดที่มีอยู่แล้วนำมา +1 เพื่อไม่ให้ซ้ำกัน
            LastID = LastID + 1
           
    rs.AddNew
    rs![Item_ID] = LastID  'Item_ID คือ ฟิลล์ Item_ID ในตาราง
    rs![Item_Name] = NewData    'Item_Name คือ ฟิลล์ Item_Nameในตาราง
    rs.Update
    Set rs = Nothing
    Set DB = Nothing
   
    MsgBox "ADD  :  " & NewData & "  Success", vbInformation, "status"
            Response = acDataErrContinue
            Me.Cb_ItemList = Null
            Me.textbox2.SetFocus
    Else
            Response = acDataErrContinue
 End If
           
End Sub
             
โพสต์นี้ได้รับคำขอบคุณจาก: jangthekop

11
ห้อง MS Access / : สอบถามคำสั่ง Docmd.Movesize
« เมื่อ: 10 ม.ค. 62 , 14:40:03 »
ที่ คุณสมบัติฟอร์ม FrmDbLine2_Eng1
เป็นแบบนี้หรือยังครับ


ใส่เป็น

  DoCmd.MoveSize 30000, 0, 0, 0

เลยครับ  :cool: :cool:
โพสต์นี้ได้รับคำขอบคุณจาก: prajak, aek

12
โทษทีที่ตอบช้านะครับ
ลองดูตัวอย่างนี้ ใช้การแสดงจำนวนแล้ว สอบถามผู้ใช้เลยว่า ต้องการนำเข้าข้อมูลเลยหรือไม่ครับ ถ้าตอบใช่ก็จะทำการนำเข้าให้ทันที พร้อมเปลี่ยนนามสกุล เป็น .xxx เมื่อนำเข้าแล้วครับ  ส่วนที่ผมใส่สีแดงไว้คือส่วนที่ต้องแก้ให้ตรงกับ Floder และ ตาราง ที่มีอยู่นะครับ


Private Sub Command0_Click()
    Dim Msg As Integer
    Dim count As Integer
    Dim strPath As String
    Dim strFile As String
         
        strPath = "D:\textfile\"
        strFile = Dir(strPath & "*.txt")
    If strFile = "" Then
    MsgBox "ไม่เจอไฟล์ที่จะ import !!", vbCritical, "แจ้งเตือน"
    Exit Sub
    Else
    Do While strFile <> ""
       count = count + 1
        strFile = Dir()
    Loop

     Msg = MsgBox("พบ File =  " & count & " อัน" & vbCrLf & " ต้องการนำเข้าไฟล์เลยหรือไม่?", vbYesNo+vbQuestion, "จำนวนไฟล์ทั้งหมด")

    If Msg = vbYes Then
    Call Import
    End If
           End If     
End Sub


Sub Import()
    Dim strPath As String
    Dim strFile As String
    Dim strTable As String
    Dim StrFileName As String
    Dim strextensionNew As String
   
    strTable = "Table1"
    strPath = "D:\textfile\"
   
    strFile = Dir(strPath & "*.txt")
   
    Do While strFile <> ""
    StrFileName = strPath & strFile
    DoCmd.TransferText acImportDelim, "", strTable, StrFileName, False
    strextensionNew = Left(StrFileName, InStrRev(StrFileName, ".") - 1) & ".xxx"
    Name StrFileName As strextensionNew
    strFile = Dir
    Loop
End Sub

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

13
คือผมใช้ข้อมูลที่ import มาจาก mapdrive ไว้ บ้างที่ drive เป็น disconnect ผู้ใช้จะไม่ทราบ ทำให้คิดว่าไม่มีข้อมูลใหม้เข้ามา อ.ท่านไหน ที่พอมีแนวทางหรือโค้ดตัวอย่างบ้างไหมครับ

ขอบคุณครับ

 :prettiness: :prettiness: :prettiness:

ปกติคุณจะ Import จาก Mapdrive โดยกำหนดโฟลเดอร์ใน Mapdrive เพื่อที่จะ Import ใช่ไหมครับดูจาก โค้ด import ก่อนหน้านี้ที่เคยสอบถามมา
 ถ้าใช่ เราก็ใช้การ Dir() หาชื่อโฟลเดอร์นั้นเอาก็ได้คับว่าค้นหาเจอไหม
กรณีที่ Mapdrive Disconnect ก็ให้แสดงว่า ไม่สามารถเชื่อมต่อได้
กรณีที่เจอก็ให้แสดงว่า เชื่อมต่อได้ครับ

ผมกำหนดปุ่ม CommandBotton ชื่อ Command0 นะครับ

Private Function MapDriveExists(ByVal Path As String) As Boolean
  On Error Resume Next
  MapDriveExists = Dir(Path, vbDirectory) <> ""
End Function


Sub connectedToMapdrive()
  If MapDriveExists("Z:\MyData\FloderName") Then
   MsgBox "พบการเชื่อมต่อ Mapdrive", vbInformation, "Status"
  Else
    MsgBox "ไม่พบการเชื่อมต่อ Mapdrive ของท่าน" & "....", vbInformation, "Status"
  End If
End Sub


Private Sub Command0_Click()
Call connectedToMapdrive
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: aek

14
ตัวอย่างนี้ใช้คิวรี่ 2 อันนะครับ

อันที่ 1 ใส่แบบนี้ โดยผมตั้งชื่อว่า Query1

โค๊ด: [Select]
SELECT [data].Date, Min([data].Time) AS [Time]
FROM data
GROUP BY [data].Date;

อันที่สองใช้ Sub คิวรี่แบบนี้ครับ

โค๊ด: [Select]
SELECT data.*
FROM Query1 INNER JOIN data ON (Query1.Date = data.Date) AND (Query1.Time = data.Time);

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

15
ขอดูการตั้งค่า References หน่อยครับ ที่มุมมองออกแบบ กด Alt + F11 แล้วไปที่ Tool กดที่ References ครับ


ลองดูคร่าวๆ ถ้ามีตัว Microsoft ActiveX Data Objects Library ให้เลือกใช้ตัว เวอร์ชั่นล่าสุดดูครับ
 
โพสต์นี้ได้รับคำขอบคุณจาก: siam

16


ใช้วิธีการเดียวกับการแสดง  อำเภอ  ตำบล นั้นละครับ เมื่อเรากดเลือก Geo แล้วพอจะเลือกจังหวัด เราก็กำหนดให้เลือก Geo_ID จากCombobox  Cb_geography ที่เรากำหนด
วิธีการคือ
1.สร้าง Combobox เพิ่มตั้งชื่อว่า Cb_Geography โดยกำหนด RowSource ของ Cb_geography ดังนี้
โค๊ด: [Select]
SELECT tb_geography.GEO_ID, tb_geography.GEO_NAME FROM tb_geography;
2.ในส่วนของ Combobox Cb_Province ก็กำหนด Rowsource ดังนี้
โค๊ด: [Select]
SELECT tb_province.province_id, tb_province.Province_th, tb_province.GEO_ID FROM tb_province INNER JOIN tb_geography ON tb_province.geo_id = tb_geography.GEO_ID WHERE (((tb_province.GEO_ID)=[Forms]![Form1]![Cb_geography]));
ส่วน Code ให้แก้เป็นแบบนี้ครับ
โค๊ด: [Select]
Option Compare Database
Option Explicit

Private Sub Cb_geography_AfterUpdate()
    Me.cb_province.Requery
    Me.cb_province = Null
    Me.cb_amphur = Null
    Me.cb_district = Null
    Me.txt_zipcode = Null
End Sub

Private Sub cb_province_AfterUpdate()
    Me.cb_amphur.Requery
    Me.cb_amphur = Null
    Me.cb_district = Null
    Me.txt_zipcode = Null
End Sub
Private Sub cb_province_GotFocus()
Me.cb_province.Requery
End Sub

Private Sub cb_amphur_AfterUpdate()
    Me.cb_district.Requery
    Me.cb_district = Null
    Me.txt_zipcode = Null
End Sub
Private Sub cb_district_AfterUpdate()
    Me.txt_zipcode = DLookup("post_code", "tb_district", "district_th= '" & Me.cb_district & "' AND amphur_id = " & Me.cb_amphur.Column(0, Me.cb_amphur.ListIndex))
End Sub

Private Sub cb_amphur_GotFocus()
    Me.cb_amphur.Requery
End Sub
Private Sub cb_district_GotFocus()
    Me.cb_district.Requery
End Sub
Private Sub Form_Load()
Me.Cb_geography.SetFocus
End Sub

สามารถดูตัวอย่างที่แก้ไข ด้านล่างครับ
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี, buakird

หน้า: [1] 2 3 ... 16