Desenvolvimento - Mobile
Desenvolvendo uma aplicação móvel simples com .NET – Parte 2 (atualizado)
Neste artigo iremos um pouco do poder da computação móvel usando a tecnologia .NET da Microsoft® sobre o ambiente do Framework com as ferramentas de desenvolvimento contidas no Visual Studio.
por Edward E. Martins Jr.Assim sendo este é o esquema de relacionamento da base de dados.
Agora vamos criar a base de dados. Inicie o "SQL Server Enterprise Manager" que está localizado em Inciar / Todos os Programas / Microsoft SQL Server / Enterprise Manager.
Depois crie uma nova base de dados chamada "SCV" clicando com o botão direito em cima da pasta "Databases" e logo após em "New Database", conforme as figuras abaixo.
Depois de criar a base de dados "SCV" você irá criar as tabelas, bastando chamar o "SQL Query Analyzer".
Logo após chamar o "SQL Query Analyzer", selecione a base "SCV" no menu lateral à esquerda abaixo do nome no servidor.
Depois você deve inserir no "SQL Query Analyzer", o seguinte script para criação da Base.
IF EXISTS (SELECT * FROM DBO.SYSOBJECTS WHERE ID = OBJECT_ID(N"[DBO].[FK_TAB_ITEM_PEDIDO_TAB_ITEM]") AND OBJECTPROPERTY(ID, N"ISFOREIGNKEY") = 1) ALTER TABLE [DBO].[TAB_ITEM_PEDIDO] DROP CONSTRAINT FK_TAB_ITEM_PEDIDO_TAB_ITEM GO IF EXISTS (SELECT * FROM DBO.SYSOBJECTS WHERE ID = OBJECT_ID(N"[DBO].[FK_TAB_ITEM_PEDIDO_TAB_PEDIDO]") AND OBJECTPROPERTY(ID, N"ISFOREIGNKEY") = 1) ALTER TABLE [DBO].[TAB_ITEM_PEDIDO] DROP CONSTRAINT FK_TAB_ITEM_PEDIDO_TAB_PEDIDO GO IF EXISTS (SELECT * FROM DBO.SYSOBJECTS WHERE ID = OBJECT_ID(N"[DBO].[FK_TAB_PEDIDO_TAB_VENDEDOR]") AND OBJECTPROPERTY(ID, N"ISFOREIGNKEY") = 1) ALTER TABLE [DBO].[TAB_PEDIDO] DROP CONSTRAINT FK_TAB_PEDIDO_TAB_VENDEDOR GO IF EXISTS (SELECT * FROM DBO.SYSOBJECTS WHERE ID = OBJECT_ID(N"[DBO].[TAB_ITEM]") AND OBJECTPROPERTY(ID, N"ISUSERTABLE") = 1) DROP TABLE [DBO].[TAB_ITEM] GO IF EXISTS (SELECT * FROM DBO.SYSOBJECTS WHERE ID = OBJECT_ID(N"[DBO].[TAB_ITEM_PEDIDO]") AND OBJECTPROPERTY(ID, N"ISUSERTABLE") = 1) DROP TABLE [DBO].[TAB_ITEM_PEDIDO] GO IF EXISTS (SELECT * FROM DBO.SYSOBJECTS WHERE ID = OBJECT_ID(N"[DBO].[TAB_PEDIDO]") AND OBJECTPROPERTY(ID, N"ISUSERTABLE") = 1) DROP TABLE [DBO].[TAB_PEDIDO] GO IF EXISTS (SELECT * FROM DBO.SYSOBJECTS WHERE ID = OBJECT_ID(N"[DBO].[TAB_VENDEDOR]") AND OBJECTPROPERTY(ID, N"ISUSERTABLE") = 1) DROP TABLE [DBO].[TAB_VENDEDOR] GO CREATE TABLE [DBO].[TAB_ITEM] ( [COD_ITEM] [CHAR] (15) COLLATE LATIN1_GENERAL_CI_AS NOT NULL , [NOME] [CHAR] (30) COLLATE LATIN1_GENERAL_CI_AS NOT NULL , [DESCRICAO] [CHAR] (50) COLLATE LATIN1_GENERAL_CI_AS NULL , [STATUS] [BIT] NOT NULL ) ON [PRIMARY] GO CREATE TABLE [DBO].[TAB_ITEM_PEDIDO] ( [COD_ITEM_PED] [CHAR] (15) COLLATE LATIN1_GENERAL_CI_AS NOT NULL , [COD_ITEM] [CHAR] (15) COLLATE LATIN1_GENERAL_CI_AS NOT NULL , [COD_PEDIDO] [CHAR] (15) COLLATE LATIN1_GENERAL_CI_AS NOT NULL ) ON [PRIMARY] GO CREATE TABLE [DBO].[TAB_PEDIDO] ( [COD_PEDIDO] [CHAR] (15) COLLATE LATIN1_GENERAL_CI_AS NOT NULL , [COD_VENDEDOR] [CHAR] (15) COLLATE LATIN1_GENERAL_CI_AS NOT NULL , [STATUS] [BIT] NOT NULL ) ON [PRIMARY] GO CREATE TABLE [DBO].[TAB_VENDEDOR] ( [COD_VENDEDOR] [CHAR] (15) COLLATE LATIN1_GENERAL_CI_AS NOT NULL , [NOME] [CHAR] (30) COLLATE LATIN1_GENERAL_CI_AS NOT NULL ) ON [PRIMARY] GO ALTER TABLE [DBO].[TAB_ITEM] WITH NOCHECK ADD CONSTRAINT [PK_TAB_ITEM] PRIMARY KEY CLUSTERED ( [COD_ITEM] ) ON [PRIMARY] GO ALTER TABLE [DBO].[TAB_ITEM_PEDIDO] WITH NOCHECK ADD CONSTRAINT [PK_TAB_ITEM_PEDIDO] PRIMARY KEY CLUSTERED ( [COD_ITEM_PED] ) ON [PRIMARY] GO ALTER TABLE [DBO].[TAB_PEDIDO] WITH NOCHECK ADD CONSTRAINT [PK_TAB_PEDIDO] PRIMARY KEY CLUSTERED ( [COD_PEDIDO] ) ON [PRIMARY] GO ALTER TABLE [DBO].[TAB_VENDEDOR] WITH NOCHECK ADD CONSTRAINT [PK_TAB_VENDEDOR] PRIMARY KEY CLUSTERED ( [COD_VENDEDOR] ) ON [PRIMARY] GO ALTER TABLE [DBO].[TAB_ITEM_PEDIDO] ADD CONSTRAINT [FK_TAB_ITEM_PEDIDO_TAB_ITEM] FOREIGN KEY ( [COD_ITEM] ) REFERENCES [DBO].[TAB_ITEM] ( [COD_ITEM] ), CONSTRAINT [FK_TAB_ITEM_PEDIDO_TAB_PEDIDO] FOREIGN KEY ( [COD_PEDIDO] ) REFERENCES [DBO].[TAB_PEDIDO] ( [COD_PEDIDO] ) GO ALTER TABLE [DBO].[TAB_PEDIDO] ADD CONSTRAINT [FK_TAB_PEDIDO_TAB_VENDEDOR] FOREIGN KEY ( [COD_VENDEDOR] ) REFERENCES [DBO].[TAB_VENDEDOR] ( [COD_VENDEDOR] ) GO
Após colar no "SQL Query Analyzer" o conteúdo do script você deve "executar" este script. Para isto basta clicar no botão verde () semelhante a um "play" na barra de ferramentas superior do "SQL Query Analyzer".
Depois disto, deverá aparecer a seguinte mensagem "The command (s) complete successfully", indicando o sucesso da operação. Basta clicar na pasta "SCV" e pressionar o (F5) que irá mostrar o nome de todas as tabelas criadas, conforme figura abaixo.
Logo após este procedimento, você pode fechar o "SQL Query Analyzer", sem precisar salvar o script.
Depois de criar a base de dados, é aconselhável reiniciar o servidor SQL, para isto basta chamar o "SQL Server Service Manager" em Inciar / Todos os Programas / Microsoft SQL Server / Service Manager.
E depois clique no botão "Refresh services".
Após todo este procedimento a sua base de dados já está criada, pronto para se usada.
Vamos criar um web service de conexão e acesso a dados: New Project, Visual C# Projects, ASP.NET WebService e vamos dar o seguinte nome para ele: "WSSVS". Depois clique em OK
Vamos adicionar uma classe de conexão, botão direito add new item, escolha "Class" e coloque o nome do arquivo .cs de "CConexao" a esta nova classe de "Acesso".
Segue:
using System; using System.Data; using System.Data.SqlClient; namespace SVS { /// <summary> /// Summary description for Acesso. /// </summary> public class Acesso { static SqlConnection thisConnection = new SqlConnection("PERSIST SECURITY INFO=FALSE;INITIAL CATALOG=SCV;PASSWORD=masterkey;USER ID=sa;DATA SOURCE=\"PS-DESENV-EDW\"");// Endereço de seu servidor SQL, com sua respectiva autenticação public Acesso() { } public DataSet IDataSet(string strSQL)//Retorna o adapter { // // TODO: Add constructor logic here // thisConnection.Close (); thisConnection.Open();//abre conexão SqlCommand thisCommand = thisConnection.CreateCommand();//instancia um comando thisCommand.CommandText = strSQL ;//recebe a sql SqlDataAdapter thisAdapter = new SqlDataAdapter(strSQL, thisConnection);//instancia um data adapter com a SQL DataSet DS = new DataSet();//instancia um Dataset thisAdapter.Fill(DS); //popula o dataset thisConnection.Close();//fecha conexão return DS;//retorna o datset } public bool ISQLExecute(string strSQL) { try { thisConnection.Close(); thisConnection.Open();//abre conexão SqlCommand thisCommand = thisConnection.CreateCommand();//instancia um comando thisCommand.CommandText = strSQL ;//recebe a sql thisCommand.ExecuteNonQuery();//executa a sql thisConnection.Close();//fecha conexão return true; } catch (System.Data.SqlClient.SqlException ex) { thisConnection.Close(); return false; } } } }Depois de adicionarmos esta classe de conexão chamada "Acesso" instancie dentro da classe Service1 do WebService um objeto para a classe "Acesso", que será usado/chamado pela aplicação SDA (Smart Device Application).
public static Acesso CAcesso = new Acesso();
Ficando assim:
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Diagnostics; using System.Web; using System.Web.Services; namespace SVS { /// <summary> /// Summary description for Service1. /// </summary> public class Service1 : System.Web.Services.WebService { public static Acesso CAcesso = new Acesso(); public Service1() { //CODEGEN: This call is required by the ASP.NET Web Services Designer InitializeComponent(); } #region Component Designer generated code //Required by the Web Services Designer private IContainer components = null; /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if(disposing && components != null) { components.Dispose(); } base.Dispose(disposing); } #endregion [WebMethod] //WebMetodo publico para acesso do SDA à classe Acesso do Web Service public DataSet IDataSet(string strSQL) { return CAcesso.IDataSet(strSQL); } [WebMethod] //WebMetodo publico para acesso do SDA à classe Acesso do Web Service public bool ISQLExecute(string strSQL) { return CAcesso.ISQLExecute(strSQL); } } }
Adicione também os dois WebMethod de acesso a classe Acesso que deverá ser acessada pelo SDA. Depois vá em Build, e Rebuild Solution.
Agora iremos adicionar a web reference do Web Service que acabamos de criar dentro da aplicação pocket pc (SDA).
Na aplicação SDA vá em "References". Botão direito em "References", "Add WebReference".
Clique em "Web services on the local machine".
Clique em "Service1" e depois no botão "Add Reference." Não se esqueça de modificar em "Properties" "Web Referenc URL" o endereço do web service de "localhost" para o ip da máquina aonde ele se encontra, pois caso você for usar um dispositivo móvel ao invés do emulador, ele vai tentar acessar a referência pelo endereço "localhost" e não vai encontrar.
Depois instancie o objeto do WebService no Frm_Cadastro e Frm_Venda:
using SVS.localhost; private static localhost1.Service1 CAcesso = new localhost.Service();
Agora iremos trabalhar com o a tela de cadastros.
No botão salvar insira o seguinte código:
private void Btn_Salvar_Click(object sender, System.EventArgs e) { if(Txt_Cod_Item.Text != "") if (CAcesso.ISQLExecute("INSERT INTO TAB_ITEM(Cod_Item,Nome,Descricao,Status) VALUES(""+Txt_Cod_Item.Text+"",""+Txt_Nome_Item.Text+"",""+Txt_Descricao_Item.Text+"",1)") == true) { Txt_Cod_Item.Enabled = false; Txt_Cod_Item.Text = ""; Txt_Nome_Item.Text = ""; Txt_Descricao_Item.Text = ""; MessageBox.Show("Dados adicionados com sucesso"); } else { Txt_Cod_Item.Enabled = true; } } else { MessageBox.Show("Os campos devem ser preenchidos adequadamente"); } }No Form de Venda você inclui o seguinte objeto que será usado para popular uma combo.
private string[] vet_item = new string[32767]; private string[] vet_vendedor = new string[32767];Depois no load do Form, Inclua o seguinte código:
private void Frm_Venda_Load(object sender, System.EventArgs e) { Load_Combo_Vendedor(); Load_Combo_Item(); }Isto irá chamar os metodos que irão carregar a combo com os vendedores cadastrados e itens.
private void Load_Combo_Vendedor() { DataSet DS = new DataSet(); DS = CAcesso.IDataSet("Select Cod_Vendedor, Nome from TAB_VENDEDOR"); int i = new int(); for (i = 0; i<=DS.Tables.Count; i++) { Cmb_Vendedor.Items.Add(DS.Tables[0].Rows[i]["Nome"].ToString()); vet_vendedor[i -1] = DS.Tables[0].Rows[i]["Cod_Vendedor"].ToString(); } } private void Load_Combo_Item() { DataSet DS = new DataSet(); DS = CAcesso.IDataSet("Select Cod_Vendedor, Nome from TAB_VENDEDOR"); int i = new int(); for (i = 0; i<=DS.Tables.Count; i++) { Cmb_Item.Items.Add(DS.Tables[0].Rows[i]["Nome"].ToString()); vet_item[i -1] = DS.Tables[0].Rows[i]["Cod_Item"].ToString(); } }Com este método você pode associar o nome do Item ou vendedor com seus respectivos códigos ao selecioná-los na combo.
No botão de efetuar a venda coloque o seguinte código:
private void Btn_Efetua_Venda_Click (object sender, System.EventArgs e) { Random rnd = new Random(); if (CAcesso.ISQLExecute("INSERT INTO TAB_ITEM_PEDIDO(Cod_Item_Ped,Cod_Item,Cod_Pedido) VALUES(""+rnd.Next(1,15).ToString() + System.DateTime.UtcNow.ToString()+"",""+vet_item[Cmb_Item.SelectedIndex]+"",""+vet_vendedor[Cmb_Vendedor.SelectedIndex]+"")") == true) { MessageBox.Show("Dados adicionados com sucesso"); } else { } }E no botão de adição de item coloque:private void Btn_Adiciona_Click(object sender, System.EventArgs e) { Lst_Itens.Text = Cmb_Item.Text; }Pronto, estes são os códigos mínimos necessários para aplicação rodar.
Tratamento de exceções serão sempre bem vindos, tais como, se não conseguir encontrar a base de dados, ou uma conversão de algum campo, etc.
Os códigos das aplicações SDA e Web Service podem ser recebidos pelo seguinte e-mail: edward.martins@intermec.com.br
- Como criar um player de audio para Windows PhoneDisp. móveis
- Windows Phone: Criando e lendo arquivos de textoDisp. móveis
- Inserindo, editando e lendo dados no Windows Phone com IsolatedStorageSettingsDisp. móveis
- Introdução ao jQuery MobileJavascript
- Entendendo a navegação entre páginas no Windows Phone 7Disp. móveis