SQL SERVER 2008 REPORTING SERVICE HTML FORMATINDA BİLGİ GÖSTERME

SSRS 2008 deki özelliklerden biride eğer verilerimiz veritabanından html formatında geliyor ise bunu yorumyalabilmesidir.Aşağıdaki şekilde Düz başlığı altında yazan yerde görüldüğü gibi eğer verilerimizi direkt olarak basarsak bu şekilde gözükecektir

Ancak yukarıdaki şekilde html başlığındaki gibi verilerimizdeki html taglarının yorumlanmasını istiyorsak bu değişikliği yapmak istediğimiz hücreye çift tıklayıp sağ tuş dan create placeholder diyoruz.

Açılan popup da markuptype kısmında html interpret seçeneğini seçiyoruz.Daha sonra gene aynı popupta value değerini belirliyoruz.Böylece gelen verimizdeki html tagları yorumlanabiliyor

SQL SERVER kategorisine gönderildi | Yorum bırakın

ADO.NET-1

1-)Öncelikle bağlantı cümlesini tek merkezi bir yerde tutmalısınız,bu şart değildir ancak uygulama taşımalarında kolaylık sağlar. Bu window uygulamaları için app.config ,web uygulamaları için web.configdir.Bunlar temelde bir nevi xml dosyası olup genelde uygulamarda tek bir merkezden okunması gereken değerler buralara konur

Örnek app.config dosyası  burada connection stringimizi aşağıdaki gibi yazıyoruz.Daha sonra veri tabanımızın yolu vs değişirse sadece burdan değişiklik yapmamız yeterli oluyor.Bunuda projene eklemek için aşağıdaki adımları izlemelesiniz.

<?xml version=”1.0″ encoding=”utf-8″ ?>

<configuration>

<configSections>

</configSections>

<connectionStrings>

<add name=”TelefonRehberiConnectionString”

connectionString=”Data Source=.;Initial Catalog=TelefonRehberi;Integrated Security=True”

providerName=”System.Data.SqlClient” />

</connectionStrings>

</configuration>

Bunuda kodda kullanmak için aşağıdaki şekilde kod yazmamız lazım

Bunu yapmadan önce projemize referans–>Add–>System.Configuration dll eklememiz gerekmektedir

string baglantiyolu = ConfigurationManager.ConnectionStrings["TelefonRehberiConnectionString"].ConnectionString;

2-)connection string örnekleri

Connection stringde

Data Source àmakina adı,ip vs olabilir,. Dersen makinandaki local sql servera bağlanır

Initial CatalogàBuraya database adını yazman gerekir

User IdàDatabaselere genelde güvenlik için kullanıcılar açılır.Databasede hakkı olan kullanıcı

PasswordàDatabase kullanıcısına ait şifre

Data Source=ServerAd;Initial Catalog=DbAd;User Id=KullanıcıAd;Password= 1234;

Bu şekilde bir bağlantı yapılırsa Integrated Security =True diye bu o database windows authenticate yani şifre vermeden bağlanabileceğini gösterir

Data Source=.;Initial Catalog=TelefonRehberi;Integrated Security=True

Alternatif bağlantı cümleleri için aşağıdaki adresi inceleyebilirsiniz

http://www.connectionstrings.com/

3-)Veritabanına bağlanıp sonuçları bir küme içine almak için gereken kodlar

Sql serverla iş yapacaksan SqlConnection ,Access ile yapacaksan OleDbConnection gibi veritabanın değişirse kullancağın bu yapıları değiştirmelisin ancak mantıkları aynıdır.

string baglantiyolu = ConfigurationManager.ConnectionStrings["TelefonRehberiConnectionString"].ConnectionString;

//Sql Connection bunun ile içine veritabanı yolunu vererek nereye bağlancağımızı belirtiyoruz

SqlConnection conn = new SqlConnection(baglantiyolu);

//Veritabanımızdan döncek kayıtları bir yere almam lazım ,datatable de verileri alabileceğim bir küme olarak düşün

DataTable dt = new DataTable();

//Select sorgusu atarak veritabanından istediğim alanları çekebilirim

string sorgu = “Select KisiID,Ad,Soyad from Kisi”;

//Sqldataadapter ise kendisine verilen sorgu ve veritabanını kullanarak işlemleri gerçekliyeceğimiz sınıftır

SqlDataAdapter adap = new SqlDataAdapter(sorgu, conn);

//Fill metodu ile Datatable gibi dolmasını istediğimiz veri kümesinin içine datalarımızı atıyoruz

adap.Fill(dt);

//En sonda bu veri kümemizi grid gibi bir elemanın kaynağına atayarak gösterilmesi vs.. gibi işlemleri yapabiliriyoruz

dataGridView1.DataSource = dt;

4-)SqlCommand ise SqlAdapter gibidir ancak daha çok stored procedure,insert,update,delete gibi işlemlerde tercih edilir.Ancak Command ile işlem yapılırken database bağlantıyı senin açıp kapaman gerekir.

conn.Open();àVeritabanı bağlantısını açar

cmd.ExecuteNonQuery();àCommand nesnesini çalıştırmak için kullanılır

conn.Close();Veritabanı bağlantısını kapar

sqlparameter ise sorgularının parametre almasını istersen resimdeki değerleri formdan okuyup database kaydetmek istiyorsan önce

sorgunda @ ile belirttiğin kelimeler parametredir

Daha sonra bu parametreler değer ataman gerekir

Örnek parametre listesinin 0 ıncı elemanı @Ad parametresine denk geliyor değeri formdaki name alanı

paramlist[0]=new SqlParameter(“@Ad”, txtName.Text);

Bütün bunları yaptıktan sonra query çalıştırmadan önce bunların hepsini aşağıdaki gibi commandına eklemen lazım

cmd.Parameters.AddRange(paramlist);

Bütün bunları yaptıktan sonra command nesneni aşağıdaki gibi çalıştırdığında işlemi yapıyor

cmd.ExecuteNonQuery();

bool Cinsiyet;

if(rdbBay.Checked)

Cinsiyet=true;

else

Cinsiyet=false;

string baglantiyolu = ConfigurationManager.ConnectionStrings["TelefonRehberiConnectionString"].ConnectionString;

SqlConnection conn = new SqlConnection(baglantiyolu);

string sorgukisiekle = “Insert Into Kisi(Ad,Soyad,Cinsiyet,Yas,TcKimlik) values(@Ad,@Soyad,@Cinsiyet,@Yas,@TcKimlik)”;

SqlParameter[] paramlist = new SqlParameter[5];

paramlist[0]=new SqlParameter(“@Ad”, txtName.Text);

paramlist[1] = new SqlParameter(“@Soyad”, txtSoyad.Text);

paramlist[2] = new SqlParameter(“@Cinsiyet”, Cinsiyet);

paramlist[3] = new SqlParameter(“@Yas”, nudYas.Value);

paramlist[4] = new SqlParameter(“@TcKimlik”, txtTcKimlik.Text);

SqlCommand cmd = new SqlCommand(sorgukisiekle, conn);

cmd.Parameters.AddRange(paramlist);

conn.Open();

cmd.ExecuteNonQuery();

conn.Close();

5-)SqlParametrelerini kullanmanın farklı yöntemleri var örnek olarak yukarıda benim yaptığım bir parametre listesi oluşturmaktı ancak parametreleri şu şekilde de ekleyebilirdim

Aşağıdaki gibi parametreleri tek tek ekleyebilirsiniz mesela farklı algoritmalarda işine yarar

SqlParameter param=new SqlParameter(“@Ad”, txtName.Text);

cmd.Parameters.Add(param);

6-)Aşağıdaki şekilde hiç parametre kullanmadan da işlem yapılabilir ancak bunu kesinlikle yapma ,sql injection hatalarına vs neden olabilir.ve kod okunabilirliğini azalır.

string sorgukisiekle = “Insert Into Kisi(Ad,Soyad,Cinsiyet,Yas,TcKimlik) values(@Ad=”+txtName.Text+”,@Soyad=”+txtSoyad.Text…

.NET kategorisine gönderildi | Yorum bırakın

FluentNHibernate – Nhibernate Giriş -2

Mapping işlemlerinden ve SessionFactory Create ettikten sonra artık örnek sorguları oluşturabilirsiniz

Nhibernate le alakalı örnek sorgular

1-)Select All

var session = NHibernateHelper.OpenSession();

IList<Person> ab = session.CreateCriteria(typeof(Person)).List<Person>();

2-) ID vererek bir listedeki tek kaydı çekme

var session = NHibernateHelper.OpenSession();

PersonType pt=session.Load<PersonType>(1);

3-)Insert

using (var session = NHibernateHelper.OpenSession())

{

using (var transaction = session.BeginTransaction())

{

var newPerson = new Person

{

Name = “abc4″,

PersonTypeID = 3

};

session.Save(newPerson);

transaction.Commit();

}

}

4-)Update

using (var session = NHibernateHelper.OpenSession())

{

using (var transaction = session.BeginTransaction())

{

var newPerson = new Person

{

ID = 5,

Name = “abc88″,

PersonTypeID = 3

};

session.Update(newPerson);

transaction.Commit();

}

}

5-)Insert or Update — > SaveOrUpdate bu kodda eğer ID verirseniz güncelleme yapar,ID verilmez ise direkt olarak insert yapar.Ancak ID niz otomatik artansa ve o ID ait kayıt yoksa bu kod size hata fırlatır.

using (var session = NHibernateHelper.OpenSession())

{

using (var transaction = session.BeginTransaction())

{

var newPerson = new Person

{

// ID = 5,

Name = “abc78″,

PersonTypeID = 3

};

session.SaveOrUpdate(newPerson);//session.Update(newPerson);

transaction.Commit();

}

}

6-)Select Top sorgu sonucu maximum istenen kayıt sayısı

var session = NHibernateHelper.OpenSession();

ICriteria crit = session.CreateCriteria(typeof(Person));

crit.SetMaxResults(1);

IList mylist = crit.List();

7-)Distinct

Distinct Metod 1

var session = NHibernateHelper.OpenSession();

IList mylist = session.CreateCriteria(typeof(Person)).SetProjection(Projections.Distinct(Projections.Property(“Name”))).List();

Distinct Metod 2

ICriteria criteria

= session.CreateCriteria(typeof(Person));

criteria.SetProjection(Projections.Distinct(Projections.ProjectionList().

Add(Projections.Alias(Projections.Property(“Name”), “Name”)).

Add(Projections.Alias(Projections.Property(“PersonTypeID”), “PersonTypeID”))));

criteria.SetResultTransformer(new NHibernate.Transform.AliasToBeanResultTransformer(typeof(Person)));

IList people = criteria.List();

8-)Order By

var session = NHibernateHelper.OpenSession();

IList mylist = session.CreateCriteria(typeof(Person)).AddOrder(Order.Desc(“ID”)).List();

9-)Inner Join

var session = NHibernateHelper.OpenSession();

IList mylist = session.CreateCriteria(typeof(Person)).CreateAlias(“PersonTypes”, “PersonType”, NHibernate.SqlCommand.JoinType.InnerJoin).List();

10-)Aggerate Fonksiyonlaràavg,max,min vs…

var session = NHibernateHelper.OpenSession();

IList mylist = session.CreateCriteria(typeof(Person)).SetProjection(Projections.Avg(“ID”)).List();

11-)Sorgularımıza where koşulu ekleme örnek Nhibernate ile in , eq ,like vs…

Expression kullanarak Filtre

var session = NHibernateHelper.OpenSession();

IList mylist = session.CreateCriteria(typeof(Person))

/*In sorgusu*/

//   .Add(Expression.In(“ID”, new int[] { 1, 2 })).List();

/*Eşittir*/

// .Add(Expression.Eq(“ID”, 1)).List();

/*Like*/

.Add(Expression.Like(“Name”,”abx%”)).List();

Restriction kullanarak Filtre yapmak

var session = NHibernateHelper.OpenSession();

IList mylist = session.CreateCriteria(typeof(Person))

.Add(Restrictions.Eq(“ID”, 1)).List();

Not :Restriction ve Expression birbirlerine benzer ancak expression daha fazla depreciated metoddur.Tavsiye edilen Restriction kullanımıdır.

12-)CreateAlias ve CreateCriteria:İkisi arasında temelde fark yoktur.Tek fark CreateCriteriada daha fazla overload şansınız vardır.

IList mylist = session.CreateCriteria(typeof(Person)).CreateCriteria(“PersonTypes”, “PersonType”, NHibernate.SqlCommand.JoinType.InnerJoin).List();

IList mylist2 = session.CreateCriteria(typeof(Person)).CreateAlias(“PersonTypes”, “PersonType”, NHibernate.SqlCommand.JoinType.InnerJoin).List();

13-)Nhibernate içine direkt olarak Sql kodu koyabilmek

var session = NHibernateHelper.OpenSession();

session.CreateSQLQuery(“select * from PersonType p”).List();

14-)HSQL: Nhibernate criteria ile yapılabilen sorgulama hsql ile yapılabilir.Ancak nhibernate forumlarında hsql daha esnek olduğu yönündedir

var session = NHibernateHelper.OpenSession();

int count= Convert.ToInt32(session.CreateQuery(“select Count(*) from PersonType”).UniqueResult()); /

//HSQL içine parametre koymak

var blogs = session.CreateQuery(“from PersonType p where p.ID = :ID”)

.SetParameter(“ID”, “1″).List();

IQuery query = session.CreateQuery(“FROM PersonType”);

IList<PersonType> pers = query.List<PersonType>();

15-)Nhibernate de Lamda Expression ve Linq kullanım örneği

Linq kullanabilmek için Nhibernate.Linq namespaceini eklememiz gerekmektedir

var session = NHibernateHelper.OpenSession();

Lamda Expression

// PersonType p = session.QueryOver<PersonType>().Where(px => px.ID==1).SingleOrDefault();

PersonType p2 = session.Query<PersonType>().Where(px => px.ID == 1).SingleOrDefault();

Linq Örneği

var BuildQuery1=(from p in session.QueryOver<PersonType>() where p.ID==1 select p).List();

var BuildQuery = (from p in session.Query<PersonType>() where p.ID == 1 select p).ToList();

.NET kategorisine gönderildi | Yorum bırakın

FluentNHibernate – Nhibernate Giriş -1

Nhibernate entity framework,llblgen gibi bir orm tooludur.FluentNHibernate ise nhibernatedeki xml olarak yapılan nesnelerin mapping işlemini classlarda daha kolay bir şekilde yapmamıza olanak sağlayan bir yapıdır.

Nhibernate ve FluentNHibernate kullanmak için bazı dllleri alıp kendi projenize eklemek yeterlidir.Ayrıca bir program kurmaya vs gerek yoktur

FluentNHibernate.dll

NHibernate.dll…

Gibi bir kaçtane dlli http://fluentnhibernate.org/ adresinden indirerek kendi projenize referans olarak ekleyin.Fluent Nhibernatele beraber xml olarak yazacağımız mapping sınıfları kodda yapabiliyoruz.Ancak stored procedure vs kullanmak istersek bu işlemleri gene xml ile yapmak gerekmektedir

Öncelikle Veritabanımızdaki tablolarımızı modelliyoruz

Önce Person ve PersonType ları modelliyoruz.Propertyleri virtual yapmamızın amacı nhibernatedeki lazy load özelliğini kullanabilmek içindir.Burdaki her Person bir tipte alabileceği için tek nesnede.PersonTypeler ise birden fazla Personda olacağı için liste şeklinde tasarlandı

public class Person

{

public virtual int ID { get; set; }

public virtual string Name { get; set; }

public virtual int PersonTypeID { get; set; }

public virtual PersonType PersonTypes { get; set; }

}

public class PersonType

{

public virtual int ID { get; set; }

public virtual string Name { get; set; }

public virtual IList<Person> Persons { get; set; }

}

Fluent Nhibernate ile normal nhibernate xml de yaptığımız mapping işlemini kodla yapabiliyoruz.Map sınıflarını kullanabilmek için ise namespace ekliyoruz

using FluentNHibernate.Mapping;

Map classımızı mutlaka ClassMap den türemelidir ve içine generic olarak map etmek istediğimiz nesneyi yazıyoruz.

Diğer dikkat edilmesi gereken nokta ise ilişkiler kısmıdır.

Bizim senaryomuz gereği her Person bir tipi olacaktır.Dolayısıyla person nesnesindeki PersonTypeID alanı esasında bir foreign keydir

Bu ilişkiyide References komutuyla yapıyoruz.Ancak PersonTypeMap classında böyle bir foreign key yok ancak bunun personla ilişkisini belirtmek için HasMany komutunu kullanıyoruz

public class PersonMap:ClassMap<Person>

{

public PersonMap()

{

Table(“Person”);

Schema(“Common”);

Id(x => x.ID);

Map(x => x.Name);

Map(x => x.PersonTypeID);

References(x => x.PersonTypes).Column(“PersonTypeID”).ReadOnly();//ReadOnly demezsek bu alan insertte soruna neden oluyor

}

}

public class PersonTypeMap : ClassMap<PersonType>

{

public PersonTypeMap()

{

Table(“PersonType”);

Schema(“dbo”);

Id(x => x.ID);

Map(x => x.Name);

HasMany<Person>(x => x.Persons);

}

}

Daha sonra ise bir tane Helper Class yazarak SessionFactory mizi fluent nhibernate le uyumlu olacak şekilde oluştuyoruz

GetSessionFactory() metodundaki

.FluentMappings.AddFromAssemblyOf<PersonTypeMap>())

addfromassemblyof komutu ile de mappingleri yüklüyoruz ancak oluşturulan xml dosyalarını da bir yere almak istersek bu kodun sonuna ExportTo komutunu koyarak mappinglerin xml hallerinide görebiliriz

.Mappings(m => m.FluentMappings.AddFromAssembly(assembly)
.ExportTo(@”C:\your\export\path”)

public  class NHibernateHelper

{

private static ISessionFactory _SessionFactory;

public static ISessionFactory SessionFactory

{

get

{

if (_SessionFactory == null)

//InitializeSessionFactory();

_SessionFactory = GetSessionFactory();

return _SessionFactory;

}

}

public static ISessionFactory GetSessionFactory()

{

return Fluently.Configure()

.Database(

MsSqlConfiguration.MsSql2005

.ConnectionString(c => c

.Database(“TelefonRehberi”)

.Server(“.”)

.Password(“1234″)

.Username(“sa”)

)

)

.Mappings(m => m

.FluentMappings.AddFromAssemblyOf<PersonTypeMap>())

.BuildSessionFactory();

}

public static ISession OpenSession()

{

return SessionFactory.OpenSession();

}

}

Daha sonra Formumuzdan aşağıdaki gibi bir yöntemle ilk sorgumuzu yazabiliyoruz

private void button2_Click(object sender, EventArgs e)

{

var session = NHibernateHelper.OpenSession();

IList<Person> ab = session.CreateCriteria(typeof(Person)).List<Person>();

MessageBox.Show(ab[1].PersonTypes.Name);

}

Yukarıdaki sorgu Person tablosundaki bütün kayıtları alarak ekrana gelen Person nesnesin PersonType ‘ın adını bize verecektir.

.NET kategorisine gönderildi | 1 yorum

Dynamics CRM 4 Varlıklara Hızlı Bulda Pasif Kayıtlarında Dahil Edilmesi

Hızlı Bulda Genellikle Etkin kayıtlar içinde arama yapılır.Veya farklı kombinasyonlarda bu hızlı arama sorgusunu değiştirmek isteyebiliriz.

Ancak hızlı bul görünümü direkt olarak özelleştirmelerden formlardan girerel değiştirmek mümkün değildir

Bunun için özelleştirmeler den özelleştirmeleri ver diyerek ilgili varlığığın customization dosyasını alıyoruz

Daha sonra customization dosyasını açarak Hızlı bul formunu buluyoruz.Dikkat edileceği gibi ilgili formun fetch xml yapısında değişiklik yapmamız gerekmektedir.Aşağıdaki resimdeki ve bu senaryodaki gibi pasifleşmiş inaktif kayıtlarıda hızlı bula dahil etmek istersek en alttaki resimdeki gibi kırmızı içine alınmış filtre conditionını kaldırmamız yeterli olacaktır

<filter>

<condition attribute=”statecode” operator=”eq” value=”0″ />

</filter>

Daha sonra ise bu customizationımızı yine özelleştirmeler àözelleştirmeleri al diyerek sisteme yüklüyoruz.Değişikliklerimizi yayımla dedikten sonra artık inaktif kayıtlarda hızlı bul aramalarında gelebiliyor olacaktır

NOT:ANCAK BU GELİŞTİRME UNSUPPORTED BİR GELİŞTİRMEDİR!!!

CRM kategorisine gönderildi | Yorum bırakın

KODDA ENUM DEĞİŞKENLERİNİ ÇOKLU OLARAK KULLANMAK – BİT İŞLEMLERİ

Enumlar kod okunabilirliğini arttıran veya bazı keywordlerimizi belli değerlerle birlikte temsil etmemize sağlayan bir tiptir.

Hemen hemen her yerde görebileceğimiz en temel enum yapısına örnek olarak genelde günler kullanılır.

public enum Gunler

{

Pazartesi,

Sali,

Carsamba,

Persembe,

Cuma,

Cumartesi,

Pazar

}

Tabi Enumlarımızı temsil eden değerlerde atabiliriz.Bu makalede içine enum tipinde bir değişken alan fonksiyonun kullanımını göreceğimiz için ben aşağıdaki gibi bu temsil değerlerini 2 ve 2 nin katları şeklinde yaptım nedeni ise bit işlem yapabilmek için

public enum Gunler

{

Pazartesi=1,

Sali=2,

Carsamba=4,

Persembe=8,

Cuma=16,

Cumartesi=32,

Pazar=64

}

Mesela gelen gunler Salı günü ise Sınavınız var diye yazacak bir örnek fonksiyon tanımlayalım.Aşağıdaki gibi fonksiyonumuzu önce direkt günün değerini yazdırdığımızda ekrana 10 değeri gelecektir.Ancak biz fonksiyonun içine Salı ve Perşembe gününü beraber gönderdik.Aşağıdaki gibi direkt bir kullanım yaparsak sonuç bize Belirtilen günlerde sınavınız yok dönecektir

SinavGunlerGoster(Gunler.Sali | Gunler.Persembe);

public void SinavGunlerGoster(Gunler gun)

{

//MessageBox.Show(gun.ToString());Bunun çıktısı 10 olacaktır

if (gun == Gunler.Sali)

{

MessageBox.Show(“Belirtilen günlerden birinde sınavınız var”);

}

else

{

MessageBox.Show(“Belirtilen Günlerde Sınavınız Yok”);

}

}

Programın doğru çalışması için & le bit işlemi yapmamız gerekmektedir

if ((gun & Gunler.Sali) == Gunler.Sali)

{

Değerleri 2 ve katları vererek binary işlem yaparak doğru sonucu bulmuş olduk.

Mantık aşağıdaki gibidir

Gunler.Sali | Gunler.Persembe — Sali-2 Perşembe 8 binary formatta

010

100 veya işlemine soktuğumuzda 110 yapar ki bunun toplamı 10 dur

Ancak bunu tekrar & le filtrelediğimizde(ve işlemine tuttuğumuzda) sadece Sali kalacak ve doğru sonucu bize verecektir (1 veya 0 –> 1 ,1 ve 0 –>0 döner)

Metod son olarak bu şekilde olacaktır.

public void SinavGunlerGoster(Gunler gun)

{

//MessageBox.Show(gun.ToString());

if ((gun & Gunler.Sali) == Gunler.Sali)

{

MessageBox.Show(“Sınav Var”);

}

else

{

MessageBox.Show(“Sınav Yok”);

}

}

.NET kategorisine gönderildi | Yorum bırakın

CRM 4.0 CRM SERVİSİ KULLANARAK KAYDININ ETKİNLİĞİNİ DEĞİŞTİRME

Bazı durumlarda Crm’in kendi aktif ve pasif yapma fonksiyonlarını kullanmak yerine kodla bunu yapmak isteyebiliriz.Örneğin zorunlu alanların sürekli değiştiği bir sistemde kullanıcı eskiden zorunlu olmayan ama daha sonra zorunlu hale getirilen bir alanı pasif yapmadan önce doldurmak zorunda kalabilir.Bu alanlarla ilgili javascriptleri doğru ayarlamak da bir yöntem olabilir.Ancak toolbara isv configden bir button ekleyerekde kendi aktif ve pasif işleminizi yapabilirsiniz.Veya kendi iş akışlarınızda belli senaryolarda bu tarz bir kod kullanmanız gerekebilir.

Contact kaydını kodla pasifleştircek örnek kod aşağıdadır.Contact Kaydını pasifleştirmek için SetStateContactRequest ve SetStateContactResponse mesajlarını kullanabilir.Burada da ContactID mizi isv confige eklediğimiz tuştan gönderildiğini varsaydım.

protected void Page_Load(object sender, EventArgs e)

{

string ContactID = Request.QueryString["oId"].ToString();

CrmService activeService = new CrmService();

activeService.Credentials = System.Net.CredentialCache.DefaultCredentials;

activeService.CrmAuthenticationTokenValue = new CrmAuthenticationToken();

activeService.CrmAuthenticationTokenValue.OrganizationName = “Bilgehan”;

activeService.Timeout = 600 * 36000;

Guid EntityID=new Guid(ContactID);

string message=ChangeEntityStatus(activeService, EntityID, 2);

}

private string ChangeEntityStatus(CrmService service, Guid EntityId, int statuscode)

{

SetStateContactRequest req = new SetStateContactRequest();

req.ContactState = ContactState.Inactive;

req.ContactStatus = statuscode;

req.EntityId = EntityId;

SetStateContactResponse resp=(SetStateContactResponse)service.Execute(req);

return “Bilgehan”;

}

Crm kendi varlıkları içinbu tarz mesajlar mevcuttur.Ancak custom bir varlık için biraz daha değişik işlemler yapmak gerekir.Buradada kullancağımız mesajlar  SetStateDynamicEntityRequest ve SetStateDynamicEntityResponsedur.Crm kendi varlıklarından farklı olarak burada custom entity nin adınıda vermemiz gerekir.Moniker ise yeni bir instance üretmek için işimize yarar.

private static bool ChangeCustomEntityStatus(CrmService service, Guid EntityId, int statuscode, string statecode, string EntityName

)

{

SetStateDynamicEntityRequest req = new SetStateDynamicEntityRequest();

req.State = statecode;

req.Status = statuscode;

req.Entity = new Moniker();

req.Entity.Id = EntityId;

req.Entity.Name = EntityName;

SetStateDynamicEntityResponse resp = (SetStateDynamicEntityResponse)service.Execute(req);

return true;

}

}

CRM kategorisine gönderildi | Yorum bırakın

REPORT VIEWER KULLANIMI

Microsoft Reporting Service kullanarak oluşturduğumuz sql raporlarını kendi programımız içerisinden çağırmak istediğimiz zaman default olarak Toolboxda Reporting tabında bulunan ReportViewer kontrolünü kullanıyoruz

Burada report servera deploy edilmiş rapora ulaşabilmek için Choose Reportdan ServerReport

ReportServerUrl –Report serverın adresi

ReportPath–ReportServerda raporumuzun bulunduğu kısmın yolunu yazmamız yeterlidir.Bundan sonra projemizi çalıştırırsak raporumuzu görüntüleyebiliriz.(Tabi reportserverımız anonymous erişime açıksa)

Bunun dışındada aşağıdaki kodlar yazılarak ReportServera erişim yapılarak,içine raporun parametreleri vsler gönderilebilir.Rapor servera gönderilen raporlar vsler istenirse gizlenebilir

if (!Page.IsPostBack)

{

ReportViewer1.ProcessingMode = ProcessingMode.Remote;

ServerReport serverReport = ReportViewer1.ServerReport;

serverReport.ReportServerUrl = new Uri(“http://10.36.0.44/reportserver”);

serverReport.ReportPath = “/DMSReports/Report3″;

// IReportServerCredentials irsc = new CustomReportCredentials(“userid”, “password”, “domain”);

// ReportViewer1.ServerReport.ReportServerCredentials = irsc;

ReportParameter param1 = new ReportParameter();

param1.Name = “UserId”;

param1.Visible = false;

param1.Values.Add(“2″) ;

ReportViewer1.ServerReport.SetParameters(new ReportParameter[] { param1 });

}

Yukarıdaki koddan farklı olarak eğer report servera ulaşmak için credential kullanmanız gerekiyor ise yukarıdaki kodda commentlenmiş iki satırı açarak

Aşağıdaki gibi bir class tanımlayarak bağlantı sağlayabiliriz.Aşağıdaki msdn forumdan alınmış bunun  için güzel bir class örneğide mevcuttur

public class CustomReportCredentials : Microsoft.Reporting.WebForms.IReportServerCredentials

{

// local variable for network credential.

private string _UserName;

private string _PassWord;

private string _DomainName;

public CustomReportCredentials(string UserName, string PassWord, string DomainName)

{

_UserName = UserName;

_PassWord = PassWord;

_DomainName = DomainName;

}

public WindowsIdentity ImpersonationUser

{

get

{

return null;  // not use ImpersonationUser

}

}

public ICredentials NetworkCredentials

{

get

{

// use NetworkCredentials

return new NetworkCredential(_UserName, _PassWord, _DomainName);

}

}

public bool GetFormsCredentials(out Cookie authCookie, out string user, out string password, out string authority)

{

// not use FormsCredentials unless you have implements a custom autentication.

authCookie = null;

user = password = authority = null;

return false;

}

}

SQL SERVER kategorisine gönderildi | Yorum bırakın

REPORT SERVER LOGLAMA – AUDIT

Report Serverın ayarları açık ise report servera her bir istek gönderildiği zaman report serverda bir kayıt oluşur.Yani reportserverda ne zaman view report tuşuna basılırsa veya kaydetme tuşlarından excel,pdf veya başka bir formata rapor alınmak istenirse report serverda kaydı tutulur

Eğer değiştirilmediyse report serverın default log tutma süresi 60 gündür ve bu özellik açık olarak gelir.Ancak report serverın propertiesinden bu süre arttırılabilir veya report serverın loglaması kapatılabilir

Daha sonra Report Server db sine giderek ExecutionLogStorage tablosuna bakalırsa işlem logları bu tabloda tutulmaktadır

Select  * from ExecutionLogStorage

ExecutionLogStorage tablosundaki bazı önemli alanlar şunlardır

UserName àEğer program domain mantığında çalışıyor ise burada domain user ismi

àEğer program domain değil anonymous mantığı ile çalışıyor ise dummy user olarak kayıt çıkacaktır

Format: RPL,Excel,PDF vs hangi formatta veri istenmişşe o gözükür.Zaten view report butonuna basıldığında direkt olarak format alanı RPL olacak şekilde sisteme bi kayıt düşer

Parameters:Rapora gönderilen parametreler aşağıdaki gibi & işareti ile ayrılarak tutulur

begin=12.06.2011&end=13.06.2011&BU=6163296b-f798-df11-8fa0-001a64c78ef4

ReportID:Hangi rapordan istek yapıldığının ID si tutar.Buradaki reportID catalog tablosunda itemID ile join edilerek Catalog tablosundan raporun report servera deploy edilmiş hali bulunur

Select ItemID,Name from Catalog

TimeStart:İsteğin başladığı tarihi gösterir

RowCount:Kaç kaydın o anda alındığını gösterir

Yalnız rowcount excel,pdf aktara basıldığında rowcount atmaz.Sadece bir tane log kaydı oluşur.RowCount view report basıldığında sorgu sonucu dönen kaydı tutar

Dolayısıyla her reportview ,ve excel,pdf aktarma işlemi için report serverda bi log oluşur

Eğer sisteminiz domain mantığı ile çalışıyorsa  ExecutionLogStoragedaki UserName kullanarak kendi user tablonuzdaki domain name ile eşleştirebilirsiniz

Yok eğer sisteminiz domain mantığında değilse ve hangi kullanıcının işlem yaptığını öğrenmek istiyorsanız bunun için Her raporunuza sabit olacak şekilde Sisteminizdeki report viewara UserId diye bir parametre göndermek ve daha sonra UserId parse ederek buradaki değer ile kendi user tablonuzdaki değeri eşleyerek işlem yapabilirsiniz

Uyarı:Eğer report serverınız ile programınızın kullandığı veritabanı ayrı sqllerde ise ve siz link server ile report servera sorgu atacak iseniz  aşağıdaki gibi hata alacaksınız.Çünkü ExecutionLogStorage içinde xml bir alan olduğu için size izin vermeyecektir

Bunu aşmak için linked serverdan sorgu çekeceğiniz yerde OPENQUERY komutunu kullanmanız gerekir.Aşağıdaki gibi örnek bir sorgu ile hem linked serverdan parametrik olarak veri çekip sonra bunu bir temp table yardımı ile kendi veritabanımız ile birleştirerek kullanabiliyoruz

DECLARE @sqlQuery VARCHAR(8000)

DECLARE @finalQuery VARCHAR(8000)

SET @sqlQuery = ‘Select  UserName AS UserID,Name AS RaporAd,ReportID,Format,[RowCount] AS RowAdet,TimeStart,TimeEnd from  [ReportServer].[dbo].[ExecutionLogStorage] inner join [ReportServer].[dbo].[Catalog] on [Catalog].ItemID=ExecutionLogStorage.ReportID WHERE TimeStart >= ‘ + ”” + ”” + convert(varchar,@TimeStart) + ”” + ””  + ‘and TimeStart<”’ + ””+convert(varchar,@TimeEnd) + ”” + ””

SET @finalQuery = ‘SELECT * FROM OPENQUERY([CRM4APP],’ + ”” + @sqlQuery + ”” + ‘)’

CREATE TABLE #List1

(

UserID varchar(500), RaporAd varchar(500) ,ReportID uniqueidentifier,Format varchar(100),RowAdet int,TimeStart datetime,TimeEnd DateTime

)

INSERT INTO #List1

(

UserID,RaporAd,ReportID,Format,RowAdet,TimeStart,TimeEnd)

exec(@finalQuery )

select  SystemUser.SystemUserId AS UserID,SystemUser.FullName AS KullanıcıAd,SystemUser.DomainName,RaporAd,ReportID,Format,RowAdet,convert(varchar,TimeStart,103) AS TimeStart,convert(varchar,TimeEnd,103) AS TimeEnd,BusinessUnit.Name AS BayiAd  from #List1

inner join SystemUser on SystemUser.DomainName=#List1.UserID COLLATE Turkish_CI_AI

inner join BusinessUnit on SystemUser.BusinessUnitId=BusinessUnit.BusinessUnitId

drop Table #List1

SQL SERVER kategorisine gönderildi | Yorum bırakın

CRM 4 SERVERDEN TARİH OKUTMA VE FORMDA AJAX KULLANIMI

1-)Crm 4 de Formlara javascript yazıyoruz.Javascripte ise bilindiği gibi o anki saati Date() fonksiyonu  ile çekiyoruz.Ancak bilindiği gibi javascript client bazlı çalışır ve yüzden zamandan kontrol etmemiz gereken noktalarda serverın sistem saat,ne ihtiyaç duyarız

2-)Bunun için CRM formumuzda ActiveXObject den yararlanıyoruz ve

Oluşturduğumuz ActiveX nesnesini open metodu ile gideceği aspx sayfasını belirtiyoruz

Not:aspx sayfamızı inetpub da crmimiz altında bi yere publish ettikten sonra IIS den bu uygulamayı convert to application diyerek kullanıma hazır hale getirmemiz gerekiyor

Open Metodunda QueryString mantığıda kullanarak sayfamıza parametre gönderebiliyoruz

Yapmamız gereken tek şey formda adresten ?ParametreAdı=ParametreDeğeri şeklinde tanımlama yaparak kod tarafında ise Requst.QueryString[“Parametre”] adı ile yollanan değeri okutmaktır

var objHTTP = new ActiveXObject(“Msxml2.XMLHTTP”);

objHTTP.Open(“GET”, ‘/ISV/Bilgehan /ServerTimeControl/ServerTimeCheck.aspx’,false);

objHTTP.Send(null);

var response = objHTTP.ResponseText;

var currentdate =response.split(‘@’);

3-)Daha sonra sayfadan dönen kodu activeX objemize ResponseText diyerek alıyoruz.Tabi aspx formumuzda Response.Write ile istediğimiz değeride yazdırmamız gerekiyor

4-)Bizim senaryomuz gereği bir aspx sayfası oluturalım ve içine aşağıdaki gibi kodumuzu yazalım

namespace CRMTimeControllerAjax

{

public partial class ServerTimeCheck : System.Web.UI.Page

{

private string entity = string.Empty;

protected void Page_Load(object sender, EventArgs e)

{

Thread.CurrentThread.CurrentCulture = new CultureInfo(“en-US”);

string currentdate = DateTime.Now.ToString(“ddd MMM d HH:mm:ss UTCzzzzz yyyy”);

int  UTCPointIndex=   currentdate.LastIndexOf(‘+’)+3;//Benim istediğim formatta utcden sonra gelen + dan sonraki nokta yok

currentdate = currentdate.Remove(UTCPointIndex, 1);

Response.Write(currentdate+”@”);

}

}

}

5-) Burada response.writedan sonra direkt datetime.now diyerek bırakmadım nedeni ise CRMin tarih formatının biraz daha farklı olması

Crmde Date() fonksiyonu ile tarihi yazdırdığımız zaman verilen format benim serverım için UTC formatında ve bu tarih formatını kullanabilmek için kendi asp.net kodumda birkaç tane string işlemi yaptım ve en son olarak da bu formatta tarihi elde ederek en son response write @ işareti koyarak çıktımı yazdırdım.bunun nedeni ise

objHTTP.ResponseText; ile gelen değeri yazdırdığımızda çıktısını aşağıdaki formatta vermesi @ işareti koyarak split metodu ile ilk gelen tarih değerimizi alarak bir değişkene atıyoruz ve bu şekilde tarihimizi kullanıyoruz

var response = objHTTP.ResponseText;

var currentdate =response.split(‘@’);

6-)Son  Haliyle Serverdan sistem saatini kullanmak için aspx sayfamızda aşağıdaki kodlar(tabi siz kendi server formatınıza göre bu kodu düzenlemeniz lazım)

Thread.CurrentThread.CurrentCulture = new CultureInfo(“en-US”);

string currentdate = DateTime.Now.ToString(“ddd MMM d HH:mm:ss UTCzzzzz yyyy”);

int  UTCPointIndex=   currentdate.LastIndexOf(‘+’)+3;//Benim istediğim formatta utcden sonra gelen + dan sonraki nokta yok

currentdate = currentdate.Remove(UTCPointIndex, 1);

Response.Write(currentdate+”@”);

CRM Formdaki kodumuz ise aşağıdaki gibi olacaktır.

var objHTTP = new ActiveXObject(“Msxml2.XMLHTTP”);

objHTTP.Open(“GET”, ‘/ISV/Bilgehan/ServerTimeControl/ServerTimeCheck.aspx’,false);

objHTTP.Send(null);

var response = objHTTP.ResponseText;

var currentdate =response.split(‘@’);

var now =new Date(currentdate[0]);

CRM kategorisine gönderildi | Yorum bırakın