rs.Edit instead of rs.AddNew | | |
I have some code that adds new records into a table for each ID in a list
box when a button on a form is clicked. This works fine. My problem now is
that I wish to be able to edit all the records for people whose ID is in the
list box. I made minor changes to the code (mainly replacing rs.AddNew with
rs.Edit)and it appears to be updating only the first record and then
overwriting that record with the next, etc until it runs out of ID's in the
list box. In other words, it is stepping through the ID's in the list box,
but not the records. Is there a trick to this? I have spent many hours
doing minor changes and still have the same problem.
The code follows (I have reduced the number of fields I am updating to keep
the size of the message down).
Dim intIndex As Integer
For intIndex = 0 To Me.lboBulkList.ListCount
Me.lbo.BulkList.Selected(intIndex) = True
Next intIndex
Dim db As Database
Dim rs As Recordset
Dim prm As Parameter
Dim qdf As QueryDef
Set db = CurrentDb()
Set qdf = db.QueryDefs("qryBulkEdit")
For Each prm In qdf.Parameters
prm.Value = Eval(prm.Name)
Next prm
Set rs = qdf.OpenRecordset(dbOpenDynaset)
Dim frm As Form
Dim ctl As Control
Dim varItm As Variant
Set frm = Forms!frmExcursions
Set ctl = frm! lboBulkList
For Each varItm In ctl.ItemsSelected
rs.Edit
rs(0) = Me. lboBulkList.ItemData(varItm)
rs!Date = frm!txtDate
rs!Faculty = frm!cboFaculty
rs!Course = frm!Course
rs!Cost = frm!ExCost
rs.Update
Next varItm
rs.Close: Set rs = Nothing
dixie | | | | re: rs.Edit instead of rs.AddNew
You are correct. The Edit function will edit the current record. You will
need to start at the first record and do a MoveNext, FindFirst, or other
procedure that will move to the record you want to edit then do the edit.
--
Wayne Morgan
MS Access MVP
"dixie" <dixiec@dogmail.com> wrote in message
news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...[color=blue]
> I have some code that adds new records into a table for each ID in a list
> box when a button on a form is clicked. This works fine. My problem now[/color]
is[color=blue]
> that I wish to be able to edit all the records for people whose ID is in[/color]
the[color=blue]
> list box. I made minor changes to the code (mainly replacing rs.AddNew[/color]
with[color=blue]
> rs.Edit)and it appears to be updating only the first record and then
> overwriting that record with the next, etc until it runs out of ID's in[/color]
the[color=blue]
> list box. In other words, it is stepping through the ID's in the list[/color]
box,[color=blue]
> but not the records. Is there a trick to this? I have spent many hours
> doing minor changes and still have the same problem.
>
> The code follows (I have reduced the number of fields I am updating to[/color]
keep[color=blue]
> the size of the message down).
>
> Dim intIndex As Integer
>
> For intIndex = 0 To Me.lboBulkList.ListCount
>
> Me.lbo.BulkList.Selected(intIndex) = True
>
> Next intIndex
>
>
>
> Dim db As Database
>
> Dim rs As Recordset
>
> Dim prm As Parameter
>
> Dim qdf As QueryDef
>
>
>
> Set db = CurrentDb()
>
> Set qdf = db.QueryDefs("qryBulkEdit")
>
>
>
> For Each prm In qdf.Parameters
>
> prm.Value = Eval(prm.Name)
>
> Next prm
>
>
>
> Set rs = qdf.OpenRecordset(dbOpenDynaset)
>
>
>
> Dim frm As Form
>
> Dim ctl As Control
>
> Dim varItm As Variant
>
>
>
> Set frm = Forms!frmExcursions
>
> Set ctl = frm! lboBulkList
>
> For Each varItm In ctl.ItemsSelected
>
>
>
> rs.Edit
>
> rs(0) = Me. lboBulkList.ItemData(varItm)
>
> rs!Date = frm!txtDate
>
> rs!Faculty = frm!cboFaculty
>
> rs!Course = frm!Course
>
> rs!Cost = frm!ExCost
>
> rs.Update
>
> Next varItm
>
> rs.Close: Set rs = Nothing
>
>
> dixie
>
>[/color] | | | | re: rs.Edit instead of rs.AddNew
Dixie,
You are looping through your selected items, but you are not looping through
your recordset (although looping through the recordset is only going to work
if the records are in the _exact_ same order as your listbox). rs(0) is the
first record in the returned recordset. As you loop through the items, you
are editing the same record.
Instead, you want to select each record that cooresponds to each selected
listbox item and then update, or, pull all your records, find the one that
matches the listbox item in the loop and then update.
Hope that gets you started.
Pat
"dixie" <dixiec@dogmail.com> wrote in message
news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...[color=blue]
> I have some code that adds new records into a table for each ID in a list
> box when a button on a form is clicked. This works fine. My problem now[/color]
is[color=blue]
> that I wish to be able to edit all the records for people whose ID is in[/color]
the[color=blue]
> list box. I made minor changes to the code (mainly replacing rs.AddNew[/color]
with[color=blue]
> rs.Edit)and it appears to be updating only the first record and then
> overwriting that record with the next, etc until it runs out of ID's in[/color]
the[color=blue]
> list box. In other words, it is stepping through the ID's in the list[/color]
box,[color=blue]
> but not the records. Is there a trick to this? I have spent many hours
> doing minor changes and still have the same problem.
>
> The code follows (I have reduced the number of fields I am updating to[/color]
keep[color=blue]
> the size of the message down).
>
> Dim intIndex As Integer
>
> For intIndex = 0 To Me.lboBulkList.ListCount
>
> Me.lbo.BulkList.Selected(intIndex) = True
>
> Next intIndex
>
>
>
> Dim db As Database
>
> Dim rs As Recordset
>
> Dim prm As Parameter
>
> Dim qdf As QueryDef
>
>
>
> Set db = CurrentDb()
>
> Set qdf = db.QueryDefs("qryBulkEdit")
>
>
>
> For Each prm In qdf.Parameters
>
> prm.Value = Eval(prm.Name)
>
> Next prm
>
>
>
> Set rs = qdf.OpenRecordset(dbOpenDynaset)
>
>
>
> Dim frm As Form
>
> Dim ctl As Control
>
> Dim varItm As Variant
>
>
>
> Set frm = Forms!frmExcursions
>
> Set ctl = frm! lboBulkList
>
> For Each varItm In ctl.ItemsSelected
>
>
>
> rs.Edit
>
> rs(0) = Me. lboBulkList.ItemData(varItm)
>
> rs!Date = frm!txtDate
>
> rs!Faculty = frm!cboFaculty
>
> rs!Course = frm!Course
>
> rs!Cost = frm!ExCost
>
> rs.Update
>
> Next varItm
>
> rs.Close: Set rs = Nothing
>
>
> dixie
>
>[/color] | | | | re: rs.Edit instead of rs.AddNew
OK Pat, I thought as much. You have confirmed what I believed was
happening. My problem is that I don't know how to combine the previous type
of code that updates according to an ID in a list box and then this type of
code
With rs
If rs.RecordCount > 0 Then
.MoveFirst
Do
.Edit
rs!Cost = 0
.Update
.MoveNext
Loop Until .EOF
End If
.Close: Set rs = Nothing
End With
I know that I need to step through the records in the recordset and edit
each field according to my ID in the list box, but I can't seem to combine
the two ideas to get to the solution I want - which is for each person
selected to have their specific record edited according to a what is in
various controls on the form.
dixie
----- Original Message -----
From: "Pat" <noemail@ihatespam.bum>
Newsgroups: comp.databases.ms-access
Sent: Thursday, April 22, 2004 11:38 AM
Subject: Re: rs.Edit instead of rs.AddNew
[color=blue]
> Dixie,
> You are looping through your selected items, but you are not looping[/color]
through[color=blue]
> your recordset (although looping through the recordset is only going to[/color]
work[color=blue]
> if the records are in the _exact_ same order as your listbox). rs(0) is[/color]
the[color=blue]
> first record in the returned recordset. As you loop through the items,[/color]
you[color=blue]
> are editing the same record.
>
> Instead, you want to select each record that cooresponds to each selected
> listbox item and then update, or, pull all your records, find the one that
> matches the listbox item in the loop and then update.
>
> Hope that gets you started.
> Pat
>
>
>
> "dixie" <dixiec@dogmail.com> wrote in message
> news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...[color=green]
> > I have some code that adds new records into a table for each ID in a[/color][/color]
list[color=blue][color=green]
> > box when a button on a form is clicked. This works fine. My problem[/color][/color]
now[color=blue]
> is[color=green]
> > that I wish to be able to edit all the records for people whose ID is in[/color]
> the[color=green]
> > list box. I made minor changes to the code (mainly replacing rs.AddNew[/color]
> with[color=green]
> > rs.Edit)and it appears to be updating only the first record and then
> > overwriting that record with the next, etc until it runs out of ID's in[/color]
> the[color=green]
> > list box. In other words, it is stepping through the ID's in the list[/color]
> box,[color=green]
> > but not the records. Is there a trick to this? I have spent many hours
> > doing minor changes and still have the same problem.
> >
> > The code follows (I have reduced the number of fields I am updating to[/color]
> keep[color=green]
> > the size of the message down).
> >
> > Dim intIndex As Integer
> >
> > For intIndex = 0 To Me.lboBulkList.ListCount
> >
> > Me.lbo.BulkList.Selected(intIndex) = True
> >
> > Next intIndex
> >
> >
> >
> > Dim db As Database
> >
> > Dim rs As Recordset
> >
> > Dim prm As Parameter
> >
> > Dim qdf As QueryDef
> >
> >
> >
> > Set db = CurrentDb()
> >
> > Set qdf = db.QueryDefs("qryBulkEdit")
> >
> >
> >
> > For Each prm In qdf.Parameters
> >
> > prm.Value = Eval(prm.Name)
> >
> > Next prm
> >
> >
> >
> > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> >
> >
> >
> > Dim frm As Form
> >
> > Dim ctl As Control
> >
> > Dim varItm As Variant
> >
> >
> >
> > Set frm = Forms!frmExcursions
> >
> > Set ctl = frm! lboBulkList
> >
> > For Each varItm In ctl.ItemsSelected
> >
> >
> >
> > rs.Edit
> >
> > rs(0) = Me. lboBulkList.ItemData(varItm)
> >
> > rs!Date = frm!txtDate
> >
> > rs!Faculty = frm!cboFaculty
> >
> > rs!Course = frm!Course
> >
> > rs!Cost = frm!ExCost
> >
> > rs.Update
> >
> > Next varItm
> >
> > rs.Close: Set rs = Nothing
> >
> >
> > dixie
> >
> >[/color]
>
>[/color]
"Pat" <noemail@ihatespam.bum> wrote in message
news:AmFhc.8861$NR5.255@fe1.texas.rr.com...[color=blue]
> Dixie,
> You are looping through your selected items, but you are not looping[/color]
through[color=blue]
> your recordset (although looping through the recordset is only going to[/color]
work[color=blue]
> if the records are in the _exact_ same order as your listbox). rs(0) is[/color]
the[color=blue]
> first record in the returned recordset. As you loop through the items,[/color]
you[color=blue]
> are editing the same record.
>
> Instead, you want to select each record that cooresponds to each selected
> listbox item and then update, or, pull all your records, find the one that
> matches the listbox item in the loop and then update.
>
> Hope that gets you started.
> Pat
>
>
>
> "dixie" <dixiec@dogmail.com> wrote in message
> news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...[color=green]
> > I have some code that adds new records into a table for each ID in a[/color][/color]
list[color=blue][color=green]
> > box when a button on a form is clicked. This works fine. My problem[/color][/color]
now[color=blue]
> is[color=green]
> > that I wish to be able to edit all the records for people whose ID is in[/color]
> the[color=green]
> > list box. I made minor changes to the code (mainly replacing rs.AddNew[/color]
> with[color=green]
> > rs.Edit)and it appears to be updating only the first record and then
> > overwriting that record with the next, etc until it runs out of ID's in[/color]
> the[color=green]
> > list box. In other words, it is stepping through the ID's in the list[/color]
> box,[color=green]
> > but not the records. Is there a trick to this? I have spent many hours
> > doing minor changes and still have the same problem.
> >
> > The code follows (I have reduced the number of fields I am updating to[/color]
> keep[color=green]
> > the size of the message down).
> >
> > Dim intIndex As Integer
> >
> > For intIndex = 0 To Me.lboBulkList.ListCount
> >
> > Me.lbo.BulkList.Selected(intIndex) = True
> >
> > Next intIndex
> >
> >
> >
> > Dim db As Database
> >
> > Dim rs As Recordset
> >
> > Dim prm As Parameter
> >
> > Dim qdf As QueryDef
> >
> >
> >
> > Set db = CurrentDb()
> >
> > Set qdf = db.QueryDefs("qryBulkEdit")
> >
> >
> >
> > For Each prm In qdf.Parameters
> >
> > prm.Value = Eval(prm.Name)
> >
> > Next prm
> >
> >
> >
> > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> >
> >
> >
> > Dim frm As Form
> >
> > Dim ctl As Control
> >
> > Dim varItm As Variant
> >
> >
> >
> > Set frm = Forms!frmExcursions
> >
> > Set ctl = frm! lboBulkList
> >
> > For Each varItm In ctl.ItemsSelected
> >
> >
> >
> > rs.Edit
> >
> > rs(0) = Me. lboBulkList.ItemData(varItm)
> >
> > rs!Date = frm!txtDate
> >
> > rs!Faculty = frm!cboFaculty
> >
> > rs!Course = frm!Course
> >
> > rs!Cost = frm!ExCost
> >
> > rs.Update
> >
> > Next varItm
> >
> > rs.Close: Set rs = Nothing
> >
> >
> > dixie
> >
> >[/color]
>
>[/color] | | | | re: rs.Edit instead of rs.AddNew
Dixie,
Your original post and your latest reply contains a loop that looks to have
originally been designed to loop through all records in a recordset and
update fields. From your description, you want to update only records
listed in a listbox, for which you have their ID.
If your listbox will likely contain a few items, it could create a dynamic
SLQ statment that selects only the record you want to edit. Then you can
edit that record.
Set frm = Forms!frmExcursions
Set ctl = frm! lboBulkList
For Each varItm In ctl.ItemsSelected
strSQL = "SELECT * FROM tblData WHERE [IDField] =" & varItm
Set rs = CurrentDb.OpenRecordset(strSql)
If rs.RecordCount > 0 Then
rs.FieldNameToEdit = YourNewValue
End if
Next varItm
If you have more than one record that will return in the recordset, you will
need a loop to handle update each record in the set.
Hope this helps,
Pat
"dixie" <dixiec@dogmail.com> wrote in message
news:gXFhc.17$Ah5.1849@nnrp1.ozemail.com.au...[color=blue]
> OK Pat, I thought as much. You have confirmed what I believed was
> happening. My problem is that I don't know how to combine the previous[/color]
type[color=blue]
> of code that updates according to an ID in a list box and then this type[/color]
of[color=blue]
> code
>
> With rs
>
> If rs.RecordCount > 0 Then
> .MoveFirst
> Do
> .Edit
> rs!Cost = 0
> .Update
> .MoveNext
> Loop Until .EOF
> End If
> .Close: Set rs = Nothing
>
> End With
>
> I know that I need to step through the records in the recordset and edit
> each field according to my ID in the list box, but I can't seem to combine
> the two ideas to get to the solution I want - which is for each person
> selected to have their specific record edited according to a what is in
> various controls on the form.
>
> dixie
>
> ----- Original Message -----
> From: "Pat" <noemail@ihatespam.bum>
> Newsgroups: comp.databases.ms-access
> Sent: Thursday, April 22, 2004 11:38 AM
> Subject: Re: rs.Edit instead of rs.AddNew
>
>[color=green]
> > Dixie,
> > You are looping through your selected items, but you are not looping[/color]
> through[color=green]
> > your recordset (although looping through the recordset is only going to[/color]
> work[color=green]
> > if the records are in the _exact_ same order as your listbox). rs(0) is[/color]
> the[color=green]
> > first record in the returned recordset. As you loop through the items,[/color]
> you[color=green]
> > are editing the same record.
> >
> > Instead, you want to select each record that cooresponds to each[/color][/color]
selected[color=blue][color=green]
> > listbox item and then update, or, pull all your records, find the one[/color][/color]
that[color=blue][color=green]
> > matches the listbox item in the loop and then update.
> >
> > Hope that gets you started.
> > Pat
> >
> >
> >
> > "dixie" <dixiec@dogmail.com> wrote in message
> > news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...[color=darkred]
> > > I have some code that adds new records into a table for each ID in a[/color][/color]
> list[color=green][color=darkred]
> > > box when a button on a form is clicked. This works fine. My problem[/color][/color]
> now[color=green]
> > is[color=darkred]
> > > that I wish to be able to edit all the records for people whose ID is[/color][/color][/color]
in[color=blue][color=green]
> > the[color=darkred]
> > > list box. I made minor changes to the code (mainly replacing[/color][/color][/color]
rs.AddNew[color=blue][color=green]
> > with[color=darkred]
> > > rs.Edit)and it appears to be updating only the first record and then
> > > overwriting that record with the next, etc until it runs out of ID's[/color][/color][/color]
in[color=blue][color=green]
> > the[color=darkred]
> > > list box. In other words, it is stepping through the ID's in the list[/color]
> > box,[color=darkred]
> > > but not the records. Is there a trick to this? I have spent many[/color][/color][/color]
hours[color=blue][color=green][color=darkred]
> > > doing minor changes and still have the same problem.
> > >
> > > The code follows (I have reduced the number of fields I am updating to[/color]
> > keep[color=darkred]
> > > the size of the message down).
> > >
> > > Dim intIndex As Integer
> > >
> > > For intIndex = 0 To Me.lboBulkList.ListCount
> > >
> > > Me.lbo.BulkList.Selected(intIndex) = True
> > >
> > > Next intIndex
> > >
> > >
> > >
> > > Dim db As Database
> > >
> > > Dim rs As Recordset
> > >
> > > Dim prm As Parameter
> > >
> > > Dim qdf As QueryDef
> > >
> > >
> > >
> > > Set db = CurrentDb()
> > >
> > > Set qdf = db.QueryDefs("qryBulkEdit")
> > >
> > >
> > >
> > > For Each prm In qdf.Parameters
> > >
> > > prm.Value = Eval(prm.Name)
> > >
> > > Next prm
> > >
> > >
> > >
> > > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> > >
> > >
> > >
> > > Dim frm As Form
> > >
> > > Dim ctl As Control
> > >
> > > Dim varItm As Variant
> > >
> > >
> > >
> > > Set frm = Forms!frmExcursions
> > >
> > > Set ctl = frm! lboBulkList
> > >
> > > For Each varItm In ctl.ItemsSelected
> > >
> > >
> > >
> > > rs.Edit
> > >
> > > rs(0) = Me. lboBulkList.ItemData(varItm)
> > >
> > > rs!Date = frm!txtDate
> > >
> > > rs!Faculty = frm!cboFaculty
> > >
> > > rs!Course = frm!Course
> > >
> > > rs!Cost = frm!ExCost
> > >
> > > rs.Update
> > >
> > > Next varItm
> > >
> > > rs.Close: Set rs = Nothing
> > >
> > >
> > > dixie
> > >
> > >[/color]
> >
> >[/color]
>
> "Pat" <noemail@ihatespam.bum> wrote in message
> news:AmFhc.8861$NR5.255@fe1.texas.rr.com...[color=green]
> > Dixie,
> > You are looping through your selected items, but you are not looping[/color]
> through[color=green]
> > your recordset (although looping through the recordset is only going to[/color]
> work[color=green]
> > if the records are in the _exact_ same order as your listbox). rs(0) is[/color]
> the[color=green]
> > first record in the returned recordset. As you loop through the items,[/color]
> you[color=green]
> > are editing the same record.
> >
> > Instead, you want to select each record that cooresponds to each[/color][/color]
selected[color=blue][color=green]
> > listbox item and then update, or, pull all your records, find the one[/color][/color]
that[color=blue][color=green]
> > matches the listbox item in the loop and then update.
> >
> > Hope that gets you started.
> > Pat
> >
> >
> >
> > "dixie" <dixiec@dogmail.com> wrote in message
> > news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...[color=darkred]
> > > I have some code that adds new records into a table for each ID in a[/color][/color]
> list[color=green][color=darkred]
> > > box when a button on a form is clicked. This works fine. My problem[/color][/color]
> now[color=green]
> > is[color=darkred]
> > > that I wish to be able to edit all the records for people whose ID is[/color][/color][/color]
in[color=blue][color=green]
> > the[color=darkred]
> > > list box. I made minor changes to the code (mainly replacing[/color][/color][/color]
rs.AddNew[color=blue][color=green]
> > with[color=darkred]
> > > rs.Edit)and it appears to be updating only the first record and then
> > > overwriting that record with the next, etc until it runs out of ID's[/color][/color][/color]
in[color=blue][color=green]
> > the[color=darkred]
> > > list box. In other words, it is stepping through the ID's in the list[/color]
> > box,[color=darkred]
> > > but not the records. Is there a trick to this? I have spent many[/color][/color][/color]
hours[color=blue][color=green][color=darkred]
> > > doing minor changes and still have the same problem.
> > >
> > > The code follows (I have reduced the number of fields I am updating to[/color]
> > keep[color=darkred]
> > > the size of the message down).
> > >
> > > Dim intIndex As Integer
> > >
> > > For intIndex = 0 To Me.lboBulkList.ListCount
> > >
> > > Me.lbo.BulkList.Selected(intIndex) = True
> > >
> > > Next intIndex
> > >
> > >
> > >
> > > Dim db As Database
> > >
> > > Dim rs As Recordset
> > >
> > > Dim prm As Parameter
> > >
> > > Dim qdf As QueryDef
> > >
> > >
> > >
> > > Set db = CurrentDb()
> > >
> > > Set qdf = db.QueryDefs("qryBulkEdit")
> > >
> > >
> > >
> > > For Each prm In qdf.Parameters
> > >
> > > prm.Value = Eval(prm.Name)
> > >
> > > Next prm
> > >
> > >
> > >
> > > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> > >
> > >
> > >
> > > Dim frm As Form
> > >
> > > Dim ctl As Control
> > >
> > > Dim varItm As Variant
> > >
> > >
> > >
> > > Set frm = Forms!frmExcursions
> > >
> > > Set ctl = frm! lboBulkList
> > >
> > > For Each varItm In ctl.ItemsSelected
> > >
> > >
> > >
> > > rs.Edit
> > >
> > > rs(0) = Me. lboBulkList.ItemData(varItm)
> > >
> > > rs!Date = frm!txtDate
> > >
> > > rs!Faculty = frm!cboFaculty
> > >
> > > rs!Course = frm!Course
> > >
> > > rs!Cost = frm!ExCost
> > >
> > > rs.Update
> > >
> > > Next varItm
> > >
> > > rs.Close: Set rs = Nothing
> > >
> > >
> > > dixie
> > >
> > >[/color]
> >
> >[/color]
>
>[/color] | | | | re: rs.Edit instead of rs.AddNew
Ok, tried that and strangely, I get exactly the same problem - that is, it
updates the first record, but not the others. I did not understand your
statement about you will need a loop to update each record in the set - is
this the bit I have missed.
The general idea is that I have a list of details for an excursion that a
group of students are going on. I print a form out for each one and I print
a list of students attending. Now, I already have that bit working. The
bit I am trying to get here is if there was a mistake in the details or more
information had come to hand, I wan't to be able to do a "bulk edit" on each
entry (one per student). The ID is a unique student ID and there would be a
number of them (up to 100) in the list box, lboBulkList.
Now, this is the fine detail and is currently what I interpreted your
previous post into.
Private Sub btnEditTest_Click()
Dim db As Database
Dim rs As Recordset
Dim strSQL As String
Dim frm As Form
Dim ctl As Control
Dim varItm As Variant
Set frm = Forms!frmExcursions
Set ctl = frm!lboBulkList
For Each varItm In ctl.ItemsSelected
strSQL = "SELECT * FROM tblExcursions WHERE [ID] =" & varItm
Set rs = CurrentDb.OpenRecordset(strSQL)
If rs.RecordCount > 0 Then
rs!Date = frm!txtDate
rs!ID_TCHR = frm!Teacher
rs!Faculty = frm!cboFaculty
rs!Course = frm!Course
rs!ExcursionType = frm!Reason
rs!Details = frm!Comment
rs!Signatory = frm!TxtSignatory
rs!SignatoryArea = frm!TxtSignatoryArea
rs!ExcursionName = frm!ExName
rs!Cost = frm!ExCost
rs!Destination = frm!ExcursionDestination
rs!DeparturePlace = frm!DepartFrom
rs!ReturningPlace = frm!ReturnTo
rs!DepartureTime = frm!DepartTime
rs!ReturningTime = frm!ReturnTime
rs!Representative = frm!Rep
rs!Uniform = frm!Dress
rs!Overnight = frm!Night
rs!CommendationRequired = frm!Commendation
rs!Outdoors = frm!Outdoors
rs!Travel = frm!TravelType
rs!EntryDate = frm!txtEntryDate
rs!Edited = -1
End If
Next varItm
End sub
"Pat" <noemail@ihatespam.bum> wrote in message
news:IjHhc.11708$hR1.10135@fe2.texas.rr.com...[color=blue]
> Dixie,
> Your original post and your latest reply contains a loop that looks to[/color]
have[color=blue]
> originally been designed to loop through all records in a recordset and
> update fields. From your description, you want to update only records
> listed in a listbox, for which you have their ID.
>
> If your listbox will likely contain a few items, it could create a dynamic
> SLQ statment that selects only the record you want to edit. Then you can
> edit that record.
>
> Set frm = Forms!frmExcursions
> Set ctl = frm! lboBulkList
> For Each varItm In ctl.ItemsSelected
> strSQL = "SELECT * FROM tblData WHERE [IDField] =" & varItm
> Set rs = CurrentDb.OpenRecordset(strSql)
> If rs.RecordCount > 0 Then
> rs.FieldNameToEdit = YourNewValue
> End if
> Next varItm
>
> If you have more than one record that will return in the recordset, you[/color]
will[color=blue]
> need a loop to handle update each record in the set.
>
> Hope this helps,
> Pat
>
>
>
> "dixie" <dixiec@dogmail.com> wrote in message
> news:gXFhc.17$Ah5.1849@nnrp1.ozemail.com.au...[color=green]
> > OK Pat, I thought as much. You have confirmed what I believed was
> > happening. My problem is that I don't know how to combine the previous[/color]
> type[color=green]
> > of code that updates according to an ID in a list box and then this type[/color]
> of[color=green]
> > code
> >
> > With rs
> >
> > If rs.RecordCount > 0 Then
> > .MoveFirst
> > Do
> > .Edit
> > rs!Cost = 0
> > .Update
> > .MoveNext
> > Loop Until .EOF
> > End If
> > .Close: Set rs = Nothing
> >
> > End With
> >
> > I know that I need to step through the records in the recordset and edit
> > each field according to my ID in the list box, but I can't seem to[/color][/color]
combine[color=blue][color=green]
> > the two ideas to get to the solution I want - which is for each person
> > selected to have their specific record edited according to a what is in
> > various controls on the form.
> >
> > dixie
> >
> > ----- Original Message -----
> > From: "Pat" <noemail@ihatespam.bum>
> > Newsgroups: comp.databases.ms-access
> > Sent: Thursday, April 22, 2004 11:38 AM
> > Subject: Re: rs.Edit instead of rs.AddNew
> >
> >[color=darkred]
> > > Dixie,
> > > You are looping through your selected items, but you are not looping[/color]
> > through[color=darkred]
> > > your recordset (although looping through the recordset is only going[/color][/color][/color]
to[color=blue][color=green]
> > work[color=darkred]
> > > if the records are in the _exact_ same order as your listbox). rs(0)[/color][/color][/color]
is[color=blue][color=green]
> > the[color=darkred]
> > > first record in the returned recordset. As you loop through the[/color][/color][/color]
items,[color=blue][color=green]
> > you[color=darkred]
> > > are editing the same record.
> > >
> > > Instead, you want to select each record that cooresponds to each[/color][/color]
> selected[color=green][color=darkred]
> > > listbox item and then update, or, pull all your records, find the one[/color][/color]
> that[color=green][color=darkred]
> > > matches the listbox item in the loop and then update.
> > >
> > > Hope that gets you started.
> > > Pat
> > >
> > >
> > >
> > > "dixie" <dixiec@dogmail.com> wrote in message
> > > news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...
> > > > I have some code that adds new records into a table for each ID in a[/color]
> > list[color=darkred]
> > > > box when a button on a form is clicked. This works fine. My[/color][/color][/color]
problem[color=blue][color=green]
> > now[color=darkred]
> > > is
> > > > that I wish to be able to edit all the records for people whose ID[/color][/color][/color]
is[color=blue]
> in[color=green][color=darkred]
> > > the
> > > > list box. I made minor changes to the code (mainly replacing[/color][/color]
> rs.AddNew[color=green][color=darkred]
> > > with
> > > > rs.Edit)and it appears to be updating only the first record and then
> > > > overwriting that record with the next, etc until it runs out of ID's[/color][/color]
> in[color=green][color=darkred]
> > > the
> > > > list box. In other words, it is stepping through the ID's in the[/color][/color][/color]
list[color=blue][color=green][color=darkred]
> > > box,
> > > > but not the records. Is there a trick to this? I have spent many[/color][/color]
> hours[color=green][color=darkred]
> > > > doing minor changes and still have the same problem.
> > > >
> > > > The code follows (I have reduced the number of fields I am updating[/color][/color][/color]
to[color=blue][color=green][color=darkred]
> > > keep
> > > > the size of the message down).
> > > >
> > > > Dim intIndex As Integer
> > > >
> > > > For intIndex = 0 To Me.lboBulkList.ListCount
> > > >
> > > > Me.lbo.BulkList.Selected(intIndex) = True
> > > >
> > > > Next intIndex
> > > >
> > > >
> > > >
> > > > Dim db As Database
> > > >
> > > > Dim rs As Recordset
> > > >
> > > > Dim prm As Parameter
> > > >
> > > > Dim qdf As QueryDef
> > > >
> > > >
> > > >
> > > > Set db = CurrentDb()
> > > >
> > > > Set qdf = db.QueryDefs("qryBulkEdit")
> > > >
> > > >
> > > >
> > > > For Each prm In qdf.Parameters
> > > >
> > > > prm.Value = Eval(prm.Name)
> > > >
> > > > Next prm
> > > >
> > > >
> > > >
> > > > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> > > >
> > > >
> > > >
> > > > Dim frm As Form
> > > >
> > > > Dim ctl As Control
> > > >
> > > > Dim varItm As Variant
> > > >
> > > >
> > > >
> > > > Set frm = Forms!frmExcursions
> > > >
> > > > Set ctl = frm! lboBulkList
> > > >
> > > > For Each varItm In ctl.ItemsSelected
> > > >
> > > >
> > > >
> > > > rs.Edit
> > > >
> > > > rs(0) = Me. lboBulkList.ItemData(varItm)
> > > >
> > > > rs!Date = frm!txtDate
> > > >
> > > > rs!Faculty = frm!cboFaculty
> > > >
> > > > rs!Course = frm!Course
> > > >
> > > > rs!Cost = frm!ExCost
> > > >
> > > > rs.Update
> > > >
> > > > Next varItm
> > > >
> > > > rs.Close: Set rs = Nothing
> > > >
> > > >
> > > > dixie
> > > >
> > > >
> > >
> > >[/color]
> >
> > "Pat" <noemail@ihatespam.bum> wrote in message
> > news:AmFhc.8861$NR5.255@fe1.texas.rr.com...[color=darkred]
> > > Dixie,
> > > You are looping through your selected items, but you are not looping[/color]
> > through[color=darkred]
> > > your recordset (although looping through the recordset is only going[/color][/color][/color]
to[color=blue][color=green]
> > work[color=darkred]
> > > if the records are in the _exact_ same order as your listbox). rs(0)[/color][/color][/color]
is[color=blue][color=green]
> > the[color=darkred]
> > > first record in the returned recordset. As you loop through the[/color][/color][/color]
items,[color=blue][color=green]
> > you[color=darkred]
> > > are editing the same record.
> > >
> > > Instead, you want to select each record that cooresponds to each[/color][/color]
> selected[color=green][color=darkred]
> > > listbox item and then update, or, pull all your records, find the one[/color][/color]
> that[color=green][color=darkred]
> > > matches the listbox item in the loop and then update.
> > >
> > > Hope that gets you started.
> > > Pat
> > >
> > >
> > >
> > > "dixie" <dixiec@dogmail.com> wrote in message
> > > news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...
> > > > I have some code that adds new records into a table for each ID in a[/color]
> > list[color=darkred]
> > > > box when a button on a form is clicked. This works fine. My[/color][/color][/color]
problem[color=blue][color=green]
> > now[color=darkred]
> > > is
> > > > that I wish to be able to edit all the records for people whose ID[/color][/color][/color]
is[color=blue]
> in[color=green][color=darkred]
> > > the
> > > > list box. I made minor changes to the code (mainly replacing[/color][/color]
> rs.AddNew[color=green][color=darkred]
> > > with
> > > > rs.Edit)and it appears to be updating only the first record and then
> > > > overwriting that record with the next, etc until it runs out of ID's[/color][/color]
> in[color=green][color=darkred]
> > > the
> > > > list box. In other words, it is stepping through the ID's in the[/color][/color][/color]
list[color=blue][color=green][color=darkred]
> > > box,
> > > > but not the records. Is there a trick to this? I have spent many[/color][/color]
> hours[color=green][color=darkred]
> > > > doing minor changes and still have the same problem.
> > > >
> > > > The code follows (I have reduced the number of fields I am updating[/color][/color][/color]
to[color=blue][color=green][color=darkred]
> > > keep
> > > > the size of the message down).
> > > >
> > > > Dim intIndex As Integer
> > > >
> > > > For intIndex = 0 To Me.lboBulkList.ListCount
> > > >
> > > > Me.lbo.BulkList.Selected(intIndex) = True
> > > >
> > > > Next intIndex
> > > >
> > > >
> > > >
> > > > Dim db As Database
> > > >
> > > > Dim rs As Recordset
> > > >
> > > > Dim prm As Parameter
> > > >
> > > > Dim qdf As QueryDef
> > > >
> > > >
> > > >
> > > > Set db = CurrentDb()
> > > >
> > > > Set qdf = db.QueryDefs("qryBulkEdit")
> > > >
> > > >
> > > >
> > > > For Each prm In qdf.Parameters
> > > >
> > > > prm.Value = Eval(prm.Name)
> > > >
> > > > Next prm
> > > >
> > > >
> > > >
> > > > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> > > >
> > > >
> > > >
> > > > Dim frm As Form
> > > >
> > > > Dim ctl As Control
> > > >
> > > > Dim varItm As Variant
> > > >
> > > >
> > > >
> > > > Set frm = Forms!frmExcursions
> > > >
> > > > Set ctl = frm! lboBulkList
> > > >
> > > > For Each varItm In ctl.ItemsSelected
> > > >
> > > >
> > > >
> > > > rs.Edit
> > > >
> > > > rs(0) = Me. lboBulkList.ItemData(varItm)
> > > >
> > > > rs!Date = frm!txtDate
> > > >
> > > > rs!Faculty = frm!cboFaculty
> > > >
> > > > rs!Course = frm!Course
> > > >
> > > > rs!Cost = frm!ExCost
> > > >
> > > > rs.Update
> > > >
> > > > Next varItm
> > > >
> > > > rs.Close: Set rs = Nothing
> > > >
> > > >
> > > > dixie
> > > >
> > > >
> > >
> > >[/color]
> >
> >[/color]
>
>[/color] | | | | re: rs.Edit instead of rs.AddNew
Dixie,
It's hard to help too much without knowing what's in your listbox. Since
the dynamic SQL statement seems to be returning the same record, it would be
best to see what you are returning from the listbox. Use debug.print to
display your items in the listbox and the fields in the record you are
returning within the Immediate window.
For Each varItm In ctl.ItemsSelected
strSQL = "SELECT * FROM tblExcursions WHERE [ID] =" & varItm
Set rs = CurrentDb.OpenRecordset(strSQL)
Debug.Print varItem
Debug.Print Field1, Field2, Field3, etc
I suspect that you have multiple columns in your listbox. This may be
causing the problem - returning the same value from the listbox for each
item selected, and thus retrieving the same record. If there are multiple
columns, look at ItemsSelected in the help file. It will give you a sense
of how to pull the right column of data you want to build your SQL statement
with.
Hope this helps,
Pat
"dixie" <dixiec@dogmail.com> wrote in message
news:hlIhc.38$Ah5.2978@nnrp1.ozemail.com.au...[color=blue]
> Ok, tried that and strangely, I get exactly the same problem - that is, it
> updates the first record, but not the others. I did not understand your
> statement about you will need a loop to update each record in the set - is
> this the bit I have missed.
>
> The general idea is that I have a list of details for an excursion that a
> group of students are going on. I print a form out for each one and I[/color]
print[color=blue]
> a list of students attending. Now, I already have that bit working. The
> bit I am trying to get here is if there was a mistake in the details or[/color]
more[color=blue]
> information had come to hand, I wan't to be able to do a "bulk edit" on[/color]
each[color=blue]
> entry (one per student). The ID is a unique student ID and there would be[/color]
a[color=blue]
> number of them (up to 100) in the list box, lboBulkList.
>
> Now, this is the fine detail and is currently what I interpreted your
> previous post into.
>
> Private Sub btnEditTest_Click()
> Dim db As Database
> Dim rs As Recordset
> Dim strSQL As String
>
> Dim frm As Form
> Dim ctl As Control
> Dim varItm As Variant
>
> Set frm = Forms!frmExcursions
> Set ctl = frm!lboBulkList
>
> For Each varItm In ctl.ItemsSelected
> strSQL = "SELECT * FROM tblExcursions WHERE [ID] =" & varItm
>
> Set rs = CurrentDb.OpenRecordset(strSQL)
> If rs.RecordCount > 0 Then
> rs!Date = frm!txtDate
> rs!ID_TCHR = frm!Teacher
> rs!Faculty = frm!cboFaculty
> rs!Course = frm!Course
> rs!ExcursionType = frm!Reason
> rs!Details = frm!Comment
> rs!Signatory = frm!TxtSignatory
> rs!SignatoryArea = frm!TxtSignatoryArea
> rs!ExcursionName = frm!ExName
> rs!Cost = frm!ExCost
> rs!Destination = frm!ExcursionDestination
> rs!DeparturePlace = frm!DepartFrom
> rs!ReturningPlace = frm!ReturnTo
> rs!DepartureTime = frm!DepartTime
> rs!ReturningTime = frm!ReturnTime
> rs!Representative = frm!Rep
> rs!Uniform = frm!Dress
> rs!Overnight = frm!Night
> rs!CommendationRequired = frm!Commendation
> rs!Outdoors = frm!Outdoors
> rs!Travel = frm!TravelType
> rs!EntryDate = frm!txtEntryDate
> rs!Edited = -1
> End If
> Next varItm
> End sub
>
> "Pat" <noemail@ihatespam.bum> wrote in message
> news:IjHhc.11708$hR1.10135@fe2.texas.rr.com...[color=green]
> > Dixie,
> > Your original post and your latest reply contains a loop that looks to[/color]
> have[color=green]
> > originally been designed to loop through all records in a recordset and
> > update fields. From your description, you want to update only records
> > listed in a listbox, for which you have their ID.
> >
> > If your listbox will likely contain a few items, it could create a[/color][/color]
dynamic[color=blue][color=green]
> > SLQ statment that selects only the record you want to edit. Then you[/color][/color]
can[color=blue][color=green]
> > edit that record.
> >
> > Set frm = Forms!frmExcursions
> > Set ctl = frm! lboBulkList
> > For Each varItm In ctl.ItemsSelected
> > strSQL = "SELECT * FROM tblData WHERE [IDField] =" & varItm
> > Set rs = CurrentDb.OpenRecordset(strSql)
> > If rs.RecordCount > 0 Then
> > rs.FieldNameToEdit = YourNewValue
> > End if
> > Next varItm
> >
> > If you have more than one record that will return in the recordset, you[/color]
> will[color=green]
> > need a loop to handle update each record in the set.
> >
> > Hope this helps,
> > Pat
> >
> >
> >
> > "dixie" <dixiec@dogmail.com> wrote in message
> > news:gXFhc.17$Ah5.1849@nnrp1.ozemail.com.au...[color=darkred]
> > > OK Pat, I thought as much. You have confirmed what I believed was
> > > happening. My problem is that I don't know how to combine the[/color][/color][/color]
previous[color=blue][color=green]
> > type[color=darkred]
> > > of code that updates according to an ID in a list box and then this[/color][/color][/color]
type[color=blue][color=green]
> > of[color=darkred]
> > > code
> > >
> > > With rs
> > >
> > > If rs.RecordCount > 0 Then
> > > .MoveFirst
> > > Do
> > > .Edit
> > > rs!Cost = 0
> > > .Update
> > > .MoveNext
> > > Loop Until .EOF
> > > End If
> > > .Close: Set rs = Nothing
> > >
> > > End With
> > >
> > > I know that I need to step through the records in the recordset and[/color][/color][/color]
edit[color=blue][color=green][color=darkred]
> > > each field according to my ID in the list box, but I can't seem to[/color][/color]
> combine[color=green][color=darkred]
> > > the two ideas to get to the solution I want - which is for each person
> > > selected to have their specific record edited according to a what is[/color][/color][/color]
in[color=blue][color=green][color=darkred]
> > > various controls on the form.
> > >
> > > dixie
> > >
> > > ----- Original Message -----
> > > From: "Pat" <noemail@ihatespam.bum>
> > > Newsgroups: comp.databases.ms-access
> > > Sent: Thursday, April 22, 2004 11:38 AM
> > > Subject: Re: rs.Edit instead of rs.AddNew
> > >
> > >
> > > > Dixie,
> > > > You are looping through your selected items, but you are not looping
> > > through
> > > > your recordset (although looping through the recordset is only going[/color][/color]
> to[color=green][color=darkred]
> > > work
> > > > if the records are in the _exact_ same order as your listbox). rs(0)[/color][/color]
> is[color=green][color=darkred]
> > > the
> > > > first record in the returned recordset. As you loop through the[/color][/color]
> items,[color=green][color=darkred]
> > > you
> > > > are editing the same record.
> > > >
> > > > Instead, you want to select each record that cooresponds to each[/color]
> > selected[color=darkred]
> > > > listbox item and then update, or, pull all your records, find the[/color][/color][/color]
one[color=blue][color=green]
> > that[color=darkred]
> > > > matches the listbox item in the loop and then update.
> > > >
> > > > Hope that gets you started.
> > > > Pat
> > > >
> > > >
> > > >
> > > > "dixie" <dixiec@dogmail.com> wrote in message
> > > > news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...
> > > > > I have some code that adds new records into a table for each ID in[/color][/color][/color]
a[color=blue][color=green][color=darkred]
> > > list
> > > > > box when a button on a form is clicked. This works fine. My[/color][/color]
> problem[color=green][color=darkred]
> > > now
> > > > is
> > > > > that I wish to be able to edit all the records for people whose ID[/color][/color]
> is[color=green]
> > in[color=darkred]
> > > > the
> > > > > list box. I made minor changes to the code (mainly replacing[/color]
> > rs.AddNew[color=darkred]
> > > > with
> > > > > rs.Edit)and it appears to be updating only the first record and[/color][/color][/color]
then[color=blue][color=green][color=darkred]
> > > > > overwriting that record with the next, etc until it runs out of[/color][/color][/color]
ID's[color=blue][color=green]
> > in[color=darkred]
> > > > the
> > > > > list box. In other words, it is stepping through the ID's in the[/color][/color]
> list[color=green][color=darkred]
> > > > box,
> > > > > but not the records. Is there a trick to this? I have spent many[/color]
> > hours[color=darkred]
> > > > > doing minor changes and still have the same problem.
> > > > >
> > > > > The code follows (I have reduced the number of fields I am[/color][/color][/color]
updating[color=blue]
> to[color=green][color=darkred]
> > > > keep
> > > > > the size of the message down).
> > > > >
> > > > > Dim intIndex As Integer
> > > > >
> > > > > For intIndex = 0 To Me.lboBulkList.ListCount
> > > > >
> > > > > Me.lbo.BulkList.Selected(intIndex) = True
> > > > >
> > > > > Next intIndex
> > > > >
> > > > >
> > > > >
> > > > > Dim db As Database
> > > > >
> > > > > Dim rs As Recordset
> > > > >
> > > > > Dim prm As Parameter
> > > > >
> > > > > Dim qdf As QueryDef
> > > > >
> > > > >
> > > > >
> > > > > Set db = CurrentDb()
> > > > >
> > > > > Set qdf = db.QueryDefs("qryBulkEdit")
> > > > >
> > > > >
> > > > >
> > > > > For Each prm In qdf.Parameters
> > > > >
> > > > > prm.Value = Eval(prm.Name)
> > > > >
> > > > > Next prm
> > > > >
> > > > >
> > > > >
> > > > > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> > > > >
> > > > >
> > > > >
> > > > > Dim frm As Form
> > > > >
> > > > > Dim ctl As Control
> > > > >
> > > > > Dim varItm As Variant
> > > > >
> > > > >
> > > > >
> > > > > Set frm = Forms!frmExcursions
> > > > >
> > > > > Set ctl = frm! lboBulkList
> > > > >
> > > > > For Each varItm In ctl.ItemsSelected
> > > > >
> > > > >
> > > > >
> > > > > rs.Edit
> > > > >
> > > > > rs(0) = Me. lboBulkList.ItemData(varItm)
> > > > >
> > > > > rs!Date = frm!txtDate
> > > > >
> > > > > rs!Faculty = frm!cboFaculty
> > > > >
> > > > > rs!Course = frm!Course
> > > > >
> > > > > rs!Cost = frm!ExCost
> > > > >
> > > > > rs.Update
> > > > >
> > > > > Next varItm
> > > > >
> > > > > rs.Close: Set rs = Nothing
> > > > >
> > > > >
> > > > > dixie
> > > > >
> > > > >
> > > >
> > > >
> > >
> > > "Pat" <noemail@ihatespam.bum> wrote in message
> > > news:AmFhc.8861$NR5.255@fe1.texas.rr.com...
> > > > Dixie,
> > > > You are looping through your selected items, but you are not looping
> > > through
> > > > your recordset (although looping through the recordset is only going[/color][/color]
> to[color=green][color=darkred]
> > > work
> > > > if the records are in the _exact_ same order as your listbox). rs(0)[/color][/color]
> is[color=green][color=darkred]
> > > the
> > > > first record in the returned recordset. As you loop through the[/color][/color]
> items,[color=green][color=darkred]
> > > you
> > > > are editing the same record.
> > > >
> > > > Instead, you want to select each record that cooresponds to each[/color]
> > selected[color=darkred]
> > > > listbox item and then update, or, pull all your records, find the[/color][/color][/color]
one[color=blue][color=green]
> > that[color=darkred]
> > > > matches the listbox item in the loop and then update.
> > > >
> > > > Hope that gets you started.
> > > > Pat
> > > >
> > > >
> > > >
> > > > "dixie" <dixiec@dogmail.com> wrote in message
> > > > news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...
> > > > > I have some code that adds new records into a table for each ID in[/color][/color][/color]
a[color=blue][color=green][color=darkred]
> > > list
> > > > > box when a button on a form is clicked. This works fine. My[/color][/color]
> problem[color=green][color=darkred]
> > > now
> > > > is
> > > > > that I wish to be able to edit all the records for people whose ID[/color][/color]
> is[color=green]
> > in[color=darkred]
> > > > the
> > > > > list box. I made minor changes to the code (mainly replacing[/color]
> > rs.AddNew[color=darkred]
> > > > with
> > > > > rs.Edit)and it appears to be updating only the first record and[/color][/color][/color]
then[color=blue][color=green][color=darkred]
> > > > > overwriting that record with the next, etc until it runs out of[/color][/color][/color]
ID's[color=blue][color=green]
> > in[color=darkred]
> > > > the
> > > > > list box. In other words, it is stepping through the ID's in the[/color][/color]
> list[color=green][color=darkred]
> > > > box,
> > > > > but not the records. Is there a trick to this? I have spent many[/color]
> > hours[color=darkred]
> > > > > doing minor changes and still have the same problem.
> > > > >
> > > > > The code follows (I have reduced the number of fields I am[/color][/color][/color]
updating[color=blue]
> to[color=green][color=darkred]
> > > > keep
> > > > > the size of the message down).
> > > > >
> > > > > Dim intIndex As Integer
> > > > >
> > > > > For intIndex = 0 To Me.lboBulkList.ListCount
> > > > >
> > > > > Me.lbo.BulkList.Selected(intIndex) = True
> > > > >
> > > > > Next intIndex
> > > > >
> > > > >
> > > > >
> > > > > Dim db As Database
> > > > >
> > > > > Dim rs As Recordset
> > > > >
> > > > > Dim prm As Parameter
> > > > >
> > > > > Dim qdf As QueryDef
> > > > >
> > > > >
> > > > >
> > > > > Set db = CurrentDb()
> > > > >
> > > > > Set qdf = db.QueryDefs("qryBulkEdit")
> > > > >
> > > > >
> > > > >
> > > > > For Each prm In qdf.Parameters
> > > > >
> > > > > prm.Value = Eval(prm.Name)
> > > > >
> > > > > Next prm
> > > > >
> > > > >
> > > > >
> > > > > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> > > > >
> > > > >
> > > > >
> > > > > Dim frm As Form
> > > > >
> > > > > Dim ctl As Control
> > > > >
> > > > > Dim varItm As Variant
> > > > >
> > > > >
> > > > >
> > > > > Set frm = Forms!frmExcursions
> > > > >
> > > > > Set ctl = frm! lboBulkList
> > > > >
> > > > > For Each varItm In ctl.ItemsSelected
> > > > >
> > > > >
> > > > >
> > > > > rs.Edit
> > > > >
> > > > > rs(0) = Me. lboBulkList.ItemData(varItm)
> > > > >
> > > > > rs!Date = frm!txtDate
> > > > >
> > > > > rs!Faculty = frm!cboFaculty
> > > > >
> > > > > rs!Course = frm!Course
> > > > >
> > > > > rs!Cost = frm!ExCost
> > > > >
> > > > > rs.Update
> > > > >
> > > > > Next varItm
> > > > >
> > > > > rs.Close: Set rs = Nothing
> > > > >
> > > > >
> > > > > dixie
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >[/color]
> >
> >[/color]
>
>[/color] | | | | re: rs.Edit instead of rs.AddNew
Hi Dixie
In your first version of the code you first select all items in the listbox
and then iterate through all the selected items.
If you want to process all the list items, it is not necessary to select
them all first.
Instead of "For Each varItm In ctl.ItemsSelected"
you can do something like:
Dim i As Integer
For i = 0 To Me.lboBulkList.ListCount - 1
strSQL = "SELECT * FROM tblExcursions WHERE [ID] =" &
Me.lboBulkList.ItemData(0)
Set rs = CurrentDb.OpenRecordset(strSQL)
If rs.RecordCount > 0 Then
rs!Date = frm!txtDate
...
end if
Next i
You haven't allowed for the possibility that rs.RecordCount might be > 1.
I also wonder whether the design of your database could be improved. If the
details of an Excursion are needed to be changed, you should only have to
change the details in one row of a table, not repeatedly change the same
details for many rows.
Regards - Joe
"dixie" <dixiec@dogmail.com> wrote in message
news:hlIhc.38$Ah5.2978@nnrp1.ozemail.com.au...[color=blue]
> Ok, tried that and strangely, I get exactly the same problem - that is, it
> updates the first record, but not the others. I did not understand your
> statement about you will need a loop to update each record in the set - is
> this the bit I have missed.
>
> The general idea is that I have a list of details for an excursion that a
> group of students are going on. I print a form out for each one and I[/color]
print[color=blue]
> a list of students attending. Now, I already have that bit working. The
> bit I am trying to get here is if there was a mistake in the details or[/color]
more[color=blue]
> information had come to hand, I wan't to be able to do a "bulk edit" on[/color]
each[color=blue]
> entry (one per student). The ID is a unique student ID and there would be[/color]
a[color=blue]
> number of them (up to 100) in the list box, lboBulkList.
>
> Now, this is the fine detail and is currently what I interpreted your
> previous post into.
>
> Private Sub btnEditTest_Click()
> Dim db As Database
> Dim rs As Recordset
> Dim strSQL As String
>
> Dim frm As Form
> Dim ctl As Control
> Dim varItm As Variant
>
> Set frm = Forms!frmExcursions
> Set ctl = frm!lboBulkList
>
> For Each varItm In ctl.ItemsSelected
> strSQL = "SELECT * FROM tblExcursions WHERE [ID] =" & varItm
>
> Set rs = CurrentDb.OpenRecordset(strSQL)
> If rs.RecordCount > 0 Then
> rs!Date = frm!txtDate
> rs!ID_TCHR = frm!Teacher
> rs!Faculty = frm!cboFaculty
> rs!Course = frm!Course
> rs!ExcursionType = frm!Reason
> rs!Details = frm!Comment
> rs!Signatory = frm!TxtSignatory
> rs!SignatoryArea = frm!TxtSignatoryArea
> rs!ExcursionName = frm!ExName
> rs!Cost = frm!ExCost
> rs!Destination = frm!ExcursionDestination
> rs!DeparturePlace = frm!DepartFrom
> rs!ReturningPlace = frm!ReturnTo
> rs!DepartureTime = frm!DepartTime
> rs!ReturningTime = frm!ReturnTime
> rs!Representative = frm!Rep
> rs!Uniform = frm!Dress
> rs!Overnight = frm!Night
> rs!CommendationRequired = frm!Commendation
> rs!Outdoors = frm!Outdoors
> rs!Travel = frm!TravelType
> rs!EntryDate = frm!txtEntryDate
> rs!Edited = -1
> End If
> Next varItm
> End sub
>
> "Pat" <noemail@ihatespam.bum> wrote in message
> news:IjHhc.11708$hR1.10135@fe2.texas.rr.com...[color=green]
> > Dixie,
> > Your original post and your latest reply contains a loop that looks to[/color]
> have[color=green]
> > originally been designed to loop through all records in a recordset and
> > update fields. From your description, you want to update only records
> > listed in a listbox, for which you have their ID.
> >
> > If your listbox will likely contain a few items, it could create a[/color][/color]
dynamic[color=blue][color=green]
> > SLQ statment that selects only the record you want to edit. Then you[/color][/color]
can[color=blue][color=green]
> > edit that record.
> >
> > Set frm = Forms!frmExcursions
> > Set ctl = frm! lboBulkList
> > For Each varItm In ctl.ItemsSelected
> > strSQL = "SELECT * FROM tblData WHERE [IDField] =" & varItm
> > Set rs = CurrentDb.OpenRecordset(strSql)
> > If rs.RecordCount > 0 Then
> > rs.FieldNameToEdit = YourNewValue
> > End if
> > Next varItm
> >
> > If you have more than one record that will return in the recordset, you[/color]
> will[color=green]
> > need a loop to handle update each record in the set.
> >
> > Hope this helps,
> > Pat
> >
> >
> >
> > "dixie" <dixiec@dogmail.com> wrote in message
> > news:gXFhc.17$Ah5.1849@nnrp1.ozemail.com.au...[color=darkred]
> > > OK Pat, I thought as much. You have confirmed what I believed was
> > > happening. My problem is that I don't know how to combine the[/color][/color][/color]
previous[color=blue][color=green]
> > type[color=darkred]
> > > of code that updates according to an ID in a list box and then this[/color][/color][/color]
type[color=blue][color=green]
> > of[color=darkred]
> > > code
> > >
> > > With rs
> > >
> > > If rs.RecordCount > 0 Then
> > > .MoveFirst
> > > Do
> > > .Edit
> > > rs!Cost = 0
> > > .Update
> > > .MoveNext
> > > Loop Until .EOF
> > > End If
> > > .Close: Set rs = Nothing
> > >
> > > End With
> > >
> > > I know that I need to step through the records in the recordset and[/color][/color][/color]
edit[color=blue][color=green][color=darkred]
> > > each field according to my ID in the list box, but I can't seem to[/color][/color]
> combine[color=green][color=darkred]
> > > the two ideas to get to the solution I want - which is for each person
> > > selected to have their specific record edited according to a what is[/color][/color][/color]
in[color=blue][color=green][color=darkred]
> > > various controls on the form.
> > >
> > > dixie
> > >
> > > ----- Original Message -----
> > > From: "Pat" <noemail@ihatespam.bum>
> > > Newsgroups: comp.databases.ms-access
> > > Sent: Thursday, April 22, 2004 11:38 AM
> > > Subject: Re: rs.Edit instead of rs.AddNew
> > >
> > >
> > > > Dixie,
> > > > You are looping through your selected items, but you are not looping
> > > through
> > > > your recordset (although looping through the recordset is only going[/color][/color]
> to[color=green][color=darkred]
> > > work
> > > > if the records are in the _exact_ same order as your listbox). rs(0)[/color][/color]
> is[color=green][color=darkred]
> > > the
> > > > first record in the returned recordset. As you loop through the[/color][/color]
> items,[color=green][color=darkred]
> > > you
> > > > are editing the same record.
> > > >
> > > > Instead, you want to select each record that cooresponds to each[/color]
> > selected[color=darkred]
> > > > listbox item and then update, or, pull all your records, find the[/color][/color][/color]
one[color=blue][color=green]
> > that[color=darkred]
> > > > matches the listbox item in the loop and then update.
> > > >
> > > > Hope that gets you started.
> > > > Pat
> > > >
> > > >
> > > >
> > > > "dixie" <dixiec@dogmail.com> wrote in message
> > > > news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...
> > > > > I have some code that adds new records into a table for each ID in[/color][/color][/color]
a[color=blue][color=green][color=darkred]
> > > list
> > > > > box when a button on a form is clicked. This works fine. My[/color][/color]
> problem[color=green][color=darkred]
> > > now
> > > > is
> > > > > that I wish to be able to edit all the records for people whose ID[/color][/color]
> is[color=green]
> > in[color=darkred]
> > > > the
> > > > > list box. I made minor changes to the code (mainly replacing[/color]
> > rs.AddNew[color=darkred]
> > > > with
> > > > > rs.Edit)and it appears to be updating only the first record and[/color][/color][/color]
then[color=blue][color=green][color=darkred]
> > > > > overwriting that record with the next, etc until it runs out of[/color][/color][/color]
ID's[color=blue][color=green]
> > in[color=darkred]
> > > > the
> > > > > list box. In other words, it is stepping through the ID's in the[/color][/color]
> list[color=green][color=darkred]
> > > > box,
> > > > > but not the records. Is there a trick to this? I have spent many[/color]
> > hours[color=darkred]
> > > > > doing minor changes and still have the same problem.
> > > > >
> > > > > The code follows (I have reduced the number of fields I am[/color][/color][/color]
updating[color=blue]
> to[color=green][color=darkred]
> > > > keep
> > > > > the size of the message down).
> > > > >
> > > > > Dim intIndex As Integer
> > > > >
> > > > > For intIndex = 0 To Me.lboBulkList.ListCount
> > > > >
> > > > > Me.lbo.BulkList.Selected(intIndex) = True
> > > > >
> > > > > Next intIndex
> > > > >
> > > > >
> > > > >
> > > > > Dim db As Database
> > > > >
> > > > > Dim rs As Recordset
> > > > >
> > > > > Dim prm As Parameter
> > > > >
> > > > > Dim qdf As QueryDef
> > > > >
> > > > >
> > > > >
> > > > > Set db = CurrentDb()
> > > > >
> > > > > Set qdf = db.QueryDefs("qryBulkEdit")
> > > > >
> > > > >
> > > > >
> > > > > For Each prm In qdf.Parameters
> > > > >
> > > > > prm.Value = Eval(prm.Name)
> > > > >
> > > > > Next prm
> > > > >
> > > > >
> > > > >
> > > > > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> > > > >
> > > > >
> > > > >
> > > > > Dim frm As Form
> > > > >
> > > > > Dim ctl As Control
> > > > >
> > > > > Dim varItm As Variant
> > > > >
> > > > >
> > > > >
> > > > > Set frm = Forms!frmExcursions
> > > > >
> > > > > Set ctl = frm! lboBulkList
> > > > >
> > > > > For Each varItm In ctl.ItemsSelected
> > > > >
> > > > >
> > > > >
> > > > > rs.Edit
> > > > >
> > > > > rs(0) = Me. lboBulkList.ItemData(varItm)
> > > > >
> > > > > rs!Date = frm!txtDate
> > > > >
> > > > > rs!Faculty = frm!cboFaculty
> > > > >
> > > > > rs!Course = frm!Course
> > > > >
> > > > > rs!Cost = frm!ExCost
> > > > >
> > > > > rs.Update
> > > > >
> > > > > Next varItm
> > > > >
> > > > > rs.Close: Set rs = Nothing
> > > > >
> > > > >
> > > > > dixie
> > > > >
> > > > >
> > > >
> > > >
> > >
> > > "Pat" <noemail@ihatespam.bum> wrote in message
> > > news:AmFhc.8861$NR5.255@fe1.texas.rr.com...
> > > > Dixie,
> > > > You are looping through your selected items, but you are not looping
> > > through
> > > > your recordset (although looping through the recordset is only going[/color][/color]
> to[color=green][color=darkred]
> > > work
> > > > if the records are in the _exact_ same order as your listbox). rs(0)[/color][/color]
> is[color=green][color=darkred]
> > > the
> > > > first record in the returned recordset. As you loop through the[/color][/color]
> items,[color=green][color=darkred]
> > > you
> > > > are editing the same record.
> > > >
> > > > Instead, you want to select each record that cooresponds to each[/color]
> > selected[color=darkred]
> > > > listbox item and then update, or, pull all your records, find the[/color][/color][/color]
one[color=blue][color=green]
> > that[color=darkred]
> > > > matches the listbox item in the loop and then update.
> > > >
> > > > Hope that gets you started.
> > > > Pat
> > > >
> > > >
> > > >
> > > > "dixie" <dixiec@dogmail.com> wrote in message
> > > > news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...
> > > > > I have some code that adds new records into a table for each ID in[/color][/color][/color]
a[color=blue][color=green][color=darkred]
> > > list
> > > > > box when a button on a form is clicked. This works fine. My[/color][/color]
> problem[color=green][color=darkred]
> > > now
> > > > is
> > > > > that I wish to be able to edit all the records for people whose ID[/color][/color]
> is[color=green]
> > in[color=darkred]
> > > > the
> > > > > list box. I made minor changes to the code (mainly replacing[/color]
> > rs.AddNew[color=darkred]
> > > > with
> > > > > rs.Edit)and it appears to be updating only the first record and[/color][/color][/color]
then[color=blue][color=green][color=darkred]
> > > > > overwriting that record with the next, etc until it runs out of[/color][/color][/color]
ID's[color=blue][color=green]
> > in[color=darkred]
> > > > the
> > > > > list box. In other words, it is stepping through the ID's in the[/color][/color]
> list[color=green][color=darkred]
> > > > box,
> > > > > but not the records. Is there a trick to this? I have spent many[/color]
> > hours[color=darkred]
> > > > > doing minor changes and still have the same problem.
> > > > >
> > > > > The code follows (I have reduced the number of fields I am[/color][/color][/color]
updating[color=blue]
> to[color=green][color=darkred]
> > > > keep
> > > > > the size of the message down).
> > > > >
> > > > > Dim intIndex As Integer
> > > > >
> > > > > For intIndex = 0 To Me.lboBulkList.ListCount
> > > > >
> > > > > Me.lbo.BulkList.Selected(intIndex) = True
> > > > >
> > > > > Next intIndex
> > > > >
> > > > >
> > > > >
> > > > > Dim db As Database
> > > > >
> > > > > Dim rs As Recordset
> > > > >
> > > > > Dim prm As Parameter
> > > > >
> > > > > Dim qdf As QueryDef
> > > > >
> > > > >
> > > > >
> > > > > Set db = CurrentDb()
> > > > >
> > > > > Set qdf = db.QueryDefs("qryBulkEdit")
> > > > >
> > > > >
> > > > >
> > > > > For Each prm In qdf.Parameters
> > > > >
> > > > > prm.Value = Eval(prm.Name)
> > > > >
> > > > > Next prm
> > > > >
> > > > >
> > > > >
> > > > > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> > > > >
> > > > >
> > > > >
> > > > > Dim frm As Form
> > > > >
> > > > > Dim ctl As Control
> > > > >
> > > > > Dim varItm As Variant
> > > > >
> > > > >
> > > > >
> > > > > Set frm = Forms!frmExcursions
> > > > >
> > > > > Set ctl = frm! lboBulkList
> > > > >
> > > > > For Each varItm In ctl.ItemsSelected
> > > > >
> > > > >
> > > > >
> > > > > rs.Edit
> > > > >
> > > > > rs(0) = Me. lboBulkList.ItemData(varItm)
> > > > >
> > > > > rs!Date = frm!txtDate
> > > > >
> > > > > rs!Faculty = frm!cboFaculty
> > > > >
> > > > > rs!Course = frm!Course
> > > > >
> > > > > rs!Cost = frm!ExCost
> > > > >
> > > > > rs.Update
> > > > >
> > > > > Next varItm
> > > > >
> > > > > rs.Close: Set rs = Nothing
> > > > >
> > > > >
> > > > > dixie
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >[/color]
> >
> >[/color]
>
>[/color] | | | | re: rs.Edit instead of rs.AddNew
The listbox contains a list of Student IDs which are text, not numbers.
There is a second column, which is a student name (the visible things in the
list box). The bound column is however the ID which is the first column.
dixie
"Pat" <noemail@ihatespam.bum> wrote in message
news:RSPhc.11620$NR5.9097@fe1.texas.rr.com...[color=blue]
> Dixie,
> It's hard to help too much without knowing what's in your listbox. Since
> the dynamic SQL statement seems to be returning the same record, it would[/color]
be[color=blue]
> best to see what you are returning from the listbox. Use debug.print to
> display your items in the listbox and the fields in the record you are
> returning within the Immediate window.
>
> For Each varItm In ctl.ItemsSelected
> strSQL = "SELECT * FROM tblExcursions WHERE [ID] =" & varItm
> Set rs = CurrentDb.OpenRecordset(strSQL)
> Debug.Print varItem
> Debug.Print Field1, Field2, Field3, etc
>
> I suspect that you have multiple columns in your listbox. This may be
> causing the problem - returning the same value from the listbox for each
> item selected, and thus retrieving the same record. If there are multiple
> columns, look at ItemsSelected in the help file. It will give you a sense
> of how to pull the right column of data you want to build your SQL[/color]
statement[color=blue]
> with.
>
> Hope this helps,
> Pat
>
>
>
> "dixie" <dixiec@dogmail.com> wrote in message
> news:hlIhc.38$Ah5.2978@nnrp1.ozemail.com.au...[color=green]
> > Ok, tried that and strangely, I get exactly the same problem - that is,[/color][/color]
it[color=blue][color=green]
> > updates the first record, but not the others. I did not understand your
> > statement about you will need a loop to update each record in the set -[/color][/color]
is[color=blue][color=green]
> > this the bit I have missed.
> >
> > The general idea is that I have a list of details for an excursion that[/color][/color]
a[color=blue][color=green]
> > group of students are going on. I print a form out for each one and I[/color]
> print[color=green]
> > a list of students attending. Now, I already have that bit working.[/color][/color]
The[color=blue][color=green]
> > bit I am trying to get here is if there was a mistake in the details or[/color]
> more[color=green]
> > information had come to hand, I wan't to be able to do a "bulk edit" on[/color]
> each[color=green]
> > entry (one per student). The ID is a unique student ID and there would[/color][/color]
be[color=blue]
> a[color=green]
> > number of them (up to 100) in the list box, lboBulkList.
> >
> > Now, this is the fine detail and is currently what I interpreted your
> > previous post into.
> >
> > Private Sub btnEditTest_Click()
> > Dim db As Database
> > Dim rs As Recordset
> > Dim strSQL As String
> >
> > Dim frm As Form
> > Dim ctl As Control
> > Dim varItm As Variant
> >
> > Set frm = Forms!frmExcursions
> > Set ctl = frm!lboBulkList
> >
> > For Each varItm In ctl.ItemsSelected
> > strSQL = "SELECT * FROM tblExcursions WHERE [ID] =" & varItm
> >
> > Set rs = CurrentDb.OpenRecordset(strSQL)
> > If rs.RecordCount > 0 Then
> > rs!Date = frm!txtDate
> > rs!ID_TCHR = frm!Teacher
> > rs!Faculty = frm!cboFaculty
> > rs!Course = frm!Course
> > rs!ExcursionType = frm!Reason
> > rs!Details = frm!Comment
> > rs!Signatory = frm!TxtSignatory
> > rs!SignatoryArea = frm!TxtSignatoryArea
> > rs!ExcursionName = frm!ExName
> > rs!Cost = frm!ExCost
> > rs!Destination = frm!ExcursionDestination
> > rs!DeparturePlace = frm!DepartFrom
> > rs!ReturningPlace = frm!ReturnTo
> > rs!DepartureTime = frm!DepartTime
> > rs!ReturningTime = frm!ReturnTime
> > rs!Representative = frm!Rep
> > rs!Uniform = frm!Dress
> > rs!Overnight = frm!Night
> > rs!CommendationRequired = frm!Commendation
> > rs!Outdoors = frm!Outdoors
> > rs!Travel = frm!TravelType
> > rs!EntryDate = frm!txtEntryDate
> > rs!Edited = -1
> > End If
> > Next varItm
> > End sub
> >
> > "Pat" <noemail@ihatespam.bum> wrote in message
> > news:IjHhc.11708$hR1.10135@fe2.texas.rr.com...[color=darkred]
> > > Dixie,
> > > Your original post and your latest reply contains a loop that looks to[/color]
> > have[color=darkred]
> > > originally been designed to loop through all records in a recordset[/color][/color][/color]
and[color=blue][color=green][color=darkred]
> > > update fields. From your description, you want to update only records
> > > listed in a listbox, for which you have their ID.
> > >
> > > If your listbox will likely contain a few items, it could create a[/color][/color]
> dynamic[color=green][color=darkred]
> > > SLQ statment that selects only the record you want to edit. Then you[/color][/color]
> can[color=green][color=darkred]
> > > edit that record.
> > >
> > > Set frm = Forms!frmExcursions
> > > Set ctl = frm! lboBulkList
> > > For Each varItm In ctl.ItemsSelected
> > > strSQL = "SELECT * FROM tblData WHERE [IDField] =" & varItm
> > > Set rs = CurrentDb.OpenRecordset(strSql)
> > > If rs.RecordCount > 0 Then
> > > rs.FieldNameToEdit = YourNewValue
> > > End if
> > > Next varItm
> > >
> > > If you have more than one record that will return in the recordset,[/color][/color][/color]
you[color=blue][color=green]
> > will[color=darkred]
> > > need a loop to handle update each record in the set.
> > >
> > > Hope this helps,
> > > Pat
> > >
> > >
> > >
> > > "dixie" <dixiec@dogmail.com> wrote in message
> > > news:gXFhc.17$Ah5.1849@nnrp1.ozemail.com.au...
> > > > OK Pat, I thought as much. You have confirmed what I believed was
> > > > happening. My problem is that I don't know how to combine the[/color][/color]
> previous[color=green][color=darkred]
> > > type
> > > > of code that updates according to an ID in a list box and then this[/color][/color]
> type[color=green][color=darkred]
> > > of
> > > > code
> > > >
> > > > With rs
> > > >
> > > > If rs.RecordCount > 0 Then
> > > > .MoveFirst
> > > > Do
> > > > .Edit
> > > > rs!Cost = 0
> > > > .Update
> > > > .MoveNext
> > > > Loop Until .EOF
> > > > End If
> > > > .Close: Set rs = Nothing
> > > >
> > > > End With
> > > >
> > > > I know that I need to step through the records in the recordset and[/color][/color]
> edit[color=green][color=darkred]
> > > > each field according to my ID in the list box, but I can't seem to[/color]
> > combine[color=darkred]
> > > > the two ideas to get to the solution I want - which is for each[/color][/color][/color]
person[color=blue][color=green][color=darkred]
> > > > selected to have their specific record edited according to a what is[/color][/color]
> in[color=green][color=darkred]
> > > > various controls on the form.
> > > >
> > > > dixie
> > > >
> > > > ----- Original Message -----
> > > > From: "Pat" <noemail@ihatespam.bum>
> > > > Newsgroups: comp.databases.ms-access
> > > > Sent: Thursday, April 22, 2004 11:38 AM
> > > > Subject: Re: rs.Edit instead of rs.AddNew
> > > >
> > > >
> > > > > Dixie,
> > > > > You are looping through your selected items, but you are not[/color][/color][/color]
looping[color=blue][color=green][color=darkred]
> > > > through
> > > > > your recordset (although looping through the recordset is only[/color][/color][/color]
going[color=blue][color=green]
> > to[color=darkred]
> > > > work
> > > > > if the records are in the _exact_ same order as your listbox).[/color][/color][/color]
rs(0)[color=blue][color=green]
> > is[color=darkred]
> > > > the
> > > > > first record in the returned recordset. As you loop through the[/color]
> > items,[color=darkred]
> > > > you
> > > > > are editing the same record.
> > > > >
> > > > > Instead, you want to select each record that cooresponds to each
> > > selected
> > > > > listbox item and then update, or, pull all your records, find the[/color][/color]
> one[color=green][color=darkred]
> > > that
> > > > > matches the listbox item in the loop and then update.
> > > > >
> > > > > Hope that gets you started.
> > > > > Pat
> > > > >
> > > > >
> > > > >
> > > > > "dixie" <dixiec@dogmail.com> wrote in message
> > > > > news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...
> > > > > > I have some code that adds new records into a table for each ID[/color][/color][/color]
in[color=blue]
> a[color=green][color=darkred]
> > > > list
> > > > > > box when a button on a form is clicked. This works fine. My[/color]
> > problem[color=darkred]
> > > > now
> > > > > is
> > > > > > that I wish to be able to edit all the records for people whose[/color][/color][/color]
ID[color=blue][color=green]
> > is[color=darkred]
> > > in
> > > > > the
> > > > > > list box. I made minor changes to the code (mainly replacing
> > > rs.AddNew
> > > > > with
> > > > > > rs.Edit)and it appears to be updating only the first record and[/color][/color]
> then[color=green][color=darkred]
> > > > > > overwriting that record with the next, etc until it runs out of[/color][/color]
> ID's[color=green][color=darkred]
> > > in
> > > > > the
> > > > > > list box. In other words, it is stepping through the ID's in[/color][/color][/color]
the[color=blue][color=green]
> > list[color=darkred]
> > > > > box,
> > > > > > but not the records. Is there a trick to this? I have spent[/color][/color][/color]
many[color=blue][color=green][color=darkred]
> > > hours
> > > > > > doing minor changes and still have the same problem.
> > > > > >
> > > > > > The code follows (I have reduced the number of fields I am[/color][/color]
> updating[color=green]
> > to[color=darkred]
> > > > > keep
> > > > > > the size of the message down).
> > > > > >
> > > > > > Dim intIndex As Integer
> > > > > >
> > > > > > For intIndex = 0 To Me.lboBulkList.ListCount
> > > > > >
> > > > > > Me.lbo.BulkList.Selected(intIndex) = True
> > > > > >
> > > > > > Next intIndex
> > > > > >
> > > > > >
> > > > > >
> > > > > > Dim db As Database
> > > > > >
> > > > > > Dim rs As Recordset
> > > > > >
> > > > > > Dim prm As Parameter
> > > > > >
> > > > > > Dim qdf As QueryDef
> > > > > >
> > > > > >
> > > > > >
> > > > > > Set db = CurrentDb()
> > > > > >
> > > > > > Set qdf = db.QueryDefs("qryBulkEdit")
> > > > > >
> > > > > >
> > > > > >
> > > > > > For Each prm In qdf.Parameters
> > > > > >
> > > > > > prm.Value = Eval(prm.Name)
> > > > > >
> > > > > > Next prm
> > > > > >
> > > > > >
> > > > > >
> > > > > > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> > > > > >
> > > > > >
> > > > > >
> > > > > > Dim frm As Form
> > > > > >
> > > > > > Dim ctl As Control
> > > > > >
> > > > > > Dim varItm As Variant
> > > > > >
> > > > > >
> > > > > >
> > > > > > Set frm = Forms!frmExcursions
> > > > > >
> > > > > > Set ctl = frm! lboBulkList
> > > > > >
> > > > > > For Each varItm In ctl.ItemsSelected
> > > > > >
> > > > > >
> > > > > >
> > > > > > rs.Edit
> > > > > >
> > > > > > rs(0) = Me. lboBulkList.ItemData(varItm)
> > > > > >
> > > > > > rs!Date = frm!txtDate
> > > > > >
> > > > > > rs!Faculty = frm!cboFaculty
> > > > > >
> > > > > > rs!Course = frm!Course
> > > > > >
> > > > > > rs!Cost = frm!ExCost
> > > > > >
> > > > > > rs.Update
> > > > > >
> > > > > > Next varItm
> > > > > >
> > > > > > rs.Close: Set rs = Nothing
> > > > > >
> > > > > >
> > > > > > dixie
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > > "Pat" <noemail@ihatespam.bum> wrote in message
> > > > news:AmFhc.8861$NR5.255@fe1.texas.rr.com...
> > > > > Dixie,
> > > > > You are looping through your selected items, but you are not[/color][/color][/color]
looping[color=blue][color=green][color=darkred]
> > > > through
> > > > > your recordset (although looping through the recordset is only[/color][/color][/color]
going[color=blue][color=green]
> > to[color=darkred]
> > > > work
> > > > > if the records are in the _exact_ same order as your listbox).[/color][/color][/color]
rs(0)[color=blue][color=green]
> > is[color=darkred]
> > > > the
> > > > > first record in the returned recordset. As you loop through the[/color]
> > items,[color=darkred]
> > > > you
> > > > > are editing the same record.
> > > > >
> > > > > Instead, you want to select each record that cooresponds to each
> > > selected
> > > > > listbox item and then update, or, pull all your records, find the[/color][/color]
> one[color=green][color=darkred]
> > > that
> > > > > matches the listbox item in the loop and then update.
> > > > >
> > > > > Hope that gets you started.
> > > > > Pat
> > > > >
> > > > >
> > > > >
> > > > > "dixie" <dixiec@dogmail.com> wrote in message
> > > > > news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...
> > > > > > I have some code that adds new records into a table for each ID[/color][/color][/color]
in[color=blue]
> a[color=green][color=darkred]
> > > > list
> > > > > > box when a button on a form is clicked. This works fine. My[/color]
> > problem[color=darkred]
> > > > now
> > > > > is
> > > > > > that I wish to be able to edit all the records for people whose[/color][/color][/color]
ID[color=blue][color=green]
> > is[color=darkred]
> > > in
> > > > > the
> > > > > > list box. I made minor changes to the code (mainly replacing
> > > rs.AddNew
> > > > > with
> > > > > > rs.Edit)and it appears to be updating only the first record and[/color][/color]
> then[color=green][color=darkred]
> > > > > > overwriting that record with the next, etc until it runs out of[/color][/color]
> ID's[color=green][color=darkred]
> > > in
> > > > > the
> > > > > > list box. In other words, it is stepping through the ID's in[/color][/color][/color]
the[color=blue][color=green]
> > list[color=darkred]
> > > > > box,
> > > > > > but not the records. Is there a trick to this? I have spent[/color][/color][/color]
many[color=blue][color=green][color=darkred]
> > > hours
> > > > > > doing minor changes and still have the same problem.
> > > > > >
> > > > > > The code follows (I have reduced the number of fields I am[/color][/color]
> updating[color=green]
> > to[color=darkred]
> > > > > keep
> > > > > > the size of the message down).
> > > > > >
> > > > > > Dim intIndex As Integer
> > > > > >
> > > > > > For intIndex = 0 To Me.lboBulkList.ListCount
> > > > > >
> > > > > > Me.lbo.BulkList.Selected(intIndex) = True
> > > > > >
> > > > > > Next intIndex
> > > > > >
> > > > > >
> > > > > >
> > > > > > Dim db As Database
> > > > > >
> > > > > > Dim rs As Recordset
> > > > > >
> > > > > > Dim prm As Parameter
> > > > > >
> > > > > > Dim qdf As QueryDef
> > > > > >
> > > > > >
> > > > > >
> > > > > > Set db = CurrentDb()
> > > > > >
> > > > > > Set qdf = db.QueryDefs("qryBulkEdit")
> > > > > >
> > > > > >
> > > > > >
> > > > > > For Each prm In qdf.Parameters
> > > > > >
> > > > > > prm.Value = Eval(prm.Name)
> > > > > >
> > > > > > Next prm
> > > > > >
> > > > > >
> > > > > >
> > > > > > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> > > > > >
> > > > > >
> > > > > >
> > > > > > Dim frm As Form
> > > > > >
> > > > > > Dim ctl As Control
> > > > > >
> > > > > > Dim varItm As Variant
> > > > > >
> > > > > >
> > > > > >
> > > > > > Set frm = Forms!frmExcursions
> > > > > >
> > > > > > Set ctl = frm! lboBulkList
> > > > > >
> > > > > > For Each varItm In ctl.ItemsSelected
> > > > > >
> > > > > >
> > > > > >
> > > > > > rs.Edit
> > > > > >
> > > > > > rs(0) = Me. lboBulkList.ItemData(varItm)
> > > > > >
> > > > > > rs!Date = frm!txtDate
> > > > > >
> > > > > > rs!Faculty = frm!cboFaculty
> > > > > >
> > > > > > rs!Course = frm!Course
> > > > > >
> > > > > > rs!Cost = frm!ExCost
> > > > > >
> > > > > > rs.Update
> > > > > >
> > > > > > Next varItm
> > > > > >
> > > > > > rs.Close: Set rs = Nothing
> > > > > >
> > > > > >
> > > > > > dixie
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >[/color]
> >
> >[/color]
>
>[/color] | | | | re: rs.Edit instead of rs.AddNew
Hi Joe,
I tried your idea, but I get an error 3464 - Data type mismatch in criteria
expression, which I presume is the WHERE [ID] =" &
Me.lboBulkList.ItemData(0)
I played around with variations, but couldn't get it to work.
The ID field is a text field if this helps and is the first of two columns
in the list box as well as being the bound field in the Row Source of the
listbox.
You are definitely right about the database design. It is an old one I have
inherited and I am at this stage just trying to add the ability to change
the details of an excursion and produce a new form for all students
containing those changes. Database design changes are on the agenda, but
further down the track.
This is what I have now.
Private Sub btnEditTest2_Click()
Dim db As Database
Dim rs As Recordset
Dim strSQL As String
Dim frm As Form
Dim ctl As Control
Dim varItm As Variant
Set frm = Forms!frmExcursions
Set ctl = frm!lboBulkList
Dim i As Integer
For i = 0 To Me.lboBulkList.ListCount - 1
strSQL = "SELECT * FROM tblExcursions WHERE [ID] =" &
Me.lboBulkList.ItemData(0)
Set rs = CurrentDb.OpenRecordset(strSQL) <-- It is halting with this
line hilighted
If rs.RecordCount > 0 Then
rs!Date = frm!txtDate
rs!ID_TCHR = frm!Teacher
rs!Faculty = frm!cboFaculty
rs!Course = frm!Course
rs!ExcursionType = frm!Reason
rs!Details = frm!Comment
rs!Signatory = frm!TxtSignatory
rs!SignatoryArea = frm!TxtSignatoryArea
rs!ExcursionName = frm!ExName
rs!Cost = frm!ExCost
rs!Destination = frm!ExcursionDestination
rs!DeparturePlace = frm!DepartFrom
rs!ReturningPlace = frm!ReturnTo
rs!DepartureTime = frm!DepartTime
rs!ReturningTime = frm!ReturnTime
rs!Representative = frm!Rep
rs!Uniform = frm!Dress
rs!Overnight = frm!Night
rs!CommendationRequired = frm!Commendation
rs!Outdoors = frm!Outdoors
rs!Travel = frm!TravelType
rs!EntryDate = frm!txtEntryDate
rs!Edited = -1
End If
Next i
End Sub
Can you see what is wrong?
dixie
"Joe Black" <joeblack99@hotmail.com> wrote in message
news:5yQhc.2415$_s.68732@news.xtra.co.nz...[color=blue]
> Hi Dixie
>
> In your first version of the code you first select all items in the[/color]
listbox[color=blue]
> and then iterate through all the selected items.
> If you want to process all the list items, it is not necessary to select
> them all first.
>
> Instead of "For Each varItm In ctl.ItemsSelected"
> you can do something like:
>
> Dim i As Integer
> For i = 0 To Me.lboBulkList.ListCount - 1
>
> strSQL = "SELECT * FROM tblExcursions WHERE [ID] =" &
> Me.lboBulkList.ItemData(0)
> Set rs = CurrentDb.OpenRecordset(strSQL)
> If rs.RecordCount > 0 Then
> rs!Date = frm!txtDate
> ...
> end if
> Next i
>
> You haven't allowed for the possibility that rs.RecordCount might be > 1.
>
> I also wonder whether the design of your database could be improved. If[/color]
the[color=blue]
> details of an Excursion are needed to be changed, you should only have to
> change the details in one row of a table, not repeatedly change the same
> details for many rows.
>
> Regards - Joe
>
> "dixie" <dixiec@dogmail.com> wrote in message
> news:hlIhc.38$Ah5.2978@nnrp1.ozemail.com.au...[color=green]
> > Ok, tried that and strangely, I get exactly the same problem - that is,[/color][/color]
it[color=blue][color=green]
> > updates the first record, but not the others. I did not understand your
> > statement about you will need a loop to update each record in the set -[/color][/color]
is[color=blue][color=green]
> > this the bit I have missed.
> >
> > The general idea is that I have a list of details for an excursion that[/color][/color]
a[color=blue][color=green]
> > group of students are going on. I print a form out for each one and I[/color]
> print[color=green]
> > a list of students attending. Now, I already have that bit working.[/color][/color]
The[color=blue][color=green]
> > bit I am trying to get here is if there was a mistake in the details or[/color]
> more[color=green]
> > information had come to hand, I wan't to be able to do a "bulk edit" on[/color]
> each[color=green]
> > entry (one per student). The ID is a unique student ID and there would[/color][/color]
be[color=blue]
> a[color=green]
> > number of them (up to 100) in the list box, lboBulkList.
> >
> > Now, this is the fine detail and is currently what I interpreted your
> > previous post into.
> >
> > Private Sub btnEditTest_Click()
> > Dim db As Database
> > Dim rs As Recordset
> > Dim strSQL As String
> >
> > Dim frm As Form
> > Dim ctl As Control
> > Dim varItm As Variant
> >
> > Set frm = Forms!frmExcursions
> > Set ctl = frm!lboBulkList
> >
> > For Each varItm In ctl.ItemsSelected
> > strSQL = "SELECT * FROM tblExcursions WHERE [ID] =" & varItm
> >
> > Set rs = CurrentDb.OpenRecordset(strSQL)
> > If rs.RecordCount > 0 Then
> > rs!Date = frm!txtDate
> > rs!ID_TCHR = frm!Teacher
> > rs!Faculty = frm!cboFaculty
> > rs!Course = frm!Course
> > rs!ExcursionType = frm!Reason
> > rs!Details = frm!Comment
> > rs!Signatory = frm!TxtSignatory
> > rs!SignatoryArea = frm!TxtSignatoryArea
> > rs!ExcursionName = frm!ExName
> > rs!Cost = frm!ExCost
> > rs!Destination = frm!ExcursionDestination
> > rs!DeparturePlace = frm!DepartFrom
> > rs!ReturningPlace = frm!ReturnTo
> > rs!DepartureTime = frm!DepartTime
> > rs!ReturningTime = frm!ReturnTime
> > rs!Representative = frm!Rep
> > rs!Uniform = frm!Dress
> > rs!Overnight = frm!Night
> > rs!CommendationRequired = frm!Commendation
> > rs!Outdoors = frm!Outdoors
> > rs!Travel = frm!TravelType
> > rs!EntryDate = frm!txtEntryDate
> > rs!Edited = -1
> > End If
> > Next varItm
> > End sub
> >
> > "Pat" <noemail@ihatespam.bum> wrote in message
> > news:IjHhc.11708$hR1.10135@fe2.texas.rr.com...[color=darkred]
> > > Dixie,
> > > Your original post and your latest reply contains a loop that looks to[/color]
> > have[color=darkred]
> > > originally been designed to loop through all records in a recordset[/color][/color][/color]
and[color=blue][color=green][color=darkred]
> > > update fields. From your description, you want to update only records
> > > listed in a listbox, for which you have their ID.
> > >
> > > If your listbox will likely contain a few items, it could create a[/color][/color]
> dynamic[color=green][color=darkred]
> > > SLQ statment that selects only the record you want to edit. Then you[/color][/color]
> can[color=green][color=darkred]
> > > edit that record.
> > >
> > > Set frm = Forms!frmExcursions
> > > Set ctl = frm! lboBulkList
> > > For Each varItm In ctl.ItemsSelected
> > > strSQL = "SELECT * FROM tblData WHERE [IDField] =" & varItm
> > > Set rs = CurrentDb.OpenRecordset(strSql)
> > > If rs.RecordCount > 0 Then
> > > rs.FieldNameToEdit = YourNewValue
> > > End if
> > > Next varItm
> > >
> > > If you have more than one record that will return in the recordset,[/color][/color][/color]
you[color=blue][color=green]
> > will[color=darkred]
> > > need a loop to handle update each record in the set.
> > >
> > > Hope this helps,
> > > Pat
> > >
> > >
> > >
> > > "dixie" <dixiec@dogmail.com> wrote in message
> > > news:gXFhc.17$Ah5.1849@nnrp1.ozemail.com.au...
> > > > OK Pat, I thought as much. You have confirmed what I believed was
> > > > happening. My problem is that I don't know how to combine the[/color][/color]
> previous[color=green][color=darkred]
> > > type
> > > > of code that updates according to an ID in a list box and then this[/color][/color]
> type[color=green][color=darkred]
> > > of
> > > > code
> > > >
> > > > With rs
> > > >
> > > > If rs.RecordCount > 0 Then
> > > > .MoveFirst
> > > > Do
> > > > .Edit
> > > > rs!Cost = 0
> > > > .Update
> > > > .MoveNext
> > > > Loop Until .EOF
> > > > End If
> > > > .Close: Set rs = Nothing
> > > >
> > > > End With
> > > >
> > > > I know that I need to step through the records in the recordset and[/color][/color]
> edit[color=green][color=darkred]
> > > > each field according to my ID in the list box, but I can't seem to[/color]
> > combine[color=darkred]
> > > > the two ideas to get to the solution I want - which is for each[/color][/color][/color]
person[color=blue][color=green][color=darkred]
> > > > selected to have their specific record edited according to a what is[/color][/color]
> in[color=green][color=darkred]
> > > > various controls on the form.
> > > >
> > > > dixie
> > > >
> > > > ----- Original Message -----
> > > > From: "Pat" <noemail@ihatespam.bum>
> > > > Newsgroups: comp.databases.ms-access
> > > > Sent: Thursday, April 22, 2004 11:38 AM
> > > > Subject: Re: rs.Edit instead of rs.AddNew
> > > >
> > > >
> > > > > Dixie,
> > > > > You are looping through your selected items, but you are not[/color][/color][/color]
looping[color=blue][color=green][color=darkred]
> > > > through
> > > > > your recordset (although looping through the recordset is only[/color][/color][/color]
going[color=blue][color=green]
> > to[color=darkred]
> > > > work
> > > > > if the records are in the _exact_ same order as your listbox).[/color][/color][/color]
rs(0)[color=blue][color=green]
> > is[color=darkred]
> > > > the
> > > > > first record in the returned recordset. As you loop through the[/color]
> > items,[color=darkred]
> > > > you
> > > > > are editing the same record.
> > > > >
> > > > > Instead, you want to select each record that cooresponds to each
> > > selected
> > > > > listbox item and then update, or, pull all your records, find the[/color][/color]
> one[color=green][color=darkred]
> > > that
> > > > > matches the listbox item in the loop and then update.
> > > > >
> > > > > Hope that gets you started.
> > > > > Pat
> > > > >
> > > > >
> > > > >
> > > > > "dixie" <dixiec@dogmail.com> wrote in message
> > > > > news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...
> > > > > > I have some code that adds new records into a table for each ID[/color][/color][/color]
in[color=blue]
> a[color=green][color=darkred]
> > > > list
> > > > > > box when a button on a form is clicked. This works fine. My[/color]
> > problem[color=darkred]
> > > > now
> > > > > is
> > > > > > that I wish to be able to edit all the records for people whose[/color][/color][/color]
ID[color=blue][color=green]
> > is[color=darkred]
> > > in
> > > > > the
> > > > > > list box. I made minor changes to the code (mainly replacing
> > > rs.AddNew
> > > > > with
> > > > > > rs.Edit)and it appears to be updating only the first record and[/color][/color]
> then[color=green][color=darkred]
> > > > > > overwriting that record with the next, etc until it runs out of[/color][/color]
> ID's[color=green][color=darkred]
> > > in
> > > > > the
> > > > > > list box. In other words, it is stepping through the ID's in[/color][/color][/color]
the[color=blue][color=green]
> > list[color=darkred]
> > > > > box,
> > > > > > but not the records. Is there a trick to this? I have spent[/color][/color][/color]
many[color=blue][color=green][color=darkred]
> > > hours
> > > > > > doing minor changes and still have the same problem.
> > > > > >
> > > > > > The code follows (I have reduced the number of fields I am[/color][/color]
> updating[color=green]
> > to[color=darkred]
> > > > > keep
> > > > > > the size of the message down).
> > > > > >
> > > > > > Dim intIndex As Integer
> > > > > >
> > > > > > For intIndex = 0 To Me.lboBulkList.ListCount
> > > > > >
> > > > > > Me.lbo.BulkList.Selected(intIndex) = True
> > > > > >
> > > > > > Next intIndex
> > > > > >
> > > > > >
> > > > > >
> > > > > > Dim db As Database
> > > > > >
> > > > > > Dim rs As Recordset
> > > > > >
> > > > > > Dim prm As Parameter
> > > > > >
> > > > > > Dim qdf As QueryDef
> > > > > >
> > > > > >
> > > > > >
> > > > > > Set db = CurrentDb()
> > > > > >
> > > > > > Set qdf = db.QueryDefs("qryBulkEdit")
> > > > > >
> > > > > >
> > > > > >
> > > > > > For Each prm In qdf.Parameters
> > > > > >
> > > > > > prm.Value = Eval(prm.Name)
> > > > > >
> > > > > > Next prm
> > > > > >
> > > > > >
> > > > > >
> > > > > > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> > > > > >
> > > > > >
> > > > > >
> > > > > > Dim frm As Form
> > > > > >
> > > > > > Dim ctl As Control
> > > > > >
> > > > > > Dim varItm As Variant
> > > > > >
> > > > > >
> > > > > >
> > > > > > Set frm = Forms!frmExcursions
> > > > > >
> > > > > > Set ctl = frm! lboBulkList
> > > > > >
> > > > > > For Each varItm In ctl.ItemsSelected
> > > > > >
> > > > > >
> > > > > >
> > > > > > rs.Edit
> > > > > >
> > > > > > rs(0) = Me. lboBulkList.ItemData(varItm)
> > > > > >
> > > > > > rs!Date = frm!txtDate
> > > > > >
> > > > > > rs!Faculty = frm!cboFaculty
> > > > > >
> > > > > > rs!Course = frm!Course
> > > > > >
> > > > > > rs!Cost = frm!ExCost
> > > > > >
> > > > > > rs.Update
> > > > > >
> > > > > > Next varItm
> > > > > >
> > > > > > rs.Close: Set rs = Nothing
> > > > > >
> > > > > >
> > > > > > dixie
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > > "Pat" <noemail@ihatespam.bum> wrote in message
> > > > news:AmFhc.8861$NR5.255@fe1.texas.rr.com...
> > > > > Dixie,
> > > > > You are looping through your selected items, but you are not[/color][/color][/color]
looping[color=blue][color=green][color=darkred]
> > > > through
> > > > > your recordset (although looping through the recordset is only[/color][/color][/color]
going[color=blue][color=green]
> > to[color=darkred]
> > > > work
> > > > > if the records are in the _exact_ same order as your listbox).[/color][/color][/color]
rs(0)[color=blue][color=green]
> > is[color=darkred]
> > > > the
> > > > > first record in the returned recordset. As you loop through the[/color]
> > items,[color=darkred]
> > > > you
> > > > > are editing the same record.
> > > > >
> > > > > Instead, you want to select each record that cooresponds to each
> > > selected
> > > > > listbox item and then update, or, pull all your records, find the[/color][/color]
> one[color=green][color=darkred]
> > > that
> > > > > matches the listbox item in the loop and then update.
> > > > >
> > > > > Hope that gets you started.
> > > > > Pat
> > > > >
> > > > >
> > > > >
> > > > > "dixie" <dixiec@dogmail.com> wrote in message
> > > > > news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...
> > > > > > I have some code that adds new records into a table for each ID[/color][/color][/color]
in[color=blue]
> a[color=green][color=darkred]
> > > > list
> > > > > > box when a button on a form is clicked. This works fine. My[/color]
> > problem[color=darkred]
> > > > now
> > > > > is
> > > > > > that I wish to be able to edit all the records for people whose[/color][/color][/color]
ID[color=blue][color=green]
> > is[color=darkred]
> > > in
> > > > > the
> > > > > > list box. I made minor changes to the code (mainly replacing
> > > rs.AddNew
> > > > > with
> > > > > > rs.Edit)and it appears to be updating only the first record and[/color][/color]
> then[color=green][color=darkred]
> > > > > > overwriting that record with the next, etc until it runs out of[/color][/color]
> ID's[color=green][color=darkred]
> > > in
> > > > > the
> > > > > > list box. In other words, it is stepping through the ID's in[/color][/color][/color]
the[color=blue][color=green]
> > list[color=darkred]
> > > > > box,
> > > > > > but not the records. Is there a trick to this? I have spent[/color][/color][/color]
many[color=blue][color=green][color=darkred]
> > > hours
> > > > > > doing minor changes and still have the same problem.
> > > > > >
> > > > > > The code follows (I have reduced the number of fields I am[/color][/color]
> updating[color=green]
> > to[color=darkred]
> > > > > keep
> > > > > > the size of the message down).
> > > > > >
> > > > > > Dim intIndex As Integer
> > > > > >
> > > > > > For intIndex = 0 To Me.lboBulkList.ListCount
> > > > > >
> > > > > > Me.lbo.BulkList.Selected(intIndex) = True
> > > > > >
> > > > > > Next intIndex
> > > > > >
> > > > > >
> > > > > >
> > > > > > Dim db As Database
> > > > > >
> > > > > > Dim rs As Recordset
> > > > > >
> > > > > > Dim prm As Parameter
> > > > > >
> > > > > > Dim qdf As QueryDef
> > > > > >
> > > > > >
> > > > > >
> > > > > > Set db = CurrentDb()
> > > > > >
> > > > > > Set qdf = db.QueryDefs("qryBulkEdit")
> > > > > >
> > > > > >
> > > > > >
> > > > > > For Each prm In qdf.Parameters
> > > > > >
> > > > > > prm.Value = Eval(prm.Name)
> > > > > >
> > > > > > Next prm
> > > > > >
> > > > > >
> > > > > >
> > > > > > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> > > > > >
> > > > > >
> > > > > >
> > > > > > Dim frm As Form
> > > > > >
> > > > > > Dim ctl As Control
> > > > > >
> > > > > > Dim varItm As Variant
> > > > > >
> > > > > >
> > > > > >
> > > > > > Set frm = Forms!frmExcursions
> > > > > >
> > > > > > Set ctl = frm! lboBulkList
> > > > > >
> > > > > > For Each varItm In ctl.ItemsSelected
> > > > > >
> > > > > >
> > > > > >
> > > > > > rs.Edit
> > > > > >
> > > > > > rs(0) = Me. lboBulkList.ItemData(varItm)
> > > > > >
> > > > > > rs!Date = frm!txtDate
> > > > > >
> > > > > > rs!Faculty = frm!cboFaculty
> > > > > >
> > > > > > rs!Course = frm!Course
> > > > > >
> > > > > > rs!Cost = frm!ExCost
> > > > > >
> > > > > > rs.Update
> > > > > >
> > > > > > Next varItm
> > > > > >
> > > > > > rs.Close: Set rs = Nothing
> > > > > >
> > > > > >
> > > > > > dixie
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >[/color]
> >
> >[/color]
>
>[/color] | | | | re: rs.Edit instead of rs.AddNew
Joe
Further to that last message, I refined my strSQL into a query that picks up
only those students in the current excursion. I am now getting the error
message - Runtime error 3061 Too few parameters. Expected 1.
It is still halting on the same line which is the line
Set rs = CurrentDb.OpenRecordset(strSQL)
I can see the ID of the first student if I hover over the strSQL line.
dixie
"dixie" <dixiec@dogmail.com> wrote in message
news:TcWhc.169$Ah5.9387@nnrp1.ozemail.com.au...[color=blue]
> Hi Joe,
>
> I tried your idea, but I get an error 3464 - Data type mismatch in[/color]
criteria[color=blue]
> expression, which I presume is the WHERE [ID] =" &
> Me.lboBulkList.ItemData(0)
>
> I played around with variations, but couldn't get it to work.
>
> The ID field is a text field if this helps and is the first of two columns
> in the list box as well as being the bound field in the Row Source of the
> listbox.
>
> You are definitely right about the database design. It is an old one I[/color]
have[color=blue]
> inherited and I am at this stage just trying to add the ability to change
> the details of an excursion and produce a new form for all students
> containing those changes. Database design changes are on the agenda, but
> further down the track.
>
> This is what I have now.
>
> Private Sub btnEditTest2_Click()
>
> Dim db As Database
> Dim rs As Recordset
> Dim strSQL As String
>
> Dim frm As Form
> Dim ctl As Control
> Dim varItm As Variant
>
> Set frm = Forms!frmExcursions
> Set ctl = frm!lboBulkList
>
> Dim i As Integer
> For i = 0 To Me.lboBulkList.ListCount - 1
>
> strSQL = "SELECT * FROM tblExcursions WHERE [ID] =" &
> Me.lboBulkList.ItemData(0)
>
> Set rs = CurrentDb.OpenRecordset(strSQL) <-- It is halting with[/color]
this[color=blue]
> line hilighted
> If rs.RecordCount > 0 Then
> rs!Date = frm!txtDate
> rs!ID_TCHR = frm!Teacher
> rs!Faculty = frm!cboFaculty
> rs!Course = frm!Course
> rs!ExcursionType = frm!Reason
> rs!Details = frm!Comment
> rs!Signatory = frm!TxtSignatory
> rs!SignatoryArea = frm!TxtSignatoryArea
> rs!ExcursionName = frm!ExName
> rs!Cost = frm!ExCost
> rs!Destination = frm!ExcursionDestination
> rs!DeparturePlace = frm!DepartFrom
> rs!ReturningPlace = frm!ReturnTo
> rs!DepartureTime = frm!DepartTime
> rs!ReturningTime = frm!ReturnTime
> rs!Representative = frm!Rep
> rs!Uniform = frm!Dress
> rs!Overnight = frm!Night
> rs!CommendationRequired = frm!Commendation
> rs!Outdoors = frm!Outdoors
> rs!Travel = frm!TravelType
> rs!EntryDate = frm!txtEntryDate
> rs!Edited = -1
> End If
> Next i
>
>
> End Sub
>
> Can you see what is wrong?
>
> dixie
>
>
> "Joe Black" <joeblack99@hotmail.com> wrote in message
> news:5yQhc.2415$_s.68732@news.xtra.co.nz...[color=green]
> > Hi Dixie
> >
> > In your first version of the code you first select all items in the[/color]
> listbox[color=green]
> > and then iterate through all the selected items.
> > If you want to process all the list items, it is not necessary to select
> > them all first.
> >
> > Instead of "For Each varItm In ctl.ItemsSelected"
> > you can do something like:
> >
> > Dim i As Integer
> > For i = 0 To Me.lboBulkList.ListCount - 1
> >
> > strSQL = "SELECT * FROM tblExcursions WHERE [ID] =" &
> > Me.lboBulkList.ItemData(0)
> > Set rs = CurrentDb.OpenRecordset(strSQL)
> > If rs.RecordCount > 0 Then
> > rs!Date = frm!txtDate
> > ...
> > end if
> > Next i
> >
> > You haven't allowed for the possibility that rs.RecordCount might be >[/color][/color]
1.[color=blue][color=green]
> >
> > I also wonder whether the design of your database could be improved. If[/color]
> the[color=green]
> > details of an Excursion are needed to be changed, you should only have[/color][/color]
to[color=blue][color=green]
> > change the details in one row of a table, not repeatedly change the same
> > details for many rows.
> >
> > Regards - Joe
> >
> > "dixie" <dixiec@dogmail.com> wrote in message
> > news:hlIhc.38$Ah5.2978@nnrp1.ozemail.com.au...[color=darkred]
> > > Ok, tried that and strangely, I get exactly the same problem - that[/color][/color][/color]
is,[color=blue]
> it[color=green][color=darkred]
> > > updates the first record, but not the others. I did not understand[/color][/color][/color]
your[color=blue][color=green][color=darkred]
> > > statement about you will need a loop to update each record in the[/color][/color][/color]
set -[color=blue]
> is[color=green][color=darkred]
> > > this the bit I have missed.
> > >
> > > The general idea is that I have a list of details for an excursion[/color][/color][/color]
that[color=blue]
> a[color=green][color=darkred]
> > > group of students are going on. I print a form out for each one and I[/color]
> > print[color=darkred]
> > > a list of students attending. Now, I already have that bit working.[/color][/color]
> The[color=green][color=darkred]
> > > bit I am trying to get here is if there was a mistake in the details[/color][/color][/color]
or[color=blue][color=green]
> > more[color=darkred]
> > > information had come to hand, I wan't to be able to do a "bulk edit"[/color][/color][/color]
on[color=blue][color=green]
> > each[color=darkred]
> > > entry (one per student). The ID is a unique student ID and there[/color][/color][/color]
would[color=blue]
> be[color=green]
> > a[color=darkred]
> > > number of them (up to 100) in the list box, lboBulkList.
> > >
> > > Now, this is the fine detail and is currently what I interpreted your
> > > previous post into.
> > >
> > > Private Sub btnEditTest_Click()
> > > Dim db As Database
> > > Dim rs As Recordset
> > > Dim strSQL As String
> > >
> > > Dim frm As Form
> > > Dim ctl As Control
> > > Dim varItm As Variant
> > >
> > > Set frm = Forms!frmExcursions
> > > Set ctl = frm!lboBulkList
> > >
> > > For Each varItm In ctl.ItemsSelected
> > > strSQL = "SELECT * FROM tblExcursions WHERE [ID] =" & varItm
> > >
> > > Set rs = CurrentDb.OpenRecordset(strSQL)
> > > If rs.RecordCount > 0 Then
> > > rs!Date = frm!txtDate
> > > rs!ID_TCHR = frm!Teacher
> > > rs!Faculty = frm!cboFaculty
> > > rs!Course = frm!Course
> > > rs!ExcursionType = frm!Reason
> > > rs!Details = frm!Comment
> > > rs!Signatory = frm!TxtSignatory
> > > rs!SignatoryArea = frm!TxtSignatoryArea
> > > rs!ExcursionName = frm!ExName
> > > rs!Cost = frm!ExCost
> > > rs!Destination = frm!ExcursionDestination
> > > rs!DeparturePlace = frm!DepartFrom
> > > rs!ReturningPlace = frm!ReturnTo
> > > rs!DepartureTime = frm!DepartTime
> > > rs!ReturningTime = frm!ReturnTime
> > > rs!Representative = frm!Rep
> > > rs!Uniform = frm!Dress
> > > rs!Overnight = frm!Night
> > > rs!CommendationRequired = frm!Commendation
> > > rs!Outdoors = frm!Outdoors
> > > rs!Travel = frm!TravelType
> > > rs!EntryDate = frm!txtEntryDate
> > > rs!Edited = -1
> > > End If
> > > Next varItm
> > > End sub
> > >
> > > "Pat" <noemail@ihatespam.bum> wrote in message
> > > news:IjHhc.11708$hR1.10135@fe2.texas.rr.com...
> > > > Dixie,
> > > > Your original post and your latest reply contains a loop that looks[/color][/color][/color]
to[color=blue][color=green][color=darkred]
> > > have
> > > > originally been designed to loop through all records in a recordset[/color][/color]
> and[color=green][color=darkred]
> > > > update fields. From your description, you want to update only[/color][/color][/color]
records[color=blue][color=green][color=darkred]
> > > > listed in a listbox, for which you have their ID.
> > > >
> > > > If your listbox will likely contain a few items, it could create a[/color]
> > dynamic[color=darkred]
> > > > SLQ statment that selects only the record you want to edit. Then[/color][/color][/color]
you[color=blue][color=green]
> > can[color=darkred]
> > > > edit that record.
> > > >
> > > > Set frm = Forms!frmExcursions
> > > > Set ctl = frm! lboBulkList
> > > > For Each varItm In ctl.ItemsSelected
> > > > strSQL = "SELECT * FROM tblData WHERE [IDField] =" & varItm
> > > > Set rs = CurrentDb.OpenRecordset(strSql)
> > > > If rs.RecordCount > 0 Then
> > > > rs.FieldNameToEdit = YourNewValue
> > > > End if
> > > > Next varItm
> > > >
> > > > If you have more than one record that will return in the recordset,[/color][/color]
> you[color=green][color=darkred]
> > > will
> > > > need a loop to handle update each record in the set.
> > > >
> > > > Hope this helps,
> > > > Pat
> > > >
> > > >
> > > >
> > > > "dixie" <dixiec@dogmail.com> wrote in message
> > > > news:gXFhc.17$Ah5.1849@nnrp1.ozemail.com.au...
> > > > > OK Pat, I thought as much. You have confirmed what I believed was
> > > > > happening. My problem is that I don't know how to combine the[/color]
> > previous[color=darkred]
> > > > type
> > > > > of code that updates according to an ID in a list box and then[/color][/color][/color]
this[color=blue][color=green]
> > type[color=darkred]
> > > > of
> > > > > code
> > > > >
> > > > > With rs
> > > > >
> > > > > If rs.RecordCount > 0 Then
> > > > > .MoveFirst
> > > > > Do
> > > > > .Edit
> > > > > rs!Cost = 0
> > > > > .Update
> > > > > .MoveNext
> > > > > Loop Until .EOF
> > > > > End If
> > > > > .Close: Set rs = Nothing
> > > > >
> > > > > End With
> > > > >
> > > > > I know that I need to step through the records in the recordset[/color][/color][/color]
and[color=blue][color=green]
> > edit[color=darkred]
> > > > > each field according to my ID in the list box, but I can't seem to
> > > combine
> > > > > the two ideas to get to the solution I want - which is for each[/color][/color]
> person[color=green][color=darkred]
> > > > > selected to have their specific record edited according to a what[/color][/color][/color]
is[color=blue][color=green]
> > in[color=darkred]
> > > > > various controls on the form.
> > > > >
> > > > > dixie
> > > > >
> > > > > ----- Original Message -----
> > > > > From: "Pat" <noemail@ihatespam.bum>
> > > > > Newsgroups: comp.databases.ms-access
> > > > > Sent: Thursday, April 22, 2004 11:38 AM
> > > > > Subject: Re: rs.Edit instead of rs.AddNew
> > > > >
> > > > >
> > > > > > Dixie,
> > > > > > You are looping through your selected items, but you are not[/color][/color]
> looping[color=green][color=darkred]
> > > > > through
> > > > > > your recordset (although looping through the recordset is only[/color][/color]
> going[color=green][color=darkred]
> > > to
> > > > > work
> > > > > > if the records are in the _exact_ same order as your listbox).[/color][/color]
> rs(0)[color=green][color=darkred]
> > > is
> > > > > the
> > > > > > first record in the returned recordset. As you loop through the
> > > items,
> > > > > you
> > > > > > are editing the same record.
> > > > > >
> > > > > > Instead, you want to select each record that cooresponds to each
> > > > selected
> > > > > > listbox item and then update, or, pull all your records, find[/color][/color][/color]
the[color=blue][color=green]
> > one[color=darkred]
> > > > that
> > > > > > matches the listbox item in the loop and then update.
> > > > > >
> > > > > > Hope that gets you started.
> > > > > > Pat
> > > > > >
> > > > > >
> > > > > >
> > > > > > "dixie" <dixiec@dogmail.com> wrote in message
> > > > > > news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...
> > > > > > > I have some code that adds new records into a table for each[/color][/color][/color]
ID[color=blue]
> in[color=green]
> > a[color=darkred]
> > > > > list
> > > > > > > box when a button on a form is clicked. This works fine. My
> > > problem
> > > > > now
> > > > > > is
> > > > > > > that I wish to be able to edit all the records for people[/color][/color][/color]
whose[color=blue]
> ID[color=green][color=darkred]
> > > is
> > > > in
> > > > > > the
> > > > > > > list box. I made minor changes to the code (mainly replacing
> > > > rs.AddNew
> > > > > > with
> > > > > > > rs.Edit)and it appears to be updating only the first record[/color][/color][/color]
and[color=blue][color=green]
> > then[color=darkred]
> > > > > > > overwriting that record with the next, etc until it runs out[/color][/color][/color]
of[color=blue][color=green]
> > ID's[color=darkred]
> > > > in
> > > > > > the
> > > > > > > list box. In other words, it is stepping through the ID's in[/color][/color]
> the[color=green][color=darkred]
> > > list
> > > > > > box,
> > > > > > > but not the records. Is there a trick to this? I have spent[/color][/color]
> many[color=green][color=darkred]
> > > > hours
> > > > > > > doing minor changes and still have the same problem.
> > > > > > >
> > > > > > > The code follows (I have reduced the number of fields I am[/color]
> > updating[color=darkred]
> > > to
> > > > > > keep
> > > > > > > the size of the message down).
> > > > > > >
> > > > > > > Dim intIndex As Integer
> > > > > > >
> > > > > > > For intIndex = 0 To Me.lboBulkList.ListCount
> > > > > > >
> > > > > > > Me.lbo.BulkList.Selected(intIndex) = True
> > > > > > >
> > > > > > > Next intIndex
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Dim db As Database
> > > > > > >
> > > > > > > Dim rs As Recordset
> > > > > > >
> > > > > > > Dim prm As Parameter
> > > > > > >
> > > > > > > Dim qdf As QueryDef
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Set db = CurrentDb()
> > > > > > >
> > > > > > > Set qdf = db.QueryDefs("qryBulkEdit")
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > For Each prm In qdf.Parameters
> > > > > > >
> > > > > > > prm.Value = Eval(prm.Name)
> > > > > > >
> > > > > > > Next prm
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Dim frm As Form
> > > > > > >
> > > > > > > Dim ctl As Control
> > > > > > >
> > > > > > > Dim varItm As Variant
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Set frm = Forms!frmExcursions
> > > > > > >
> > > > > > > Set ctl = frm! lboBulkList
> > > > > > >
> > > > > > > For Each varItm In ctl.ItemsSelected
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > rs.Edit
> > > > > > >
> > > > > > > rs(0) = Me. lboBulkList.ItemData(varItm)
> > > > > > >
> > > > > > > rs!Date = frm!txtDate
> > > > > > >
> > > > > > > rs!Faculty = frm!cboFaculty
> > > > > > >
> > > > > > > rs!Course = frm!Course
> > > > > > >
> > > > > > > rs!Cost = frm!ExCost
> > > > > > >
> > > > > > > rs.Update
> > > > > > >
> > > > > > > Next varItm
> > > > > > >
> > > > > > > rs.Close: Set rs = Nothing
> > > > > > >
> > > > > > >
> > > > > > > dixie
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > > "Pat" <noemail@ihatespam.bum> wrote in message
> > > > > news:AmFhc.8861$NR5.255@fe1.texas.rr.com...
> > > > > > Dixie,
> > > > > > You are looping through your selected items, but you are not[/color][/color]
> looping[color=green][color=darkred]
> > > > > through
> > > > > > your recordset (although looping through the recordset is only[/color][/color]
> going[color=green][color=darkred]
> > > to
> > > > > work
> > > > > > if the records are in the _exact_ same order as your listbox).[/color][/color]
> rs(0)[color=green][color=darkred]
> > > is
> > > > > the
> > > > > > first record in the returned recordset. As you loop through the
> > > items,
> > > > > you
> > > > > > are editing the same record.
> > > > > >
> > > > > > Instead, you want to select each record that cooresponds to each
> > > > selected
> > > > > > listbox item and then update, or, pull all your records, find[/color][/color][/color]
the[color=blue][color=green]
> > one[color=darkred]
> > > > that
> > > > > > matches the listbox item in the loop and then update.
> > > > > >
> > > > > > Hope that gets you started.
> > > > > > Pat
> > > > > >
> > > > > >
> > > > > >
> > > > > > "dixie" <dixiec@dogmail.com> wrote in message
> > > > > > news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...
> > > > > > > I have some code that adds new records into a table for each[/color][/color][/color]
ID[color=blue]
> in[color=green]
> > a[color=darkred]
> > > > > list
> > > > > > > box when a button on a form is clicked. This works fine. My
> > > problem
> > > > > now
> > > > > > is
> > > > > > > that I wish to be able to edit all the records for people[/color][/color][/color]
whose[color=blue]
> ID[color=green][color=darkred]
> > > is
> > > > in
> > > > > > the
> > > > > > > list box. I made minor changes to the code (mainly replacing
> > > > rs.AddNew
> > > > > > with
> > > > > > > rs.Edit)and it appears to be updating only the first record[/color][/color][/color]
and[color=blue][color=green]
> > then[color=darkred]
> > > > > > > overwriting that record with the next, etc until it runs out[/color][/color][/color]
of[color=blue][color=green]
> > ID's[color=darkred]
> > > > in
> > > > > > the
> > > > > > > list box. In other words, it is stepping through the ID's in[/color][/color]
> the[color=green][color=darkred]
> > > list
> > > > > > box,
> > > > > > > but not the records. Is there a trick to this? I have spent[/color][/color]
> many[color=green][color=darkred]
> > > > hours
> > > > > > > doing minor changes and still have the same problem.
> > > > > > >
> > > > > > > The code follows (I have reduced the number of fields I am[/color]
> > updating[color=darkred]
> > > to
> > > > > > keep
> > > > > > > the size of the message down).
> > > > > > >
> > > > > > > Dim intIndex As Integer
> > > > > > >
> > > > > > > For intIndex = 0 To Me.lboBulkList.ListCount
> > > > > > >
> > > > > > > Me.lbo.BulkList.Selected(intIndex) = True
> > > > > > >
> > > > > > > Next intIndex
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Dim db As Database
> > > > > > >
> > > > > > > Dim rs As Recordset
> > > > > > >
> > > > > > > Dim prm As Parameter
> > > > > > >
> > > > > > > Dim qdf As QueryDef
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Set db = CurrentDb()
> > > > > > >
> > > > > > > Set qdf = db.QueryDefs("qryBulkEdit")
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > For Each prm In qdf.Parameters
> > > > > > >
> > > > > > > prm.Value = Eval(prm.Name)
> > > > > > >
> > > > > > > Next prm
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Dim frm As Form
> > > > > > >
> > > > > > > Dim ctl As Control
> > > > > > >
> > > > > > > Dim varItm As Variant
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Set frm = Forms!frmExcursions
> > > > > > >
> > > > > > > Set ctl = frm! lboBulkList
> > > > > > >
> > > > > > > For Each varItm In ctl.ItemsSelected
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > rs.Edit
> > > > > > >
> > > > > > > rs(0) = Me. lboBulkList.ItemData(varItm)
> > > > > > >
> > > > > > > rs!Date = frm!txtDate
> > > > > > >
> > > > > > > rs!Faculty = frm!cboFaculty
> > > > > > >
> > > > > > > rs!Course = frm!Course
> > > > > > >
> > > > > > > rs!Cost = frm!ExCost
> > > > > > >
> > > > > > > rs.Update
> > > > > > >
> > > > > > > Next varItm
> > > > > > >
> > > > > > > rs.Close: Set rs = Nothing
> > > > > > >
> > > > > > >
> > > > > > > dixie
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >[/color]
> >
> >[/color]
>
>[/color] | | | | re: rs.Edit instead of rs.AddNew
"dixie" <dixiec@dogmail.com> wrote in
news:h5Xhc.177$Ah5.9654@nnrp1.ozemail.com.au:
[color=blue]
> Joe
> Further to that last message, I refined my strSQL into a query
> that picks up only those students in the current excursion. I
> am now getting the error message - Runtime error 3061 Too few
> parameters. Expected 1.
>
> It is still halting on the same line which is the line
> Set rs = CurrentDb.OpenRecordset(strSQL)
>[/color]
Since your ID 8is a text type, your sql should include some extra
quotes[color=blue][color=green]
>> strSQL = "SELECT * FROM tblExcursions WHERE [ID] =" &
>> Me.lboBulkList.ItemData(0)[/color][/color]
strSQL = "SELECT * FROM tblExcursions WHERE [ID] =""" &
Me.lboBulkList.ItemData(0) & """"
Second, after you perform your updates, you need to do rs.update
to commit the changes.You also should have a rs.edit before
making changes to the record.
e.g[color=blue][color=green]
>> If rs.RecordCount > 0 Then[/color][/color]
rs.edit[color=blue][color=green]
>> rs!Date = frm!txtDate
>> rs!ID_TCHR = frm!Teacher[/color][/color]
...[color=blue][color=green]
>> rs!Edited = -1[/color][/color]
rs.update[color=blue][color=green]
>> End If[/color][/color]
[color=blue]
> I can see the ID of the first student if I hover over the
> strSQL line.
>
> dixie
>[color=green]
>>
>> Can you see what is wrong?
>>
>> dixie[/color][/color] | | | | re: rs.Edit instead of rs.AddNew
Hi dixie
I didn't expect the ID field to be text.
Text needs to be enclosed in speech marks.
Try changing to:
WHERE [ID] = " & Chr(34) & Me.lboBulkList.ItemData(0) & Chr(34) & ";"
Regards - Joe
"dixie" <dixiec@dogmail.com> wrote in message
news:TcWhc.169$Ah5.9387@nnrp1.ozemail.com.au...[color=blue]
> Hi Joe,
>
> I tried your idea, but I get an error 3464 - Data type mismatch in[/color]
criteria[color=blue]
> expression, which I presume is the WHERE [ID] =" &
> Me.lboBulkList.ItemData(0)
>
> I played around with variations, but couldn't get it to work.
>
> The ID field is a text field if this helps and is the first of two columns
> in the list box as well as being the bound field in the Row Source of the
> listbox.
>
> You are definitely right about the database design. It is an old one I[/color]
have[color=blue]
> inherited and I am at this stage just trying to add the ability to change
> the details of an excursion and produce a new form for all students
> containing those changes. Database design changes are on the agenda, but
> further down the track.
>
> This is what I have now.
>
> Private Sub btnEditTest2_Click()
>
> Dim db As Database
> Dim rs As Recordset
> Dim strSQL As String
>
> Dim frm As Form
> Dim ctl As Control
> Dim varItm As Variant
>
> Set frm = Forms!frmExcursions
> Set ctl = frm!lboBulkList
>
> Dim i As Integer
> For i = 0 To Me.lboBulkList.ListCount - 1
>
> strSQL = "SELECT * FROM tblExcursions WHERE [ID] =" &
> Me.lboBulkList.ItemData(0)
>
> Set rs = CurrentDb.OpenRecordset(strSQL) <-- It is halting with[/color]
this[color=blue]
> line hilighted
> If rs.RecordCount > 0 Then
> rs!Date = frm!txtDate
> rs!ID_TCHR = frm!Teacher
> rs!Faculty = frm!cboFaculty
> rs!Course = frm!Course
> rs!ExcursionType = frm!Reason
> rs!Details = frm!Comment
> rs!Signatory = frm!TxtSignatory
> rs!SignatoryArea = frm!TxtSignatoryArea
> rs!ExcursionName = frm!ExName
> rs!Cost = frm!ExCost
> rs!Destination = frm!ExcursionDestination
> rs!DeparturePlace = frm!DepartFrom
> rs!ReturningPlace = frm!ReturnTo
> rs!DepartureTime = frm!DepartTime
> rs!ReturningTime = frm!ReturnTime
> rs!Representative = frm!Rep
> rs!Uniform = frm!Dress
> rs!Overnight = frm!Night
> rs!CommendationRequired = frm!Commendation
> rs!Outdoors = frm!Outdoors
> rs!Travel = frm!TravelType
> rs!EntryDate = frm!txtEntryDate
> rs!Edited = -1
> End If
> Next i
>
>
> End Sub
>
> Can you see what is wrong?
>
> dixie
>
>
> "Joe Black" <joeblack99@hotmail.com> wrote in message
> news:5yQhc.2415$_s.68732@news.xtra.co.nz...[color=green]
> > Hi Dixie
> >
> > In your first version of the code you first select all items in the[/color]
> listbox[color=green]
> > and then iterate through all the selected items.
> > If you want to process all the list items, it is not necessary to select
> > them all first.
> >
> > Instead of "For Each varItm In ctl.ItemsSelected"
> > you can do something like:
> >
> > Dim i As Integer
> > For i = 0 To Me.lboBulkList.ListCount - 1
> >
> > strSQL = "SELECT * FROM tblExcursions WHERE [ID] =" &
> > Me.lboBulkList.ItemData(0)
> > Set rs = CurrentDb.OpenRecordset(strSQL)
> > If rs.RecordCount > 0 Then
> > rs!Date = frm!txtDate
> > ...
> > end if
> > Next i
> >
> > You haven't allowed for the possibility that rs.RecordCount might be >[/color][/color]
1.[color=blue][color=green]
> >
> > I also wonder whether the design of your database could be improved. If[/color]
> the[color=green]
> > details of an Excursion are needed to be changed, you should only have[/color][/color]
to[color=blue][color=green]
> > change the details in one row of a table, not repeatedly change the same
> > details for many rows.
> >
> > Regards - Joe
> >
> > "dixie" <dixiec@dogmail.com> wrote in message
> > news:hlIhc.38$Ah5.2978@nnrp1.ozemail.com.au...[color=darkred]
> > > Ok, tried that and strangely, I get exactly the same problem - that[/color][/color][/color]
is,[color=blue]
> it[color=green][color=darkred]
> > > updates the first record, but not the others. I did not understand[/color][/color][/color]
your[color=blue][color=green][color=darkred]
> > > statement about you will need a loop to update each record in the[/color][/color][/color]
set -[color=blue]
> is[color=green][color=darkred]
> > > this the bit I have missed.
> > >
> > > The general idea is that I have a list of details for an excursion[/color][/color][/color]
that[color=blue]
> a[color=green][color=darkred]
> > > group of students are going on. I print a form out for each one and I[/color]
> > print[color=darkred]
> > > a list of students attending. Now, I already have that bit working.[/color][/color]
> The[color=green][color=darkred]
> > > bit I am trying to get here is if there was a mistake in the details[/color][/color][/color]
or[color=blue][color=green]
> > more[color=darkred]
> > > information had come to hand, I wan't to be able to do a "bulk edit"[/color][/color][/color]
on[color=blue][color=green]
> > each[color=darkred]
> > > entry (one per student). The ID is a unique student ID and there[/color][/color][/color]
would[color=blue]
> be[color=green]
> > a[color=darkred]
> > > number of them (up to 100) in the list box, lboBulkList.
> > >
> > > Now, this is the fine detail and is currently what I interpreted your
> > > previous post into.
> > >
> > > Private Sub btnEditTest_Click()
> > > Dim db As Database
> > > Dim rs As Recordset
> > > Dim strSQL As String
> > >
> > > Dim frm As Form
> > > Dim ctl As Control
> > > Dim varItm As Variant
> > >
> > > Set frm = Forms!frmExcursions
> > > Set ctl = frm!lboBulkList
> > >
> > > For Each varItm In ctl.ItemsSelected
> > > strSQL = "SELECT * FROM tblExcursions WHERE [ID] =" & varItm
> > >
> > > Set rs = CurrentDb.OpenRecordset(strSQL)
> > > If rs.RecordCount > 0 Then
> > > rs!Date = frm!txtDate
> > > rs!ID_TCHR = frm!Teacher
> > > rs!Faculty = frm!cboFaculty
> > > rs!Course = frm!Course
> > > rs!ExcursionType = frm!Reason
> > > rs!Details = frm!Comment
> > > rs!Signatory = frm!TxtSignatory
> > > rs!SignatoryArea = frm!TxtSignatoryArea
> > > rs!ExcursionName = frm!ExName
> > > rs!Cost = frm!ExCost
> > > rs!Destination = frm!ExcursionDestination
> > > rs!DeparturePlace = frm!DepartFrom
> > > rs!ReturningPlace = frm!ReturnTo
> > > rs!DepartureTime = frm!DepartTime
> > > rs!ReturningTime = frm!ReturnTime
> > > rs!Representative = frm!Rep
> > > rs!Uniform = frm!Dress
> > > rs!Overnight = frm!Night
> > > rs!CommendationRequired = frm!Commendation
> > > rs!Outdoors = frm!Outdoors
> > > rs!Travel = frm!TravelType
> > > rs!EntryDate = frm!txtEntryDate
> > > rs!Edited = -1
> > > End If
> > > Next varItm
> > > End sub
> > >
> > > "Pat" <noemail@ihatespam.bum> wrote in message
> > > news:IjHhc.11708$hR1.10135@fe2.texas.rr.com...
> > > > Dixie,
> > > > Your original post and your latest reply contains a loop that looks[/color][/color][/color]
to[color=blue][color=green][color=darkred]
> > > have
> > > > originally been designed to loop through all records in a recordset[/color][/color]
> and[color=green][color=darkred]
> > > > update fields. From your description, you want to update only[/color][/color][/color]
records[color=blue][color=green][color=darkred]
> > > > listed in a listbox, for which you have their ID.
> > > >
> > > > If your listbox will likely contain a few items, it could create a[/color]
> > dynamic[color=darkred]
> > > > SLQ statment that selects only the record you want to edit. Then[/color][/color][/color]
you[color=blue][color=green]
> > can[color=darkred]
> > > > edit that record.
> > > >
> > > > Set frm = Forms!frmExcursions
> > > > Set ctl = frm! lboBulkList
> > > > For Each varItm In ctl.ItemsSelected
> > > > strSQL = "SELECT * FROM tblData WHERE [IDField] =" & varItm
> > > > Set rs = CurrentDb.OpenRecordset(strSql)
> > > > If rs.RecordCount > 0 Then
> > > > rs.FieldNameToEdit = YourNewValue
> > > > End if
> > > > Next varItm
> > > >
> > > > If you have more than one record that will return in the recordset,[/color][/color]
> you[color=green][color=darkred]
> > > will
> > > > need a loop to handle update each record in the set.
> > > >
> > > > Hope this helps,
> > > > Pat
> > > >
> > > >
> > > >
> > > > "dixie" <dixiec@dogmail.com> wrote in message
> > > > news:gXFhc.17$Ah5.1849@nnrp1.ozemail.com.au...
> > > > > OK Pat, I thought as much. You have confirmed what I believed was
> > > > > happening. My problem is that I don't know how to combine the[/color]
> > previous[color=darkred]
> > > > type
> > > > > of code that updates according to an ID in a list box and then[/color][/color][/color]
this[color=blue][color=green]
> > type[color=darkred]
> > > > of
> > > > > code
> > > > >
> > > > > With rs
> > > > >
> > > > > If rs.RecordCount > 0 Then
> > > > > .MoveFirst
> > > > > Do
> > > > > .Edit
> > > > > rs!Cost = 0
> > > > > .Update
> > > > > .MoveNext
> > > > > Loop Until .EOF
> > > > > End If
> > > > > .Close: Set rs = Nothing
> > > > >
> > > > > End With
> > > > >
> > > > > I know that I need to step through the records in the recordset[/color][/color][/color]
and[color=blue][color=green]
> > edit[color=darkred]
> > > > > each field according to my ID in the list box, but I can't seem to
> > > combine
> > > > > the two ideas to get to the solution I want - which is for each[/color][/color]
> person[color=green][color=darkred]
> > > > > selected to have their specific record edited according to a what[/color][/color][/color]
is[color=blue][color=green]
> > in[color=darkred]
> > > > > various controls on the form.
> > > > >
> > > > > dixie
> > > > >
> > > > > ----- Original Message -----
> > > > > From: "Pat" <noemail@ihatespam.bum>
> > > > > Newsgroups: comp.databases.ms-access
> > > > > Sent: Thursday, April 22, 2004 11:38 AM
> > > > > Subject: Re: rs.Edit instead of rs.AddNew
> > > > >
> > > > >
> > > > > > Dixie,
> > > > > > You are looping through your selected items, but you are not[/color][/color]
> looping[color=green][color=darkred]
> > > > > through
> > > > > > your recordset (although looping through the recordset is only[/color][/color]
> going[color=green][color=darkred]
> > > to
> > > > > work
> > > > > > if the records are in the _exact_ same order as your listbox).[/color][/color]
> rs(0)[color=green][color=darkred]
> > > is
> > > > > the
> > > > > > first record in the returned recordset. As you loop through the
> > > items,
> > > > > you
> > > > > > are editing the same record.
> > > > > >
> > > > > > Instead, you want to select each record that cooresponds to each
> > > > selected
> > > > > > listbox item and then update, or, pull all your records, find[/color][/color][/color]
the[color=blue][color=green]
> > one[color=darkred]
> > > > that
> > > > > > matches the listbox item in the loop and then update.
> > > > > >
> > > > > > Hope that gets you started.
> > > > > > Pat
> > > > > >
> > > > > >
> > > > > >
> > > > > > "dixie" <dixiec@dogmail.com> wrote in message
> > > > > > news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...
> > > > > > > I have some code that adds new records into a table for each[/color][/color][/color]
ID[color=blue]
> in[color=green]
> > a[color=darkred]
> > > > > list
> > > > > > > box when a button on a form is clicked. This works fine. My
> > > problem
> > > > > now
> > > > > > is
> > > > > > > that I wish to be able to edit all the records for people[/color][/color][/color]
whose[color=blue]
> ID[color=green][color=darkred]
> > > is
> > > > in
> > > > > > the
> > > > > > > list box. I made minor changes to the code (mainly replacing
> > > > rs.AddNew
> > > > > > with
> > > > > > > rs.Edit)and it appears to be updating only the first record[/color][/color][/color]
and[color=blue][color=green]
> > then[color=darkred]
> > > > > > > overwriting that record with the next, etc until it runs out[/color][/color][/color]
of[color=blue][color=green]
> > ID's[color=darkred]
> > > > in
> > > > > > the
> > > > > > > list box. In other words, it is stepping through the ID's in[/color][/color]
> the[color=green][color=darkred]
> > > list
> > > > > > box,
> > > > > > > but not the records. Is there a trick to this? I have spent[/color][/color]
> many[color=green][color=darkred]
> > > > hours
> > > > > > > doing minor changes and still have the same problem.
> > > > > > >
> > > > > > > The code follows (I have reduced the number of fields I am[/color]
> > updating[color=darkred]
> > > to
> > > > > > keep
> > > > > > > the size of the message down).
> > > > > > >
> > > > > > > Dim intIndex As Integer
> > > > > > >
> > > > > > > For intIndex = 0 To Me.lboBulkList.ListCount
> > > > > > >
> > > > > > > Me.lbo.BulkList.Selected(intIndex) = True
> > > > > > >
> > > > > > > Next intIndex
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Dim db As Database
> > > > > > >
> > > > > > > Dim rs As Recordset
> > > > > > >
> > > > > > > Dim prm As Parameter
> > > > > > >
> > > > > > > Dim qdf As QueryDef
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Set db = CurrentDb()
> > > > > > >
> > > > > > > Set qdf = db.QueryDefs("qryBulkEdit")
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > For Each prm In qdf.Parameters
> > > > > > >
> > > > > > > prm.Value = Eval(prm.Name)
> > > > > > >
> > > > > > > Next prm
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Dim frm As Form
> > > > > > >
> > > > > > > Dim ctl As Control
> > > > > > >
> > > > > > > Dim varItm As Variant
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Set frm = Forms!frmExcursions
> > > > > > >
> > > > > > > Set ctl = frm! lboBulkList
> > > > > > >
> > > > > > > For Each varItm In ctl.ItemsSelected
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > rs.Edit
> > > > > > >
> > > > > > > rs(0) = Me. lboBulkList.ItemData(varItm)
> > > > > > >
> > > > > > > rs!Date = frm!txtDate
> > > > > > >
> > > > > > > rs!Faculty = frm!cboFaculty
> > > > > > >
> > > > > > > rs!Course = frm!Course
> > > > > > >
> > > > > > > rs!Cost = frm!ExCost
> > > > > > >
> > > > > > > rs.Update
> > > > > > >
> > > > > > > Next varItm
> > > > > > >
> > > > > > > rs.Close: Set rs = Nothing
> > > > > > >
> > > > > > >
> > > > > > > dixie
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > > "Pat" <noemail@ihatespam.bum> wrote in message
> > > > > news:AmFhc.8861$NR5.255@fe1.texas.rr.com...
> > > > > > Dixie,
> > > > > > You are looping through your selected items, but you are not[/color][/color]
> looping[color=green][color=darkred]
> > > > > through
> > > > > > your recordset (although looping through the recordset is only[/color][/color]
> going[color=green][color=darkred]
> > > to
> > > > > work
> > > > > > if the records are in the _exact_ same order as your listbox).[/color][/color]
> rs(0)[color=green][color=darkred]
> > > is
> > > > > the
> > > > > > first record in the returned recordset. As you loop through the
> > > items,
> > > > > you
> > > > > > are editing the same record.
> > > > > >
> > > > > > Instead, you want to select each record that cooresponds to each
> > > > selected
> > > > > > listbox item and then update, or, pull all your records, find[/color][/color][/color]
the[color=blue][color=green]
> > one[color=darkred]
> > > > that
> > > > > > matches the listbox item in the loop and then update.
> > > > > >
> > > > > > Hope that gets you started.
> > > > > > Pat
> > > > > >
> > > > > >
> > > > > >
> > > > > > "dixie" <dixiec@dogmail.com> wrote in message
> > > > > > news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...
> > > > > > > I have some code that adds new records into a table for each[/color][/color][/color]
ID[color=blue]
> in[color=green]
> > a[color=darkred]
> > > > > list
> > > > > > > box when a button on a form is clicked. This works fine. My
> > > problem
> > > > > now
> > > > > > is
> > > > > > > that I wish to be able to edit all the records for people[/color][/color][/color]
whose[color=blue]
> ID[color=green][color=darkred]
> > > is
> > > > in
> > > > > > the
> > > > > > > list box. I made minor changes to the code (mainly replacing
> > > > rs.AddNew
> > > > > > with
> > > > > > > rs.Edit)and it appears to be updating only the first record[/color][/color][/color]
and[color=blue][color=green]
> > then[color=darkred]
> > > > > > > overwriting that record with the next, etc until it runs out[/color][/color][/color]
of[color=blue][color=green]
> > ID's[color=darkred]
> > > > in
> > > > > > the
> > > > > > > list box. In other words, it is stepping through the ID's in[/color][/color]
> the[color=green][color=darkred]
> > > list
> > > > > > box,
> > > > > > > but not the records. Is there a trick to this? I have spent[/color][/color]
> many[color=green][color=darkred]
> > > > hours
> > > > > > > doing minor changes and still have the same problem.
> > > > > > >
> > > > > > > The code follows (I have reduced the number of fields I am[/color]
> > updating[color=darkred]
> > > to
> > > > > > keep
> > > > > > > the size of the message down).
> > > > > > >
> > > > > > > Dim intIndex As Integer
> > > > > > >
> > > > > > > For intIndex = 0 To Me.lboBulkList.ListCount
> > > > > > >
> > > > > > > Me.lbo.BulkList.Selected(intIndex) = True
> > > > > > >
> > > > > > > Next intIndex
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Dim db As Database
> > > > > > >
> > > > > > > Dim rs As Recordset
> > > > > > >
> > > > > > > Dim prm As Parameter
> > > > > > >
> > > > > > > Dim qdf As QueryDef
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Set db = CurrentDb()
> > > > > > >
> > > > > > > Set qdf = db.QueryDefs("qryBulkEdit")
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > For Each prm In qdf.Parameters
> > > > > > >
> > > > > > > prm.Value = Eval(prm.Name)
> > > > > > >
> > > > > > > Next prm
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Dim frm As Form
> > > > > > >
> > > > > > > Dim ctl As Control
> > > > > > >
> > > > > > > Dim varItm As Variant
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Set frm = Forms!frmExcursions
> > > > > > >
> > > > > > > Set ctl = frm! lboBulkList
> > > > > > >
> > > > > > > For Each varItm In ctl.ItemsSelected
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > rs.Edit
> > > > > > >
> > > > > > > rs(0) = Me. lboBulkList.ItemData(varItm)
> > > > > > >
> > > > > > > rs!Date = frm!txtDate
> > > > > > >
> > > > > > > rs!Faculty = frm!cboFaculty
> > > > > > >
> > > > > > > rs!Course = frm!Course
> > > > > > >
> > > > > > > rs!Cost = frm!ExCost
> > > > > > >
> > > > > > > rs.Update
> > > > > > >
> > > > > > > Next varItm
> > > > > > >
> > > > > > > rs.Close: Set rs = Nothing
> > > > > > >
> > > > > > >
> > > > > > > dixie
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >[/color]
> >
> >[/color]
>
>[/color] | | | | re: rs.Edit instead of rs.AddNew
Thanks Bob, that was the problem I think, I have text ID's, because some of
them have an alphnumeric combination in them. I have put back the rs.edit
and rs.update that I originally had, but had been removed while I was trying
other ideas.
dixie
"Bob Quintal" <bquintal@generation.net> wrote in message
news:a5a8dc5a790fa800603c33da18dc433c@news.teranew s.com...[color=blue]
> "dixie" <dixiec@dogmail.com> wrote in
> news:h5Xhc.177$Ah5.9654@nnrp1.ozemail.com.au:
>[color=green]
> > Joe
> > Further to that last message, I refined my strSQL into a query
> > that picks up only those students in the current excursion. I
> > am now getting the error message - Runtime error 3061 Too few
> > parameters. Expected 1.
> >
> > It is still halting on the same line which is the line
> > Set rs = CurrentDb.OpenRecordset(strSQL)
> >[/color]
> Since your ID 8is a text type, your sql should include some extra
> quotes[color=green][color=darkred]
> >> strSQL = "SELECT * FROM tblExcursions WHERE [ID] =" &
> >> Me.lboBulkList.ItemData(0)[/color][/color]
>
> strSQL = "SELECT * FROM tblExcursions WHERE [ID] =""" &
> Me.lboBulkList.ItemData(0) & """"
>
> Second, after you perform your updates, you need to do rs.update
> to commit the changes.You also should have a rs.edit before
> making changes to the record.
>
> e.g[color=green][color=darkred]
> >> If rs.RecordCount > 0 Then[/color][/color]
> rs.edit[color=green][color=darkred]
> >> rs!Date = frm!txtDate
> >> rs!ID_TCHR = frm!Teacher[/color][/color]
> ...[color=green][color=darkred]
> >> rs!Edited = -1[/color][/color]
> rs.update[color=green][color=darkred]
> >> End If[/color][/color]
>
>[color=green]
> > I can see the ID of the first student if I hover over the
> > strSQL line.
> >
> > dixie
> >[color=darkred]
> >>
> >> Can you see what is wrong?
> >>
> >> dixie[/color][/color][/color] | | | | re: rs.Edit instead of rs.AddNew
"Pat" <noemail@ihatespam.bum> wrote in
news:IjHhc.11708$hR1.10135@fe2.texas.rr.com:
[color=blue]
> Set frm = Forms!frmExcursions
> Set ctl = frm! lboBulkList
> For Each varItm In ctl.ItemsSelected
> strSQL = "SELECT * FROM tblData WHERE [IDField] =" & varItm
> Set rs = CurrentDb.OpenRecordset(strSql)
> If rs.RecordCount > 0 Then
> rs.FieldNameToEdit = YourNewValue
> End if
> Next varItm[/color]
That's invalid syntax for referring to fields in recordset -- you
must use the !, not the dot.
--
David W. Fenton http://www.bway.net/~dfenton
dfenton at bway dot net http://www.bway.net/~dfassoc | | | | re: rs.Edit instead of rs.AddNew
"dixie" <dixiec@dogmail.com> wrote in
news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au:
[color=blue]
> I have some code that adds new records into a table for each ID in
> a list box when a button on a form is clicked. This works fine.
> My problem now is that I wish to be able to edit all the records
> for people whose ID is in the list box. I made minor changes to
> the code (mainly replacing rs.AddNew with rs.Edit)and it appears
> to be updating only the first record and then overwriting that
> record with the next, etc until it runs out of ID's in the list
> box. In other words, it is stepping through the ID's in the list
> box, but not the records. Is there a trick to this? I have spent
> many hours doing minor changes and still have the same problem.
>
> The code follows (I have reduced the number of fields I am
> updating to keep the size of the message down).[/color]
Declare your variables all in one place, at the top of the
subroutine, instead of defining them as needed. Doing the latter
makes it harder to read the code.
[color=blue]
> Dim intIndex As Integer
> Dim db As Database
> Dim rs As Recordset
> Dim prm As Parameter
> Dim qdf As QueryDef
> Dim frm As Form
> Dim ctl As Control
> Dim varItm As Variant
>
> For intIndex = 0 To Me.lboBulkList.ListCount
> Me.lbo.BulkList.Selected(intIndex) = True
> Next intIndex[/color]
I never use the . operator for controls (and I assume that's a typo
with the period in the middle of its name), so I'd do this instead:
Me!lboBulkList.Selected(intIndex) = True
[color=blue]
> Set db = CurrentDb()
> Set qdf = db.QueryDefs("qryBulkEdit")[/color]
Why not use a non-parameter query and skip all the QueryDef stuff
and simply open a recordset using SQL with an appropriate WHERE
clause?
The only real justification for using parameters is performance (or
maybe because the back end is not Jet).
[color=blue]
> For Each prm In qdf.Parameters
> prm.Value = Eval(prm.Name)
> Next prm[/color]
Are the parameters references to the controls on your form? If not,
I don't see how they are getting filled out here.
[color=blue]
> Set rs = qdf.OpenRecordset(dbOpenDynaset)
> Set frm = Forms!frmExcursions
> Set ctl = frm!lboBulkList
> For Each varItm In ctl.ItemsSelected[/color]
The problem here is that you haven't navigated to the correct
record. What you want to do is:
rs.FindFirst "[ID]='" & ctl.ItemData(varItm) & "'"
But if it's a multi-column listbox, you may need to specify the
column (I always have to look this up when I'm using listboxes).
Then you need to see if a match was found:
If Not rs.NoMatch Then
[edit your fields]
End If
All the editing should be inside this If structure, because
otherwise, no navigation from the previous record will have taken
place. Of course, you probably want an error handler for this, too,
as it's a condition that oughtn't really occur.
[color=blue]
> rs.Edit
> rs(0) = Me.lboBulkList.ItemData(varItm)[/color]
???
Does this refer to the first record, or the first field?
Secondly, why not use ctl.ItemData(varItm) instead of retyping the
control name? There's not much point in using a Control variable if
you're only going to use it once.
[color=blue]
> rs!Date = frm!txtDate
> rs!Faculty = frm!cboFaculty
> rs!Course = frm!Course
> rs!Cost = frm!ExCost
> rs.Update
> Next varItm
>
> rs.Close: Set rs = Nothing[/color]
You could also do all of this with a single SQL update statement.
How?
By creating a WHERE clause that would be something like:
WHERE ID IN ([list of IDs constructed from your listbox])
You already know how to loop through your listbox's .ItemSelected
collection, so it would be something like this:
Dim strIDList As String
Set ctl = frm!lboBulkList
For Each varItm In ctl.ItemsSelected
strIDList = strIDList & "', '" & ctl.ItemData(varItm)
Next varItm
strIDList = "'" & Mid(strIDList,4) & "'"
Then construct your SQL:
Dim strSQL As String
strSQL="UPDATE tblStudents As S SET S.Date=#" & frm!txtDate & "# "
strSQL=strSQL & "S.Faculty='" & frm!cmbFaculty & "' "
strSQL=strSQL & "S.Course='" & frm!Course & "' "
strSQL=strSQL & "S.Cost=" & frm!Cost
strSQL=strSQL & " WHERE S.ID IN (" & strIDList & ");"
CurrentDB.Execute(strSQL, dbFailOnError)
No need to open recordsets or querydefs, and it will be much faster,
as it will do a SQL update. This will also hold locks on the
table/records for a much shorter period of time.
--
David W. Fenton http://www.bway.net/~dfenton
dfenton at bway dot net http://www.bway.net/~dfassoc | | | | re: rs.Edit instead of rs.AddNew
That was a great reply. This is why I read this newsgroup and participate
when I can.
"David W. Fenton" <dXXXfenton@bway.net.invalid> wrote in message
news:Xns94D3EED663A7Fdfentonbwaynetinvali@24.168.1 28.86...[color=blue]
> "dixie" <dixiec@dogmail.com> wrote in
> news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au:
>[color=green]
> > I have some code that adds new records into a table for each ID in
> > a list box when a button on a form is clicked. This works fine.
> > My problem now is that I wish to be able to edit all the records
> > for people whose ID is in the list box. I made minor changes to
> > the code (mainly replacing rs.AddNew with rs.Edit)and it appears
> > to be updating only the first record and then overwriting that
> > record with the next, etc until it runs out of ID's in the list
> > box. In other words, it is stepping through the ID's in the list
> > box, but not the records. Is there a trick to this? I have spent
> > many hours doing minor changes and still have the same problem.
> >
> > The code follows (I have reduced the number of fields I am
> > updating to keep the size of the message down).[/color]
>
> Declare your variables all in one place, at the top of the
> subroutine, instead of defining them as needed. Doing the latter
> makes it harder to read the code.
>[color=green]
> > Dim intIndex As Integer
> > Dim db As Database
> > Dim rs As Recordset
> > Dim prm As Parameter
> > Dim qdf As QueryDef
> > Dim frm As Form
> > Dim ctl As Control
> > Dim varItm As Variant
> >
> > For intIndex = 0 To Me.lboBulkList.ListCount
> > Me.lbo.BulkList.Selected(intIndex) = True
> > Next intIndex[/color]
>
> I never use the . operator for controls (and I assume that's a typo
> with the period in the middle of its name), so I'd do this instead:
>
> Me!lboBulkList.Selected(intIndex) = True
>[color=green]
> > Set db = CurrentDb()
> > Set qdf = db.QueryDefs("qryBulkEdit")[/color]
>
> Why not use a non-parameter query and skip all the QueryDef stuff
> and simply open a recordset using SQL with an appropriate WHERE
> clause?
>
> The only real justification for using parameters is performance (or
> maybe because the back end is not Jet).
>[color=green]
> > For Each prm In qdf.Parameters
> > prm.Value = Eval(prm.Name)
> > Next prm[/color]
>
> Are the parameters references to the controls on your form? If not,
> I don't see how they are getting filled out here.
>[color=green]
> > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> > Set frm = Forms!frmExcursions
> > Set ctl = frm!lboBulkList
> > For Each varItm In ctl.ItemsSelected[/color]
>
> The problem here is that you haven't navigated to the correct
> record. What you want to do is:
>
> rs.FindFirst "[ID]='" & ctl.ItemData(varItm) & "'"
>
> But if it's a multi-column listbox, you may need to specify the
> column (I always have to look this up when I'm using listboxes).
>
> Then you need to see if a match was found:
>
> If Not rs.NoMatch Then
> [edit your fields]
> End If
>
> All the editing should be inside this If structure, because
> otherwise, no navigation from the previous record will have taken
> place. Of course, you probably want an error handler for this, too,
> as it's a condition that oughtn't really occur.
>[color=green]
> > rs.Edit
> > rs(0) = Me.lboBulkList.ItemData(varItm)[/color]
>
> ???
>
> Does this refer to the first record, or the first field?
>
> Secondly, why not use ctl.ItemData(varItm) instead of retyping the
> control name? There's not much point in using a Control variable if
> you're only going to use it once.
>[color=green]
> > rs!Date = frm!txtDate
> > rs!Faculty = frm!cboFaculty
> > rs!Course = frm!Course
> > rs!Cost = frm!ExCost
> > rs.Update
> > Next varItm
> >
> > rs.Close: Set rs = Nothing[/color]
>
> You could also do all of this with a single SQL update statement.
>
> How?
>
> By creating a WHERE clause that would be something like:
>
> WHERE ID IN ([list of IDs constructed from your listbox])
>
> You already know how to loop through your listbox's .ItemSelected
> collection, so it would be something like this:
>
> Dim strIDList As String
> Set ctl = frm!lboBulkList
> For Each varItm In ctl.ItemsSelected
> strIDList = strIDList & "', '" & ctl.ItemData(varItm)
> Next varItm
>
> strIDList = "'" & Mid(strIDList,4) & "'"
>
> Then construct your SQL:
>
> Dim strSQL As String
> strSQL="UPDATE tblStudents As S SET S.Date=#" & frm!txtDate & "# "
> strSQL=strSQL & "S.Faculty='" & frm!cmbFaculty & "' "
> strSQL=strSQL & "S.Course='" & frm!Course & "' "
> strSQL=strSQL & "S.Cost=" & frm!Cost
> strSQL=strSQL & " WHERE S.ID IN (" & strIDList & ");"
> CurrentDB.Execute(strSQL, dbFailOnError)
>
> No need to open recordsets or querydefs, and it will be much faster,
> as it will do a SQL update. This will also hold locks on the
> table/records for a much shorter period of time.
>
> --
> David W. Fenton http://www.bway.net/~dfenton
> dfenton at bway dot net http://www.bway.net/~dfassoc[/color] | | | | re: rs.Edit instead of rs.AddNew
snip...
[color=blue]
> Dim strSQL As String
> strSQL="UPDATE tblStudents As S SET S.Date=#" & frm!txtDate & "# "
> strSQL=strSQL & "S.Faculty='" & frm!cmbFaculty & "' "
> strSQL=strSQL & "S.Course='" & frm!Course & "' "
> strSQL=strSQL & "S.Cost=" & frm!Cost
> strSQL=strSQL & " WHERE S.ID IN (" & strIDList & ");"
> CurrentDB.Execute(strSQL, dbFailOnError)[/color]
Putting everything into a SQL string can sometimes cause problems
e.g what if Faculty or Course has an apostrophe in it.
rs!Faculty = frm!cboFaculty might be slower but its safer.
Also, I don't think you should use parentheses with the Execute method.
Regards - Joe | | | | re: rs.Edit instead of rs.AddNew
Joe Black wrote:
[color=blue]
> snip...
>
>[color=green]
>> Dim strSQL As String
>> strSQL="UPDATE tblStudents As S SET S.Date=#" & frm!txtDate & "# "
>> strSQL=strSQL & "S.Faculty='" & frm!cmbFaculty & "' "
>> strSQL=strSQL & "S.Course='" & frm!Course & "' "
>> strSQL=strSQL & "S.Cost=" & frm!Cost
>> strSQL=strSQL & " WHERE S.ID IN (" & strIDList & ");"
>> CurrentDB.Execute(strSQL, dbFailOnError)[/color]
>
>
> Putting everything into a SQL string can sometimes cause problems
> e.g what if Faculty or Course has an apostrophe in it.
> rs!Faculty = frm!cboFaculty might be slower but its safer.
>
> Also, I don't think you should use parentheses with the Execute method.
>
> Regards - Joe
>
>[/color]
strSQL=strSQL & "S.Faculty='" & Replace(frm!cmbFaculty,"'","''") & "' "
--
Error reading sig - A)bort R)etry I)nfluence with large hammer | | | | re: rs.Edit instead of rs.AddNew
"Joe Black" <joeblack99@hotmail.com> wrote in
news:745ic.3239$_s.104641@news.xtra.co.nz:
[color=blue]
> snip...
>[color=green]
>> Dim strSQL As String
>> strSQL="UPDATE tblStudents As S SET S.Date=#" & frm!txtDate &
>> "# " strSQL=strSQL & "S.Faculty='" & frm!cmbFaculty & "' "
>> strSQL=strSQL & "S.Course='" & frm!Course & "' "
>> strSQL=strSQL & "S.Cost=" & frm!Cost
>> strSQL=strSQL & " WHERE S.ID IN (" & strIDList & ");"
>> CurrentDB.Execute(strSQL, dbFailOnError)[/color]
>
> Putting everything into a SQL string can sometimes cause problems
> e.g what if Faculty or Course has an apostrophe in it.
> rs!Faculty = frm!cboFaculty might be slower but its safer.[/color]
It's a good point, but I wasn't actually proposing a finished
solution! I was just explaining the method for doing it more
efficiently.
Editing the recordset is "safer" only if you don't bother to address
the apostrophes/quotes problem. One such method is in Trevor's reply
to your post.
[color=blue]
> Also, I don't think you should use parentheses with the Execute
> method.[/color]
If I did:
Call CurrentDB.Execute(strSQL, dbFailOnError)
the () would be required.
But you're right, as I typed it, it was incorrect. Of course, the
VBA IDE would tell you that if you tried it.
One other thing in my code. I suggested this for looping to
construct the IN () list:
For Each varItm In ctl.ItemsSelected
strIDList = strIDList & "', '" & ctl.ItemData(varItm)
Next varItm
strIDList = "'" & Mid(strIDList,4) & "'"
That last line should be one of these two alternatives, not what I
originally typed:
strIDList = Mid(strIDList,4) & "'"
strIDList = "'" & Mid(strIDList,5) & "'"
What I typed would get you a list like this:
''ABC', 'DEF', 'GHI'
Also, the loop could have been changed:
For Each varItm In ctl.ItemsSelected
strIDList = strIDList & ", '" & ctl.ItemData(varItm) & "'"
Next varItm
strIDList = Mid(strIDList,3)
I might even be tempted to write the concatenation as this:
strIDList = strIDList & ", " & "'" & ctl.ItemData(varItm) & "'"
to make it clearer to myself that my Mid() should start at character
3.
I credit Trevor Best for the Mid() trick with string concatenation.
Previous to his suggesting it, I'd always done this:
If Len(strIDList)=0 Then
strIDList = "'" & ctl.ItemData(varItm) "'"
Else
strIDList = strIDList & ", '" & ctl.ItemData(varItm) & "'"
End If
He also suggested the use of the + operator for propagating Nulls
when concatenating. Take "LastName, FirstName", for instance. I used
to do this:
Dim strName As String
strName = Me!LastName
If Len(strName) = 0 Then
strName = Me!FirstName
ElseIf Not IsNull(Me!FirstName) Then
strName = strName & ", " & Me!FirstName
End If
And in queries:
LastName & IIf(Not IsNull(LastName),
IIf(Not IsNull(FirstName),", ")) & FirstName
(that's using the IIf() version that doesn't require both arguments,
BTW)
With Trevor's suggestion, I now do this:
strName = Mid(("12" + Me!LastName) & (", " + Me!FirstName),3)
And in queries:
Mid(("12" + LastName) & (", " + FirstName),3)
Since the + concatenation operator propagates Nulls (i.e., if either
side of the + is Null, the expression returns Null), if LastName is
Null, you're concatenating Null & ", FirstName", which would give
you ", FirstName." The Mid() lops off the leading ", ".
Now, this won't work when *both* are Null, but, well, that's
something you can test for, since records about people with neither
last nor first names are not terribly useful!
--
David W. Fenton http://www.bway.net/~dfenton
dfenton at bway dot net http://www.bway.net/~dfassoc | | | | re: rs.Edit instead of rs.AddNew
David W. Fenton wrote:
[color=blue]
> I credit Trevor Best for the Mid() trick with string concatenation.[/color]
I wish my bank gave me as much credit :-)
[color=blue]
> Now, this won't work when *both* are Null, but, well, that's
> something you can test for, since records about people with neither
> last nor first names are not terribly useful![/color]
Heh, you'd be surprised what people try to save in their forms (not you
personally David, you probably know all this already), e.g. professional
procurement people that try to send orders out with no supplier, po
number, date[1], or any frikkin items with prices on, etc.
[1] At least that's one thing I can do automatically for them, bless
their little cotton socks.
--
Error reading sig - A)bort R)etry I)nfluence with large hammer | | | | re: rs.Edit instead of rs.AddNew
Thanks David, there is a lot of good stuff in here for me to digest. I may
have to get back into this thread to ask you some questions as I don't
pretend to fully follow it all.
I'll start with what is happening in the line[color=blue]
> strIDList = "'" & Mid(strIDList,4) & "'"[/color]
Secondly, I am not sure about the S in the SQL lines[color=blue]
> strSQL="UPDATE tblStudents As S SET S.Date=#" & frm!txtDate & "# "
> strSQL=strSQL & "S.Faculty='" & frm!cmbFaculty & "' "
> strSQL=strSQL & "S.Course='" & frm!Course & "' "
> strSQL=strSQL & "S.Cost=" & frm!Cost
> strSQL=strSQL & " WHERE S.ID IN (" & strIDList & ");"
> CurrentDB.Execute(strSQL, dbFailOnError)[/color]
Where does it come from and what is its purpose?
dixie
"David W. Fenton" <dXXXfenton@bway.net.invalid> wrote in message
news:Xns94D3EED663A7Fdfentonbwaynetinvali@24.168.1 28.86...[color=blue]
> "dixie" <dixiec@dogmail.com> wrote in
> news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au:
>[color=green]
> > I have some code that adds new records into a table for each ID in
> > a list box when a button on a form is clicked. This works fine.
> > My problem now is that I wish to be able to edit all the records
> > for people whose ID is in the list box. I made minor changes to
> > the code (mainly replacing rs.AddNew with rs.Edit)and it appears
> > to be updating only the first record and then overwriting that
> > record with the next, etc until it runs out of ID's in the list
> > box. In other words, it is stepping through the ID's in the list
> > box, but not the records. Is there a trick to this? I have spent
> > many hours doing minor changes and still have the same problem.
> >
> > The code follows (I have reduced the number of fields I am
> > updating to keep the size of the message down).[/color]
>
> Declare your variables all in one place, at the top of the
> subroutine, instead of defining them as needed. Doing the latter
> makes it harder to read the code.
>[color=green]
> > Dim intIndex As Integer
> > Dim db As Database
> > Dim rs As Recordset
> > Dim prm As Parameter
> > Dim qdf As QueryDef
> > Dim frm As Form
> > Dim ctl As Control
> > Dim varItm As Variant
> >
> > For intIndex = 0 To Me.lboBulkList.ListCount
> > Me.lbo.BulkList.Selected(intIndex) = True
> > Next intIndex[/color]
>
> I never use the . operator for controls (and I assume that's a typo
> with the period in the middle of its name), so I'd do this instead:
>
> Me!lboBulkList.Selected(intIndex) = True
>[color=green]
> > Set db = CurrentDb()
> > Set qdf = db.QueryDefs("qryBulkEdit")[/color]
>
> Why not use a non-parameter query and skip all the QueryDef stuff
> and simply open a recordset using SQL with an appropriate WHERE
> clause?
>
> The only real justification for using parameters is performance (or
> maybe because the back end is not Jet).
>[color=green]
> > For Each prm In qdf.Parameters
> > prm.Value = Eval(prm.Name)
> > Next prm[/color]
>
> Are the parameters references to the controls on your form? If not,
> I don't see how they are getting filled out here.
>[color=green]
> > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> > Set frm = Forms!frmExcursions
> > Set ctl = frm!lboBulkList
> > For Each varItm In ctl.ItemsSelected[/color]
>
> The problem here is that you haven't navigated to the correct
> record. What you want to do is:
>
> rs.FindFirst "[ID]='" & ctl.ItemData(varItm) & "'"
>
> But if it's a multi-column listbox, you may need to specify the
> column (I always have to look this up when I'm using listboxes).
>
> Then you need to see if a match was found:
>
> If Not rs.NoMatch Then
> [edit your fields]
> End If
>
> All the editing should be inside this If structure, because
> otherwise, no navigation from the previous record will have taken
> place. Of course, you probably want an error handler for this, too,
> as it's a condition that oughtn't really occur.
>[color=green]
> > rs.Edit
> > rs(0) = Me.lboBulkList.ItemData(varItm)[/color]
>
> ???
>
> Does this refer to the first record, or the first field?
>
> Secondly, why not use ctl.ItemData(varItm) instead of retyping the
> control name? There's not much point in using a Control variable if
> you're only going to use it once.
>[color=green]
> > rs!Date = frm!txtDate
> > rs!Faculty = frm!cboFaculty
> > rs!Course = frm!Course
> > rs!Cost = frm!ExCost
> > rs.Update
> > Next varItm
> >
> > rs.Close: Set rs = Nothing[/color]
>
> You could also do all of this with a single SQL update statement.
>
> How?
>
> By creating a WHERE clause that would be something like:
>
> WHERE ID IN ([list of IDs constructed from your listbox])
>
> You already know how to loop through your listbox's .ItemSelected
> collection, so it would be something like this:
>
> Dim strIDList As String
> Set ctl = frm!lboBulkList
> For Each varItm In ctl.ItemsSelected
> strIDList = strIDList & "', '" & ctl.ItemData(varItm)
> Next varItm
>
> strIDList = "'" & Mid(strIDList,4) & "'"
>
> Then construct your SQL:
>
> Dim strSQL As String
> strSQL="UPDATE tblStudents As S SET S.Date=#" & frm!txtDate & "# "
> strSQL=strSQL & "S.Faculty='" & frm!cmbFaculty & "' "
> strSQL=strSQL & "S.Course='" & frm!Course & "' "
> strSQL=strSQL & "S.Cost=" & frm!Cost
> strSQL=strSQL & " WHERE S.ID IN (" & strIDList & ");"
> CurrentDB.Execute(strSQL, dbFailOnError)
>
> No need to open recordsets or querydefs, and it will be much faster,
> as it will do a SQL update. This will also hold locks on the
> table/records for a much shorter period of time.
>
> --
> David W. Fenton http://www.bway.net/~dfenton
> dfenton at bway dot net http://www.bway.net/~dfassoc[/color] | | | | re: rs.Edit instead of rs.AddNew
Joe, what does the & ";" do at the end of your WHERE condition?
dixie
"Joe Black" <joeblack99@hotmail.com> wrote in message
news:3HXhc.2750$_s.93877@news.xtra.co.nz...[color=blue]
> Hi dixie
>
> I didn't expect the ID field to be text.
> Text needs to be enclosed in speech marks.
>
> Try changing to:
> WHERE [ID] = " & Chr(34) & Me.lboBulkList.ItemData(0) & Chr(34) & ";"
>
> Regards - Joe
>
> "dixie" <dixiec@dogmail.com> wrote in message
> news:TcWhc.169$Ah5.9387@nnrp1.ozemail.com.au...[color=green]
> > Hi Joe,
> >
> > I tried your idea, but I get an error 3464 - Data type mismatch in[/color]
> criteria[color=green]
> > expression, which I presume is the WHERE [ID] =" &
> > Me.lboBulkList.ItemData(0)
> >
> > I played around with variations, but couldn't get it to work.
> >
> > The ID field is a text field if this helps and is the first of two[/color][/color]
columns[color=blue][color=green]
> > in the list box as well as being the bound field in the Row Source of[/color][/color]
the[color=blue][color=green]
> > listbox.
> >
> > You are definitely right about the database design. It is an old one I[/color]
> have[color=green]
> > inherited and I am at this stage just trying to add the ability to[/color][/color]
change[color=blue][color=green]
> > the details of an excursion and produce a new form for all students
> > containing those changes. Database design changes are on the agenda,[/color][/color]
but[color=blue][color=green]
> > further down the track.
> >
> > This is what I have now.
> >
> > Private Sub btnEditTest2_Click()
> >
> > Dim db As Database
> > Dim rs As Recordset
> > Dim strSQL As String
> >
> > Dim frm As Form
> > Dim ctl As Control
> > Dim varItm As Variant
> >
> > Set frm = Forms!frmExcursions
> > Set ctl = frm!lboBulkList
> >
> > Dim i As Integer
> > For i = 0 To Me.lboBulkList.ListCount - 1
> >
> > strSQL = "SELECT * FROM tblExcursions WHERE [ID] =" &
> > Me.lboBulkList.ItemData(0)
> >
> > Set rs = CurrentDb.OpenRecordset(strSQL) <-- It is halting with[/color]
> this[color=green]
> > line hilighted
> > If rs.RecordCount > 0 Then
> > rs!Date = frm!txtDate
> > rs!ID_TCHR = frm!Teacher
> > rs!Faculty = frm!cboFaculty
> > rs!Course = frm!Course
> > rs!ExcursionType = frm!Reason
> > rs!Details = frm!Comment
> > rs!Signatory = frm!TxtSignatory
> > rs!SignatoryArea = frm!TxtSignatoryArea
> > rs!ExcursionName = frm!ExName
> > rs!Cost = frm!ExCost
> > rs!Destination = frm!ExcursionDestination
> > rs!DeparturePlace = frm!DepartFrom
> > rs!ReturningPlace = frm!ReturnTo
> > rs!DepartureTime = frm!DepartTime
> > rs!ReturningTime = frm!ReturnTime
> > rs!Representative = frm!Rep
> > rs!Uniform = frm!Dress
> > rs!Overnight = frm!Night
> > rs!CommendationRequired = frm!Commendation
> > rs!Outdoors = frm!Outdoors
> > rs!Travel = frm!TravelType
> > rs!EntryDate = frm!txtEntryDate
> > rs!Edited = -1
> > End If
> > Next i
> >
> >
> > End Sub
> >
> > Can you see what is wrong?
> >
> > dixie
> >
> >
> > "Joe Black" <joeblack99@hotmail.com> wrote in message
> > news:5yQhc.2415$_s.68732@news.xtra.co.nz...[color=darkred]
> > > Hi Dixie
> > >
> > > In your first version of the code you first select all items in the[/color]
> > listbox[color=darkred]
> > > and then iterate through all the selected items.
> > > If you want to process all the list items, it is not necessary to[/color][/color][/color]
select[color=blue][color=green][color=darkred]
> > > them all first.
> > >
> > > Instead of "For Each varItm In ctl.ItemsSelected"
> > > you can do something like:
> > >
> > > Dim i As Integer
> > > For i = 0 To Me.lboBulkList.ListCount - 1
> > >
> > > strSQL = "SELECT * FROM tblExcursions WHERE [ID] =" &
> > > Me.lboBulkList.ItemData(0)
> > > Set rs = CurrentDb.OpenRecordset(strSQL)
> > > If rs.RecordCount > 0 Then
> > > rs!Date = frm!txtDate
> > > ...
> > > end if
> > > Next i
> > >
> > > You haven't allowed for the possibility that rs.RecordCount might be[/color][/color]
>
> 1.[color=green][color=darkred]
> > >
> > > I also wonder whether the design of your database could be improved.[/color][/color][/color]
If[color=blue][color=green]
> > the[color=darkred]
> > > details of an Excursion are needed to be changed, you should only have[/color][/color]
> to[color=green][color=darkred]
> > > change the details in one row of a table, not repeatedly change the[/color][/color][/color]
same[color=blue][color=green][color=darkred]
> > > details for many rows.
> > >
> > > Regards - Joe
> > >
> > > "dixie" <dixiec@dogmail.com> wrote in message
> > > news:hlIhc.38$Ah5.2978@nnrp1.ozemail.com.au...
> > > > Ok, tried that and strangely, I get exactly the same problem - that[/color][/color]
> is,[color=green]
> > it[color=darkred]
> > > > updates the first record, but not the others. I did not understand[/color][/color]
> your[color=green][color=darkred]
> > > > statement about you will need a loop to update each record in the[/color][/color]
> set -[color=green]
> > is[color=darkred]
> > > > this the bit I have missed.
> > > >
> > > > The general idea is that I have a list of details for an excursion[/color][/color]
> that[color=green]
> > a[color=darkred]
> > > > group of students are going on. I print a form out for each one and[/color][/color][/color]
I[color=blue][color=green][color=darkred]
> > > print
> > > > a list of students attending. Now, I already have that bit working.[/color]
> > The[color=darkred]
> > > > bit I am trying to get here is if there was a mistake in the details[/color][/color]
> or[color=green][color=darkred]
> > > more
> > > > information had come to hand, I wan't to be able to do a "bulk edit"[/color][/color]
> on[color=green][color=darkred]
> > > each
> > > > entry (one per student). The ID is a unique student ID and there[/color][/color]
> would[color=green]
> > be[color=darkred]
> > > a
> > > > number of them (up to 100) in the list box, lboBulkList.
> > > >
> > > > Now, this is the fine detail and is currently what I interpreted[/color][/color][/color]
your[color=blue][color=green][color=darkred]
> > > > previous post into.
> > > >
> > > > Private Sub btnEditTest_Click()
> > > > Dim db As Database
> > > > Dim rs As Recordset
> > > > Dim strSQL As String
> > > >
> > > > Dim frm As Form
> > > > Dim ctl As Control
> > > > Dim varItm As Variant
> > > >
> > > > Set frm = Forms!frmExcursions
> > > > Set ctl = frm!lboBulkList
> > > >
> > > > For Each varItm In ctl.ItemsSelected
> > > > strSQL = "SELECT * FROM tblExcursions WHERE [ID] =" & varItm
> > > >
> > > > Set rs = CurrentDb.OpenRecordset(strSQL)
> > > > If rs.RecordCount > 0 Then
> > > > rs!Date = frm!txtDate
> > > > rs!ID_TCHR = frm!Teacher
> > > > rs!Faculty = frm!cboFaculty
> > > > rs!Course = frm!Course
> > > > rs!ExcursionType = frm!Reason
> > > > rs!Details = frm!Comment
> > > > rs!Signatory = frm!TxtSignatory
> > > > rs!SignatoryArea = frm!TxtSignatoryArea
> > > > rs!ExcursionName = frm!ExName
> > > > rs!Cost = frm!ExCost
> > > > rs!Destination = frm!ExcursionDestination
> > > > rs!DeparturePlace = frm!DepartFrom
> > > > rs!ReturningPlace = frm!ReturnTo
> > > > rs!DepartureTime = frm!DepartTime
> > > > rs!ReturningTime = frm!ReturnTime
> > > > rs!Representative = frm!Rep
> > > > rs!Uniform = frm!Dress
> > > > rs!Overnight = frm!Night
> > > > rs!CommendationRequired = frm!Commendation
> > > > rs!Outdoors = frm!Outdoors
> > > > rs!Travel = frm!TravelType
> > > > rs!EntryDate = frm!txtEntryDate
> > > > rs!Edited = -1
> > > > End If
> > > > Next varItm
> > > > End sub
> > > >
> > > > "Pat" <noemail@ihatespam.bum> wrote in message
> > > > news:IjHhc.11708$hR1.10135@fe2.texas.rr.com...
> > > > > Dixie,
> > > > > Your original post and your latest reply contains a loop that[/color][/color][/color]
looks[color=blue]
> to[color=green][color=darkred]
> > > > have
> > > > > originally been designed to loop through all records in a[/color][/color][/color]
recordset[color=blue][color=green]
> > and[color=darkred]
> > > > > update fields. From your description, you want to update only[/color][/color]
> records[color=green][color=darkred]
> > > > > listed in a listbox, for which you have their ID.
> > > > >
> > > > > If your listbox will likely contain a few items, it could create a
> > > dynamic
> > > > > SLQ statment that selects only the record you want to edit. Then[/color][/color]
> you[color=green][color=darkred]
> > > can
> > > > > edit that record.
> > > > >
> > > > > Set frm = Forms!frmExcursions
> > > > > Set ctl = frm! lboBulkList
> > > > > For Each varItm In ctl.ItemsSelected
> > > > > strSQL = "SELECT * FROM tblData WHERE [IDField] =" & varItm
> > > > > Set rs = CurrentDb.OpenRecordset(strSql)
> > > > > If rs.RecordCount > 0 Then
> > > > > rs.FieldNameToEdit = YourNewValue
> > > > > End if
> > > > > Next varItm
> > > > >
> > > > > If you have more than one record that will return in the[/color][/color][/color]
recordset,[color=blue][color=green]
> > you[color=darkred]
> > > > will
> > > > > need a loop to handle update each record in the set.
> > > > >
> > > > > Hope this helps,
> > > > > Pat
> > > > >
> > > > >
> > > > >
> > > > > "dixie" <dixiec@dogmail.com> wrote in message
> > > > > news:gXFhc.17$Ah5.1849@nnrp1.ozemail.com.au...
> > > > > > OK Pat, I thought as much. You have confirmed what I believed[/color][/color][/color]
was[color=blue][color=green][color=darkred]
> > > > > > happening. My problem is that I don't know how to combine the
> > > previous
> > > > > type
> > > > > > of code that updates according to an ID in a list box and then[/color][/color]
> this[color=green][color=darkred]
> > > type
> > > > > of
> > > > > > code
> > > > > >
> > > > > > With rs
> > > > > >
> > > > > > If rs.RecordCount > 0 Then
> > > > > > .MoveFirst
> > > > > > Do
> > > > > > .Edit
> > > > > > rs!Cost = 0
> > > > > > .Update
> > > > > > .MoveNext
> > > > > > Loop Until .EOF
> > > > > > End If
> > > > > > .Close: Set rs = Nothing
> > > > > >
> > > > > > End With
> > > > > >
> > > > > > I know that I need to step through the records in the recordset[/color][/color]
> and[color=green][color=darkred]
> > > edit
> > > > > > each field according to my ID in the list box, but I can't seem[/color][/color][/color]
to[color=blue][color=green][color=darkred]
> > > > combine
> > > > > > the two ideas to get to the solution I want - which is for each[/color]
> > person[color=darkred]
> > > > > > selected to have their specific record edited according to a[/color][/color][/color]
what[color=blue]
> is[color=green][color=darkred]
> > > in
> > > > > > various controls on the form.
> > > > > >
> > > > > > dixie
> > > > > >
> > > > > > ----- Original Message -----
> > > > > > From: "Pat" <noemail@ihatespam.bum>
> > > > > > Newsgroups: comp.databases.ms-access
> > > > > > Sent: Thursday, April 22, 2004 11:38 AM
> > > > > > Subject: Re: rs.Edit instead of rs.AddNew
> > > > > >
> > > > > >
> > > > > > > Dixie,
> > > > > > > You are looping through your selected items, but you are not[/color]
> > looping[color=darkred]
> > > > > > through
> > > > > > > your recordset (although looping through the recordset is only[/color]
> > going[color=darkred]
> > > > to
> > > > > > work
> > > > > > > if the records are in the _exact_ same order as your listbox).[/color]
> > rs(0)[color=darkred]
> > > > is
> > > > > > the
> > > > > > > first record in the returned recordset. As you loop through[/color][/color][/color]
the[color=blue][color=green][color=darkred]
> > > > items,
> > > > > > you
> > > > > > > are editing the same record.
> > > > > > >
> > > > > > > Instead, you want to select each record that cooresponds to[/color][/color][/color]
each[color=blue][color=green][color=darkred]
> > > > > selected
> > > > > > > listbox item and then update, or, pull all your records, find[/color][/color]
> the[color=green][color=darkred]
> > > one
> > > > > that
> > > > > > > matches the listbox item in the loop and then update.
> > > > > > >
> > > > > > > Hope that gets you started.
> > > > > > > Pat
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > "dixie" <dixiec@dogmail.com> wrote in message
> > > > > > > news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...
> > > > > > > > I have some code that adds new records into a table for each[/color][/color]
> ID[color=green]
> > in[color=darkred]
> > > a
> > > > > > list
> > > > > > > > box when a button on a form is clicked. This works fine.[/color][/color][/color]
My[color=blue][color=green][color=darkred]
> > > > problem
> > > > > > now
> > > > > > > is
> > > > > > > > that I wish to be able to edit all the records for people[/color][/color]
> whose[color=green]
> > ID[color=darkred]
> > > > is
> > > > > in
> > > > > > > the
> > > > > > > > list box. I made minor changes to the code (mainly[/color][/color][/color]
replacing[color=blue][color=green][color=darkred]
> > > > > rs.AddNew
> > > > > > > with
> > > > > > > > rs.Edit)and it appears to be updating only the first record[/color][/color]
> and[color=green][color=darkred]
> > > then
> > > > > > > > overwriting that record with the next, etc until it runs out[/color][/color]
> of[color=green][color=darkred]
> > > ID's
> > > > > in
> > > > > > > the
> > > > > > > > list box. In other words, it is stepping through the ID's[/color][/color][/color]
in[color=blue][color=green]
> > the[color=darkred]
> > > > list
> > > > > > > box,
> > > > > > > > but not the records. Is there a trick to this? I have[/color][/color][/color]
spent[color=blue][color=green]
> > many[color=darkred]
> > > > > hours
> > > > > > > > doing minor changes and still have the same problem.
> > > > > > > >
> > > > > > > > The code follows (I have reduced the number of fields I am
> > > updating
> > > > to
> > > > > > > keep
> > > > > > > > the size of the message down).
> > > > > > > >
> > > > > > > > Dim intIndex As Integer
> > > > > > > >
> > > > > > > > For intIndex = 0 To Me.lboBulkList.ListCount
> > > > > > > >
> > > > > > > > Me.lbo.BulkList.Selected(intIndex) = True
> > > > > > > >
> > > > > > > > Next intIndex
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > Dim db As Database
> > > > > > > >
> > > > > > > > Dim rs As Recordset
> > > > > > > >
> > > > > > > > Dim prm As Parameter
> > > > > > > >
> > > > > > > > Dim qdf As QueryDef
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > Set db = CurrentDb()
> > > > > > > >
> > > > > > > > Set qdf = db.QueryDefs("qryBulkEdit")
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > For Each prm In qdf.Parameters
> > > > > > > >
> > > > > > > > prm.Value = Eval(prm.Name)
> > > > > > > >
> > > > > > > > Next prm
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > Dim frm As Form
> > > > > > > >
> > > > > > > > Dim ctl As Control
> > > > > > > >
> > > > > > > > Dim varItm As Variant
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > Set frm = Forms!frmExcursions
> > > > > > > >
> > > > > > > > Set ctl = frm! lboBulkList
> > > > > > > >
> > > > > > > > For Each varItm In ctl.ItemsSelected
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > rs.Edit
> > > > > > > >
> > > > > > > > rs(0) = Me. lboBulkList.ItemData(varItm)
> > > > > > > >
> > > > > > > > rs!Date = frm!txtDate
> > > > > > > >
> > > > > > > > rs!Faculty = frm!cboFaculty
> > > > > > > >
> > > > > > > > rs!Course = frm!Course
> > > > > > > >
> > > > > > > > rs!Cost = frm!ExCost
> > > > > > > >
> > > > > > > > rs.Update
> > > > > > > >
> > > > > > > > Next varItm
> > > > > > > >
> > > > > > > > rs.Close: Set rs = Nothing
> > > > > > > >
> > > > > > > >
> > > > > > > > dixie
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > > > "Pat" <noemail@ihatespam.bum> wrote in message
> > > > > > news:AmFhc.8861$NR5.255@fe1.texas.rr.com...
> > > > > > > Dixie,
> > > > > > > You are looping through your selected items, but you are not[/color]
> > looping[color=darkred]
> > > > > > through
> > > > > > > your recordset (although looping through the recordset is only[/color]
> > going[color=darkred]
> > > > to
> > > > > > work
> > > > > > > if the records are in the _exact_ same order as your listbox).[/color]
> > rs(0)[color=darkred]
> > > > is
> > > > > > the
> > > > > > > first record in the returned recordset. As you loop through[/color][/color][/color]
the[color=blue][color=green][color=darkred]
> > > > items,
> > > > > > you
> > > > > > > are editing the same record.
> > > > > > >
> > > > > > > Instead, you want to select each record that cooresponds to[/color][/color][/color]
each[color=blue][color=green][color=darkred]
> > > > > selected
> > > > > > > listbox item and then update, or, pull all your records, find[/color][/color]
> the[color=green][color=darkred]
> > > one
> > > > > that
> > > > > > > matches the listbox item in the loop and then update.
> > > > > > >
> > > > > > > Hope that gets you started.
> > > > > > > Pat
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > "dixie" <dixiec@dogmail.com> wrote in message
> > > > > > > news:VZChc.193$Rk4.10033@nnrp1.ozemail.com.au...
> > > > > > > > I have some code that adds new records into a table for each[/color][/color]
> ID[color=green]
> > in[color=darkred]
> > > a
> > > > > > list
> > > > > > > > box when a button on a form is clicked. This works fine.[/color][/color][/color]
My[color=blue][color=green][color=darkred]
> > > > problem
> > > > > > now
> > > > > > > is
> > > > > > > > that I wish to be able to edit all the records for people[/color][/color]
> whose[color=green]
> > ID[color=darkred]
> > > > is
> > > > > in
> > > > > > > the
> > > > > > > > list box. I made minor changes to the code (mainly[/color][/color][/color]
replacing[color=blue][color=green][color=darkred]
> > > > > rs.AddNew
> > > > > > > with
> > > > > > > > rs.Edit)and it appears to be updating only the first record[/color][/color]
> and[color=green][color=darkred]
> > > then
> > > > > > > > overwriting that record with the next, etc until it runs out[/color][/color]
> of[color=green][color=darkred]
> > > ID's
> > > > > in
> > > > > > > the
> > > > > > > > list box. In other words, it is stepping through the ID's[/color][/color][/color]
in[color=blue][color=green]
> > the[color=darkred]
> > > > list
> > > > > > > box,
> > > > > > > > but not the records. Is there a trick to this? I have[/color][/color][/color]
spent[color=blue][color=green]
> > many[color=darkred]
> > > > > hours
> > > > > > > > doing minor changes and still have the same problem.
> > > > > > > >
> > > > > > > > The code follows (I have reduced the number of fields I am
> > > updating
> > > > to
> > > > > > > keep
> > > > > > > > the size of the message down).
> > > > > > > >
> > > > > > > > Dim intIndex As Integer
> > > > > > > >
> > > > > > > > For intIndex = 0 To Me.lboBulkList.ListCount
> > > > > > > >
> > > > > > > > Me.lbo.BulkList.Selected(intIndex) = True
> > > > > > > >
> > > > > > > > Next intIndex
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > Dim db As Database
> > > > > > > >
> > > > > > > > Dim rs As Recordset
> > > > > > > >
> > > > > > > > Dim prm As Parameter
> > > > > > > >
> > > > > > > > Dim qdf As QueryDef
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > Set db = CurrentDb()
> > > > > > > >
> > > > > > > > Set qdf = db.QueryDefs("qryBulkEdit")
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > For Each prm In qdf.Parameters
> > > > > > > >
> > > > > > > > prm.Value = Eval(prm.Name)
> > > > > > > >
> > > > > > > > Next prm
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > Set rs = qdf.OpenRecordset(dbOpenDynaset)
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > Dim frm As Form
> > > > > > > >
> > > > > > > > Dim ctl As Control
> > > > > > > >
> > > > > > > > Dim varItm As Variant
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > Set frm = Forms!frmExcursions
> > > > > > > >
> > > > > > > > Set ctl = frm! lboBulkList
> > > > > > > >
> > > > > > > > For Each varItm In ctl.ItemsSelected
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > rs.Edit
> > > > > > > >
> > > > > > > > rs(0) = Me. lboBulkList.ItemData(varItm)
> > > > > > > >
> > > > > > > > rs!Date = frm!txtDate
> > > > > > > >
> > > > > > > > rs!Faculty = frm!cboFaculty
> > > > > > > >
> > > > > > > > rs!Course = frm!Course
> > > > > > > >
> > > > > > > > rs!Cost = frm!ExCost
> > > > > > > >
> > > > > > > > rs.Update
> > > > > > > >
> > > > > > > > Next varItm
> > > > > > > >
> > > > > > > > rs.Close: Set rs = Nothing
> > > > > > > >
> > > > > > > >
> > > > > > > > dixie
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >[/color]
> >
> >[/color]
>
>[/color] | | | | re: rs.Edit instead of rs.AddNew
dixie wrote:[color=blue]
> Joe, what does the & ";" do at the end of your WHERE condition?[/color]
It's a standard end of command for SQL but optional, so is snipping
posts apparently :-(
--
Error reading sig - A)bort R)etry I)nfluence with large hammer | | | | re: rs.Edit instead of rs.AddNew
Sorry! It was getting rather large - I'll keep an eye out in future.
dixie
"Trevor Best" <nospam@localhost> wrote in message
news:4089afe2$0$24993$afc38c87@auth.uk.news.easyne t.net...[color=blue]
> It's a standard end of command for SQL but optional, so is snipping
> posts apparently :-([/color] | | | | re: rs.Edit instead of rs.AddNew
"dixie" <dixiec@dogmail.com> wrote in
news:fAhic.233$ge6.9199@nnrp1.ozemail.com.au:
[color=blue]
> Thanks David, there is a lot of good stuff in here for me to
> digest. I may have to get back into this thread to ask you some
> questions as I don't pretend to fully follow it all.
>
> I'll start with what is happening in the line[color=green]
>> strIDList = "'" & Mid(strIDList,4) & "'"[/color][/color]
Walk the loop and check the value of strIDList after this line:
strIDList = strIDList & "', '" & ctl.ItemData(varItm)
Assume there are three IDs.
iteration item strIDList
1 "AB" "', 'AB"
2 "CD" "', 'AB, 'CD"
3 "EF" "', 'AB, 'CD', EF"
So, before you get to the line you're questioning, the value in
strIDList is:
"', 'AB, 'CD', EF"
Now, I posted elsewhere that this was actually erroneous. What I
typed:
strIDList = "'" & Mid(strIDList,4) & "'"
will start at character 4 of strIDList, and return that:
1234567890123456
"', 'AB, 'CD', EF"
That would return"
"'AB, 'CD', EF"
Then my erroneous code would add an opening "'" and closing "'" to
give you:
"''AB, 'CD', EF'"
which is, of course, wrong!
To correct it, you could change that line to:
strIDList = "'" & Mid(strIDList,5) & "'"
Or, better:
strIDList = Mid(strIDList,4) & "'"
And better still, change the line in the loop from :
strIDList = strIDList & "', '" & ctl.ItemData(varItm)
to:
strIDList = strIDList & ", '" & ctl.ItemData(varItm) & "'"
or, to make that clearer:
strIDList = strIDList & ", " & '" & ctl.ItemData(varItm) & "'"
and then change the Mid() line to:
strIDList = Mid(strIDList,3)
It's an old trick, as I explained, to avoid having to check the
length of the string variable you're concatenating into to see
whether or not you need to add the ", " to separate items.
[color=blue]
> Secondly, I am not sure about the S in the SQL lines[color=green]
>> strSQL="UPDATE tblStudents As S SET S.Date=#" & frm!txtDate &
>> "# " strSQL=strSQL & "S.Faculty='" & frm!cmbFaculty & "' "
>> strSQL=strSQL & "S.Course='" & frm!Course & "' "
>> strSQL=strSQL & "S.Cost=" & frm!Cost
>> strSQL=strSQL & " WHERE S.ID IN (" & strIDList & ");"
>> CurrentDB.Execute(strSQL, dbFailOnError)[/color]
>
> Where does it come from and what is its purpose?[/color]
It's an alias for the table name (see "UPDATE tblStudents As S") to
make the SQL easier to read.
strSQL="UPDATE tblStudents SET S.Date=#" & frm!txtDate & "# "
strSQL=strSQL & "tblStudents.Faculty='" & frm!cmbFaculty & "' "
strSQL=strSQL & "tblStudents.Course='" & frm!Course & "' "
strSQL=strSQL & "tblStudents.Cost=" & frm!Cost
strSQL=strSQL & " WHERE tblStudents.ID IN (" & strIDList & ");"
is the same thing, just takes longer to type.
--
David W. Fenton http://www.bway.net/~dfenton
dfenton at bway dot net http://www.bway.net/~dfassoc |  | Similar Microsoft Access / VBA bytes | | | /bytes/about
We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights.
Get the best answers to your questions from over 226,223 network members.
|