webForumDet fria alternativet

Om användaren ej väljer det som finns i listruta...

Databaser & SQL

12 svar · 299 visningar · startad av Mazz

Medlem sedan aug. 2003118 inlägg
Frågan#1

Har gjort en listruta i ett formulär med orter..när användaren skriver något annat i denna ruta ska det komma fram en meddelanderuta som frågar om man vill lägga till det man skrivit.

Problemet är att när man matar in ett värde som inte finns får jag fram rutan..om man klickat på Yes så kommer Access egna ruta och säger att det är "limit to list" och det vill jag inte. Kör jag ok på den rutan så läggs ej värdet till. Vad gör jag för fel?
Har satt "Limit to list" i kontrollegenskapen och därefter lagt in följande kod vid "On not in list" för kontrollen:

Private Sub Ort_NotInList(NewData As String, Response As Integer)
Dim db As DAO.Database
Dim rs As DAO.Recordset

If MsgBox("Vill du lägga till värdet?", vbYesNo + vbInformation, "Ej i lista") = vbYes _
Then
RunCommand acCmdUndo
Set db = CurrentDb()
Set rs = db.OpenRecordset("tblKund")
rs.AddNew
rs("Orter") = NewData
rs.Update
Set rs = Nothing
Set db = Nothing
Response = acDataErrAdded
Else
Response = acDataErrContinue
RunCommand acCmdUndo
End If
End Sub

TAck för hjälpen!
Mvh
/Magnus

Medlem sedan dec. 20003 887 inlägg
#2

Jag testade lite med NotInList och märkte inga problem med att använda det. Den stora skillnaden är att jag använder ADO för kommunikation med databasen istället för DAO, som du gör.
Följande fungerade utmärkt för mig

Private Sub Test_NotInList(NewData As String,  Response As Integer)
  Dim strSQL As String

  If MsgBox("Vill du lägga till värdet?", vbYesNo + vbInformation, "Ej i listan") = vbYes Then
    RunCommand acCmdUndo

    strSQL = "INSERT INTO tblKund (Orter) VALUES ('" Repalce(NewData, "'", "''") & "')"
    CurrentProject.Connection.Execute strSQL, , adExecuteNoRecords

    Response = acDataErrAdded
  Else
    Response = acDataErrContinue

    RunCommand acCmdUndo
  End If
End Sub
Medlem sedan aug. 2003118 inlägg
#3

Tack för din hjälp. Testade din kod utan att det fungerade? Den buggar på rad 5 (Replace newdata)

Medlem sedan dec. 20003 887 inlägg
#4

Tja. Det kan underlätta att hjälpa dig om du skriver vad som är fel...

Jag antar att du såg stavfelet och rättade till det (Repalce) :r

Medlem sedan aug. 2003118 inlägg
#5

Tack:-)
Du verkar ha koll..tänkte höra med dig...har ett kundformulär och skulle vilja ha en textruta längre upp i formuläret där man kan skriva för att söka efter en kund exempelvis.
Har gjort detta tidigare då jag hade ett formulär utifrån en fråga.
Hur gör man en sådan sak då kundformuläret är grundat på en tabell?`

En annan sak som är intressant är om man tex matar in en kund och exempelvis vill ha fältet Ort och att det fältet visar det senaste inmatade värdet när man väljer ny post?

Mvh

Medlem sedan dec. 20003 887 inlägg
#6

För att göra sökningen så beror det ju lite på hur du har kopplat datat till ditt formulär. Har du kopplat formuläret till en tabell så är den enklaste metoden nog att använda sig utav Filterfunktionen.

Private Sub [i]Textbox_AfterUpdate[/i]()
  Me.Filter = "kundnamn = '" & Me.[i]Textbox[/i].Value & "'"
End Sub

Senaste lagrade post beror på hur du lagrar datat i tabellerna. Har du en räknare för poster så är det enkelt att plocka ut datat med SQL

SELECT TOP 1 * FROM [i]tabell[/i] ORDER BY [i]räknare[/i] DESC

Men, som sagt, det hela beror på hur du har det. :)

Medlem sedan aug. 2003118 inlägg
#7

Formuläret är kopplat till en tabell som heter tblkund.
Fälten är:
Kundnr(Räknare)
Enamn
Fnamn
Adr mfl.

Vill ha en textbox längst upp där jag kan skriva för att söka efter Enamn.
När man skrivit in ett efternamn ska man trycka på Sök bredvid.

Andra exemplet vi pratade om...anta att jag matar in Göteborg i fältet ort när jag matar in en ny kund...när jag matar in ytterligare en kund ska Göteborg vara förvalt eftersom jag valt det i posten innan.

Exemplet du hjälpte mig med angående om man matar in värdet i en combobox och man får välja om man vill lägga till värdet..får jag fortfarande inte att fungera..iallafall inte med DAO...får fram rutan som frågar om man vill lägga till värdet säger jag Yes kommer Access egna ruta fram (Limit to list) därefter matas ej värdet in.
Är det något jag missat? Sitter med Access XP.

Mvh

Medlem sedan dec. 20003 887 inlägg
#8

Det är lite svårt att ge dig en direkt lösning, eftersom jag inte vet hur du har byggt ditt formulär. Vad gäller din sökfunktion, så i det bökigaste fallet, är det "bara" att skapa ett event för On Click för knappen. Jag tänker nu att alla dina fält i formuläret, som visar data, är unbound och du har namngivit dom praktiskt.

Du har din textbox i vilken du vill skriva in ett efternamn, som du döpt till t.ex. txtSearchEName, och du vill i händelse av att det finns data visa förnamnet i en av dom befintliga textrutorna med namn txtFName, när du klickar på sök (btnSearchByEName).

Private Sub btnSearchByEName_Click()
  Dim objRS As ADODB.Recordset
  Dim strSQL As String

  If Not Me.txtSearchEName = "" Then
    strSQL = "SELECT FNamn FROM tblkund WHERE ENamn = '" & Replace(Me.txtSearchEName, "'", "''") & "'"

    Set objRS = New ADODB.Recordset
    objRS.Open strSQL, CurrentProject.Connection

    If objRS.EOF Then
      MsgBox "Det fanns ingen med det efternamnet.", vbInformation + vbOkOnly, "Fel"
    Else
      Me.txtFName = objRS(0)
    End If

    objRS.Close
  End If

  Set objRS = Nothing
End Sub

Har du däremot gjort så att du har kopplat formuläret till en tabell och har dina textboxar bundna till de olika kolumnerna i tabellen är det enklast att använda (fortfarande On Click) för knappen och sedan genom VBA sätta ett filter på samma sätt som jag visade tidigare.

Private Sub [i]txtSearchByEName_Click[/i]()
  Me.Filter = "Enamn = '" & Me.txtSearchEName & "'"
End Sub

Det finns en hel del olika vägar man kan ta för att uppnå det resultatet du är ute efter, som du förstår. Har du lust kan du alltid posta din databas här så kan jag (i mån av tid) försöka lägga till det du jagar och kommentera koden, så att du kan se vad jag gjort (om jag har tid... ;)).
Det bästa är ju dock givetvis att du försöker själv :)

Medlem sedan aug. 2003118 inlägg
#9

Hej! och tack för hjälpen!
Alla mina fält är bundna så jag körde filtervarianten och det fungerade. :)
Värre blir det väl om man vill kunna söka vad som helst och inte bara Enamn i rutan?:-)

Tack igen!

Medlem sedan aug. 2003118 inlägg
#10

Testade varianten och fick till sökningen trodde jag:-)
Rörde till det..sökningen fungerade men sedan hände något galet.

Det är så att alla fälten i formuläret är bundna till tabellen ifrån början.
Därefter vill skapa en obunden textruta längst upp som jag sa och kunna skriva in exempelvis Enamn och trycka på knappen "Sök" och att jag ser sökningens resultat längre ner i formuläret.

Den funktionen jag är ute efter finns i Access via kombobox som slår upp post.i formulär, jag vill istället skriva.

Som sagt..allt är bundet ifrån början utan den nya textrutan jag tänkt skapa och söka i. Ursäkta jag är trög:-)

Är med på filterfunktionen men vad gör jag med den obundna kontrollen?

Medlem sedan dec. 20003 887 inlägg
#11

I egenskaperna för formuläret finns det under fliken Data en egenskap som heter Record Source. Den kan du själv sätta med hänseende på din textbox.
Det enklaste (tror jag) borde vara att, när du klickar på sökknappen, du skriver en funktion som modifierar formulärets RecordSource

Private Sub btnSearch_Click()
  Dim strSQL As String

  strSQL = "SELECT * FROM kunder WHERE ENamn = '" & Me.txtSearchEName & "'"
  Me.RecordSource = strSQL
End Sub

Jag tror det bör fungera. Om du vill kunna söka på alla fält får du ändra SQL-frågan lite grand bara :)

strSQL = "SELECT * " & _
         "FROM kunder " & _
         "WHERE ENamn = '" & Me.txtSearch & "'" & _
         "  OR FNamn = '" & Me.txtSearch & "'" & _
         "  OR Adr = '" & Me.txtSearch & "'"

Vill du söka på delar av namnen behöver du bara använda dig av LIKE

strSQL = "SELECT * " & _
         "FROM kunder " & _
         "WHERE ENamn LIKE '*" & Me.txtSearch & "*'" & _
         "  OR FNamn LIKE '*" & Me.txtSearch & "*'" & _
         "  OR Adr LIKE '*" & Me.txtSearch & "*'"

Möjligtvis kan du behöva byta ut asteriskerna mot procenttecken, eftersom jag för tillfället inte kommer ihåg vilket tecken Access använder som wildcard.

Medlem sedan aug. 2003118 inlägg
#12

Listruta

Hej!
Har tagit upp detta i tidigare inlägg..gäller en kombobox där användaren ska kunna välja..skriver man in ett värde som ej finns i listboxen ska ruta komma fram och man kan säga Yes så värdet läggs till.

Ska beskriva i detalj hur jag gjort..
Har en tabell med fältet ort..har där skapat en combobox via uppslagsguiden i tabelldesignenen och valde att skriva in värden själv. Sätter därefter Limit to list för fältet.
Därefter har jag skapat ett formulär som är bundet till tblkund.
I formuläret väljer jag kontrollen Ort där comborutan finns..väljer Not in list och lägger in kod:(Tidigare använde jag DAO)

Innan Innan jag skrev in koden gick jag in i Tools/References och valde micorsoft Ado ext. 2.7 for DDL and security.

Private Sub cmbort_NotInList(NewData As String, Response As Integer)
Dim strMsg As String
Dim rst As ADODB.Recordset
Dim db As ADODB.Connection

strMsg = "'" & NewData & "' is not in the list. "
strMsg = strMsg & "Would you like to add it?"
If vbNo = MsgBox(strMsg, vbYesNo + vbQuestion, "New Owner") Then
    Response = acDataErrDisplay
Else
    Set db = CurrentProject.Connection
    Set rst = New ADODB.Recordset
    rst.Open "select \* from tblkund", CurrentProject.Connection, adOpenStatic, adLockOptimistic
    rst.AddNew
        rst!ort = NewData 
    rst.Update
    Response = acDataErrAdded
    rst.Close
End If

End Sub

Rutan med Yes och No kommer fram men när jag klickar på Yes så kommer Access egna ruta "Limit to list" och värdet läggs ej till om man valt Yes. "Limit to list" ska väl vara valt eller??
Vad gör jag för fel?
Raden där det står rst!Ort är väl där fältnamnet i tabellen anges?

Medlem sedan aug. 2003118 inlägg
#13

Tror jag tänkt fel..grejen är den att jag skapat comboboxen via uppslagsguiden i tabellen tblkund och valde alternativet "Skriv värdena själv" och skrev in några orter och sedan när jag skapade formuläret som jag kopplade till tabellen tblkund bara gick in i "not in list" och la in koden.
Skapade nu istället en fråga utifrån tabellen tblkund och drog ner fältet ort och ifrån formuläret skapade jag en combobox och valde att den ska hämta ifrån frågan qryOrt
Därefter till comboboxen i formuläret och "Not in list" och la in följande kod:

Private Sub combort_NotInList(NewData As String, Response As Integer)

Dim strMsg As String
Dim rst As ADODB.Recordset
Dim db As ADODB.Connection

strMsg = "'" & NewData & "' is not in the list. "
strMsg = strMsg & "Would you like to add it?"
If vbNo = MsgBox(strMsg, vbYesNo + vbQuestion, "New Owner") Then
    Response = acDataErrDisplay
Else
    Set db = CurrentProject.Connection
    Set rst = New ADODB.Recordset
    rst.Open "select \* from qryOrt", CurrentProject.Connection, adOpenStatic, adLockOptimistic
    rst.AddNew
        rst!Ort = NewData
    rst.Update
    Response = acDataErrAdded
    rst.Close
End If

End Sub

Det fungerar och rutan kommer fram om man matar in ett värde som ej finns i comboboxen och man kan man välja "Yes" för att lagra värdet. Väljer man "No" så lagras ej värdet och så ska det ju vara.
Det är bara en sak som stör mig och det är när Access egna
"limit to list" kommer fram när man valt "No"!??
Hur får man bort det? Annars verkar det fungerar.

267 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)