Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Lỗi] Lỗi Syntax error in FROM clause
#1
Em chào các bác ạ, em có sử dụng 2 bộ code: import dữ liệu từ excel vào table access và trích xuất ngẫu nhiên dữ liệu từ table nguồn sang table đích. Khi sử dụng riêng lẻ thì tốt, mà chắc do kiến thức em còn hạn hẹp nên khi ghép vào chương trình của mình để dùng thì bị lỗi, các bác có thể xem qua cho em tại sao không ạ.
- Mục đích của chương trình là: chọn file hàng hóa tổng làm nguồn lấy dữ liệu--> xuất nó vào trong table nguồn--> trích ngẫu nhiên dữ liệu với 1 số điều kiện (Điều kiện này thì đã áp vào OK rồi ạ) để xuất sang table đích--> xuất những hàng hóa đạt điều kiện ở table đích vào file Word có sẵn.
- Bây giờ nếu dùng code riêng lẻ thì trong table T_PAKD-nguon phải có trường "Stt" là dạng Autunumber để có thể random hàng hóa, nhưng giờ là phải nhập file excel từ bên ngoài vào thì cái trường "Stt" nếu để trắng thì tự chuyển Text, nếu đánh số vào thì sang Number, nhưng cũng không thể random được như dùng riêng lẻ, -->nên đã không random được thì nó cũng xuất sang Word bị sai.

File chương trình của em đây ạ. Các bác xem hộ em, em xin cảm ơn ạ!
Chữ ký của vuthaiha90 vuthaiha90,gia nhập Thủ Thuật Access từ 26-02 -16.
Reply
Những người đã cảm ơn
#2
1. Vấn đề Import: chuyện import sẽ rất đơn giản nếu bạn không thêm câu lệnh "DeleteObject acTable", nó xoá mất cái table nguồn luôn rồi xong tạo lại table nguồn mới và khi đó Access sẽ tự suy từ các cột trong sheet Excel ra kiểu định dạng và thiết lập tương tự cho table nguồn Access.
- Bạn tạo table nguồn có field STT là AutoNumber và Primary Key.
- Chạy lệnh import excel của bạn là table nguồn sẽ tự động tạo STT thôi. Chú ý file Excel cũng phải có cột STT.
- Sau này muốn import tiếp file excel khác thì bạn chỉ chạy code xoá nội dung table thôi chứ không xoá luôn cái table. Thay thế lênh DeleteObject bằng Currentdb.Execute "DELETE * FROM TableNguon", dbFailOnError. Chú ý dấu nháy kép trong câu lệnh này. Bạn đặt sai dấu nháy kép nên báo lỗi "Error FROM..."

2. Chú ý: đừng đặt tên Table, Form, Report có dùng dấu gạch nối "-". Nếu bạn dùng dấu này thì trong câu lệnh SQL bạn phải bỏ tên table vào giữa 2 dấu ngoặc vuông [...] Access mới hiểu đúng và xử lý đúng. VD: "DELETE * FROM [T_PAKD-Nguon]". Trong code của bạn, nếu không đổi tên table hoặc dùng dấu [ ] nó sẽ chạy làm treo máy đó.
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn maidinhdan , Minh Tiên , vuthaiha90
#3
(24-05-18, 08:42 PM)ongke0711 Đã viết: 1. Vấn đề Import: chuyện import sẽ rất đơn giản nếu bạn không thêm câu lệnh "DeleteObject acTable", nó xoá mất cái table nguồn luôn rồi xong tạo lại table nguồn mới và khi đó Access sẽ tự suy từ các cột trong sheet Excel ra kiểu định dạng và thiết lập tương tự cho table nguồn Access.
- Bạn tạo table nguồn có field STT là AutoNumber và Primary Key.
- Chạy lệnh import excel của bạn là table nguồn sẽ tự động tạo STT thôi. Chú ý file Excel cũng phải có cột STT.
- Sau này muốn import tiếp file excel khác thì bạn chỉ chạy code xoá nội dung table thôi chứ không xoá luôn cái table. Thay thế lênh DeleteObject bằng Currentdb.Execute "DELETE * FROM TableNguon", dbFailOnError. Chú ý dấu nháy kép trong câu lệnh này. Bạn đặt sai dấu nháy kép nên báo lỗi "Error FROM..."

2. Chú ý: đừng đặt tên Table, Form, Report có dùng dấu gạch nối "-". Nếu bạn dùng dấu này thì trong câu lệnh SQL bạn phải bỏ tên table vào giữa 2 dấu ngoặc vuông [...] Access mới hiểu đúng và xử lý đúng. VD: "DELETE * FROM [T_PAKD-Nguon]". Trong code của bạn, nếu không đổi tên table hoặc dùng dấu [ ] nó sẽ chạy làm treo máy đó.

1- Dạ, em đã sửa theo lời của bác, chạy tốt rồi ạ, tại em biết câu DeleteObject trước nên cứ nghĩ câu Currentdb.Execute "DELETE * cũng vậy, bảo sao không làm ra.
2- Cho em hỏi thêm câu lệnh xóa 1 cột và 1 dòng mình thích trong "Doc.Tables(x)" với, vì trong lệnh lặp em có cho thêm "Doc.Tables(x).Rows.Add" nếu phát hiện còn dữ liệu, thành ra thừa mất dòng cuối; với bảng trong Word không cần cột Số thự tự nên xuất từ Table ra cũng thừa mất 1 cột.
Em cảm ơn ạ.
Chữ ký của vuthaiha90 vuthaiha90,gia nhập Thủ Thuật Access từ 26-02 -16.
Reply
Những người đã cảm ơn
#4
- Tôi chưa đọc hết code xuất Word của bạn nhưng để không xuất cột STT thì bạn thêm điều kiện: Nếu Field.Name ="STT" thì bỏ qua, nhảy qua field kế tiếp xử lý.
- Còn việc xoá dòng, tôi nghĩ bạn xuất 1 table hoàn toàn mới thì làm sao có dư dòng nhỉ.
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#5
(25-05-18, 10:27 AM)ongke0711 Đã viết: - Tôi chưa đọc hết code xuất Word của bạn nhưng để không xuất cột STT thì bạn thêm điều kiện: Nếu Field.Name ="STT" thì bỏ qua, nhảy qua field kế tiếp xử lý.
- Còn việc xoá dòng, tôi nghĩ bạn xuất 1 table hoàn toàn mới thì làm sao có dư dòng nhỉ.
1. Của em là dạng tới ô cuối cùng, đếm số ô, rồi quay ngược về đầu đếm số cột, vậy giờ em lấy số cột trừ đi 1 ạ, hay em thêm câu lệnh if nếu tên cột là STT thì bỏ đi vào đâu ạ?
Mã:
Set dbs = CurrentDb
      Set rst = dbs.OpenRecordset("T_PAKD-dich", dbOpenSnapshot)
      With rst
          If .RecordCount <> 0 Then
              .MoveLast   'Ensure proper count
              iRecCount = .RecordCount    'Number of records returned by the table/query'
              .MoveFirst
              iFldCount = .Fields.Count   'Number of fields/columns returned by the table/query'
             
              tblNoInDoc = 1  'So thu tu cua table trong file Doc'
              Set oWordTbl = Doc.Tables(tblNoInDoc)
              'Them cot'
              With Doc.Tables(tblNoInDoc)
                  .Select
                  Do Until .Columns.Count = iFldCount
                      .Columns.Add
                      .Columns.AutoFit
                  Loop
              End With
For i = 1 To iRecCount
                   Doc.Tables(tblNoInDoc).Rows.Add
                        oWordTbl.Cell(i + 1, 1) = Nz(rst.Fields(0).Value, "")
                        oWordTbl.Cell(i + 1, 1).Range.ParagraphFormat.Alignment = 0 '0 la can trai
                        oWordTbl.Cell(i + 1, 1).Range.Cells.VerticalAlignment = 1
...............................................
.MoveNext
               Next i
           End If
       
        i = i + 1
        Doc.Tables(tblNoInDoc).Rows.Add
        Doc.Tables(tblNoInDoc).Cell(i, 1).Range.Text = "T" & ChrW(7892) & "NG C" & ChrW(7896) & "NG"
        Doc.Tables(tblNoInDoc).Cell(i, 5).Range.Text = Format(DSum("Thanhtienmua", "T_PAKD-nguon"), "#,##0")
        Doc.Tables(tblNoInDoc).Cell(i, 7).Range.Text = Format(DSum("Thanhtienban", "T_PAKD-nguon"), "#,##0")
       End With
2. Dạ, nó thuộc phần khác của chương trình nhưng cũng dạng xuất dữ liệu từ tabel vào word, mà em cứ bị thừa dòng trên của dòng TỔNG CỘNG, có phải do em có lệnh "If DLookup("NgayphongtoaSTKnay", "T_CamcoSTK") <> "" Then" nên nó cứ tạo thêm 1 dòng: đúng thì ghi thêm chữ, sai thì để trằng không ạ. Em cũng nghĩ nếu dùng cách 1 ở trên thì không tạo ra dòng thừa được nhưng mà nó lại bị lỗi cũng ở đoạn "If DLookup("NgayphongtoaSTKnay", "T_CamcoSTK") <> "" Then" (thì gộp ô vào thêm chữ "đã nhập kho")
Mã:
Dim db As DAO.Database
Dim rs As DAO.Recordset

Dim y As Long
Dim oApp As Object
Dim Doc As Object
Dim strDocName As String

Set oApp = CreateObject("Word.Application")
oApp.Visible = True
strDocName = """" & CurrentProject.Path & "\Word\CC" & "\Mau so 01_Phuong an su dung von.doc" & """"
Set Doc = oApp.Documents.Add(strDocName)

Set db = CurrentDb
Set rs = db.OpenRecordset("Q_STKDH", dbOpenSnapshot)
   
   If rs.EOF Then
       Exit Sub
   Else
       rs.MoveFirst
   End If
   y = 3
   
   Do
   
   Doc.Tables(2).Cell(y, 1).Range.Text = rs.Fields![STT].Value
   Doc.Tables(2).Cell(y, 2).Range.Text = rs.Fields![TenTS].Value
   Doc.Tables(2).Cell(y, 3).Range.Text = rs.Fields![SosoTK].Value
   Doc.Tables(2).Cell(y, 4).Range.Text = Format(rs.Fields![Trigiaso].Value, "##,##0") & ChrW$(273)
   Doc.Tables(2).Cell(y, 5).Range.Text = IIf(rs.Fields![Kyhan].Value < 10, "0" & rs.Fields![Kyhan].Value, rs.Fields![Kyhan].Value) & " Tháng"
   Doc.Tables(2).Cell(y, 6).Range.Text = rs.Fields![Laisuatgui].Value & "%/n" & ChrW$(259) & "m"
   Doc.Tables(2).Cell(y, 7).Range.Text = rs.Fields![Noiphathanh].Value
   
   If DLookup("NgayphongtoaSTKnay", "T_CamcoSTK") <> "" Then
   Doc.Tables(2).Cell(y, 8).Range.Text = rs.Fields![NgayTraLai].Value
   Else
   Doc.Tables(2).Cell(y, 8).Range.Text = rs.Fields![Ngaydenhan].Value
   End If
   
   rs.MoveNext
   y = y + 1
   Doc.Tables(2).Rows.Add
   Loop Until rs.EOF
   
   rs.Close
     
   If DLookup("NgayphongtoaSTKnay", "T_CamcoSTK") <> "" Then

   Doc.Tables(2).Cell(y, 1).Merge Doc.Tables(2).Cell(y, 8)
   Doc.Tables(2).Cell(y, 1).Range.Text = "(Tài s" & ChrW(7843) & "n " & ChrW(273) & "ang nh" & ChrW(7853) & "p kho t" & ChrW(7841) & "i NHHT-CNTB)"
   End If

   y = y + 1
   Doc.Tables(2).Cell(y, 2).Range.Text = "T" & ChrW(7893) & "ng:"
   Doc.Tables(2).Cell(y, 4).Range.Text = Format(DSum("trigiaso", "Q_STKDH"), "##,##0") & ChrW$(273)
   'Format bold last row'
   Doc.Tables(2).Cell(y, 2).Range.Font.Bold = True
   Doc.Tables(2).Cell(y, 4).Range.Font.Bold = True
Chữ ký của vuthaiha90 vuthaiha90,gia nhập Thủ Thuật Access từ 26-02 -16.
Reply
Những người đã cảm ơn
#6
1. Để bỏ bớt 1 côt thừa (cột STT) thì bạn chỉ cần giảm 1 khi khai báo số lượng Field:
  iFldCount = .Fields.Count 1
Cũng vô tình code của bạn chạy đúng khi add thêm dòng cho table này. Code tuần tự thêm dòng của bạn là: oWordTbl.cell(i + 1, 1) = Nz(rst.Fields(1).Value, "") ==> Field(1) tức là bạn chỉ thêm dữ liệu của field "Tên hàng hoá" - cột thứ 2 chứ không phải cột "STT" là Field (0). Index của cột tính từ số 0.
2. Code này chưa hình dung được nên không biết cách sửa. 007
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn vuthaiha90
#7
(25-05-18, 02:28 PM)ongke0711 Đã viết: 1. Để bỏ bớt 1 côt thừa (cột STT) thì bạn chỉ cần giảm 1 khi khai báo số lượng Field:
  iFldCount = .Fields.Count 1
Cũng vô tình code của bạn chạy đúng khi add thêm dòng cho table này. Code tuần tự thêm dòng của bạn là: oWordTbl.cell(i + 1, 1) = Nz(rst.Fields(1).Value, "") ==> Field(1) tức là bạn chỉ thêm dữ liệu của field "Tên hàng hoá" - cột thứ 2 chứ không phải cột "STT" là Field (0). Index của cột tính từ số 0.

Dạ, iFldCount = .Fields.Count 1 đã loại bỏ bớt đi cột thừa rồi ạ. Còn em biết là đếm từ số 0 nên em cho bắt đầu chạy từ số 1, nhưng rõ ràng có 8 cột mà trích ra 7 nên có 1 cột trằng. Giờ đã OK rồi ạ
- Còn vụ thừa dòng thì em so sánh giữa 2 file Word rồi ạ, 1 bên có 1 dòng, 1 bên có 2 dòng nguyên bản từ đầu, nên bên có 2 dòng có dùng code gì đi nữa thì vẫn thừa, chứ không phải do lệnh "If" hay lệnh "AddRow" đặt bị nhầm.
Em cảm ơn ạ
Chữ ký của vuthaiha90 vuthaiha90,gia nhập Thủ Thuật Access từ 26-02 -16.
Reply
Những người đã cảm ơn


Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ| PMA Nha Trang| Gỗ Acrylic Không Đường Line