Usprawnienie zmiany danych w formularzu
Usprawnienie zmiany danych w formularzu
Poszukuję sposobu, by w formularzu usprawnić zmianę danych w kolumnie "Zajęcia". Może jakieś makro dołączone do przycisku, które zmieniałoby wszystkim uczestnikom danej grupy zajęcia na 1 lub 2 lub 3. W załączniku przesyłam skompresowany przykładowy formularz bazy.
- Załączniki
-
- Zajecia.zip
- (87.92 KiB) Pobrany 243 razy
OpenOffice 3.4.1 na Windows 7
Re: Usprawnienie zmiany danych w formularzu
W formularzu dodałem trzy pola "Zmień zaj.", "Na zajęcia", "W grupie". Do tego przycisk "Zmień". Do przycisku podpięte jest makro z poleceniem "UPDATE". (Grupa wpisana w pole działa niezależnie od grupy wybranej w tabeli z prawej strony.)
Kod: Zaznacz cały
Sub ZmienZajecia
Dim iZajZ as Integer
Dim iZajNa as Integer
Dim sGr as String
'''
Dim oDoc as Object
Dim oPage as Object
Dim oFrm as Object
'''
Dim oTxtZajZ as Object
Dim oTxtZajNa as Object
Dim oTxtGr as Object
'''
Dim sQuery as String
Dim oStmt as Object
'''
oDoc = ThisComponent
oPage = oDoc.DrawPage
oFrm = oPage.Forms.GetByIndex(0)
oTxtZajZ = oFrm.getByName("txtZajZ")
oTxtZajNa = oFrm.getByName("txtZajNa")
oTxtGr = oFrm.getByName("txtGr")
iZajZ = oTxtZajZ.text
iZajNa = oTxtZajNa.text
sGr = oTxtGr.text
sQuery = "update ""Dane""" &_
" set ""Zajecia"" = " & iZajNa &_
" where 1=1" &_
" and ""Grupa"" = " & sGr &_
" and ""Zajecia"" = " & iZajZ
msgbox(sQuery)
oStmt = ThisDataBaseDocument.CurrentController.ActiveConnection.CreateStatement
oStmt.ExecuteUpdate(sQuery)
oFrm.reload
End Sub
- Załączniki
-
- zajecia_zmiana.zip
- (80.83 KiB) Pobrany 243 razy
OOo3.1.1 na Ubuntu 9.04
Re: Usprawnienie zmiany danych w formularzu
Formularz znakomicie działa, gdy grupy mają nazwy cyfrowe.
Czy jest możliwość, by formularz zamiany cyfr działał, gdy grupy będą mieć literowe nazwy?
Czy jest możliwość, by formularz zamiany cyfr działał, gdy grupy będą mieć literowe nazwy?
- Załączniki
-
- zajecia_zmiana.zip
- (89.8 KiB) Pobrany 221 razy
OpenOffice 3.4.1 na Windows 7
Re: Usprawnienie zmiany danych w formularzu
Banał: dodaj pojedyncze cudzysłowy wokół wartości tekstowych w zapytaniu: ... zajecia = '1' zamiast zajecia = 1. Zadziała, sprawdziłem.
Na marginesie:
Na marginesie:
- do czego służy warunek 1=1?
- baza nie prowadzi kontroli spójności danych; jeżeli formularz pozwoli, da się wpisać cokolwiek, nawet bez sensu.
- konstrukcja napisu z żądaniem SQL na zasadzie mechanicznego łączenia tekstów z kodem i z danymi niesie pewne zagrożenia. W miejsce danych da się podstawić tekst zawierający kod, tak by został on wykonany. Nie twierdzę, że Twoja baza wymaga szczególnej ochrony, ale jeżeli ktoś tak buduje zapytania, powinien zdawać sobie sprawę do czego to może prowadzić. Niejeden duży projekt zaczynał się od garażowej prowizorki, w której poczynione błędy zyskują istotność w miarę, jak narzędzie się rozwija.
JJ
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Usprawnienie zmiany danych w formularzu
Jak wspomniał Jan trzeba dodać apostrofy. W dynamicznym zapytaniu wygląda to tak:Czy jest możliwość, by formularz zamiany cyfr działał, gdy grupy będą mieć literowe nazwy?
Kod: Zaznacz cały
" and ""Grupa"" = " & "'" & sGr & "'" &_
"Trzymacz miejsca" tzn. można usunąć wszystkie "and" a zapytanie dalej działa.do czego służy warunek 1=1?
baza nie prowadzi kontroli spójności danych; jeżeli formularz pozwoli, da się wpisać cokolwiek, nawet bez sensu
Wrzuć nazwy grup, klas do oddzielnych tabelek i wypełnij nimi pola kombi.... W miejsce danych da się podstawić tekst zawierający kod, tak by został on wykonany. ...
Skoro używasz makr to zrezygnuj z funkcjonalności formularza. Zrób wszystko ręcznie w SQL. Tabelkę używaj tylko do wyświetlania danych (ukryj pasek nawigacji i ustaw formularz do odczytu). Wszystkie wartości stałe trzymaj w oddzielnych tabelkach wypełniających pola kombi. (Grupy masz już zrobione, przenieś je tylko do oddzielnej tabelki.)
Zrób okna dialogowe np.:
- Dodaj osobę
- Dodaj grupę
- Dodaj klasę
- Zmiana grupy
Wszystko jest według makra, które już masz, tzn.
- weź formularz
- weź pole z formularza
- weź wartość z pola
- sprawdź wartość (jak z pola kombi to nie trzeba)
- zbuduj zapytanie SQL (insert, update, delete)
- wykonaj SQL
- Załączniki
-
- zajecia_zmiana_2.zip
- (81.12 KiB) Pobrany 246 razy
OOo3.1.1 na Ubuntu 9.04
Re: Usprawnienie zmiany danych w formularzu
Przykład okna dialogowego wstawiające dane do tabeli.
W okienku "Narzędzia->Makra->Zarządzaj oknami" mamy zakładki "Moduły", "Okna dialogowe", "Biblioteki". Tworzymy nowe okno i umieszczamy na nim kontrolki. (Żeby zaznaczyć okno trzeba je całe "obrysować" - klikanie nie zaznacza.)
Na formularzu wstawiamy przycisk otwierający okno poprzez makro. Poniższy kod ładuje okno "osoba" z biblioteki "Standard".
Okna dialogowe nie mają dostępu do formularzy. Musimy ręcznie wypełnić listy wartościami z tabel. Poniższy kod wypełnia pole listy "listOddzial" danymi z tabeli "oddzial".
Okno dialogowe zawiera przycisk wstawiający dane do tabeli. Najpierw pobieramy dane z pól i list. (Funkcja "trim" usuwa początowe i końcowe spacje. Zmienna "dlg" dająca dostęp do okna jest zadeklarowana globalnie, na poziomie modułu, tzn. znajduje się "na zewnątrz" wszystkich procedur. Dzięki temu gdy jedna procedura utworzy okno, druga procedura może później skorzystać z tego okna. )
Przeprowadzamy walidację danych. Wartości pobrane z okna nie mogą być puste.
Przyjmujemy, że tabela docelowa nie może zawierać dwa razy tej samej osoby. Sprawdzamy czy wpisana w oknie osoba znajduje się już w tabeli.
Jeżeli walidacja zakończyła się pomyślnie to wstawiamy dane do tabeli docelowej.
Uaktualniamy widok formularza i zamykamy okno. (Poniższy kod nie jest "ładny". Nie znalazłem bezpośredniego dostępu do formularza "osoba" więc: chowam okno, przywołuję widok formularza, to co jest aktywne na ekranie to "thisComponent", przeładowuję formularz, zamykam okno).
Działający przykład w załączniku.
W okienku "Narzędzia->Makra->Zarządzaj oknami" mamy zakładki "Moduły", "Okna dialogowe", "Biblioteki". Tworzymy nowe okno i umieszczamy na nim kontrolki. (Żeby zaznaczyć okno trzeba je całe "obrysować" - klikanie nie zaznacza.)
Na formularzu wstawiamy przycisk otwierający okno poprzez makro. Poniższy kod ładuje okno "osoba" z biblioteki "Standard".
Kod: Zaznacz cały
dialogLibraries.loadLibrary("Standard")
dlg = createUnoDialog(dialogLibraries.getByName("Standard").getByName("osoba"))
dlg.execute()
Kod: Zaznacz cały
stat = thisDataBaseDocument.currentController.activeConnection.createStatement
sel = stat.executeQuery("select ""oddzial"" from ""oddzial""")
while sel.next()
dlg.getControl("listOddzial").addItem(sel.getString(1), sel.getRow())
wend
Kod: Zaznacz cały
imie = trim(dlg.getControl("txtImie").getText)
oddzial = trim(dlg.getControl("listOddzial").getSelectedItem)
Kod: Zaznacz cały
if imie = null or imie = "" then
msgbox("Wpisz imię.")
exit sub
end if
Kod: Zaznacz cały
stat = thisDataBaseDocument.currentController.activeConnection.createStatement
sel = stat.executeQuery(_
"select count(""imie"") from ""osoba""" &_
"where 1=1" &_
"and ""imie"" = " & "'" & imie & "'" &_
"and ""nazwisko"" = " & "'" & nazwisko & "'" )
sel.next
if sel.getInt(1) > 0 then
msgbox( _
"Tabela już zawiera taką osobę." & chr(10) &_
"Imię:[" & imie & "]" & chr(10) &_
"Nazwisko:[" & nazwisko & "]")
exit sub
end if
Kod: Zaznacz cały
stat = thisDataBaseDocument.currentController.activeConnection.createStatement
stat.executeUpdate(_
"insert into ""osoba"" (" &_
" ""imie"", ""nazwisko"", ""oddzial""," &_
" ""grupa"", ""klasa"")" &_
"values (" &_
"'" & imie & "'" & "," &_
"'" & nazwisko & "'" & "," &_
"'" & oddzial & "'" & "," &_
"'" & grupa & "'" & "," &_
"'" & klasa & "'" & ")" )
Kod: Zaznacz cały
dlg.setVisible(false)
thisDatabaseDocument.formDocuments.getByName("osoba").open
thisComponent.drawPage.forms.getByIndex("MainForm").reload
dlg.endExecute()
- Załączniki
-
- zajecia_zmiana_3.zip
- (82.75 KiB) Pobrany 295 razy
OOo3.1.1 na Ubuntu 9.04
Re: Usprawnienie zmiany danych w formularzu
Pragnę usprawnić działanie bazy, ale nie umiem sobie poradzić z prawidłowym działaniem makra w formularzu "Dane1". W oparciu o datę zajęć chcę wpisać uwagę całej grupie. Przykład w załączniku.
- Załączniki
-
- Przyklad.zip
- (99.21 KiB) Pobrany 161 razy
OpenOffice 3.4.1 na Windows 7
Re: Usprawnienie zmiany danych w formularzu
Przerobiłem makro, ale podaje mi "Błąd uruchomieniowy języka BASIC" związany z "oStmt.ExecuteUpdate(sQuery)". Czy mógłby ktoś mi pomóc?
Przykład w załączniku.
Przykład w załączniku.
Kod: Zaznacz cały
Sub ZmienZajecia
Dim iZajZ as String
Dim iZajNa as String
Dim sGr as String
Dim sData as String
'''
Dim oDoc as Object
Dim oPage as Object
Dim oFrm as Object
'''
Dim oTxtZajZ as Object
Dim oTxtZajNa as Object
Dim oTxtGr as Object
Dim oTxtData as Object
'''
Dim sQuery as String
Dim oStmt as Object
'''
oDoc = ThisComponent
oPage = oDoc.DrawPage
oFrm = oPage.Forms.GetByIndex(0)
oTxtZajZ = oFrm.getByName("txtZajZ")
oTxtZajNa = oFrm.getByName("txtZajNa")
oTxtGr = oFrm.getByName("txtGr")
oTxtData = oFrm.getByName("txtData")
iZajZ = oTxtZajZ.text
iZajNa = oTxtZajNa.text
sGr = oTxtGr.text
sData = oTxtData.text
sQuery = "update ""Dane""" &_
" set ""Zajecia"" = " & "'" & iZajNa & "'" &_
" where 1=1" &_
" and ""Grupa"" = " & "'" & sGr & "'" &_
" and ""Data"" = " & "'" & sData & "'" &_
" and ""Zajecia"" = " & "'" & iZajZ & "'"
msgbox(sQuery)
oStmt = ThisDataBaseDocument.CurrentController.ActiveConnection.CreateStatement
oStmt.ExecuteUpdate(sQuery)
oFrm.reload
End Sub
- Załączniki
-
- Przyklad.zip
- (94.76 KiB) Pobrany 187 razy
OpenOffice 3.4.1 na Windows 7
Re: Usprawnienie zmiany danych w formularzu
Kod: Zaznacz cały
Sub ZmienZajecia
Dim iZajZ as String
Dim iZajNa as String
Dim sGr as String
Dim sData as String
'''
Dim oDoc as Object
Dim oPage as Object
Dim oFrm as Object
'''
Dim oTxtZajZ as Object
Dim oTxtZajNa as Object
Dim oTxtGr as Object
Dim oTxtData as Object
'''
Dim sQuery as String
Dim oStmt as Object
'''
oDoc = ThisComponent
oPage = oDoc.DrawPage
oFrm = oPage.Forms.GetByIndex(0)
oTxtZajZ = oFrm.getByName("txtZajZ")
oTxtZajNa = oFrm.getByName("txtZajNa")
oTxtGr = oFrm.getByName("txtGr")
oTxtData = oFrm.getByName("txtData")
'*******************************************************
ss = oTxtData.CurrentValue
y= ss.year
m= ss.month
d= ss.day
sData = y & "-" & m &"-" & d
'********************************************************
iZajZ = oTxtZajZ.text
iZajNa = oTxtZajNa.text
sGr = oTxtGr.text
'sData = oTxtData.text
sQuery = "update ""Dane""" &_
" set ""Zajecia"" = " & "'" & iZajNa & "'" &_
" where 1=1" &_
" and ""Grupa"" = " & "'" & sGr & "'" &_
" and ""Data"" = " & "'" & sData & "'" &_
" and ""Zajecia"" = " & "'" & iZajZ & "'"
msgbox(sQuery)
oStmt = ThisDataBaseDocument.CurrentController.ActiveConnection.CreateStatement
oStmt.ExecuteUpdate(sQuery)
oFrm.reload
End Sub
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Re: Usprawnienie zmiany danych w formularzu
Dzięki za podpowiedź, ale nadal, mam problem. Przy próbie zmiany danych mam komunikat: "Błąd uruchomieniowy języka BASIC. Nie ustawiono zmiennej obiektu" i zaznacza linię: "y= ss.year".
OpenOffice 3.4.1 na Windows 7
Re: Usprawnienie zmiany danych w formularzu
Testowałem na LO, i tam działa. Sprawdzę i dam znać, a poza tym możesz sobie zainstalować LO
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Re: Usprawnienie zmiany danych w formularzu
Wersja dla OO
Kod: Zaznacz cały
Sub ZmienZajecia
Dim iZajZ as String
Dim iZajNa as String
Dim sGr as String
Dim sData as String
'''
Dim oDoc as Object
Dim oPage as Object
Dim oFrm as Object
'''
Dim oTxtZajZ as Object
Dim oTxtZajNa as Object
Dim oTxtGr as Object
Dim oTxtData as Object
'''
Dim sQuery as String
Dim oStmt as Object
'''
oDoc = ThisComponent
oPage = oDoc.DrawPage
oFrm = oPage.Forms.GetByIndex(0)
oTxtZajZ = oFrm.getByName("txtZajZ")
oTxtZajNa = oFrm.getByName("txtZajNa")
oTxtGr = oFrm.getByName("txtGr")
oTxtData = oFrm.getByName("txtData")
'*********************************************
'wersja dla OO
ss = oTxtData.CurrentValue
y= Left(ss, 4)
m= Mid(ss,5,2)
d= Right(ss, 2)
sData = y & "-" & m &"-" & d
'*********************************************
iZajZ = oTxtZajZ.text
iZajNa = oTxtZajNa.text
sGr = oTxtGr.text
'sData = oTxtData.text
sQuery = "update ""Dane""" &_
" set ""Zajecia"" = " & "'" & iZajNa & "'" &_
" where 1=1" &_
" and ""Grupa"" = " & "'" & sGr & "'" &_
" and ""Data"" = " & "'" & sData & "'" &_
" and ""Zajecia"" = " & "'" & iZajZ & "'"
msgbox(sQuery)
oStmt = ThisDataBaseDocument.CurrentController.ActiveConnection.CreateStatement
oStmt.ExecuteUpdate(sQuery)
oFrm.reload
End Sub
LibreOffice 5.1.2.2 Ubuntu 16 LTS