Markierten Datensatz aus Listenbox löschen

  • Themenstarter Themenstarter airmexx
  • Beginndatum Beginndatum
A

airmexx

Hallo,

ich hab da ein problem, ich habe ein listenfeld, dies ist auch mit daten gefüllt, wenn ich jetzt auf meinen löschen-button drücke löscht er den obersten(ersten) datensatz und nicht den markierten.

meine listenbox fülle so: ich schreibe mit hilfe von 'insert into' daten in eine tabelle und lese sie dann mit hilfe einer unterabfrage wieder aus, die unterabfrage ist in der listenbox.

die listenbox und die eingabe der daten befinden sich auf zwei unterschiedlichen formularen.kann komischerweise auf dem eingabe formular nicht auf die liste zugreifen...sonst wurde ich 'additem' anwenden, und nicht über die tabellen gehen...

kann mir jemand sagen wie ich vllt auf 'additem' zugreifen kann oder wie ich es schaffe die daten aus der tabelle so zu löschen('delete from'), das nur der markierte datensatz verschwindet.

danke!
 
Also für gewöhnlich kannst du durch Formname.Listenname.Eigenschaft auch auf Elemente in einem anderen Formular zugreifen.

Warum es bei dir nicht geht ist aber schwer zu sagen so lange man nicht ein bisschen vom Quellcode sieht und genauer weiß womit du arbeitest.

Gruß Thomas
 
so das ist der quellcode von der form wo die daten in die tabelle geschrieben werden
der obere abschnitt ist erstmal uninteressant.

Private Sub cmd_eintragen_Click()
Dim txtvon As String
Dim txtbis As String
Dim vonzahl, dzahl As Long
Dim biszahl As Long
Dim datumvon As String
Dim datumbis As String
Dim dnow As String
Dim prueferdatum, prueferfeiertag As Boolean
Dim UserName2 As String
Dim sql As String
Dim rec As DAO.Recordset
Dim sql2 As String
Dim rec2 As DAO.Recordset
Dim Username3, msg As String
Dim i, vardatum As Date
Dim j_minus, j_plus, urlaubstage, n, y, i2, n2, y2 As Long
Dim zaehler As Integer
prueferfeiertag = True
prueferdatum = True
'die dnow bekommt das datum von heute zugewiesen
dnow = Date
intj_minusahr = Year(Date)
txtvon = dnow
'txtvon bekommt den wert der in von angeklickt wurde
txtvon = Me.dtp_datum_von.value
txtbis = Me.dtp_datum_bis.value
vonzahl = CDbl(CDate(txtvon))
biszahl = CDbl(CDate(txtbis))
dzahl = CDbl(CDate(dnow))
'man darf nur datentypen vom typ datum angeben
If vonzahl < dzahl Then
MsgBox "Das ist leider nicht machbar"
prueferdatum = False
End If
If vonzahl > biszahl Then
MsgBox "Das ist leider nicht machbar"
prueferdatum = False
End If
'sql befehl um den gespeicherten namen auszurufen
sql = "SELECT * FROM tbl_zwischegespeicherter_name"
Set rec = CurrentDb.OpenRecordset(sql, dbOpenSnapshot)
UserName2 = rec.Fields("Gespeicherter_name")
'j_minusetzt bekommt den name seiner dazugehörigen ID
sql2 = "SELECT * FROM tbl_Azubi WHERE Personalnummer = '" & UserName2 & "'"
Set rec2 = CurrentDb.OpenRecordset(sql2, dbOpenSnapshot)
Username3 = rec2.Fields("ID_Azubi")
mod_Datum.FeiertagDatum (intj_minusahr)

'mod_Datum.Ostern
'mod_Datum.Arbeitstag
'mod_Datum.ArbeitsTage
'Wochenenden berechnen und vom zähler subtrahieren
'zählt vom von datum bis zum bis datum
For i = vonzahl To biszahl
prueferfeiertag = True
' hier wird das aktuelle datum in eine zahle umgewandelt(die tag zahl bis zu dem tag von 1.1.1900)
i2 = CDbl(CDate(i))
'n2 bekommt den wert 7
n2 = 7
'diese schleife zählt von 7 hoch bis zum bis datum(ca. 40353(24.06.2010))
For n = 1 To biszahl
n2 = n2 + 7
'vergleicht ob der i tag ein samstag ist
If i2 = n2 Then
prueferfeiertag = False
End If
Next n
y2 = 8
'diese schleife zählt von 8 hoch bis zum bis datum(ca. 40353(24.06.2010))
For y = 1 To biszahl
y2 = y2 + 7
'vergleicht ob der i tag ein sonntag ist
If i2 = y2 Then
prueferfeiertag = False
End If
Next y

' vergleichen ob der heutige tag ein beweglicherfeiertag ist
If i = CDate("01.01." & intj_minusahr) Then
prueferfeiertag = False
End If
If i = CDate("01.05." & intj_minusahr) Then
prueferfeiertag = False
End If
If i = CDate("03.10." & intj_minusahr) Then
prueferfeiertag = False
End If
If i = CDate("24.12." & intj_minusahr) Then
prueferfeiertag = False
End If
If i = CDate("25.12." & intj_minusahr) Then
prueferfeiertag = False
End If
'der variablen FeiertagDatum bekommt das heutige jahr zu gewiesen
vardatum = FeiertagDatum(Format(Date, "yyyy"))
'der variablen FeiertagDatum wird ein tag dazu addiert
'ostermonntag
vardatum = DateAdd("d", 1, vardatum)
If i = vardatum Then
prueferfeiertag = False
End If
'karfreitag
vardatum = FeiertagDatum(Format(Date, "yyyy"))
vardatum = DateAdd("d", -1, vardatum)
If i = vardatum Then
prueferfeiertag = False
End If
'Christi Himmelfahrt
vardatum = FeiertagDatum(Format(Date, "yyyy"))
vardatum = DateAdd("d", 39, vardatum)
If i = vardatum Then
prueferfeiertag = False
End If
'Pfingstmontag
vardatum = FeiertagDatum(Format(Date, "yyyy"))
vardatum = DateAdd("d", 50, vardatum)
If i = vardatum Then
prueferfeiertag = False
End If
If prueferfeiertag = False Then
j_minus = j_minus + 1
End If
j_plus = j_plus + 1
urlaubstage = j_plus - j_minus
Next i

AB HIER:

Set ctl = Me.lst_vorl_Urlaubsantraege
If prueferdatum = True Then
'hier werden die daten in die tabelle geschrieben
DoCmd.RunSQL ("INSERT INTO tbl_vorl_Urlaubsantraege (ID_Azubi, Start_Urlaub, End_Urlaub, gen_Urlaubstage, Bemerkungen, genehmigt) " & _
"VALUES ('" & Username3 & "' , '" & txtvon & "' , '" & txtbis & "' , '" & urlaubstage & "', '" & " " & "' , '" & " " & "')")


End If
'messagebox ob man noch was hinzufügen möchte
msg = MsgBox("Möchten Sie noch einen Eintrag vornehmen?", vbYesNo)
If msg = vbNo Then
DoCmd.Close acForm, Me.name
End If
If msg = vbYes Then

End If
End Sub


und das ist jetzt die form wo der datensatz gelöscht werden soll


Private Sub cmd_loeschen_Click()
DoCmd.SetWarnings False
Dim ctlListe As Control, varElement As Variant
Dim msg As String

'Control-Objektvariable, die auf das Listenfeld zeigt, zurückgeben.


Dim frm As Form, ctl As Control
Dim varElem As Variant, intI As Integer
Dim urlaubstage As Integer
Dim sql_statement As Variant
'ctl wird nun der wert der liste lst_azubi übergeben
Set ctl = Me.lst_vorl_Urlaubsantraege
'abfrage ob der datensatz gelöscht werden soll
msg = MsgBox("Wollen Sie den Datensatz wirklich löschen?", vbYesNo)
'if schleife datensatz wird nur gelöscht wenn ja geklickt wird
If msg = vbNo Then

End If
If msg = vbYes Then
DoCmd.RunSQL ("DELETE FROM tbl_vorl_Urlaubsantraege WHERE (ID_vorl_pruefung = " & ctl.Column(7, varElem) & ")")
End If
Me.lst_vorl_Urlaubsantraege.RowSource = "qry_unterabfrage_vorl_Uralubsantraege"

End Sub
 
Kannst du ihn bitte formatiert in [code=vb]dein Code[/code] schreiben? Dann ist er auch lesbar. (ja, diese Tags gehen auch für Gäste!)
 
So hoffe, dass das jetzt besser ist.
Visual Basic:
Private Sub cmd_eintragen_Click()
    Dim txtvon As String
    Dim txtbis As String
    Dim vonzahl, dzahl As Long
    Dim biszahl As Long
    Dim datumvon As String
    Dim datumbis As String
    Dim dnow As String
    Dim prueferdatum, prueferfeiertag As Boolean
    Dim UserName2 As String
    Dim sql As String
    Dim rec As DAO.Recordset
    Dim sql2 As String
    Dim rec2 As DAO.Recordset
    Dim Username3, msg As String
    Dim i, vardatum As Date
    Dim j_minus, j_plus, urlaubstage, n, y, i2, n2, y2 As Long
    Dim zaehler As Integer
    prueferfeiertag = True
    prueferdatum = True
    'die dnow bekommt das datum von heute zugewiesen
    dnow = Date
    intj_minusahr = Year(Date)
    txtvon = dnow
    'txtvon bekommt den wert der in von angeklickt wurde
    txtvon = Me.dtp_datum_von.value
    txtbis = Me.dtp_datum_bis.value
    vonzahl = CDbl(CDate(txtvon))
    biszahl = CDbl(CDate(txtbis))
    dzahl = CDbl(CDate(dnow))
    'man darf nur datentypen vom typ datum angeben
        If vonzahl < dzahl Then
            MsgBox "Das ist leider nicht machbar"
            prueferdatum = False
        End If
        If vonzahl > biszahl Then
            MsgBox "Das ist leider nicht machbar"
            prueferdatum = False
        End If
    'sql befehl um den gespeicherten namen auszurufen
    sql = "SELECT * FROM tbl_zwischegespeicherter_name"
    Set rec = CurrentDb.OpenRecordset(sql, dbOpenSnapshot)
    UserName2 = rec.Fields("Gespeicherter_name")
    'j_minusetzt bekommt den name seiner dazugehörigen ID
    sql2 = "SELECT * FROM tbl_Azubi WHERE Personalnummer = '" & UserName2 & "'"
    Set rec2 = CurrentDb.OpenRecordset(sql2, dbOpenSnapshot)
    Username3 = rec2.Fields("ID_Azubi")
    mod_Datum.FeiertagDatum (intj_minusahr)
        
    'mod_Datum.Ostern
    'mod_Datum.Arbeitstag
    'mod_Datum.ArbeitsTage
    'Wochenenden berechnen und vom zähler subtrahieren
    'zählt vom von datum bis zum bis datum
    For i = vonzahl To biszahl
    prueferfeiertag = True
    ' hier wird das aktuelle datum in eine zahle umgewandelt(die tag zahl bis zu dem tag von 1.1.1900)
        i2 = CDbl(CDate(i))
        'n2 bekommt den wert 7
            n2 = 7
        'diese schleife zählt von 7 hoch bis zum bis datum(ca. 40353(24.06.2010))
            For n = 1 To biszahl
                n2 = n2 + 7
                'vergleicht ob der i tag ein samstag ist
                If i2 = n2 Then
                        prueferfeiertag = False
                End If
            Next n
                y2 = 8
         'diese schleife zählt von 8 hoch bis zum bis datum(ca. 40353(24.06.2010))
                For y = 1 To biszahl
                    y2 = y2 + 7
                      'vergleicht ob der i tag ein sonntag ist
                    If i2 = y2 Then
                        prueferfeiertag = False
                    End If
                 Next y
        
    '   vergleichen ob der heutige tag ein beweglicherfeiertag ist
            If i = CDate("01.01." & intj_minusahr) Then
                prueferfeiertag = False
            End If
            If i = CDate("01.05." & intj_minusahr) Then
                prueferfeiertag = False
            End If
            If i = CDate("03.10." & intj_minusahr) Then
                prueferfeiertag = False
            End If
            If i = CDate("24.12." & intj_minusahr) Then
                prueferfeiertag = False
            End If
            If i = CDate("25.12." & intj_minusahr) Then
                prueferfeiertag = False
            End If
            'der variablen FeiertagDatum bekommt das heutige jahr zu gewiesen
            vardatum = FeiertagDatum(Format(Date, "yyyy"))
            'der variablen FeiertagDatum wird ein tag dazu addiert
            'ostermonntag
            vardatum = DateAdd("d", 1, vardatum)
            If i = vardatum Then
                prueferfeiertag = False
            End If
            'karfreitag
            vardatum = FeiertagDatum(Format(Date, "yyyy"))
            vardatum = DateAdd("d", -1, vardatum)
            If i = vardatum Then
                prueferfeiertag = False
            End If
            'Christi Himmelfahrt
            vardatum = FeiertagDatum(Format(Date, "yyyy"))
            vardatum = DateAdd("d", 39, vardatum)
            If i = vardatum Then
                prueferfeiertag = False
            End If
            'Pfingstmontag
            vardatum = FeiertagDatum(Format(Date, "yyyy"))
            vardatum = DateAdd("d", 50, vardatum)
            If i = vardatum Then
                prueferfeiertag = False
            End If
                    If prueferfeiertag = False Then
                            j_minus = j_minus + 1
                    End If
                    j_plus = j_plus + 1
                    urlaubstage = j_plus - j_minus
        Next i
    Set ctl = Me.lst_vorl_Urlaubsantraege
    If prueferdatum = True Then
    DoCmd.RunSQL ("INSERT INTO tbl_vorl_Urlaubsantraege (ID_Azubi, Start_Urlaub, End_Urlaub, gen_Urlaubstage, Bemerkungen, genehmigt) " & _
                  "VALUES ('" & Username3 & "' , '" & txtvon & "' , '" & txtbis & "' , '" & urlaubstage & "', '" & " " & "' , '" & " " & "')")
   
    
    End If
    'messagebox ob man noch was hinzufügen möchte
    msg = MsgBox("Möchten Sie noch einen Eintrag vornehmen?", vbYesNo)
            If msg = vbNo Then
                DoCmd.Close acForm, Me.name
            End If
            If msg = vbYes Then
                   
            End If
End Sub

Visual Basic:
Private Sub cmd_loeschen_Click()
DoCmd.SetWarnings False
    Dim ctlListe As Control, varElement As Variant
    Dim msg As String

    'Control-Objektvariable, die auf das Listenfeld zeigt, zurückgeben.
    
  
    Dim frm As Form, ctl As Control
    Dim varElem As Variant, intI As Integer
    Dim urlaubstage As Integer
    Dim sql_statement As Variant
    'ctl wird nun der wert der liste lst_azubi übergeben
    Set ctl = Me.lst_vorl_Urlaubsantraege
    'abfrage ob der datensatz gelöscht werden soll
    msg = MsgBox("Wollen Sie den Datensatz wirklich löschen?", vbYesNo)
    'if schleife datensatz wird nur gelöscht wenn ja geklickt wird
        If msg = vbNo Then
        
        End If
        If msg = vbYes Then
     DoCmd.RunSQL ("DELETE FROM tbl_vorl_Urlaubsantraege WHERE (ID_vorl_pruefung = " & ctl.Column(7, varElem) & ")")
        End If
        Me.lst_vorl_Urlaubsantraege.RowSource = "qry_unterabfrage_vorl_Uralubsantraege"
        
End Sub
 
Nur mal so ein Schuß ins Blaue:

Visual Basic:
DoCmd.RunSQL ("DELETE FROM tbl_vorl_Urlaubsantraege WHERE (ID_vorl_pruefung = " & ctl.Column(7, ctl.ListIndex) & ")")

Kann es sein das die Variable "varElem" nicht oder falsch definiert ist Wenn du den ListIndex Wert des markierten Eintrages nimmst, sollte der richtige Datensatz gelöscht werden (zumindest wenn der Spaltenwert 7 den richtigen Wert liefert).
 
Visual Basic:
Dim varElem As Variant
...
... ctl.Column(7, varElem) ...
varElem ist die Zeile die du ausliest (Zeile varElem, Spalte 8).
1) du definierst varElem nirgens. Ergo nimmt er die erste Zeile
2) um die selektionierte Zeile auszuwählen, kannst du diesen optionalen Parameter einfach weglassen
Visual Basic:
... ctl.Column(7) ...

Edit:
1:0 für tombe.... du warst schneller *g*
 
Unglaublich...danke!

einfach varElem weglassen und dann gehts...danke hab seit montag gesucht wo der fehler ist...
 

Neue Beiträge

Zurück