1

Konu: select ve null

Visual Fox Pro
SET NULLDISPLAY TO "0"

LOCAL tarihigecenler,biraykalanlar,aylar
SELECT YEAR(tarih) ,MONTH(tarih) DISTINCT FROM hst  WHERE !EMPTY(tarih) Group By 1,2 INTO CURSOR seneler1
m.aylar=RECCOUNT('seneler1')
SELECT ilaclar,giren,cikan, doz stok,gurup FROM ilaclar WHERE doz>0 ORDER BY ilaclar INTO CURSOR ilacgenel READWRITE
Select ilaclar,Sum(miktar) As ilkdort From hst WHERE (MONTH(tarih)=>1 and  MONTH(tarih)<4) Group By 1 INTO CURSOR bir
Select ilaclar,Sum(miktar) As ortadort From hst WHERE (MONTH(tarih)=>4 and  MONTH(tarih)<8) Group By 1 INTO CURSOR iki
Select ilaclar,Sum(miktar) As sondort From hst WHERE MONTH(tarih)=>8 Group By 1 INTO CURSOR son
select * from ilacgenel;
LEFT JOIN bir;
on ilacgenel.ilaclar=bir.ilaclar ;
LEFT JOIN iki;
on ilacgenel.ilaclar=iki.ilaclar;
LEFT JOIN son;
on ilacgenel.ilaclar=son.ilaclar;
INTO CURSOR ilacgenel1
SELECT ilaclar_a ilaclar,giren,cikan, stok,ilkdort,ortadort,sondort,(ilkdort+ortadort+sondort) toplam,(ilkdort+ortadort+sondort)/m.aylar ortalama ,gurup,0 aciklama FROM ilacgenel11;
    INTO CURSOR ilacgenel1 READWRITE


kayıtlardaki null değerlerden dolayı toplam ve ortalama sütünları nullu kayıtlarda çalışmıyor....
Bunu basitçe düzeltmenin bir yolu varmı ?
yoksa tektek kayıtlara replacemi yapmalıyım ?

şimdiden teşekkürler

2 Son düzenleyen, ugurlu2001 (12.11.2012 18:17:23)

Re: select ve null

Select tümceciklerinde NVL() kullanırsan sorunun hallolur. Forumda bir çok örnek var...


http://www.fox4um.com/topic/2253/dosyalari-birlestirme/

http://www.fox4um.com/topic/2253/dosyalari-birlestirme/

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: select ve null

fox için NVL() olan SQL tarafı için ISNULL() olarak kullanılıyor.

VFP9 SP2

4 Son düzenleyen, Gökçe Özçınar (12.11.2012 18:57:14)

Re: select ve null

Selamlar.
Tam benzer bir soru için forma girince bu konu ile karşılaştım. Bende de benzer bir durum var.
SELECT SUM(sh_cik) FROM &_shar WHERE sh_ad=bakara INTO ARRAY cik_toplami ile toplam alıyorum ama aldığım toplamı bir nümerik değikene atayamıyorum....  yazacakken NLV() işimi gördü. Yukarıdaki örnekte bununla ilgili örnek vermişsiniz. ama bunu kendi koduma yerleştiremedim. yardımcı olursanız sevinirim.
SELECT SUM(sh_cik) FROM &_shar WHERE sh_ad=bakara INTO ARRAY cik_toplami    <<< burada cik_toplami'nı nümerik olarak sonradan kullanmak isitiyorum.
Şimdiden teşekkür ederim.

5

Re: select ve null

Avrasya34,
Bence NULL degerlere dokunma. Eger NULL olarak bırakırsan toplama ve ortalama degerlerin doğru çıkar. Aksi takdirde bilinmeyen değerler 0 olarak ortalamaya alınır (toplamda etkisiz ama ortalama için önemli).

Gökçe,

Visual Fox Pro
local ARRAY cik_toplami[1]

SELECT SUM(sh_cik) FROM (m._shar) WHERE sh_ad=m.bakara INTO ARRAY cik_toplami
 
thisform.txtNumerik.Value = nvl(cik_toplami[1], 0)

6

Re: select ve null

Zaman ayıran tüm hocalarıma teşekkürler...

cetinbasoz yazdı:

Avrasya34,
Bence NULL degerlere dokunma. Eger NULL olarak bırakırsan toplama ve ortalama degerlerin doğru çıkar. Aksi takdirde bilinmeyen değerler 0 olarak ortalamaya alınır (toplamda etkisiz ama ortalama için önemli).

Hocam benim sorunum null değerlerin olduğu satırlarda toplam satırınında null çıkmasıydı. NVL ile bunu düzelttim. ama dediğiniz gibi ortalamalarda "0" değerler anlam ifade edecek sad

7

Re: select ve null

Null'in toplami Null degil mi zaten:)

8

Re: select ve null

select ilkdort,ortadort,sondort,(ilkdort+ortadort+sondort) toplam from ilacgir11
griddeki satırlar
ilkdort=1
ortadort=null
sondort=3
toplam=null

oysa toplam=4 olması lazım

9

Re: select ve null

Biraz dusunup ve de koduna bakmadan sallamisim kusura bakma. Koduna bakmamistim "ortalama" lafi kafami karistirdi - bahane:)
Simdi koduna bakinca problemini anladim sanirim. Sum() yeni davranisi boyle. Uyan kayit yoksa NULL geliyor. Soyle bir kod olsa nasil olurdu:

Visual Fox Pro
Set NullDisplay To "0"

Local tarihigecenler,biraykalanlar,aylar
Select Year(tarih) ,Month(tarih) Distinct From hst  Where !Empty(tarih) Group By 1,2 Into Cursor seneler1
m.aylar=Reccount('seneler1')
 
Select ilaclar,giren,cikan, doz stok,gurup From ilaclar Where doz>0 Order By ilaclar Into Cursor ilacgenel Readwrite
Select ilaclar, ;
    Sum(Iif( Month(tarih)=>1 And  Month(tarih)<4 , miktar, 0) As ilkdort, ;
    Sum(Iif( Month(tarih)=>4 And  Month(tarih)<8 , miktar, 0) As ortadort, ;
    Sum(Iif( Month(tarih)=>8, miktar, 0) As sondort ;
    From hst ;
    Group By 1 ;
    INTO Cursor bir
 
Select * From ilacgenel;
    LEFT Join bir;
    on ilacgenel.ilaclar=bir.ilaclar ;
    INTO Cursor ilacgenel1
 
Select ilaclar_a ilaclar,giren,cikan, stok,ilkdort,ortadort,sondort,;
    (ilkdort+ortadort+sondort) toplam,;
    (ilkdort+ortadort+sondort)/m.aylar ortalama ,gurup,0 aciklama ;
    FROM ilacgenel11;
    INTO Cursor ilacgenel1 Readwrite

10

Re: select ve null

Hocam;
ne desem ki ...?
Harikasınız sağolun

11

Re: select ve null

cetinbasoz yazdı:

Eger NULL olarak bırakırsan toplama ve ortalama degerlerin doğru çıkar.

Çetin SQLde SELECT NULL+1 -->NULL oluyor, VFPda ? .NULL:+1 -->.NULL. oluyor galiba, yani null galiba bütün operatörlerde değerleri yutuyor.
.null./.null. dahil

VFP9 SP2

12 Son düzenleyen, Gökçe Özçınar (13.11.2012 20:33:33)

Re: select ve null

Sorun çözüldü. Teşekkür ederim. Ancak kod ile ilgili bir hız problemim var. Bu konuda yardımınızı rica ediyorum.

2500 civarında stok kartı ve 2000 civarında stok hareketlerim var.  Aşağıdaki kod ile hareketlerdeki miktarları stok ana dosyasına bir döngü ile yazdırıyorum. Bir problem yok. ama bu işlem yaklaşık 10-15 saniye sürüyor. Sıkça kullanıldığı için bu süreyi epey kısaltmak zorundayım. SQL bilgim kısıtlı olduğundan forumdan aldığım bilgiler ile aşağıdaki kodu çıkardım smile

Visual Fox Pro
DO WHILE .not. EOF()

bakara=st_adi
SELECT SUM(sum_sh_cik) FROM stancur WHERE sh_ad=bakara INTO ARRAY cik_toplami
SELECT SUM(sum_sh_gir) FROM stancur WHERE sh_ad=bakara INTO ARRAY gir_toplami
 
cikt=iif(isnull(cik_toplami),0,cik_toplami) && all
girt=iif(isnull(gir_toplami),0,gir_toplami) && all
 
SELECT gost
REPLACE st_bak WITH girt-cikt
IF .not. EOF()
SKIP
ENDIF
ENDDO
GO TOP

bu döngü sanırım tek bir SQL çümleciği ile tek seferde halledilebilir.
şimdiden teşekkür ederim.

13

Re: select ve null

konuka yazdı:
cetinbasoz yazdı:

Eger NULL olarak bırakırsan toplama ve ortalama degerlerin doğru çıkar.

Çetin SQLde SELECT NULL+1 -->NULL oluyor, VFPda ? .NULL:+1 -->.NULL. oluyor galiba, yani null galiba bütün operatörlerde değerleri yutuyor.
.null./.null. dahil

Doğru. Demek istediğim kayıtlardaki null deperlerin sum()/avg() de dikkate alınmadığı idi.

14

Re: select ve null

Gökçe Özçınar yazdı:

Sorun çözüldü. Teşekkür ederim. Ancak kod ile ilgili bir hız problemim var. Bu konuda yardımınızı rica ediyorum.

2500 civarında stok kartı ve 2000 civarında stok hareketlerim var.  Aşağıdaki kod ile hareketlerdeki miktarları stok ana dosyasına bir döngü ile yazdırıyorum. Bir problem yok. ama bu işlem yaklaşık 10-15 saniye sürüyor. Sıkça kullanıldığı için bu süreyi epey kısaltmak zorundayım. SQL bilgim kısıtlı olduğundan forumdan aldığım bilgiler ile aşağıdaki kodu çıkardım smile

Visual Fox Pro
DO WHILE .not. EOF()

bakara=st_adi
SELECT SUM(sum_sh_cik) FROM stancur WHERE sh_ad=bakara INTO ARRAY cik_toplami
SELECT SUM(sum_sh_gir) FROM stancur WHERE sh_ad=bakara INTO ARRAY gir_toplami
 
cikt=iif(isnull(cik_toplami),0,cik_toplami) && all
girt=iif(isnull(gir_toplami),0,gir_toplami) && all
 
SELECT gost
REPLACE st_bak WITH girt-cikt
IF .not. EOF()
SKIP
ENDIF
ENDDO
GO TOP

bu döngü sanırım tek bir SQL çümleciği ile tek seferde halledilebilir.
şimdiden teşekkür ederim.


Kural 1: Dongude SQL kullanıyorsan yavaşlık normal. Büyük ihtimalle döngü dışında SQL ile halledilir.

Galiba aradığın bu:


Visual Fox Pro
Update gost ;

    set st_bak = toplamlar.gir_toplami - toplamlar.cik_toplami ;
From ;
    (Select sh_ad, ;
    Sum(sum_sh_cik) As cik_toplami, ;
    Sum(sum_sh_gir) As gir_toplami ;
    From stancur ;
    group By 1) toplamlar ;
    where gost.st_adi == toplamlar.sh_ad

15

Re: select ve null

"G A L İ B A" mı ?
Kod tam yerine tam olması gerektiği gibi tam zamanında CUK oturdu. Hatta rengi bile uydu diyebilirim.
Çok teşekkür ederim.