2017-01-28 26 views
1

私は、ユーザーがsqliteデータベースからの変更、フィルタ更新、および削除を可能にするGUIを作成しました。日付範囲フィルタを除いてすべてがうまくいっています。コードを実行すると、エラーは発生しません。データがないブランクのフィルタリングされた画面しか表示されません。誰かが私のコードに何が間違っているのを見ますか? [セクション1a、サブグループ{v}は私が助けを求めているものです]。ありがとう!PYQT:QTableView。日付間フィルタ

from PyQt4 import QtCore, QtGui, QtSql 
import sys 
import sqlite3 
import time 
import Search #imported ui.py MainWindow file 
import os 
try: 
    from PyQt4.QtCore import QString 
except ImportError: 
    QString = str 

class TableEditor(QtGui.QMainWindow, Search.Search_MainWindow): 
    def __init__(self, tableName, parent=None): 
     super(self.__class__, self).__init__() 
     self.setupUi(self) 

     self.model = QtSql.QSqlTableModel(self) 
     self.model.setTable('CAUTI') 
     self.model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit) 
     self.model.select() 

     self.model.setHeaderData(0, QtCore.Qt.Horizontal, "MRN") 
     self.model.setHeaderData(1, QtCore.Qt.Horizontal, "Last Name") 
     self.model.setHeaderData(2, QtCore.Qt.Horizontal, "First Name") 
     self.model.setHeaderData(3, QtCore.Qt.Horizontal, "Date of Event") 
     self.model.setHeaderData(4, QtCore.Qt.Horizontal, "Facility") 
     self.model.setHeaderData(5, QtCore.Qt.Horizontal, "Unit") 
     self.model.setHeaderData(6, QtCore.Qt.Horizontal, "User") 
     self.tableView.setModel(self.model) 
     self.setWindowTitle("HAI Table") 
     self.tableView.setColumnWidth(0,100) 
     self.tableView.setColumnWidth(1,100) 
     self.tableView.setColumnWidth(2,100) 
     self.tableView.setColumnWidth(3,100) 
     self.tableView.setColumnWidth(4,100) 
     self.tableView.setColumnWidth(5,100) 
     self.tableView.setColumnWidth(6,83) 
     self.submitButton.clicked.connect(self.submit) 
     self.revertButton.clicked.connect(self.model.revertAll) 
     self.quitButton.clicked.connect(self.close) 

     current = QtCore.QDateTime.currentDateTime() 
     self.startDate.setDate(current.date()) 
     self.endDate.setDate(current.date()) 
     self.startDate.setDisplayFormat("M/dd/yyyy") 
     self.endDate.setDisplayFormat("M/dd/yyyy") 


# Section 1: Signals 

    # {i} Search Fields Button Emitted: 
    # [1] 
     self.search_MRN_Button.clicked.connect(self.search_MRN_FilterRecord) 
    # [2] 
     self.search_Lname_Button.clicked.connect(self.search_Lname_FilterRecord) 
    # [3] 
     self.search_Unit_Button.clicked.connect(self.search_Unit_FilterRecord) 

    # {ii} Search Clear Buttons Emitted: 
    # [1] 
     self.search_MRN_CancelButton.clicked.connect(self.search_MRN_CancelButton_Clicked) 
    # [2] 
     self.search_Lname_CancelButton.clicked.connect(self.search_Lname_CancelButton_Clicked) 
    # [3] 
     self.search_Unit_CancelButton.clicked.connect(self.search_Unit_CancelButton_Clicked) 

    # {iii} Search Fields Button Emitted: 
    # [1] 
     self.search_MRN.selectionChanged.connect(self.search_MRN_Edit) 
    # [2] 
     self.search_Lname.selectionChanged.connect(self.search_Lname_Edit) 
    # [3] 
     self.search_Unit.selectionChanged.connect(self.search_Unit_Edit) 
    # {iv} Search Fields Button Emitted: 
    # [1] 
     self.search_MRN.returnPressed.connect(self.search_MRN_Enter) 
    # [2] 
     self.search_Lname.returnPressed.connect(self.search_Lname_Enter) 
    # [3] 
     self.search_Unit.returnPressed.connect(self.search_Unit_Enter) 

    #{v} Search Between 2 Dates 
     self.btnSubmit.clicked.connect(self.FilterBetweenDates) 

# Section 1a: Slots from Section 1. 

    #{i} Search Field Button Slots: 
    #[1] 
    def search_MRN_FilterRecord(self): 
     text = self.search_MRN.text() 
     if len(text) == 0: 
      self.model.setFilter("") 
     else: 
      self.model.setFilter("MRN like'" +self.search_MRN.text()+ "%%'") 

      #self.model.setFilter("MRN = '%s'" % text) 
    #[2] 
    def search_Lname_FilterRecord(self): 
     text = self.search_Lname.text() 
     if len(text) == 0: 
      self.model.setFilter("") 
     else: 
      self.model.setFilter("Surname like'" +self.search_Lname.text()+ "%'") 
      #self.model.setFilter("Surname = '%s'" % text) #This line of code will only pull exact matches. 
    #[3] 
    def search_Unit_FilterRecord(self): 
     text = self.search_Unit.text() 
     if len(text) == 0: 
      self.model.setFilter("") 
     else: 
      self.model.setFilter("Unit like'" +self.search_Unit.text()+ "%'") 
      #self.model.setFilter("Unit = '%s'" % text) #This line of code will only pull exact matches. 

    #{ii} Search Field Cancel Button Slots: 
    #[1] 
    def search_MRN_CancelButton_Clicked(self): 
     self.model.setFilter("") 
     self.search_MRN.setText("MRN Search") 
    #[2] 
    def search_Lname_CancelButton_Clicked(self): 
     self.model.setFilter("") 
     self.search_Lname.setText("Last Name Search") 
    #[3] 
    def search_Unit_CancelButton_Clicked(self): 
     self.model.setFilter("") 
     self.search_Unit.setText("Unit Search") 

    #{iii} Search Text Edited Slots: 
    #[1]  
    def search_MRN_Edit(self): 
     self.search_MRN.setText("") 
    #[2] 
    def search_Lname_Edit(self): 
     self.search_Lname.setText("") 
    #[3]  
    def search_Unit_Edit(self): 
     self.search_Unit.setText("") 

    #{iv} Search Text Return Pressed (Enter) Slots: 
    #[1]  
    def search_MRN_Enter(self): 
     self.search_MRN_FilterRecord() 
    #[2] 
    def search_Lname_Enter(self): 
     self.search_Lname_FilterRecord() 
    #[3]  
    def search_Unit_Enter(self): 
     self.search_Unit_FilterRecord() 

    #{v} Filter Between Dates, Slot: 
    def FilterBetweenDates(self): 
     start = str(self.startDate.text()) 
     finish = str(self.endDate.text()) 
     self.model.setFilter("EventDate BETWEEN'" + start and finish) 

    def submit(self): 
     self.model.database().transaction() 
     if self.model.submitAll(): 
      self.model.database().commit() 
     else: 
      self.model.database().rollback() 
      QtGui.QMessageBox.warning(self, "HAI Table", 
         "The database reported an error: %s" % self.model.lastError().text()) 




def main(): 
    app = QtGui.QApplication(sys.argv) 
    #app.setStyle("Plastique") 
    db = QtSql.QSqlDatabase.addDatabase('QSQLITE') 
    db.setDatabaseName('HAI.db') 

    editor = TableEditor('CAUTI') 
    editor.show() 
    app.exec_() 


if __name__ == '__main__': 

答えて

1

フィルタテキストのandはフィルタ文字列の一部である必要があります。今度は、2つの文字列(最初の文字列が空でない限り最後の文字列になります)を論理的に取り、フィルタ文字列に追加します。

ので、デバッグ時

filter = "EventDate BETWEEN '{}' AND '{}'".format(start, finish) 
print(filter) # for debugging 
self.model.setFilter(filter) 

self.model.setFilter("EventDate BETWEEN'" + start and finish) 

を変更、それはとてもフィルタ文字列を印刷し、(sqlite3ツールで直接)SQLクエリでそれを試してみることはおそらく良い考えですあなたはそれが動作するのを見ることができます。

+0

偉大な考え!完全に意味をなさないあなたは男を揺らす。完璧な作品! - -ありがとうございました! –

+0

だから。 1か月以上の日付範囲を選択すると、何の結果も返されません。たとえば、[9/1/2016 - 9/30/2016(素晴らしいです!)]、[9/1/2016 - 10/31/2016(nullを返す)] –

+0

yyyy-MM-ddで日付を使用してみてくださいフォーマット。 http://stackoverflow.com/questions/8187288/sql-select-between-dates – titusjan

関連する問題