Open jonagricar opened 5 years ago
Da bo mogoče podatke dodajati iz aplikacije, bo treba dati ustrezne pravice uporabniku javnost
(zagotovo INSERT
na tabelah, kjer lahko vstavlja, morda pa tudi kak UPDATE
). Svetujem, da si pogledata po drugih projektih, kako v Shinyju narediti obrazce z vnosnimi polji in gumbi za potrditev, ki potem izvedejo ustrezno poizvedbo.
Kar se tiče ID-jev, bo najbolje, da pri ustvarjanju tabel uporabite tip SERIAL
- ID-ji se bodo potem avtomatsko generirali, če niso podani v poizvedbi. Če taki poizvedbi INSERT
na koncu dodasta še RETURNING id
(kjer je id
ime stolpca z ID-jem) in jo izvedeta z dbGetQuery
, bosta v rezultatu dobila ID dodane vrstice.
Naleteli sva na težavo pri spletnem obrazcu. Pomagali sva si s kodo iz projekta Vojne, a nama novih podatkov iz obrazca noče vstaviti v najine tabele (ne naredi nič, ne vrne niti napake). Zato sva poskusili še druge načine, a noben ne deluje pravilno. Ne veva, kje v kodi glede obrazca in vstavitve INSERT bi lahko prišlo do napake.
Pri meni aplikacije ne požene zaradi napačnega kodiranja znakov. To najlažje rešita tako, da program app.R
shranita s kodiranjem znakov UTF-8 (File / Save with Encoding... in nato izbereta UTF-8) - če vama šumnikov ne prikaže pravilno, ga pred tem odprita s kodiranjem znakov Windows-1250 ali cp1250. V izogib nadaljnjim problemom se prepričajta, da imata v RStudiu odprt projekt - če desno zgoraj piše Project: (None), kliknita tja, izberita Open Project..., nato pa poiščita datoteko Krvna-banka.Rproj
v mapi vajinega repozitorija (tako bo deloval tudi git znotraj RStudia). Tako se bodo datoteke privzeto odpirale s kodiranjem znakov UTF-8.
Trenutno v app.R
kličeta program projekt.R
, v katerem imata funkcije za ustvarjanje in polnjenje baze. Pri tem kličeta auth.R
, vendar končni uporabnik te datoteke nima, prav tako ne potrebuje prej omenjenih funkcij. Zato bo zadostovalo, če namesto projekt.R
kličeta auth_public.R
, kjer pa spremenljivko geslo
nadomestita s password
. V libraries.R
imata na koncu kodo za ustvarjanje baze SQLite v pomnilniku - tega ne potrebujeta, tako da lahko to kodo pobrišeta.
Kar se tiče izvedbe stavka SQL ob kliku na gumb, lahko to dosežeta z observeEvent
, npr.
observeEvent(input$submit, {
dbSendQuery(conn, build_sql("INSERT INTO oseba (ime, kraj, drzava, starost, email, teza, krvna_skupina, datum_vpisa_v_evidenco)
VALUES (", input$imepri, ",", input$kraj1, ", ", input$drzava1, ",", input$sta, ",", input$email1, ",",
input$teza1, ",", input$skup, ",", input$dat, ");", con=conn))
})
Da bo poizvedba delovala, bo treba uporabniku javnost
dati pravico uporabe ustreznega števca. Najlažje bo to narediti za vse števce hkrati:
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO javnost
Kot vidim, imata ustrezno vrstico v projekt.R
zakomentirano - svetujem pa, da odstranita WITH GRANT OPTION
.
Za šumnike sva naredili kot ste svetovali. V bazi šumniki delujejo, v aplikaciji pa še vedno ne.
Poizvedba, ki doda novega donatorja v tabelo oseba, zdaj deluje, hvala. Imava pa še zadnje vprašanje glede aplikacije. Hoteli sva, da se ob pritisku na gumb doda tudi nova vrečka v zalogo, ki ima izpolnjena tudi polja kdo je donator, kje jo hranijo in da dobi tudi že svojega prejemnika. poskušali sva na več načinov, a nama nikakor ne uspe, tudi z RETURNING id ne. Ali je to preveč komplicirano ali se da to realizirati?
Trenutno so šumniki app.R
deloma v kodiranju UTF-8, deloma pa Windows-1250, tako da mi še vedno noče pognati aplikacije. Najbolje bo, če odpreta datoteko s kodiranjem znakov UTF-8, nato pa poiščeta vse vprašaje in nadomestita z ustreznimi šumniki (tudi v komentarjih, če je kak tak primer).
Kar se tiče vstavljanja v bazo, bi šlo nekako tako:
id_oseba <- dbGetQuery(conn, build_sql("INSERT INTO oseba (ime, kraj, drzava, starost, email, teza, krvna_skupina, datum_vpisa_v_evidenco)
VALUES (", input$imepri, ",", input$kraj1, ", ", input$drzava1, ",", input$sta, ",", input$email1, ",",
input$teza1, ",", input$skup, ",", input$dat, ") RETURNING id;", con = conn))
id_bolnica <- dbGetQuery(conn, build_sql("SELECT id FROM bolnisnica
WHERE drzava = ", input$drzava1, "
ORDER BY kraj = ", input$kraj1, " DESC
LIMIT 1;", con=conn))
dbSendQuery(conn, build_sql("INSERT INTO kri (hemoglobin, datum_prejetja, donator, hrani)
VALUES (", input$hemo, ",", input$dat, ",", id_oseba[1,1], ",", id_bolnica[1,1],");",
con=conn))
Svetoval bi sicer, da izbiro bolnišnice prepustita uporabniku. Zgornja poizvedba bo dala ID bolnišnice v podanem kraju, če ta obstaja, sicer pa ID neke bolnišnice v izbrani državi. Glede na to, da se države pojavljajo tako pri bolnišnicah kot pri osebah, bi jih bilo smiselno dati v svojo tabelo, pa imata v prej omenjenih tabelah samo reference na njihove ID-je.
Datoteko sva odprli s kodiranjem UTF-8 in popravili vse ?, a v aplikaciji šumniki žal še vedno ne delujejo. Prav tako sva vse datoteke shranili s kodiranjem UTF-8. Obstaja morda še kakšna rešitev?
Kako pa vama prikaže šumnike? Gre samo za nize, ki so napisani v aplikaciji, ali tudi za podatke, ki se naložijo iz baze? Ali vama je predhodno že delovalo?
Mimogrede: v libraries.R
vključita še knjižnico dbplyr
, da bo aplikacija delovala že pri prvem zagonu.
Šumniki (zdi se mi, da tudi nekatere posebne črke) ne delujejo niti v tabelah, ki jih dobimo iz baze (prilagam PrintScreen tabele), niti kot tekst oziroma nizi v obrazcu (oziroma nikjer v aplikaciji) in npr. spustnem seznamu držav (prilagam PrintScreen obrazca). Enkrat vmes so šumniki v obrazcu že delovali in potem ne več. Hvala, knjižnica je zdaj dodana.
Če odpreva aplikacijo v browserju, šumniki v nizih, ki so v aplikaciji, delajo, v podatkih iz baze pa še vedno ne. Prilagam slike:
Na aplikaciji in v slovarju držav sva namesto šumnikov uporabili črke c, s, z. Ker se nama malo mudi, bi projekt radi oddali.
Pri meni ni problemov s šumniki, tako da bom dodal povezavo do projekta na repozitorij predmeta. Če se še nista, se lahko z @alenFMF domenita za termin zagovora. Če bosta do takrat še kaj spreminjali, mi javita, da posodobim povezavo.
Imam še dve pripombi:
reset
iz knjižnice shinyjs
, ki poskrbi, da se podatki znova naložijo.Če bosta jutri med 10h in 12h kaj na faksu, se lahko oglasita, pa pogledamo, kaj se da narediti glede šumnikov.
Posodobili sva par malenkosti, tako da prosiva za posodobitev povezave, hvala.
V redu, sem posodobil.
Uspeli sva postaviti aplikacijo s podatki o osebah, ki so del krvne banke in pa tudi obrazec, ki je namenjen vpisu novih donatorjev. Zanima naju, kako bi sedaj vse skupaj posodobili v seznamu donatorjev ter v seznamu vrečk. Med donatorje in tudi med vse osebe na glavni strani bi namreč radi dodali novo osebo. Prav tako pa bi v zavihku, kjer se bodo nahajale vrečke, radi dodali novo vrečko, ki pride v seznam vrečk skupaj z novo dodano osebo preko obrazca, ravno zato sva v obrazec vstavili tudi polje za hemoglobin. Poleg tega pa bo verjetno treba na novo dodati številko vrečke in id osebe (donatorja) - obstaja morda kakšen način, kako bi se te serijske identifikacije dodale avtomatsko?