รบกวนถามเรื่อง crystal report ที่ดึงข้อมูลจาก dataset มากกว่าสอง dataset อ่ะคับ vb.net2008
โดยปกติ หนึ่ง REPORT จะใช้ DATASOURCE ชุดเดียวค่ะ
เพราะ มี LAYOUT เพียงชุดเดียวเหมือนกัน
แต่หากต้องการ MULTIPLE LAYOUT ก็ใช้ SUBREPORT ค่ะ
คือแสดงชุดข้อมูลที่ไม่เกี่ยวข้องกันใดๆเลย ในพื้นที่ที่ไม่เกี่ยวข้องกัน ในหน้ากระดาษเดียว
คำถามที่ว่าใช้ 2 Dataset ยังไง
คงต้องถามว่า คุณทำไปเพื่ออะไร อย่างไร
เช่น
ข้อมูลชุดแรกเป็นของผลิตภัณฑ์ ข้อมูลชุดที่สองเป็นของพนักงาน แบบนี้ใช้ SUB REPORT
ถ้า ข้อมูลชุดแรกของผลิตภัณฑ์ต้นปี ข้อมูลชุดที่สองของผลิตภัณฑ์ปลายปี
ทำไมคุณไม่ UNION ด้วย SQL COMMAND แล้ว ส่งมาให้ REPORT
CODE ที่ยกมาก้อเป็นเพียงการเชื่อมต่อกับ Report ไม่ได้ให้ข้อมูลอะไรเลย
ต้องให้ข้อมูลเพิ่มเติมด้วยค่ะ
Date :
2010-02-17 22:00:13
By :
blurEye
Code (VB.NET)
Public Class TransportReportByDetail
Dim DTSet As New DataSet
Dim RDSet As New DataSet
Dim Sumset As New DataSet
Dim ChkSet As New DataSet
Private Sub TransportReportByDetail_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TxtEmpID.Text = ""
TxtEmpID.Focus()
End Sub
Private Sub TxtEmpID_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtEmpID.KeyPress
If e.KeyChar = Chr(13) Then
If TxtEmpID.Text = "" Then
MsgBox("Please Input Employee ID", MsgBoxStyle.OkOnly)
TxtEmpID.Text = ""
TxtSumDriver.Text = ""
TxtSumLoad.Text = ""
TxtSumUnload.Text = ""
TxtSumWaitTime.Text = ""
TxtSumBreakTime.Text = ""
TxtStartDat.Text = ""
TxtEndDat.Text = ""
TxtSumH.Text = ""
DTSet.Reset()
RDSet.Reset()
Sumset.Reset()
ChkSet.Reset()
TxtEmpID.Focus()
Else
DTSet.Reset()
DTSet = Ora_DTSET("select a.th_empid,a.th_empname,b.td_time, " & _
" b.td_driver, " & _
" b.td_load,b.td_unload,b.td_waittime,b.td_brtime,b.td_remark,b.td_dista " & _
" from tbl_trheader a,tbl_trdetail b,tbl_trtime c " & _
" where a.th_empid like '%" & TxtEmpID.Text & "%' " & _
" and to_char(a.th_credate,'dd/mm/yyyy')='" & TxtCreDate.Text & "' " & _
" and a.th_empid = b.td_empid " & _
" and trunc(a.th_credate) = trunc(b.td_credate) " & _
" and b.td_time=c.action_time " & _
" order by a.th_empid,c.id_time ").Tables(0).DataSet.Copy
If DTSet.Tables(0).Rows.Count <= 0 Then
MsgBox("No data found", MsgBoxStyle.OkOnly)
TxtEmpID.Text = ""
TxtSumDriver.Text = ""
TxtSumLoad.Text = ""
TxtSumUnload.Text = ""
TxtSumWaitTime.Text = ""
TxtSumBreakTime.Text = ""
TxtStartDat.Text = ""
TxtEndDat.Text = ""
TxtSumH.Text = ""
RDSet.Reset()
Sumset.Reset()
ChkSet.Reset()
TxtEmpID.Focus()
Else
RDSet.Reset()
RDSet = Ora_DTSET("select a.tr_round,a.tr_store,a.tr_mstart,a.tr_mend, " & _
" a.tr_oil, a.tr_sumdista,a.tr_rateoil from tbl_trround a,tbl_trheader b " & _
" where a.tr_empid like '%" & TxtEmpID.Text & "%' " & _
" and to_char(a.tr_credate,'dd/mm/yyyy')='" & TxtCreDate.Text & "' " & _
" and a.tr_empid = b.th_empid " & _
" and trunc(a.tr_credate) = trunc(b.th_credate) " & _
" order by a.tr_round ").Tables(0).DataSet.Copy
With DataGridView2
.DataSource = RDSet.Tables(0)
End With
With DataGridView1
.DataSource = DTSet.Tables(0)
End With
Sumset.Reset()
Sumset = Ora_DTSET("select sum(b.td_driver) as driver,sum(b.td_load) as load, " & _
" sum(b.td_unload) as unload," & _
" sum(b.td_waittime) as wait_time," & _
" sum(b.td_brtime) as break_time " & _
" from tbl_trheader a,tbl_trdetail b " & _
" where a.th_empid like '%" & TxtEmpID.Text & "%' " & _
" and to_char(a.th_credate,'dd/mm/yyyy')='" & TxtCreDate.Text & "' " & _
" and a.th_empid = b.td_empid " & _
" and trunc(a.th_credate) = trunc(b.td_credate)").Tables(0).DataSet.Copy
TxtSumDriver.Text = Sumset.Tables(0).Rows(0).Item(0).ToString
TxtSumLoad.Text = Sumset.Tables(0).Rows(0).Item(1).ToString
TxtSumUnload.Text = Sumset.Tables(0).Rows(0).Item(2).ToString
TxtSumWaitTime.Text = Sumset.Tables(0).Rows(0).Item(3).ToString
TxtSumBreakTime.Text = Sumset.Tables(0).Rows(0).Item(4).ToString
ChkSet.Reset()
ChkSet = Ora_DTSET("select th_startdat,th_enddat,th_sumh " & _
" from(tbl_trheader)where th_empid like '%" & TxtEmpID.Text & "%' " & _
" and to_char(th_credate,'dd/mm/yyyy')='" & TxtCreDate.Text & "'").Tables(0).DataSet.Copy
TxtStartDat.Text = ChkSet.Tables(0).Rows(0).Item(0).ToString
TxtEndDat.Text = ChkSet.Tables(0).Rows(0).Item(1).ToString
TxtSumH.Text = ChkSet.Tables(0).Rows(0).Item(2).ToString
End If
End If
End If
End Sub
Private Sub BtnSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSearch.Click
If TxtEmpID.Text = "" Then
MsgBox("Please Input Employee ID", MsgBoxStyle.OkOnly)
TxtEmpID.Text = ""
TxtSumDriver.Text = ""
TxtSumLoad.Text = ""
TxtSumUnload.Text = ""
TxtSumWaitTime.Text = ""
TxtSumBreakTime.Text = ""
TxtStartDat.Text = ""
TxtEndDat.Text = ""
TxtSumH.Text = ""
DTSet.Reset()
RDSet.Reset()
Sumset.Reset()
ChkSet.Reset()
TxtEmpID.Focus()
Else
DTSet.Reset()
DTSet = Ora_DTSET("select a.th_empid,a.th_empname,b.td_time, " & _
" b.td_driver, " & _
" b.td_load,b.td_unload,b.td_waittime,b.td_brtime,b.td_remark,b.td_dista " & _
" from tbl_trheader a,tbl_trdetail b,tbl_trtime c " & _
" where a.th_empid like '%" & TxtEmpID.Text & "%' " & _
" and to_char(a.th_credate,'dd/mm/yyyy')='" & TxtCreDate.Text & "' " & _
" and a.th_empid = b.td_empid " & _
" and trunc(a.th_credate) = trunc(b.td_credate) " & _
" and b.td_time=c.action_time " & _
" order by a.th_empid,c.id_time ").Tables(0).DataSet.Copy
If DTSet.Tables(0).Rows.Count <= 0 Then
MsgBox("No data found", MsgBoxStyle.OkOnly)
TxtEmpID.Text = ""
TxtSumDriver.Text = ""
TxtSumLoad.Text = ""
TxtSumUnload.Text = ""
TxtSumWaitTime.Text = ""
TxtSumBreakTime.Text = ""
TxtStartDat.Text = ""
TxtEndDat.Text = ""
TxtSumH.Text = ""
RDSet.Reset()
Sumset.Reset()
ChkSet.Reset()
TxtEmpID.Focus()
Else
RDSet.Reset()
RDSet = Ora_DTSET("select a.tr_round,a.tr_store,a.tr_mstart,a.tr_mend, " & _
" a.tr_oil, a.tr_sumdista,a.tr_rateoil from tbl_trround a,tbl_trheader b " & _
" where a.tr_empid like '%" & TxtEmpID.Text & "%' " & _
" and to_char(a.tr_credate,'dd/mm/yyyy')='" & TxtCreDate.Text & "' " & _
" and a.tr_empid = b.th_empid " & _
" and trunc(a.tr_credate) = trunc(b.th_credate) " & _
" order by a.tr_round ").Tables(0).DataSet.Copy
With DataGridView2
.DataSource = RDSet.Tables(0)
End With
With DataGridView1
.DataSource = DTSet.Tables(0)
End With
Sumset.Reset()
Sumset = Ora_DTSET("select sum(b.td_driver) as driver,sum(b.td_load) as load, " & _
" sum(b.td_unload) as unload," & _
" sum(b.td_waittime) as wait_time," & _
" sum(b.td_brtime) as break_time " & _
" from tbl_trheader a,tbl_trdetail b " & _
" where a.th_empid like '%" & TxtEmpID.Text & "%' " & _
" and to_char(a.th_credate,'dd/mm/yyyy')='" & TxtCreDate.Text & "' " & _
" and a.th_empid = b.td_empid " & _
" and trunc(a.th_credate) = trunc(b.td_credate)").Tables(0).DataSet.Copy
TxtSumDriver.Text = Sumset.Tables(0).Rows(0).Item(0).ToString
TxtSumLoad.Text = Sumset.Tables(0).Rows(0).Item(1).ToString
TxtSumUnload.Text = Sumset.Tables(0).Rows(0).Item(2).ToString
TxtSumWaitTime.Text = Sumset.Tables(0).Rows(0).Item(3).ToString
TxtSumBreakTime.Text = Sumset.Tables(0).Rows(0).Item(4).ToString
ChkSet.Reset()
ChkSet = Ora_DTSET("select th_startdat,th_enddat,th_sumh " & _
" from tbl_trheader where th_empid like '%" & TxtEmpID.Text & "%' " & _
" and to_char(th_credate,'dd/mm/yyyy')='" & TxtCreDate.Text & "'").Tables(0).DataSet.Copy
TxtStartDat.Text = ChkSet.Tables(0).Rows(0).Item(0).ToString
TxtEndDat.Text = ChkSet.Tables(0).Rows(0).Item(1).ToString
TxtSumH.Text = ChkSet.Tables(0).Rows(0).Item(2).ToString
End If
End If
End Sub
Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
Dim DDTtemp As New DataSet
DDTtemp = DTSet.Tables(0).DataSet.Copy
Dim reportset As New ReportTransportByDetail
reportset.SetDataSource(DDTtemp.Tables(0))
ReportVeiwer.CrystalReportViewer1.ReportSource = reportset
ReportVeiwer.Show()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
End Class
code ตัวที่ทำมาครับ เนื่องจากดึงข้อมูลมา จาก 2 datagrid ซึ่ง 2 datagrid นี้เป็น dataset คนละตัวและไม่สามารถเอามา union กันได้ผมใช้ oracle นะครับ รบกวนตอบให้ตรงประเด็นหน่อย นี้เป็น code ทั้งหมดนะครับ
Date :
2010-02-18 00:24:04
By :
aa
แล้วผลลัพธ์ที่ต้องการคือยังไง
ให้เดาจาก Code คงมะไหวละค่ะ
ทำงานตัวเองอยู่ด้วยน่ะคะ
Date :
2010-02-18 00:48:39
By :
blurEye
1 dataset ใส่ได้หลาย datatable
คุณส่งไป dataset เดียว แต่รวมๆ หลายๆ datatable ก็ได้
ไม่จำเป็นต้อง ส่งไปหลายๆ dataset ครับ
DataSet.DataTable.Add("table ที่คุณต้องการ");
Date :
2010-02-18 08:31:03
By :
numenoy
ยกตัวอย่างให้ดูได้ป่าวครับ เรื่อง 1 dataset ใส่ได้หลาย datatable
Date :
2010-02-18 13:44:26
By :
aa
Ora_DTSET(...) <<< method นี้คุณ return ค่าออกมาเป็น dataset ใช่มั้ยครับ
Dim myDataSet As New DataSet() <<< ผมจะสร้าง dataset ขึ้นมาตัวหนึ่ง
myDataSet.Tables.Add(Ora_DTSET(...).Tables("ชื่อ table ของคุณ ที่ Select มา")) <<< ผมก็เอา table ที่ได้จาก database มาลง myDataSet ของผม
สามารถ add ได้เรื่อยๆ ตราบใดที่ ชื่อ table ไม่ซ้ำกัน หรือ index ไม่ซ้ำกัน
myDataSet.Tables.Add(Ora_DTSET(...).Tables("table1"))
myDataSet.Tables.Add(Ora_DTSET(...).Tables("table2"))
myDataSet.Tables.Add(Ora_DTSET(...).Tables("table3"))
เพราะ dataset ก็คือ แบบนี้ คือที่รวมๆ หลายๆ datatable
<dataset>
<datatable1>
</datatable1>
<datatable2>
</datatable2>
<datatable3>
</datatable3>
</dataset>
คุณก็เอา dataset ไป link ใน crystal report ของคุณ โดยเลือก table ให้ตรงแล้วกันครับ
Dim DDTtemp As New DataSet <<< ตรงนี้คุณยัง ประกาศ dataset temp ใช้เองเลย แล้ว จะ Add datatable เพิ่มไม่ได้เลยหรือ
190. DDTtemp = DTSet.Tables(0).DataSet.Copy
191. Dim reportset As New ReportTransportByDetail
192. reportset.SetDataSource(DDTtemp.Tables(0))
Date :
2010-02-18 14:50:26
By :
numenoy
เขียนโค้ดให้จับรวม dataset เป็นตัวเดียวกันเลยครับ
Date :
2010-02-18 18:00:09
By :
madoadza
รบกวนขอตัวอย่างมาเป็นแนวทางได้หรือป่าวครับ ผมยังเริ่มไปไม่ถูกทางเลย ขอบคุณทุกท่านมากๆเลยสำหรับคำตอบ
แต่ขอ codeตัวอย่างพอเป็นแนวทางด้วยครับ ส่งมาที่เมลผมก็ได้นะครับ [email protected]
Date :
2010-02-20 16:06:42
By :
xcom
Load balance : Server 00