Öne çıkan

SQL SERVER 2014 ALWAYS ON’A ADIM ADIM..

Merhaba arkadaşlar,

Paylaşacağım bu yazıyı zaman içinde güncelleyerek yazmaya devam edeceğim.Yapacağım işlemlerle birebir bir anlatım olacağı için sorun yaşayabileceğim kısıma geri dönüp düzeltmelerde bulunmak zorunda kalabilirim [ ki kaldım 🙂 ]..Resimlerle de desteklenecektir (resimleri büyütmek için üzerine tıklamanız yeterli).

1-) SANAL MAKİNE VE SERVER KURULUM 

İlk olarak 8 GB Ram i 350 GB harddisk i olan bilgisayarıma VMware Workstation (11) i kurdum ve 3 sanal makine oluşturdum.Oluşturduğum sanal makinelerden birini DOMAIN CONTROLLER (DC) diğerlerini de KLON2 ve KLON3 olarak belirledim.Daha sonra 3 sanal makineye de Windows Server 2012 R2 yi kurdum.İlk ayarları olarak önce 2 sine (KLON2 ve KLON3) 2GB RAM DC ye 1 GB RAM ve 60 ar GB lık harddiskten yer verdim.

1_baslangıc

2-) DC YE DOMAIN KURULUMU

DC makinada active directory domain service (ad ds) i kuracağız.Bunun için DC da Server Manager Dashboard da Manage kısmını gelip Add Role and Features diyip ayarlarımızı yaptık.Karşımıza gelen Wizard’da Before you Begin için Next diyoruz,Installation Type için Role Based seçeneğini seçip Next yapıyoruz,Server Selection adımı için Select a Server from Server Pool seçeneğini seçip Next yapıyoruz,burada kuracağımız makinenin IP adresi yine alt kısımda görülecektir,isterseniz bunu burda not edin.Server Role adımında ise Active Directory Domain Service i tiklememiz yeterli.Karşımıza gelen ekrana ADD diyip devam ediyoruz.Feature adımında herhangi bir değişiklik yapmıyoruz Next diyip geçiyoruz.AD DS kısmına next ve son adım olan Confirmation da Restart özelliğini seçip Yes diyoruz ve Install diyoruz.Böylece domain imizi kurmuş olduk.DC olan makinemin IP adresi de 192.168.137.128 olarak veriyorum.

Kurduktan sonra Dashboard üstündeki FLAG de bir uyarı görülecek ve buna tıklayıp Promote This Server a Domain Service seçeneğiyle devam ediyoruz.Deployment Configuration kısmında Add a new Forrest diyoruz ve bizden bir root domain adı istiyor.Burda nokta ile birbirinden ayrılmış en az 2 kelime giriyoruz.erol.com,erol.local gibi..Ben erolakgul.wordpress.com diyip geçiyorum.Domain Controller Options kısmında Forest ve Domain level’larımı server 2012 R2 olarak seçiyorum ve alt kısımda da DNS SERVER kurulumu için tikli olmasına dikkat ediyorum.

Daha sonra da bir altta hemen daha önce backup ı alınmış active directory lerin restore işlemlerinde kullanılmak üzere bir şifre beliriyoruz “Password1” gibi.Next ten sonraki adımda bize bir hata gösterecek DNS oluşturamadığıyla ilgili şuan için önemsemeyip Next diyoruz.Additional Option kısmında bizden NetBIOS Domain name istiyor ben bu kısma EROL deyip geçiyorum.Path kısmında bize kurulacak olan adresleri gösterecek default olarak gelen ayarlara dokunmayıp Next diyoruz.Review Option kısmına Next dedikten sonra bir sonraki adımda Succesfully olarak gerçekleşmiş işlemi görüyoruz ve Install diyoruz.Yükleme bittikten sonra bizden DC nin restart edilmesi gerektiğni söylecek ve restart işlemini gerçekleştiriyoruz.DC yeniden açıldığında sizde karşınızda NetBIOS Domain Name e yazdığınız “isim”\Administrator olarak giriş yapacaksınız.Artık bu makine de Local deki admin değil Domain deki admin olacaksınız. Server Manager da ise artık AD DS ve DNS hizmetlerini de görüyor olacaksınız.Manage in hemen yanındaki Tools larda ise Active Directory Bileşenlerini de görüyor olacaksınız.

3 adet sanal makinemiz vardı bunlar DC (192.168.137.128) ve KLON2 (192.168.137.129) ve KLON3(192.168.137.130).Bunların ilk önce haberleşebilmelerini sağlayacağız.Bunun içinde ilk önce ;

2_vmnet baglantıları

DC sekmeye sağ tıklayıp settings den Network Adapter kısmına gelip Custom yazan yer için Vmnet3 switch ini seçiyoruz.Aynı işlemi KLON2 ve KLON3 ümüz içinde yapıyoruz.

2-A) IP YAPILANDIRMASI

DC’nin sağ altta internet erişim ikonuna sağ tıklayıp Open Network and Sharing Center’a tıklıyoruz.Açılan pencerede connections kısmında ethernet e tıklıyoruz.Açılan ekranda Properties e tıklıyoruz ve yeni sayfaya yönlendiriliyoruz.Açılan ekranda Internet Protocol Version IPv4 ayarlarına tıklıyoruz burda yapmamız gereken değişiklikler var onları kontrol edeceğiz.

3_ip yapılandırması

IP adres kısmına o makinemizin adresini yazıyoruz.Subnet Mask’ı IP nin son sayısını yazdıktan sonra tab a bastığınızda otomatik olarak atayacaktır zaten.DNS SERVER adresses kısmına ise o makinemizin kullanılacağını belirtmek için LOCAL IP anlamına gelen 127.0.0.1 olarak giriyoruz.Dns server hangi makinedeyse o makinenin adresini de verebiliriz ayrıca.

3-) KLON2 Yİ DC YE BAĞLAMA

DC de gerekli ayarları yaptıktan sonra sıra geldi KLON2 yi Domain’e bağlamaya.DC de yaptığımız gibi network and sharing center ı açıyoruz ve Internet Protocol Version IPv4 ayarlarına geliyoruz.

4_klon2 ip

Buradaki IP adress kısmına 2.makinemiz olan KLON2 nin IP adresini yazıyoruz bu sefer.Dns Server Adresses kısmına ise bağlamak istediğimiz makinenin IP sini yani DC’nin IP adresini giriyoruz ve OK diyip çıkıyoruz.

Daha sonra da başlat menüsünden System e giriş yapıyoruz.Açılan pencerede Computer name domain and workgroup un karşısındaki Change Settings e tıklıyoruz ve System Properties ekranı ile karşılaşıyoruz.Burda da Change e tıklıyoruz ve Computer Name/Domain Changes ekranında Computer Name kısmına KLON2 hemen alttaki Domain kısmına ise DC de oluşturduğumuz Root Domain Name i yani erolakgul.wordpress.com u girdim.Ok dediğim an bana DC de yetkili kullanıcının Kullanıcı adını ve şifresini girmemi istiyor.Bu kısımda Administrator ile şifresini girdikten sonra karşınıza Welcome to erolakgul.wordpress.com domain uyarısı gelicektir.Ok dedikten sonra KLON2 yi yeniden başlatmanız gerekecektir.

KLON2 makinesi yeniden açıldığında karşınıza KLON2\Administrator kullanıcı adıyla gelecektir herhangi bir domain oluşturmadığımız için burda yine LOCAL de bir kullanıcıdır bu da.Fakat domaine bağladığımız için bu makineyi admin hesabıyla girmemiz gerekmektedir ve switch user diyip Administrator yazdığınızda hemen altta log on to KLON2 yazacaktır yani hala local de bir makineye giriş yapacağımızı söylüyor bize.Dolayısıyla kullanıcı adını Administrator@erolakgul.wordpress.com olarak yazdığım an alt kısımda log on to erolakgul.wordpress.com yazacaktır,yani root domaine bağlanacağımızı söylemektedir.Şifre olarakta DC nin şifresini giriyoruz.KLON2 nin şifresini girmiyoruz bu unutulmamalı.Dolayısıyla başka bir makineden DC ye yine Adminmiş gibi bağlanıyoruz.

5_KLON2 system

domain22222

4- KLON3 ü DC YE BAĞLAMA

Aynı işlemleri KLON3 içinde yapıyoruz,

6_klon3 ip

IP ayarlamalarını yaptıktan sonra “CMD” yi açıp haberleşip haberleşemediklerine bakıyoruz; [ ilk kurulumda root domain adını “erolakgul.wordpress.com” vermiştim fakat tekrar kurduğumda yapıyı “erol.local” ismini verdim]

6_pıng

Görüldüğü üzere ping atma işlemleri de başarıyla gerçekleştirildi,Domain’e katma işini de yaptıktan sonra en son yine DC nin admini ve parolası ile giriş yapıyoruz ve ilk işlemlerin bu adımlarını sonlandırıyoruz.

7_KLON3 system

NOT : Bundan sonraki bütün işlemler için klon2 ve klon3 e domain admin olarak giriş yapıyoruz “Administrator@erol.local” gibi gibi…

5-SQL CLUSTER NODE’LARI İÇİN ORGANIZATION UNIT (OU) YAPILANDIRILMASI

DC üzerinde “Search” e active directory users and computers yazıyoruz ve pencereyi açıyoruz,gelen ekranda “Computer” a baktığımızda KLON2 ve KLON3 ün bağlı olduğunu görüyoruz.

8_ad

Şimdi geliyoruz Cluster işlemleri için bir organizasyon birimi oluşturmaya.Bunu cluster üyesi olacak kullanıcılar ve node ları bu organizasyon çevresinde toplamaya çalışarak yapacağız.İlk olarak erolakgul.wordpress.com domaini altında MSSQL Cluster işlemleri için ayrı bir OU oluşturuyoruz;

Şekildeki gibi başlıyoruz..
Şekildeki gibi başlıyoruz..

Adına da “Cluster SQL” diyoruz.Bunun altına şimdi diğer “OU” ları teker teker tanımlıyoruz;

10_cluster

MSSQL Cluster OU su ise şu alt OU’lara sahiptir.

Servers = Cluster’a üye sunucuların yer alacağı OU dur.

Users = Cluster işlemleri ve servisler için açılan kullanıcıların yer aldığı OU dur.

Groups = Cluster işlemleri veya bu grubun üyesi sunucular için bir Group gereksinimi mevcut ise bu OU altında oluşturulur.

Shared Object = GPO ile sunucular için bir Folder Share edilmesi gerekiyor ise bu OU altında belirtilir.

Organization Unit yapısında şimdi de Sql Server Servis’leri için kullanıcı tanımlamalarına geldi sıra.Sql Server Cluster kurulumunda Sql ve diğer servislerin bir Domain kullanıcısına ihtiyacı vardır.Oluşturacağımız kullanıcı Sql Server Servislerine bağlanabiliyor olacak ;

2_user_oluşturma

Boşlukları doldurduktan sonra “Next” diyoruz ve bizden bir şifre tanımlamamızı istiyor.Tanımladıktan sonra da hemen altındaki “user cannot change password” ile “password never expire ” seçeneklerini tikliyoruz ki kullanıcı hem kendi şifresini kendisi değiştiremesin değiştirmesi gerekiyorsa da bundan haberimiz olsun hem de tanımladığımız şifrenin bir miad ı olmasın.Tekrar Next ve sonraki ekranda da finish diyip bitiriyoruz.Domain adımıza refresh yaptığımızda oluşturduğumuz kullanıcı görünmüş oluyor.

13_son kısmı

5-A) Cluster Üyesi Sunucular için Group Policy Ayarları,

//** NOT:sanal makineleri tekrar kurmak zorunda kaldım,root domain name olarak daha kısa olan “erol.local” ismini verdim,onun dışında bir değişiklik yapmadan yazımıza devam ediyoruz.**//

Group Policy ayarları için ilk olarak “Group Policy Management” penceresini açıyoruz.Ve domain altındaki erol.local sekmemize sağ tıklayıp “Create a gpo in this domain and link it here” diyoruz ve zaten var olan “default domain policy ” altında yeni açtığımız “sql cluster policy” inin de olduğunu görüyoruz.

Şimdi burdan ayarlarımıza devam ediyoruz,”Sql Cluster Policy” e sağ tıklayıp “Edit” diyoruz ;

1_group policy

Karşımıza “Group Policy Managent Editor” ekranı gelecektir.Local Users and Groups a kadar geliyoruz sağ tıklayıp new local groups diyoruz ;

2_userpoliciy

Dedik ve bir sürü ekran açıyoruz,adım adım tıklayarak en son -> organization unit açıp “MSSQL Cluster” isimli OU muzun altındaki “Users” için oluşturduğumuz isim soyisim i “erol akgul” olan ve logon name i “clsadmin@erol.local” olan kullanıcımızı domain user seviyesindeki kullanıcılarımızı Cluster sunucularımızın Administrator grubuna üye yapmış olacağız.

“New local group properties” ekranımızda ; “Action” sekmesinde Update i seçiyoruz çünkü zaten oluşturduğumuz bir kullanıcı var ve bunun güncellemesini yapacağız sadece,”Group Name” sekmesinde kullanıcıyı hangi gruba dahil edeceğimiz bilgisini dolayısıyla administrator grubunu seçiyoruz; 2 nolu kısma tıklayıp hangi domain kullanıcımızı bu gruba dahil edeceğimiz bilgisini giriyoruz;3 nolu ekran geliyor karşımıza ve ordaki 3 noktalı butona tıklayıp “Select user and group” sayfasına gidiyoruz;4 “advanced” e tıklayıp ordan da son ekranımıza geçiyoruz;burda 5 “find now” a tıklayıp domain deki tüm kullanıcıları görebiliyoruz; 6 nolu kısım hariç diğer tüm kullanıcılar “erol.local/Users” şeklindedir.Sadece MSSQL Cluster için oluşturduğumuz kullanıcı “cluster” üyesidir.Onu seçip “ok” diye diye ilk ekrana geri dönüyoruz ;

3_policygroupson

Kürkçü dükkanımıza geri döndüğümüzde “Members” altında EROL\clsadmin hesabımızı görebiliyoruz.Yan tarafında da “SID” Securtiy Identifiers numarası da yayınlanmaktadır.”Apply” diyerek işlemimizi bitiriyoruz.Artık bu OU altında yer alan sunucular için bu kullanıcımız otomatik olarak “Local ADMIN” seviyesinde olacaktır.

NOT : Cluster Adminimizle (clsadmin@erol.local) sql server’ları kurmadan hemen önce KLON2 ve KLON3 e bağlanacağız bunu unutmayalım.

5-B) Local Admin’in Cluster İşlemleri İçin Yetkilendirilmesi

Oluşturduğumuz kullanıcıya Local Admin olma yetkisini verdikten sonra OU’da ki tüm özellikleri okuyabilme yetkisini vermek için Sql sunucularımızın yer aldığı Computer sekmesi altında gerekli izinleri vereceğiz.Active Directory Users and Computers ekranımızı tekrar açıyoruz.”Cluster SQL” OU’muza sağ tıklayıp “View” den “Advanced Features” ı aktif ediyoruz.Böylece “Server” sekmemize sağ tıklayıp “Properties” dediğimizde “Security” tab ını açmış olacağız;

4_yetkilendirme

Security sekmesinde “add” diyip bizim kullanıcıyı bir ekliyoruz önce,sonra “advanced” diyip gelişmiş güvenlik ayarlarının açılmasını bekliyoruz.Ekran gelince de bizim malum kullanıcıyı seçip “Edit” diyoruz ve ;

5_izinler

vermeniz gerekli izinleri bu kullanıcıya atayıp “ok” e tıklaya tıklaya işlemimizi sonlandırıyoruz.

6-) KLON2 ve KLON3 e ek Adapterlerin Takılması ve IP Yapılandırılması

İlk kurulumda DC-KLON2-KLON3 ün birbirleriyle olan network bağlantısını VMmnet3 üzerinden yapmıştık.Şimdi şu şekilde bir yapılandırmaya gidiyoruz;

8_net bağlantıları

“Add” diyerek öncelikle 2 adet daha “Network Adapter” ekliyoruz.Daha sonra 2.ye “VMnet2”,3.ye de “NAT” connection ı seçiyoruz.Aynı yapılandırmayı KLON3 içinde yapıyoruz.

9_isim değiştirme

KLON2 üzerinde sağ alttaki network adapterlerin üzerine ok ile geldiğinizde yukarıdaki resimdeki gibi baloncuk oluşacaktır ve hangi adapter olduğu görünecektir.Sağ tıklayıp “disconnected” dediğinizde yukarıda bir bağlantı kopacaktır ve isimleri de “VMnet3 -> MANAGEMENT” , “VMnet2 -> HEARTBEAT” ,”NAT -> STORAGE” olmak üzere değiştiriyoruz ki işimiz daha kolay olsun.KLON3 te de yine aynı ayarları yapıyoruz.Son olarak IP lerini yapılandırmalarını da ;

KLON2 makinesi üzerinde heartbeat için şu değişikliği yapıyoruz ;

10_heartbeat

“Storage” içinse farklı bir IP yapılandırmıyoruz.Otomatik olarak kalıyor.KLON3 ün “HEARTBEAT” adapteri için IP “1.1.1.2/24” olarak giriyoruz ve “Storage” yine otomatik IP alacak şekilde bırkarıyoruz ;

9_network sharing

KLON2 ve KLON3 makinelerimiz şuan internete de çıkabiliyor oldu.

6-A) Ek Güncellemelerin Alınması

Server Manager’dan KLON2 ve KLON3 e “Add feature and roles” dan “.NET 3.5” ile “Failover Cluster” ları yüklüyoruz.İşlemler sonrası restart yapıyoruz.Açıldığında da 2 makinenin “windows update” lerini alıyoruz.

7-) Failover Cluster’ların Kurulması

Güncellemeleri aldıktan sonra failover cluster ı kurmadan hemen önce oluşturduğumuz ve Cluster’a eklenecek 2 node’un da (klon2 ve klon3) validate control’den eksiksiz bir şekilde geçmesi beklenir.Kontrol için (failover cluster ı klon2 ye kuracağız biz de) server manager -> tools tan “failover cluster manager” ı açıyoruz ;

11_failover tes

“Validate Configuration” diyoruz ve test işlemimizi yapmak için “Select server or cluster” da browse->advanced->find now deyip sadece klon2 ve klon3 ümüzü seçiyoruz ;

12_node seç

“ok” deyip node’ları ekliyoruz.”testing option” sekmesinde “run only tests i select” kısmını seçip next diyoruz.”test selection” sekmesinde “Storage” kısmının tick ini kaldırıp next diyoruz tekrar,”Confirmation” sekmesinde tekrar next diyoruz;

14_report

Küçük bir hata aldık “validate ip configuration” ile ilgili ama devam edip cluster kurmaya devam edebiliriz önem arz eden bir hata değil ;

16_report2

Wizard ekranında önce bir “cluster name” giriyoruz (EASQLCLS) ,bendeki IP yapılandırması bende otomatik olduğu için boş bir IP adresi buldu ve kendisi ekledi.

NOT: Daha sonra storage adapter ini kapatıp klon2 ve klon3 te,klon2 de tekrar cluster oluşturdum ve de elimle “192.168.137.100” IP sini verip kuruluma devam ettim.

17_CLUSTER

Cluster ı oluşturduktan sonra “QUORUM” ayarlarını yapıyoruz hemen.Öncelikle bir dosya açıp bunu gerekli izinleri veriyoruz.

2_quorum dosyası

Şekilde de görüldüğü gibi 5 adımda bu kurulumu da yapmış oluyoruz.Network paylaşım url si bize lazım olacak o dosyanın,daha sonra oluşturduğumuz cluster a sağ tıklayıp 1 üst resimde gösterildiği şekilde ilerleyip “configure” e geliyoruz ;

1

Gelen wizard penceresinde “select quorum configuration option” sekmesinde “advanced quorum configuration” ı seçiyoruz ve next diyoruz.Bir sonraki ekranda hangi node ları alacağını soruyor onda da “all” seçeneğini işaretleyip “klon2 ve klon3” ü ekliyoruz.Bir sonraki adım da “configure a file share witness ” ı seçiyoruz ki klon1 deki paylaşılmış dosyayı seçtirelim,next diyoruz.Bu adımda da klon1 de oluşturduğumuz o dosyanın network yolunu gösteriyoruz.Next-finish diyerek işlemi sonlandırıyoruz.

8 -) SQL SERVER 2014 ün KLON2 ve KLON3 e Kurulması

Bu işlem öncesinde cluster admin olarak oluşturduğumuz (clsadmin@erol.local) kullanıcı ile klonlarımızı tekrar açıyoruz.

3_clsadmin

Sql Server için iso dosyamızı gösterip kuruluma başlıyoruz.”New Sql Server standalone ..” seçeneği ile başlıyoruz ve klasik kurulumumuzu yapıyoruz.Gerekli güncellemeleri kontrol etmemiz gerekiyor,güncellemeleri aldıktan sonra bi kaç adıma dikkat etmek gerekiyor ;

4_latin1     5_serve configuration

“collation” sekmesinde default olarak gelen dil ayarına dokunmuyoruz.”Server Accounts” sekmesinde ise “account name” kolonunda bizim oluşturduğumuz cluster admini seçiyoruz password ünü de hemen yanındaki kolona yazıyoruz;

6_sa admin

“sa” için bir şifre belirliyoruz,sql server admini olarak cluster adminimizi seçiyoruz.next next install diyerek kurulumumuzu tamamlıyoruz ;

7_setup

“Succeeded” larımızı da aldık,close diyip kapatıyoruz.;

9_klon2 sql server      10_sql server

Cluster adminimiz ile giriş yaptığımızda sql sunucumuzda açılmış oluyor,sa ile de bağlanabilirdik.Şimdi aynı adımları klon3 içinde yapıp sql server 2014 ü kuralım;

11_klon3 sql server     12_klon3

9 -) Node’larda ki Always On’un Aktif Hale Getirilmesi 

Klon3 e de sql server’ları kurduktan sonra sunucularda “Always On” u aktif etmek için “sql server configuration manager” ları açıyoruz ;

13_configuration manager

Yukarıdaki adımları izleyip Sql Server (msssqlserver) a sağ tıklayıp özellikleri açıyoruz.

14_alwayson

Gelen ekranda “Always On High Availability” sekmesini seçtiğimizde default olarak “Windows failover cluster name” imimizin geldiğini görüyoruz (EASQLCLS).Bu pencerede yapacağımız tek işlem hemen alttaki “enable alwayson availability groups” seçeneğini tikleyip “apply” tuşuna basmak olacak.Gelen uyarı ekranına ok deyip,sql server service ine sağ tıklayıp restart diyoruz ve sql sunucularımızda always on u aktif hale getiriyoruz.Aynı işlemleri klon3 üzerinde de yapıyoruz ve orada da aktif hale getiriyoruz…

TCP\IP ayarlarından da ;

16_tcpıp

şekildeki gibi adımları izleyip enable=yes olarak ayarlıyoruz ve IP üzerinden klon2 ve klon3 ün haberleşebilmelerini sağlıyoruz.Klon3 te de aynı işlemleri yapıyoruz herzamanki gibi..

**DC de active directory i açıp “Computer” sekmesine gelip sağ tık özelliklerden “security” kolonunda “add” deyip cluster adminimizi ekiyoruz,”advanced” den de “create computer ve delete computer” yetkilerini verip işlemimizi tamamlıyoruz bu kısımda da.

**Klon2 node’umuzda sql server ‘a da deneme amaçlı olarak “Northwind.bak” uzantılı dosyaları restore edip yüklüyoruz.

15_restore

** Northwind e sağ tıklayıp properties->options dan recovery model ini full e çekiyoruz.Çünkü database tarafında bu veritabanının bir full back up ı bulunmak zorunda.

**Yeni açtığımız Sql Server a hazır bir database restore ettikten sonra (KLON2’ye) o database in hemen bir full back up ını alıyoruz.Bunun için yine sağ tıklayıp task->Backup diyoruz ve hızlı bir şekilde backup ını alıyoruz.

10 -) AlwaysON Gruplarının Oluşturulması

**Klon2 de C’nin altına paylaşıma açık bir klasör oluşturuyoruz şimdi ;

17_FOLDER

2.adımda cluster adminimizle bu paylaşımı yapıyoruz,ek olarak Permission’dan “add” deyip cluster adminimizi buraya da ekliyoruz “apply” deyip pencereleri kapatıyoruz.

**Sql server da “AlwaysOn High Availability” dizini altındaki “availability groups” a sağ tıklayıp “new ..wizards” ekranına geliyoruz ;

** “Specify Name” ile oluşturmak istediğimiz availability groups a bir isim veriyoruz ve next diyoruz;

** “Select Database” de veritabanımızı seçiyoruz,bizim zaten 1 tane olduğu için sadece “northwind” göründü,eğer o database in full backup ını aldıysanız “status” kolonunda “meet prerequisites” açıklamasını göreceksiniz,neyse northwind i seçip next diyoruz;

** “Specify Replicas” sekmesinde “Replicas” kulakçığında “add replica..” a tıklayıp “KLON3” ü görmesini sağlıyoruz.Klon3 e yine cluster adminimizle bağlanıyoruz TABİ BUNUN İÇİN FIREWALL ayarlarında “Domain Network Settings” için güvenlik duvarını kaldırıyoruz.Diğer türlü KLON3 ünüze bağlanamayacaktır.

18_specifyreplicas

Synchronous ve Automatic Failover kolonlarını tikliyoruz ve ikincil database in okunabilir olmasını istiyorsak yani birinci de işlemleri yaptırıp ikince de sorgu çektirtmek istiyorsak “yes” olarak işaretleyebilirsiniz ;

*** “Endpoint” kulakçığında ;

19_endpoint

2 bilgisayarın hangi port üzerinden haberleşeceğini gösterir.Önemli olan ise 5022 no’lu port un firewall da açılmış olmasıdır.Endpointler sayesinde sql server lar replika işlemlerinde haberleşmeyi sağlarlar..

*** “backup preferences” kulakçığında ise,backup ların hangi sunuculardan alalım diye soruyor ;

20_backup preference

prefer secondary -> ikincil den al,sıkıntı olursa birincilden al backup ları

secondary only -> sadece ikincil den al

primary -> sadece  birincil den al

any replica -> bu kısımda klon2 ve klon3 e önem arz ediyorsunuz,klon2 yüzde 51,klon3 yüzde 49 yaparsanız önceliği klon2 olur.

*** “listener” kulakçığında ise ;

21_listener

Eğer SQL sunucularınıza Cluster servisinin IP veya Hostname’i ile değilde farklı bir IP veya Hostname ile SQL sunucularınıza erişmek istiyorsanız Listener tanımlamamız gerekmektedir.Client tarafında connection string te kullanacağımız bu IP ile sunucularımıza bağlanabilir olacağız.Listener a vereceğimiz Ip sunucularımız üzerinde kullanılmıyor olmalı.Next deyip devam ediyoruz .

** “select data synchronization” sekmesinde verinin senkron edilmesi için yapacağımız tercihi soruyor,”full” kısmında daha önce C diskinde paylaşıma açtığımız “\\Klon2\backupshare” yolunu gösteriyorum next diyorum..

22_validation

yaptığımız işlemlerin doğruluğu başarıyla sınandı.Next diyoruz tekrar.

23_complete_   24_klon3 always

Ve sonunda “always on” için grupları da kurmuş olduk.Geçmiş olsun 🙂

11-) 1433 ve 5022 No’lu Portların Açılması

Bitti mi ? Tabi ki bitmedi.Sunucularımın haberleşebilmesi ve oluşturduğumuz “availability group” un çalışması için “Domain Network Settings” i firewall dan tamamen kapatmıştık.Şimdi öncelikle onu tekrar geri açıyoruz.

**Firewall penceresindeysek hemen sol altta advanced security linkine tıklıyoruz ve “Inbound Rules” u tıklayıp “new rules” diyoruz.Gelen wizard da “Port” seçeneğini seçip next diyoruz,”Protocol and Ports” sekmesinde ;

1_port seçimi

TCP yi seçip 1433 numaralı port umuzu giriyoruz ve next diyoruz,”Action” sekmesinde “Allow the Connection” seçeneğini seçerek erişime izin verdirtiyoruz ve tekrar next,”Profile” sekmesinde “Domain-Private-Public” üçünü de tikleyip kimlerin bağlanmasını istediğimizi gösterip next diyoruz,”name” sekmesinde ise hangi isimle görünmesini istiyorsak onu yazıyoruz ben “MSSQLSERVER_Permission_1433” yazmıştım,son olarak “install” deyip portu açmış oluyoruz.

**Şimdi aynı işlemi önce 5022 numaralı port içinde yapalım ve aşağıdaki gibi bir çıktıyı görelim ;

6_izinler

KLON2 de bu ayarlamaları yaptık şimdi aynı işlemleri Klon3 içinde yapalım böylece hem IP üzerinden uzaktan Sql sunucumuza erişim izni vermiş olalım hem de failover cluster ın çalışmasını sağlayalım.5022 numaralı port Sql server da mirroring işlemleri için kullanılan port olduğu için bizim yapımızda da kullanıma açılması gerekiyordu.Port ları da açtıysak KLON2 de oluşturduğumuz failover cluster da “roles” den alwayson için açtığımız grup un çalışır halde olduğunu görüyoruz;

7_alw

12 -) Test İşlemleri

Fiziksel makine üzerinde visual studio ile hazırlanan küçük bir c sharp uygulama hazırladık onu açıyoruz ve App. Config. in içinde açtığımız “connection string” ayarlarında ;

100_sontest

data source’a KLON2 server ımızı gösteriyoruz,kullanıcımız “sa” şifresini de yazıyoruz ve uygulamamızı çalıştırıyoruz.Kayıt işlemini başarı ile gerçekleştirdik.

**Sanal makinelere gittiğimizde de ;

101_klon2  102_klon3

önce KLON2 de execute işlemini gerçekleştirdim daha sonra da KLON3 te,aralarında bi kaç sn fark vardı..AlwaysOn yapımızında sağlıklı bir şekilde çalıştığını görmüş olduk..

12-A) Listener Name ile Bağlanma Sorunu

Masaüstü uygulamamızın connectionString ine Klon2 ve Klon3 server’larımızın ismini girip sa şifresi ile bağlanmasını söylediğimizde iletişim kurabiliyorduk fakat bu alwaysOn işlemlerimiz için sağlıklı olamazdı çünkü Primary Database her değiştiğinde yani Primary Database in olduğu server ın her “down” olmasında Secondary Database in olduğu server ayakta olduğundan otomatik failover yapısı gereği Primary Database olacaktı.Bu da connectionString e girip sürekli server name i değiştirip KLON2 yada KLON3 yazmamız demek olacaktı.

Kısaca bu işlemlerinde otomatik olarak gerçekleşmesi için bir IP ve Port Numarası vererek Listener Name oluşturmuştuk (EASQLCLS_LSTNR).Listener Name cluster adminimizle oluşturduğumuz bir başka computer nesnesi olarak active directory de görülmekteydi.Dolayısıyla fiziksel makinemizdeki uygulama ile sanallardaki sql server lara ulaşabilmek için bu listener name in IP sini çözümletebiliyor olmamız gerekmekteydi.

Bu amaçla VMnet3 (Management) network adapteri ile bağladığımız DC-KLON2-KLON3 server’larımızı VMnet8(Nat) adapteri ile tekrar birbirlerine bağlıyoruz.Vmnet3 ile bağlarken verdiğimiz IP leri değiştirmiyoruz,o zaman verdiğimiz IP ler olduğu gibi kalıyor.

DC-KLON2-KLON3 e aynı zamanda bir NAT bağlantısı kurmuştuk internete çıkabilmeleri için.KLON2 ve KLON3 için bir yapılandırma yapmıyoruz.DC için ise ;

1_dc_net_ip

şeklinde dns server adress lerini veriyoruz.

10. adımda listener kısmında port olarak 1433 ü vermiştik portlarda karışıklığa sebep olması ihtimaline karşı port numarasını boş başka bir port ile değiştirip firewall dan iznini de ayarlıyoruz.Şuan için KLON3 primary database i barındırmakta ve management ethernet inde failover durumları için ip lerde görülmektedir,KLON2 de ise sadece domain e bağlı olduğu ip ler görülmektedir. ;

2_management         3_klon2_management

Şimdi uygulamamızda connectionString de server kısmına listener name imiz olan “EASQLCLS_LSTNR” ile bağlanarak daha sağlıklı bir yapıya kavuşturabiliriz sistemimizi.Öncelikle fiziksel makinemizden bağlantı sağlayabiliyor muyuz onu bir test ediyoruz;

4_bağlantı testi

Bağlantı sınaması başarılı oldu.Şimdi de oluşturduğumuz availability grupların role değişimlerini yönetmek için aşağıdaki scriptleri çalıştırıyoruz (o an için primary database olan server da).

—————————————————————————————————

ALTER AVAILABILITY GROUP [EASQLCLS_GROUPS]
MODIFY REPLICA ON
N’KLON3′ WITH
(SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY));
ALTER AVAILABILITY GROUP [EASQLCLS_GROUPS]
MODIFY REPLICA ON
N’KLON3′ WITH
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N’TCP://KLON3.erol.local:5022′));
go

ALTER AVAILABILITY GROUP [EASQLCLS_GROUPS]
MODIFY REPLICA ON
N’KLON2′ WITH
(SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY));
ALTER AVAILABILITY GROUP [EASQLCLS_GROUPS]
MODIFY REPLICA ON
N’KLON2′ WITH
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N’TCP://KLON2.erol.local:5022′));

—————————————————————————————————

ALTER AVAILABILITY GROUP [EASQLCLS_GROUPS]
MODIFY REPLICA ON
N’KLON2′ WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=(‘KLON3′,’KLON2′)));

ALTER AVAILABILITY GROUP [EASQLCLS_GROUPS]
MODIFY REPLICA ON
N’KLON3’ WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=(‘KLON2′,’KLON3’)));
GO

————————————————————————————————–

Şimdi de fiziksel makinedeki uygulamayı deneyelim ;

Not : KLON2 ve KLON3 ün “sa” şifrelerini aynı girilmiş olması gerekmektedir.

5_sontest_

Başarılı oldu sonunda,bu kısma kadar takip edenler için teşekkür ederim.

Son bir not daha 🙂 

Server lardan primary olanı failover cluster manager dan kapattığınızda sql server ı yeniledeğinizde “4060” kodlu hatayı alabilirsiniz,bunun için securty -> login den user mappings de alwaysOn a dahil ettiğiniz veritabanları için “NT AUTHORITY\SYSTEM” e  “db_owner” yetkisi verirseniz hatayı almazsınız ama “not sychronizing” olarak görünmeye devam eder,cluster manager dan tekrar start edin bu durumda..

Umarım faydalı bir çalışma olmuştur.Bir sonraki çalışmada görüşmek üzere..

/////////////////////////////////////////////////////////////////////////////////////////////////////

Column contains null data

Merhaba,

Aşağıdaki hata, veri tabanında integer veya datetime olarak işaretli olup null kalan datalara atılan select sonrası veya ilgili tablonun entity’sinden çekilmek istenen koleksiyon sonrası alınabilir.

Bu uyarı yukarıda da bahsettiğimiz gibi null olmaması gereken data tipi olan alanların null olmasından kaynaklıdır.

Çözüm olarak en temiz yöntem, veri tabanında bu tipte olan data varsa onların uygun verilerle, yani int ise 0, date ise ’01/01/2000′ gibi defaut verilerle güncellemektir.

Kod tarafında ise entity mizde ilgili kolonların data tipinden nullable olabileceğini belirtmemiz yeterlidir

Bu haliyle de db den alacağımız veriler sonrası uyarı vermeyecektir.

Azure App Service ile Azure Cloud’ta Dağıtım Merkezi Azure DevOps Olan DotNet Core Web Uygulaması Yayınlama

Merhaba,

Azure App Service ile dağıtım merkezi olarak Azure DevOps (tfs) u seçip, visual studio’nun yayınlama hizmetini kullanarak azure’da dotnet core web projemizi barındırma ile ilgili olacak yazımız. Ancak bunun öncesinde bazı gereksinimlerimiz var.

https://azure.microsoft.com/tr-tr/free/ sayfası üzerinden ücretsiz kullanmaya başlayabileceğiniz azure hesabınızı oluşturalım, Microsoft hesabınız yoksa yeni bir Microsoft hesabı oluşturalım. Bu Microsoft hesabınızı visual studio’da çalışırken de, TFS’da (Azure DevOps’ta) (https://dev.azure.com/useracount/ veya https://useracount.visualstudio.com/ ) hesap açarken de, azure portalına giriş yaparken de ( https://portal.azure.com/ )kullanacağız. Azure da 12 ay “ücretsiz deneme” aboneliğinizi aktif edebilirsiniz (sanal kart ile oluşturdum ben).

Visual studio 17 ide’sinde asp.net core 2.2 framework ünde web uygulaması geliştireceğiz. IDE üzerinden azure service’lerini de kullanabilmek için geliştirme araçlarımızı kontrol ediyoruz. Azure Web ve Cloud Services i kullanmak için visual studio installer’da azure geliştirme araçlarının yüklü olup olmadığını, yüklü değilse aracı seçip visual studio’yu güncelliyoruz.

0
1

File => New => Project => Web => Core Web App ile bir dotnet core projesi açıyoruz. İsim olarak herhangi bir şey verebilirsiniz. Framework dotnet core 2.2 olarak seçmiştik. Proje hazır olduğunda 2 no’lu görsele benzer bir sonuç alırsınız.

2
2

Proje üzerinde herhangi bir geliştirme yapmadan önce uygulamanın ilk çıktısını görmek için f5 ile (yada ctrl+f5 ile) çalıştırıyorum.

3
3

3 numaralı görselde uygulamamız çalışıyor görünüyor. Bu kısım cepte 😊

2.ci adımda azure portal üzerinde bu yayınlayacağımız projenin barındırılacağı bir app service tanımlayacağız. Sonra da Azure App Service’e projemizi nasıl dağıtacağımızı göreceğiz. App Service  planından ve dağıtılmış bir web uygulamasına sahip bir App Service uygulamasından oluşan bir kaynak grubu da tanımlayacağız.

Azure portalda uygulama hizmetlerine (AppService e) tıklayalım.

1
4

Aşağıdaki ekranın açılması için açılışta söylediğimiz gibi bir azure aboneliği başlatmalısınız.

4
5

Bu adımda “App Service Oluştur” butonu ile yeni bir servis oluşturalım. Açılan sayfada temel ayarlar sekmesinde abonelik türünü (12 aylık deneme sürümünden faydalanıyorum), “kaynak grubunu” ise yeni oluştur butonu ile bir isim vererek seçiyorum. Kaynak grubu web uygulamaları, veri tabanları ve depolama hesapları gibi Azure kaynaklarının dağıtıldığı ve yönetildiği bir mantıksal kapsayıcıdır. (Microsoft tanımı ile). Ayrıntılarda “Ad” kısmında verdiğim isim benim site adım olacak ben “teacherloper” yazıyorum, dolayısıyla siteme teacherloper.azurewebsites.net linki ile erişebiliyor olacağım. Çalışma yığınını buradan core 2.2 olarak seçiyorum bölgemi de kuzey Avrupa seçiyorum.

5
6

Tablardan “izleme” ye geçtiğimde ise application insights yani uygulama performans yönetim hizmetini isteyip istemediğimi soruyor burada “hayır” ı seçip devam ediyorum. Etiketler sekmesinde yapacağınız tanımlara göre kaynakları da kendi içinde gruplayabilmenizi sağlar, benim amacım henüz bu değil boş bırakıp geçiyorum. “Gözden geçir-oluştur” tab ında ise app service in son hali yer alıyor. Son kontrolü yapıp oluştur diyerek app service i oluşturuyoruz.

6
7

Oluşturduktan sonra yaklaşık bir 30 sn kadar işlemin tamamlanmasını bekliyoruz ve sonunda bize “tamamlandı” mesajını gösteriyor olacak.

7
8

App service planım ve kaynak gurubum statü olarak OK görünüyor. App Service’imizin ismi olan teacherloper’ın sayfasına gittiğimizde aşağıdaki görsele benzer bir sayfa sizi karşılayacaktır.

9
9

Linkimiz çalışıyor mu diye kontrol ediyoruz.

8
10

Sitemiz ayakta ve şu an Microsoft Azure’a ait bilgilendirici materyaller var.

9.cu görselimizdeki “Dağıtım Merkezi” butonu ile yazdığımız kodu azure a nasıl deploy edeceğiz onu kontrol edelim. Bağlanırken sizden Microsoft hesabınızı tekrar doğrulamanızı isteyebilir. Bu adımları geçtikten sonra sizi App Service in Dağıtım Merkezi sayfasına atar.

14
11

Bu sayfada dağıtımı hangi kaynaktan yapacağımızı seçeceğiz. Biz Azure Repos servisini seçeceğiz. Bu işlem ile localimizde yazdığımız kodu önceki adıyla TFS (team foundation server) yeni adıyla azure devops a göndereceğiz önce, sonra da yukarıdaki ekranda yer alan azure repos seçeneği ile devam ettiğimizde karşımıza çıkan seçeneklerden devops taki projemizi seçeceğiz.

Localdeki projenin azure devops a nasıl alınacağı ile ilgili daha önce yayınladığım yazının linkini bırakıyorum;

https://erolakgul.wordpress.com/2019/04/06/azure-devops-servisi-ile-projenin-paylasilmasi/

15
12

Bu adımda web uygulamamızı azure devops ortamına almış olduk.

Bu aşama için; “dağıtım merkezi” sayfamıza geri geliyoruz tekrar.

14
13

Sürekli Dağıtım Ağacı altındaki Azure Devops seçeneğini seçiyoruz ve en altta çıkacak olan Devam butonu ile bir sonraki ekrana geçiyoruz;

16
14

Bu ekranda bize derleme sağlayıcı olarak birini seçmemizi istiyor, Azure Pipelines’ı seçip devam ediyorum işleme;

17
15

Yapılandırma ekranımızda Azure devops kuruluşu yani sizin tfs teki hesabınızı seçiyorsunuz, gmail adresime kayıtlı olan hesabımı seçiyorum, proje kısmında yine yayına alacağımız olan projeyi seçiyoruz, depo kısmında hangi repo yu kullanacağımızı seçiyoruz, dal kısmında da branche mizi seçiyoruz. Derleme de framework olarak dotnet core u seçiyoruz. Devam diyoruz. Özet aşamasında

18
16

Bilgileri kontrol ettikten sonra “SON” butonu ile işlemi sonlandırıyoruz.

19
17

İşlemin başarıyla tamamlandığı bilgisini alıyoruz.

Projemize geri dönüyoruz ve sağ tık publish(yayınla) diyoruz. Açılan küçük ekranda ise sırasıyla önce AppService i sonra zaten bir app service oluşturduğumuz için select existing ( var olanı ) seçili yapıp sağ alttaki publish butonuna tıklıyoruz.

10
18

11
19

Açılan ekranda sağ üst köşede Microsoft hesabınızla bağlanmanızı isteyebilir yada doğrulama yapmanızı, o adımı atladıktan sonra Subscription altında azure da 12 aylık aboneliğinizi başlattıysanız seçebileceğiniz bir abonelik vardır. 2 nolu alanda azure portalda oluşturduğumuz kaynak grup adımız ve altında da app service adımız yer almaktadır. Onu seçersek alttaki OK butonu aktif olacaktır. OK butonuna tıklayıp devam ediyoruz.

12
20

1 nolu kısımda projemizin deploy edileceği profil olan teacherloper yer almakta. Site url’de yayın yapacağımız adres bulunmakta. Kaynak grup bilgimiz de hemen altında yer almakta fakat aşağıda output sekmesinde sonuçlarda csproj dosyamızda bir hata olduğu bilgisini görüyorum.

“the transformwebconfig task failed unexpectedly” hatasını alıyorum tekrar derlediğimde. Sorunu projem altındaki properties ağacı altında bulunan publishProfile klasöründeki xml dosyası içerisine

<IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>

satırını ekleyerek çözüyorum..web config de bir ayar yapmadık ve o ayarları şimdilik kullanmayacağız.

Çıktı tabında hatayı gidermiş olduk.

13
21

Linkimizi ziyaret ettiğimizde projemizin yayında olduğunu da görüyoruz.

25
22

Son olarak,uygulamamızda güncelleme yaparak bunu yayına alalım tekrar.

Index.cshtml dosyamda birkaç değişiklik yapıyorum. Visual Studio ekranımda Teams Explorer sekmesinde değişiklikleri göndermek için “Change” butonunu kullanıyorum. Yorumu yazıp “commit all and push” seçeneğini kullanıyorum. (23 nolu görsel)

20
23

Projeyi tfs e gönderdikten sonra son olarak sağ tık publish ile yayınlıyoruz.

21
24

Profilimizi hatırlayacağı için sadece publish diyoruz.

Web deployment task failed. ((25.11.2019 09:36:11) An error occurred when the request was processed on the remote computer.)

Hatası alıyorum. Stackoverflow da birkaç araştırmadan sonra Publish xml dosyamdan <WebPublishMethod>MSDeploy</WebPublishMethod> satırını silmem gerektiğini anlıyorum, tekrar deniyorum yayınlamayı. Bu hatanın nedeni olarak farklı seçenekler de sunmuşlar. Zannediyorum ki ben visual studio’dan bu yayını yaparken azure web site’a kullanıcı doğrulama istiyor, tamamen nedeni bulunca burada editlerim.

22
25

Azure portalında açtığımız app service’e tıkladığımızda dağıtım merkezinden yaptığımız tüm publish işlemlerini görebiliriz.

23
26

 

Not: 18 numaralı görselde Kudu Derleme Hizmetini görmüştük ama azure pipelines ı seçmiştik.Kudu, azure web sitelerine deploy edebilmek için kullanılan servistir.. https://teacherloper.scm.azurewebsites.net/ linki ile de kudu servisine bağlanabiliyorum, siz de testinizi yaparken appserviceadını.scm.azurewebsites.net linki ile kudu servisinize erişebilirsiniz.

24
27

https://github.com/projectkudu/kudu/wiki linkinden ayrıntılı bilgiye ulaşılabilir.

Kaynakça:

https://docs.microsoft.com/en-us/learn/modules/publish-azure-web-app-with-visual-studio/

https://docs.microsoft.com/en-us/azure/app-service/app-service-web-get-started-dotnet

https://erolakgul.wordpress.com/2019/04/06/azure-devops-servisi-ile-projenin-paylasilmasi/

Azure DevOps Servisi ile Projenin Paylaşılması

Merhaba,

10 Eylül 2018’den beri Azure DevOps olarak anılan ve öncesindeki ismi VSTS (Visual Studio Team Service) olan Microsoft’un sürüm yönetim sistemi ile ilgili küçük bir çalışma yapacağız. Çalışmamız Azure Repos yani web depolama servisinin kullanımı ile ilgili olacaktır.

Senaryomuzda VS2017 idesi ile dotnet 4.7.2 framework’ü üzerinde 4 işlem 1 seri hesaplayan bir console uygulaması oluşturacağız.

1

Senaryomuz içinde basit bir hesap makinesi yapacağız, 4 işlem (toplama-çıkarma-çarpma-bölme) yapacak bir kod yapısı içinde uygulamayı geliştiriyoruz bu aşamada projeyi devops ortamına alıyoruz, son olarak girilen değerler arasındaki fibonacci serisi hesaplatıp değişiklikleri göndereceğiz;

2

Local ortamımızda ki projenin devops ortamına alınabilmesi için git repolarından faydalanacağız. Öncelikli olarak şuradaki link ile windows için git i indirip kuruyoruz. Local’imizde kuracağımız bu git repo’su ile local deki projelerimiz anlık olarak uzaktaki bir kaynağa güncelleyip takım arkadaşlarımız ile senkron bir şekilde çalışabiliriz.

Azure DevOps’ta bir proje açıyoruz bu uygulamamızı takip edebilmek için;

6

xxx.visualstudio.com’da eğer bir adresiniz varsa dev.azure.com/xxx adresinden de erişebiliyorsunuz. Yoksa da yeni bir hesap ücretsiz olarak oluşturabilirsiniz. Create project dediğimizde foruma proje adı ve açıklamasını girerek yeni bir proje oluşturmuş oluyoruz.

Sonra da aşağıdaki görselde 1 nolu kısımdaki manage connection ı tıklayıp connect project diyoruz

7.png

2 nolu kısımda eğer bir microsoft hesabı ile bağlı değilseniz sizden hesap doğrulaması isteyecektir. 3 nolu kısımda ise visual studio daki projemizi devops’ta hangi proje altında takip edeceğimizi seçiyoruz. Uzak sunucudaki projeyi seçmiş olabiliriz ama localdeki path için bu path zaten kullanılıyor hatası alırız 🙂 Çünkü projeyi gönderiyorduk almıyorduk, silmeyeceğim bu görseli 🙂 . Yapmamız gereken visual studio ekranında file => add to source control yolunu izlemekti…

8.png

Burada sağ alt köşesinde local repo muzun fibonacci olduğunu branche imizin isminin de default olarak master olduğunu görüyoruz. Git Reposu projemizin bulunduğu klasör olarak seçilmiş oldu. Bu aşamada ise Home sekmesi altındaki Sync butonunu seçiyoruz;

9

ve karşımıza Git servisi ile local olarak kullandığımız klasörü uzaktaki sunucuya göndermek için Publish Git Repo butonunu kullanıyoruz. (Push to Remote Repository sekmesi altındaki) Eğer devops ta projeyi açmamış olsaydık önce push to azure devops altındaki butonu kullanıp önce projeyi açardık..

Publish Git Repo dediğimizde;

10

bizden 2 numaralı alanda hangi linkteki repoya bu proje aktarılacak diye soruyor, bu bilgiyi tfs’te yeni oluşturduğumuz projenin Repos sekmesinden alıyoruz;

11.PNG

buradaki url i alıp visual studio da ilgili alana kopyaladıktan sonra Publish diyoruz. Bu adımda sizden tekrar microsoft hesabınızı doğrulamanızı isteyebilir, hesabınızı seçip devam diyerek ilerliyoruz. Aktarım tamamlandığında ;

13

localimizdeki projeyi azure devops ortamına almış bulunuyoruz.

Uygulamanın paylaşıma gönderilmiş hali ile;

14.PNG

paylaşıldıktan sonra eklenen fibonacci serisini bulma fonksiyonlu halini de şöyle bırakayım;

15

Şimdi de yaptığımız değişikliği devops ile eşleştiriyoruz;

16

Fiş ikonu ile uzak bağlantıdaki hesabımıza ait projeler ile localimizde bulunan repo ların olduğu team explorer sekmesine geçeriz. Eğer bu uygulamaya ait projemize bağlı isek direkt 2 numaralı home butonuna tıklarız ve oradan da Changes butonu ile değişiklikleri görüyoruz.

17

Görselin 2 numaralı karesinde son gönderilene göre olan değişiklik içeren class ları gösterir. 3 numaralı karede gönderilecek değişikliklere ait bir not yazıyoruz.

4 numaradaki combobox’ta;

Commit All seçili iken değişiklikleri local repomuzda kaydetmiş oluruz ama uzak repoya göndermiş olmayız.O yüzden commit all sonrası değişiklikleri göndermek için Push işlemini yapmamız gerekiyor.

Commit All and Push seçili ise hem değişiklikleri localimizde kaydetmiş hem de uzak ortamımızdaki repoya bu değişiklikleri göndermiş oluruz.

Commit All and Sync seçili ise hem değişiklikleri kaydetmiş, hem uzak sunucudan değişiklik varsa onları almış son olarak localimizde olan değişikliği uzak ortama göndermiş oluruz. Conflict (çakışma) varsa bu seçenek seçili iken karşımıza çıkar zaten. Eğer projede tek başımıza çalışıyor isek pull yani uzaktan herhangi bir değişiklik çekmemize ve tabii olarak 3.seçeneği seçmemize gerek yok.

18.PNG

Commit All seçeneği sonrası bize değişiklikleri kaydettiğini senkronize edebileceğimizi söyleyen bir uyarı sunar. 1 numaralı kısımda synchronization ı seçip gidecek olan değişiklikleri (2 numarada) Push diyerek devops ortamına alırız.

20

 

Şimdi de başka bir bilgisayarda (kişisel) devops servisindeki bu projeyi içeri alacağız.

Visual studio’yu açtıktan sonra team explorer (sağ alt) sekmesini açıyoruz. Ekranda manage connection ı açıp connect to a project i seçiyoruz.

22

Burada yine devops hesabımızı doğrulayıp (1) servisimiz altındaki hangi projeye bağlanacağımızı seçiyoruz, default gelen path bizim visual studio projelerimizin bulunduğu klasör\devops proje ismi olacaktır.İsim değiştirilebilir. 4 nolu imgede de Clone u seçerek devops’taki projeyi localimize alıyoruz.

23

Yıkım bittikten sonra bize indirdiği tüm klasörleri solution explorer da gösterir. Biz projeyi kendi bilgisayarımızda çalıştırmak için “Click on Solution and Folder above to view a list of Solutions” uyarısına tıklıyoruz.

Tüm bu hareketle başka bir makinadaki projeyi devops servisi ile kendi ortamımızda çalıştırabilir ya da takım çalışması şeklinde paylaşabiliriz (ücretsizi 5 kişilik).

sağlıcakla..

 

 

Onion Architecture

Merhaba arkadaşlar, bu yazımızda çok katlı mimaride kullanılan Onion Architecture yani Soğan Mimarisi ile ilgili demo yapacağız.

Öncelikle güzel ama ingilizce olan şu kaynağı baştan paylaşayım. Laf söz olmasın sonra 🙂 Ben de bu işin öncülerinden olmadığım için önce okumuş olurum daha sonra o makalelere uygun örnekler yaparım. Yoksa bir Bora Kaşmer bir Kadir Murat Başeren olmayı biz de isteriz 🙂

Konumuza gelecek olursak, yukarıda paylaştığım linkten de görüleceği üzere (Data-Repository-Service-UI olmak üzere) 4 katmanlı bir yapımız var. Daha fazla katmanlı bir yapınız olacaksa bile (birden fazla havuzunuz (repository) yada data katmanınız varsa)  işleyişi itibari ile yine 4 katmanlı bir yapı sunar. Siz UI’dan servis katmanına bir istekte bulunursunuz, servis katmanı gelen bu istek sizin işlemleri yaptırdığınız havuza düşer, o havuz data katmanına erişir ve size sonucu aynı yoldan geri döner ve bunu kullanırsınız. Dolayısıyla UI katmanı tek bir yerden aldığı örnekle uygulama içerisindeki diğer fonksiyonları yönetebilir.

4

Mimari yapı, uygulama çalışma şekli ile UI => Service => Repository => Data olarak erişimini sağlasa da, UI katmanı referans olarak Repo ve Data katmanlarını da görecektir.

cats.jpg

Örnek olarak ele alacağımız uygulamanın, şekil olarak görüntüsü yukarıdaki gibi olacaktır. Öncesinde paylaşmanın daha uygun olacağını düşündüm. Yoksa elimde yapılmışı var deyip bırakmayacağım 🙂

Uygulama örneği ile ilgili şu şekildeki bilgileri de versem iyi olabilir;

  • Uygulama .net 4.5.2 framework’ünde geliştirildi
  • Class Library’ler .net framework alt yapısında (core yada standart seçmiyoruz)
  • UI olarak bir console uygulaması açıldı
  • EntityFramework 6.0 versiyon orm kullanıldı
  • vs2017 ide’sinde proje oluşturuldu
  • son olarakta entity framework ün bize sunduğu 3 yaklaşımdan (model first,db first,code first) code first ü tercih ediyoruz.

Örnekte hangi katmanda ne yapacağımızdan bahsedecek olursak;

1-Data Katmanı

  • varlık(entity) dediğimiz sınıflarımıza ait field’lar (tablo =>kolon isimleri).
  • Veritabanında oluşturulacak olan varlıklara ait property’ler in olduğu Context sınıfımız(tablolar)
  • Ana işlemlerde ortak bir yapıda dönüş yapılması için kullanacağımız Mesaj sınıfı

Mesaj class ı hariç diğerleri ile package manager console’da enable-migrations ve update-database diyerek veritabanında tabloların oluşmasını sağlayacağız. Mapping işlemi ile buna da gerek kalmaz fakat o başka bir masanın konusu olsun 🙂 Sınıfların içerikleri;

BaseModel sınıfı;

       [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid ID { get; set; }
        public bool IsActive { get; set; }

 

Category sınıfı;

        
      public Categories()
        {
            this.Products = new HashSet();
        }

        public string Name { get; set; }
        public string Desc { get; set; }

        public virtual ICollection<Products> Products { get; set; }

 

Product sınıfı;

        
        public string Name { get; set; }
        public double Quantity { get; set; }
        
        public Guid CategoryID { get; set; }
        [ForeignKey("CategoryID")]
        public virtual Categories Category { get; set; }

 

Mesaj sınıfı;

        
        public Guid ResultID { get; set; }
        public string Message { get; set; }

        public bool IsSuccess
        {
            get
            {
                if (ResultID != Guid.Empty)
                {
                    return true;
                }
                return false;
            }
        }

 

Context sınıfı;

        
    public OnionArchContext()
        {
            //home connection
            Database.Connection.ConnectionString 
   = "Server=EROLAKGUL\\BESIKTAS;Database=OnionArch;uid=sa;pwd=istanbul;";
        }

        public DbSet<Categories> Category { get; set; }
        public DbSet<Products> Product { get; set; }


        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }

 

2-Repository Katmanı

Bu katmanda, generic tipte bir varlık alacak olan soyut sınıf kullanacağız. Bu sınıfta tanımlanan abstract metotları,bu sınıfı derive eden class larda ortak olarak kullanmak için bunu yapıyoruz. Bu kısım, interface kullanılarak da yönetilebilirdi fakat aynı kodları, interface ten kalıtılmış bir sınıfa yazıp yönetmek istemedim. abstract’ta iyidir onu sevelim. Bu sınıfta yapıcı metot içerisinde data katmanına erişebilmek için context sınıfından bir nesne türetilecektir aynı zamanda. Context içindeki varlıkları temsil eden dbset class ı da abstract sınıfına gönderilecek olan entity ile set edilecek. Yani category gönderilecekse category, product gönderilecekse product gibi davranacak.

DataAccess olarak kullanacağımız bir de repository class larımız var. Burada her bir tablomuz için bir sınıf oluşturup, abstract metottan kalıtım alacağız.

Abstract Class;

    public abstract class ServiceBase<TEntity> where TEntity : BaseModel
    {
        protected OnionArchContext context;
        protected DbSet dbset;
        protected Messages result;

        public ServiceBase()
        {
            context = new OnionArchContext();
            result = new Messages();
            dbset = context.Set(<TEntity>);
        }
        
        public abstract Messages Insert(TEntity dto);

        public abstract Messages Update(TEntity dto);

        public TEntity FindByID(Guid ID)
        {
            return dbset.Where(x => x.ID == ID && x.IsActive).FirstOrDefault();
        }
    }

 

Repository class;

 
public class CategoryRepository : ServiceBase<Categories>
    {
        public override Messages Insert(Categories dto)
        {
            result.ResultID = Guid.Empty;

            if (context.Category.Any(x => x.IsActive && x.Name == dto.Name))
            {
                result.Message = "Benzer Kayıt Var..";
                return result;
            }

            bool isExist = (dto == null) ? false : true;

            if (isExist)
            {
                dto.IsActive = true;
                try
                {
                    dbset.Add(dto);
                    context.SaveChanges();
                    result.ResultID = dto.ID;
                    result.Message = "Kaydedildi..";
                    return result;
                }
                catch (Exception ex)
                {
                    result.Message = ex.Message;
                }
            }
            return result;
        }

        public override Messages Update(Categories dto)
        {
            result.ResultID = Guid.Empty;

            if (dbset.Any(x => x.ID == dto.ID))
            {
                Categories c = FindByID(dto.ID);
                c.IsActive = dto.IsActive;
                c.Name = (String.IsNullOrEmpty(dto.Name)) ? c.Name : dto.Name;
                c.Desc = (String.IsNullOrEmpty(dto.Desc)) ? c.Desc : dto.Desc;

                try
                {
                    result.Message = "Başarıyla güncellendi..";
                    context.SaveChanges();
                    result.ResultID = dto.ID;
                }
                catch (Exception ex)
                {
                    result.Message = ex.Message;
                }
                return result;
            }
            result.Message = "Böyle bir kayıt bulunamadı..";
            return result;
        }
    }

 

3-Service Katmanı

Bu katman bir router görevi görür. UI’dan gelen isteğe göre repository katmanındaki classlara erişim sağlar.

ServicePoint sınıfı;

        
private CategoryRepository categoryRepository;
        private ProductRepository productRepository;

        public CategoryRepository CategoryRepository { get { return categoryRepository ?? new CategoryRepository(); } }
        public ProductRepository ProductRepository { get { return productRepository ?? new ProductRepository(); } }

 

4- UI Katmanı

Bu katman yapılacak olan işleri diğer katmana bildirir.

Console uygulaması main metot =>

            ServicePoints points = new ServicePoints();
            try
            {
                Categories cm = new Categories
                {
                    Desc = "Ev Tekstili",
                    Name = "Tekstil",
                    IsActive = true
                };

                Messages m = points.CategoryRepository.Insert(cm);
                Console.WriteLine(m.ResultID + " Nolu Kayıt:" + m.Message);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Hata :" + ex.Message);
            }
            Console.ReadLine();

 

ServicePoints sınıfından aldığımız nesne ile category sınıfına ait repository e erişiyoruz,repository’de data içindeki context sınıfına erişerek select,insert,update,delete işlemlerini gerçekleştiriyor.

Anlatacaklarımız bu kadar.. Onion Architecture yapısını küçük bir örnek ile göstermek istedim. Çok kod yazıyormuş gibi olabilir ama yönetimsel anlamda hem sizin için hem de sizden sonra gelecekler için anlaşılması … tamam tamam babaannelik yapmayacağım, düzgün yazın ulen kodları 🙂

Daha detaylı bilgi için şu makaleyi de bırakıyorum.

İyi çalışmalar..

SAP B1 – Dillere Göre Tanımların Tek Satırda Verilerini Alma

Merhaba,

SAP B1’da default olarak (örneğin kalem ana verileri ekranında OITM tablosunda) türkçe tanımları kullanırız, orjinal alanların yada udf (user defined field)’ lerin ingilizce yada diğer dillerdeki tanımları ise biraz farklı olarak tutulmakta. Bunun için OMLT ve MLT1 tabloları kullanılmakta. Bu tablo yapılarına göre veriler dil kodu ve kolon ismi ne ise ona göre tutulmaktadır. Yani;

ItemName  LangCode Trans
  elma      8      apple
  elma      23     manzanas

Burada 8 ingilizce, 23 te ispanyolca için çevirili dil kodudur.

Bir malzeme kodunun tüm alanlarına ait dil tanımlarını çekmek istediğinizde ise bu verilere direkt olarak ulaşamıyorsunuz. OITM OMLT ve MLT1 tablolarına inner join atarak yazacağınız query size alan sayısı kadar satır olarak geri dönecektir. 50 kolonunuz varsa 50 satır veri olarak geri dönecektir. Fakat buradan alacağınız veriyi başka bir tabloyu güncelleme ve çıktı için kullanmaya çalıştığınızda size bir çok if le birlikte bunları yazmanıza neden olacaktır.

Bu kolonların isimleri ve o dile ait tanımlarını içeren tek satırlık bir sonuca erişmeniz sizin işinizi daha kolaylaştıracaktır. Bunun için sql de transpoze işlemini pivot clause ile yapabiliriz.

SELECT U_A, U_B,U_C,U_D

         FROM

(

  SELECT CAST(M.Trans as NVARCHAR(200)) AS Trans,O.FieldAlias FROM OMLT O
 
          INNER JOIN MLT1 M ON (O.TranEntry = M.TranEntry)

          WHERE  O.PK = '980130001' AND M.LangCode = 8 AND O.FieldAlias IN

 ('U_A','U_B','U_C','U_D')

) HAUS

PIVOT
(

  MAX(Trans)

  FOR FieldAlias in (U_A, U_B,U_C,U_D)

	  )
) PIV_HAUS;

MLT1 tablosundaki Trans kolonu NTEXT tanımlıdır. Bu yüzden onu NVARCHAR data tipine çevirmemiz gerekmektedir. Onun dışında U_A … U_D kolon isimlerinin karşılıklarını verdiğinizde o malzeme kodu için o dildeki tanımları tek satırda almış olursunuz ve daha sonra da bu kolonların karşılıkları olan uygun yerlere atamalarını yapabilirsiniz.

**Dikkat etmeniz gereken bir nokta, U_A … U_D yazan kısımlarda isimlendirmeler aynı olmalı. Kolon ismi U_FFF ise ilk satırdaki SELECT  in karşısında ve FOR dan sonraki sorgulanan alanlar içinde de U_FFF  yazmalı.

sql-server.png

Çıktı Tasarımını Test’ten Prod Ortamına Taşıma -Crystal Reports For SAP B1

Merhaba,

Test ortamına bağlı bir şekilde geliştirilen crystal report çıktısının prod ortamına alınmasından önce, her iki ortamdaki tabloların kolonlarının karşılıkları olmasına dikkat ettikten sonra yapılacak olan şey çok basittir. Test ortamındaki çıktının Prod’ta da içeri alındığını varsayarsak;

  • SAP B1’da rapor ve düzen yöneticisine girilir. Burada geliştirdiğimiz çıktı (örneğin satış ekranında kalemlere ait bir çıktı)  satırına kadar gelip sağ kısımda Düzenler sekmesinde listelenen çıktı adımızı bulup, onu seçip Gelişmiş e tıklamak ve de açılan pencerede sunucu ile veritabanı nı diğer ortamın db si olarak belirlemek vardır.


çıktı.PNG

Crystal Reports – Giriş- 3 (SAP)

Merhaba,

Çıktı tasarımını basit bir şekilde ayarladık ve şimdi sıra geldi SAP arayüzünde kullanılabilir hale getirilmesine.

İlk olarak SAP de;

1.PNG 
                                                                        1

Düzen Tasarımcısı kalemine tıklamamız veya;

2.PNG   
                                                                      2

arama kutusuna rapor yazıp “Rapor veya Düzen Yöneticisi” başlığına tıklamamız gerekiyor.

Bu aşamada karşımıza şöyle bir pencere çıkıyor;

3.PNG 
                                                                        3

bu ekranda “İçe Aktar” butonu ile içe aktarım sihirbazını çalıştırıyoruz;

4.PNG 
                                                                          4

“İleri” diyerek devam ediyoruz;

5.PNG 
                                                                         5

bu adımda “Gözat” ile local’den çıktıyı tasarladığımız klasöre gidiyoruz ve rpt uzantılı dosyamızı seçiyoruz, seçtikten sonra İçerik Türü kısmında “Düzen” seçili olursa çıktı, “Rapor” seçili olursa da rapor seçildiği belirtilir, sonraki adımda 3 noktalı butona tıklayıp raporun hangi belge türünde olacağını belirtiyoruz, biz bu çıktıyı satış teklifine örnek demo olsun diye tasarlamıştık;

6.PNG

6

onu seçiyoruz o yüzden biz de, devam ediyoruz ;

7.PNG 
                                                                    7

son olarak “Sonlandır” butonu ile işlemi tamamlıyoruz buradaki..

8.PNG 
                                                                         8

Teklif belgemiz açık iken, sol üst Dosya => Önizleme Düzenleri diyoruz;

9.PNG 
                                                                              9

Bu aşamada daha önce hazırlanmış Düzen (Çıktı) seçenekleri karşımıza çıkar. Burada salt01 diye bir isimlendirme yapmıştım, onu seçiyorum ve tamam diyerek ekrana çıktıyı yansıtıyorum;

10.PNG 
                                                                       10

Bu konudaki basit anlamda anlatılacaklar bunlardı, serinin sonuna gelmiş bulunuyoruz 🙂

Crystal Reports – Giriş- 2 (SAP)

Merhaba,

Yazımızın 2.kısmında, ilk kısımda gösterdiğimiz çıktının geri kalan bileşenlerini, tablo oluşturma , basit birer fonksiyon yazma gibi şeylerle ilgileneceğiz.

İlk kısmın sonunda DocKey parametresi ile statik bir değer verip, ona ilişkin kaydı çekiyorduk.

Şimdi öncelikle bu seçilen id’nin nasıl değiştirileceğini görelim;

2.PNG 
                                                                            1

Sarı renkli kısıma çift tıklayarak textbox’ın aktif olması sağlanır,sonra da kırmızı ok la gösterilen yeşil tick işaretine tıklanarak rapor un veriyi çekeceği belgenin id si değiştirilmiş olur.

Şimdiii, sayfa üst bilgisi kısmını ve ayrıntılar kısmını 3 parçaya bölerek bir kaç metin içeriği ve parametre atıyorum;

3 
                                                                               2

Sayfa üst bilgisi b kısmı ile c kısmında yazılacak olanlar tekrar etmeyecek olan verilerdir, tekrar hatırlatalım. Dolayısıyla “Ayrıntılar” bölmesine ait verileri tbody içerisinde yer alan veriler olarak, hemen üstünde yer alan “sayfa üst bilgisi c” kısmının da thead içeriği olarak düşünebiliriz.

Çıktı üzerinde kalemlere ait bazı verileri ekrana yansıtmak istiyoruz. Örneğin kalem sıra no, ürün açıklaması , miktar, birim , fiyat indirimli fiyat normal fiyat gibi..

Bunun için, hesaplamaya gerek duyulmayan ve veri tabanından direkt olarak gelecek veriler için;

4.PNG 
                                                                     3

“Alan Gezgini”nden db altındaki ağaçları kullanarak kolon seçilir ve rapor ekranı üzerine bırakılır. Bırakıldığında hemen üst satırına da aynı isimle başlık metini açar, bu kısımda başlık metnine çift tıklayarak ismi değiştirebilirsiniz.

Peki bir takım hesaplamalar gerektiren tablo verileri için ne yapmamız gerekiyor ?

Örneğin “İndirim” başlıklı kolonda belirttiğimiz @DiscountCalc parametresi için;

5.PNG 
                                                                            4

Alan Gezgini sayfasında, Formül Alanlarına sağ tıklayıp önce yeni diyoruz ve fonksiyona bir isim veriyoruz. Sonrasında ise ;

6.PNG 
                                                                             5

Formül Atölyesi penceresi açılıyor, kırmızı çerçeve ile gösterdiğim alana kodu formülü yazıp bırakıyoruz, bu kısımda ki sonuç direkt olarak kolonumuza yansıyacak. Burada toplam fiyat – indirilmiş fiyat işlemi ile indirim tutarını hesaplatıyoruz.

Ürün açıklamasını yazdırdığımız satırda da değişken kullanmıştık. Bu değişkene ürünün numarası ve açıklamasını ;

9.PNG 
                                                                           6

ItemDesc parametre adıyla 6.görseldeki gibi kod ve içeriği ekleyerek yansıtmıştık.

Bu açıklama metni tek satırı geçerse metin kutusu uzunluğunca yazı çıkacak, geri kalanı görünmeyecektir. Bunu önlemek içinse;

1-a 
                                                                             7

Metinsel alana sağ tık, alanı biçimlendir diyoruz ve;

1-b
                                                                       8

Gelen pencerede ORTAK sekmesi altındaki “Büyütülebilir” alanını tickliyip kaydediyoruz. Böylece uzunluk yetmediğinde ürün açıklaması alt satıra geçmeden kutusunun yüksekliğini otomatik olarak arttıracaktır.

Alan Gezgini sayfasına da bakacak olursak;

7

9

Formül Alanları nın dışında, Parametre Alanları , Değişen Toplam Alanları ve Özel Alanlar gibi başka sekmeler de var.

Parametre alanında dışarıdan gelecek olan parametreleri (statik veya dinamik) değer vererek kullandığımız kısım.

Değişen Toplam Alanları’nda ise, tablonun kolonları ile ilgili sürekli bir toplam işlemi yaparak değer tutacak olan parametreleri belirleriz;

8 
                                                                    10

Örneğin 7 numaralı görselde, sayaç parametresi için, itemcode ları saydırmışız..

Özel alanlarda ise; daha önceden belirlenmiş fonksiyonlar var, sayfa numarasının otomatik yansıması için Sayfa Numarası isimli fonksiyonu olması gibi. Değiştirilme saati, kayıt numarası gibi başka fonksiyonlarda mevcuttur.

Bu son değişikliklerle çıktımız şu şekilde olur;

2222.png

11

Crystal Reports – Giriş (SAP)

Merhaba,

Giriş aşamasında, sayfa nasıl açılır, label’lar ve textbox’lar nasıl eklenir gibi basit işlemlerin nasıl yapılacağını göstereceğiz.

0</>                                                                         1

Uygulama açıldıktan sonra Dosya > Yeni > Standart Rapor adımı ile (daha önce bir şablonumuz olmadığını varsayarak) boş bir template açmış oluruz.

1
                                                                            2

Açılan ilk sayfada sadece tasarım sekmesi (sol üstte) görülmektedir. Onun dışında bir rapor ekranında hangi bölümler olduğuna dair kısımlar mevcuttur. Bunlar ;

  • Rapor Üst Bilgisi : Standart bir raporda en üstte olması gereken komponentleri belirleyeceğimiz alanı bize verir. Tekrar etmez
  • Sayfa Üst Bilgisi : Her sayfanın en üst kısmında tekrar edecek olan bölümdür.
  • Ayrıntılar : kodlama olarak, koleksiyon ile içinde dönüp, yazdırdığımız alan burası olacak.
  • Rapor Alt Bilgisi : Standart bir raporda en altta olması gereken komponentleri belirleyeceğimiz alanı bize verir. Tekrar etmez. Footer gibi..
  • Sayfa Alt Bilgisi : Raporumuzda sayfa sonuna ekleyeceğiniz alanları belirlediğimiz kısım burasıdır. Sayfa sayıları vs burada belirtilebilir. Tekrar eder.


2.PNG
                                                                                3

Ekrana nesne ekleme işi Üst Nav Bar’daki Ekle butonu ile gerçekleştirilir. Ekle Menüsü altında metin çizgisi, alt çizgi , kutu , resim veya flash yönlendirmesi ile o nesneleri ekleyebiliriz. Bir kaç label ve görsel eklemeden önce veri tabanı bağlantısı ile hangi tabloları kullanacağımızı belirtelim ;

3.png 
                                                                     4

4 numaralı görselde 1 ile gösterilen kısım ile veri tabanına erişim bilgileri istenir, burada otantike olduktan sonra karşımıza gelen ekran 2 numaralı pencerenin olduğu kısımdır. Sekmeler yardımıyla tabloların olduğu ağaç açılır ve tabloların seçimi yapılır.

4.png 
                                                                      5

Görselde ki gibi Seçili  Tablolar sekmesinde tablolarımız listelenir seçimlerimiz sonrası..

5.png 
                                                                    6

Bağlantılar sekmesi ile tablolar arasındaki ilişkinin nasıl olacağına dair ilişkilendirmeleri düzenleyebiliyoruz..

6.png 
                                                                             7

Label , görsel , kutu ve çizgi çekmeyi menü yardımıyla halletmiştik. Şimdi de label ların karşısına gelecek olan verilerin hangi kolonlardan geleceği ile ilgili bilgide. 7 numaralı görselde ALAN GEZGİNİ info su ile gördüğümüz buton aracılığıyla sağ bölümde sekme açılır. Bu kısımda veritabanı -> tablo -> kolon ağaçlarını patlatarak erişmek istediğimiz kolonu alıp sayfaya sürüklüyoruz.

7.png 
                                                                     8

Statik olarak çalıştığımız için, önizleme de değer görebilmek için şunları yapıyoruz ;

8.png
                                                                      9

Bir üstteki görselde 1 numara ile gösterdiğimiz kısımda “parametre alanı” başlığına sağ tıklayıp “yeni” diyoruz. Açılan parametre düzenle sayfasında ise ad kısmına DocKey kolon ismini giriyoruz, Tipi ni sayı olarak belirtip , kaydet diyip çıkıyoruz.

9.png
                                                                       10

Son olarakta, dockey parametresine sağ tıklayıp formul ekle ile Formül Düzenleyici ekranına geçiyoruz. Bu kısımda Seçim Formülleri klasörü altında Kayıt Seçimi başlığına hangi tablonun kolonunun bizim vereceğimiz parametreye eşit olduğu ile ilgili kodu yazıyoruz.

Kaydettikten sonra ÖNİZLEME tabı ile geçiş yaparken karşımıza bir uyarı penceresi gelir ve bizden bir sayı girmemizi ister, bu parametre DocKey ile göndereceğimiz parametre olacaktır.

Biz 5 numaralı satış teklifinin verileri gelsin istemiştik, raporumuzun son hali aşağıdaki gibi olmuştur;

10   
                                                                               11

 

ORACLE – ROW_NUMBER() ile Loop Kullanımı

Merhaba,

Row_Number() analitik fonksiyonu ile select cümleciğimiz içinde order by kullanarak istediğimiz sıradaki satırları başından itibaren 1..2..3 diye numaralandırabiliriz.

OVER (PARTITION BY …) ile neye göre gruplayacağımızı belirterek GROUP BY kullanmadan neye göre sıralama yaptıracağımızı belirtebiliriz.

    SELECT 
         ROW_NUMBER() OVER (PARTITION BY MATERIAL ORDER BY CREATEDAT) AS BB,
            MATERIAL,MATGRP,CREATEDBY,CREATEDAT,CHANGEDAT 
             FROM tablename V WHERE COMPANY = '01' 
                       AND ISDELETE = 0 
                       AND MATERIAL IN (
                            SELECT MATERIAL FROM tablename WHERE COMPANY = '01' 
                                        AND ISDELETE = 0 
                                        GROUP BY MATERIAL
                                        HAVING COUNT(MATERIAL) > 1
                           )
                       ORDER BY V.MATERIAL
              )

materyal kolonuna göre gruplayıp numaralandırma işlemini BB kolonu ile yapmış oluruz böylelikle, sıralamayı da oluşturma zamanına göre ayarlarız..

xxxxx

Bu durumda sonuç ekranında, yukarıdaki gibi oluşturulma zamanlarına göre sıralanmış ve materyallere göre gruplanmış halde satır id si verilmiş datalara ulaşırız..

Bu aşamadan sonra datayı oracle’da koleksiyon halinde alıp (sql server’da ;WITH ile CTE oluşturmak gibi) veri kümesi içinde dönerek row id ye göre işlemimizi yaptırabiliriz.

BEGIN

FOR COLLECTION IN (
             
    SELECT 
         ROW_NUMBER() OVER (PARTITION BY MATERIAL ORDER BY CREATEDAT) AS BB,
            MATERIAL,MATGRP,CREATEDBY,CREATEDAT,CHANGEDAT 
             FROM tablename V WHERE COMPANY = '01' 
                       AND ISDELETE = 0 
                       AND MATERIAL IN (
                            SELECT MATERIAL FROM tablename WHERE COMPANY = '01' 
                                        AND ISDELETE = 0 
                                        GROUP BY MATERIAL
                                        HAVING COUNT(MATERIAL) > 1
                           )
                       ORDER BY V.MATERIAL
              )
    LOOP

    IF COLLECTION.BB = 1 THEN

       UPDATE tablename 
          SET CREATEDBY = COLLECTION.CREATEDBY,
              CREATEDAT = COLLECTION.CREATEDAT
            WHERE MATERIAL = COLLECTION.MATERIAL AND ISDELETE = 0;
        
    END IF;

    END LOOP;

END;

 

Örnek olarak kodda rowid’si 1 olanlar için bir güncelleme işlemi yaptırıyoruz..