3 Ağustos 2021 Salı

SQL Update Sorgusunda String Replace Komutunu Kullanmak:



update dbo.tableName 

SET FieldName = REPLACE(CAST(FieldName as nVarchar(4000)), '000', '')

WHERE RID>784  

29 Kasım 2020 Pazar

 


C# ile SqlClient.SqlBulkCopy Kullanımı:


      C# kodları ile yapılan uygulamalarda yüzbinlerce satırlık verinin bir döngü içerisinde Sql Server'daki veritabanına aktarmak başka bir değişle insert etmek oldukça zaman alıcı ve donanım tüketici olmaktadır.

Bu tür durumlarda SqlClient sınıfının SqlBulkCopy özelliğini kullanmak en ideal yöntem olacaktır. Bu yöntemi kullanabilmek için insert işleminin gerçekleşmesi gerektiği hedef tablo ile birebir kaynak tablonun oluşturulması gerekmektedir. Hedef tablo verilerin kalıcı olarak kaydedileceği fiziksel tablo olduğunu düşünürsek kaynak tablo ise onunla birebir aynı olması gereken ve ön bellekte oluşturmamız gereken geçici tablo olacaktır.


- Verilerin aktarılacağı veritabanındaki fiziksel tablo olan hedef tablonun sütun sayısı, sütun adları ve sütun veri tipleri ile birebir olan kaynak tablo aşağıdaki gibi create edilir.  

 public class Kaynak_TABLE

{

        [Key]

        public int ID { get; set; }

        public string job_code { get; set; }

        public string recipe_code { get; set; }

        public string recipe_name { get; set; }

        public double flotte { get; set; }

        public string mach_name { get; set; }

        public string tank_name { get; set; }

        public DateTime start_time { get; set; }

        public DateTime end_time { get; set; }

        public int CONNECTLY { get; set; }

 // Insert olayı için önbellekte oluşturulması gereken veri kaynağı DataSet'in interface'i aşağıdaki gibidir.  

      public void InsertMassiveData(IEnumerable<Kaynak_TABLE> Kaynak_List)

        {

            var table = new DataTable();

            table.Columns.Add("ID", typeof(int));

            table.Columns.Add("job_code", typeof(string));

            table.Columns.Add("recipe_code", typeof(string));

            table.Columns.Add("recipe_name", typeof(string));

            table.Columns.Add("flotte", typeof(float));

            table.Columns.Add("mach_name", typeof(string));

            table.Columns.Add("tank_name", typeof(string));

            table.Columns.Add("start_time", typeof(DateTime));

            table.Columns.Add("end_time", typeof(DateTime));

            table.Columns.Add("CONNECTLY", typeof(int));


            foreach (var itemDetail in Consumptions_List)

            {

                table.Rows.Add(new object[]

                {

                    itemDetail.ID,

                    itemDetail.job_code,

                    itemDetail.recipe_code,

                    itemDetail.recipe_name,

                    itemDetail.flotte,

                    itemDetail.mach_name,

                    itemDetail.tank_name,

                    itemDetail.start_time,

                    itemDetail.CONNECTLY

                });

            }


            //Insert to db..

            using (var MSConn = FnSQL.SqlConnectionNew)

            {// Sql bağlantının tanımlı olduğu fonksiyonun kullanımı ..

                using (SqlTransaction transaction = MSConn.BeginTransaction())

                {// Sql Transaction kullanımı..

                    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(MSConn, SqlBulkCopyOptions.Default, transaction))

                    {//SqlBulkCopy sınıfının kullanımı..

                        try

                        {//DestinationTableName veritabanında tanımlı olan fiziksel tablonun adıdır.

                            bulkCopy.DestinationTableName = "Hedef_Table";

                            bulkCopy.WriteToServer(table);

                            transaction.Commit();

                        }

                        catch (Exception ex)

                        {

                            transaction.Rollback();

                            MSConn.Close();

                        }

                    }

                }

            }

        } 

}


Yukarıda oluşturmuş olduğumuz Yapının Kullanımı Aşağıdaki Gibidir:


 while (xReaderKaynak_Table.Read())

 {

       xKaynak_Table = new  Kaynak_Table();

      xKaynak_Table.ID = kayit;

      xKaynak_Table.job_code = FnString.IsNull(xReaderKaynak_Table["jobcode"]);

      xKaynak_Table.recipe_code = FnString.IsNull(xReaderKaynak_Table["recipe_code"]);

      xKaynak_Table.recipe_name = FnString.IsNull(xReaderKaynak_Table["recipe_name"]);

     xKaynak_Table.flotte = Convert.ToDouble(xReaderKaynak_Table["flotte"]);

     xKaynak_Table.mach_name = FnString.IsNull(xReaderKaynak_Table["mach_name"]);

     xKaynak_Table.tank_name = FnString.IsNull(xReaderKaynak_Table["tankname"]);

     xKaynak_Table.start_time = FnDate.IsNull(xReaderKaynak_Table["start_time"]);

     if (xKaynak_Table.start_time == DateTime.MinValue)

    {

        xKaynak_Table.start_time = FnDate.IsNull(xReaderKaynak_Table["start_time"]);

    }

   xKaynak_Table.end_time = FnDate.IsNull(xReaderKaynak_Table["end_time"]);

   if (xKaynak_Table.end_time == DateTime.MinValue)

  {

     xKaynak_Table.end_time = FnDate.IsNull(xReaderKaynak_Table["end_time"]);

   }

   Kaynak_Table.Add(xKaynak_Table);

}    




 -  Ve sonuç olarak yukarıda yüzbinlerce verinin önbellekte oluşturulmuş kaynak tablonun içine kaydedildiği DataTable objesi tek bir insert komutuyla gönderimi aşağıdaki gibidir :


Kaynak_Table aKaynak_Table = new Kaynak_Table();

aKaynak_Table.InsertMassiveData(Kaynak_Table);








10 Kasım 2020 Salı

 

Bellek Yönetimi:

Exception of type System.OutOfMemoryException' was thrown  Hatası



C# .Net Framework Uygulamalarında karşılaşılan bu hatanın tespiti için önbelleğin aktif ve yoğun şekilde kullanılması gereken while, for each gibi döngülerin try ... except boluğu içerisine taşınması gerekir. 
Bellek yönetimi ve kullanılmayan ya da sürekli biriken önbellekte alan kaplayan nesnelerin temizlenmesi işlemleri için özellikle timer içerisinde kullanılan ve belirli aralıklarla çalışan döngülerin kontrol edilmesi gerekir.

Daha sonra bu tür hataların, döngüde aşırı veri yığılması sonucu PC ram belleğinin yetersiz olduğu durumlarda exception bloğuna düştüğü görülecektir. Buna önlem olarak yazılımsal olarak döngüye girmeden önce GC.Collection() metodu ile referansı olmayan önbellekte birikmiş nesneler temizlenerek bellek boşaltma yöntemi kullanılabilir.
  

5 Ekim 2020 Pazartesi

SQL SERVER ile DBLİNK OLUŞTURMA

 

MsSQL ile Firebird dbLink Oluştuma :


            MsSQL üzerinden Firebird tablolarına erişim sağlayabilmek için SQL Server ile Firebird Server arasında veri trafiğini sağlayacak bir link oluşturmamız gerekir. MSSQL ->Server Objects-> Linked Servers altında yeni bir sunucuya nasıl bağlanıldığının adımları aşağıdaki gibidir:



    İlk önce kullanıyor olduğumuz SQL Server sunucumuzun versiyonunu ve kaç bit ile çalıştığını aşağıdaki komutlar ile öğreniyoruz.


 -  SQL Server Version Öğrenme Komutu:  select @@VERSION


  - SQL Server Bit Desteği Öğrenme Komutu:  select serverproperty('edition')


    Yukarıda sorguladığımız SQL sunucumuza uyumlu olabilecek Firebird ODBC driver'ı   firebirdsql.org sitesinden indiriyoruz. Kullanılan SQL Server 64 bit ise  64 bitlik ODBC, MSSQL 32 bitlik ise firebird ODBC driver kurulumlarının da 32 bitlik olmasına dikkat edilmelidir. 

    32-bitlik MSSQL ile Firebird driver haberleşmesi üzerinden devam edecek olursak, aşağıdaki adımlar takip edilmelidir;

 


    -   32-bit ODBC Sistem DSN alanında FIREBIRDSRV adında Firebird/InterBase driver tanımladım.















 -  SQL Server tarafında ise aşağıdaki işlemleri yapıyoruz. Server Objects->Linked Servers üzerine gelerek New Linked Server ile yeni bir dbLink bağlantısı oluşturuyoruz.




  oluşturduğumuz bağlantı ayarları aşağıdaki görsellerdeki gibidir. Oluşturmuş olduğumuz 'FIREBIRDSRV' dbLink özelliklerine tıklayarak General penceresinde yer alan Provider seçeneğini 'Microsoft OLE DB Provider for ODBC Drivers' olarak seçiyoruz. Product Name ve Data Source seçeneklerinin ise ODBC ayarlarını yapmış olduğumuz firebird driver ismi ile aynı olması gerekir.



 son olarak bağlantının doğruluğunu test etmek için görseldeki gibi Test Connection sekmesine tıklıyoruz.










 MsSQL ile dbLink Firebird Veritabanının Tablolarına Erişim için OPENQUERY komutu kullanılır. 



SELECT *
FROM OPENQUERY(FIREBIRDSRV , 'select * from JOBTABLE_HEADER')





















15 Eylül 2020 Salı

 

Delphi'de String - Hex Dönüştürme Fonksiyonları:



// String türdeki ifadenin Hexdecimal türüne çevirilmesi aşağıdaki gibidir.

function StringToHex(S: String): string;

var I: Integer;

begin

  Result:= '';

  for I := 1 to length (S) do

    Result:= Result+IntToHex(ord(S[i]),2);

end;



// HexDecimal türdeki ifadenin String türüne çevirilmesi aşağıdaki gibidir.

function HexToString(H: String): String;

var I: Integer;

begin

  Result:= '';

  for I := 1 to length (H) div 2 do

    Result:= Result+Char(StrToInt('$'+Copy(H,(I-1)*2+1,2)));

end;


3 Eylül 2020 Perşembe

 Delphi'de cxGrid Türkçeleştirme:


 -    cxGrid filtreleme ve diğer özelliklerin türkçe olması için aşağıdaki unit' i kendi projenize ekleyebilirsiniz.

=============================&&&====================================

unit cxGridToTR;

interface

uses

 dxCore, cxGridStrs, cxFilterConsts,

  cxFilterControlStrs, cxClasses, cxGridPopupMenuConsts;

  procedure cxGridToTrk;

implementation

procedure cxGridToTrk;

begin

  { ******************************************************************** }

  { cxGridStrs }

  { ******************************************************************** }

  // scxGridRecursiveLevels = 'You cannot create recursive levels';

  cxSetResourceString(@scxGridRecursiveLevels,

    'Yinelemeli seviyeler oluşturamazsınız');

  // scxGridDeletingConfirmationCaption = 'Confirm';

  // cxSetResourceString(@scxGridDeletingConfirmationCaption, 'Onayla');

  // scxGridDeletingFocusedConfirmationText = 'Delete record?';

  cxSetResourceString(@scxGridDeletingFocusedConfirmationText,

    'Kayıt silinsin mi ?');

  // scxGridDeletingSelectedConfirmationText = 'Delete all selected records?';

  cxSetResourceString(@scxGridDeletingSelectedConfirmationText,

    'Seçili tüm kayıtlar silinsin mi ?');

  // scxGridNoDataInfoText = '<No data to display>';

  cxSetResourceString(@scxGridNoDataInfoText, '<Gösterilecek kayıt yok>');

  // scxGridNewItemRowInfoText = 'Click here to add a new row';

  cxSetResourceString(@scxGridNewItemRowInfoText,

    'Yeni satır eklemek için buraya tıklayın');

  // scxGridFilterIsEmpty = '<Filter is Empty>';

  cxSetResourceString(@scxGridFilterIsEmpty, '<Filtre boş>');

  // scxGridCustomizationFormCaption = 'Customization';

  cxSetResourceString(@scxGridCustomizationFormCaption, 'Özelleştirme');

  // scxGridCustomizationFormColumnsPageCaption = 'Columns';

  cxSetResourceString(@scxGridCustomizationFormColumnsPageCaption, 'Sütunlar');

  // scxGridGroupByBoxCaption = 'Drag a column header here to group by that column';

  cxSetResourceString(@scxGridGroupByBoxCaption,

    'Gruplamak istediğiniz kolonu buraya sürükleyin');

  // scxGridFilterCustomizeButtonCaption = 'Customize...';

  cxSetResourceString(@scxGridFilterCustomizeButtonCaption, 'Özelleştir');

  // scxGridColumnsQuickCustomizationHint = 'Click here to select visible columns';

  cxSetResourceString(@scxGridColumnsQuickCustomizationHint,

    'Görünür sütunları seçmek için tıklayın');

  // scxGridCustomizationFormBandsPageCaption = 'Bands';

  cxSetResourceString(@scxGridCustomizationFormBandsPageCaption, 'Bantlar');

  // scxGridBandsQuickCustomizationHint = 'Click here to select visible bands';

  cxSetResourceString(@scxGridBandsQuickCustomizationHint,

    'Görünür bantları seçmek için tıklayın');

  // scxGridCustomizationFormRowsPageCaption = 'Rows';

  cxSetResourceString(@scxGridCustomizationFormRowsPageCaption, 'Satırlar');

  // scxGridConverterIntermediaryMissing = 'Missing an intermediary component!'#13#10'Please add a %s component to the form.';

  cxSetResourceString(@scxGridConverterIntermediaryMissing,

    'Bulunamayan aracı bileşen!'#13#10'Lütfen bir %s bileşeni forma ekleyin.');

  // scxGridConverterNotExistGrid = 'cxGrid does not exist';

  cxSetResourceString(@scxGridConverterNotExistGrid, 'cxGrid yok');

  // scxGridConverterNotExistComponent = 'Component does not exist';

  cxSetResourceString(@scxGridConverterNotExistComponent, 'Bileşen yok');

  // scxImportErrorCaption = 'Import error';

  cxSetResourceString(@scxImportErrorCaption, 'İçe aktarım hatası');

  // scxNotExistGridView = 'Grid view does not exist';

  cxSetResourceString(@scxNotExistGridView, 'Grid görünümü yok');

  // scxNotExistGridLevel = 'Active grid level does not exist';

 // cxSetResourceString(@scxNotExistGridLevel, 'Geçerli grid seviyesi yok');

  // scxCantCreateExportOutputFile = 'Can''t create the export output file';

//  cxSetResourceString(@scxCantCreateExportOutputFile,'Dışa aktarılacak dosya oluşturulamıyor');

  // cxSEditRepositoryExtLookupComboBoxItem = 'ExtLookupComboBox|Represents an ultra-advanced lookup using the QuantumGrid as its drop down control';

  // scxGridChartValueHintFormat = '%s for %s is %s'; // series display text, category, value


  { ******************************************************************** }

  { cxFilterConsts }

  { ******************************************************************** }


  // // base operators

  // cxSFilterOperatorEqual = 'equals';

  cxSetResourceString(@cxSFilterOperatorEqual, 'eşit');

  // cxSFilterOperatorNotEqual = 'does not equal';

  cxSetResourceString(@cxSFilterOperatorNotEqual, 'eşit değil');

  // cxSFilterOperatorLess = 'is less than';

  cxSetResourceString(@cxSFilterOperatorLess, 'küçük');

  // cxSFilterOperatorLessEqual = 'is less than or equal to';

  cxSetResourceString(@cxSFilterOperatorLessEqual, 'küçük veya eşit');

  // cxSFilterOperatorGreater = 'is greater than';

  cxSetResourceString(@cxSFilterOperatorGreater, 'büyük');

  // cxSFilterOperatorGreaterEqual = 'is greater than or equal to';

  cxSetResourceString(@cxSFilterOperatorGreaterEqual, 'büyük veya eşit');

  // cxSFilterOperatorLike = 'like';

  cxSetResourceString(@cxSFilterOperatorLike, 'içerir');

  // cxSFilterOperatorNotLike = 'not like';

  cxSetResourceString(@cxSFilterOperatorNotLike, 'içermez');

  // cxSFilterOperatorBetween = 'between';

  cxSetResourceString(@cxSFilterOperatorBetween, 'arasında');

  // cxSFilterOperatorNotBetween = 'not between';

  cxSetResourceString(@cxSFilterOperatorNotBetween, 'arasında değil');

  // cxSFilterOperatorInList = 'in';

  cxSetResourceString(@cxSFilterOperatorInList, 'içinde olan');

  // cxSFilterOperatorNotInList = 'not in';

  cxSetResourceString(@cxSFilterOperatorNotInList, 'içinde olmayan');

  // cxSFilterOperatorYesterday = 'is yesterday';

  cxSetResourceString(@cxSFilterOperatorYesterday, 'dün');

  // cxSFilterOperatorToday = 'is today';

  cxSetResourceString(@cxSFilterOperatorToday, 'bugün');

  // cxSFilterOperatorTomorrow = 'is tomorrow';

  cxSetResourceString(@cxSFilterOperatorTomorrow, 'yarın');

  // cxSFilterOperatorLastWeek = 'is last week';

  cxSetResourceString(@cxSFilterOperatorLastWeek, 'geçen hafta');

  // cxSFilterOperatorLastMonth = 'is last month';

  cxSetResourceString(@cxSFilterOperatorLastMonth, 'geçen ay');

  // cxSFilterOperatorLastYear = 'is last year';

  cxSetResourceString(@cxSFilterOperatorLastYear, 'geçen sene');

  // cxSFilterOperatorThisWeek = 'is this week';

  cxSetResourceString(@cxSFilterOperatorThisWeek, 'bu hafta');

  // cxSFilterOperatorThisMonth = 'is this month';

  cxSetResourceString(@cxSFilterOperatorThisMonth, 'bu ay');

  // cxSFilterOperatorThisYear = 'is this year';

  cxSetResourceString(@cxSFilterOperatorThisYear, 'bu sene');

  // cxSFilterOperatorNextWeek = 'is next week';

  cxSetResourceString(@cxSFilterOperatorNextWeek, 'gelecek hafta');

  // cxSFilterOperatorNextMonth = 'is next month';

  cxSetResourceString(@cxSFilterOperatorNextMonth, 'gelecek ay');

  // cxSFilterOperatorNextYear = 'is next year';

  cxSetResourceString(@cxSFilterOperatorNextYear, 'gelecek sene');

  // cxSFilterAndCaption = 'and';

  cxSetResourceString(@cxSFilterAndCaption, 've');

  // cxSFilterOrCaption = 'or';

  cxSetResourceString(@cxSFilterOrCaption, 'veya');

  // cxSFilterNotCaption = 'not';

  cxSetResourceString(@cxSFilterNotCaption, 'değil');

  // cxSFilterBlankCaption = 'blank';

  cxSetResourceString(@cxSFilterBlankCaption, 'boş');

  // // derived

  // cxSFilterOperatorIsNull = 'is blank';

  cxSetResourceString(@cxSFilterOperatorIsNull, 'boşluk');

  // cxSFilterOperatorIsNotNull = 'is not blank';

  cxSetResourceString(@cxSFilterOperatorIsNotNull, 'boşluk değil');

  // cxSFilterOperatorBeginsWith = 'begins with';

  cxSetResourceString(@cxSFilterOperatorBeginsWith, 'ile başlayan');

  // cxSFilterOperatorDoesNotBeginWith = 'does not begin with';

  cxSetResourceString(@cxSFilterOperatorDoesNotBeginWith, 'ile başlamayan');

  // cxSFilterOperatorEndsWith = 'ends with';

  cxSetResourceString(@cxSFilterOperatorEndsWith, 'ile biten');

  // cxSFilterOperatorDoesNotEndWith = 'does not end with';

  cxSetResourceString(@cxSFilterOperatorDoesNotEndWith, 'ile bitmeyen');

  // cxSFilterOperatorContains = 'contains';

  cxSetResourceString(@cxSFilterOperatorContains, 'içeren');

  // cxSFilterOperatorDoesNotContain = 'does not contain';

  cxSetResourceString(@cxSFilterOperatorDoesNotContain, 'içermeyen');

  // // filter listbox's values

  // cxSFilterBoxAllCaption = '(All)';

  cxSetResourceString(@cxSFilterBoxAllCaption, 'Hepsi');

  // cxSFilterBoxCustomCaption = '(Custom...)';

  cxSetResourceString(@cxSFilterBoxCustomCaption, 'Özel...');

  // cxSFilterBoxBlanksCaption = '(Blanks)';

  cxSetResourceString(@cxSFilterBoxBlanksCaption, '(Boş olanlar)');

  // cxSFilterBoxNonBlanksCaption = '(NonBlanks)';

  cxSetResourceString(@cxSFilterBoxNonBlanksCaption, '(Boş olmayanlar)');


  { ******************************************************************** }

  { cxFilterControlStrs }

  { ******************************************************************** }


    // // cxFilterBoolOperator

    // cxSFilterBoolOperatorAnd = 'AND';        // all

    cxSetResourceString(@cxSFilterBoolOperatorAnd, 'VE');

    // cxSFilterBoolOperatorOr = 'OR';          // any

    cxSetResourceString(@cxSFilterBoolOperatorOr, 'VEYA');

    // cxSFilterBoolOperatorNotAnd = 'NOT AND'; // not all

    cxSetResourceString(@cxSFilterBoolOperatorNotAnd, 'VE DEĞİL');

    // cxSFilterBoolOperatorNotOr = 'NOT OR';   // not any

    cxSetResourceString(@cxSFilterBoolOperatorNotOr, 'VEYA DEĞİL');

    // //

    // cxSFilterRootButtonCaption = 'Filter';

    cxSetResourceString(@cxSFilterRootButtonCaption, 'Filtre');

    // cxSFilterAddCondition = 'Add &Condition';

    cxSetResourceString(@cxSFilterAddCondition, '&Koşul ekle');

    // cxSFilterAddGroup = 'Add &Group';

    cxSetResourceString(@cxSFilterAddGroup, '&Grup ekle');

    // cxSFilterRemoveRow = '&Remove Row';

   cxSetResourceString(@cxSFilterRemoveRow, '&Satır kaldır');

   // cxSFilterClearAll = 'Clear &All';

   cxSetResourceString(@cxSFilterClearAll, 'Hepsini &temizle');

    // cxSFilterFooterAddCondition = 'press the button to add a new condition';

    cxSetResourceString(@cxSFilterFooterAddCondition,

      'yeni koşul eklemek için tuşa basın');

    // cxSFilterGroupCaption = 'applies to the following conditions';

    cxSetResourceString(@cxSFilterGroupCaption, 'aşağıdaki koşulları uygulayın');

    // cxSFilterRootGroupCaption = '<root>';

    cxSetResourceString(@cxSFilterRootGroupCaption, '<kök>');

    // cxSFilterControlNullString = '<empty>';

    cxSetResourceString(@cxSFilterControlNullString, '<boş>');

    // cxSFilterErrorBuilding = 'Can''t build filter from source';

    cxSetResourceString(@cxSFilterErrorBuilding, 'Kaynaktan filtrelenemiyor');

    // //FilterDialog

    // cxSFilterDialogCaption = 'Custom Filter';

    cxSetResourceString(@cxSFilterDialogCaption, 'Özel filtre');

    // cxSFilterDialogInvalidValue = 'Invalid value';

    cxSetResourceString(@cxSFilterDialogInvalidValue, 'Geçersiz değer');

    // cxSFilterDialogUse = 'Use';

    cxSetResourceString(@cxSFilterDialogUse, 'Kullan');

    // cxSFilterDialogSingleCharacter = 'to represent any single character';

    cxSetResourceString(@cxSFilterDialogSingleCharacter,

      'tek karakteri temsil etmek için');

    // cxSFilterDialogCharactersSeries = 'to represent any series of characters';

    cxSetResourceString(@cxSFilterDialogCharactersSeries,

      'peş peşe karakterleri temsil etmek için');

    // cxSFilterDialogOperationAnd = 'AND';

    cxSetResourceString(@cxSFilterDialogOperationAnd, 'VE');

    // cxSFilterDialogOperationOr = 'OR';

    cxSetResourceString(@cxSFilterDialogOperationOr, 'VEYA');

    // cxSFilterDialogRows = 'Show rows where:';

    cxSetResourceString(@cxSFilterDialogRows, 'Satırları goster');    

    // // FilterControlDialog

    // cxSFilterControlDialogCaption = 'Filter builder';

    cxSetResourceString(@cxSFilterControlDialogCaption, 'Filtre hazırlayıcı');

    // cxSFilterControlDialogNewFile = 'untitled.flt';

    cxSetResourceString(@cxSFilterControlDialogNewFile, 'isimsiz.flt');

    // cxSFilterControlDialogOpenDialogCaption = 'Open an existing filter';

    cxSetResourceString(@cxSFilterControlDialogOpenDialogCaption, 'Filtre aç');

    // cxSFilterControlDialogSaveDialogCaption = 'Save the active filter to file';

    cxSetResourceString(@cxSFilterControlDialogSaveDialogCaption,

      'Geçerli filtreyi kaydet');

    // cxSFilterControlDialogActionSaveCaption = '&Save As...';

    cxSetResourceString(@cxSFilterControlDialogActionSaveCaption,

      '&Farklı kaydet');

    // cxSFilterControlDialogActionOpenCaption = '&Open...';

    cxSetResourceString(@cxSFilterControlDialogActionOpenCaption, '&Aç...');

    // cxSFilterControlDialogActionApplyCaption = '&Apply';

    cxSetResourceString(@cxSFilterControlDialogActionApplyCaption, '&Uygula');

    // cxSFilterControlDialogActionOkCaption = 'OK';

    cxSetResourceString(@cxSFilterControlDialogActionOkCaption, 'Tamam');

    // cxSFilterControlDialogActionCancelCaption = 'Cancel';

    cxSetResourceString(@cxSFilterControlDialogActionCancelCaption, 'İptal');

    // cxSFilterControlDialogFileExt = 'flt';

    // cxSFilterControlDialogFileFilter = 'Filters (*.flt)|*.flt';

    cxSetResourceString(@cxSFilterControlDialogFileFilter,

      'Filtreler (*.flt)|*.flt');


    // cxGridPopupMenuConsts

    cxSetResourceString(@cxSGridNone, 'Yok'); // 'None';

    cxSetResourceString(@cxSGridSortColumnAsc, 'Artan Sıralama');

    // 'Sort Ascending';

    cxSetResourceString(@cxSGridSortColumnDesc, 'Azalan Sıralama');

    // 'Sort Descending';

    cxSetResourceString(@cxSGridClearSorting, 'Sıralamayı Sil');

    // 'Clear Sorting';

    cxSetResourceString(@cxSGridGroupByThisField, 'Bu Alana Göre Grupla');

    // 'Group By This Field';

    cxSetResourceString(@cxSGridRemoveThisGroupItem, 'Gruplamayı Sil');

    // 'Remove from grouping';

    cxSetResourceString(@cxSGridGroupByBox, 'Gruplama Kutusu'); // 'Group By Box';

    cxSetResourceString(@cxSGridAlignmentSubMenu, 'Hizalama'); // 'Alignment';

    cxSetResourceString(@cxSGridAlignLeft, 'Sola Hizala'); // 'Align Left';

    cxSetResourceString(@cxSGridAlignRight, 'Sağa Hizala'); // 'Align Right';

    cxSetResourceString(@cxSGridAlignCenter, 'Ortalı Hizala'); // 'Align Center';

    cxSetResourceString(@cxSGridRemoveColumn, 'Sutunu Sil');

    // 'Remove This Column';

    cxSetResourceString(@cxSGridFieldChooser, 'Alan Seçiçi'); // 'Field Chooser';

    cxSetResourceString(@cxSGridBestFit, 'En Uygun Büyüklük'); // 'Best Fit';

    cxSetResourceString(@cxSGridBestFitAllColumns,

      'En Uygun Büyüklük(Bütün Sutunlar)'); // 'Best Fit (all columns)';

    cxSetResourceString(@cxSGridShowFooter, 'Alt'); // 'Footer';

    cxSetResourceString(@cxSGridShowGroupFooter, 'Grup Alt'); // 'Group Footers';

    cxSetResourceString(@cxSGridSumMenuItem, 'Toplam'); // 'Sum';

    cxSetResourceString(@cxSGridMinMenuItem, 'Minimum'); // 'Min';

    cxSetResourceString(@cxSGridMaxMenuItem, 'Maximum'); // 'Max';

    cxSetResourceString(@cxSGridCountMenuItem, 'Adet'); // 'Count';

    cxSetResourceString(@cxSGridAvgMenuItem, 'Avaraj'); // 'Average';

    cxSetResourceString(@cxSGridNoneMenuItem, 'Yok'); // 'None';

  end;

end.




2 Eylül 2020 Çarşamba


 Delphi'de Sayı Formatlama:

      

      Delphi'de tanımlanan veya girilen sayıların istenilen basamaklara bölünerek formatlanabilmesi için aşağıdaki yollardan biri kullanılabilir:


var

sayi:integer;
s:string;



sayi := 1234567;



label1.Caption:= Format('%.0n', [sayi*1.0]); // --> ' 1.234.567 '


veya


label1.Caption:= Format('%.0n', [sayi*1/0]); // --> ' 1.234.567 '


veya bir string değişkene bağlamak istersek, aşağıdaki formatlardan biri kullanılabilir;


 s := Format('%.0n', [I * 1.0]); // --> ' 1.234.567 '


 s := Format('%.0n', [I + 0.0]); // --> ' 1.234.567 '




23 Temmuz 2020 Perşembe


Firebird Bağlantı Hatası


Firebird kurulumu sonrasında delphi uygulamasını çalıştırdığımızda aşağıdaki gibi veritabanı bağlantı hatası veya veritabanı erişim hatası alıyorsak :

can't format message 13:96 -- message file C:\Program Files\HK-Software\firebird.msg not found.
unavailable database.



Firebird kurulumu sırasında sıkıntı yaşanmış olması ihtimaline karşılık, IBExpert kurulu ise sistemden kaldırılır, Firebird kaldırılır, Windows/System32/  klasöründeki gds32.dll dosyası silinir ardından firebird ve IBExpert tekrar kurulur.



19 Aralık 2019 Perşembe

Borland license information was found, but it is not valid for Delphi



Özellikle Delphi7 borland sürümlerinde karşılaşılan lisans doğrulama hataları için lisans aktivitesi ve doğrulama delphinin yüklü olduğu aşağıdaki dizinde:

C:\Program Files (x86)\Borland\Delphi7\Bin ..

- D7Reg.exe çalıştırılır. 
- ardından delphi7 tekrar başlatılır.


19 Eylül 2019 Perşembe

Delphi InputQuery Kullanımı

Input Query Çoklu Değişken:




 -  Kullanıcı girişi için girilen değerler boşluktan farklı ise veritabanı sistemine bağlanan yapı aşağıdaki gibidir:


procedure dbBaglan(ext:string;userName:string=' ';Password:string=' ');
begin 
ext:= "bir farklı veritabanına bağlanma durumunda, dosya uzantısının parametre şeklinde alınması"; 
userName:="bazı veritabanı bağlantılarında giriş kontrolü olmadığından default değer boş";
password:="bazı veritabanı bağlantılarında giriş kontrolü olmadığından default değer boş";
end;

Not: Aşağıdaki yapı userName ve Pass isteyen db bağlantılar için oluşturuldu.

var

  vars:array of string;

vars[0]:=userName;

vars[1]:=Password;

if InputQuery('Kullanıcı Girişi',['Kullanıcı Adı','Şifre'],Vars,
  function (const Values: array of string): Boolean
  begin
    Result := (Values[0]>' ') and (Values[1]>' ');
  end) then
begin
      dbBaglan(ext,userName,Password);
end else raise Exception.Create('Kullanıcı Girişi Hatası');






10 Ekim 2018 Çarşamba

Delphi XE7'de UniEvent Kullanımı


UniGui'de UniDBGrid'e UniEvent Tanımlama: 


1- UniDBGrid nesnesi seçilir.



2- UniDBGrid Properties menüsü altındaki ClientEvents -> UniEvents seçilir.



3- Görüntüdeki gibi Java Script Events ekranından UniDBGrid'in ToolBar paging paneli seçilir.




4- Aşağıdaki gibi PagingBar'ın Create olayına ajax fonksiyonu yazılır.





5-  Sender.items..hide ile nesnenin saklamak istediğimiz özelliklerini pagingBar kısmındaki indexlerini kullanarak saklıyoruz. Sender.add ile eklemek istediğimiz özellikleri ekliyoruz. aşağıdaki örnekte label ve ekleme-silme butonları oluşturulmuştur. butonların handler kısmında ise eklediğimiz nesnelere işlevsellik verebiliyoruz. Tanımlamak istediğimiz buton ise click olayında almasını istediğimiz event adını delphi tarafında aynı nesnenin OnAjaxEvent'inde kullanabiliyoruz.


 


6-  Görüntüdeki gibi scriptini yazdığımız grid nesnesinin Events kısmından OnAjaxEvent'ını seçiyoruz.






7-  Aşağıdaki örnekteki gibi script ile vermiş olduğumuz özelliklerin event tanımlamalarını delphi kodunda kullanabiliyoruz. yalnız burada dikkat edilmesi gereken, scripti yazarken nesneyi form üzerinden çağırmak gerekiyor. aksi halde script delphi tarafında çalışmayacaktır. Script'in döndürmesi gereken fonksiyonlarda (FFaturaOnaylamaEkrani2.UniDBMUS) gibi tanımlamak lazım.










 





17 Eylül 2018 Pazartesi

OLTP ve OLAP Küpü



OLTP (On Line Transactional Processing ) Nedir:



OLTP, verilerin ilişkisel veritabanı kurallarına göre saklanarak verilere paralel ve hızlı erişim sağlanabilmesi açısından oluşturulan bir tasarım örüntüsüdür, bu tasarım örüntüsü aynı zamanda OLTP'nin adından anlaşılacağı üzere verilerin tutarlılığını sağlamak için transaction yapılarını barındırması gerekir. OLTP yapılarının kullanılması gereken sistemler hakkında örnek verecek olursak, aynı banka hesabına bağlı 2 kopya ATM kartının aynı anda kullanımı söz konusu olduğunda sistem, hangi kartın işlemlerine cevap vermek için  öncelik vermeli? İşte bu tür anlık veri erişimlerinde oluşabilecek sorunlar için veritabanı yönetim sistemlerinde transaction mantığını en iyi şekilde bağlayacak OLTP yapıları düşünülmüştür. OLTP kavramı aslında Oracle, SQL Server, IBM DB2, PostgreSQL, MySql, SQLite, DBeaver gibi ilişkisel veritabanlarının genel mantığını oluşturur.

OLTP bir anlamda verilere paralel erişimi sağlamak ve verilerin tutarlılığını saplamak için oluşturulmuş bir standarttır. OLTP kavramı günümüzde ilişkisel veritabanı tanımları ile hemen hemen aynıdır. Tek farkı ilişkisel veritabanı tablolar arasındaki ilişkileri tanımlarken, OLTP verileri barındırma, verilere erişim ve bu verilerin tutarlılığını sağlama standartlarıdır diyebiliriz.



OLAP (On Line Analytical Processing) Nedir ve OLAP Küpleri: 


OLAP nedir; ilişkisel veritabanlarının yaygınlığı ve sonrasında ortaya çıkan veri ambarlarının gelişmesi ile beraber verilere daha hızlı erişime ve çok boyutlu (zamansal) analiz ihtiyaçları açısından düşünülmüş bir veri yönetim teknolojisidir.


Bir veri yapısının OLAP olarak nitelendirilebilmesi için 12 kural belirlenmiştir. Bu kurallar şöyle:


  -  Çok boyutlu inceleme özelliğine sahip olması,

  -  Şeffaflık,

  -  Erişilebilirlik,

  -  Her seviyede sorgulama için aynı performansı gösterebilme özelliği,

  -  İstemci - Sunucu yapısında olması,

  -  Sınırsız şekilde çapraz sorgulama olanağının olması,

  -  En alt seviyedeki verilerin otomatik olarak ayarlanması,

  -  Her şartta uygun boyutlandırılabilirlik,

  -  Çok kullanıcı desteğinin olması,

  -  Esnek raporlama özelliğinin olması,

  -  Boyut ve gruplamalarda sınır olmaması.

şeklindedir. 




OLAP’ın özellikleri

Zaman kazancının dışında, OLAP 3 çok önemli özelliği de beraberinde getirmektedir :

·         Verilere çok boyutlu bakabilme özelliği :  

Analizler sırasında kullanmış olduğumuz, her türlü kırılıma boyut adını verebiliriz. Örneğin demografik veriler (yaş, cinsiyet, eğitim durumu), sayısal veriler, adetler, işlem miktarları, gerçekleşen ve bütçelenen değerler, ürün tipleri, ürün özellikleri ve zaman. Yöneticiler ve analistler, çalışmaları sırasında, tüm bu tanımlanan verileri yatay veya düşey eksenlerde çakıştırarak görmek isteyebilirler.

İlişkisel veri tabanları, bu şekilde raporlara izin vermezler, fakat raporlama araçlarının yetenekleri ile, belirli bir noktaya kadar tolere edilebilir. Fakat daha karmaşık analizler işin içine girdiğinde, bir OLAP yapısı kurmadan bu raporları almak imkansız hale gelebilir.

İlişkisel veri tabanları üzerinde karmaşık SQL kodları yazmak, ya da raporlama aracının sahip olduğu programlama dili üzerinde uğraşmak gerekebilir. Bu da, analizi yapan kişilerin, işin özünden çıkarak, analiz gerektirebilecek verilere değil, teknik olanaklara, daha kolay şekilde alabilecekleri verilere kanalize olmaları sonucunu doğurur. Bu nedenle, iş zekası programlarının pratik olmasının yanında, fazla teknik bilgi kullanmadan raporların alınabilir olması, farklı kaynakları bir arada kullanabilecek, konsolide edebilecek yapıda olmaları gerekir.

Boyutların başka bir özelliği de hiyerarşilerin tanımlanabilmesidir. Hiyerarşiler sayesinde, hem toplamlara ulaşmak kolaylaşmakta, hem de farklı gruplar için, farklı senaryolar hazırlayabilme şansı doğmaktadır.

·         Karmaşık Hesaplamalar: 

Bir OLAP sisteminin gerçek performansı, karmaşık hesaplamaları yapma gücü ile ölçülebilir. OLAP sistemleri, sadece toplama işleminden başka işlemler de yapabilecek güçte olmalıdırlar. Gerçek hayat, her zaman daha karışıktır. Analiz yapanlar için, asıl rakamlardan çok, yüzdesel dağılımlar çok daha önemlidir. Birkaç yıllık satış içerisinde, binlerce ürün türü için günlük bazda satışları yüzdesel olarak analiz edip, sıraya dizebilmek bir RDBMS ile saatler sürecek bir raporun çalışmasını gerektirebilir. Oysa uygun bir OLAP sistem ile, bir günlük satışlar ve birkaç yıllık satış rakamı arasında bir fark olmamalıdır. Satış tahminlerinde, genellikle “moving average” ve “yüzde artış” gibi trend analizleri kullanılır. Finansal analizlerde, envanter hesaplarında ve portföy performans hesaplarında, zamana göre ürünlerin toplanma sırası, sonucu tamamen değiştirebilir. (yukarıdan aşağıya, ya da aşağıdan yukarıya, LIFO-FIFO) Kullanılacak OLAP yapısında, bu şekilde hesaplamalara da izin verir bir yapısının olması gerekir.

·         Zaman kavramları: 

Zaman boyutu, neredeyse her analizin temel bileşenidir. Zaman, diğer boyutlardan farklı olarak, kendine has bir sıralama içerisine gider. Alfabetik (Ocak her zaman Şubat’tan önce gelmelidir) veya nümerik sıralamalardan (12/31, 01/01’den önce gelmelidir) her zaman farklıdır. Gerçek OLAP sistemleri, zamanın bu şekilde sıralanmasını sağlarlar. 



OLAP’ın yararları:

Analiz yapan kişiler, daha kendine yeterli, IT’den bağımsız ve çok daha hızlı hale gelebilmektedirler.

Düşük kapasiteli sistemlerde yaşanan, zaman sıkıntısı problemleri ortadan kalkmaktadır. Üretim sistemini rapor için hızlandıracak büyük yatırımlar yerine, çok daha düşük maliyetli bir rapor sistemi kurmak bir çözüm olabilir. Yeni dönemde çıkan, tümleşik OLAP yapılarında, ilişkisel veri tabanı ve OLAP iç içe bir yapıda olduklarından, üretim sistemleri ya da veri ambarları üzerinde, toplamlar gerektiğinde, ilgili sorgulama OLAP küplerine yönlendirilerek, çok yüksek ölçüde performans getirisi sağlanabilmektedir.

Ayrıca bu yapılar sayesinde, OLAP sistemi için, hem yazılım hem de güncelleme anlamında, ikinci kez masraf yapmak zorluğu da ortadan kalkmaktadır.

Bu şekilde bir yatırımla, var olan IT sistemi de rahatlamakta, üretim sistemi üzerinde yer alan raporlar ortadan kalkmaktadır.

Farklı kaynaklardan alınan kaynaklar konsolide edilmekte ve veri güvenliği sağlanmaktadır.

Veriler toplamları alınmış şekilde bulunduklarından, toplam verilerin bulunması için gerekli raw-data, analistin makinesine aktarılması gerekmediğinden, network üzerinde büyük ölçüde bir trafik kazancı sağlanmaktadır.

Zaman kazancı, aynı zamanda kaynakların etkin kullanımı ve para kazancı anlamına da gelmektedir.


OLTP ve OLAP Arasındaki Farklar:



OLTP veri tabanlarında transaction sayısı diğer veritabanı yapılarına göre çok fazladır, 


OLTP veri tabanlarında transaction’lar günün her anında düzensiz olarak gerçekleşebilirken OLAP'ta bu, veri aktarım zamanlarında daha düzenli bir yapı içerisinde gerçekleşmektedir. İş gereksinimlerine göre günlük, saatlik, aylık, haftalık aktarımlar ile veri ambarındaki transaction’lar düzenli bir şekilde oluşturulabilirler.

OLTP veri tabanlarında indeksler sıklıkla kullanılmaktadırlar. OLAP'ta indeksler veri aktarımlarını yavaşlattıkları gerekçesiyle sıklıkla tercih edilmezler.

OLTP veri tabanları normalize tablo yapılarında oluşturulduklarından veriler çok sayıda tabloya dağıtılmıştır. OLAP'ta ise farklı tablolardaki veriler bir araya getirilerek oluşturulurlar. Dolayısıyla OLAP'ta tablo join’lerinin sayısı daha az olması hedeflenmektedir.

OLTP veri tabanlarında veri tekrarından olabildiğince kaçınılmaktadır. OLAP'ta ise SQL sorgularının daha hızlı gelebilmesi için veri tekrarı çok daha fazla yapılmaktadır. OLAP denormalize olarak tasarlanırlar.

OLTP veri tabanlarında satır satır detay bilgiler mevcuttur. OLAP'ta ise özet tablolara sıklıkla rastlanmaktadır.

OLAP verileri yalnızca aktarım süreçleriyle güncellenmelidirler. Sql sorguları yazılarak dışarıdan veri güncellemesinden kaçınılmalıdır. OLTP veri tabanlarına ise kullanıcılar sürekli veri güncellemeleri yapabilmektedirler.

Bir OLAP sorgusunda genellikle binlerce satırlık veri işlenmektedir. Örneğin 2013 yılındaki toplam satışlar. OLTP veri tabanında ise genellikle daha sınırlı sayıda veri ile sorgulama yapılmaktadır. Örneğin 150 id’li müşterinin bilgileri.








6 Şubat 2018 Salı

SQL'de Cast Kullanımı



SQL'de Cast işlemi:



SQL'de veri alanının hangi veri tipini dönmesini bekliyorsak Cast işlemi ile o alanın tip değişikliğini  o veri tipine göre yapmak mümkündür.

Kullanımı aşağıdaki gibidir:

"numofpackage" adındaki alan veritabanı tablosunda integer olarak tanımlı olsun. Ancak işlem sonucunun decimal veya float dönme ihtimaline karşılık  'cast(sum(numofpackage) as int)' alanı kendi tipine cast etme işlemi ile gelecek veriyi alanın kendi tipine çevirebiliriz.

Not: SQL'de Sum gibi fonksiyonlar geriye noktalı sayı döndürür. 


 

18 Ekim 2017 Çarşamba

HTML'de Sayfanın İstenilen Bölümünü Yazıcıdan Çıktısını Alma




HTML'de İstenilen <div ' i Yazdırma (Yazıcıdan Print Etme ):

Aşağıda bir .html sayfasının div'lere bölünerek sayfanın istenilen bölümünün nasıl yazdırılacağı hakkında basit bir örnek paylaşıyorum.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<head><h1>Başlık</h1></head>
<body>

<div id="Print1">
//Aşağıdaki script linki olmadan print olayı gerçekleşmeyecektir. Print aşağıdaki .js kütüphanesini kullanıyor. 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript">

//Aşağıdaki gibi yazdırma fonksiyonu tanımlanır, bu fonksiyon amaca göre div'in dışında <head> tag'ı içerisinde de tanımlanabilir.
function printDiv(divAdi)
{
 var printContents = document.getElementById(divAdi).innerHTML;
 var originalContents = document.body.innerHTML;

 document.body.innerHTML = printContents;

 window.print();

 document.body.innerHTML = originalContents;
}
</script>


  <h1>YAZDIRILAN BÖLÜM : Yazıcıdan çıktısı alınabilir. </h1>

 </div>

<div id="diger">
<h1>YAZDIRILMAYAN BÖLÜM: Yazıcıdan çıktısı alınmayacak.</h1>
</div>

//Aşağıda tanımlanan fonksiyona action vermek için button tanımladım. Burada dikkat edilecek yer buttonun type ve onclick özellikleridir. onclick olayında çağırılan fonksiyonun aynı isimde olmasına dikkat edilmeli.
<input type="button" onclick="printDiv('Print1')" value="Div Yazdır" />


İşlem bu kadar, kolay gelsin.





5 Haziran 2017 Pazartesi

Informix SQL'de Alter ve Modify Table İşlemleri


Informix SQL'de Alter Table Yapmak:


Veritabanında herhangi bir tablo üzerinde sonradan kolon açmak istediğimizde SQL dilinde Alter Table değimini kullanmamız gerekir. Kullanım şekli aşağıdaki gibidir:

//Aşağıdaki Alter Table ifadesinde oluşturulmak istenen kolon için ekstradan özellik atanmıştır. eklenecek kolonun veri tipi:char(3) alacağı Default değer ataması:'trk' ve tabloda yer alan kolonlardan hangi kolondan önce yer alacağı Before, ad_date adlı kolondan önce yer alacak.
ALTER TABLE tablo_adi ADD eklenecek_kolon_adi CHAR(3) DEFAULT 'trk' BEFORE ad_date

// Informix'de aynı anda birden fazla komutun işletilmesi için komutlar arası eklenen ayırac aşağıdaki gibidir.

^!^

ALTER TABLE tablo_adi ADD eklenecek_kolon_adi CHAR(3) DEFAULT 'trk' BEFORE ad_date



Informix SQL'de Modify Table Yapmak:

Veritabanında herhangi bir tablonun kolon özelliğini değiştirmek istediğimizde SQL dilinde Alter Modify değimini kullanmamız gerekir. Kullanım şekli aşağıdaki gibidir:


//Aşağıdaki Alter Table Modify ifadesinde tablonun özelliği değiştirilmek istenen kolonun Char karakter sayısı, yani kolonun genişliği tekrardan tanımlanmaktadır. Aynı şekilde kolonun alcağı değer tipi de değiştirilebilirdi.   

ALTER TABLE tablo_adi MODIFY degistirilecek_kolon_adi CHAR(100);

^!^


ALTER TABLE tablo_adi MODIFY degistirilecek_kolon_adi CHAR(100);






26 Mayıs 2017 Cuma

Informix'de Veritabanındaki Tabloları Listelemek




Informix'de Veritabanındaki Tüm Tabloları ve O Tabloların Alanlarını, Alan tiplerini listeleyen SQL Sorgusu:


SELECT TRIM(t.tabname) || '.' || TRIM(c.colname) AS table_dot_column,
CASE 
  WHEN MOD(coltype,256)=0 THEN 'CHAR' 
  WHEN MOD(coltype,256)=1 THEN 'SMALLINT' 
  WHEN MOD(coltype,256)=2 THEN 'INTEGER' 
  WHEN MOD(coltype,256)=3 THEN 'FLOAT' 
  WHEN MOD(coltype,256)=4 THEN 'SMALLFLOAT' 
  WHEN MOD(coltype,256)=5 THEN 'DECIMAL' 
  WHEN MOD(coltype,256)=6 THEN 'SERIAL' 
  WHEN MOD(coltype,256)=7 THEN 'DATE' 
  WHEN MOD(coltype,256)=8 THEN 'MONEY' 
  WHEN MOD(coltype,256)=9 THEN 'NULL' 
  WHEN MOD(coltype,256)=10 THEN 'DATETIME' 
  WHEN MOD(coltype,256)=11 THEN 'BYTE' 
  WHEN MOD(coltype,256)=12 THEN 'TEXT' 
  WHEN MOD(coltype,256)=13 THEN 'VARCHAR' 
  WHEN MOD(coltype,256)=14 THEN 'INTERVAL' 
  WHEN MOD(coltype,256)=15 THEN 'NCHAR' 
  WHEN MOD(coltype,256)=16 THEN 'NVARCHAR' 
  WHEN MOD(coltype,256)=17 THEN 'INT8' 
  WHEN MOD(coltype,256)=18 THEN 'SERIAL8' 
  WHEN MOD(coltype,256)=19 THEN 'SET' 
  WHEN MOD(coltype,256)=20 THEN 'MULTISET' 
  WHEN MOD(coltype,256)=21 THEN 'LIST' 
  WHEN MOD(coltype,256)=22 THEN 'ROW (unnamed)' 
  WHEN MOD(coltype,256)=23 THEN 'COLLECTION' 
  WHEN MOD(coltype,256)=40 THEN 'LVARCHAR fixed-length opaque types' 
  WHEN MOD(coltype,256)=41 THEN 'BLOB, BOOLEAN, CLOB variable-length opaque types' 
  WHEN MOD(coltype,256)=43 THEN 'LVARCHAR (client-side only)' 
  WHEN MOD(coltype,256)=45 THEN 'BOOLEAN' 
  WHEN MOD(coltype,256)=52 THEN 'BIGINT' 
  WHEN MOD(coltype,256)=53 THEN 'BIGSERIAL' 
  WHEN MOD(coltype,256)=2061 THEN 'IDSSECURITYLABEL'
  WHEN MOD(coltype,256)=4118 THEN 'ROW (named)' 
  ELSE TO_CHAR(coltype)
END AS Type,
BITAND(coltype,256)=256 AS NotNull
  FROM "informix".systables  AS t
  JOIN "informix".syscolumns AS c ON t.tabid = c.tabid
 WHERE t.tabtype = 'T'
   AND t.tabid >= 100
 ORDER BY t.tabname, c.colno;




22 Mayıs 2017 Pazartesi

SQL'de Temp Tablolarla İşlem Yapmak





Temp tablolar local'de oluşturulan  ve db connection olduğu sürece işlevsel olan, geçici tablolardır. Session mantığı gibi, işlemi bitirip oturumu kapattıktan sonra, yani db bağlantısını kapatıp tekrar açtığımızda önceden oluşturmuş olduğumuz temp tabloya erişmemiz imkansızdır.

Konuyu bir örnek ile anlatacak olursak; örnekte genkur tablosuna önceki kayıtlarından birinin kopyasını alarak insert işlemi yapmak istiyoruz. Bunun için  genkur adındaki tablodan belirli bir tarihe ait kaydı ilk olarak geçici olarak tkur adındaki temp tablosuna aktarıyoruz, daha sonra tkur tablosuna aktardığımız kaydı güncelliyoruz, son olarak da tkur geçici tabloda güncellemiş olduğumuz kaydı genkur tablosuna aktarıyoruz. Böylece geçici (temp) tablo kullanımı sayesinde, herhangi bir tabloya önceki kayıtlarından kopya kaydı nasıl aktarılabileceğini görmüş olduk.


//Güncellemek istediğimiz kaydın temp tablosuna aktarılması

      -  SELECT * FROM genkur WHERE tarih=mdy(5,11,2017)
          INTO temp tkur


//Temp tablosuna aktarılan kaydın güncellenmesi
       - UPDATE tkur SET tarih=today


//Temp dosyasında güncellenen kaydın gerçek tabloya aktarılması
       - INSERT INTO genkur
         SELECT * FROM tkur











15 Mayıs 2017 Pazartesi

Excel'de Farklı Sayfalardaki Sütunları Karşılaştırma



VLOOKUP():

Excel'de Sheet2'deki sütuna bağlı kayıtların Sheet1'deki kayıtlarla karşılaştırılması ve farklı kayıtların filtrelenebilmesi için Sheet2'de, karşılaştırma sonucunu listelemek istediğimiz, sütuna aşağıdaki fonksiyonu tanımlamamız gerekir:



//formulde Belge No Sheet2 de karşılaştırmak istediğimiz sütun başlığına ait verilerin Sheet1 deki A:D sütunları arasında kalan veriler ile karşılaştırılması sağlanıyor. 


=VLOOKUP([@[Belge No]];Sheet1!A:D;1;FALSE)








3 Mayıs 2017 Çarşamba

Informix Database Server'da Tablolara Kullanıcı Yetkisi Verme




    SQL'de Database Tablolarına Kullanıcı Yetkisi Veren Stored Procedure:


Informix'de kullanıcılara tablo yetkisi veren procedure aşağıdaki gibi tanımlanabilir:


--- Aynı ad ile kayıtlı procedure var ise silinir. 
drop PROCEDURE if exists SET_PERMISSION

--- Informix'de işletilmek istenen iki komut arası ayıracı...
^!^  


---- stored procedure'nin oluşturulması...

CREATE PROCEDURE SET_PERMISSION()

---- procedure'de kullanılacak değişkenlerin tanımlanması..
DEFINE vYETKI char(200);
DEFINE vOWNER char(30);
DEFINE ERROR_NUMBER   INT;
DEFINE ISAM_ERROR_VAR INT;
DEFINE ERROR_DATA_VAR CHAR(255);
DEFINE vTABLOYOKHATAKODU INT;


---- hata kodlarına bakarak hata kodu karşılaştırması yapan başka bir procedure'nin çalıştırılması..
ON EXCEPTION SET ERROR_NUMBER, ISAM_ERROR_VAR, ERROR_DATA_VAR
  IF ERROR_NUMBER <> vTABLOYOKHATAKODU THEN
    RAISE EXCEPTION ERROR_NUMBER, ISAM_ERROR_VAR, ERROR_DATA_VAR;
  END IF;

END EXCEPTION;

---- procedure'de tanımlı bir değişkene const sayı ataması aşağıdaki gibidir.
LET vTABLOYOKHATAKODU=-206;


---- Select sorgusunda sonucu gelen tüm tabloları check eden foreach döngüsü...
FOREACH CR1 FOR

---- Select sonucunun procedure'de tanımlı vYETKI değişkenine atanması...
select 'GRANT ALL ON '||trim(OWNER)||'.'|| TRIM(TABNAME) || ' TO PUBLIC' into vYETKI
from systables
where ((tabtype='V' or statlevel='A') and tabname not like 'sys%')

---- vYETKI değişkenine atanan sonuçların execute edilmesi..
EXECUTE IMMEDIATE vYETKI;


---- döngü ve procedure'nin sonlandırılması...
END FOREACH;
               
END PROCEDURE  






2 Mayıs 2017 Salı

Informix Database Server SQL'de Veri Aktarımı



      SQL Dilinde Database Sunucular Arası Veri Aktarımı:


SQL 'de iki database arası veri aktarımı yapmak diğer yöntemlere göre çok daha hızlı olduğundan 'big data' database işlemlerinde zaman kazanabiliriz.


ortak@deneme1domain adresindeki veritabanından, ortkod tablosunda tipleri 9008 ile 9017 arasında olan kayıtları, ortak@deneme2domain adresindeki veritabanının ortkod tablosuna ekleme işlemi şu şekilde yapılır:

insert into ortak@deneme2domain:ortkod
select * from ortak@deneme1domain:ortkod
where tip between 9008 and 9017