PDA

View Full Version : treeview in database



tefos666
شنبه 22 تیر 1387, 21:30 عصر
سلام دوستان

من یه فرم دارم که توش یه درختواره گذاشتم که گزارشات سیستمم رو لود میکنه و این درختواره نا محدود هستش از 3 سطح بیشتره چون یه فرم دیگه دارم که کاربر میتونه شاخه اضافه کنه و گزارش حالا درخت رو قابلیت چک باکس دار کردن گذاشتم و وقتی کاربر رو شاخه کلیک کنه تمام گزارشات زیر شاخش چک میخوره و اونا تو دیتابیسم ذخیره میشه حالا 2 تا مشکل دارم یک :
چه جور سلکتی بزنم و یا چه دستوری که وقتی رو یه دکمه کلیک کردم بره از تو دیتابیسم همونا که چک خورده رو لود کنه و دوباره رو درخت نشون بده (نمایش دسترسی کاربر)

دو : من با ذخیره خود شاخه ها مشکل دارم یعنی فکر کنم مشکل تو node.key باشه نمیدونم چجوری استفادش کنم یعنی وقتی رو شاخه کلیک میکنم میخوام ذخیره کنم error میده ولی تو ذخیره خود زیر شاخه هام مشکلی ندارم

برای اینکه دوستان هم از کد اگه قابل دیدن استفاده کنند و هم منو راهنمایی کنند کدش رو میزارم اینجا چون تو سایت که میدیدم خیلی ها با این مشکل بی جواب مونده بودن

یه درخت رو فرمتون بزارید و با دستور زیر اونو چک باکس دار کنید در اینجا اسم درخت من TreeR2 هستش


TreeR2.Checkboxes = True

کد اول برای اینه که وقتی روی چک باکسی کلیک کردین تمام زیر مجموعه هاش تیک بخوره و بلعکس




Private Sub CheckNodes(ByRef oParentNode As Node, ByVal bChecked As Boolean)
Dim oNode As Node
' Get the first child node
Set oNode = oParentNode.Child
' Loop through the child nodes of this node
' until there are none left...
Do While Not oNode Is Nothing
' Check/Uncheck the node
oNode.Checked = bChecked
' Call this function again for the
' child node, so that it's child nodes
' can get checked/unchecked.
CheckNodes oNode, bChecked
' Get the next child node of this node
Set oNode = oNode.Next
Loop
End Sub

ضمنا من یک کمبو باکس دارم که اطلاعات نام کاربرام رو لود میکنه
خوب یه دکمه گذاشتم که ثبت اطلاعات رو بکنه که رو شاخه هام خطا میده ولی گزارشات رو ثبت میکنه

Private Sub cmdLoad_Click()


For k = 1 To TreeR2.Nodes.Count
If TreeR2.Nodes(k).Checked = True Then
خودم حدس میزنم گیرم رو این خط باشه
Call prcRecordset(Rs, "INSERT INTO raccess(u, r)VALUES('" + Trim(cmbuser.BoundText) + "', '" + Right(TreeR2.Nodes(k).key, Len(TreeR2.Nodes(k).key) - 4) + "')")
End If
Next
'End If
'End With
MsgBox "دسترسی برای کاربر ثبت شد"
PushButton1.Enabled = False
cmdLoad.Enabled = False

End Sub


خوب دوستان من اینا رو گفتم لطفا اگه کسی میتونه کمکم کنه بگه چجوری دوباره ذخیره شده ها رو لود کنم (نمایش دسترسی) و مشکل با شاخه ها رو چجوری حل کنم

توضیح : من خودم یکسری تابع واسه کانکت شدن به دیتابیس نوشتم مثل اون RS و prcRecordset که کارم رو راحت کنه

http://barnamenevis.org/forum/attachment.php?attachmentid=20302&stc=1&d=1215883769

sohrab o
شنبه 22 تیر 1387, 21:43 عصر
خیلی توضیحات واضح نیست.

tefos666
شنبه 22 تیر 1387, 23:19 عصر
http://barnamenevis.org/forum/attachment.php?attachmentid=20315&stc=1&d=1215890323

tefos666
شنبه 22 تیر 1387, 23:28 عصر
دوست عزیز من شکلش رو گذاشتم امیدوارم مفهوم باشه

من وقتی یک یوزر رو انتخاب میکنم و دسترسی هاشو تیک میزنم و ثبت کردم و فرم رو دوباره باز کردم و دوباره همون یوزر رو انتخاب کردم و نمایش دسترسی رو زدم باید همونا که تیک خورده رو نشون بده این اطلاعاتم هم از database باید لود بشه - همونطوری که ذخیره شد


مشکل من اینه که فقط گزارشاتم ثبت میشه اگه یکدوم از اون شاخه ها رو تیک بزنم کلا خطا میده و اصلا insert نمیشه

در صورتی که باید شاخه ها هم ثبت بشن - مشکل بعدی هم اینه که نمیدونم چجوری اونا رو که ذخیره کردم دوباره load کنم

خیلی توضیحش راحته save - restore تو دیتابیس فقط تو restore کردن مشکل دارم و وقتی تو درخت شاخه انتخاب میشه خطا میده (خودم فکر میکنم بخاطر key باشه )

shaghaghi
یک شنبه 23 تیر 1387, 09:21 صبح
سلام
لطفا تصویر یا متنی از پنجره خطا را آپلود نمایید
ارتباط رکوردهای ایجاد کننده درختواره در جدولتان چگونه تعیین میشود (ارتباط پدر و فرزندی) مثلا از کجا تشخیص می دهید سر شاخه کالا شامل آیتم های صدور حواله دفتر مرکزی و ... است؟
کلید هر کدام از node ها را برابر کدام فیلد قرار می دهید؟

tefos666
یک شنبه 23 تیر 1387, 14:19 عصر
سلام ممنون از اینکه قصد کمک کردن داری

آره دقیقا رابطه پدر فرزندی هستش - من یه جدول دارم که اطلاعات سرشاخه ها رو تو اون نگه میدارم

ضمنا سورس این فرمم رو هم گذاشتم

http://barnamenevis.org/forum/attachment.php?attachmentid=20365&stc=1&d=1215944286

shaghaghi
یک شنبه 23 تیر 1387, 18:21 عصر
سلام
لود کردن موارد ذخیره شده کار پیچیده ای به نظر نمی آید، وقتی شما کد هر آیتم را بعنوان کلید node مربوط به آن در نظر می گیرید، کافیست با کمک یک رکوردست حقوق دسترسی کاربر مورد نظر را از جدول بدست آورده، به ازای هر کدام از رکوردها با کمک دستور for ... Next بین node های موجود در treeview آن node ی که مقدار کلیدش برابر فیلد کد رکوردست است را پیدا کرده و خاصیت چک باکس آنرا فعال کنید
در دستور sql ی که با مشکل مواجه شدید، بین VALUES و پرانتز قبل آن space بگذارید

tefos666
یک شنبه 23 تیر 1387, 21:22 عصر
بازم ممنون ولی مشکلم همچنان باقیست !!! :گریه:

میدونی اصلا بهتره یه کار دیگه بکنم - چجوری میتونم چک باکس مربوط به سرشاخه ها رو
حذف کنم و فقط گزارشاتم چک باکس داشته باشه ؟ اینجوری فکر کنم مشکلم برطرف بشه هرچند که به دلم نمیشینه چون اونجوری دیگه کاربر قابلیت select all نداره ولی با این وجود از هیچی بهتره . لطفا اگر میدونید راهنمایی کنید

tefos666
دوشنبه 24 تیر 1387, 09:50 صبح
دوستان کسی نمیتونه مشکل من رو حل کنه :گریه:

shaghaghi
دوشنبه 24 تیر 1387, 16:58 عصر
بازم ممنون ولی مشکلم همچنان باقیست !!! :گریه:

چه مشکلی؟؟؟ راه حلی که گفتم ساده و بدون ابهام بود!!! دقیقا بفرمایید کدام قسمت قابل اجرا نبود و چه پیغامی داد؟



میدونی اصلا بهتره یه کار دیگه بکنم - چجوری میتونم چک باکس مربوط به سرشاخه ها رو
حذف کنم و فقط گزارشاتم چک باکس داشته باشه ؟ اینجوری فکر کنم مشکلم برطرف بشه هرچند که به دلم نمیشینه چون اونجوری دیگه کاربر قابلیت select all نداره ولی با این وجود از هیچی بهتره . لطفا اگر میدونید راهنمایی کنید
خاصیت checkbox در یک treeview به نسبت تمام node ها می تواند فعال و غیر فعال می شود نه به نسبت node خاص!! (برای اختصاص چک باکس به شاخه های خاص، سراغ شبیه سازی چک باکس فعال و غیر فعال با کمک آیکون بروید)
اما مشکل شما با برداشتن چک باکس حل نمی شود!!
کمی به عقب باز گردیم، لطفا مقدار فیلد (true\false) را که می خواهید به چک باکس هر node ارجاع دهید در tag هر node قرار دهید و آنرا msgbox کنید! اگر تا این مرحله کار درست انجام شد مابقی کار براحتی حل خواهد شد.

tefos666
یک شنبه 30 تیر 1387, 22:16 عصر
مرسی مشکلم حل شد




Private Sub PushButton1_Click()
On Error Resume Next
Dim i As Integer
Dim j As Integer
Dim n, k As Integer

Call prcRecordset(Rs, "Select * from Raccess where u='" + Trim(cmbuser.BoundText) + "'")
If Rs.RecordCount > 0 Then
For j = 1 To Rs.RecordCount
For k = 1 To TreeR2.Nodes.Count

If CStr(Rs!R) = Right(TreeR2.Nodes(k).key, 4) Then

TreeR2.Nodes(k).Checked = True
' Dim a As Integer
' a = Left(TreeR2.Nodes(k).key, 2)
Exit For
End If
Next k
Rs.MoveNext
Next j
End If
End Sub

Private Sub cmdSave_Click()
On Error Resume Next

Dim rs110 As New ADODB.Recordset
Call prcRecordset(Rs, " delete from RAccess where U='" + Trim(cmbuser.BoundText) + "'")
For k = 1 To TreeR2.Nodes.Count

If TreeR2.Nodes(k).Checked = True Then
Call prcRecordset(Rs, "exec raccessinserter '" + Trim(cmbuser.BoundText) + "', '" + Right(TreeR2.Nodes(k).key, Len(TreeR2.Nodes(k).key) - 4) + "','" + TreeR2.Nodes(k).Text + "'")
Else

If TreeR2.Nodes(k).Checked = False Then
Call prcRecordset(rs110, "delete raccess where u=" + Trim(cmbuser.BoundText) + " and r=" + Right(TreeR2.Nodes(k).key, Len(TreeR2.Nodes(k).key) - 4))
End If
End If
Next
MsgBox "دسترسي گزارشات براي کاربر فوق ثبت شد"
PushButton1.Enabled = False
cmdSave.Enabled = False
TreeR2.Enabled = False
cmbuser.BoundText = 0
'TreeR2.Nodes.Item(Node.Index).Root.Expanded = False
End Sub


success is doing , not wishing :تشویق: