Strona 1 z 1

Usprawnienie zmiany danych w formularzu

: czw lut 14, 2013 10:40 pm
autor: Wieslaw
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.

Re: Usprawnienie zmiany danych w formularzu

: sob mar 30, 2013 6:20 pm
autor: mg2
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


Re: Usprawnienie zmiany danych w formularzu

: śr kwie 03, 2013 4:41 pm
autor: Wieslaw
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?

Re: Usprawnienie zmiany danych w formularzu

: śr kwie 03, 2013 9:04 pm
autor: Jan_J
Banał: dodaj pojedyncze cudzysłowy wokół wartości tekstowych w zapytaniu: ... zajecia = '1' zamiast zajecia = 1. Zadziała, sprawdziłem.
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.

Re: Usprawnienie zmiany danych w formularzu

: sob kwie 06, 2013 1:07 am
autor: mg2
Czy jest możliwość, by formularz zamiany cyfr działał, gdy grupy będą mieć literowe nazwy?
Jak wspomniał Jan trzeba dodać apostrofy. W dynamicznym zapytaniu wygląda to tak:

Kod: Zaznacz cały

" and ""Grupa""   = " & "'" & sGr & "'"  &_
W załączniku są pełne nazwy grup np. "Gr. 1". Ponadto nazwy grup umieściłem w polu kombi.
do czego służy warunek 1=1?
"Trzymacz miejsca" tzn. można usunąć wszystkie "and" a zapytanie dalej działa.
baza nie prowadzi kontroli spójności danych; jeżeli formularz pozwoli, da się wpisać cokolwiek, nawet bez sensu
... W miejsce danych da się podstawić tekst zawierający kod, tak by został on wykonany. ...
Wrzuć nazwy grup, klas do oddzielnych tabelek i wypełnij nimi pola kombi.

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
Każde okno jest otwierane przez osobny guzik obok tabelki. Np. w oknie [Dodaj osobę] będą pola do wypełnienia ręcznego "Imię", "Nazwisko", "Uwagi". Pozostałe dane umieść w polach kombi. Po wypełnieniu pól wciskami przycisk "Wstaw", który ma podpięte makro z walidacją danych i poleceniem "insert".

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

Re: Usprawnienie zmiany danych w formularzu

: sob kwie 06, 2013 6:18 pm
autor: mg2
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".

Kod: Zaznacz cały

dialogLibraries.loadLibrary("Standard")
dlg = createUnoDialog(dialogLibraries.getByName("Standard").getByName("osoba"))
dlg.execute()
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".

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
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. )

Kod: Zaznacz cały

imie       = trim(dlg.getControl("txtImie").getText)
oddzial  = trim(dlg.getControl("listOddzial").getSelectedItem)
Przeprowadzamy walidację danych. Wartości pobrane z okna nie mogą być puste.

Kod: Zaznacz cały

if imie = null or imie = "" then
   msgbox("Wpisz imię.")
   exit sub
end if
Przyjmujemy, że tabela docelowa nie może zawierać dwa razy tej samej osoby. Sprawdzamy czy wpisana w oknie osoba znajduje się już w tabeli.

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
Jeżeli walidacja zakończyła się pomyślnie to wstawiamy dane do tabeli docelowej.

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    & "'" &  ")" )
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).

Kod: Zaznacz cały

dlg.setVisible(false)
thisDatabaseDocument.formDocuments.getByName("osoba").open
thisComponent.drawPage.forms.getByIndex("MainForm").reload
dlg.endExecute()
Działający przykład w załączniku.

Re: Usprawnienie zmiany danych w formularzu

: sob sty 23, 2016 9:43 pm
autor: Wieslaw
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.

Re: Usprawnienie zmiany danych w formularzu

: sob sty 30, 2016 11:56 am
autor: Wieslaw
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.

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

Re: Usprawnienie zmiany danych w formularzu

: sob sty 30, 2016 8:25 pm
autor: belstar

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
Data musi być podana w formacie ISO, a u ciebie jest jak widzisz w formularzu.

Re: Usprawnienie zmiany danych w formularzu

: sob sty 30, 2016 9:31 pm
autor: Wieslaw
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".

Re: Usprawnienie zmiany danych w formularzu

: sob sty 30, 2016 10:24 pm
autor: belstar
Testowałem na LO, i tam działa. Sprawdzę i dam znać, a poza tym możesz sobie zainstalować LO

Re: Usprawnienie zmiany danych w formularzu

: sob sty 30, 2016 10:39 pm
autor: belstar
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

Re: Usprawnienie zmiany danych w formularzu

: sob sty 30, 2016 10:48 pm
autor: Wieslaw
Dziękuję.