1 numara karşı birden fazla satır bazında kayıt detail

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
a4tech

1 numara karşı birden fazla satır bazında kayıt detail

Mesaj gönderen a4tech »

Simdi bir numara var otomatik oluşturulan........Bu noya detail olarak birden fazla detail bilgi bağlamak istiyorum...

Yani Örneğin Numara 1......Buna ilişkin 8 tane ayrı ayrı satır bazında kayıt yapabilirmiyim....Mümkünse yardımcı olabilirmisiniz.......
onaydin

Mesaj gönderen onaydin »

Ana tabloda ANA_TABLO_NO diye bi alan olsun
misal 1,2

Detay tabloda
DETAY_TABLO_NO, ANA_TABLO_NO, DEGER diye alanlar var.

burda da
65, 1, degeri
66,1, degeri

şeklinde kayıt tutulur.

Ana tabloya bir kayıt ve detay tabloya sekiz kaydı tek bir sql le girmeniz gerekiyorsa procedure kullanmanız gerekir ( en azından ben oyle kullanıyorum).
a4tech

ok

Mesaj gönderen a4tech »

hayir mesela kayıt girilecek ana tabloya bağlı ikinci kayıt süre vereyim 1 saat sonra girecek vs. bi anda 8 tane kayit olamyacak yani...
a4tech

peki birde söle bir problemim var

Mesaj gönderen a4tech »

ana tabloda primary key olan değer benim yaptığım programda sevkiyat no, bu noyu ben 1,2,3 olarak değilde müsteri cari nosuna göre örneğin

10023-001 ilk kayıt için mesela sonraki kayıtları kontrol edip en son hangi kayıt yapılmış 001 kayıt kapatılmış ise 002 geçecek başka bir sevkiyatta

bunun için bana söyleyeceğiniz ve önereceğiniz bir yöntem var mı.
onaydin

Mesaj gönderen onaydin »

(Anladığım kadarıyla)
O zaman önce ana tabloya gidip ilgili kaydın NO sunu alacaksınız
sonra da bunu detay tabloya 8 kaydı girerken, detay bilgilere ek olarak sabit bir şekilde kullanacaksınız.

Farzedinki 8 kayıt değilde detay tabloya bir kayıt ekleyeceksiniz
onun sql i nasıl yazılır biliyorsanız, bir şekilde 8 kaydı da eklersiniz.
a4tech

biraz eksik bilgi verdim pardon

Mesaj gönderen a4tech »

sql server 2000 çalışan netsis programının üzerindeki table a sipariş tablosunda gerekli bilgiler var örneğin şunlar

fisno cari kodu ürün no adedi
_____________________________

bir sevkiyat no baz alınarak çünkü bir tane sipariş ayrı ayrı sipariş noları ile örneğin 8 adet fisno ile girilebiliyor...Benim yapmak istediğim şu...

Otomatik bir sevkiyat no oluşturmak ama bunu müsterinin cari nosu baz alınarak yani 10023-001 gibi sevkiyat noları oluşturmak istiyorum bu sevkiyat no girildiği zaman hangi ürünler var göreceğim ama bu sevkiyat nosunu böle oluşturmam gerekiyor...Nasıl yapacağımı bilmiyorum tek problemim bu bunu çözersem programı bitireceğim yani...mümkünse kod olarak da yardımcı olursanız sevinirim...Şimdiden teşekkürler
onaydin

Mesaj gönderen onaydin »

Evvela bir öncekini siz yazmadan atmıştım.

Eğer elinizde bu detay tablosunun alanlarıyla oynamak gibi bir imkan varsa şöyle düşünülebilir,

musteri_no, siparis_no diye ayrı ayrı iki alan oluşturun

bu tabloya kayıt eklerken once bir bakın bu tabloda 10023 nolu bir musteri nosu geçiyor mu ve eğer geçiyorsa maximum deger_nedir

bu degeri bulduktan sonra buna bir ekleyin

sonuc şoyle olur
10023 | 1
bunuda artık istediğinz sipariş nosu tipine string i biçimlendirerek çevirebilirsiniz.
Sipariş no nun önüne belirli sayıda 0 eklemek için repeat() fonksiyonu kullanılabilir. Hayır bu yok desteklenmiyorsa left() fonksiyonuyla bu sıfırlar oluşturulabilir. İki farklı değeri birleştirirken benim kullandığım db lerde || kullanılıyor bu şekilde faklı bir değerde elde edebilirsiniz.
a4tech

Peki başka bir soru

Mesaj gönderen a4tech »

table su

alanlarda sunlar

fisno cari no ürün adedi fiyatı bir de siparişin açık mı kapalı mı olduğu oda sipariş field da satır bazında açıksa A Kapalı ise K yazıyor....
Ben burdan bunları nasıl filtreleyebilirim yapamadım bu mevzuyu yani siparişinde açık bölümünde A Yazanları listelemek istiyorum.
a4tech

Yani müşteri seçildiği zaman otomatik açık siparişleri

Mesaj gönderen a4tech »

yani müşteri seçildiği zaman otomatik açık siparişleri nasıl listeleyebilirim örneğin 20 tane açık siparişi olabilir bunu combobox ta nasıl göstertebilirim....normal bir field taki göstermeyi yapabiliyorum ama nasıl filtreleyeyip bir combobox ta cari kodu seçildiği zaman diğerinde açık sipariş nolarını çıkartabilirim lütfen yardım......
unalaygun
Üye
Mesajlar: 139
Kayıt: 27 Mar 2004 12:34
Konum: istanbul

Mesaj gönderen unalaygun »

arkadaşım şu şelilde yapabilirsin müşterinin carisine yada ismine göre bir edit koyabilirsin buradanda like yada where gibi komutlarla dbgrid'e aktarabilirsinki bence dbgridde olması daha iyi olur şahsi kanaitimce tabiii
bir de database olarak ne kullanıyorsun bunu belirtirsen iyi olur..
ama genel mantık su bir datasource ve bir query koyup edit'in change olayına like yada başka türlü bir arama ile locate olabilir yada where olabilir ama like bence daha iyi olabilir query ile filtreleyip dbgrid'e aktarabilirsin ....

arama komutlarını forumda bulabilirsin benim su an tam aklımda değil ....
Kolay gelsin....

ha bu arada master-detail kurarsan zaten kullanıcı ismine göre zaten detailini seçiyor ama yukarda yazdığım gibi bunlarıda bir den istersen bence ....
derviş
a4tech

sunu demek istedim

Mesaj gönderen a4tech »

combobox ta seçilen bir fielda bağlı olarak aynı tabolunun içindeki bazı fieldları editboxlara nasıl atarım bunu demek istedim tam olarak.........
a4tech

yok ayrıca dbgride atmak istemiyorum

Mesaj gönderen a4tech »

sadece istediğim combobox tan seçilen öğenin satır bazında bazı satırları otomatik editlere atmam bu kadar
a4tech

ya benim yapmak istediğim şu

Mesaj gönderen a4tech »

bi table var aynen söle

Kod: Tümünü seç

FISNO  CARI_KODU STOK_KODU ADEDI FIYATI  BIRIMI    SIPARISDURUMU
Böyle bir database var siparis durumu denilen yerde K kapalı siparişler H ise açık siparişleri belli ediyor......

1. Benim yapmam gereken ise şu...Buradan siparis durumu H olanları yani açık olanları filtrelemek...
2. Bundan sonra ise firebird de table ları oluşturdum fieldlarıda bir tane sevkiyat no adında fieldım var primarykey...Diğer detail table ise sevkiyatdetay...Bunlar master-detail bağladım...Bunları master detail bağlama şeklim ise sekiyat.fdb SEVK_SIRA_NO Primary Key, SEVKIYAT NO diğer Sevkiyatdetail tabelında ise siparisnumarası fkey...durumda ve geri kalan diğer fieldlar...sipraiş numarası yukarıda yazdiğim fisnosu...
problem...yok...Yani prgramın geri kalan herşeyi tamam ama sadece bu bölümü yapamadım...devam ediyorum.
3. Tam olarak yapmak istediğim...İlk sorum her defasında bu select * from tableadi where fieldadi='H' şeklinde table filtreleyip bir kopyasını oluşturmakmı...ki böyle yaparsak her program çalışınca yapması gerekiyor...Çünkü devamlı sipariş kapanıyor...açılıyor...veya bunları filtreleyip direk işlem yapmak mı..hangisi sağlıklı olur...devam ediyorum.
4. Bu olayı yaptıktan sonra yani açık olan siparişleri bulduktan sonra ki olay 0 dan müşteri cari kodu baz alınarak örneğin 10023 bu nonun yanına 6 digit daha otomatik bir no oluşturmak ve bunu sevkiyat no olarak kaydetmek. Yani 10023-000001 tabiki bu numara firebird de sevkiyat no kayıtlı değil ise oluşturulacak. Sonuç: bu no oluştuktan sonra kayıt işlemi başlıyor ve bu no baz alınarak örneğin 6 adet fis nosu yani 6 adet sipariş numarası bu no baz alınarak kayıt yapılıyor. Ve sevkiyat ile ilgili işler ibitirdikten sonra kayıtları bu sevkiyatı kesin bitir butonu olduğunu düşünelim tıklıyor ve sevkiyat kapanıyor bir daha tekrar açılmamak üzere sadece admin açabilir bunu...Daha sonra aynı müşteriye tekrar sevkiyat no ile siparişleri girileceği zaman sevkiyat noyu kontrol edip bakmalı ki bu müşterinin 10023-000001 var o zaman 10023-000002 açması gerektiğini anlayıp bu noyu açması ve artık diğer siparişlerinde kayıt edilmesi....Başka bir cari nodada aynı uygulamayı yapması....

Gerçekten bunu yapmam gerekiyor ve öle kalakaldım...Filtreliyorum orda kalıyorum...Yardımcı olursanız sevinirim...Teşekkür ederim şimdiden....Hayırlı Geceler
onaydin

Mesaj gönderen onaydin »

Sn. a4tech ilk üç sorunuz için birşey diyemeyeceğim
ancak 10023-000001 şeklinde bir değerin nasıl oluşturulabilceği hakkında
veritabanı tarafında şu şekilde bir yol izlenebilir;

firebird için tablo yapısı
siparis_no varchar(30) (PK)
musteri_no int
siparis_tmp

bu tabloya sadece musteri nosunu göndererek yeni bir kayıt eklemek için
insert etmeden önce çalışabiliecek bir trigger tanımlayabilirsiniz;

Kod: Tümünü seç

CREATE TRIGGER SIPARIS_ FOR SIPARIS ACTIVE BEFORE INSERT POSITION 0 AS
begin
   select (max(SIPARIS_TMP)+1) from SIPARIS
   where MUSTERI_NO = new.MUSTERI_NO into new.SIPARIS_TMP;
   if (new.SIPARIS_TMP is null ) then
    new.SIPARIS_TMP = 1;


   new.SIPARIS_NO = new.MUSTERI_NO || '-' ||
                       SUBSTR('000000',1,6 - strlen(new.SIPARIS_TMP)) || new.SIPARIS_TMP;
end
(substr ve strlen udf içinde mevcut fonksiyonlar)
bu durumda sadece insert into SIPARIS (MUSTERI_NO) values (musteri_no) dediğinizde çalışması lazım


bu kod istediğiniz formatta bir değer üretecektir ancak
program geliştirme tecrübesine sahip olmamakla birlikte benim düşüncem
veriyi bu formatta saklamanıza gerek olmadığı,
bunu delphi tarafında ya da select çekerkende biçimlendirebilirsiniz.

Sağlıcakla kalın
a4tech

Çok teşekkür ederim yanlız trigger haricinde bir çözüm

Mesaj gönderen a4tech »

Çok fazla iyi değilim yeniyim ben bu konularda onun için delphi ile alakalı kodlar verebilirseniz memnun olurum...Teşekkürler....
Cevapla