Avatar billede foldager Novice
28. august 2002 - 19:52 Der er 13 kommentarer og
1 løsning

Fejl i kopieringsfunktion

Jeg har en DB beregnet til registrering af en række bygningers drift og vedligeholdsoplysninger.
Ideen er at man udfylder en bygning med detaljerede bygningsdele, og derefter henter en kopi af disse data over i de andre.

Kopifunktionen aktiveres fra en form, når der klikkes på knappen ( se evt. billede: http://www.folda.dk/dbkopiform.gif ).

Desværre roder kopifunktionen rundt i dataene, så data fra en post somme tider mangler i kopien, andre gange stammer de kopierede data fra andre poster!

Her ses et eksempel på data der er kopieret fra en bygning, og som ikke svarer overens med originalen: http://www.folda.dk/dbkopiproblem.gif

Er der nogen der har et bud på hvor fejlen ligger?

Koden bag kopieringsknappen er her (Jeg ved godt at det er en ordentlig smøre):
 

Option Compare Database
Option Explicit
Public intgr As Integer

Private Sub cmdKopi_Click()
Dim rsBygningsDel, rsBygningsdelExist As Recordset
Dim intZ, intx As Integer
Dim varRecordsBygdel As Variant
   
    Set rsBygningsDel = CurrentDb.OpenRecordset("SELECT * From tblBygningsdel WHERE " & _
    "tblBygningsdel.Bygningsindeks = " & txtBygningsIndeks.Value, dbOpenDynaset)
   
    Set rsBygningsdelExist = CurrentDb.OpenRecordset("SELECT * From tblBygningsdel WHERE " & _
    "tblBygningsdel.Bygningsindeks = " & intgr, dbOpenDynaset)
   
    If Not (rsBygningsDel.BOF) Then
    If rsBygningsdelExist.BOF Then
   
    rsBygningsDel.MoveLast
    intZ = rsBygningsDel.RecordCount
    rsBygningsDel.MoveFirst
    varRecordsBygdel = rsBygningsDel.GetRows(intZ)
   
    For intZ = 0 To intZ - 1
        With rsBygningsDel
          .AddNew
            !BYGNINGSINDEKS = intgr
            !SFB_INDEKS = varRecordsBygdel(2, intZ)
            !Materiale = varRecordsBygdel(3, intZ)
            !Emne1 = varRecordsBygdel(4, intZ)
            !Emne2 = varRecordsBygdel(5, intZ)
            !komp_placering = varRecordsBygdel(6, intZ)
            !plac_kode = varRecordsBygdel(7, intZ)
            .Update
        End With
    Next intZ
    kopidata intgr
    Else
    MsgBox "Der findes allerede bygningsdata for " & varBygning, vbExclamation, "M E D D E L E L S E"
    End If
    Else
    MsgBox "Der findes ingen bygningsdata for " & Me!txtbygning.Value, vbExclamation, "M E D D E L E L S E"
    End If
   
End Sub
Private Sub kopidata(indx)
Dim rsFraÅr As Recordset
Dim rsTilÅr As Recordset
Dim strSQL As String
Dim blData As Boolean
Dim lnIndxValue As Long
Dim blCheck As Boolean
Dim intCount As Integer
Dim rscount As Integer
Dim rsObjektId As Recordset

    strSQL = "SELECT tblBygningsdel.Objekt_ID FROM tblBygningsdel " & _
    "WHERE (((tblBygningsdel.Bygningsindeks)=" & indx & "));"

    Set rsObjektId = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)

    strSQL = "SELECT tblBYGNINGSDEL.Bygningsindeks, tblKonstateringsÅr.* " & _
            "FROM tblBYGNINGSDEL INNER JOIN tblKonstateringsÅr ON tblBYGNINGSDEL.Objekt_ID = " & _
            "tblKonstateringsÅr.Index_Konstår " & _
            "WHERE (((tblBYGNINGSDEL.Bygningsindeks)=" & txtBygningsIndeks.Value & ") AND " & _
            "((tblKonstateringsÅr.Konstateringsår)=" & varÅr & "));"
   
    Set rsFraÅr = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
   
    rsFraÅr.MoveLast
    rscount = rsFraÅr.RecordCount
    intCount = 1
   
    'strSQL = "SELECT tblBYGNINGSDEL.Bygningsindeks, tblKonstateringsÅr.* " & _
            "FROM tblBYGNINGSDEL INNER JOIN tblKonstateringsÅr ON tblBYGNINGSDEL.Objekt_ID = " & _
            "tblKonstateringsÅr.Index_Konstår " & _
            "WHERE (((tblBYGNINGSDEL.Bygningsindeks)=" & indx & ") AND " & _
            "((tblKonstateringsÅr.Konstateringsår)=" & varÅr & "));"

    strSQL = "SELECT tblKonstateringsår.* FROM tblkonstateringsår;"
   
    Set rsTilÅr = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)

    If rsTilÅr.BOF Then
        blData = False
        Else
        blData = True
    End If
   
    rsFraÅr.MoveFirst
    blCheck = True

Dim valPrioritet
Dim valPrioritet_år
Dim valMåned
Dim valGarantiudførelse
Dim valKalkuleret_Pris
Dim valFaktuel_Pris
Dim valPr_tekst
Dim valSærundersøgelse
Dim valSkadesårsag
Dim valSkade_kode
Dim valKommentarer
Dim valFag
Dim valVedligeholdstype
Dim valStilladskrav
Dim valRum
Dim valRumareal
Dim valOrientering
Dim valMængde
Dim valMængde_Enhed
Dim valEnhedspris
Dim valVedl_int
Dim valNotat
Dim valAreal_Nøgletal
Dim valLokalisering
Dim valOprettet_af_konstatering


    While intCount <= rscount
   
    With rsFraÅr
        lnIndxValue = .Fields("Index_Konstår").Value
        valPrioritet = .Fields("Prioritet").Value
        valPrioritet_år = .Fields("Prioritet_år").Value
        valMåned = .Fields("Konstateringsmåned").Value
        valGarantiudførelse = .Fields("Garantiudførelse").Value
        valKalkuleret_Pris = .Fields("Kalkuleret_Pris").Value
        valFaktuel_Pris = .Fields("Faktuel_Pris").Value
        valPr_tekst = .Fields("Pr_tekst").Value
        valSærundersøgelse = .Fields("Særundersøgelse").Value
        valSkadesårsag = .Fields("Skadesårsag").Value
        valSkade_kode = .Fields("Skade_kode").Value
        valKommentarer = .Fields("Kommentarer").Value
        valFag = .Fields("Fag").Value
        valVedligeholdstype = .Fields("Vedligeholdstype").Value
        valStilladskrav = .Fields("Stilladskrav").Value
        valRum = .Fields("Rum").Value
        valRumareal = .Fields("Rumareal").Value
        valOrientering = .Fields("Orientering").Value
        valMængde = .Fields("Mængde").Value
        valMængde_Enhed = .Fields("Mængde_Enhed").Value
        valEnhedspris = .Fields("Enhedspris").Value
        valVedl_int = .Fields("Vedl_int").Value
        valNotat = .Fields("Notat").Value
        valAreal_Nøgletal = .Fields("Areal_Nøgletal").Value
        valOprettet_af_konstatering = "kopi af " & varÅr
        valLokalisering = .Fields("lokalisering").Value
        If blData Then
            rsTilÅr.MoveFirst
            blCheck = True
            While Not (rsTilÅr.EOF)
                With rsTilÅr
            '    If .Fields("index_konstår").Value = lnIndxValue Then blCheck = False
                End With
                rsTilÅr.MoveNext
            Wend
        End If
        If blCheck = True Then
          .AddNew
            !Index_Konstår = rsObjektId.Fields(0).Value
            !Konstateringsår = varÅr
            !Konstateringsmåned = valMåned
            !Prioritet = valPrioritet
            !Prioritet_år = valPrioritet_år
            !Garantiudførelse = valGarantiudførelse
            !Kalkuleret_Pris = valKalkuleret_Pris
            !Faktuel_Pris = valFaktuel_Pris
            !Pr_tekst = valPr_tekst
            !Særundersøgelse = valSærundersøgelse
            !Skadesårsag = valSkadesårsag
            !Skade_kode = valSkade_kode
            !Kommentarer = valKommentarer
            !Fag = valFag
            !Vedligeholdstype = valVedligeholdstype
            !Stilladskrav = valStilladskrav
            !Rum = valRum
            !Rumareal = valRumareal
            !Orientering = valOrientering
            !Mængde = valMængde
            !Mængde_Enhed = valMængde_Enhed
            !Enhedspris = valEnhedspris
            !Vedl_int = valVedl_int
            !Notat = valNotat
            !Lokalisering = valLokalisering
            !Areal_Nøgletal = valAreal_Nøgletal
            !oprettet_af_konstatering = valOprettet_af_konstatering
            .Update
        End If
    End With
    intCount = intCount + 1
    rsFraÅr.MoveNext
    rsObjektId.MoveNext
    Wend
       
    rsFraÅr.Close
    rsTilÅr.Close
   
   
End Sub

Private Sub Form_Open(Cancel As Integer)
    cmdKopi.Visible = False
    Me![txtOverskrift].Value = varBygning
   
End Sub

Private Sub listBygning_AfterUpdate()
Dim rsValgtBygning As Recordset
Dim varRecordValgt As Variant

    txtbygning.Value = listBygning.Column(0)
    txtBygningsIndeks.Value = listBygning.Column(1)
    cmdKopi.Visible = True
    Set rsValgtBygning = CurrentDb.OpenRecordset("SELECT * From tblBygning WHERE " & _
    "tblBygning.Bygningsbetegnelse= '" & varBygning & "'", dbOpenDynaset)
       
    rsValgtBygning.MoveFirst
    intgr = rsValgtBygning.Fields("bygningsindex")
End Sub
Private Sub luk_Click()
On Error GoTo Err_luk_Click

    RunCommand acCmdClose
    DoCmd.OpenForm "frmBygning"

   
Exit_luk_Click:
    Exit Sub

Err_luk_Click:
    MsgBox Err.Description
    MsgBox Err.Number
    Resume Exit_luk_Click
   
End Sub
Avatar billede mugs Novice
28. august 2002 - 20:02 #1
foldager > Jeg har ikke tid til at gennemgå din kode i detaljer, men hvis det blot drejer sig om at kopiere data i en formular og indsætte dem igen, gør jeg dette på denne måde. Men det er vel ikke så enkelt:

DoCmd.RunCommand acCmdSelectRecord
DoCmd.RunCommand acCmdCopy
DoCmd.GoToRecord acForm, "Form1", acNewRec
DoCmd.RunCommand acCmdSelectRecord
DoCmd.RunCommand acCmdPaste
Avatar billede foldager Novice
28. august 2002 - 20:06 #2
Nej det er desværre ikke så enkelt. Jeg forstår godt at du ikke har tid til at gå i dybden, det har jeg heller ikke ;-)
Avatar billede foldager Novice
28. august 2002 - 20:07 #3
Det spøjse er at det virker vilkårligt hvilke data der bliver sat ind i den kopierede post...
Avatar billede terry Ekspert
28. august 2002 - 20:16 #4
Hi foldager!
I would suggest that you debug your way through the program. Its almost impossible to look through the code to see what the problem is.

But I can see something which isnt so good, although I doubt that it is this which is causing the problem.

Dim rsBygningsDel, rsBygningsdelExist As Recordset
ONLY rsBygningsdelExist  is dimmed as a recordset, rsBygningsDel is dimmed as a variant.

USE:
Dim rsBygningsDel  As Recordset
Dim rsBygningsdelExist As Recordset
Avatar billede foldager Novice
28. august 2002 - 20:28 #5
Ja, jeg ved godt at det er næsten umuligt. Jeg vil prøve dit råd!
Avatar billede terry Ekspert
28. august 2002 - 21:31 #6
I will also take a look if you want, but it will be tomorrow first!

If so then send it to terry@santhell.dk
Avatar billede foldager Novice
28. august 2002 - 23:07 #7
Terry > Jeg har nu forsøgt at debugge efter bedste evne, men jeg må nok se i øjnene at jeg ikke ved nok til at kunne finde fejlen uden dybdegående analyser. Det ville være skønt hvis du ville kigge på det (sender DB pr. mail), da tiden desværre er en vigtig faktor.
Avatar billede terry Ekspert
29. august 2002 - 08:24 #8
foldager>You can send it to me at mey work and I will see if I can get time. Otherwise it will be when I get home.
dktebrsa@europe.lego.com
Avatar billede terry Ekspert
29. august 2002 - 22:00 #9
just a guess

This line
For intZ = 0 To intZ - 1
should be
For intx = 0 To intZ - 1

and obviously
Next intz should be Next intx
Avatar billede terry Ekspert
29. august 2002 - 22:00 #10
and if it isnt then it is still an error!
Avatar billede terry Ekspert
30. august 2002 - 17:52 #11
Hi Andreas

For intx = 0 To intZ - 1
        With rsBygningsDel
          .AddNew
            !BYGNINGSINDEKS = intgr
            !SFB_INDEKS = varRecordsBygdel(2, intx)
            !Materiale = varRecordsBygdel(3, intx)
            !Emne1 = varRecordsBygdel(4, intx)
            !Emne2 = varRecordsBygdel(5, intx)
            !komp_placering = varRecordsBygdel(6, intx)
            !plac_kode = varRecordsBygdel(7, intx)
            .Update
        End With
    Next intx

hope that clears things up
Avatar billede foldager Novice
30. august 2002 - 20:28 #12
Det ser godt nok mere rigtigt ud med din kode, men der bliver desværre ikke kopieret nogen data.....
Avatar billede foldager Novice
04. september 2002 - 20:27 #13
Terry> Du var så tæt på du kunne komme. Udvikleren har rettet fejlen selv nu. Du havde ret i at Z skulle være X, men det var ikke det eneste der var galt. Selve strukturen bag koden virkede ikke efter hensigten.
Dine råd gav mig gode kort på hånden da jeg skulle forklare hvad der var galt.

Tak for hjælpen!
Avatar billede terry Ekspert
05. september 2002 - 08:07 #14
selv tak :o)
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
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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