1

Konu: bir formda 2 tablodaki verileri almak

2 tablom var
1. personel
2.sigorta tblosu

personeli formda 1 gridde liste olarak
containerde de griddeki aktif personelin bilgileri olarak gösteriyor

ben bir container daha eklemek istiyorum

SQL
sigorta                                                                                                                                                        

tablosu                                                                                                                                                       
sskno    fbno    yil    gun01    ucr01    ikr01    gun02    ucr02    ikr02    gun03    ucr03    ikr03    gun04    ucr04    ikr04    gun05    ucr05    ikr05    gun06    ucr06    ikr06    gun07    ucr07    ikr07    gun08    ucr08    ikr08    gun09    ucr09    ikr09    gun10    ucr10    ikr10    gun11    ucr11    ikr11    gun12    ucr12    ikr12
123    999    2010    30    1000.00    750.00    30    2000.00    750.00    30    3000.00    750.00    24    1000.00    750.00    30    1000.00    750.00    30    2000.00    750.00    5    250.00    300.00    30    1000.00    750.00    30    1000.00    750.00    30    1000.00    750.00    30    1000.00    750.00    30    1000.00    750.00
124    991    2010    30    1000.00    750.00    30    2000.00    750.00    30    3000.00    750.00    30    1000.00    750.00    30    1000.00    750.00    30    2000.00    750.00    30    1000.00    750.00    30    1000.00    750.00    30    1000.00    750.00    30    1000.00    750.00    30    1000.00    750.00    30    1000.00    750.00
123    999    2011    30    1000.00    750.00    30    2000.00    750.00    7    500.00    250.00    30    1000.00    750.00    18    950.00    500.00    11    600.00    400.00    30    2000.00    2000.00    30    1000.00    750.00    25    1000.00    750.00    30    1000.00    750.00    30    1000.00    750.00    30    1000.00    750.00
124    991    2011    30    1000.00    750.00    30    2000.00    750.00    30    3000.00    750.00    30    1000.00    750.00    30    2000.00    750.00    30    1000.00    750.00    30    2000.00    2000.00    30    1000.00    750.00    30    1000.00    750.00    30    1000.00    750.00    30    1000.00    750.00    30    1000.00    750.00



benim almak istediğim sonuç 2. containerde bir combo bu komboya seçilen 1. griddeki personelin sigorta tablosundaki olan kayıtlarının yılları
örnek 123 ssk nolu 999 fb nolu personeli 1.gridimde sectim
1.containerde sigortalının personel tablosundan bilgilerini görebiliyorum
2.containerde bu personele ait kayıtların  yil haneleri comboda 2010 ve 2011 görünecek
2. containerde bir grid yada benim blirleyeceğim yerde ilgili ayların bilgileri görünecek
yani
2.container görünümü aşşağıdaki
personel gridinde seçili olan personelin bilgileri sigortadan alınacak
önce en küçük yıllı olan kaydı comboda gösterecek
ben combodan seçincede istediğim yılın kaydını gösterecek

SQL
SSKNO        FBNO    

123        999   
 
COMBO 2010        SEÇİLİ OLAN     
    2011       
    GUN    UCRET    İKRAMİYE
1. AY    30    1000.00    750.00
2. AY    30    2000.00    750.00
3. AY    30    3000.00    750.00
4. AY    24    1000.00    750.00
5. AY    30    1000.00    750.00
6. AY    30    2000.00    750.00
7. AY    5    250.00    300.00
8. AY    30    1000.00    750.00
9. AY    30    1000.00    750.00
10. AY    30    1000.00    750.00
11. AY    30    1000.00    750.00
12. AY    30    1000.00    750.00
 
 
 
 
SSKNO        FBNO   
123        999   
 
COMBO 2010           
    2011    SEÇİLİ OLAN   
    GUN    UCRET    İKRAMİYE
1. AY    30    1000.00    750.00
2. AY    30    2000.00    750.00
3. AY    7    500.00    250.00
4. AY    30    1000.00    750.00
5. AY    18    950.00    500.00
6. AY    11    600.00    400.00
7. AY    30    2000.00    2000.00
8. AY    30    1000.00    750.00
9. AY    25    1000.00    750.00
10. AY    30    1000.00    750.00
11. AY    30    1000.00    750.00
12. AY    30    1000.00    750.00

2 Son düzenleyen, ugurlu2001 (10.03.2011 10:08:01)

Re: bir formda 2 tablodaki verileri almak

Moderom;

Çetin Üstad 'ın bir kodu var. Senin söylediğini ComboBox ile değilde "Radio Button" lar ile yapmış, "Radio Button" yerine "Combo" için ufak bir revize gerekiyor.

Fikir vermesi açısından yardımcı olur diye düşünüyorum.

Visual Fox Pro
*!*    Author : Cetin Basoz

 
PUBLIC oForm
oForm = CREATEOBJECT('filterSample')
oForm.Show()
 
DEFINE CLASS filterSample as Form
  DataSession = 2
 
  ADD OBJECT grdEmployee as grid WITH ;
    Left = 10,Top = 10, Height = 200, Width = 500
  ADD OBJECT optTitle as optionGroup WITH Left = 10, Top = 220
  ADD OBJECT optCountry as optionGroup WITH Left = 10, Top = 220
 
 
  PROCEDURE load
    USE (_samples+'data\employee')
  ENDPROC
 
  PROCEDURE init
    this.AddProperty('aTitles[1]')
    this.AddProperty('aCountries[1]')
    SELECT distinct title FROM employee WHERE !EMPTY(title) ;
      UNION ;
      select '--Hepsi--' as title FROM employee ;
      INTO ARRAY this.aTitles
 
    SELECT distinct country FROM employee WHERE !EMPTY(country) ;
      UNION ;
      select '--Hepsi--' as country FROM employee ;
      INTO ARRAY this.aCountries
 
 
    ASORT(this.aTitles)
    ASORT(this.aCountries)
 
    this.InitOptionGroups()
  ENDPROC
 
  PROCEDURE UpdateFilter
    DO case
      CASE this.optTitle.Value=1 AND this.optCountry.Value=1
    SET FILTER TO
      CASE this.optTitle.Value=1
    SET FILTER TO Country = thisform.aCountries[thisform.OptCountry.Value]
      CASE this.optCountry.Value=1
    SET FILTER TO Title = thisform.aTitles[thisform.optTitle.Value]
      OTHERWISE
    SET FILTER TO Title = thisform.aTitles[thisform.optTitle.Value] AND ;
      Country = thisform.aCountries[thisform.OptCountry.Value]
    endcase
    this.grdEmployee.Refresh
  ENDPROC
 
  PROCEDURE optTitle.Valid
    thisform.UpdateFilter()
  endproc
 
  PROCEDURE optCountry.Valid
    thisform.UpdateFilter()
  endproc
 
  PROCEDURE InitOptionGroups
    WITH this.optTitle
      .ButtonCount = ALEN( this.aTitles, 1 )
      FOR ix = 1 TO ALEN( this.aTitles, 1 )
        .Buttons[m.ix].Caption = this.aTitles[m.ix,1]
        .Buttons[m.ix].Autosize = .T.
      ENDFOR
      .AutoSize = .T.
      .Value = 1
    endwith
 
    WITH this.optCountry
      .Left = .Parent.optTitle.Left + .Parent.optTitle.Width + 10
      .ButtonCount = ALEN( this.aCountries, 1 )
      FOR ix = 1 TO ALEN( this.aCountries, 1 )
        .Buttons[m.ix].Caption = this.aCountries[m.ix,1]
        .Buttons[m.ix].Autosize = .T.
      ENDFOR
      .AutoSize = .T.
      .Value = 1
    ENDWITH
    this.Height = this.optTitle.Top + this.optTitle.Height + 10
    this.Width  = MAX(this.grdEmployee.Left + this.grdEmployee.Width,;
      this.optCountry.Left + this.optCountry.Width) + 10
    SELECT employee
    FOR ix=1 TO FCOUNT()
      IF FIELD(m.ix) == 'TITLE'
        this.grdEmployee.Columns(m.ix).ColumnOrder = 1
      endif
      IF FIELD(m.ix) == 'COUNTRY'
        this.grdEmployee.Columns(m.ix).ColumnOrder = 2
      endif
    endfor
  endproc
enddefine
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: bir formda 2 tablodaki verileri almak

Moderom,
Ilk defa ne istedigini anlasilacak bir bicimde gostermissin ve bir sorunun altinda uzayip giden baska soru yerine yeni baslik acmissin:) O yuzden ben de biraz zahmet edip cevap hazirladim. Yine de bazi sitemlerim var:

1) Veri ornegini oyle duz metin olarak yazmak yerine, bizim rahatlikla alip calistirabilecegimiz kod seklinde yazman daha iyi. Bunun icin bu forumda SampleDataToText (ya da SampleData2Text - tam hatirlamiyorum) diye hazir kod var. "Arama" ile onu bulup ve kullanirsan sevinirim.
2) Versiyonunu yazmiyorsun, Hadi ben VFP6 oldugunu biliyorum ama herkes bilemez. Sonra gonderilen koda calismiyor dersin.

Asagida iki parca kod var. 1.Parca'nin aslinda seninle ilgisi yok. Senin tablolarini cursor olarak olusturup kullanmak icin (o tablolar sende var bizde yok - o kodu aslinda sen yazip buraya koymaliydin).
2.parca ise form. Form kod seklinde, ama senin yapman gereken basitce, gorsel tasarladigin formundaki ilgili yerlere koddan copy&paste yapmak. Nasil yapacaginin detaylarini sanirim "foxpro 2.x'ten gecenler" benzeri bir baslik altinda detaylariyla anlatmistim. Onu bul oku gerekiyorsa.

Parca 1:

Visual Fox Pro
Create CURSOR SigortaTablosu (;

    sskno N, fbno N, yil N, ;
    gun01 N, ucr01 Y, ikr01 Y, ;
    gun02 N, ucr02 Y, ikr02 Y, ;
    gun03 N, ucr03 Y, ikr03 Y, ;
    gun04 N, ucr04 Y, ikr04 Y, ;
    gun05 N, ucr05 Y, ikr05 Y, ;
    gun06 N, ucr06 Y, ikr06 Y, ;
    gun07 N, ucr07 Y, ikr07 Y, ;
    gun08 N, ucr08 Y, ikr08 Y, ;
    gun09 N, ucr09 Y, ikr09 Y, ;
    gun10 N, ucr10 Y, ikr10 Y, ;
    gun11 N, ucr11 Y, ikr11 Y, ;
    gun12 N, ucr12 Y, ikr12 Y )
 
insert into SigortaTablosu values ;
    ( 123, 999, 2010, ;
    30, 1000.00, 750.00, 30, 2000.00, 750.00, 30, 3000.00, 750.00, 24, 1000.00, 750.00, ;
    30, 1000.00, 750.00, 30, 2000.00, 750.00, 5, 250.00, 300.00, 30, 1000.00, 750.00, ;
    30, 1000.00, 750.00, 30, 1000.00, 750.00, 30, 1000.00, 750.00, 30, 1000.00, 750.00)
insert into SigortaTablosu values ;
    ( 124, 991, 2010, ;
    30, 1000.00, 750.00, 30, 2000.00, 750.00, 30, 3000.00, 750.00, 30, 1000.00, 750.00, ;
    30, 1000.00, 750.00, 30, 2000.00, 750.00, 30, 1000.00, 750.00, 30, 1000.00, 750.00, ;
    30, 1000.00, 750.00, 30, 1000.00, 750.00, 30, 1000.00, 750.00, 30, 1000.00, 750.00)
insert into SigortaTablosu values ;
    ( 123, 999, 2011, ;
    30, 1000.00, 750.00, 30, 2000.00, 750.00, 7, 500.00, 250.00, 30, 1000.00, 750.00, ;
    18, 950.00, 500.00, 11, 600.00, 400.00, 30, 2000.00, 2000.00, 30, 1000.00, 750.00, ;
    25, 1000.00, 750.00, 30, 1000.00, 750.00, 30, 1000.00, 750.00, 30, 1000.00, 750.00 )
insert into SigortaTablosu values ;
    ( 124, 991, 2011, ;
    30, 1000.00, 750.00, 30, 2000.00, 750.00, 30, 3000.00, 750.00, 30, 1000.00, 750.00, ;
    30, 2000.00, 750.00, 30, 1000.00, 750.00, 30, 2000.00, 2000.00, 30, 1000.00, 750.00, ;
    30, 1000.00, 750.00, 30, 1000.00, 750.00, 30, 1000.00, 750.00, 30, 1000.00, 750.00)
SELECT distinct sskno, fbno FROM SigortaTablosu INTO CURSOR PersonelTablosu nofilter

Parca 2:

Visual Fox Pro
Public loForm

loForm = Createobject('MyForm')
loForm.Show()
 
Define Class myForm As Form
  Height=600
  Width =400
  Add Object grdPersonel As Grid With Height=200,Width=300,RecordSourceType=4,;
    recordSource='select sskno,fbNo from PersonelTablosu order by 1,2 into cursor crsPersonel nofilter',;
    deletemark=.F.,Splitbar=.F.,ScrollBars=2
  Add Object cmbYil As ComboBox With Top = 210, Width = 100, Style=2,;
    RowSourceType=3,RowSource='select distinct yil from SigortaTablosu order by 1 into cursor yillar'
  Add Object grdAylar As Grid With Height=300,Width=380, Top = 250, ;
  deletemark=.F.,Splitbar=.F.,ScrollBars=0,GridLines=2,Recordmark=.F.
 
 
  Procedure Init
    This.AyDataYarat()
    This.cmbYil.ListIndex = 1
    This.grdAylar.ColumnCount = -1
    This.grdAylar.RecordSourceType=4
    This.grdAylar.RecordSource = ;
      'select PADR(LTRIM(STR(ay))+". AY",6) as ay,gun,ucret,ikramiye'+;
      ' from AyData'+;
      ' where'+;
      '    sskno=crsPersonel.Sskno and'+;
      '    fbno=crsPersonel.Fbno and'+;
      '    yil = yillar.Yil'+;
      ' into cursor crsAyData nofilter'
  Endproc
 
  Procedure cmbYil.InteractiveChange
    Thisform.RefreshData()
  Endproc
 
  Procedure grdPersonel.AfterRowColChange
    Lparameters nColindex
    Thisform.RefreshData()
  Endproc
 
  Procedure RefreshData
    This.grdAylar.RecordSource = This.grdAylar.RecordSource
  Endproc
  Procedure AyDataYarat
    Create Cursor AyData (sskno i, fbno i, yil i, ay i, gun i, ucret Y, ikramiye Y)
    Local ix, lcAlanlar
    Local Array laData[1]
    For ix=1 To 12
      lcAlanlar = 'sskno, fbno, yil, '+;
        LTRIM(Str(m.ix))+','+;
        'gun'+Padl(m.ix,2,'0')+','+;
        'ucr'+Padl(m.ix,2,'0')+','+;
        'ikr'+Padl(m.ix,2,'0')
      Select &lcAlanlar From SigortaTablosu Into Array laData
      Insert Into AyData From Array laData
    Endfor
  Endproc
Enddefine

Not: Senin Sigorta tablosu bastan sakat bir yapida yaratilmis. Duzgun olsaydi, zaten AyData'nin kendisi olacakti. Yanlis hatirlamiyorsam bunu sana en basta soyledim ama bir kulagindan girip oburunden cikmis:( Onun yonetimi cok zor olur ya neyse kendi dusen aglamaz.

4

Re: bir formda 2 tablodaki verileri almak

cengiz abi procedure refreshdata ve aydatayarat bu odları nereye yazıcam formda

5 Son düzenleyen, ugurlu2001 (10.03.2011 19:19:51)

Re: bir formda 2 tablodaki verileri almak

Formun açıkken;

VFP menüsündeki

Form\New Method   ( Açılan penceye REFRESHDATA - onayla)

tekrardan

Form\New Method   ( Açılan penceye AYDATAYARAT - onayla)

Artık formunda kendinin oluşturduğu ve istediğin zaman kullanabileceğin ( kendine ait ) 2 METHOD un var. Properties penceresinde bu methodlara istediğin gibi kod ekleyebilirsin ...

( Bu arada Cengiz kim? ) 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ü

6

Re: bir formda 2 tablodaki verileri almak

pardon cetin aklım gitti vallahi ucmusum siz toparlıyonuz beni allah razı olsun sayenizde bişiler becerebildim diyebilirim. maliyeci adama kod yazmayı öğretiyorsunuz diyebilirim.

7

Re: bir formda 2 tablodaki verileri almak

Programcılık konusunda ismini anarken DUAYEN olarak  yadettiğim "Kaan Aslan"; "programcılık kondüsyon" işi derdi. Hız kesmeden devam et 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ü

8

Re: bir formda 2 tablodaki verileri almak

çalıştırdım cetin abi ancak formda ay bilgisinin içeriğini nasıl değiştirebilirim mesela ben personeli sectim prsonel gridinden
nasıl update yapabilirim

9 Son düzenleyen, moderom (10.03.2011 23:09:40)

Re: bir formda 2 tablodaki verileri almak

cetin abi öncelikle verdiğin kodu çalıştırdım ancak sorun kodları kendi programımın içerisine uygulamaya çalışınca hata verdi

hata kodu şu

Insert Into AyData From Array laData
Error : 39 
Numeric Overflow. Data was lost.
Method: Aydatayarat
Line : 11

10 Son düzenleyen, moderom (10.03.2011 23:14:29)

Re: bir formda 2 tablodaki verileri almak

acaba alan tanımlamalarında hatamı varki

Visual Fox Pro
Create Cursor AyData (sskno i, fbno i, yil i, ay i, gun i, ucret Y, ikramiye Y)

bu kodu

bu şekilde değiştirdim

Visual Fox Pro
Create Cursor AyData (sskno n, fbno c, yil n, ay n, gun n, ucret n, ikramiye n)


benim sigorta2 de tanımlı oldukları şekilde gene aynı hatayı verdi



birde şu kodu unutmuşum nereye yerleştireceğimi bilemedim

Visual Fox Pro
SELECT distinct sskno, fbno FROM SigortaTablosu INTO CURSOR PersonelTablosu nofilter

11

Re: bir formda 2 tablodaki verileri almak

n diye alan tanimlamasi olmaz. O alanlar parayi temsil ediyor. Para ile ilgili data tipi Y.

12

Re: bir formda 2 tablodaki verileri almak

anladım abi peki y currency denen tanımlamanın karşılığımı oluyor tam olarak anlayamadım

13

Re: bir formda 2 tablodaki verileri almak

Evet. F1 tusuna basarsan yardim dosyasi geliyor. Orada VFP data tiplerine bakabilirsin.

14

Re: bir formda 2 tablodaki verileri almak

birde abi sayısal taşma nedemek yukarıdaki hatayı ingilizcesini tercüme edem bakem ne demek diye böyle bişi yazıyor.

15

Re: bir formda 2 tablodaki verileri almak

numeric overflow sanıyorum olusan hata

sayisal alan yada hesaplama sonucunu field yapisi karsilamiyor... sigmiyor orn : inputmask 999,999.99 ama sonuc 123456789.00 gibi ise sigmaz *******.** gibi bir goruntu olusur.

16

Re: bir formda 2 tablodaki verileri almak

Y kullanman gerekirken niye N kullaniyorsun demek.