clientdataset runtime datatipi değiştirme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
mustafasoy
Üye
Mesajlar: 154
Kayıt: 02 Ağu 2013 05:00
Konum: istanbul
İletişim:

clientdataset runtime datatipi değiştirme

Mesaj gönderen mustafasoy »

selam , datasnap üzerinden verileri çekiyorum ve gelen beriler clientdataset içerisinde bulunuyor ,
ama sql server tarafından numeric veriler devexpresspivot gridde sorun çıkarıyor clientdataset içerisindeki bulunan ftFMTBcd datatiplerini ftfloat olarak cast etmek istiyorum ama sonuca varamadım
çözüm olarak sql sorgusunda numeric alanları cast(alanadi as float) olarak çözüm oluyor ama her sql için bunu yaptırmam zor görünüyor
if ClientDataSetx.Fields.Fields.DataType=ftFMTBcd then
begin
ClientDataSetx.Fields.Fields.DataType:=ftFloat;
end;
nasıl biz yol izlemeliyim ?
Nasıl ki Soru sorarak öğrendiyseniz , öğrendiklerinizi cevap vererek öğretiniz.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: clientdataset runtime datatipi değiştirme

Mesaj gönderen mrmarman »

bkz. DevExperss

- Ben kullanmıyorum ama senin için google taraması yaptım.
- PivotGridFieldBase.UnboundType Property'sini Decimal olarak değiştirmeyi bir dener misin.
bkz. DevExperss yazdı:It is possible to convert integer values to the float type using the ToFloat function "ToFloat([Value])". In addition, make sure that the PivotGridFieldBase.UnboundType Property is set to Decimal. It is also necessary to calculate unbound expressions at the summary level: Q285890: How to calculate custom values based on other field values
Resim
Resim ....Resim
Kullanıcı avatarı
mustafasoy
Üye
Mesajlar: 154
Kayıt: 02 Ağu 2013 05:00
Konum: istanbul
İletişim:

Re: clientdataset runtime datatipi değiştirme

Mesaj gönderen mustafasoy »

muharrem bey araştırma için teşekkürler , bu söylediğiniz propery .net versionunda olabilirmi acaba?
Nasıl ki Soru sorarak öğrendiyseniz , öğrendiklerinizi cevap vererek öğretiniz.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: clientdataset runtime datatipi değiştirme

Mesaj gönderen mrmarman »

Hocam
- Unbound fieldlar calculated field olarak bildiğimiz türleri ifade ediyor. Zaten sana verdiğim linkten de bakarsan Cross-Platform Core Libraries olarak uniseks kullanım söz konusu olarak anlıyorum. Yanlışım da olabilir ama dediğim gibi ben kullanmıyorum. Sadece okuduklarımdan takip ediyorum.

Kod: Tümünü seç

Cross-Platform Core Libraries > DevExpress.XtraPivotGrid > PivotGridFieldBase > UnboundType
Şimdi WinForm altında bunun yansımasını arıyoruz.
Bu link de orası oluyor.

Kod: Tümünü seç

WinForms Controls > DevExpress.XtraPivotGrid > PivotGridControl > CustomUnboundFieldData
Sonuç olarak :
Ağaç yapısı :

Kod: Tümünü seç

WinForms Controls > Controls and Libraries > Pivot Grid > Concepts > Providing Data > Unbound Data

Referans linki :
- Buradaki linkte çok güzel izah edilmiş.

Elimde bileşen seti olsa denerdim ama maalesef yok. Sadece yol göstermek konusunda yardımcı olmaya çalışıyorum.
Resim
Resim ....Resim
Kullanıcı avatarı
mustafasoy
Üye
Mesajlar: 154
Kayıt: 02 Ağu 2013 05:00
Konum: istanbul
İletişim:

Re: clientdataset runtime datatipi değiştirme

Mesaj gönderen mustafasoy »

ilginiz için teşekkürler ben biraz daha araştırayım
Nasıl ki Soru sorarak öğrendiyseniz , öğrendiklerinizi cevap vererek öğretiniz.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: clientdataset runtime datatipi değiştirme

Mesaj gönderen sabanakman »

Bende de bir zamanlar benzeri bir ihtiyaç doğmuştu. Anlık tuttuğum bazı basit bilgilerin yapısında değişiklik meydana gelmekte ama bu değişikliğe rağmen bilgileri aynı ClientDataSet ile açmam gerekmekteydi. Buradan da alan tipi değişikliğinin, (alan ekleme veya çıkarmanın) kayıtlı .cds dosyalarımı açabilmesi gerekmekteydi. Bulduğum çare ise alan tanımları olmayan boş bir başka ClientDataSet bileşeni üzerinde eski yapıda .cds kayıtlarımı açıp yeni yapıdaki ClientDataSet'e transfer ederek çözebilmiştim. Ekte gönderdiğim fonksiyon, ClientDataSet ile dosya arasında fark yoksa direkt dosyayı açmakta, fark varsa satırları tek tek ekleyerek sonuca gitmektedir.

Kod: Tümünü seç

function cdsLoadFromFile(const cds:TClientDataSet;DosyaAdi:String;const YenidenYapilandir:Boolean):Boolean;
{cds dosyasının dfm tanımı ile diskte kayıtlı dosyası arasında fark varsa farka
göre uyarlama yap. Yeniden yapılanmada ise kayıtlar fark varmış gibi tekrar ekleme yaptırılır}
var KendindenDosyaAdli:Boolean;
 procedure cdsAc;//ClientDataSet'te değişim olmayınca dosyadan direkt açılır!...
 begin
   if KendindenDosyaAdli then cds.LoadFromFile else cds.LoadFromFile(DosyaAdi);
 end;
var i:Integer; FarkVar, B:Boolean;
  tcds:TClientDataSet;
  tAln,Aln,aiAln,taiAln:TField;
begin
  tcds:=nil;
  KendindenDosyaAdli:=(DosyaAdi='') and (cds.FileName<>'');
  //Haricen verilen isim yoksa, kendi FileName özelliğinden yükleme yapılır!...
  if KendindenDosyaAdli then DosyaAdi:=cds.FileName;
  if FileExists(DosyaAdi) then begin//Dosya varsa mesele başlar
    if cds.FieldCount=0 then begin{ClientDataSet bileşeninde alanlar tanımlı
    değilse kontrol edilecek mesele yoktur, direkt aç}
      cdsAc;
    end else try//alanlar tanımlı ise, ince kontroller
      tcds:=TClientDataSet.Create(nil);
      tcds.LoadFromFile(DosyaAdi);
      FarkVar:=(tcds.FieldCount<>cds.FieldCount);//alan sayıları farklıysa fark olur
      aiAln:=nil; taiAln:=nil;
      for i:=0 to cds.FieldCount-1 do begin
        Aln:=cds.Fields[i];
        B:=Aln is TAutoIncField;//bu alan otomatik artan alan
        if B then aiAln:=Aln;//AutoInc alan değişkenine!...
        tAln:=tcds.FindField(Aln.FieldName);
        if Assigned(tAln) then begin//dosyada o alan varsa
          tAln.Tag:=Integer(Aln);//geçici bileşendeki Field'ın Tag'ına değerin yazılacağı alan ataması
          if B then taiAln:=tAln;//otomatik artan alana karşılık gelen dosyadaki alan
        end else FarkVar:=True;
      end;
      if not FarkVar then begin//alanlar arası fark var mı tek tek kontrol edilir!...
        i:=0;
        while (i<tcds.FieldCount) and not FarkVar do begin
          tAln:=tcds.Fields[i];
          Aln:=TField(tAln.Tag);
          if not Assigned(Aln) then FarkVar:=True//dosyadaki alana karşılık nesnemizde alan yoksa farklıdır
          else if (Aln is tAln.ClassType) or (tAln is Aln.ClassType) then begin
          //alan sınıfları birbirinden farklı değilse
            if (Aln.FieldName<>tAln.FieldName) or
             (Aln.DataType<>tAln.DataType) or
              (Aln.Size<>tAln.Size)
            then FarkVar:=True;//boyutu, tipi, alan adı farklılık kontrolü
          end else FarkVar:=True;//alan sınıfları birbirinden farklı
          Inc(i);
        end;
      end;
      if FarkVar or YenidenYapilandir then begin//alanlar arası ince kontrolden sonra fark var
        if Assigned(taiAln) then tcds.IndexFieldNames:=taiAln.FieldName;
        //otomatik artan alan varsa sıralama buna göre olsun!...
        for i:=0 to tcds.FieldCount-1 do begin //readonly yedekle
          tAln:=tcds.Fields[i];
          Aln:=TField(tAln.Tag);
          if Assigned(Aln) then begin//ReadOnly alanlar varsa yedekle, iptal et
            tAln.ReadOnly:=Aln.ReadOnly;
            Aln.ReadOnly:=False;
          end;
        end;
        tcds.First;
        if cds.Active then cds.EmptyDataSet else cds.CreateDataSet;
        while not tcds.Eof do begin//kayıtları teker teker aktar
          cds.Append;
          for i:=0 to tcds.FieldCount-1 do begin
            tAln:=tcds.Fields[i];
            Aln:=TField(tAln.Tag);
            if Assigned(Aln) then begin
              Aln.Assign(tAln);
            end;
          end;
          cds.Post;
          if not Assigned(aiAln) or not Assigned(taiAln) or (aiAln.AsInteger>=taiAln.AsInteger) then tcds.Next
          else cds.Delete;//otomatik artan alan uyuşmazlığı var, uyuşana kadar tekrar aktar!...
        end;
        for i:=0 to tcds.FieldCount-1 do begin //readonly okut
          tAln:=tcds.Fields[i];//ReadOnly alanları yedekten geri getir
          Aln:=TField(tAln.Tag);
          if Assigned(Aln) then Aln.ReadOnly:=tAln.ReadOnly;
        end;
      end else cdsAc;//alanlar arası ince kontrolden sonra da fark yok direkt açılabilir
    except
      on E:Exception do begin
        Application.MessageBox(PChar(Format('%s',[E.Message])),'Hata',MB_ICONERROR);
      end;
    end;
  end else try //Dosya yoksa mesele yok, boş tablo olarak açılır
    cds.Open;
  except
    on E:Exception do begin
      cds.CreateDataSet;
    end;
  end;
  Result:=cds.Active;
  if Assigned(tcds) then FreeAndNil(tcds);
end;
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
badkursat
Üye
Mesajlar: 84
Kayıt: 03 Mar 2014 08:58

Re: clientdataset runtime datatipi değiştirme

Mesaj gönderen badkursat »

DevExpresin ClientDataSet benzeri localde veri tutmak için dxMemData bileşeni var belkide cds yerine bu bileşeni kurcalayıp kullansanız daha iyi sonuç verir.
Kullanıcı avatarı
mustafasoy
Üye
Mesajlar: 154
Kayıt: 02 Ağu 2013 05:00
Konum: istanbul
İletişim:

Re: clientdataset runtime datatipi değiştirme

Mesaj gönderen mustafasoy »

şaban hocam birkaç kaynakta sizin anlattığınıza alternatif çözümler dikkatimi çekmişti inceleyip sonuç döneyim , teşekkürler
Nasıl ki Soru sorarak öğrendiyseniz , öğrendiklerinizi cevap vererek öğretiniz.
Cevapla