Skip to main content

AccessTr.neT


Yürüyen Bakiye uygulamamdaki problem

Yürüyen Bakiye uygulamamdaki problem

Çözüldü #1
Merhaba,
Örneğini oluşturup eklediğim Yürüyen Bakiye uygulamamda bir problem mevcut. Örneğim üzerinden anlatmaya çalışayım.

Önce SrgYuruyenBakiyeIkraz sorgusunu açın ve parametre istediğinde 7506 değerini girin. Sorgu sonucu bu şekilde doğru çalışıyor. Yani benden istenen yürüyen bakiye şekli böyle. Bir sıkıntı yok buraya kadar.

Şimdi IkrazHareket tablosunu açın. 7506 sicilinin ÖDEME değerlerinden herhangi ikisinin Yıl ve Ay bilgisini aynı yapın (veya aynı yıl-ay bilgisine ait bir kayıt daha girin). Örneğin tabloda iki tane 2012-2 değeri olsun. Şimdi SrgYuruyenBakiyeIkraz sorgusunu aynı sicil için tekrar çalıştırın ve Bakiye değerlerini inceleyin. İşte bu şekilde olduğunda bakiye değerleri o satırlarda bozuluyor.

İşin kötüsü, bu tabloya aynen yaptığımız gibi, aynı sicile aynı yıl-ay değerine ait birden fazla kayıt girilebilecek olması.

Ben bu uygulamayı Access'te yapmaya çalışıyorum. Daha önce kullanılan program QBasic gibi bir dille yazılmış. Yani yürüyen bakiye oluşturuluyor ama ekranda satır satır aşağıya inilebildiği için bir önceki satırın bakiye değeri bir değişkende tutulabiliyor yanlış anlamıyorsam.

Bu şekilde yürüyen bakiye oluşturabilmek için toplamda 4 sorgu kullanıyorum ve SrgYuruyenBakiyeIkraz sorgusunun Bakiye alanını da bir function oluşturuyor.

Bu problemi aşabilir miyim? Yorumlarınızı, fikirlerinizi öğrenebilir miyim?

Ek Dosyalar
 YuruyenBakiye.rar(33.27 KB)


Edit:
Function'daki açıklama satırlarını silip tekrar yükledim dosyayı. Yanlış yönlendirebilirdi.
Son Düzenleme: 26/12/2011, 23:54, Düzenleyen: WiniFred.
Cevapla
Çözüldü #2
Ufak bir açıklama daha yapma gereği duydum. Yukarıdaki mesajımda havada kalmış bir ifade var.

ÖDEME değerine sahip aynı yıl-ay bilgisine sahip iki kayıt girin demişim. Burada neden iki ayrı kayıt giriliyor ki? Aynı kayıtın Alacak değeri güncellensin. sorusu çıkıyor ortaya.

Şöyle diyeyim. Örneğin Yıl-Ay bilgisi 2012-2, Izahat bilgisi İADE ve Borç değeri 750 TL olan bir kayıt girin.

Şimdi daha net anlaşılabilir umarım.
Saygılarımla...
Cevapla
Çözüldü #3
Sebebi sorguya ID alanının eklenmiş olması olabilir, yeni bir sorgu oluşturup sorguya "SrgYuruyenBakiyeIkraz" sorgusunu ekleyip ID hariç tüm alanları sorguya ekleyin, "Toplamlar"ı tıklayıp Borç ve Alacak sütunlarının Toplam: değerini "Topla", diğer alanları "Grupla" olarak belirleyin.
Cevapla
Çözüldü #4
İşyerindeyim ve söylediğinizi henüz deneme imkanım yok. Ama problemin ondan kaynaklanmadığına hemen hemen eminim. Bu sorgu şöyle çalışıyor (7506 sicil için):

SrgIkrazDevirBilgisi sorgusu ile Sicilin en büyük ID'li İkraz veya Devir bilgisi alanı bulunuyor. YuruyenBakiyeIkraz function'ı ile bunun borç alanı bakiyeye atılıyor.

Daha sonraki satırlarda, Bu ikraz (veya devir) bilgisinin yıl-ay bilgisinden büyük-eşit, geçerli satırın yıl-ay bilgisinden küçük-eşit değerli Ödemeler SrgOdemeToplami sorgusu ile, İadeler SrgIadeToplami sorgusu ile toplanıyor. Function'daki

YuruyenBakiyeIkraz=BakiyeD-ToplamOdemeD+ToplamIadeD

satırı ile bakiye alanı oluşturuluyor.

Şimdi problem şurada oluşuyor: Aynı yıl-ay değerine sahip iki satır varken, bunların ilk satırında olsak bile, SrgToplamOdeme ve SrgToplamIade sorgularındaki kriter sadece bu satırın yıl-ay bilgisine bakıyor (diyelim ki 2012-02) ve bu değerden küçük-eşit, ikraz satırının yıl-ay bilgisinden (2011-12) büyük-eşit ödeme ve iade değerlerini topluyor.

İşte burada, bir sonraki satırın yıl-ay bilgisi de 2012-2 olduğu için hesaba onu da katıyor (kriter olarak sadece yıl-ay alındığı için). Bu nedenle de bakiye yanlış bulunuyor. Bir şekilde geçerli satırdan sonraki satırları görmemesini sağlamam gerekiyor ama bu mümkün değil gibi geliyor bana.

Sorguya ID değerini mecburen ekledim zaten. Çünkü bu sorguyu bir forma kayıt kaynağı olarak tanıttım. Kalıcı İletişim kutusuyla da tablo üzerinde yeni kayıt ekleme, kayıt güncelleme ve kayıt silme işlemlerini tanımladım. ID alanı formda gizli olarak, bu işlemleri yapabilmem için mecburen duruyor.

İnternette form üzerinde yürüyen bakiye uygulamasına dair bir örnek bulamamıştım. Hatta herkes mümkün değil diyor, ancak sorgu ya da raporda yapılabileceğini söylüyordu. Bu meseleyi de bu şekilde güzelce çözmüştüm. Ta ki bu küçük sıkıntıyı yakalayana kadar.

Uygulamamın ilk hali ise bakiyeyi tabloya kaydediyordu. Formda bakiye yürütme yapılamayacağı söylendiğinden böyle tasarlamıştım ve geçmişe yönelik kayıt girilemiyordu doğal olarak ama düzgün çalışıyordu. İlla geçmişe yönelik kayıt girilebilmesini istedikleri için bu şekle çevirmiştim.
Cevapla
Çözüldü #5
Galiba çözdüm.
Sicil ve Bakiye için Global birer değişken oluşturdum. Yalnız yaptığım şeyde uygun yerlerde Sicil Global değişkeninin değerini sıfırlamam gerekiyor (ekteki örnek için geçerli değil bu, asıl uygulamam için geçerli. ekteki örnek için function yeterli).
Form üzerinde Yeni Kayıt Ekle ve Güncelle butonunun altında sıfırladım. Formun kapanışında ve açılışında da sıfırlamam gerekecek galiba. Yoksa kayıt ekleme, silme, güncelleme, başka sicil filtreleme gibi işlemlerin hepsinde hafızadaki global değişkenin değeri üzerine işlem yapmaya devam eder.

Function kodları inanılmaz kısaldı, Dört sorgu yerine tek sorgu yeterli artık. Umarım yine bir yerlerde hata bulmam Halay

Ek Dosyalar
 YuruyenBakiye.rar(35.93 KB)
Cevapla
Çözüldü #6
Merhaba,
Bu uygulamamda ufak bir problem tespit ettim ama çözemedim bir türlü. Uygulama düzgün çalışıyor, yalnızca ufak bir yerde, sanırım global değişkende depoladığım bakiye bilgisini sıfırlayamadığından dolayı yanlış hesaplıyor. Ayrıntıları şöyle:

Yürüyen Bakiye sorgularını hazırladım (Aidat, Biriktirme ve İkraz için birer tane sorgu). Sorguların bakiye alanlarını -Aidat, Biriktirme ve İkraz için ayrı ayrı oluşturduğum- function'lardan dönen değerler oluşturuyor.

Benden istenen yürütme şekli (sadece AidatHareket ve BiriktirmeHareket için anlatıyorum):

İzahat=Devir ise Bakiye=Alacak olacak.
İzahat=Ödeme ise Bakiye=Bakiye+Alacak olacak.
İzahat=İade ise Bakiye=Bakiye-Borç olacak.

Bu şekilde çalışacak şekilde sorguyu hazırladım. Bu sorguyu bir forma bağladım (sorguya ID alanını ekledim mecburen, bu alan formda gizlenmiş olarak bulunuyor.). Form üzerine kayıt ekle, güncelle, kayıt sil butonları yerleştirdim. ID alanını kriter alarak tablo üzerinde güncelleme ve silme işlemlerini yaptırıp formu yeniliyorum. Tabi yeni kayıt ekleme işlemini de yaptırıp formu yeniliyorum. Bakiyeyi yeniden hesaplaması için birçok yerde Global değişkenleri sıfırlıyorum. Bu birçok yer gereğinden fazla olabilir. Tam olarak nerelerde yapmam gerektiğini kestiremediğim için aklıma gelen her yerde yaptım diyebilirim.

Problem şurada çıkıyor:

İzahat=Devir ise Bakiye=Alacak olduğu için, bu şekilde başlayan kayıtlarda hiçbir sıkıntı çıkmıyor. Çünkü bu noktada global bakiye değişkenini her seferinde düzeltiyor. Ama devir ile başlamayan kayıtlarda, güncelleme, ekleme, silme işlemi yaptığınızda, veya form üzerinde herhangi bir satıra tıkladığınızda bakiyelerin yanlış hesaplandığını göreceksiniz.

AidatHareket için bunu deneyin. Ekteki dosyayı açın. "Aidat Hareket" sekmesine tıklayın. Bakiyeler doğru hesaplanmış görünür (görünmeli). Şimdi satırlardan herhangi birine tıklayın veya alttaki butonlarla bir işlem yapın. Bakiyenin bozulduğunu göreceksiniz. Şimdi formdaki diğer sekmelerden birine tıklayın ve yine Aidat Hareket sekmesine tıklayın. Bakiyenin yine düzgün hesaplandığını göreceksiniz. Düzelmesinin sebebi, (yanlış anlamıyorsam) sekme denetiminin change event'ında global bakiye değişkenlerini sıfırlatmış olmamdır.

Şimdi yıl ay bilgisi Aidat Harekette görünen ilk kayıttan önce gelecek şekilde (6039 sicil için 2011-12'den önce) bir adet DEVİR kaydı ekleyin. Bakiyenin düzeldiğini göreceksiniz. Bu şekildeyken zaten daha sonra yanlış hesaplama yapmıyor.

Ama, ilk kaydı DEVİR olmayan kayıtlar olacak tabii ki. İşte bu nedenle bu sıkıntı aşmak istiyorum. Global Bakiye değişkenlerini başka nerede sıfırlatmalıyım ki hesabı yeni baştan yapsın bu durumlarda?

Ek Dosyalar
 YuruyenBakiye.rar(111.5 KB)


NOT 1: Eklediğim uygulama, üzerinde çalıştığım projeden kişisel bilgileri ve fazlalıkları çıkararak oluşturduğum bir uygulamadır. Görebildiğim kadarıyla -yukarıda bahsettiğim problem hariç- düzgün çalışmaktadır. Yani yürüyen bakiye uygulamasının forma uyarlanma şekliyle ilgili, forum üyelerine örnek teşkil edebilir diye düşünüyorum (hatalıysam affola).

NOT 2: Module1'deki diğer functionları silmekle uğraşmadım. Global Bakiye değişkenlerini sıfırlayan yordam en alttadır.

NOT 3: İkraz Hareket için yürütme şekli:

İzahat=Devir veya İzahat=İkraz ise Bakiye=Borç olacak (yani Aidat ve Biriktirmeden farklı olarak İzahat=İkraz ise de Bakiyeyi düzeltir.).
İzahat=Ödeme ise Bakiye=Bakiye-Alacak olacak.
İzahat=İade ise Bakiye=Bakiye+Borç olacak.

Edit:
NOT 4: Her kişinin ilk kaydını Devir=0 ile başlatmak da mümkün. Ama bunu problemi çözemezsem uygulatmak istiyorum.
Son Düzenleme: 02/01/2012, 21:05, Düzenleyen: WiniFred.
Cevapla

Bir hesap oluşturun veya yorum yapmak için giriş yapın

Yorum yapmak için üye olmanız gerekiyor

ya da