แสดงกระทู้

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

หน้า: [1] 2 3
1
ตอบคำถามนะคะ

การระบุ ราคาลด และรหัสสินค้าทำอย่างไร


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


ส่วนตัวตอนนี้แยกกัน 2 report ได้ค่ะ แต่เอามารวมกันไม่ได้ ลองเอามารวมกัน(แบบ sub report) มันก็โชว์ข้อมูลทั้งหมดที่ถูกจัดกลุ่มไว้ ไม่ได้โชว์ตามรายการสินค้าปัจจุบันที่เลือกค่ะ


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

2
ถ้าต้องการจัดข้อความให้อยู่กึ่งกลางเซลล์ที่รวม ทั้งแนวตั้งและนอนด้วย เท่าที่คิดออกคือไปสั่งออกรายงานใน Excel แต่เขียนโค้ดเยอะทีเดียว ถ้าจะทำใน Access วิธีเท่าที่คิดออก เป็นแค่การหลอกตาเท่านั้น ข้อความในบรรทัดที่ซ้ำจะหายไปตามต้องการ แต่ข้อความจะยังคงอยู่ที่บรรทัดแรกเสมอ ไม่สามารถไปกึ่งกลางเซลล์ที่รวมได้

วิธีการคือ
- การซ่อนข้อความที่ซ้ำ ให้กำหนด Hide Duplicate property ของเท็กซ์บ็อกซ์ที่แสดง "เหตุผลที่ซื้อ" (สมมุติชื่อ txtReason) เป็น Yes แต่ข้อความนี้จะพิมพ์เสมอเมื่อเป็นบรรทัดแรกของหน้า
- การพิมพ์ขอบของเซลล์ที่รวม เราจะสร้างคอนโทรลของเส้น แทนการใช้กรอบของเท็กซ์บ็อกซ์ ดังนั้น Border Style ของ txtReason กำหนดให้เป็น Transparent ไป ให้สร้างเส้นแนวนอน lineUpper อยู่ที่ขอบบนของ txtReason และให้มีความยาวเท่ากันพอดี  เส้น lineLower วางอยู่ขอบล่าง  เส้น lineRight เป็นแนวตั้งวางอยู่ขอบขวา ส่วนขอบซ้ายคงไม่จำเป็นเพราะเท็กซ์บ็อกซ์ทางซ้ายจะพิมพ์เส้นนั้นอยู่แล้ว   เส้นทั้ง 3 ต้องจัดเลเยอร์ให้อยู่เหนือ txtReason ด้วยนะครับ
- lineUpper จะพิมพ์เมื่อ txtReason พิมพ์ (ซึ่งก็คือบรรทัดแรกของกลุ่มข้อความที่ซ้ำ) โดยเช็คได้จาก .IsVisible property
- lineLower จะพิมพ์เมื่อเป็นบรรทัดสุดท้ายในหน้า ซึ่งต้องใช้เทคนิคให้ระบบรันรายงาน 2 หน (ไม่ใช่เราสั่งพิมพ์ 2 หน) หนแรกเช็คได้จากค่า .Pages property ของ Report object จะเป็นศูนย์ เราใช้หนแรกเพื่อบันทึกว่าบรรทัดไหนเป็นบรรทัดสุดท้ายในแต่ละหน้า โดยบันทึกลงในตัวแปรอะเรย์ A  ค่าของ A(เลขที่บรรทัด) จะเป็น TRUE   ส่วนหนที่สองเพื่อตรวจกับ A ว่า ถ้าบรรทัดที่พิมพ์คือบรรทัดสุดท้ายในหน้านั้น ก็ให้พิมพ์ lineLower
- การบังคับให้ระบบรันรายงาน 2 หน ทำด้วยการสร้างเท็กซ์บ็อกซ์ที่มี Control Source เป็น =[Pages]  เอาไว้ใน Page Header section แต่เราไม่ได้ต้องการจะเห็นมัน เราก็กำหนด Visible property ของเท็กซ์บ็อกซ์ให้เป็น No 
- การที่จะรู้ว่าบรรทัดที่พิมพ์เป็นบรรทัดที่เท่าไหร่ ก็ให้สร้างเท็กซ์บ็อกซ์ txtSeq ที่มี Constrol Source เป็น =1, Running Sum property เป็น Over All และ Visible property เป็น No

อธิบายยืดยาว แต่โค้ดมีสั้นๆแค่
โค๊ด: [Select]
Option Compare Database
Option Explicit

Dim A() As Boolean

Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
    Me.lineUpper.Visible = Me.txtReason.IsVisible
    If Me.Pages <> 0 Then Me.lineLower.Visible = A(Me.txtSeq)
End Sub

Private Sub PageFooterSection_Format(Cancel As Integer, FormatCount As Integer)
    If Me.Pages = 0 Then
        ReDim Preserve A(Me.txtSeq)
        A(Me.txtSeq) = True
    End If
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: PNR

3
ใข้เรื่อง Running Sum ลองดูวิธีการจากในไฟล์แนบนะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: PNR

4
งานที่ทำเป็นการ Link Table MS SQL server มาหรือเปล่าครับ ถ้าใช่ลองสร้าง Query ใส่เงื่อนไขที่Field  [Dates] = = =Forms!frmSearchCertificate!txtApplyDate  แล้ว view ดูข้อมูลได้ไหมครับ
โพสต์นี้ได้รับคำขอบคุณจาก: PNR

5
ผมไม่มีมอนิเตอร์ 2 จอ เลยทดสอบไม่ได้ว่าให้ผลจริงแค่ไหน แต่ถ้าจอเดียว ก็ให้กำหนด Popup property ของฟอร์มเป็น Yes ก่อน และใส่โค้ดนี้ไว้ใน OnLoad event procedure ของฟอร์ม

Private Sub Form_Load()
    DoCmd.MoveSize ซ้าย, บน
End Sub

โดยที่ซ้ายและบน คือความห่างจากขอบซ้ายและขอบบนของจอ มีหน่วยเป็น twips (เท่ากับ 567 * เซ็นติเมตร) ดังนั้นต้องหาเองว่าจอที่ 2 มีขอบซ้ายเป็นเท่าไหร่กันแน่
โพสต์นี้ได้รับคำขอบคุณจาก: PNR

6
ข้อมูลแก้ไข Type จาก nvarchar เป็น varchar ไม่ได้ค่ะ SQL ไม่ให้เปลี่ยน เนื่องจาก Export ข้อมูลมาจาก Access ข้อมูลหลาย Record แล้วด้วยค่ะ
ใช่ครับ SQL เขาไม่ให้เปลี่ยนจึงแนะนำแนวทางตามโพสล่างไปนะ :wut:
.....ใช้วิธีสั่งก๊อบข้อมูลทั้งหมดจาก ntext ไปคอลัมน์ที่สร้างใหม่เป็น text แล้วจึงใช้งานจากคอลัมน์นี่แทน...

ตัวอย่างชุดคำสั่งบน SQL Server Management Studio
UPDATE [ชุดดาต้าเบส].[dbo].[ชื่อเทเบิ้ล]
SET [คอลัมน์ใหม่] = [คอลัมน์เก่า]

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

7
ไม่แน่ใจนะครับ  ลองสร้าง Database Instance อีกตัวเพื่อทดลองก่อน ด้วยการ Clone จาก Instance ที่มีอยู่ แล้วแก้ให้ Collation ของ Instance ตัวใหม่ให้รองรับภาษาไทย
https://langisser.wordpress.com/2013/05/28/แก้ปัญหาไม่แสดงลภาษาไท/ link แล้วก็ลิงค์มาเป็น Linked Table ใน Access  จากนั้นทดลองเขียน SQL โดยมีเงื่อนไขหาข้อมูลภาษาไทย ทำทั้งใน SQL Server และใน Access ดู นอกจากนี้ เมื่อเปลี่ยน Collation แล้ว น่าจะทำให้ไม่ต้องใส่ Prefix N แม้จะเขียน SQL ในตัว SQL Server เองก็ตาม

ถ้าทำแล้วยังไม่ได้ ต้องรอผู้รู้ท่านอื่นมาให้คำแนะนำต่อไป


ข้อมูลใน Table แสดงภาษาไทยปรกตินะคะ ไม่ได้แสดง ???? แต่เวลาค้นหาด้วยภาษาไทย ไม่เจอ ถ้าใส่ N'สม' แบบนี้เจอ

อยากรู้ว่าตอนนี้ Server Collation, Database Collation มีค่าเป็นอะไรครับ

Collation ตามนี้ค่ะ


SQL_Latin1_General_CP1_CI_AS เป็น Collation สำหรับ English (United States)  ผมคิดว่าการตั้งไม่ตรงกับภาษาไทย ซึ่งใช้ Collation Thai_CI_AS น่าจะก่อให้เกิดปัญหานะครับ  อยากให้ลองทำตามที่ผมได้แนะนำไปก่อนหน้านี้ (ย้ำว่าทำการทดสอบบนฐานข้อมูลที่โคลนมาแล้วนะครับ ไม่ใช่ทดสอบบนฐานข้อมูลจริง) และตรวจสอบเพิ่มเติมด้วยว่า Windows System Locale ทั้งบนเครื่องที่ติดตั้ง SQL Server และเครื่องที่ใช้ Microsoft Access ได้ตั้งเป็น Thai (Thailand) แล้วหรือยัง เมื่อแก้ไขแล้ว ให้ลองเขียนคิวรี่ทั้งบน SQL Server และบน Microsoft Access โดยไม่ต้องมี prefix N  ดูว่าจะแก้ปัญหาได้หรือไม่
โพสต์นี้ได้รับคำขอบคุณจาก: PNR

8
Data type ตระกูล N.... ค่อนข้างมีปัญหากับบ้านเราจริงครับ ผมจึงใช้วิธีสั่งก๊อบข้อมูลทั้งหมดจาก ntext ไปคอลัมน์ที่สร้างใหม่เป็น text แล้วจึงสั่งค้นหาจากคอลัมน์นี่แทน(ถ้าแก้ให้ต่อไปลิ้งมาคอลัมน์ใหม่ผ่าน>ไปลบชุดเก่าก็ได้นะ :cool:)

ตัวอย่างชุดคำสั่งบน SQL Server Management Studio
UPDATE [ชุดดาต้าเบส].[dbo].[ชื่อเทเบิ้ล]
SET [คอลัมน์ใหม่] = [คอลัมน์เก่า]
โพสต์นี้ได้รับคำขอบคุณจาก: PNR

9
เป็น bug ของ Access 2016 และคาดว่าได้รับการแก้ไขแล้วตั้งแต่เวอร์ชั้น 16.0.6322.1000  ลองอัพเดต Office ดูนะครับ

ข้อมูลจากโพสสุดท้ายใน https://answers.microsoft.com/en-us/office/forum/office_2016-access/access-2016-report-images-still-not-displaying/a0eab74c-a299-4fa2-a38c-26bec448b041 link

ลิงค์ที่โหลด patch
แต่ให้อ่านรายละเอียดดูก่อนนะครับว่าต้องทำอะไรก่อนอัพเดตด้วยไฟล์นี้หรือไม่ แต่ผมแนะนำว่าควรอัพเดตผ่านระบบอัพเดตของ office เอง  https://support.microsoft.com/en-us/help/3114379/december-8-2015-update-for-access-2016-kb3114379 link
โพสต์นี้ได้รับคำขอบคุณจาก: PNR

10
ห้อง MS Access / : หาค่า Min จาก Query Access
« เมื่อ: 19 พ.ค. 63 , 16:12:25 »
สมมุติเทเบิล T มีฟิลด์ ID, F1, F2, F3

select ID, F1, F2, F3 , min(F0) as FMin 
from 
(              select ID, F1, F2, F3, iif(F1 = 0, NULL, F1) as F0 from T
  union all select ID, F1, F2, F3, iif(F2 = 0, NULL, F2) as F0 from T
  union all select ID, F1, F2, F3, iif(F3 = 0, NULL, F3) as F0 from T)
group by ID, F1, F2, F3
order by ID
โพสต์นี้ได้รับคำขอบคุณจาก: PNR

11
การยกเลิกการตั้งค่า Security Warning Macro Setting ของ Ms Access ให้ใช้งานคำสั่ง VBA ได้
 
1. คลิ๊กเมาส์ขวาที่ Desktop เลือกเมนู New > Text Document
 
2. จะได้ไฟล์ New Text Document.txt เปล่าๆมา คลิ๊กๆเปิดไฟล์ขึ้นมา ใส่โค๊ดนี้ลงไป
'----------------Code Start----------------
On Error Resume Next
 
Dim WshShell
Set WshShell = CreateObject("WScript.Shell")
Dim objVer
Set objVer = CreateObject("Access.Application")
 
Dim strRegPath
Dim Application_Version
Application_Version = objVer.Version 'Return 14.0, 15.0, etc.
 
strRegPath = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application_Version & "\Access\Security\VBAWarnings"
If WshShell.RegRead(strRegPath) <> 1 then
    If MsgBox("Click OK to Enable all macros.", vbQuestion + vbOKCancel, "Security VBA Warnings") = vbOK Then
        WshShell.RegWrite strRegPath, 1, "REG_DWORD"
    End If
Else
    'WScript.echo "กำหนดใช้งาน Macros ไว้อยู่แล้ว"
    MsgBox "กำหนดใช้งาน Macros ไว้อยู่แล้ว", ,"Security VBA Warnings"
End If
Wscript.Quit

3. จากนั้นไปที่เมนู File > Save As: เป็นชื่ออะไรก็ได้แต่นามสกุล vbs เช่น Macro.vbs และ Encoding: ANSI เซฟ แล้วปิดโปรแกรม notepad ไป
 
4. จะเห็นไฟล์ชื่อ Macro.vbs อยู่บน Desktop คลิ๊กๆเพื่อเรียกไฟล์ จะมีหน้าต่างข้อความ Click OK to Enable all macros. ให้กด OK ไปจนเสร็จ จะเป็นการแก้ค่ารีจีสตี้ในเครื่องเรื่องของการแจ้งเตือน หรือต้องการกำหนดแก้ไขอย่างอื่นก็แก้โค้ดเอาได้เลยครับ

5. ส่งไฟล์ไปให้เครื่องอื่นโดยรูปแบบ .zip แล้วลองให้เค้ารันไฟล์ที่ทำนี้ดูครับ

ลองปรับใช้ดู หวังว่าคงช่วยได้
โพสต์นี้ได้รับคำขอบคุณจาก: PNR

12
คงต้องรีโมทไปดูหน่อยแล้วครับ
Anydesk ไปเช็คได้ไหม
 :sweat: :sweat:

ทำได้แล้วค่ะ พอดี Export Database type ที่อยู่ใน MS Access ไปเป็น SQL Server type เปลี่ยนไปหมดค่ะ ลองไปนั่งตรวจสอบและแก้ไข type ตอนนี้ล็อกอินมาแล้วได้ตามที่ต้องการแล้วค่ะ ขอบคุณมากๆนะคะ
โพสต์นี้ได้รับคำขอบคุณจาก: PNR

13
หน้าเว็บอัพโหลดภาพทำการปรับแต่งใหม่ให้รูปย่อมีขนาดใหญ่ขึ้น(เพิ่มการมองเห็น)ทำให้จำนวนรูปในหนึ่งหน้าน้อยลง จึงเพิ่มตัวเลือกหน้าดูชุดรูปภาพ จำนวน50รูปล่าสุดให้จะได้ย้อนดูรูปได้มากขึ้นเพื่อนำมาใช้ภายหลังหรือกันอัพภาพซ้ำเป็นต้นครับ :shout:


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

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

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

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

15
เช็คว่ามีจำนวนเรคอร์ดใน ID เดียวกันตัวไหนที่เกิน 10  เพราะบอกมาว่ามีฟิลด์แค่ Field1 - Field10 เท่านั้น
โพสต์นี้ได้รับคำขอบคุณจาก: PNR

16
ใช้คำสั่ง SQL ล้วนๆคงไม่ได้ ต้องใช้ VBA ด้วย โค้ดนี้ต้องปรับแก้ให้ใส่ ' ' คร่อม ถ้า data type ของ ID, Num, Fieldxx เป็น Text ด้วยนะครับ

Public Sub xxx()
    Dim DB  As DAO.Database
    Dim RS  As DAO.Recordset
    Dim LastID  As Variant
    Dim I   As Integer
   
    Set DB = CurrentDb
    Set RS = DB.OpenRecordset("select * from Table1 (order by ..., ถ้ามี)")
    Do Until RS.EOF
        If RS!ID <> LastID Then
            I = 1
            DB.Execute "insert into Table2 (ID, Field1) values (" & CStr(RS!ID) & ", " & CStr(RS!Num) & ")", dbFailOnError
        Else
            I = I + 1
            DB.Execute "update Table2 set Field" & CStr(I) & " = " & CStr(RS!Num) & " where ID = " & CStr(RS!ID), dbFailOnError
        End If
        LastID = RS!ID
           
        RS.MoveNext
    Loop
    RS.Close: Set RS = Nothing
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: PNR

หน้า: [1] 2 3