Ứng dụng gis mã nguồn mở hỗ trợ công tác quản lý việc giao thuê đất (áp dụng tại phòng quản lý đất đai sở tài nguyên môi trường tp đà nẵng)

112 21 0
Ứng dụng gis mã nguồn mở hỗ trợ công tác quản lý việc giao thuê đất (áp dụng tại phòng quản lý đất đai sở tài nguyên môi trường tp đà nẵng)

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH TRƢỜNG ĐẠI HỌC BÁCH KHOA – LUẬN VĂN THẠC SĨ TP.HỒ CHÍ MINH – tháng năm 2015 -1TP.HỒ CHÍ MINH – THÁNG NĂM 2015 – Cán hướng dẫn khoa học : – - ………………………………………………………………………………………… Cán chấm nhận xét 1: ………………………………………… ………………………………………………………………………………………… Cán chấm nhận xét 2: ………………………………………………………… ………………………………………………………………………………………… Luận văn Thạc sĩ bảo vệ Trường Đại học Bách Khoa - ĐH HCM ngày 04 tháng năm 2015 Thành phần Hội đồng đánh giá luận văn thạc sĩ gồm: PGS TS T ……………………… ………………………… ………………………… ngành sau luận văn sửa chữa (nếu có)…………………………………… ………………………………………………………………………………………… CHỦ TỊCH HỘI ĐỒNG TRƢỞNG KHOA -2ĐẠI HỌC QUỐC GIA TP.HCM TRƢỜNG ĐẠI HỌC BÁCH KHOA CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự - Hạnh phúc NHIỆM VỤ LUẬN VĂN THẠC SĨ Họ tên học viên: NGUYỄN MSHV: 11100356; Ngày, tháng, năm sinh: 29/11/1987; ẵng; Chuyên ngành: Bản Đồ, Viễn Thám Và Hệ Thông Tin Địa Lý; Mã số :604476; I TÊN ĐỀ TÀI: – II ện trạ Khả (cụ thể phòng Quản lý đấ ả – ệu công việc III IV V NGÀY GIAO NHIỆM VỤ: NGÀY HOÀN THÀNH NHIỆM VỤ: CÁN BỘ HƢỚNG DẪN: Tp HCM,ngày 20 tháng năm 2015 CÁN BỘ HƢỚNG DẪN CHỦ NHIỆM BỘ MÔN ĐÀO TẠO TS Nguyễn Ngọc Lâu TRƢỞNG KHOA -3- – - Khoa K – điều k ho tơi q trình nghiên cứu hồn thành đề tài nghiên cứu có hạn, q trình tiến hành làm báo cáo, khơng tránh khỏi sai sót, kính xin người thơng cảm tơi mong nhận đóng góp, ý kiến chân thành tất người để báo cáo hồn chỉnh đặc biệt, áp dụng công việc thực tế Tôi xin chân thành cảm ơn./ Nguyễn Đình Nguyên -4- Hệ thống thông tin địa lý (GIS) quản lý đất đai (QLĐĐ) tỉnh thành nước nhiều hạn chế, chưa đáp ứng yêu cầu cơng việc Thêm vào đó, Việt Nam giai đoạn đầu xây dựng phát triển hệ thống thơng tin đất đai, chi phí quyền phầ – liên quan đến công tác QLĐĐ (tron – -5ABSTRACT: Applying Geographic Information System (GIS) into land management in Vietnamese provinces is quite limited and does not meet the demand of current jobs In addition, Vietnam is in the early stage of building and developing the Land Management System The software license and maintaining fees can be major obstaclesto ensure the sustainability of the system To solve these problems, this research will explore and survey the professional work at Land Management Room, Da Nang Department of Natural Resources and Environment, draw shortcomings and consider urgent needs at Room Then the research collects and standardizes digital maps, updates data related to the land management (in handover/lease land activities) in Da Nang City, imports data into QGIS Afterward, it builds a support toolkit in Vietnamese to solve urgent demands of Land Management Room The products of this study are the database with actual data and a toolkit running on QGIS with (eight) support functions for handover/lease land activities at Land Management Room The specialists test the products and give their comments and feedbacks The result shows that the products can be put into practice and be the reasonable solutions in the present context -6- Tôi xin cam đoan cơng trình nghiên cứu tơi, có hướng dẫn từ Giáo viên hướng dẫn Tiến sĩ Lê Minh Vĩnh Các nội dung nghiên cứu kết đề tài trung thực chưa cơng bố cơng trình nghiên cứu trước Những số liệu bảng biểu phục vụ cho việc phân tích, nhận xét, đánh giá tác giả thu thập từ nguồn khác có ghi phần tài liệu tham khảo Ngồi ra, đề tài cịn sử dụng số nhận xét, đánh giá tác giả, quan tổ chức khác, thể phần tài liệu tham khảo Nếu phát có gian lận tơi xin hồn tồn chịu trách nhiệm trước Hội đồng, kết luận văn TP.HCM, ngày 14 tháng năm 2015 Tác giả luận văn -7- GIS TNMT UBND CSDL: OSG (open source GIS QLĐĐ: LIS (Land Information System): hệ thống thông tin đất đai; NCC (Nature conservancy Canada): OVC (Virtual cadastre office): Văn phòng đất đai ảo; 10 OSI (Open Source Initiative): Tổ chức Sáng kiến Nguồn mở; 11 GPL (General Public Licence): 12 FOA (Food and Agriculture Organization of the United Nations): Tổ chức Lương thực Nông nghiệp Liên Hợp Quốc; 13 FIG: Hiệp hội trắc địa Thế giới; 14 CNTT: -8- - - - - - 11 - 11 - 13 - 18 - 19 - 19 - 19 - 22 - 23 - 23 - 23 - 23 – LIS - 24 m - 25 - 26 - - 28 - 28 - open source GIS) - 30 - 31 - 32 - 35 CHƢƠNG II: – - 36 - -9 - 36 – - 38 - 38 - 40 – - 42 - 44 CHƢƠNG III: – - 46 - 46 - 46 – - 48 u - 51 - 52 - 52 - 53 - 55 – - 55 không gian - 57 - 58 - – - 59 - 59 n - 61 - 62 – PostgresSQL/PostGIS - 62 – - 63 - - 68 - - 97 - - – - chuyên môn - - t công – lai - 98 - như: - i , - CSDL - – ng công vi – - Vi CSDL – - 99 – - - - 100 - [1 –Đ Đ Minh: [2] Nguyễn Mạnh Hiển - Thứ trưởng - Bộ Tài nguyên Môi trường: tế hóa phục vụ mục tiêu phát triển kinh tế - xã hội bền vững – [3 – Báo cáo đề tài đặc biệt cấp ĐHQG Hà Nội, mã số QG-08-14 Hà Nội, 2010 – ,n [7 – , năm 2011 xây dựng hệ thống hồ sơ địa sở liệu quản lý đất đai thành phố Đà Nẵng giai đoạn 2013 – 2018.Trung [9] B Tuul: GIS based land information system for mandal soum, selenge aimag of mongolia GTZ, Land Management and Fiscal Cadastre project, Government building 12, ALAGCaC, Ulaanbaatar, Mongolia [10] Conejo C., Velasco A., Serrano F Cadastral web services in Spain: case of success of the cartography, from private GIS to public and free WMS, ncluded in all the SDI - 101 [11] Daniel Steudler, Mika-Petteri Törhönen and Gertrude Pieper: FLOSS in Cdastre ang Land Registration, April 2010 [12] OpenGIS Project Document: OpenGIS Simple Features Specification For SQL OpenGIS Project Document 99 – 049, May 5, 1999 [13] Espada G P - Stockholm, Sweden: Free and open source software for land administration systems: ahidden treasure? FIG Working Week 2008.14-19 June 2008 [14] Shashi SheKhar, Hui Xiong: Encyclopedia for GIS 2008 Springer Science + Bussiness Media, LLC [15] May Yuan, "Temporal GIS and Spatio - Temporal Modeling," Department of Geography, The University of Oklahoma, Norman [16] Website: http://www.qgistutorials.com/en/index.html [17] Website: http://www.esri.com [18] Website: http://www.natureconservancy.ca - 102 - Hàm khởi tạo giao diện file quankydatdai.py defConnect(self): # Remove the plugin menu item and icon self.iface.removePluginMenu(u"&Quản lýđấtđaitạithànhphốĐàNẵng", self.action) self.iface.removeToolBarIcon(self.action) self.action2 = QAction(QIcon(":/plugins/quanlydatdai/DisConnecDB.png"), u"Đăngxuất", self.iface.mainWindow()) # connect the action to the run method QObject.connect(self.action2, SIGNAL("triggered()"), self.DisConnect) # Addtoolbar button and menu item self.iface.addToolBarIcon(self.action2) self.iface.addPluginToMenu(u"&Quản lýđấtđaitạithànhphốĐàNẵng", self.action2) ######################## THU ĐẤT ############################# self.ThuDat = QAction( QIcon(":/plugins/quanlydatdai/BO_Rules.png"), u"Tìnhhìnhthuhồiđất", self.iface.mainWindow()) # connect the action to the run method QObject.connect(self.ThuDat, SIGNAL("triggered()"), self.ThuDatMethod) # Addtoolbar button and menu item self.iface.addToolBarIcon(self.ThuDat) self.iface.addPluginToMenu(u"&Quản lýđấtđaitạithànhphốĐàNẵng", self.ThuDat) ######################## THỜI HẠN ############################# self.ThoiHan = QAction( QIcon(":/plugins/quanlydatdai/Action_NavigationBar.png"), u"Thờihạnthuêđất", self.iface.mainWindow()) # connect the action to the run method QObject.connect(self.ThoiHan, SIGNAL("triggered()"), self.ThoiHanMethod) # Addtoolbar button and menu item self.iface.addToolBarIcon(self.ThoiHan) self.iface.addPluginToMenu(u"&Quản lýđấtđaitạithành phố Đà Nẵng", self.ThoiHan) ######################## TÌNH TRẠNG ############################# self.TinhTrang = QAction( QIcon(":/plugins/quanlydatdai/Action_Open_Object.png"), u"Tình trạng đầu tư", self.iface.mainWindow()) # connect the action to the run method - 103 QObject.connect(self.TinhTrang, SIGNAL("triggered()"), self.TinhTrangMethod) # Add toolbar button and menu item self.iface.addToolBarIcon(self.TinhTrang) self.iface.addPluginToMenu(u"&Quản lý đất đai thành phố Đà Nẵng", self.TinhTrang) ######################## GIÁ ############################# self.Gia = QAction( QIcon(":/plugins/quanlydatdai/BO_Sale_Item_v92.png"), u"Giá giao/cho thuê đất", self.iface.mainWindow()) # connect the action to the run method QObject.connect(self.Gia, SIGNAL("triggered()"), self.GiaMethod) # Add toolbar button and menu item self.iface.addToolBarIcon(self.Gia) self.iface.addPluginToMenu(u"&Quản lý đất đai thành phố Đà Nẵng", self.Gia) ######################## QUỸ ĐẤT ############################# self.QuyDat = QAction( QIcon(":/plugins/quanlydatdai/BO_Appearance.png"), u"Quỹ đất giao/cho thuê đất", self.iface.mainWindow()) # connect the action to the run method QObject.connect(self.QuyDat, SIGNAL("triggered()"), self.QuyDatMethod) # Add toolbar button and menu item self.iface.addToolBarIcon(self.QuyDat) self.iface.addPluginToMenu(u"&Quản lý đất đai thành phố Đà Nẵng", self.QuyDat) ######################## DỰ ÁN ĐẦU TƯ ############################ self.DuAnDauTu = QAction( QIcon(":/plugins/quanlydatdai/BO_Country_v92.png"), u"Dự án đầu tư có vốn nước ngồi", self.iface.mainWindow()) # connect the action to the run method QObject.connect(self.DuAnDauTu, SIGNAL("triggered()"), self.DuAnDauTuMethod) # Add toolbar button and menu item self.iface.addToolBarIcon(self.DuAnDauTu) self.iface.addPluginToMenu(u"&Quản lý đất đai thành phố Đà Nẵng", self.DuAnDauTu) ######################## TÀI CHÍNH ############################# self.TaiChinh = QAction( QIcon(":/plugins/quanlydatdai/BO_Invoice.png"), u"Tình trạng đóng tiền th đất", self.iface.mainWindow()) - 104 # connect the action to the run method QObject.connect(self.TaiChinh, SIGNAL("triggered()"), self.TaiChinhMethod) # Add toolbar button and menu item self.iface.addToolBarIcon(self.TaiChinh) self.iface.addPluginToMenu(u"&Quản lý đất đai thành phố Đà Nẵng", self.TaiChinh) ######################## TÀI CHÍNH ############################# self.TinhTrangDatGiao = QAction( QIcon(":/plugins/quanlydatdai/BO_Contract.png"), u"Tình trạng giao/cho thuê đất", self.iface.mainWindow()) # connect the action to the run method QObject.connect(self.TinhTrangDatGiao, SIGNAL("triggered()"), self.GiaoDatDuAnMethod) # Add toolbar button and menu item self.iface.addToolBarIcon(self.TinhTrangDatGiao) self.iface.addPluginToMenu(u"&Quản lý đất đai thành phố Đà Nẵng", Đà Nẵng", self.TinhTrangDatGiao) Hàm hủy giao diện file quanlydatdai.py defDisConnect(self): # Create action that will start plugin configuration self.action = QAction( QIcon(":/plugins/quanlydatdai/connecDB.png"), u"Đăng nhập", self.iface.mainWindow()) # connect the action to the run method QObject.connect(self.action, SIGNAL("triggered()"), self.run) # Add toolbar button and menu item self.iface.addToolBarIcon(self.action) self.iface.addPluginToMenu(u"&Quản lý đất đai thành phố self.action) # Remove the plugin menu item and icon self.iface.removePluginMenu(u"&Quản lý đất đai thành phố Đà Nẵng", self.action2) self.iface.removeToolBarIcon(self.action2) # Remove the plugin menu item and icon self.iface.removePluginMenu(u"&Quản lý đất đai thành phố Đà Nẵng", self.TinhTrangDatGiao) self.iface.removeToolBarIcon(self.TinhTrangDatGiao) # Remove the plugin menu item and icon self.iface.removePluginMenu(u"&Quản lý đất đai thành phố Đà Nẵng", self.ThuDat) self.iface.removeToolBarIcon(self.ThuDat) - 105 # Remove the plugin menu item and icon self.iface.removePluginMenu(u"&Quản lý đất đai thành phố Đà Nẵng", self.ThoiHan) self.iface.removeToolBarIcon(self.ThoiHan) # Remove the plugin menu item and icon self.iface.removePluginMenu(u"&Quản lý đất đai thành phố Đà Nẵng", self.TinhTrang) self.iface.removeToolBarIcon(self.TinhTrang) # Remove the plugin menu item and icon self.iface.removePluginMenu(u"&Quản lý đất đai thành phố Đà Nẵng", self.Gia) self.iface.removeToolBarIcon(self.Gia) # Remove the plugin menu item and icon self.iface.removePluginMenu(u"&Quản lý đất đai thành phố Đà Nẵng", self.QuyDat) self.iface.removeToolBarIcon(self.QuyDat) # Remove the plugin menu item and icon self.iface.removePluginMenu(u"&Quản lý đất đai thành phố Đà Nẵng", self.DuAnDauTu) self.iface.removeToolBarIcon(self.DuAnDauTu) # Remove the plugin menu item and icon self.iface.removePluginMenu(u"&Quản lý đất đai thành phố Đà Nẵng", self.TaiChinh) self.iface.removeToolBarIcon(self.TaiChinh) mapreg = QgsMapLayerRegistry.instance() mapreg.removeAllMapLayers() mapreg.clearAllLayerCaches() Hàm kết nối vào database , có file truy vân liệu defconnectionDB(self): if(self.parent.connstring == None): return False parmlist = self.parent.connstring.split(" ") try: self.db = postgis_utils.GeoDB(host=parmlist[2].split("=")[1],dbname=parmlist[1].spli t("=")[1],user=parmlist[3].split("=")[1],passwd=parmlist[4].split("=")[1], port=int(parmlist[5].split("=")[1])) ifself.db == None: QtGui.QMessageBox.warning(None,"Error","Connection failed to "+connstring) return False else: - 106 return True except postgis_utils.DbError, e: QMessageBox.critical(None, "error", "Couldn't connect to database:\n" + e.msg) return False Hàm hiển thị liệu lên QanTumGIS , file quanlydatdaiLoadNonnection.py defKetNoi(self): if(self.connectionDB() == True): parmlist = self.parent.connstring.split(" ") host= parmlist[2].split("=")[1] dbname=parmlist[1].split("=")[1] username=parmlist[3].split("=")[1] password=parmlist[4].split("=")[1] port=parmlist[5].split("=")[1] geom_col ="wkb_geometry" schema = "public" tableRanhgioihanhchinh = "ranhgioihanhchinh" tableGiaothong = "giaothong" tableSongho = "thuyhe" tableThuadat = "thuadat" tableThuadattimeLine = "thuadattimeline" tableThuadatQuyHoach = "thuadatquyhoach" tableTimduong = "diemkhongche" tableDatdichvu = "donvisudung" mapreg = QgsMapLayerRegistry.instance() mapreg.removeAllMapLayers() mapreg.clearAllLayerCaches() #Sets canvas CRS self.addPostGISLayer(host, port, dbname, username, password, schema, tableRanhgioihanhchinh, geom_col,u"Ranhgiớihànhchính",1) self.addPostGISLayer(host, port, dbname, username, password, schema, dbname, username, password, schema, username, password, schema, username, password, schema, username, password, schema, tableSongho, geom_col,u'Thủy hệ',2) self.addPostGISLayer(host, port, tableGiaothong, geom_col,u'Giao thông',3) self.addPostGISLayer(host, port, dbname, tableTimduong, geom_col,u'Điểm khốngchế',4) self.addPostGISLayer(host, port, dbname, tableThuadat, geom_col,u'Thửa đất',5) self.addPostGISLayer(host, port, dbname, tableThuadatQuyHoach, geom_col,u'Thửa đấtquyhoạch',3) - 107 self.addPostGISLayer(host, port, dbname, username, password, schema, tableThuadattimeLine, geom_col,u'Giá thửađấttheothờigian',2) self.addPostGISLayer(host, port, dbname, username, password, schema, tableDatdichvu, geom_col,u"Đơnvịsửdụngđất",6) # self.dlgTK = QuanLyDatDaiThongKe(self.iface) # self.dlgTK.show() self.close() return True #QApplication.exit() else: QMessageBox.warning(None,"Error","Connection failed to " + self.parent.connstring) return False pass defaddPostGISLayer(self, host, port, dbname, username, password,schema, table, geom_col,stringLayer,colorType): '''Adds a PostGIS table to the map''' uri = QgsDataSourceURI() uri.setConnection(str(host), str(port), str(username), str(password)) uri.setDataSource(str(schema), str(table), str(geom_col)) s = QSettings() oldValidation = s.value( "/Projections/defaultBehaviour") s.setValue("/Projections/defaultBehaviour", "useProject" ) vlayer = QgsVectorLayer(uri.uri(), stringLayer, 'postgres',) QgsMapLayerRegistry.instance().addMapLayer(vlayer) s.setValue("/Projections/defaultBehaviour", oldValidation ) symbols = vlayer.rendererV2().symbols() sym = symbols[0] if(colorType == 1):#ranhhànhchính sym.setColor(QColor.fromRgb(250, 250, 240)) if(colorType == 2):#Sông sym.setColor(QColor.fromRgb(151, 219, 242)) if(colorType == 3):#Giaothông sym.setColor(QColor.fromRgb(255, 211, 127)) if(colorType == 4):#Timđường sym.setColor(QColor.fromRgb(254, 255, 255)) if(colorType == 5):#Thửađất sym.setColor(QColor.fromRgb(254, 255, 255)) if(colorType == 6):#Đấtdịchvụ sym.setColor(QColor.fromRgb(234, 82, 70)) str(dbname), - 108 vlayer.triggerRepaint() if not vlayer.isValid(): QMessageBox.warning(None,"Error","failed load data ") Hàm truy vấn liệu theo chức Kiểm tra dự án có vốn đầu tƣ nƣớc defbtnTimKiemClick(self): strTodate= self.ui.lineEdit.text() strData = strTodate.toUtf8() if(len(strTodate) > 0): self.query = " quoctich LIKE '"+ strData + \ "%' OR quoctich LIKE '"+str(strData).lower()+ \ "%'OR quoctich LIKE '"+str(strData).upper()+"%'" self.selectQuery ="SELECT loaitochuc, tentochuc, nguoidaidien, diachi,\ sogpkd, ngaycap, noicap, nganhnghe, dienthoai, fax, masothue,\ vondieule, nganhang, chinhanh, taikhoan, tinhtrangdongtien, quoctich,ogc_fid\ FROM donvisudung WHERE " +self.query self.getData_Date(self.selectQuery) else: QMessageBox.critical(self, "Error", u"Vuilịngnhậpđiềukiệntìmkiếmcủabạn" ) Hàm truy vấn liệu theo chức Kiểm tra tình trạng thực nghĩa vụ tài defbtnTimKiemClick(self): strTodate= self.ui.cbbTinhTrang.currentIndex() tinhTrang = strTodate + self.query = " tinhtrangdongtien = "+str(tinhTrang) self.selectQuery ="SELECT loaitochuc, tentochuc, nguoidaidien, diachi,\ sogpkd, ngaycap, noicap, nganhnghe, dienthoai, fax, masothue,\ vondieule, nganhang, chinhanh, taikhoan, tinhtrangdongtien, quoctich,ogc_fid\ FROM donvisudung WHERE " +self.query self.getData_Date(self.selectQuery) Hàm truy vấn liệu theo chức Quỹ đất kêu gọi đầu tƣ defbtnTimKiemClick(self): strTodate= self.ui.cbbTinhTrang.currentIndex() tinhTrang = strTodate + self.query = " tinhtrangthuadat = "+ str(tinhTrang) self.selectQuery ="SELECT masothue, sohieutobando, dientichkhonggian,\ giatrithuadat, diachi, quyhoach, mucdich, hinhthuc, thoihan,\ sohieuthua, - 109 batdauthuedat, hethan, phuongthucnoptien, hientangdautu, tinhtrangthuadat,mathua,ogc_fid\ FROM thuadat WHERE " +self.query self.getData_Date(self.selectQuery) Hàm truy vấn liệu theo chức Giá đất defbtnTimKiemClick(self): strTodate= self.ui.lineEdit.text() strData = strTodate.toUtf8() if(len(strTodate) > 0): self.query = " masothue LIKE '"+ strData + \ "%' OR masothue LIKE '"+str(strData).lower()+ \ "%'OR masothue LIKE '"+str(strData).upper()+"%'" self.selectQuery ="SELECT masothue, sohieutobando, sohieuthua, dientichkhonggian,\ giatrithuadat, diachi, quyhoach, mucdich, hinhthuc, thoihan,\ batdauthuedat, hethan, phuongthucnoptien, hientangdautu, tinhtrangthuadat,mathua,ogc_fid\ FROM thuadat WHERE " +self.query self.getData_Date(self.selectQuery) else: QMessageBox.critical(self, "Error", u"Vuilịngnhậpđiềukiệntìmkiếmcủabạn" ) Hàm truy vấn liệu theo chức Kiểm tra tình trạng đầu tƣ defbtnTimKiemClick(self): strTodate= self.ui.lineEdit.text() strData = strTodate.toUtf8() if(len(strTodate) > 0): self.query = " masothue LIKE '"+ strData + \ "%' OR masothue LIKE '"+str(strData).lower()+ \ "%'OR masothue LIKE '"+str(strData).upper()+"%'" self.selectQuery ="SELECT masothue, sohieutobando, sohieuthua, dientichkhonggian,\ giatrithuadat, diachi, quyhoach, mucdich, hinhthuc, thoihan,\ batdauthuedat, hethan, phuongthucnoptien, hientangdautu, tinhtrangthuadat,mathua,ogc_fid\ FROM thuadat WHERE " +self.query self.getData_Date(self.selectQuery) else: QMessageBox.critical(self, "Error", u"Vuilịngnhậpđiềukiệntìmkiếmcủabạn" ) 10 Hàm truy vấn liệu theo chức Kiểm tra thời hạn thuê đất defbtnTimKiemClick(self): - 110 strTodate= self.ui.cbbTuNam.currentText() strFromdate=self.ui.cbbDenNam.currentText() self.query = " thoihan>= "+ str(strTodate)+" \ andthoihan= "+wrapSQLDateFunc1(strTodate)+" \ andhethan= "+wrapSQLDateFunc1(strTodate)+" \ andbatdauthuedat

Ngày đăng: 27/01/2021, 09:16

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan