2016-03-29 24 views
2

tarafından yürütüldüğünde hiçbir şeyi silmiyor Kullanıcının iptal etmesi durumunda yeni oluşturulmuş bir kaydı silmek için kodumu almaya çalışıyorum. Bazı nedenlerden dolayı sorgu, tablo içinde bulunan benzersiz kimlikler için filtreleniyor olsa da kaydı silmez. Erişim herhangi bir hata atmıyor.CurrentDb.Execute silme sorgusu, VBA

PG_ID, her iki tabloda da benzersiz tanımlayıcıdır, Uzun Tamsayıdır.

Aşağıda, kodumun bir örnek bölümünü ekledim. Lütfen yardım et!

Dim var_PGID As String 
    Dim Delete_PG_Data, Delete_PG_Upld As String 
    Dim db As Database 
     Set db = CurrentDb 
     var_PGID = TempVars![var_PG_ID_NEW] 
     Delete_PG_Data = "DELETE * " & _ 
         "FROM tbl_CapEx_Projects_Group " & _ 
         "WHERE PG_ID=" & var_PGID 
     Delete_PG_Upld = "DELETE * " & _ 
         "FROM tbl_CapEx_Projects_Group_Attachements " & _ 
         "WHERE PG_ID=" & var_PGID 
     Debug.Print Delete_PG_Data 
     Debug.Print Delete_PG_Upld 
     db.Execute Delete_PG_Data, dbFailOnError 
     db.Execute Delete_PG_Upld, dbFailOnError 

İstendiği gibi msgbox'ı Debug.Print konumuna değiştirdim. Aşağıda, bir erişim sorgusuna yerleştirildiğinde doğru şekilde çalışan debug.print çıktısı verilmiştir.

Zamanlama meselesiydi. İşlemi gerçekleştirip sonra silme sorgusunu çalıştırdım. Girişiniz için hepinize teşekkürler!

Private Sub cmd_Cancel_Click() 
On Error Resume Next 
DoCmd.SetWarnings False 
If TempVars![var_NewRecord] = True Then 
    Do While Not Me.Recordset.EOF 
      Me.Recordset.Update 
      Me.Recordset.MoveNext 
     Loop 
      DBEngine.CommitTrans 
      Me.Recordset.Close 
    Dim var_PGID As String 
    Dim Delete_PG_Data, Delete_PG_Upld As String 
    Dim db As Database 
     Set db = CurrentDb 
     var_PGID = TempVars![var_PG_ID_NEW] 
     Delete_PG_Data = "DELETE * " & _ 
         "FROM tbl_CapEx_Projects_Group " & _ 
         "WHERE PG_ID=" & var_PGID 
     Delete_PG_Upld = "DELETE * " & _ 
         "FROM tbl_CapEx_Projects_Group_Attachements " & _ 
         "WHERE PG_ID=" & var_PGID 
     Debug.Print Delete_PG_Data 
     Debug.Print Delete_PG_Upld 
     db.Execute Delete_PG_Data, dbFailOnError 
     db.Execute Delete_PG_Upld, dbFailOnError 

    ''Me.Recordset.Delete 
    ''DBEngine.BeginTrans 
    ''DBEngine.CommitTrans 
Else 
    If Me.Saved Then 
     DBEngine.Rollback 
    Else 
     If Me.Dirtied Then DBEngine.Rollback 
    End If 
End If 
DoCmd.Close ObjectType:=acForm, ObjectName:=Me.Name 
    Form_frm_CapEx_Edit_Project_Groups_Cont.Requery 
DoCmd.SetWarnings True 
End Sub 
+0

Hmm, PG_ID gerçekten uzun bir int ise çalışması gerekir gibi görünüyor. Lütfen 'Debug.Print' tarafından' MsgBox' yerine değiştirin ve Sorbunuz penceresinden çıktıyı sorgunuza ekleyin (Ctrl + G sizi oraya götürür). - Ayrıca bkz: [VBA'da dinamik SQL hata ayıklama] (http://stackoverflow.com/a/1099570/3820271) – Andre

+1

Erişim bir hata verebilir, ancak siz eklemediniz çünkü onu eklemediniz dbFailOnError' parametresi db.Execute. Oluşturucuyu sorgulamak ve orada yürütmek için Delete_PG_Data ve Delete_PG_Upld değişkenlerinin değerini kopyalamaya çalışın. –

+0

TempVars! [Var_PG_ID_NEW] değişkeninin doğru değeri içerdiğinden emin misiniz? –

cevap

0

Kullanım DoCmd.RunSQL

örnek:

Public Sub DoSQL() 

    Dim SQL As String 

    SQL = "UPDATE Employees " & _ 
      "SET Employees.Title = 'Regional Sales Manager' " & _ 
      "WHERE Employees.Title = 'Sales Manager'" 

    DoCmd.RunSQL SQL 

End Sub 

Dolayısıyla yeni kod aşağıdaki gibi olacaktır:

Dim var_PGID As String 
Dim Delete_PG_Data, Delete_PG_Upld As String 
var_PGID = TempVars![var_PG_ID_NEW] 
Delete_PG_Data = "DELETE * " & _ 
        "FROM tbl_CapEx_Projects_Group " & _ 
        "WHERE PG_ID=" & var_PGID 
Delete_PG_Upld = "DELETE * " & _ 
        "FROM tbl_CapEx_Projects_Group_Attachements " & _ 
        "WHERE PG_ID=" & var_PGID 
MsgBox Delete_PG_Data 
MsgBox Delete_PG_Upld 
DoCmd.RunSQL Delete_PG_Data 
DoCmd.RunSQL Delete_PG_Upld 
+2

Aslında "db.Execute", "DoCmd.RunSQL" den daha iyi bir seçimdir: http://www.fmsinc.com/microsoftaccess/query/action-queries/SuppressWarningMessages.htm – Andre

+1

DoCmd.RunSQL, yürütmeden önce varsayılan uyarıları devre dışı bırakmayı da gerektirir . Prosedürü etkinleştirmeden önce başarısız olursa, tasarım modunda herhangi bir işlem yapmanız istenmez, bu nedenle –

+0

veritabanına kazara zarar verebilir. Bu bilgiyi paylaşmak için Andre ve @Sergey'e teşekkür edin. Ben de db kullanmaya başlayacağım.Gelecekteki projelerimde yürüteceğim. –

1

.. kullanıcı eğer yeni oluşturulan kaydı silmek

iptal eder

Kayıtların kaydedilmemesi gibi görünüyor. Olmasa bile, sorguyu başka bir bağlamda formdan çalıştırmak gibi bir zamanlama sorunu olabilir.

Gerçekten oluşturulmuşsa, en basit ve hızlı yöntem, kaydın formu RecordsetClone'dan silmektir.

+0

Bir zamanlama sorunu olabilir. Yukarıdaki yeni kaydı oluşturan kodu ekleyeceğim. Sorun, ana tablo ile aynı anda başka bir kayıt oluşturmam gerekiyor. İkinci tablo, tüm ekleri, aynı tablodayken sorgularımı yavaşlattığından beri tutuyor. İkinci rekor, başarımın oluşturulduğu ana kayıtların bir parçası olmadığından, sorun yaşadığım yerdir, ancak katıldım. – Moehling

+0

Bana da bir zamanlama sorunu gibi görünüyor. Ekleme işleminin kilidi henüz kaldırılmadı, silme işlemi gerçekleştirilemiyor. Kilit, Dosya Sistemi'nde gerçekleşir ve kaldırılması zaman alabilir. ** RecordsetClone ** çalışmıyorsa, formun ** Recordset **, cadı kilidi uygulayan nesne olabilir. – marlan

+0

Teşekkür ederim Gustav, bu bir zamanlama meselesiydi. İşlemi gerçekleştirip sonra silme işlemini, ikinci ekleme tablosunun neden daha önce silemediğinden emin olmadığımdan düzeltdim, ancak her halükarda bunu düzeltmek gerekiyordu. Değiştirilmiş kodumu yukarıda ekledim. Tekrar teşekkürler – Moehling