1 Son düzenleyen, Gökçe Özçınar (02.03.2011 16:41:21)

Konu: İsim ayıklama

Merhaba
Bir cari hesap hareket tablesinde (cursor) birçok firmaya ait birçok hareket var.  Bir prg ile bu tablede adı geçen firmaların (yani hareketi olan firmaların) listesini bir cursorde topluyorum. 10 tane hareketi olsa bile oluşturduğum cursor'de o firmanın ismi sadece 1 kere geçiyor. Bu prg'de  iç içe döngüler olduğu için cursorlarla çalıştığım halde haliyle oldukça yavaş.
Bunu örneğin SQL vb. komutları ile hızlı ve kısa şekilde yapmanın bir yolu var mı?
Şimdiden teşekkür ederim.

Gökçe   1
Ali         1
Gökçe  2
Veli       3
==========
Ali   1
Gökçe  3
Veli   3

...şeklinde

2 Son düzenleyen, ugurlu2001 (02.03.2011 16:51:32)

Re: İsim ayıklama

Visual Fox Pro
Select Distinct Ad, HesapNo From CrsHareket Order By Ad  Into Cursor CrsTemp NoFilter
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 Son düzenleyen, ugurlu2001 (02.03.2011 16:58:25)

Re: İsim ayıklama

No Kısmında farklı 2 değer varmış. En büyük olanı almak için :

Visual Fox Pro
Select Distinct Ad, Max(HesapNo) From CrsHareket Group By Ad Order By Ad  Into Cursor CrsTemp NoFilter

Eğer ORder By yazan kısmındaki field/lara göre INDEX in tanımlı ise HIZ en çok bir kaç milisaniyede kalır...

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ü

4

Re: İsim ayıklama

Cevap muhtemelen evet ama soru ne ki?

5

Re: İsim ayıklama

Aslında "max" yerine "sum" doğaçlamasını yaparak sorun çözüldü.
sorum :
(1.cursor)
Gökçe   1
Ali         1
Gökçe  2
Veli       3
==========
(2.cursor)
Ali   1
Gökçe  3
Veli   3

ilk cursordan yukarıdaki ikinci sursor'u oluşturmaktı.  ve mükemmel şekilde oldu. ne döngüye gerek kaldı ne birşey. ve de çok hızlı.
teşekkür ederim.  asıl amacım biraz üzerinde çalışıp bunu iki dosya ile yapmak. yani örneğin alışlar ve satışlar table'lerini isme göre birleştirmek.

yani :
alışlar :                  satışlar:               istenen:
(1.cursor)             (2.cursor)           (3.cursor)
Gökçe   1              Gökçe    4           Gökçe   3    5
Ali         1              osman    6          Ali          1    0
Gökçe  2               Gökçe     1         Veli         3    3
Veli       3               veli          3         Osman  0    6     

şeklinde 1. ve 2. cursorlardan isim referans alınarak 3. cursoru oluşturmak.  3. cursorda ilk field alışlar ikincisi satışlar. Ancak burada örneğin birinci ve ikinci cursorlarda Gökçe defalarca varken 3. cursorda tek satır ve yanında alış ve satış toplamının yer alması. dediğim gibi bu tek cursor için mükemmel oldu. iki cursordan tek bir cursor elde etmek için uğurlunun kodunu ne şekilde geliştirebiliriz ? 

Şimdiden tekrar teşekkür ederim.

6 Son düzenleyen, ugurlu2001 (03.03.2011 10:14:52)

Re: İsim ayıklama

Aşağı yukarı Bunun gibi bir şey. Tek Cursor de işin hallolur ...

Visual Fox Pro
SELECT ;

        CrsAd.Ad, ;
        Sum(Alislar.Miktar) As AlisToplami, ;
        Sum(Satislar.Miktar) As SatisToplam ;
    FROM (Select Distinct Alislar.Ad From Alislar UNION Select Satislar.Ad From Satislar) As CrsAd ;
    Left JOIN Alislar ON Alislar.Ad = CrsAd.Ad ;
    LEFT JOIN Satislar ON Satislar.Ad = CrsAd.Ad ;
    GROUP BY CrsAd.Ad ;
    ORDER BY CrsAd.Ad
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: İsim ayıklama

Merhabalar
Benzerini aradım bulamadım.
Bir DBF de 10 ad field var. Bu dosyada tarih ve sözleşme numaraları aynı olan
kayıtlar var ve aynı olan bu kayıtların stopaj kolonunu  toplamak için

TOTAL TO rdtotal ON STR(SOZLESMENO)+DTOC(ISL_TARIHI) FIELDS STOPAJ
komutunu kullanıyorum.

Tarih ve sözleşme numaraları aynı olan kayıtların stopajlarının toplamını aldırmak için
nasıl bir select komutu ile cursor oluşturabilirim. Ancak oluşacak bu cursorda 10 field da görünmeli.

8 Son düzenleyen, avrasya34 (02.03.2011 23:52:09)

Re: İsim ayıklama

Visual Fox Pro
select tarih,sozno,sum(staopaj) stop,* from dosya group by 1,2 order by 1,2  into cursor dosya2

gibi bişey yazman lazım

* yerine diğer fieldleri yazabilirsin

9

Re: İsim ayıklama

çözümün textmergeile istediğin komutu oluşturman ve & ile sorguyu çalıştırman.
aşağıda kendimden birörnek kopyaladım.
senin durumunda <<FIELD(m.xi,"dosya")>> şeklinde döngü kullanman gerekiyor.

Visual Fox Pro
TEXT TO komut NOSHO

SELECT teksid, SUM(adet) AS toplam FROM curHepsi WHERE
ENDTEXT
 
SCAN
  IF curIrs.irsvar
    TEXT TO  m.komut TEXTMERGE ADDITIVE NOSHOW
        irsno=<<ALLTRIM(STR(curirs.irsno))>> OR
        ENDTEXT
  ENDIF
ENDS
TEXT TO m.komut ADDITIVE NOSHOW
irsno=-9 GROUP BY teksid INTO CURS curSeçme
ENDTEXT
 
&komut
VFP9 SP2

10 Son düzenleyen, cetinbasoz (03.03.2011 10:45:35)

Re: İsim ayıklama

hhasan55 yazdı:

Merhabalar
Benzerini aradım bulamadım.
Bir DBF de 10 ad field var. Bu dosyada tarih ve sözleşme numaraları aynı olan
kayıtlar var ve aynı olan bu kayıtların stopaj kolonunu  toplamak için

TOTAL TO rdtotal ON STR(SOZLESMENO)+DTOC(ISL_TARIHI) FIELDS STOPAJ
komutunu kullanıyorum.

Tarih ve sözleşme numaraları aynı olan kayıtların stopajlarının toplamını aldırmak için
nasıl bir select komutu ile cursor oluşturabilirim. Ancak oluşacak bu cursorda 10 field da görünmeli.

10 field de gorunmeli diyorsun da anlamadigim:

sozlesmeno, isl_tarihi ayni olan alanlar,
stopaj toplami alinacak alan

geri kalan 7 alan icin veri hangi satirdan gelecek? Yani biraz garip bir istek. Eger o alanlar sozlesmeno ve isl_tarihi ayni olan kayitlar icin zaten ayni diyorsan o zaman da dosya yapisinda bir sakatlik var demektir. Bilmem problemi anlatabildim mi. Benim icin farketmez hangi satirdan gelirse gelsin diyorsan o zaman is VFP7 ve oncesinin hatali group by kullanimina benzer. O zaman soyle yapabilirsin:

Visual Fox Pro
select sozlesmeno, isl_tarihi, ;

  max(f3) as f3, ;
  max(f4) as f4, ;
  max(f5) as f5, ;
  max(f6) as f6, ;
  max(f7) as f7, ;
  max(f8) as f8, ;
  max(f9) as f9, ;
  sum(stopaj) as stopaj ;
from myTable ;
group by 1,2

11

Re: İsim ayıklama

Üstat, Hasan ın söylediği bana da biraz tuhaf geldi. Galiba örnek data olmadan bazı şeyler ne kadar kolay görünse de anlaması zor oluyor.

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ü

12

Re: İsim ayıklama

Evet hep oyle. Duz yazida anlamakta gucluk cekiyorum. Bu arada 'group by'i yazmayi unutmusum ekledim:)

13

Re: İsim ayıklama

Üstadlar Merhaba
Konuyu şöyle anlatabilirim

Müşteri          Tarih          ÖdenenTL          İadeTL   Sözleşmeno       Stopaj
----------      -----------  ------------   ----------  ------------    -------------
hasan           03/03/2010      10                      2                558                   2
hasan           03/03/2010      10                      2                 558                  1
Tahsin         04/03/2010       20                      2                558                   3

Resmi bir kurumdan veri bu şekilde geliyor
Tarih ve sözleşmeye göre olmasının nedeni, yukarıda da görüldüğü üzere aynı sözleşme
numarasa farklı bir tarihte başka bir kişi adına olabiliyor.
Çetin'in  verdiği kod işimi gördü. Teşekkürler

Farklı bir şey daha öğrenmek istiyorum
Bir datada mükerrer kayıt varsa bu kayıtları nasıl ayıklarız
Örneğin yukarıdaki örnekte stopajın aynı olduğunu varsayalım.
Şimdiden teşekkürler.

14

Re: İsim ayıklama

Visual Fox Pro
SELECT COUNT(Kod) - 1 as DoubleRecs, Kod ;

    FROM TableName ;
    GROUP BY Kod ;
    HAVING COUNT(Kod) > 1 ;
    ORDER BY Kod DESCENDING ;
    INTO CURSOR cDuplicates
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ü

15

Re: İsim ayıklama

Ya simdi de "mukerrer"i tanimla diyicem kizacaksin:)

16 Son düzenleyen, hhasan55 (03.03.2011 19:15:34)

Re: İsim ayıklama

Çetin muhasebecilik zamanında çokça kullandığım (ki muhasebeciler takdimtehir, mükerrer
gibi kelimeleri iyi bilir) kelime. Bir kaydın birden fazla işlenmesi, toplanması vb. anlamları var.
Yoksa benmi yanlış biliyorum. smile

17 Son düzenleyen, hhasan55 (03.03.2011 20:31:05)

Re: İsim ayıklama

Uğurlu,
Cahilliğime ver. COUNT(Kod). Kod derken bir field adını mı kastediyoruz.
Eğer öyleyse ;
Müşteri          Tarih          ÖdenenTL          İadeTL   Sözleşmeno       Stopaj
----------      -----------  ------------   ----------  ------------    -------------
hasan           03/03/2010      10                      2                558                  1
hasan           03/03/2010      10                      2                 558                  1
Tahsin         03/03/2010       10                      2                558                   1

burada column olarak hangisini seçeceğiz ? Birini seçersek sonuç yanlış olmazmı
Teşekkürler

18

Re: İsim ayıklama

O kadar Turkce biliyoruz:) Benim demek istedigim ne olursa mukerrer oluyor? Gostedrdigin ornekte tum alanlar tekrarlaniyor. Oyle ise cok basit:

Visual Fox Pro
select distinct * from myTable

19 Son düzenleyen, ugurlu2001 (04.03.2011 09:36:33)

Re: İsim ayıklama

Hasan ; ordaki mükerrer kaydı bulmak için "KOD" durumu ele alındı. Senin istediğin şöyle bir şey mi?  :

Visual Fox Pro
CLOSE DATABASES 

 
CREATE CURSOR CrsData(Musteri C(20), Tarih D, Odenen Y, SozlesmeNo Int, Stopaj Int)
 
INSERT INTO CrsData SELECT Top 1 "Ali Veli 49 Elli", Date(), 100, 442, 150 FROM Sys(2005) Order By 1
INSERT INTO CrsData SELECT Top 1 "Ali Veli 49 Elli", Date(), 100, 442, 150 FROM Sys(2005) Order By 1
INSERT INTO CrsData SELECT Top 1 "Cetin Basoz", Date()-2, 100, 442, 150 FROM Sys(2005) Order By 1
INSERT INTO CrsData SELECT Top 1 "Ali Konuk", Date()-2, 100, 442, 150 FROM Sys(2005) Order By 1
INSERT INTO CrsData SELECT Top 1 "Soykan Ozcelik", Date()-3, 100, 442, 150 FROM Sys(2005) Order By 1
INSERT INTO CrsData SELECT Top 1 "Ugur Yilmaz", Date()-4, 100, 442, 150 FROM Sys(2005) Order By 1
 
SELECT Recno() As SiraNo, * FROM CrsData INTO CURSOR CrsDataX
 
SELECT Crs1.* ;
    FROM CrsDataX As Crs1 ;
    JOIN CrsDataX As Crs2 ON Crs1.Musteri == Crs2.Musteri ;
                         AND Crs1.Tarih == Crs2.Tarih ;
                         AND Crs1.SozlesmeNo == Crs2.SozlesMeNo ;
                         AND Crs1.Stopaj == Crs2.Stopaj ;
                         AND Crs1.SiraNo != Crs2.SiraNo

Eğer bir Ön "Select" ile SiraNo sunu almak yerine GUID türü bir field oluşturursan ara sorgu ile zaman kaybetmemiş olursun.

Visual Fox Pro
CLOSE DATABASES 

 
CREATE CURSOR CrsData(Musteri C(20), Tarih D, Odenen Y, SozlesmeNo Int, Stopaj Int, Guid C(38))
 
INSERT INTO CrsData SELECT Top 1 "Ali Veli 49 Elli", Date(), 100, 442, 150, GetGUID() FROM Sys(2005) Order By 1
INSERT INTO CrsData SELECT Top 1 "Ali Veli 49 Elli", Date(), 100, 442, 150, GetGUID()  FROM Sys(2005) Order By 1
INSERT INTO CrsData SELECT Top 1 "Cetin Basoz", Date()-2, 100, 442, 150, GetGUID()  FROM Sys(2005) Order By 1
INSERT INTO CrsData SELECT Top 1 "Ali Konuk", Date()-2, 100, 442, 150, GetGUID()  FROM Sys(2005) Order By 1
INSERT INTO CrsData SELECT Top 1 "Soykan Ozcelik", Date()-3, 100, 442, 150, GetGUID()  FROM Sys(2005) Order By 1
INSERT INTO CrsData SELECT Top 1 "Ugur Yilmaz", Date()-4, 100, 442, 150, GetGUID()  FROM Sys(2005) Order By 1
 
SELECT Crs1.* ;
    FROM CrsData As Crs1 ;
    JOIN CrsData As Crs2 ON Crs1.Musteri == Crs2.Musteri ;
                         AND Crs1.Tarih == Crs2.Tarih ;
                         AND Crs1.SozlesmeNo == Crs2.SozlesMeNo ;
                         AND Crs1.Stopaj == Crs2.Stopaj ;
                         AND Crs1.Guid != Crs2.Guid ;
    INTO CURSOR CrsMukerrer NOFILTER
 
USE IN Select("FoxUser")
USE IN Select("CrsData")                         
 
BROWSE
 
Function getGUID && Cetin Basoz Code
    Declare Integer UuidCreate In 'RPCRT4.dll' String @pguid
    Declare Integer StringFromGUID2 In 'Ole32.dll' ;
        string rguid, String @lpsz, Integer cchMax
 
    Local pguid,rguid
    pguid=Replicate(Chr(0),16)
    rguid=Replicate(Chr(0),80)
    UuidCreate(@pguid)
    StringFromGUID2(pguid,@rguid,40)
    Return Strconv(Left(rguid,76),6)
Endfunc

Özet olarak burda yapılan, Tablonun referans olarak yine kendisine başvurması. Bu türde türetilmiş sorgularda JOIN kısmında Eşitlik ve Farklılıkları özellikle belirtmemiz gerekiyor.

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ü

20

Re: İsim ayıklama

ugurlu2001 yazdı:
Visual Fox Pro
SELECT COUNT(Kod) - 1 as DoubleRecs, Kod ;

    FROM TableName ;
    GROUP BY Kod ;
    HAVING COUNT(Kod) > 1 ;
    ORDER BY Kod DESCENDING ;
    INTO CURSOR cDuplicates


Uğur, verdiğin bu kod'u kullandım. ancak önce yeni bir field ilave edip
replace kontrol with STR(SÖZLEŞMENO)+DTOC(IŞL_TARIHI)
******* (çift kayıt olan Benzer olan iki kolonu aldım)*********
dedikten sonra

SELECT COUNT(kontrol) - 1 as DoubleRecs, kontrol,üye,sözleşmeno ;
    FROM dosya GROUP BY kontrol,üye,sözleşmeno INTO CURSOR cDuplicates

şeklinde hallettim.
Teşekkürler

21

Re: İsim ayıklama

İşinin görülmesine sevindim Hasan, yardımcı olabildimse ne mutlu bana 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ü

22 Son düzenleyen, ugurlu2001 (04.03.2011 15:22:06)

Re: İsim ayıklama

Hasan, bu arada "Replace" e ve Tablonda ek bir field a gerek yok SELECT yapıyorken istediğin fieldları zaten hesaplatıp kullanabilirsin.   :

Visual Fox Pro
CLOSE DATABASES 

 
CREATE CURSOR CrsData(Musteri C(20), Tarih D, Odenen Y, SozlesmeNo Int, Stopaj Int)
 
INSERT INTO CrsData SELECT Top 1 "Ali Veli 49 Elli", Date(), 100, 442, 150 FROM Sys(2005) Order By 1
INSERT INTO CrsData SELECT Top 1 "Ali Veli 49 Elli", Date(), 100, 442, 150 FROM Sys(2005) Order By 1
INSERT INTO CrsData SELECT Top 1 "Cetin Basoz", Date()-2, 100, 442, 150 FROM Sys(2005) Order By 1
INSERT INTO CrsData SELECT Top 1 "Ali Konuk", Date()-2, 100, 442, 150 FROM Sys(2005) Order By 1
INSERT INTO CrsData SELECT Top 1 "Soykan Ozcelik", Date()-3, 100, 442, 150 FROM Sys(2005) Order By 1
INSERT INTO CrsData SELECT Top 1 "Ugur Yilmaz", Date()-4, 100, 442, 150 FROM Sys(2005) Order By 1
 
SELECT ;
        Count(Kontrol)-1 As DoubleRecs, ;
        Kontrol, ;
        Musteri, ;
        SozlesmeNo ;
    FROM (SELECT (STR(SozlesmeNo)+DTOC(Tarih)) As Kontrol, * FROM CrsData) As Crs001 ;
    GROUP BY Kontrol, Musteri, SozlesmeNo ;
    INTO CURSOR CrsDuplicate ; 
    HAVING DoubleRecs > 0
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ü

23

Re: İsim ayıklama

Uğur sağol. Biraz değiştirerek

SELECT Count(Kontrol)-1 As DoubleRecs, ;
Kontrol,musteri, SozlesmeNo ;
FROM (SELECT (STR(SozlesmeNo)+DTOC(tarih));
As Kontrol, * FROM CrsData) As Crs001 ;
GROUP BY Kontrol, musteri, SozlesmeNo ;
INTO CURSOR CrsDuplicate 

ile istediğimi aldım.