Shop
Notas de implementação
(continuação)
Em Resumo
1.
2.
3.
4.
5.
6.
Criar o componente ShopClassLibrary com os
diversos serviços de Acesso a Dados
(implememtar todos os serviços)
Criar um Web Site que será cliente do componente
ShopClassLibrary
Porque o Web Site vai utilizar serviços do
componente é preciso adicionar ao Web Site uma
referência ao componente
No Web Site criado, no directório App_Data,
adicionar a BD existente sales.mdb
Atendendo ao pathname da BD actualizar no
componente o valor da string de conexão à BD
Criar as várias WebForms constituintes do site
1
Implementar na classe Customer o método
public DataSet GetByID(string user, string pass, int clientID) {
OleDbConnection conn = null;
DataSet ds = null;
try {
// criar objecto de conexão à base de dados e abrir a conexão
conn = new OleDbConnection(UtilDB.CONN);
conn.Open();
// validar utilizador
if (UtilDB.ValidateUser(conn, null, user, pass) !=ShopStatusEnum.OK)
return null;
// efectuar pesquisa
ds = UtilDB.GetByID(conn, null, “Customers", “CustomerID", clientID);
}
catch (OleDbException )
{ // tratar a excepção!!!! ….. }
finally
{ // fechar a conexão
if (conn.State == ConnectionState.Open)
conn.Close(); }
return ds;
}
2
Implementar na classe Customer o método
public DataSet FindByName (string user, string pass, string name) {
OleDbConnection conn = null;
DataSet ds = null;
try {
// criar objecto de conexão à base de dados e abrir a conexão
conn = new OleDbConnection(UtilDB.CONN);
conn.Open();
// validar utilizador
if (UtilDB.ValidateUser(conn, null, user, pass) !=ShopStatusEnum.OK)
return null;
// efectuar pesquisa
ds = UtilDB.FindByStringField(conn, "Customers", "Name", name);
}
catch (OleDbException )
{ // tratar a excepção!!!! ….. }
finally
{ // fechar a conexão
if (conn.State == ConnectionState.Open)
conn.Close(); }
return ds;
}
3
static public DataSet FindByStringField(string table, string field, string key)
{
OleDbConnection conn = null;
DataSet ret = new DataSet();
try
{
// criar objecto de conexão à base de dados
conn = new OleDbConnection(UtilDB.CONN);
// invocar método auxiliar
ret = FindByStringField(conn, table, field, key);
}
catch (OleDbException ex)
{
// tratar a excepção!!!!
System.Console.WriteLine("EXCEPÇÃO no componente 'UtilDB': " + ex);
}
finally
{
// fechar a conexão
if (conn != null && conn.State != ConnectionState.Closed)
conn.Close();
}
// retornar valo
return ret;
}
4
static public DataSet FindByStringField(OleDbConnection conn,
string table, string field, string key)
{
DataSet ret = new DataSet();
try
{
// criar um Datadapter para executar o comando e devolver o ret
OleDbDataAdapter da = new OleDbDataAdapter(
"SELECT * FROM " + table + " WHERE " + field + " LIKE ?", conn);
da.SelectCommand.Parameters.AddWithValue("key", key + "%");
// executar o comando e preencher um Dataset
da.Fill(ret, table);
}
catch (OleDbException ex)
{
// tratar a excepção!!!!
System.Console.WriteLine(
"EXCEPÇÃO no componente 'UtilDB': " + ex);
}
// retornar valor
return ret;
}
5
Interface associada à Pesquisa de Cliente por ID
Pesquisar Cliente
ClienteID
Pesquisar
O Cliente não existe
Visible true or false
6
Página Pesquisa.aspx.cs
public partial class PesquisarID : System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e) {
if (!IsPostBack) {
Label2.Visible = false;
DetailsView1.Visible = false; }
}
protected void Button1_Click(object sender, EventArgs e) {
DetailsView1.Visible = false;
Label2.Visible = false;
long idCustomer = long.Parse(TextBox1.Text);
ICustomer customer = Factory.CreateCustomerService();
DataSet ds = customer.GetByID("Joao", "Joao", idCustomer);
try
{
if (ds.Tables[0].Rows.Count != 0) {
DetailsView1.Visible = true;
DetailsView1.DataSource = ds;
DetailsView1.DataBind();
}
else
Label2.Visible = true;
}
catch (System.Exception)
{ Label2.Visible = true; }
}
}
7
Implementar na classe Customer o método
public long Add(string user, string pass,
string name, string address, string phone, string fax,
string email, out ShopStatusEnum status) {
long customerID = -1;
OleDbConnection conn = null;
// validar dados de entrada
if (name == null || name.Trim().Length == 0) {
status = ShopStatusEnum.InvalidArgument;
return -1; }
try
{
// criar objecto de conexão à base de dados e abrir a conexão
conn = new OleDbConnection(UtilDB.CONN);
conn.Open();
// validar o utilizador
status = UtilDB.ValidateUser(conn, null, user, pass);
if (status != ShopStatusEnum.OK)
return -1;
8
// criar comando SQL a executar
string sqlCmd = "INSERT INTO Customers (Name, Address,
PhoneNb, FaxNb, EMail) Values (?, ?, ?, ?, ?)";
OleDbCommand cmd = new OleDbCommand(sqlCmd, conn);
cmd.Parameters.AddWithValue("name", name);
if (address == null || address.Length == 0)
cmd.Parameters.AddWithValue("address", DBNull.Value);
else
cmd.Parameters.AddWithValue("address", address);
if (phone == null || phone.Length == 0)
cmd.Parameters.AddWithValue("phone", DBNull.Value);
else
cmd.Parameters.AddWithValue("phone", phone);
if (fax == null || fax.Length == 0)
cmd.Parameters.AddWithValue("fax", DBNull.Value);
else
cmd.Parameters.AddWithValue("fax", fax);
if (email == null || email.Length == 0)
cmd.Parameters.AddWithValue("email", DBNull.Value);
else
cmd.Parameters.AddWithValue("email", email);
// executar o comando
//
int insRows = cmd.ExecuteNonQuery( );
9
// verificar o resultado
if (insRows == 0)
// não inseriu registo
status = ShopStatusEnum.NOT_OK;
else {
// inseriu registo
// obter novo código de id gerado pela BD
OleDbCommand idCmd = new OleDbCommand(
"SELECT @@IDENTITY", conn);
customerID = (int)idCmd.ExecuteScalar();
status = ShopStatusEnum.Ok;
}
}
catch (OleDbException ex) {
// tratar a excepção!!!!
status = ShopStatusEnum.ERROR;
}
finally { // fechar a conexão
if (conn != null && conn.State == ConnectionState.Open)
conn.Close( ); }
return customerID;
}
10
Implementar na classe Customer o método
public DataSet getAll(string user, string pass) {
OleDbConnection conn;
ShopStatusEnum status;
try
{
// criar objecto de conexão à base de dados e abrir a conexão
conn = new OleDbConnection(UtilDB.CONN);
conn.Open();
// validar o utilizador
status = UtilDB.ValidateUser(conn, null, user, pass);
if (status != ShopStatusEnum.OK)
return null;
DataSet ds = UtilDB.getAllFromTable(conn, "Customers");
return ds;
}
catch (System.Exception)
{
return null;
}
}
11
Interface associada à Inserção de Cliente
Inserir Cliente
Name
Address
Phone
Fax
Email
Inserir
Registo inserido / não inserido
12
protected void ButtonInserir_Click(object sender, EventArgs e)
{
try
{
ShopStatusEnum st;
string user = "Joao";
string pass = "Joao";
string name = TextBox1.Text;
string address = TextBox2.Text;
string phone = TextBox3.Text;
string fax = TextBox4.Text;
string email = TextBox5.Text;
ICustomer customer = Factory.CreateCustomerService();
long id =
customer.Add(user, pass, name, address, phone, fax, email, out st);
if (id == -1)
{
Label6.Text = "Registo Não Inserido"; Label6.Visible = true; }
else {
Label6.Text = "Registo Inserido. ID=“+id.ToString();
Label6.Visible = true;
TextBox1.Text = ""; TextBox2.Text = "";
TextBox3.Text = ""; Textox4.Text = ""; Textox5.Text = ""; }
} catch (SystemException) { }
}
13
Interface associada a Encomenda de Cliente
Venda
Cliente
Produto
Quantidade
Add
Produtos Comprados
Fechar Facturta
14
Carregar as DropDownLists
ICustomer clientes = Factory.CreateCustomerService();
DataSet dsClientes = clientes.getAll("Joao", "Joao");
if (dsClientes != null) {
DropDownList1.DataTextField = "Name";
DropDownList1.DataValueField = "CustomerID";
DropDownList1.DataSource = dsClientes;
DropDownList1.DataBind(); }
IProduct produtos = Factory.CreateProductService();
DataSet dsProdutos = produtos.GetAll("Joao", "Joao");
if (dsProdutos != null) {
DropDownList2.DataTextField = "Description";
DropDownList2.DataValueField = "ProductID";
DropDownList2.DataSource = dsProdutos;
DropDownList2.DataBind();
}
15
Criar DataSet Vazio a partir da tabela SaleDetails
ISale2 sale = Factory.CreateSale2Service();
DataSet dsDetalhes =
sale.CreateDetails("Joao", "Joao");
//adicionar ao DataSet nova coluna Produto
dsDetalhes.Tables[0].Columns.Add(
"Produto");
//guardar o DataSet numa variável de Session
Session["Detalhes"] = dsDetalhes;
16
Implementar na classe Sales o método
public DataSet CreateDetails(string User, string Pass)
{
OleDbConnection conn = null;
DataSet ds;
try { // criar objecto de conexão à BD e abrir a conexão
conn = new OleDbConnection(UtilDB.CONN);
conn.Open();
// validar o utilizador
if (UtilDB.ValidateUser(conn, null, User, Pass) !=ShopStatusEnum.OK)
return null;
// criar o dataset
ds = UtilDB.GetById(conn, null, "SaleDetails", "SaleID", -1);
if (ds == null)
return null;
// configurar as colunas para utilização
ds.Tables["SaleDetails"].Columns["SaleID"].AllowDBNull = true; }
catch (OleDbException ex) {
// tratar a excepção!!!!
return null; }
finally {
// fechar a conexão
if (conn.State == ConnectionState.Open) conn.Close(); }
return ds;
}
17
Página Sales.aspx.cs
public partial class Sales : System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e) {
if (!IsPostBack)
{
ICustomer clientes = Factory.CreateCustomerService();
DataSet dsClientes = clientes.getAll("Joao", "Joao");
if (dsClientes != null) {
DropDownList1.DataTextField = "Name";
DropDownList1.DataValueField = "CustomerID";
DropDownList1.DataSource = dsClientes;
DropDownList1.DataBind(); }
IProduct produtos = Factory.CreateProductService();
DataSet dsProdutos = produtos.GetAll("Joao", "Joao");
if (dsProdutos != null) {
DropDownList2.DataTextField = "Description";
DropDownList2.DataValueField = "ProductID";
DropDownList2.DataSource = dsProdutos;
DropDownList2.DataBind();
}
GridView1.Visible = false;
ISale2 sale = Factory.CreateSale2Service();
DataSet dsDetalhes = sale.CreateDetails("Joao", "Joao");
dsDetalhes.Tables[0].Columns.Add("Produto");
Session["Detalhes"] = dsDetalhes;
} }
18
GridView RowCreated Event
O evento RowCreated é accionado quando cada
linha da Gridview é criada.
Para esconder colunas da GridView
Aceder a uma célula específica da linha
e.Row.Cells[0].Visible = false;
EXEMPLO
protected void GridView1_RowCreated(object sender,
GridViewRowEventArgs e) {
e.Row.Cells[0].Visible = false;
e.Row.Cells[1].Visible = false;
e.Row.Cells[3].Visible = false;
}
19
Acrescentar linhas de encomenda
Obter dados do Cliente
Obter dados do produto
Obter quantidade
Aceder ao DataSet Detalhes guardado em
Session para actualizar
Criar nova linha
Preencher campos
Adicionar linha ao data set
Guardar o novo DataSet Detalhes em
Session
Visualizar o dataSet na Gridview
20
Evento associado a Adicionar linha encomenda
protected void Button1_Click(object sender, EventArgs e {
// Obter dados
string clienteID = DropDownList1.SelectedValue;
string produtoID = DropDownList2.SelectedValue;
string produtoname = DropDownList2.SelectedItem.Text;
int qtd = int.Parse(TextBox1.Text);
// Obter DataSet de variável de Session
DataSet dsDetalhes = (DataSet)Session["Detalhes"];
// Criar linha na tabela 0 do data Set
DataRow dr = dsDetalhes.Tables[0].NewRow();
// Preencher campos da linha
dr["ProductID"] = produtoID;
dr["Quantity"] = qtd;
dr["Produto"] = produtoname;
// Acrescentar linha à Tabela
dsDetalhes.Tables["SaleDetails"].Rows.Add(dr);
// Actualizar GridView
GridView1.DataSource = dsDetalhes;
GridView1.DataBind();
GridView1.Visible = true;
// Guardar DataSet em variável de Session
Session["Detalhes"] = dsDetalhes;
}
21
Evento associado a Fechar Encomenda
protected void Button2_Click(object sender, EventArgs e)
{
DataSet dsDetalhes = (DataSet)Session["Detalhes"];
ISale2 sale = Factory.CreateSale2Service();
sale.Add("Joao", "Joao", 22, DateTime.Now, dsDetalhes);
GridView1.Visible = false;
Button2.Visible = false;
}
22
Método Add da classe Sales.cs
public ShopStatusEnum Add(string User, string Pass,
int CustomerID, DateTime Date, DataSet RsDetails) {
//Abrir conexão com a BD
conn = new OleDbConnection(UtilDB.CONN); conn.Open();
//Iniciar Transacção
tx = conn.BeginTransaction();
//Validar User Pass
if (UtilDB.ValidateUser(conn, tx, User, Pas s) != ShopStatusEnum.Ok)
return ShopStatusEnum.InvalidLogOn;
//Validar Cliente
DataSet dsCust = UtilDB.GetById(conn, tx, "Customers",
"CustomerID", CustomerID);
if (dsCust.Tables["Customers"].Rows.Count == 0)
return ShopStatusEnum.InvalidCustomerId;
…
23
Validar Produtos e Quantidade…
if (RsDetails.Tables["SaleDetails"].Rows.Count == 0)
return ShopStatusEnum.InvalidArgument;
int[ ] listaProd = new int[RsDetails.Tables["SaleDetails"].Rows.Count];
int i = 0;
foreach (DataRow regDetails in RsDetails.Tables["SaleDetails"].Rows)
{
if (regDetails.IsNull("ProductID"))
return ShopStatusEnum.InvalidArgument;
if (regDetails.IsNull("Quantity"))
return ShopStatusEnum.InvalidArgument;
// verificar se este produto tem quantidade suficiente em stock e se existe!
Product p = new Product();
ret = p.InStock(conn, tx, (int)regDetails["ProductID"],
(int)regDetails["Quantity"]);
if (ret != ShopStatusEnum.Ok)
return ret;
//guardar o código de produto para pesquisar
listaProd[i++] = (int)regDetails["ProductID"]; }
24
RsDetails DataSet Detalhes da Encomenda
//Criar um DataSet de produtos e preencher apenas com os
produtos desejados
DataSet pDS = UtilDB.GetById(conn, tx, "Products", "ProductID",
listaProd)
if (pDS == null)
return ShopStatusEnum.InvalidProductId;
//Calcular custo por linha
foreach (DataRow regDetails in RsDetails.Tables["SaleDetails"].Rows)
{
// procurar o produto desejado
DataRow[ ] row = pDS.Tables["Products"].Select("ProductId=" +
regDetails["ProductID"].ToString());
// calcular custo desta linha da venda
regDetails["TotalCost"] = (int)regDetails["Quantity"] *
(float)row[0]["UnitPrice"];
}
25
Inserir Venda
// criar comando para inserção
OleDbCommand cmd = new OleDbCommand("INSERT
INTO sales (customerid, dateofsale) VALUES (?, ?)", conn);
cmd.Transaction = tx;
cmd.Parameters.AddWithValue("custid", CustomerID);
OleDbParameter parm = cmd.Parameters.Add("dt",
OleDbType.Date);
parm.Value = Date;
// inserir registo
cmd.ExecuteNonQuery();
// obter id autogerado
OleDbCommand cmd2 = new OleDbCommand("SELECT
@@IDENTITY", conn);
cmd2.Transaction = tx;
int id = (int)cmd2.ExecuteScalar();
26
// inserir chave estrangeira nas linhas de detalhe
foreach (DataRow regDetails in
RsDetails.Tables["SaleDetails"].Rows) {
regDetails["SaleID"] = id;
}
// inserir linhas de detalhe
OleDbDataAdapter da = new OleDbDataAdapter(
"SELECT * FROM SaleDetails", conn);
da.SelectCommand.Transaction = tx;
OleDbCommandBuilder cb =
new OleDbCommandBuilder(da);
da.Update(RsDetails, "SaleDetails");
//
27
RsDetails DataSet Detalhes da Encomenda
//actualizar quantidades de produto em stock
OleDbCommand cmd3 = new OleDbCommand(
"UPDATE Products SET StockQtd=StockQtd-? WHERE
ProductId=?", conn);
cmd3.Transaction = tx;
OleDbParameter p1 = cmd3.Parameters.Add("qtd",
OleDbType.Integer);
OleDbParameter p2 = cmd3.Parameters.Add("pid",
OleDbType.Integer);
foreach (DataRow regDetails in
RsDetails.Tables["SaleDetails"].Rows) {
p1.Value = regDetails["Quantity"];
p2.Value = regDetails["ProductID"];
cmd3.ExecuteNonQuery();
}
// fechar transacção
tx.Commit();
28
verifica se existe uma determinada quantidade de
um produto em armazem.
internal ShopStatusEnum InStock (OleDbConnection
conn, OleDbTransaction tx, int ProductID, int Quant)
{
DataSet rs = UtilDB.GetById(conn, tx, "Products",
"ProductID", ProductID);
if (rs == null)
return ShopStatusEnum.NotOk;
// validar stock
if (rs.Tables["products"].Rows.Count > 0)
return
((int)(rs.Tables["Products"].Rows[0]["StockQtd"]) >= Quant ?
ShopStatusEnum.Ok :ShopStatusEnum.InsufficientStock);
else
return ShopStatusEnum.InvalidProductId;
}
29
Em UtilDB
GetByID
static public DataSet GetById(OleDbConnection conn, OleDbTransaction tx, string
table, string keyName, int[] keys)
{
DataSet ds = null;
try
{
// criar objecto DataSet
ds = new DataSet();
// criar um Datadapter para executar o comando e devolver o datase
System.Text.StringBuilder sb = new System.Text.StringBuilder("Select *
From " + table + " Where " + keyName + " IN (");
foreach (int k in keys)
{
sb.Append(k.ToString());
sb.Append(",");
}
sb.Length = sb.Length - 1;
sb.Append(")");
string sSqlCmd = sb.ToString();
OleDbDataAdapter oAdapter = new OleDbDataAdapter(sSqlCmd, conn);
oAdapter.SelectCommand.Transaction = tx;
// executar o comando e preencher um Dataset
oAdapter.Fill(ds, table); }
catch (OleDbException ex)
{
// tratar a excepção!!!!
System.Console.WriteLine("EXCEPÇÃO no método 'UtilDB.GetByID': " +
ex.Message);
ds = null; }
return ds;
}
30