Çeşitli web kontrollerinde (örn. Datagrid ve DataListl), bazı resimlerin bind edilen veriye göre resim kaynaklarını kullanmasını isteriz. Resimlerin url'lerini dinamik belirlerken dogal olarak tooltipleride güncellemek istersiniz. Aşagıdaki örnekdeki gibi IMAGE kontrollerinin URL ve ALT html taglarını databound anında belirlenmiştir :

 




Template fieldaki imagelerin dinamik baglanması konusu şu şekil sizinde bildigi üzere :

            //prod. with camp.
            string k = ortak.LOGO.UrununKampanyasi(((DataRowView)e.Row.DataItem).Row["LOGICALREF"].ToString());
            if (k != "")
            {
                ((Image)e.Row.FindControl("img_kampanyali")).Visible = true;
                ((Image)e.Row.FindControl("img_kampanyali")).AlternateText ="Kampanya Koşulu : " + k;
                
            } 

Burada ben sürekli resimlerde tooltip olarak ALT html tagını kullanırdım <img src="var.gif" Alt="Stokda"/> gibi


Lakin Firefox ve Chrome bunları görüntülememekte, biraz araştırınca sorunu fark ettim efendim, sizinlede paylaşayım dedim. 

Resimler deki ALT (AlternativeText) tagı, yanlızca resimin browser tarafından gösterilemedigi durumlarda görüntülenmek üzere oldugu için, FF ve chrome tooltip olarak göstermez. Halbuki IE bunu tooltip gibi sürekli göstermekte, IE 6 dan IE 8 kadar bu böyle.

Lakin FF ve Chrome buna bozulur, kardeşim W3C bu iş için aslan gibi TITLE tagını yapmış nüçun onu kullanmazsın der ve ALT ları tooltip olarak göstermez. Ama Visual Studio 2005 ve 2008 de code sectionda 

((Image)e.Row.FindControl("img_kampanyali")).Title="Kampanyalı ürün";

derseniz VS size kızar ve derlemez. O ne olaki der ! Smile

Hal böyle olunca iş yine JS e düşer ve şu method hayatınızı kurtarır:

<script language="javascript" type="text/javascript">
window.onload=function() 
{
   for (var i = 0; i < document.images.length; i++) 
   {
      if (document.images[i].title == "") 
         document.images[i].title = document.images[i].alt; 
   }
};
</script>


Siz yine bildiginiz yöntemle yaparsınız (ALT tagı ile), bu JS sayfaki bütün imageleri tek tek dolaşır TITLE ı olmayan resimlere ALT tagında yazanı atar. Sizinde sorun çözülür.

O zman ne diyoruz hep birlikte "yaşasın JS !..."


.LDF dosyasını temizlemek

8 Eyl 2009 In: .net
Bildiginiz üzere .LDF dosyaları veritabanına ait kayıt loglarını tutar ve veritabanının çalışması için gerekli değildir. Ancak herhangi bir felaket anında geri dönmeyi kolaylaştırır. Yapılan değişiklikleri not eder. Bu yüzden çoğu zaman veritabanından daha büyük olur.

LDF dosyanızı silecekseniz öncelikle veritabanınızın yedeği alın. Bunun ardından SQL server management da veritabanınızın üzerinde sağ tıklayın ve veritabanınızı "detach" edin.

Şimdi veritabanınızın ldf ve mdf dosyalarının oldugu klasörde log dosyasını ( *.ldf ) silin yada adını degiştirin. Bunun ardından Management Studio da "Databases" agacına sag tıklayıp Attach deyip veritabanınızın *.mdf dosyasını attach edin. Yalnız bu noktada LDF dosyası silmelisiniz. Bu yüzden OK demeden önce LDF yazan satırı seçin ve remove a tıklayın. Bundan sonra OK derseniz başarılı sonuç alırsız ve MS SQL yepyeni ve sıfır bir LOG (.ldf )dosyası üretir.

LDF dosyalarından tamamen kurtulabilmek mümkün değil. Ama bundan sonrası için boyutu daha küçük olsun istiyorsanız yapabileceğiniz şeyler var. Veritabanınız üzerinde sağ tıklayın ve properties > "options" dan  "recovery model" i "simple" seçin. Bu LDF dosyanızın bundan sonrası için çok daha küçük olmasını sağlar ve herşey LDF ye not edilmediğinden veritabanı çalışma performansı da artabilir. Ancak bu durumda felaketlerden geri dönüşler için daha sık veritabanı yedeği almanız gerekeceğini unutmayın. Karar sizin elbette.

Kolay gelsin. 

ContextSwitchDeadlock was detected durumu

22 Ağu 2009 In: .net, ipucu
Eger Visual Studio ile debug yaparken aşagı daki hatayı alıyorsanız :

ContextSwitchDeadlock was detected
" CLR, 60 saniye içinde 0x46fae0 COM içeriğinden 0x46fc50 COM içeriğine geçemedi. Hedef içeriğe/gruba sahip olan iş parçacığı büyük olasılıkla pompalamayan bekleme yapıyor veya Windows iletileri pompalamadan çok uzun süreyle çalışan bir işlemi işliyor. Bu durum performansı genellikle kötü etkiler ve uygulamanın yanıt vermemesine veya bellek kullanımının zaman içinde sürekli artmasına neden olabilir. Bu sorunu önlemek için, tüm tek iş parçacıklı (STA) grup iş parçacıklarının bekleme komutları (örn. CoWaitForMultipleHandles) pompalaması ve uzun süre çalışan işlemler sırasında da düzenli olarak ileti pompalaması gerekir. "

Çözüm oldukca basit tek yapmanız gereken :

Debug -> Exceptions -> Managed Debug Assistants

altındaki ContextSwitchDeadlock check ini kaldırmak. CLR den kaynaklanan bu durum Release aşamasında tabii ki oluşmuyor.

Merhabalar, geçenlerde satın aldıgımız masaüstü RFID okuyucu ve yazıcısını hastane yazılımında SDK sını kullanmak istedigimizde, SDK içindeki API nin DLL inin C ile yazıldıgını fark ettik. Ve Visual Studio ya normal DLL i ekler gibi ekleyemedik.

Bende paylaşmak istedim, bu tarz başka dillerle yazılmış DLL leri P/Invoke ile kullanıyoruz projelerimizde. Bu tarz Win32 DLL lerini P/Invoke ile çagırabiliriz.

Bizim kullandıgımız masa üstü RFID okuyucusunun modeli TKP705 idi. Ama içerisinde bir Serial Reader var.  Windows cihazı HJSRFID-7640 ve HJSRFID-S7640 olarak tanımakta. Seri çevirici üzerinden USB RFID cihazı ile haberleşiliyor.

SDK içerisinden çıkan CVAPIV01.DLL C dili ile yazılmış. .Net projenizde kullanmak için DLL ile Bin klasorunun altına kopyalayıp.

        [DllImport("CVAPIV01.dll", CharSet = CharSet.Ansi)]

Deyip altınada kullanmak istedigimiz methodları tanımlıyoruz tek tek,

 

        public static extern int GetVersionAPI(StringBuilder VersionAPI);
        public static extern int OpenComm(StringBuilder Com, int Baudrate); 
...

Burada dikkat etmeniz gereken Win32 type lerini C# nasıl tanımlayacagınızı bilmeniz. Ve API içinde methodları parametreleri ile bilmeniz.Yukarıdaki 2 method için API nin SDK dökümanınında ( S795X-RS232 ) 

Şu şekilde ifade edilmişti :

int GetVersionAPI( char *VersionAPI )
int OpenComm(char *Com, int Baudrate)


kritik nokta türler, işte türlerin  listesi


Win32 Types Specification CLR Type
char, INT8, SBYTE, CHAR* 8-bit signed integer System.SByte
short, short int, INT16, SHORT 16-bit signed integer System.Int16
int, long, long int, INT32, LONG32, BOOL* , INT 32-bit signed integer System.Int32
__int64, INT64, LONGLONG 64-bit signed integer System.Int64
unsigned char, UINT8, UCHAR* , BYTE 8-bit unsigned integer System.Byte
unsigned short, UINT16, USHORT, WORD, ATOM, WCHAR* , __wchar_t 16-bit unsigned integer System.UInt16
unsigned, unsigned int, UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT 32-bit unsigned integer System.UInt32
unsigned __int64, UINT64, DWORDLONG, ULONGLONG 64-bit unsigned integer System.UInt64
float, FLOAT Single-precision floating point System.Single
double, long double, DOUBLE Double-precision floating point System.Double
 

 

 

RFID Bileklikler

20 Tem 2009 In: .net

Şu sıralarda sürekli kulak aşinası oldugumuz temazsız kartlar işte bu teknoloji ile çalışmakta. Aslında uzun zamandır hayatımızda bu teknoloji,  PDKS sistemlerinde de sürekli yaka kartı veya otoparklarda kullanılmakta idi. Hastanemizde yatan hastaların medikal işlemlerini takip etmek amacıyla satın aldıgımız cihazlar üzerinde RFID aparatı bulunmakta. O yüzden yaptıgımız çalışmayı özetlemek istiyorum.

Radyo Frekansı ile Tanımlama (RFID) teknolojisi, radyo frekansı kullanarak nesneleri tekil ve otomatik olarak tanıma yöntemidir (bkz Otomatik Tanıma ve Veri Toplama). RFID, temel olarak bir etiket ve okuyucudan meydana gelir. RFID etiketleri yerleştirilen nesne ile ilgili bilgilerini almak, saklamak ve göndermek için programlanabilirler. Nesne üzerine yerleştirilen etiketlerin okuyucu tarafından okunmasıyla tedarik zinciri yönetimi veya HBYS g,b, otomasyon sistemlerine bilgileri otomatik olarak kaydedilebilir veya değiştirilebilir.

RFID etiketi, radyo frekansı ile yapılan sorguları almaya ve cevaplamaya olanak tanıyan bir silikon yonga, anten ve kaplamadan meydana gelir. Yonga, etiketin üzerinde bulunduğu nesne ile ilgili bilgileri saklar. Anten, radyo frekansı kullanarak nesne bilgilerini okuyucuya iletir. Kaplama ise etiketin bir nesne üzerine yerleştirilebilmesi için yonga ve anteni çevreler. Pasif olanları hiç bir enerji kaynagı barındırmazlar, okuyucunun gücüyle çalışırlar.

RFID, düşük frekans (LF) 125–134 kHz, yüksek frekans (HF) 13.56 MHz, ultra yüksek frekans (UHF) 860–960 MHz, 2.45 GHz ve süper yüksek frekans (SHF) 5.8 GHz frekanslarında kullanılabilmektedir.

Bizdeki çözüm 2 şekilde mümkündü : 

1- Tek kullanımlık RFID etiketli ürünler aşagıdaki gibi 

 
2 - Çok kullanımlık sterilazasyon işleminden geçebilen şu bileklikler


Bu tarz pasif RFID tagları 3-5 cm mesafeden okuma yapabilmektedir.

Cihazımız Intel® Mobile Clinical Assistant (MCA) platformunda oldugu için HealthCare donanım ve SDK larını ile uygulamamızı geliştirdik.

Visual Studio ile yaptıgımız projeye "Add Reference" ile "Intel.Healthcare.dll" projeye eklenmesi ve MCA nın SDKsı kurulu olması gerekiyor. Development yapılan makinada ve MCA cihazda ayrı ayrı kurulması gerekiyor. Ben 2.0.0.25057" versiyonunu kullanıyorum.
 
.Net platformunda C# ile RFID, barkod ve kamera üzerinden verileri ala bilmekteyiz. 

RFID tagları okumak için :

RfidReader RFokuyucu= new RfidReader();
ASCIIEncodingencode = new ASCIIEncoding();
RfidTagokunanTAG = null;
Buttonsbtn;
EventHandler<RfidEventArgs>RfidEtiketOkundu = null;

 

Okuma işlemi gerçekleştiginde aşagıdaki event tetiklenir ve

        public void RfidEtiketOkundu (objectsender, RfidEventArgs args)
                {
                    try
                    {
                        //Okundu
                        txt_or_protokolno.Text= encode.GetString(args.RfidReader.RfidTags[0].Data).Trim(); //RFID etiketin içindeki bilgi yi alıyoruz
                        txt_or_protokolno.Text =txt_or_protokolno.Text.Trim(); //Array oldugu için ihtiyacımız olmadıgı alanlara 0x20 yazmıştık onlardan kurtuluyoruz
                        getir(); //gerekli işlemler veritabanından getirilir
                        args.RfidReader.ReleaseDevice(); //Cihazı okuma modundan çıkartıyoruz, sonraki okumalar için hazır
                    }
                    catch(Exception ex)
                    {
                        MessageBox.Show(ex.Message,"Hata", MessageBoxButtons.OK,MessageBoxIcon.Error);
                    }

                } 

 

 

ETA muhasebe programında her şirket için SQL server da ETA_FIRMAISMI_2009 gibi açılmakta. Eger ETA ya entegrasyon yapmak istiyorsanız. Cari kartlarla ilgili CARKART tablosundaki CARKOD alanı carilerin kodunu, CARHAR ve CARFIS ilede cari hareketlerin dökümünü alabilirsiniz.

SELECT CARKART.CARKOD, CARKART.CARUNVAN, CARHAR.CARHARTAR, CARHAR.CARHARREFNO, CARHAR.CARHARTIPI, CARHAR.CARHARCARKOD,CARHAR.CARHARTUTAR
FROM CARHAR INNERJOIN CARKART ON CARHAR.CARHARCARKOD= CARKART.CARKOD
WHERE CARKART.CARKOD='DNM003'


gibi hareket ekstresi alınabilir.

Muhasebe hesaplarındaki (120,157,100 gibi) hareketleri ( mahsup , tahsilat ve tediye fişi gibi) hareketleri görüntülemek için :

SELECT     MUHFIS.MUHFISNO, MUHFIS.MUHFISTAR, MUHFIS.MUHFISCINSI, MUHHAR.MUHHARSIRANO, MUHHAR.MUHHARMUHKOD, MUHHAR.MUHHARACIKLAMA,

                      MUHHAR.MUHHARBATIPI, MUHHAR.MUHHARTUTAR,MUHFISTIP.MUHFTKOD

FROM         MUHHAR INNERJOIN

                      MUHFIS ON MUHHAR.MUHHARREFNO= MUHFIS.MUHFISREFNOINNER JOIN

                      MUHFISTIP ON MUHFIS.MUHFISCINSI= MUHFISTIP.MUHFTNO


Aktarım yapmak için ilk olarak hareketin MUHFIS tablosuna insert edilecek daha sonrada aşagıda fonksiyonla MUHHAR a kaydedilecek


        
public static boolETAyaDTYEkle(DateTime ftar, int muhrefno, intsira, string muhhod, stringaciklama, int batipi,decimaltutar, string muhharno)

        {
            try
            {
                baglans();
                SqlCommand selcom = new SqlCommand(@"InsertInto MUHHAR
(MUHHARTAR,MUHHARREFNO,MUHHARSIRANO,MUHHARMUHKOD,MUHHARACIKLAMA, MUHHARBATIPI,MUHHARTUTAR,MUHHARNO,MUHHARCINSI,MUHHARKAYITONC, MUHHARKAYNAK,MUHHARMATATEFLAG )

VALUES

(@mft,@mfrn,@mfsn,@muhhd,@mhacik,@mhbatipi,@mhtutar,@mhno,1,4,4,1)", conns);

                selcom.Parameters.Add("mft", SqlDbType.DateTime).Value= ftar;//fistarihi

                selcom.Parameters.Add("mfrn", SqlDbType.NVarChar).Value= muhrefno;//fiş nosu MA-0001

                selcom.Parameters.Add("mfsn", SqlDbType.Int).Value= sira;//otomatik artacak

                selcom.Parameters.Add("muhhd", SqlDbType.NVarChar).Value= muhhod;//borc toplam

                selcom.Parameters.Add("mhacik", SqlDbType.NVarChar).Value= aciklama;//alacak toplam

                selcom.Parameters.Add("mhbatipi", SqlDbType.Int).Value= batipi;

                    selcom.Parameters.Add("mhtutar", SqlDbType.Decimal).Value= tutar;

                        selcom.Parameters.Add("mhno", SqlDbType.NVarChar).Value= muhharno;

                selcom.ExecuteNonQuery();
                conns.Close();
                selcom.Dispose();
                returntrue;
            }
            catch(Exception ex)
            {
                Cursor.Current= Cursors.Default;
                MessageBox.Show(ex.Message);
                return false;
            }
        }

XtraGrid üzerine bir DataSoruce Bind ettiniz ve kullanıcı MultiSelect özelligi ile grid üzerinde işlem yapmak istedigi satırları seçti, 
Normalde gridView1.GetSelectedRows() size seçili olan satırların Row Handles larını veriyor. Ama gruplanmış verilerde bazı negatif degerlerle ugraşmanız gerekmekte.

Onun yerine aşagıdaki method size parametre olarak gönderdigini GridView in içinde seçili olan satırları aynen bind ettiginiz verileri ile DataTable olarak bütün kolonları ile getirmekte.


        private DataTable SecilenlerinListesi2(DevExpress.XtraGrid.Views.Grid.GridView view)
        {
            DataTable sonucTb = new DataTable();
            if(view.DataSource is DataView)
            {
                DataTable kaynakTb = ((DataView)view.DataSource).Table;
                sonucTb = kaynakTb.Clone();
                foreach(int rowHandle in view.GetSelectedRows())
                {
                    DataRowrow = view.GetDataRow(rowHandle);
                    sonucTb.Rows.Add(row.ItemArray);
                }
                sonucTb.AcceptChanges();
            }
            return sonucTb;
        }

GM862 ile Telemetri

15 Tem 2009 In: .net, .Net Micro Framework

Nihayet elime bugün ulaştı cihaz. Biliyorsunuz Telit GM862, bir SIM kartı ile size GPS, GSM ve GPRS gibi nimetlerden faydalanma ımkanı sağlıyor. Lakin bir sorundan bahsetmek istiyorum size, GM862'nin giriş ve çıkış pinleri erkek bir molex konnektörle saglanıyor. Cüzi bir ücret karşılıgı Molexin karşı konnektörünü temin etmek mümkün ama bu işinize yaramayacaktır, bunun için bir PCB board imal etmelisiniz. Gaziantep'de nasıl temin etmek mümkün bilmedigim için (maliyetide yüksek olacagının tahmin ettigim) kartı biraz araştırınca şu alternatifleri buldum:

 

 
 

 
Birisi SparkFun a ait $29 digeri ise MikroElektronika $24. Bu kartları kullanarak Seri baglantı kurmak mümkün ama voltaj ve TTL level sorunu yaşamamak içten bile degil. Birde bunun için devre hazırlamak gerekecek.

Bu alternatiflerin dışında GM862 için hazır RS232 çıkışlı interface kartlarda mevcut, mesela SparkFan a ait bu kart gibi 
 
 
Bu cihazla tek yapmanız gereken GM862 modülünü MOLEX konnektörüne yerleştirmek ve 9 V elektrikle beslemek. Seri port üzerinden haberleşmeye hazır. Lakin benim kullandıgım interface biraz farklı. Ben şimdi ilk olarak C# ile bir kaç uygulama geliştirip daha sonrada .Net Micro Framework için bir uyarlayıp TahoeII üzerinde koşturmak istiyorum.

Bu sayede sahadan veya otomasyondan verileri toplayıp GPRS üzerinden veya SMS ile sunucuya bildirecek bir uygulamalar geliştirmeyi planlıyoruz. İşte benim modül ve interface
 
 
 


Gelişmelerden sizide haberdar etcem tabii ki.

Ben Kimim ?

Celiker BahceciMerhabalar, ben Çeliker BAHÇECİ. 2004 den beri özel sektörde bilgisayar mühendisligi ve egitmenlik yapıyorum. Yine aynı yılın Ekim ayından beri sitemde .Net ile programlama ve hayat görüşüm ile ilgili makalelerimi yayınlıyorum. Blogum dışında Yazgelistir.com, mobilnedir.com gibi ineta kapsamındaki bir çok siteye Microsoft teknolojileri ile ilgili yazılar yazmaktayım.
Bu site ile sizinde hayatınızı anlamlandırmanızda bir parça katkımın olması dilegiyle...