Обновление списка из Таблицы ms sql через PySimpleGUI
у меня есть такой код
# импрорт
import PySimpleGUI as sg
import pyodbc
from datetime import datetime
import re
#настройки
connection = pyodbc.connect(("Driver={ODBC Driver 17 for SQL Server};Server=MGP5-SPG04;Database=Test1;Trusted_Connection=yes;UID=sa;PWD=111qqqAAA"))
dbCursor = connection.cursor()
sg.theme('dark grey 9')
now = datetime.now()
Datatime = datetime.now()
print(datetime.now())
#Проверка на спец символ
def detect_special_characer(pass_string):
regex= re.compile('[@_!#$%^&*()<>?/\|}{~:]')
if(regex.search(pass_string) == None):
res = False
else:
res = True
return(res)
#получение списка товаров
def UpdateList(Output):
dbCursor.execute(f"select {Output} from BazaMSK")
data = dbCursor.fetchall()
new_list = []
for word in data:
new_str = ''
for w in word:
if detect_special_characer(w)==False:
new_str += w
new_list.append(new_str)
new_str = ','.join(w for w in new_list if w)
for i in range(len(new_list)):
new_list[i]=new_list[i].lower()
return new_list
#TovarANDCount=[]
#for i in range(len(UpdateList("Tovar"))):
#TovarANDCount.append(UpdateList("Tovar")[i],UpdateList("Count")[i])
print(UpdateList("Count"))#Тут ломаеться
#интерфейс
layout = [
[sg.Text('Введите товар'),sg.Combo(UpdateList("Tovar"), size=(40,15), key='-KTovar1-')],
[sg.Text('Количество товара'),sg.InputText(size=(8,3),key='-KCountTovar-')],
[sg.Output(size=(88, 20),key="-KInputText-")],
[sg.Submit("Сохранить"), sg.Submit("Обновить")]
]
window = sg.Window('Поставки', layout)
event, values = window.read()
while event not in (None,"Exit"):
event, values = window.read()
if event == "Сохранить":
sql = 'EXEC [dbo].[BazaMSKInsert] @Tovar=?,@Count=?,@Data=?'
params = (values['-KTovar1-'], values['-KCountTovar-'], Datatime)
dbCursor.execute(sql, params)
dbCursor.commit()
if event == "Обновить":
window['-KTovar1-'].update(values=UpdateList("Tovar"))
window['-KTovar1-'].update(values=UpdateList("Tovar"))
print("Обновляем данные,", datetime.now())
но тут я что-то не так написал выдает ошибку
Traceback (most recent call last):
File "C:\Users\maksimov_dv\PycharmProjects\pythonProject\interface.py", line 45, in <module>
print(UpdateList("Count"))
File "C:\Users\maksimov_dv\PycharmProjects\pythonProject\interface.py", line 35, in UpdateList
if detect_special_characer(w)==False:
File "C:\Users\maksimov_dv\PycharmProjects\pythonProject\interface.py", line 21, in detect_special_characer
if(regex.search(pass_string) == None):
TypeError: expected string or bytes-like object
подскажите как решить
Ответы (1 шт):
Автор решения: Womba 306
→ Ссылка
Я переписал весь код
# импрорт
import PySimpleGUI as sg
import pyodbc
from datetime import datetime
import re
import pandas
#настройки
connection = pyodbc.connect(("Driver={ODBC Driver 17 for SQL Server};Server=MGP5-SPG04;Database=Test1;Trusted_Connection=yes;UID=sa;PWD=111qqqAAA"))
dbCursor = connection.cursor()
sg.theme('dark grey 9')
now = datetime.now()
Datatime = datetime.now()
print(datetime.now())
#Проверка на спец символ
def detect_special_characer(pass_string):
regex= re.compile('[@_!#$%^&*()<>?/\|}{~:]')
if(regex.search(pass_string) == None):
res = False
else:
res = True
return(res)
#получение списка товаров
def UpdateList(sql):
dbCursor.execute(sql)
data = dbCursor.fetchall()
new_list = []
for word in data:
new_str = ''
for w in word:
if detect_special_characer(w)==False:
new_str += w
new_list.append(new_str)
new_str = ','.join(w for w in new_list if w)
for i in range(len(new_list)):
new_list[i]=new_list[i].lower()
return new_list
#TovarANDCount=[]
#for i in range(len(UpdateList("Tovar"))):
#TovarANDCount.append(UpdateList("Tovar")[i],UpdateList("Count")[i])
#print(UpdateList("Count"))
print(pandas.read_sql_query( "SELECT top 100 * FROM [dbo].[BazaMSK]"))
#интерфейс
layout = [
[sg.Text('Введите товар'),sg.Combo(UpdateList('Select Tovar from BazaMSK'), size=(30,15), key='-KTovar1-'),sg.Text('Введите производителя'),sg.Combo(UpdateList('EXEC [dbo].[Proiz_Select]'), size=(30,15), key='-KProiz-')],
[sg.Text('Количество товара'),sg.InputText(size=(8,3),key='-KCountTovar-')],
[sg.Output(size=(88, 20),key="-KInputText-")],
[sg.Submit("Сохранить"), sg.Submit("Обновить")]
]
window = sg.Window('Поставки', layout)
event, values = window.read()
while event not in (None,"Exit"):
event, values = window.read()
if event == "Сохранить":
sql = 'EXEC [dbo].[BazaMSKInsert] @Tovar=?,@Count=?,@Data=?,@IdProiz=?'
params = (values['-KTovar1-'], values['-KCountTovar-'], Datatime, (values['-KProiz-'].split())[1])
dbCursor.execute(sql, params)
dbCursor.commit()
print("Добвленно",values['-KCountTovar-'], values['-KTovar1-'],"в",(values['-KProiz-'].split())[0])
if event == "Обновить":
window['-KTovar1-'].update(values=UpdateList('Select Tovar from BazaMSK'))
window['-KProiz-'].update(values=UpdateList('EXEC [dbo].[Proiz_Select]'))
print("Обновляем данные,", datetime.now())
print(UpdateList('EXEC [dbo].[BazaMSK_Select]'))
sql:
USE [Test1]
GO
/****** Object: StoredProcedure [dbo].[BazaMSK_Select] Script Date: 17.06.2021 10:24:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[BazaMSK_Select]
as
SET NOCOUNT ON
SELECT [Tovar]+' '+Cast([Count] as varchar) as Tovar
FROM [dbo].[BazaMSK]
SELECT [Tovar]
,[Count]
,[SaleID]
,[Data]
,[IdProiz]
FROM [dbo].[BazaMSK]
USE [Test1]
GO
/****** Object: StoredProcedure [dbo].[BazaMSKInsert] Script Date: 17.06.2021 10:25:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[BazaMSKInsert]
(
@Tovar nvarchar(255),
@Count int,
@Data datetime,
@idProiz bit
)
as
SET NOCOUNT ON
DECLARE @SaleId int
Select @SaleId = (Select Max(SaleId) from BazaMSK) + 1
If (Select Count(*) from BazaMSK Where Tovar = @Tovar) = 0
begin
INSERT INTO [dbo].[BazaMSK]
([Tovar]
,[SaleID]
,[Count]
,[Data]
,[IdProiz])
VALUES
(@Tovar
,@SaleID
,@Count
,@Data
,@IdProiz)
END
ELSE BEGIN
Update BazaMSK Set [Count] = [Count] + @Count WHERE Tovar = @Tovar
END
USE [Test1]
GO
/****** Object: StoredProcedure [dbo].[BazaMSKInsert] Script Date: 17.06.2021 10:58:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[BazaMSKInsert]
(
@Tovar nvarchar(255),
@Count int,
@Data datetime,
@idProiz int
)
as
SET NOCOUNT ON
DECLARE @SaleId int
Select @SaleId = (Select Max(SaleId) from BazaMSK) + 1
If (Select Count(*) from BazaMSK Where Tovar = @Tovar) = 0
begin
INSERT INTO [dbo].[BazaMSK]
([Tovar]
,[SaleID]
,[Count]
,[Data]
,[IdProiz])
VALUES
(@Tovar
,@SaleID
,@Count
,@Data
,@IdProiz)
END
ELSE BEGIN
Update BazaMSK Set [Count] = [Count] + @Count, IdProiz = @idProiz WHERE Tovar = @Tovar
END
и все стало работать