แสดงกระทู้

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 4 ... 43
1
ใช้ในโค้ดเดิมนี้แหละครับ
แต่เราใช้ IF มาแยก ระหว่าง 32 และ 64 bit โดย
ถ้า64 Bit ให้มี PtrSafe ด้วยเช่น
#if Win64 then
   Declare PtrSafe Function .........................................
   .......................โค้ดประกาสตัวแปรทุกตัวต้องมี PtrSafe ด้วยทุกอัน..................

#else 'ส่วนด้านล่างนี้จะใช้ 32Bit ครับ อันล่างใช้โค้ดเดิมของท่านได้เลย ไม่ต้องมี PtrSafe

   Declare Function ................................
#end if

2
ส่งตัวอย่างที่ทำไว้ มาให้หน่อยได้ไหมครับ
เดี่ยว เขียนเป็นโค้ดให้ครับ
ผมต้องการดูขั้นตอนการ ทำงานเพื่อแสดงผล

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

หมายเหตุ แต่ช่วงนี้ไม่ค่อยเห็นอาจารย์สันติสุขเลย คิดถึงเลยครับ

3
1.จากโจทย์ใช้ฟอร์มในการระบุค่าไหมครับ
2.หรือมีข้อมูลวันที่และรหัสแคชเชียร์อยู่แล้วในตาราง ต้องการใส่ค่าเรียงลงมาทั้งหมดจากบนลงล่างอัตโนมัติ

ดูจากโจทย์แล้วน่าจะพอทำได้เดี๋ยวพรุ่งนี้ทำให้ครับ
ใช้ในการกำหนดเงื่อนไขหาข้อมูล
Dlookup,Dcount ของวันที่และรหัสแคชเชียร์

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


SendcordNo เรียงตามรหัสแคชเชียร์ในแต่ละวัน ใครมาก่อนได้เลขก่อนใครมาหลังก็ได้เลขถัดไปแต่ถ้าคนมาก่อนมาใช้งานต่อก็ให้รันเลขเดิม
SendcardEndNo เรียงลำดับตามวันที่

แบบนี้ใช่ไหม

4
ผมไม่แน่ใจเหมือนกันครับ ถ้าตารางใหม่ addnew ได้ปกติ
ข้อสันนิษฐาน
   1.การกำหนดประเภทของข้อมูลว่าเหมือนกันหรือไม่(ดูจากตารางใหม่ที่เพิ่งสร้างและเพิ่มได้)
      เพราะบางครั้งเกิดปัญหาการแปลงชนิดข้อมูลไม่ถูกต้องทำให้ไม่สามารถเพิ่มใหม่ได้
   2.ข้อมูลมี primary key แล้วหรือไม่
   3.เช็คการกำหนดค่าซ้ำ(ดูจากตัวที่เพิ่มได้ก็ได้ครัข)

รอน้าๆ ผู้ที่ใช้งาน SQL SERVER โดยตรงมาแชร์ประสบการณ์ตรงส่วนนี้
  :yuush:

5
สอบถามเพิ่มเติม
1.ให้เรียงลำดับ โดยไม่ได้จัดกลุ่มตาม invoice_id ใช่หรือเปล่า ?
2.สมมุติมี invoice_number 000001 , 000002 , 000003
   2.1ถ้าเราลบ 000003 เวลาเราจะเพิ่มใหม่ก็ให้แสดง 000003 กลับมาอีกครั้ง ใช่แบบนี้หรือไม่
   2.2ถ้าเราลบ 000002 ปกติมันจะรันเลขต่อไปคือ 000004 เพราะรันต่อจาก 000003 แบบนี้ไหม

6
โค๊ด Addnew
โค๊ด: [Select]
AddnewSQL = "INSERT INTO dbo_TestTP ( CardID, TPNo, TPIssueDate, TPExpireDate ) " _
& "SELECT dbo_TempImportTP.CardID, dbo_TempImportTP.TPNo, dbo_TempImportTP.TPIssueDate, dbo_TempImportTP.TPExpireDate " _
& "FROM dbo_TempImportTP WHERE (((dbo_TempImportTP.CardID) Not In (select CardID from [dbo_TestTP])));"

โค๊ด Update
โค๊ด: [Select]
UpdateSQL = "UPDATE dbo_TestTP INNER JOIN dbo_TempImportTP ON dbo_TestTP.CardID = " _
& "dbo_TempImportTP.CardID SET dbo_TestTP.TPNo = [dbo_TempImportTP].[TPNo], dbo_TestTP.TPIssueDate = " _
& "[dbo_TempImportTP].[TPIssueDate], dbo_TestTP.TPExpireDate = [dbo_TempImportTP].[TPExpireDate] " _
& "WHERE (((dbo_TestTP.TPNo)<>[dbo_TempImportTP].[TPNo]) AND ((dbo_TestTP.CardID)=[dbo_TempImportTP].[CardID])) " _
& "OR (((dbo_TestTP.TPIssueDate)<>[dbo_TempImportTP].[TPIssueDate])) OR (((dbo_TestTP.TPExpireDate)<>[dbo_TempImportTP].[TPExpireDate]));"

ปรับเป็นแบบนี้นะครับ เราจะไม่ใช้ And เราจะใช้ OR นะครับ
เช็คฟิลล์ TP7No เพื่อความถูกต้องนะครับว่าที่ถูกต้องคือ TP7No  หรือ TPNo

7
อ้างถึง
ชื่อนี้ค่ะ dbo_TempImport
เป็น Database ที่ลิงค์มาจาก SQL Server
หรือจะติดตรงนี้ค่ะ acSpreadsheetTypeExcel8 ต้องไปสร้างหรือกำหนด SpreadsheetType ที่ไหนคะ

ตาราง temp สร้างไว้ที่ front end ได้เลย ไว้วางข้อมูลชั่วคราวเท่านั้น
ไม่ต้องลิ้งมา


8
Deletesql = "DELETE * FROM TempImport;"
ตารางชั่วคราวชื่ออะไรครับ
ตรงสีแดงใส่ชื่อตารางชั่วคราว

9
ตรง Tool >> Reference
เพิ่มตัว MS OFFICE XX Object libary ด้วยครับ ตามภาพ

10
ลอง Compile / DeCompile ดูหรือยังครับ
ลอง compact and repair ด้วยครับ

11
ถ้าเลือก DAO 3.6 ก็เอา
Microsoft Office xx.0 Access Database engine object library ออกไปครับ

อธิบาย
ถ้าไฟล์ที่นามสกุล .accdb จะมี  Microsoft Office xx.0 Access Database engine object library มาให้แล้ว
มันใช้ได้เหมือน DAO

ถ้าจะใช้ DAO 3.6 ก็ต้องติ๊กเอา Microsoft Office XX.0 Access Database engine object library ออกไป

ถ้าใช้ Microsoft Office XX.0 Access Database engine object library ก็กำหนด แนะนำตัวนี้แหละดีแล้วสำหรับรุ่นใหม่ๆ
Microsoft Office  2007 ขึ้นไปใช้
Dim rst as Recordset

ถ้าใช้ DAO 3.6 ใช้กับเวอร์ชั่นเก่าๆ ดี ถ้าเวอร์ชั่นใหม่ๆ ใช้ตัวบน
Dim rst as DAO.Recordset

12
ลองแก้เป็น
dim rst as recordset

เอา DAO ออกไปครับ
ถ้าอยากใช้ DAO ก็เพิ่ม reference ตัวนี้เข้าไป

13
เป็นช่อง เลขใบกำกับภาษีค่ะ

เมื่อกดเริ่มเขียนใหม่ ในฟอร์ม ช่องเลขใบกำกับภาษีต้องกรอกเอง อยู่ค่ะ  ถ้าจะเปลี่ยนเป็นให้ขึ้นมาให้เลย 6 หลัก โดยเรียง 000001,000002,000003

โดยถ้าลบแล้วสามารถย้อนไปเลขที่ลบ เพื่อเขียนข้อมูลใหม่ได้ ต้องแก้ยังไงคะ
Single form หรือ Continuesform ครับ
ส่งไฟล์โปรแกรมที่ทำมาเดี่ยว เพิ่มให้ครับ




14
ลองดูโค๊ดนี้ว่าได้ไหม ช่วยๆกันสาย DIY

โค๊ด: [Select]
Private Sub QRCode_AfterUpdate()
Dim strLetterName As String
Dim intNum As Integer
Dim i As Long
Dim rst As DAO.Recordset
    Set rst = CurrentDb.OpenRecordset("table1", dbOpenDynaset)

strLetterName = Left(QRCode, 6)
intNum = Right(QRCode, 3)

For i = 1 To Me.Text0

rst.AddNew
rst!Bcode = strLetterName & intNum
rst.Update
intNum = intNum + 100
Next
rst.Close
Set rst = Nothing
Me.Recalc
End Sub

แต่ความต้องการคือให้ + 100 ไปเรื่อยๆหรือไม่เช่น
ถ้า 6 ครั้ง ก็จะได้ AAABBB100 - AAABBB600
แต่ถ้า 15 ครั้ง Bcode จะเป็น AAABBB100 - AAABBB1500

หรือจะปรับแก้ยังไงก็บอกนะครับ

15

ลองดูตัวอย่างนี้นะครับ ไม่รู้จะเวิคไหมนะ
โค๊ดจะแสดงผล ในมุมมอง Print Preview หรือ มุมมองเหมือนพิมพ์นะครับ
โค๊ดจะอยู่ใน Event Report Detail นะครับ

Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer) 'ตรง รายละเอียด ถ้าเป็นภาษาอังกฤษให้เปลี่ยนเป็น Detail_Print แทนรายละเอียด
Dim ctl As Control, strText As Variant, strName As String
    Me.ScaleMode = 1
    For Each ctl In Me.Detail.Controls 'ตรง รายละเอียด ถ้าเป็นภาษาอังกฤษให้เปลี่ยนเป็น Me.Detail แทนรายละเอียด
        If ctl.ControlType = acTextBox Then
        If ctl.Name = "CustomerName" Then 'สีแดงคือชื่อ textbox ที่ต้องการปรับขนาดข้อความ
       
        strName = ctl.Name
            If Nz(ctl.Tag, "") = "" Then
                ctl.Tag = ctl.FontSize
            End If
            ctl.FontSize = ctl.Tag
            Me.FontSize = ctl.FontSize
            strText = ctl.Value
           If Len(strText) > 0 Then
            Do Until TextWidth(strText) < ctl.Width
                ctl.FontSize = ctl.FontSize - 1
                Me.FontSize = ctl.FontSize
            Loop
            Do Until TextHeight(strText) < ctl.Height - (ctl.Height * 0.26)
                ctl.FontSize = ctl.FontSize - 1
                Me.FontSize = ctl.FontSize
            Loop
        End If
        End If
       End If
    Next ctl

End Sub

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

ถ้าไม่เข้าใจตรงโค้ด AddnewSQL กับ UpdateSQL ให้ดูการกำหนดคิวรี่ที่ผมใส่ไว้ให้ด้วยนะครับ
ทั้ง 2 คิวรี่นั้นคือคิวรี่ที่นำไปใช้เขียนโค๊ด โดยมีการกำหนดเงื่อนไขไว้แล้ว คิวรี่ 2 อันนั้น สามารถลบทิ้งได้
เพราะผมสร้างไว้ให้ดูการกำหนดเงื่อนไขเฉยๆ
โดยเงื่อนไขการอัพเดทผมเช็คจาก Field PersonalName นะครับ ถ้าส่วนนี้ไม่เหมือนกันจะอัพเดทใหม่

ตัวอย่างโค๊ด
โค๊ด: [Select]
Private Sub Command0_Click()
'ตัวอย่างโค้ดการนำเข้าข้อมูลโดยมี Dialog ให้เลือกไฟล์เข้ามา
Dim dlg As FileDialog
Dim sql, Deletesql, AddnewSQL, UpdateSQL As String
Dim DB As DAO.Database
Dim DBaddnew As DAO.Database
Dim DBupdate As DAO.Database

Set DB = CurrentDb
Set DBaddnew = CurrentDb
Set DBupdate = CurrentDb

If MsgBox("คุณต้องการนำเข้าข้อมูลใหม่หรือไม่", vbQuestion + vbYesNo, "ระบบสอบถาม") = vbYes Then
Set dlg = Application.FileDialog(msoFileDialogFilePicker)
With dlg
.Title = "Select the Excel file to import"
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "Excel Files", "*.xls*", 1
.Filters.Add "All Files", "*.*", 2

If .Show = -1 Then
StrFileName = .SelectedItems(1)
Deletesql = "DELETE * FROM TempImport;" 'สั่งให้ลบข้อมูลของตารางสำรองให้หมดก่อนเพื่อรอรับข้อมูลนำเข้าใหม่ที่จะเข้ามา
DB.Execute Deletesql
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "TempImport", StrFileName, True 'นำเข้าไปยังตารางชื่อ TempImport
Else
Exit Sub
End If
End With
End If

'โค้ดสำหรับเพิ่มข้อมูลใหม่ที่ไม่เคยมีรหัสบัตรประชาชน
AddnewSQL = "INSERT INTO tblDataMain ( PersonalID, PersonalName ) " _
& "SELECT TempImport.PersonalID, TempImport.PersonalName " _
& "FROM TempImport WHERE (((TempImport.PersonalID) Not In (select personalID from [tblDataMain])));"

'โค้ดสำหรับอัพเดทข้อมูลใน Field PersonalName ที่มีรหัสบัตรประชาชนตรงกัน
UpdateSQL = "UPDATE tblDataMain INNER JOIN TempImport ON tblDataMain.PersonalID = " _
& "TempImport.PersonalID SET tblDataMain.PersonalName = [TempImport].[PersonalName] " _
& "WHERE (((tblDataMain.PersonalName)<>[TempImport].[PersonalName]) AND ((tblDataMain.PersonalID)=[TempImport].[PersonalID]));"

DBaddnew.Execute AddnewSQL
DBupdate.Execute UpdateSQL

MsgBox "อัพเดทจำนวน " & DBupdate.RecordsAffected & vbCrLf & "เพิ่มใหม่จำนวน " & DBaddnew.RecordsAffected, vbInformation, "Myprogram"
End Sub

หน้า: [1] 2 3 4 ... 43