1

Konu: Grid olan bir formda New, Save, Revert tuşu

1) Arkadaşlar grid olan bir formda New, Save, Revert tuşları yaptım ancak revert tuşunda tablerevert() kullandım ancak ekle tuşunda append blank'la eklediğim boş kaydı geri alıp silmiyor sadece veri değişikliğini geri alıyor ne yapabilirim ?

2) Ayrıca formda Combo ile seçim yaptırıyorum ve combo verileri bir tablodan alıyor (örn. Malzemeadi.malzemeadı) ve diğer tabloya kaydediyor (örn: kayıtlar.malzemeadi) tablosuna ancak ben malzemeadi tablosunda malzeme adını değiştirince kayıtlar.malzemeadi' nın da değişmesini istiyorum nasıl yapabilirim yardımcı olursanız şimdiden teşekkürler.

Saygılarımla,

2

Re: Grid olan bir formda New, Save, Revert tuşu

1. append blank tan sonra bir yerde tableupdate yapıyorsundur veya eğer record buffer kullanıyorsan bir yerde skip veya seek vs. kullanmışsındır.

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

3

Re: Grid olan bir formda New, Save, Revert tuşu

1) Buffer modunu kontrol et. Bence ideali 5.
4/5 ise TableRevert(), tableUpdate() ile senin kontrolun altinda olur. Diger modlarda sen farketmeden tableupdate() greceklesmesi isten bile degil.

2) Birseyi asla bir yerden alip baska bir yere yazma (nadiren aksi durumlar olabilir). Bu data tekrari (data redundancy) anlamina geliyor ve dizaynin gozden gecirilmesi gerektigine dair sinyal.

MalzemeAdi tablosunun anahtar (primary key) degerini, Kayitlar.MalzemeAdi olarak kaydet (Kayitlar.MalzemeAdi yabaci anahtar - foreign key).
Basit bir database yaratarak orneklemek gerekirse:

Visual Fox Pro
Create Database SampleDb

Local lcProc
TEXT to m.lcProc noshow
Procedure UniqueID
Local pGUID,rGUID
Declare Integer UuidCreate In 'RPCRT4.dll' String @pguid
Declare Integer StringFromGUID2 In 'Ole32.dll' ;
  string rguid, String @lpsz, Integer cchMax
 
pGUID=Replicate(Chr(0),16)
rGUID=Replicate(Chr(0),80)
 
UuidCreate(@pGUID)
StringFromGUID2(pGUID,@rGUID,40)
RETURN Strconv(Left(rGUID,76),6)
ENDTEXT
Strtofile(m.lcProc, 'tempProcs.prg')
Append Procedures From ('tempProcs.prg')
Erase ('tempProcs.prg')
 
Create Table malzemeAdi (malzemeKod c(38) Default UniqueID(), malzemeAdi c(50))
Alter Table 'MalzemeAdi' Add Primary Key malzemeKod Tag malzemeKod
Local ix
For ix=1 To 100
  Insert Into malzemeAdi (malzemeAdi) Values ('Malzeme #'+Padl(m.ix,3,'0'))
Endfor
 
Create Table kayitlar (kayitKod c(38) Default UniqueID(), malzemeKod c(38), diger c(30))
Index On malzemeKod Tag malzemeKod
Alter Table 'Kayitlar' Add Primary Key kayitKod Tag kayitKod
Alter Table 'Kayitlar' Add Foreign Key Tag malzemeKod References malzemeAdi Tag malzemeKod
CLOSE DATABASES all

Ornek icin database hazir. Onu kullanan grid, combo:

Visual Fox Pro
Public oForm

oForm = Createobject('myForm')
oForm.Show()
 
Define Class myForm As Form
  DataSession = 2
  Height = 500
  Width = 600
 
  Add Object grdKayit As Grid With ;
    height=450, Width=600,Anchor=10, RowHeight = 30, RecordSource='kayitlar'
  Add Object cmdAdd As CommandButton With ;
    left=10,Top=460,Width = 75, Height=30, Caption = 'Ekle'
  Add Object cmdSave As CommandButton With ;
    left=90,Top=460,Width = 75, Height=30, Caption = 'Sakla'
  Add Object cmdRevert As CommandButton With ;
    left=170,Top=460,Width = 75, Height=30, Caption = 'Geri Al'
 
  Procedure Load
    Set Multilocks On
    Use kayitlar
    CursorSetProp("Buffering",5,'kayitlar')
  Endproc
 
  Procedure Init
    This.grdKayit.Columns(1).Enabled = .F.
    With This.grdKayit.Columns(2)
      .AddObject('cmbMalzeme','ComboBox')
      .CurrentControl = 'cmbMalzeme'
      .Sparse = .F.
      With .cmbMalzeme
        .RowSourceType = 3
        .RowSource = 'select malzemeAdi,malzemeKod from MalzemeAdi into cursor crsMalzeme'
        .Style = 2
        .ColumnCount = 2
        .BoundColumn = 2
        .ColumnWidths = "200,0"
        .Visible = .T.
      Endwith
    Endwith
  Endproc
 
  Procedure cmdAdd.Click
    Insert Into kayitlar (diger) Values ("")
    Thisform.Refresh
    Thisform.grdKayit.SetFocus
  Endproc
 
  Procedure cmdSave.Click
    Tableupdate(2,.T.,'kayitlar')
    Thisform.Refresh
  Endproc
 
  Procedure cmdRevert.Click
    Tablerevert(.T.,'kayitlar')
    Thisform.Refresh
  Endproc
Enddefine

4

Re: Grid olan bir formda New, Save, Revert tuşu

hiçbir zaman isim ve kod alanlarını key olarak kullanma. tablo yapın şöyle olsun:
mesela malzeme kartı:
key numeric 10
kod char 20
adi char 50

kayıtlar tablosu:
key numeric 10
malzemekey numeric 10

gibi

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

5

Re: Grid olan bir formda New, Save, Revert tuşu

Cevaplarınız için öncelikle çok teşekkür ederim peki combo da sadece malzeme adı görülsün ancak seçim yapılınca kayıtlar.key alanına seçilen malzemenin keyini girmesini nasıl sağlarız.

6

Re: Grid olan bir formda New, Save, Revert tuşu

Burak,
Tekrar sormadan once ornek kodları calistirmayi denesen?

7

Re: Grid olan bir formda New, Save, Revert tuşu

Çetin Bey

Biraz tembellik yaptım hazıra konayım dedim yardımlarınız için tekrar teşekkür ederim iyi çalışmlar.

8

Re: Grid olan bir formda New, Save, Revert tuşu

Iyi ama benim demek istedigim orada hazir zaten:) Hic calistirmadigini cikardim sorudan.

9

Re: Grid olan bir formda New, Save, Revert tuşu

Hayır yanlış anlama olmasın ben kodları çalıştırdım ancak combo create edilirken sparse'ı bilmiyordum kodları inceleyince deneme yanılma metodu ile ögrendim herkese çok çok teşekkür ederim. İyi çalışmalar, bu arada forum bazen bakıma giriyor bi sorun mu var yapabileceğimiz bir yardım var mı ?