Kayıt Varsa Güncelle Yoksa Yeni Kayıt Oluştur

1 2
13/08/2020, 15:38

MURTAZAAF

Merhaba arkadaşlar.

Ekteki örnekte bir sipariş ve planlama çalışması yapmaktayım. Birbiri ile ilişkili 6 tablo (siparis**) ve bunlara bağlı 1 adet form mevcut. 
Yapı olarak formda sipariş müşteri bazında kaydı açılıp sonrasında gerekli planlamalar yapılmakta. 
Sipariş numaraları benzersiz olup bu numaralar üzerinden mükerrer kayıt kontrolü oluşturdum. 
Yapmak istediğim formda girilen sipariş numarası mükerrer kayıt kontrolünde vbYesNo kullanarak kayıt mevcut ise ilgili sipariş noya ait verilerini forma geri yükleyerek yapılacak düzenlemeler sonrasında kaydı güncellemek veya iptal etmek. 

Mükerrer kaydı kontrol edebiliyorum, siparişi ilgili tablolardan sorgulayıp recordset oluşturarak formda ilgili alanlara yüklemeleri yapabiliyorum ancak güncellemek istediğimde birincil anahtar hatası ile güncellemeleri yapamıyorum. Nerede hata yaptığım, nasıl düzeltebileceğim hususlarında bana yol gösterebilecek deneyimli arkadaşlardan yardım rica ediyorum.

Şimdiden sonsuz teşekkürlerim ve en derin saygılarımla.

Murtaza AF
13/08/2020, 18:00

berduş

dilerim işinize yarar
tüm değişiklikler FRM_101_Siparisler  formunda yapılmıştır
1 - formun veri girişi:Hayır yapıldı. Bu özellik formun sadece kayıt eklemesine izin verir
2 - form yüklenme olayına açılışta yeni kayda gitmesi için
DoCmd.GoToRecord , , acNewRec
kodu eklenmiştir, böylece sipariş no girildiğinde ilgili kayda gidilebilir
3 - txt_Siparis_No güncellendiğinde olayındaki kodlar değiştirilmiştir, formunuz zaten bir sorguyla ilişkili dolayısıyla verileri recordset ile atamaya gerek yok doğrudan filter özelliği de o işi görür
Dim SPNO, gcSpNo As String
  Dim SPNKR As String
 
  SPNO = Me.txt_Siparis_No.Value
  SPNKR = "SIPARISNO = '" & Forms!FRM_101_Siparisler!txt_Siparis_No & "'"
 
    If Dlookup ("SIPARISNO", "SiparisA0", SPNKR) > 0 Then
     
      If MsgBox(SPNO & " SİPARİŞ NO İLE KAYIT BULUNMAKTADIR." & vbCrLf & _
      "DEVAM EDİLMESİ HALİNDE MEVCUT KAYITTA GÜNCELLEME YAPILACAKTIR." & vbCrLf & _
      "DEVAM ETMEK İSTİYOR MUSUNUZ?", vbYesNo) = vbNo Then
 
    ' güncelleme onaylanmaz ise değişiklikleri geri al
    ' select case için değişken değerini ata
    ' kayıt düğmesinin resim yazısını kayıt ekle olarak değiştir
    Me.Undo
    Me.txt_kayıttanimlama = 0
    Btn_KaydetGuncelle.Caption = "YENİ KAYIT EKLE"
    Me.txt_Siparis_No.SetFocus
   
    Else

    ' select case için değişken alan değerini ata
    ' kayıt düğmesinin resim yazısını güncelleme olarak değiştir.
    gcSpNo = Me.SIPARISNO
    Me.Undo
   
    Me.txt_kayıttanimlama = 1
    Btn_KaydetGuncelle.Caption = "KAYIT GÜNCELLE"
   
    ' kayıt güncellemenin onaylanması halinde sorgu sonuçlarını ilgili form alanlarına yükle
    Me.Filter = "[SIPARISNO]='" & gcSpNo & "'"
    Me.FilterOn = True
   
    End If

  End If
13/08/2020, 18:57

atoykan

Murtaza Bey bende mesai sonrası ancak bakabildim sorunuza. Gördüğüm kadarı ile de Berduş Üstad son derece pratik bir şekilde çözümlemiş sorununuzu her ikinizin dblerini karşılaştırdığımda. Benim takıldığım bir diğer husus değişken tanımlamalarınızdaki doublelar. Sayısal anlamda ihtiyaçlarınızı bire bir karşılayacağı noktasında emin misiniz? Kodlama tarzınıza baktığımda bir kaç kaynaktan öğrendiğiniz verileri güzelce kendinize göre işlediğinizi ama mantık noktalarında taşların pek yerine oturmamış olduğu izlenimine kapıldım. Lütfen alınmayın nacizane mantığı anlamanız ve ihtiyacınızı doğru belirlemeniz hususlarında minik bir dikkat çekme gayretindeyim sadece.

Bir de Berduş Üstadın kodunda ufak bir değişiklik yapmanız gerekli onu belirtmeyi unutmuşum özür dileyerek onun için düzenliyorum. 3. maddedeki maddedi txt_siparis_no güncellediğinde olayı için yazılan kodlarla ilgili olarak Berduş Üstad son derece pratik çözümlemiş sorununuzu dediğim gibi ancak 25. satırda geçici değişken değerinizi tabloadaki alan değil formunuzdaki alan belirlemeli bu kodun çalışması için.

Dim SPNO, gcSpNo As String
  Dim SPNKR As String

  SPNO = Me.txt_Siparis_No.Value
  SPNKR = "SIPARISNO = '" & Forms!FRM_101_Siparisler!txt_Siparis_No & "'"

    If Dlookup ("SIPARISNO", "SiparisA0", SPNKR) > 0 Then
    
      If MsgBox(SPNO & " SİPARİŞ NO İLE KAYIT BULUNMAKTADIR." & vbCrLf & _
      "DEVAM EDİLMESİ HALİNDE MEVCUT KAYITTA GÜNCELLEME YAPILACAKTIR." & vbCrLf & _
      "DEVAM ETMEK İSTİYOR MUSUNUZ?", vbYesNo) = vbNo Then

    ' güncelleme onaylanmaz ise değişiklikleri geri al
    ' select case için değişken değerini ata
    ' kayıt düğmesinin resim yazısını kayıt ekle olarak değiştir
    Me.Undo
    Me.txt_kayıttanimlama = 0
    Btn_KaydetGuncelle.Caption = "YENİ KAYIT EKLE"
    Me.txt_Siparis_No.SetFocus
  
    Else

    ' select case için değişken alan değerini ata
    ' kayıt düğmesinin resim yazısını güncelleme olarak değiştir.
    gcSpNo = Me.txt_siparis_no.value '(buradaki değeri formunuzdaki alandan almalısınız o yüzden tablodaki değil bu şekilde formdaki alanı belirtmelisiniz)
    Me.Undo
  
    Me.txt_kayıttanimlama = 1
    Btn_KaydetGuncelle.Caption = "KAYIT GÜNCELLE"
  
    ' kayıt güncellemenin onaylanması halinde sorgu sonuçlarını ilgili form alanlarına yükle
    Me.Filter = "[SIPARISNO]='" & gcSpNo & "'"
    Me.FilterOn = True
  
    End If

  End If
13/08/2020, 20:43

berduş

teşekkürler sayın @atoykan, haklısınız metin kutusunun adının olması daha uygun olur.
14/08/2020, 01:37

MURTAZAAF

@berduş ve @atoykan hocalarım öncelikle kıymetli vaktinizi ayırıp sorunuma yardımcı olmak için verdiğiniz desteğe minnettarım, elleriniz dert görmesin.

@berduş Hocam sağolun varolun istediğim tam bunu yapmaktı teşekkür ederim. Açıklamalarınız içinde çok teşekkür ederim, derdim balık tutmayı öğrenmek olduğundan açıklamalarınız benim için son derece kıymetli. Gönlünüze sağlık hocam.  

@atoykan Hocam sizde sağolun, estağfurullah alınmak haddimize değil hocalarımız karşısında. Dediğiniz gibi sizler gibi hakim değilim bir yandan öğreniyorum bir yandan uygulamaya çalışıyorum. Özellikle bu siteden çok şey öğrendim ama üye olmamıştım bilmediğim hakim olmadığım bir konuda yer işgal etmemek adına. Sizler sayesinde öğrenmeye devam ediyorum ama sorunuma çözüm bulamayınca başka yerlerre değil öğrendiğim insanlara danışmak istedim üye oldum sorumu paylaştım sağolun ilgi gösterdiniz. doublelar ile ilgili olarak 16 haneye kadar rasyonel sayıları ifade ettiği ve virgülden sonra sadece 3 sayı kullandığım için bana yeteceğini düşündüm alan kullanımının da önemine yaptığınız vurguları düşünerek. yaptığım hesaplamalarda karşıma çıkan sayılar en fazla 150.000,00 gibi olduğundan double yeter diye düşündüm. Yanlış mıyım bilmiyorum dediğiniz gibi henüz öğreniyorum hatam var ise nasıl düzeltebileceğimi mantığını sizlerden paylaşımlarınızdan öğreniyorum. Bir de eğitim seti satın aldım oradan da öğreniyorum sayın hocam. Tekrar çok teşekkür ederim.
14/08/2020, 01:56

berduş

Rica ederim, yardımı olduysa ne mutlu bize)
Bu arada soru sormaktan çekinmeyin kendi adıma bir çok şeyi soruları çözmeye çalışırken öğrendim.  O nedenle sorular, bazan en saçma yada basit olanı bile, yeri geliyor dikkatimizden kaçan bir şeyi fark etmemizi yeni birşey daha öğrenmemizi sağlıyor.
Iyi calismalar)
1 2