Delphi Dünyası Facebook'ta

Kodbank İndir

! CODEBANK 2012 !

İNDİRMEK&DETAYLI BİLGİ ALMAK İÇİN BURAYI TIKLAYINIZ.

Gönderen Konu: Yürüyen Bakiye hk.  (Okunma sayısı 770 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı barutali

  • Administrator
  • *****
  • İleti: 2.229
  • Rep: +55/-0
  • Cinsiyet: Bay
  • Falan filan ...
  • Delphi Sürümü: 2010 - XE2
Yürüyen Bakiye hk.
« : 18 Temmuz 2011 15:19:28 »
Merhabalar;

MSSQL de Cari Hareket tablomdaki kayıtları Yürüyen bakiye şeklinde göstermem gerekiyor. Fakat SQL Cümlesini bir türkü kuramadım.

Tablo yapısında falan filan alanların yanında BORC - ALACAK - BAKIYE adında 3 alan var.

Aşağıdaki gibi bir türlü gösteremedim :(
BORC                  ALACAK              BAKIYE
 100                       0                      - 100
 100                       0                      - 200
   0                       100                    - 100
 
Herkese teşekkürler..



Amatör Küme Programcı

Çevrimdışı omurolmez

  • Delphi 4 Level 3
  • ***
  • İleti: 177
  • Rep: +0/-0
  • Cinsiyet: Bay
  • Delphi Sürümü: Delphi 6
Ynt: Yürüyen Bakiye hk.
« Yanıtla #1 : 19 Temmuz 2011 09:05:15 »
Ali Bey bunu tek bir SQL cümlesi ile yapmak mümkün değil. Bir stored procedure içinde cursor kullanmak gerekiyor.
Ömür Ölmez

Çevrimdışı barutali

  • Administrator
  • *****
  • İleti: 2.229
  • Rep: +55/-0
  • Cinsiyet: Bay
  • Falan filan ...
  • Delphi Sürümü: 2010 - XE2
Ynt: Yürüyen Bakiye hk.
« Yanıtla #2 : 19 Temmuz 2011 10:47:24 »
Cevabınız için teşekkür ederim. Konuyla ilgili örnek verebilirmisiniz?



Amatör Küme Programcı

Çevrimdışı sabanakman

  • Global Moderatör
  • *****
  • İleti: 796
  • Rep: +13/-0
  • Cinsiyet: Bay
  • Delphi Sürümü: e) Hepsi
Ynt: Yürüyen Bakiye hk.
« Yanıtla #3 : 19 Temmuz 2011 15:03:55 »
Sirano gibi bir alan varsa ve listelemede görünecek çok aşırı miktarda kayıt yoksa
Kod: [Seç]
select *, (select sum(isNull(Borc,0)-isNull(Alacak,0)) from Hareket as alt where alt.MUS_ID=ana.MUS_ID and alt.Sirano<ana.Sirano) as Bakiye from Hareket as ana where MUS_ID=100 order by SiraNoşeklinde bir sorgu iş görebilir.
« Son Düzenleme: 19 Temmuz 2011 15:05:18 by sabanakman »
Şaban Şahin AKMAN

Derin olan kuyu değil kısa olan iptir

Çevrimdışı barutali

  • Administrator
  • *****
  • İleti: 2.229
  • Rep: +55/-0
  • Cinsiyet: Bay
  • Falan filan ...
  • Delphi Sürümü: 2010 - XE2
Ynt: Yürüyen Bakiye hk.
« Yanıtla #4 : 19 Temmuz 2011 17:14:31 »
cevaplar için teşekkür ederim.. Sorunu CXGrid in sayesinde çok basit ve çok hızlı şekilde çözdüm..

kullanılan function

Kod: [Seç]
function GetSummaryValue(Data: TcxGridViewData; RowIndex, ColIndex: Integer): Double;
var
  I: Integer;
begin
  Result := 0;
  for I := RowIndex downto 0 do
    if Data.Rows[I].IsData then
      Result := Result + Data.Rows[I].Values[ColIndex]
    else
      Break;
end;


aşağıdaki koduda hangi kolonda göstermek istiyorsak onun GetDisplayText olayına yazıyoruz..

Kod: [Seç]
const
  ValueColumnFieldName = 'BAKIYE'; // tablodaki bakiye alanımın adı
var
  Col: TcxCustomGridTableItem;
begin
  with Sender.GridView do
  begin
    Col := TcxDBDataController(DataController).GetItemByFieldName(ValueColumnFieldName) as TcxCustomGridTableItem;
    AText := Format('%m', [FP.GetSummaryValue(ViewData as TcxGridViewData, ARecord.Index, Col.Index)]);
  end;


NOT : CXGRID in GRIDMODE özelliği False olması gerekiyor..



Amatör Küme Programcı

Çevrimdışı omurolmez

  • Delphi 4 Level 3
  • ***
  • İleti: 177
  • Rep: +0/-0
  • Cinsiyet: Bay
  • Delphi Sürümü: Delphi 6
Ynt: Yürüyen Bakiye hk.
« Yanıtla #5 : 21 Temmuz 2011 10:33:24 »
Bir kaç gündür giremedim siteye. Yürüyen bakiye için örnek sp (Firebird/Interbase):

Kod: [Seç]
CREATE TABLE BILESEN_HAREKET
(
  STOK_ID Integer NOT NULL,
  BILESEN_ID Integer NOT NULL,
  TARIH_SAAT Timestamp NOT NULL,
  MIKTAR Float NOT NULL,
  BAKIYE Float NOT NULL,
  STOK_DETAIL_ID Integer,

  CONSTRAINT PK_BILESEN_HAREKET PRIMARY KEY (STOK_ID,BILESEN_ID,TARIH_SAAT)
);

Kod: [Seç]
SET TERM ^ ;
CREATE PROCEDURE SP_BILESEN_HAREKET (
    BILESEN_ID_ Integer,
    TARIH1 Timestamp,
    TARIH2 Timestamp )
RETURNS (
    BILESEN_ID Integer,
    TARIH_SAAT Timestamp,
    MIKTAR Decimal(18,4),
    GIR Decimal(18,4),
    CIK Decimal(18,4),
    BAKIYE_GIR Decimal(18,4),
    BAKIYE_CIK Decimal(18,4),
    BAKIYE_GEN Decimal(18,4) )
AS
--declare variable bakiye_gen         decimal(18, 4);
--declare variable bakiye_gir         decimal(18, 4);
--declare variable bakiye_cik         decimal(18, 4);
begin
 bakiye_gen = 0;
 bakiye_gir = 0;
 bakiye_cik = 0;
 bilesen_id = bilesen_id_;
 if(:tarih1 is null) then
   select min(tarih_saat)
     from bilesen_hareket
     where bilesen_id = :bilesen_id
     into :tarih1;
   else begin
   select
     sum(miktar)
     from bilesen_hareket
     where miktar>0 and bilesen_id = :bilesen_id and tarih_saat < :tarih1
     into :bakiye_gir;
   select 
     sum(miktar)
     from bilesen_hareket
     where miktar<0 and bilesen_id = :bilesen_id and tarih_saat < :tarih1
     into :bakiye_cik;
   end --else begin
     
 if(:tarih2 is null) then
   tarih2 = CURRENT_TIMESTAMP;
 for
   select
     tarih_saat, miktar
     from bilesen_hareket
     where bilesen_id = :bilesen_id and tarih_saat between :tarih1 and :tarih2
     order by tarih_saat
     into :tarih_saat, :miktar
 do begin
   if(miktar>0) then
     gir =miktar; else
     gir =0;
   if(miktar<0) then
     cik =miktar; else
     cik =0;
   bakiye_gir =bakiye_gir + gir;
   bakiye_cik =bakiye_cik + cik;
   bakiye_gen =bakiye_gen + miktar;
   suspend;
   end
end^
SET TERM ; ^
Ömür Ölmez

Çevrimdışı selchuk

  • Delphi 6 Level 3
  • ***
  • İleti: 274
  • Rep: +0/-0
  • Cinsiyet: Bay
    • Arma Ticari Sistem
Ynt: Yürüyen Bakiye hk.
« Yanıtla #6 : 24 Temmuz 2011 03:37:11 »
Bu konuyla ilgili Şaban Hocayla bayağı bir yazışmıştık.
Benzersiz bir alan olursa ona göre hesaplatılabiliyor.

Konu linki : http://www.delphidunyasi.net/veri-taban305-sorular305/running-sum-(yuruyen-bakiye)-hakinda-yardim/msg35227/?topicseen#msg35227
Knowledge is power (Bilgi Güçtür)

Çevrimdışı akuyumcu63

  • Delphi 2 Level 1
  • *
  • İleti: 51
  • Rep: +0/-0
Ynt: Yürüyen Bakiye hk.
« Yanıtla #7 : 25 Aralık 2011 18:19:52 »
merhaba;
cxgrid'in hareketli bakiye örneğini birebir uyguladım. aşağıda yazmış olduğum hatayı olmaktan kurtulamadım. yardımcı olabilirmisiniz. 

hata mesajı;
Project FLOYNTM.exe raised exception class EAccessViolation with message 'Access violation at address 009603FA in module 'FLOYNTM.exe'. Read of address 0000007C'. Process stopped. Use Step or Run to continue.

Çevrimdışı selchuk

  • Delphi 6 Level 3
  • ***
  • İleti: 274
  • Rep: +0/-0
  • Cinsiyet: Bay
    • Arma Ticari Sistem
Ynt: Yürüyen Bakiye hk.
« Yanıtla #8 : 25 Aralık 2011 20:11:49 »
Dostum ben normal db girid kullanıyorum.
SiraNo isimli bir alan oluşturdum. Her rapor alışında tarihe göre sorgulayıp sıra no alanını 1 'den başlayarak arttırıyorum ve sonra aşağıdaki kodla yürüyen bakiye alabiliyorum.

// SiraNo(Integer) alanı eklenip numaralandıktan sonra sonuç doğru çıkıyor
Select * , (select iif(isNull(Sum(Borc)),0,Sum(Borc)) - iif(isNull(Sum(Alacak)),0,Sum(Alacak)) from ChHareketleri where  SiraNo<=bb.SiraNo And ChKod=bb.ChKod) As Bakiye from ChHareketleri bb
Where ChKod='''+KutuChKod.Text+''' Order By Tarih Asc
Knowledge is power (Bilgi Güçtür)

Çevrimdışı akuyumcu63

  • Delphi 2 Level 1
  • *
  • İleti: 51
  • Rep: +0/-0
Ynt: Yürüyen Bakiye hk.
« Yanıtla #9 : 26 Aralık 2011 09:26:37 »
merhaba;
aşağıdaki link' te HAREKETLE BAKİYE örneği var. bu örnekte cxGrid kullanılarak yapılan bir bakiye hesaplaması var. örnek dosyadaki çalışıyor ancak örneği yazdığım programa uygulayamadım. incelemenizi tavsiye ederim.

http://www.delphiturkiye.com/forum/viewtopic.php?f=19&t=21977&p=164196&hilit=cxgrid+hakk%C4%B1nda#p164196

örneklerin bulunduğu rapid linki
http://rapidshare.com/files/77268887/CxGrid_Hakk__305_nda.rar