Aynı anda 2 adet select veya stored proc

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
csyasar
Üye
Mesajlar: 646
Kayıt: 25 Şub 2004 10:14
Konum: Tokat

Aynı anda 2 adet select veya stored proc

Mesaj gönderen csyasar »

merhaba;

ticari bir programdaki fatura kartı ekranının hareket kısmındaki gridi düşünün. bu alana ben türü isminde bir alan koydum(tıpkı lks'de olduğu gibi). kullanıcı örneğin:
türü kısmını "MALZEME" olarak ayarladığı zaman stok kartı ekranını açıyor. "HİZMET" seçtiği zaman ise hizmet kartlarının içinden seçim yapıyor. ancak query'mde kod olarak:

Kod: Tümünü seç

select f.*, s.ST_KOD_NUM, s.ST_KOD_STR, s.ST_ADI, br.BR_KOD_NUM, br.BR_CARPAN, br.BR from FTRH f
left outer join STOKKART s on f.FH_ST_KOD_NUM = s.ST_KOD_NUM
left outer join BIRIM br on FH_BR_KOD_NUM = br.BR_KOD_NUM ORDER BY FH_KOD_NUM
yazdığı için. hizmet kartından veri çağrılacağı yerde "TÜR" kısmı "HİZMET" olsa bile stok kartından veri çekiyor.

lazım olan şey sanırım:
ya aynı query'e 2 adet sql sorgusu yazılabilmesi,
ya da bir stored proc yazılarak problemin çözülmesi şeklinde.

Not: stok seç tuşuna tıklandığında listeden seçilen elemanın generatör kodunu(ST_KOD_NUM) hareket generatör koduna(FH_ST_KOD_NUM) atıyor. dolayısıyla hizmet seçilse bile stoktan atıyor.

örn: generatör kodu 5 olan hizmet kartını seçtiniz. yukardaki sql kodunda stok tablosundan veri çekildiği için 5 nolu stoğu getiriyor listeye.

kullanılan veritabanı: firebird 1,5,2
kullanılan ide: delphi 7
Kullanıcı avatarı
Terminator
Üye
Mesajlar: 313
Kayıt: 13 Ara 2005 01:45
Konum: İzmir, ama Aydın Efesi!

Mesaj gönderen Terminator »

anlatım tarzın bana çok ters,
yanlış mı anlıyorum yoksa,
sorguya where koşulu ekleyip istediğin flage göre hareketleri çekmekle ilgili bir sorunun mu var
Firebird Foundation Member #208
http://www.firebirdsql.org
csyasar
Üye
Mesajlar: 646
Kayıt: 25 Şub 2004 10:14
Konum: Tokat

Mesaj gönderen csyasar »

hayır hocam where ile ilgili bişey değil.

şunu düşünün. mesela fatura hareket tablosunda AA müşterisine ait 3 tane row var. bu 3 row'un 1'i hizmet, 2si malzeme.

bunları gride yazarken şöyle yazcak:

Kod: Tümünü seç

TÜRÜ	KODU		ADI		MİKTAR
-----------------------------------------------------------------
MALZEME	ST.0000001	WİN XP PRO TR	1
MALZEME	ST.0000002	WİN98 SE	1
(YUKARDAKİ ROWLARDA YAZILI OLAN KODLARI VE AD'LARI TÜRÜ KISMI MALZEME OLDUĞU İÇİN STOKKART TABLOSUNDAN ÇEKTİ)
HİZMET	HZ.0000001	KABLO ÇEKİM	25
(YUKARDAKİ ROWDAKİ KODU VE ADI, TÜRÜ ALANI HİZMET OLDUĞU İÇİN HIZMETKART TABLOSUNDAN ALDI)
------------------------------------------------------------------
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

iki farklı tablodan kayıt çekmek için union all kullanmanız gerekir.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
Terminator
Üye
Mesajlar: 313
Kayıt: 13 Ara 2005 01:45
Konum: İzmir, ama Aydın Efesi!

Mesaj gönderen Terminator »

Tamam şimdi anladım, ben mal ve hizmetleri her zaman aynı tabloda tuttuğum için senin ayrı tuttuğunu düşünemedim galiba.
Sadettinin dediği gibi union all ile yapabilirsin, başka yollar da var
ama senin için en sadesi o olur.
Firebird Foundation Member #208
http://www.firebirdsql.org
csyasar
Üye
Mesajlar: 646
Kayıt: 25 Şub 2004 10:14
Konum: Tokat

Mesaj gönderen csyasar »

merhaba,

yardımınız için teşekkürler ama union olayını halledemedim. sorguyu çalıştırdığımda data type unknown mesajı alıyorum. sql kodum şu:

Kod: Tümünü seç

select f.*, s.ST_KOD_NUM, s.ST_KOD_STR, s.ST_ADI, br.BR_KOD_NUM, br.BR_CARPAN, br.BR from FTRH f
left outer join STOKKART s on f.FH_ST_KOD_NUM = s.ST_KOD_NUM
left outer join BIRIM br on FH_BR_KOD_NUM = br.BR_KOD_NUM WHERE f.FH_TURU='MALZEME' union all select f.*, h.HZ_KOD_NUM, h.HZ_KOD_STR, h.HZ_ADI, br.BR_KOD_NUM, br.BR_CARPAN, br.BR from FTRH f left outer join HIZMETKART h on f.FH_ST_KOD_NUM = h.HZ_KOD_NUM left outer join BIRIM br on FH_BR_KOD_NUM = br.BR_KOD_NUM WHERE f.FH_TURU='HİZMET' ORDER BY FH_KOD_NUM
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

alan sayısı eşit olmalı...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

ve tabiki alan tipleri de birbiri ile uyuşmalı....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
csyasar
Üye
Mesajlar: 646
Kayıt: 25 Şub 2004 10:14
Konum: Tokat

Mesaj gönderen csyasar »

abi alan sayısı ve veri tipleri eşit zaten
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

union ile birlestirmede varchar(10) ile varchar(11) de birbirinden farklı data tipi olarak algılanır. cast operatoru ile tip donusumu yap.
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

bu kod veritabanı tarafında çalışıyor mu? Hata delphi tarafından gelen bir hata olmasın? Eğer veritabanı tarafında bu hatayi veriyorsa iki selecti ayri ayri calistir. ikisi de çalışıyorsa ve de alan sayıları ve tipleri de tamamen aynı ise geriye tek ihimal kalıyor o da alan sayıları ve tipleri de tamamen aynı değildir :)

select f.* dikkatimi cekti..... f.* i kaldirarak bir dene ya da tablo alanlarını isimleri ile yazmayi da deneyebilirsin...
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
Eğer Lks'den bilgi çekmeye çalışıyorsanız. Aşağıdaki bilgiyi gözönünde bulundurarak bilgiyi çekmeye çalışın.
Lks Fatura hareketlerini LG_XXX_XX_STLINE tablosuna kaydediyor.
Burada XXX firma nosu
XX çalışma dönemi anlamında kullanılıyor.

Buradaki

Kod: Tümünü seç

LineType
----------- 
0  Stok Kartının Hareketi
1 Promosyon Hareketi
2 İndirim Hareketi
3 Masraf Hareketi
4 Hizmet Hareketi
olarak tanımlandığını sanıyorum. Ayrıca

Kod: Tümünü seç

GLOBTRANS
------------------
0  Satır bazında hareket
1  Fatura altı şeklinde hareket 
emin olmamakla birlikte öyle olduğunu sanıyorum. Veya başka bir yerde bunu tanımlıyor. Yani linetype 2, globtrans alanı 1 ise bu fatura altı iskonto anlamına geliyor.

Yukarıdaki bilgiyi gözönünde bulundurursanız bence daha çabuk bilgiye ulaşırsınız. Eğer lks den bilgi çekme değil de kendi programınızı yazıyorsanız yukarıdaki gibi alan ekleyerek işinizi kolaylaştırabilirsiniz.

Bunu daha önce Lks ye Enter tuşu alerjisi başlıklı bir email attığımda inceleyip onlara bir örnek program iskeleti göndermiştim.

Kısaca Programlarında neden Enter tuşuna yer vermediklerini , Alt+5 tuşu ile girilen iskontolar için enterle geçiş örneği vermiştim.

Adamlar windows platformuna bağlı kalacağız diye Enter tuşuna yer vermiyoruz. diyorlardı.

Sanki ben "Shift tab ve Tab tuşunu iptal edin" demişim. Oysa o indirim penceresinde enter tuşu programa kullanışlılık kazandıracaktı. Mesela ben numeric keypadi 5 parmak ile kullanıyorum. Böyle olunca diğer elim tab a mahkum olacak. Ama enter tuşu ile geçiş olsaydı ben sadece sağ elimi kullanacaktım.

Neyse konu biraz başka tarafa kaydı. Umarım bu bilgiler işinize yarar.

Kolay gelsin.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
Cevapla