Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
TAdoQuery fkInternalCalc Fıeld
#1
Merhaba,

Çok uzun zamandır ClientDataset kullandığımız için TAdoQuery ile bu sorun nasıl çözülüyor bulamadım sormak istedim.

Select SECIM=0,* from TABLO1

Bu tabloda dönen SECIM kolonu readonly olarak geliyor, bunu kaldırıyorum ve FieldKind özelliğini fkInternalCalc yapıyorum (fkData olarakta kalsa benim açımdan sorun yok).
Bu tabloyu bir gride bağlıyorum ve SECIM kolonunu checkbox yapıyorum.
LockType özelliğide ltBatchOptimistic.

Alanı işaretliyorum ve 1 olduğunu görüyorum ama satır post olduğu an (veritabanına gitmiyor) alan tekrar orjinal değerine dönüyor.
Aynı şeyi string alanlar içinde yapıyor.
SQL ile eklediğim kolonları güncellemeye izin vermiyor TAdoQuery.

Biz bunu TQuery ile yapardık, Devart'ın UniQuery'si ile de yapabiliyorum onda da bir sorun olmuyor ama TAdoquery bunu kabul etmiyor.
fkInternalCalc'ın amacı zaten bu işlemler.

Nasıl yapılabileceği hakkında bilgisi olan var mı?

Teşekkürler.
Cevapla
#2
Kullandığınız grid TcxGrid ise bunların hiçbirine gerek yok
grid üzerinde bulunan check özelliğini aktif ederek cok daha hızlı ve performnslı bir chekc işlem yapabilirsiniz.
Filtrelemeler dahil olarak

procedure TForm1.FormCreate(Sender: TObject);
begin
 cxGrid1DBTableView1.OptionsView.Indicator := True;
 cxGrid1DBTableView1.OptionsSelection.CheckBoxPosition := cbpIndicator; //yada cbpFirstColumn
 cxGrid1DBTableView1.OptionsSelection.CheckBoxVisibility := [cbvDataRow, cbvColumnHeader];
 cxGrid1DBTableView1.OptionsSelection.MultiSelect := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 I, ARecIndex: Integer;
 AValue: Variant;
 sValue : String;
begin
   try
     for I := 0 to cxGrid1DBTableView1.Controller.SelectedRecordCount - 1 do
     begin
       if (I mod 25) = 0 then
         Application.ProcessMessages;
       ARecIndex := cxGrid1DBTableView1.Controller.SelectedRecords[I].RecordIndex;
       AValue    := cxGrid1DBTableView1.DataController.Values[ARecIndex, cxGrid1DBTableView1.GetColumnByFieldName('IdKurlar').Index];
       sValue := AValue;
       if (sValue <> '') then
           ListBox1.Items.Add(sValue);
     end;

   except
   end;
end;
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#3
(27-08-2019, Saat: 14:20)adelphiforumz Adlı Kullanıcıdan Alıntı: Kullandığınız grid TcxGrid ise bunların hiçbirine gerek yok
grid üzerinde bulunan check özelliğini aktif ederek cok daha hızlı ve performnslı bir chekc işlem yapabilirsiniz.
Filtrelemeler dahil olarak

procedure TForm1.FormCreate(Sender: TObject);
begin
 cxGrid1DBTableView1.OptionsView.Indicator := True;
 cxGrid1DBTableView1.OptionsSelection.CheckBoxPosition := cbpIndicator; //yada cbpFirstColumn
 cxGrid1DBTableView1.OptionsSelection.CheckBoxVisibility := [cbvDataRow, cbvColumnHeader];
 cxGrid1DBTableView1.OptionsSelection.MultiSelect := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 I, ARecIndex: Integer;
 AValue: Variant;
 sValue : String;
begin
   try
     for I := 0 to cxGrid1DBTableView1.Controller.SelectedRecordCount - 1 do
     begin
       if (I mod 25) = 0 then
         Application.ProcessMessages;
       ARecIndex := cxGrid1DBTableView1.Controller.SelectedRecords[I].RecordIndex;
       AValue    := cxGrid1DBTableView1.DataController.Values[ARecIndex, cxGrid1DBTableView1.GetColumnByFieldName('IdKurlar').Index];
       sValue := AValue;
       if (sValue <> '') then
           ListBox1.Items.Add(sValue);
     end;

   except
   end;
end;


Öncelikle cevabınız çin teşekkür ederim.

Ama benim sorum genel bir soru, konu checkbox eklemek degil, örnek olsun diye verdim.
Kullanıcının girebileceği ama tabloya ait olmayan fake bir kolonu TAdoQuery de nasıl ekliyoruz (daha doğrusu ekliyoruz da saklamasını nasıl sağlıyoruz).
Söylediğim gibi bunu diğer Query objelerinde rahatlıkla yapabiliyoruz ama Ado buna müsade etmiyor.

İyi çalışmalar.
Cevapla
#4
Oncelikle adoquery uzerinde sag fare fields editoru ac. Fields editor  Uzerinde sag fare new field tikla ve bir alan olustur. Ozeligini Calc (calculated) field olarak sececeksin. Yaptiktan sonra adoquery nin oncalc eventine girip deger atayabilirsin. Mesela adoquery1xxx.value:=12355 şeklinde kullanabilirsiniz.
Cevapla
#5
(27-08-2019, Saat: 15:32)serdar Adlı Kullanıcıdan Alıntı: Oncelikle adiquery uzerinde sag fare fields editoru ac. Fields editor  Uzeinde sag fare new filed tikla ve bir alan olustur. Ozeligini Calc field olarak sececeksin. Yaptiktan sonra adoquery nin oncalc eventine girip deger atayabilirsin. Mesela adoquery1xxx.value:=12355 şeklinde kullanabilirsiniz.

Merhaba,

Calc field ile kullanıcıya nasıl veri girdiriyorsunuz?

Sorumun başlığı fkInternalCalc değeri üzerine.
Sizin söylediğiniz gibi zaten olmaz.
Eğer çalışsa fkInternalCalc ile olur ama adoquery de bu çalışmıyor nedense.

Sanırım kimse veri girişi için Ado neslerini kullanmıyor o sebeple bu sorunu yaşayan kimse yok, bizde çalışmıyoruz ama bu sefer lazım oldu.

İyi çalışmalar.

(27-08-2019, Saat: 15:32)serdar Adlı Kullanıcıdan Alıntı: Oncelikle adiquery uzerinde sag fare fields editoru ac. Fields editor  Uzeinde sag fare new filed tikla ve bir alan olustur. Ozeligini Calc field olarak sececeksin. Yaptiktan sonra adoquery nin oncalc eventine girip deger atayabilirsin. Mesela adoquery1xxx.value:=12355 şeklinde kullanabilirsiniz.

Merhaba,

Calc field ile kullanıcıya nasıl veri girdiriyorsunuz?

Sorumun başlığı fkInternalCalc değeri üzerine.
Sizin söylediğiniz gibi zaten olmaz.
Eğer çalışsa fkInternalCalc ile olur ama adoquery de bu çalışmıyor nedense.

Sanırım kimse veri girişi için Ado neslerini kullanmıyor o sebeple bu sorunu yaşayan kimse yok, bizde çalışmıyoruz ama bu sefer lazım oldu.

İyi çalışmalar.
Cevapla
#6
Kullanıcı girişi yapacaksanız tablonuzu loctype ltBatchOptimistic olarak ayarladıktan sonra adoquery nin onpost ve ondelete eventlerınde guncellemeleri tabloya yansıtacak bir adocommand nesnesi çalıstırabılırsınız.
Cevapla
#7
Merhaba,

Herhalde ben sorumu tam soramadım.

Örneği değiştireyim.

Muhasebe fiş giriş ekranı yazıyoruz.
Detayları getirip bir gride basan AdoQuery nesnesi var.
Tablomuza anahtar alanarın dışında Hesap planı kodu , İzahat, Borç ve Alacak kolonları olduğunu varsayalım.
Tabi ekrana Hesabın adınıda basmanız lazım değil mi?

select *,HPLADI(select AD from HPL were HPLKODU=m.HPLKODU) from FisDetay as M

Verileri gertiridik.
Query nesnesi BatchOptmistik çalışıyor.

Query'e göre HPLADI kolonu redonly, kullanıcıda giriş yapmayacak doğru ama kullanıcı HPLKODU değerini değiştirdiği zaman girdiği HPL nin adını göstermek lazım.
HPLKODU validate eventinde veritananından girilen kod doğrumu diye kontrol ettik değilse hata verdik doğruysa adını aldık ve kaydın HPLADI kolonuna yazdık.
Bu alan OnPost ta server'a gitmeyecek onu ayarladık zaten tamamen fake bir field.
Bu bütün ekranlarımızda bin yıldır kullandığımız yöntem.
(LookUp kullanmıyoruz, bu tip tablolarda kayıt saysı çok fazla, HPL kodu kolonunda buton var basınca find ekranı açılıyor yada kullanıcı elle ezberden giriyor ve validate eventinde girilen değer veritabanından kontrol ediliyor)

sorun şu, Ado query HPLADI kolonuna değer yazmanıza müsade etmiyor, yazıyorsunuz satır post olduğu an ilgili alana veritabanından getirdiği orjinal değeri yazıyor.
Yani hesap 100 adı KASA olarak geldi, sonra kullanıcı gidip elle 102 yazıyor program veritabanından BANKA adını alıp HLPADI kolonuna yazıyor, değeri görüyorsunuz, satır post olunca (alt satıra inince, veritabanına gitmiyor local de porst oluyor sadece) HPL adı kolonu KASA olarak değişiyor tekrar.

Aynı işlemi TQuery ile yada TUniQuery ile yapabilirsiniz sorunsuz çalışır.
İlgili alan fkData olarak gelir ve istediğiniz gibi güncellersiniz.
Sadece veritabanına gitmemesini sağlamnız gerekir.
Eskiden TUpdateSql nesnesiyle yapardık, yeni componetlerde bunlara bile gerek yok Field nesnesi üzerinden InUpdate değerini False etmeniz yeterli.

Yani yapmak istediğim ekranlarda ko-ad kombinasyonu ile gelen her alanın Ad kısmını AdoQuery nesnesinde bir filed gibi tutmak ve kod değiştiğinde güncelleyebilmek.

Biz bunu bin yıldır yapıyoruz, sadece neden AdoQuery ile olmuyor yada nasıl olurun cevabını bulmaya çalışıyorum.

İyi çalışmalar.
Cevapla
#8
@meterci bu yazdıklarınızdan aklıma gelen bir yöntem
ADOQueryin OnCalcField kısmında eğer nesne edit edilmiş ise nesneyi doldurmak şeklinde olabilir düşüncesindeyim.
böylece her değişen hesap koduna göre değişien hesap adınıda değiştirmiş olursunuz.
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#9
kardes yanı yapmak ıstegın su mu acaba:
FisDetay tablosunda HPLKODU kodunu degıstırebılmek ve degıstıkten sonra HPL adını görmek ??
HPL adı anladıgım kadarıyla master bır tablodan gelıyor. Neden HPL adını detay tablosundan elle degıstırmeye calısıyorsun?
FisDetay tablosunda HPLKODU kodunu değiştirirsen (senin verdiğin örenekte hesap 100 adı KASA) bu sorgudaki (select *,HPLADI(select AD from HPL were HPLKODU=m.HPLKODU) from FisDetay as M) HPL otomatik değişir zaten.
Cevapla
#10
(27-08-2019, Saat: 16:31)adelphiforumz Adlı Kullanıcıdan Alıntı: @meterci bu yazdıklarınızdan aklıma gelen bir yöntem
ADOQueryin OnCalcField kısmında eğer nesne edit edilmiş ise nesneyi doldurmak şeklinde olabilir düşüncesindeyim.
böylece her değişen hesap koduna göre değişien hesap adınıda değiştirmiş olursunuz.

Merhaba,

Peki kaydı ilk çağırdığımızda hesabın adını nasıl göstereceğiz, çünkü ben select ile alanı getirsem bile fcCalculated olduğunda bu değeri kullanmıyor ve boş gösteriyor.
Query açıldıktan sonra her satır için oncalculate eventi çalışacak, 10bin satırlı bir açılış fişinde çok mantıklı olmaz sanırım, scrool ettikçe sql çalışması gerekir.

Peki siz nasıl yapıyorsunuz bu işlemleri, biz mi hatalı bir yöntem kullanıyoruz acaba?

Böyle bir ekran yazdığınızda kod alanları var yanlarında adları var (grid olduğunu düşünelim).
Kodlar değiştiğinde adında değişmesi gerekiyor.
Birtanede kod yok duruma göre birçok kod alanı var aynı satırda.

Bunlar için lookup field mı kullanıyorsunuz hep?
500bin lik bir müşteri tablosunda yada 100binlik bir hesap planı tablosunda lookup performansı nasıl oluyor yada müşteri verisi güncellendiyse bu lookupquery'sini güncellemek lazım.

Mesela müşteri seçildiğinde yanında adını, telefonunu, vergi numarasını, adresini gösteriyoruz diyelim.
Bunları lookupfield yapsak herbiri için lookup yapması gerekir ve bu bir grid ise ekranda görünen onlarca kayıt için ve bu 5 alan için bunu yapacak.

Biz bunları in-select'ler ile select çekerken getiriyoruz ve kod değiştiğinde validate eventinde bu alanarın yeni değelerini serverdan çekip güncelliyoruz.
Standart çalışma şeklimiz böyle.
Siz nasıl yapıyorsunuz bu işlemleri.


İyi çalışmalar.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  RTTI Field ile Sınıfa Nasıl Ulaşırım? 3ddark 4 3.454 16-11-2018, Saat: 18:08
Son Yorum: Tuğrul HELVACI
  Field Alignment, #pragma pack erkankurtaga 9 6.631 22-12-2017, Saat: 18:51
Son Yorum: savasabd
  [Çözüldü]Çözemediğim veri tabanı hatası (Cannot access field as type Text) musdi42 15 11.356 19-01-2017, Saat: 14:07
Son Yorum: yhackup



Konuyu Okuyanlar: 2 Ziyaretçi