Tabloya Toplu Kayıt Ekleme Problemi

1 2
08/07/2015, 08:48

Allback

Merhaba,

Formdaki metin kutularını tablodaki belirlediğim alana tek seferde girme işlemini halletmiştim. Şimdiki sorunum 2 farklı metin kutusundaki bilgilerin aynı satıra denk gelecek şekilde alt alta girilebilmesi ile ilgili. Kaç tane metin kutusuna veri girdiysem, tabloya aktarırken o kadar çoğaltarak kayıt yapıyor. 

Metin kutularını grupladım. Sol taraftaki "No" olanların tümünün "Im" değeri "2" sağdakilerin de "3"

 
Formdan bu şekilde verileri girip kaydet dediğimde tabloya aynı satırda olacak şekilde alt alta kaydetmesini istiyorum.



Ama mesajın başında da belirttiğim gibi, tabloya ekleme işlemini aşağı resimdeki gibi yapıyor.
 

Kullandığım kodlar şu şekilde;

Kod:
If IsNull(klasor_no) Or Me.klasor_no = "" Then

MsgBox ("Lütfen ilk satıra klasör numarası yazınız."), vbCritical, "Kaydetme Hatası"
Me.klasor_no.SetFocus
Else
If IsNull(std_klasoru) Or Me.std_klasoru = "" Then
MsgBox ("Lütfen ilk satıra klasör adını yazınız."), vbCritical, "Kaydetme Hatası"
Me.std_klasoru.SetFocus
Else
varmi = DCount("[klasor_no]", "std_klasoru_tablosu", "[klasor_no]= '" & Me.klasor_no & "'")

   If varmi > 0 Then
     MsgBox "Bu klasör numarası daha önce girilmiş" & vbCr & "Lütfen farklı bir kasör numarası yazın.", vbCritical, "Kaydetme Başarısız"
     Else
DoCmd.RunCommand acCmdSaveRecord
DoCmd.SetWarnings False
For Each ctl In Me.Controls
For Each ctl2 In Me.Controls
     If ctl.ControlType = acTextBox Then
          If Not (IsNull(ctl.Value) Or ctl.Value = "") Then
                   
          
     If ctl2.ControlType = acTextBox Then
          If Not (IsNull(ctl2.Value) Or ctl2.Value = "") Then
                    
          
            If ctl.Tag = "2" And ctl2.Tag = "3" Then
               booFilledBox = True
               
               DoCmd.RunSQL "INSERT INTO std_klasoru_tablosu ([klasor_no],[std_klasoru]) VALUES ('" & ctl.Value & "','" & ctl2.Value & "')"
               End If
               End If
               End If
               End If
               End If

Next ctl2
Next ctl

DoCmd.SetWarnings True
sil2
End If
End If
End If

Yardımlarınızı rica ederim.
09/07/2015, 05:24

ozanakkaya

Problemden anladığım kadarıyla örnek uygulamanızı düzenledim. Butonun tıklandığında olayındaki koddaki im olayını kaldırdım, diğer butonları etkilememesi için metin kutularının im değerindeki 2 ve 3 sayılarına dokunmadım.

If IsNull(klasor1) Or Me.klasor1 = "" Then ve If IsNull(klasoradi1) Or Me.klasoradi1 = "" Then todları ile standart no girilmeden klasör adının girilmemesini amaçladığınızı düşünerek bu kodu kaldırdım, yerine KlasorAdiBosMu ve KlasorNoBosMu kodu ekledim, klasör no alanına veri girmeden klasör adına giderseniz uyarı veriyor. Ayrıca "Bu klasör numarası daha önce girilmiş" uyarısının kodlarını tek fonksiyonda topladım.

Sub KlasorAdiBosMu()

On Error Resume Next
Dim MetinNumarasi As Integer
MetinNumarasi = Right(Screen.ActiveControl.Name, 1) - 1
If IsNull(Controls("klasoradi" & (MetinNumarasi))) Then
    MsgBox (MetinNumarasi & ". Satıra Klasör Adı Yazmadan Devam Edemezsiniz.")
    Controls("klasoradi" & (MetinNumarasi)).SetFocus
End If
End Sub

Sub KlasorNoBosmu()
On Error Resume Next
Dim MetinNumarasi As Integer
MetinNumarasi = Right(Screen.ActiveControl.Name, 1)

If IsNull(Controls("klasor" & (MetinNumarasi))) Then
    MsgBox (MetinNumarasi & ". Satıra Klasör Numarası Yazınız")
    Controls("klasor" & (MetinNumarasi)).SetFocus
End If

End Sub
Sub OncedenGirilmisMi()
On Error Resume Next
Dim KontrolNo, VarMi As Integer
Dim KlasorNumaramiz As String
For KontrolNo = 1 To 1
KlasorNumaramiz = Controls("klasor" & (KontrolNo))
VarMi = Dlookup ("[klasor_no]", "std_klasoru_tablosu", "[klasor_no]= '" & KlasorNumaramiz & "'")
If VarMi > 0 Then
MsgBox (KontrolNo & ". satırdaki " & Controls("klasor" & (KontrolNo)) & " verisi daha önce girilmiş, kontrol ediniz.")
Controls("klasor" & (Right(Screen.ActiveControl.Name, 1))).SetFocus
End If
Next KontrolNo
End Sub

Bu şekilde doğru veri girilmedikçe kaydet butonunu tıklayamıyorsunuz. Kaydet butonunun kodlarınız aşağıdaki ile değiştirdim.

DoCmd.SetWarnings False

For Sayi = 1 To 5
   klasornumaramiz = Controls("klasor" & (Sayi))
   klasoradimiz = Controls("klasoradi" & (Sayi))
If Not IsNull(Controls("klasor" & (Sayi))) And Not IsNull(Controls("klasoradi" & (Sayi))) Then
DoCmd.RunSQL "INSERT INTO std_klasoru_tablosu ([klasor_no],[std_klasoru]) VALUES ('" & klasornumaramiz & "','" & klasoradimiz & "')"
End If
Next Sayi
DoCmd.SetWarnings True
sil2

Önceden kalma kontrol kodları duruyor, ancak metin kutularının isimlerini değiştirdiğim için aktif değiller, 
09/07/2015, 08:45

Allback

(09/07/2015, 05:24)ozanakkaya yazdı: If IsNull(klasor1) Or Me.klasor1 = "" Then ve If IsNull(klasoradi1) Or Me.klasoradi1 = "" Then todları ile standart no girilmeden klasör adının girilmemesini amaçladığınızı düşünerek bu kodu kaldırdım, yerine KlasorAdiBosMu ve KlasorNoBosMu kodu ekledim, klasör no alanına veri girmeden klasör adına giderseniz uyarı veriyor. Ayrıca "Bu klasör numarası daha önce girilmiş" uyarısının kodlarını tek fonksiyonda topladım.

Ozan Bey ilginiz için teşekkür ederim.

Yaptığınız düzenlemeleri detaylı bir şekilde inceledim. Sadece üst kısıma eklediğim alıntıdaki gibi, klasor1 ve klasoradi1 boşsa kayıt ekleme kodları yerine yazdığınız kodlar ilk açılışta çalışıyor ama bir kez kayıt ekledikten sonra çalışmıyor. Yani kaydet butonuna her bastığımda boş kayıt açmaya devam ediyordu. O yüzden ben yine kaydet butonunun başına alttaki kodları eklemek zorunda kaldım. 


Kod:
If IsNull(klasor1) Or Me.klasor1 = "" Then

    MsgBox ("Boş Kayıt Girilemez"), vbCritical, "Kaydetme Hatası"
   klasor1.SetFocus
   Else
   If IsNull(klasoradi1) Or Me.klasoradi1 = "" Then
    MsgBox ("Boş Kayıt Girilemez"), vbCritical, "Kaydetme Hatası"
   klasoradi1.SetFocus

Bir de "Klasor No" metin kutularına daha önce girilmiş bir kaydın numarası girildiğinde hata veriyor ama daha önce girilmemiş bir numarayı aynı anda farklı iki kutuya girilmesini engellemiyor. Yani farklı iki kutuya aynı anda "10" yazıp kayıt ekleyebiliyorum. Henüz kayıt oluşmadığından hata vermemesi normal. Aynı anda yazılmasını belki engelleyemeyiz ama aynı iki numaranın kayıt edilmesini engelleyebilir miyiz?

İlginize tekrar teşekkürler...
Saygılarımla
09/07/2015, 12:51

ozanakkaya

Kodda ufak düzeltme yaptım, kodda 1 to 1 yazılmış.
Yeni yazılanın kontrolü için yeni konu açınız.
09/07/2015, 17:00

Allback

(09/07/2015, 12:51)ozanakkaya yazdı: Kodda ufak düzeltme yaptım, kodda 1 to 1 yazılmış.
Yeni yazılanın kontrolü için yeni konu açınız.

Ozan Bey tekrar teşekkürler,

Dediğiniz gibi 1 To 1 yerine 1 To 5 yapınca düzeldi. Çok ufak bir düzeltme daha isteyeceğim sizden bunun için ayrı konu açmama gerek yoktur umarım.

"std_klasoru_tablosu"ndaki "klasor_no" alanının türünü "Metin" yerine "Sayı" yapınca, "önceden girilmiş mi" sorgusu çalışmıyor. 

Bu alanın türü metin olunca da klasor_no'ya göre sıralama yaptığım için sıralamada 1'den sonra 2 yerine, 10,11,12 diye gidiyor. 

Aynı kaydın engellenmesi ile ilgili sorum için yeni başlık açıyorum.
09/07/2015, 18:31

ozanakkaya

Örnek uygulamada bahsettiğiniz sorgu yok. Konu başlığındaki sorudan farklı sorunuz var ise yeni konu açmalısınız. Site Kurallarını tekrar gözden geçiriniz.

Konu başlığındaki soru cevaplandı ise taşıyalım.
1 2