[VBA] Otomatik Frekans Tahsisi Yapabilmek
#1
Herkese merhabalar,
Ekte gönderdiğim örnek veri tabanı daha önce sitemizdeki üstatlarımızın da desteği ile gerçekleştirdiğim ve kullandığım, tls haberleşme çevrimi oluşturan ve bu çevrimlerin tamamına aynı anda OTOMATİK olarak frekans tahsis eden bir veritabanıdır. Önceki sürümünde her tls çevrimine “Tbl_Frekans” tablosundan KULLANIM=0 ve YASAK=0 olan frekanslardan (daha önce tahsis edilmemiş veya yasaklanmamış) aynı anda TEMAS, ESAS ve YEDEK olmak üzere 3 adet frekans ve bu frekanslara ait 3 adet KOD tahsisi yapıyor, tahsis ettiği frekans ve kodları “Tbl_TlsCvrFrekansIslemleri” tablosuna kaydediyordu ve daha sonra bir sonraki çevrime geçerek aynı işlemi tekrarlıyordu. Bu işlem en son çevrime (veya seçilen en son çevrime) de frekans tahsisi yapılana kadar devam ediyordu. Bu işlemde 3 adet frekans 3’lü grup olarak tahsis ediliyordu. Ancak daha sonra ben bu işlemin içine her frekans için ayrı birer Tahsis Tarihi ve Frekans Tahsis Sayısı (numarası) da dâhil etmek isteyince mevcut prosedürde aynı anda 3’lü frekans tahsisi yapılması her bir frekans için özellikle Frekans Tahsis Sayısı (numarası) verilmesini imkânsız hale getirdi.
Ben de yeni düşünceme uygun olarak “Tbl_TlsCvrFrekansIslemleri” tablosu üzerinde değişiklik yaptım ve (TEMASFRE, FREDGRT, FREKODT), (ESASFRE, ESASFREDGR, ESASFREKOD), (YEDEKFRE, YEDEKFREDGR, YEDEKFREKOD) 3’lü grup alanları ile TAHSISTRH alanını silerek yerlerine tek bir frekans alanı olan KFREKANS, KFREDGR, KFREKOD alanlarını, frekansın ne maksatla kullanılacağını (TEMAS, ESAS ve YEDEK) belirlemek için FREKULLMKST alanını, frekansın tahsis edildiği tarihi yazmak için FRETAHSISILKTRH, frekansın tahsisinin sona erdiği tarihi yazmak için FRETAHSISSONTRH ve en son olarak da frekansın tahsis numarasını yazmak için FRETAHSISNU alanlarını “Tbl_TlsCvrFrekansIslemleri” tablosuna ekledim. Ancak FRETAHSISILKTRH, FRETAHSISSONTRH ve FRETAHSISNU alanları için henüz herhangi bir prosedür oluşturmadım, onlarla daha sonra ilgileneceğim. Yeni düzenlediğim “Tbl_TlsCvrFrekansIslemleri”  ve öncesinde kullandığım “Tbl_TlsCvrFrekansIslemleriEski” tabloları ekteki örnekte mevcuttur. Yeni duruma göre manuel olarak frekans tahsis işlemlerini sorunsuz olarak hallettim. Ama otomatik tahsis işlemlerinde takıldım kaldım. Elimde mevcut olan MODÜL üzerinde bilgilerim dahilinde oynamalar yaptım ama maalesef her denememde TYPE MISMATCH hatası aldım özellikle VERYERID için. Hata mesajının ekran görüntüsü de örnekte eklidir.
Otomatik olarak frekans tahsisini yapabilmek için kullandığım “TabloKayitYukleme” ve eski şekli “TabloKayitYuklemeEski”  örnekte eklidir. Prosedür uygulamasında hataya engel olmak için oriinal Sub FrekansTahsis(frm As Form, GunTar As Date) satırını “TabloKayitYuklemeEski”  modülünde Sub FrekansTahsis1(frm As Form, GunTar As Date) olarak değiştirdim.
Bu yeni düzenleme ile otomatik frekans ataması için yapmak istediğim işlemi şöyle özetleyeyim;
1.      İlk çevrimden başlamak üzere, “Tbl_Frekans” tablosundan KULLANIM=0 (HAYIR) ve YASAK=0 (HAYIR) olan frekanslardan 1 adet frekans seçilecek (ilk kayıtlı kullanılmamış ve yasak olmayan frekanstan başlayacak) ve seçilen çevrime “Tbl_TlsCvrFrekansIslemleri” tablosu üzerinde FREKULLMKST alanına "İLK" yazılarak tahsisi yapılacak, Tbl_Frekans” tablosundaki KULLANIM alanının değerini =-1 (EVET) olarak değiştirecek.
2.      Tbl_Frekans” tablosundan KULLANIM=0 ve YASAK=0 olan frekanslardan 2. frekans seçilecek ve seçilen çevrime “Tbl_TlsCvrFrekansIslemleri” tablosu üzerinde 2. Frekans olarak tahsisi yapılacak ve FREKULLMKST alanına "ORTA" yazılacak, Tbl_Frekans” tablosundaki KULLANIM alanının değerini =-1 (EVET) olarak değiştirecek.
3.      Tbl_Frekans” tablosundan KULLANIM=0 ve YASAK=0 olan frekanslardan 3. frekans seçilecek ve seçilen çevrime “Tbl_TlsCvrFrekansIslemleri” tablosu üzerinde 3. Frekans olarak tahsisi yapılacak ve FREKULLMKST alanına "SON" yazılacak, Tbl_Frekans” tablosundaki KULLANIM alanının değerini =-1 (EVET) olarak değiştirecek.
4.      3 adet frekansın aynı çevrime tahsisi yapıldıktan sonra bir sonraki çevrime geçilerek aynı işlemler yapılacak bu işlemler son çevrime kadar (veya son çevrim olarak seçilen çevrime kadar) devam edecek.
5.      Bu tahsislerde dikkat edilecek önemli bir nokta ise, bir VERİCİ YERİNDE bir çevrime “İLK veya ORTA veya SON” olarak tahsis edilen bir FREKANS hiçbir şekilde aynı çevrime başka kullanım maksadı ile (İLK veya ORTA veya SON) veya AYNI VERİCİ YERİNDEKİ başka bir çevrime de tahsis edilmeyecek. Ama farklı bir VERİCİ YERİNDEKİ başka bir çevrime tahsis edilebilecek. Eski modülde de uygulama bu şekildedir.

Konu ve açıklamalar biraz uzun oldu ama kusura bakmayın...
Herkese sağlıklı günler diliyorum...


Eklenti Dosyaları
.rar   Ornek.rar (Boyut: 625,85 KB / İndirilme: 22)
.png   HataVERYERID.png (Boyut: 327,25 KB / İndirilme: 24)



  Alıntı
Bu mesajı beğenenler:
#2

.rar   Frekans_MKA.rar (Boyut: 618,8 KB / İndirilme: 20) Ilgılı prosedürü güncelledim.



  Alıntı
Bu mesajı beğenenler:
#3
Sayın dsezgin cevabınız için çok teşekkür ederim. Sorumda belirttiğim işlemi mükemmel bir şekilde gerçekleştiriyor. Ancak uygulamada kayıtlı Frekans Bloklarını değiştirerek deneme yaparken bir şey fark ettim. Belki bu önceki orijinal prosedürde de aynıydı ben fark edemedim. Örnek uygulamada XY blokta  7 adet frekans, QB blokta 21 adet frekans görünüyor ve frekans tahsisi yapılacak 6 adet çevrim var. Her bir çevrime 3 adet olmak üzere örnekteki 6 çevrime toplam 18 adet frekans gerekiyor. Frekans tahsisinde kriter olarak kullandığım "aynı verici yerindeki çevrimlerde aynı frekansın kullanılmaması ve sadece KULLANIM=0 ve YASAK=0 olan frekanslardan tahsis yapılması" kriteri çevrimlerin toplam frekans ihtiyacından az sayıda frekans olunca verici yeri farklı dahi olsa tablodaki frekans bitince (sanırım bu örnekteki XY blokundaki bütün frekanslar Kullanım=-1 haline geldiğinden) atamayı bırakıyor ve Run-Time Error '3021' Geçerli Kayıt Yok hatası veriyor. Frekans sayısı Çevrim ihtiyacını karşılıyorsa sıkıntısız frekans tahsisi yapıyor. Bu benim hiç aklıma gelmedi. Ama çevrim sayısı örneğin 100 civarı olabilir, frekans sayısı bu sayıdan az olabilir. Bu durumda frekansın KULLANIM alanının değeri=-1 bile olsa farklı VERYERID'lerde en son seçilen çevrim dahil frekans tahsisine devam edilebilmeli.

Ben sizin yaptığınız örnekte bulunan aşağıdaki satırlardan Where (((KULLANIM)=0) And ((YASAK)=0)" & ifadelerini kaldırıp bütün frekansları kullansın diye değişiklik yaptım ama Type Mismatch hatası verdi.

Debug.Print "Select FREKANS, KULLANIM, FREDEGER, KULLANIMTRH, FREID From Tbl_Frekans Where (((KULLANIM)=0) And ((YASAK)=0)" & IIf(FrkEle <> "", " And " & FrkEle, Null) & ") order by FREID"


Set FrekansTb = CurrentDb.OpenRecordset("Select FREKANS, KULLANIM, FREDEGER, KULLANIMTRH, FREID From Tbl_Frekans Where (((KULLANIM)=0) And ((YASAK)=0)" & IIf(FrkEle <> "", " And " & FrkEle, Null) & ") order by FREID")
FrekansTb.MoveFirst

Yani sonuç olarak bloktaki frekans sayısı çevrimlerim toplam ihtiyacını karşılayacak sayıda olmasa ve frekansın KULLANIM alanının değeri=-1 bile olsa farklı VERYERID'lerde yukarıda bahsettiğim kriterin dışına çıkarak en son seçilen çevrim dahil frekans tahsisine devam edilebilmeli. Bu durumu karşılayacak şekilde düzenleme yapılabilir mi. Yasak şu andaki hali ile kalabilir. Çünkü  YASAK olanlar kesinlikle kullanılmayacaktır. 

Çok teşekkür ederim. (Bunu yazıyor ve tekrar soruyorum ama inanın bilgim becerim dahilinde denemeye devam ediyorum)



  Alıntı
Bu mesajı beğenenler:
#4
kullanimi -1'ler dahil edilince
Set FrekansTb = CurrentDb.OpenRecordset("Select FREKANS, KULLANIM, FREDEGER, KULLANIMTRH, FREID From Tbl_Frekans WHERE (((YASAK)=0)" & IIf(FrkEle <> "", " And " & FrkEle, Null) & ") order by FREID")

Verisinin SQL'i asagidaki gibi olusuyor.
Select FREKANS, KULLANIM, FREDEGER, KULLANIMTRH, FREID From Tbl_Frekans WHERE (((YASAK)=0) And ((BLOKAD)='QB') And ((BLOKALTFRE)='32,500') And ((BLOKUSTFRE)='33,000')) order by FREID



  Alıntı
Bu mesajı beğenenler:
#5
Sayın dsezgin cevabınız için teşekkür ederim.
Cevabınızdaki  kodu "Frekans_MKA" üzerinde denedim ancak bu kodu uyguladığımda kullanılan Frekans Blok'undaki ilk 3 frekansı döndürüp bütün çevrimlere tahsis ediyor Bloktaki diğer frekansları kullanmıyor. If Sayac=3 Then Exit Do ifadesini sildim denedim bu sefer sonsuz döngüye girdi.



  Alıntı
Bu mesajı beğenenler:
#6
[Resim: attachment.php?aid=25284]

Konu benim için uzak.
Şöyle yapalım mi?

Yukarıdaki değerlere, olması gereken aralığa misal verebilir misiniz?

Ornek :
Tbl-Frekansa bakıp, TÇ1-TÇ5 32500 den 33000'e kadar 25 aralıkla tahsis yapılacak!

veya

?


Eklenti Dosyaları
.png   MKA_Frkns.PNG (Boyut: 43,7 KB / İndirilme: 49)



  Alıntı
Bu mesajı beğenenler:


Benzer Konular...
Konu: Yazar Cevaplar: Gösterim: Son Mesaj
  Option Group Wizard çoklu Seçim Yapabilmek Hk. YENIFENER 4 254 13-09-2022, 22:41
Son Mesaj: onur_can
  ürün Formül Tasarımı Yapabilmek mustafacevik 5 635 09-12-2019, 22:20
Son Mesaj: dsezgin
  Form Alanlarını Tek Komutla Enabled=false/true Yapabilmek M_Kemal_Askeri 2 567 01-10-2019, 01:14
Son Mesaj: M_Kemal_Askeri
  [FORM] listekutusundaki verileri tek tek değilde çoklu seçerek işlem yapabilmek husem 7 2.678 06-12-2016, 22:18
Son Mesaj: husem
  [FORM] ana form - alt form alanlarını kullanarak hesaplamalar yapabilmek Mehmet Yörük 2 2.737 04-12-2013, 11:13
Son Mesaj: realist0726
  [FORM] form da text box ta otomatik otomatik hesaplama ve tabloya kayıt cengiztd 4 3.552 13-11-2011, 00:44
Son Mesaj: cengiztd
  form içinde aynı formdan 3 farklı kayıt yapabilmek hasanguclu_19 21 7.817 05-08-2010, 13:24
Son Mesaj: kurt26

Foruma Git:


Bu konuyu görüntüleyen kullanıcı(lar): 1 Ziyaretçi