python

Qt6 Python SQLServer 取引先一覧表

Qt6 Python SQLServer 取引先一覧表

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

LstTorihikisaki.pyproject LstTorihikisaki.py form.ui を作成

form.ui は、pyside6-uic form.ui -o ui_form.py を実行して ui_form.py を作成します。pymssqlを利用してSQLServerへ接続します。pdf作成は、reportlabを利用します。

form.ui

LstTorihikisaki.py

# This Python file uses the following encoding: utf-8
import sys
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QMainWindow,QMessageBox

# 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 ui_form import Ui_LstTorihikisaki

from reportlab.lib import colors
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4, landscape, portrait
from reportlab.lib.pagesizes import A3
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.platypus import Table, TableStyle
import webbrowser

import pymssql
import csv

class LstTorihikisaki(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_LstTorihikisaki()
        self.ui.setupUi(self)

        self.ui.lineEdit.returnPressed.connect(self.edit_2)
        self.ui.lineEdit_2.returnPressed.connect(self.edit_1)

        self.ui.label.setAlignment(Qt.AlignCenter)
        self.ui.label_2.setAlignment(Qt.AlignCenter)
        self.ui.lineEdit.setAlignment(Qt.AlignRight)
        self.ui.lineEdit_2.setAlignment(Qt.AlignRight)

        self.ui.pushButton.clicked.connect(self.pdfwrt)
        self.ui.pushButton_2.clicked.connect(self.exit)

        self.ui.label.setStyleSheet("background-color: pink")
        self.ui.label_2.setStyleSheet("background-color: violet")
        self.ui.pushButton.setStyleSheet("background-color: aqua")
        self.ui.pushButton_2.setStyleSheet("background-color: green")

    def exit(self) -> None:
        sys.exit()
        #self.close()

    def edit_1(self):
        self.ui.lineEdit.focusPreviousChild()

    def edit_2(self):
        self.ui.lineEdit_2.focusNextChild()

    def pdfwrt(self):

        sttstr = self.ui.lineEdit.text()
        endstr = self.ui.lineEdit_2.text()
        try:
          sttint = int(sttstr)
          endint = int(endstr)
        except:
            QMessageBox.warning(self,'エラー','数値エラー')
            self.edit_1()
            return
        else:
          if sttint > endint:
              QMessageBox.warning(self,'エラー','範囲エラー')
              self.edit_1()
              return

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

        try:
            conn = pymssql.connect(  server , username , password, database )

            tablenm = "取引先マスター"

            cursor = conn.cursor()

            sql = "select * from "  + tablenm
            sql += " where 取引先コード >= "  + str(sttint) + " and 取引先コード <= " + str(endint)
            sql += " order by 取引先コード"

            cursor.execute(sql)
            results = cursor.fetchall()

            #用紙サイズ
            ans = 1
            # 白紙をつくる
            FILENAME = 'LstTorihikisaki.pdf'
            if ans == 1:
               c = canvas.Canvas(FILENAME, pagesize=portrait(A4))
               gyosuu = 50  #a4縦 50
            elif ans == 2:
               c = canvas.Canvas(FILENAME,pagesize=landscape(A4))
               gyosuu = 34  #a4横 34
            elif ans == 3:
               c = canvas.Canvas(FILENAME,pagesize=landscape(A3))
               gyosuu = 50  #a3横 34
            else:
               pass

            # フォント登録
            pdfmetrics.registerFont(UnicodeCIDFont('HeiseiMin-W3'))
            pdfmetrics.registerFont(UnicodeCIDFont("HeiseiKakuGo-W5"))

            page = 0

            hedcol = ['コード','取引先名','取引先区分']
            tb = []
            tb.append(hedcol,)
            row = 0
            for res in results:
                rowdta = []
                rowdta.append(str(res[0]))
                rowdta.append(str(res[1]))
                rowdta.append(str(res[2]))
                tb.append(rowdta)
                if row == gyosuu:
                   c.setFont('HeiseiKakuGo-W5', 12)
                   if ans == 1:
                      c.drawString(10*mm, 290*mm, "*  " + tablenm + "一覧表  *") #a4 縦 書き出し(横位置, 縦位置, 文字)
                   elif ans == 2:
                      c.drawString(10*mm, 200*mm, "*  " + tablenm + "一覧表  *") #a4 横 書き出し(横位置, 縦位置, 文字)
                   elif ans == 3:
                      c.drawString(10*mm, 290*mm, "*  " + tablenm + "一覧表  *") #a3 横 書き出し(横位置, 縦位置, 文字)
                   else:
                      pass
                   page += 1
                   strpage = 'page.' + str(page)
                   if ans == 1:
                      c.drawString(170*mm, 290*mm,strpage) # a4 縦 書き出し(横位置, 縦位置, 文字)
                   elif ans == 2:
                      c.drawString(270*mm, 200*mm,strpage) # a4 横 書き出し(横位置, 縦位置, 文字)
                   elif ans == 3:
                      c.drawString(370*mm, 290*mm,strpage) # a3 横 書き出し(横位置, 縦位置, 文字)
                   else:
                      pass
                   #table = Table(tb,colWidths=40*mm, rowHeights=5*mm)       # テーブルサイズ 列 行
                   table = Table(tb,colWidths=(20*mm,60*mm,20*mm), rowHeights=5*mm)       # テーブルサイズ 列 行
                   table.setStyle(TableStyle([                              # tableの装飾
                                            ('FONT', (0, 0), (-1, -1), 'HeiseiMin-W3', 11),    #フォント,サイズ FONTL
                                            ('BOX', (0, 0), (-1, -1), 1, colors.black),        #罫線外側 BOX
                                            ('INNERGRID', (0, 0), (-1, -1), 1, colors.black),  #罫線内側 INNERGRID
                                            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),            #フォントの場所垂直 TOP MIDDLE BOTTOM
                                            ("ALIGN", (0,0), (-1,-1), "CENTER"),                 #フォントの場所水平 LEFT CENTER RIGHT
                                            ("ALIGN", (0,1), (-1,-1), "RIGHT"),                 #フォントの場所水平 LEFT CENTER RIGHT
                                            ("ALIGN", (1,1), (-1,-1), "LEFT"),                 #フォントの場所水平 LEFT CENTER RIGHT
                                            ("ALIGN", (2,1), (-1,-1), "CENTER"),                 #フォントの場所水平 LEFT CENTER RIGHT2
                                            ('BACKGROUND',(0,0),(2,0),colors.yellow),          #列、行
                                            ]))
                                            #セル結合 span #横線 lineabove #縦線 linebefore
                   c.setFont('HeiseiKakuGo-W5', 12)
                   if ans == 1:
                      table.wrapOn(c, 10*mm, 20*mm) # table a4 縦 書き出し位置 横 縦
                      table.drawOn(c, 10*mm, 20*mm)
                   elif ans == 2:
                      table.wrapOn(c, 10*mm, 10*mm) # table a4 横 書き出し位置 横 縦
                      table.drawOn(c, 10*mm, 10*mm)
                   elif ans == 3:
                      table.wrapOn(c, 10*mm, 20*mm) # table a3 横 書き出し位置 横 縦
                      table.drawOn(c, 10*mm, 20*mm)
                   else:
                      pass
                   # Canvasに書き込み
                   c.showPage()
                   row = -1
                   tb = []
                   tb.append(hedcol,)

                row += 1

            if row > 0:
                      num = 1
                      if ans == 1:
                         kasan = 2
                      elif ans == 2:
                         kasan = 2
                      elif ans == 3:
                         kasan = 2
                      else:
                         pass
                      while num < gyosuu + kasan - row:
                            tb.append(['','',''])
                            num += 1

                      c.setFont('HeiseiKakuGo-W5', 12)
                      if ans == 1:
                         c.drawString(10*mm, 290*mm, "*  " + tablenm + "一覧表  *") #a4 縦 書き出し(横位置, 縦位置, 文字)
                      elif ans == 2:
                         c.drawString(10*mm, 200*mm, "*  " + tablenm + "一覧表  *") #a4 横 書き出し(横位置, 縦位置, 文字)
                      elif ans == 3:
                         c.drawString(10*mm, 290*mm, "*  " + tablenm + "一覧表  *") #a3 横 書き出し(横位置, 縦位置, 文字)
                      else:
                         pass
                      page += 1
                      strpage = 'page.' + str(page)
                      if ans == 1:
                         c.drawString(170*mm, 290*mm,strpage) # a4 縦 書き出し(横位置, 縦位置, 文字)
                      elif ans == 2:
                         c.drawString(270*mm, 200*mm,strpage) # a4 横 書き出し(横位置, 縦位置, 文字)
                      elif ans == 3:
                         c.drawString(370*mm, 290*mm,strpage) # a3 横 書き出し(横位置, 縦位置, 文字)
                      else:
                         pass
                      table = Table(tb,colWidths=(20*mm,60*mm,20*mm), rowHeights=5*mm)       # テーブルサイズ 列 行
                      table.setStyle(TableStyle([                              # tableの装飾
                                               ('FONT', (0, 0), (-1, -1), 'HeiseiMin-W3', 11),    #フォント,サイズ FONTL
                                               ('BOX', (0, 0), (-1, -1), 1, colors.black),        #罫線外側 BOX
                                               ('INNERGRID', (0, 0), (-1, -1), 1, colors.black),  #罫線内側 INNERGRID
                                               ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),            #フォントの場所垂直 TOP MIDDLE BOTTOM
                                               ("ALIGN", (0,0), (-1,-1), "CENTER"),                 #フォントの場所水平 LEFT CENTER RIGHT
                                               ("ALIGN", (0,1), (-1,-1), "RIGHT"),                 #フォントの場所水平 LEFT CENTER RIGHT
                                               ("ALIGN", (1,1), (-1,-1), "LEFT"),                 #フォントの場所水平 LEFT CENTER RIGHT
                                               ("ALIGN", (2,1), (-1,-1), "CENTER"),                 #フォントの場所水平 LEFT CENTER RIGHT2
                                               ('BACKGROUND',(0,0),(2,0),colors.yellow),          #列、行
                                               ]))
                                               #セル結合 span #横線 lineabove #縦線 linebefore
                      if ans == 1:
                         table.wrapOn(c, 10*mm, 20*mm) # table a4 縦 書き出し位置 横 縦
                         table.drawOn(c, 10*mm, 20*mm)
                      elif ans == 2:
                         table.wrapOn(c, 10*mm, 10*mm) # table a4 横 書き出し位置 横 縦
                         table.drawOn(c, 10*mm, 10*mm)
                      elif ans == 3:
                         table.wrapOn(c, 10*mm, 20*mm) # table a3 横 書き出し位置 横 縦
                         table.drawOn(c, 10*mm, 20*mm)
                      else:
                         pass

            # Canvasに書き込み
            c.showPage()

            # ファイル保存
            c.save()

            # ブラウザーで表示
            webbrowser.open(FILENAME)

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

        else:
              pass

if __name__ == "__main__":
    app = QApplication(sys.argv)
    widget = LstTorihikisaki()
    widget.show()
    sys.exit(app.exec())

実行画面

Ubuntuで実行 PDF作成で select を実行し pdfファイルを作成。

-python

PAGE TOP