Just nu i M3-nätverket
Gå till innehåll

lagra flera värden från checkboxar mha VBA och Access


mambofeber

Rekommendera Poster

hej! om man vill söka på en film som innehåller flera olika genrer mha checkboxar, så har jag valt ett formulär (se bifogad bild). meningen är att man ska bocka för valfritt antal checkboxar och sedan trycka på sökknappen. i Access finns det en t ex en händelseprocedur "vid markering". nedan stående sub rutin skapas av Access. detta funkar säkert bara om jag kryssar för boxen "action". behöver alltså inte klicka på knappen.

koden bakom en CHECKBOX (som jag nog inte vill ha)

Private Sub action_GotFocus()
Dim rsSQL As Recordset

rsSQL.OpenRecordset "SELECT * FROM filmsamling WHERE action = '" & action & "'"....
CurrentDb.Connection
End Sub

 

frågan är om det finns ngn funktion där man kan markera alla/några checkboxar och sedan trycka på knappen? (skulle det varit ASP hade saken varit biff).

 

koden bakom KNAPPEN

Private Sub cmdSokGenre_Click()
Dim rsSQL As Recordset

rsSQL.OpenRecordset  _
"SELECT * FROM filmsamling WHERE action = '" & action &"' AND drama = '"&drama&"'....
CurrentDb.Connection
End Sub

 

antar att när boxen är ikryssad, så får den värdet TRUE?

tack på förhand! /andréas

 

[bild bifogad 2005-04-27 00:56:19 av mambofeber]

705518_thumb.jpg

Länk till kommentar
Dela på andra webbplatser

Testa att skapa komboboxar eller listrutor

istället, tror att du kan få till en betydligt smidigare lösning då!

 

 

Private Sub listbox1_AfterUpdate()

With Me.lbistbox2

.RowSource = _

"SELECT DISTINCT Genre FROM filmsamling " & _

"WHERE Genre = " & Chr(34) & Me.listbox1 & Chr(34)

.Requery

End With

 

End sub

 

Länk till kommentar
Dela på andra webbplatser

Nu är jag ingen mästare på det här, men liksom i asp:

 

Du måste ha en funktion som antingen loopar igenom dina objekt dynamiskt, eller en funktion som kollar av varje enskilt objekt huruvida det är ibockat eller ej.

 

Funktionen skall skapa din "and genre in (INSTRÄNG)"-insträng

 

Anropa den på knappen.

 

//Jenny

 

 

Länk till kommentar
Dela på andra webbplatser

mambofeber

hej!

tack Ech och Jenny R, men jag har redan löst problemet. I Ech:s exempel kan man bara välja en genre i taget, och jag vill att man ska kunna välja fler genrer samtidigt. Jag behöll kryssrutorna. Man behöver INTE loopa igenom dem.

lösningen var enkel...

 

Private Sub cmdSok_Click()
With Me.lbistbox2
.RowSource = _
"SELECT DISTINCT * FROM filmsamling " & _
"WHERE action= " &Me.chkAction &" AND " &Me.chkKomedi &" AND _ &Me.chkThriller &" ......osv
.Requery
End With
End Sub

 

det blev en låååång SQL fråga! Tack för hjlpen iaf. :-)

 

[inlägget ändrat 2005-05-04 13:17:12 av mambofeber]

Länk till kommentar
Dela på andra webbplatser

Ja, din lösning förutsätter att du har en lösning i databasen bestående av en massa kolumner med motsvarande genre-namn och där du sätter 0/1 beroende på om den är med i genren eller inte...

 

Den fungerar inte om du har den mer smidiga lösningen att ha en kopplingstabell där varje film och varje genre representeras av varsitt (för sig) unika id, och där du helt enkelt måste ha fram id't på den checkbox som är ibockad.

 

Den sql-frågan skulle istället sett ut som :

"Select a.titel, a.handling, a.langd from film a, genrekoppling b

where a.film_id = b.film_id and b.genre_id in ("&sINSträng&")"

 

Men skönt att det löste sig! :)

 

Länk till kommentar
Dela på andra webbplatser

mambofeber

hej jenny!

min lösning är inte den bästa. varför? jo, låt oss säga att jag har en film med 3 genrer. om jag i sökformuläret bara kryssar för 2 av 3 genrer, så hittas inte filmen.

"SELECT DISTINCT * FROM filmsamling " & _
"WHERE action= " &Me.chkAction &" AND " &Me.chkKomedi &" AND _ &Me.chkThriller &" ......osv

 

detta pga att det står "AND" mellan genrerna. prövade "OR" istället, men då kan man bara söka på EN genre. hoppas du förstår.

blev i alla fall nyfiken på ditt exempel. innan hade jag alla genrer i en EGEN tabell som var länkad till en filmtabell.

har du lust kan du kolla på de bifogade bilderna i denna tråd

//eforum.idg.se/viewmsg.asp?EntriesId=702348#704716

 

hänger inte riktigt med på din förklaring eller SQL-fråga. posta gärna en relationsbild på din tänka databas. dags för en tur på avenyn. gbg är en härlig stad. läste att du jobbar på ett IT-företag. viket?

/andréas

 

Länk till kommentar
Dela på andra webbplatser

Hej igen!

 

Nu har jag fördelen av att känna Nina75 som du började hjälpa med den här filmdatabasen, så jag har sett den lösningen som du har hjälpt henne med. Lite fusk - medges :)

 

Jag försöker förstå hur du vill söka... Det finns ju flera alternativ.

Antingen att filmen MÅSTE finnas i de kategorier du bockar i, eller att filmen finns i NÅGON av de du bockar i. Man kan också tänka sig att ha ett exkluderingsval - den får INTE finnas i - men då blir det lite överkurs i din lösning :)

 

Om du bockar i action och komedi - vill du då att filmen skall finnas i BÅDA (AND) eller NÅGON av dem (OR)? Tar du med alla de andra checkboxarna också så blir det ju också att den får INTE finnas i de som du lämnar tomma - därför kan du inte söka på 2 av filmens 3 genrer...

 

Jag har bifogat en bild på den databas jag skickade som förslag till Nina. Såhär hade jag löst det om jag skulle gjort detta på t ex webben. Jag suger på Access, så den specifika programmeringen för syntaxen får du sköta själv, jag kan bara berätta hur jag skulle gjort i t ex ASP eller SQL Windows (påminner om VB-programmering).

 

I tabellen Genre så lägger du in de olika kategorierna

kat_id namn

1 action

2 komedi

3 drama

...osv... räkna upp id med för varje ny kategori. Skapa konstanter för de olika id:na för att enklare hålla koll på vad siffrorna står för.

 

Skapa en funktion:

Function: GetCategory()
'nolla strängen
set sInStr = STRING_Null

'gå igenom objekten
if cbAction then
if sInStr!= STRING_Null then
	sInstr = sInStr || ","
end if
sInStr = sInStr || "1"
end if
if cbKomedi then
if sInStr!= STRING_Null then
	sInstr = sInStr || ","
end if
sInStr = sInStr || "2"
end if
if cbDrama then
if sInStr!= STRING_Null then
	sInstr = sInStr || ","
end if
sInStr = sInStr || "3"
end if
'OSV för varje objekt...
GetCategory = sInStr
End function

 

På knappen sen, anropa funktionen när du klickar på sök.

Button.OnClick

sIn = GetCategory()

 

'kör sen frågan:

"Select a.titel, a.handling, a.langd from filmsamling a, filmkategori b
where a.film_id = b.film_id and b.genre_id in ("&sIn&")"

 

Men, jag hade också stött på problemet om att jag får filmerna som har den ena eller den andra (eller flera rader för dem som har båda).

Men - om du använder ovanstående lösning med funktionen men istället använder din modell och skapar strängen som

 

if cbAction then
 'kolla om sInStr är tom, annars lägg på ett "and" innan...
 sInStr = sInStr || " action = 1" 
end if
if cbKomedi then
 'kolla om sInStr är tom, annars lägg på ett "and" innan...
 sInStr = sInStr || "  komedi = 1" 
end if

 

och kör sqlsatsen:

if sInStr != "" then
 sInStr = " where " || sInStr 
end if
"Select titel, handling, langd from filmsamling "|| sInStr

..osv så borde det fungera för dig?

 

 

Yes, Göteborg är en härlig stad, själv tog en motionsrunda i Slottsskogen innan jag gav mig hemåt för att installera VisualStudio .net inför helgens nöjen.. ;) (ska bygga ett system för anmälning, resultat och regler i hästtävlingssammanhang - i VB *lol*)

 

Min arbetsgivare behåller jag hemligt ett tag till, men jag kan avslöja att det är ett litet företag som jobbar mycket mot offentlig verksamhet :D

 

 

EDIT: förtydligade...

[bild bifogad 2005-05-06 21:44:51 av Jenny R]

[inlägget ändrat 2005-05-06 23:24:30 av Jenny R]

708741_thumb.jpg

Länk till kommentar
Dela på andra webbplatser

mambofeber

hej igen Jenny!

 

nu blev jag imponerad av ditt gedigna arbete.jo, må erkänna att min lösning var lite fusk, men jag får väl kalla den för en beta version :-). här har man läst en IT-utbildning i 4,5 år och har dessutom en magister examen, så kommer jag med en sån här lösning. programmering är jag bekant av och APS oxå. gjorde en webbshop en gång i tiden.vill gärna pröva på Oracle istället för Access. hade förresten 3 tabeller innan jag bantade ihop till en tabell..nödlösning? javisst!

 

ska kolla på ditt exempel lite mer noggrant imorgon. klockan är mkt nu,men det kliar i fingrarna...:-)

 

du, jag o nina får bilda en fanclub :-)

 

tusen tack annu en gång.

 

/andréas

 

[inlägget ändrat 2005-05-07 00:26:42 av mambofeber]

Länk till kommentar
Dela på andra webbplatser

Tja, man kan ju inrikta sig olika i utbildningar.. själv är jag inriktad mot strategi och management i min magister, ett medvetet val. Vidare programmering kan man alltid lära sig senare var min tanke - och så blev det.

 

Jag erkänner att jag måste suga lite på sqlsatsen för att tvinga filmen att ingå i både kat 1 och 2 och inte antingen eller. Det känns spontant som att det inte skulle vara något problem, men samtidigt -jo. Nackdelen är att jag inte har en funktionell databas eller kopplingar för att testa de tankar jag har, något som förhoppningsvis är ändrat efter helgen som sagt...

 

yepp, vi ska nog kunna utbyta en del erfarenheter :)

 

Sov gott!

 

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...