clientdataset runtime datatipi değiştirme
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
- mustafasoy
- Üye
- Mesajlar: 154
- Kayıt: 02 Ağu 2013 05:00
- Konum: istanbul
- İletişim:
clientdataset runtime datatipi değiştirme
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 ?
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.
Re: clientdataset runtime datatipi değiştirme
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.
- 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
- mustafasoy
- Üye
- Mesajlar: 154
- Kayıt: 02 Ağu 2013 05:00
- Konum: istanbul
- İletişim:
Re: clientdataset runtime datatipi değiştirme
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.
Re: clientdataset runtime datatipi değiştirme
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.
Şimdi WinForm altında bunun yansımasını arıyoruz.
Bu link de orası oluyor.
Sonuç olarak :
Ağaç yapısı :
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.
- 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
Bu link de orası oluyor.
Kod: Tümünü seç
WinForms Controls > DevExpress.XtraPivotGrid > PivotGridControl > CustomUnboundFieldData
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.
- mustafasoy
- Üye
- Mesajlar: 154
- Kayıt: 02 Ağu 2013 05:00
- Konum: istanbul
- İletişim:
Re: clientdataset runtime datatipi değiştirme
ilginiz için teşekkürler ben biraz daha araştırayım
Nasıl ki Soru sorarak öğrendiyseniz , öğrendiklerinizi cevap vererek öğretiniz.
- 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
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. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Re: clientdataset runtime datatipi değiştirme
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.
- mustafasoy
- Üye
- Mesajlar: 154
- Kayıt: 02 Ağu 2013 05:00
- Konum: istanbul
- İletişim:
Re: clientdataset runtime datatipi değiştirme
ş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.