Kurang lebih, kami telah membuat menu dua atau tiga tingkat seperti direktori pohon dan klasifikasi produk. Jika kami menemukan lebih banyak tingkat klasifikasi, kami biasanya menggunakan rekursi. Menggunakan rekursi dalam suatu program sedikit banyak akan meningkatkan beberapa overhead kinerja.
Saya menggunakan ASP.net untuk mengimplementasikan direktori klasifikasi tingkat tak terbatas non-rekursif dalam program sebelumnya, tetapi mengingat portabilitasnya tidak kuat, saya mengubahnya menjadi prosedur tersimpan dan mengirimkannya untuk dipelajari bersama oleh semua orang. selama proses pengujian tidak ditemukan masalah, selain itu kode belum dioptimasi.
Biasanya, sebagian besar operasi kita adalah membaca direktori, jadi dalam implementasi berikut, kita hanya memerlukan satu pernyataan Select untuk membaca. Tanpa rekursi, levelnya secara teori tidak terbatas~!
==================== =====
Struktur tabel:
Nama tabel: Tb_Column
Struktur tabel (semua kolom kosong):
Column_ID int kunci utama (catatan: non-identifier)
Nama_Kolom nvarchar(50) nama klasifikasi
Parent_ID ke dalam ID kategori Induk (nilai default 0)
Jalur klasifikasi Column_Path nvarchar(1000).
Column_Depth kedalaman klasifikasi int (nilai default 0)
Column_Order int sortir (default 0)
Deskripsi klasifikasi Column_Intro nvarchar(1000)
============= === ===
Prosedur tersimpan satu: Buat klasifikasi baru
BUAT PROSEDUR sp_Column_Insert
(
@Parent_ID masuk,
@Kolom_Nama nvarchar(50),
@Column_Intro nvarchar(1000)
)
SEBAGAI
Deklarasikan @Err Sebagai int
Setel @Err=0
Mulai Tran
--Dapatkan ID kolom dari catatan yang ada
Deklarasikan @Column_ID Sebagai int
Deklarasikan @Column_Depth Sebagai int
Pilih @Column_ID = Maks(Column_ID) Dari Tb_Column
JIKA @Column_ID Bukan Null
Tetapkan @Kolom_ID = @Kolom_ID+1
Kalau tidak
Setel @Column_ID = 1
-- Tentukan apakah kolom tersebut merupakan kolom tingkat atas dan atur Column_Path dan Column_Ordernya
Deklarasikan @Column_Path Sebagai nvarchar(1000)
Deklarasikan @Column_Order Sebagai int
JIKA @Parent_ID = 0
Mulai
Setel @Column_Path =Ltrim(Str(@Column_ID))
Pilih @Column_Order = Maks(Column_Order) Dari Tb_Column
JIKA @Column_Order Bukan Null
Tetapkan @Column_Order = @Column_Order + 1
Else --Jika tidak ada rekaman yang ditemukan, berarti ini adalah rekaman pertama
Setel @Column_Order = 1
--Kedalaman
Setel @Kolom_Kedalaman = 1
Akhir
Kalau tidak
Mulai
--Dapatkan jalur dan kedalaman node induk
Pilih @Column_Path = Column_Path ,@Column_Depth = Column_Depth Dari Tb_Column Dimana
Column_ID=@Parent_ID
JIKA @Column_Path Adalah Null
Mulai
Tetapkan @Err = 1
Pergi ke Akhir
End
--Dapatkan nomor urut maksimum di bawah node induk yang sama
Pilih @Column_Order = Max(Column_Order) Dari Tb_PicColumn Dimana Column_Path seperti
''+@Column_Path+'|%' Atau Column_ID = @Parent_ID
IF @Column_Order Bukan Null --Jika nomor urut ada, tambahkan 1 pada semua nomor urut setelah nomor urut
Mulai
--Perbarui nomor urut semua node setelah node saat ini yang akan dimasukkan
Perbarui Tb_Column Set Column_Order = Column_Order +1 Dimana Column_Order
>@Column_Order
--Nomor urut maksimum di bawah simpul induk yang sama ditambah 1 membentuk nomor urutnya sendiri
Tetapkan @Column_Order = @Column_Order + 1
Akhir
Kalau tidak
Mulai
Setel @Err=1
Pergi ke Akhir
End
--Jalur node induk ditambah nomor ID-nya sendiri membentuk jalurnya sendiri
Setel @Column_Path = @Column_Path + '|' + Ltrim(Str(@Column_ID))
--Kedalaman
Setel @Column_Depth = @Column_Depth+1
Akhir
Sisipkan Ke Tb_Column(Column_ID,Column_Name,Parent_ID,Column_Path,
Column_Depth,Column_Order,Column_Intro) Nilai(@Column_ID,@Column_Name,@Parent_ID,@Column_Path,@Column_Depth,@Column _Order, @Kolom_Intro )
JIKA @@Kesalahan<>0
Mulai
Setel @Err=1
Pergi ke Akhir
End
--Perbarui ORDER rekaman setelah rekaman saat ini
--Perbarui Tb_Column Set Column_Order = Column_Order+1 Dimana Column_Order > @Column_Order
theEnd:
JIKA @Err=0
Mulai
Komit Trans
Kembalikan @Column_ID
Akhir
Kalau tidak
Mulai
Kembalikan Tran
Kembali 0
Akhir
PERGI
===== =============
Prosedur tersimpan dua: hapus kategori
BUAT PROSEDUR sp_Column_Delete
(
@Kolom_ID ke dalam
)
SEBAGAI
Deklarasikan @Err Sebagai int
Setel @Err = 0
Mulai Tran
--Pertama periksa apakah ada node anak di bawah node
Pilih Column_ID Dari Tb_Column Dimana Parent_ID = @Column_ID
JIKA @@RowCount<>0
Mulai
Tetapkan @Err = 1
Pergi ke Akhir
Akhir
-- Dapatkan Column_Order dari node, untuk mengurutkan urutan catatan lain setelah penghapusan
Deklarasikan @Column_Order Sebagai int
Pilih @Column_Order = Column_Order Dari Tb_Column Dimana Column_ID = @Column_ID
JIKA @Column_Order bernilai NUll
Mulai
Setel @Err =2
Pergi ke Akhir
Akhir
--Perbarui Column_Order catatan lainnya
Perbarui Tb_Column Set Column_Order = Column_Order -1 Dimana Column_Order >@Column_Order
JIKA @@ Kesalahan<>0
Mulai
Setel @Err =3
Pergi ke Akhir
Akhiri
--hapus operasi
Hapus Dari Tb_Column Dimana Column_ID=@Column_ID
JIKA @@ Kesalahan<>0
Mulai
Setel @Err =4
Pergi ke Akhir
Akhir
--Perbarui Column_ID catatan lainnya
--Perbarui Tb_Column Set Column_ID= Column_ID - 1 Dimana Column_ID >@Column_ID
--JIKA @@Kesalahan<>0
-- Mulai
-- Tetapkan @Err =5
-- Pergi ke Akhir
-- Akhiri Akhir
:
JIKA @Err = 0
Mulai
Komit Trans
Kembali 0 --Hapus berhasil
Akhir
Kalau tidak
Mulai
JIKA @Err=1
Mulai
Kembalikan Tran
Return 1 --memiliki node anak
Akhir
Kalau tidak
Mulai
Kembalikan Tran
Kembali 2--Kesalahan tidak diketahui
Akhir
Akhir
PERGI
==================== ================
Prosedur tersimpan tiga: Edit klasifikasi
BUAT PROSEDUR sp_Column_Update
(
@Kolom_ID ke dalam,
@Parent_ID masuk,
@Kolom_Nama nvarchar(50),
@Column_Intro nvarchar(1000)
)
SEBAGAI
Deklarasikan @Err Sebagai int
Setel @Err=0
Begin Tran
--Dapatkan nilai sebelum modifikasi: Parent_ID, Column_Depth, Column_Order
Deklarasikan @oParent_ID Sebagai int
Deklarasikan @oColumn_Depth Sebagai int
Deklarasikan @oColumn_Order Sebagai int
Deklarasikan @oColumn_Path Sebagai nvarchar(1000)
Pilih @oParent_ID = Parent_ID, @oColumn_Depth = Column_Depth,@oColumn_Order = Column_Order, @oColumn_Path = Column_Path Dari Tb_Column Dimana Column_ID = @Column_ID
JIKA @oParent_ID Tidak Ada
Mulai
Tetapkan @Err = 1
Pergi ke Akhir
Akhir
--Jika ID induk belum berubah, langsung ubah nama kolom dan pengenalan kolom.
JIKA @oParent_ID = @Parent_ID
Mulai
Perbarui Tb_Column Set Column_Name = @Column_Name,Column_Intro = @Column_Intro Dimana Column_ID = @Column_ID
JIKA @@ Kesalahan <> 0
Tetapkan @Err = 2
Pergi ke Akhir
Akhir
Deklarasikan @nColumn_Path Sebagai nvarchar(1000)
Deklarasikan @nColumn_Depth Sebagai int
Deklarasikan @nColumn_Order As int
-- Dapatkan jumlah node yang terdapat dalam node saat ini sebagai node induk [termasuk node itu sendiri] Catatan: Jika "1" dikembalikan, artinya node tersebut adalah node tunggal
Deklarasikan @theCount Sebagai int
Pilih @theCount = Count(Column_ID) Dari Tb_Column Dimana Column_ID=@Column_ID Atau Column_Path seperti ''+@oColumn_Path+'|%'
JIKA @theCount Adalah Null
Mulai
Tetapkan @Err = 3
Pergi ke Akhir
End
IF @Parent_ID=0 --Jika ditetapkan sebagai node tingkat teratas, atur node tersebut ke node tingkat teratas terakhir
Mulai
--Cetak 'Tetapkan sebagai kolom tingkat atas'
Setel @nColumn_Path = Ltrim(Str(@Column_ID))
Tetapkan @nColumn_Depth =1
Pilih @nColumn_Order = Maks(Column_Order) Dari Tb_Column
JIKA @nColumn_Order Adalah NULL
Mulai
Tetapkan @Err = 4
Pergi ke Akhir
End
Set @nColumn_Order = @nColumn_Order - @theCount + 1
--Update tiga bagian 1 Node itu sendiri 2 Semua node anak 2 Urutan record berikutnya sebelum pohon ini berubah
--Cetak 'Perbarui semua kolom setelah posisi sebelumnya dari kolom ini [tidak termasuk sub-kolom di bawah kolom ini]: Column_Order'
Perbarui Tb_Column Set Column_Order = Column_Order-@theCount Where (Column_Order >@oColumn_Order) Dan (Column_Path Tidak seperti ''+@oColumn_Path+'|%' )
JIKA @@ Kesalahan <> 0
Mulai
Tetapkan @Err = 7
Pergi ke Akhir
Akhir
--Cetak 'Perbarui kolom ini: ID_Induk, Jalur_Kolom, Kedalaman_Kolom, Urutan_Kolom, Nama_Kolom, Kolom_Intro'
Cetak 'Pesanan : '+Ltrim(Str(@nColumn_Order))
Perbarui Tb_Column Set Parent_ID=@Parent_ID,Column_Path = @nColumn_Path,Column_Depth = @nColumn_Depth,Column_Order = @nColumn_Order, Column_Name = @Column_Name,Column_Intro = @Column_Intro Dimana Column_ID = @Column_ID
JIKA @@ Kesalahan <> 0
Mulai
Tetapkan @Err = 5
Pergi ke Akhir
End
--Print 'Perbarui semua sub-kolom di bawah kolom ini: Column_Path, Column_Depth, Column_Order'
Perbarui Tb_Column Set Column_Path = Ganti(Column_Path,@oColumn_Path,@nColumn_Path),Column_Depth = Column_Depth + (@nColumn_Depth-@oColumn_Depth),Column_Order = Column_Order+( @nColumn_Order-@oColumn_Order) Di mana Column_Path suka ''+@oColumn_Path+' |%'
JIKA @@ Kesalahan <> 0
Mulai
Tetapkan @Err = 6
Pergi ke Akhir
Akhir
Akhir
Kalau tidak
Mulai
--Dapatkan informasi yang relevan dari simpul induk masa depan dan tetapkan nilai yang relevan dari simpul ini
Pilih @nColumn_Depth = Column_Depth,@nColumn_Path = Column_Path Dari Tb_Column Dimana Column_ID = @Parent_ID
JIKA @nColumn_Depth Adalah NULL Atau @nColumn_Path Adalah Null
Mulai
Tetapkan @Err = 8
Pergi ke Akhir
Akhir
Setel @nColumn_Depth = @nColumn_Depth +1
Pilih @nColumn_Order =Max(Column_Order) Dari Tb_Column Dimana Column_ID = @Parent_ID Atau Column_Path seperti ''+@nColumn_Path+'|%'
JIKA @nColumn_Order Adalah NULL
Mulai
Tetapkan @Err = 9
Pergi ke Akhir
End
Set @nColumn_Path = @nColumn_Path +'|'+ Ltrim(Str(@Column_ID))
IF @nColumn_Order = @oColumn_Order+1 --Jika node induk baru adalah saudara terdekat di atas posisi semula, urutan semua node akan menjadi berbeda
Mulai
Perbarui Tb_Column Set Parent_ID=@Parent_ID,Column_Path = @nColumn_Path,Column_Depth = @nColumn_Depth, Column_Name = @Column_Name,Column_Intro = @Column_Intro Dimana Column_ID = @Column_ID
JIKA @@ Kesalahan <> 0
Mulai
Tetapkan @Err = 10
Pergi ke Akhir
Akhir
End
Set @nColumn_Order = @nColumn_Order + 1
--Perbarui tiga bagian 1 Urutan catatan berikut (atau sebelumnya) sebelum pohon ini berubah 1 Node itu sendiri 3 Semua node anak
--Dibagi menjadi gerakan ke atas atau gerakan ke bawah
--Cetak 'Perbarui semua kolom setelah posisi sebelumnya dari kolom ini [atau posisi setelah kolom ini] [tidak termasuk sub-kolom di bawah kolom ini]: Column_Order'
JIKA @nColumn_Order < @oColumn_Order
Mulai
Perbarui Tb_Column Set Column_Order = Column_Order+@theCount Dimana Column_Order<@oColumn_Order Dan Column_Order >=@nColumn_Order Dan (Column_Path Tidak seperti ''+@oColumn_Path+'|%' ) Dan Column_ID<>@Column_ID
JIKA @@ Kesalahan <> 0
Mulai
Tetapkan @Err = 12
Pergi ke Akhir
Akhir
Akhir
Kalau tidak
Mulai
Perbarui Tb_Column Set Column_Order = Column_Order-@theCount Dimana Column_Order >@oColumn_Order Dan Column_Order<@nColumn_Order Dan (Column_Path Tidak seperti ''+@oColumn_Path+'|%' ) Dan Column_ID<>@Column_ID
JIKA @@ Kesalahan <> 0
Mulai
Tetapkan @Err = 13
Pergi ke Akhir
Akhir
Akhir
--Cetak 'Perbarui kolom ini: ID_Induk, Jalur_Kolom, Kedalaman_Kolom, Urutan_Kolom, Nama_Kolom, Kolom_Intro'
Cetak 'Pesanan : '+Ltrim(Str(@nColumn_Order))
JIKA @nColumn_Order > @oColumn_Order
Tetapkan @nColumn_Order = @nColumn_Order - @theCount
Perbarui Tb_Column Set Parent_ID=@Parent_ID,Column_Path = @nColumn_Path,Column_Depth = @nColumn_Depth,Column_Order = @nColumn_Order, Column_Name = @Column_Name,Column_Intro = @Column_Intro Where Column_ID = @Column_ID
JIKA @@ Kesalahan <> 0
Mulai
Tetapkan @Err = 10
Pergi ke Akhir
End
--Print 'Perbarui semua sub-kolom di bawah kolom ini: Column_Paht, Column_Depth, Column_Order'
Perbarui Tb_Column Set Column_Path = Ganti(Column_Path,@oColumn_Path,@nColumn_Path),Column_Depth = Column_Depth + (@nColumn_Depth-@oColumn_Depth),Column_Order = Column_Order+(@nColumn_Order-@oColumn_Order) Dimana Column_Path suka ''+@oColumn_Path+'| %'
JIKA @@ Kesalahan <> 0
Mulai
Tetapkan @Err = 11
Pergi ke Akhir
Akhir
Akhiri
Akhir:
IF @Err<>0 --Jika ada kesalahan, kembalikan nomor kesalahannya
Mulai
Kembalikan Tran
Kembalikan @Err
Akhir
Lain --mengembalikan 0 jika tidak ada kesalahan
Mulai
Komit Trans
Kembali 0
Akhir
PERGI
==================== ==========
Prosedur tersimpan empat: klasifikasi tampilan (hanya pernyataan pilih)
Daftar kategori:
BUAT PROSEDUR sp_Column_List
SEBAGAI
PILIH ID_Kolom, Nama_Kolom, ID_Induk, Jalur_Kolom, Kedalaman_Kolom,
Kolom_Urutan, Kolom_Intro
DARI Tb_Kolom
ORDER BERDASARKAN Kolom_Pesanan
PERGI
=========
Berikut ini contoh penggunaan ASP.NET yang diposting di forum teman:
http://www.mzline.com/bbs/dispbbs.asp?boardID=67&ID=5044&replyID=25788&star=1&skin=0#25788