สอบถามการนำ database ของ Access บางเรคคอร์ด มาใช้ทำใบเสร็จใน Crytal Report ในVC# 2010คะ
ติดปัญหาอะไรครับ
Date :
2012-03-12 23:05:35
By :
sodamax
ไม่รู้ Code ในการเอาข้อมูลบางเรคคอร์ดจาก Database มาจัดทำใบเสร็จใน Crytal Report อ่าคะ ลองมาหลายทีแล้วได้แต่ข้อมูลทั้งหมดจากตารางใน Access อ่าคะ
Date :
2012-03-12 23:43:41
By :
hitsuki23
ขอดู code หน่อยครับ
Date :
2012-03-12 23:54:51
By :
sodamax
เขียน DataSource ก็ทำได้แล้วครับ
อ้างถึง
Code (VB.NET)
Dim Conn As New OleDbConnection
Dim StrConn As String="Connection String"
With Conn
.ConnectionString=StrConn
.Open
End With
Dim DA As New OleDbDataAdapter
Dim DS As New DataSet
Dim SQL As String="SELECT * FROM tbInvoices WHERE InvNo=" & Val(txtInvoice.text)
DA=New OleDbDataAdapter(SQL,Conn)
DA.Fill(DS,"tbInvoices")
Dim rpt As New ReportDocument()
If DS.Tables(0).Rows.Count <> 0 Then
rpt.Load("CrystalReport1.rpt")
rpt.SetDataSource(DS)
CrystalReportViewer1.ReportSource = rpt
End If
Error ตอนเปิดหน้า Crystal report ครับ "Failed to load database information."
Date :
2012-03-13 05:57:21
By :
webmaster
ตอบความคิดเห็นที่ : 5 เขียนโดย : webmaster เมื่อวันที่ 2012-03-13 06:16:47
รายละเอียดของการตอบ ::
ลองทำตามที่แนะนำมาพอกดรันมันจะขึ้นว่า โหลดรายงานไม่สำเร็จ อ่าคะตรงคำสั่ง rpt.Load("CrystalReport1.rpt")
อันนี้คือโค๊ดที่ใช้อยู่อ่าคะ
Code (C#)
namespace ChillyTheGuitarShop
{
public partial class FormSaleOrder : Form
{
private DataSet dataset;
private OleDbCommand command;
private OleDbConnection connect;
private OleDbDataAdapter adapter;
private DataSet ord;
private void Order_LoadDB()
{
string conStr = "Provider = Microsoft.Ace.OleDb.12.0;" +
@"Data Source =D:\Project ComApp\ChillyTheGuitarShop\ChillyTheGuitarShop\bin\Debug\ChillyTheGuitarShop1.mdb";
connect = new OleDbConnection(conStr);
connect.Open();
String sql = "SELECT*FROM Customer";
command = new OleDbCommand(sql, connect);
OleDbDataReader reader = command.ExecuteReader();
while (reader.Read())
{
comboCus.Items.Add(reader["CustomerName"]);
}
sql = "SELECT*FROM Product";
command = new OleDbCommand(sql, connect);
reader = command.ExecuteReader();
while (reader.Read())
{
comboProduct.Items.Add(reader["ProductName"]);
comboPrice.Items.Add(reader["price2"]);
}
dateTimePicker1.Value = DateTime.Today;
comboCus.SelectedIndex = 0;
comboProduct.SelectedIndex = 0;
button2.Enabled = false;
}
private void Order_CloseDB(object sender, FormClosingEventArgs e)
{
connect.Close();
}
private void showOrders()
{
string sql = "SELECT OrderID,CustomerName,ProductName,Quantity,Price,Total FROM [Order]";
command = new OleDbCommand(sql, connect);
adapter = new OleDbDataAdapter(command);
dataset = new DataSet();
adapter.Fill(dataset, "ord");
dataGridView1.DataSource = dataset.Tables["ord"];
}
private void combobox_Customer(object sender, EventArgs e)
{
showOrders();
}
public FormSaleOrder()
{
InitializeComponent();
Order_LoadDB();
}
private void button6_Click(object sender, EventArgs e)
{
double quan;
if (!double.TryParse(textBox2.Text, out quan))
{
MessageBox.Show("จำนวนที่ใส่ไม่ถูกต้อง");
return;
}
string sql = "INSERT INTO [Order](" +
"CustomerName,ProductName,Quantity,Price,OrderDate,Total)" +
"VALUES(@cust, @prod, @quan, @price, @ordDate,@total)";
command = new OleDbCommand(sql, connect);
command.Parameters.AddWithValue("cust", comboCus.SelectedItem);
command.Parameters.AddWithValue("prod", comboProduct.SelectedItem);
command.Parameters.AddWithValue("quan", quan);
command.Parameters.AddWithValue("price", comboPrice.SelectedItem);
command.Parameters.AddWithValue("ordDate", dateTimePicker1.Text);
String ptemp = comboPrice.SelectedItem.ToString();
double ptemp2 = double.Parse(ptemp);
double tprice = quan*ptemp2;
command.Parameters.AddWithValue("total", tprice);
int affedtedRow = command.ExecuteNonQuery();
if (affedtedRow < 1)
{
statusStrip1.Text = "เกิดข้อผิดพลาดระหว่างบันทึกข้อมูล";
return;
}
else
{
statusStrip1.Text = "ข้อมูลการถูกบันทึกเรียบร้อยแล้ว";
showOrders();
}
}
private void dataGridView1_RowStatusChange(object sender, DataGridViewRowStateChangedEventArgs e)
{
if (dataGridView1.SelectedRows.Count > 0)
{
button2.Enabled = true;
button3.Enabled = true;
}
else
{
button2.Enabled = false;
button3.Enabled = false;
}
}
private void button2_Click(object sender, EventArgs e)
{
DialogResult dialog = MessageBox.Show("ลบแถวที่เลือกนี้หรือไม่", "ยืนยันการลบ", MessageBoxButtons.OKCancel);
if (dialog == DialogResult.Cancel)
{
return;
}
string ordID = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
string sql = "DELETE FROM [Order] WHERE OrderID = " + ordID;
command.CommandText = sql;
command.ExecuteNonQuery();
showOrders();
button2.Enabled = false;
}
private void button3_Click(object sender, EventArgs e)
{
DialogResult dialog = MessageBox.Show("พิมพ์ใบเสร็จที่เลือกนี้หรือไม่", "พิมพ์ใบเสร็จ", MessageBoxButtons.OKCancel);
if (dialog == DialogResult.Cancel)
{
return;
}
string ordId = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
OleDbDataAdapter da = new OleDbDataAdapter();
DataSet ds = new DataSet();
string sql = "SELECT*FROM[Order]WHERE OrderID =" + double.Parse(ordId);
da = new OleDbDataAdapter(sql, connect);
da.Fill(ds,"ord");
/* ReportDocument rec = new ReportDocument();
if (ds.Tables[0].Rows.Count != 0)
{
rec.Load("CrystalReport1.rpt");
rec.SetDataSource(ds);
crystalReportViewer1.ReportSource = rec;
}
*/
FormReceipt receipt = new FormReceipt();
receipt.setParameter(ord);
receipt.Show();
}
}
}
และอันนี้เป็นคลาสสำหรับพิมใบ receipt อ่าคะ
Code (C#)
public partial class FormReceipt : Form
{
public FormReceipt()
{
InitializeComponent();
}
public void setParameter(DataSet ord)
{
ParameterDiscreteValue paraVa = new ParameterDiscreteValue();
paraVa.Value = ord;
ParameterField paraFi = new ParameterField();
paraFi.ParameterFieldName = "ord";
paraFi.CurrentValues.Add(paraVa);
ParameterFields paraFis = new ParameterFields();
paraFis.Add(paraFi);
crystalReportViewer1.ParameterFieldInfo = paraFis;
crystalReportViewer1.ReportSource = new CrystalReport1();
}
}
ผลลัพธ์ที่ออกมาจะพิมพ์ออกมาเป็นเหมือน Report มากกว่าใบเสร็จอ่าคะ
พอกดสั่งพิมพ์ใบเสร็จจะมีแจ้งอันนี้ก่อนอ่าคะ แล้วถ้ากด รีเฟรชอีกที มันก็จะปริ้นออกมาให้อ่าคะ
เหมือนรูปที่2
แต่ว่า ข้อมูลที่ปริ้นออกมามันจะออกมาทุกเรคคอร์ดใน Datagridview อ่าคะ ซึ่งจริงๆ อยากได้แค่เรคคอร์ดเดียวตามที่เราเลือกอ่าคะ
อย่างในรูปคือเลือกเรคคอร์ดที่สองแต่ตรงส่วนของ header ในใบที่ปริ้นออกมาก็ยังเป็นของเรคคอร์ดแรกอยู่ดีอ่าคะ
รบกวนด้วยนะคะ คือมือใหม่จริงๆ ต้องขออภัยด้วยนะคะที่รบกวนบ่อยๆ ขอบคุณคะ
Date :
2012-03-13 09:12:39
By :
hitsuki23
Load balance : Server 02