Delphi Can

Orjinalini görmek için tıklayınız: MSSQL Dinamik sorgu oluşturup filitreleme yapmak.
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Sayfalar: 1 2
herkese kolaylıklar ve hayırlı cumalar diliyorum. Bir sorunum ama 2 sorum var. Konu hakkında görüş öneri ve yardımlarınızı rica ediyorum.

İlk Sorum 

Dinamik olarak bir sorgu oluşturmalıyım , aşağıdaki örnek olsun diye örnek bir tablo bunun gibi birkaç tablodan birkaç değeri toplayıp çarpıp bir sonuç bulacağım  
( biraz daha açıklayıcı olabilmesi adına maliyet hesabı yapacağım. ama bu maliyet reçete üzerinden yapılacağı için birkaç farklı tablo ve birkaç farklı hesap içeriyor. 
bu  yüzden bir fonksiyon yazarak sonucu buluyorum.)



EXMchj.png


tabloda 24,5 olarak görünen maliyet benim ilk ürün maliyetim 

Select kod,aciklama, dbo.urunmaliyetihesapla(kod) From urunlistesi

dediğimde  "Only functions and some extended stored procedures can be executed from within a function."   diyor  

Bu sorguyu çalıştırmak burdan maliyetlerinde olduğu bir sorgu elde etmek istiyorum  , sonrasında bunu Delphi üzerinden bir grid ile  kullanıcının girdiği değerlere göre filitrelemek istiyorum. Çok saçma veya olabilirliği konusunda emin değilim ama böyle birşeye ihtiyacım var ve bu konuda fikrinizi almak istiyorum. Maliyetler çok değişken olduğu için tabloda maliyet tutamıyorum o yüzden anlık hesaplamam gerekiyor.

Konu ile ilgili şöyle bir çözüm aklıma geldi ama açıkcası olabilir mi diye size danışmak istiyorum. Olamaz sa sizin önereceğiniz birşey var mı onu öğrenmek istiyorum.

Benim yapmayı düşündüğüm yol ürün listesi almadan önce ürünlistesini okuyup maliyet hesaplarını yapıp temp bir tablo oluşturmak ve bu temp dosyayı gride yükleyip filitreleme yapmak. Ama bu dosya oluşmadan bu işlem yapılabilirmi açıkcası onu merak ediyorum.

herkese teşekkür ediyorum , hayırlı kazançlar ve iyi çalışmalar diliyorum.
@Bay_Y Öncelikle bu yapmak istedikleriniz SP ile mümkün ve Kolay diyebilirim.
Son düşünceniz doğru yol fakat dikkat etmeniz gereken bir husus var
Kayıt sayılarınız büyüdükçe fonksiyon ile elde edeceğiniz süre oldukça uzayacaktır. "dbo.urunmaliyetihesapla(kod)"
Böyle bir durumda eğer imkan dahilinde ise maliyet hesabını SP içerisinde yapın yada maliyet hesabını yapan bir view oluşturup bunu SP içerisinde kullanın.
ayrıca temp tabloları ilk baştan filtre kriterleriniz varsa bunu uyguladıktan sonra oluşturup maliyet hesabına başlayın
"adelphiforumz " teşekkür ederim fikir ve önerileriniz için.
aslında maliyet hesabı yapan kısım başlı başına bir storeprocedure fakat listede gösterebilmek adına function a çevirdim ama çalışmadı farklı bir şekilde yapılabilir mi diya açıkcası denemek istedim.kayıt sayısına gelince doğru en büyük çekincem bu aslında her ne kadar kayıt sayısı şu an için az da olsa rakamların 1000 leri geçme ihtimali çok yüksek ve bu ihtimal de beni düşündürüyor. tekrar teşekkürler.
selamlar

aynı konu benim için geçmişte yaşadığım bir durumdu. Ben öncelikle, kullanılacak olan hammaddelerin listesinden yola çıkarak, maliyetlerini temp tabloya aktardım. Sonrasında, kullanılacak olan yarı mamüllerin tablosunu döndü ile geçerek, bağlı bulunduğu hammaddeleri gruplayarak fiyatlarını aldım. Sonrasında da, ana mamül kalemlerine bu fiyatları aktardım. Aynı şekilde işlemler yavaştı. Ancak stringgrid yerine dbgrid kullandım. Ayrıca veritabanı olarak mysql ve sqlite kullandım. Böylelikle her iki veritabanının tablolarında indexler oluşturdum. İndexleme yapmadan önce, işlem süresi 3 dakika sürüyor iken, indexleme sonrasında bu süre 50 sn. lere kadar düştü.
@Bay_Y Yine Maliyet hesabını bir SP içinde yap bu sp sonucunu diğer çağıracağın SP ye Output parametresi ile table olarak al
Sonra bunu yeni SP içerisinde kullan
değerli yorumlarınız için çok teşekkürler .
Merhaba 
Urun tablosundaki kod sutunu  unique (yani tekil) olduğunu varsayarak belirttiğiniz gibi bir sonuç almak için örnek  şöyle olmalı.

CREATE FUNCTION urunmaliyetihesapla(@kod int=null)
RETURNS FLOAT
AS
BEGIN

  DECLARE @gecicitablo TABLE (maliyet FLOAT)

  INSERT INTO @gecicitablo(maliyet)
  SELECT (h.miktar*h.fiyat+y.mihar*y.fiyat) --kendi hesaplamanız.6,25 hücreindeki formulu girin. null sorunu ile karsılasmamak için isnull() fonksiyonunu da kullanın
  FROM hammadde h
  JOIN yarimamul y on h.yarimamulid=y.id
  JOIN urun u on u.id=y.urunid
  WHERE u.kod=@kod

  RETURN
  (
    SELECT sum(maliyet)
    FROM @gecicitablo
  )
     
END


kullanırken söyle cağrımalısın

SELECT u.id,
        u.kod,
        u.aciklama,
        u.miktar,
        dbo.urunmaliyetihesapla(kod)  as maliyet
FROM urun u
Eğer hata varsa kusura bakma ama mantık olarak bir yol gösterecektir. Deneme imkanım olmadı.
Eğer sorun yaşarsan Team vs ile bağlanıp yardımcı olabilirim.

Kod:
SELECT ID,KOD,ACIKLAMA,SUM(HFIYAT) AS  HFIYAT,SUM(MIKTAR) AS MIKTAR  FROM (
SELECT URUN.ID,URN.KOD,URN.ACIKLAMA,YRM.MIKTAR , HMM.MIKTAR* HMM.FIYAT AS HFIYAT
JOIN YARIMAMUL YRM ON YRM.URINID = HMM.URUNID
JOIN URUN URN ON URN.ID = HMM.URUNID
FROM HAMMADDE HMM
) AS MALIYET
GROUP BY ID,KOD,ACIKLAMA
Vakit ayırıp cevap yazan herkese çok teşekkür ediyorum. Çok sağolun.
(19-10-2019, Saat: 09:42)Bay_Y Adlı Kullanıcıdan Alıntı: [ -> ]Vakit ayırıp cevap yazan herkese çok teşekkür ediyorum. Çok sağolun.

Sorunu ne şekilde çözdünüz Merak ettim Smile
Sayfalar: 1 2