Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Attribute Bazlı ORM
#5
Konu başlığının Attibute kısmına her ne kadar uymasada, yazının devamı niteliğinde olabilecek, bir arkadaşın sorusu üzerine record tipi için map örneğini paylaşmak isterim.

Record tipi :
 TBL_STOK_KART = record
   ID: Int64; // bigint
   KODU: string; // varchar
   ADI: string; // varchar
   TUR: Byte; // tinyint
   BIRIMTUR: SmallInt; // smallint
   BIRIM: string; // varchar
   KDVTUR: SmallInt; // smallint
   KDVORAN: Currency; // money
   OTVTUR: SmallInt; // smallint
   OTVORAN: Currency; // money
   ABF1: Currency; // money
   ABF1KDVDHL: Boolean; // bit
   ABF2: Currency; // money
   ABF2KDVDHL: Boolean; // bit
   SBF1: Currency; // money
   SBF1KDVDHL: Boolean; // bit
   SBF2: Currency; // money
   SBF2KDVDHL: Boolean; // bit
   BARKOD: string; // varchar
   BARKODTUR: string; // varchar
   BARKODTARTILI: Boolean; // bit
   KRITIKMIKTAR: Currency; // money
   GRUP_KODU: string; // varchar
   ALTGRUP_KODU: string; // varchar
   MARKA: string; // varchar
   PLU: string; // varchar
   ABF3: Currency; // money
   ABF3KDVDHL: Boolean; // bit
   ABF4: Currency; // money
   ABF4KDVDHL: Boolean; // bit
   SBF3: Currency; // money
   SBF3KDVDHL: Boolean; // bit
   SBF4: Currency; // money
   SBF4KDVDHL: Boolean; // bit
 end;

Map işlemi yapan method.
procedure Map(AInstance: Pointer; ATypeInfo: PTypeInfo; ADataset: TDataSet); overload;
var
 DbValue: TValue;

 context: TRttiContext;

 rttiField: TRttiField;
 rttiFields: TArray<TRttiField>;
begin
 if not ADataset.Active then
   raise Exception.Create('Bağlantıyı aç uleyn');

 context := TRttiContext.Create;
 rttiFields := context.GetType(ATypeInfo).GetFields;

 if not Assigned(rttiFields) then
   Exception.Create('Field Bilgileri alınamadı');

 for rttiField in rttiFields do
 begin
   DbValue := TValue.FromVariant(ADataset.FieldByName(rttiField.Name).value);
   rttiField.SetValue(AInstance, DbValue);
 end;

 context.Free;
end;

Kullanımı:
var
 AStokKart: TBL_STOK_KART;
begin
 Map(@AStokKart, TypeInfo(TBL_STOK_KART), ADOQuery2);
end;

Ek olarak Delphi deki record tiplerinin C/C++ daki struct tipine karşılık geldiğini belirtmekte fayda var.


Her zaman dediğim gibi eksikler/yanlışlar var.
Geliştirmesi size kalmış...
One of the major software engineering challenges is managing change.
Cevapla


Bu Konudaki Yorumlar
Attribute Bazlı ORM - Yazar: kimimben - 01-10-2016, Saat: 11:56
Cvp: Attribute Bazlı ORM - Yazar: Fesih ARSLAN - 01-10-2016, Saat: 12:34
Cvp: Attribute Bazlı ORM - Yazar: barutali - 01-10-2016, Saat: 14:44
Attribute Bazlı ORM - Yazar: kimimben - 01-10-2016, Saat: 21:48
Attribute Bazlı ORM - Yazar: kimimben - 30-10-2016, Saat: 00:05
Cvp: Attribute Bazlı ORM - Yazar: barutali - 30-10-2016, Saat: 02:27
Cvp: Attribute Bazlı ORM - Yazar: kimimben - 30-10-2016, Saat: 14:18
Attribute Bazlı ORM - Yazar: Tuğrul HELVACI - 31-10-2016, Saat: 11:13
Cvp: Attribute Bazlı ORM - Yazar: edo - 31-10-2016, Saat: 16:34
Cvp: Attribute Bazlı ORM - Yazar: barutali - 31-10-2016, Saat: 16:49
Cvp: Attribute Bazlı ORM - Yazar: edo - 31-10-2016, Saat: 16:57
Cvp: Attribute Bazlı ORM - Yazar: kimimben - 31-10-2016, Saat: 20:58
Cvp: Attribute Bazlı ORM - Yazar: barutali - 31-10-2016, Saat: 21:36



Konuyu Okuyanlar: 1 Ziyaretçi