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.



Nesta parte do artigo iremos trabalhar com a base de dados e a integração dela no sistema. Usaremos o SQL Server como SGDB.

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

Edward E. Martins Jr.

Edward E. Martins Jr. - Edward E. Martins Jr.
Engenheiro de sistemas da Intermec South America