PDA

View Full Version : اضافه کردن یک TEMP TABLE به دیتا ست و گزارش گیری از آن



mina.net
دوشنبه 22 تیر 1388, 14:26 عصر
سلام دوستان
من برای گزارشگیری از دیتا ست استفاده می کنم . گاهی لازم می شود که از TEMP TABLE استفاده شود ولی به خاطر اینکه این Temp table در دیتا ست موجود نیست نتیجه گزارش خالی می باشد. برای رفع این مشکل چیکار می شه کرد. آیا می شه temp table را به دیتا ست اضافه کرد. از هر روشی بشه از temp table گزارش گرفت مهم نیست فقط می خوام که برنامه قابلیت جابجایی داشته باشه. یعنی روی سیستم های دیگر هم کار کنه.

mina.net
سه شنبه 23 تیر 1388, 12:10 عصر
دوستان کسی نمی خواد کمک کنه؟

__H2__
سه شنبه 23 تیر 1388, 20:00 عصر
سلام
میشه بفرمائید برای چی در گزارش نیاز به جدول موقت دارید؟! و یک مثال هم بزنید؟

mina.net
سه شنبه 23 تیر 1388, 21:49 عصر
سلام
میشه بفرمائید برای چی در گزارش نیاز به جدول موقت دارید؟! و یک مثال هم بزنید؟

سلام دوست عزیز ، ممنون از توجهی که دارید
من می خوام در یک برنامه حسابداری یک گزارش تهیه کنم که به علت تنوع فیلتری که روی گزارش ایجاد می شود لازم هست در مرحله انجام شود که علت اصلی آن تداخل عملگر or با سایر دستورات می باشد.


PrivateSub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If TextBox2.Text = ""And TextBox1.Text = ""And CheckBox1.Checked = FalseAnd CheckBox2.Checked = FalseAnd CheckBox3.Checked = FalseThen
MessageBoxFa.Show("لطفا ترکیب گزارش را مشخص کنید.", "هشدار", MessageBoxButtons.OK, MessageBoxIcon.Warning)
ExitSub
EndIf
'************************************************* ***********
Dim bol_where AsBoolean = False
Dim str_select AsString = ""
Dim sqlDtAdp AsNew Data.SqlClient.SqlDataAdapter("", con)
Dim sqlCom AsNew SqlClient.SqlCommand("", con)
If con.State = ConnectionState.Closed Then con.Open()
Dim DropText AsString = Nothing
DropText = "DROP TABLE #temp"
Try
With sqlCom
.Parameters.Clear()
.CommandText = DropText
.ExecuteNonQuery()
EndWith
Catch ex As Exception
EndTry
'************************************************* ****************************
str_select = "SELECT 'mbed' = SUM(bed_best.bed) - SUM(bed_best.best)," + _
" hesab.city,hesab.masir,bed_best.id, bed_best.complet_name, SUM(bed_best.bed) AS bed," + _
" SUM(bed_best.best) AS best INTO #temp FROM bed_best " + _
" INNER JOIN hesab ON bed_best.id = hesab.id_tafzil"' GROUP BY bed_best.id," + _
' " bed_best.complet_name,hesab.city,hesab.masir"
If TextBox2.Text <> ""Then' فیلتر برای شهر و مسیر
If ComboBox1.Text <> ""Then
If bol_where = TrueThen
str_select &= " and hesab.city=N'" & TextBox2.Text & "' and hesab.masir=N'" & ComboBox1.Text & "'"
Else
bol_where = True
str_select &= " where hesab.city=N'" & TextBox2.Text & "' and hesab.masir=N'" & ComboBox1.Text & "'"
EndIf
Else
If bol_where = TrueThen
str_select &= " and hesab.city=N'" & TextBox2.Text & "'"
Else
bol_where = True
str_select &= " where hesab.city=N'" & TextBox2.Text & "'"
EndIf
EndIf
EndIf
str_select &= " GROUP BY bed_best.id, bed_best.complet_name,hesab.city,hesab.masir"
'************************************************* ****************************
With sqlCom
.Parameters.Clear()
.CommandText = str_select
.ExecuteNonQuery()
EndWith
'************************************************* ****************************
bol_where = False
'************************************************* ****************************
str_select = "select id, complet_name,best,bed,mbed,city,masir from #temp "
If TextBox1.Text <> ""And TextBox1.Enabled = TrueThen
str_select &= " where complet_name=N'" & TextBox1.Text & "'"' فیلتر برای یک شخص مشخص
Else
If CheckBox1.Checked = TrueThen'افرادی بدهکار
If bol_where = TrueThen
str_select &= " or mbed>0 "
Else
bol_where = True
str_select &= " where mbed>0 "
EndIf
EndIf
If CheckBox2.Checked = TrueThen
If bol_where = TrueThen
str_select &= " or mbed<0 "'افراد بستانکار
Else
bol_where = True
str_select &= " where mbed<0 "
EndIf
EndIf
If CheckBox3.Checked = TrueThen' افراد بی حساب
If bol_where = TrueThen
str_select &= " or mbed=0 "
Else
bol_where = True
str_select &= " where mbed=0 "
EndIf
EndIf
EndIf
'************************************************* *********************************
Dim name_co AsString = ""
Dim cmd7 As SqlCommand = New SqlCommand("select name from k_af where id='7'", con)
Dim obj7 AsObject = cmd7.ExecuteScalar
If obj7 IsNot DBNull.Value = TrueAnd obj7 IsNotNothing = TrueThen
name_co = CType(obj7, String)
EndIf
'************************************************* ***
Dim info AsString = ""
Dim cmd11 As SqlCommand = New SqlCommand("select name from k_af where id='11'", con)
Dim obj11 AsObject = cmd11.ExecuteScalar
If obj11 IsNot DBNull.Value = TrueAnd obj11 IsNotNothing = TrueThen
info = CType(obj11, String)
EndIf
'************************************************* ***
da = New SqlClient.SqlDataAdapter(str_select, con)
ds = New DataSet
da.Fill(ds, "temp")
Dim cr2 AsNew RptBedBest
cr2.SetDataSource(ds.Tables("temp"))
If CheckBox4.Checked = TrueThen
cr2.SetParameterValue("name_co", name_co)
Else
cr2.SetParameterValue("name_co", "")
EndIf
If CheckBox5.Checked = TrueThen
cr2.SetParameterValue("info", info)
Else
cr2.SetParameterValue("info", "")
EndIf
cr2.SetParameterValue("date1", shamsi())
FrmRptdariaftani1.CrystalReportViewer1.ReportSourc e = cr2
FrmRptdariaftani1.Text = "بدهکاران و بستانکاران"
FrmRptdariaftani1.Show()
cr2.Clone()
EndSub

اینم تصویر فرمی که کاربر ترکیب گزارش را مشخص می کند. شاید با تصویر بهتر متوجه منظورم بشید . البته من می تونم با veiw هم این کار رو انجام بدم ولی باید به تعداد زیادی(برای هر گزارش یکی بسازم) این کار رو انجام بدم و در ضمن سرعت ایجاد و حذف temp table به نظر بیشتر باشه.

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

دو تا لینک گذاشته بودم اگه می شه به این تاپیک هم سری بزنید.http://barnamenevis.org/forum/showthread.php?t=168146
بازم ممنون از کمکی که انجام می دید.

__H2__
چهارشنبه 24 تیر 1388, 11:18 صبح
سلام
متاسفانه هنوز علت وجودی جدول temp را متوجه نشدم،
(دستوراتتان هم اصلاً جالب توجه نیست و میتواند در آینده برایتان مشکل ساز شود...)

در خصوص ساخت دستور SQL دو راه دارید ...
1) با توجه به محدودیت فیلدها میتوانید یک دستور واحد SQL بسازید که با شرطهای مناسب بخش های مورد نیاز فعال شوند.

2) میتوانید از یک System.Text.StringBuilder استفاده کنید و تک تک شروط را پشت سر هم اضافه کنید.


در نهایت که دستور sql ساخته شد، دستور مذکور را با یک dataadapter اجرا و نتیجه را در dataset قرار میدهید و dataset را برای نمایش تحویل کریستال میدهید.
(
گرچه بازدهی ذاتی کریستال به علت استفاده گسترده از دیتاست پایین است ولی در هر صورت کریستال قبل از نمایش همه چیز را به Dataset تبدیل میکند.
)

همانطور که تضیح دادم جایی برای این جدول وجود ندارد و نیازی نیست !!!!
خوب حالا این جدول temp جای استفاده اش کجا است؟!

==============


دو تا لینک گذاشته بودم اگه می شه به این تاپیک هم سری بزنید
متاسفانه لینک دوم شما، به نظر تاپیکی آموزشی است ...
شخصاً خیلی علاقه به اموزش دارم ! حتی در زمان بچگی هم که همه دوست داشتم معلم ریاضی شوم !!!! ولی خوب بچه ها زیاد خیال بافی میکنند ... !!!

(
جالب است که در ایران خیلیها XNA را فقط برای ساخت گرافیک دو بعدی میشناسند و اصلاً تفکرات سه بعدی، مدیریت دوربین، دوران، بردار، صفحه و خط را از نظر ریاضی و هندسی ندارند و واقعاً نیاز به یک آموزش خوب در این خصوص حس میشود.
)

با این وجود متاسفانه و با شرمندگی بسیار فرصت کافی برای این تاپیک ها را در اختیار ندارم.
چون این تاپیک ها به مطالب تایپی پخته شده و فکر شده و طبقه بندی شده زیادی نیاز دارند و برای تکمیل تفهیم و تثبیت مطالب هم باید با سورس ها نمونه مناسب تغذیه و پشتیبانی شوند.

خودم هم مدتها است که در ذهنم میچرخد تاپیکی در سایتهایی که عضو هستم بزنم و XNA را برای هر دو زبان اصلی دات نتی پیش ببرم ولی ...

=====

ولی به شما پیشنهاد میکنم دنبال ارتباط VB.Net با OpenGL نباشید ...
هر دو در جای خود خوب هستند ولی برای هم ساخته نشدند ...
در این راه مشکلات بسیار خواهید داشت !
ضمن اینکه هسته پردازش سه بعدی DirectX چیزی از OpenGL کم ندارد.

شما یا باید ارتباط VB.Net مدیریت شده مایکروسافت را با XNA مدیریت شده مایکروسافت پیگیری کنید
و یا حداقل ارتباط VB.Net مدیریت شده مایکروسافت را با DirectX مدیریت شده مایکروسافت پیگیری کنید.
(البته XNA هم در واقع همان DirectX است)

VB.Net با این دو مجموعه کامپونت و ابزار بسیار بسیار راحت تر کنار می آید.

mina.net
پنج شنبه 25 تیر 1388, 13:05 عصر
سلام
میتوانید از یک System.Text.StringBuilder استفاده کنید و تک تک شروط را پشت سر هم اضافه کنید.
سلام دوست عزیز
من با System.Text.StringBuilder کار نکردم اگه یک مثال بزنید ممنون می شم.



با این وجود متاسفانه و با شرمندگی بسیار فرصت کافی برای این تاپیک ها را در اختیار ندارم.

می دونم که خیلی وقت ندارید . معذرت می خوام که وقت شما رو می گیرم. اگه بتونید یک منبع معرفی کنید و اطلاعات اولیه را به من بدهید من می تونم برای مدت حداقل 6 ماه این تاپیک رو پیگیر بشم و هر چی یاد می گیرم رو تو سایت قرار بدم. از انجای که منابع کمی وجود داره تو استارت کار مشکل اساسی دارم. در ضمن در مورد xna یا opengl برای من فرقی نمی کند هر کدام مناسب تر است.
بازم ممنون از توجهی که دارید.

__H2__
پنج شنبه 25 تیر 1388, 21:28 عصر
سلام
پیشنهاد میکنم اول این مثال را نگاهی کنید، بد نیست!
http://support.h02.ir/fwlink/?LinkId=1003769457

در مثال فوق خواهید دید که چطور میتوان از یک dataset و برای تغذیه کریستال استفاده کنید و دستور چاپ هم بدهید.

بعد هم به عنوان نمونه میتوانید از کدی شبیه این استفاده کنید


Public Class Form1

Public Sub Print()
Dim ret As New CrystalReport1()
ret.SetDataSource(Me.CreateDataSet())
ret.PrintToPrinter(1, False, 1, Integer.MaxValue)
End Sub

Private Function CreateDataSet() As System.Data.DataSet
Dim ret As New System.Data.DataSet()
'Dim ret As New DataSet1()

Using dbCom As System.Data.SqlClient.SqlCommand = Me.CreateCommand()
Using _
dbCon As New System.Data.SqlClient.SqlConnection("---CONNECTIONSTRING--"), _
dbDA As New System.Data.SqlClient.SqlDataAdapter(dbCom)

dbCom.Connection = dbCon

dbDA.Fill(ret)
End Using
End Using

Return ret
End Function

Private Function CreateCommand() As System.Data.SqlClient.SqlCommand
Const SQL_SELECT As String = "SELECT * FROM [tablename1] INNER JOIN [tablename2] ON ( [tablename1].[ColumnX] = [tablename2].[ColumnY] )"

Dim ret As New System.Data.SqlClient.SqlCommand()
Dim sql As New System.Text.StringBuilder()
Dim bIsFirstWhere As Boolean = True

sql.Append(SQL_SELECT)

If (Me.CheckBox1.Checked) Then
AppendSql(Me.TextBox1.Text, System.Data.SqlDbType.NVarChar, "Column1", ret, sql, bIsFirstWhere)
bIsFirstWhere = False
End If

If (Me.CheckBox2.Checked) Then
AppendSql(CInt(Me.NumericUpDown1.Value), System.Data.SqlDbType.Int, "[tablename1].[Column2]", ret, sql, bIsFirstWhere)
bIsFirstWhere = False
End If

If (Me.CheckBox3.Checked) Then
AppendSql(Me.DateTimePicker1.Value, System.Data.SqlDbType.SmallDateTime, "tablename2.Column3", ret, sql, bIsFirstWhere)
bIsFirstWhere = False
End If

'...
'...
'...
'...
'...

ret.CommandText = sql.ToString()
Return ret
End Function

Private Shared Sub AppendSql( _
ByVal value As Object, _
ByVal type As System.Data.SqlDbType, _
ByVal name As String, _
ByVal command As System.Data.SqlClient.SqlCommand, _
ByVal sql As System.Text.StringBuilder, _
ByVal bIsFirstWhere As Boolean)

Const SQL_WHERE_FIRST As String = " WHERE "
Const SQL_WHERE_NEXT As String = " AND "
Const SQL_PARAMNAME As String = "@Param_"


sql.Append(If(bIsFirstWhere, SQL_WHERE_FIRST, SQL_WHERE_NEXT))

Dim param As New System.Data.SqlClient.SqlParameter(SQL_PARAMNAME & command.Parameters.Count.ToString(), type)

If (value Is Nothing) OrElse (String.IsNullOrEmpty(TryCast(value, String))) Then
value = System.DBNull.Value
End If
param.Value = value

sql.AppendFormat("({0}={1})", name, param.ParameterName)
command.Parameters.Add(param)
End Sub

End Class


البته این دستورات با الگوی برنامه نویسی چند لایه مطابقت ندارد ولی ...
1- برای شما ساده تر است و کد کمتری دارد و دلایل نوع کدنویسی فوق را بهتر درک میکنید.
(پیشنهاد میکنم سرچی کنید و مطالعات خود را در ضمینه برنامه نویسی چند لایه و نیز ado.net تقویت کنید.)

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

3- این کد به علت استفاده از روش پارامتری در هر شرایط و برای انواع مختلف دیتاها و نوع فیلدها کار میکند و امکان خطا و اشتباه انسانی در ان کمتر است.

4- کد را تست نکردم ولی احتمال اشتباه از روی حواس پرتی ام بسیار بسیار اندک است.

==============


می دونم که خیلی وقت ندارید . معذرت می خوام که وقت شما رو می گیرم. اگه بتونید یک منبع معرفی کنید و اطلاعات اولیه را به من بدهید

من چند تاپیک و PM دیگر که جواب ندادم و جواب طولانی میخواهند (مثل همین تاپیک فعلی خودتان) در این سایت و دو سایت دیگر دارم ...

شاید احتمالاً ممکن است، اگر وقت کنم و بتوانم این تاپیک ها و PM های معتل مانده را زودتر جواب دهم (و با وقت آزادی کع دارم شاخ گاو را بشکنم!) ، یک تاپیک آموزشی در این خصوص بزنم ...

متاسفانه مطالب مورد نیاز این چند تاپیک و PM زیاد و وقت گیر است ...

اگر تا یک هفته دیگر نتوانستم از انها راحت شوم و یا نشد تاپیک اموزشی فوق را شروع کنم، چند کتاب pdf انگلیسی را برایتان آپلود میکنم.

متاسفانه pdf های ارزشمند فارسی وجود ندارد و به نظر میرسد ایرانی ها XNA را فقط برای گرافیک دو بعدی میشناسند!!!

موفق باشید.

kablayi
جمعه 26 تیر 1388, 04:21 صبح
دوست عزیز مشکل شما از پایه است...
چرا میخواین از دیتاست در کد نویسی برای گزارش گیری استفاده کنید ...؟
اینجور که از کد هاتون فهمیدم شما میخواین نتیجه دستور select مربوط به متغیر str_select رو در گزارشتون نمایش بدین... درسته؟
شما یه datatable تعریف کنید و نتیجه رو درون اون بریزید ...
بعد یه شی dataset به پنجره solution اضاف کنید و درون اون یه table خالی با فیلدهایی که درون دستور select تون (str_select) وجود داره بسازید و از اون table برای طراحی قالب گزارشتون(report.rpt) استفاده کنید ...
بعد برای نمایش اطلاعات درون Crystal report viewer به صورا زیر عمل کنید ...
البته پیشنهاد میکنم این کد رو در رویداد فرم لود FrmRptdariaftani1 بنویسید...



Dim TBL AsNew DataTable
' دستورات مربوط به فیلترینگ اطلاعات و ریختن نتیجه درون یک دیتا تیبل
.
.
.
.
da = New SqlClient.SqlDataAdapter(str_select, con)
da.Fill(TBL)
Dim rptdoc AsNew CrystalDecisions.CrystalReports.Engine.ReportDocum ent
rptdoc.Load(Application.StartupPath & "\Report.rpt")
rptdoc.SetDataSource(TBL)
If CheckBox4.Checked = True Then
rptdoc.SetParameterValue("name_co", name_co)
Else
rptdoc.SetParameterValue("name_co", "")
EndIf
If CheckBox5.Checked = True Then
rptdoc.SetParameterValue("info", info)
Else
rptdoc.SetParameterValue("info", "")
EndIf
rptdoc.SetParameterValue("date1", shamsi())
CrystalReportViewer1.ReportSource = rptdoc
Me.Text = "بدهکاران و بستانکاران"

نکته مهم ایجاد قالب گزارش هست که باید دقیق ایجاد بشه ...
اگه مشکلی بود بگید تا یه مثال براتون آماده کنم ...

__H2__
یک شنبه 28 تیر 1388, 12:22 عصر
سلام

دو تا لینک گذاشته بودم اگه می شه به این تاپیک هم سری بزنید
تاپیکی در جهت اموزش بسیار بسیار فشرده برنامه نویسی سه بعدی زدم ...
نمیتوانم زمانی برای ارسال مطالب تایین کنم ولی سعی خود را میکنم وقتی به این این تاپیک اختصاص دهم.
http://barnamenevis.org/forum/showthread.php?t=168960

mina.net
یک شنبه 28 تیر 1388, 16:30 عصر
سلام

تاپیکی در جهت اموزش بسیار بسیار فشرده برنامه نویسی سه بعدی زدم ...
نمیتوانم زمانی برای ارسال مطالب تایین کنم ولی سعی خود را میکنم وقتی به این این تاپیک اختصاص دهم.
http://barnamenevis.org/forum/showthread.php?t=168960

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

فقط یک مشکل: من هنوز مشکلم با گزارش گیری حل نشده. اگه می شه یک مثال ساده تر بزنید تا بهتر متوجه بشیم.

mina.net
یک شنبه 28 تیر 1388, 16:34 عصر
دوست عزیز جناب kablayi مشکل من به خود فیلتر دستورات بر می گردد وگرنه مشکلی نبود. وقتی از عملگر or و and در یک دستور select چند بار استفاده می کنی این دو عملگر گاها اثر همدیگر رو خنثی می کنن.

__H2__
دوشنبه 29 تیر 1388, 13:28 عصر
سلام

اگه می شه یک مثال ساده تر بزنید تا بهتر متوجه بشیم
والا نتوانستم ساده تر از این کنم!

یکبار دیگر به کد پست 7 دقت کنید ... من هم یک توضیحات کلی میدهم...

- تابع CreateCommand وظیفه ساختن شی Command را برای دستور SQL-SELECT با توجه به کنترلرهای ورودی و مقادیر وارد شده از طرف کاربر دارد.

- تابع AppendSql وظیفه اضافه کردن هر یک شرط را به WHERE انتهای SQL-SELECT برعهده دارد.

در واقع تابع CreateCommand در بدنه خود به ازای هر یک جفت CheckBox و احتمالاً یک کنترلر TextBox و ComboBox و DateTimePicker و... یک بار تابع AppendSql را برای ساخت شرط جدید و اضافه کردنش به Command نهایی فراخوانی میکند.

- تابع CreateDataSet با کمک شی Command ای که در جهت SQL-SELECT در مرحله قبل تولید شده و نیز با کمک یک DataAdapter دستور SQL-SELECT را (که الآن شامل WHERE مناسب هم شده) اجرا کرده و نتیجه تمام سطرهای پیدا شده را در یک DataSet ریخته و باز میگرداند
(این DataSet بهتر است Typed و از همان نوعی باشد که گزارش کریستال برپایه آن ساخته شده)

- تابع Print یک نمونه از گزارش مورد نظر کریستال را ساخته و DataSet مرحله قبلی را گرفته و به عنوان منبع اطلاعات تحویل شی گزارش کریستال (مثلاً Report1) میدهد و دستور پرینت را صادر میکند.

mina.net
دوشنبه 29 تیر 1388, 15:59 عصر
سلام دوست عزیز جناب _H2_ و جناب
یک مثال ساده می زنم. شما فرض کنید کاربر می خواد همه بدهکاران شهر آمل رو گزارش بگیره. خوب خیلی راحته


Dim str_select AsString
str_select = "select * from bed_best where city='آمل' and ((sum)bed -(sum) best )> 0 "


خوب حالا اگه خواست یک شرط دیگه بزاره که لازم باشه از or استفاده بشه چی؟ مثلا بخواد همه کسانی که مانده حساب بدهکار یا صفر دارند رو نشون بده چی؟ اگه بخواهیم همزمان استفاده کنیم


Dim str_select AsString
str_select = "select * from bed_best where city='آمل' and ((sum)bed -(sum) best )> 0 or ((sum)bed -(sum) best )= 0"

عملگر or در دستور بالا عملا در این مورد خاصیت شرط شهر را بی اثر خواهد کرد. البته شاید بشه این مورد خواص (در این مثال) را بطریقی حل کرد ولی در برنامه اصلی که گذاشتم تعداد شروط and و or زیاد هست. من برای حل این مشکل از temp table استفاده کردم یکبار در دستور select فقط از and استفاده کردم و جدول temp table را ایجاد می کنم و سپس از جدول temp table دستور select مجددی انجام می دم. تا اینجا مشکلی ندارم ولی temp table رو نمی شه در dataset قرار داد و از اون گزارش گرفت.

اگه بازم خوب توضیح ندادم بگید تا بیشتر توضیح بدم. بازم ممنون از کمکی که می کنید.

__H2__
دوشنبه 29 تیر 1388, 23:53 عصر
سلام
همچنان قاطعانه به شما میگویم که به جدول موقت نیاز ندارید ...
(مگر در برنامه های بسیار خاصی که حجم تراکنش بالا است و نیاز به کش نتایج جستجو است که کلاً بحث جدایی است و ربطی به مشکل شما ندارد.)

هر کاری که با جدول Temp بخواهید انجام دهید با یک دستور واحد SQL هم میتوانید.

بکارگیری اشتباه شما از جدول موقت دو حالت بیشتر ندارد ...

=====

1- یا شما جدول Temp را ایجاد میکنید و اول با یک دستور پرش میکنید ...

SELECT * FROM table WHERE (where1);

و سپس مجدد آن را با دستور دیگری پر میکنید ...

SELECT * FROM table WHERE (where2);

که در این صورت یک بار میتوانید از دستور زیر استفاده کنید:

SELECT * FROM table WHERE (where1 OR where2);

=====

2- یا شما جدول Temp را ایجاد میکنید و اول با یک دستور پرش میکنید ...

SELECT * FROM table WHERE (where1);

و سپس از مقادیر موجود در آن با دستور جدید پرسش میکنید ...

SELECT * FROM temptable WHERE (where2);

که در این صورت یک بار میتوانید از دستور زیر استفاده کنید:

SELECT * FROM table WHERE (where1 AND where2);


... سپس از جدول temp table دستور select مجددی انجام می دم ...
این مورد طبق شرط دوم و استفاده از AND برای طلفیق دو شرط است نه OR !

طبیعی است که هر یک از where1 و where2 خودشان میتوانند مجموعه ای از چند شرط باشند.
فقط کافی است کمی دقت بیشتری داشته باشید.

==============

جدای از بحث فوق5 دو مورد دیگر هم قابل ذکر است.
اول انکه شما به راحتی میتوانید با پرانتز اولویت بخش های مختلف را در شرط تایین کنید

SELECT * FROM table WHERE ((where1 OR ((where2 AND where3) OR where4)) AND where5);


دوم انکه معمولاً در بخش "سرچ" یا همان "جستجو" نرم افزارها گزینه های مختلفی برای ف-ی-ل-ت-ر کردن محتویات برای کاربرشان قرار میدهند که عرف آن است که هر موردی را که کاربر وارد کرد با موارد قبلی AND شود.


یعنی کاربر هر موردی را که برای ف-ی-ل-ت-ر کردن محتویات وارد کند، یک شرط AND اضافه میشود و موارد یافته شده کمتر خواهد شد و حوزه جستجو کوچک تر خواهد شد.


این عرف ساده میتواند کاربر را هم از سردرگرمی نجات دهد و کاربر به سادگی میداند که وقتی شرطی را مشخص میکند و دکمه جستجو را میزند برنامه دنبال مواردی میگردد که همه ان شروط را با هم داشته باشند ...
(معمولاً اینطور نیست که یک مورد را که پر کند AND شود و یک مورد دیگر ا که وارد کند OR شود!)

mina.net
سه شنبه 30 تیر 1388, 17:16 عصر
دوست عزیز جناب __h2__ ممنون از کمکی که می کنید.
من نمی دونستم به این شکل هم می شه از دستور where به صورت تو در تو استفاده کرد. اگه یک مثال کامل تر (با چند شرط and , or ) بزنید ممنون می شم. اینطوری می تونم راحتر درک کنم.

mn_zandy63
چهارشنبه 31 تیر 1388, 01:29 صبح
حتی اگه اونطور که دوستمون جناب h2 گفتند هم عمل نکنی (که پیشنهاد میکنم٬ مطابق پیشنهاد ایشون عمل کنی) به راحتی میتونی کل شروط قسمت اول کدت رو (قبل از ریختن در جدول temp) درون یه پرانتز قرار بدی. و همه شرطهایی که بعد از اون داشتی رو هم (که از جدول temp میخوند) درون یه پرانتز دیگه و بینشون یه دونه AND بزاری. همین! دیگه نیازی به جدول temp نداری.
اصلا متوجه شدی چی گفتم؟ :بامزه:

mina.net
پنج شنبه 01 مرداد 1388, 12:48 عصر
یعنی مثلا بجای دستور زیر


Dim str_select AsString
str_select = "select * from bed_best where city='آمل' and " + _
" ((sum)bed -(sum) best )> 0 or ((sum)bed -(sum) best )= 0 group by id"



از دستور زیر استفاده بشه


Dim str_select AsString
str_select = "select * from bed_best where city='آمل' and" + _
" ( where1 ((sum)bed -(sum) best )> 0 or ((sum)bed -(sum) best )= 0) group by id"


خوب تو دستور بالای به sum که می رسه خطا سینتکس می ده
از کد زیر هم استفاده کردم




Dim str_select As String
str_select = "select * from bed_best where city='آمل' and" + _
" ( where1 ((sum)bed -(sum) best )> 0 or ((sum)bed -(sum) best )" + _
" = 0 group by id) group by id"



تو دستور بالا هم خطا وقتی به sum می رسه خطا سینتکس می ده

mina.net
پنج شنبه 01 مرداد 1388, 19:13 عصر
سلام دوستان
کسی نمی خواد کمک کنه؟؟؟؟؟؟

__H2__
پنج شنبه 01 مرداد 1388, 22:42 عصر
سلام

اگه یک مثال کامل تر (با چند شرط and , or ) بزنید ممنون می شم
دوست عزیز ...
مشکل سر این است که من دیگر نمیدانم باید چه چیز را توضیح دهم ... !
خیلی شرمنده ...
یعنی هرچی به فکرم میرسیده که کمکتان کنم گفتم، دیگر حقیقتاً نمیدانم باید چه بگویم!


ولی خوب مطلب زیر یک سوال واضح تر است و سوال واضح خوب است!

خوب تو دستور بالای به sum که می رسه خطا سینتکس می ده
والا حقیقتش من هم نمیفهمم شما چه نوشته اید!!!!
میشود بفرمائید sum)xxxxx) یعنی چه؟؟؟؟ همچین سینتکسی نداریم!!!!

mina.net
جمعه 02 مرداد 1388, 16:00 عصر
والا حقیقتش من هم نمیفهمم شما چه نوشته اید!!!!
میشود بفرمائید sum)xxxxx) یعنی چه؟؟؟؟ همچین سینتکسی نداریم!!!!

من کجا نوشم" sum)xxxxx)" ?
خوب دوست عزیز اگه شما یک مثال بزنید که صرفا در اون دوتا or و دو تا and باشه من متوجه خواهم شد. در ضمن فکر می کنم کدی که تو پست 17قرار دادم کاملا واضح باشه. اگه جای گنگ هست بفرمایید تا توضیح بدهم .
اما یک کم راجع به فیلد های که استفاده شده رو توضیح می دهم. sum(bed) جمع بدهکاری هر فرد هست. sum(best) مجموع بستانکاری هر فرد هست. city هم که نام شهر هر طرف حساب هست. در حقیقت من می خوام کسای که جمع بدهکاریشان بیشتر یا مساوی صف هست و در ضمن از شهر بخصوصی (دراین مثال از آمل) هستند رو نمایش بدم. البته این ترکیب توسط کاربر تعیین می شود و قابل تغییر است.
بازهم ممنون از کمکی که می کنید.

kablayi
شنبه 03 مرداد 1388, 08:30 صبح
دوست عزیز برای اینکه مطمئن شین دستورات SELECT شما درسته از پنجره SERVER EXPLORER یه query ایجاد کنید و اونو RUN کنید ... اونجا میتونید ارور مربوط به سینتسک دستوراتتون رو پیدا کنید ...
در ضمن منظور H2 اینه که دستور sum رو اینجوری نمینویسن ...


(sum(bed) -sum(best)) > 0

پرانتز ها رو اشتباه گذاشتین ...

mina.net
شنبه 03 مرداد 1388, 08:52 صبح
دوست عزیز برای اینکه مطمئن شین دستورات SELECT شما درسته از پنجره SERVER EXPLORER یه query ایجاد کنید و اونو RUN کنید ... اونجا میتونید ارور مربوط به سینتسک دستوراتتون رو پیدا کنید ...
در ضمن منظور H2 اینه که دستور sum رو اینجوری نمینویسن ...


(sum(bed) -sum(best)) > 0

پرانتز ها رو اشتباه گذاشتین ...

دوست عزیز همه کارهای که گفتید قبلا انجام شد. ولی نتیجه ای حاصل نشد. دوست عزیز من برنامه نویسی رو آکادمیک یاد نگرفتم یک جای کار می لنگه که فراتر از این موضوعاتی که شما می فرمایید هست. در ضمن من نفهمیدم کجای دستور sum غلط هست. لطفا درشتش رو بزارید تا استفاده کنیم(من همیشه به همین شکل استفاده می کنم)

__H2__
یک شنبه 04 مرداد 1388, 00:54 صبح
سلام

من کجا نوشم" sum)xxxxx)" ?
همانطور که جناب kablayi گفتند منظورم عبارات sum)bed) و sum)best) بود


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

دستور صحیح پست 17


SELECT *, SUM() AS sum_bed, SUM() AS sum_best
FROM [bed_best]
WHERE ( [city] = N'آمل' )
GROUP BY [id]
HAVING ( (SUM([bed]) - SUM([best])) >= 0 );


یا



SELECT *, SUM([bed]) AS sum_bed, SUM([best]) AS sum_best
FROM [bed_best]
WHERE ( [city] = N'آمل' )
GROUP BY [id]
HAVING ( SUM([bed]) >= SUM([best]) );



فکر کنم گفتم ولی باز تاکید میکنم که درج مستقیم عباراتی مثل "آمل" درون SQL کار صحیحی نیست و باید از روش پارامتری استفاده شود.


خوب دوست عزیز اگه شما یک مثال بزنید که صرفا در اون دوتا or و دو تا and باشه من متوجه خواهم شد
امید وارم اینها کمک کند ...
در کدهای SQL زیر w1~4 یک سری دستورات و عبارات شرطی هستند ...


اگر خواستید w1 [B]یا w2 برقرار باشد و حتماً w3 و w4 هم برقرار باشند ...


SELECT * FROM [table] WHERE ( ((w1) [B]OR (w2)) AND (w3) AND (w4) );


خیلی ساده است!

موفق باشید.

mina.net
یک شنبه 04 مرداد 1388, 16:18 عصر
سلام دوست عزیز ممنون از توجهی که دارید



فکر کنم گفتم ولی باز تاکید میکنم که درج مستقیم عباراتی مثل "آمل" درون SQL کار صحیحی نیست و باید از روش پارامتری استفاده شود.

بله دوست عزیز حق با شماست ولی من فقط نتیجه متغییر sre_select رو قرار دادم. یعنی نمی ام تو برنامه مستقیم بنویسم مثلا city='امل'

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

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

این هم کدی که استفاده شده.



Dim str_select AsString = "SELECT 'mbed' = SUM(bed_best.bed)" + _
" - SUM(bed_best.best), hesab.city,hesab.masir,bed_best.id," + _
" bed_best.complet_name, SUM(bed_best.bed) AS bed," + _
" SUM(bed_best.best) AS best FROM bed_best" + _
" INNER JOIN hesab ON bed_best.id = hesab.id_tafzil where" + _
" hesab.city=N'آمل' and hesab.masir=N'طالب آملی' " + _
" GROUP BY bed_best.id, bed_best.complet_name,hesab.city," + _
" hesab.masir having ((SUM(bed_best.bed)) - (SUM(bed_best.best)))>=0 "



در ضمن می دونم تو sql و ado مشکل دارم اگه یک منبع خوب سراغ دارید معرفی بفرمایید ممنون می شم.

mina.net
سه شنبه 06 مرداد 1388, 12:16 عصر
سلام دوستان
لطفا کمک کنید مشکلم هنوز حل نشده

__H2__
سه شنبه 06 مرداد 1388, 17:06 عصر
سلام

اطلاعات تو دیتا گرید درست نمایش پیدا می کنه ولی تو کریستال گزارش خالی می بینم
اگر اینطور است دیگر نیازی به چک کردن دستورات SQL تان نیست، مشکل شما از عدم برقراری رابطه صحیح با کریستال ناشی میشود.

همانطور که در پست هم کدی و مثال گذاشته بودم کافی است برای خوراندن یا تحویل داده اطلاعات به کریستال از همچین کدی استفاده کنید :


Public Sub Print()
Dim ret As New CrystalReport1()
ret.SetDataSource(Me.CreateDataSet())
ret.PrintToPrinter(1, False, 1, Integer.MaxValue)
End Sub

Private Function CreateDataSet() As System.Data.DataSet
Dim ret As New TypedDataSet1()

Using dbDA As New System.Data.SqlClient.SqlDataAdapter(str_select, "---CONNECTIONSTRING--")

dbDA.Fill(ret)

End Using

Return ret
End Function


البته باید در زمان طراحی گزارش کریستال از همان TypedDataSet ای استفاده کرده باشید که الآمن میخواهید پر کنید و برای نمایش تحویلش دهید.

=====

دستورات کار با کریستا و تحویل اطلاعات به کریستال را مجدد بررسی و چک کنید.

mina.net
چهارشنبه 07 مرداد 1388, 11:51 صبح
سلام دوستان
من همه کارای که گفتید رو انجام دادم ولی بازم نشد. من از کدی که دوست خوب مون جناب h2 گذاشتن به شکل زیر استفاده کردم .


Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim ret As New RptBedBest()
ret.SetDataSource(Me.CreateDataSet())
If CheckBox4.Checked = True Then
ret.SetParameterValue("name_co", name_co)
Else
ret.SetParameterValue("name_co", "")
End If
If CheckBox5.Checked = True Then
ret.SetParameterValue("info", info)
Else
ret.SetParameterValue("info", "")
End If
ret.SetParameterValue("date1", shamsi())
FrmRptdariaftani1.CrystalReportViewer1.ReportSourc e = ret
FrmRptdariaftani1.Text = "بدهکاران و بستانکاران"
FrmRptdariaftani1.Show()
ret.PrintToPrinter(1, False, 1, Integer.MaxValue)
End Sub
Private Function CreateDataSet() As System.Data.DataSet
Dim ret As New DataSet
'به جای سطر بالا کد زیر رو قرار دادم باز هم نشد
' Dim ret As New RptDs
'rptds نام دیتاستی هست که قبلا تو پروژه ساختم و هر دو جدولی که تو در اون قرار دارند
Using dbDA As New System.Data.SqlClient.SqlDataAdapter(str_select, con)
dbDA.Fill(ret)
End Using
Return ret
End Function

کانکشنی که استفاده می کنم رو هم می زارم شاید ربط داشته باشه


Public str_path As String = System.Windows.Forms.Application.StartupPath
Public con As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=" & str_path & "\anbar.mdf;Integrated Security=True;User Instance=True")


دیگه دارم خسته می شم. تلسم شده انگار

__H2__
چهارشنبه 07 مرداد 1388, 12:52 عصر
سلام
راستی یک سوال از دفعه قبل را یادم رفت !

اگه یک منبع خوب سراغ دارید معرفی بفرمایید ممنون می شم
نمیخواهد دنبال یک ورد جادویی یا یک اموزشگاه و کتاب خاص باشید ...
اصلاً مهم نیست،
به نظر شخصی من آموزشگاه که اصلاً نمیخواهد!
کتاب هم فرقی ندارد !!!
به بازار کتاب شهرتان مراجعه کنید (مثلاً برای تهران، حوالی انقلاب) و یک کتاب در خصوص ADO.Net3.5/2008 و یکی هم در خصوص SqlServer2008 تهیه کنید ...
باور کنید خرج کتاب کنید هم ماندگار تر است و هم ارزان تر ارزانترین اموزشگاه ها خواهد بود.

فقط سعی کنید صفحات کتاب بیشتر باشد، به این دلیل که نویسنده در تعداد صفحات بیشتر دستش بازتر بوده و فرصت و جای بیشتری داشته که مسائله و جزئیات را بهتر و کاملتر تشریح کند و گستره بزرگتری از اطلاعات را انتقال دهد.



تلسم شده انگار
طلسمی در کار نیست، فقط کمی صبر و دقت میخواهد.

- یعنی هیچ خطایی نمیدهد؟

- شما باید به جای کد Dim ret As New DataSet همان TypedDataSet ای را New کنید که از ان برای ساخت گزارش کریستال استفاده کرده اید و این احتمالاً منشع مشکل شما است.

یعنی فیلدهای گزارش کریستال را از کجا گرفته اید و چگونه به کریستال فهمانده اید چه فیلدی دارید؟
برای اینکار باید از یک TypedDataSet استفاده کرده باشید تا بتوانید در کد هم به همان ارجاع دهید و همان را تحویلش دهید.


البته کلاً استفاده از DataSet باعث کندی میشود ولی متاسفانه کریستال فقط DataSet را قبول دارد و هر منبع اطلاعاتی همن که بدهید در کدهای داخلی و قبل از استفاده ان را به DataSet تبدیل میکند!


(
- جدای از مشکل فعلی تان اگر FrmRptdariaftani1 نام مستقیم خود فرم برنامه است نوشتن نام فرم FrmRptdariaftani1 بدین صورت اصلاً صحیح نیست...
یعنی FrmRptdariaftani1 باید نام متغییر باشد.
متاسفانه در کد قبلیتان مشخص نیست که FrmRptdariaftani1 نام متغییر است یا نام کلاس
ولی اگر نام کلاس باشد کد صحیح چنین است:


Dim x As New FrmRptdariaftani1()
x.Show()


و طبق اصول برنامه نویسی باید دسترسی به اعضای خصوص فرم FrmRptdariaftani1 را به داخل کدهای خود فرم FrmRptdariaftani1 منتقل کنید و در خارج به کنترلرهای روی ان دست نزنید.

البته مطلب فوق احتمالاً ربطی به مشکل شما ندارد ولی بالاخره کد نویسی صحیح و قانون مند در هر شرایطی خوب است
)

پیشنهاد میکنم در صورت ادامه مشکل و اگر میخواهید کدتان را آپلود کنید و در pm لینک دهید تا یک بررسی کنم، انشا ا... مشکلتان حل شود.

mina.net
چهارشنبه 07 مرداد 1388, 13:36 عصر
شما باید به جای کد Dim ret As New DataSet همان TypedDataSet ای را New کنید که از ان برای ساخت گزارش کریستال استفاده کرده اید و این احتمالاً منشع مشکل شما است.
همونطور که داخل کدم توضیح دادم از هر دو حالت استفاده کردم یعنی یک بار از کد


Dim ret AsNew DataSet

و یک بار هم از


Dim ret AsNew Rptds

استفاده کردم که rptds نام دیتاست پروژه هست. جالب اینه من از این دیتا ست تا حالا 7-8 گزارش مختلف تهیه کردم هیچکدام مشکلی نداره(غیر از دوتا)

نکته ای که باید بگم اینه که فقط وقتی از دو یا چند جدول استفاده می کنم همچین مشکلی پیش می یاد. یعنی اگر فقط از یک جدول select کنم مشکلی نداره. دیگه چیزی به ذهنم نمی رسه توضیح بدم.

شما رو هم خسته کردم شرمنده.

mina.net
جمعه 09 مرداد 1388, 15:55 عصر
دوست عزیز جناب h2 و kablayi سلام
با همه کمکهای که شما انجام دادید و هر چه خودم تلاش کردم مشکل حل نشد. برنامه رو قرار دادم اگه ممکنه دانلود کنید و در رفع این مشکل به من کمک کنید. دیگه به معنی واقعی هنگ کردم. برای اینکه برنامه حجم کمتر داشته باشه کامپایل نکردم. دو تا سایت مختلف آپلود کردم هر کدوم شد دانلود کنید.

http://www.2shared.com/fadmin/6927769/900ec052/anbar.rar.html
http://rapidshare.de/files/47998490/anbar.rar.html

mina.net
جمعه 09 مرداد 1388, 21:29 عصر
به بازار کتاب شهرتان مراجعه کنید (مثلاً برای تهران، حوالی انقلاب) و یک کتاب در خصوص ADO.Net3.5/2008 و یکی هم در خصوص SqlServer2008 تهیه کنید ...
باور کنید خرج کتاب کنید هم ماندگار تر است و هم ارزان تر ارزانترین اموزشگاه ها خواهد بود.


هر چند خودم آموزشگاه دارم و باید تبلیغات آموزشگاه رو بکنم ولی قویا به حرف شما عتقاد دارم. و مهمتر از اون اینکه با چند نفر حرفه ای کار کنی

mn_zandy63
شنبه 10 مرداد 1388, 03:07 صبح
دیتاستی که شما گزارش رو از روی اون ساختید دیتاستی هست که داخل پروژتون هست.
اما دیتاستی که با دستور select پر میکنید همون دیتاست نیست.
دقت کنید٬ دیتاستی که پر میکنید TYPED نیست اصلا.

mn_zandy63
شنبه 10 مرداد 1388, 03:13 صبح
شما باید همان table های داخل RptDs رو که موجود هستند با دستورات SELECT پر کنید.
و روش دیگر هم این است که٬ یک بار بعد از fill کردن دیتاست تان٬ با دستور

ds.WriteXml("d:\test.xml",XmlWriteMode.WriteSchema)
یک فایل XML نمونه از دیتاست خود بسازید. یک بار کد را اجرا کنید٬ یک فایل XML ساخته خواهد شد٬ سپس این دستور را حذف کنید.
حال در هنگام ساختن فایل گزارش کریستال ریپورت از این فایل XML به عنوان datasource استفاده کنید.
پس از ساخت گزارش٬ برنامه به درستی کار خواهد کرد٬ چون دیتاسورس گزارش همان دیتاستی است که در این کد ساخته شده است.

mina.net
شنبه 10 مرداد 1388, 09:11 صبح
دقت کنید٬ دیتاستی که پر میکنید TYPED نیست اصلا.

یعنی چی typed نیست. اصلا typed چی هست. اگه می شه بیشتر توضیح بفرمایید.

__H2__
شنبه 10 مرداد 1388, 15:52 عصر
سلام
من نگاهی مختصر به کد شما انداختم ...
شما گزارش کریستال خود را با RptDs و دو جدول bed_best و hesab درست کرده اید ولی ...

- همانطور که کاربر mn_zandy63 هم گفتند متد CreateDataSet را نوشتید ولی هیچ کجا اصلاً استفاده نشده! در عضو در خط 199 اقدام به ساخت یک DataSet عادی کرده اید در حالی که باید از نوع Typed ای گزارش را با آن ساخته بودید (همان RptDs) استفاده میکردید.

(
خط 199 فایل FrmRptBed.vb را اینچنین اصلاح کنید ds = New RptDs
خط بعدی را هم (da.Fill(ds.bed_best کنید.
خط 13 فایل sql_dicler.vb را هم Public ds As New RptDs اصلاح کنید (گرچه کلاًذات وجودی همچین فایلی با اصول برنامه نویسی مشکل دارد)
)

- نکته دیگر انجا است که در گزارش مذکور شما از دو جدول استفاده کرده اید ولی دستور Fill شما فقط یک جدول bed_best را پر میکنید و hesab هیچگاه پر نمیشود!

mina.net
شنبه 10 مرداد 1388, 22:15 عصر
- نکته دیگر انجا است که در گزارش مذکور شما از دو جدول استفاده کرده اید ولی دستور Fill شما فقط یک جدول bed_best را پر میکنید و hesab هیچگاه پر نمیشود!

خوب موقعی که یک جدول داریم می نویسیم مثلا (da.Fill(ds.bed_best حالا اگه دو جدول هست باید چی نوشت

__H2__
شنبه 10 مرداد 1388, 22:21 عصر
سلام

خوب موقعی که یک جدول داریم می نویسیم مثلا (da.Fill(ds.bed_best حالا اگه دو جدول هست باید چی نوشت
ساده است ...
دستور sql اول و fill اول برای جدول اول در یک dataset
دستور sql دوم و fill دوم برای جدول دوم در همان dataset قبلی
و الی آخر ... !

mina.net
شنبه 10 مرداد 1388, 22:33 عصر
سلام
من نگاهی مختصر به کد شما انداختم ...
شما گزارش کریستال خود را با RptDs و دو جدول bed_best و hesab درست کرده اید ولی ...

- همانطور که کاربر mn_zandy63 هم گفتند متد CreateDataSet را نوشتید ولی هیچ کجا اصلاً استفاده نشده! در عضو در خط 199 اقدام به ساخت یک DataSet عادی کرده اید در حالی که باید از نوع Typed ای گزارش را با آن ساخته بودید (همان RptDs) استفاده میکردید.

(
خط 199 فایل FrmRptBed.vb را اینچنین اصلاح کنید ds = New RptDs
خط بعدی را هم (da.Fill(ds.bed_best کنید.
خط 13 فایل sql_dicler.vb را هم Public ds As New RptDs اصلاح کنید (گرچه کلاًذات وجودی همچین فایلی با اصول برنامه نویسی مشکل دارد)
)

- نکته دیگر انجا است که در گزارش مذکور شما از دو جدول استفاده کرده اید ولی دستور Fill شما فقط یک جدول bed_best را پر میکنید و hesab هیچگاه پر نمیشود!

دوست عزیز همه اینکارای که می گید رو انجام دادم ولی نشد. از متدی(CreateDataSet ) که شما به من دادید هم استفاده کردم ولی نشد. فقط این که به جای ds بنویسم ds.tablename اینو الان که گفتید انجام دادم ولی بازم نشد. اگه می بینید تو کد فعلی من از متد CreateDataSet استفاده نکردم بخاطر اینه که من بارها برای اینکه راهی برای حل این مسئله پیدا کنم کد ها رو تغییر دادم. شرمنده که می بینی کد هام در هم بهم هست.
اگه خدا بخواد این برنامه رو تمام کردم باید درست و حسابی بشینم sql و ado.net رو بخونم. فقط کمک کنید این تموم بشه.
بازم شرمنده وقت شما رو می گیرم.

mina.net
شنبه 10 مرداد 1388, 22:41 عصر
سلام

ساده است ...
دستور sql اول و fill اول برای جدول اول در یک dataset
دستور sql دوم و fill دوم برای جدول دوم در همان dataset قبلی
و الی آخر ... !

بازم نشد اگه می شه کد اصلاح شده اون قسمتی که دیتاست fill می شه و به کریستال ارسال می شه رو بزارید ممنون می شم.

mina.net
دوشنبه 12 مرداد 1388, 09:21 صبح
سلام دوستان
دوستان مشکلم حل نشد. لطفا کمک کنید.

mn_zandy63
دوشنبه 12 مرداد 1388, 20:04 عصر
ببینید قضیه اینه که شما datasource ی رو که به گزارشتون میفرستید همونی نیست که موقعه طراحی ازش استفاده کردید.
الاحساب برای راه افتادن کارتون٬ در خط ۲۰۰ بعد از da.Fill(ds) دستور زیر رو اضافه کنید:


ds.WriteXml("c:\\temp.xml",XmlWriteMode.WriteSchema);

یک بار برنامه را اجرا کنید٬ بعد از اجرای این خط دستور٬ یک فایل XML در آدرسی که مشخص کرده اید (به عنوان مثال c:\temp.xml) ساخته خواهد شد.

حالا یک گزارش بسازید و این فایل را به عنوان datasource آن استفاده کنید. اگه نمیدونید به چه شکل باید اینکار را انجام بدید٬ بگید تا توضیح بدم.
گزارش جدیدتون رو به جای گزارشی که قبلا طراحی کردید استفاده کنید.
بعد از این کار٬ دستوری که بهتون گفتم رو از کدتون حذف کنید٬ حالا برنامتون با کدی که قبلا داشتید کار میکنه.

موفق باشید.

mina.net
دوشنبه 12 مرداد 1388, 22:29 عصر
دوست عزیز جناب mn_zandy63 (http://www.barnamenevis.org/forum/member.php?u=31426) کد شما خطای زیر صادر می شه.


Access to the path 'D:\' is denied.


دوستان من نمی دونم چرا حرف شما رو نمی فهمم. یعنی چی که من از همون DATASET که تو برنامه ساختم استفاده نمی کنم؟ شاید الان تو برنامه ای که دانلود می کنید نباشه ولی من بارها به شکل های مختلفی ازش استفاده کردم. یعنی به جای DS=NEW DATASET نوشتم DS=NEW RPTDS که RPTDS همون دیتاستی هست که تو پروژم دارم. من تو پروژم از این دیتا ست چندین گزارش تهیه کردم مشکلی نداشت فقط دو تا مشکل دارن. نکته ای که وجود داره اینه که اگه گزارش از فقط یک جدول گرفته بشه مشکلی نیست ولی اگر از چند جدول در یک گزارش استفاده بشه این مشکل وجود داره.

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

mina.net
دوشنبه 12 مرداد 1388, 22:38 عصر
دوستان من قسمتهای آخر کدم رو (ارسال به پر کردن دیتا ست و ارسال به کریستال) رو به شکل زیر اصلاح کردم ولی نشد . خواهش می کنم در نظر داشته باشید.


Dim ds1 As RptDs
ds1 = New RptDs
da = New SqlDataAdapter(str_select, con)
da.Fill(ds1.hesab)
da.Fill(ds1.bed_best)
Dim cr2 As New RptBedBest
cr2.SetDataSource(ds)
If CheckBox4.Checked = True Then
cr2.SetParameterValue("name_co", name_co)
Else
cr2.SetParameterValue("name_co", "")
End If
If CheckBox5.Checked = True Then
cr2.SetParameterValue("info", info)
Else
cr2.SetParameterValue("info", "")
End If
cr2.SetParameterValue("date1", shamsi())

FrmRptFactor.CrystalReportViewer1.ReportSource = cr2
FrmRptFactor.Text = " §ىکں©ںë ي «¢ںëکں©ںë"
FrmRptFactor.Show()


بازم ممنون از توجهی که دارید.

__H2__
دوشنبه 12 مرداد 1388, 23:56 عصر
سلام
متاسفانه بخش زیادی از کد شما با اصول برنامه نویسی ساختار یافته مطابقت چندانی ندارد ...
من در حد فرصتی که داشتم یکسری از کدها را اصلاح کردم و چون وقت کمی داشتم و نمیدانستم چه وارد کنم تا جستجو نتیجه دهد یک خط کد هم قبل از Fill اضافه کردم که باعث می شود کل مقادیر موجود دیتابیس برگردانده شود ...
در حال حاضر بالاخره گزارش کار میکند، شما باید خط فوق را حذف کنید (پیدایش میکنید!)

http://rapidshare.com/files/263354514/anbar.zip
موفق باشید.

mn_zandy63
سه شنبه 13 مرداد 1388, 03:42 صبح
ببین دوست عزیز این که میگی دو تا جدول جواب نمیده دقیقا به همین دلیله.

هر دستور Select فقط یک جدول خروجی میده٬ بنابراین وقتی شما با join بین چند تا جدول و انتخاب یک سری از فیلد هاشون و حتی فیلد های ترکیبی جدید٬ یک SELECT میزنی٬ در واقع یک جدول جدید به دست میاری با اون فیلد هایی که select کردی.
ببین جدولهایی که توی دیتاست داری چیاست؟ کدومشون این فیلدهایی که تو دستور select داری توی یک جدول دارن؟
خب شما داری یک جدول جدید توی یک دیتاست میریزی با یک سری فیلد که از دستور select به دست اومده.
این جدول جدید حتی اگه توی دیتاست قبلیت ریخته بشه٬ هیچ کدوم از اون جدول ها نخواهد شد٬ بلکه جدول جدیدی اضافه میشه به اون دیتاست.
خلاصه کلام اینکه٬ select ت مهمه که چه فیلدهایی رو select کنه٬ اگه همین Select رو (بدون توجه به شرط ها) توی دیتاست به عنوان یک جدول جدید اضافه کنی٬ اونوقت میتونی بر اساس اون گزارش ایجاد کنی. و همون رو fill کنی و به crystal report بفرستی. متوجه شدی چی میگم؟


Access to the path 'D:\' is denied.
معنیش اینه که Access نداری (مثلا ویندوز ویستا داری ویندوزت توی درایو D هست و کاربر ادمین نیستی) و هر دلیل دیگه ای (شاید مثلا D نداری یا D سی دی رامته). خب یه جای دیگه بریز. یه آدرس دیگه بده برای ذخیره فایل٬ مثلا desktop خودت٬ کاری نداره.

mina.net
سه شنبه 13 مرداد 1388, 08:28 صبح
سلام دوستان ممنون از کمکی که کردید بخصوص جناب h2 عزیز و همچنین mn_zandy63
دمتون گرم. می گن خواستن تواستن هست بعد از 2هفته حرص خوردن به هر حال درست شد از ته دل خندیدم:قهقهه: . خوب نباید هم زیاد خوشحال باشم باید برم مشکلم رو تو ado.net و sql از پایه درست کنم.

یک سوال از جناب h2


Using dbDA AsNew SqlDataAdapter(str_select, con)
dbDA.Fill(dbDS.bed_best)
dbDA.SelectCommand.CommandText = "SELECT * FROM [hesab];"
dbDA.Fill(dbDS.hesab)
EndUsing

خط سوم برام گنگ هست یعنی شما دو بار select کردی؟ اگه 3 تا جدول بود یک بار دیگه هم برای جدول سوم باید خط سوم و چهارم تکرار می شد؟ :متفکر: من از CommandText هرگز استفاده نکردم. اگه می شه یک توضیح بفرمایید ممنون می شم.

بازم تشکر می کنم بخاطر کمکی که انجام دادید.

__H2__
سه شنبه 13 مرداد 1388, 10:10 صبح
سلام

من از CommandText هرگز استفاده نکردم. اگه می شه یک توضیح بفرمایید ممنون می شم.

هر DataAdapter میتواند 4 شی Command جداگانه داشته باشد برای SELECT و INSERT و UPDATE و DELETE

وقتی شما مثل کد قبلی یک DataAdapter را میسازید، در واقع یک DataAdapter با فقط یک Command مربوط به SelectCommand ساخته میشود.

Command ها وظیفه اجرای دستورات sql و سا sp ها را دارند که متن sql یا نام sp درون CommandText قرار میگیرد.

در کد قبلی من میتوانستم برای select جدول دوم یک DataAdapter جدید new کنم ولی در جهت صرفه جویی CommandText بخش SelectCommand همان DataAdapter قبلی را که شامل str_select شده بود و دیگر نیازی به str_select نبود با دستور جدید SELECT * FROM hesab پرکرده و جدول دوم را هم fill کرده ام.


خط سوم برام گنگ هست یعنی شما دو بار select کردی؟ اگه 3 تا جدول بود یک بار دیگه هم برای جدول سوم باید خط سوم و چهارم تکرار می شد؟
چون گزارش کریستال شما با دو جدول طراحی شده بود شما باید هر دو جدول را جداگانه به DataSet اضافه و Fill کنید تا وقتی DataSet را تحویل کریستال میدهد، همه اطلاعات را در خود داشته باشد.

طرز انجام عمل فوق مهم نیست، مهم آن است که در قبال هر جدول یک دستور Fill مناسب داشته باشد تا آن جدول را پر کند.

اگر سه جدول بود به سه دستور Fill مناسب نیاز داشتیم.

mina.net
سه شنبه 13 مرداد 1388, 12:30 عصر
ممنون دوستان مشکلم حل شد. بعد از تکمیل این برنامه باید برم ado.net , sql رو به صورت خیلی کامل بخونم. بازم ممنون

mn_zandy63
سه شنبه 13 مرداد 1388, 13:58 عصر
Happy coding :چشمک: