Avatar billede bsn Forsker
23. august 2020 - 14:25 Der er 22 kommentarer og
2 løsninger

Variabel i recordset

Kan det lade sig gøre at have et variabel navn som navn på recordset...???

Eksempel:

        If Not rst1.EOF Then
            Rec1 = rst1!rst.Fields(i).Name
            rst1!rst.Fields(i).Name = Replace(Rec1, Fra, Til)
            rst1.Update
        End If
Avatar billede terry Ekspert
23. august 2020 - 18:40 #1
Not quite sure I understand the question :-(

Can you explain in more detail and with an example please?
Avatar billede terry Ekspert
23. august 2020 - 18:41 #2
are you tring to alter the column name?
Avatar billede bsn Forsker
23. august 2020 - 23:36 #3
I try to use the first recordset(rst) as a variable, to get the colown name for the second recordset(rst1)...that I have to use update the current record in rst1...


Set Conn = CurrentProject.Connection
Set rst = New ADODB.Recordset
Set rst1 = New ADODB.Recordset
 
Sql = "select * from  " & table_name & " where 1=0"
rst.Open Sql, Conn, adOpenDynamic, adLockOptimistic

For i = 0 To rst.Fields.Count - 1
If rst.Fields(i).Name <> "ID" Then
       
Sql = "select " & rst.Fields(i).Namefrom & " & table_name & " where " & rst.Fields(i).Name & "<>''"
        rst1.Open Sql, Conn, adOpenDynamic, adLockOptimistic
        Do Until rst1.EOF
       
        If Not rst1.EOF Then
            Rec1 = rst1!rst.Fields(i).Name
            rst1!rst.Fields(i).Name = Replace(Rec1, Fra, Til)
            rst1.Update
        End If
       
        rst1.MoveNext
        Loop
        rst1.Close
End If
Next i
rst.Close
Avatar billede bvirk Guru
23. august 2020 - 23:47 #4
Recordset: sets of records - strukturændringer er mere noget med tabledefs (eller sql) - men prøv: det burde give en fejlmeddelelse gående på at feltnavnet er readonly. Min fornemmelse går på det ville være et dirty design hvis update skulle indbefatte feltnavnændringer.
Avatar billede bsn Forsker
23. august 2020 - 23:48 #5
It throws this error in #1

"Compile error
Method or data member not found"
Avatar billede bsn Forsker
23. august 2020 - 23:52 #6
#4

Nej, rst.Fields(i).Name er navnet på record i rst1...
Avatar billede bsn Forsker
24. august 2020 - 00:04 #7
#2

Nej, rst.Fields(i).Name er navnet på record i rst1
Avatar billede bvirk Guru
24. august 2020 - 00:59 #8
adodb.recordset.fields(i).name er en readonly property i min vba editor - objekt browser (f2)
Skulle angiveligt være noget lettere at ændre feltnavne i dao - selv om jeg godt ved at det ikke er det spørgsmålet går på.

https://stackoverflow.com/questions/2049245/what-is-the-ddl-to-rename-column-in-msaccess
Avatar billede bsn Forsker
24. august 2020 - 08:37 #9
Her er formålet med øvelsen :

Det jeg vil opnå er, at opdatere noget data(Fra og Til)  i 3 eller 100 kolonner med hver  5 eller 100 rækker i tabellen...

Kunne selvfølgelig lave 100 update queryes, men tænkte at det måtte kunne laves smartere...
Avatar billede bvirk Guru
24. august 2020 - 09:15 #10
Det er noget øvelse end hvad anvendelsen property name antydede. værdier har property value - hvilket er default så det kan unværes - altså:

Rec1 = rst1!rst.Fields(i)
rst1!rst.Fields(i) = Replace(Rec1, Fra, Til)

og så recordset så krævende at et movenext fordres
Avatar billede bvirk Guru
24. august 2020 - 09:22 #11
jeg overså at der var et movenext
Avatar billede terry Ekspert
24. august 2020 - 15:22 #12
Still not 100% sure what you are trying to do.

fields(i).name returns the name of the column in the table/query (recordset)

If you want to update a columnn with the same name in another recorset

ColumnName = !rst.Fields(i).name

rst1(ColumnName) = "Test..."
Avatar billede bsn Forsker
25. august 2020 - 12:02 #13
#10

"Compile error
Method or data member not found"
Avatar billede bsn Forsker
25. august 2020 - 12:20 #14
#12

Change all 2020 to 2021...;)

col1 - col2 - col3
2020 - 2020 - 2020
        - 2020 - 2020
        - 2020 -
Avatar billede bsn Forsker
25. august 2020 - 12:21 #15
col1 - col2 - col3
2020 - 2020 - 2020
2020 - 2020
2020 -
Avatar billede terry Ekspert
25. august 2020 - 12:22 #16
is it possible for you to send me an example of your dB with a step for step  explanation (på dansk) of what you are trying to do?
ekspertenATsanthell.dk
AT = @
Avatar billede terry Ekspert
25. august 2020 - 12:59 #17
OK, so the task is to update ALL fields (columns) in a table FROM 2020 to 2021?

I dont see any test for that in your code, it changes (if it worked) all fields from fra to til :-(
Avatar billede terry Ekspert
25. august 2020 - 13:00 #18
.. ALL fields CONTAINING 2020...
Avatar billede bsn Forsker
25. august 2020 - 14:12 #19
#17

Ja...Ændre alle felter i alle kolonner...
Har sendt db til dig...
Avatar billede terry Ekspert
25. august 2020 - 14:32 #20
.. Ændre alle felter i alle kolonner..
If i just did this then on the table you sent, I could just do it in one single SQL Update

but I am assuming that this is a test database, so doesnt contain all fields (columns) or correct data.
So i need to know if it is necessary to check if each field contains the old value of 2020 before I change it to 2021? mAnd if I did that, is there any chance that other data which should not be changed, also get updated??
Avatar billede terry Ekspert
25. august 2020 - 15:23 #21
you can try this


Public Function ChangeYear(table_name As String, Fra As String, Til As String)

Dim rs As ADODB.Recordset
Dim sSQL As String
Dim i As Integer

    Set rs = New ADODB.Recordset
   
   
    sSQL = "select * from  " & table_name & " where 1"
   
    rs.Open sSQL, CurrentProject.Connection, adOpenDynamic, adLockOptimistic
   
    'Loop through all records
    Do Until rs.EOF
       
        'Loop through each column of table
        For i = 0 To rs.Fields.Count - 1
       
            'Only update if field is not ID column and value is = Fra or empty
            If rs.Fields(i).Name <> "ID" Then
                If rs(i).Value = Fra Or Len(Trim(rs(i).Value)) = 0 Or IsNull(rs(i).Value) Then
                    rs(i).Value = Til
                End If
            End If
       
        'move on to next field
        Next i
   
        'move on to next record
        rs.MoveNext
       
    Loop
    rs.Close
   
End Function
Avatar billede terry Ekspert
25. august 2020 - 15:53 #22
and I am aware that I didnt use .edit or .update ;-)
Avatar billede bsn Forsker
25. august 2020 - 17:08 #23
#21

Mange tak - det løste problemet...
Har lige lavet lidt ændringer, og så virker det...


Dim rs As ADODB.Recordset
Dim i As Integer
Dim Fra, Til, sSQL As String

Fra = InputBox("Indtast gammelt årstal...", "Gammelt årstal")
Til = InputBox("Indtast nyt årstal...", "Nyt årstal")

    Set rs = New ADODB.Recordset
 
    sSQL = "select * from tblEtiket where 1"
 
    rs.Open sSQL, CurrentProject.Connection, adOpenDynamic, adLockOptimistic
 
    'Loop through all records
    Do Until rs.EOF
     
        'Loop through each column of table
        For i = 0 To rs.Fields.Count - 1
     
            If rs.Fields(i).Name <> "ID" Then
                If InStr(rs(i).Value, Fra) > 1 Then
                   
                    rs(i).Value = Replace(rs(i).Value, Fra, Til)
                   
                End If
            End If
     
        'move on to next field
        Next i
 
        'move on to next record
        rs.MoveNext
     
    Loop
    rs.Close
Avatar billede terry Ekspert
25. august 2020 - 18:21 #24
great :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester