PDA

View Full Version : سوال: به وجود اوردن یک view با کد نویسی و نمایش اون تو کریستال ریپورت



mina.net
چهارشنبه 30 اردیبهشت 1388, 00:11 صبح
سلام دوستان
دوستان یک مشکلی برام پیش اومد می خواستم از طریق برنامه نویسی تومحیط vb.net یک view به وجود بیارم و در کریستال ریپورت نمایش بدم و سپس حذفش کنم چطور این کار عملی هست. هر سه مرحله رو کامل بفرمایید.
در ضمن دیتابسم SQL هست.

mina.net
چهارشنبه 30 اردیبهشت 1388, 02:00 صبح
سلام دوستان
جناب anooshiran کمک کردن نحوه ساختن و حذف view رو فهمیدم کدش رو می زارم دوستای دیگه هم استفاده کنن.
من تو دیتا گرید نمایش دادم اگه بخواهیم همین رو تو کریستال ریپورت نمایش بدیم باید چیکار کرد.




Dim sqlCon AsNew SqlClient.SqlConnection("Server=PC3\SQLEXPRESS;database=anbar;uid=barbod;pw d=")
Dim sqlDtAdp AsNew Data.SqlClient.SqlDataAdapter("", sqlCon)
Dim sqlCom AsNew SqlClient.SqlCommand("", sqlCon)
Dim dSet AsNew DataSet
Dim dTable AsNew DataTable
If sqlCon.State = ConnectionState.Closed Then sqlCon.Open()
Dim viewName AsString = "Mandeh"
Dim DropText AsString = Nothing

DropText =

"IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS " + _

"WHERE TABLE_NAME = '" + viewName + "' )" + _
"DROP VIEW " + viewName
Try
With sqlCom
.Parameters.Clear()
.CommandText = DropText
.ExecuteNonQuery()
EndWith
Catch ex As Exception
EndTry
Dim ViewStr AsString = Nothing
ViewStr =

" CREATE VIEW " & "'" & viewName & "' as select id,name from tablename "


With sqlCom
.Parameters.Clear()
.CommandText = ViewStr
.ExecuteNonQuery()
EndWith
sqlDtAdp.SelectCommand.CommandText =

"SELECT * " & "'" & viewName & "' "

dSet =

New DataSet

sqlDtAdp.Fill(dSet, viewName)
DataGridView1.DataBindings.Clear()
DataGridView1.DataSource = dSet.Tables(viewName)
sqlCon.Close()

adinochestva
چهارشنبه 30 اردیبهشت 1388, 02:11 صبح
البته ایجاد و از بین بردن یک view کار عقلانه ای نیست از temp table ها استفاده کنید بهتره

alimanam
چهارشنبه 30 اردیبهشت 1388, 02:58 صبح
با عرض سلام خدمت تمامی دوستان

اگه منظور شما از ویو فیلتر کردن اطلاعات باشه شما می تونین گزارش خودتون رو طراحی کنین بعد از یک فرم برای نمایش گزارش تهیه کنین و در اون فرم از کنترل کریستال ریپورت استفاده کنین بعد در منو بار یا هرجای دیگه ایی که مدنظرتونه و می خواین اطلاعات به صورت فیلتر شده نمایش داده بشه کدهای زیر رو وارد می کنین .

Imports System.Data.SqlClient

و در ادامه

Dim cr2 As New Report1
Dim mycn As SqlClient.SqlConnection
Dim da As SqlClient.SqlDataAdapter
Dim ds As DataSet

mycn = New SqlClient.SqlConnection(constr)
da = New SqlClient.SqlDataAdapter("Select * from TableName", mycn)
ds = New DataSet
mycn.Open()

da.Fill(ds, "TableName")
cr2.SetDataSource(ds.Tables("TableName"))
frmReport.CrystalReportViewer1.ReportSource = cr2
mycn.Close()
frmReport.Show() ' فرم نمايش گزارش
شما می تونین هرنوع کوری که دوست دارین با این روش بگیرین و بریزین توی دیتاست خودتون .

یا علی

anooshiran
چهارشنبه 30 اردیبهشت 1388, 14:12 عصر
البته ایجاد و از بین بردن یک view کار عقلانه ای نیست از temp table ها استفاده کنید بهتره
دوست عزيز

كمي در بكار بردن لغات احتياط كن . دليل نداره هر چي به فكرت ميرسه به زبان بياري . شايد اين كار تو اصلا عاقلانه نباشه.

mina.net
چهارشنبه 30 اردیبهشت 1388, 17:14 عصر
اگه منظور شما از ویو فیلتر کردن اطلاعات باشه شما می تونین گزارش خودتون رو طراحی کنین بعد از یک فرم برای نمایش گزارش تهیه کنین و در اون فرم از کنترل کریستال ریپورت استفاده کنین بعد در منو بار یا هرجای دیگه ایی که مدنظرتونه و می خواین اطلاعات به صورت فیلتر شده نمایش داده بشه کدهای زیر رو وارد می کنین

دوست عزیز سلام
منظور من صرفا فیلتر نبود چون به کریستال ریپورت خیلی آشنایی ندارم می خواستم اینطوری یک ترفندی بزنم تا بتونم این کارو بکنم ولی الان که روش شما رو می بینم خیلی بهتره ظاهرا
بازم ممنون از راهنمایی که کردید.

anooshiran
چهارشنبه 30 اردیبهشت 1388, 20:10 عصر
سلام دوست عزيز

از آنجاييكه ديدم با sql enterprize manager مشكل داري بنابر اين كارت راحت كرد و م يك برنامه نوشتم كه براي تو وبسياري از دوستاني كه با كدنويسي ado.net مشكل دارن ميتونه تا حدي يك كلاس آموزشي هم باشه .
اين برنامه البته هنوز خيلي كار داره ولي من اين رو سريعا گذاشتم تا شما مشكلت حل بشه
در اين برنامه مي توان database و جداول مورد نياز را ساخت و همچنين جدول را با اطلاعات از پيش آماده پر كرد.
در ضمن برنامه select رو هم تغييراتي درش دادم و ورژن جديدشو ضمبمه مي كنم.

پس اول برنامه sql_services رو اجرا كن و هر سه مرحلشو به ترتيب اجرا كن تا جداولت ساخته بشه.
بعد از آن select را اجرا كن و مابين تاريخ هاي مختلف گزارش بگير
اگر باز هم مشكلي بود در خدمت هستم.

خوشحال ميشم اگر دوستان نظرات خودشون را مطرح كنن.

mina.net
چهارشنبه 30 اردیبهشت 1388, 23:16 عصر
از آنجاييكه ديدم با sql enterprize manager مشكل داري بنابر اين كارت راحت كرد و م يك برنامه نوشتم كه براي تو وبسياري از دوستاني كه با كدنويسي ado.net مشكل دارن ميتونه تا حدي يك كلاس آموزشي هم باشه .

دوست عزیز سلام
از اینکه به فکر امثال مثل من (جوجه برنامه نویسا ) هستی ممنون .
می خواستم یک تاپیک بزنم در رابطه با تولید و مدیریت ابجکتها در SQL از طریق VB.net شاید عنوان رو خوب نگفتم و شما عنوان بهتری انتخاب کنید ولی با این حرفی که شما زدید فکر کنم اگه شما این زحمت قبول کنید بهتر باشه.دوستان دیگه هم مسلما کمک خواهند کرد. اینطوری همه زحمات گردن شما نیست.

mina.net
پنج شنبه 31 اردیبهشت 1388, 19:29 عصر
سلام دوستان
جناب anooshiran من دستوری مشابه شما نوشتم کار هم می کنه و از دستور شما هم استفاده کردم. همچی هم خوبه ولی فقط یک اشکال وجود داره. فرض کنید برای یک حساب در یک تاریخ دو روکود یا بیشتر ثبت بشه. مثلا خرید کرده و در ضمن مبلغی هم پرداخت کرده در این صورت این دستوری که شما نوشتید و مشابه همین رو من نوشتم هر دو رکورد رو یک اندازه نشون می دن چون تاریخ هر دو یکی هست و ما شرط رو تاریخ گذاشتیم . بعضی از دوستان گفتن از id استفاده کنم خودتون می دونید که نمی شه کاربر من من می خواد به ترتیب تاریخ بدونه نه id .
من فکر کردم اگه بتونیم بعد از order by کردن یک فیلد دیگه بسازیم به صورت run time و نام اون رو مثلا ردیف بزاریم و سپس به ترتیب تاریخ بهش مقدار بدیم البته اگه در یک تاریخ برای یک حساب دو رکورد ثبت شده دو مقدار متفاوت نیز بگیرند. اگه بفرمایید چطور می شه این کار رو کرد می شه این دفعه از همین دستور select استفاده کرد ولی ایندفعه بجای تاریخ از شرط id استفاده کنیم.
دستور select ی که خودم نوشتم رو هم می زارم.



str_select = "select mainid,sharh,BED,BEST,tarikh,(select case when (sum(bed)-sum(best))<0" + _
"then '0' else (sum(bed)-sum(best))end from bed_best where tarikh <t1.tarikh+1" + _
"and id ='" & TextBox1.Text & "' ) as mbed,(select case when (sum(best)-sum(bed))<0 then" + _
"'0' else (sum(best)-sum(bed))end from bed_best where tarikh <t1.tarikh+1 and " + _
"id ='" & TextBox1.Text & "' ) as mbest from bed_best t1 where id = " + _
"'" & TextBox1.Text & "' order by tarikh"

anooshiran
پنج شنبه 31 اردیبهشت 1388, 21:23 عصر
سلام دوست عزيز

اگر خوب توجه كني من بر اساس قيلدي به نام radif عمل مي كنم و براساس اون دارم محاسباتم رو انجام مي دم تا view را بسازم.
از تارسخ زماني استفاده مي كنم كه ميخولم از view ي ايجاد شده select كنم.

mina.net
پنج شنبه 31 اردیبهشت 1388, 21:36 عصر
سلام دوست عزيز

اگر خوب توجه كني من بر اساس قيلدي به نام radif عمل مي كنم و براساس اون دارم محاسباتم رو انجام مي دم تا view را بسازم.
از تارسخ زماني استفاده مي كنم كه ميخولم از view ي ايجاد شده select كنم.

یعنی دو باره این کارو برای تاریخ تکرار کنم. چه فرقی می کنه نتیجه همون می شه. فکر کنم اگه عملی باشه که ابتدا سورت کنیم و یک فیلد بهش اضافه کنیم به نام ردیف بهتر باشه. البته من نمی دونم چطور باید این کار رو کرد. اگه می شه بیشتر توضیح بدید. از هر راهی که بنظرتون عملی هست بگید.
در ضمن من توضیحات بیشتری در تاپیک زیر قرار دادم دوستانی که نمی دونن من راجع به چی می گم اینجا مراجعه کنن.
http://barnamenevis.org/forum/showthread.php?p=726953#post726953

anooshiran
جمعه 01 خرداد 1388, 00:54 صبح
سبام دوست عزيز

برنامه هاي را كه برات ضميمه كردم رو خوب توجه كن

فكر كن تو از 01/01/1387 الي 25/12/1387 عمليات انجام دادي

حالا ميخواي مثلا يك گزارش گردش حساب از تاريخ 15/04/1387 الي هر تاريخي داشته باشي. آيا نبايد مانده تا قبل از اولين آرتيكل گزارشت حساب بشه و تو اين گزارش بياد؟

تو برنامه من مثلا از تاريخ 01/03/1387 تا 06/06/1387 گزارش بگير

ببين مانده اي قبل رو هم حساب ميكنه و مانده اولين سطرت با محاسبه مانده هاي قبل نشان داده ميشه.

اين بود كه گفتم كار سختي شد