Formlar arası veri aktarımı

1 2
26/12/2009, 03:56

Hayri16

Değerli Arkadaşlar;
Burada öğrendiklerimle kişisel bir eczane programı yapmaya çalışıyorum. Programda takıldığım bir yer var. Kısaca anlatmaya çalışayım.
SGK provizyon programının b.sayarımıza bıraktığı *.csv dosyayı(74 alan içeriyor) access'e alıp , işlemlerden geçirerek oluşturduğum tablolara aktarıyorum.
Bunun için hazırladığım formda "FRM_AKTARMA" önce ham kayıtların bazı alanlarını seçerek listeye aktarıyorum.
Tıklayınca gerekli alanları dolduruyor. Bu arada hastayı sorguluyor. Eğer TBL_HASTA_BILGI veritabanında yoksa kullanıcıya ekleyeyim mi diye soruyor. Kullanıcı ekle derse "FRM_HASTA" formu açılarak yeni hasta kaydedilmesi sağlanıyor.
1- Yeni hasta kaydedilince formdaki bilgilerde karışıklık oluyor. Yeni hasta kaydedilirken (normalde bilgilerinin bazı alanları boştur.) FRM_AKTARMA formunda başka hastaların bilgileri çıkıyor.
2- Eğer işlem yapmadan çıkış seçeneği kullanılırsa bu kez "kaynakliste" adındaki listede (formu tasarım görünümünde açıp tekrar çalıştırıldığında) son hasta kaydımızın birebir kopyası üretiliyor.
Sonuçta bu formlar arası veri aktarımında "garip işler" dönüyor İlgilenecek arkadaşlarımıza şimdiden teşekkürler. Saygılarımla...
Not: Kullanılan veriler(TC no, adres, soyad,telefon) uydurmadır. İlaç bilgileri, firma ve barkodlar gerçektir.
26/12/2009, 06:32

ozanakkaya

Daha önce yazılan mesajları konuyu okuyacakların kafasını karıştırmaması için sildim.

hgetir = Dlookup ("last(kimlik)", "TBL_HASTA_BILGI")

kodu ile TBL_HASTA_BILGI tablosundan son kaydı alıyorsunuz ve devamındaki kodlarla bu kimlik numarasına göre forma son kayıttaki verileri aktarıyorsunuz.

devamında da KAYNAK tablosundaki ilk kayıt değiştiriliyor,
Private Sub hasta_kontrol()

kodunu

Kod:
If IsNull(hgetir) Or hgetir = 0 Or hgetir = "" Or hgetir = Empty Then  'yoksa yeni hasta kayıt formunu açıp hastayı ekleyeceğiz
        mesaj = MsgBox("Bu isimli kişi Hasta veritabanında kayıtlı değil." & Chr(13) & "Şimdi Eklemek ister misiniz?", _
        vbCritical + vbYesNo, _
        "<<HASTA BULUNAMADI>>")
             If mesaj = vbYes Then
             DoCmd.OpenForm "FRM_HASTA"

strSQL = "SELECT * FROM TBL_HASTA_BILGI "
Set rstkayit = New ADODB.Recordset
rstkayit.Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
With rstkayit
.AddNew
.Fields("adi") = Me.Alan4
.Fields("soyadi") = Me.Alan5
End With
             Else
             Exit Sub
             End If
    Else
    End If

FROM TBL_HASTA_BILGI tablosuna yeni kayıt açtırıp adı ve soyadını kaydedilmesini sağla. (tc kimlik no alanı gerekli değil olarak değiştir)

FRM_HASTA formundaki

Private Sub yenikayit()

koduna yazdığın
.addnew

kodunu
.movelast
(az önce yeni kayıt ekledik, movelast ile son kaydı düzenliyoruz)
olarak değiştir.

ayrıca

FRM_AKTARMA formunun kayıt kaynağı KAYNAK tablosu, yapılan her işlem 1. kayıt üzerinden gerçekleştiriliyor, bu yüzden aynı veriden 2 tane oluşuyor.

yazılan bir koddan dolayı KAYNAK tablosundaki ilk kayıt değiştiriliyor.
26/12/2009, 14:58

Hayri16

Sayın sledgeab;
Gecenin o saatinde ben bile dayanamayıp yatmak zorunda kaldım. Siz ise devam edip çözüm üretmeye çalışmışsınız. Çok sağolun. Önerilerinizi uygulamaya çalışıyorum. Denedikten sonra bilgi vereceğim. Saygılarımla
26/12/2009, 16:16

ozanakkaya

dlookupu çok yanlış kullanmışsın, tablonun kayıt kaynağı hasta tablosu, Dlookup ile hasta tablosundan veri almışsın. Kodların neredeyse tamamı Dlookup .
ekteki örneği incele
26/12/2009, 17:18

Hayri16

Sayın sledgeab;
Öncelikle çok teşekkür ederim.Programı baştan aşağı gözden geçirmiş , mantığını kavramaya çalışmışsınız.
Evet haklısınız çok Dlookup fonksiyonu kulandım. Çünkü programı yazmaya başladığımda başka türlü nasıl yapılır bilmiyordum. Şimdi Ado ile de yapılabileceğini biliyorum. Program genel hatlarıyla bitince onları ve diğer bazı kodları değiştirmeyi düşünüyorum.
Sizin değitirdiğiniz örneğe gelince;
1- Listeye clicklediğimizde liste kutusu geçici olarak kayboluyor
2- Listede gezinirken hasta veritanabında kayıtlı olmayan hastanın (bilgilerini kaynaktan almayan ) alanları başka kayıtlardan geliyor. Tüm alanlar dolu gözüküyor.
3- Öğrenmek amacıyla aşağıda eklediğiniz kodun ne iş yaptığını sorabilir miyim?
Kod:
Private Sub kaynakliste_AfterUpdate()
On Error GoTo hata:
  ' Denetime uyan kaydı bul.
    Dim rs As Object

    Set rs = Me.Recordset.Clone
    rs.FindFirst "[Kimlik] = " & Str(Nz(Me![kaynakliste], 0))
    If Not rs.EOF Then Me.Bookmark = rs.Bookmark
hata:     Exit Sub
End Sub
bu kodu neden clicke değil de afterUpdateye koyduk.
Zahmet verdiğimin farkındayım. Bu kadar çabanız bile şükran duymama için yeterli. Saygılarımla kalın sağlıcakla.
27/12/2009, 00:19

Hayri16

Sayın sledgeab;
Sorunu şimdilik erteledim. Şöyle geçici bir çözüm buldum. Bir form daha yaptım. Eğer hasta yoksa sadece yeni kayıt yapılabilen forma, eğer varsa ve bilgileri eksikse sadece güncelleme yapılabilen forma gönderdim. İleride tekrar dönüp üzerinde değerlendirme yapacağım. Her şey için sonsuz teşekkürler.
1 2