BilgiTeknoloji.net    
b i l g i   t e k n o l o j i   y a z ı l ı m

Ana Sayfa

Marjinal XML Access Pratik Uygulamalar Projeler Ekonometri Dilimiz Çetrefil İletişim
 

Eski Defterler

Yeni yıla girildiğinde eski defterler karıştırılır ve önceki yılın muhasebesi yapılır, adettir. Biz de eski defterleri şöyle bir yoklayalım dedik. Yeni şeyleri de ihmal etmedik tabii.

Bu dizinin ilk yazısının yazıldığı zamanlarda Türkçe Access97’deki problemlerin yamalarıyla meşgulduk. Yine o aylarda Access’in meşhur “Otomasyon Hatası” piyasada fink atıyordu. Derken “Otomasyon Hatası”nın bize aslında “Otomasyon Nesnesi”ni ima etmeye çalıştığını farkettik. Bu da Sınıf Modülleri (Class), Başvuru Kütüphaneleri (Reference Library) ve Add-in’ler gibi yapılara yöneltti bizi.

Yıllardır değişmeyen bir olgu, Türkiye’de kullanılan tarih biçiminin Windows standardıyla aynı olmamasından kaynaklanan SQL kodu yetmezliği. Gerek ASP veya VB kullanıp ADO ile SQL Server’dan ya da başka bir yerden veri almaya çalışırken, gerek Access’in kendi içinde, gerekse Delphi gibi programlarda Paradox ile çalışırken, SQL kodları içinde kullanılan tarih değerlerinin standart verilememesi, epeydir gördüğüm üzere birçok programcının başını ağrıtmıştır.

Bunun çok önemli olduğunu düşündüğüm için tarih değerlerinin aslında sayı olduklarına değinmiş ve SQL kodu içinde tarih değerinin sayısal karşılığını yazmanın garantili bir çözüm olduğundan bahsetmiştik. Şu an da bundan bahsediyor olmamın sebebi aynı problemin hala birçok yerde yaşandığını görmemdir.

Projelerimizi dağıtma zamanı geldiğinde Access’in kendisine gerek kalmadan Access uygulamalarını çalıştırabilmek için Microsoft’un çıkardığı ODE Tools adlı program ile tanışmıştık. Access dosyası EXE olur mu sorusu sıkça sorulmaya başlandığında, bu programın EXE yapmadığını ama Access dosyalarını EXE gibi çalıştırabilme yeteneğinin olduğunu ve de Access dosyalarının derlenip kodlarının tamamen gizlenebileceğini görmüştük.

SQL kodu yazmak, Access’te programlama sürecinin ayrılmaz parçalarından olduğu için bunu da yeteri kadar önemseyip ilginç ve işe yarar ipuçlarını inceledik.

Otomatik Sayı (Autonumber) alanları da birçoğumuzun hoşuna gitmeyen tavırlar gösteriyordu. Kayıtlar silindiğinde neden eski numaralar kullanılamaz oluyordu?!! Bunun, otomatik sayı alanlarının en temel özelliği olduğu açık. Veri alanının silinip yeniden oluşturulması öneriliyor çok zaman. Fakat bu her zaman yapılamayacak bir şeydi. Yine de Access dosyasının içini kontrol edip belli bir noktasını bulmak bunu sağlıyor. Aşağıda Access dosyalarında otomatik sayı değerinin istenildiği gibi değiştirilebileceğine dair bir örnek bulacaksınız.

Birçok şeyin aslında ayrıntılarda olduğunu görüp belli noktaları yakaladıktan sonra işimize yarayacak şeyler bulmuştuk. Tablo görünümünde başka tablodaki kayıtlardan seçim yaptırabilmek bunlardan biriydi. Yine, tablo kullanmadan elimizdeki değerleri sorgu (query) olarak kullanmak, birleşik sorgular, tablo bağlamaksızın (link) başka bir Access dosyasındaki tabloyu sorguya dahil etmek, tablo görünümünde süzme yetenekleri, geçerlilik kısıtlamaları (validation rules), sistem yazıtiplerini resim olarak kullanmak gibi ayrıntılara rasladık.

Birçok okurumuzun istediği halde, Access’te kod yazmaya geçişten bahsetmemek olmazdı. En azından bir yerden bulunan kod parçasının bir Access programına nasıl ekleneceğinin bilinmesi şarttı.


OTOMATİK SAYI DEĞİŞİR AMA..

Otomatik sayı değerinin değiştirilmesini istemenin sabebi kayıtlara tanım numarası vermekten ziyade görünüşü güzel göstermek olsa gerek.

Aşağıdaki yöntemi sadece otomatik sayıların nasıl işlendiği konusunda bir fikir vermesi açısından dikkate alın. Kullanmanızı tavsiye etmiyorum. Zaten tabloda kayıtlar varken yeni alınacak otomatik sayı değerini sıfırlamak ya da değiştirmek anlam taşımaz.

Küçük bir dosyada otomatik sayı alanı içeren bir tablo oluşturuldu. Bu tabloya 15 kayıt eklendi, bazı kayıtlar silindi. Bu durumdayken dosyanın bir yedeği alındı. Sonra tablo açılıp yeni kayıt satırına gelinerek birşeyler yazıldı ve ESC tuşu ile kayıttan vazgeçildi. Böylelikle dosyanın bir yerine en son kullanılan otomatik sayı değeri yazılmış oluyor. Dosya kapatıldı ve küçük bir kod yazıp iki dosya arasında farklı olan kesimleri araştırdık. Sonuçta bu iki dosya arasında sadece 2 baytlık kesimin farklı olduğunu gördük.

Bunlardan birinin değerini LONG tipinde (4 bayt) okuduğumuzda en son seçtiğimiz otomatik sayı değerini elde ettik. Geriye bu değeri değiştirmek kaldı. Oraya ne yazılırsa otomatik sayı yeni değerini bu numaradan başlatıyordu. Burayı 0 olarak değiştirdikten sonra resimdeki gibi bir görüntü normaldi artık.


Otomatik sayı değeri artık 1’den başlıyor.

Eğer otomatik sayı alanı birincil anahtar (primary key) olarak belirlenmişse, sonraki kayıt girişlerinde çoğaltılmaması gereken dizin değeri hatası (duplicate unique index) ile karşılaşmak kaçınılmaz olur.

Siz en iyisi bu değeri arkaplan işlemleri için kullanın ya da kullanıcıya herhangi bir kod değeriymiş gibi gösterin. Ben olsam ekran başındaki kişiyi resimde olduğu gibi kandırırdım.

Nasıl mı oldu diyorsanız, tablonun tasarım görünümünde otomatik sayı alanının Format (Biçim) özelliğinin değerini tam olarak

“Kod “#

şeklinde belirtmeniz yeterli.


DEĞİŞİKLİKLER KAYDEDİLSİN Mİ

Diğer birçok programda olduğu gibi bilgilerinizin kaydedilmesinden önce uyarı mesajı göstermek istiyorsanız alttaki kodu deneyebilirsiniz. Herhangi bir formun güncelleştirme öncesi (BeforeUpdate) ile ilgili yordamının aşağıdaki gibi olmasını sağlayın. Artık eski kayıtlar üzerinde değişiklik yapıldığında soru sorulacak ve kullanıcı eğer hata yaptığını düşünüyorsa kaydı bu şekilde geri alabilecek. Formun BeforeUpdate yordamını oluşturun ve aynen şu şekilde olmasını sağlayın:

Private Sub Form_BeforeUpdate(Cancel As Integer)
If NewRecord = False Then
If MsgBox("Değişiklikler kaydedilsin mi?", _
vbYesNo) = vbNo Then
Cancel = True
DoCmd.RunCommand acCmdUndo
End If
End If
End Sub


FORMU TASARIM GÖRÜNÜMÜNDE AÇ

Formu, raporu, tabloyu, sorguyu ve diğer nesneleri tasarım görünümünde açmak için CTRL tuşunu basılı tutarak açmayı deneyin. CTRL+ENTER yapın ya da CTRL basılı iken fareyle çift tıklatın.


SQL SERVER TABLOSUNDA YENİ GİRİLEN KAYITLARA ULAŞMAK

ADO kullanırken VBA ya da ASP kodlarında SQL Server veritabanındaki bir tabloya yeni kayıt eklendiğinde bu kayda ulaşmak sorun olabiliyor. Aslında sorun birincil anahtar dizini (primary key) kullanılmamış olmasından kaynaklanıyor.

Tablo1.Addnew
Tablo1(“Alan1”)=”Değer”
...
Tablo1.Update
‘MsgBox Tablo1(“Alan1”) ‘Access için.
Response.Write Tablo1(“Alan1”) ‘ASP için.

Eğer tablonuzda herhangi bir birincil anahtar dizini yoksa bu kod son satırda hata verecektir.


HERKES İÇİN SORGULAR
“IN” DEYİMİ İLE ÇOKLU ARAMA KRİTERİ BELİRLEMEK

Sorgularda aynı alan için birçok arama kriteri “OR” deyimi ile tanımlanabiliyor. Tabii bununla bazan kod yeterince uzayabiliyor ve karmaşık bir hal alıyor. Onun yerine “IN” komutunu kullanmak daha kolay.

Kişiler tablosundaki kayıtlardan Meslek alaının değerinin ‘Öğretmen’, ‘Bankacı’, ‘Doktor’, ‘Muhasebeci’ olduğu kayıtları bulmak için OR komutunu şöyle kullanabilirsiniz:

SELECT * FROM Kisiler WHERE ( (Meslek=‘Öğretmen’) OR (Meslek=‘Bankacı’) OR (Meslek=‘Doktor’) OR (Meslek= ‘Muhasebeci’) )

Aynı kod IN deyimi ile bakın nasıl oluyor:

SELECT * FROM Kisiler WHERE Meslek IN (‘Öğretmen’, ‘Bankacı’, ‘Doktor’, ‘Muhasebeci’)


MESAJ KUTUSUNDA YENİ SATIR GÖSTERMEK

Kullanıcıya uzun uzadıya olan mesajları daha anlaşılır bir şekilde göstermek istiyorsanız mesaj kutularında yeni satırlar kullanmayı deneyebilirsiniz.

MsgBox "Bu mesaj" & vbCr & "birkaç " & vbCr & _
"satırdan" & vbCr & "oluşuyor.", vbOKOnly + vbExclamation

VbCr deyimi satır sonu karakteridir. Yani Chr(13) ile aynı.


GÖRÜNEN KAYDI RAPORDA AÇ

Form üzerinde birçok kayıt olduğu halde sadece görünen kayda ilişkin bir rapor nasıl yazdırılır? Bunun için raporu açarken kullandığınız koda bir parametre eklemeniz yeterli.

DoCmd.OpenReport “Rapor1”, asViewPreview, , “SiraNo=3”

gibi. Eğer bir metin alanına göre koşul belirlemek istiyorsanız değerin başında ve sonunda ‘ işareti olmalı.

DoCmd.OpenReport “Rapor1”, asViewPreview, , “PersonelNo=’Ahmet0001’”

Sondaki parametre aslında bir arama koşulu. Oraya istediğiniz kadar koşul içeren bir metin yazmanız mümkün.

DoCmd.OpenReport “Rapor1”, asViewPreview, , “(SiraNo>100) AND (PersonelAdi>’K’) AND (Yas<25)”

En son parametrede verilen süzme kriteri formları açarken de aynı şekilde kullanılabiliyor.


ACCESS PENCERESİNİ BOYUTLANDIRMAK

Özenle hazırladığımız form ve raporları tam ekran yapar, kullanıcının önüne koyarız. Fakat programın kullanıldığı bilgisayarda Access penceresi tam ekran ya da bizim istediğimiz boyutta açılmıyor her zaman. Lakin bunun da çözümü yok değil. Access penceresinde modül sayfasına gelip yeni bir modül oluşturun ve içinin tam olarak aşağıdaki gibi olmasını sağlayın. Sonra bu modülü “ModulYerlestir” adıyla kaydedin.

Option Compare Database
Option Explicit

Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Public Const SW_RESTORE = 9
Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long

Public Const SPI_GETWORKAREA = 48
Public Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As Long) As Long


Public Sub MasaustuneYerlestir()
'Kodu şimdi çalıştırmak için buraya gelip F5 tuşuna basın.
Dim r As RECT
SystemParametersInfo SPI_GETWORKAREA, 0, r, 0
Call Yerlestir(r.Left, r.Top, r.Right - r.Left, r.Bottom - r.Top)
End Sub

Public Sub Yerlestir(Sol As Long, Ust As Long, Sag As Long, Alt As Long)
ShowWindow hWndAccessApp, SW_RESTORE
MoveWindow hWndAccessApp, Sol, Ust, Sag, Alt, 1
End Sub

Artık programınızın herhangi bir yerinde
Call MasaustuneYerlestir
ya da
Call Yerlestir(100, 100, 200, 200)
gibi komutları kolaylıkla kullanabileceksiniz.



 


ACCESS HİKAYELERİ
-----------------------------
ESKİ DEFTERLER YENİ HİKAYELER

Access2000 projelerinin dağıtılması için Office 2000 Developer Tools v1.0’ı aldık. Fakat aldığımız gün MSDN’de bu paketin v1.5 sürümün çıktığını öğrendik. Elde bu paket varken MSDN’e bakma işi nereden çıkmıştı? Tabii hala normal bir kurulum hazırlayamadığımız için. Öyle ki, kurulum hazırlamaya çalışırken Access Run-Time için 500MB’lik bir klasör gereksiz yere kurulum paketine dahil ediliyor. Tabii bu, sadece Access Run-Time paketini eklerken oluyor. Bu paket eklenmezse proje dosyasıyla beraber birkaç dosya paketleniyor sadece. Boyu da 3 MB. civarında. Gerçi klasörün içinden gereksiz gördüğüm bazı dosyaları sildiğimde sorun çıkarmadı ama buna güvenmemek daha iyi.

Böyle durumlarda MSDN’nin sistesinden yardım almak gerekli. Orada anlatıldığına göre normalde En az 150 mb.’lik bir paket oluşturuluyormuş. Tabii hazırladığımız pakete Access Run-Time eklemek istediğimizde IE5’in kurulumunu da eşantiyon olarak ekliyor. Sonradan olacak ki bunun abartı olduğunun farkına varmışlar ve IE5’i pakete dahil etmeyen bir yama çıkarmışlar. Yama demek biraz zor gerçi. 10 mb. civarında bir büyüklüğü var ilk yükseltme programının. v1.5 sürümü ise 30 mb. civarında.

Bu olaydan da öğrendim ki, yeni bir ürün aldığımızda öncelikle Internet’ten o ürünle ilgili yeni güncelleştirmelerin olup olmadığını araştırmak gerekiyor.

* * *

Access kullanan bazı makinelerin SQL Server’ın olduğu bilgisayara isim ile ulaşmaları bazan sorun oluyor. Bu yüzden HOSTS dosyasında bir IP adresi ile bir bilgisayar adı tanımlamak gerekiyor. Böylelikle orada yazılı olan ad bizi her zaman yanındaki IP adresine yönlendiriyor.

Bu aşamadan sonra aynı programın her bir makineye kurulup ODBC ayarlarının yapılması gerekiyor. Zira Access içinden SQL’e ODBC ile bağlanılıyor. Tablolar kısmına SQL Server veritabanındaki tablolar yerleştirildi. Böylelikle aynı ayarın, programın kurulacağı tüm makinelere yapılması şart oluyor. Bunu da kod ile yapmak çok masraflı değil.

Yeni bir ODBC DSN bileşenini kod ile tanımlamak için Registry’deki HKLM\Software\ODBC altında bazı değişiklikler ve ODBC.INI dosyasına eklemeler yapmak yeterli.

HOSTS dosyasını da otomatik ayarlamak için önce dosyanın yerini bulmak lazım. Eğer sistem Win9x ise %WINDIR% klasörü altında HOSTS.SAM dosyası, eğer NT ya da Win2000 ise %SYSDIR%\DRIVER\ETC klasöründeki HOSTS dosyası değiştirilmeli.

Artık DSN ayarlarının da kurulum programları tarafından otomatik olarak yapılması fikri kulağa hoş geliyor aslında.

* * *

ODE Tools’un içinden çıkan bir başka eşantiyon da Code Librarian adlı yardımcı bir program. Bu program, kod yazarken büyük projeler arasında bir o yana bir bu yana koşuşturan programcılar için bir kod kütüphanesi oluşturmuş. Herhangi bir konuyla ilgili kod ihtiyacınız olduğunda gerekli başlığın altından aradığınız kodu kolayca bulabiliyorsunuz. Üzerine istediğiniz eklemeleri yapabileceğiniz gibi, var olan kodları da değiştirmeniz mümkün.
 

Eğer kodlarınız için kütüphane oluşturmayı düşünüyorsanız bu program birebir. Bu kadar hazır kod el altındayken insana kopya çekme fırsatı da doğmuyor değil açıkçası.

Tabii ki, PC Magazine okuyucuları ilk kez yayınlanan orjinal ipuçlarını bu sayfalarda görmeye devam edecekler.


DOSYA:
AccessOcak2001.rar


(Otomatik sayıların değiştirilmesi ile ilgili sonradan eklenen bir yazıya buradan ulaşabilirsiniz.)
 

Serkan Şahinoğlu
PC Magazine, Ocak 2001


http://BilgiTeknoloji.net