1

Konu: %%delta%% mantigi nasil calisiyor - Cetin Hocam

hocam asagidaki sana ait kodda TxtBox.lostfocus taki kodu ve .AddObject("myTextbox","myTextBox",;
          "thisform.txtToplam, %%delta%% * FatChild.Fiyat"+;
          ",thisform.txtMiktar, %%delta%%" )
kısmı biraz aciklarmisin

Visual Fox Pro
Public oForm

oForm = Createobject("myForm")
oForm.Show
 
Define Class myForm As Form
  DataSession = 2
  Top = 0
  Left = 0
  Height = 398
  Width = 426
  DoCreate = .T.
  Caption = "Form1"
  Visible = .T.
  Name = "Form1"
 
 
  Add Object txtpid As TextBox With ;
    Comment = "", ;
    ControlSource = "fatparent.pkid", ;
    Height = 23, ;
    Left = 108, ;
    TabIndex = 4, ;
    Top = 12, ;
    Width = 81, ;
    Name = "txtPid"
 
 
  Add Object lblpid As Label With ;
    AutoSize = .T., ;
    BackStyle = 0, ;
    Caption = "Pid", ;
    Left = 74, ;
    Top = 18, ;
    TabIndex = 3, ;
    Name = "lblPid"
 
 
  Add Object txtparentname As TextBox With ;
    Comment = "", ;
    ControlSource = "fatparent.fatname", ;
    Height = 23, ;
    Left = 106, ;
    TabIndex = 8, ;
    Top = 41, ;
    Width = 132, ;
    Name = "txtParentname"
 
 
  Add Object lblparentname As Label With ;
    AutoSize = .T., ;
    BackStyle = 0, ;
    Caption = "Parentname", ;
    Left = 28, ;
    Top = 44, ;
    TabIndex = 7, ;
    Name = "lblParentname"
 
 
  Add Object txtmiktar As TextBox With ;
    Alignment = 3, ;
    Value = 0, ;
    Height = 23, ;
    Left = 275, ;
    Top = 336, ;
    Width = 137, ;
    Name = "txtMiktar"
 
 
  Add Object txttoplam As TextBox With ;
    Alignment = 3, ;
    Value = 0, ;
    Height = 23, ;
    Left = 275, ;
    Top = 366, ;
    Width = 137, ;
    Name = "txtToplam"
 
 
  Add Object label1 As Label With ;
    Caption = "Toplam", ;
    Height = 17, ;
    Left = 227, ;
    Top = 366, ;
    Width = 43, ;
    Name = "Label1"
 
 
  Add Object label2 As Label With ;
    Caption = "Miktar", ;
    Height = 17, ;
    Left = 234, ;
    Top = 336, ;
    Width = 36, ;
    Name = "Label2"
 
 
  Add Object grid1 As Grid With ;
    ColumnCount = 4, ;
    AllowAddNew = .f., ;
    Height = 253, ;
    Left = 24, ;
    Top = 72, ;
    Width = 389, ;
    Name = "Grid1"
 
 
 
  Add Object commandgroup1 As CommandGroup With ;
    AutoSize = .F., ;
    ButtonCount = 4, ;
    Value = 1, ;
    Height = 37, ;
    Left = 264, ;
    Top = 24, ;
    Width = 144, ;
    Name = "Commandgroup1", ;
    Command1.AutoSize = .F., ;
    Command1.Top = 5, ;
    Command1.Left = 5, ;
    Command1.Height = 27, ;
    Command1.Width = 32, ;
    Command1.Caption = "<<", ;
    Command1.Name = "Command1", ;
    Command2.AutoSize = .F., ;
    Command2.Top = 5, ;
    Command2.Left = 39, ;
    Command2.Height = 27, ;
    Command2.Width = 32, ;
    Command2.Caption = "<", ;
    Command2.Name = "Command2", ;
    Command3.AutoSize = .F., ;
    Command3.Top = 5, ;
    Command3.Left = 73, ;
    Command3.Height = 27, ;
    Command3.Width = 32, ;
    Command3.Caption = ">", ;
    Command3.Name = "Command3", ;
    Command4.AutoSize = .F., ;
    Command4.Top = 5, ;
    Command4.Left = 107, ;
    Command4.Height = 27, ;
    Command4.Width = 32, ;
    Command4.Caption = ">>", ;
    Command4.Name = "Command4"
 
 
  Procedure parentchanged
    * Parent degistiginde normal olarak tableupdate() olacak veya revert
    * Boylece select-sql dogru sonuc verecek
    Tableupdate(2,.T.,'FatParent')
    Tableupdate(2,.T.,'FatChild')
    External Array arrToplam
    Select Sum(Fiyat*Miktar), Sum(Miktar) ;
      from FatChild ;
      where ParId = FatParent.PkId ;
      into Array arrToplam
    Thisform.txttoplam.Value = Iif(_Tally=0,0,arrToplam[1,1])
    Thisform.txtmiktar.Value = Iif(_Tally=0,0,arrToplam[1,2])
  Endproc
 
 
  Procedure Load
    Set Exclusive Off
    Set Multilocks On
    Set Deleted On
    Rand(-1)
    Create Cursor FatParent (PkId i,FatName c(10))
    Create Cursor FatChild (ParId i,Aciklama c(20), Fiyat i, Miktar i)
    Index On ParId Tag ParId
    For ix = 1 To 20
      lcParName = 'Test'+Padl(ix,3,'0')
      Insert Into FatParent Values (ix,lcParName)
      lnChilds = Int(Rand()*10)+1
      For jx = 1 To lnChilds
        Insert Into FatChild ;
          values ;
          (ix,lcParName+' - Item'+Padl(jx,2,'0'),;
          (Int(Rand()*10)+1)*1000,Int(Rand()*5)+1)
      Endfor
    Endfor
    CursorSetProp('Buffering',5,'FatParent')
    CursorSetProp('Buffering',5,'FatChild')
    Select FatParent
    Go Top
    Set Relation To PkId Into FatChild
  Endproc
 
 
  Procedure Init
    With Thisform.grid1
      .RecordSource = 'FatChild'
      .Columns(1).ControlSource = 'FatChild.Aciklama'
      With .Columns(2)
        .ControlSource = 'FatChild.Fiyat'
        .Header1.Caption = "Price"
        .AddObject("myTextbox","myTextBox",;
          "thisform.txtToplam, %%delta%% * FatChild.Miktar" )
        .CurrentControl="myTextbox"
        .myTextBox.Visible = .T.
      Endwith
      With .Columns(3)
        .ControlSource = 'FatChild.Miktar'
        .Header1.Caption = "Quantity"
        .AddObject("myTextbox","myTextBox",;
          "thisform.txtToplam, %%delta%% * FatChild.Fiyat"+;
          ",thisform.txtMiktar, %%delta%%" )
        .CurrentControl="myTextbox"
        .myTextBox.Visible = .T.
      Endwith
      .Columns(3).ControlSource = 'FatChild.Miktar'
      .Columns(4).ControlSource = '(FatChild.Fiyat*FatChild.Miktar)'
      .Columns(4).Header1.Caption = "ExtendedPrice"
    Endwith
    Thisform.parentchanged()
  Endproc
 
 
  Procedure grid1.AfterRowColChange
    Lparameters nColIndex
    If Empty(FatChild.ParId)
      Replace ParId With FatParent.PkId In 'FatChild'
    Endif
  Endproc
 
  Procedure commandgroup1.Valid
    Select FatParent
    Do Case
      Case This.Value = 1
        Go Top
      Case This.Value = 2
        Skip -1
        If Bof()
          Go Top
        Endif
      Case This.Value = 3
        Skip
        If Eof()
          Go Bottom
        Endif
      Case This.Value = 4
        Go Bottom
    Endcase
    Thisform.parentchanged()
    Thisform.Refresh
  Endproc
Enddefine
 
Define Class myTextBox As TextBox
  Calculation = ""
 
  Procedure Init
    Lparameters tcCalculationPairs
    This.Calculation = m.tcCalculationPairs
  Endproc
 
  Procedure GotFocus
    This.Tag = Transform(This.Value)
  Endproc
 
  Procedure LostFocus
    Local lnDelta,ix
    Local Array aCalculation[1]
    lnDelta = Evaluate(This.ControlSource) - Val(This.Tag)
    For ix=1 To Alines(aCalculation,This.Calculation,.T.,',')-1 Step 2
      With Evaluate(aCalculation[m.ix])
        .Value = .Value + ;
          Evaluate( Stuff(aCalculation[m.ix+1],;
          Atc('%%delta%%',aCalculation[m.ix+1]),Len('%%delta%%'),'m.lnDelta') )
      Endwith
    Endfor
  Endproc
Enddefine

2

Re: %%delta%% mantigi nasil calisiyor - Cetin Hocam

Soykan Abi; örnek için çok teşekkürler. Çetin Üstad yine döktürmüş.

Kodu anlamaya çalıştım ama bende anlamadım.

smile

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

3

Re: %%delta%% mantigi nasil calisiyor - Cetin Hocam

Ugur,
kod faturalama ya ornek ;
fatura dip toplami ve satirlarindaki degisiklikleri aninda diptoplama yansitmaya yonelik ve gereksiz arda arda toplam veya sql calistirmadan
sadece  parent PK degistiginde hesaplamayi yapan performans hedefleyen vede tutturan bir hedef ancak sordugum gibi 2 kisimdaki kod parcaciginin tam olarak olayi nasil yaptigini cozemedim smile

4

Re: %%delta%% mantigi nasil calisiyor - Cetin Hocam

Ben önce Textmerge ile bağlantı kurmaya çalıştım ama Çetin Üstad Textmerge de kullanmamış; Eval ile hafıza değişkenini oluştururken kullanmıştır diye düşündüm; orda da lnDelta olarak tanımlamış. Yorumları Çetin Üstad yapıcak artık. (Kendi adıma söylüyorum); Çetin Üstad'da insanı hemen hergün şaşırtıcak çok bilgi ve tip & tricks var smile

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

5

Re: %%delta%% mantigi nasil calisiyor - Cetin Hocam

Kod insanlardan esinlenerek yazilmis bir kod. Ne zaman hizlandirmam gereken yer olsa once insanlarin bilgisayarsiz bu isleri nasil yaptigini dusunuyorum. Insanlar yavas ama akilli:)
Orada sorun bir musterinin yuzlerce/binlerce kalemlik faturasi olabilir (olmaz da bu is sadece fatura icin degil). En ufak degisiklikte sum() kullanirsan yandin.  Eskiden defterler vardi, aldim verdim ben seni yendim kismi yaziliyordu satirlara. En altta ve sonraki sayfanin en ustunde "nakli yekun". O defterlerin birinde 10.sayfada bir hata farketsen, ne yapacaksin.  O satirdaki degisiklik ( delta ) sayfa sonu nakli yekune ve sonraki yekunlere yazilsa yeter. Sil bastan toplamiyorsun tum sayfalari. Bilgisayarda daha da avantajliyiz her sayfada yekun yok sadece bir tane yekun var. Isin ozu bu, simdi teknik detay:

Orada isi yapan textbox class'i. Calculation propertysinde obje Adi ve  yapilacak hesap yazili.
Ornegin fiyat icin (txtToplam etkileniyor her fiyat degisikliginde):

Calculation = "thisform.txtToplam, %%delta%% * FatChild.Miktar"

%%delta%% * FatChild.Miktar ile hesabi yap, sonucu thisform.txtToplam.Value'ya yaz,

Miktar icin (miktar degisikligi iki yeri etkiliyor - Toplam miktar (thisform.txtMiktar), toplam tutar (thisform.txtToplam):

Calculation = "thisform.txtToplam, %%delta%% * FatChild.Fiyat, thisform.txtMiktar, %%delta%%"

%%delta%% * FatChild.Fiyat sonucu thisform.txtToplam'a, %%delta%% ise thisform.txtMiktar'a yaz.



Ornegin miktar 5 olsun, fiyat da 5000 (tutar 25 000 - varsayalim diger satirlarla birlikte Toplam miktar 18, Tutar: 100 000).

Miktari degistirdigini dusun.
Calculation = "thisform.txtToplam, %%delta%% * FatChild.Fiyat, thisform.txtMiktar, %%delta%%"

Gotfocus'ta mevcut deger saklaniyor (5). Sen 3 yaptin. LostFocus'ta:

3-5 = -2 ( delta )


-2 * 5000 = -10 000

txtMiktar (Value = Value + delta) = 18 + (-2) = 16
txtToplam (Value = Value + delta * Fiyat) = 100 000 + (-2) * 5000 = 100 000 + (-10 000) = 90 000

6

Re: %%delta%% mantigi nasil calisiyor - Cetin Hocam

Üstad, çok teşekkür ederim. 3 kuruşluk aklımıda yedim ... smile

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

7

Re: %%delta%% mantigi nasil calisiyor - Cetin Hocam

Hocam Tesekkur gercekten buyuk kolaylik ,
hos ben kendimce bi cozum buldum sadece GotFocus  <>  LostFocus  ise SQL sum() yapiyor txtBox classta ama senin ki kadar performansli olmadigi kesin smile

Visual Fox Pro
&& gotfocus

With This As TextBox
    .Tag = Transform(.Value)
Endwith
 
&& lostfocus
With This As TextBox
    If .lCalbox
        If Thisform.addmode=.T.  Or Thisform.editmode=.T.
            If .Value # Val(.Tag)
                .calcMethod()
            Endif
        Endif
    Endif
Endwith

8

Re: %%delta%% mantigi nasil calisiyor - Cetin Hocam

cetinbasoz yazdı:

O satirdaki degisiklik ( delta ) sayfa sonu nakli yekune ve sonraki yekunlere yazilsa yeter. Sil bastan toplamiyorsun tum sayfalari. Bilgisayarda daha da avantajliyiz her sayfada yekun yok sadece bir tane yekun var. Isin ozu bu,...

Peki Üstad; yapılan her işlem sonucunda o anki reel yekünü kullanıyorsak; bu durumda göstermiş olduğun yöntem işe yaramaz diyebilirmiyiz yoksa farklı bir yöntem mi tavsiye edersin?!

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

9

Re: %%delta%% mantigi nasil calisiyor - Cetin Hocam

Reel yekun derken? Sanirim anlamadim.

10 Son düzenleyen, ugurlu2001 (06.10.2009 10:26:08)

Re: %%delta%% mantigi nasil calisiyor - Cetin Hocam

Arkadaşlar;  kodu çalıştırdıktan sonra,  grid içerisindeki "Quantity" ve "Price" kolonlarındaki tutarları değiştirmeyi deneyin, Çetin Üstad söyleyince ben yeni keşfettim smile

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

11

Re: %%delta%% mantigi nasil calisiyor - Cetin Hocam

Olay zaten oydu smile yani bu tip degisiklikler yapildiginda sql select calismiyor sadece parent degisince calisiyor ve boylece yapilan her degisiklik icin select sql calistirilmamis oluyor .

12

Re: %%delta%% mantigi nasil calisiyor - Cetin Hocam

Ben kodun genelindeki "record set" ( aktif record )  değiştiğindeki en alttaki caltulated field lara dikkat etmiştim.  Gerçekten şaşırtıcı derecede efektif ve Çetin Üstad 'a yakışır bir kod smile

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü