Problemy z aktualizacją rekordów w qt designer

0

Dzień dobry,

Obecnie stoi przede mną następujący problem:

"Szkoda że przy edycji wartości w wielu rekordach trzeba po wpisaniu każdej wartości wciskać „ptaszka”. Przy uzupełnianiu kilkudziesięciu rekordów jest to uciążliwe. Czy nie można tak zrobić żeby zapisać dopiero po wprowadzeniu wszystkich zmian.[?]"

Ptaszek to:

self.dlg.pushButton_18.clicked.connect(self.prwn_zam) #przycisk wyzwalający funkcje.

To co miałem dotychczas aktualizowało tylko jeden rekord, który musiał być zaznaczony, aby dane w self.model4 przechodziły do zapytania SQL (ma ponad 30 rekordów, więc będę pokazywał tylko fragment), ale przełożeni chcą, by "ptaszka' można było kliknąć tylko raz - po wprowadzeniu wszystkich zmian w self.model4.

Szef zaproponował:

self.model4.dataChanged.connect(self.test)

w funkcji uruchamiającej wtyczkę
następnie w funkcji test była tworzona tabela

zmienioneWierszeTableView_3 = []

a potem wykorzystywana do:

i = self.dlg.tableView_3.selectionModel().currentIndex().row()#tabela, gdzie były przechowywane dane
if not i in zmienioneWierszeTableView_3:
        zmienioneWierszeTableView_3.append(i)
        print('Zmieniony wiersz ',i)#pokazywała numer wiersza

Obecnie przeniosłem to wszystko do do prwn_zam, ale nie mam pewności czy dobrze.

Po wielu próbach mam obecnie tak:

 def prwn_zam(self): #potwierdzenie zmian w rekordach zamówień
        print ('kliknięto przycisk zatwierdzania zmian!')#ptaszek pushButton_18
        con= self.model4.dataChanged.connect(self.prwn_test)
        if con:
            print("Połączenie zostało utworzone.")
        else:
            print("Nie udało się utworzyć połączenia.")
      
      
    def prwn_test(self):       
        zmienioneWierszeTableView_3 = []
        liczba_rekordow = self.model4.rowCount()
        i = self.dlg.tableView_3.selectionModel().currentIndex().row()
        idi = self.dlg.tableView_3.selectionModel().currentIndex().siblingAtRow(i).siblingAtColumn(33).data()# pobiera dane z wiersza, które idą potem do zapytania
        country = self.dlg.tableView_3.selectionModel().currentIndex().siblingAtRow(i).siblingAtColumn(0).data()
        ter = self.dlg.tableView_3.selectionModel().currentIndex().siblingAtRow(i).siblingAtColumn(1).data()
        akt = self.dlg.tableView_3.selectionModel().currentIndex().siblingAtRow(i).siblingAtColumn(2).data() 
#...
         if not i in zmienioneWierszeTableView_3:
                zmienioneWierszeTableView_3.append(i)
                print('Zmieniony wiersz ',i, ' o ID: ', idi, ter, akt)  
                if idi is not None:
                       idi = int(float(idi))
        danRek.append(idi) 
        danRek1.append(ter)
        danRek2.append(akt)
#danRek[1-32] to tablice tworzone wcześniej. Też mam wątpliwość czy mają być tworzone w tej funkcji czy w startowej wtyczki?

Następnie jest już moja część :

 for j, k, l, m, n, o .... in zip(danRek, danRek1, danRek2, danRek3, danRek4, danRek5, ...):
                    if isinstance(k, str) and k != 'NULL': #teryt
                        k ='\'' +  k + '\''
                    if isinstance(n, str) and n != 'NULL': #Zamiawiający
                        n ='\'' +  n + '\''
                      sql = f"UPDATE ZARZADZANIE.ZAMOWIENIA SET teryt={k}, ZAMAWIAJACY_KOD={n}, ...,DATA_MOD_REK=TO_DATE(SYSDATE,\'DD.MM.YYYY HH24:MI:SS\') WHERE ID={j}" 
                    print (sql)
                    sql = query.prepare(sql)
                    if query.exec():
                        print('dodano!')
                    else:
                        print (query.lastError().text())    

która już działa- zapytanie chodzi dobrze, ale dane do niej trafiają nie te co trzeba, no i ma wykonywać się w pętli tyle razy w ilu rekordach wprowadzono zmiany, a nie tylko raz po zaznaczonym rekordzie (stary kod już usunąłem, ale mam go w archiwalnej- poprzedniej wersji kodu).

Nie wykluczam że mam problem z początkiem rozłożenia tego kodu (przed ostatni fragment).

Może jakieś sugestie?

0

Ja się nie znam, ale AI podpowiada
Pierwsza sprawa to łączenie sygnału dataChanged z funkcją prwn_test wewnątrz funkcji prwn_zam. To może prowadzić do błędów. Możesz przekierować sygnał do prwn_test w miejscu inicjalizacji interfejsu użytkownika lub w innym odpowiednim miejscu, aby uniknąć potencjalnych problemów z wielokrotnym podłączaniem.
Następnie, w funkcji prwn_test, masz zdefiniowaną zmienną zmienioneWierszeTableView_3 jako pustą listę. To spowoduje, że ta lista jest resetowana za każdym razem, gdy funkcja jest wywoływana. Dlatego tylko ostatnia zmiana będzie widoczna w liście. Aby rozwiązać ten problem, możesz zdefiniować tę zmienną na poziomie klasy, tak aby była dostępna dla wszystkich funkcji.
Kolejna kwestia to tworzenie list danRek, danRek1, danRek2 itd. W obecnej implementacji, te listy są resetowane za każdym razem, gdy funkcja prwn_zam jest wywoływana. Możesz przenieść tworzenie tych list na poziom klasy lub na odpowiednie miejsce w zależności od potrzeb.
Jeśli chodzi o pętlę, w której aktualizujesz bazy danych, wydaje się, że jest ona umieszczona wewnątrz pętli, która iteruje przez elementy danRek, danRek1, danRek2 itd. Jednakże wydaje się, że wcześniej gromadzisz te elementy w tych listach na podstawie zmian w widoku tabeli. Jeśli masz pewność, że te listy są prawidłowo wypełnione, to jest to poprawne podejście.

1 użytkowników online, w tym zalogowanych: 0, gości: 1