/************************************************************* (C) ISEP 2004 (C) Professores de ADAV 2004 O ISEP, na qualidade de autor do presente software, garante o direito de utilização, alteração, evolução e distribuição do mesmo sem qualquer tipo de restrições, excepto: - esta mensagem não pode ser retirada - os nomes das classes não podem ser alterados *************************************************************/ using System; using System.Data; using System.Data.OleDb; namespace ShopClassLibrary { public interface ISale { DataSet CreateDetails(string user, string pass); ShopStatus Add(string user, string pass, int customerId, DateTime date, DataSet rsDetails); } public interface ISale2 : ISale { DataSet GetByCustomer(string user, string pass, int customerId); DataSet GetAll(string user, string pass); } /// /// Summary description for Sale. /// internal class Sale : ISale2 { #region ISale /// /// pesquisa clientes por nome /// /// username de login na aplicação /// password de login na aplicação /// um dataset vazio para a palicação cliente preencher public DataSet CreateDetails(string User, string Pass) { OleDbConnection conn = null; DataSet ds; try { // // criar objecto de conexão à base de dados e abrir a conexão // conn = new OleDbConnection(UtilDB.CONN); conn.Open(); // // validar o utilizador // if( UtilDB.ValidateUser(conn, null, User, Pass) != ShopStatus.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!!!! // System.Console.WriteLine("EXCEPÇÃO no método da classe 'Sale': " + ex.Message); return null; } finally { // // fechar a conexão // if (conn.State == ConnectionState.Open) conn.Close(); } return ds; } /// /// adiciona uma venda ao sistema /// /// username de login na aplicação /// password de login na aplicação /// um dataset com as linhas de detalhe da venda /// o código de status relativo à operação public ShopStatus Add(string user, string pass, int customerId, DateTime date, DataSet rsDetails) { OleDbConnection conn = null; OleDbTransaction tx = null; ShopStatus ret = ShopStatus.NotOk; try { // // criar objecto de conexão à base de dados // conn = new OleDbConnection(UtilDB.CONN); conn.Open(); // // iniciar transacção // tx = conn.BeginTransaction(); // // validar o utilizador // if (UtilDB.ValidateUser(conn, tx, user, pass) != ShopStatus.Ok) return ShopStatus.InvalidLogOn; // // validar cliente // // <--- CODIGO EM FALTA ---> DataSet dsCust = UtilDB.GetById(conn, tx, "Customers", "CustomerID", customerId); if (dsCust.Tables["Customers"].Rows.Count == 0) return ShopStatus.InvalidCustomerId; //<--- // // validar os produtos e quantidades pedidas // // <--- CODIGO EM FALTA ---> //IProduct p = Factory.CreateProductService();//new Product(); Product p = new Product(); //<-- int[] listaProd = new int[rsDetails.Tables["SaleDetails"].Rows.Count]; int i = 0; foreach (DataRow regDetails in rsDetails.Tables["SaleDetails"].Rows) { // // verificar se este produto tem quantidade suficiente em stock // e se existe! // // <--- CODIGO EM FALTA ---> if (regDetails.IsNull("ProductID")) return ShopStatus.InvalidArgument; if (regDetails.IsNull("Quantity")) return ShopStatus.InvalidArgument; //ret = p.InStock(user, pass, (int)regDetails["ProductID"], (int)regDetails["Quantity"]); ret = p.InStock(conn, tx, (int)regDetails["ProductID"], (int)regDetails["Quantity"]); if (ret != ShopStatus.Ok) return ret; //<--- // // guardar o código de produto para pesquisa // listaProd[i++] = (int)regDetails["ProductID"]; } // // 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 ShopStatus.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"]; /** // // actualizar stock no DataSet para posterior update à BD // row[0]["StockQtd"] = (int)row[0]["StockQtd"] - (int)regDetails["Quantity"]; **/ } // ====================================== // // tratar das inserções // // ====================================== // // criar comando para inserção // OleDbCommand cmd = new OleDbCommand("INSERT INTO sales (customerid, dateofsale) VALUES (?, ?)", conn); cmd.Transaction = tx; cmd.Parameters.Add("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(); // // 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"); // // 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(); } catch(OleDbException ex) { // // descartar mudanças efectuadas // if (tx != null) tx.Rollback(); // // tratar a excepção!!!! // System.Console.WriteLine("EXCEPÇÃO no método da classe 'Sale': " + ex.Message); } finally { conn.Close(); } return ret; } #endregion #region ISale2 /// /// /// /// /// /// /// public DataSet GetByCustomer(string user, string pass, int customerId) { DataSet ds = null; OleDbConnection conn = null; try { // // criar objecto DataSet // ds = new DataSet(); // // criar objecto de conexão à base de dados e abrir a conexão // conn = new OleDbConnection(UtilDB.CONN); conn.Open(); // // validar o utilizador // if (UtilDB.ValidateUser(conn, null, user, pass) != ShopStatus.Ok) return null; // // criar um Datadapter para executar o comando e devolver o dataset // cabeçalhos das vendas // string sSqlCmd = "Select * From vwTotalBySale Where CustomerID = ?"; OleDbDataAdapter oAdapter = new OleDbDataAdapter(sSqlCmd, conn); oAdapter.SelectCommand.Parameters.Add("custid", customerId); // // executar o comando e preencher um Dataset // oAdapter.Fill(ds, "Sales"); // // criar um Datadapter para executar o comando e devolver o dataset // linhas de detalhe // sSqlCmd = "SELECT * FROM vwExpandedSaleDetails WHERE SaleId IN (SELECT SaleID FROM Sales WHERE CustomerId=?)"; oAdapter = new OleDbDataAdapter(sSqlCmd, conn); oAdapter.SelectCommand.Parameters.Add("custid", customerId); // // executar o comando e preencher um Dataset // oAdapter.Fill(ds, "SaleDetails"); // // criar relação entre tabelas // ds.Relations.Add("Details", ds.Tables["Sales"].Columns["SaleId"], ds.Tables["SaleDetails"].Columns["SaleId"]); } catch(OleDbException ex) { // // tratar a excepção!!!! // System.Console.WriteLine("EXCEPÇÃO no método 'GetByCustomer': " + ex.Message); ds = null; } finally { // // fechar a conexão // if (conn.State == ConnectionState.Open) conn.Close(); } return ds; } /// /// /// /// /// /// public DataSet GetAll(string User, string Pass) { // // validar o utilizador // if (UtilDB.ValidateUser(User, Pass) != ShopStatus.Ok) { return null; } DataSet ds = null; OleDbConnection conn = null; try { // // criar objecto DataSet // ds = new DataSet(); // // criar objecto de conexão à base de dados e abrir a conexão // conn = new OleDbConnection(UtilDB.CONN); conn.Open(); // // criar um Datadapter para executar o comando e devolver o dataset // cabeçalhos das vendas // string sSqlCmd = "Select * From vwTotalBySale"; OleDbDataAdapter oAdapter = new OleDbDataAdapter(sSqlCmd, conn); // // executar o comando e preencher um Dataset // oAdapter.Fill(ds, "Sales"); // // criar um Datadapter para executar o comando e devolver o dataset // linhas de detalhe // sSqlCmd = "Select * From vwExpandedSaleDetails"; oAdapter = new OleDbDataAdapter(sSqlCmd, conn); // // executar o comando e preencher um Dataset // oAdapter.Fill(ds, "SaleDetails"); // // criar relação entre tabelas // ds.Relations.Add("Details", ds.Tables["Sales"].Columns["SaleId"], ds.Tables["SaleDetails"].Columns["SaleId"]); } catch(OleDbException ex) { // // tratar a excepção!!!! // System.Console.WriteLine("EXCEPÇÃO no método 'GetAll': " + ex); ds = null; } finally { // // fechar a conexão // if (conn.State == ConnectionState.Open) conn.Close(); } return ds; } #endregion } }