Select Case Sorunu

1 2
15/05/2009, 18:24

dengesiz

oraya girmemesi gerekiyor iste gelen degere gore onu yapmasi lazim gelen deger eger EXCAVATION ise oraya girecek sorgunun amaci o ama yapmiyor. Problem bu zaten Form_TARIH.deger "STRINGING" ise case ile STR tablosunu acacak ikiside degilse WLD olarak bakip ona WLDNG tablosunu acacak ama gelen Form_TARIH.deger TARIH formunda gozukuyor form1 de gozukmuyor ??degiskeni public tanimladim butun formda kullaniyim diye ama ?
15/05/2009, 19:47

Seruz

Sn. Dengesiz,

Programında kodlama da o kadar çok hatan var ki hangisini yazayım bilemiyorum.

Sana ilk ve acil tavsiyem kodların başında "Option Explicit" kullanman.
Yani değişken tanımlamayı zorunlu hale getirmen.
Default olarak yapmak istersen Vba penceresinde Tools-Options-"Require Variable Declaration" seçeneğini işaretle.

Bunu yapmış olsaydın, mesela daha baştan, Komut48'de Select Case kısmında
Kod:
Deger = EXCAVATION
kısmında hata verirdi ve sende burayı
Kod:
Deger = "EXCAVATION"
şeklinde yazman gerektiğini anlardın.

Burada Deger adlı değişkene string bir deger atarken "" kullanmak zorundasın, kullanmadığın için bunu bir değişken olarak görüyor ve o değişkene atanmış bir değer olmadığı için Deger adlı değişken değersiz oluyor. Senin kodda değişken tanımlama zorunluluğu da olmadığı için hata da vermiyor doğal olarak.

Form_TARIH.deger adlı değişkenin bulunamaması ve boş gelmesine gelince;
Senin kodlamanda Komut48'in sonunda Form1 adlı formu açtıktan sonra TARIH adlı formu
kapatıyorsun ve hooop o tanımladığın global değişkenler de onunla beraber yokoluyor.
Kod:
...
          DoCmd.OpenForm "Form1", acNormal
    End Select
    DoCmd.Close acForm, "TARIH"

Diyeceksin ki ben Form1 in içinde load kısmında Sql adlı değişkeni kullanıyorum ama listbox'ta kullanamıyorum. Çünkü form1'i açarken load event'i aktif olur ve TARIH formundaki değişkenleri kullanırsın ama bu aşamadan sonra yani form1 açıldıktan sonra Komut48 kaldığı yerden çalışmaya devam eder ve TARIH formunu kapatır. Böylece daha sonra aktif olan ListBox ile ilgili click olayında o değişkenlere ulaşamazsın, çünkü onlar artık yok olmuştur, o form kapanmıştır.

TARIH formu içinde tanımladığın "deger" alanı sadece o form içinde Global, yani formun içindeki tüm sub ve function'larda kullanabilirsin. O form kapandığında bu değişkeni diğer formlarda kullanamazsın.

Tüm formlarda kullanmak istediğin değişkenleri Module kısmında tanımlamalısın. Tarih formundaki bu değişkenleri oradan kaldır, yeni bir module aç ve bu public değişkenleri orada tanımla. Tabii burada tanımladıktan sonra kodunda şunları da şöyle değiştireceksin.
Form_TARIH.SQL -> Sql ve Form_TARIH.Deger -> Deger olacak.

Son olarak da Liste2 DoubleClick'de aşağıdaki şekilde olmalı.
Kod:
Select Case Deger
Case "EXCAVATION"
    DoCmd.OpenForm "EXC", acNormal, , "ID=" & Me.Liste2
    DoCmd.Close acForm, "Form1"
    DoCmd.Close acForm, "TARIH"
Case "STRINGING"
    DoCmd.OpenForm "STR", acNormal, , "[ID]=" & Me.Liste2
    DoCmd.Close acForm, "Form1"
    DoCmd.Close acForm, "TARIH"
Case Else
    DoCmd.OpenForm "WLDNG", , , "[WLD]='" & Me.Liste2 & "'"
    DoCmd.Close acForm, "Form1"
    DoCmd.Close acForm, "TARIH"
End Select

Formlarında kapat tuşları yok, en az 5-6 kere task manager'dan msaccess 'i sonlandırmak
ve tüm formlarda control box ve close tuşunu aktif etmek zorunda kaldım.
Mesela en son "EXC" adlı formu açtıktan sonra kullanıcı o formu nasıl kapatacak bende bilmiyorum.
TARIH formunda komut düğmelerinde özel resim kullanmışsın, her seferinde hata verdi, kaldırmak zorunda kaldım.

Kodlamanda düzenli Tab, yani içiçe düzenli bir şekil yok.
Kodlarını okumak, hangi endif hangi if'e ait, next'in for'u nerede bulmak mesele.

Yani şunu demek istiyorum; kod böyle yazılmaz
Kod:
For Each fld In Rs.Fields
say = say + 1
    sd = sd & ";2000"
    Next fld

Böyle yazmalısın:
Kod:
For Each fld In Rs.Fields
     say = say + 1
     sd = sd & ";2000"
Next fld

Bu şekilde kod yazmaya devam edersen, sende hatalarını göremezsin,
hata bulmakta veya kodu takip etmekte çok zorlanırsın, sana yardımcı olmak isteyen kişilerde.

Yani neredeyse, yapılmaması gereken her şeyi yapmışsın.

Bu sayede ufak bir problemi çözebilmek için sende saatlerce uğraşmışsın,
belki bir kaç dakikada çözülecek bu problem için bende 1 saattir uğraşıyorum.

Umarım anlatabilmişimdir.

Saygılar
16/05/2009, 08:04

dengesiz

Tesekkurler Sayin Seruz anlatabildiniz menulere sag tus ozelligi ekledim fakat siz macrolari menu ogesi olarak atamadiginiz icin kapat ileri geri gibi ozellikleri goremediniz. Normalde kapat ileri geri gibi butun buton ozelliklerini sag tusa verdim.

Bu uyari hatalarina gelince soyledigim gibi ben ingilizce olarak kullaniyorum mecburen yurt disinda oldugum icin benim yaptigim veri tabani Turkce de sizin yaptiklariniz da bende calismiyor. veri Al secenegi ile tekrardan yapilmasi gerekiyor.


Saygilar.
16/05/2009, 11:02

Seruz

Kodlama üzerine çok çalışmalı, çok okumalı ve bol örnek yaparak kendinizi geliştirmelisiniz. Belki ilk başlarda kafayı yedirtebilir ama daha sonra kodlara hakim olmaya başladıkça çok zevkli olacaktır.

Benim tahminime göre yukarıdaki mesajlarda bahsettiğim Breakpoint olayını kullanamamışsınız, onun üzerinde biraz daha çalışmalısınız. Kodu adım adım çalıştırarak ve her adımda değişkenlerin aldığı değerleri görerek koda hakim olabilir ve hataları daha kolay bulabilirsiniz.

Değişken tanımlamayı zorunlu hale getirmeyi alışkanlık edinin. (Option Explicit)

Aslında sizin uygulamanızda Sql ve Deger adında global değişkenlere ihtiyacınız yok, TARIH formu açık olduğu sürece, diğer sorgu, form ve raporlarda bu forma ait denetimleri zaten direkt olarak Forms![FormunAdı].[DenetiminAdı] formatında kullanabilirsiniz.

Mesela Deger adlı global değişkeni kullanmadan Liste2 Doubleclick'i şu şekilde kullanabilirdiniz;
Kod:
Select Case Forms!TARIH.cerceve
    Case 1 'EXCAVATION
        DoCmd.OpenForm "EXC", acNormal, , "ID=" & Me.Liste2
        DoCmd.Close acForm, "Form1"
        DoCmd.Close acForm, "TARIH"
    Case 2 'STRINGING
        DoCmd.OpenForm "STR", acNormal, , "[ID]=" & Me.Liste2
        DoCmd.Close acForm, "Form1"
        DoCmd.Close acForm, "TARIH"
    Case Else
        DoCmd.OpenForm "WLDNG", , , "[WLD]='" & Me.Liste2 & "'"
        DoCmd.Close acForm, "Form1"
        DoCmd.Close acForm, "TARIH"
    End Select
Aynı şekilde Sql değerinide form1'in load'unda yaratmanız mümkün.

Bu arada bu kadar uğraştıktan sonra REP istemek hakkımdır sanırım.
MehmetDemiral aldı başını gitti, bende Sledgeab'ı geçmek istiyorum
16/05/2009, 13:25

dengesiz

(16/05/2009, 11:02)Seruz yazdı: Bu arada bu kadar uğraştıktan sonra REP istemek hakkımdır sanırım.
MehmetDemiral aldı başını gitti, bende Sledgeab'ı geçmek istiyorum Onerilerinizi uygulayacagim yardimlariniz icin de cok tesekkurler. +3 yeterlidir sanirsam
rica ederim .
1 2