-
RE: Làm thế nào để dùng SQL trong lập trình?
ongke0711 > 10-06-21, 02:49 PM
(10-06-21, 02:22 PM)Đình Phán Đã viết:
Mã:
'Lay du lieu tu bang tam vao bang AccountInfo
mySQL = "INSERT INTO tblAccountInfo"
mySQL = mySQL + " SELECT tbl_temp.* FROM tbl_temp;"
mySQL = mySQL + " WHERE ((tbl_temp.[F1]) > 0);"
DoCmd.RunSQL mySQL
Loop
Nói thêm để bạn hiểu vì sao sai ở đoạn code này.
- Đối với "INSERT INTO..." bạn dùng "SELECT * FROM..." thì bắt buộc phải trùng tên Field ở cả 2 Table. Đó là lý do nó báo lỗi không tìm thấy field [F1] trong tblAccountInfo ...
- Để không báo lỗi thì buộc phải liệt kê tên Field ở cả 2 Table.
Vd: INSERT INTO tblAccountInfo (LineNo, Department, ...) SELECT F1, F2,... FROM TBL_temp ....
Đây là cú pháp qui định của Access SQL. -
RE: Làm thế nào để dùng SQL trong lập trình?
Đình Phán > 10-06-21, 03:35 PM
(10-06-21, 02:49 PM)ongke0711 Đã viết:
(10-06-21, 02:22 PM)Đình Phán Đã viết:
Mã:
'Lay du lieu tu bang tam vao bang AccountInfo
mySQL = "INSERT INTO tblAccountInfo"
mySQL = mySQL + " SELECT tbl_temp.* FROM tbl_temp;"
mySQL = mySQL + " WHERE ((tbl_temp.[F1]) > 0);"
DoCmd.RunSQL mySQL
Loop
Nói thêm để bạn hiểu vì sao sai ở đoạn code này.
- Đối với "INSERT INTO..." bạn dùng "SELECT * FROM..." thì bắt buộc phải trùng tên Field ở cả 2 Table. Đó là lý do nó báo lỗi không tìm thấy field [F1] trong tblAccountInfo ...
- Để không báo lỗi thì buộc phải liệt kê tên Field ở cả 2 Table.
Vd: INSERT INTO tblAccountInfo (LineNo, Department, ...) SELECT F1, F2,... FROM TBL_temp ....
Đây là cú pháp qui định của Access SQL.
Đây chính là câu trả lời cho em sáng tỏ vấn đề lỗi của em ạ. -
RE: Làm thế nào để dùng SQL trong lập trình?
Đình Phán > 10-06-21, 03:39 PM
(10-06-21, 02:36 PM)paulsteigel Đã viết: Okie bạn.
Mình làm như này:L
1. Link (chọn cách 5 cho tiện) bảng excel Export_Accounts_DuLieuHachToan_20210609204601.xlsx
2. Tạo một querry dựa trên các cột của tblAccountInfo
Mã PHP:SELECT a.LineNo, a.Organization, a.Department, a.AdvanceRequest, a.DepartmentIsOrg, a.AccountDate, a.DueDate, a.DocumentRecord, a.DocumentNo, a.SubDocNo, a.LocatorCredit, a.IsMapping, a.Locator, a.[Code Booking], a.DebitAccount, a.CreditAccount, a.Currency, a.Rate, a.Quantity, a.UnitPrice, a.AccountedAmount, a.SourceAmount, a.BusinessPartnerDebit, a.BpartnerPartnerCredit, a.Description, a.DescriptionParent, a.Product, a.PostingType, a.Contract, a.PaymentSchedule, a.Invoice, a.Asset, a.Location, a.Construction, a.CIPPhase, a.GroupCost, a.GLDistribution, a.AccountingFact, a.Table, a.RecordID, a.BTSSite, a.SalesRegion, a.OriginalContract, a.Services, a.CashflowActivities, a.TypeOfRevenueERP, a.TypeOfRevenueBCCS, a.CreatedBy, a.UpdatedBy, a.OriginalConstruction, a.Project, a.UOM, a.TypeOfCost, a.AmountHaveTax, a.LicensePlate, a.PeriodExpense, a.Price, a.[Price/Liter], a.[Price/Month], a.[Price/GrPaper], a.[Price/Print], a.Product_Object, a.Quantity_Object, a.Quantity_Banderol, a.Quantity_Employee, a.Quantity_Hour, a.Quantity_lnk, a.Quantity_Km, a.Quantity_Kw, a.Quantity_M3, a.Quantity_MaxKw, a.Quantity_Megabite, a.Quantity_Message, a.Quantity_MinKw, a.Quantity_Minutes, a.[Quantity_Liter Oil], a.Quantity_People, a.Quantity_SIM, a.Quantity_SRCTV, a.Quantity_TRX, a.Quantity_Liter, a.Rate_Percent, a.Set, a.[ShareForCo-operate], a.ShareRatio, a.ShareRevenue, a.Shift_Quantity, a.LocationCode, a.Service_Object, a.GroupAsset, a.TaxBase, a.TypeOfCollaborator, a.LisencePlate, a.Commissions, a.SalesAdvertisingSponsor, a.TypeOfCallCenter, a.Type_Tax, a.SalesPolicy, a.MeansOfTransport, a.TypeOfAdvertising, a.TypeofVasService, a.[Connection-inter-roaming], a.TOC_InterType, a.Codeof_IPTransit_IPLC, a.TypeofOperation, a.CodeofAPLcustomer, a.Maintenance, a.TOC_BTS, a.TOC_Unit1, a.TOC_Unit2, a.TOC_Qty1, a.TOC_Qty2, a.CostObject, a.TOCCategoryShowroom, a.TOCContractElectric, a.TOCContractTransit, a.TOCContractLoan, a.TOCContractSign, a.TOCContractCapex, a.DateInvoiced, a.Period, a.DistributionTo, a.DepartmentSub, a.DistributionFrom, a.BankAccount, a.BranchRequest, a.BankAccountCredit, a.CashBook, a.CashbookCredit, a.Requester, a.ExpenseGroup, a.VATCode, a.Supplier, a.RequestType, a.TransferType, a.RateToVND
FROM tblAccountInfo AS a;
Sửa đoạn này FROM tblAccountInfo AS a; thành FROM Export_Accounts_DuLieuHachToan AS a. Đây cũng chính là tên bảng Excel link. Mới sơ sơ thì thấy bạn có rất nhiều trường (khoảng 80 trường) không có trong danh sách trường của bảng tblAccountInfo
Mã PHP:LineNo
AdvanceRequest
DepartmentIsOrg
AccountDate
DueDate
DocumentRecord
DocumentNo
LocatorCredit
DebitAccount
CreditAccount
UnitPrice
AccountedAmount
SourceAmount
BusinessPartnerDebit
BPartnerPatnerCredit
PaymentSchedule
CIPPhase
GroupCost
GLDistribution
AccountingFact
RecordId
BTSSite
SaleRegion
OriginalContract
CashFlowActivities
TypeOfRevenueERP
TypeOfRevenueBCCS
CreatedBy
UpdatedBy
OriginalConstruction
TypeOfCost
AmountHaveTax
LicensePlate
PeriodExpense
Price/GrPaper
Product_Object
Quantity_Object
Quantity_Banderoll
....
Như vậy thì có thể chốt lại như sau: bảng excel nhập vào và bảng đích chả tương đồng gì thì bạn nhập làm sao.
Muốn nhập được thành công, hãy chỉnh sửa bảng excel sao cho ít ra nó tương đồng về tên cột với bảng đích rồi làm mới được.
Lời góp ý: bạn cũng có thể liệt kê tên các trường cần nhập vào từ file excel đó rồi chỉ cần dùng Insert into... Select From dựa vào bảng excel đã link ý.
Hãy cố lên nào
Thân.
Đúng là em có thay đổi tên field để thuận tiện cho việc xử lý các báo cáo khác, tblAccountInfo là data, em sẽ xào nấu trên bảng này.
Em thấy anh có câu lệnh tìm ra tất cả các tên trường, anh gợi ý giúp em với ạ.
Ngoài ra còn 1 câu về xử lý ô trống thành giá trị 0 (format Number), anh cho em xin giải pháp ạ. -
RE: Làm thế nào để dùng SQL trong lập trình?
Đình Phán > 10-06-21, 04:55 PM
Chào các anh
Mã:'Lay du lieu tu bang tam vao bang AccountInfo
mySQL = "INSERT INTO tblAccountInfo (LineNo, Organization, Department, AdvanceRequest, DepartmentIsOrg, AccountDate, DueDate, DocumentRecord, DocumentNo, SubDocNo, LocatorCredit, IsMapping, " & _
"Locator, CodeBooking, DebitAccount, CreditAccount, Currency, Rate, Quantity, UnitPrice, AccountedAmount, SourceAmount, BusinessPartnerDebit, BpartnerPartnerCredit, Description, DescriptionParent, Product, PostingType, Contract, PaymentSchedule, Invoice, Asset,Location, Construction, CIPPhase, GroupCost, GLDistribution, AccountingFact, Table, RecordID, BTSSite, SalesRegion, OriginalContract, Services, CashflowActivities, TypeOfRevenueERP, TypeOfRevenueBCCS, CreatedBy, UpdatedBy, OriginalConstruction, Project, UOM, TypeOfCost, AmountHaveTax, LicensePlate, PeriodExpense, Price, Price_Liter, Price_Month, Price_GrPaper, Price_Print, Product_Object, Quantity_Object, Quantity_Banderol, Quantity_Employee, Quantity_Hour, Quantity_lnk, Quantity_Km, Quantity_Kw, Quantity_M3, Quantity_MaxKw, Quantity_Megabite, Quantity_Message, Quantity_MinKw, Quantity_Minutes," & _
"Quantity_LiterOil, Quantity_People, Quantity_SIM, Quantity_SRCTV, Quantity_TRX,Quantity_Liter, Rate_Percent, Set, ShareForCoOperate, ShareRatio, ShareRevenue, Shift_Quantity, LocationCode, Service_Object, GroupAsset, TaxBase, TypeOfCollaborator, LisencePlate, Commissions, SalesAdvertisingSponsor, TypeOfCallCenter, Type_Tax, SalesPolicy, MeansOfTransport, TypeOfAdvertising, TypeofVasService, Connection-inter-roaming, TOC_InterType, Codeof_IPTransit_IPLC, TypeofOperation, CodeofAPLcustomer, Maintenance, TOC_BTS, TOC_Unit1, TOC_Unit2, TOC_Qty1, TOC_Qty2, CostObject, TOCCategoryShowroom, TOCContractElectric, TOCContractTransit, TOCContractLoan, TOCContractSign, TOCContractCapex, DateInvoiced, Period, DistributionTo, DepartmentSub, DistributionFrom, BankAccount, BranchRequest, BankAccountCredit, CashBook, CashbookCredit, Requester, ExpenseGroup, VATCode, Supplier, RequestType, TransferType, RateToVND)"
mySQL = mySQL + " SELECT A.F1, A.F2, A.F3, A.F4, A.F5, A.F6, A.F7, A.F8, A.F9, A.F10, A.F11, A.F12, A.F13, A.F14, A.F15, A.F16, A.F17, A.F18, A.F19, A.F20, A.F21, A.F22, A.F23, A.F24, A.F25, A.F26, A.F27, A.F28, A.F29, A.F30, A.F31, A.F32, A.F33, A.F34, A.F35, A.F36, A.F37, A.F38, A.F39, A.F40, A.F41, A.F42, A.F43, A.F44, A.F45, A.F46, A.F47, A.F48, A.F49, A.F50, A.F51, A.F52, A.F53, A.F54, A.F55, A.F56, A.F57, A.F58, A.F59, A.F60, A.F61, A.F62, A.F63, A.F64, A.F65, A.F66, A.F67, A.F68, A.F69, A.F70, A.F71, A.F72, A.F73, A.F74, A.F75, A.F76, A.F77, A.F78, A.F79, A.F80, A.F81, A.F82, A.F83, A.F84, A.F85, A.F86, A.F87, A.F88, A.F89, A.F90, A.F91, A.F92, A.F93, A.F94, A.F95, A.F96, A.F97, A.F98, A.F99, A.F100, A.F101, A.F102, A.F103, A.F104, A.F105, A.F106, A.F107, A.F108, A.F109, A.F110, A.F111, A.F112, A.F113, A.F114, A.F115, A.F116, A.F117, A.F118, A.F119, A.F120, A.F121, A.F122, A.F123, A.F124, A.F125, A.F126, A.F127, A.F128, A.F129, A.F130, A.F131, A.F132, A.F133," & _
"A.F134, A.F135, A.F136 FROM tbl_temp as A"
mySQL = mySQL + " WHERE ((tbl_temp.[F1]) > 0);"
DoCmd.RunSQL mySQL
Do không thể viết quá dài nên em có ngắt trang xuống dưới, nhưng bị báo lỗi cú pháp INSERT INTO ạ.
Mong các anh giúp đỡ -
RE: Làm thế nào để dùng SQL trong lập trình?
paulsteigel > 10-06-21, 05:09 PM
(10-06-21, 03:39 PM)Đình Phán Đã viết: ....
Đúng là em có thay đổi tên field để thuận tiện cho việc xử lý các báo cáo khác, tblAccountInfo là data, em sẽ xào nấu trên bảng này.
Em thấy anh có câu lệnh tìm ra tất cả các tên trường, anh gợi ý giúp em với ạ.
Ngoài ra còn 1 câu về xử lý ô trống thành giá trị 0 (format Number), anh cho em xin giải pháp ạ.
Không ổn rồi, bạn vừa muốn xử lý đươc vấn đề, vừa muốn không bị lỗi. cách đây 2 bài thì bạn nhờ mình giúp thực hiện thành công bài toán của bạn. Haiz!
Access, SQL ...vv đều cần tôn trọng một niêm luật là tính chính xác, lô gic. Bạn đang vừa muốn thực hiện một bước tiến lớn nhưng lại chưa bước qua được một rào cản nhỏ. Giờ mình khuyến nghị bạn thế này. Tất nhiên trước khi khuyến nghị mình trả lời câu hỏi này cho bạn
1. lấy tên tất cả các trường....: Rất dễ dàng, mình chỉ đơn giản dùng bộ công cụ thiết kế query của Access và lôi tất cả tên trường vào là có danh sách các trường. Không cần thiết phải đòi hỏi cao siêu quá, nhiều khi có thể code (tôi cũng có code lấy danh sách tất cả các trường của một bảng), nhưng vì mục tiêu hiệu quả, đôi khi không cần làm vậy.
Lời nhắc 1: Hãy sử dụng công cụ thiết kế một cách hiệu quả và tối ưu. Đừng lúc nào cũng nghĩ đến code.
Bài toán trên của bạn sẽ làm được một cách rất đơn giản và ngắn gọn.
Bước 1: Tạo danh sách các trường cần lấy để đưa vào bảng dữ liệu access
Bước 2: đổi tên cột trên bảng Excel sao cho thật chuẩn theo danh sách này. Tất nhiên phải đảm bảo kiểu dữ liệu chuẩn mực của các trường với nhau không lỗi kiểu dữ liệu (data type mismatch) sẽ xảy ra khi chạy;
+ Trường hợp thực sự cần phải có tên khác trên biểu excel thì có thể phải làm một bước phụ trong query như sau (tôi nghĩ đâu có cần phải phức tạp hóa như vậy):
Select Fieldexcel1 as FieldungAccess1, Fieldexcel2 as FieldungAccess2 ....
Bước 3: Link bảng excel vào cơ sở dữ liệu (nếu phải thường xuyên dùng nó, còn không thì dùng câu lệnh kết nối ADODB với cơ sở dữ liệu Excel như thế này (tùy thuộc phiên bản Office của bạn nhé - cái này cho Ofice 2007 giở lên)
Mã PHP:Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES";
Lưu ý 2: Tránh dùng công cụ Transferdatabase vì nó không ổn, khó kiểm soát sự chuẩn hóa dữ liệu như đã phân tích.
Về câu hỏi của bạn liên quan đến số 0.. xyz, bạn chỉ cần phải xử lý vấn đề này khi kiểu dữ liệu của bạn có vấn đề và cần phải xử trí điều này ở cấp từng dòng dữ liệu bằng các query riêng rẽ.
Bạn có thể sử dụng nz trong query như sau:
Select a.A, a.B, nz(a.C, 0) as fieldC from LinkedExceltable
Với bài toán hiện tại của bạn thì bạn chưa phải đến bước này mà hãy giải quyết vấn đề mà tôi đã chỉ ra ở phần trên (tên trường khác nhau).
Chúc bạn thành công nhé! -
RE: Làm thế nào để dùng SQL trong lập trình?
ongke0711 > 10-06-21, 05:23 PM
(10-06-21, 04:55 PM)Đình Phán Đã viết: Chào các anh
Mã:'
mySQL = mySQL + " SELECT A.F1, A.F2, A.F3, A.F4, A.F5, A.F6, A.F7, A.F8, A.F9, A.F10, A.F11, A.F12, A.F13, A.F14, A.F15, A.F16, A.F17, A.F18, A.F19, A.F20, A.F21, A.F22, A.F23, A.F24, A.F25, A.F26, A.F27, A.F28, A.F29, A.F30, A.F31, A.F32, A.F33, A.F34, A.F35, A.F36, A.F37, A.F38, A.F39, A.F40, A.F41, A.F42, A.F43, A.F44, A.F45, A.F46, A.F47, A.F48, A.F49, A.F50, A.F51, A.F52, A.F53, A.F54, A.F55, A.F56, A.F57, A.F58, A.F59, A.F60, A.F61, A.F62, A.F63, A.F64, A.F65, A.F66, A.F67, A.F68, A.F69, A.F70, A.F71, A.F72, A.F73, A.F74, A.F75, A.F76, A.F77, A.F78, A.F79, A.F80, A.F81, A.F82, A.F83, A.F84, A.F85, A.F86, A.F87, A.F88, A.F89, A.F90, A.F91, A.F92, A.F93, A.F94, A.F95, A.F96, A.F97, A.F98, A.F99, A.F100, A.F101, A.F102, A.F103, A.F104, A.F105, A.F106, A.F107, A.F108, A.F109, A.F110, A.F111, A.F112, A.F113, A.F114, A.F115, A.F116, A.F117, A.F118, A.F119, A.F120, A.F121, A.F122, A.F123, A.F124, A.F125, A.F126, A.F127, A.F128, A.F129, A.F130, A.F131, A.F132, A.F133,"
mySQL = mySQL + "A.F134, A.F135, A.F136 FROM tbl_temp as A;"
mySQL = mySQL + " WHERE ((tbl_temp.[F1]) > 0);"
DoCmd.RunSQL mySQL
Do không thể viết quá dài nên em có ngắt trang xuống dưới, nhưng bị báo lỗi cú pháp INSERT INTO ạ.
Mong các anh giúp đỡ
Nhìn kinh thật.
Tôi sẽ xử lý theo kiểu khác chứ không dùng các tên field F1,F2... mà chẳng biết Field đó là gì. Nếu file Excel của bạn lỡ xui bị thay đổi thứ tự các cột thì Insert vô sẽ sai dữ liệu tùm lum.
Có 2 cách: Dùng Insert Into và dùng vòng lặp Recordset để ghi dữ liệu. Cả 2 cách đều phải thêm một thao tác là chuyển đổi tên field Excel thành tên Field Access rồi mới xử lý tiếp.
Sau khi xử lý đổi tên Field xong thì câu lệnh "INSERT INTO ....SELECT * FROM.." chạy ngon lành, ngắn gon.
Để đổi tên Field, tôi dùng bảng tra. Tạo 1 table có 1 cột tên Field Excel và tên Field Access --> gõ thủ công vô (hoặc chạy code lấy tên Field cho nhanh). Sau khi import file Excel vào table tạm -> đổi tên field -> Insert into vào table chính. -
RE: Làm thế nào để dùng SQL trong lập trình?
paulsteigel > 10-06-21, 05:25 PM
(10-06-21, 04:55 PM)Đình Phán Đã viết: Chào các anh
Mã:'Lay du lieu tu bang tam vao bang AccountInfo
.....
Do không thể viết quá dài nên em có ngắt trang xuống dưới, nhưng bị báo lỗi cú pháp INSERT INTO ạ.
Mong các anh giúp đỡ
Một trong những biện pháp tốt để tìm lỗi cú pháp SQL là, dùng màn hình thiết kế SQL.
1. Tạo SQL (ở chế độ SQL design)
2. Chuyển sang màn hình soạn code SQL View (bấm phải chuột ngoài khu vực bản bạn vừa chèn vào SQL
3. Dán đầy đủ đoạn code query của bạn vào rồi view query, Access sẽ bảo bạn lỗi gì
Mã PHP:mySQL = "INSERT INTO tblAccountInfo (LineNo, Organization, Department, AdvanceRequest, DepartmentIsOrg, AccountDate, DueDate, DocumentRecord, DocumentNo, SubDocNo, LocatorCredit, IsMapping, Locator, CodeBooking, DebitAccount, CreditAccount, Currency, Rate, Quantity, UnitPrice, AccountedAmount, SourceAmount, BusinessPartnerDebit, BpartnerPartnerCredit, Description, DescriptionParent, Product, PostingType, Contract, PaymentSchedule, Invoice, Asset,Location, Construction, CIPPhase, GroupCost, GLDistribution, AccountingFact, Table, RecordID, BTSSite, SalesRegion, OriginalContract, Services, CashflowActivities, TypeOfRevenueERP, TypeOfRevenueBCCS, CreatedBy, UpdatedBy, OriginalConstruction, Project, UOM, TypeOfCost, AmountHaveTax, LicensePlate, PeriodExpense, Price, Price_Liter, Price_Month, Price_GrPaper, Price_Print, Product_Object, Quantity_Object, Quantity_Banderol, Quantity_Employee, Quantity_Hour, Quantity_lnk, Quantity_Km, Quantity_Kw, Quantity_M3, Quantity_MaxKw, Quantity_Megabite, Quantity_Message, Quantity_MinKw, Quantity_Minutes, Quantity_LiterOil, Quantity_People, Quantity_SIM, Quantity_SRCTV, Quantity_TRX,Quantity_Liter, Rate_Percent, Set, ShareForCoOperate, ShareRatio, ShareRevenue, Shift_Quantity, LocationCode, Service_Object, GroupAsset, TaxBase, TypeOfCollaborator, LisencePlate, Commissions, SalesAdvertisingSponsor, TypeOfCallCenter, Type_Tax, SalesPolicy, MeansOfTransport, TypeOfAdvertising, TypeofVasService, Connection-inter-roaming, TOC_InterType, Codeof_IPTransit_IPLC, TypeofOperation, CodeofAPLcustomer, Maintenance, TOC_BTS, TOC_Unit1, TOC_Unit2, TOC_Qty1, TOC_Qty2, CostObject, TOCCategoryShowroom, TOCContractElectric, TOCContractTransit, TOCContractLoan, TOCContractSign, TOCContractCapex, DateInvoiced, Period, DistributionTo, DepartmentSub, DistributionFrom, BankAccount, BranchRequest, BankAccountCredit, CashBook, CashbookCredit, Requester, ExpenseGroup, VATCode, Supplier, RequestType, TransferType, RateToVND)
SELECT A.F1, A.F2, A.F3, A.F4, A.F5, A.F6, A.F7, A.F8, A.F9, A.F10, A.F11, A.F12, A.F13, A.F14, A.F15, A.F16, A.F17, A.F18, A.F19, A.F20, A.F21, A.F22, A.F23, A.F24, A.F25, A.F26, A.F27, A.F28, A.F29, A.F30, A.F31, A.F32, A.F33, A.F34, A.F35, A.F36, A.F37, A.F38, A.F39, A.F40, A.F41, A.F42, A.F43, A.F44, A.F45, A.F46, A.F47, A.F48, A.F49, A.F50, A.F51, A.F52, A.F53, A.F54, A.F55, A.F56, A.F57, A.F58, A.F59, A.F60, A.F61, A.F62, A.F63, A.F64, A.F65, A.F66, A.F67, A.F68, A.F69, A.F70, A.F71, A.F72, A.F73, A.F74, A.F75, A.F76, A.F77, A.F78, A.F79, A.F80, A.F81, A.F82, A.F83, A.F84, A.F85, A.F86, A.F87, A.F88, A.F89, A.F90, A.F91, A.F92, A.F93, A.F94, A.F95, A.F96, A.F97, A.F98, A.F99, A.F100, A.F101, A.F102, A.F103, A.F104, A.F105, A.F106, A.F107, A.F108, A.F109, A.F110, A.F111, A.F112, A.F113, A.F114, A.F115, A.F116, A.F117, A.F118, A.F119, A.F120, A.F121, A.F122, A.F123, A.F124, A.F125, A.F126, A.F127, A.F128, A.F129, A.F130, A.F131, A.F132, A.F133, A.F134, A.F135, A.F136 FROM tbl_temp as A; WHERE ((tbl_temp.[F1]) > 0);
Ở đoạn SQL dài ngoằng kia, bạn đang có 2 vấn đề:
1. FROM tbl_temp as A; thừa dấu ";"
2. Đoạn INsert into của bạn có 12 trường giở lên không có trong bảng tblAccountInfo;
Cách xử lý của tôi cho trường hợp này là:
1. thiết kế 2 Select query riêng rẽ để kiểm tra sự chuẩn mực các trường trước;
2. Sau đó thì dùng query designer để chuyển nó thành dạng Inser/ append / delet ...vv tùy theoo nhu cầu
Tôi thành thật đề nghị bạn nên nghiên cứu kỹ kỹ năng sử dụng Query designer trước khi bàn đến một vài kỹ năng nâng cao (dùng môt bảng lưu ánh xạ các tên trường).
3. nên sử dụng Alias trong query để tránh trường hợp tên trường trùng với từ khóa cấm của SQL. Tên trường sẽ có dạng alias.tentruong trong đó alias là bí danh của bảng.
Trước đây tôi còn dùng chế độ ghi màn hình để làm video nhưng giờ bỏ hết, tôi tìm tạm cho bạn một video về sử dụng SQL designer nhé
https://www.youtube.com/watch?v=WxGKLfWIJTU -
RE: Làm thế nào để dùng SQL trong lập trình?
Đình Phán > 10-06-21, 05:50 PM
(10-06-21, 05:23 PM)ongke0711 Đã viết: Nhìn kinh thật.
Tôi sẽ xử lý theo kiểu khác chứ không dùng các tên field F1,F2... mà chẳng biết Field đó là gì. Nếu file Excel của bạn lỡ xui bị thay đổi thứ tự các cột thì Insert vô sẽ sai dữ liệu tùm lum.
Có 2 cách: Dùng Insert Into và dùng vòng lặp Recordset để ghi dữ liệu. Cả 2 cách đều phải thêm một thao tác là chuyển đổi tên field Excel thành tên Field Access rồi mới xử lý tiếp.
Sau khi xử lý đổi tên Field xong thì câu lệnh "INSERT INTO ....SELECT * FROM.." chạy ngon lành, ngắn gon.
Để đổi tên Field, tôi dùng bảng tra. Tạo 1 table có 1 cột tên Field Excel và tên Field Access --> gõ thủ công vô (hoặc chạy code lấy tên Field cho nhanh). Sau khi import file Excel vào table tạm -> đổi tên field -> Insert into vào table chính.
Do 2 cột mà anh hướng dẫn, vậy em sẽ có 1 table mới gồm 2 cột
Cột tên field tại bảng tbl_temp (Fx) và cột tên field tại bảng tblAccountInfo
Em dùng vòng lặp để sửa tên Field của tbl_temp có được không ạ?
Chứ em đọc đi đọc lại phần chuyển đổi tên field Excel vẫn khó hình dung quá (Em import không lấy tiêu đề của file excel rồi) -
RE: Làm thế nào để dùng SQL trong lập trình?
Đình Phán > 10-06-21, 06:05 PM
(10-06-21, 05:25 PM)paulsteigel Đã viết: Một trong những biện pháp tốt để tìm lỗi cú pháp SQL là, dùng màn hình thiết kế SQL.
1. Tạo SQL (ở chế độ SQL design)
2. Chuyển sang màn hình soạn code SQL View (bấm phải chuột ngoài khu vực bản bạn vừa chèn vào SQL
3. Dán đầy đủ đoạn code query của bạn vào rồi view query, Access sẽ bảo bạn lỗi gì
Trước đây tôi còn dùng chế độ ghi màn hình để làm video nhưng giờ bỏ hết, tôi tìm tạm cho bạn một video về sử dụng SQL designer nhé
https://www.youtube.com/watch?v=WxGKLfWIJTU
Thủ thuật này của anh hay quá, em tay ngang sang Access nên còn nhiều bỡ ngỡ, hôm trước anh ongke0711 cũng có khuyến nghị nên tìm hiểu Access cơ bản trước. Hic
Khi nào em mới giỏi được như các anh ạ. -
RE: Làm thế nào để dùng SQL trong lập trình?
paulsteigel > 10-06-21, 06:15 PM
(10-06-21, 06:05 PM)Đình Phán Đã viết:
(10-06-21, 05:25 PM)paulsteigel Đã viết: Một trong những biện pháp tốt để tìm lỗi cú pháp SQL là, dùng màn hình thiết kế SQL.
1. Tạo SQL (ở chế độ SQL design)
2. Chuyển sang màn hình soạn code SQL View (bấm phải chuột ngoài khu vực bản bạn vừa chèn vào SQL
3. Dán đầy đủ đoạn code query của bạn vào rồi view query, Access sẽ bảo bạn lỗi gì
Trước đây tôi còn dùng chế độ ghi màn hình để làm video nhưng giờ bỏ hết, tôi tìm tạm cho bạn một video về sử dụng SQL designer nhé
https://www.youtube.com/watch?v=WxGKLfWIJTU
Thủ thuật này của anh hay quá, em tay ngang sang Access nên còn nhiều bỡ ngỡ, hôm trước anh ongke0711 cũng có khuyến nghị nên tìm hiểu Access cơ bản trước. Hic
Khi nào em mới giỏi được như các anh ạ.
Đó là những kỹ năng đầu đời khi tôi làm việc với Access 2000 những năm 2002. Thực sự thì bắt đầu làm về access từ 1999 nhưng đến 2002 mới bắt đầu kiếm tiền được từ nó (một cách ăn theo việc chính khác)
Nói chung việc cần làm đầu tiên là:
+ mày mò các công cụ và cố hiểu xem nó để làm gì, thao tác với nó
+ google
+ Sáng tạo
Theo tôi bạn nên học trước về cách định hình một bảng dữ liệu và quan hệ. Gợi ý đơn giản nhất là:
1. Chia nhỏ các bảng dữ liệu lớn ra thành các bảng đơn nguyên theo tính chất biến động của nó.
Vi dụ Hồ sơ khách hàng >> ít biến động >> tblCustomer
2. Giao dịch >> hay biến động thì chỉ lưu những cái rất hay thay đổi thôi, còn lại tách riêng ra bảng khác
3. quan hệ: 1 khách có nhiều giao dịch, có nhiều tài khoản chẳng hạn...
Học từ đó học đi >> bạn có thể tìm đọc chỗ này, đọc nhanh thôi, tài liệu tiếng Việt cũng không thiếu!
Tôi định tạo một nhóm zalo riêng để tiện trao đổi và dán hình ảnh minh họa.
Bạn thêm zalo của tôi 0913220994 và hỏi ông Kẹ, Mai Đình Dân, cụ tranthannhan1962 và hình thành nhóm AccessVBA trao đổi cho tiện! Có nhiều cái có thể nói trực tiếp, cắt dán hình ảnh luôn được! Tất nhiên có các bài cơ bản thì vẫn nên viết ra ở đây!