สมัครสมาชิก

แสดงกระทู้

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

หน้า: [1] 2 3 ... 8
1
ห้อง MS Access / : การใช้คำสั่ง iifซ้อน iif
« เมื่อ: 11 ธ.ค. 61 , 11:50:48 »
ปัญหาการใช้ Expression จะมี 2 อย่างครับ คือ 1. พิมพ์ตัวอักษรมากเกินไป จำไม่ได้แล้วเท่าไหร่แต่ก็มากอยู่ 2. ใช้นิพจน์ซ้อนกันเกินประมาณ 13 ตัวมั้ง จำตัวเลขไม่ได้
ปัญหาของกระทู้นี้คือใช้นิพจน์ซ้อนกันเยอะเกินไป ไม่ว่าจะเป็น IIf ซ้อน IIf หรือใช้ฟังก์ชั่น Switch() ก็ไม่สามารถซ้อนกันเกินได้ จึงต้องใช้การแยกฟิลด์ไม่ให้เกินครับ
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

2
ห้อง MS Access / : การใช้คำสั่ง iifซ้อน iif
« เมื่อ: 11 ธ.ค. 61 , 08:48:20 »
น่าจะเกิดจาก ความยาว หรือจำนวนอักขระ มากเกินไปครับ เวอร์ชั่นเก่า ยิ่งจำกัดแค่ 255 ตัวอักษร
แนะนำให้เขียนฟังชั่นใช้เองดีกว่าครับ
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

3
ห้อง MS Access / : การใช้คำสั่ง iifซ้อน iif
« เมื่อ: 10 ธ.ค. 61 , 17:06:21 »
ใช้ MS Access เวอร์ชั่นอะไรอะครับ ทำไมเหมือนใส่ได้น้อยจัง เหมือนกับมันใส่อักษรเกินที่ Textbox มันรับได้ป่าวครับ ถ้าใช่ให้แก้โดยแบ่งครึ่งเงื่อนไขครับ เช่น
a: IIf(Not IsNull([Eff20]),[Eff20],IIf(Not IsNull([Eff19]),[Eff19],Null)) ไปเรื่อยๆ จนสุดที่ใช้ได้
สร้างอีกฟิลด์
b: IIf(IsNull([a]),IIf(Not IsNull([Eff18]),[Eff18],Null),[a]) ไปเรื่อยๆ อีก ถ้ายังไม่หมดก็ต่ออีกฟิลด์ แล้วเราก็เอาฟิลด์สุดท้ายไปใช้งานครับ พอนึกภาพออกไม๊ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

4
ห้อง MS Access / : การใช้คำสั่ง iifซ้อน iif
« เมื่อ: 09 ธ.ค. 61 , 13:21:46 »
ต้องใส่ลูกน้ำคั่นวงเล็บปิดด้วยใหมครับนั้น ตย.ที่ผมใช้ =IIf([do_T15]=True,IIf([15_ราคา2]<>"",[15_ราคา2]+[15_ราคา],"0"),"0")
ปล.ถ้าใช้ ),),),),),),),),),),) คือมันไม่มีอะไรอยู่ข้างในมันจะแปลงร่างให้เป็น ))))))))))) ตามเดิมอยู่ดี ลองเป็น ,[%Efficiancy]),[%Efficiancy]),... แทนดูได้ใหมครับ :sweat:

โค๊ด: [Select]
Eff20Auto:
IIf(Not IsNull([Eff20]),[Eff20],
IIf(Not IsNull([Eff19]),[Eff19],
IIf(Not IsNull([Eff18]),[Eff18],
IIf(Not IsNull([Eff17]),[Eff17],
IIf(Not IsNull([Eff16]),[Eff16],
IIf(Not IsNull([Eff15]),[Eff15],
IIf(Not IsNull([Eff14]),[Eff14],
IIf(Not IsNull([Eff12]),[Eff12],
IIf(Not IsNull([Eff11]),[Eff11],
IIf(Not IsNull([Eff10]),[Eff10],
IIf(Not IsNull([Eff9]),[Eff9],[%Efficiancy])
,[%Efficiancy])
,[%Efficiancy])
,[%Efficiancy])
,[%Efficiancy])
,[%Efficiancy])
,[%Efficiancy])
,[%Efficiancy])
,[%Efficiancy])
,[%Efficiancy])
,[%Efficiancy])
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

5
ห้อง MS Access / : การใช้คำสั่ง iifซ้อน iif
« เมื่อ: 08 ธ.ค. 61 , 19:23:29 »
ต้องขอความรู้ อาจารย์ สันติสุข ,TTT , OddyWriter และ ท่านอื่นๆ แล้วละครับ  :cool: :cool:
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

6
ห้อง MS Access / : การใช้คำสั่ง iifซ้อน iif
« เมื่อ: 08 ธ.ค. 61 , 09:40:27 »
ผมรบกวนสอบถามหน่อยนะครับ มีคำสั่งอื่นแทนการใช้ iif ซ้อนไหมครับ ผมใช้ iif ใน expression แต่พอใช้ซ้อนหลายๆชั้นมันเหมือนเกินขีดจำกัด และขึ้น error ครับ พอจะมีคำสั่งอื่นใช้แทนหรือเปล่าครับ


Eff20Auto: IIf(Not IsNull([Eff20]),[Eff20],IIf(Not IsNull([Eff19]),[Eff19],IIf(Not IsNull([Eff18]),[Eff18],IIf(Not IsNull([Eff17]),[Eff17],IIf(Not IsNull([Eff16]),[Eff16],IIf(Not IsNull([Eff15]),[Eff15],IIf(Not IsNull([Eff14]),[Eff14],IIf(Not IsNull([Eff12]),[Eff12],IIf(Not IsNull([Eff11]),[Eff11],IIf(Not IsNull([Eff10]),[Eff10],IIf(Not IsNull([Eff9]),[Eff9],[%Efficiancy])))))))))))
ใช้ Switch Function แทนดีไหมคับ
Switch ( expression1, value1, expression2, value2, ... expression_n, value_n )
โค๊ด: [Select]
Eff20Auto: Switch([Eff20]<>"",[Eff20],[Eff19]<>"",[Eff19],[Eff18]<>"",[Eff18],[Eff17]<>"",[Eff17],[Eff16]<>"",[Eff16],[Eff15]<>"",[Eff15],[Eff14]<>"",[Eff14],[Eff13]<>"",[Eff13],[Eff12]<>"",[Eff12],[Eff11]<>"",[Eff11],[Eff10]<>"",[Eff10],[Eff9]<>"",[Eff9],TRUE,[%Efficiancy])
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

7
ไฟล์ที่แนบมาแตกไฟล์ไม่ได้ครับคุณปิ่นณรงค์

ปกติผม แตกไฟล์กับ 7zip ครับลองดูอันใหม่ครับว่าได้ไหม
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

8
โอเคได้ละครับ พอดีไปค้นหาวิธีจากเว็บนอกได้มาประมาณนี้ คือ
ให้เราสร้างฟอร์มตามที่ต้องการโดยเราจะใช้ ความละเอียดจากเครื่องหลัก เพื่อใช้อ้างอิงว่าค่าเริ่มต้นของ form นั้นได้สร้างจากค่าความละเอียดเท่าไร
จากตัวอย่างผมได้ลองไปตั้งค่าความละเอียด 800x600 แล้วลองสร้างฟอร์มให้ได้ขนาดพอดีครับหน้าจอที่ต้องการแสดงครับ

วิธีการทดสอบ
1.ให้ลองตั้งค่าความละเอียด 800x600 แล้วลองเปิดฟอร์มดู (เพื่อดูว่าฟอร์มที่สร้างมาตอนแรกเป็นอย่างไร) ถ้าคิดว่าตำแหน่งจัดวางโอเคแล้วก็เรียบร้อย

2.ให้ลองตั้งค่าความละเอียด ตามปกติของเครื่องนั้นเลย แล้วลองเปิดฟอร์มดูเพื่อดูความเปลี่ยนแปลงครับ ฟอร์มและตัวคอนโทรลที่เปิดขึ้นมา จะขนาดใหญ่หรือเล็กตามขนาดของจอปลายทางที่เราต้องการแสดงครับจากตัวอย่างเครื่องผมปรับได้สุดแค่นี้ครับ 1366*768  pixels


ถ้าแบบนี้โอเคเดี่ยวจะอธิบายการนำ Code ไปประยุกต์ใช้อีกทีคับ ส่วนตัวอย่าง Code โหลดได้ด้านล่างคับ มีทั้งแบบ 64Bit และ 32Bit ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

9
ต้องกำหนดทุกฟอร์มเลยหรือเปล่าครับ แล้วถ้าเราปิดหรือออกจากโปรแกรม ความละเอียดหน้าจอจะกลับมาที่ความละเอียดปกติมั้ยครับ

เฉพาะ Event Form_Open ของฟอร์มล๊อกอินคับ เพราะมันต้องแสดงขึ้นมาก่อนอยู่แล้ว
ส่วนความละเอียดหน้าจอ ค่าปกติต้องดูว่ากำหนดที่เท่าไร ผมจะได้เพิ่ม Code คืนค่าปกติ เมื่อปิดโปรแกรม


แต่ถ้าเราจะให้มัน Shrinker หรือ Stretcher เดี่ยวขอลองทำดูก่อนนะครับ ได้ยังไงเดี่ยวมาอัพเดทผมว่าน่าจะพอทำได้อยู่คับ

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

10
ขอบคุณครับอาจารย์ปิ่นณรงค์
สุดยอดมากครับ
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

11
ถ้าต้องการให้แบบฟอร์ม พอดีกับจอของ Users ผมว่าน่าจะต้องมีการ lock spec ความละเอียดนะครับ
เช่น ตั้งไว้ที่ 1,024x768 ทุกเครื่อง รวมทั้งเครื่องที่สร้างฟอร์มด้วย
เพราะถ้าหลายๆเครื่องมีความหลากหลายในค่าความละเอียด ก็ไม่น่าจะเต็มจอได้ทุกจอนะครับ
ไม่รู้ผมเข้าใจถูกป่าว
ถ้าผิด ท่านผู้รู้ช่วยแก้ด้วยนะครับ

จากแนวคิิดของท่านงั้น ก็สร้างคำสั่งให้ปรับขนาดหน้าจอปลายทางอัตโนมัติเมื่อเปิดฟอร์ม หรือ Event ที่ต้องการไปเลยดีไหม เช่น อยากตั้ง ขนาด 1,024x768 กับทุกเครื่อง ก็ให้เปิดฟอร์มมาแล้ว ขนาดจะเปลี่ยนตามเลย Code ตามนี้ครับ

Code นี้วางใน Mudule

โค๊ด: [Select]
Type RECT
x1 As Long
y1 As Long
x2 As Long
y2 As Long
End Type
Declare Function GetDesktopWindow Lib "User32" () As Long
Declare Function GetWindowRect Lib "User32" _
(ByVal hWnd As Long, rectangle As RECT) As Long

Private Declare Function ChangeDisplaySettings Lib "User32" Alias _
"ChangeDisplaySettingsA" (lpDevMode As Any, ByVal dwFlags As Long) As Long
Private Declare Function EnumDisplaySettings Lib "User32" Alias _
"EnumDisplaySettingsA" (ByVal lpszDeviceName As Long, ByVal iModeNum As _
Long, lpDevMode As Any) As Boolean
 
Const DM_PELSWIDTH = &H80000
Const DM_PELSHEIGHT = &H100000
Const CCFORMNAME = 32
Const CCDEVICENAME = 32
 
Private Type DEVMODE
dmDeviceName As String * CCDEVICENAME
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
 
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
 
dmFormName As String * CCFORMNAME
dmUnusedPadding As Integer
dmBitsPerPel As Integer
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type
Public Function Change_Resolution(iWidth As Single, iHeight As Single)
Dim DevM As DEVMODE
Dim a As Boolean
Dim i As Long
Dim b As Long
i = 0
Do
a = EnumDisplaySettings(0&, i&, DevM)
i = i + 1
Loop Until (a = False)
DevM.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT
DevM.dmPelsWidth = iWidth
DevM.dmPelsHeight = iHeight
b = ChangeDisplaySettings(DevM, 0)
End Function
Function GetScreenResolution() As String
Dim R As RECT
Dim hWnd As Long
Dim RetVal As Long
hWnd = GetDesktopWindow()
RetVal = GetWindowRect(hWnd, R)
GetScreenResolution = (R.x2 - R.x1) & "x" & (R.y2 - R.y1)
End Function
Sub SetAutoScreen()
Call Change_Resolution(1024, 768) ' กำหนดขนาดตรงนี้
End Sub

ต่อมาไปกำหนด Event Form_Open

โค๊ด: [Select]
Private Sub Form_Open(Cancel As Integer)
Call SetAutoScreen
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

12
ถ้าต้องการให้แบบฟอร์ม พอดีกับจอของ Users ผมว่าน่าจะต้องมีการ lock spec ความละเอียดนะครับ
เช่น ตั้งไว้ที่ 1,024x768 ทุกเครื่อง รวมทั้งเครื่องที่สร้างฟอร์มด้วย
เพราะถ้าหลายๆเครื่องมีความหลากหลายในค่าความละเอียด ก็ไม่น่าจะเต็มจอได้ทุกจอนะครับ
ไม่รู้ผมเข้าใจถูกป่าว
ถ้าผิด ท่านผู้รู้ช่วยแก้ด้วยนะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

13
ให้แก้เป็น

On Error Resume Next
DoCmd.RunCommand acCmdRecordsGoToNext
If Me.NewRecord Or Err.Number <> 0 Then Me.Requery
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

14
แบบนี้หรือเปล่าครับ พอดีผมได้วิธีในเว็บนี้แหละครับ
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

15
สอบถามนะครับ เราสามารถกำหนดให้ user แต่ละสิทธิพอloginเข้าแล้วให้เปิดฟอร์มของตัวเองตามที่กำหนดได้หรือเปล่าครับ
เช่นการตลาด loginแล้วเข้าฟอร์มการตลาด
จัดซื้อ login แล้วเข้าฟอร์มจัดซื้อ
ซึ่งปัจจุบันผมใช้การกำหนดสิทธิที่ปุ่มเมนูแทน โดยการ Enable=false เป็นต้น

ผมเห็น ตัว login ของคุณ prajak ใช้การตรวจสอบ ID และ พาสเวิร์ด โดยใช้ Dlookup ถ้าต้องการให้เปิดฟอร์มไหน ผมว่า
น่าจะเพิ่ม Field ในตาราง อีก Field หรือ สร้างตารางและให้มี Field UserID เพื่อ สร้างความสัมพันธ์กัน
เช่น tblDepartment เก็บ UserID  UserName และ Department

โดย เราจะกำหนดว่า เมื่อ ID และ Password ถูกต้องแล้ว ให้ dlookup Dapartment มาเก็บไว้ เป็นตัวแปลโดยอ้างอิงจาก Username ที่ Login
แล้วใช้ IF ไปกำหนดการเปิดฟอร์มอีกที เช่น

Dim StrDepart as string
StrDepart = Dlookup("Department","tblDepartment", "[Username]='" & Me.Userbox & "'")
IF strDepart = "แผนกขาย" then
Docmd.openForm "FormSell"
ElseIF strDepart = "การตลาด" then
Docmd.openForm "FormMaketing"
end if

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

16
TeamView ไปทำให้ไหมครับ แจ้งรหัส ทีมวิว กับรหัส ไว้ทางข้อความนะครับ
แต่ต่อ HDMI กับ จอทีวีไว้นะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

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