Qt6 Python SQLServer 取引入力 QTableWidget

Qt6 Python SQLServer 取引入力 QTableWidget

Qt6Creatorでプロジェクト inptorihikid を作成

inptorihikid.ui ui_inptorihikid を作成( pyside6-uic inptorihikid.ui -o ui_inptorihikid.py )

Qt6Creatorでプロジェクト kentorihiki を作成

kentorihikisaki.ui ui_kentorihikisaki を作成( pyside6-uic kentorihikisaki.ui -o ui_kentorihikisaki.py )

Qt6Creatorでプロジェクト inptorihiki を作成

inptorihiki.py を作成。 上記のui_inptorihikid、ui_kentorihikisaki をセット

# This Python file uses the following encoding: utf-8
import sys

from typing import Any, List
from datetime import date,datetime

from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
    QMetaObject, QObject, QPoint, QRect,
    QSize, QTime, QUrl, Qt,QAbstractTableModel)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
    QFont, QFontDatabase, QGradient, QIcon,
    QImage, QKeySequence, QLinearGradient, QPainter,
    QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QLineEdit, QMainWindow, QMenuBar,
     QDialog, QPushButton, QSizePolicy, QStatusBar, QWidget,QMessageBox,QCheckBox,QHeaderView,QTableWidgetItem,QVBoxLayout,QHBoxLayout)
# Important:
# You need to run the following command to generate the ui_form.py file
#     pyside6-uic form.ui -o ui_form.py, or
#     pyside2-uic form.ui -o ui_form.py

from PyQt5 import QtCore, QtGui, QtWidgets

import ui_inptorihikid
from ui_kentorihikisaki import Ui_kentorihikisaki

import pymssql
server = '192.168.10.111'
username = 'sa'
password = 'xxxxxxxx'
database = 'kakei'

try:
    conn = pymssql.connect(  server , username , password, database )
except Exception as e:
    print('接続エラー' + e.args)
else:
    pass

class SimpleTableModel(QAbstractTableModel):
        def __init__(self, list, headers = [], parent = None):
            QAbstractTableModel.__init__(self, parent)
            self.list = list
            self.headers = headers

        def rowCount(self, parent):
            return len(self.list)

        def columnCount(self, parent):
            return len(self.list[0])

        def flags(self, index):
            return Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsSelectable #Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsSelectable

        def data(self, index, role):
            if role == Qt.EditRole:
                row = index.row()
                column = index.column()
                return self.list[row][column]

            elif role == Qt.DisplayRole:
                row = index.row()
                column = index.column()
                value = self.list[row][column]

                # Perform per-type checks and render accordingly.
                if isinstance(value, datetime):
                   # Render time to YYY-MM-DD.
                   return value.strftime("%Y-%m-%d")

                elif isinstance(value, int):
                  # Render int to 0 dp
                  return "%d" % value

                elif isinstance(value, float):
                   # Render float to 2 dp
                   return "%.2f" % value

                elif isinstance(value, str):
                   # Render strings with quotes
                   return "%s" % value

                # Default (anything not captured above: e.g. int)
                else:
                   return value

            elif role == Qt.TextAlignmentRole:
                row = index.row()
                column = index.column()
                value = self.list[row][column]

                if isinstance(value, int) or isinstance(value, float) or column == 2 or column == 3 or column == 4 :#例外とした
                   # Align right, vertical middle.
                   return int(Qt.AlignRight) + int(Qt.AlignVCenter)#,Qt.AlignHCenter,Qt.AlignRight,Qt.AlignCenter,Qt.AlignTop,Qt.AlignVCenter,Qt.AlignBottom

                else:
                   return int(Qt.AlignLeft) + int(Qt.AlignVCenter)

        def setData(self, index, value, role= Qt.EditRole):
            if role == Qt.EditRole:
                row = index.row()
                column = index.column()
                self.list[row][column] = value
                self.dataChanged.emit(index, index)
                return True

            return False

        def headerData(self, section, orientation, role):

            if role == Qt.DisplayRole:

                if orientation == Qt.Horizontal:

                    if section < len(self.headers):
                        return self.headers[section]
                    else:
                        return "not implemented"
                else:
                    return "%d" % (section + 1)

class inptorihiki(QMainWindow):
        def __init__(self, parent=None):
            super().__init__(parent)
            self.ui = ui_inptorihikid.Ui_inptorihikid()
            self.ui.setupUi(self)
            self.ui.tableWidget.installEventFilter(self)

            self.ui.lineEdit.returnPressed.connect(self.edit)
            self.ui.lineEdit_2.returnPressed.connect(self.select)

            self.ui.pushButton.clicked.connect(self.koshin)
            self.ui.pushButton_2.clicked.connect(self.torikeshi)
            self.ui.pushButton_3.clicked.connect(self.end)
            self.ui.pushButton_4.clicked.connect(self.ctrl_c)
            self.ui.pushButton_5.clicked.connect(self.ctrl_v)
            self.ui.pushButton_6.clicked.connect(self.ctrl_s)
            self.ui.pushButton_7.clicked.connect(self.sub_dlg)

            self.ui.label.setStyleSheet("background-color: pink")
            self.ui.label_2.setStyleSheet("background-color: violet")
            self.ui.label_4.setStyleSheet("background-color: yellow")
            self.ui.label_5.setStyleSheet("background-color: aqua")
            self.ui.label_6.setStyleSheet("background-color: pink")

            self.ui.pushButton.setStyleSheet("background-color: aqua")
            self.ui.pushButton_2.setStyleSheet("background-color: yellow")
            self.ui.pushButton_3.setStyleSheet("background-color: green")
            self.ui.pushButton_4.setStyleSheet("background-color: yellow")
            self.ui.pushButton_5.setStyleSheet("background-color: aqua")
            self.ui.pushButton_6.setStyleSheet("background-color: pink")

            self.ui.tableWidget.setRowCount(0)
            self.ui.tableWidget.setColumnCount(13)
            self.ui.tableWidget.setHorizontalHeaderItem(0,  QTableWidgetItem(" 取引日 "))
            self.ui.tableWidget.resizeColumnToContents(0)
            self.ui.tableWidget.setHorizontalHeaderItem(1,  QTableWidgetItem("連番"))
            self.ui.tableWidget.resizeColumnToContents(1)
            self.ui.tableWidget.setHorizontalHeaderItem(2,  QTableWidgetItem(" 摘 要 "))
            self.ui.tableWidget.resizeColumnToContents(2)
            self.ui.tableWidget.setHorizontalHeaderItem(3,  QTableWidgetItem(" 入金額 "))
            self.ui.tableWidget.resizeColumnToContents(3)
            self.ui.tableWidget.setHorizontalHeaderItem(4,  QTableWidgetItem(" 出金額 "))
            self.ui.tableWidget.resizeColumnToContents(4)
            self.ui.tableWidget.setHorizontalHeaderItem(5,  QTableWidgetItem("取引先"))
            self.ui.tableWidget.resizeColumnToContents(5)
            self.ui.tableWidget.setHorizontalHeaderItem(6,  QTableWidgetItem(" 取引先名 "))
            self.ui.tableWidget.resizeColumnToContents(6)
            self.ui.tableWidget.setHorizontalHeaderItem(7,  QTableWidgetItem("支払先"))
            self.ui.tableWidget.resizeColumnToContents(7)
            self.ui.tableWidget.setHorizontalHeaderItem(8,  QTableWidgetItem(" 支払先名 "))
            self.ui.tableWidget.resizeColumnToContents(8)
            self.ui.tableWidget.setHorizontalHeaderItem(9,  QTableWidgetItem(" 支払日 "))
            self.ui.tableWidget.resizeColumnToContents(9)
            self.ui.tableWidget.setHorizontalHeaderItem(10,  QTableWidgetItem("区分"))
            self.ui.tableWidget.resizeColumnToContents(10)            
            self.ui.tableWidget.setHorizontalHeaderItem(11,  QTableWidgetItem(" 削除 "))
            self.ui.tableWidget.resizeColumnToContents(11)
            self.ui.tableWidget.setHorizontalHeaderItem(12,  QTableWidgetItem("明細番号"))
            self.ui.tableWidget.resizeColumnToContents(12)

            self.ui.lineEdit.setFocus()

            self.show()

        def keyPressEvent(self, event):
                    super().keyPressEvent(event)
                    #tablewidget copy
                    if event.key() == Qt.Key_C and (event.modifiers() & Qt.ControlModifier):
                        self.ui.tableWidget.copied_cells = sorted(self.ui.tableWidget.selectedIndexes())
                    #tablewidget paste
                    elif event.key() == Qt.Key_V and (event.modifiers() & Qt.ControlModifier):
                        r = self.ui.tableWidget.currentRow() - self.ui.tableWidget.copied_cells[0].row()
                        c = self.ui.tableWidget.currentColumn() - self.ui.tableWidget.copied_cells[0].column()
                        for cell in self.ui.tableWidget.copied_cells:
                            item = QTableWidgetItem(cell.data())
                            if cell.column() == 2 or cell.column() == 6 or cell.column() == 8:
                               item.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignLeft)
                            elif cell.column() == 10:
                               item.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignHCenter)
                            else:
                               item.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
                            self.ui.tableWidget.setItem(cell.row() + r, cell.column() + c, item)
                    #clipboard copy
                    elif event.key() == Qt.Key.Key_S and (event.modifiers() & Qt.KeyboardModifier.ControlModifier):
                        copied_cells = sorted(self.ui.tableWidget.selectedIndexes())

                        copy_text = ''
                        max_column = copied_cells[-1].column()
                        for c in copied_cells:
                            copy_text += self.ui.tableWidget.item(c.row(), c.column()).text()
                            if c.column() == max_column:
                               copy_text += '\n'
                            else:
                               copy_text += '\t'

                        QApplication.clipboard().setText(copy_text)

        def ctrl_c(self):
            #tablewidget copy
            self.ui.tableWidget.copied_cells = sorted(self.ui.tableWidget.selectedIndexes())

        def ctrl_v(self):
            #tablewidget paste
            r = self.ui.tableWidget.currentRow() - self.ui.tableWidget.copied_cells[0].row()
            c = self.ui.tableWidget.currentColumn() - self.ui.tableWidget.copied_cells[0].column()
            for cell in self.ui.tableWidget.copied_cells:
                item = QTableWidgetItem(cell.data())
                if cell.column() == 2 or cell.column() == 6 or cell.column() == 8:
                   item.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignLeft)
                elif cell.column() == 10:
                   item.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignHCenter)
                else:
                   item.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
                self.ui.tableWidget.setItem(cell.row() + r, cell.column() + c, item)

        def ctrl_s(self):
            #clipboard copy
            copied_cells = sorted(self.ui.tableWidget.selectedIndexes())

            copy_text = ''
            max_column = copied_cells[-1].column()
            for c in copied_cells:
                copy_text += self.ui.tableWidget.item(c.row(), c.column()).text()
                if c.column() == max_column:
                   copy_text += '\n'
                else:
                   copy_text += '\t'

            QApplication.clipboard().setText(copy_text)

        def eventFilter(self, source, event):
                    if (event.type() == QtCore.QEvent.KeyPress and
                        event.key() in (QtCore.Qt.Key_Return, QtCore.Qt.Key_Enter)):
                            # ensure that the table receives the key event first
                            res = super().eventFilter(source, event)
                            current = self.ui.tableWidget.currentIndex()

                            if current.column() == 10:
                               nextIndex = current.sibling(current.row() + 1, 0)
                            else:
                                nextIndex = current.sibling(current.row() , current.column()+1)

                            if nextIndex.isValid():
                                self.ui.tableWidget.setCurrentIndex(nextIndex)
                                self.ui.tableWidget.edit(nextIndex)
                            return res
                    #return super().eventFilter(source, event)

                    if (event.type() == QtCore.QEvent.FocusOut):
                            # ensure that the table receives the key event first
                            res = super().eventFilter(source, event)
                            current = self.ui.tableWidget.currentIndex()

                            if current.column() == 1:
                                valstr=str(self.ui.tableWidget.item(current.row(),0).text())
                                x = self.hzkchk(valstr)
                                if x == 1:
                                   nextIndex = current.sibling(current.row() , 0)
                                   if nextIndex.isValid():
                                      self.ui.tableWidget.setCurrentIndex(nextIndex)
                                      self.ui.tableWidget.edit(nextIndex)
                                return res

                            if current.column() == 6:
                                try:
                                    valint = int(self.ui.tableWidget.item(current.row(),5).text())
                                except:
                                    valint = 0
                                else:
                                    pass
                                x = self.readtorihikisaki(valint)
                                item6 = QTableWidgetItem(str(x[1]))
                                self.ui.tableWidget.setItem(current.row(), 6, item6)
                                self.ui.tableWidget.resizeColumnToContents(6)
                                nextIndex = current.sibling(current.row() , current.column()+1)
                                if nextIndex.isValid():
                                    self.ui.tableWidget.setCurrentIndex(nextIndex)
                                    self.ui.tableWidget.edit(nextIndex)
                                return res

                            if current.column() == 8:
                                try:
                                    valint=int(self.ui.tableWidget.item(current.row(),7).text())
                                except:
                                    valint = 0
                                else:
                                    pass
                                x = self.readtorihikisaki(valint)
                                item8 = QTableWidgetItem(str(x[1]))
                                self.ui.tableWidget.setItem(current.row(), 8, item8)
                                self.ui.tableWidget.resizeColumnToContents(8)
                                nextIndex = current.sibling(current.row() , current.column()+1)
                                if nextIndex.isValid():
                                    self.ui.tableWidget.setCurrentIndex(nextIndex)
                                    self.ui.tableWidget.edit(nextIndex)
                                return res

                            if current.column() == 10:
                                valstr=str(self.ui.tableWidget.item(current.row(),9).text())
                                x = self.hzkchk(valstr)
                                if x == 1:
                                   nextIndex = current.sibling(current.row() , 9)
                                   if nextIndex.isValid():
                                      self.ui.tableWidget.setCurrentIndex(nextIndex)
                                      self.ui.tableWidget.edit(nextIndex)
                                return res

                    return super().eventFilter(source, event)

        def sub_dlg(self):
            dialog = Subkentorihikisaki()
            if dialog.exec():
                r = self.ui.tableWidget.currentRow()
                c = self.ui.tableWidget.currentColumn()
                item = QTableWidgetItem(dialog.dlg.lineEdit.text())
                item.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
                self.ui.tableWidget.setItem(r,c, item)
                self.ui.tableWidget.setFocus()

        def hzkchk(self,hizuke):
            if hizuke == "" or hizuke == "0":
               err = 0
            elif hizuke != "":
               hizukestr = str(hizuke)
               try:
                   dte = datetime.strptime(hizukestr, '%Y%m%d')
                   err = 0
               except:
                   #QMessageBox.warning(self,'日付エラー','日付エラー')
                   err = 1
               else:
                   pass
            return err

        def readtorihikisaki(self,code):
            try:
                cursor = conn.cursor(as_dict=True)
                sql = "select * from 取引先マスター"
                sql += " where 取引先コード = "  + str(code)

                cursor.execute(sql)
                results = cursor.fetchall()
                sonzai = 0
                torihikisakimei = ""
                for res in results:
                    torihikisakimei = str(res["取引先名"])
                    sonzai = 1

            except Exception as e:
                QMessageBox.warning(self,'エラー',sql + e.args)

            else:
                pass

            cursor.close()

            return (sonzai,torihikisakimei)

        def end(self):
            self.close()

        def torikeshi(self):
            self.ui.lineEdit.setText('')
            self.ui.lineEdit_2.setText('')
            self.ui.tableWidget.setRowCount(0)
            self.ui.lineEdit.setFocus()

        def edit(self):
            x = self.hzkchk(self.ui.lineEdit.text())
            if x == 1:
               QMessageBox.warning(self,'エラー','開始日付エラー')
               self.ui.lineEdit.setFocus
            else:
               self.ui.lineEdit.focusNextChild()

        def select(self):
            x = self.hzkchk(self.ui.lineEdit_2.text())
            if x == 1:
               QMessageBox.warning(self,'エラー','終了日付エラー')
               self.ui.lineEdit_2.setFocus
               return
            else:
               pass

            codestt = self.ui.lineEdit.text()
            codeend = self.ui.lineEdit_2.text()
            try:
                codesttint = int(codestt)
                codeendint = int(codeend)
            except:
                QMessageBox.warning(self,'エラー','数値エラー')
                self.ui.lineEdit.setFocus()
                return
            else:
                if codesttint < 0 or codesttint > 99991231:
                   QMessageBox.warning(self,'エラー','開始日付エラー')
                   self.ui.lineEdit.setFocus()
                   return

                if codeendint < 0 or codeendint > 99991231:
                   QMessageBox.warning(self,'エラー','終了日付エラー')
                   self.ui.lineEdit_2.setFocus()
                   return

                if codesttint > codeendint:
                   QMessageBox.warning(self,'エラー','日付範囲エラー')
                   self.ui.lineEdit.setFocus()
                   return


            try:
                cursor = conn.cursor(as_dict=True)

                sql = "select 取引明細.*,coalesce(T.取引先名,'') as 取引先名称,coalesce(S.取引先名,'') as 支払先名称 from 取引明細"
                sql += " left outer join 取引先マスター as T on 取引明細.取引先=T.取引先コード"
                sql += " left outer join 取引先マスター as S on 取引明細.支払先=S.取引先コード"
                sql += " where 取引日 >= "  + str(codesttint)
                sql += " and 取引日 <= "  + str(codeendint)
                sql += " order by 取引日,連番"

                cursor.execute(sql)
                results = cursor.fetchall()
                self.ui.tableWidget.setRowCount(cursor.rowcount+20)
                row = 0
                for res in results:
                    item0 = QTableWidgetItem(str(res["取引日"]))
                    item1 = QTableWidgetItem(str(res["連番"]))
                    item2 = QTableWidgetItem(str(res["摘要"]))
                    item3 = QTableWidgetItem(str(res["入金額"]))
                    item4 = QTableWidgetItem(str(res["出金額"]))
                    item5 = QTableWidgetItem(str(res["取引先"]))
                    item6 = QTableWidgetItem(str(res["取引先名称"]))
                    item7 = QTableWidgetItem(str(res["支払先"]))
                    item8 = QTableWidgetItem(str(res["支払先名称"]))
                    item9 = QTableWidgetItem(str(res["支払日"]))
                    item10 = QTableWidgetItem(str(res["取引区分"]))

                    widget = QWidget()
                    checkbox = QCheckBox("check")
                    widget.checkState = checkbox.checkState()
                    #checkbox.setCheckState(Qt.Checked)
                    playout = QHBoxLayout(widget)
                    playout.addWidget(checkbox)
                    playout.setAlignment(Qt.AlignCenter)
                    playout.setContentsMargins(0,0,0,0)
                    widget.setLayout(playout)

                    item12 = QTableWidgetItem(str(res["明細番号"]))

                    #item6.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
                    #item8.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
                    item12.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)

                    #v AlignVCenter:80 Top:20 Bottom:40 Baseline:100
                    #h AlignHCenter:4 Left:1 Right:2 Justify:8
                    item0.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
                    item1.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
                    item2.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignLeft)
                    item3.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
                    item4.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
                    item5.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
                    item6.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignLeft)
                    item7.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
                    item8.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignLeft)
                    item9.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
                    item10.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignHCenter)
                    item12.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)

                    self.ui.tableWidget.setItem(row, 0,item0)
                    self.ui.tableWidget.resizeColumnToContents(0)
                    self.ui.tableWidget.setItem(row, 1, item1)
                    self.ui.tableWidget.resizeColumnToContents(1)
                    self.ui.tableWidget.setItem(row, 2, item2)
                    self.ui.tableWidget.resizeColumnToContents(2)
                    self.ui.tableWidget.setItem(row, 3, item3)
                    self.ui.tableWidget.resizeColumnToContents(3)
                    self.ui.tableWidget.setItem(row, 4, item4)
                    self.ui.tableWidget.resizeColumnToContents(4)
                    self.ui.tableWidget.setItem(row, 5, item5)
                    self.ui.tableWidget.resizeColumnToContents(5)
                    self.ui.tableWidget.setItem(row, 6, item6)
                    self.ui.tableWidget.resizeColumnToContents(6)
                    self.ui.tableWidget.setItem(row, 7, item7)
                    self.ui.tableWidget.resizeColumnToContents(7)
                    self.ui.tableWidget.setItem(row, 8, item8)
                    self.ui.tableWidget.resizeColumnToContents(8)
                    self.ui.tableWidget.setItem(row, 9, item9)
                    self.ui.tableWidget.resizeColumnToContents(9)
                    self.ui.tableWidget.setItem(row, 10, item10)
                    self.ui.tableWidget.resizeColumnToContents(10)

                    self.ui.tableWidget.setCellWidget(row, 11, checkbox)
                    #self.ui.tableWidget.resizeColumnToContents(11)

                    self.ui.tableWidget.setItem(row, 12, item12)
                    self.ui.tableWidget.resizeColumnToContents(12)
                    row += 1

                for i in range(20):
                    item0 = QTableWidgetItem("")
                    item1 = QTableWidgetItem("")
                    item2 = QTableWidgetItem("")
                    item3 = QTableWidgetItem("")
                    item4 = QTableWidgetItem("")
                    item5 = QTableWidgetItem("")
                    item6 = QTableWidgetItem("")
                    item7 = QTableWidgetItem("")
                    item8 = QTableWidgetItem("")
                    item9 = QTableWidgetItem("")
                    item10 = QTableWidgetItem("")

                    widget = QWidget()
                    checkbox = QCheckBox()
                    widget.checkState = checkbox.checkState
                    #checkbox.setCheckState(Qt.Checked)
                    playout = QHBoxLayout(widget)
                    playout.addWidget(checkbox)
                    playout.setAlignment(Qt.AlignCenter)
                    playout.setContentsMargins(0,0,0,0)
                    widget.setLayout(playout)

                    item12 = QTableWidgetItem("")

                    #item6.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
                    #item8.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
                    item12.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)

                    #v AlignVCenter:80 Top:20 Bottom:40 Baseline:100
                    #h AlignHCenter:4 Left:1 Right:2 Justify:8
                    item0.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
                    item1.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
                    item2.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignLeft)
                    item3.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
                    item4.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
                    item5.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
                    item6.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignLeft)
                    item7.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
                    item8.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignLeft)
                    item9.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
                    item10.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignHCenter)
                    item12.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)

                    self.ui.tableWidget.setItem(row, 0,item0)
                    self.ui.tableWidget.resizeColumnToContents(0)
                    self.ui.tableWidget.setItem(row, 1, item1)
                    self.ui.tableWidget.resizeColumnToContents(1)
                    self.ui.tableWidget.setItem(row, 2, item2)
                    self.ui.tableWidget.resizeColumnToContents(2)
                    self.ui.tableWidget.setItem(row, 3, item3)
                    self.ui.tableWidget.resizeColumnToContents(3)
                    self.ui.tableWidget.setItem(row, 4, item4)
                    self.ui.tableWidget.resizeColumnToContents(4)
                    self.ui.tableWidget.setItem(row, 5, item5)
                    self.ui.tableWidget.resizeColumnToContents(5)
                    self.ui.tableWidget.setItem(row, 6, item6)
                    self.ui.tableWidget.resizeColumnToContents(6)
                    self.ui.tableWidget.setItem(row, 7, item7)
                    self.ui.tableWidget.resizeColumnToContents(7)
                    self.ui.tableWidget.setItem(row, 8, item8)
                    self.ui.tableWidget.resizeColumnToContents(8)
                    self.ui.tableWidget.setItem(row, 9, item9)
                    self.ui.tableWidget.resizeColumnToContents(9)
                    self.ui.tableWidget.setItem(row, 10, item10)
                    self.ui.tableWidget.resizeColumnToContents(10)
                    self.ui.tableWidget.setCellWidget(row, 11, checkbox)
                    #self.ui.tableWidget.resizeColumnToContents(11)
                    self.ui.tableWidget.setItem(row, 12, item12)
                    self.ui.tableWidget.resizeColumnToContents(12)
                    row += 1

                self.ui.tableWidget.setFocus()

            except Exception as e:
                QMessageBox.warning(self,'エラー',sql + e.args)
            else:
                pass

            cursor.close()

            return

        def koshin(self):
            row = self.ui.tableWidget.rowCount()
            column = self.ui.tableWidget.columnCount()
            results = []
            for r in range(row):
                A = []
                for c in range(column):
                    if c !=  11:
                       it = self.ui.tableWidget.item(r,c)
                       text = ""
                       if it:
                            text = it.text()
                       else:
                            print("!")
                    else:
                       if self.ui.tableWidget.cellWidget(r,c).checkState() == QtCore.Qt.Checked:
                            text = "true"
                       else:
                            text = "false"

                    A.append(text)

                results.append(A,)

            row=0
            for res in results:
                row += 1
                if res[0] != "":
                   #print(res[0],res[1],res[2],res[3],res[4],res[5], res[6],res[7],res[8],res[9],res[10],res[11],res[12] )
                   f0 = res[0]
                   f1 = res[1]
                   f2 = res[2]
                   f3 = res[3]
                   f4 = res[4]
                   f5 = res[5]
                   f6 = res[6]
                   f7 = res[7]
                   f8 = res[8]
                   f9 = res[9]
                   f10 = res[10]
                   f11 = res[11]
                   f12 = res[12]
                   x = self.hzkchk(f0)
                   if x == 1:
                       QMessageBox.warning(self,'エラー','日付エラー' + str(row) + "行目")
                       return
                   if f1 == "":
                       f1 = "0"
                   if f3 == "":
                       f3 = "0"
                   if f4 == "":
                       f4 = "0"
                   if f5 == "":
                       f5 = "0"
                   if f7 == "":
                       f7 = "0"
                   if f9 == "":
                       f9 = "0"
                   if f10 == "":
                       f10 = "0"
                   if f12 == "":
                       f12 = "0"
                   try:
                       f0int = int(f0)
                       f1int = int(f1)
                       f3int = int(f3)
                       f4int = int(f4)
                       f5int = int(f5)
                       f7int = int(f7)
                       f9int = int(f9)
                       f10int = int(f10)
                       f12int = int(f12)
                   except:
                       QMessageBox.warning(self,'エラー','数値エラー' + str(row) + "行目")
                   else:
                       pass

            row=0
            for res in results:
                row += 1
                if res[0] != "":
                   #print(res[0],res[1],res[2],res[3],res[4],res[5], res[6],res[7],res[8],res[9],res[10],res[11],res[12] )
                   f0 = res[0]
                   f1 = res[1]
                   f2 = res[2]
                   f3 = res[3]
                   f4 = res[4]
                   f5 = res[5]
                   f6 = res[6]
                   f7 = res[7]
                   f8 = res[8]
                   f9 = res[9]
                   f10 = res[10]
                   f11 = res[11]
                   f12 = res[12]
                   x = self.hzkchk(f0)
                   if x == 1:
                      QMessageBox.warning(self,'エラー','日付エラー' + str(row) + "行目")
                      return
                   if f1 == "":
                      f1 = "0"
                   if f3 == "":
                      f3 = "0"
                   if f4 == "":
                      f4 = "0"
                   if f5 == "":
                      f5 = "0"
                   if f7 == "":
                      f7 = "0"
                   if f9 == "":
                      f9 = "0"
                   if f10 == "":
                      f10 = "0"
                   if f12 == "":
                      f12 = "0"
                   try:
                      f0int = int(f0)
                      f1int = int(f1)
                      f3int = int(f3)
                      f4int = int(f4)
                      f5int = int(f5)
                      f7int = int(f7)
                      f9int = int(f9)
                      f10int = int(f10)
                      f12int = int(f12)
                   except:
                      QMessageBox.warning(self,'エラー','数値エラー' + str(row) + "行目")
                   else:
                      pass

                   if f12int == 0:
                      #新規
                      sqlstr = " insert into 取引明細 "
                      sqlstr += " (明細番号,取引日,連番,摘要,入金額,出金額,取引先,支払先,支払日,取引区分) "
                      sqlstr += " values( " + "(select coalesce(max(明細番号),0)+1 from 取引明細)" + ","
                      sqlstr += f0 + "," + f1 + ",'" + f2 + "'," + f3 + "," + f4 + "," + f5 + ","
                      sqlstr += f7 + "," + f9 + "," + f10 + ")"

                   else:
                      #既存
                      if f11 == "false":
                         sqlstr = " update 取引明細 set "
                         sqlstr += " 取引日=" + f0
                         sqlstr += ",連番=" + f1
                         sqlstr += ",摘要='" + f2 + "'"
                         sqlstr += ",入金額=" + f3
                         sqlstr += ",出金額=" + f4
                         sqlstr += ",取引先=" + f5
                         sqlstr += ",支払先=" + f7
                         sqlstr += ",支払日=" + f9
                         sqlstr += ",取引区分=" + f10
                         sqlstr += " where 明細番号=" + f12
                      else:
                         sqlstr =  " delete from 取引明細 "
                         sqlstr += " where 明細番号=" + f12

                   try:
                      cursor = conn.cursor(as_dict=True)
                      cursor.execute(sqlstr)

                   except:
                      QMessageBox.warning(self,'エラー',sqlstr)
                      return

                   else:
                      pass

            conn.commit()
            cursor.close()
            QMessageBox.warning(self,'結 果','更新しました。')
            self.torikeshi()
            self.ui.lineEdit.setFocus()

class Subkentorihikisaki(QDialog):
                             def __init__(self, parent=None):
                                 super().__init__(parent)
                                 self.dlg = Ui_kentorihikisaki()
                                 self.dlg.setupUi(self)
                                 self.view()
                                 self.dlg.tableView.clicked.connect(self.valset)

                             def valset(self):
                                     selection = self.dlg.tableView.selectedIndexes()
                                     if selection:
                                        rows = sorted(index.row() for index in selection)
                                        columns = sorted(index.column() for index in selection)
                                        rowcount = rows[-1] - rows[0] + 1
                                        colcount = columns[-1] - columns[0] + 1
                                        table = [[''] * colcount for _ in range(rowcount)]
                                        for index in selection:
                                            row = index.row() - rows[0]
                                            column = index.column() - columns[0]
                                            table[row][column] = index.data()
                                     self.dlg.lineEdit.setText(str(table[0][0]))

                             def view(self):

                                     server = '192.168.10.111'
                                     username = 'sa'
                                     password = 'xxxxxxxx'
                                     database = 'kakei'

                                     try:
                                         conn = pymssql.connect(  server , username , password, database )
                                         cursor = conn.cursor()
                                         sqlstr = " select * from 取引先マスター "
                                         sqlstr += " order by 取引先コード"

                                         cursor.execute(sqlstr)
                                         results = cursor.fetchall()
                                         # データを表示
                                         coldata = ['コード','取引先名','取引先区分']
                                         rowdata = []
                                         row = 0
                                         for res in results:
                                             i=0
                                             rowone = []
                                             while i <= 2:
                                                  try:
                                                     strint = int(str(res[i]))
                                                     strfloat = float(str(res[i]))
                                                     if strint == strfloat:
                                                        rowone.append(strint)
                                                     else:
                                                        rowone.append(strfloat)
                                                  except:
                                                     rowone.append(str(res[i]))
                                                  else:
                                                     pass
                                                  i += 1
                                             row += 1
                                             rowdata.append(rowone)

                                         model = SimpleTableModel(rowdata, coldata)
                                         self.dlg.tableView.setModel(model)  # create model and set
                                         self.dlg.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)   #列幅の自動調整 0:Interactive 1:Stretch  2:Fixed  3:ResizeToContents

                                         cursor.close()
                                         conn.close()

                                     except Exception as e:
                                         QMessageBox.warning(self,'エラー','接続エラー' + e.args)

                                     else:
                                         pass


if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = inptorihiki()
    w.show()
    #sys.exit(app.exec_())
    sys.exit(app.exec())

実行画面

検索ボタン押下、選択後OKボタン押下で値がセットされます。

登録ボタンで取引明細へ追加、更新、削除を行います。明細番号がある場合が、更新か削除の対象になります。削除のチェックボックスへチェックすると削除されます。

明細番号がない場合は、新規として追加されます。新規分は、20行用意しています。不足の場合は、登録後再度日付指定します。20行追加できます。

取引先と支払先は、コード入力で取引先マスターより名称を表示します。検索ボタンで検索画面からコードを取得できます。セル移動は、Enterキーを使用します。

テーブル内の選択範囲のコピーは、Ctrl + c テーブルへの貼り付けは、Ctrl + v クリップボードへのコピーは、Ctrl + s で行います。右のボタンも同様。

PAGE TOP