ASP Yazılım Dili ile Demirbaş ve Zimmet Takip Programı Nasıl Kodlanır?

ASP Yazılım Dili ile Demirbaş ve Zimmet Takip Programı Nasıl Kodlanır?

ASP Yazılım Dili ile Demirbaş ve Zimmet Takip Programı Nasıl Kodlanır?

Bu yazımızda ADO’yu nasıl bir veri kaynağından veri izlemek için kullanabileceğimizi gösteren basit bir örnek göreceğiz.

Çalışma Şekli

Yazıdaki kod gayet basittir. Veri kaynağımızdaki cihaz tablosunda bir RecordSet açar. Bunun için daha önce cihaz adlı bir sistem DSN’i tanımlamıştık. Sonra, Recordset’te kaç tane alan olduğunu bulmak için Fields topluluğunun Count özelliğini kullanır ve o sayıda kolonlu bir tablo yaratır.

Aynı değer daha sonra For….Next döngüsü kullanılarak hücreler için <TH> başlığı yaratmakta kullanılır. Her hücreye bir fields topluluğundan sırasına göre referansta bulunarak ve name özelliği belirtilerek getirilen alan adı yazılır.

<% Set ıRs ) Server.CreateObject(”ADODB.Recordset”)

oRs.Open ”Cihaz”, ”Cihaz”, , ,adCmdTable

oRs.MoveFirst %>

<TABLE BORDER=1 COLS=<% oRs.Fields.Count %>

<TR>

<% For Each alan In oRs.Fields %>

<TH> <% = alan.Name %> </TH>

<%Next%>

</TR>

Daha önce belirttiğim gibi adCmtTable sabitini kullanabilmek için Adovbs.inc dosyasını da dahil etmek gerekmektedir.

Tablonun başlıklarını yarattıktan sonra kayıtlardan değerleri çağırabiliriz. Tüm kayıt’larda tekrarlar yapmak için Do…While döngüsü kullanırız ve her biri için bir sıranın başlangıcının tanımlamak üzere sayfada bir <TR> etiketi de kullanırız. Ana döngü içinde tüm alanlarda tekrarlayan bu kez bir For…Each döngüsü uygularız.

Recordset’teki her alan için açılışta bir <TD> etiketi kullanırız. Daha sonra değeri çağırırız. Bir veri tabanı tablosu ve bazı diğer veri kaynaklarına dayalı olan Recordset’ler o alan için veri olmadığını belirten özel Null değerini de içerebilirler. Biz sayfamızda Null değeri kullanmayacağımız için önce bunun kontrolünü yapmak üzere IsNull fonksiyonunu kullanırız. Eğer alan değeri Null ise yerine ayırımsız boşluk karakterini kullanırız.

Eğer alanın değeri Null değilse, bunun getirip sayfada son bir </TD> etiketinden önce kullanırız. oRs.Fields topluluğundaki tüm alanları yapıktan sonra Move…Next yapar bir kapanış </TR> etiketi ekler ve tekrar Do…While durumuna döneriz. Tüm kayıtlar yazıldıktan sonra tabloyu bir tablo etiketiyle kapatırız. Recordset’i kapatır ve kullanmakta olduğumuz Recordset değişkenine Nothing değerini veririz. Eğer kullanmakta olduğumuz yazı dili For…Each ile kolleksiyonlarda tekrarlar uygulanmasını desteklemiyorsa, yine de kolleksiyonun elemanlarına bir For…Next döngüsü içinde sıra numaralarını kullanarak erişebiliriz.

<%Do While Not oRs.EOF%>

<TR>

<%For Each alanIn oRs.Field%>

<TD ALIGN = RIGHT>

<%If IsNull (alan) Then

Response.Write ”&nbsp”

Else

Response.Write alan.Value

End If %>

<\tD>

<%Next

oRs.MoveNext%>

<\tR>

<%Loop%>

<\TABBLE>

<% oRs.Close

Set oRs=Nothing%>

Demirbaşa Yeni Cihaz Eklemek

Kodumuzda belirlenen değişmez değerleri kullanma olanağı veren #include bildirisine dikkatinizi çekeriz. Ayrıca, csTR() fonksiyonuyla değerleri açıkça dizilere çevirebiliriz; çünkü, veri tabanımız için bize gereken veri türü budur.

<!–#include file = ”Adovbs.inc”– >

<% mcihaz = CsTR (Request.Form (”fcihaz”))

malan = CStr ( Request.Form (”falan”))

mbirim = CStr (Request.Form (”fbirim”))

mbölüm = CStr (Request.Form (”fbölüm”))

myıl = CStr (Request.Form (”fyıl”))

mfirma = CStr (Reuqest.Form (”ffirma”))

Sonraki aşama bunları veri tabanımıza eklemektir. Bir RecordSet’te kayıtları nasıl güncelleştireceğimizi ve yenilerinizi nasıl ekleyeceğimizi düşünmenin vakti geldi.

Kaynak Verilerini Bir Recordset İle Güncelleştirme İşlemi

Bir Recordset’ten alınan verilere dayanarak dinamik olarak HTML oluşturmak suretiyle ancak bu kadarını yapabiliriz. Asıl yapmak istediğimiz uygulamalarımızın, kullanıcılarının gönderdiği verileri yakalaması ve bunları veri tabanına göndermesidir. ADO kullanarak bir veri tabanını güncelleştirmenin esas olarak iki yoklu vardır: Recordset Command ve Connection nesnelerinin Execute yöntemini kullanarak verilere karşı SQL bilgilerin çalıştırabiliriz ve bir Recordset’teki kayıtları tek tek manipule edebiliriz. Şimdi bu yöntemlerin her ikisine de bakacağız.

Kayıtları Güncelleştirmek için SQL Kullanımı

Bu yazımızın başında Command ve Connection nesnelerinin Execute yöntemlerinin veri kaynağımızdaki kayıtları silebilen SQL bildirimlerini nasıl kabul ettiğini gördük. Bu yöntemi INSERT ve UPDATE sorgularında da kullanabiliriz.

….

<%Set VTBag = Server.CreateObject (”ADODB.Connection”)

VTBag.open ”Cihaz” ‘the database’; System DSN

SQL1 = ”INSERT INTO Cihaz”_

& ”(Cihaz, alan, birim, bölüm, yıl, firma)”_”values(‘_

& mcihaz &” ‘AS cihaz,'”_

& malan & ” ‘ AS alan,’ ”_

& mbirim & ” ‘  AS birim, ‘ ”_

& mbölüm & ” ‘   AS bölüm, ‘ ”_

& myıl & ”’yıl,’ ”_

& mfirma & ”’ AS firma, ” ‘)

VTBag.Execute (SQL1)s,

VTBag.Close

Set VTBag = Nothing%>

Bu, bir veri tabanına kayıt eklemek veya bir veri tabanında kayıt güncelleştirmek için çabuk ve kolay bir yöntemdir.

Kayıtları Güncelleştirmek ve Silmek için Recordset Yöntemlerinin Kullanılması

Veri tabanını güncelleştirmek için SQL bildirimlerini kullanmak çok kolaylık sağlar. Ancak genellikle çoklu tek tek güncelleştirmeler için optimal yöntem değildir. Recordset yöntemleri kullanarak tek tek kayıtlar içindeki tek alanlardaki verileri değiştirebiliriz. Bunu yapmak için Recordset nesnesinin AddNew ve UpDate yöntemlerini kullanırız.

Recordset, adOpen Dynamic veya adOpenKeyset türü dinamik bir imleçle açarak yaptığımız değişikliklerin gerçekten veri kaynağından geçirilmesini sağlamaktayız. Statik ve varsayılan ForwardOnly Recordset’lerinin güncelleştirilemez olduğunu hatırlayalım. Genel olarak Recordset’i kullanış şeklimiz;

‘ Kayıt işlemleri

Set oRs=Server.CreateObject (”ADODB.Recordset”)

Ors:open ”Cihaz”, ”Cihaz”, adOpenKeyset, adLockPassimistic, AdCmdTable

‘Kayıt işlemleri

oRs.Update ‘Kayıtların değişikliklerini sakla

oRs.Close

Set oRs=Nothing

Recordset’i açtıktan sonra geçerli kaydın tüm istediğiniz alanlarına oku/yaz erişimine sahip oluruz. Daha önce gördüğümüz fields kolleksiyonunu kullanarak tek tek alanların içeriğine erişiriz.

Set oRs=Server.CreateObject (”ADODB.Recordset”)

Ors.Open ”Cihaz”, ”Cihaz”, adOpenKeyser, adLock Pressimistic. AdCmdTable

oRs.Fields (”cihaz”) = mcihaz

oRs.Fields (”alan”) = malan

oRs.Fields (”birim”) = mbirim

oRs.Fields (”yıl”) = myıl

oRs.Fields (”bölüm”) = mbölüm

oRs.Fields (”firma”) = mfirma

oRs.Update

oRs.Close

Set oRs = Nothing

Fields topluluğunun Recordset nesnesinin varsayılan kolleksiyonu olduğunu ve bu yüzden ORS.Fields ”name”) tam yazılımı yerine ORS(”name”) kullanabileceğimizi hatırlayalım.

Kayıtların değiştirilmesini tamamladıktan sonra bu kayıttaki değişiklikleri hafızaya almak için UpDate yöntemini kullanırız. Eğer UpDate’i çağırmadan önce başka bir kayıt’a geçmek veya Recordset’i kapatmak istersek değişiklikleri kaydederiz. Recordset nesnesinin CancelUpdate yönteminin kullanarak değişikliklerden açık olarak vazgeçmeyi seçebiliriz. Hafızaya alınmayı beklenen değişikliklerin olup olmadığını Recordset nesnesinin EditMode özelliğini inceleyerek anlayabiliriz. Değişiklik beklerken bunlar adEditIn Progress olacak ve hafızaya alınmışlarsa adEditNone olacaklardır. Nihayet RecordSet nesnesinin delete yöntemini kullanarak geçerli kaydı silebiliriz.

Yeni Kayıtları Ekleme İşlemi

Tabii ki yeni bir cihazın bilgilerini toplarken bunlarla mevcut bir kaydın üzerine yazmak istemeyiz. Bunları içeren veri tabanına yeni bir kayıt eklemek isteriz. Yeni bir kayıt eklemek için Recordset nesnesi için AddNew yöntemini kullanabiliriz.

Set oRs = Server.CreateObject (”ADODB.Recordset”)

oRs.Open ”Cihaz”, ”Cihaz”, adOpenKeyset, adLockPessimistic, adCmdTable

oRs.AddNew

oRs.Fields (”cihaz”) = mcihaz

oRs.Fields (”alan”) = malan

oRs.Fields (”birim”) = mbirim

oRs.Fields (”yıl”) = myıl

oRs.Fields (”bölüm”) = mbölüm

oRs.Fields (”firma”) = mfirma

oRs.Fields (”Phone”) = strPhone

oRs.Update

oRs.Close

Set oRs = Nothing

Addnew ile yeni bir kayıt eklendikten sonra, Recordset’in edit mode özelliği adEditAdd’tir. Yine CancelUpdate metoduyla değişikliklerden vazgeçmeyi seçebiliriz. Bu durumda adNew çağrısından önce geçerli olan kayıt, tekrar geçerli kayıt olur. Bir kez update yöntemi kullanılınca Edit modeEditNone’a dönüşür.

Yeni kayıtdaki alanların değerlerini vermek için sonradan bunların tek tek belirlemek yerine AddNew yöntemini kullanabiliriz. Örneğin, yeni kayıt eklerken bu kod, cihaz alanının değerini şu şekilde tayin eder.

Varcihaz = ”P III”

oRs.AddNew ”cihaz”, Varcihaz

Ayrıca, alan isimlerinin bir varyant tablosunu ve bir başka varyant değer tablosunu yaratır ve bunları AddNew yönteminde belirleriz.

Alanlar = Array (”cihaz”, ”bölüm”, ”firma”, ”yıl”)

Degerler = Array (”P III”, ”Comp. Dept. ”, ”IBM”, ”1999”)

Ors. AddNew Alanlar, Degerler

Bu durumda, değişiklikleri yapmak için Update kullanmamıza gerek kalmaz, çünkü ADO bunu otomatik olarak yapar. AddNew parametreleri bu şekil tablolar ise aynı sayıda elemana da sahip olmaları gerekir. Yoksa bir hata oluşur. Birinci tablodaki alan isimleri de ikincisindeki alan değerlerinin sırasına uymalıdır.

Kayıtları Batch Kipinde Güncelleştirmek

Kayıtları iki değişik işletme kipinde ekleyebilir veya güncelleştirebiliriz: Immediate kipi ve Batch kipi. Önceki örneklerde Open yöntemi çağrısının Lock Type özelliğini adLockPessimistic olarak belirlemiştik. Bu, veri sağlayıcısının kayıtları değiştirilmek üzere açık tutulduklarında başka bir kullanıcı tarafınadn değiştirilmemeleri için kilitleyecek olması demektir. Bir kayıt geçerli durumdayken her kayıt için Update yöntemini çağırdığımızda değişiklikler veri kaynağına geri geçirilir. Bu, immediate kipi güncelleştirmedir.

Her kaydın değişikliklerini ayrı ayrı veri kaynağına geri kazandırmak yerine verileri batch kipinde ekleyebilir ve güncelleştirebiliriz. Bu, değişik kayıtlarda birden fazla değişiklik yapabilmemiz ve bunları sonra biriktirdiğimizde tek bir seferde veri tabanına göndermemiz demektir. RecordSette’ki tüm kayıtların değişiklikleri UpdateBatch yöntemini çağırana kadar veya CancelBatch yöntemini kullanarak güncelleştirmeyi iptal edilene kadar hafızaya alınılır.

ADO’ya bu kipi kullanacağımızı bildirmek için Recordset’i LockType parametresine adLockBatchOptimistic değeri vererek açarız.

Set oRs = Server. CreateObject (”ADODB.Recordset”)

Ors.Open ”Cihaz”, ”Cihaz”, adOpenKeyset, adLockBatchoptimistick,adCmdTable

‘kayıtlar burada güncellenir

oRs.UpdateBatch

oRs.Close

Set oRs=Nothing

Properties Kolleksiyonu

ADO’nun her üç ana nesnesi Connection, Comand ve RecordSet, kendi properties topluluklarını uygular. Bu topluluklarda bir Property nesneleri takımı bulunur. Ancak, gerçek eleman nesneleri her ana nesne için değişiktir.

Metod | Açıklama

Refresh | Özellik değerlerine değişiklikleri yansıtmak için kolleksiyonu günceller.

 

Özellik | Açıklama

Count | Kolleksiyondaki özelliklerin sayısını verir.

Item | Kolleksiyondaki özelliklerin değerini getirmede kullanılır.

Property Nesnesi

Properties topluluğunda artık tahmin edeceğiniz gibi elemanlar property nesneleridir ve yine prtoperty nesnelerinin kendi özellikleri vardır.

Metod | Açıklama

Attributes | Property’nin değerinin ne zaman ve nasıl verilebileceğini gösterir.

Name | Özelliğin adı.

Type | Özelliğin veri türü.

Value | Özelliğin değeri.

Kavraması en güç kavramlardan biri ADO’nun yapısal özellikleri ve veri sağlayıcıdan gelen dinamik özellikler arasındaki farktır.

Nesneler için yapısal özellikler ADO tarafından otomatik olarak yaratıldıklarında tanımlanılır. Bu özellikler, bir command nesnesinin Commantype özelliği gibi ana nesneden doğrudan sağlanılabilir. Bu özelliklerin değerleri doğrudan o nesneye referans yapılarak getirilir ve verilir. Yapısal özellikler bu şekilde sağlandıkları için bir nesnenin Properties kolleksiyonunda property nesneleri olarak gözükmezler ve kullanılan sağlayıcıdan bağımsız olarak daima kullanıma hazırdırlar.

Bu yapısal özelliklere ek olarak çoğu veri sağlayıcı ADO’ya dinamik özellikler adı verilen ek nesne özellikleri de eklerler. Bu özellikler genellikle sağlayıcıya özel olup kullanılabilecek ek işlevsellikleri göstermeye yararlar. Örneğin sağlayıcıya özel bir özellik bir Recordset nesnesinin işlemleri destekleyip desteklemediğini belirtebilir. Bu türden başka özellikler ilgili nesnesinin properties kolleksiyonunda görülebilir.

Dinamik Özellikleri Saptamak

Belli bir nesnede hangi sağlayıcıya özel özelliklerin bulunduğunu anlamak kolaydır. Eğer belli bir sağlayıcı için standard bir Recordset’te bulunan dinamik özellikleri bulmak istiyorsak, Properties kolleksiyonunda tekrarlamalar yapabiliriz. Şimdi bunu yapacağız. Property Objects ASP’de iki ayrı tür kayıt kümesi yaratacağız ve Property nesnesinin ismi ve değerini bulacağız.

Set VTBag = Server.CreateObject (”ADODB.Connection”)

Oconn.Open ”Cihaz” ‘veri tabanının sistem DSN

Set oRs = VTBag.Execute (”Cihaz”) ‘tablonun adı

‘ilk önce varsayılan kayıt kümesi

Response.Write ”<I> Varsayılan kayı kümesi: <\I><BR>”

For Each oProp In oRs.Properties

Response.Write ”Adı = ” & oPror.Name& ”:”

Response.Write ”Değeri = ”& oProp.Valus & ”<BR>”

Next

Ors.Close

Farklı bir kayıt kümesi kullanalım;

oRs.Open ”Cihaz1”, ”Cihaz1”, adOpenKeyset, adLockBatchoptimistic,

adCmdTable

Response.Write ”<I> Keyset kayıt kümesi optimistic yığı kilitlemeli:

<\I><BR>”

For Each oProp In oRs.Properties

Response.Write ”Adı = ”& oProp.Name& ”:”

Response.Write ”Değeri = ” &oProp.Value & ”<BR>”

Next

Çalışma Süresi İçindeki Hataları Düzeltmek

En dikkatli program yazımında bile çalışma süresi içinde verilecek hataların doğacağından özellikle çok kullanıcılı bir ortamda emin olabiliriz. En sıkı testlerden geçildiğinde bile yarattığımız tüm uygulamalarda bir hata oluşabilir. Bunlar oluştuğunda, saptayabilmeli ve en uygun şekilde düzeltebilmeliyiz.

Hataları Saptamak ve Düzeltmek

ADO’da hataları saptamamıza ve düzeltmemize yardımcı olacak mekanizmalar vardır. VBScript On Error Resume Next bildirimini veya diğer yazı dillerindeki eşdeğer bildirimleri kullanabiliriz. Ayrıca, Connection nesnesinin Errors topluluğunu veya yapısal yazı nesnesi ERR’i kullanabiliriz. Genellikle yöntemlerin bir kombinasyonu kullanılır.

Kodumuzun bir hata oluştuğunda On Error Resume Next’i bir hata mesajı verip durmak yerine çalışmaya devam etmesi için kullanırız. Sonra, Errors topluluğunu veya ERR nesnesini nerede yanlışlık olduğunu bulmak için inceleriz. Hata düzeltmeyi içererek uygulamalar yaratırken, Error nesneleri kontrol edilebilsin diye açık bir Connection nesnesi oluşturmak gerekli değildir. Eğer gizli bir Connection nesnesi kullanırsak Error nesnelerine bu şekilde ulaşabiliriz.

Ors.AcctiveConnection.Errors.Count

Set VTBag = Server.CreateObject (”ADODB.Connection”)

VTBag.Open ”Cihaz”

Set oRs = VTBag.Execute (”Cihaz”) ‘veri tabanındaki bir tablo

Ors.AddNew

Response.Write ”Erişim sağlanamadı”

Ors.Fields (”cihaz”) = ”P III”

Ors.Update

Güncelleştirilemez bir Recordset’e bir kayıt eklemeye çalıştığımızı görüyorsunuz. Bu bir hata yaratacak ve yazım sona erecektir. Bunu durdurmamız gerekir; çünkü, güncelleştirmeyi tamamlamasak da yazımın sonuna kadar devam etmesini isteriz. Sadece On Error Resume Next’in eklenmesiyle yazım aşağıdaki örnekteki çıkış mesajında görüldüğü gibi sonuna kadar devam edecektir.

On Error Resume Next

Set VTBag = Server.CreateObject (”ADODB.Connection”)

VTBag.Open ”Cihaz”

Set oRs = VTBag.Execute (”Cihaz”)

ORs.AddNew

Ors.Fields (”cihaz”) = ”P III”

ORs.Update

Response.Write ”şimdi erişilebilecek”

Elbette, şimdiki tek problemimiz güncelleştirmenin gerçekten başarıldığını bilmemize olanak olmayışıdır. Bunu düzeltmek için Errors topluluğunu veya Err kullanmamız gerekir.

Errors Kolleksiyonu

Errors kolleksiyonu belirli bir Connection için tüm Error nesnelerini içerir. Bir yöntemi ve alışılmış iki kolleksiyonu özelliğini içerir.

Yöntem | Açıklama

Clear | Kolleksiyondaki tüm hataları temizle.

Özellik | Açıklama

Count | Kolleksiyondaki hata nesnelerinin sayısını verir.

Item | Kolleksiyondaki hata nesnelerinin içeriğini döndürür.

Genel olarak eğer ADO tarafından yerine getirilen bir işlem bir hatayla karşılaşırsa bir veya daha fazla sayıda yeni Error nesnesi otomatik olarak yaratılır ve Errors topluluğuna eklenilir. Bunlar sadece tek bir işlemin başarıyla tamamlanmamasının sonucudur. Tek bir veri tabanı işlemi birkaç hata yaratabilir.

Bu gönderiyi paylaş

Bir cevap yazın