2009-06-16 11 views
0

J'ai ce code avec lequel j'essaye de copier un enregistrement dans VBA. Malheureusement, je ne peux pas le faire fonctionner. Je ne sais pas pourquoi ça ne fera rien.Copie d'un enregistrement dans VBA 2 (la nouvelle question)

Dim OldRecord As DAO.Recordsets, NewRecord As DAO.Recordset 
Dim strSQL As String 

strSQL = "SELECT [Tote Log].* FROM [Tote Log] WHERE Number = " & _ 
      Me.tbScannerRead.Value 

Set OldRecord = CurrentDb.OpenRecordset(strSQL) 

If OldRecord.Count = 1 Then 
    Set NewRecord = _ 
       CurrentDb.OpenRecordset("SELECT [Tote Log].* FROM [Tote Log]") 
    With NewRecord 
     .AddNew 
     For i = 0 To .Fields.Count - 1 
      .Fields(i).Value = OldRecord.Fields(i).Value 
     Next i 
     .Fields("Number").Value = Me.tbScannerRead & "B2" 
     .Update 
     varBookMark = .Bookmark 
    End With 
    NewRecord = varBookMark 
    DoCmd.RunCommand acCmdSelectRecord 
    Me.tbMessageBox = "Added new record" 
    Me.tbMessageBox.Visible = True 
    GoodToteRead = False 
    Me.tbScannerRead.SetFocus 
End If 

je reçois rien, je suis en train de copier un enregistrement du journal fourre-tout et changer le numéro de, disons, L20444 à L20444B2 et ont les mêmes informations sur le terrain que l'original. C'est là que je suis si loin mais je n'ai rien. Ahy Aide serait grandement, et je veux dire grandement, apprécié. Merci

Répondre

1

Il y a quelques petites choses qui pourraient l'être. En voici un. Votre table a-t-elle une clé primaire? Il semble que vous essayez de mettre à jour la clé primaire à une valeur qui existe déjà dans la table avant de la modifier. Est-ce que cela se passe sur un formulaire? Si c'est le cas, Access peut vous contrarier en changeant un jeu d'enregistrements derrière lui. un me.undo() avant de faire des changements peuvent aider. Aussi, si vous êtes sur un formulaire, vous pouvez accomplir la même chose de cette façon. C'est un peu hacky, mais c'est un moyen facile.

DoCmd.RunCommand acCmdSelectRecord 
DoCmd.RunCommand acCmdCopy 
DoCmd.GoToRecord , , acNewRec 
DoCmd.RunCommand acCmdPaste 

En guise d'alternative, je recommanderais quelque chose dans ce sens.

Dim sSql As String 
Dim sUpdateSuffix as string 
sUpdateSuffix="B2" 
Const sTableName As String = "[Tote Log] " 
sSql = "INSERT INTO "[Tote Log]([number],[whateverelse]) " & _ 
     "SELECT [number]" & sUpdateSuffix & ",[whateverelse] FROM [Tote Log] WHERE Number = " & Me.tbScannerRead.Value 
CurrentProject.Connection.Execute sSql 

Si vous voulez construire la chaîne sql utiliser dynamiquement la même méthode que vous avez déjà utilisé en boucle à travers les champs et construire la chaîne de requête. me.requery reconstruira le jeu d'enregistrements de formulaire.

Un espoir qui vous aide

0

Eh bien, il pourrait effectivement enregistrer l'enregistrement de la base de données, mais ne pas le réafficher; J'ai du mal à déchiffrer cette partie du code, et je ne sais pas à quoi correspond votre formulaire.

Quoi qu'il en soit, vous devez ouvrir vos recordsets comme ceci:

Set rs = db.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges) 

surtout si vous utilisez SQL Server comme back-end (que vous devriez). Une fois que vous avez enregistré l'enregistrement, vous devez probablement recharger l'enregistrement dans votre formulaire en faisant un recordset.find(), plutôt que d'essayer de le mettre en signet. Les signets ne fonctionnent que sur le même jeu d'enregistrements dont ils proviennent. Cela fournit une vérification aller-retour que les données ont été réellement enregistrées dans la base de données.

Questions connexes